Files
accounting_dev_v2/application/migrations/20260903000400_reconcile_purchase_stock_ledger.php
T
2026-09-11 16:03:00 +07:00

11 lines
1.2 KiB
PHP

<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Migration_Reconcile_purchase_stock_ledger extends CI_Migration
{
public function up(){
$this->db->query("INSERT IGNORE INTO inventory_ledger(item_id,warehouse_id,barcode_id,movement_date,direction,qty,unit_cost,value,document_type,document_id,idempotency_key,created_at) SELECT s.item_id,s.warehouse_id,s.barcode_id,DATE(s.created_at),IF(s.tipe='masuk','in','out'),s.qty,COALESCE(NULLIF(s.unit_cost,0),i.harga_beli),s.qty*COALESCE(NULLIF(s.unit_cost,0),i.harga_beli),s.ref_type,s.ref_id,CONCAT('PURCHASE-BACKFILL-STOCK-',s.id),s.created_at FROM stock_logs s JOIN items i ON i.id=s.item_id LEFT JOIN inventory_ledger l ON BINARY l.document_type=BINARY s.ref_type AND l.document_id=s.ref_id AND l.item_id=s.item_id AND l.warehouse_id=s.warehouse_id AND l.qty=s.qty AND l.direction=IF(s.tipe='masuk','in','out') WHERE s.ref_type IN('goods_receipt','purchase_return') AND l.id IS NULL");
$this->db->query("UPDATE items i SET i.stok=COALESCE((SELECT SUM(IF(l.direction='in',l.qty,-l.qty)) FROM inventory_ledger l WHERE l.item_id=i.id),0)");
}
public function down(){throw new RuntimeException('Rekonsiliasi ledger tidak boleh dihapus tanpa audit.');}
}