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"];; $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 WHERE WarehouseS_RegionalID = ? AND PurchaseOrderStatus = 'Approved' AND PurchaseOrderNumber LIKE ? GROUP BY PurchaseOrderID LIMIT 50"; $qry = $this->db->query($sql, [$regionalID, $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"]; $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, 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 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]); 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, PoItemReceiveQty as originalQty, PoItemReceiveQtyReceived as receivedQty, 0 as qty, ReceiveOrderPoDetailQty as tmpQty, PoItemReceiveQty - PoItemReceiveQtyReceived AS qtyRest, ReceiveOrderPoDetailQty, PoItemReceivePrice, 'Y' as alreadySave, ReceiveOrderPoDetailBatchNo batchNo, ReceiveOrderPoDetailEd itemEd 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(); $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"]; $sql = "INSERT INTO `receive_order_po` ( `ReceiveOrderPoNumber`, `ReceiveOrderPoSupplierID`, `ReceiveOrderPoIDate`, `ReceiveOrderPoWarehouseID`, `ReceiveOrderPoM_BranchCode`, `ReceiveOrderPoS_RegionalID`, `ReceiveOrderShippingCostAmount`, `ReceiveOrderPoNote`, `ReceiveOrderPoRefNumber`, `ReceiveOrderPoCreatedUserID` ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ? );"; $qry = $this->db->query($sql, [ $numbering, $prm['selectedSupplier']['SupplierID'], $prm['date'], $prm['selectedWarehouse']['WarehouseID'], $user['M_BranchCode'], $user['S_RegionalID'], $prm['shippingCost'], $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; } $sql = "INSERT INTO `receive_order_po_detail` ( `ReceiveOrderPoDetailReceiveOrderPoID`, `ReceiveOrderPoDetailPurchaseOrderID`, `ReceiveOrderPoDetailPurchaseOrderSummaryID`, `ReceiveOrderPoDetailPurchaseOrderDetailID`, `ReceiveOrderPoDetailPoItemReceiveID`, `ReceiveOrderPoDetailQty`, `ReceiveOrderPoDetailPrice`, `ReceiveOrderPoDetailTotal`, `ReceiveOrderPoDetailCreatedUserID`, `ReceiveOrderPoItemID`, `ReceiveOrderPoItemUnitID`, ReceiveOrderPoDetailBatchNo, ReceiveOrderPoDetailEd ) 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'], $item['batchNo'], $item['itemEd'], ]); 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}"); } 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 3 angka desimal $angka = round($angka, 3); // Cek apakah angka desimalnya nol if (fmod($angka, 1) == 0.0) { // Tanpa desimal $formatted = number_format($angka, 0, ',', '.'); } else { // Dengan 3 angka desimal $formatted = number_format($angka, 3, ',', '.'); } 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']); $sql = "UPDATE receive_order_po_detail SET ReceiveOrderPoDetailQty = ?, ReceiveOrderPoDetailTotal = ReceiveOrderPoDetailPrice * {$detail['qty']}, ReceiveOrderPoDetailLastUpdatedUserID = ?, ReceiveOrderPoDetailLastUpdated = NOW() , ReceiveOrderPoDetailBatchNo = ?, ReceiveOrderPoDetailEd = ? WHERE ReceiveOrderPoDetailID = ?; "; $qry = $this->db->query($sql, [ $detail['qty'], $userId, $detail['batchNo'], $detail['itemEd'], $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['qty'])), $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 = {$user['M_BranchCode']}"; } $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"; $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} 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"); } public function confirmRo() { // $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"]; $id = $prm['id']; $jsonROBefore = $this->getDataReceiveOrderPO($id); $sql = "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 = ?"; $qry = $this->db->query($sql, [$id]); if (!$qry) { $this->db->trans_rollback(); $this->sys_error_db("get PO ", $this->db);; exit; } $dataRo = $qry->row_array(); if ($dataRo['ReceiveOrderPoConfirmed'] == 'Y') { $this->db->trans_rollback(); $this->sys_error("Penerimaan barang {$dataRo['ReceiveOrderPoNumber']} sudah pernah dikonfirmasi"); exit; } $tabelNameJurnal = "jurnal"; $tabelNameJurnaltx = "jurnal_tx"; $tabelNameJurnalAddon = "jurnal_addon"; // if (doubleval($dataRo['ReceiveOrderOtherExpensesAmount']) > 0) { // $tabelNameJurnal = "jurnalTmp"; // $tabelNameJurnaltx = "jurnal_txTmp"; // $tabelNameJurnalAddon = "jurnal_addonTmp"; // # code... // } $sql = "SELECT receive_order_po_detail.*, PurchaseOrderID, PurchaseOrderNumber FROM receive_order_po_detail JOIN purchase_order ON ReceiveOrderPoDetailPurchaseOrderID = PurchaseOrderID WHERE ReceiveOrderPoDetailReceiveOrderPoID = ? AND ReceiveOrderPoDetailIsActive='Y'"; $qry = $this->db->query($sql, [$id]); if (!$qry) { $this->db->trans_rollback(); $this->sys_error_db("get ro detail ", $this->db);; exit; } $detailRo = $qry->result_array(); $sql = "SELECT GROUP_CONCAT(DISTINCT PurchaseOrdernumber SEPARATOR ', ') as ponumber FROM receive_order_po_detail JOIN purchase_order ON ReceiveOrderPoDetailPurchaseOrderID = PurchaseOrderID WHERE ReceiveOrderPoDetailReceiveOrderPoID = ? AND ReceiveOrderPoDetailIsActive='Y'"; $qry = $this->db->query($sql, [$id]); if (!$qry) { $this->db->trans_rollback(); $this->sys_error_db("get ro detail ", $this->db);; exit; } $strPoNumber = $qry->row_array()['ponumber']; $desc = "Konfirmasi penerimaan barang {$dataRo['ReceiveOrderPoNumber']} yang meliputi beberapa item dari PO {$strPoNumber}"; $sql = "SELECT `fn_numbering`('J') AS numbering"; $qry = $this->db->query($sql, []); if (!$qry) { $this->sys_error_db("get numbering error", $this->db); $this->db->trans_rollback(); exit; } $numbering = $qry->row_array()["numbering"]; $sql = "SELECT periodeID FROM periode WHERE NOW() BETWEEN periodeStartDate AND periodeEndDate AND periodeIsActive= 'Y' AND periodeIsClosed = 'N'"; $qry = $this->db->query($sql, []); //pakai confirm datenya if (!$qry) { $this->sys_error_db("get periode error", $this->db); $this->db->trans_rollback(); exit; } $dataPeriode = $qry->row_array(); if (empty($dataPeriode)) { $this->sys_error("Periode untuk generate jurnal tidak ditemukan"); $this->db->trans_rollback(); exit; } $periodeID = $dataPeriode["periodeID"]; $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 = []; $sql = "INSERT INTO {$tabelNameJurnal} (jurnalM_BranchCompanyID, JurnalS_RegionalID, jurnalM_BranchCode, jurnalperiodeID, jurnalNo, jurnalTitle, jurnalDescription, jurnalDate, jurnalJurnalTypeID, jurnalM_UserID) VALUES(?,?,?,?,?,?,?,NOW(),?,?) "; $qry = $this->db->query($sql, [ $user['M_BranchCompanyID'], $user['S_RegionalID'], $user['M_BranchCode'], $periodeID, $numbering, $jurnalTitle, $jurnalDesc, 2, $userId ]); if (!$qry) { $this->db->trans_rollback(); $this->sys_error_db("Error insert jurnal ", $this->db);; exit; } $jurnalID = $this->db->insert_id(); $sql = "INSERT INTO {$tabelNameJurnalAddon} ( jurnalAddOnJurnalID, jurnalAddOnCode, jurnalAddOnValue, jurnalAddOnCreated, jurnalAddOnCreatedUserID) VALUES(?,'RONUMB',?,NOW(),?) "; $qry = $this->db->query($sql, [ $jurnalID, $dataRo['ReceiveOrderPoNumber'], $userId ]); if (!$qry) { $this->db->trans_rollback(); $this->sys_error_db("error insert jurnal addon ", $this->db);; exit; } $sql = "UPDATE `receive_order_po` SET ReceiveOrderPoConfirmed = 'Y', ReceiveOrderPoConfirmedDate = NOW(), ReceiveOrderPoConfirmedUserID = ? WHERE ReceiveOrderPoID = ?;"; $qry = $this->db->query($sql, [ $userId, $id ]); if (!$qry) { $this->sys_error_db("Error confirm receive oder", $this->db); $this->db->trans_rollback(); exit; } $totalDebet = 0; foreach ($detailRo as $key => $item) { $sql = "SELECT * FROM m_item WHERE M_ItemID = ?"; $qry = $this->db->query($sql, [ $item['ReceiveOrderPoItemID'], ]); if (!$qry) { $this->db->trans_rollback(); $this->sys_error_db("error cek item ", $this->db);; exit; } $cekItem = $qry->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 ( $cekItem['M_ItemItem_CategoryID'] == null || $cekItem['M_ItemItem_CategoryID'] == 0 || $cekItem['M_ItemItem_CategoryID'] == '' ) { $this->db->trans_rollback(); $this->sys_error_db("Item {$item['PurchaseOrderNumber']} {$cekItem['M_ItemDesc']} belum memiliki kategori ", $this->db); exit; } //persediaan if (intval($cekItem['M_ItemItem_CategoryID']) == 1) { if ( $cekItem['M_ItemNat_SubGroupID'] == null || $cekItem['M_ItemNat_SubGroupID'] == 0 || $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; } $sql = "SELECT * FROM map_nat_subgroup WHERE MapNatSub_NatGroupID = ? AND MapNatSub_NatSubGroupID = ? AND MapNatSub_IsActive = 'Y'"; $qry = $this->db->query($sql, [ $cekItem['M_ItemNat_GroupID'], $cekItem['M_ItemNat_SubGroupID'], ]); if (!$qry) { $this->db->trans_rollback(); $this->sys_error_db("error get map_nat_subgroup ", $this->db);; exit; } $mapNatSubGroup = $qry->row_array(); if ( $mapNatSubGroup['MapNatSub_PersediaanCoaID'] == null || $mapNatSubGroup['MapNatSub_PersediaanCoaID'] == '' || $mapNatSubGroup['MapNatSub_PersediaanCoaAccountNo'] == null || $mapNatSubGroup['MapNatSub_PersediaanCoaAccountNo'] == '' || $mapNatSubGroup['MapNatSub_PersediaanCoaDescription'] == null || $mapNatSubGroup['MapNatSub_PersediaanCoaDescription'] == '' ) { $this->db->trans_rollback(); $this->sys_error_db("Coa item {$item['PurchaseOrderNumber']} {$cekItem['M_ItemDesc']} belum termapping", $this->db);; exit; } $debet = intval($item['ReceiveOrderPoDetailQty']) * doubleval($item['ReceiveOrderPoDetailPrice']); $totalDebet = $totalDebet + $debet; $sql = "INSERT INTO {$tabelNameJurnaltx}( jurnalTxJurnalID, jurnalTxCoaID, jurnalTxDescription, jurnalTxDebit, jurnalTxCredit, jurnalTxM_UserID) VALUES(?,?,?,?,?,?)"; $qry = $this->db->query($sql, array( $jurnalID, $mapNatSubGroup['MapNatSub_PersediaanCoaID'], $mapNatSubGroup['MapNatSub_PersediaanCoaDescription'], $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']} {$mapNatSubGroup['MapNatSub_PersediaanCoaDescription']} sejumlah {$formatDebet}"; $sql = "INSERT INTO {$tabelNameJurnalAddon}( jurnalAddOnJurnalID, jurnalAddOnJurnalTxID, jurnalAddOnCode, jurnalAddOnValue, jurnalAddOnCreated, jurnalAddOnCreatedUserID) VALUES(?,?,'PONUMB',?,NOW(),?) "; $qry = $this->db->query($sql, [ $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; } } else if (intval($cekItem['M_ItemItem_CategoryID']) == 2) { //Inventaris $this->db->trans_rollback(); $this->sys_error_db("Item {$cekItem['M_ItemDesc']} memiliki kategori inventaris belum tersedia untuk auto jurnal"); exit; } else if (intval($cekItem['M_ItemItem_CategoryID']) == 3) { //Aset if ( $cekItem['M_ItemFa_ClassID'] == null || $cekItem['M_ItemFa_ClassID'] == 0 || $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_calss 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; $sql = "INSERT INTO {$tabelNameJurnaltx}( jurnalTxJurnalID, jurnalTxCoaID, jurnalTxDescription, jurnalTxDebit, jurnalTxCredit, jurnalTxM_UserID) VALUES(?,?,?,?,?,?)"; $qry = $this->db->query($sql, 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}"; $sql = "INSERT INTO {$tabelNameJurnalAddon}( jurnalAddOnJurnalID, jurnalAddOnJurnalTxID, jurnalAddOnCode, jurnalAddOnValue, jurnalAddOnCreated, jurnalAddOnCreatedUserID) VALUES(?,?,'PONUMB',?,NOW(),?) "; $qry = $this->db->query($sql, [ $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; } } // handle stock $sql = "INSERT INTO stock ( StockWarehouseAlmariID, StockWarehouseRackID, StockWarehouseID, StockStockNumber, StockBatchNo, StockItemID, StockItemUnitID, StockED, StockItemPrice, StockQty, StockLastUpdated, StockUserID ) VALUES ( 0, 0, ?, fn_numbering('SN'), ?, ?, ?, ?, ?, ?, NOW(), ? ) ON DUPLICATE KEY UPDATE StockItemPrice = VALUES(StockItemPrice), StockQty = StockQty + VALUES(StockQty), StockLastUpdated = NOW(), StockUserID = VALUES(StockUserID);"; $qry = $this->db->query($sql, array( $dataRo['WarehouseID'], $item['ReceiveOrderPoDetailBatchNo'], $item['ReceiveOrderPoItemID'], $item['ReceiveOrderPoItemUnitID'], $item['ReceiveOrderPoDetailEd'], $item['ReceiveOrderPoDetailPrice'], $item['ReceiveOrderPoDetailQty'], $userId )); if (!$qry) { $this->db->trans_rollback(); $this->sys_error_db("Error insert update or insert stock"); exit; } $sql = "SELECT * FROM stock WHERE StockWarehouseID = ? AND StockWarehouseAlmariID = 0 AND StockWarehouseRackID = 0 AND StockBatchNo = ? AND StockItemID = ? AND StockItemUnitID = ? AND StockED = ? "; $qry = $this->db->query($sql, array( $dataRo['WarehouseID'], $item['ReceiveOrderPoDetailBatchNo'], $item['ReceiveOrderPoItemID'], $item['ReceiveOrderPoItemUnitID'], $item['ReceiveOrderPoDetailEd'], )); if (!$qry) { $this->db->trans_rollback(); $this->sys_error_db("Error get stock stock"); exit; } $stock = $qry->row_array(); $sql = "INSERT INTO stockcard ( StockCardWarehouseID, StockCardDatetime, StockCardItemID, StockCardItemUnitID, StockCardBatchNo, StockCardED, StockCardReffID, StockCardStatus, StockCardBefore, StockCardIn, StockCardOut, StockCardAfter, StockCardUserID ) VALUES ( ?, NOW(), ?, ?, ?, ?, ?, 'PRV', ?, ?, 0, ?, ? );"; $qry = $this->db->query($sql, array( $dataRo['WarehouseID'], $item['ReceiveOrderPoItemID'], $item['ReceiveOrderPoItemUnitID'], $item['ReceiveOrderPoDetailBatchNo'], $item['ReceiveOrderPoDetailEd'], $stock['StockID'], (intval($stock['StockQty']) - intval($item['ReceiveOrderPoDetailQty'])) < 0 ? 0 : (intval($stock['StockQty']) - intval($item['ReceiveOrderPoDetailQty'])), intval($item['ReceiveOrderPoDetailQty']), intval($stock['StockQty']), $userId )); if (!$qry) { $this->db->trans_rollback(); $this->sys_error_db("Error insert stock card"); exit; } $sql = "INSERT INTO stocklog ( StockLogWarehouseID, StockLogDateTime, StockLogItemID, StockLogItemUnitID, StockLogStockNumber, StockLogBatchNo, StockLogED, StockLogReffID, StockLogStatus, StockLogQty, StockLogUserID ) VALUES ( ?, NOW(), ?, ?, ?, ?, ?, ?, 'PRV', ?, ? );"; $qry = $this->db->query($sql, array( $dataRo['WarehouseID'], $item['ReceiveOrderPoItemID'], $item['ReceiveOrderPoItemUnitID'], $stock['StockStockNumber'], $item['ReceiveOrderPoDetailBatchNo'], $item['ReceiveOrderPoDetailEd'], $stock['StockID'], $item['ReceiveOrderPoDetailQty'], $userId )); if (!$qry) { $this->db->trans_rollback(); $this->sys_error_db("Error insert stock log"); exit; } } $sql = "INSERT INTO {$tabelNameJurnaltx}( jurnalTxJurnalID, jurnalTxCoaID, jurnalTxDescription, jurnalTxDebit, jurnalTxCredit, jurnalTxM_UserID) SELECT {$jurnalID}, coaID, coaDescription, 0, {$totalDebet}, {$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_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"]; $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(); // print_r($dataPo); 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) qtyReceived, pos.PurchaseOrderSummaryID orderSummaryID, pos.PurchaseOrderSummaryItemID itemID, pos.PurchaseOrderSummaryItemUnitID itemUnitID, pos.PurchaseOrderSummaryQty qty, pos.PurchaseOrderSummaryPrice price m_itemDesc itemName, ItemUnitName itemUnitName FROM purchase_order_summary pos 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) { //insert $sql = "INSERT INTO po_item_receive ( PoItemReceivePurchaseOrderID, PoItemReceivePurchaseOrderSummaryID, PoItemReceivePurchaseOrderDetailID, PoItemReceiveWarehouseID, PoItemReceiveItemID, PoItemReceiveItemUnitID, PoItemReceiveQty, PoItemReceiveQtyReceived, PoItemReceiveIsActive, PoItemReceiveCreated, PoItemReceiveCreatedUserID, PoItemReceivePrice ) VALUES( ?, ?, NULL, ?, ?, ?, ?, 0, 'Y', NOW(), ?, ? )"; $qry = $this->db->query($sql, [ $POID, $v['orderSummaryID'], $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 summaryID, pod.PurchaseOrderDetailID poDetailID, pod.PurchaseOrderDetailWarehouseID warehouseID, WarehouseName, pod.PurchaseOrderDetailItemID itemID, M_ItemDesc itemName, pos.PurchaseOrderSummaryItemUnitID itemUnitID, ItemUnitName itemUnitName, ConvertQuantityToPurchasedItemUnit(pod.PurchaseOrderDetailItemID, pod.PurchaseOrderDetailItemUnitID, pod.PurchaseOrderDetailQty) poQty, pos.PurchaseOrderSummaryPrice 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) { //insert $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; } } public function generateItemPoOld() { 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 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(); // print_r($dataPo); if ($dataPo['PurchaseOrderStatus'] != 'Approved') { $this->sys_error("Status Po tidak approved"); return; } if ($dataPo['PurchaseOrderWarehouseType'] == 'Single') { $sql = "UPDATE po_item_receive p JOIN purchase_order_summary pos ON p.PoItemReceivePurchaseOrderSummaryID = pos.PurchaseOrderSummaryID SET p.PoItemReceiveQty = pos.PurchaseOrderSummaryQty, p.PoItemReceiveIsActive = 'Y', p.PoItemReceiveUpdate = NOW(), p.PoItemReceiveUpdatedUserID = ?, p.PoItemReceiveWarehouseID = ?, p.PoItemReceiveItemUnitID = pos.PurchaseOrderSummaryItemUnitID, p.PoItemReceivePrice = pos.PurchaseOrderSummaryPrice WHERE p.PoItemReceivePurchaseOrderID = ? AND p.PoItemReceiveItemID = pos.PurchaseOrderSummaryItemID AND p.PoItemReceiveQtyReceived = 0"; $qry = $this->db->query($sql, [$userId, $dataPo['PurchaseOrderWarehouseID'], $POID]); if (!$qry) { $this->db->trans_rollback(); $this->sys_error_db("update item ", $this->db);; exit; } $sql = "INSERT INTO po_item_receive ( PoItemReceivePurchaseOrderID, PoItemReceivePurchaseOrderSummaryID, PoItemReceivePurchaseOrderDetailID, PoItemReceiveWarehouseID, PoItemReceiveItemID, PoItemReceiveItemUnitID, PoItemReceiveQty, PoItemReceiveQtyReceived, PoItemReceiveIsActive, PoItemReceiveCreated, PoItemReceiveCreatedUserID, PoItemReceivePrice ) SELECT {$POID}, pos.PurchaseOrderSummaryID, NULL, -- Tidak ada detail, karena diambil dari summary {$dataPo['PurchaseOrderWarehouseID']}, pos.PurchaseOrderSummaryItemID, pos.PurchaseOrderSummaryItemUnitID, pos.PurchaseOrderSummaryQty, 0, -- Awalnya belum diterima 'Y', NOW(), {$userId}, pos.PurchaseOrderSummaryPrice FROM purchase_order_summary pos WHERE pos.PurchaseOrderSummaryPurchaseOrderID = {$POID} AND pos.PurchaseOrderSummaryIsActive = 'Y' AND NOT EXISTS ( SELECT 1 FROM po_item_receive p WHERE p.PoItemReceivePurchaseOrderID = {$POID} AND p.PoItemReceiveItemID = pos.PurchaseOrderSummaryItemID )"; $qry = $this->db->query($sql, []); if (!$qry) { $this->db->trans_rollback(); $this->sys_error_db("insert item", $this->db);; exit; } } if ($dataPo['PurchaseOrderWarehouseType'] == 'Multiple') { $sql = "UPDATE po_item_receive p JOIN purchase_order_detail pod ON p.PoItemReceivePurchaseOrderDetailID = pod.PurchaseOrderDetailID JOIN purchase_order_summary pos ON pod.PurchaseOrderDetailPurchaseSummaryID = pos.PurchaseOrderSummaryID SET p.PoItemReceiveQty = ConvertQuantityToPurchasedItemUnit(pod.PurchaseOrderDetailItemID, pod.PurchaseOrderDetailItemUnitID, pod.PurchaseOrderDetailQty), p.PoItemReceiveIsActive = 'Y', p.PoItemReceiveUpdate = NOW(), p.PoItemReceiveUpdatedUserID = {$userId}, p.PoItemReceiveWarehouseID = pod.PurchaseOrderDetailWarehouseID, p.PoItemReceiveItemUnitID = pos.PurchaseOrderSummaryItemUnitID, p.PoItemReceivePrice = pos.PurchaseOrderSummaryPrice WHERE p.PoItemReceivePurchaseOrderID = {$POID} AND p.PoItemReceivePurchaseOrderSummaryID = pos.PurchaseOrderSummaryID AND p.PoItemReceivePurchaseOrderDetailID = pod.PurchaseOrderDetailID AND p.PoItemReceiveItemID = pod.PurchaseOrderDetailitemID AND p.PoItemReceiveQtyReceived = 0"; $qry = $this->db->query($sql, []); if (!$qry) { $this->db->trans_rollback(); $this->sys_error_db("update item ", $this->db);; exit; } $sql = "INSERT INTO po_item_receive ( PoItemReceivePurchaseOrderID, PoItemReceivePurchaseOrderSummaryID, PoItemReceivePurchaseOrderDetailID, PoItemReceiveWarehouseID, PoItemReceiveItemID, PoItemReceiveItemUnitID, PoItemReceiveQty, PoItemReceiveQtyReceived, PoItemReceiveIsActive, PoItemReceiveCreated, PoItemReceiveCreatedUserID, PoItemReceivePrice ) SELECT {$POID}, pod.PurchaseOrderDetailPurchaseSummaryID, pod.PurchaseOrderDetailID, pod.PurchaseOrderDetailWarehouseID, pod.PurchaseOrderDetailItemID, pos.PurchaseOrderSummaryItemUnitID, ConvertQuantityToPurchasedItemUnit(pod.PurchaseOrderDetailItemID, pod.PurchaseOrderDetailItemUnitID, pod.PurchaseOrderDetailQty), 0, -- Awalnya belum diterima 'Y', NOW(), {$userId}, pos.PurchaseOrderSummaryPrice FROM purchase_order_detail pod JOIN purchase_order_summary pos ON pod.PurchaseOrderDetailPurchaseSummaryID = pos.PurchaseOrderSummaryID WHERE pod.PurchaseOrderDetailPurchaseOrderID = {$POID} AND pod.PurchaseOrderDetailIsActive = 'Y' AND NOT EXISTS ( SELECT 1 FROM po_item_receive p WHERE p.PoItemReceivePurchaseOrderID = {$POID} AND p.PoItemReceiveItemID = pod.PurchaseOrderDetailItemID AND p.PoItemReceivePurchaseOrderSummaryID = pos.PurchaseOrderSummaryID AND p.PoItemReceivePurchaseOrderDetailID = pod.PurchaseOrderDetailID );"; $qry = $this->db->query($sql, []); if (!$qry) { $this->db->trans_rollback(); $this->sys_error_db("insert item", $this->db);; exit; } } } }