isLogin) { $this->sys_error("Invalid Token"); exit; } $payload = $this->sys_input; $userId = $this->sys_user["M_UserID"]; $search = '%%'; if (isset($payload['search'])) { $search = trim($payload["search"]); if ($search != "") { $search = '%' . $search . '%'; } else { $search = '%%'; } } $sql = "SELECT SupplierID, SupplierCode, SupplierName FROM supplier WHERE SupplierIsActive = 'Y' AND SupplierName LIKE '{$search}' ORDER BY SupplierName ASC "; $qry = $this->db->query($sql, []); if (!$qry) { $this->db->trans_rollback(); $this->sys_error_db("select supplier", $this->db);; exit; } $rows = $qry->result_array(); $result = array( "records" => $rows, "sql" => $this->db->last_query() ); $this->sys_ok($rows); } catch (Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } function getPurchaseOrder() { try { if (!$this->isLogin) { $this->sys_error("Invalid Token"); exit; } $payload = $this->sys_input; $userId = $this->sys_user["M_UserID"]; $regionalID = $this->sys_user["S_RegionalID"]; $branchID = $this->sys_user["M_BranchID"] ?? 0; // = 0 jika user regional $supplierID = $payload['SupplierID']; $warehouseID = $payload['WarehouseID']; $search = '%%'; if (isset($payload['search'])) { $search = trim($payload["search"]); if ($search != "") { $search = '%' . $search . '%'; } else { $search = '%%'; } } $sql = "SELECT GROUP_CONCAT(DISTINCT PurchaseOrderDetailWarehouseID) arrWarehouse, purchase_order.* FROM purchase_order JOIN purchase_order_detail ON PurchaseOrderID = PurchaseOrderDetailPurchaseOrderID AND PurchaseOrderDetailIsActive = 'Y' AND (SELECT IFNULL(SUM(PoItemReceiveQty - PoItemReceiveQtyReceived), 0) FROM po_item_receive WHERE PoItemReceivePurchaseOrderID = PurchaseOrderID) > 0 JOIN warehouse ON PurchaseOrderDetailWarehouseID = WarehouseID AND WarehouseM_BranchID = ? WHERE WarehouseS_RegionalID = ? AND PurchaseOrderSupplierID = ? AND PurchaseOrderStatus = 'Approved' -- Tambah filter agar tidak bisa add Jasa AND PurchaseOrderItemCategoryID != 4 AND PurchaseOrderNumber LIKE ? GROUP BY PurchaseOrderID LIMIT 50"; $qry = $this->db->query($sql, [$branchID, $regionalID, $supplierID, $search]); if (!$qry) { $this->sys_error_db("select po", $this->db);; exit; } $rows = $qry->result_array(); $this->sys_ok($rows); } catch (Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } function getWarehouse() { try { if (!$this->isLogin) { $this->sys_error("Invalid Token"); exit; } $payload = $this->sys_input; $user = $this->sys_user; $userId = $this->sys_user["M_UserID"]; $regionalId = $this->sys_user["S_RegionalID"]; $sqlWhere = ""; if ($user['M_UserLocationFlag'] == "R") { $sqlWhere = "AND WarehouseType = 'R'"; } if ($user['M_UserLocationFlag'] == "RB" || $user['M_UserLocationFlag'] == "B") { $sqlWhere = "AND WarehouseType = 'B' AND WarehouseM_BranchID = {$user['M_BranchID']}"; } $sql = "SELECT WarehouseID, WarehouseCode, CASE WHEN WarehouseType = 'B' THEN CONCAT(WarehouseCode,' ', WarehouseName, ' - ', M_BranchName) WHEN WarehouseType = 'R' THEN CONCAT(WarehouseCode,' ', WarehouseName, ' - ', S_RegionalName) ELSE '' END WarehouseName, WarehouseType, WarehouseIsDefault, WarehouseS_RegionalID, WarehouseM_BranchID, S_RegionalID, S_RegionalName FROM warehouse JOIN s_regional ON WarehouseS_RegionalID = S_RegionalID AND S_RegionalIsActive = 'Y' LEFT JOIN m_branch ON WarehouseM_BranchID = M_BranchID AND M_BranchIsActive = 'Y' where WarehouseS_RegionalID = ? AND WarehouseIsActive = 'Y' AND WarehouseIsTransit = 'N' $sqlWhere ORDER BY WarehouseName ASC "; $qry = $this->db->query($sql, [$regionalId]); if (!$qry) { $this->db->trans_rollback(); $this->sys_error_db("select warehouse", $this->db);; exit; } $rows = $qry->result_array(); $result = array( "records" => $rows, "sql" => $this->db->last_query() ); $this->sys_ok($rows); } catch (Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } function getItem() { if (!$this->isLogin) { $this->sys_error("Invalid Token"); exit; } $prm = $this->sys_input; $user = $this->sys_user; $userId = $user["M_UserID"]; $POID = $prm["POID"]; $warehouseID = $prm["WarehouseID"]; $regionalId = $user["S_RegionalID"]; $branchID = $user["M_BranchID"]; $userLogin = $user["M_UserLocationFlag"]; $sqlTambahan = ""; $sql = "SELECT CONCAT(PoItemReceiveID,',','-') as keyID, PoItemReceiveID, PurchaseOrderNumber, PurchaseOrderShippingCost, PurchaseOrderShippingCostStatus, PoItemReceivePurchaseOrderID, PoItemReceivePurchaseOrderSummaryID, PoItemReceivePurchaseOrderDetailID, WarehouseID, WarehouseCode, CASE WHEN WarehouseType = 'B' THEN CONCAT(WarehouseCode,' ', WarehouseName, ' - ', M_BranchName) WHEN WarehouseType = 'R' THEN CONCAT(WarehouseCode,' ', WarehouseName, ' - ', S_RegionalName) ELSE '' END WarehouseName, M_ItemID, M_ItemCode, M_ItemDesc, ItemUnitID, ItemUnitName, M_ItemItem_CategoryID, PoItemReceiveQty as originalQty, PoItemReceiveQtyReceived as receivedQty, 0 as qty, PoItemReceiveQty - PoItemReceiveQtyReceived AS qtyRest, PoItemReceivePrice, 'N' as alreadySave, '' as batchNo, '' as itemEd FROM po_item_receive JOIN purchase_order ON PoItemReceivePurchaseOrderID = PurchaseOrderID AND PurchaseOrderIsActive = 'Y' AND PoItemReceiveIsActive = 'Y' AND PurchaseOrderID = ? AND (PoItemReceiveQty - PoItemReceiveQtyReceived) > 0 JOIN warehouse ON PoItemReceiveWarehouseID = WarehouseID AND WarehouseID = ? JOIN m_item ON PoItemReceiveItemID = M_ItemID JOIN itemunit ON PoItemReceiveItemUnitID= ItemUnitID JOIN s_regional ON WarehouseS_RegionalID = S_RegionalID LEFT JOIN m_branch ON WarehouseM_BranchID = M_BranchID"; $qry = $this->db->query($sql, [$POID, $warehouseID]); if (!$qry) { $this->db->trans_rollback(); $this->sys_error_db("select item ", $this->db);; exit; } $dataItem = $qry->result_array(); $this->sys_ok($dataItem); } function getItemUpdate() { if (!$this->isLogin) { $this->sys_error("Invalid Token"); exit; } $prm = $this->sys_input; $user = $this->sys_user; $id = $prm["id"]; $sql = "SELECT ReceiveOrderPoDetailID, CONCAT(ReceiveOrderPoDetailPoItemReceiveID,',',ReceiveOrderPoDetailID) as keyID, ReceiveOrderPoDetailPoItemReceiveID PoItemReceiveID, PurchaseOrderNumber, PurchaseOrderShippingCost, PurchaseOrderShippingCostStatus, ReceiveOrderPoDetailPurchaseOrderID PoItemReceivePurchaseOrderID, ReceiveOrderPoDetailPurchaseOrderSummaryID PoItemReceivePurchaseOrderSummaryID, ReceiveOrderPoDetailPurchaseOrderDetailID PoItemReceivePurchaseOrderDetailID, WarehouseID, WarehouseCode, CASE WHEN WarehouseType = 'B' THEN CONCAT(WarehouseCode,' ', WarehouseName, ' - ', M_BranchName) WHEN WarehouseType = 'R' THEN CONCAT(WarehouseCode,' ', WarehouseName, ' - ', S_RegionalName) ELSE '' END WarehouseName, M_ItemID, M_ItemCode, M_ItemDesc, ItemUnitID, ItemUnitName, M_ItemItem_CategoryID, PoItemReceiveQty as originalQty, PoItemReceiveQtyReceived as receivedQty, ReceiveOrderPoDetailQty as qty, ReceiveOrderPoDetailQty as tmpQty, PoItemReceiveQty - PoItemReceiveQtyReceived AS qtyRest, ReceiveOrderPoDetailQty, PoItemReceivePrice, 'Y' as alreadySave, ReceiveOrderPoDetailBatchNo batchNo, ReceiveOrderPoDetailEd itemEd, ReceiveOrderPoDetailBatchList FROM receive_order_po_detail JOIN receive_order_po ON ReceiveOrderPoDetailReceiveOrderPoID = ReceiveOrderPoID JOIN purchase_order ON ReceiveOrderPoDetailPurchaseOrderID = PurchaseOrderID JOIN po_item_receive ON ReceiveOrderPoDetailPoItemReceiveID = PoItemReceiveID JOIN warehouse ON ReceiveOrderPoWarehouseID = WarehouseID JOIN m_item ON ReceiveOrderPoItemID = M_ItemID JOIN itemunit ON ReceiveOrderPoItemUnitID = ItemUnitID JOIN s_regional ON WarehouseS_RegionalID = S_RegionalID LEFT JOIN m_branch ON WarehouseM_BranchID = M_BranchID WHERE ReceiveOrderPoDetailReceiveOrderPoID = ? AND ReceiveOrderPoDetailIsActive = 'Y'"; $qry = $this->db->query($sql, [$id]); if (!$qry) { $this->db->trans_rollback(); $this->sys_error_db("select item ", $this->db);; exit; } $dataItem = $qry->result_array(); foreach ($dataItem as $key => $obj) { $jsonStr = $obj['ReceiveOrderPoDetailBatchList']; $batchlist = []; if (!empty($jsonStr)) { $decode = json_decode($jsonStr); if ($decode !== null && json_last_error() === JSON_ERROR_NONE) { $batchlist = $decode; } else { $this->sys_error_db("[Error] decode json for batches number"); exit; } $dataItem[$key]['batchlist'] = $batchlist; unset($dataItem[$key]['ReceiveOrderPoDetailBatchList']); } } $this->sys_ok($dataItem); } function getItemold() { if (!$this->isLogin) { $this->sys_error("Invalid Token"); exit; } $prm = $this->sys_input; $userId = $this->sys_user["M_UserID"]; $POID = $prm["POID"]; $regionalId = $prm["regionalId"]; // echo $prm; $sql = "SELECT * FROM purchase_order WHERE PurchaseOrderID = ?"; $qry = $this->db->query($sql, [$POID]); if (!$qry) { $this->db->trans_rollback(); $this->sys_error_db("select PO", $this->db);; exit; } $dataPO = $qry->row_array(); // single berdasarkan summary // multiple berdasarkan detail $sql = "SELECT PurchaseOrderWarehouseType, PurchaseOrderWarehouseID, PurchaseOrderDetailWarehouseID, WarehouseID as warehouseID, CASE WHEN WarehouseType = 'B' THEN CONCAT(WarehouseCode,' ', WarehouseName, ' - ', M_BranchName) WHEN WarehouseType = 'R' THEN CONCAT(WarehouseCode,' ', WarehouseName, ' - ', S_RegionalName) ELSE '' END warehouseName, CASE WHEN PurchaseOrderWarehouseType = 'Single' THEN PurchaseOrderSummaryQty - PurchaseOrderSummaryQtyReceived WHEN PurchaseOrderWarehouseType = 'Multiple' THEN (ConvertQuantityToPurchasedItemUnit(PurchaseOrderDetailItemID, PurchaseOrderDetailItemUnitID, PurchaseOrderDetailQty)) - (ConvertQuantityToPurchasedItemUnit(PurchaseOrderDetailItemID, PurchaseOrderDetailItemUnitID, PurchaseOrderDetailQtyReceived)) END as qtyRest, -- qty sisa barang yang sudah di terima CASE WHEN PurchaseOrderWarehouseType = 'Single' THEN PurchaseOrderSummaryQty WHEN PurchaseOrderWarehouseType = 'Multiple' THEN ConvertQuantityToPurchasedItemUnit(PurchaseOrderDetailItemID, PurchaseOrderDetailItemUnitID, PurchaseOrderDetailQty) END as qty, -- qty asli CASE WHEN PurchaseOrderWarehouseType = 'Single' THEN PurchaseOrderSummaryQty WHEN PurchaseOrderWarehouseType = 'Multiple' THEN PurchaseOrderDetailQty END as qtyNotConvert, CASE WHEN PurchaseOrderWarehouseType = 'Single' THEN PurchaseOrderSummaryQtyReceived WHEN PurchaseOrderWarehouseType = 'Multiple' THEN (ConvertQuantityToPurchasedItemUnit(PurchaseOrderDetailItemID, PurchaseOrderDetailItemUnitID, PurchaseOrderDetailQtyReceived)) END as qtyReceived, CASE WHEN PurchaseOrderWarehouseType = 'Single' THEN PurchaseOrderSummaryQtyReceived WHEN PurchaseOrderWarehouseType = 'Multiple' THEN PurchaseOrderDetailQtyReceived END as qtyReceivedNotConvert, PurchaseOrderID, PurchaseOrderDate, PurchaseOrderNumber, PurchaseOrderSupplierID, SupplierName, PurchaseOrderStatus, PurchaseOrderSummaryID, PurchaseOrderSummaryQty, PurchaseOrderSummaryQtyReceived, ism.M_ItemID as summaryItemID, ism.M_ItemCode as summaryItemCode, ism.M_ItemDesc as summaryItemDesc, iusm.ItemUnitID as summaryItemUnitID, iusm.ItemUnitName as summaryItemUnitName, PurchaseOrderDetailID, PurchaseOrderDetailQty, PurchaseOrderDetailQtyReceived, idt.M_ItemID as detailItemID, idt.M_ItemCode as detailItemCode, idt.M_ItemDesc as detailItemDesc, iudt.ItemUnitID as detailItemUnitID, iudt.ItemUnitName as detailItemUnitName FROM purchase_order JOIN purchase_order_summary ON PurchaseOrderID = PurchaseOrderSummaryPurchaseOrderID AND PurchaseOrderSummaryIsActive = 'Y' AND PurchaseOrderSummaryPurchaseOrderID = ? JOIN purchase_order_detail ON PurchaseOrderID = PurchaseOrderDetailPurchaseOrderID AND PurchaseOrderSummaryID = PurchaseOrderDetailPurchaseSummaryID AND PurchaseOrderDetailIsActive = 'Y' JOIN supplier ON PurchaseOrderSupplierID = SupplierID JOIN m_item ism ON PurchaseOrderSummaryItemID = ism.M_ItemID JOIN itemunit iusm ON PurchaseOrderSummaryItemUnitID = iusm.ItemUnitID JOIN m_item idt ON PurchaseOrderDetailItemID = idt.M_ItemID JOIN itemunit iudt ON PurchaseOrderDetailItemUnitID = iudt.ItemUnitID JOIN warehouse ON ( CASE WHEN PurchaseOrderWarehouseType = 'Single' THEN PurchaseOrderWarehouseID = WarehouseID WHEN PurchaseOrderWarehouseType = 'Multiple' THEN PurchaseOrderDetailWarehouseID = WarehouseID END ) JOIN s_regional ON WarehouseS_RegionalID = S_RegionalID LEFT JOIN m_branch ON WarehouseM_BranchID = M_BranchID WHERE CASE WHEN PurchaseOrderWarehouseType = 'Single' THEN (PurchaseOrderSummaryQty - PurchaseOrderSummaryQtyReceived) > 0 WHEN PurchaseOrderWarehouseType = 'Multiple' THEN ((ConvertQuantityToPurchasedItemUnit(PurchaseOrderDetailItemID, PurchaseOrderDetailItemUnitID, PurchaseOrderDetailQty)) - (ConvertQuantityToPurchasedItemUnit(PurchaseOrderDetailItemID, PurchaseOrderDetailItemUnitID, PurchaseOrderDetailQtyReceived))) > 0 END "; $qry = $this->db->query($sql, [$POID]); if (!$qry) { $this->db->trans_rollback(); $this->sys_error_db("select item ", $this->db);; exit; } $dataItem = $qry->result_array(); $newItem = []; if ($dataPO['PurchaseOrderWarehouseType'] == 'Single') { foreach ($dataItem as $key => $item) { $search_id = $item['PurchaseOrderSummaryID']; $ids = array_column($newItem, 'PurchaseOrderSummaryID'); $index = array_search($search_id, $ids); if (in_array($search_id, $ids) && $index !== false) { $newItem[$index]['detail'][] = $item; } else { $item['itemID'] = $item['summaryItemID']; $item['itemCode'] = $item['summaryItemCode']; $item['itemDesc'] = $item['summaryItemDesc']; $item['itemUnitID'] = $item['summaryItemUnitID']; $item['itemUnitName'] = $item['summaryItemUnitName']; $item['detail'] = [$item]; $newItem[] = $item; } } } if ($dataPO['PurchaseOrderWarehouseType'] == 'Multiple') { foreach ($dataItem as $key => $item) { $item['itemID'] = $item['summaryItemID']; $item['itemCode'] = $item['summaryItemCode']; $item['itemDesc'] = $item['summaryItemDesc']; $item['itemUnitID'] = $item['summaryItemUnitID']; $item['itemUnitName'] = $item['summaryItemUnitName']; $item['detail'] = []; $newItem[] = $item; } } $this->sys_ok($newItem); } public function saveRo() { // $this->db->trans_commit(); // $this->db->trans_rollback(); $this->db->trans_begin(); if (!$this->isLogin) { $this->sys_error("Invalid Token"); exit; } $prm = $this->sys_input; $user = $this->sys_user; $userId = $this->sys_user["M_UserID"]; // $sql = "SELECT `fn_numbering`('RO') AS RO"; // $qry = $this->db->query($sql, []); // if (!$qry) { // $this->sys_error_db("purchase order insert error", $this->db); // $this->db->trans_rollback(); // exit; // } // $numbering = $qry->row_array()["RO"]; // generate numbering naskah $areaid = $user['M_BranchID']; $areatype = 'B'; if ($user['loginLevel'] == 'regional') { $areaid = $user['S_RegionalID']; $areatype = 'R'; } $sqlusrdivisi = "SELECT M_UserDivisionDivisionID FROM m_userdivision WHERE M_UserDivisionM_UserID = ? AND M_UserDivisionIsActive = 'Y'"; $queusrdivisi = $this->db->query($sqlusrdivisi, [$userId]); if (!$queusrdivisi) { $this->db->trans_rollback(); $this->sys_error_db("[Error] get user divisi", $this->db); exit; } $userDivID = $queusrdivisi->row_array()['M_UserDivisionDivisionID']; $sqlnum = "SELECT `fn_penomoran`(?, ?, ?, ?, ?, ?) AS numpd;"; $quenum = $this->db->query($sqlnum, ['GR', $userDivID, $areatype, $areaid, 'SM', 'Y']); if (!$quenum) { $this->db->trans_rollback(); $this->sys_error_db("[Error] generate number doc", $this->db); exit; } $numpd = $quenum->row_array()['numpd']; $sql = "INSERT INTO `receive_order_po` ( `ReceiveOrderPoNumber`, `ReceiveOrderPoSupplierID`, `ReceiveOrderPoIDate`, `ReceiveOrderPoWarehouseID`, `ReceiveOrderPoM_BranchCode`, `ReceiveOrderPoS_RegionalID`, `ReceiveOrderShippingCostAmount`, `ReceiveOrderShippingCostIsPaid`, `ReceiveOrderPoNote`, `ReceiveOrderPoRefNumber`, `ReceiveOrderPoCreatedUserID` ) VALUES (?,?,?,?,?,?,?,?,?,?,?);"; $qry = $this->db->query($sql, [ $numpd, $prm['selectedSupplier']['SupplierID'], $prm['date'], $prm['selectedWarehouse']['WarehouseID'], $user['M_BranchCode'], $user['S_RegionalID'], $prm['shippingCost'], $prm['shippingIsPaid'], $prm['note'], $prm['refNumber'], $userId ]); if (!$qry) { $this->sys_error_db("Error insert receive oder", $this->db); $this->db->trans_rollback(); exit; } $roID = $this->db->insert_id(); $descDetail = []; foreach ($prm['detail'] as $key => $item) { $sql = "SELECT * FROM po_item_receive WHERE PoItemReceiveID = ?"; $qry = $this->db->query($sql, [ $item['PoItemReceiveID'], ]); if (!$qry) { $this->sys_error_db("Error cek data", $this->db); $this->db->trans_rollback(); exit; } $cek = $qry->row_array(); if ($cek['PoItemReceiveIsActive'] == 'N') { $this->sys_error("Item {$item['M_ItemDesc']} sudah terhapus"); $this->db->trans_rollback(); exit; } if ($cek['PoItemReceiveQty'] == $cek['PoItemReceiveQtyReceived']) { $this->sys_error("Item {$item['M_ItemDesc']} sudah diterima semuanya"); $this->db->trans_rollback(); exit; } if (intval($item['qty']) > intval($cek['PoItemReceiveQty'])) { $this->sys_error("Jumlah item {$item['M_ItemDesc']} yang tersedia sudah berubah silahkan ulangi pilih item"); $this->db->trans_rollback(); exit; } $jsonBatch = "[]"; if (isset($item['batchlist']) && is_array($item['batchlist'])) { $batchlist = $item['batchlist']; if (sizeof($batchlist) > 0) { $json = json_encode($batchlist); if ($json === false) { $this->db->trans_rollback(); $this->sys_error_db("[Error] encode json batch number"); exit; } else { $jsonBatch = $json; } } } $sql = "INSERT INTO `receive_order_po_detail` ( `ReceiveOrderPoDetailReceiveOrderPoID`, `ReceiveOrderPoDetailPurchaseOrderID`, `ReceiveOrderPoDetailPurchaseOrderSummaryID`, `ReceiveOrderPoDetailPurchaseOrderDetailID`, `ReceiveOrderPoDetailPoItemReceiveID`, `ReceiveOrderPoDetailQty`, `ReceiveOrderPoDetailPrice`, `ReceiveOrderPoDetailTotal`, `ReceiveOrderPoDetailCreatedUserID`, `ReceiveOrderPoItemID`, `ReceiveOrderPoItemUnitID`, ReceiveOrderPoDetailBatchNo, ReceiveOrderPoDetailEd, ReceiveOrderPoDetailBatchList ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);"; $qry = $this->db->query($sql, [ $roID, $item['PoItemReceivePurchaseOrderID'], $item['PoItemReceivePurchaseOrderSummaryID'], $item['PoItemReceivePurchaseOrderDetailID'], $item['PoItemReceiveID'], $item['qty'], $item['PoItemReceivePrice'], (doubleval($item['PoItemReceivePrice']) * intval($item['qty'])), $userId, $item['M_ItemID'], $item['ItemUnitID'], $item['batchNo'], $item['itemEd'], $jsonBatch ]); if (!$qry) { $this->sys_error_db("Error receive order detail", $this->db); $this->db->trans_rollback(); exit; } $roDetailID = $this->db->insert_id(); $descDetail[] = "- ADD {$item['M_ItemDesc']} {$item['qty']} {$item['ItemUnitName']} nomor batch {$item['WarehouseName']}"; $jsonBefore = $this->getDataPoItemReceive($item['PoItemReceiveID']); $sql = "UPDATE `po_item_receive` SET `PoItemReceiveQtyReceived` = ?, `PoItemReceiveUpdatedUserID` = ? WHERE `PoItemReceiveID` = ?;"; $qry = $this->db->query($sql, [ (intval($cek['PoItemReceiveQtyReceived']) + intval($item['qty'])), $userId, $item['PoItemReceiveID'], ]); if (!$qry) { $this->sys_error_db("Error update item receive", $this->db); $this->db->trans_rollback(); exit; } $jsonAfter = $this->getDataPoItemReceive($item['PoItemReceiveID']); $descItem = "Diterima {$item['M_ItemDesc']} sejumlah {$item['qty']} {$item['ItemUnitName']} di RO nomor {$numbering} *RO belum di konfirmasi"; $this->insertLogPoItemReceive( $item['PoItemReceiveID'], 'UPDATE', $roID, $jsonBefore, $jsonAfter, $userId, $descItem ); } $jsonROAfter = $this->getDataReceiveOrderPO($roID); $this->insertLogReceiveOrderPo( $roID, 'ADD', '', $jsonROAfter, $userId, implode("\n", $descDetail) ); $this->insertUserActivty($roID, 'ADD', $userId, implode("\n", $descDetail)); $this->db->trans_commit(); $this->sys_ok("Berhasil terima barang {$numbering} pada cabang {$user['M_BranchCode']}"); } public function updateRoHeader() { // $this->db->trans_commit(); // $this->db->trans_rollback(); $this->db->trans_begin(); if (!$this->isLogin) { $this->sys_error("Invalid Token"); exit; } $prm = $this->sys_input; $user = $this->sys_user; $userId = $this->sys_user["M_UserID"]; $ro = $prm['ro']; $roID = $ro['ReceiveOrderPoID']; $jsonROBefore = $this->getDataReceiveOrderPO($roID); $sql = "UPDATE `receive_order_po` SET `ReceiveOrderPoIDate` = ?, `ReceiveOrderShippingCostAmount` = ?, `ReceiveOrderPoNote` = ?, `ReceiveOrderPoRefNumber` = ?, `ReceiveOrderPoLastUpdatedUserID` = ? WHERE ReceiveOrderPoID = ?;"; $qry = $this->db->query($sql, [ $prm['date'], $prm['shippingCost'], $prm['note'], $prm['refNumber'], $userId, $roID ]); if (!$qry) { $this->sys_error_db("Error update receive oder", $this->db); $this->db->trans_rollback(); exit; } $jsonROAfter = $this->getDataReceiveOrderPO($roID); $desc = "Update data Ro {$ro['ReceiveOrderPoNumber']}"; $descDetail = []; if ($jsonROBefore['ReceiveOrderPoIDate'] != $jsonROAfter['ReceiveOrderPoIDate']) { $descDetail[] = "- Perubahan tanggal dari {$jsonROBefore['ReceiveOrderPoIDate']} menjadi {$jsonROAfter['ReceiveOrderPoIDate']}"; } if ($jsonROBefore['ReceiveOrderPoNote'] != $jsonROAfter['ReceiveOrderPoNote']) { $descDetail[] = "- Perubahan catatan dari '{$jsonROBefore['ReceiveOrderPoNote']}' menjadi '{$jsonROAfter['ReceiveOrderPoNote']}'"; } if ($jsonROBefore['ReceiveOrderPoRefNumber'] != $jsonROAfter['ReceiveOrderPoRefNumber']) { $descDetail[] = "- Perubahan nomor referensi dari '{$jsonROBefore['ReceiveOrderPoRefNumber']}' menjadi '{$jsonROAfter['ReceiveOrderPoRefNumber']}'"; } if ($jsonROBefore['ReceiveOrderShippingCostAmount'] != $jsonROAfter['ReceiveOrderShippingCostAmount']) { $bfr = $this->formatRupiah($jsonROBefore['ReceiveOrderShippingCostAmount']); $aftr = $this->formatRupiah($jsonROAfter['ReceiveOrderShippingCostAmount']); $descDetail[] = "- Perubahan biaya ekspedisi dari {$bfr} menjadi {$aftr}"; } if (count($descDetail) == 0) { $descDetail[] = '* user menyimpan data namun tidak ada perubahan'; } $this->insertLogReceiveOrderPo( $roID, 'UPDATE HEADER', $jsonROBefore, $jsonROAfter, $userId, $desc . "\n" . implode("\n", $descDetail) ); $this->insertUserActivty($roID, 'UPDATE HEADER', $userId, $desc . "\n" . implode("\n", $descDetail)); $this->db->trans_commit(); $this->sys_ok("Berhasil update header {$ro['ReceiveOrderPoNumber']}"); } function addItem() { // $this->db->trans_commit(); // $this->db->trans_rollback(); $this->db->trans_begin(); if (!$this->isLogin) { $this->sys_error("Invalid Token"); exit; } $prm = $this->sys_input; $user = $this->sys_user; $userId = $this->sys_user["M_UserID"]; $detail = $prm['detail']; $ro = $prm['ro']; $roID = $ro['ReceiveOrderPoID']; $sql = "SELECT * FROM receive_order_po WHERE ReceiveOrderPoID = ?"; $qry = $this->db->query($sql, [ $ro['ReceiveOrderPoID'], ]); if (!$qry) { $this->sys_error_db("Error cek order receive", $this->db); $this->db->trans_rollback(); exit; } $cek = $qry->row_array(); if ($cek['ReceiveOrderPoConfirmed'] == 'Y') { $this->sys_error("Penerimaan barang sudah dikonfirmasi"); $this->db->trans_rollback(); exit; } $jsonROBefore = $this->getDataReceiveOrderPO($roID); $descDetail = []; foreach ($detail as $key => $item) { //insert $sql = "SELECT * FROM po_item_receive WHERE PoItemReceiveID = ?"; $qry = $this->db->query($sql, [ $item['PoItemReceiveID'], ]); if (!$qry) { $this->sys_error_db("Error cek data", $this->db); $this->db->trans_rollback(); exit; } $cekDetail = $qry->row_array(); if ($cekDetail['PoItemReceiveIsActive'] == 'N') { $this->sys_error("Item {$item['M_ItemDesc']} sudah terhapus"); $this->db->trans_rollback(); exit; } if ($cekDetail['PoItemReceiveQty'] == $cekDetail['PoItemReceiveQtyReceived']) { $this->sys_error("Item {$item['M_ItemDesc']} sudah diterima semuanya"); $this->db->trans_rollback(); exit; } if (intval($item['qty']) > intval($cekDetail['PoItemReceiveQty'])) { $this->sys_error("Jumlah item {$item['M_ItemDesc']} yang tersedia sudah berubah silahkan ulangi pilih item"); $this->db->trans_rollback(); exit; } $sql = "INSERT INTO `receive_order_po_detail` ( `ReceiveOrderPoDetailReceiveOrderPoID`, `ReceiveOrderPoDetailPurchaseOrderID`, `ReceiveOrderPoDetailPurchaseOrderSummaryID`, `ReceiveOrderPoDetailPurchaseOrderDetailID`, `ReceiveOrderPoDetailPoItemReceiveID`, `ReceiveOrderPoDetailQty`, `ReceiveOrderPoDetailPrice`, `ReceiveOrderPoDetailTotal`, `ReceiveOrderPoDetailCreatedUserID`, `ReceiveOrderPoItemID`, `ReceiveOrderPoItemUnitID` ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? );"; $qry = $this->db->query($sql, [ $roID, $item['PoItemReceivePurchaseOrderID'], $item['PoItemReceivePurchaseOrderSummaryID'], $item['PoItemReceivePurchaseOrderDetailID'] ?? 0, $item['PoItemReceiveID'], $item['qty'], $item['PoItemReceivePrice'], (doubleval($item['PoItemReceivePrice']) * intval($item['qty'])), $userId, $item['M_ItemID'], $item['ItemUnitID'], ]); if (!$qry) { $this->sys_error_db("Error receive order detail", $this->db); $this->db->trans_rollback(); exit; } $descDetail[] = "- ADD {$item['M_ItemDesc']} {$item['qty']} {$item['ItemUnitName']} {$item['WarehouseName']}"; $jsonBefore = $this->getDataPoItemReceive($item['PoItemReceiveID']); $sql = "UPDATE `po_item_receive` SET `PoItemReceiveQtyReceived` = ?, `PoItemReceiveUpdatedUserID` = ? WHERE `PoItemReceiveID` = ?;"; $qry = $this->db->query($sql, [ (intval($cekDetail['PoItemReceiveQtyReceived']) + intval($item['qty'])), $userId, $item['PoItemReceiveID'], ]); if (!$qry) { $this->sys_error_db("Error update item receive", $this->db); $this->db->trans_rollback(); exit; } $jsonAfter = $this->getDataPoItemReceive($item['PoItemReceiveID']); $descItem = "Diterima {$item['M_ItemDesc']} sejumlah {$item['qty']} {$item['ItemUnitName']} di RO nomor {$jsonROBefore['ReceiveOrderPoNumber']} *RO belum di konfirmasi"; $this->insertLogPoItemReceive( $item['PoItemReceiveID'], 'UPDATE', $roID, $jsonBefore, $jsonAfter, $userId, $descItem ); } $jsonROAfter = $this->getDataReceiveOrderPO($roID); $this->insertLogReceiveOrderPo( $roID, 'UPDATE', $jsonROBefore, $jsonROAfter, $userId, implode("\n", $descDetail) ); $this->insertUserActivty($roID, 'UPDATE', $userId, implode("\n", $descDetail)); $this->db->trans_commit(); $this->sys_ok("Berhasil update item"); } function formatRupiah($angka) { // Ganti koma ke titik agar jadi desimal yang valid $angka = str_replace(',', '.', $angka); // Validasi input if (!is_numeric($angka)) { return 'Input tidak valid'; } // Konversi ke float $angka = (float)$angka; // Bulatkan ke 2 angka desimal $angka = round($angka, 2); // Cek apakah angka desimalnya nol if (fmod($angka, 1) == 0.0) { // Tanpa desimal $formatted = number_format($angka, 0, ',', '.'); } else { // Dengan 2 angka desimal $formatted = number_format($angka, 2, ',', '.'); } return 'Rp ' . $formatted; } function addItemOld() { // $this->db->trans_commit(); // $this->db->trans_rollback(); $this->db->trans_begin(); if (!$this->isLogin) { $this->sys_error("Invalid Token"); exit; } $prm = $this->sys_input; $user = $this->sys_user; $userId = $this->sys_user["M_UserID"]; $detail = $prm['detail']; $ro = $prm['ro']; $roID = $ro['ReceiveOrderPoID']; $sql = "SELECT * FROM receive_order_po WHERE ReceiveOrderPoID = ?"; $qry = $this->db->query($sql, [ $ro['ReceiveOrderPoID'], ]); if (!$qry) { $this->sys_error_db("Error cek order receive", $this->db); $this->db->trans_rollback(); exit; } $cek = $qry->row_array(); if ($cek['ReceiveOrderPoConfirmed'] == 'Y') { $this->sys_error("Penerimaan barang sudah dikonfirmasi"); $this->db->trans_rollback(); exit; } $sql = "SELECT * FROM receive_order_po_detail WHERE ReceiveOrderPoDetailReceiveOrderPoID = ? AND PoItemReceiveIsActive = 'Y'"; $qry = $this->db->query($sql, [ $roID, ]); if (!$qry) { $this->sys_error_db("Error cek order receive", $this->db); $this->db->trans_rollback(); exit; } $oldDetail = $qry->result_array(); $updatedID = []; foreach ($detail as $key => $item) { $sql = "SELECT * FROM receive_order_po_detail WHERE ReceiveOrderPoDetailPoItemReceiveID = ? AND PoItemReceiveIsActive = 'Y'"; $qry = $this->db->query($sql, [ $item['PoItemReceiveID'], ]); if (!$qry) { $this->sys_error_db("Error cek order receive", $this->db); $this->db->trans_rollback(); exit; } $cekItem = $qry->row_array(); if (empty($cekItem)) { //insert $sql = "SELECT * FROM po_item_receive WHERE PoItemReceiveID = ?"; $qry = $this->db->query($sql, [ $item['PoItemReceiveID'], ]); if (!$qry) { $this->sys_error_db("Error cek data", $this->db); $this->db->trans_rollback(); exit; } $cekDetail = $qry->row_array(); if ($cekDetail['PoItemReceiveIsActive'] == 'N') { $this->sys_error("Item {$item['M_ItemDesc']} sudah terhapus"); $this->db->trans_rollback(); exit; } if ($cekDetail['PoItemReceiveQty'] == $cekDetail['PoItemReceiveQtyReceived']) { $this->sys_error("Item {$item['M_ItemDesc']} sudah diterima semuanya"); $this->db->trans_rollback(); exit; } if (intval($item['qty']) > intval($cekDetail['PoItemReceiveQty'])) { $this->sys_error("Jumlah item {$item['M_ItemDesc']} yang tersedia sudah berubah silahkan ulangi pilih item"); $this->db->trans_rollback(); exit; } $sql = "INSERT INTO `receive_order_po_detail` ( `ReceiveOrderPoDetailReceiveOrderPoID`, `ReceiveOrderPoDetailPurchaseOrderID`, `ReceiveOrderPoDetailPurchaseOrderSummaryID`, `ReceiveOrderPoDetailPurchaseOrderDetailID`, `ReceiveOrderPoDetailPoItemReceiveID`, `ReceiveOrderPoDetailQty`, `ReceiveOrderPoDetailPrice`, `ReceiveOrderPoDetailTotal`, `ReceiveOrderPoDetailCreatedUserID`, `ReceiveOrderPoItemID`, `ReceiveOrderPoItemUnitID` ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? );"; $qry = $this->db->query($sql, [ $roID, $item['PoItemReceivePurchaseOrderID'], $item['PoItemReceivePurchaseOrderSummaryID'], $item['PoItemReceivePurchaseOrderDetailID'] ?? 0, $item['PoItemReceiveID'], $item['qty'], $item['PoItemReceivePrice'], (doubleval($item['PoItemReceivePrice']) * intval($item['qty'])), $userId, $item['M_ItemID'], $item['ItemUnitID'], ]); if (!$qry) { $this->sys_error_db("Error receive order detail", $this->db); $this->db->trans_rollback(); exit; } $sql = "UPDATE `po_item_receive` SET `PoItemReceiveQtyReceived` = ?, `PoItemReceiveUpdatedUserID` = ? WHERE `PoItemReceiveID` = ?;"; $qry = $this->db->query($sql, [ (intval($cekDetail['PoItemReceiveQtyReceived']) + intval($item['qty'])), $userId, $item['PoItemReceiveID'], ]); if (!$qry) { $this->sys_error_db("Error update item receive", $this->db); $this->db->trans_rollback(); exit; } } else { $updatedID[] = $cekItem['ReceiveOrderPoDetailID']; $sql = "SELECT * FROM po_item_receive WHERE PoItemReceiveID = ?"; $qry = $this->db->query($sql, [ $item['PoItemReceiveID'], ]); if (!$qry) { $this->sys_error_db("Error cek data", $this->db); $this->db->trans_rollback(); exit; } $cekDetail = $qry->row_array(); // if ($cekDetail['PoItemReceiveIsActive'] == 'N') { // $this->sys_error("Item {$item['M_ItemDesc']} sudah terhapus"); // $this->db->trans_rollback(); // exit; // } $newReceivedQty = intval($cekDetail['PoItemReceiveQtyReceived']) - intval($cekItem['ReceiveOrderPoDetailQty']); $newQtyRest = intval($cekDetail['PoItemReceiveQty']) - $newReceivedQty; // if ($cekDetail['PoItemReceiveQty'] == $cekDetail['PoItemReceiveQtyReceived']) { // $this->sys_error("Item {$item['M_ItemDesc']} sudah diterima semuanya"); // $this->db->trans_rollback(); // exit; // } if (intval($item['qty']) > $newQtyRest) { $this->sys_error("Jumlah item {$item['M_ItemDesc']} yang tersedia tidak memenuhi banyak penerimaan item"); $this->db->trans_rollback(); exit; } $sql = "UPDATE receive_order_po_detail SET ReceiveOrderPoDetailQty = ?, ReceiveOrderPoDetailTotal = ReceiveOrderPoDetailPrice * {$item['qty']} ReceiveOrderPoDetailLastUpdatedUserID = ?, ReceiveOrderPoDetailLastUpdated = NOW() WHERE ReceiveOrderPoDetailID = ?; "; $qry = $this->db->query($sql, [ $item['qty'], $userId, $cekItem['ReceiveOrderPoDetailID'] ]); if (!$qry) { $this->sys_error_db("Error update item", $this->db); $this->db->trans_rollback(); exit; } $sql = "UPDATE `po_item_receive` SET `PoItemReceiveQtyReceived` = ?, `PoItemReceiveUpdatedUserID` = ? WHERE `PoItemReceiveID` = ?;"; $qry = $this->db->query($sql, [ (intval($newReceivedQty) + intval($item['qty'])), $userId, $item['PoItemReceiveID'], ]); if (!$qry) { $this->sys_error_db("Error update item receive", $this->db); $this->db->trans_rollback(); exit; } } } $this->db->trans_commit(); $this->sys_ok("Berhasil update item"); } public function updateItem() { // $this->db->trans_commit(); // $this->db->trans_rollback(); $this->db->trans_begin(); if (!$this->isLogin) { $this->sys_error("Invalid Token"); exit; } $prm = $this->sys_input; $user = $this->sys_user; $userId = $this->sys_user["M_UserID"]; $detail = $prm['detail']; $ro = $prm['ro']; $roID = $ro['ReceiveOrderPoID']; $detail = $prm['detail']; $detailID = $detail['ReceiveOrderPoDetailID']; $jsonROBefore = $this->getDataReceiveOrderPO($roID); $sql = "SELECT * FROM receive_order_po_detail WHERE ReceiveOrderPoDetailID = ? "; $qry = $this->db->query($sql, [ $detail['ReceiveOrderPoDetailID'], ]); if (!$qry) { $this->sys_error_db("Error cek order receive", $this->db); $this->db->trans_rollback(); exit; } $cekItem = $qry->row_array(); $sql = "SELECT * FROM po_item_receive WHERE PoItemReceiveID = ?"; $qry = $this->db->query($sql, [ $detail['PoItemReceiveID'], ]); if (!$qry) { $this->sys_error_db("Error cek data", $this->db); $this->db->trans_rollback(); exit; } $cekDetail = $qry->row_array(); // if ($cekDetail['PoItemReceiveIsActive'] == 'N') { // $this->sys_error("Item {$item['M_ItemDesc']} sudah terhapus"); // $this->db->trans_rollback(); // exit; // } $newReceivedQty = intval($cekDetail['PoItemReceiveQtyReceived']) - intval($cekItem['ReceiveOrderPoDetailQty']); $newQtyRest = intval($cekDetail['PoItemReceiveQty']) - $newReceivedQty; // if ($cekDetail['PoItemReceiveQty'] == $cekDetail['PoItemReceiveQtyReceived']) { // $this->sys_error("Item {$item['M_ItemDesc']} sudah diterima semuanya"); // $this->db->trans_rollback(); // exit; // } if (intval($detail['qty']) <= 0) { $this->sys_error("Jumlah qty {$detail['M_ItemDesc']} tidak sesuai"); $this->db->trans_rollback(); exit; } if (intval($detail['qty']) > $newQtyRest) { $this->sys_error("Jumlah item {$detail['M_ItemDesc']} yang tersedia tidak memenuhi banyak penerimaan item"); $this->db->trans_rollback(); exit; } $jsonBefore = $this->getDataPoItemReceive($detail['PoItemReceiveID']); // update batchlist $jsonBatch = "[]"; if (isset($detail['batchlist']) && is_array($detail['batchlist'])) { $batchlist = $detail['batchlist']; if (sizeof($batchlist) > 0) { $json = json_encode($batchlist); if ($json === false) { $this->db->trans_rollback(); $this->sys_error_db("[Error] encode json batch number"); exit; } else { $jsonBatch = $json; } } } $sql = "UPDATE receive_order_po_detail SET ReceiveOrderPoDetailQty = ?, ReceiveOrderPoDetailTotal = ReceiveOrderPoDetailPrice * {$detail['receivedQty']}, ReceiveOrderPoDetailLastUpdatedUserID = ?, ReceiveOrderPoDetailLastUpdated = NOW() , ReceiveOrderPoDetailBatchNo = ?, ReceiveOrderPoDetailEd = ?, ReceiveOrderPoDetailBatchList = ? WHERE ReceiveOrderPoDetailID = ?;"; $qry = $this->db->query($sql, [ $detail['receivedQty'], $userId, $detail['batchNo'], $detail['itemEd'], $jsonBatch, $cekItem['ReceiveOrderPoDetailID'] ]); if (!$qry) { $this->sys_error_db("Error update item", $this->db); $this->db->trans_rollback(); exit; } $descDetail = 'UPDATE item detail'; if (intval($detail['qty']) != intval($cekItem['ReceiveOrderPoDetailQty'])) { $descDetail = $descDetail . "\n" . " UPDATE ITEM qty {$detail['M_ItemDesc']} dari {$cekItem['ReceiveOrderPoDetailQty']} {$detail['ItemUnitName']} menjadi {$detail['qty']} {$detail['ItemUnitName']} {$detail['WarehouseName']}"; } if ($cekItem['ReceiveOrderPoDetailBatchNo'] != $detail['batchNo']) { $descDetail = $descDetail . "\n" . "UPDATE nomor batch dari {$cekItem['ReceiveOrderPoDetailBatchNo']} menjadi {$detail['batchNo']}"; } if ($cekItem['ReceiveOrderPoDetailEd'] != $detail['itemEd']) { $descDetail = $descDetail . "\n" . "UPDATE tanggal expaired {$cekItem['ReceiveOrderPoDetailEd']} menjadi {$detail['itemEd']}"; } $jsonBefore = $this->getDataPoItemReceive($detail['PoItemReceiveID']); $sql = "UPDATE `po_item_receive` SET `PoItemReceiveQtyReceived` = ?, `PoItemReceiveUpdatedUserID` = ? WHERE `PoItemReceiveID` = ?;"; $qry = $this->db->query($sql, [ (intval($newReceivedQty) + intval($detail['receivedQty'])), $userId, $detail['PoItemReceiveID'], ]); if (!$qry) { $this->sys_error_db("Error update item receive", $this->db); $this->db->trans_rollback(); exit; } $jsonAfter = $this->getDataPoItemReceive($detail['PoItemReceiveID']); $dtlDesc = ''; if (intval($cekItem['ReceiveOrderPoDetailQty']) > intval($detail['qty'])) { $nwQty = intval($cekItem['ReceiveOrderPoDetailQty']) - intval($detail['qty']); $dtlDesc = ", mengembalikan {$nwQty} {$detail['ItemUnitName']} ke jumlah item yang belum diterima "; } if (intval($detail['qty']) > intval($cekItem['ReceiveOrderPoDetailQty'])) { $nwQty = intval($detail['qty']) - intval($cekItem['ReceiveOrderPoDetailQty']); $dtlDesc = ", mengambil {$nwQty} {$detail['ItemUnitName']} dari jumlah item yang belum diterima "; } $descItem = "UPDATE ITEM qty {$detail['M_ItemDesc']} dari {$cekItem['ReceiveOrderPoDetailQty']} {$detail['ItemUnitName']} menjadi {$detail['qty']} {$detail['ItemUnitName']}{$dtlDesc} di RO nomor {$jsonROBefore['ReceiveOrderPoNumber']} *RO belum di konfirmasi"; $this->insertLogPoItemReceive( $detail['PoItemReceiveID'], 'UPDATE', $roID, $jsonBefore, $jsonAfter, $userId, $descItem ); $jsonROAfter = $this->getDataReceiveOrderPO($roID); $this->insertLogReceiveOrderPo( $roID, 'UPDATE DETAIL', $jsonROBefore, $jsonROAfter, $userId, $descDetail ); $this->insertUserActivty($roID, 'UPDATE DETAIL', $userId, $descDetail); $this->db->trans_commit(); $this->sys_ok("Berhasil updatw qty item {$detail['M_ItemDesc']}"); } public function deleteItem() { // $this->db->trans_commit(); // $this->db->trans_rollback(); $this->db->trans_begin(); if (!$this->isLogin) { $this->sys_error("Invalid Token"); exit; } $prm = $this->sys_input; $user = $this->sys_user; $userId = $this->sys_user["M_UserID"]; $detail = $prm['detail']; $ro = $prm['ro']; $roID = $ro['ReceiveOrderPoID']; $detail = $prm['detail']; $detailID = $detail['ReceiveOrderPoDetailID']; $jsonROBefore = $this->getDataReceiveOrderPO($roID); $sql = "UPDATE receive_order_po_detail SET ReceiveOrderPoDetailIsActive = 'N', ReceiveOrderPoDetailDeletedUserID = ?, ReceiveOrderPoDetailDeleted = NOW() WHERE ReceiveOrderPoDetailID = ?;"; $qry = $this->db->query($sql, [ $userId, $detailID ]); if (!$qry) { $this->sys_error_db("Error update item", $this->db); $this->db->trans_rollback(); exit; } $descDetail = " DELETE ITEM {$detail['M_ItemDesc']} {$detail['tmpQty']} {$detail['ItemUnitName']} {$detail['WarehouseName']}"; $jsonBefore = $this->getDataPoItemReceive($detail['PoItemReceiveID']); $sql = "UPDATE `po_item_receive` JOIN receive_order_po_detail ON PoItemReceiveID = ReceiveOrderPoDetailPoItemReceiveID AND ReceiveOrderPoDetailReceiveOrderPoID = ? AND ReceiveOrderPoDetailID = ? SET `PoItemReceiveQtyReceived` = PoItemReceiveQtyReceived - ReceiveOrderPoDetailQty, `PoItemReceiveUpdatedUserID` = ? WHERE `PoItemReceiveID` = ?;"; $qry = $this->db->query($sql, [ $ro['ReceiveOrderPoID'], $detail['ReceiveOrderPoDetailID'], $userId, $detail['PoItemReceiveID'] ]); if (!$qry) { $this->sys_error_db("Error update item receive", $this->db); $this->db->trans_rollback(); exit; } $jsonAfter = $this->getDataPoItemReceive($detail['PoItemReceiveID']); $descItem = "Dihapus {$detail['M_ItemDesc']} sejumlah {$detail['tmpQty']} {$detail['ItemUnitName']} di RO nomor {$jsonROBefore['ReceiveOrderPoNumber']} *RO belum di konfirmasi"; $this->insertLogPoItemReceive( $detail['PoItemReceiveID'], 'UPDATE', $roID, $jsonBefore, $jsonAfter, $userId, $descItem ); $jsonROAfter = $this->getDataReceiveOrderPO($roID); $this->insertLogReceiveOrderPo( $roID, 'DELETE DETAIL', $jsonROBefore, $jsonROAfter, $userId, $descDetail ); $this->insertUserActivty($roID, 'DELETE DETAIL', $userId, $descDetail); $this->db->trans_commit(); $this->sys_ok("Berhasil hapus item {$detail['M_ItemDesc']}"); } public function deleteHeader() { $this->db->trans_begin(); if (!$this->isLogin) { $this->sys_error("Invalid Token"); exit; } $prm = $this->sys_input; $user = $this->sys_user; $userId = $this->sys_user["M_UserID"]; $ro = $prm['ro']; $roID = $ro['ReceiveOrderPoID']; $jsonROBefore = $this->getDataReceiveOrderPO($roID); if ($jsonROBefore['ReceiveOrderPoConfirmed'] === 'Y') { $this->sys_error("{$jsonROBefore['ReceiveOrderPoNumber']} tidak bisa di hapus karena sudah di konfirmasi pada {$jsonROBefore['ReceiveOrderPoIDate']}"); exit; } $sql = "UPDATE `receive_order_po` SET ReceiveOrderPoIsActive = 'N', ReceiveOrderPoDeleted = NOW(), `ReceiveOrderPoDeletedUserID` = ? WHERE ReceiveOrderPoID = ?;"; $qry = $this->db->query($sql, [ $userId, $roID ]); if (!$qry) { $this->sys_error_db("Error delete receive oder", $this->db); $this->db->trans_rollback(); exit; } $sql = "SELECT * FROM receive_order_po_detail JOIN m_item ON ReceiveOrderPoItemID = M_ItemID JOIN itemunit ON ReceiveOrderPoItemUnitID = ItemUnitID WHERE ReceiveOrderPoDetailReceiveOrderPoID = ? AND ReceiveOrderPoDetailIsActive = 'Y'"; $qry = $this->db->query($sql, [ $roID ]); if (!$qry) { $this->sys_error_db("Error get receive oder detail", $this->db); $this->db->trans_rollback(); exit; } $details = $qry->result_array(); $descDetail = []; foreach ($details as $key => $detail) { $detailID = $detail['ReceiveOrderPoDetailID']; $sql = "UPDATE receive_order_po_detail SET ReceiveOrderPoDetailIsActive = 'N', ReceiveOrderPoDetailDeletedUserID = ?, ReceiveOrderPoDetailDeleted = NOW() WHERE ReceiveOrderPoDetailID = ?; "; $qry = $this->db->query($sql, [ $userId, $detailID ]); if (!$qry) { $this->sys_error_db("Error update item", $this->db); $this->db->trans_rollback(); exit; } $descDetail[] = "- DELETE ITEM {$detail['M_ItemDesc']} {$detail['ReceiveOrderPoDetailQty']} {$detail['ItemUnitName']} {$ro['WarehouseName']}"; $jsonBefore = $this->getDataPoItemReceive($detail['ReceiveOrderPoDetailPoItemReceiveID']); $sql = "UPDATE `po_item_receive` JOIN receive_order_po_detail ON PoItemReceiveID = ReceiveOrderPoDetailPoItemReceiveID AND ReceiveOrderPoDetailReceiveOrderPoID = ? AND ReceiveOrderPoDetailID = ? SET `PoItemReceiveQtyReceived` = PoItemReceiveQtyReceived - ReceiveOrderPoDetailQty, `PoItemReceiveUpdatedUserID` = ? WHERE `PoItemReceiveID` = ?;"; $qry = $this->db->query($sql, [ $ro['ReceiveOrderPoID'], $detail['ReceiveOrderPoDetailID'], $userId, $detail['ReceiveOrderPoDetailPoItemReceiveID'] ]); if (!$qry) { $this->sys_error_db("Error update item receive", $this->db); $this->db->trans_rollback(); exit; } $jsonAfter = $this->getDataPoItemReceive($detail['ReceiveOrderPoDetailPoItemReceiveID']); $descItem = "Dihapus {$detail['M_ItemDesc']} sejumlah {$detail['ReceiveOrderPoDetailQty']} {$detail['ItemUnitName']} di RO nomor {$jsonROBefore['ReceiveOrderPoNumber']} *RO belum di konfirmasi"; $this->insertLogPoItemReceive( $detail['ReceiveOrderPoDetailPoItemReceiveID'], 'UPDATE', $roID, $jsonBefore, $jsonAfter, $userId, $descItem ); } $jsonROAfter = $this->getDataReceiveOrderPO($roID); $desc = "Update data Ro {$ro['ReceiveOrderPoNumber']}"; $this->insertLogReceiveOrderPo( $roID, 'DELETE HEADER', $jsonROBefore, $jsonROAfter, $userId, $desc . "\n" . implode("\n", $descDetail) ); $this->insertUserActivty($roID, 'DELETE HEADER', $userId, $desc . "\n" . implode("\n", $descDetail)); $this->db->trans_commit(); $this->sys_ok("Berhasil hapus {$ro['ReceiveOrderPoNumber']}"); } public function search() { if (!$this->isLogin) { $this->sys_error("Invalid Token"); exit; } $prm = $this->sys_input; $userid = $this->sys_user["M_UserID"]; $user = $this->sys_user; $search = '%' . $prm['search'] . '%'; $page = $prm["page"]; $startDate = $prm["startDate"]; $endDate = $prm["endDate"]; $ROW_PER_PAGE = 20; $start_offset = 0; // print_r($prm); if (isset($prm["page"])) { if ( is_numeric($prm["page"]) && $prm["page"] > 0 ) { $start_offset = ($page - 1) * $ROW_PER_PAGE; } } $regionalId = $this->sys_user["S_RegionalID"]; $sqlWhere = ""; if ($user['M_UserLocationFlag'] == "R") { $sqlWhere = "AND ReceiveOrderPoS_RegionalID ={$regionalId}"; } if ($user['M_UserLocationFlag'] == "RB" || $user['M_UserLocationFlag'] == "B") { $sqlWhere = "AND ReceiveOrderPoS_RegionalID = {$regionalId} AND ReceiveOrderPoM_BranchCode LIKE '{$user['M_BranchCode']}%'"; } // Add subquery to filter by ItemCategoryID=4 $categoryFilter = "AND ReceiveOrderPoID NOT IN ( SELECT DISTINCT ReceiveOrderPoDetailReceiveOrderPoID FROM receive_order_po_detail JOIN purchase_order ON ReceiveOrderPoDetailPurchaseOrderID = PurchaseOrderID WHERE PurchaseOrderItemCategoryID = 4 AND ReceiveOrderPoDetailIsActive = 'Y' )"; $sql = "SELECT COUNT(*) as total FROM receive_order_po JOIN warehouse ON ReceiveOrderPoWarehouseID = WarehouseID JOIN supplier ON ReceiveOrderPoSupplierID = SupplierID JOIN s_regional ON WarehouseS_RegionalID = S_RegionalID AND S_RegionalIsActive = 'Y' LEFT JOIN m_branch ON WarehouseM_BranchID = M_BranchID AND M_BranchIsActive = 'Y' WHERE ReceiveOrderPoNumber LIKE ? AND ReceiveOrderPoIsActive = 'Y' AND ReceiveOrderPoIDate BETWEEN ? AND ? $sqlWhere $categoryFilter"; $qry = $this->db->query($sql, [$search, $startDate, $endDate]); if (!$qry) { $this->sys_error_db("Error get total", $this->db); exit; } // print_r($this->db->last_query()); $total = $qry->row_array()['total']; $sql = "SELECT ReceiveOrderPoNumber, ReceiveOrderPoID, ReceiveOrderPoSupplierID, ReceiveOrderPoIDate, ReceiveOrderShippingCostAmount, ReceiveOrderPoNote, ReceiveOrderPoRefNumber, SupplierID, SupplierName, WarehouseID, WarehouseCode, CASE WHEN WarehouseType = 'B' THEN CONCAT(WarehouseCode,' ', WarehouseName, ' - ', M_BranchName) WHEN WarehouseType = 'R' THEN CONCAT(WarehouseCode,' ', WarehouseName, ' - ', S_RegionalName) ELSE '' END WarehouseName, ReceiveOrderPoConfirmed, DATE_FORMAT(ReceiveOrderPoConfirmedDate, '%d-%m-%Y %H:%i') AS ReceiveOrderPoConfirmedDate, M_UserUsername ReceiveOrderPoConfirmedUserName FROM receive_order_po JOIN warehouse ON ReceiveOrderPoWarehouseID = WarehouseID JOIN supplier ON ReceiveOrderPoSupplierID = SupplierID JOIN s_regional ON WarehouseS_RegionalID = S_RegionalID AND S_RegionalIsActive = 'Y' LEFT JOIN m_branch ON WarehouseM_BranchID = M_BranchID AND M_BranchIsActive = 'Y' LEFT JOIN m_user ON ReceiveOrderPoConfirmedUserID = M_UserID WHERE ReceiveOrderPoNumber LIKE ? AND ReceiveOrderPoIsActive = 'Y' AND ReceiveOrderPoIDate BETWEEN ? AND ? {$sqlWhere} {$categoryFilter} ORDER BY ReceiveOrderPoID DESC LIMIT ? OFFSET ?"; $qry = $this->db->query($sql, [$search, $startDate, $endDate, $ROW_PER_PAGE, $start_offset]); if (!$qry) { $this->sys_error_db("Error get search", $this->db); exit; } // echo $this->db->last_query(); $rst = array( "total" => ceil($total / $ROW_PER_PAGE), "records" => $qry->result_array() ); $this->sys_ok($rst); } public function getChecklist() { if (!$this->isLogin) { $this->sys_error("Invalid Token"); exit; } $prm = $this->sys_input; $userid = $this->sys_user["M_UserID"]; $user = $this->sys_user; $id = $prm["id"]; $sql = "SELECT rc.*, IFNULL(ReceiveOrderPoChecklistValue, 'N') RoChecklistValue, IFNULL(ReceiveOrderPoChecklistNote,'') RoChecklistNote, IFNULL (ReceiveOrderPoChecklistID, 0) idCek FROM ro_checklist rc LEFT JOIN ro_checklist_map rcm ON rc.RoChecklistID = rcm.RoChecklistMapRoChecklistID JOIN receive_order_po_detail rop ON rop.ReceiveOrderPoDetailReceiveOrderPoID = ? JOIN m_item mi ON mi.M_ItemID = rop.ReceiveOrderPoItemID LEFT JOIN receive_order_po_checklist ON rc.RoChecklistID = ReceiveOrderPoChecklistRoChecklistID AND ReceiveOrderPoChecklistReceiveOrderPoID = rop.ReceiveOrderPoDetailReceiveOrderPoID AND ReceiveOrderPoChecklistIsActive = 'Y' WHERE rc.RoChecklistIsActive = 'Y' AND ( rc.RoChecklistType = 'G' OR ( rc.RoChecklistType = 'C' AND rcm.RoChecklistMapItemCategoryID = mi.M_ItemItem_CategoryID AND rcm.RoChecklistMapIsActive = 'Y' ) OR ( rc.RoChecklistType = 'P' AND rcm.RoChecklistMapNat_GroupID = mi.M_ItemNat_GroupID AND rcm.RoChecklistMapNat_SubGroupID = mi.M_ItemNat_SubGroupID AND rcm.RoChecklistMapIsActive = 'Y' ) ) GROUP BY rc.RoChecklistID;"; $qry = $this->db->query($sql, [$id]); if (!$qry) { $this->sys_error_db("Error get ro checklist", $this->db); exit; } $data = $qry->result_array(); $cek = 'N'; foreach ($data as $key => $value) { if (intval($value['idCek']) > 0) $cek = 'Y'; } $this->sys_ok([ "data" => $data, "status" => $cek ]); } public function saveChecklist() { // $this->db->trans_commit(); // $this->db->trans_rollback(); $this->db->trans_begin(); if (!$this->isLogin) { $this->sys_error("Invalid Token"); exit; } $prm = $this->sys_input; $userid = $this->sys_user["M_UserID"]; $user = $this->sys_user; $id = $prm["id"]; $ron = $prm["ron"]; $checklist = $prm["checklist"]; $sql = "SELECT * FROM receive_order_po_checklist WHERE ReceiveOrderPoChecklistReceiveOrderPoID = ? AND ReceiveOrderPoChecklistIsActive = 'Y'"; $qry = $this->db->query($sql, [$id]); if (!$qry) { $this->db->trans_rollback(); $this->sys_error_db("get checklist before", $this->db);; exit; } $dataBefore = $qry->result_array(); $logMsg = ["Update checklist RO nomor {$ron}"]; foreach ($checklist as $key => $value) { $sql = "SELECT * FROM receive_order_po_checklist WHERE ReceiveOrderPoChecklistReceiveOrderPoID = ? AND ReceiveOrderPoChecklistRoChecklistID = ? AND ReceiveOrderPoChecklistIsActive = 'Y'"; $qry = $this->db->query($sql, [$id, $value['RoChecklistID']]); if (!$qry) { $this->db->trans_rollback(); $this->sys_error_db("get checklist", $this->db);; exit; } $dataChecklist = $qry->row_array(); if (empty($dataChecklist)) { //insert $sql = "INSERT INTO receive_order_po_checklist ( ReceiveOrderPoChecklistReceiveOrderPoID, ReceiveOrderPoChecklistRoChecklistID, ReceiveOrderPoChecklistValue, ReceiveOrderPoChecklistNote, ReceiveOrderPoChecklistCreated, ReceiveOrderPoChecklistCreatedUserID) VALUES (?, ?, ?, ?, NOW(), ?)"; $qry = $this->db->query($sql, [ $id, $value['RoChecklistID'], $value['RoChecklistValue'], $value['RoChecklistNote'], $userid ]); if (!$qry) { $this->db->trans_rollback(); $this->sys_error_db("insert checklist checklist", $this->db);; exit; } $ket = "memenuhi dan catatan '{$value['RoChecklistNote']}'"; if ($value['RoChecklistValue'] == 'N') { $ket = "tidak memenuhi dan catatan '{$value['RoChecklistNote']}'"; } $logMsg[] = "- Tambah checklist {$value['RoChecklistName']} dengan nilai {$ket} "; } else { $sql = "UPDATE receive_order_po_checklist SET ReceiveOrderPoChecklistValue = ?, ReceiveOrderPoChecklistNote = ?, ReceiveOrderPoChecklistLastUpdatedUserID = ? WHERE ReceiveOrderPoChecklistID = ?"; $qry = $this->db->query($sql, [ $value['RoChecklistValue'], $value['RoChecklistNote'], $userid, $dataChecklist['ReceiveOrderPoChecklistID'] ]); if (!$qry) { $this->db->trans_rollback(); $this->sys_error_db("update checklist checklist", $this->db);; exit; } $ket = "memenuhi dan catatan '{$value['RoChecklistNote']}'"; if ($value['RoChecklistValue'] == 'N') { $ket = "tidak memenuhi dan catatan '{$value['RoChecklistNote']}'"; } $logMsg[] = "- Update checklist {$value['RoChecklistName']} dengan nilai {$ket} "; } } $sql = "SELECT * FROM receive_order_po_checklist WHERE ReceiveOrderPoChecklistReceiveOrderPoID = ? AND ReceiveOrderPoChecklistIsActive = 'Y'"; $qry = $this->db->query($sql, [$id]); if (!$qry) { $this->db->trans_rollback(); $this->sys_error_db("get checklist before", $this->db);; exit; } $dataAfter = $qry->result_array(); $this->insertLogReceiveOrderPo( $id, 'UPDATE CHECKLIST', $dataBefore, $dataAfter, $userid, implode("\n", $logMsg) ); $this->insertUserActivty( $id, 'UPDATE CHECKLIST', $userid, implode("\n", $logMsg) ); $this->db->trans_commit(); $this->sys_ok("Berhasil simpan checklist"); } private function getCoaTampunganNonPersediaan($itemCategoryID) { $sqlCoaInventory = "SELECT coaID, coaAccountNo, coaDescription FROM coa_tampungan_nonper JOIN coa ON CoaAccountNo_JurnalRO = coaAccountNo WHERE CoaTampunganNpM_ItemCategoryID = ? AND CoaTampunganNpIsActive = 'Y' AND coaIsActive = 'Y';"; $queCoaInventory = $this->db->query($sqlCoaInventory, [$itemCategoryID]); if (!$queCoaInventory) { $this->db->trans_rollback(); $this->sys_error("[Error] Gagal mendapatkan CoA Akun Tampungan untuk Item Kategori ID: {$itemCategoryID}"); exit; } $coaInventory = $queCoaInventory->row_array(); return $coaInventory; } public function confirmRo() { if (!$this->isLogin) { $this->sys_error("Invalid Token"); exit; } $this->db->trans_begin(); $prm = $this->sys_input; $user = $this->sys_user; $userID = $user['M_UserID']; $id = $prm['id']; $jsonROBefore = $this->getDataReceiveOrderPO($id); $sqlro = "SELECT receive_order_po.*, DATE_FORMAT(ReceiveOrderPoIDate, '%d-%m-%Y') formatedDate, CASE WHEN WarehouseType = 'B' THEN CONCAT(WarehouseCode,' ', WarehouseName, ' - ', M_BranchName) WHEN WarehouseType = 'R' THEN CONCAT(WarehouseCode,' ', WarehouseName, ' - ', S_RegionalName) ELSE '' END WarehouseName, WarehouseID FROM receive_order_po JOIN warehouse ON ReceiveOrderPoWarehouseID = WarehouseID JOIN s_regional ON WarehouseS_RegionalID = S_RegionalID AND S_RegionalIsActive = 'Y' LEFT JOIN m_branch ON WarehouseM_BranchID = M_BranchID AND M_BranchIsActive = 'Y' WHERE ReceiveOrderPoID = ?"; $quero = $this->db->query($sqlro, [$id]); if (!$quero) { $this->db->trans_rollback(); $this->sys_error_db("get PO ", $this->db);; exit; } $dataRO = $quero->row_array(); if ($dataRO['ReceiveOrderPoConfirmed'] == 'Y') { $this->db->trans_rollback(); $this->sys_error("Penerimaan barang {$dataRO['ReceiveOrderPoNumber']} sudah pernah dikonfirmasi"); exit; } $sqltotalPO = "SELECT SUM(subquery.PurchaseOrderSummaryQty) as totalAllQtyPO, SUM(subquery.PurchaseOrderSummaryTotal) as totalAllPricePO FROM ( SELECT PurchaseOrderSummaryQty, PurchaseOrderSummaryTotal FROM receive_order_po_detail JOIN purchase_order_summary ON PurchaseOrderSummaryPurchaseOrderID = ReceiveOrderPoDetailPurchaseOrderID AND PurchaseOrderSummaryIsActive = 'Y' WHERE ReceiveOrderPoDetailReceiveOrderPoID = ? GROUP BY PurchaseOrderSummaryID ) as subquery"; $quetotalPO = $this->db->query($sqltotalPO, [$id]); if (!$quetotalPO) { $this->db->trans_rollback(); $this->sys_error_db("[Error] get detail total qty and price of item po"); exit; } $POTotalItem = $quetotalPO->result_array()[0]['totalAllQtyPO']; $POTotalPrice = $quetotalPO->result_array()[0]['totalAllPricePO']; $sqldetailro = "SELECT receive_order_po_detail.*, PurchaseOrderID, PurchaseOrderNumber, PurchaseOrderTaxPercentPph, PurchaseOrderTaxPercentPpn, PurchaseOrderSummaryDiscountAmount as DiscountPerItem, PurchaseOrderSummaryQty as QtyAllPO, PurchaseOrderSummaryTotal as TotalAllPO, PurchaseOrderDiscountPercent AS DiscPOPercent, PurchaseOrderDiscountAmount AS DiscPORupiah FROM receive_order_po_detail JOIN purchase_order ON ReceiveOrderPoDetailPurchaseOrderID = PurchaseOrderID JOIN purchase_order_summary ON ReceiveOrderPoDetailPurchaseOrderSummaryID = PurchaseOrderSummaryID AND PurchaseOrderSummaryIsActive = 'Y' WHERE ReceiveOrderPoDetailReceiveOrderPoID = ? AND ReceiveOrderPoDetailIsActive='Y' GROUP BY ReceiveOrderPoDetailID"; $quedetailro = $this->db->query($sqldetailro, [$id]); if (!$quedetailro) { $this->db->trans_rollback(); $this->sys_error_db("get ro detail ", $this->db);; exit; } $detailRO = $quedetailro->result_array(); $sqlponum = "SELECT GROUP_CONCAT(DISTINCT PurchaseOrdernumber SEPARATOR ', ') as ponumber FROM receive_order_po_detail JOIN purchase_order ON ReceiveOrderPoDetailPurchaseOrderID = PurchaseOrderID WHERE ReceiveOrderPoDetailReceiveOrderPoID = ? AND ReceiveOrderPoDetailIsActive='Y'"; $queponum = $this->db->query($sqlponum, [$id]); if (!$sqlponum) { $this->db->trans_rollback(); $this->sys_error_db("get ro detail ", $this->db); exit; } $strPONumber = $queponum->row_array()['ponumber']; $desc = "Konfirmasi penerimaan barang {$dataRO['ReceiveOrderPoNumber']} yang meliputi beberapa item dari PO {$strPONumber}"; // generate jurnal number $sqljrnum = "SELECT `fn_numbering`('J') AS numbering"; $quejrnum = $this->db->query($sqljrnum, []); if (!$quejrnum) { $this->sys_error_db("get numbering error", $this->db); $this->db->trans_rollback(); exit; } $jurnalNumber = $quejrnum->row_array()["numbering"]; // get periode jurnal $sqlprd = "SELECT periodeID FROM periode WHERE DATE(NOW()) BETWEEN periodeStartDate AND periodeEndDate AND periodeIsActive= 'Y' AND periodeIsClosed = 'N'"; $queprd = $this->db->query($sqlprd, []); if (!$queprd) { $this->sys_error_db("get periode error", $this->db); $this->db->trans_rollback(); exit; } $jurnalPeriode = $queprd->row_array()['periodeID']; if (empty($jurnalPeriode)) { $this->sys_error("Periode untuk generate jurnal tidak ditemukan"); $this->db->trans_rollback(); exit; } $jurnalTitle = "Jurnal Penerimaan Barang Dari PO {$strPONumber} Tanggal {$dataRO['formatedDate']}"; $jurnalDesc = "Jurnal Penerimaan Barang Dari PO {$strPONumber} Tanggal {$dataRO['formatedDate']} Di {$dataRO['WarehouseName']}"; $descJurnal = "ADD Jurnal Penerimaan Barang Dari PO {$strPONumber} Tanggal {$dataRO['formatedDate']} Di {$dataRO['WarehouseName']}"; $descJurnalDetail = []; $sqljurnaltype = "SELECT JurnalTypeID FROM jurnal_type WHERE JurnalTypeCode = ? AND JurnalTypeIsActive = 'Y'"; $quejurnaltype = $this->db->query($sqljurnaltype, ['AUTOGOODRECEIVE']); if (!$quejurnaltype) { $this->sys_error("[Error] jurnal type tidak ditemukan"); $this->db->trans_rollback(); exit; } $jurnalType = $quejurnaltype->row_array()['JurnalTypeID']; // insert table jurnal $sqlinsjurnal = "INSERT INTO jurnal ( jurnalM_BranchCompanyID, JurnalS_RegionalID, jurnalM_BranchCode, jurnalperiodeID, jurnalNo, jurnalTitle, jurnalDescription, jurnalDate, jurnalJurnalTypeID, jurnalM_UserID ) VALUES (?,?,?,?,?,?,?,NOW(),?,?)"; $queinsjurnal = $this->db->query($sqlinsjurnal, [ $user['M_BranchCompanyID'], $user['S_RegionalID'], $user['M_BranchCode'], $jurnalPeriode, $jurnalNumber, $jurnalTitle, $jurnalDesc, $jurnalType, $userID ]); if (!$queinsjurnal) { $this->db->trans_rollback(); $this->sys_error_db("Error insert jurnal ", $this->db);; exit; } $jurnalID = $this->db->insert_id(); // insert jurnal addon $sqlinsjurnaladdon = "INSERT INTO jurnal_addon ( jurnalAddOnJurnalID, jurnalAddOnCode, jurnalAddOnValue, jurnalAddOnCreated, jurnalAddOnCreatedUserID ) VALUES (?,'RONUMB',?,NOW(),?)"; $queinsjurnaladdon = $this->db->query($sqlinsjurnaladdon, [ $jurnalID, $dataRO['ReceiveOrderPoNumber'], $userID ]); if (!$queinsjurnaladdon) { $this->db->trans_rollback(); $this->sys_error_db("error insert jurnal addon ", $this->db);; exit; } // update status confirmed RO $sqlupdro = "UPDATE `receive_order_po` SET ReceiveOrderPoConfirmed = 'Y', ReceiveOrderPoConfirmedDate = NOW(), ReceiveOrderPoConfirmedUserID = ? WHERE ReceiveOrderPoID = ?"; $queupdro = $this->db->query($sqlupdro, [$userID, $id]); if (!$queupdro) { $this->sys_error_db("Error confirm receive oder", $this->db); $this->db->trans_rollback(); exit; } // insert jurnal tx $totalDebet = 0.00; $totalDiscountItem = 0.00; $totalDiscountPO = 0.00; foreach ($detailRO as $key => $item) { $sqlitem = "SELECT * FROM m_item WHERE M_ItemID = ?"; $queitem = $this->db->query($sqlitem, [$item['ReceiveOrderPoItemID']]); if (!$queitem) { $this->db->trans_rollback(); $this->sys_error_db("error cek item ", $this->db);; exit; } $cekItem = $queitem->row_array(); if (empty($cekItem)) { $this->db->trans_rollback(); $this->sys_error_db("Item {$item['PurchaseOrderNumber']} {$cekItem['M_ItemDesc']} tidak ditemukan ", $this->db); exit; } if (empty($cekItem['M_ItemItem_CategoryID'])) { $this->db->trans_rollback(); $this->sys_error_db("Item {$item['PurchaseOrderNumber']} {$cekItem['M_ItemDesc']} belum memiliki kategori ", $this->db); exit; } // insert jurnal tx per category // ItemCategoryID 1 = Persediaan if (intval($cekItem['M_ItemItem_CategoryID']) == 1) { if (empty($cekItem['M_ItemNat_SubGroupID'])) { $this->db->trans_rollback(); $this->sys_error_db("Item {$item['PurchaseOrderNumber']} {$cekItem['M_ItemDesc']} belum memiliki sub group ", $this->db); exit; } $sqlnatgroup = "SELECT * FROM map_nat_subgroup WHERE MapNatSub_NatGroupID = ? AND MapNatSub_NatSubGroupID = ? AND MapNatSub_IsActive = 'Y'"; $quenatgroup = $this->db->query($sqlnatgroup, [ $cekItem['M_ItemNat_GroupID'], $cekItem['M_ItemNat_SubGroupID'] ]); if (!$quenatgroup) { $this->db->trans_rollback(); $this->sys_error_db("error get map_nat_subgroup ", $this->db);; exit; } $mapNatSubGroup = $quenatgroup->row_array(); if ( empty($mapNatSubGroup['MapNatSub_PersediaanCoaID']) || empty($mapNatSubGroup['MapNatSub_PersediaanCoaAccountNo']) || empty($mapNatSubGroup['MapNatSub_PersediaanCoaDescription']) ) { $this->db->trans_rollback(); $this->sys_error_db("Coa item {$item['PurchaseOrderNumber']} {$cekItem['M_ItemDesc']} belum termapping", $this->db);; exit; } $debet = round(intval($item['ReceiveOrderPoDetailQty']) * doubleval($item['ReceiveOrderPoDetailPrice']), 2); $totalDebet = round($totalDebet + $debet, 2); // insert jurnal tx debet $sqljtx = "INSERT INTO jurnal_tx ( jurnalTxJurnalID, jurnalTxCoaID, jurnalTxDescription, jurnalTxDebit, jurnalTxCredit, jurnalTxM_UserID ) VALUES(?,?,?,?,?,?)"; $qryjtx = $this->db->query($sqljtx, array( $jurnalID, $mapNatSubGroup['MapNatSub_PersediaanCoaID'], $mapNatSubGroup['MapNatSub_PersediaanCoaDescription'], $debet, 0, $userID )); if (!$qryjtx) { $this->db->trans_rollback(); $this->sys_error_db("Error insert jurnal tx {$item['PurchaseOrderNumber']} {$cekItem['M_ItemDesc']}"); exit; } $jurnalTxID = $this->db->insert_id(); $formatDebet = $this->formatRupiah($debet); $descJurnalDetail[] = "- Add detail Jurnal debet {$cekItem['M_ItemDesc']} {$mapNatSubGroup['MapNatSub_PersediaanCoaDescription']} sejumlah {$formatDebet}"; $sqladdon = "INSERT INTO jurnal_addon ( jurnalAddOnJurnalID, jurnalAddOnJurnalTxID, jurnalAddOnCode, jurnalAddOnValue, jurnalAddOnCreated, jurnalAddOnCreatedUserID ) VALUES (?,?,'PONUMB',?,NOW(),?)"; $qry = $this->db->query($sqladdon, [ $jurnalID, $jurnalTxID, $item['PurchaseOrderNumber'], $userID ]); if (!$qry) { $this->db->trans_rollback(); $this->sys_error_db("error insert jurnal addon {$item['PurchaseOrderNumber']} {$cekItem['M_ItemDesc']}", $this->db);; exit; } // insert jurnal tx kredit diskon $diskon = round(intval($item['ReceiveOrderPoDetailQty']) * doubleval($item['DiscountPerItem']), 2); $totalDiscountItem = round($totalDiscountItem + $diskon, 2); // calc discount prorata per item dari discount PO $PODiscount = intval($item['DiscPORupiah']); if (doubleval($item['DiscPOPercent']) != 0.00) { $PODiscount = doubleval($POTotalPrice) * doubleval($item['DiscPOPercent']) / 100; } $discProporsiPO = $PODiscount * (doubleval($item['TotalAllPO']) / doubleval($POTotalPrice)); $discPODiterima = round((intval($item['ReceiveOrderPoDetailQty']) / intval($item['QtyAllPO'])) * $discProporsiPO, 2); $totalDiscountPO = round($totalDiscountPO + $discPODiterima, 2); $listdisc = [$diskon, $discPODiterima]; $sqlcoa = "SELECT * FROM coa WHERE coaAccountNo = '2190100001' LIMIT 1"; $quecoa = $this->db->query($sqlcoa, []); if (!$quecoa) { $this->db->trans_rollback(); $this->sys_error_db("[Error] get coa diskon pembelian"); exit; } $CoaDisc = $quecoa->result_array()[0]; foreach ($listdisc as $key => $value) { if (intval($value) != 0) { $quekdt = $this->db->query($sqljtx, [ $jurnalID, $CoaDisc['coaID'], $CoaDisc['coaDescription'], 0, $value, $userID ]); if (!$quekdt) { $this->db->trans_rollback(); $this->sys_error_db("[Error] insert jurnal tx diskon RO: {$item['ReceiveOrderPoDetailID']}"); exit; } $jurTxID = $this->db->insert_id(); $queaddon = $this->db->query($sqladdon, [$jurnalID, $jurTxID, $item['PurchaseOrderNumber'], $userID]); if (!$queaddon) { $this->db->trans_rollback(); $this->sys_error_db("[Error] insert jurnal addon diskon"); exit; } } } // save diskon prorata $sqldispro = "UPDATE receive_order_po_detail SET ReceiveOrderPoDetailDiskonPoProrata = ? WHERE ReceiveOrderPoDetailID = ?"; $quedispro = $this->db->query($sqldispro, [$discPODiterima, $item['ReceiveOrderPoDetailID']]); if (!$quedispro) { $this->db->trans_rollback(); $this->sys_error_db("[Error] update detail diskon prorata"); exit; } } else if (intval($cekItem['M_ItemItem_CategoryID']) == 2) { // Inventaris (NonPersediaan) selalu memakai CoA akun Tampungan // TODO: Update dengan CoA yang Benar $coaInventory = $this->getCoaTampunganNonPersediaan(intval($cekItem['M_ItemItem_CategoryID'])); $debet = round(intval($item['ReceiveOrderPoDetailQty']) * doubleval($item['ReceiveOrderPoDetailPrice']), 2); $totalDebet = round($totalDebet + $debet, 2); // insert jurnal tx debet $sqljtx = "INSERT INTO jurnal_tx ( jurnalTxJurnalID, jurnalTxCoaID, jurnalTxDescription, jurnalTxDebit, jurnalTxCredit, jurnalTxM_UserID ) VALUES(?,?,?,?,?,?)"; $qryjtx = $this->db->query($sqljtx, array( $jurnalID, $coaInventory['coaID'], $coaInventory['coaDescription'], $debet, 0, $userID )); if (!$qryjtx) { $this->db->trans_rollback(); $this->sys_error_db("Error insert jurnal tx {$item['PurchaseOrderNumber']} {$cekItem['M_ItemDesc']}"); exit; } $jurnalTxID = $this->db->insert_id(); $formatDebet = $this->formatRupiah($debet); $descJurnalDetail[] = "- Add detail Jurnal debet {$cekItem['M_ItemDesc']} {$coaInventory['coaDescription']} sejumlah {$formatDebet}"; $sqladdon = "INSERT INTO jurnal_addon ( jurnalAddOnJurnalID, jurnalAddOnJurnalTxID, jurnalAddOnCode, jurnalAddOnValue, jurnalAddOnCreated, jurnalAddOnCreatedUserID ) VALUES (?,?,'PONUMB',?,NOW(),?)"; $qry = $this->db->query($sqladdon, [ $jurnalID, $jurnalTxID, $item['PurchaseOrderNumber'], $userID ]); if (!$qry) { $this->db->trans_rollback(); $this->sys_error_db("error insert jurnal addon {$item['PurchaseOrderNumber']} {$cekItem['M_ItemDesc']}", $this->db);; exit; } // insert jurnal tx kredit diskon $diskon = round(intval($item['ReceiveOrderPoDetailQty']) * doubleval($item['DiscountPerItem']), 2); $totalDiscountItem = round($totalDiscountItem + $diskon, 2); // calc discount prorata per item dari discount PO $PODiscount = intval($item['DiscPORupiah']); if (doubleval($item['DiscPOPercent']) != 0.00) { $PODiscount = doubleval($POTotalPrice) * doubleval($item['DiscPOPercent']) / 100; } $discProporsiPO = $PODiscount * (doubleval($item['TotalAllPO']) / doubleval($POTotalPrice)); $discPODiterima = round((intval($item['ReceiveOrderPoDetailQty']) / intval($item['QtyAllPO'])) * $discProporsiPO, 2); $totalDiscountPO = round($totalDiscountPO + $discPODiterima, 2); $listdisc = [$diskon, $discPODiterima]; $sqlcoa = "SELECT * FROM coa WHERE coaAccountNo = '2190100001' LIMIT 1"; $quecoa = $this->db->query($sqlcoa, []); if (!$quecoa) { $this->db->trans_rollback(); $this->sys_error_db("[Error] get coa diskon pembelian"); exit; } $CoaDisc = $quecoa->result_array()[0]; foreach ($listdisc as $key => $value) { if (intval($value) != 0) { $quekdt = $this->db->query($sqljtx, [ $jurnalID, $CoaDisc['coaID'], $CoaDisc['coaDescription'], 0, $value, $userID ]); if (!$quekdt) { $this->db->trans_rollback(); $this->sys_error_db("[Error] insert jurnal tx diskon RO: {$item['ReceiveOrderPoDetailID']}"); exit; } $jurTxID = $this->db->insert_id(); $queaddon = $this->db->query($sqladdon, [$jurnalID, $jurTxID, $item['PurchaseOrderNumber'], $userID]); if (!$queaddon) { $this->db->trans_rollback(); $this->sys_error_db("[Error] insert jurnal addon diskon"); exit; } } } // save diskon prorata $sqldispro = "UPDATE receive_order_po_detail SET ReceiveOrderPoDetailDiskonPoProrata = ? WHERE ReceiveOrderPoDetailID = ?"; $quedispro = $this->db->query($sqldispro, [$discPODiterima, $item['ReceiveOrderPoDetailID']]); if (!$quedispro) { $this->db->trans_rollback(); $this->sys_error_db("[Error] update detail diskon prorata"); exit; } } else if (intval($cekItem['M_ItemItem_CategoryID']) == 3) { //Aset if (empty($cekItem['M_ItemFa_ClassID'])) { $this->db->trans_rollback(); $this->sys_error_db("{$item['PurchaseOrderNumber']} Item {$cekItem['M_ItemDesc']} belum memiliki class asset ", $this->db); exit; } $sql = "SELECT * FROM fa_class WHERE Fa_ClassID = ? AND Fa_ClassIsActive = 'Y'"; $qry = $this->db->query($sql, [ $cekItem['M_ItemFa_ClassID'] ]); if (!$qry) { $this->db->trans_rollback(); $this->sys_error_db("error get class asset {$item['PurchaseOrderNumber']} {$cekItem['M_ItemDesc']} ", $this->db);; exit; } $faClass = $qry->row_array(); if (empty($faClass)) { $this->db->trans_rollback(); $this->sys_error_db("{$item['PurchaseOrderNumber']} Item {$cekItem['M_ItemDesc']} class asset sudah terhapus", $this->db);; exit; } $debet = intval($item['ReceiveOrderPoDetailQty']) * doubleval($item['ReceiveOrderPoDetailPrice']); $totalDebet = $totalDebet + $debet; $sqljtx = "INSERT INTO jurnal_tx ( jurnalTxJurnalID, jurnalTxCoaID, jurnalTxDescription, jurnalTxDebit, jurnalTxCredit, jurnalTxM_UserID) VALUES(?,?,?,?,?,?)"; $qry = $this->db->query($sqljtx, array( $jurnalID, $faClass['Fa_ClassCoaID'], $faClass['Fa_ClassCoaDesc'], $debet, 0, $userID )); if (!$qry) { $this->db->trans_rollback(); $this->sys_error_db("Error insert jurnal tx {$item['PurchaseOrderNumber']} {$cekItem['M_ItemDesc']}"); exit; } $jurnalTxID = $this->db->insert_id(); $formatDebet = $this->formatRupiah($debet); $descJurnalDetail[] = "- Add detail Jurnal debet {$cekItem['M_ItemDesc']} {$faClass['Fa_ClassCoaDesc']} sejumlah {$formatDebet}"; $sqladdon = "INSERT INTO jurnal_addon ( jurnalAddOnJurnalID, jurnalAddOnJurnalTxID, jurnalAddOnCode, jurnalAddOnValue, jurnalAddOnCreated, jurnalAddOnCreatedUserID) VALUES(?,?,'PONUMB',?,NOW(),?) "; $qry = $this->db->query($sqladdon, [ $jurnalID, $jurnalTxID, $item['PurchaseOrderNumber'], $userID ]); if (!$qry) { $this->db->trans_rollback(); $this->sys_error_db("error insert jurnal addon {$item['PurchaseOrderNumber']} {$cekItem['M_ItemDesc']}", $this->db); exit; } // insert jurnal tx kredit diskon $diskon = intval($item['ReceiveOrderPoDetailQty']) * doubleval($item['DiscountPerItem']); $totalDiscountItem = $totalDiscountItem + $diskon; // calc discount prorata per item dari discount PO $PODiscount = intval($item['DiscPORupiah']); if (doubleval($item['DiscPOPercent']) != 0.00) { $PODiscount = doubleval($POTotalPrice) * doubleval($item['DiscPOPercent']) / 100; } $discProporsiPO = $PODiscount * (doubleval($item['TotalAllPO']) / doubleval($POTotalPrice)); $discPODiterima = round((intval($item['ReceiveOrderPoDetailQty']) / intval($item['QtyAllPO'])) * $discProporsiPO); $totalDiscountPO = $totalDiscountPO + $discPODiterima; $listdisc = [$diskon, $discPODiterima]; $sqlcoa = "SELECT * FROM coa WHERE coaAccountNo = '2190100001' LIMIT 1"; $quecoa = $this->db->query($sqlcoa, []); if (!$quecoa) { $this->db->trans_rollback(); $this->sys_error_db("[Error] get coa diskon pembelian"); exit; } $CoaDisc = $quecoa->result_array()[0]; foreach ($listdisc as $key => $value) { if (intval($value) != 0) { $quekdt = $this->db->query($sqljtx, [ $jurnalID, $CoaDisc['coaID'], $CoaDisc['coaDescription'], 0, $value, $userID ]); if (!$quekdt) { $this->db->trans_rollback(); $this->sys_error_db("[Error] insert jurnal tx diskon"); exit; } $jurTxID = $this->db->insert_id(); $queaddon = $this->db->query($sqladdon, [$jurnalID, $jurTxID, $item['PurchaseOrderNumber'], $userID]); if (!$queaddon) { $this->db->trans_rollback(); $this->sys_error_db("[Error] insert jurnal addon diskon"); exit; } } } // save diskon prorata $sqldispro = "UPDATE receive_order_po_detail SET ReceiveOrderPoDetailDiskonPoProrata = ? WHERE ReceiveOrderPoDetailID = ?"; $quedispro = $this->db->query($sqldispro, [$discPODiterima, $item['ReceiveOrderPoDetailID']]); if (!$quedispro) { $this->db->trans_rollback(); $this->sys_error_db("[Error] update detail diskon prorata"); exit; } } else if (intval($cekItem['M_ItemItem_CategoryID']) == 4) { // Aset // ? Belum tahu apakah Aset masuk ke PR PO RO, tetapi difasilitasi dulu saja seperti inventaris // Jasa (NonPersediaan) selalu memakai CoA akun Tampungan // TODO: Update dengan CoA yang Benar $coaJasa = $this->getCoaTampunganNonPersediaan(intval($cekItem['M_ItemItem_CategoryID'])); $debet = round(intval($item['ReceiveOrderPoDetailQty']) * doubleval($item['ReceiveOrderPoDetailPrice']), 2); $totalDebet = round($totalDebet + $debet, 2); // insert jurnal tx debet $sqljtx = "INSERT INTO jurnal_tx ( jurnalTxJurnalID, jurnalTxCoaID, jurnalTxDescription, jurnalTxDebit, jurnalTxCredit, jurnalTxM_UserID ) VALUES(?,?,?,?,?,?)"; $qryjtx = $this->db->query($sqljtx, array( $jurnalID, $coaJasa['coaID'], $coaJasa['coaDescription'], $debet, 0, $userID )); if (!$qryjtx) { $this->db->trans_rollback(); $this->sys_error_db("Error insert jurnal tx {$item['PurchaseOrderNumber']} {$cekItem['M_ItemDesc']}"); exit; } $jurnalTxID = $this->db->insert_id(); $formatDebet = $this->formatRupiah($debet); $descJurnalDetail[] = "- Add detail Jurnal debet {$cekItem['M_ItemDesc']} {$coaJasa['coaDescription']} sejumlah {$formatDebet}"; $sqladdon = "INSERT INTO jurnal_addon ( jurnalAddOnJurnalID, jurnalAddOnJurnalTxID, jurnalAddOnCode, jurnalAddOnValue, jurnalAddOnCreated, jurnalAddOnCreatedUserID ) VALUES (?,?,'PONUMB',?,NOW(),?)"; $qry = $this->db->query($sqladdon, [ $jurnalID, $jurnalTxID, $item['PurchaseOrderNumber'], $userID ]); if (!$qry) { $this->db->trans_rollback(); $this->sys_error_db("error insert jurnal addon {$item['PurchaseOrderNumber']} {$cekItem['M_ItemDesc']}", $this->db);; exit; } // insert jurnal tx kredit diskon $diskon = round(intval($item['ReceiveOrderPoDetailQty']) * doubleval($item['DiscountPerItem']), 2); $totalDiscountItem = round($totalDiscountItem + $diskon, 2); // calc discount prorata per item dari discount PO $PODiscount = intval($item['DiscPORupiah']); if (doubleval($item['DiscPOPercent']) != 0.00) { $PODiscount = doubleval($POTotalPrice) * doubleval($item['DiscPOPercent']) / 100; } $discProporsiPO = $PODiscount * (doubleval($item['TotalAllPO']) / doubleval($POTotalPrice)); $discPODiterima = round((intval($item['ReceiveOrderPoDetailQty']) / intval($item['QtyAllPO'])) * $discProporsiPO, 2); $totalDiscountPO = round($totalDiscountPO + $discPODiterima, 2); $listdisc = [$diskon, $discPODiterima]; $sqlcoa = "SELECT * FROM coa WHERE coaAccountNo = '2190100001' LIMIT 1"; $quecoa = $this->db->query($sqlcoa, []); if (!$quecoa) { $this->db->trans_rollback(); $this->sys_error_db("[Error] get coa diskon pembelian"); exit; } $CoaDisc = $quecoa->result_array()[0]; foreach ($listdisc as $key => $value) { if (intval($value) != 0) { $quekdt = $this->db->query($sqljtx, [ $jurnalID, $CoaDisc['coaID'], $CoaDisc['coaDescription'], 0, $value, $userID ]); if (!$quekdt) { $this->db->trans_rollback(); $this->sys_error_db("[Error] insert jurnal tx diskon RO: {$item['ReceiveOrderPoDetailID']}"); exit; } $jurTxID = $this->db->insert_id(); $queaddon = $this->db->query($sqladdon, [$jurnalID, $jurTxID, $item['PurchaseOrderNumber'], $userID]); if (!$queaddon) { $this->db->trans_rollback(); $this->sys_error_db("[Error] insert jurnal addon diskon"); exit; } } } // save diskon prorata $sqldispro = "UPDATE receive_order_po_detail SET ReceiveOrderPoDetailDiskonPoProrata = ? WHERE ReceiveOrderPoDetailID = ?"; $quedispro = $this->db->query($sqldispro, [$discPODiterima, $item['ReceiveOrderPoDetailID']]); if (!$quedispro) { $this->db->trans_rollback(); $this->sys_error_db("[Error] update detail diskon prorata"); exit; } } else { $this->db->trans_rollback(); $this->sys_error_db("Item {$cekItem['M_ItemDesc']} kategorinya belum tersedia untuk auto jurnal"); exit; } ## HANDLE STOCK ## // decode batchlist $jsonBatchlist = $item['ReceiveOrderPoDetailBatchList']; $batchlist = []; if (!empty($jsonBatchlist)) { $decode = json_decode($jsonBatchlist, true); if ($decode !== null && json_last_error() === JSON_ERROR_NONE) { $batchlist = $decode; } else { $this->sys_error_db("[Error] decode json for batches number"); exit; } } // update stock based on batch foreach ($batchlist as $key => $obj) { $sqlcheck = "SELECT * FROM stock WHERE StockItemID = ? AND StockItemUnitID = ? AND StockWarehouseID = ? AND StockBatchNo = ?"; $quecheck = $this->db->query($sqlcheck, [ $item['ReceiveOrderPoItemID'], $item['ReceiveOrderPoItemUnitID'], $dataRO['WarehouseID'], $obj['batchno'] ]); if (!$quecheck) { $this->db->trans_rollback(); $this->sys_error_db("[Error] check stock exist or not"); exit; } $stockexist = $quecheck->row_array(); $stockID = $stockexist['StockID']; $stockQtyOri = $stockexist['StockQty']; $stockQtyEnd = 0; if (!empty($stockexist)) { $currentStock = intval($stockexist['StockQty']); $currentPrice = doubleval($stockexist['StockItemPrice']); // calc new prive average $newStock = $currentStock + intval($obj['qty']); $allPrice = ($currentStock * $currentPrice) + (intval($obj['qty']) + doubleval($item['ReceiveOrderPoDetailPrice'])); $avgPrice = round($allPrice / $newStock, 2); $sqlstockupd = "UPDATE stock SET StockItemPrice = ?, StockQty = ?, StockBatchNo = ?, StockED = ?, StockLastUpdated = NOW(), StockUserID = ? WHERE StockItemID = ? AND StockWarehouseID = ? AND StockBatchNo = ? AND StockItemUnitID = ?"; $questockupd = $this->db->query($sqlstockupd, [ $avgPrice, $newStock, $obj['batchno'], $obj['expiredate'], $userID, $item['ReceiveOrderPoItemID'], $dataRO['WarehouseID'], $obj['batchno'], $item['ReceiveOrderPoItemUnitID'] ]); if (!$questockupd) { $this->db->trans_rollback(); $this->sys_error_db("Error insert update stock"); exit; } $stockQtyEnd = $newStock; } else { $sqlstockins = "INSERT INTO stock ( StockWarehouseAlmariID, StockWarehouseRackID, StockWarehouseID, StockStockNumber, StockBatchNo, StockItemID, StockItemUnitID, StockED, StockItemPrice, StockQty, StockLastUpdated, StockUserID ) VALUES (0,0,?, fn_numbering('SN'),?,?,?,?,?,?,NOW(),?)"; $questockins = $this->db->query($sqlstockins, [ $dataRO['WarehouseID'], $obj['batchno'], $item['ReceiveOrderPoItemID'], $item['ReceiveOrderPoItemUnitID'], $obj['expiredate'], $item['ReceiveOrderPoDetailPrice'], $obj['qty'], $userID ]); if (!$questockins) { $this->db->trans_rollback(); $this->sys_error_db("Error insert new stock"); exit; } $stockID = $this->db->insert_id(); $stockQtyOri = 0; $stockQtyEnd = $obj['qty']; } $sqlstockcard = "INSERT INTO stockcard ( StockCardWarehouseID, StockCardDatetime, StockCardItemID, StockCardItemUnitID, StockCardBatchNo, StockCardED, StockCardReffID, StockCardStatus, StockCardBefore, StockCardIn, StockCardOut, StockCardAfter, StockCardUserID ) VALUES (?, NOW(), ?, ?, ?, ?, ?, 'PRV', ?, ?, 0, ?, ?)"; $questockcard = $this->db->query($sqlstockcard, [ $dataRO['WarehouseID'], $item['ReceiveOrderPoItemID'], $item['ReceiveOrderPoItemUnitID'], $obj['batchno'], $obj['expiredate'], $stockID, $stockQtyOri, $obj['qty'], $stockQtyEnd, $userID ]); if (!$questockcard) { $this->db->trans_rollback(); $this->sys_error_db("Error insert stock card"); exit; } $sqlstock = "SELECT * FROM stock WHERE StockID = ?"; $questock = $this->db->query($sqlstock, [$stockID]); if (!$questock) { $this->db->trans_rollback(); $this->sys_error_db("[Error] get latest stock"); exit; } $stocklatest = $questock->row_array(); $sqlstocklog = "INSERT INTO stocklog ( StockLogWarehouseID, StockLogDateTime, StockLogItemID, StockLogItemUnitID, StockLogStockNumber, StockLogBatchNo, StockLogED, StockLogReffID, StockLogStatus, StockLogQty, StockLogUserID ) VALUES (?, NOW(), ?, ?, ?, ?, ?, ?, 'PRV', ?, ?)"; $questocklog = $this->db->query($sqlstocklog, [ $dataRO['WarehouseID'], $item['ReceiveOrderPoItemID'], $item['ReceiveOrderPoItemUnitID'], $stocklatest['StockStockNumber'], $stocklatest['StockBatchNo'], $stocklatest['StockED'], $stockID, $obj['qty'], $userID ]); if (!$questocklog) { $this->db->trans_rollback(); $this->sys_error_db("[Error] get latest stock"); exit; } } } // insert jurnal tx for shipping cost if any $shipCost = round($dataRO['ReceiveOrderShippingCostAmount'], 2); if ($dataRO['ReceiveOrderShippingCostIsPaid'] == 'N') { $sqlshp = "INSERT INTO jurnal_tx ( jurnalTxJurnalID, jurnalTxCoaID, jurnalTxDescription, jurnalTxDebit, jurnalTxCredit, jurnalTxM_UserID ) SELECT ?, coaID, coaDescription, ?, 0, ? FROM coa WHERE coaAccountNo = '5310700001' LIMIT 1"; $queshp = $this->db->query($sqlshp, [$jurnalID, $shipCost, $userID]); if (!$queshp) { $this->db->trans_rollback(); $this->sys_error_db("Error insert jurnal tx shipping cost"); exit; } } // insert jurnal tx for grni $totalGRNI = round($totalDebet - ($totalDiscountItem + $totalDiscountPO ), 2) + $shipCost; $sql = "INSERT INTO jurnal_tx ( jurnalTxJurnalID, jurnalTxCoaID, jurnalTxDescription, jurnalTxDebit, jurnalTxCredit, jurnalTxM_UserID) SELECT {$jurnalID}, coaID, coaDescription, 0, {$totalGRNI}, {$userID} FROM coa WHERE coaAccountNo = '2110100030' LIMIT 1"; $qry = $this->db->query($sql, array()); if (!$qry) { $this->db->trans_rollback(); $this->sys_error_db("Error insert jurnal tx GRNI"); exit; } $formatDebet = $this->formatRupiah($totalDebet); $sql = "INSERT INTO receive_order_po_shipping (ReceiveOrderPoShippingPurchaseOrderID, ReceiveOrderPoShippingReceiveOrderPoID, ReceiveOrderPoShippingAmount, ReceiveOrderPoShippingStatus, ReceiveOrderPoShippingIsActive, ReceiveOrderPoShippingCreatedUserID) SELECT PurchaseOrderID, {$id}, PurchaseOrderShippingCost, PurchaseOrderShippingCostStatus, 'Y', {$userID} FROM purchase_order WHERE PurchaseOrderID IN ( SELECT DISTINCT ReceiveOrderPoDetailPurchaseOrderID FROM receive_order_po JOIN receive_order_po_detail ON ReceiveOrderPoDetailReceiveOrderPoID = ReceiveOrderPoID WHERE ReceiveOrderPoID = {$id} ) AND PurchaseOrderShippingCost IS NOT NULL AND PurchaseOrderShippingCost > 0"; $qry = $this->db->query($sql, array()); if (!$qry) { $this->db->trans_rollback(); $this->sys_error_db("Error insert temporary shipping cost"); exit; } $descJurnalDetail[] = "- Add detail Jurnal Kredit GRNI sejumlah {$formatDebet}"; $jsonROAfter = $this->getDataReceiveOrderPO($id); $this->insertLogReceiveOrderPo( $id, 'CONFIRM', $jsonROBefore, $jsonROAfter, $userID, $desc . "\n" . $descJurnal . "\n" . implode("\n", $descJurnalDetail) ); $this->insertUserActivty( $id, 'CONFIRM', $userID, $desc . "\n" . $descJurnal . "\n" . implode("\n", $descJurnalDetail) ); $this->db->trans_commit(); $this->sys_ok("Berhasil konfirmasi terima barang "); } public function generateItemPo() { $this->db->trans_begin(); if (!$this->isLogin) { $this->sys_error("Invalid Token"); exit; } $prm = $this->sys_input; $userId = $this->sys_user["M_UserID"]; $POID = $prm["id"]; $regionalId = $prm["regionalId"]; if (!isset($prm['id'])) { $this->sys_error("Missing required parameters"); return; } $sql = "SELECT * FROM purchase_order LEFT JOIN warehouse ON PurchaseOrderWarehouseID = WarehouseID WHERE PurchaseOrderID = ?"; $qry = $this->db->query($sql, [$POID]); if (!$qry) { $this->db->trans_rollback(); $this->sys_error_db("get PO ", $this->db);; exit; } $dataPo = $qry->row_array(); if ($dataPo['PurchaseOrderStatus'] != 'Approved') { $this->sys_error("Status Po tidak approved"); return; } $dataDetail = []; if ($dataPo['PurchaseOrderWarehouseType'] == 'Single') { $sql = "SELECT IFNULL(p.PoItemReceiveID, 0) as receivedID, IFNULL(p.PoItemReceiveQtyReceived, 0) as qtyReceived, pos.PurchaseOrderSummaryID as orderSummaryID, pos.PurchaseOrderSummaryItemID as itemID, pos.PurchaseOrderSummaryItemUnitID as itemUnitID, pos.PurchaseOrderSummaryQty as qty, pos.PurchaseOrderSummaryPrice as price, m_itemDesc as itemName, ItemUnitName as itemUnitName, PurchaseOrderDetailID FROM purchase_order_summary pos JOIN purchase_order_detail ON PurchaseOrderDetailPurchaseOrderID = pos.PurchaseOrderSummaryPurchaseOrderID AND PurchaseOrderSummaryItemID = PurchaseOrderDetailItemID AND PurchaseOrderSummaryItemUnitID = PurchaseOrderDetailItemUnitID JOIN m_item ON pos.PurchaseOrderSummaryItemID = M_ItemID JOIN itemunit ON pos.PurchaseOrderSummaryItemUnitID = ItemUnitID LEFT JOIN po_item_receive p ON pos.PurchaseOrderSummaryPurchaseOrderID = p.PoItemReceivePurchaseOrderID AND pos.PurchaseOrderSummaryItemID = p.PoItemReceiveItemID WHERE pos.PurchaseOrderSummaryPurchaseOrderID = ? AND pos.PurchaseOrderSummaryIsActive = 'Y' AND IFNULL(p.PoItemReceiveQtyReceived, 0) = 0 "; $qry = $this->db->query($sql, [$POID]); if (!$qry) { $this->db->trans_rollback(); $this->sys_error_db("get item", $this->db);; exit; } $row = $qry->result_array(); $dataDetail = $row; foreach ($row as $key => $v) { if (intval($v['PoItemReceiveID']) == 0) { $sql = "INSERT INTO po_item_receive ( PoItemReceivePurchaseOrderID, PoItemReceivePurchaseOrderSummaryID, PoItemReceivePurchaseOrderDetailID, PoItemReceiveWarehouseID, PoItemReceiveItemID, PoItemReceiveItemUnitID, PoItemReceiveQty, PoItemReceiveQtyReceived, PoItemReceiveIsActive, PoItemReceiveCreated, PoItemReceiveCreatedUserID, PoItemReceivePrice ) VALUES( ?, ?, ?, ?, ?, ?, ?, 0, 'Y', NOW(), ?, ? )"; $qry = $this->db->query($sql, [ $POID, $v['orderSummaryID'], $v['PurchaseOrderDetailID'], $dataPo['PurchaseOrderWarehouseID'], $v['itemID'], $v['itemUnitID'], $v['qty'], $userId, $v['price'] ]); if (!$qry) { $this->db->trans_rollback(); $this->sys_error_db("insert item", $this->db);; exit; } $desc = "ADD {$v['itemName']} {$v['qty']} {$v['itemUnitName']} {$dataPo['WarehouseName']}"; $insertedID = $this->db->insert_id(); $jsonAfter = $this->getDataPoItemReceive($insertedID); $this->insertLogPoItemReceive($insertedID, 'ADD', 0, '', $jsonAfter, $userId, $desc); } if (intval($v['PoItemReceiveID']) != 0) { //boleh update $jsonBefore = $this->getDataPoItemReceive($v['PoItemReceiveID']); $sql = "UPDATE po_item_receive SET PoItemReceiveQty = ?, PoItemReceiveIsActive = 'Y', PoItemReceiveUpdate = NOW(), PoItemReceiveUpdatedUserID = ?, PoItemReceiveWarehouseID = ?, PoItemReceiveItemUnitID = ?, PoItemReceivePrice = ? WHERE PoItemReceiveID = ? "; $qry = $this->db->query($sql, [ $v['qty'], $userId, $dataPo['PurchaseOrderWarehouseID'], $v['itemUnitID'], $v['price'], $v['receivedID'] ]); if (!$qry) { $this->db->trans_rollback(); $this->sys_error_db("update item ", $this->db);; exit; } $desc = []; if ($jsonBefore['WarehouseID'] != $jsonBefore['WarehouseID']) { $desc[] = "- UPDATE {$v['itemName']} berubah warehouse dari {$jsonBefore['WarehouseName']} menjadi {$jsonAfter['WarehouseName']}"; } if ($jsonBefore['PoItemReceiveItemUnitID'] != $jsonBefore['PoItemReceiveItemUnitID']) { $desc[] = "- UPDATE {$v['itemName']} berubah unit item dari {$jsonBefore['ItemUnitName']} menjadi {$jsonAfter['ItemUnitName']}"; } if ($jsonBefore['PoItemReceiveQty'] != $jsonBefore['PoItemReceiveQty']) { $desc[] = "- UPDATE {$v['itemName']} berubah jumlah dari {$jsonBefore['PoItemReceiveQty']} menjadi {$jsonAfter['PoItemReceiveQty']}"; } if ($jsonBefore['PoItemReceivePrice'] != $jsonBefore['PoItemReceivePrice']) { $desc[] = "- UPDATE {$v['itemName']} berubah harga dari {$jsonBefore['PoItemReceivePrice']} menjadi {$jsonAfter['PoItemReceivePrice']}"; } $insertedID = $this->db->insert_id(); $jsonAfter = $this->getDataPoItemReceive($v['PoItemReceiveID']); $this->insertLogPoItemReceive( $v['PoItemReceiveID'], 'UPDATE', 0, $jsonBefore, $jsonAfter, $userId, implode("\n", $desc) ); } } } if ($dataPo['PurchaseOrderWarehouseType'] == 'Multiple') { $sql = "SELECT IFNULL(PoItemReceiveID, 0) as cekID, IFNULL(PoItemReceiveQtyReceived, 0) as qtyCek, pod.PurchaseOrderDetailPurchaseSummaryID as summaryID, pod.PurchaseOrderDetailID as poDetailID, pod.PurchaseOrderDetailWarehouseID as warehouseID, WarehouseName, pod.PurchaseOrderDetailItemID as itemID, M_ItemDesc as itemName, pos.PurchaseOrderSummaryItemUnitID as itemUnitID, ItemUnitName as itemUnitName, ConvertQuantityToPurchasedItemUnit(pod.PurchaseOrderDetailItemID, pod.PurchaseOrderDetailItemUnitID, pod.PurchaseOrderDetailQty) as poQty, pos.PurchaseOrderSummaryPrice as price FROM purchase_order_detail pod JOIN purchase_order_summary pos ON pod.PurchaseOrderDetailPurchaseSummaryID = pos.PurchaseOrderSummaryID JOIN m_item ON pod.PurchaseOrderDetailItemID = M_ItemID JOIN itemunit ON pos.PurchaseOrderSummaryItemUnitID = ItemUnitID JOIN warehouse ON pod.PurchaseOrderDetailWarehouseID = WarehouseID LEFT JOIN po_item_receive p ON p.PoItemReceiveItemID = pod.PurchaseOrderDetailItemID AND p.PoItemReceivePurchaseOrderID = ? AND p.PoItemReceivePurchaseOrderSummaryID = pos.PurchaseOrderSummaryID AND p.PoItemReceivePurchaseOrderDetailID = pod.PurchaseOrderDetailID WHERE pod.PurchaseOrderDetailPurchaseOrderID = ? AND IFNULL(PoItemReceiveQtyReceived, 0) = 0 AND pod.PurchaseOrderDetailIsActive = 'Y'"; $qry = $this->db->query($sql, [$POID, $POID]); if (!$qry) { $this->db->trans_rollback(); $this->sys_error_db("get item ", $this->db);; exit; } $mRow = $qry->result_array(); $dataDetail = $mRow; foreach ($mRow as $key => $v) { if (intval($v['cekID']) == 0) { $sql = "INSERT INTO po_item_receive ( PoItemReceivePurchaseOrderID, PoItemReceivePurchaseOrderSummaryID, PoItemReceivePurchaseOrderDetailID, PoItemReceiveWarehouseID, PoItemReceiveItemID, PoItemReceiveItemUnitID, PoItemReceiveQty, PoItemReceiveQtyReceived, PoItemReceiveIsActive, PoItemReceiveCreated, PoItemReceiveCreatedUserID, PoItemReceivePrice ) VALUES( ?, ?, ?, ?, ?, ?, ?, 0, 'Y', NOW(), ?, ? );"; $qry = $this->db->query($sql, [ $POID, $v['summaryID'], $v['poDetailID'], $v['warehouseID'], $v['itemID'], $v['itemUnitID'], $v['poQty'], $userId, $v['price'] ]); if (!$qry) { $this->db->trans_rollback(); $this->sys_error_db("insert item", $this->db);; exit; } $desc = "ADD {$v['itemName']} {$v['poQty']} {$v['itemUnitName']} {$v['WarehouseName']}"; $insertedID = $this->db->insert_id(); $jsonAfter = $this->getDataPoItemReceive($insertedID); $this->insertLogPoItemReceive($insertedID, 'ADD', 0, '', $jsonAfter, $userId, $desc); } if (intval($v['cekID']) != 0) { //update $jsonBefore = $this->getDataPoItemReceive($v['cekID']); $sql = "UPDATE po_item_receive p SET PoItemReceiveQty = ?, PoItemReceiveIsActive = 'Y', PoItemReceiveUpdate = NOW(), PoItemReceiveUpdatedUserID = ?, PoItemReceiveWarehouseID = ?, PoItemReceiveItemUnitID = ?, PoItemReceivePrice = ? WHERE PoItemReceiveID = ?"; $qry = $this->db->query($sql, [ $v['poQty'], $userId, $v['warehouseID'], $v['itemUnitID'], $v['price'], $v['cekID'] ]); if (!$qry) { $this->db->trans_rollback(); $this->sys_error_db("update item ", $this->db);; exit; } $desc = []; if ($jsonBefore['WarehouseID'] != $jsonBefore['WarehouseID']) { $desc[] = "- UPDATE {$v['itemName']} berubah warehouse dari {$jsonBefore['WarehouseName']} menjadi {$jsonAfter['WarehouseName']}"; } if ($jsonBefore['PoItemReceiveItemUnitID'] != $jsonBefore['PoItemReceiveItemUnitID']) { $desc[] = "- UPDATE {$v['itemName']} berubah unit item dari {$jsonBefore['ItemUnitName']} menjadi {$jsonAfter['ItemUnitName']}"; } if ($jsonBefore['PoItemReceiveQty'] != $jsonBefore['PoItemReceiveQty']) { $desc[] = "- UPDATE {$v['itemName']} berubah jumlah dari {$jsonBefore['PoItemReceiveQty']} menjadi {$jsonAfter['PoItemReceiveQty']}"; } if ($jsonBefore['PoItemReceivePrice'] != $jsonBefore['PoItemReceivePrice']) { $desc[] = "- UPDATE {$v['itemName']} berubah harga dari {$jsonBefore['PoItemReceivePrice']} menjadi {$jsonAfter['PoItemReceivePrice']}"; } $insertedID = $this->db->insert_id(); $jsonAfter = $this->getDataPoItemReceive($v['cekID']); $this->insertLogPoItemReceive( $v['cekID'], 'UPDATE', 0, $jsonBefore, $jsonAfter, $userId, implode("\n", $desc) ); } } } $this->db->trans_commit(); $this->sys_ok([ 'header' => $dataPo, 'detail' => $dataDetail, ]); } public function getDataReceiveOrderPO($id) { $sql = "SELECT * FROM receive_order_po WHERE ReceiveOrderPoID = ?"; $qry = $this->db->query($sql, [$id]); if (!$qry) { $this->db->trans_rollback(); $this->sys_error_db("Error getDataReceiveOrderPO ", $this->db);; exit; } $header = $qry->row_array(); $sql = "SELECT * FROM receive_order_po_detail WHERE ReceiveOrderPoDetailReceiveOrderPoID = ? AND ReceiveOrderPoDetailIsActive"; $qry = $this->db->query($sql, [$id]); if (!$qry) { $this->db->trans_rollback(); $this->sys_error_db("Error getDataReceiveOrderPO detail", $this->db);; exit; } $detail = $qry->row_array(); $header['details'] = $detail; return $header; } public function getDataPoItemReceive($id) { $sql = "SELECT * FROM po_item_receive JOIN warehouse ON PoItemReceiveWarehouseID= WarehouseID JOIN itemunit ON PoItemReceiveItemUnitID = ItemUnitID WHERE PoItemReceiveID = ?"; $qry = $this->db->query($sql, [$id]); if (!$qry) { $this->db->trans_rollback(); $this->sys_error_db("Error getDataPoItemReceive ", $this->db);; exit; } return $qry->row_array(); } function insertLogReceiveOrderPo($id, $type, $dataBefore, $dataAfter, $userID, $desc = '') { // Query untuk menyisipkan log ke dalam tabel purchase_order_log $sql = "INSERT INTO acc_one_log.receive_order_po_log ( ReceiveOrderPoLogReceiveOrderPoID, ReceiveOrderPoLogType, ReceiveOrderPoLogDesc, ReceiveOrderPoLogJsonBefore, ReceiveOrderPoLogJsonAfter, ReceiveOrderPoLogUserID, ReceiveOrderPoLogCreated ) VALUES ( ?, ?, ?, ?, ?, ?, NOW() )"; // Eksekusi query dengan parameter yang diberikan $exec = $this->db->query($sql, [ $id, $type, $desc, $dataBefore != '' ? json_encode($dataBefore) : '', $dataAfter != '' ? json_encode($dataAfter) : "", $userID ]); // Jika query gagal, lempar error if (!$exec) { $this->sys_error_db("Error inserting log into insert LogReceiveOrderPo", $this->db); $this->db->trans_rollback(); exit; } } function insertLogPoItemReceive($id, $type, $roID, $dataBefore, $dataAfter, $userID, $desc = '') { // Query untuk menyisipkan log ke dalam tabel purchase_order_log $sql = "INSERT INTO acc_one_log.po_item_receive_log ( PoItemReceiveLogPoItemReceiveID, PoItemReceiveLogReceiveOrderPoID, PoItemReceiveLogType, PoItemReceiveLogDesc, PoItemReceiveLogJsonBefore, PoItemReceiveLogJsonAfter, PoItemReceiveLogUserID, PoItemReceiveLogCreated ) VALUES ( ?, ?, ?, ?, ?, ?, ?, NOW() )"; // Eksekusi query dengan parameter yang diberikan $exec = $this->db->query($sql, [ $id, $roID, $type, $desc, $dataBefore != '' ? json_encode($dataBefore) : '', $dataAfter != '' ? json_encode($dataAfter) : "", $userID ]); // Jika query gagal, lempar error if (!$exec) { $this->sys_error_db("Error inserting log into po_item_receive_log", $this->db); $this->db->trans_rollback(); exit; } } function insertUserActivty($id, $type, $userID, $desc = '') { // Query untuk menyisipkan log ke dalam tabel purchase_order_log $sql = "INSERT INTO user_activity ( UserActivityCode, UserActivityStatus, UserActivityDescription, UserActivityRefID, UserActivityUserID, UserActivityCreated ) VALUES ( ?, ?, ?, ?, ?, NOW() )"; // Eksekusi query dengan parameter yang diberikan $exec = $this->db->query($sql, [ 'RO', $type, $desc, $id, $userID ]); // Jika query gagal, lempar error if (!$exec) { $this->sys_error_db("Error inserting user activity", $this->db); $this->db->trans_rollback(); exit; } } }