isLogin) { $this->sys_error("invalid token"); exit; } $sql = "SELECT SupplierID, SupplierName FROM supplier WHERE SupplierIsActive = 'Y'"; $que = $this->db->query($sql, []); if (!$que) { $this->sys_error_db("[Error] get data supplier"); exit; } $data = $que->result_array(); $this->sys_ok($data); } catch (Exception $exc) { $this->sys_error($exc->getMessage()); } } public function getListCabang() { try { if (!$this->isLogin) { $this->sys_error("invalid token"); exit; } $user = $this->sys_user; $sql = "SELECT M_BranchID, M_BranchCode, M_BranchName FROM m_branch WHERE M_BranchIsActive = 'Y' AND M_BranchS_RegionalID = ?"; $que = $this->db->query($sql, [$user['S_RegionalID']]); if (!$que) { $this->sys_error_db("[Error] failed get list cabang"); exit; } $data = $que->result_array(); $this->sys_ok($data); } catch (Exception $exc) { $this->sys_error($exc->getMessage()); } } public function searchRequestAset() { try { if (!$this->isLogin) { $this->sys_error("invalid token"); exit; } $para = $this->sys_input; $keyword = "%"; if ($para['search'] != '') { $keyword .= $para['search'] . "%"; } $limit = 10; $offset = 0; if ($para['currpage'] > 0) { $offset = ($para['currpage'] - 1) * $limit; } $sql = "SELECT PurchaseRequestID, PurchaseRequestNumber, PurchaseRequestDetailID, PurchaseRequestFlagID, PurchaseRequestFlagM_BranchCode AS BranchCode, PurchaseRequestItemCategoryID AS ItemCategoryID, PurchaseRequestFlagQtyRest - PurchaseRequestFlagQtyProses AS UnprocessFlagQty, PurchaseRequestDetailQty AS RequestQty, PurchaseRequestDetailQty AS OriginalQty, M_BranchName, M_ItemID, M_ItemCode, M_ItemDesc, ItemUnitID, ItemUnitName, SupplierPricePrice as SupplierPrice FROM purchase_request JOIN purchase_request_detail ON PurchaseRequestDetailPurchaseRequestID = PurchaseRequestID AND PurchaseRequestDetailIsActive = 'Y' AND PurchaseRequestM_BranchCode = ? AND PurchaseRequestItemCategoryID = '3' -- id category item asset AND PurchaseRequestNumber LIKE ? JOIN purchase_request_flag ON PurchaseRequestFlagPurchaseRequestDetailID = PurchaseRequestDetailID AND PurchaseRequestFlagStatus = 'PO' AND PurchaseRequestFlagIsActive = 'Y' JOIN m_item ON M_ItemID = PurchaseRequestDetailM_ItemID JOIN itemunit ON ItemUnitID = PurchaseRequestDetailItemUnitID JOIN supplier_price ON SupplierPriceSupplierID = ? AND SupplierPriceM_ItemID = M_ItemID AND SupplierPriceItemUnitID = ItemUnitID AND SupplierPriceIsActive = 'Y' JOIN m_branch ON M_BranchCode = PurchaseRequestFlagM_BranchCode AND M_BranchIsActive = 'Y' WHERE NOT EXISTS ( SELECT 1 FROM purchase_order_detail JOIN purchase_order ON PurchaseOrderDetailPurchaseOrderID = PurchaseOrderID AND PurchaseOrderStatus = 'Approved' AND PurchaseOrderIsActive = 'Y' AND PurchaseOrderDetailIsActive = 'Y' WHERE PurchaseOrderDetailPurchaseRequestDetailID = PurchaseRequestDetailID )"; $sql_data = $sql . " LIMIT ? OFFSET ? "; $que_data = $this->db->query($sql_data, [ $para['branchcode'], $keyword, $para['supplierID'], $limit, $offset ]); if (!$que_data) { $this->sys_error_db("[Error] get daftar request data"); exit; } $data = $que_data->result_array(); $sql_total = "SELECT COUNT(*) AS total FROM ($sql) AS x"; $que_total = $this->db->query($sql_total, [ $para['branchcode'], $keyword, $para['supplierID'] ]); if (!$que_total) { $this->sys_error_db("[Error] get total request aset"); exit; } $total = $que_total->row_array()['total']; $out = [ "records" => $data, "total" => $total ]; $this->sys_ok($out); } catch (Exception $exc) { $this->sys_error($exc->getMessage()); } } 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 { if (!$this->isLogin) { $this->sys_error("invalid token"); exit; } $user = $this->sys_user; $sql = "SELECT M_UserM_ApproveLevelID FROM m_user WHERE M_UserIsActive = 'Y' AND M_UserID = ? "; $que = $this->db->query($sql, [$user['M_UserID']]); if (!$que) { $this->sys_error_db("[Error] failed get approval level user"); exit; } $data = $que->row_array(); $this->sys_ok($data); } catch (Exception $exc) { $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; } } }