Files
accounting_dev_v2/application/migrations/20260911000600_document_technician_opening_balances.php
2026-09-11 16:03:00 +07:00

16 lines
3.5 KiB
PHP

<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/** Documents migrated balances without recreating historical item_movements. */
class Migration_Document_technician_opening_balances extends CI_Migration
{
public function up()
{
if(!$this->db->table_exists('technician_custody_allocations')||!$this->db->table_exists('technician_equipment_documents'))return;$user=$this->db->select_min('id')->get('users')->row();$userId=(int)($user?$user->id:0);if($userId<1)return;
foreach($this->db->select('company_id')->where('last_document_id IS NULL',null,false)->group_by('company_id')->get('technician_custody_allocations')->result()as$group){$company=(int)$group->company_id;$key='MIGRATION-TECHNICIAN-OPENING-'.$company;$doc=$this->db->get_where('technician_equipment_documents',array('company_id'=>$company,'idempotency_key'=>$key))->row();if(!$doc){$row=array('company_id'=>$company,'document_no'=>'TEQ-OPEN-'.$company.'-20260911','document_type'=>'opening','document_date'=>'2026-09-11','status'=>'posted','notes'=>'Saldo awal migrasi dari item_technician. Tidak membuat ulang item_movements, stock_logs, inventory_ledger, atau jurnal.','idempotency_key'=>$key,'created_by'=>$userId,'created_at'=>date('Y-m-d H:i:s'));$this->db->insert('technician_equipment_documents',$row);$doc=(object)array_merge($row,array('id'=>(int)$this->db->insert_id()));}
$allocations=$this->db->where(array('company_id'=>$company,'last_document_id'=>null))->get('technician_custody_allocations')->result_array();foreach($allocations as$a){$exists=$this->db->where(array('document_id'=>$doc->id,'subject_type'=>$a['subject_type'],'subject_id'=>$a['subject_id'],'to_custodian_type'=>$a['custodian_type'],'to_custodian_id'=>$a['custodian_id'],'to_usage_status'=>$a['usage_status'],'to_condition_status'=>$a['condition_status']))->get('technician_equipment_document_lines')->row();if(!$exists)$this->db->insert('technician_equipment_document_lines',array('document_id'=>$doc->id,'company_id'=>$company,'subject_type'=>$a['subject_type'],'subject_id'=>$a['subject_id'],'item_id'=>$a['item_id'],'barcode_id'=>$a['barcode_id'],'customer_equipment_id'=>$a['customer_equipment_id'],'barcode_snapshot'=>$a['barcode_snapshot'],'ownership_type'=>$a['ownership_type'],'tracking_type'=>$this->trackingType($a),'action_type'=>'opening','from_custodian_type'=>null,'from_custodian_id'=>null,'to_custodian_type'=>$a['custodian_type'],'to_custodian_id'=>$a['custodian_id'],'customer_id'=>$a['customer_id'],'from_usage_status'=>null,'to_usage_status'=>$a['usage_status'],'from_condition_status'=>null,'to_condition_status'=>$a['condition_status'],'qty'=>$a['qty'],'item_movement_id'=>null,'notes'=>'Saldo awal migrasi; movement lama tidak digandakan.','created_at'=>date('Y-m-d H:i:s')));$this->db->where(array('id'=>$a['id'],'last_document_id'=>null))->update('technician_custody_allocations',array('last_document_id'=>$doc->id,'updated_at'=>date('Y-m-d H:i:s')));}}
}
private function trackingType(array$a){if($a['subject_type']==='customer_equipment'){$r=$this->db->select('tracking_type')->get_where('customer_equipment_registry',array('id'=>$a['subject_id']))->row();return$r?$r->tracking_type:'UNIT';}$r=$this->db->select("COALESCE(k.tracking_type,'QTY') tracking_type",false)->from('items i')->join('kode_barang k','k.id=i.kode_id','left')->where('i.id',$a['item_id'])->get()->row();return$r?$r->tracking_type:'QTY';}
public function down(){throw new RuntimeException('Dokumen saldo awal dipertahankan untuk audit.');}
}