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()); } } ## 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) { $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; } } }