7 Commits

Author SHA1 Message Date
c125289b92 add: getDaftarAttachment api for purchase order asset 2026-07-09 10:39:28 +07:00
fe5e6dd6cb add: uploadAttachment api 2026-07-09 10:39:28 +07:00
5fd6db863a add: getDataKontrakPoAset api 2026-07-09 10:39:28 +07:00
fc9947bce4 add: getDaftarPoAset api 2026-07-09 10:39:28 +07:00
c296d5598b add: deletePoAsset api 2026-07-09 10:39:28 +07:00
5bd8e038fc add: editPoAsset api 2026-07-09 10:39:28 +07:00
8f07a65485 add: createPoAsset api 2026-07-09 10:39:01 +07:00
2 changed files with 1244 additions and 17 deletions

View File

@@ -172,6 +172,291 @@ Content-Type: application/json
"ID": "" "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/
Content-Type: application/json
{
"token": {{token}},
"search": "",
"currpage": 1,
"startdate": "2026-01-01",
"enddate": "2026-12-31",
"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/
Content-Type: application/json
{
"token": {{token}},
"poID": 1
}
###
// 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
}
###
// 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
}
###
// 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 ### Test isValidMultiple Warehouse
### Should return True karena UnitRequest = UnitPurchase ### Should return True karena UnitRequest = UnitPurchase
GET https://{{host}}/mockup/purchase/order/PurchaseOrder/isValidMultipleWarehouse/ GET https://{{host}}/mockup/purchase/order/PurchaseOrder/isValidMultipleWarehouse/

View File

@@ -185,8 +185,947 @@ class PurchaseOrderAset extends MY_Controller
} }
} }
public function getUserApproveLevel() 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);
}
}
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) {
$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 {
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 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 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);
}
}
// 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 { try {
if (!$this->isLogin) { if (!$this->isLogin) {
throw new Exception('Invalid token'); throw new Exception('Invalid token');
@@ -216,21 +1155,24 @@ class PurchaseOrderAset extends MY_Controller
} }
} }
## MUTATIONS ## private function insertLog($poID, $type, $prm, $dataBefore, $dataAfter, $userID, $desc = '') {
public function insertPurchaseOrderAsset() $sql = "INSERT INTO acc_one_log.purchase_order_log (
{ PurchaseOrderLogPurchaseOrderID,
try { PurchaseOrderLogType,
if (!$this->isLogin) { PurchaseOrderLogPrm,
throw new Exception('Invalid token'); PurchaseOrderLogJSONBefore,
} PurchaseOrderLogJSONAfter,
} catch (Exception $e) { PurchaseOrderLogCreated,
$msg = '[Error] ' . $e->getMessage(); PurchaseOrderLogUserID,
$code = $e->getCode(); PurchaseOrderLogTypeDesc
if ($code == 0) { ) VALUES (?,?,?,?,?,NOW(),?,?)";
$this->sys_error($msg); $que = $this->db->query($sql, [
} else { $poID, $type, json_encode($prm), json_encode($dataBefore),
$this->sys_error_db($msg); json_encode($dataAfter), $userID, $desc
} ]);
if (!$que) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] failed insert into table log PO");
exit; exit;
} }
} }