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 f766d2d..2d04753 100644 --- a/application/controllers/mockup/purchase/order/PurchaseOrderAset.php +++ b/application/controllers/mockup/purchase/order/PurchaseOrderAset.php @@ -185,8 +185,242 @@ class PurchaseOrderAset extends MY_Controller } } - public function getUserApproveLevel() - { + ## 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) { throw new Exception('Invalid token'); @@ -216,21 +450,24 @@ class PurchaseOrderAset extends MY_Controller } } - ## 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); - } + 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; } }