db->table_exists('item_barcodes')) { return; } // Database produksi lama hanya mengenal status barcode siap pakai. // `pending` diperlukan untuk barang yang sudah diterima secara fisik, // tetapi belum boleh dipakai/dijual sebelum serial number dilengkapi. $this->db->query("ALTER TABLE item_barcodes MODIFY status ENUM('pending','available','reserved','installed','sold_out') NOT NULL DEFAULT 'available'"); if ($this->db->table_exists('goods_receipt_lines') && $this->db->table_exists('purchase_order_lines') && $this->db->field_exists('source_receipt_line_id', 'item_barcodes')) { $this->db->query("UPDATE item_barcodes ib JOIN goods_receipt_lines grl ON grl.id=ib.source_receipt_line_id JOIN purchase_order_lines pol ON pol.id=grl.po_line_id SET ib.status='pending' WHERE pol.need_serial_number=1 AND (ib.serial_number IS NULL OR ib.serial_number='') AND ib.qty_sisa>0"); } } public function down() { // Tidak dipersempit kembali karena dapat merusak barcode pending yang // telah menjadi bagian audit trail penerimaan. } }