From 9c87e9ce25094eb3c288952dcc02f78cc045de48 Mon Sep 17 00:00:00 2001 From: bintanghr Date: Thu, 9 Jul 2026 09:39:11 +0700 Subject: [PATCH 01/13] add: createPoAsset api --- .../mockup/purchase/order/PurchaseOrder.http | 109 ++++++++ .../purchase/order/PurchaseOrderAset.php | 257 ++++++++++++++++++ 2 files changed, 366 insertions(+) diff --git a/application/controllers/mockup/purchase/order/PurchaseOrder.http b/application/controllers/mockup/purchase/order/PurchaseOrder.http index a6ff7a0..0460d6a 100644 --- a/application/controllers/mockup/purchase/order/PurchaseOrder.http +++ b/application/controllers/mockup/purchase/order/PurchaseOrder.http @@ -172,6 +172,115 @@ Content-Type: application/json "ID": "" } +### +// create po asset +POST https://{{host}}/mockup/purchase/order/PurchaseOrderAset/createPoAsset/ +Content-Type: application/json + +{ + "token": {{token}}, + "podate": "2026-07-09", + "reference": "REF-ASSET-001", + "supplierID": 1, + "typepajak": "nominal", + "valuepajak": 0, + "typediskon": "nominal", + "valuediskon": 0, + "catatan": "PO Asset Test", + "summary": { + "subtotal": 775000000, + "diskon": 37500000, + "pajak": 81125000, + "total": 818625000 + }, + "detail": [ + { + "M_ItemID": 123, + "ItemUnitID": 1, + "RequestQty": 2, + "SupplierPrice": 75000000, + "TempTotal": 150000000, + "DiskonType": "R", + "DiskonAmount": 0, + "detail": [ + { + "PurchaseRequestID": 1, + "PurchaseRequestDetailID": 1, + "PurchaseRequestFlagID": 1, + "M_ItemID": 123, + "ItemUnitID": 1, + "OriginalQty": 2, + "RequestQty": 2, + "SupplierPrice": 75000000 + } + ] + }, + { + "M_ItemID": 124, + "ItemUnitID": 2, + "RequestQty": 5, + "SupplierPrice": 25000000, + "TempTotal": 125000000, + "DiskonType": "P", + "DiskonAmount": 10, + "detail": [ + { + "PurchaseRequestID": 2, + "PurchaseRequestDetailID": 2, + "PurchaseRequestFlagID": 2, + "M_ItemID": 124, + "ItemUnitID": 2, + "OriginalQty": 3, + "RequestQty": 3, + "SupplierPrice": 25000000 + }, + { + "PurchaseRequestID": 2, + "PurchaseRequestDetailID": 3, + "PurchaseRequestFlagID": 3, + "M_ItemID": 124, + "ItemUnitID": 2, + "OriginalQty": 2, + "RequestQty": 2, + "SupplierPrice": 25000000 + } + ] + }, + { + "M_ItemID": 125, + "ItemUnitID": 1, + "RequestQty": 1, + "SupplierPrice": 500000000, + "TempTotal": 500000000, + "DiskonType": "R", + "DiskonAmount": 25000000, + "detail": [ + { + "PurchaseRequestID": 3, + "PurchaseRequestDetailID": 4, + "PurchaseRequestFlagID": 4, + "M_ItemID": 125, + "ItemUnitID": 1, + "OriginalQty": 1, + "RequestQty": 1, + "SupplierPrice": 500000000 + } + ] + } + ], + "assetAttachmentID": null, + "contractName": "Kontrak Pengadaan Mesin X", + "contractDate": "2026-07-09", + "contractStart": "2026-07-09", + "contractEnd": "2027-07-09", + "contractDuration": 12, + "installmentNumber": 12, + "installmentDate": 1, + "installmentPayAmount": 12500000, + "installmentDownPaymentType": "nominal", + "installmentDownPayment": 5000000 +} + ### Test isValidMultiple Warehouse ### Should return True karena UnitRequest = UnitPurchase GET https://{{host}}/mockup/purchase/order/PurchaseOrder/isValidMultipleWarehouse/ diff --git a/application/controllers/mockup/purchase/order/PurchaseOrderAset.php b/application/controllers/mockup/purchase/order/PurchaseOrderAset.php index 19ee953..cf90432 100644 --- a/application/controllers/mockup/purchase/order/PurchaseOrderAset.php +++ b/application/controllers/mockup/purchase/order/PurchaseOrderAset.php @@ -162,6 +162,241 @@ class PurchaseOrderAset extends MY_Controller { } } + ## MUTATIONS ## + public function createPoAsset() { + try { + if (!$this->isLogin) { + $this->sys_error("invalid token"); + exit; + } + + $this->db->trans_begin(); + + $para = $this->sys_input; + $user = $this->sys_user; + + /* GENERATE nomor PO */ + $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, [$user['M_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, ['PO', $userDivID, $areatype, $areaid, 'SM', 'N']); + if (!$quenum) { + $this->db->trans_rollback(); + $this->sys_error_db("[Error] generate number doc", $this->db); + exit; + } + $numpd = $quenum->row_array()['numpd']; + + /* INSERT into table purchase order */ + $taxtype = 'R'; + $taxpercent = 0; + if ($para['typepajak'] == 'percent') { + $taxtype = 'P'; + $taxpercent = floatval($para['valuepajak']); + } + + $discpercent = 0; + if ($para['typediskon'] == 'percent') { + $discpercent = floatval($para['valuediskon']); + } + + /* summary */ + $summary_subtotal = floatval($para['summary']['subtotal']); + $summary_diskon = floatval($para['summary']['diskon']); + $summary_pajak = floatval($para['summary']['pajak']); + $summary_total = floatval($para['summary']['total']); + + $sql_po = "INSERT INTO purchase_order ( + PurchaseOrderNumber, + PurchaseOrderItemCategoryID, -- '3' for asset + PurchaseOrderDate, + PurchaseOrderRefNumber, + PurchaseOrderSupplierID, + PurchaseOrderS_RegionalID, + PurchaseOrderTaxPpnType, + PurchaseOrderTaxPercentPpn, + PurchaseOrderDiscountPercent, + PurchaseOrderDiscountAmount, + PurchaseOrderNote, + PurchaseOrderSubTotal, + PurchaseOrderTaxAmountPpn, + PurchaseOrderGrandTotal, + PurchaseOrderUserID, + PurchaseOrderCreated + ) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,NOW())"; + $que_po = $this->db->query($sql_po, [ + $numpd, '3', $para['podate'], $para['reference'], $para['supplierID'], + $user['S_RegionalID'], $taxtype, $taxpercent, $discpercent, $summary_diskon, + $para['catatan'], $summary_subtotal, $summary_pajak, $summary_total, $user['M_UserID'] + ]); + if (!$que_po) { + $this->db->trans_rollback(); + $this->sys_error_db("[Error] insert into table purchase order"); + exit; + } + $PurchaseOrderID = $this->db->insert_id(); + + # INSERT into table purchase order summary # + $summary_detail = $para['detail']; + $item_detail = []; + foreach ($summary_detail as $key => $obj) { + $discpercent = 0; + $discabsolut = 0; + if ($obj['DiskonType'] == 'P') { + $discpercent = $obj['DiskonAmount']; + } else { + $discabsolut = $obj['DiskonAmount']; + } + + $sql_summary = "INSERT INTO purchase_order_summary ( + PurchaseOrderSummaryPurchaseOrderID, + PurchaseOrderSummaryItemID, + PurchaseOrderSummaryItemUnitID, + PurchaseOrderSummaryQty, + PurchaseOrderSummaryPrice, + PurchaseOrderSummaryTotal, + PurchaseOrderSummaryDiscountRupiah, + PurchaseOrderSummaryDiscountPercent, + PurchaseOrderSummaryDiscountAmount, + PurchaseOrderSummaryDiscountType, + PurchaseOrderSummaryCreatedUserID, + PurchaseOrderSummaryCreated + ) VALUES (?,?,?,?,?,?,?,?,?,?,?,NOW())"; + $que_summary = $this->db->query($sql_summary, [ + $PurchaseOrderID, $obj['M_ItemID'], $obj['ItemUnitID'], + $obj['RequestQty'], $obj['SupplierPrice'], $obj['TempTotal'], + $discabsolut, $discpercent, $obj['DiskonAmount'], + $obj['DiskonType'], $user['M_UserID'] + ]); + if (!$que_summary) { + $this->db->trans_rollback(); + $this->sys_error_db("[Error] insert into table purchase order summary"); + exit; + } + + /* add detail to an array */ + $PurchaseSummaryID = $this->db->insert_id(); + foreach ($obj['detail'] as $key => $value) { + $obj['detail'][$key]['PurchaseSummaryID'] = $PurchaseSummaryID; + $obj['detail'][$key]['SupplierPrice'] = $obj['SupplierPrice']; + } + + $item_detail = array_merge($item_detail, $obj['detail']); + } + + # INSERT into table purchase order detail # + foreach ($item_detail as $key => $obj) { + $total = floatval($obj['SupplierPrice']) * floatval($obj['RequestQty']); + + $sql_detail = "INSERT INTO purchase_order_detail ( + PurchaseOrderDetailPurchaseOrderID, + PurchaseOrderDetailPurchaseSummaryID, + PurchaseOrderDetailPurchaseRequestID, + PurchaseOrderDetailPurchaseRequestDetailID, + PurchaseOrderDetailPurchaseRequestFlagID, + PurchaseOrderDetailItemID, + PurchaseOrderDetailItemUnitID, + PurchaseOrderDetailRequestQty, + PurchaseOrderDetailQty, + PurchaseOrderDetailPrice, + PurchaseOrderDetailTotal, + PurchaseOrderDetailUserID, + PurchaseOrderDetailCreatedUserID, + PurchaseOrderDetailCreated + ) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,NOW())"; + $que_detail = $this->db->query($sql_detail, [ + $PurchaseOrderID, $obj['PurchaseSummaryID'], $obj['PurchaseRequestID'], + $obj['PurchaseRequestDetailID'], $obj['PurchaseRequestFlagID'], + $obj['M_ItemID'], $obj['ItemUnitID'], $obj['OriginalQty'], $obj['RequestQty'], + $obj['SupplierPrice'], $total, $user['M_UserID'], $user['M_UserID'] + ]); + if (!$que_detail) { + $this->db->trans_rollback(); + $this->sys_error_db("[Error] insert into purchase order detail"); + exit; + } + + /* purchase request update flag */ + $sql_flag = "UPDATE purchase_request_flag SET + PurchaseRequestFlagQtyProses = ? + WHERE PurchaseRequestFlagID = ?"; + $que_flag = $this->db->query($sql_flag, [ + $obj['RequestQty'], $obj['PurchaseRequestFlagID'] + ]); + if (!$que_flag) { + $this->db->trans_rollback(); + $this->sys_error_db("[Error] update purchase request flag"); + exit; + } + } + + # INSERT into table purchase_order_asset_contract # + $sql_contract = "INSERT INTO purchase_order_asset_contract ( + PurchaseOrderAssetContractPurchaseOrderID, + PurchaseOrderAssetContractTAssetAttachmentID, + PurchaseOrderAssetContractName, + PurchaseOrderAssetContractDate, + PurchaseOrderAssetContractStartDate, + PurchaseOrderAssetContractEndDate, + PurchaseOrderAssetContractDuration, + PurchaseOrderAssetContractInstallmentNumber, + PurchaseOrderAssetContractInstallmentDate, + PurchaseOrderAssetContractInstallmentPayAmount, + PurchaseOrderAssetContractInstallmentDownPaymentType, + PurchaseOrderAssetContractInstallmentDownPayment, + PurchaseOrderAssetContractCreatedUserID, + PurchaseOrderAssetContractCreated, + PurchaseOrderAssetContractLastUpdated, + PurchaseOrderAssetContractIsActive + ) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,NOW(),NOW(),'Y')"; + $que_contract = $this->db->query($sql_contract, [ + $PurchaseOrderID, + $para['assetAttachmentID'], + $para['contractName'], + $para['contractDate'], + $para['contractStart'], + $para['contractEnd'], + $para['contractDuration'] ?: 1, + $para['installmentNumber'] ?: 1, + $para['installmentDate'] ?: 1, + $para['installmentPayAmount'] ?: 0.00, + $para['installmentDownPaymentType'] ?: 'nominal', + $para['installmentDownPayment'] ?: 0.00, + $user['M_UserID'] + ]); + if (!$que_contract) { + $this->db->trans_rollback(); + $this->sys_error_db("[Error] insert into table purchase order asset contract"); + exit; + } + + $this->insertLog( + $PurchaseOrderID, 'CREATE', $para, '', + [], $user['M_UserID'], 'create purchase order asset' + ); + $this->db->trans_commit(); + $this->sys_ok("[Success] success save po asset"); + } catch (Exception $exc) { + $msg = $exc->getMessage(); + $this->sys_error($msg); + } + } + public function getUserApproveLevel() { try { if (!$this->isLogin) { @@ -183,4 +418,26 @@ class PurchaseOrderAset extends MY_Controller { $this->sys_error($exc->getMessage()); } } + + private function insertLog($poID, $type, $prm, $dataBefore, $dataAfter, $userID, $desc = '') { + $sql = "INSERT INTO acc_one_log.purchase_order_log ( + PurchaseOrderLogPurchaseOrderID, + PurchaseOrderLogType, + PurchaseOrderLogPrm, + PurchaseOrderLogJSONBefore, + PurchaseOrderLogJSONAfter, + PurchaseOrderLogCreated, + PurchaseOrderLogUserID, + PurchaseOrderLogTypeDesc + ) VALUES (?,?,?,?,?,NOW(),?,?)"; + $que = $this->db->query($sql, [ + $poID, $type, json_encode($prm), json_encode($dataBefore), + json_encode($dataAfter), $userID, $desc + ]); + if (!$que) { + $this->db->trans_rollback(); + $this->sys_error_db("[Error] failed insert into table log PO"); + exit; + } + } } \ No newline at end of file From 3871a680ddd7ce771d4322e1c60d23e4be1f9018 Mon Sep 17 00:00:00 2001 From: bintanghr Date: Thu, 9 Jul 2026 09:54:26 +0700 Subject: [PATCH 02/13] add: editPoAsset api --- .../mockup/purchase/order/PurchaseOrder.http | 91 ++++++++ .../purchase/order/PurchaseOrderAset.php | 221 ++++++++++++++++++ 2 files changed, 312 insertions(+) diff --git a/application/controllers/mockup/purchase/order/PurchaseOrder.http b/application/controllers/mockup/purchase/order/PurchaseOrder.http index 0460d6a..4038b18 100644 --- a/application/controllers/mockup/purchase/order/PurchaseOrder.http +++ b/application/controllers/mockup/purchase/order/PurchaseOrder.http @@ -281,6 +281,97 @@ Content-Type: application/json "installmentDownPayment": 5000000 } +### +// edit po asset +POST https://{{host}}/mockup/purchase/order/PurchaseOrderAset/editPoAsset/ +Content-Type: application/json + +{ + "token": {{token}}, + "PurchaseOrderID": 1, + "PurchaseOrderAssetContractID": 1, + "podate": "2026-07-09", + "reference": "REF-ASSET-001-UPDATED", + "supplierID": 1, + "typepajak": "percent", + "valuepajak": 11, + "typediskon": "nominal", + "valuediskon": 0, + "catatan": "PO Asset Updated", + "summary": { + "subtotal": 775000000, + "diskon": 0, + "pajak": 85250000, + "total": 860250000 + }, + "detail": [ + { + "M_ItemID": 123, + "ItemUnitID": 1, + "RequestQty": 3, + "SupplierPrice": 75000000, + "TempTotal": 225000000, + "DiskonType": "R", + "DiskonAmount": 0, + "detail": [ + { + "PurchaseRequestID": 1, + "PurchaseRequestDetailID": 1, + "PurchaseRequestFlagID": 1, + "M_ItemID": 123, + "ItemUnitID": 1, + "OriginalQty": 3, + "RequestQty": 3, + "SupplierPrice": 75000000 + } + ] + }, + { + "M_ItemID": 124, + "ItemUnitID": 2, + "RequestQty": 5, + "SupplierPrice": 25000000, + "TempTotal": 125000000, + "DiskonType": "R", + "DiskonAmount": 0, + "detail": [ + { + "PurchaseRequestID": 2, + "PurchaseRequestDetailID": 2, + "PurchaseRequestFlagID": 2, + "M_ItemID": 124, + "ItemUnitID": 2, + "OriginalQty": 3, + "RequestQty": 3, + "SupplierPrice": 25000000 + }, + { + "PurchaseRequestID": 2, + "PurchaseRequestDetailID": 3, + "PurchaseRequestFlagID": 3, + "M_ItemID": 124, + "ItemUnitID": 2, + "OriginalQty": 2, + "RequestQty": 2, + "SupplierPrice": 25000000 + } + ] + } + ], + "assetAttachmentID": 1, + "contractName": "Kontrak Pengadaan Mesin X - Revisi", + "contractDate": "2026-07-10", + "contractStart": "2026-07-10", + "contractEnd": "2027-10-10", + "contractDuration": 15, + "installmentNumber": 15, + "installmentDate": 5, + "installmentPayAmount": 15000000, + "installmentDownPaymentType": "persen", + "installmentDownPayment": 20 +} + + ### Test isValidMultiple Warehouse ### Should return True karena UnitRequest = UnitPurchase GET https://{{host}}/mockup/purchase/order/PurchaseOrder/isValidMultipleWarehouse/ diff --git a/application/controllers/mockup/purchase/order/PurchaseOrderAset.php b/application/controllers/mockup/purchase/order/PurchaseOrderAset.php index cf90432..581e0da 100644 --- a/application/controllers/mockup/purchase/order/PurchaseOrderAset.php +++ b/application/controllers/mockup/purchase/order/PurchaseOrderAset.php @@ -397,6 +397,227 @@ class PurchaseOrderAset extends MY_Controller { } } + public function editPoAsset() { + try { + if (!$this->isLogin) { + $this->sys_error("invalid token"); + exit; + } + + $this->db->trans_begin(); + + $para = $this->sys_input; + $user = $this->sys_user; + + # check tipe diskon dan pajak # + $taxtype = 'R'; + $taxpercent = 0; + if ($para['typepajak'] == 'percent') { + $taxtype = 'P'; + $taxpercent = floatval($para['valuepajak']); + } + + $discpercent = 0; + if ($para['typediskon'] == 'percent') { + $discpercent = floatval($para['valuediskon']); + } + + # get data summary # + $summary_subtotal = floatval($para['summary']['subtotal']); + $summary_diskon = floatval($para['summary']['diskon']); + $summary_pajak = floatval($para['summary']['pajak']); + $summary_total = floatval($para['summary']['total']); + + # update po header # + $sql_po = "UPDATE purchase_order SET + PurchaseOrderDate = ?, + PurchaseOrderRefNumber = ?, + PurchaseOrderSupplierID = ?, + PurchaseOrderS_RegionalID = ?, + PurchaseOrderTaxPpnType = ?, + PurchaseOrderTaxPercentPpn = ?, + PurchaseOrderDiscountPercent = ?, + PurchaseOrderDiscountAmount = ?, + PurchaseOrderNote = ?, + PurchaseOrderSubTotal = ?, + PurchaseOrderTaxAmountPpn = ?, + PurchaseOrderGrandTotal = ?, + PurchaseOrderLastUpdated = NOW() + WHERE PurchaseOrderID = ? + AND PurchaseOrderIsActive = 'Y'"; + $que_po = $this->db->query($sql_po, [ + $para['podate'], $para['reference'], $para['supplierID'], $user['S_RegionalID'], + $taxtype, $taxpercent, $discpercent, $summary_diskon, $para['catatan'], + $summary_subtotal, $summary_pajak, $summary_total, $para['PurchaseOrderID'] + ]); + if (!$que_po) { + $this->db->trans_rollback(); + $this->sys_error_db("[Error] failed update header purchase order"); + exit; + } + + # update purchase_order_asset_contract # + $sql_contract = "UPDATE purchase_order_asset_contract SET + PurchaseOrderAssetContractTAssetAttachmentID = ?, + PurchaseOrderAssetContractName = ?, + PurchaseOrderAssetContractDate = ?, + PurchaseOrderAssetContractStartDate = ?, + PurchaseOrderAssetContractEndDate = ?, + PurchaseOrderAssetContractDuration = ?, + PurchaseOrderAssetContractInstallmentNumber = ?, + PurchaseOrderAssetContractInstallmentDate = ?, + PurchaseOrderAssetContractInstallmentPayAmount = ?, + PurchaseOrderAssetContractInstallmentDownPaymentType = ?, + PurchaseOrderAssetContractInstallmentDownPayment = ?, + PurchaseOrderAssetContractLastUpdated = NOW() + WHERE PurchaseOrderAssetContractID = ? + AND PurchaseOrderAssetContractIsActive = 'Y'"; + $que_contract = $this->db->query($sql_contract, [ + $para['assetAttachmentID'], + $para['contractName'], + $para['contractDate'], + $para['contractStart'], + $para['contractEnd'], + $para['contractDuration'] ?: 1, + $para['installmentNumber'] ?: 1, + $para['installmentDate'] ?: 1, + $para['installmentPayAmount'] ?: 0.00, + $para['installmentDownPaymentType'] ?: 'nominal', + $para['installmentDownPayment'] ?: 0.00, + $para['PurchaseOrderAssetContractID'] + ]); + if (!$que_contract) { + $this->db->trans_rollback(); + $this->sys_error_db("[Error] failed update purchase order asset contract"); + exit; + } + + # update status old po summary isActive to 'N' # + $sql_active = "UPDATE purchase_order_summary SET + PurchaseOrderSummaryIsActive = 'N' + WHERE PurchaseOrderSummaryPurchaseOrderID = ? + AND PurchaseOrderSummaryIsActive = 'Y'"; + $que_active = $this->db->query($sql_active, [$para['PurchaseOrderID']]); + if (!$que_active) { + $this->db->trans_rollback(); + $this->sys_error_db("[Error] failed update status po summary to N"); + exit; + } + + # insert new po summary # + $summary_detail = $para['detail']; + $item_detail = []; + foreach ($summary_detail as $key => $obj) { + $discpercent = 0; + $discabsolut = 0; + if ($obj['DiskonType'] == 'P') { + $discpercent = $obj['DiskonAmount']; + } else { + $discabsolut = $obj['DiskonAmount']; + } + + $sql_summary = "INSERT INTO purchase_order_summary ( + PurchaseOrderSummaryPurchaseOrderID, + PurchaseOrderSummaryItemID, + PurchaseOrderSummaryItemUnitID, + PurchaseOrderSummaryQty, + PurchaseOrderSummaryPrice, + PurchaseOrderSummaryTotal, + PurchaseOrderSummaryDiscountRupiah, + PurchaseOrderSummaryDiscountPercent, + PurchaseOrderSummaryDiscountAmount, + PurchaseOrderSummaryDiscountType, + PurchaseOrderSummaryCreatedUserID, + PurchaseOrderSummaryCreated + ) VALUES (?,?,?,?,?,?,?,?,?,?,?,NOW())"; + $que_summary = $this->db->query($sql_summary, [ + $para['PurchaseOrderID'], $obj['M_ItemID'], $obj['ItemUnitID'], + $obj['RequestQty'], $obj['SupplierPrice'], $obj['TempTotal'], + $discabsolut, $discpercent, $obj['DiskonAmount'], + $obj['DiskonType'], $user['M_UserID'] + ]); + if (!$que_summary) { + $this->db->trans_rollback(); + $this->sys_error_db("[Error] failed update data purchase order summary"); + exit; + } + + $PurchaseSummaryID = $this->db->insert_id(); + foreach ($obj['detail'] as $key => $value) { + $obj['detail'][$key]['PurchaseSummaryID'] = $PurchaseSummaryID; + } + $item_detail = array_merge($item_detail, $obj['detail']); + } + + # update status po detail isActive to 'N' # + $sql_active = "UPDATE purchase_order_detail SET + PurchaseOrderDetailIsActive = 'N' + WHERE PurchaseOrderDetailPurchaseOrderID = ? + AND PurchaseOrderDetailIsActive = 'Y'"; + $que_active = $this->db->query($sql_active, [$para['PurchaseOrderID']]); + if (!$que_active) { + $this->db->trans_rollback(); + $this->sys_error_db("[Error] failed update status po detail to N"); + exit; + } + + # insert new po detail # + foreach ($item_detail as $key => $obj) { + $total = floatval($obj['SupplierPrice']) * floatval($obj['RequestQty']); + + $sql_detail = "INSERT INTO purchase_order_detail ( + PurchaseOrderDetailPurchaseOrderID, + PurchaseOrderDetailPurchaseSummaryID, + PurchaseOrderDetailPurchaseRequestID, + PurchaseOrderDetailPurchaseRequestDetailID, + PurchaseOrderDetailPurchaseRequestFlagID, + PurchaseOrderDetailItemID, + PurchaseOrderDetailItemUnitID, + PurchaseOrderDetailRequestQty, + PurchaseOrderDetailQty, + PurchaseOrderDetailPrice, + PurchaseOrderDetailTotal, + PurchaseOrderDetailUserID, + PurchaseOrderDetailCreatedUserID, + PurchaseOrderDetailCreated + ) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,NOW())"; + $que_detail = $this->db->query($sql_detail, [ + $para['PurchaseOrderID'], $obj['PurchaseSummaryID'], $obj['PurchaseRequestID'], + $obj['PurchaseRequestDetailID'], $obj['PurchaseRequestFlagID'], + $obj['M_ItemID'], $obj['ItemUnitID'], $obj['OriginalQty'], $obj['RequestQty'], + $obj['SupplierPrice'], $total, $user['M_UserID'], $user['M_UserID'] + ]); + if (!$que_detail) { + $this->db->trans_rollback(); + $this->sys_error_db("[Error] failed re-insert purchase order detail"); + exit; + } + + $sql_flag = "UPDATE purchase_request_flag SET + PurchaseRequestFlagQtyProses = ? + WHERE PurchaseRequestFlagID = ?"; + $que_flag = $this->db->query($sql_flag, [ + $obj['RequestQty'], $obj['PurchaseRequestFlagID'] + ]); + if (!$que_flag) { + $this->db->trans_rollback(); + $this->sys_error_db("[Error] failed update qty proses flag"); + exit; + } + } + + $this->insertLog( + $para['PurchaseOrderID'], 'UPDATE', $para, '', + [], $user['M_UserID'], 'edit purchase order asset' + ); + $this->db->trans_commit(); + $this->sys_ok("[success] update purchase order asset"); + } catch (Exception $exc) { + $msg = $exc->getMessage(); + $this->sys_error($msg); + } + } + public function getUserApproveLevel() { try { if (!$this->isLogin) { From dc88589c783ec3bdfe5350b45e55cac00041091d Mon Sep 17 00:00:00 2001 From: bintanghr Date: Thu, 9 Jul 2026 10:04:43 +0700 Subject: [PATCH 03/13] add: deletePoAsset api --- .../mockup/purchase/order/PurchaseOrder.http | 11 ++ .../purchase/order/PurchaseOrderAset.php | 112 ++++++++++++++++++ 2 files changed, 123 insertions(+) diff --git a/application/controllers/mockup/purchase/order/PurchaseOrder.http b/application/controllers/mockup/purchase/order/PurchaseOrder.http index 4038b18..667ede9 100644 --- a/application/controllers/mockup/purchase/order/PurchaseOrder.http +++ b/application/controllers/mockup/purchase/order/PurchaseOrder.http @@ -371,6 +371,17 @@ Content-Type: application/json "installmentDownPayment": 20 } +### +// delete po asset +POST https://{{host}}/mockup/purchase/order/PurchaseOrderAset/deletePoAsset/ +Content-Type: application/json + +{ + "token": {{token}}, + "poID": 1, + "contractID": 1, + "ponumber": "PO24070001" +} ### Test isValidMultiple Warehouse ### Should return True karena UnitRequest = UnitPurchase diff --git a/application/controllers/mockup/purchase/order/PurchaseOrderAset.php b/application/controllers/mockup/purchase/order/PurchaseOrderAset.php index 581e0da..fa80203 100644 --- a/application/controllers/mockup/purchase/order/PurchaseOrderAset.php +++ b/application/controllers/mockup/purchase/order/PurchaseOrderAset.php @@ -618,6 +618,118 @@ class PurchaseOrderAset extends MY_Controller { } } + public function deletePoAsset() { + try { + if (!$this->isLogin) { + $this->sys_error("invalid token"); + exit; + } + + $this->db->trans_begin(); + $para = $this->sys_input; + $user = $this->sys_user; + + $sql_detail = "SELECT + PurchaseOrderDetailPurchaseRequestFlagID, + PurchaseOrderDetailQty + FROM purchase_order_detail + WHERE PurchaseOrderDetailPurchaseOrderID = ? + AND PurchaseOrderDetailIsActive = 'Y'"; + $que_detail = $this->db->query($sql_detail, [$para['poID']]); + if (!$que_detail) { + $this->db->trans_rollback(); + $this->sys_error_db("[Error] failed current data purchase order detail asset"); + exit; + } + $asset_detail = $que_detail->result_array(); + + /* reduce qty process in purchase order flag */ + foreach ($asset_detail as $key => $obj) { + $sql_updateflag = "UPDATE purchase_request_flag SET + PurchaseRequestFlagQtyProses = PurchaseRequestFlagQtyProses - ? + WHERE PurchaseRequestFlagID = ?"; + $que_updateflag = $this->db->query($sql_updateflag, [ + $obj['PurchaseOrderDetailQty'], + $obj['PurchaseOrderDetailPurchaseRequestFlagID'] + ]); + if (!$que_updateflag) { + $this->db->trans_rollback(); + $this->sys_error_db("[Error] failed to update qty po asset"); + exit; + } + } + + /* soft delete purchase order detail */ + $sql_deldetail = "UPDATE purchase_order_detail SET + PurchaseOrderDetailIsActive = 'N', + PurchaseOrderDetailDeleted = NOW(), + PurchaseOrderDetailDeletedUserID = ? + WHERE PurchaseOrderDetailPurchaseOrderID = ?"; + $que_deldetail = $this->db->query($sql_deldetail, [ + $user['M_UserID'], $para['poID'] + ]); + if (!$que_deldetail) { + $this->db->trans_rollback(); + $this->sys_error_db("[Error] failed soft delete data purchase order detail"); + exit; + } + + /* soft delete purchase order summary */ + $sql_delsummary = "UPDATE purchase_order_summary SET + PurchaseOrderSummaryIsActive = 'N', + PurchaseOrderSummaryDeleted = NOW(), + PurchaseOrderSummaryDeletedUserID = ? + WHERE PurchaseOrderSummaryPurchaseOrderID = ?"; + $que_delsummary = $this->db->query($sql_delsummary, [ + $user['M_UserID'], $para['poID'] + ]); + if (!$que_delsummary) { + $this->db->trans_rollback(); + $this->sys_error_db("[Error] failed soft delete data purchase order summary"); + exit; + } + + /* soft delete purchase_order_asset_contract */ + $sql_delcontract = "UPDATE purchase_order_asset_contract SET + PurchaseOrderAssetContractIsActive = 'N', + PurchaseOrderAssetContractLastUpdated = NOW() + WHERE PurchaseOrderAssetContractID = ? + AND PurchaseOrderAssetContractPurchaseOrderID = ?"; + $que_delcontract = $this->db->query($sql_delcontract, [ + $para['contractID'], $para['poID'] + ]); + if (!$que_delcontract) { + $this->db->trans_rollback(); + $this->sys_error_db("[Error] failed soft delete data purchase order asset contract"); + exit; + } + + /* soft delete purchase order */ + $sql_delorder = "UPDATE purchase_order SET + PurchaseOrderIsActive = 'N', + PurchaseOrderDeleted = NOW(), + PurchaseOrderDeletedUserID = ? + WHERE PurchaseOrderID = ?"; + $que_delorder = $this->db->query($sql_delorder, [ + $user['M_UserID'], $para['poID'] + ]); + if (!$que_delorder) { + $this->db->trans_rollback(); + $this->sys_error_db("[Error] failed soft delete data purchase order"); + exit; + } + + $desc = "delete purchase order asset dengan nomor {$para['ponumber']}"; + $this->insertLog($para['poID'], 'DELETE', $para, '', [], $user['M_UserID'], $desc); + + $this->db->trans_commit(); + $this->sys_ok("[Success] {$desc}"); + } catch (Exception $exc) { + $msg = $exc->getMessage(); + $this->sys_error($msg); + } + } + public function getUserApproveLevel() { try { if (!$this->isLogin) { From 834f23f26e8748d580c2464e151e79303adca742 Mon Sep 17 00:00:00 2001 From: bintanghr Date: Thu, 9 Jul 2026 10:11:28 +0700 Subject: [PATCH 04/13] add: getDaftarPoAset api --- .../mockup/purchase/order/PurchaseOrder.http | 14 ++++ .../purchase/order/PurchaseOrderAset.php | 83 +++++++++++++++++++ 2 files changed, 97 insertions(+) diff --git a/application/controllers/mockup/purchase/order/PurchaseOrder.http b/application/controllers/mockup/purchase/order/PurchaseOrder.http index 667ede9..c410aca 100644 --- a/application/controllers/mockup/purchase/order/PurchaseOrder.http +++ b/application/controllers/mockup/purchase/order/PurchaseOrder.http @@ -172,6 +172,20 @@ Content-Type: application/json "ID": "" } +### +// listing po asset +POST https://{{host}}/mockup/purchase/order/PurchaseOrderAset/getDaftarPoAset/ +Content-Type: application/json + +{ + "token": {{token}}, + "search": "", + "currpage": 1, + "startdate": "2026-01-01", + "enddate": "2026-12-31", + "status": "All" +} + ### // create po asset POST https://{{host}}/mockup/purchase/order/PurchaseOrderAset/createPoAsset/ diff --git a/application/controllers/mockup/purchase/order/PurchaseOrderAset.php b/application/controllers/mockup/purchase/order/PurchaseOrderAset.php index fa80203..3ca10fe 100644 --- a/application/controllers/mockup/purchase/order/PurchaseOrderAset.php +++ b/application/controllers/mockup/purchase/order/PurchaseOrderAset.php @@ -162,6 +162,89 @@ class PurchaseOrderAset extends MY_Controller { } } + public function getDaftarPoAset() { + try { + if (!$this->isLogin) { + $this->sys_error("invalid token"); + exit; + } + + $para = $this->sys_input; + $user = $this->sys_user; + + $keyword = "%"; + if ($para['search'] != '') { + $keyword .= $para['search'] . "%"; + } + + $sql_base = "SELECT + PurchaseOrderID, + PurchaseOrderDate, + PurchaseOrderNote, + PurchaseOrderNumber, + PurchaseOrderStatus, + PurchaseOrderRefNumber, + PurchaseOrderGrandTotal, + PurchaseOrderS_RegionalID, + PurchaseOrderApprovedManagerUserID AS verifiedby, + IFNULL(PurchaseOrderApprovedUserID, 0) AS approvedby, + PurchaseOrderAssetContractID, + PurchaseOrderAssetContractName AS contractName, + PurchaseOrderAssetContractStartDate AS contractStart, + PurchaseOrderAssetContractEndDate AS contractEnd, + SupplierID, + SupplierName + FROM purchase_order + JOIN supplier ON SupplierID = PurchaseOrderSupplierID + JOIN purchase_order_asset_contract + ON PurchaseOrderAssetContractPurchaseOrderID = PurchaseOrderID + WHERE PurchaseOrderIsActive = 'Y' + AND PurchaseOrderItemCategoryID = '3' + AND PurchaseOrderS_RegionalID = ? + AND PurchaseOrderDate BETWEEN DATE(?) AND DATE(?) + AND (PurchaseOrderStatus = ? OR 'All' = ?) + AND PurchaseOrderNumber LIKE ?"; + + $limit = 10; + $offset = 0; + if ($para['currpage'] > 0) { + $offset = ($para['currpage'] - 1) * $limit; + } + + $sql_data = $sql_base . " LIMIT ? OFFSET ?"; + $que_data = $this->db->query($sql_data, [ + $user['S_RegionalID'], $para['startdate'], $para['enddate'], + $para['status'], $para['status'], $keyword, $limit, $offset + ]); + if (!$que_data) { + $this->sys_error_db("[Error] failed get data listing PO asset"); + exit; + } + $data_services = $que_data->result_array(); + + $sql_total = "SELECT COUNT(*) AS total FROM ($sql_base) AS x"; + $que_total = $this->db->query($sql_total, [ + $user['S_RegionalID'], $para['startdate'], $para['enddate'], + $para['status'], $para['status'], $keyword + ]); + if (!$que_total) { + $this->sys_error_db("[Error] failed get total data listing PO asset"); + exit; + } + $total_services = $que_total->row_array()['total']; + + $output = [ + "records" => $data_services, + "total" => $total_services + ]; + + $this->sys_ok($output); + } catch (Exception $exc) { + $msg = $exc->getMessage(); + $this->sys_error($msg); + } + } + ## MUTATIONS ## public function createPoAsset() { try { From 77fc97e9647101efef85cc706b19279cea0c31fc Mon Sep 17 00:00:00 2001 From: bintanghr Date: Thu, 9 Jul 2026 10:16:03 +0700 Subject: [PATCH 05/13] add: getDataKontrakPoAset api --- .../mockup/purchase/order/PurchaseOrder.http | 10 + .../purchase/order/PurchaseOrderAset.php | 181 ++++++++++++++++++ 2 files changed, 191 insertions(+) diff --git a/application/controllers/mockup/purchase/order/PurchaseOrder.http b/application/controllers/mockup/purchase/order/PurchaseOrder.http index c410aca..40f7898 100644 --- a/application/controllers/mockup/purchase/order/PurchaseOrder.http +++ b/application/controllers/mockup/purchase/order/PurchaseOrder.http @@ -186,6 +186,16 @@ Content-Type: application/json "status": "All" } +### +// get data kontrak po asset +POST https://{{host}}/mockup/purchase/order/PurchaseOrderAset/getDataKontrakPoAset/ +Content-Type: application/json + +{ + "token": {{token}}, + "poID": 1 +} + ### // create po asset POST https://{{host}}/mockup/purchase/order/PurchaseOrderAset/createPoAsset/ diff --git a/application/controllers/mockup/purchase/order/PurchaseOrderAset.php b/application/controllers/mockup/purchase/order/PurchaseOrderAset.php index 3ca10fe..b9bd935 100644 --- a/application/controllers/mockup/purchase/order/PurchaseOrderAset.php +++ b/application/controllers/mockup/purchase/order/PurchaseOrderAset.php @@ -245,6 +245,187 @@ class PurchaseOrderAset extends MY_Controller { } } + public function getDataKontrakPoAset() { + try { + if (!$this->isLogin) { + $this->sys_error("invalid token"); + exit; + } + + $para = $this->sys_input; + + # get data from purchase order detail # + $sql_detail = "SELECT + PurchaseOrderID, + PurchaseRequestID, + PurchaseRequestNumber, + PurchaseOrderDetailPurchaseSummaryID AS PurchaseOrderSummaryID, + PurchaseOrderDetailPurchaseRequestDetailID AS PurchaseRequestDetailID, + PurchaseOrderDetailPurchaseRequestFlagID AS PurchaseRequestFlagID, + PurchaseOrderDetailRequestQty AS OriginalQty, + PurchaseOrderDetailQty AS RequestQty, + PurchaseOrderDetailPrice AS SupplierPrice, + PurchaseOrderDetailTotal, + PurchaseOrderDetailItemID AS M_ItemID, + M_ItemCode, + M_ItemDesc, + PurchaseOrderDetailItemUnitID AS ItemUnitID, + ItemUnitName + FROM purchase_order + JOIN purchase_order_detail ON PurchaseOrderDetailPurchaseOrderID = PurchaseOrderID + AND PurchaseOrderDetailIsActive = 'Y' + JOIN purchase_request ON PurchaseRequestID = PurchaseOrderDetailPurchaseRequestID + JOIN m_item ON M_ItemID = PurchaseOrderDetailItemID + JOIN itemunit ON ItemUnitID = PurchaseOrderDetailItemUnitID + WHERE PurchaseOrderDetailIsActive = 'Y' + AND PurchaseOrderID = ?"; + $que_detail = $this->db->query($sql_detail, [$para['poID']]); + if (!$que_detail) { + $this->sys_error_db("[Error] failed get data po detail asset"); + exit; + } + $detail_asset = $que_detail->result_array(); + + # get data from purchase order summary # + $sql_sumry = "SELECT + PurchaseOrderID, + PurchaseOrderSummaryID, + PurchaseOrderSummaryQty AS RequestQty, + PurchaseOrderSummaryPrice AS SupplierPrice, + PurchaseOrderSummaryDiscountRupiah AS DiskonRupiah, + PurchaseOrderSummaryDiscountPercent AS DiskonPercent, + PurchaseOrderSummaryDiscountAmount AS DiskonAmount, + PurchaseOrderSummaryDiscountType AS DiskonType, + (PurchaseOrderSummaryPrice - PurchaseOrderSummaryDiscountAmount) AS EndPrice, + PurchaseOrderSummaryTotal AS TempTotal, + PurchaseOrderSummaryItemID AS M_ItemID, + M_ItemCode, + M_ItemDesc, + PurchaseOrderSummaryItemUnitID AS ItemUnitID, + ItemUnitName + FROM purchase_order + JOIN purchase_order_summary ON PurchaseOrderSummaryPurchaseOrderID = PurchaseOrderID + JOIN m_item ON M_ItemID = PurchaseOrderSummaryItemID + JOIN itemunit ON ItemUnitID = PurchaseOrderSummaryItemUnitID + WHERE PurchaseOrderSummaryIsActive = 'Y' + AND PurchaseOrderID = ?"; + $que_sumry = $this->db->query($sql_sumry, [$para['poID']]); + if (!$que_sumry) { + $this->sys_error_db("[Error] failed get data po summary asset"); + exit; + } + $data_sumry = $que_sumry->result_array(); + + # get data from purchase order # + $sql_poasset = "SELECT + PurchaseOrderID, + PurchaseOrderDate AS podate, + PurchaseOrderNote AS catatan, + PurchaseOrderNumber, + PurchaseOrderStatus, + PurchaseOrderRefNumber AS reference, + PurchaseOrderGrandTotal AS grandtotal, + CASE + WHEN PurchaseOrderTaxPpnType = 'P' THEN 'percent' + ELSE 'absolute' + END AS typepajak, + CASE + WHEN PurchaseOrderTaxPpnType = 'P' THEN PurchaseOrderTaxPercentPpn + ELSE PurchaseOrderTaxAmountPpn + END AS valuepajak, + CASE + WHEN PurchaseOrderDiscountPercent > 0.00 THEN 'percent' + ELSE 'absolute' + END AS typediskon, + CASE + WHEN PurchaseOrderDiscountPercent > 0.00 THEN PurchaseOrderDiscountPercent + ELSE PurchaseOrderDiscountAmount + END AS valuediskon, + PurchaseOrderSubTotal AS subtotal, + PurchaseOrderGrandTotal AS grandtotal, + SupplierID AS supplierID, + SupplierName, + PurchaseOrderAssetContractID, + PurchaseOrderAssetContractTAssetAttachmentID AS assetAttachmentID, + PurchaseOrderAssetContractName AS contractName, + PurchaseOrderAssetContractDate AS contractDate, + PurchaseOrderAssetContractStartDate AS contractStart, + PurchaseOrderAssetContractEndDate AS contractEnd, + PurchaseOrderAssetContractDuration AS contractDuration, + PurchaseOrderAssetContractInstallmentNumber AS installmentNumber, + PurchaseOrderAssetContractInstallmentDate AS installmentDate, + PurchaseOrderAssetContractInstallmentPayAmount AS installmentPayAmount, + PurchaseOrderAssetContractInstallmentDownPaymentType AS installmentDownPaymentType, + PurchaseOrderAssetContractInstallmentDownPayment AS installmentDownPayment, + PurchaseOrderApprovedManagerUserID AS verifiedby + FROM purchase_order + JOIN supplier ON SupplierID = PurchaseOrderSupplierID + JOIN purchase_order_asset_contract + ON PurchaseOrderAssetContractPurchaseOrderID = PurchaseOrderID + WHERE PurchaseOrderIsActive = 'Y' + AND PurchaseOrderID = ?"; + $que_poasset = $this->db->query($sql_poasset, [$para['poID']]); + if (!$que_poasset) { + $this->sys_error_db("[Error] failed get data from purchase order"); + exit; + } + $datapo = $que_poasset->row_array(); + + # process data output # + /* map detail po to summary */ + $grouped_detailpo = array(); + foreach ($detail_asset as $obj) { + $idz = $obj['PurchaseOrderSummaryID']; + if (!isset($grouped_detailpo[$idz])) { + $grouped_detailpo[$idz] = array(); + } + + $grouped_detailpo[$idz][] = $obj; + } + + foreach ($data_sumry as $key => $summary) { + $ids = $summary['PurchaseOrderSummaryID']; + + if (isset($grouped_detailpo[$ids])) { + $data_sumry[$key]['detail'] = $grouped_detailpo[$ids]; + } else { + $data_sumry[$key]['detail'] = array(); + } + } + + $subtotal = floatval($datapo['subtotal']); + $grandtotal = floatval($datapo['grandtotal']); + + $valuediskon = floatval($datapo['valuediskon']); + if ($datapo['typediskon'] == 'percent') { + $valuediskon = round(floatval($datapo['valuediskon']) * $subtotal / 100, 2); + } + + $valuepajak = floatval($datapo['valuepajak']); + if ($datapo['typepajak'] == 'percent') { + $price = ($subtotal - $valuediskon); + $valuepajak = round(floatval($datapo['valuepajak']) * $price / 100, 2); + } + + $outsummary = [ + "subtotal" => $subtotal, + "diskon" => $valuediskon, + "pajak" => $valuepajak, + "total" => $grandtotal + ]; + /* map summary to purchase order */ + $datapo['valuepajak'] = floatval($datapo['valuepajak']); + $datapo['valuediskon'] = floatval($datapo['valuediskon']); + $datapo['detail'] = $data_sumry; + $datapo['summary'] = $outsummary; + + $this->sys_ok($datapo); + } catch (Exception $exc) { + $msg = $exc->getMessage(); + $this->sys_error($msg); + } + } + ## MUTATIONS ## public function createPoAsset() { try { From 7af9fb2ca4375abda99fd37983ef68cd92c26c88 Mon Sep 17 00:00:00 2001 From: bintanghr Date: Thu, 9 Jul 2026 10:27:50 +0700 Subject: [PATCH 06/13] add: uploadAttachment api --- .../mockup/purchase/order/PurchaseOrder.http | 39 ++++++++++ .../purchase/order/PurchaseOrderAset.php | 74 +++++++++++++++++++ 2 files changed, 113 insertions(+) diff --git a/application/controllers/mockup/purchase/order/PurchaseOrder.http b/application/controllers/mockup/purchase/order/PurchaseOrder.http index 40f7898..3487860 100644 --- a/application/controllers/mockup/purchase/order/PurchaseOrder.http +++ b/application/controllers/mockup/purchase/order/PurchaseOrder.http @@ -172,6 +172,45 @@ Content-Type: application/json "ID": "" } +### +// upload attachment — requires multipart/form-data with file(s) +// Gunakan REST Client atau Postman. Contoh format: +// POST https://{{host}}/mockup/purchase/order/PurchaseOrderAset/uploadAttachment/ +// Content-Type: multipart/form-data; boundary=----boundary +// +// ------boundary +// Content-Disposition: form-data; name="token" +// +// eyJ... +// ------boundary +// Content-Disposition: form-data; name="ponumber" +// +// PO24070001 +// ------boundary +// Content-Disposition: form-data; name="poID" +// +// 1 +// ------boundary +// Content-Disposition: form-data; name="contractID" +// +// 1 +// ------boundary +// Content-Disposition: form-data; name="files"; filename="foto1.jpg" +// Content-Type: image/jpeg +// +// < /path/to/foto1.jpg +// ------boundary +// Content-Disposition: form-data; name="files"; filename="foto2.jpg" +// Content-Type: image/jpeg +// +// < /path/to/foto2.jpg +// ------boundary-- +Content-Type: application/json + +{ + "token": {{token}} +} + ### // listing po asset POST https://{{host}}/mockup/purchase/order/PurchaseOrderAset/getDaftarPoAset/ diff --git a/application/controllers/mockup/purchase/order/PurchaseOrderAset.php b/application/controllers/mockup/purchase/order/PurchaseOrderAset.php index b9bd935..5111f5b 100644 --- a/application/controllers/mockup/purchase/order/PurchaseOrderAset.php +++ b/application/controllers/mockup/purchase/order/PurchaseOrderAset.php @@ -994,6 +994,80 @@ class PurchaseOrderAset extends MY_Controller { } } + // upload file + public function uploadAttachment() { + try { + if (!$this->isLogin) { + $this->sys_error("invalid token"); + exit; + } + + $this->db->trans_begin(); + $para = $this->sys_input; + $user = $this->sys_user; + + $basepath = "/home/one/project/accone/one-media/order-asset/"; + $year = date("Y"); + $targetpath = $basepath . $year . "/"; + + if (!is_dir($targetpath)) { + mkdir($targetpath, 0755, true); + } + + $config['upload_path'] = $targetpath; + $config['allowed_types'] = 'jpg|jpeg|png'; + $config['max_size'] = '10000'; + $count = count($_FILES['files']['name']); + $this->load->library('upload', $config); + + for ($i=0; $i < $count; $i++) { + if (!empty($_FILES['files']['name'][$i])) { + $_FILES['file']['name'] = $_FILES['files']['name'][$i]; + $_FILES['file']['type'] = $_FILES['files']['type'][$i]; + $_FILES['file']['tmp_name'] = $_FILES['files']['tmp_name'][$i]; + $_FILES['file']['error'] = $_FILES['files']['error'][$i]; + $_FILES['file']['size'] = $_FILES['files']['size'][$i]; + + $ext = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION); + $new_filename = "PO" . date("YmdHis") . "_" . $para['ponumber'] . "." . $ext; + $config['file_name'] = $new_filename; + $this->upload->initialize($config); + + if ($this->upload->do_upload('file')) { + $upload_data = $this->upload->data(); + $filename = $upload_data['file_name']; + + $sql_insert = "INSERT INTO purchase_order_asset_attachment ( + PurchaseOrderAssetAttachmentContractID, + PurchaseOrderAssetAttachmentPurchaseOrderID, + PurchaseOrderAssetAttachmentName, + PurchaseOrderAssetAttachmentType, + PurchaseOrderAssetAttachmentCreated + ) VALUES (?,?,?,?,NOW())"; + $que_insert = $this->db->query($sql_insert, [ + $para['contractID'], $para['poID'], $filename, 'order' + ]); + if (!$que_insert) { + $this->db->trans_rollback(); + $this->sys_error_db("[Error] failed insert attachment table purchase order asset attachment"); + exit; + } + } else { + $error = $this->upload->display_errors(); + $this->db->trans_rollback(); + $this->sys_error("[Error] " . $error); + } + } + } + + $this->db->trans_commit(); + $this->sys_ok("[Success] upload attachment order asset"); + } catch (Exception $exc) { + $msg = $exc->getMessage(); + $this->sys_error($msg); + } + } + public function getUserApproveLevel() { try { if (!$this->isLogin) { From 7e88cf247b962d61a60b75bc4a181f14e07ff681 Mon Sep 17 00:00:00 2001 From: bintanghr Date: Thu, 9 Jul 2026 10:34:26 +0700 Subject: [PATCH 07/13] add: getDaftarAttachment api for purchase order asset --- .../mockup/purchase/order/PurchaseOrder.http | 11 ++++++ .../purchase/order/PurchaseOrderAset.php | 34 +++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/application/controllers/mockup/purchase/order/PurchaseOrder.http b/application/controllers/mockup/purchase/order/PurchaseOrder.http index 3487860..b0bd0f3 100644 --- a/application/controllers/mockup/purchase/order/PurchaseOrder.http +++ b/application/controllers/mockup/purchase/order/PurchaseOrder.http @@ -225,6 +225,17 @@ Content-Type: application/json "status": "All" } +### +// get daftar attachment +POST https://{{host}}/mockup/purchase/order/PurchaseOrderAset/getDaftarAttachment/ +Content-Type: application/json + +{ + "token": {{token}}, + "contractID": 1, + "poID": 1 +} + ### // get data kontrak po asset POST https://{{host}}/mockup/purchase/order/PurchaseOrderAset/getDataKontrakPoAset/ diff --git a/application/controllers/mockup/purchase/order/PurchaseOrderAset.php b/application/controllers/mockup/purchase/order/PurchaseOrderAset.php index 5111f5b..3a0ea34 100644 --- a/application/controllers/mockup/purchase/order/PurchaseOrderAset.php +++ b/application/controllers/mockup/purchase/order/PurchaseOrderAset.php @@ -245,6 +245,40 @@ class PurchaseOrderAset extends MY_Controller { } } + public function getDaftarAttachment() { + try { + if (!$this->isLogin) { + $this->sys_error("invalid token"); + exit; + } + + $para = $this->sys_input; + + $sql = "SELECT + PurchaseOrderAssetAttachmentID AS attach_id, + PurchaseOrderAssetAttachmentName AS img_url, + PurchaseOrderAssetAttachmentCreated AS created + FROM purchase_order_asset_attachment + WHERE PurchaseOrderAssetAttachmentIsActive = 'Y' + AND PurchaseOrderAssetAttachmentContractID = ? + AND PurchaseOrderAssetAttachmentPurchaseOrderID = ? + AND PurchaseOrderAssetAttachmentType = 'order'"; + $que = $this->db->query($sql, [ + $para['contractID'], $para['poID'] + ]); + if (!$que) { + $this->sys_error_db("[Error] failed get data attachment"); + exit; + } + $data = $que->result_array(); + + $this->sys_ok($data); + } catch (Exception $exc) { + $msg = $exc->getMessage(); + $this->sys_error($msg); + } + } + public function getDataKontrakPoAset() { try { if (!$this->isLogin) { From 752c372c2f75f568ac8c781c6491d4d8fe938b38 Mon Sep 17 00:00:00 2001 From: bintanghr Date: Thu, 9 Jul 2026 11:09:44 +0700 Subject: [PATCH 08/13] add: updateApprovalPO api in purchase order aset --- .../mockup/purchase/order/PurchaseOrder.http | 11 ++++ .../purchase/order/PurchaseOrderAset.php | 66 +++++++++++++++++++ 2 files changed, 77 insertions(+) diff --git a/application/controllers/mockup/purchase/order/PurchaseOrder.http b/application/controllers/mockup/purchase/order/PurchaseOrder.http index b0bd0f3..a854ee0 100644 --- a/application/controllers/mockup/purchase/order/PurchaseOrder.http +++ b/application/controllers/mockup/purchase/order/PurchaseOrder.http @@ -236,6 +236,17 @@ Content-Type: application/json "poID": 1 } +### +// update approval PO — verifikasi manager (level 1) +POST https://{{host}}/mockup/purchase/order/PurchaseOrderAset/updateApprovalPO/ +Content-Type: application/json + +{ + "token": {{token}}, + "poID": 1, + "approvelevel": "1" +} + ### // get data kontrak po asset POST https://{{host}}/mockup/purchase/order/PurchaseOrderAset/getDataKontrakPoAset/ diff --git a/application/controllers/mockup/purchase/order/PurchaseOrderAset.php b/application/controllers/mockup/purchase/order/PurchaseOrderAset.php index 3a0ea34..666abe9 100644 --- a/application/controllers/mockup/purchase/order/PurchaseOrderAset.php +++ b/application/controllers/mockup/purchase/order/PurchaseOrderAset.php @@ -1102,6 +1102,72 @@ class PurchaseOrderAset extends MY_Controller { } } + public function updateApprovalPO() { + try { + if (!$this->isLogin) { + $this->sys_error("invalid token"); + exit; + } + + $this->db->trans_begin(); + $para = $this->sys_input; + $user = $this->sys_user; + $approvelevel = $para['approvelevel']; + + /* request purchase order */ + if ($approvelevel == '0') { + $sql = "UPDATE purchase_order SET + PurchaseOrderStatus = 'Pending', + PurchaseOrderLastUpdated = NOW() + WHERE PurchaseOrderID = ? + AND PurchaseOrderIsActive = 'Y'"; + $que = $this->db->query($sql, [$para['poID']]); + if (!$que) { + $this->db->trans_rollback(); + $this->sys_error_db("[Error] failed update table purchase order request"); + exit; + } + } + + /* verifikasi oleh manager */ + if ($approvelevel == '1') { + $sql = "UPDATE purchase_order SET + PurchaseOrderApprovedManagerUserID = ?, + PurchaseOrderLastUpdated = NOW() + WHERE PurchaseOrderID = ? + AND PurchaseOrderIsActive = 'Y'"; + $que = $this->db->query($sql, [$user['M_UserID'], $para['poID']]); + if (!$que) { + $this->db->trans_rollback(); + $this->sys_error_db("[Error] failed update table purchase order verif"); + exit; + } + } + + /* approval oleh kepala regional */ + if ($approvelevel == '2') { + $sql = "UPDATE purchase_order SET + PurchaseOrderStatus = 'Approved', + PurchaseOrderLastUpdated = NOW(), + PurchaseOrderApprovedUserID = ? + WHERE PurchaseOrderID = ? + AND PurchaseOrderIsActive = 'Y'"; + $que = $this->db->query($sql, [$user['M_UserID'], $para['poID']]); + if (!$que) { + $this->db->trans_rollback(); + $this->sys_error_db("[Error] failed update table purchase order approve"); + exit; + } + } + + $this->db->trans_commit(); + $this->sys_ok("[Success] success update status PO Asset"); + } catch (Exception $exc) { + $msg = $exc->getMessage(); + $this->sys_error($msg); + } + } + public function getUserApproveLevel() { try { if (!$this->isLogin) { From 2874fab71dcfec8507a39a8653e2e604c23e817f Mon Sep 17 00:00:00 2001 From: sasadib Date: Wed, 8 Jul 2026 17:15:55 +0700 Subject: [PATCH 09/13] add api file po asset, api receive item inventaris add insert into table stock_inventaris --- .../purchase/order/PurchaseOrderAset.php | 35 +++++-- .../ReceiveItemPoInventaris.php | 94 ++++++++++--------- 2 files changed, 79 insertions(+), 50 deletions(-) diff --git a/application/controllers/mockup/purchase/order/PurchaseOrderAset.php b/application/controllers/mockup/purchase/order/PurchaseOrderAset.php index 666abe9..90a4a48 100644 --- a/application/controllers/mockup/purchase/order/PurchaseOrderAset.php +++ b/application/controllers/mockup/purchase/order/PurchaseOrderAset.php @@ -1190,10 +1190,10 @@ class PurchaseOrderAset extends MY_Controller { } } - private function insertLog($poID, $type, $prm, $dataBefore, $dataAfter, $userID, $desc = '') { - $sql = "INSERT INTO acc_one_log.purchase_order_log ( - PurchaseOrderLogPurchaseOrderID, - PurchaseOrderLogType, + private function insertLog($poID, $type, $prm, $dataBefore, $dataAfter, $userID, $desc = '') { + $sql = "INSERT INTO acc_one_log.purchase_order_log ( + PurchaseOrderLogPurchaseOrderID, + PurchaseOrderLogType, PurchaseOrderLogPrm, PurchaseOrderLogJSONBefore, PurchaseOrderLogJSONAfter, @@ -1208,7 +1208,26 @@ class PurchaseOrderAset extends MY_Controller { if (!$que) { $this->db->trans_rollback(); $this->sys_error_db("[Error] failed insert into table log PO"); - exit; - } - } -} \ No newline at end of file + exit; + } + } + + ## MUTATIONS ## + public function insertPurchaseOrderAsset() + { + try { + if (!$this->isLogin) { + throw new Exception('Invalid token'); + } + } catch (Exception $e) { + $msg = '[Error] ' . $e->getMessage(); + $code = $e->getCode(); + if ($code == 0) { + $this->sys_error($msg); + } else { + $this->sys_error_db($msg); + } + exit; + } + } +} diff --git a/application/controllers/mockup/receive-item-po/ReceiveItemPoInventaris.php b/application/controllers/mockup/receive-item-po/ReceiveItemPoInventaris.php index e29a989..f95561e 100644 --- a/application/controllers/mockup/receive-item-po/ReceiveItemPoInventaris.php +++ b/application/controllers/mockup/receive-item-po/ReceiveItemPoInventaris.php @@ -1668,9 +1668,9 @@ class ReceiveItemPoInventaris extends MY_Controller foreach ($data_detail_ro as $key => $detail) { # UPDATE PO Summary # $sql_posummary = "UPDATE purchase_order_summary SET - PurchaseOrderSummaryQtyReceived = PurchaseOrderSummaryQtyReceived + ? - WHERE PurchaseOrderSummaryIsActive = 'Y' - AND PurchaseOrderSummaryID = ?"; + PurchaseOrderSummaryQtyReceived = PurchaseOrderSummaryQtyReceived + ? + WHERE PurchaseOrderSummaryIsActive = 'Y' + AND PurchaseOrderSummaryID = ?"; $que_posummary = $this->db->query($sql_posummary, [ intval($detail['ReceiveOrderPoDetailQty']), $detail['ReceiveOrderPoDetailPurchaseOrderSummaryID'] @@ -1946,18 +1946,18 @@ class ReceiveItemPoInventaris extends MY_Controller } // insert stockid barcode barang - $sql_update_barcode = "UPDATE t_barcode_barang SET - T_BarcodeBarangStockID = ? - WHERE T_BarcodeBarangReceiveOrderPoDetailID = ?"; - $qry_update_barcode = $this->db->query($sql_update_barcode, [ - $stock_ID, - $detail['ReceiveOrderPoDetailID'] - ]); - if (!$qry_update_barcode) { - $this->db->trans_rollback(); - $this->sys_error_db("[Error] update barcode stockID", $this->db); - exit; - } + // $sql_update_barcode = "UPDATE t_barcode_barang SET + // T_BarcodeBarangStockID = ? + // WHERE T_BarcodeBarangReceiveOrderPoDetailID = ?"; + // $qry_update_barcode = $this->db->query($sql_update_barcode, [ + // $stock_ID, + // $detail['ReceiveOrderPoDetailID'] + // ]); + // if (!$qry_update_barcode) { + // $this->db->trans_rollback(); + // $this->sys_error_db("[Error] update barcode stockID", $this->db); + // exit; + // } } else { $sql_insert_stock = "INSERT INTO stock ( StockWarehouseAlmariID, @@ -1990,18 +1990,18 @@ class ReceiveItemPoInventaris extends MY_Controller $stock_qty_end = intval($batch['qty']); // insert stockid barcode barang - $sql_update_barcode = "UPDATE t_barcode_barang SET - T_BarcodeBarangStockID = ? - WHERE T_BarcodeBarangReceiveOrderPoDetailID = ?"; - $qry_update_barcode = $this->db->query($sql_update_barcode, [ - $stockID, - $detail['ReceiveOrderPoDetailID'] - ]); - if (!$qry_update_barcode) { - $this->db->trans_rollback(); - $this->sys_error_db("[Error] update barcode stockID", $this->db); - exit; - } + // $sql_update_barcode = "UPDATE t_barcode_barang SET + // T_BarcodeBarangStockID = ? + // WHERE T_BarcodeBarangReceiveOrderPoDetailID = ?"; + // $qry_update_barcode = $this->db->query($sql_update_barcode, [ + // $stockID, + // $detail['ReceiveOrderPoDetailID'] + // ]); + // if (!$qry_update_barcode) { + // $this->db->trans_rollback(); + // $this->sys_error_db("[Error] update barcode stockID", $this->db); + // exit; + // } } // insert stock card @@ -2095,14 +2095,14 @@ class ReceiveItemPoInventaris extends MY_Controller // insert jurnal tx for GRNI $total_grni = round($total_debet - ($total_discount_item + $total_discount_po), 2) + $ship_cost; $sql_grni = "INSERT INTO jurnal_tx ( - jurnalTxJurnalID, - jurnalTxCoaID, - jurnalTxDescription, - jurnalTxDebit, - jurnalTxCredit, - jurnalTxM_UserID - ) SELECT ?, coaID, coaDescription, 0, ?, ? - FROM coa WHERE coaAccountNo = '2110100030' LIMIT 1"; + jurnalTxJurnalID, + jurnalTxCoaID, + jurnalTxDescription, + jurnalTxDebit, + jurnalTxCredit, + jurnalTxM_UserID + ) SELECT ?, coaID, coaDescription, 0, ?, ? + FROM coa WHERE coaAccountNo = '2110100030' LIMIT 1"; $que_grni = $this->db->query($sql_grni, [$jurnal_ID, $total_grni, $user['M_UserID']]); if (!$que_grni) { $this->db->trans_rollback(); @@ -2112,13 +2112,13 @@ class ReceiveItemPoInventaris extends MY_Controller $grni_jurnal_id = $this->db->insert_id(); $sql_addon_grni = "INSERT INTO jurnal_addon ( - jurnalAddOnJurnalID, - jurnalAddOnJurnalTxID, - jurnalAddOnCode, - jurnalAddOnValue, - jurnalAddOnCreated, - jurnalAddOnCreatedUserID - ) VALUES (?,?,'RONUMB',?,NOW(),?)"; + jurnalAddOnJurnalID, + jurnalAddOnJurnalTxID, + jurnalAddOnCode, + jurnalAddOnValue, + jurnalAddOnCreated, + jurnalAddOnCreatedUserID + ) VALUES (?,?,'RONUMB',?,NOW(),?)"; $que_addon_grni = $this->db->query($sql_addon_grni, [ $jurnal_ID, $grni_jurnal_id, @@ -2736,6 +2736,16 @@ class ReceiveItemPoInventaris extends MY_Controller $barcodeID = $this->db->insert_id(); + # insert stock inventaris # + $sql_stockinventaris = "INSERT INTO stock_inventaris ( + StockInventoryStockID, + StockInventoryRuanganID, + StockInventoryBarcode, + StockInventoryCabangID, + StockInventoryCreatedUserID + ) VALUES (?,?,?,?,?)"; + $que_stockinventaris = $this->db->query($sql_stockinventaris, []); + # insert each inventory handover detail # $sql_insert_handover_detail = "INSERT INTO asset_handover_detail( AssetHandoverDetailAssetHandoverID, From bcb553ea5673d921272ce5bdb023e6657dbfc965 Mon Sep 17 00:00:00 2001 From: sasadib Date: Thu, 9 Jul 2026 08:22:16 +0700 Subject: [PATCH 10/13] add query insert into table stock_inventory in func savehandover receiveitempo inventaris --- .../ReceiveItemPoInventaris.php | 181 ++++++++++-------- 1 file changed, 106 insertions(+), 75 deletions(-) diff --git a/application/controllers/mockup/receive-item-po/ReceiveItemPoInventaris.php b/application/controllers/mockup/receive-item-po/ReceiveItemPoInventaris.php index f95561e..f83678a 100644 --- a/application/controllers/mockup/receive-item-po/ReceiveItemPoInventaris.php +++ b/application/controllers/mockup/receive-item-po/ReceiveItemPoInventaris.php @@ -1514,23 +1514,23 @@ class ReceiveItemPoInventaris extends MY_Controller # GET DATA RO # $json_ro_before = $this->getDataROPO($ROID); $sql_ro = "SELECT - receive_order_po.*, - DATE_FORMAT(ReceiveOrderPoIDate, '%d-%m-%Y') AS 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 = ?"; + receive_order_po.*, + DATE_FORMAT(ReceiveOrderPoIDate, '%d-%m-%Y') AS 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 = ?"; $que_ro = $this->db->query($sql_ro, [$ROID]); if (!$que_ro) { $this->db->trans_rollback(); @@ -1545,23 +1545,23 @@ class ReceiveItemPoInventaris extends MY_Controller } $sql_detail_ro = "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"; + 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"; $que_detail_ro = $this->db->query($sql_detail_ro, [$ROID]); if (!$que_detail_ro) { $this->db->trans_rollback(); @@ -1572,10 +1572,10 @@ class ReceiveItemPoInventaris extends MY_Controller # UPDATE STATUS RO # $sql_update_ro = "UPDATE receive_order_po SET - ReceiveOrderPoConfirmed = 'Y', - ReceiveOrderPoConfirmedDate = NOW(), - ReceiveOrderPoConfirmedUserID = ? - WHERE ReceiveOrderPoID = ?"; + ReceiveOrderPoConfirmed = 'Y', + ReceiveOrderPoConfirmedDate = NOW(), + ReceiveOrderPoConfirmedUserID = ? + WHERE ReceiveOrderPoID = ?"; $que_update_ro = $this->db->query($sql_update_ro, [$user['M_UserID'], $ROID]); if (!$que_update_ro) { $this->db->trans_rollback(); @@ -1594,8 +1594,8 @@ class ReceiveItemPoInventaris extends MY_Controller $jurnal_number = $que_jrnl_num->row_array()['numbering']; $sql_periode = "SELECT periodeID FROM periode - WHERE DATE(NOW()) BETWEEN periodeStartDate AND periodeEndDate - AND periodeIsActive= 'Y' AND periodeIsClosed = 'N'"; + WHERE DATE(NOW()) BETWEEN periodeStartDate AND periodeEndDate + AND periodeIsActive= 'Y' AND periodeIsClosed = 'N'"; $que_periode = $this->db->query($sql_periode, []); if (!$que_periode) { $this->sys_error_db("[Error] get periode", $this->db); @@ -1631,17 +1631,17 @@ class ReceiveItemPoInventaris extends MY_Controller # INSERT JURNAL HEADER # $sql_head_jurnal = "INSERT INTO jurnal ( - jurnalM_BranchCompanyID, - JurnalS_RegionalID, - jurnalM_BranchCode, - jurnalperiodeID, - jurnalNo, - jurnalTitle, - jurnalDescription, - jurnalDate, - jurnalJurnalTypeID, - jurnalM_UserID - ) VALUES (?,?,?,?,?,?,?,NOW(),?,?)"; + jurnalM_BranchCompanyID, + JurnalS_RegionalID, + jurnalM_BranchCode, + jurnalperiodeID, + jurnalNo, + jurnalTitle, + jurnalDescription, + jurnalDate, + jurnalJurnalTypeID, + jurnalM_UserID + ) VALUES (?,?,?,?,?,?,?,NOW(),?,?)"; $que_head_jurnal = $this->db->query($sql_head_jurnal, [ $user['M_BranchCompanyID'], $user['S_RegionalID'], @@ -1862,8 +1862,8 @@ class ReceiveItemPoInventaris extends MY_Controller // save diskon prorata $sql_save_diskon = "UPDATE receive_order_po_detail SET - ReceiveOrderPoDetailDiskonPoProrata = ? - WHERE ReceiveOrderPoDetailID = ?"; + ReceiveOrderPoDetailDiskonPoProrata = ? + WHERE ReceiveOrderPoDetailID = ?"; $que_save_diskon = $this->db->query($sql_save_diskon, [ $diskon_prorata_item, $detail['ReceiveOrderPoDetailID'] @@ -1898,9 +1898,9 @@ class ReceiveItemPoInventaris extends MY_Controller // update stock based on batch foreach ($batch_list as $key => $batch) { $sql_cek_stock = "SELECT * - FROM stock s - JOIN m_item i ON s.StockItemID = i.M_ItemID - WHERE s.StockItemID = ? + FROM stock s + JOIN m_item i ON s.StockItemID = i.M_ItemID + WHERE s.StockItemID = ? AND s.StockItemUnitID = ? AND s.StockWarehouseID = ? AND i.M_ItemItem_CategoryID = ?"; @@ -2344,22 +2344,22 @@ class ReceiveItemPoInventaris extends MY_Controller $this->db->trans_begin(); $sql_insert = "INSERT INTO receive_order_po_inspeksi ( - ReceiveOrderPoInspeksiReceiveOrderPoDetailID, - ReceiveOrderPoInspeksiQtyPesan, - ReceiveOrderPoInspeksiQtyActual, - ReceiveOrderPoInspeksiPricePesan, - ReceiveOrderPoInspeksiPriceActual, - ReceiveOrderPoInspeksiDatePesan, - ReceiveOrderPoInspeksiDateActual, - ReceiveOrderPoInspeksiExpireDate, - ReceiveOrderPoInspeksiKeadaanKemasan, - ReceiveOrderPoInspeksiKondisiPengiriman, - ReceiveOrderPoInspeksiSimpulan, - ReceiveOrderPoInspeksiCatatan, - ReceiveOrderPoInspeksiStaffPenerima, - ReceiveOrderPoInspeksiStaffPengirim, - ReceiveOrderPoInspeksiUserID - ) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; + ReceiveOrderPoInspeksiReceiveOrderPoDetailID, + ReceiveOrderPoInspeksiQtyPesan, + ReceiveOrderPoInspeksiQtyActual, + ReceiveOrderPoInspeksiPricePesan, + ReceiveOrderPoInspeksiPriceActual, + ReceiveOrderPoInspeksiDatePesan, + ReceiveOrderPoInspeksiDateActual, + ReceiveOrderPoInspeksiExpireDate, + ReceiveOrderPoInspeksiKeadaanKemasan, + ReceiveOrderPoInspeksiKondisiPengiriman, + ReceiveOrderPoInspeksiSimpulan, + ReceiveOrderPoInspeksiCatatan, + ReceiveOrderPoInspeksiStaffPenerima, + ReceiveOrderPoInspeksiStaffPengirim, + ReceiveOrderPoInspeksiUserID + ) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; $que_insert = $this->db->query($sql_insert, [ $ROdetailID, $inspeksi['qty_po'], @@ -2736,15 +2736,46 @@ class ReceiveItemPoInventaris extends MY_Controller $barcodeID = $this->db->insert_id(); + # check if item already in stock # + $sql_cekstock = "SELECT StockID + FROM stock + JOIN warehouse ON WarehouseID = StockWarehouseID + AND WarehouseIsActive = 'Y' + WHERE WarehouseM_BranchID = ? + AND StockItemID = ? + AND StockItemUnitID = ?"; + $que_cekstock = $this->db->query($sql_cekstock, [ + $user['M_BranchID'], + $item['ReceiveOrderPoItemID'], + $item['ReceiveOrderPoItemUnitID'], + ]); + if (!$que_cekstock) { + $this->db->trans_rollback(); + $this->sys_error_db("[Error] query cek stock"); + exit; + } + $stockID = $que_cekstock->row_array()['StockID']; + # insert stock inventaris # - $sql_stockinventaris = "INSERT INTO stock_inventaris ( + $sql_stockinventaris = "INSERT INTO stock_inventory ( StockInventoryStockID, StockInventoryRuanganID, StockInventoryBarcode, - StockInventoryCabangID, + StockInventoryBranchID, StockInventoryCreatedUserID ) VALUES (?,?,?,?,?)"; - $que_stockinventaris = $this->db->query($sql_stockinventaris, []); + $que_stockinventaris = $this->db->query($sql_stockinventaris, [ + $stockID, + $param['ruanganID'], + $noBarcode, + $user['M_BranchID'], + $user['M_UserID'] + ]); + if (!$que_stockinventaris) { + $this->db->trans_rollback(); + $this->sys_error_db("[Error] insert into table stock inventaris"); + exit; + } # insert each inventory handover detail # $sql_insert_handover_detail = "INSERT INTO asset_handover_detail( From a6412c9688f2b2d0afb0a0690cf7d301bc05046e Mon Sep 17 00:00:00 2001 From: sasadib Date: Thu, 9 Jul 2026 09:46:34 +0700 Subject: [PATCH 11/13] add workflow auto update to server --- .gitea/workflows/deploy-controllers.yml | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 .gitea/workflows/deploy-controllers.yml diff --git a/.gitea/workflows/deploy-controllers.yml b/.gitea/workflows/deploy-controllers.yml new file mode 100644 index 0000000..e8deecb --- /dev/null +++ b/.gitea/workflows/deploy-controllers.yml @@ -0,0 +1,24 @@ +name: Deploy controllers + +on: + push: + branches: + - develop + +jobs: + upload: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Upload changed controller files + uses: burnett01/rsync-deployments@7.0.2 + with: + switches: -avz + path: ./application/controllers/ + remote_path: /home/one/project/accone/one-api/application/controllers/ + remote_host: accone.aplikasi.web.id + remote_user: ${{ secrets.SERVER_USER }} + remote_key: ${{ secrets.SERVER_SSH_KEY }} From 0ea56f09fa718cde6c1076647335f60b32645d7d Mon Sep 17 00:00:00 2001 From: sasadib Date: Thu, 9 Jul 2026 09:51:11 +0700 Subject: [PATCH 12/13] add parameter ssh key passphrase to workflow --- .gitea/workflows/deploy-controllers.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitea/workflows/deploy-controllers.yml b/.gitea/workflows/deploy-controllers.yml index e8deecb..9e1808b 100644 --- a/.gitea/workflows/deploy-controllers.yml +++ b/.gitea/workflows/deploy-controllers.yml @@ -22,3 +22,4 @@ jobs: remote_host: accone.aplikasi.web.id remote_user: ${{ secrets.SERVER_USER }} remote_key: ${{ secrets.SERVER_SSH_KEY }} + remote_key_pass: ${{ secrets.SERVER_SSH_KEY_PASSPHRASE }} From 6dbe0e400bfa15d44c024da88ad03b66856c5cdf Mon Sep 17 00:00:00 2001 From: sasadib Date: Thu, 9 Jul 2026 10:12:42 +0700 Subject: [PATCH 13/13] remove workflow add scripts compare file and upload to server --- .gitea/workflows/deploy-controllers.yml | 25 ------------ scripts/deploy-controllers.sh | 54 +++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 25 deletions(-) delete mode 100644 .gitea/workflows/deploy-controllers.yml create mode 100755 scripts/deploy-controllers.sh diff --git a/.gitea/workflows/deploy-controllers.yml b/.gitea/workflows/deploy-controllers.yml deleted file mode 100644 index 9e1808b..0000000 --- a/.gitea/workflows/deploy-controllers.yml +++ /dev/null @@ -1,25 +0,0 @@ -name: Deploy controllers - -on: - push: - branches: - - develop - -jobs: - upload: - runs-on: ubuntu-latest - - steps: - - name: Checkout repository - uses: actions/checkout@v4 - - - name: Upload changed controller files - uses: burnett01/rsync-deployments@7.0.2 - with: - switches: -avz - path: ./application/controllers/ - remote_path: /home/one/project/accone/one-api/application/controllers/ - remote_host: accone.aplikasi.web.id - remote_user: ${{ secrets.SERVER_USER }} - remote_key: ${{ secrets.SERVER_SSH_KEY }} - remote_key_pass: ${{ secrets.SERVER_SSH_KEY_PASSPHRASE }} diff --git a/scripts/deploy-controllers.sh b/scripts/deploy-controllers.sh new file mode 100755 index 0000000..4032d04 --- /dev/null +++ b/scripts/deploy-controllers.sh @@ -0,0 +1,54 @@ +#!/usr/bin/env bash +set -euo pipefail + +REMOTE_HOST="accone.aplikasi.web.id" +LOCAL_PATH="application/controllers/" +REMOTE_PATH="/home/one/project/accone/one-api/application/controllers/" + +cd "$(dirname "$0")/.." + +if ! command -v rsync >/dev/null 2>&1; then + echo "rsync is required but was not found in PATH." >&2 + exit 1 +fi + +if ! command -v ssh >/dev/null 2>&1; then + echo "ssh is required but was not found in PATH." >&2 + exit 1 +fi + +if ! command -v awk >/dev/null 2>&1; then + echo "awk is required but was not found in PATH." >&2 + exit 1 +fi + +usage() { + echo "Usage: $0 [remote_user]" >&2 + echo "Examples:" >&2 + echo " $0 test" >&2 + echo " $0 sync" >&2 + echo " $0 test one" >&2 +} + +COMMAND="${1:-}" +REMOTE_USER="${2:-one}" +REMOTE="${REMOTE_USER}@${REMOTE_HOST}" + +case "$COMMAND" in + test) + echo "Checking SSH connection to ${REMOTE}..." + ssh -o ConnectTimeout=10 "$REMOTE" "test -d '$REMOTE_PATH'" + + echo + echo "Files/folders that would be uploaded:" + rsync -rzcin --out-format="%i %n%L" "$LOCAL_PATH" "${REMOTE}:${REMOTE_PATH}" \ + | awk '$1 ~ /^