isLogin) { throw new Exception('invalid token'); } $sql = "SELECT SupplierID, SupplierName FROM supplier WHERE SupplierIsActive = 'Y'"; $que = $this->db->query($sql, []); if (!$que) { throw new Exception('failed to query daftar supplier', 1); } $data = $que->result_array(); $this->sys_ok($data); } catch (Exception $exc) { $msg = '[Error] ' . $exc->getMessage(); $code = $exc->getCode(); if ($code == 1) { $this->sys_error_db($msg); } else { $this->sys_error($msg); } exit(); } } public function getListCabang() { try { if (!$this->isLogin) { throw new Exception('invalid token'); } $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) { throw new Exception('failed to query data cabang', 1); } $data = $que->result_array(); $this->sys_ok($data); } catch (Exception $exc) { $msg = '[Error] ' . $exc->getMessage(); $code = $exc->getCode(); if ($code == 1) { $this->sys_error_db($msg); } else { $this->sys_error($msg); } exit(); } } public function getListGudang() { try { if (!$this->isLogin) { throw new Exception('invalid token'); } $user = $this->sys_user; $para = $this->sys_input; $sql = "SELECT WarehouseID, WarehouseCode, WarehouseName FROM warehouse WHERE WarehouseIsActive = 'Y' AND WarehouseS_RegionalID = ? AND WarehouseM_BranchID = ? AND WarehouseIsTransit = 'N'"; $que = $this->db->query($sql, [ $user['S_RegionalID'], $para['M_BranchID'], ]); if (!$que) { throw new Exception('failed to query gudang', 1); } $data = $que->result_array(); $this->sys_ok($data); } catch (Exception $exc) { $msg = '[Error] ' . $exc->getMessage(); $code = $exc->getCode(); if ($code == 1) { $this->sys_error_db($msg); } else { $this->sys_error($msg); } exit(); } } public function getRuangan() { try { if (!$this->isLogin) { throw new Exception('invalid token'); } $payload = $this->sys_input; $user = $this->sys_user; $search = $payload['search'] . '%'; $sql = "SELECT M_RuanganID, M_RuanganM_BranchID, M_RuanganName, M_RuanganCode FROM m_ruangan WHERE M_RuanganIsActive = 'Y' AND M_RuanganM_BranchID = ? AND M_RuanganName LIKE ? ORDER BY M_RuanganName ASC"; $qry = $this->db->query($sql, [$user['M_BranchID'], $search]); if (!$qry) { throw new Exception('query listing ruangan', 1); } $data = $qry->result_array(); $this->sys_ok($data); } catch (Exception $exc) { $msg = '[Error] ' . $exc->getMessage(); $code = $exc->getCode(); if ($code == 1) { $this->sys_error_db($msg); } else { $this->sys_error($msg); } exit(); } } public function getListStaff() { try { if (!$this->isLogin) { $this->sys_error('Invalid token'); exit(); } $user = $this->sys_user; $param = $this->sys_input; if ($param['isSerahTerima'] == 'Y') { $sql = "SELECT DISTINCT u.M_UserID, u.M_UserUsername FROM receive_order_po ro JOIN receive_order_po_detail rod ON rod.ReceiveOrderPoDetailReceiveOrderPoID = ro.ReceiveOrderPoID AND rod.ReceiveOrderPoDetailIsActive = 'Y' JOIN purchase_order_detail pod ON pod.PurchaseOrderDetailID = rod.ReceiveOrderPoDetailPurchaseOrderDetailID AND pod.PurchaseOrderDetailIsActive = 'Y' JOIN purchase_request pr ON pr.PurchaseRequestID = pod.PurchaseOrderDetailPurchaseRequestID AND pr.PurchaseRequestIsActive = 'Y' JOIN m_user u ON u.M_UserID = pr.PurchaseRequestRequestedBy AND u.M_UserIsActive = 'Y' WHERE ro.ReceiveOrderPoID = ? AND ro.ReceiveOrderPoIsActive = 'Y'"; $que = $this->db->query($sql, [$param['ROID']]); } else { $sql = "SELECT M_UserID, M_UserUsername FROM m_user WHERE M_UserM_BranchID = ? AND M_UserS_RegionalID = ? AND M_UserIsActive = 'Y' ORDER BY M_UserUsername"; $que = $this->db->query($sql, [$user['M_BranchID'], $user['S_RegionalID']]); } if (!$que) { $this->sys_error_db('[Error] get staff'); exit(); } $data = $que->result_array(); $this->sys_ok($data); } catch (Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } public function searchOrderAsset() { try { if (!$this->isLogin) { throw new Exception('invalid token'); } $para = $this->sys_input; $user = $this->sys_user; $keyword = '%'; if ($para['search'] != '') { $keyword .= $para['search'] . '%'; } $sql_data = "SELECT PurchaseOrderID, PurchaseOrderDate, PurchaseOrderNumber, PurchaseOrderNote, PurchaseOrderShippingCost, PurchaseOrderShippingCostStatus, PurchaseOrderAssetContractName, PurchaseOrderAssetContractDate, SupplierID, SupplierCode, SupplierName FROM purchase_order JOIN purchase_order_asset_contract ON PurchaseOrderAssetContractIsActive = 'Y' AND PurchaseOrderItemCategoryID = 3 AND PurchaseOrderAssetContractPurchaseOrderID = PurchaseOrderID AND PurchaseOrderStatus = 'Approved' AND PurchaseOrderSupplierID = ? AND PurchaseOrderS_RegionalID = ? AND PurchaseOrderWarehouseID = ? AND PurchaseOrderIsActive = 'Y' JOIN supplier ON SupplierID = PurchaseOrderSupplierID WHERE (PurchaseOrderNumber LIKE ? OR PurchaseOrderAssetContractName LIKE ?) GROUP BY PurchaseOrderID LIMIT 10"; $que_data = $this->db->query($sql_data, [ $para['supplierID'], $user['S_RegionalID'], $para['gudangID'], $keyword, $keyword, ]); if (!$que_data) { throw new Exception('failed to query data purchase order', 1); } $data = $que_data->result_array(); foreach ($data as $key => $obj) { $sql_detail = "SELECT M_ItemID, M_ItemCode, M_ItemDesc, ItemUnitID, ItemUnitCode, ItemUnitName, PurchaseOrderDetailID AS PODetailID, PurchaseOrderDetailPurchaseSummaryID AS POSummaryID, PurchaseOrderDetailPurchaseOrderID AS PurchaseOrderID, PurchaseOrderDetailQty AS qty, PoItemReceiveID, PoItemReceivePrice AS price FROM purchase_order_detail JOIN po_item_receive ON PoItemReceiveIsActive = 'Y' AND PoItemReceivePurchaseOrderDetailID = PurchaseOrderDetailID JOIN m_item ON M_ItemID = PurchaseOrderDetailItemID JOIN itemunit ON ItemUnitID = PurchaseOrderDetailItemUnitID WHERE PurchaseOrderDetailPurchaseOrderID = ? AND PurchaseOrderDetailIsActive = 'Y'"; $que_detail = $this->db->query($sql_detail, [ $obj['PurchaseOrderID'], ]); if (!$que_detail) { throw new Exception('failed to query detail po asset', 1); } $detail = $que_detail->result_array(); $data[$key]['detail'] = $detail; } $this->sys_ok($data); } catch (Exception $e) { $msg = '[Error] ' . $e->getMessage(); $code = $e->getCode(); if ($code == 1) { $this->sys_error_db($msg); } else { $this->sys_error($msg); } exit(); } } public function getListingROAsset() { try { if (!$this->isLogin) { throw new Exception('invalid token'); } $para = $this->sys_input; $user = $this->sys_user; $keyword = '%'; if ($para['search'] != '') { $keyword .= $para['search'] . '%'; } $offset = 0; $limit = 10; if ($para['currpage'] > 0) { $offset = ($para['currpage'] - 1) * $limit; } $confirmed = 'X'; if ($para['status'] === 'Confirmed') { $confirmed = 'Y'; } if ($para['status'] === 'Unconfirmed') { $confirmed = 'N'; } $sql_base = "SELECT DISTINCT ReceiveOrderPoID, ReceiveOrderPoNumber, ReceiveOrderPoIDate, ReceiveOrderPoRefNumber, ReceiveOrderPoNote, ReceiveOrderPoConfirmed, SupplierID, SupplierName, PurchaseOrderID, PurchaseOrderNumber, PurchaseOrderAssetContractID, PurchaseOrderAssetContractName, ReceiveOrderPoIsHandover FROM receive_order_po JOIN receive_order_po_detail ON ReceiveOrderPoDetailReceiveOrderPoID = ReceiveOrderPoID AND ReceiveOrderPoIDate BETWEEN DATE(?) AND DATE(?) AND (ReceiveOrderPoConfirmed = ? OR 'X' = ?) AND ReceiveOrderPoNumber LIKE ? AND ReceiveOrderPoDetailIsActive = 'Y' JOIN purchase_order ON ReceiveOrderPoDetailPurchaseOrderID = PurchaseOrderID AND PurchaseOrderItemCategoryID = 3 -- Filter category here JOIN purchase_order_asset_contract ON PurchaseOrderAssetContractPurchaseOrderID = PurchaseOrderID AND PurchaseOrderAssetContractIsActive = 'Y' JOIN m_branch ON M_BranchCode = ReceiveOrderPoM_BranchCode AND ReceiveOrderPoM_BranchCode = ? JOIN supplier ON ReceiveOrderPoSupplierID = SupplierID WHERE ReceiveOrderPoIsActive = 'Y' ORDER BY ReceiveOrderPoID DESC"; $sql_data = $sql_base . ' LIMIT ? OFFSET ? '; $que_data = $this->db->query($sql_data, [ $para['startdate'], $para['enddate'], $confirmed, $confirmed, $keyword, $user['M_BranchCode'], $limit, $offset, ]); if (!$que_data) { throw new Exception('failed to get data receive order', 1); } $data = $que_data->result_array(); $sql_total = "SELECT COUNT(*) AS total FROM ($sql_base) AS x"; $que_total = $this->db->query($sql_total, [ $para['startdate'], $para['enddate'], $confirmed, $confirmed, $keyword, $user['M_BranchCode'], ]); if (!$que_total) { throw new Exception('failed to get total data receive order', 1); } $total = $que_total->row_array()['total']; $output = [ 'records' => $data, 'total' => $total, ]; $this->sys_ok($output); } catch (Exception $exc) { $msg = '[Error] ' . $exc->getMessage(); $code = $exc->getCode(); if ($code == 1) { $this->sys_error_db($msg); } else { $this->sys_error($msg); } exit(); } } public function getListAttachment() { try { if (!$this->isLogin) { $this->sys_error('invalid token'); exit(); } $para = $this->sys_input; $sql = "SELECT ReceiveOrderPoDocumentID AS attach_id, ReceiveOrderPoDocumentFile AS img_url, ReceiveOrderPoDocumentCreated AS created FROM receive_order_po_document WHERE ReceiveOrderPoDocumentIsActive = 'Y' AND ReceiveOrderPoDocumentReceiveOrderPoID = ? AND ReceiveOrderPoDocumentType = 'aset'"; $que = $this->db->query($sql, [$para['roID']]); 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 getDetailDataROAsset() { try { if (!$this->isLogin) { $this->sys_error('invalid token'); exit(); } $para = $this->sys_input; $sql_header = "SELECT ReceiveOrderPoID, ReceiveOrderPoNumber, ReceiveOrderPoIDate AS date, ReceiveOrderPoSupplierID AS supplier, ReceiveOrderPoRefNumber AS reference, '' AS ponumber, M_BranchID AS branchID, ReceiveOrderPoWarehouseID AS gudangID, ReceiveOrderShippingCostIsPaid AS shippingIsPaid, ReceiveOrderShippingCostAmount AS shipping, ReceiveOrderPoNote AS catatan FROM receive_order_po JOIN m_branch ON M_BranchCode = ReceiveOrderPoM_BranchCode WHERE ReceiveOrderPoID = ? AND ReceiveOrderPoIsActive = 'Y'"; $que_header = $this->db->query($sql_header, [$para['roid']]); if (!$que_header) { $this->sys_error_db('[Error] failed get header data RO'); exit(); } $header = $que_header->row_array(); $sql_detail = "SELECT M_ItemID, M_ItemCode, M_ItemDesc, ItemUnitID, ItemUnitCode, ItemUnitName, ReceiveOrderPoDetailID, ReceiveOrderPoDetailPurchaseOrderID AS PurchaseOrderID, ReceiveOrderPoDetailPurchaseOrderDetailID AS PODetailID, ReceiveOrderPoDetailPurchaseOrderSummaryID AS POSummaryID, ReceiveOrderPoDetailPoItemReceiveID AS PoItemReceiveID, ReceiveOrderPoDetailQty AS qty, ReceiveOrderPoDetailPrice AS price, PurchaseOrderNumber FROM receive_order_po_detail JOIN purchase_order ON PurchaseOrderID = ReceiveOrderPoDetailPurchaseOrderID JOIN m_item ON M_ItemID = ReceiveOrderPoItemID JOIN itemunit ON ItemUnitID = ReceiveOrderPoItemUnitID WHERE ReceiveOrderPoDetailReceiveOrderPoID = ? AND ReceiveOrderPoDetailIsActive = 'Y'"; $que_detail = $this->db->query($sql_detail, [$para['roid']]); if (!$que_detail) { $this->sys_error_db('[Error] failed to get detail data ro'); exit(); } $detail = $que_detail->result_array(); $uniquePoNumbers = []; foreach ($detail as $obj) { $poNumber = $obj['PurchaseOrderNumber']; if ($poNumber !== null && $poNumber !== '' && !in_array($poNumber, $uniquePoNumbers, true)) { $uniquePoNumbers[] = $poNumber; } } $header['ponumber'] = implode(', ', $uniquePoNumbers); foreach ($detail as $key => $obj) { $sql_inspeksi = "SELECT ReceiveOrderPoInspeksiID AS inspeksiID, ReceiveOrderPoInspeksiReceiveOrderPoDetailID AS roID, ReceiveOrderPoInspeksiQtyPesan AS qty_po, ReceiveOrderPoInspeksiQtyActual AS qty_ro, ReceiveOrderPoInspeksiDatePesan AS date_po, ReceiveOrderPoInspeksiDateActual AS date_ro, ReceiveOrderPoInspeksiKeadaanKemasan AS condt_kemasan, ReceiveOrderPoInspeksiKeadaanKemasanNote AS catatan_kemasan, ReceiveOrderPoInspeksiKondisiPengiriman AS condt_pengiriman, ReceiveOrderPoInspeksiKondisiPengirimanNote AS catatan_kirim, ReceiveOrderPoInspeksiSimpulan AS summary, ReceiveOrderPoInspeksiCatatan AS catatan, ReceiveOrderPoInspeksiStaffPenerimaID AS pemeriksa, ReceiveOrderPoInspeksiPengirim AS pengirim FROM receive_order_po_inspeksi WHERE ReceiveOrderPoInspeksiReceiveOrderPoDetailID = ? AND ReceiveOrderPoInspeksiIsActive = 'Y'"; $que_inspeksi = $this->db->query($sql_inspeksi, [ $obj['ReceiveOrderPoDetailID'], ]); if (!$que_inspeksi) { $this->sys_error_db('[Error] failed to get data inspeksi ro'); exit(); } $detail[$key]['inspeksi'] = $que_inspeksi->row_array(); } $this->sys_ok([ 'header' => $header, 'detail' => $detail, ]); } catch (Exception $exc) { $this->sys_error($exc->getMessage()); } } public function getAssetBelumSerahTerima() { try { if (!$this->isLogin) { throw new Exception('invalid token'); } $para = $this->sys_input; $sql = "SELECT rod.ReceiveOrderPoDetailID, rod.ReceiveOrderPoItemID, rod.ReceiveOrderPoItemUnitID, mi.M_ItemDesc, rod.ReceiveOrderPoDetailQty AS originalQty, COALESCE(ahd_count.InsertedQty, 0) AS serahQty, rod.ReceiveOrderPoDetailQty - COALESCE(ahd_count.InsertedQty, 0) AS sisaQty, CASE WHEN COALESCE(ahd_count.InsertedQty, 0) = rod.ReceiveOrderPoDetailQty THEN 'Y' ELSE 'N' END AS isHandoverDone FROM receive_order_po_detail rod JOIN m_item mi ON mi.M_ItemID = rod.ReceiveOrderPoItemID LEFT JOIN ( SELECT AssetHandoverDetailReceiveOrderPoDetailID, COUNT(*) AS InsertedQty FROM asset_handover_detail ahd JOIN asset_handover ah ON ahd.AssetHandoverDetailAssetHandoverID = ah.AssetHandoverID AND ah.AssetHandoverIsActive = 'Y' WHERE ahd.AssetHandoverDetailIsActive = 'Y' AND ah.AssetHandoverReceiveOrderPoID = ? GROUP BY AssetHandoverDetailReceiveOrderPoDetailID ) ahd_count ON ahd_count.AssetHandoverDetailReceiveOrderPoDetailID = rod.ReceiveOrderPoDetailID WHERE rod.ReceiveOrderPoDetailReceiveOrderPoID = ? AND rod.ReceiveOrderPoDetailIsActive = 'Y'"; $que = $this->db->query($sql, [$para['ROID'], $para['ROID']]); if (!$que) { throw new Exception('listing asset belum yg diserah terima', 1); } $data = $que->result_array(); $this->sys_ok($data); } catch (Exception $e) { $message = $e->getMessage(); $code = $e->getCode(); if ($code == 1) { $this->sys_error_db('[Error] ' . $message); } else { $this->sys_error('[Error] ' . $message); } exit(); } } public function getBarcodes() { try { if (!$this->isLogin) { throw new Exception('invalid token'); } $param = $this->sys_input; $sql = "SELECT T_BarcodeBarangID as id, T_BarcodeBarangNumber, M_ItemDesc, M_BranchName, M_RuanganName, 'N' as chex FROM t_barcode_barang JOIN m_item ON M_ItemID = T_BarcodeBarangM_ItemID JOIN m_branch ON M_BranchID = T_BarcodeBarangM_BranchID JOIN m_ruangan ON M_RuanganID = T_BarcodeBarangM_RuanganID WHERE T_BarcodeBarangReceiveOrderPoID = ? AND T_BarcodeBarangIsActive = 'Y' ORDER BY T_BarcodeBarangID"; $que = $this->db->query($sql, [$param['ROID']]); if (!$que) { throw new Exception('failed query barcode item', 1); } $data = $que->result_array(); if ($data) { foreach ($data as $key => $value) { if ($value['chex'] == 'N') { $data[$key]['chex'] = false; } else { $data[$key]['chex'] = true; } } } $this->sys_ok($data); } catch (Exception $e) { $this->db->trans_rollback(); $msg = '[Error] ' . $e->getMessage(); $code = $e->getCode(); if ($code == 1) { $this->sys_error_db($msg); } else { $this->sys_error($msg); } exit(); } } // # MUTATION ## public function generatePOItemReceive() { try { if (!$this->isLogin) { throw new Exception('invalid token'); } $this->db->trans_begin(); $para = $this->sys_input; $user = $this->sys_user; $sql_po = 'SELECT * FROM purchase_order WHERE PurchaseOrderID = ?'; $que_po = $this->db->query($sql_po, [$para['poID']]); if (!$que_po) { $this->db->trans_rollback(); throw new Exception('failed to get data PO', 1); } $data_po = $que_po->row_array(); if ($data_po['PurchaseOrderStatus'] != 'Approved') { $this->db->trans_rollback(); throw new Exception('status PO isnt approved yet'); } $sql_detailpo = "SELECT IFNULL(PoItemReceiveID, 0) as receivedID, IFNULL(PoItemReceiveQtyReceived, 0) as qtyReceived, PurchaseOrderSummaryID as orderSummaryID, PurchaseOrderDetailWarehouseID as gudangID, PurchaseOrderSummaryItemID as itemID, PurchaseOrderSummaryItemUnitID as itemUnitID, PurchaseOrderSummaryQty as qty, PurchaseOrderSummaryPrice as price, m_itemDesc as itemName, ItemUnitName as itemUnitName, PurchaseOrderDetailID FROM purchase_order_summary JOIN purchase_order_detail ON PurchaseOrderSummaryItemID = PurchaseOrderDetailItemID AND PurchaseOrderDetailPurchaseOrderID = PurchaseOrderSummaryPurchaseOrderID AND PurchaseOrderSummaryItemUnitID = PurchaseOrderDetailItemUnitID AND PurchaseOrderDetailIsActive = 'Y' JOIN m_item ON PurchaseOrderSummaryItemID = M_ItemID JOIN itemunit ON PurchaseOrderSummaryItemUnitID = ItemUnitID LEFT JOIN po_item_receive ON PurchaseOrderSummaryItemID = PoItemReceiveItemID AND PurchaseOrderSummaryPurchaseOrderID = PoItemReceivePurchaseOrderID WHERE PurchaseOrderSummaryPurchaseOrderID = ? AND PurchaseOrderSummaryIsActive = 'Y' AND IFNULL(PoItemReceiveQtyReceived, 0) = 0"; $que_detailpo = $this->db->query($sql_detailpo, [$para['poID']]); if (!$que_detailpo) { $this->db->trans_rollback(); throw new Exception('failed to get current po detail data', 1); } $data_detailpo = $que_detailpo->result_array(); foreach ($data_detailpo as $key => $ele) { $sql_itemrec = 'INSERT INTO po_item_receive ( PoItemReceivePurchaseOrderID, PoItemReceivePurchaseOrderSummaryID, PoItemReceivePurchaseOrderDetailID, PoItemReceiveWarehouseID, PoItemReceiveItemID, PoItemReceiveItemUnitID, PoItemReceiveQty, PoItemReceiveQtyReceived, PoItemReceiveCreated, PoItemReceiveCreatedUserID, PoItemReceivePrice ) VALUES (?,?,?,?,?,?,?,0,NOW(),?,?)'; $que_itemrec = $this->db->query($sql_itemrec, [ $para['poID'], $ele['orderSummaryID'], $ele['PurchaseOrderDetailID'], $ele['gudangID'], $ele['itemID'], $ele['itemUnitID'], $ele['qty'], $user['M_UserID'], $ele['price'], ]); if (!$que_itemrec) { $this->db->trans_rollback(); throw new Exception('failed to insert into po item receive', 1); } } $this->db->trans_commit(); $this->sys_ok('[success] generate data po item receive'); } catch (Exception $e) { $msg = '[Error] ' . $e->getMessage(); $code = $e->getCode(); if ($code == 1) { $this->sys_error_db($msg); } else { $this->sys_error($msg); } exit(); } } public function createReceiveOrder() { try { if (!$this->isLogin) { throw new Exception('invalid token'); } $this->db->trans_begin(); $param = $this->sys_input; $user = $this->sys_user; // generate nomor purchase invoice # $numGR = $this->generateNoLogistik($user, 'GR'); // insert table ro # $sqlInsRO = 'INSERT INTO receive_order_po ( ReceiveOrderPoNumber, ReceiveOrderPoSupplierID, ReceiveOrderPoIDate, ReceiveOrderPoWarehouseID, ReceiveOrderPoM_BranchCode, ReceiveOrderPoS_RegionalID, ReceiveOrderShippingCostAmount, ReceiveOrderShippingCostIsPaid, ReceiveOrderPoNote, ReceiveOrderPoRefNumber, ReceiveOrderPoDONumber, ReceiveOrderPoTypePurchase, ReceiveOrderPoCreatedUserID ) SELECT ?, ?, ?, ?, b.M_BranchCode, ?, ?, ?, ?, ?, ?, ?, ? FROM m_branch b WHERE b.M_BranchID = ?'; $queInsRO = $this->db->query($sqlInsRO, [ $numGR, $param['supplier'], $param['date'], $param['gudangID'], $user['S_RegionalID'], $param['shipping'], $param['shippingIsPaid'], $param['catatan'], $param['reference'], $param['reference'], 'aset', $user['M_UserID'], $param['branchID'] ]); if (!$queInsRO) { $this->db->trans_rollback(); throw new Exception('failed to insert table receive order po', 1); } $roID = $this->db->insert_id(); // inset to table ro detail # foreach ($param['detail'] as $key => $obj) { $sqlRcvdItem = 'SELECT * FROM po_item_receive WHERE PoItemReceiveID = ?'; $queRcvdItem = $this->db->query($sqlRcvdItem, [$obj['PoItemReceiveID']]); if (!$queRcvdItem) { $this->db->trans_rollback(); throw new Exception('failed query po item receive', 1); } $cekReceived = $queRcvdItem->row_array(); // cek item received # if ($cekReceived['PoItemReceiveIsActive'] == 'N') { $this->db->trans_rollback(); throw new Exception('failed to check po item receive is active'); } if ($cekReceived['PoItemReceiveQtyReceived'] == $cekReceived['PoItemReceiveQty']) { $this->db->trans_rollback(); throw new Exception("item {$obj['M_ItemDesc']} sudah diterima semua"); } if (intval($obj['qty']) > intval($cekReceived['PoItemReceiveQty'])) { $this->db->trans_rollback(); throw new Exception( "jumlah item {$obj['M_ItemDesc']} yang tesedia sudah berubah, silakan pilih ulang item" ); } $sql_insde = 'INSERT INTO receive_order_po_detail ( ReceiveOrderPoDetailReceiveOrderPoID, ReceiveOrderPoDetailPurchaseOrderID, ReceiveOrderPoDetailPurchaseOrderSummaryID, ReceiveOrderPoDetailPurchaseOrderDetailID, ReceiveOrderPoDetailPoItemReceiveID, ReceiveOrderPoDetailQty, ReceiveOrderPoDetailPrice, ReceiveOrderPoDetailTotal, ReceiveOrderPoItemID, ReceiveOrderPoItemUnitID, ReceiveOrderPoDetailCreatedUserID ) VALUES (?,?,?,?,?,?,?,?,?,?,?)'; $que_insde = $this->db->query($sql_insde, [ $roID, $obj['PurchaseOrderID'], $obj['POSummaryID'], $obj['PODetailID'], $obj['PoItemReceiveID'], $obj['qty'], $obj['price'], doubleval($obj['price']) * intval($obj['qty']), $obj['M_ItemID'], $obj['ItemUnitID'], $user['M_UserID'], ]); if (!$que_insde) { $this->db->trans_rollback(); throw new Exception('failed to inset table receive order po detail', 1); } $ROdetailID = $this->db->insert_id(); $inspeksi = $obj['inspeksi']; $sql_inspeksi = 'INSERT INTO receive_order_po_inspeksi ( ReceiveOrderPoInspeksiReceiveOrderPoDetailID, ReceiveOrderPoInspeksiQtyPesan, ReceiveOrderPoInspeksiQtyActual, ReceiveOrderPoInspeksiDatePesan, ReceiveOrderPoInspeksiDateActual, ReceiveOrderPoInspeksiKeadaanKemasan, ReceiveOrderPoInspeksiKeadaanKemasanNote, ReceiveOrderPoInspeksiKondisiPengiriman, ReceiveOrderPoInspeksiKondisiPengirimanNote, ReceiveOrderPoInspeksiSimpulan, ReceiveOrderPoInspeksiCatatan, ReceiveOrderPoInspeksiStaffPenerimaID, ReceiveOrderPoInspeksiPengirim, ReceiveOrderPoInspeksiUserID ) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)'; $que_inspeksi = $this->db->query($sql_inspeksi, [ $ROdetailID, $inspeksi['qty_po'], $inspeksi['qty_ro'], $inspeksi['date_po'], $inspeksi['date_ro'], $inspeksi['condt_kemasan'], $inspeksi['catatan_kemasan'], $inspeksi['condt_pengiriman'], $inspeksi['catatan_kirim'], $inspeksi['summary'], $inspeksi['catatan'], $inspeksi['pemeriksa'], $inspeksi['pengirim'], $user['M_UserID'], ]); if (!$que_inspeksi) { $this->db->trans_rollback(); throw new Exception('failed to insert table receive order po inspeksi', 1); } } $this->db->trans_commit(); $this->sys_ok('[Success] create receive order asset'); } catch (Exception $e) { $msg = '[Error] ' . $e->getMessage(); $code = $e->getCode(); if ($code == 1) { $this->sys_error_db($msg); } else { $this->sys_error($msg); } exit(); } } public function editReceivedOrder() { try { if (!$this->isLogin) { throw new Exception('invalid token'); } $this->db->trans_begin(); $param = $this->sys_input; $user = $this->sys_user; if (empty($param['ReceiveOrderPoID'])) { throw new Exception('ReceiveOrderPoID is required'); } if (!isset($param['detail']) || !is_array($param['detail'])) { throw new Exception('detail is required'); } $roID = $param['ReceiveOrderPoID']; // update receive order header # $sqlHeader = "UPDATE receive_order_po r JOIN m_branch b ON b.M_BranchID = ? SET r.ReceiveOrderPoNumber = ?, r.ReceiveOrderPoSupplierID = ?, r.ReceiveOrderPoIDate = ?, r.ReceiveOrderPoWarehouseID = ?, r.ReceiveOrderPoM_BranchCode = b.M_BranchCode, r.ReceiveOrderPoS_RegionalID = ?, r.ReceiveOrderShippingCostAmount = ?, r.ReceiveOrderShippingCostIsPaid = ?, r.ReceiveOrderPoNote = ?, r.ReceiveOrderPoRefNumber = ?, r.ReceiveOrderPoDONumber = ? WHERE r.ReceiveOrderPoID = ? AND r.ReceiveOrderPoIsActive = 'Y'"; $queHeader = $this->db->query($sqlHeader, [ $param['branchID'], $param['ReceiveOrderPoNumber'], $param['supplier'], $param['date'], $param['gudangID'], $user['S_RegionalID'], $param['shipping'], $param['shippingIsPaid'], $param['catatan'], $param['reference'], $param['reference'], $roID, ]); if (!$queHeader) { throw new Exception('failed to update table receive order po', 1); } // soft delete the existing receive order details # $sqlDetailInactive = "UPDATE receive_order_po_detail SET ReceiveOrderPoDetailIsActive = 'N', ReceiveOrderPoDetailDeletedUserID = ?, ReceiveOrderPoDetailDeleted = NOW() WHERE ReceiveOrderPoDetailReceiveOrderPoID = ? AND ReceiveOrderPoDetailIsActive = 'Y'"; $queDetailInactive = $this->db->query($sqlDetailInactive, [ $user['M_UserID'], $roID, ]); if (!$queDetailInactive) { throw new Exception('failed to soft delete receive order po detail', 1); } // soft delete the inspections belonging to the existing details # $sqlInspeksiInactive = "UPDATE receive_order_po_inspeksi JOIN receive_order_po_detail ON ReceiveOrderPoDetailID = ReceiveOrderPoInspeksiReceiveOrderPoDetailID SET ReceiveOrderPoInspeksiIsActive = 'N', ReceiveOrderPoInspeksiUserID = ?, ReceiveOrderPoInspeksiDeleted = NOW() WHERE ReceiveOrderPoDetailReceiveOrderPoID = ? AND ReceiveOrderPoInspeksiIsActive = 'Y'"; $queInspeksiInactive = $this->db->query($sqlInspeksiInactive, [ $user['M_UserID'], $roID, ]); if (!$queInspeksiInactive) { throw new Exception('failed to soft delete receive order po inspeksi', 1); } // re-insert receive order details and their inspection forms # foreach ($param['detail'] as $obj) { if (!isset($obj['inspeksi']) || !is_array($obj['inspeksi'])) { throw new Exception("inspection data is required for item {$obj['M_ItemDesc']}"); } $sqlDetail = 'INSERT INTO receive_order_po_detail ( ReceiveOrderPoDetailReceiveOrderPoID, ReceiveOrderPoDetailPurchaseOrderID, ReceiveOrderPoDetailPurchaseOrderSummaryID, ReceiveOrderPoDetailPurchaseOrderDetailID, ReceiveOrderPoDetailPoItemReceiveID, ReceiveOrderPoDetailQty, ReceiveOrderPoDetailPrice, ReceiveOrderPoDetailTotal, ReceiveOrderPoItemID, ReceiveOrderPoItemUnitID, ReceiveOrderPoDetailCreatedUserID ) VALUES (?,?,?,?,?,?,?,?,?,?,?)'; $queDetail = $this->db->query($sqlDetail, [ $roID, $obj['PurchaseOrderID'], $obj['POSummaryID'], $obj['PODetailID'], $obj['PoItemReceiveID'], $obj['qty'], $obj['price'], doubleval($obj['price']) * intval($obj['qty']), $obj['M_ItemID'], $obj['ItemUnitID'], $user['M_UserID'], ]); if (!$queDetail) { throw new Exception('failed to insert table receive order po detail', 1); } $roDetailID = $this->db->insert_id(); $inspeksi = $obj['inspeksi']; $sqlInspeksi = 'INSERT INTO receive_order_po_inspeksi ( ReceiveOrderPoInspeksiReceiveOrderPoDetailID, ReceiveOrderPoInspeksiQtyPesan, ReceiveOrderPoInspeksiQtyActual, ReceiveOrderPoInspeksiDatePesan, ReceiveOrderPoInspeksiDateActual, ReceiveOrderPoInspeksiKeadaanKemasan, ReceiveOrderPoInspeksiKeadaanKemasanNote, ReceiveOrderPoInspeksiKondisiPengiriman, ReceiveOrderPoInspeksiKondisiPengirimanNote, ReceiveOrderPoInspeksiSimpulan, ReceiveOrderPoInspeksiCatatan, ReceiveOrderPoInspeksiStaffPenerimaID, ReceiveOrderPoInspeksiPengirim, ReceiveOrderPoInspeksiUserID ) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)'; $queInspeksi = $this->db->query($sqlInspeksi, [ $roDetailID, $inspeksi['qty_po'], $inspeksi['qty_ro'], $inspeksi['date_po'], $inspeksi['date_ro'], $inspeksi['condt_kemasan'], $inspeksi['catatan_kemasan'], $inspeksi['condt_pengiriman'], $inspeksi['catatan_kirim'], $inspeksi['summary'], $inspeksi['catatan'], $inspeksi['pemeriksa'], $inspeksi['pengirim'], $user['M_UserID'], ]); if (!$queInspeksi) { throw new Exception('failed to insert table receive order po inspeksi', 1); } } $this->db->trans_commit(); $this->sys_ok('[Success] edit receive order asset'); } catch (Exception $e) { $this->db->trans_rollback(); $msg = '[Error] ' . $e->getMessage(); if ($e->getCode() == 1) { $this->sys_error_db($msg); } else { $this->sys_error($msg); } exit(); } } public function deleteReceiveOrder() { try { if (!$this->isLogin) { throw new Exception('invalid token'); } $this->db->trans_begin(); $para = $this->sys_input; $user = $this->sys_user; $roID = $para['roid']; // soft delete table receive order po # $sql_del = "UPDATE receive_order_po SET ReceiveOrderPoIsActive = 'N', ReceiveOrderPoDeleted = NOW(), ReceiveOrderPoDeletedUserID = ? WHERE ReceiveOrderPoID = ?"; $que_del = $this->db->query($sql_del, [ $user['M_UserID'], $roID, ]); if (!$que_del) { $this->db->trans_rollback(); throw new Exception('failed to soft delete receive order po', 1); } $sql_deldet = "UPDATE receive_order_po_detail SET ReceiveOrderPoDetailIsActive = 'N', ReceiveOrderPoDetailDeletedUserID = ?, ReceiveOrderPoDetailDeleted = NOW() WHERE ReceiveOrderPoDetailReceiveOrderPoID = ?"; $que_deldet = $this->db->query($sql_deldet, [ $user['M_UserID'], $roID, ]); if (!$que_deldet) { $this->db->trans_rollback(); throw new Exception('failed to soft delete RO detail', 1); } $sql_inspek = "UPDATE receive_order_po_inspeksi JOIN receive_order_po_detail ON ReceiveOrderPoDetailID = ReceiveOrderPoInspeksiReceiveOrderPoDetailID SET ReceiveOrderPoInspeksiIsActive = 'N', ReceiveOrderPoInspeksiUserID = ?, ReceiveOrderPoInspeksiDeleted = NOW() WHERE ReceiveOrderPoDetailReceiveOrderPoID = ?"; $que_inspek = $this->db->query($sql_inspek, [ $user['M_UserID'], $roID, ]); if (!$que_inspek) { $this->db->trans_rollback(); throw new Exception('failed to soft delete table inspeksi ro', 1); } $sql_attachment = "UPDATE receive_order_po_document SET ReceiveOrderPoDocumentIsActive = 'N', ReceiveOrderPoDocumentLastUpdated = NOW(), ReceiveOrderPoDocumentUserID = ? WHERE ReceiveOrderPoDocumentReceiveOrderPoID = ? AND ReceiveOrderPoDocumentType = 'aset'"; $que_attachment = $this->db->query($sql_attachment, [ $user['M_UserID'], $roID, ]); if (!$que_attachment) { $this->db->trans_rollback(); throw new Exception('failed to soft delete ro document', 1); } $this->db->trans_commit(); $this->sys_ok('[success] delete receive order'); } catch (Exception $e) { $msg = '[Error] ' . $e->getMessage(); $code = $e->getCode(); if ($code == 1) { $this->sys_error_db($msg); } else { $this->sys_error($msg); } exit(); } } public function confirmReceiveOrder() { try { if (!$this->isLogin) { throw new Exception('invalid token'); } $this->db->trans_begin(); $para = $this->sys_input; $user = $this->sys_user; $roID = $para['roid']; // DATA ORDER # $sql_dataro = 'SELECT receive_order_po.*, SupplierName FROM receive_order_po JOIN supplier ON ReceiveOrderPoSupplierID = SupplierID WHERE ReceiveOrderPoID = ?'; $que_dataro = $this->db->query($sql_dataro, [$roID]); if (!$que_dataro) { $this->db->trans_rollback(); throw new Exception('failed to get dara receive order', 1); } $data_ro = $que_dataro->row_array(); $sql_detailro = "SELECT receive_order_po_detail.*, PurchaseOrderID, PurchaseOrderNumber, PurchaseOrderTaxPercentPph, PurchaseOrderTaxPercentPpn, PurchaseOrderSummaryDiscountAmount as DiscountPerItem, PurchaseOrderSummaryQty as QtyAllPO, PurchaseOrderSummaryTotal as TotalAllPO, PurchaseOrderDiscountPercent AS DiscPOPercent, PurchaseOrderDiscountAmount AS DiscPORupiah, M_ItemItem_CategoryID FROM receive_order_po_detail JOIN purchase_order ON ReceiveOrderPoDetailPurchaseOrderID = PurchaseOrderID JOIN purchase_order_summary ON ReceiveOrderPoDetailPurchaseOrderSummaryID = PurchaseOrderSummaryID AND PurchaseOrderSummaryIsActive = 'Y' JOIN m_item ON M_ItemID = ReceiveOrderPoItemID AND M_ItemIsActive = 'Y' WHERE ReceiveOrderPoDetailReceiveOrderPoID = ? AND ReceiveOrderPoDetailIsActive='Y' GROUP BY ReceiveOrderPoDetailID"; $que_detailro = $this->db->query($sql_detailro, [$roID]); if (!$que_detailro) { $this->db->trans_rollback(); throw new Exception('failed get detail data current RO', 1); } $detail_ro = $que_detailro->result_array(); // UPDATE STATUS RO # $sql_updatero = "UPDATE receive_order_po SET ReceiveOrderPoConfirmed = 'Y', ReceiveOrderPoConfirmedDate = NOW(), ReceiveOrderPoConfirmedUserID = ? WHERE ReceiveOrderPoID = ?"; $que_updatero = $this->db->query($sql_updatero, [$user['M_UserID'], $roID]); if (!$que_updatero) { $this->db->trans_rollback(); throw new Exception('failed to update status confirmed ro', 1); } // PREPARE DATA FOR JURNAL # $sql_nojurnal = "SELECT `fn_numbering`('J') AS numbering"; $que_nojurnal = $this->db->query($sql_nojurnal, []); if (!$que_nojurnal) { $this->db->trans_rollback(); throw new Exception('failed to generate no jurnal', 1); } $nojurnal = $que_nojurnal->row_array()['numbering']; $sql_periode = "SELECT periodeID FROM periode WHERE DATE(NOW()) BETWEEN periodeStartDate AND periodeEndDate AND periodeIsActive = 'Y' AND periodeIsClosed = 'N'"; $que_periode = $this->db->query($sql_periode, []); if (!$que_periode) { $this->db->trans_rollback(); throw new Exception('failed get periode data', 1); } if ($que_periode->num_rows() === 0) { $this->db->trans_rollback(); throw new Exception('waktu periode tidak ditemukan', 1); } $periode_jurnal = $que_periode->row_array()['periodeID']; $sql_typejurnal = "SELECT JurnalTypeID FROM jurnal_type WHERE JurnalTypeCode = ? AND JurnalTypeIsActive = 'Y'"; $que_typejurnal = $this->db->query($sql_typejurnal, ['AUTOGOODRECEIVE']); if (!$que_typejurnal) { $this->db->trans_rollback(); throw new Exception('failed to get jurnal type', 1); } if ($que_typejurnal->num_rows() === 0) { $this->db->trans_rollback(); throw new Exception('tipe jurnal tidak ditemukan', 1); } $typejurnal = $que_typejurnal->row_array()['JurnalTypeID']; // INSERT JURNAL HEADER # $title = "Jurnal Pemakaian Jasa RO {$data_ro['ReceiveOrderPoNumber']} "; $title .= "pada tanggal {$data_ro['ReceiveOrderPoIDate']}"; $desc = "Referensi dari PO {$data_ro['ReceiveOrderPoRefNumber']} "; $desc .= "dari supplier {$data_ro['SupplierName']}"; $sql_headerjurnal = 'INSERT INTO jurnal ( jurnalM_BranchCompanyID, JurnalS_RegionalID, jurnalM_BranchCode, jurnalperiodeID, jurnalNo, jurnalTitle, jurnalDescription, jurnalDate, jurnalJurnalTypeID, jurnalM_UserID ) VALUES (?,?,?,?,?,?,?,NOW(),?,?)'; $que_headerjurnal = $this->db->query($sql_headerjurnal, [ $user['M_BranchCompanyID'], $user['S_RegionalID'], $user['M_BranchCode'], $periode_jurnal, $nojurnal, $title, $desc, $typejurnal, $user['M_UserID'], ]); if (!$que_headerjurnal) { $this->db->trans_rollback(); throw new Exception('failed to insert into jurnal header', 1); } $jurnalID = $this->db->insert_id(); // INSERT JURNAL TX # $total_debet = 0.00; $total_diskonitem = 0.00; $total_diskonpo = 0.00; foreach ($detail_ro as $key => $elem) { $sql_itemdata = 'SELECT * FROM m_item WHERE M_ItemID = ?'; $que_itemdata = $this->db->query($sql_itemdata, [$elem['ReceiveOrderPoItemID']]); if (!$que_itemdata) { $this->db->trans_rollback(); throw new Exception('failed to get data item', 1); } $itemdata = $que_itemdata->row_array(); /* cek kategori item */ if (empty($itemdata['M_ItemFa_ClassID'])) { $desc = "FA class {$itemdata['M_ItemDesc']} tidak ditemukan pada "; $desc .= "PO {$elem['PurchaseOrderNumber']}"; $this->db->trans_rollback(); throw new Exception($desc, 1); } $sql_coaitem = 'SELECT Fa_ClassCoaID, Fa_ClassCoaDesc FROM fa_class WHERE Fa_ClassID = ?'; $que_coaitem = $this->db->query($sql_coaitem, $itemdata['M_ItemFa_ClassID']); if (!$que_coaitem) { $this->db->trans_rollback(); throw new Exception('failed to get coa asset', 1); } $coa_asset = $que_coaitem->row_array(); if ($que_coaitem->num_rows() <= 0) { $this->db->trans_rollback(); throw new Exception("asset {$itemdata['M_ItemDesc']} belum di map coa asset"); } $debet = doubleval($elem['ReceiveOrderPoDetailTotal']); $total_debet = round($total_debet + $debet, 2); /* INSERT table jurnal tx item */ $sql_jurnaltx = 'INSERT INTO jurnal_tx ( jurnalTxJurnalID, jurnalTxCoaID, jurnalTxDescription, jurnalTxDebit, jurnalTxCredit, jurnalTxM_UserID ) VALUES (?,?,?,?,?,?)'; $que_jurnaltx = $this->db->query($sql_jurnaltx, [ $jurnalID, $coa_asset['Fa_ClassCoaID'], $coa_asset['Fa_ClassCoaDesc'], $debet, 0, $user['M_UserID'], ]); if (!$que_jurnaltx) { $this->db->trans_rollback(); throw new Exception("[Error] failed insert jurnaltx {$itemdata['M_ItemDesc']}", 1); } $jurnalTXID = $this->db->insert_id(); /* INSERT table jurnal addon item */ $sql_jurnaladdon = "INSERT INTO jurnal_addon ( jurnalAddOnJurnalID, jurnalAddOnJurnalTxID, jurnalAddOnCode, jurnalAddOnValue, jurnalAddOnM_ItemID, jurnalAddOnCreated, jurnalAddOnCreatedUserID ) VALUES (?,?,'PONUMB',?,?,NOW(),?)"; $que_jurnaladdon = $this->db->query($sql_jurnaladdon, [ $jurnalID, $jurnalTXID, $elem['PurchaseOrderNumber'], $elem['ReceiveOrderPoItemID'], $user['M_UserID'], ]); if (!$que_jurnaladdon) { $this->db->trans_rollback(); throw new Exception("[Error] failed insert jurnal addon {$itemdata['M_ItemDesc']}", 1); } /* INSERT table jurnal tx kredit diskon per item */ $sql_qtypo = "SELECT SUM(subquery.PurchaseOrderSummaryQty) as totalAllQtyPO, SUM(subquery.PurchaseOrderSummaryTotal) as totalAllPricePO FROM ( SELECT PurchaseOrderSummaryQty, PurchaseOrderSummaryTotal FROM receive_order_po_detail JOIN purchase_order_summary ON PurchaseOrderSummaryIsActive = 'Y' AND PurchaseOrderSummaryPurchaseOrderID = ReceiveOrderPoDetailPurchaseOrderID WHERE ReceiveOrderPoDetailReceiveOrderPoID = ? GROUP BY PurchaseOrderSummaryID ) AS subquery"; $que_qtypo = $this->db->query($sql_qtypo, [$roID]); if (!$que_qtypo) { $this->db->trans_rollback(); throw new Exception('[Error] get detail qty & price po', 1); } $data_po = $que_qtypo->row_array(); /* kalkulasi diskon per item */ $diskon = round(intval($elem['ReceiveOrderPoDetailQty']) * floatval($elem['DiscountPerItem']), 2); $total_diskonitem = round($total_diskonitem + $diskon, 2); /* kalkulasi diskon prorata PO per item */ $diskon_po = doubleval($elem['DiscPORupiah']); if (doubleval($elem['DiscPOPercent']) != 0.00) { $diskon_po = (doubleval($data_po['totalAllPricePO']) * doubleval($elem['DiscPOPercent'])) / 100; } $besarDiskonPO = ($diskon_po * doubleval($elem['TotalAllPO'])); $diskon_proratapo = $besarDiskonPO / doubleval($data_po['totalAllPricePO']); $ratioQty = (intval($elem['ReceiveOrderPoDetailQty']) / intval($elem['QtyAllPO'])); $diskon_prorata_item = round($ratioQty * $diskon_proratapo, 2); $total_diskonpo = round($total_diskonpo + $diskon_prorata_item, 2); $input_diskon = [$diskon, $diskon_prorata_item]; /* get account diskon */ $sql_coadiskon = 'SELECT * FROM coa WHERE coaAccountNo = ? LIMIT 1'; $que_coadiskon = $this->db->query($sql_coadiskon, ['2190100001']); if (!$que_coadiskon) { $this->db->trans_rollback(); throw new Exception('[Error] failed get account diskon', 1); } $coa_diskon = $que_coadiskon->row_array(); foreach ($input_diskon as $idx => $val) { if (doubleval($val) <= 0.00) { continue; } $que_jurnaltx = $this->db->query($sql_jurnaltx, [ $jurnalID, $coa_diskon['coaID'], $coa_diskon['coaDescription'], 0, $val, $user['M_UserID'], ]); if (!$que_jurnaltx) { $this->db->trans_rollback(); throw new Exception('[Error] failed insert jurnal tx diskon', 1); } $jurnalTXID_diskon = $this->db->insert_id(); $que_jurnaladdon = $this->db->query($sql_jurnaladdon, [ $jurnalID, $jurnalTXID_diskon, $elem['PurchaseOrderNumber'], $elem['ReceiveOrderPoItemID'], $user['M_UserID'], ]); if (!$que_jurnaladdon) { $this->db->trans_rollback(); throw new Exception('[Error] failed insert jurnal addon diskon', 1); } } /* save diskon prorata item */ $sql_saveprorate = 'UPDATE receive_order_po_detail SET ReceiveOrderPoDetailDiskonPoProrata = ? WHERE ReceiveOrderPoDetailID = ?'; $que_saveprorate = $this->db->query($sql_saveprorate, [ $diskon_prorata_item, $elem['ReceiveOrderPoDetailID'], ]); if (!$que_saveprorate) { $this->db->trans_rollback(); throw new Exception('[Error] save diskon prorate', 1); } /* handling table stock */ $sql_cekstock = 'SELECT * FROM stock s JOIN m_item i ON s.StockItemID = i.M_ItemID WHERE s.StockItemID = ? AND s.StockItemUnitID = ? AND s.StockWarehouseID = ? AND i.M_ItemItem_CategoryID = ?'; $que_cekstock = $this->db->query($sql_cekstock, [ $elem['ReceiveOrderPoItemID'], $elem['ReceiveOrderPoItemUnitID'], $data_ro['ReceiveOrderPoWarehouseID'], $elem['M_ItemItem_CategoryID'], ]); if (!$que_cekstock) { $this->db->trans_rollback(); throw new Exception('[Error] failed to check item exist in stock', 1); } $stock_exist = $que_cekstock->row_array(); $stock_ID = $stock_exist['StockID']; $stock_qty_ori = intval($stock_exist['StockQty']); $stock_price = doubleval($stock_exist['StockItemPrice']); $stock_qty_end = 0; if (!empty($stock_exist)) { $stock_qty_end = $stock_qty_ori + intval($elem['ReceiveOrderPoDetailQty']); $all_price = ($stock_qty_ori * $stock_price) + (intval($elem['ReceiveOrderPoDetailQty']) * doubleval($elem['ReceiveOrderPoDetailPrice'])); $avg_price = round($all_price / $stock_qty_end, 2); $sql_update_stock = 'UPDATE stock SET StockItemPrice = ?, StockQty = ?, StockLastUpdated = NOW(), StockUserID = ? WHERE StockID = ?'; $que_update_stock = $this->db->query($sql_update_stock, [ $avg_price, $stock_qty_end, $user['M_UserID'], $stock_ID, ]); if (!$que_update_stock) { $this->db->trans_rollback(); throw new Exception('[Error] failed to update stock', 1); } } else { $sql_insert_stock = "INSERT INTO stock ( StockWarehouseAlmariID, StockWarehouseRackID, StockWarehouseID, StockStockNumber, StockItemID, StockItemUnitID, StockItemPrice, StockQty, StockLastUpdated, StockUserID ) VALUES (0,0,?,fn_numbering('SN'),?,?,?,?,NOW(),?)"; $que_insert_stock = $this->db->query($sql_insert_stock, [ $data_ro['ReceiveOrderPoWarehouseID'], $elem['ReceiveOrderPoItemID'], $elem['ReceiveOrderPoItemUnitID'], $elem['ReceiveOrderPoDetailPrice'], $elem['ReceiveOrderPoDetailQty'], $user['M_UserID'], ]); if (!$que_insert_stock) { $this->db->trans_rollback(); throw new Exception('[Error] failed to insert stock', 1); } $stock_ID = $this->db->insert_id(); $stock_qty_ori = 0; $stock_qty_end = intval($elem['ReceiveOrderPoDetailQty']); } /* insert stock card */ $sql_stock_card = "INSERT INTO stockcard ( StockCardWarehouseID, StockCardDatetime, StockCardItemID, StockCardItemUnitID, StockCardReffID, StockCardStatus, StockCardBefore, StockCardIn, StockCardOut, StockCardAfter, StockCardUserID ) VALUES (?, NOW(), ?, ?, ?, 'PRV', ?, ?, 0, ?, ?)"; $que_stock_card = $this->db->query($sql_stock_card, [ $data_ro['ReceiveOrderPoWarehouseID'], $elem['ReceiveOrderPoItemID'], $elem['ReceiveOrderPoItemUnitID'], $stock_ID, $stock_qty_ori, $elem['ReceiveOrderPoDetailQty'], $stock_qty_end, $user['M_UserID'], ]); if (!$que_stock_card) { $this->db->trans_rollback(); throw new Exception('[Error] failed to insert stock card', 1); } /* insert stock log */ $sql_stock = 'SELECT * FROM stock WHERE StockID = ?'; $que_stock = $this->db->query($sql_stock, [$stock_ID]); if (!$que_stock) { $this->db->trans_rollback(); throw new Exception('[Error] failed to cek latest stock', 1); } $stock_latest = $que_stock->row_array(); $sql_stock_log = "INSERT INTO stocklog ( StockLogWarehouseID, StockLogDateTime, StockLogItemID, StockLogItemUnitID, StockLogStockNumber, StockLogReffID, StockLogStatus, StockLogQty, StockLogUserID ) VALUES (?, NOW(), ?, ?, ?, ?, 'PRV', ?, ?)"; $que_stock_log = $this->db->query($sql_stock_log, [ $data_ro['WarehouseID'], $elem['ReceiveOrderPoItemID'], $elem['ReceiveOrderPoItemUnitID'], $stock_latest['StockStockNumber'], $stock_ID, $elem['ReceiveOrderPoDetailQty'], $user['M_UserID'], ]); if (!$que_stock_log) { $this->db->trans_rollback(); throw new Exception('[Error] failed insert stock log', 1); } } /* handle shipping */ $ship_cost = round(doubleval($data_ro['ReceiveOrderShippingCostAmount']), 2); if ($ship_cost > 0.00) { $sql_tx_ship = "INSERT INTO jurnal_tx ( jurnalTxJurnalID, jurnalTxCoaID, jurnalTxDescription, jurnalTxDebit, jurnalTxCredit, jurnalTxM_UserID ) SELECT ?, coaID, coaDescription, ?, 0, ? FROM coa WHERE coaAccountNo = '5320700001' LIMIT 1"; $que_tx_ship = $this->db->query($sql_tx_ship, [$jurnalID, $ship_cost, $user['M_UserID']]); if (!$que_tx_ship) { $this->db->trans_rollback(); throw new Exception('[Error] failed insert jurnal shipping', 1); } $sql_rec_ship = "INSERT INTO receive_order_po_shipping ( ReceiveOrderPoShippingPurchaseOrderID, ReceiveOrderPoShippingReceiveOrderPoID, ReceiveOrderPoShippingAmount, ReceiveOrderPoShippingStatus, ReceiveOrderPoShippingIsActive, ReceiveOrderPoShippingCreatedUserID ) SELECT PurchaseOrderID, {$roID}, PurchaseOrderShippingCost, PurchaseOrderShippingCostStatus, 'Y', {$user['M_UserID']} FROM purchase_order WHERE PurchaseOrderID IN ( SELECT DISTINCT ReceiveOrderPoDetailPurchaseOrderID FROM receive_order_po JOIN receive_order_po_detail ON ReceiveOrderPoDetailReceiveOrderPoID = ReceiveOrderPoID WHERE ReceiveOrderPoID = {$user['M_UserID']} ) AND PurchaseOrderShippingCost IS NOT NULL AND PurchaseOrderShippingCost > 0"; $que_rec_ship = $this->db->query($sql_rec_ship, []); if (!$que_rec_ship) { $this->db->trans_rollback(); throw new Exception('[Error] failed insert table shipping', 1); } } // INSERT jurnal tx for GRNI # $total_grni = round($total_debet - ($total_diskonitem + $total_diskonpo), 2) + $ship_cost; $sql_grni = "INSERT INTO jurnal_tx ( jurnalTxJurnalID, jurnalTxCoaID, jurnalTxDescription, jurnalTxDebit, jurnalTxCredit, jurnalTxM_UserID ) SELECT ?, coaID, coaDescription, 0, ?, ? FROM coa WHERE coaAccountNo = '2110100030' LIMIT 1"; $que_grni = $this->db->query($sql_grni, [ $jurnalID, $total_grni, $user['M_UserID'], ]); if (!$que_grni) { $this->db->trans_rollback(); throw new Exception('insert jurnal tx GRNI', 1); } $jurnalTXID_GRNI = $this->db->insert_id(); $sql_addon_grni = "INSERT INTO jurnal_addon ( jurnalAddOnJurnalID, jurnalAddOnJurnalTxID, jurnalAddOnCode, jurnalAddOnValue, jurnalAddOnCreated, jurnalAddOnCreatedUserID ) VALUES (?,?,'RONUMB',?,NOW(),?)"; $que_addon_grni = $this->db->query($sql_addon_grni, [ $jurnalID, $jurnalTXID_GRNI, $data_ro['ReceiveOrderPoNumber'], $user['M_UserID'], ]); if (!$que_addon_grni) { $this->db->trans_rollback(); throw new Exception('insert jurnal addon GRNI', 1); } /* generate purchase invoice */ $this->generatePurchaseInvoice($user, $roID, $total_grni, $total_diskonpo); $this->db->trans_commit(); $this->sys_ok('[Success] order received'); } catch (Exception $e) { $msg = '[Error] ' . $e->getMessage(); $code = $e->getCode(); if ($code == 1) { $this->sys_error_db($msg); } else { $this->sys_error($msg); } exit(); } } public function uploadAttachment() { try { if (!$this->isLogin) { throw new Exception('invalid token'); } $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['ronumber'] . '.' . $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 receive_order_po_document ( ReceiveOrderPoDocumentReceiveOrderPoID, ReceiveOrderPoDocumentDate, ReceiveOrderPoDocumentFile, ReceiveOrderPoDocumentType, ReceiveOrderPoDocumentIsActive, ReceiveOrderPoDocumentCreated, ReceiveOrderPoDocumentUserID ) VALUES (?, NOW(), ?, ?, 'Y', NOW(), ?)"; $que_insert = $this->db->query($sql_insert, [ $para['roID'], $filename, 'aset', $user['M_UserID'], ]); if (!$que_insert) { $this->db->trans_rollback(); throw new Exception('failed to insert data to table ro document', 1); } $sql_contract = 'UPDATE purchase_order_asset_contract SET PurchaseOrderAssetContractReceiveOrderPoID = ? WHERE PurchaseOrderAssetContractID = ?'; $que_contract = $this->db->query($sql_contract, [ $para['roID'], $para['contractID'], ]); if (!$que_contract) { $this->db->trans_rollback(); throw new Exception('failed insert roID to po asset contract', 1); } } else { $error = $this->upload->display_errors(); $this->db->trans_rollback(); throw new Exception($error); } } } $this->db->trans_commit(); $this->sys_ok('[Success] upload attachment order asset'); } catch (Exception $e) { $msg = '[Error] ' . $e->getMessage(); $code = $e->getCode(); if ($code == 1) { $this->sys_error_db($msg); } else { $this->sys_error($msg); } exit(); } } public function saveHandover() { try { if (!$this->isLogin) { throw new Exception('invalid token'); } $this->db->trans_begin(); $param = $this->sys_input; $user = $this->sys_user; // Ambil data PurchaseRequestID # $sql_get_prid = 'SELECT DISTINCT pod.PurchaseOrderDetailPurchaseRequestID AS PurchaseRequestID FROM receive_order_po_detail ropd JOIN purchase_order_detail pod ON pod.PurchaseOrderDetailID = ropd.ReceiveOrderPoDetailPurchaseOrderDetailID WHERE ropd.ReceiveOrderPoDetailReceiveOrderPoID = ? AND pod.PurchaseOrderDetailPurchaseRequestID IS NOT NULL'; $que_get_prid = $this->db->query($sql_get_prid, [$param['receiveOrderPoID']]); if (!$que_get_prid) { throw new Exception('query purchase request id from RO', 1); } $data_prid = $que_get_prid->row_array(); // insert handover # $sql_insert_handover = "INSERT INTO asset_handover( AssetHandoverPurchaseRequestID, AssetHandoverReceiveOrderPoID, AssetHandoverDate, AssetHandoverM_RuanganID, AssetHandoverToUserID, AssetHandoverIsActive, AssetHandoverCreated, AssetHandoverUserID ) VALUES(?,?,NOW(),?,?,'Y',NOW(),?)"; $qry_insert_handover = $this->db->query($sql_insert_handover, [ $data_prid['PurchaseRequestID'], $param['receiveOrderPoID'], $param['ruanganID'], $param['staffID'], $user['M_UserID'], ]); if (!$qry_insert_handover) { throw new Exception('failed insert into table asset handover', 1); } $handoverID = $this->db->insert_id(); foreach ($param['item'] as $key => $item) { $qty_invnt = intval($item['serahQty']); for ($i = 0; $i < $qty_invnt; $i++) { /* generate barcode number each asset item */ $noBarcode = $this->generateNoBarcode( $user, $param['ruanganID'], 'BNP', $item['ReceiveOrderPoItemID'] ); // check if item already in stock # $sql_cekstock = "SELECT StockID FROM stock JOIN warehouse ON WarehouseID = StockWarehouseID AND WarehouseIsActive = 'Y' WHERE WarehouseM_BranchID = ? AND StockItemID = ? AND StockItemUnitID = ?"; $que_cekstock = $this->db->query($sql_cekstock, [ $user['M_BranchID'], $item['ReceiveOrderPoItemID'], $item['ReceiveOrderPoItemUnitID'], ]); if (!$que_cekstock) { throw new Exception('failed check stock exist/not', 1); } $stockID = $que_cekstock->row_array()['StockID']; $sql_insert_barcode = "INSERT INTO t_barcode_barang( T_BarcodeBarangStockID, T_BarcodeBarangReceiveOrderPoID, T_BarcodeBarangReceiveOrderPoDetailID, T_BarcodeBarangRefType, T_BarcodeBarangM_ItemID, T_BarcodeBarangItemUnitID, T_BarcodeBarangNumber, T_BarcodeBarangM_RuanganID, T_BarcodeBarangM_BranchID, T_BarcodeBarangIsActive, T_BarcodeBarangUserID, T_BarcodeBarangCreated ) VALUES(?,?,?,'PO',?,?,?,?,?,'Y',?,NOW())"; $que_insert_barcode = $this->db->query($sql_insert_barcode, [ $stockID, $param['receiveOrderPoID'], $item['ReceiveOrderPoDetailID'], $item['ReceiveOrderPoItemID'], $item['ReceiveOrderPoItemUnitID'], $noBarcode, $param['ruanganID'], $user['M_BranchID'], $user['M_UserID'], ]); if (!$que_insert_barcode) { throw new Exception('failed insert into t barcode barang', 1); } $barcodeID = $this->db->insert_id(); /* insert into table stock asset */ $sql_stockasset = 'INSERT INTO stock_asset ( StockAssetStockID, StockAssetRuanganID, StockAssetBarcode, StockAssetCabangID, StockAssetCreatedUserID ) VALUES (?,?,?,?,?)'; $que_stockasset = $this->db->query($sql_stockasset, [ $stockID, $param['ruanganID'], $noBarcode, $user['M_BranchID'], $user['M_UserID'], ]); if (!$que_stockasset) { throw new Exception('failed insert into stock asset', 1); } /* insert each asset handover detail */ $sql_insert_handover_detail = "INSERT INTO asset_handover_detail( AssetHandoverDetailAssetHandoverID, AssetHandoverDetailReceiveOrderPoDetailID, AssetHandoverDetailT_BarcodeBarangID, AssetHandoverDetailM_ItemID, AssetHandoverDetailIsActive, AssetHandoverDetailCreated, AssetHandoverDetailUserID ) VALUES(?,?,?,?,'Y',NOW(),?)"; $que_insert_handover_detail = $this->db->query($sql_insert_handover_detail, [ $handoverID, $item['ReceiveOrderPoDetailID'], $barcodeID, $item['ReceiveOrderPoItemID'], $user['M_UserID'], ]); if (!$que_insert_handover_detail) { throw new Exception('failed insert asset handover detail', 1); } } } /* check if all received asset are all handed over */ $sql_cek_allhanded = "SELECT rod.ReceiveOrderPoDetailID, CASE WHEN COALESCE(ahd_count.InsertedQty, 0) = rod.ReceiveOrderPoDetailQty THEN 'Y' ELSE 'N' END AS isHandoverDone FROM receive_order_po_detail rod JOIN m_item mi ON mi.M_ItemID = rod.ReceiveOrderPoItemID LEFT JOIN ( SELECT AssetHandoverDetailReceiveOrderPoDetailID, COUNT(*) AS InsertedQty FROM asset_handover_detail ahd JOIN asset_handover ah ON ahd.AssetHandoverDetailAssetHandoverID = ah.AssetHandoverID AND ah.AssetHandoverIsActive = 'Y' WHERE ahd.AssetHandoverDetailIsActive = 'Y' AND ah.AssetHandoverReceiveOrderPoID = ? GROUP BY AssetHandoverDetailReceiveOrderPoDetailID ) ahd_count ON ahd_count.AssetHandoverDetailReceiveOrderPoDetailID = rod.ReceiveOrderPoDetailID WHERE rod.ReceiveOrderPoDetailReceiveOrderPoID = ? AND rod.ReceiveOrderPoDetailIsActive = 'Y'"; $que_cek_allhanded = $this->db->query($sql_cek_allhanded, [ $param['receiveOrderPoID'], $param['receiveOrderPoID'], ]); if (!$que_cek_allhanded) { throw new Exception('failed cek data are all handed over', 1); } $cek_allhanded = $que_cek_allhanded->result_array(); $isAllHanded = count($cek_allhanded) > 0; foreach ($cek_allhanded as $key => $value) { if ($value['isHandoverDone'] != 'Y') { $isAllHanded = false; break; } } /* update status handover di receive order po */ if ($isAllHanded) { $sql_update_ro = "UPDATE receive_order_po SET ReceiveOrderPoIsHandover = 'Y', ReceiveOrderPoLastUpdated = NOW(), ReceiveOrderPoLastUpdatedUserID = ? WHERE ReceiveOrderPoID = ?"; $que_update_ro = $this->db->query($sql_update_ro, [ $user['M_UserID'], $param['receiveOrderPoID'], ]); if (!$que_update_ro) { throw new Exception('failed update status are all handed over di RO', 1); } } $this->db->trans_commit(); $this->sys_ok('[Success] Berhasil menyimpan data serah terima barang'); } catch (Exception $e) { $this->db->trans_rollback(); $msg = '[Error] ' . $e->getMessage(); $code = $e->getCode(); if ($code == 1) { $this->sys_error_db($msg); } else { $this->sys_error($msg); } exit(); } } private function generatePurchaseInvoice($user, $roID, $grni, $diskonPO) { $num_pi = $this->generateNoLogistik($user, 'PI'); // prepare data # $sql_dataro = "SELECT DISTINCT receive_order_po.* , PurchaseOrderID, PurchaseOrderTaxPpnType AS tax_type, PurchaseOrderTaxPercentPpn AS tax_percent, PurchaseOrderTaxAmountPpn AS tax_amount, IFNULL(SupplierDownpaymentAmount, 0) AS downpayment_amount FROM receive_order_po JOIN receive_order_po_detail ON ReceiveOrderPoDetailReceiveOrderPoID = ReceiveOrderPoID AND ReceiveOrderPoDetailIsActive = 'Y' AND ReceiveOrderPoIsActive = 'Y' JOIN purchase_order ON ReceiveOrderPoDetailPurchaseOrderID = PurchaseOrderID LEFT JOIN supplier_downpayment ON SupplierDownpaymentPurchasOrderID = PurchaseOrderID WHERE ReceiveOrderPoID = ?"; $que_dataro = $this->db->query($sql_dataro, [$roID]); if (!$que_dataro) { $this->db->trans_rollback(); throw new Exception('failed get current data for generate PI', 1); } $data_ro = $que_dataro->row_array(); $sql_detailro = "SELECT receive_order_po_detail.*, M_ItemDesc, PurchaseOrderSummaryDiscountType AS DiscountType, PurchaseOrderSummaryDiscountRupiah AS DiscountRupiah, PurchaseOrderSummaryDiscountPercent AS DiscountPercent, PurchaseOrderSummaryDiscountAmount as DiscountPerItem FROM receive_order_po_detail JOIN m_item ON M_ItemID = ReceiveOrderPoItemID AND M_ItemIsActive = 'Y' JOIN purchase_order_summary ON ReceiveOrderPoDetailPurchaseOrderSummaryID = PurchaseOrderSummaryID WHERE ReceiveOrderPoDetailIsActive = 'Y' AND ReceiveOrderPoDetailReceiveOrderPoID = ?"; $que_detailro = $this->db->query($sql_detailro, [$roID]); if (!$que_detailro) { $this->db->trans_rollback(); throw new Exception('failed to get data detail ro for generate PI', 1); } $detail_ro = $que_detailro->result_array(); // INSERT header supplier invoice # $due_date = new DateTime($data_ro['ReceiveOrderPoIDate']); $due_date->add(new DateInterval('P7D')); $due_date = $due_date->format('Y-m-d'); $subtotal = round($grni + $diskonPO, 2); $donumber = '-'; if ($data_ro['ReceiveOrderPoDONumber'] != '') { $donumber = $data_ro['ReceiveOrderPoDONumber']; } $addedtax = round($grni + $data_ro['tax_amount'], 2); $grandtotal = round($addedtax - $data_ro['downpayment_amount'], 2); $sql_insert_pi = "INSERT INTO supplier_invoice ( SupplierInvoiceNumber, SupplierInvoiceReceiveOrderPoID, SupplierInvoiceDate, SupplierInvoiceDueDate, SupplierInvoiceSupplierID, SupplierInvoiceRefNumber, SupplierInvoiceDeliveryOrderNumber, SupplierInvoiceSubTotal, SupplierInvoiceDiscountPercent, SupplierInvoiceDiscountAmount, SupplierInvoiceTaxPercentPpn, SupplierInvoiceTaxAmountPpn, SupplierInvoiceGrandTotal, SupplierInvoiceUnpaid, SupplierInvoiceNote, SupplierInvoiceIsInstallment, SupplierInvoiceReceiveDate, SupplierInvoiceReceivedBy, SupplierInvoiceCreatedUserID ) VALUES (?,?,NOW(),?,?,?,?,?,?,?,?,?,?,?,?,'Y',NOW(),?,?)"; $que_insert_pi = $this->db->query($sql_insert_pi, [ $num_pi, $data_ro['ReceiveOrderPoID'], $due_date, $data_ro['ReceiveOrderPoSupplierID'], $data_ro['ReceiveOrderPoNumber'], $donumber, $subtotal, 0.00, $diskonPO, $data_ro['tax_percent'], $data_ro['tax_amount'], $grandtotal, $grandtotal, $data_ro['ReceiveOrderPoNote'], $user['M_UserID'], $user['M_UserID'], ]); if (!$que_insert_pi) { $this->db->trans_rollback(); throw new Exception('failed insert data into table PI', 1); } $Pinvoice_ID = $this->db->insert_id(); // INSERT supplier invoice detail # $sql_ins_itemPI = 'INSERT INTO supplier_invoice_detail ( SupplierInvoiceDetailSupplierInvoiceID, SupplierInvoiceDetailPurchaseOrderID, SupplierInvoiceDetailPurchaseOrderSummaryID, SupplierInvoiceDetailReceiveOrderPoID, SupplierInvoiceDetailReceiveOrderPoDetailID, SupplierInvoiceDetailItemID, SupplierInvoiceDetailItemUnitID, SupplierInvoiceDetailDescription, SupplierInvoiceDetailQty, SupplierInvoiceDetailPrice, SupplierInvoiceDetailDiscountPercent, SupplierInvoiceDetailDiscountDiscountRupiah, SupplierInvoiceDetailDiscountDiscountType, SupplierInvoiceDetailDiscountPoProrata, SupplierInvoiceDetailDiscountAmount, SupplierInvoiceDetailTotal, SupplierInvoiceDetailUnpaid, SupplierInvoiceDetailCreatedUserID ) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)'; foreach ($detail_ro as $key => $elem) { $itemprice = doubleval($elem['ReceiveOrderPoDetailPrice']) - doubleval($elem['DiscountPerItem']); $totalprice = round($itemprice * intval($elem['ReceiveOrderPoDetailQty']), 2); $que_ins_itemPI = $this->db->query($sql_ins_itemPI, [ $Pinvoice_ID, $elem['ReceiveOrderPoDetailPurchaseOrderID'], $elem['ReceiveOrderPoDetailPurchaseOrderSummaryID'], $elem['ReceiveOrderPoDetailReceiveOrderPoID'], $elem['ReceiveOrderPoDetailID'], $elem['ReceiveOrderPoItemID'], $elem['ReceiveOrderPoItemUnitID'], $elem['M_ItemDesc'], $elem['ReceiveOrderPoDetailQty'], $elem['ReceiveOrderPoDetailPrice'], $elem['DiscountPercent'], $elem['DiscountRupiah'], $elem['DiscountType'], $elem['ReceiveOrderPoDetailDiskonPoProrata'], $elem['DiscountPerItem'], $totalprice, $totalprice, $user['M_UserID'], ]); if (!$que_ins_itemPI) { $this->db->trans_rollback(); throw new Exception('failed insert table detail PI', 1); } } } private function generateNoLogistik($user, $typeLogistik): string { $areaid = $user['loginLevel'] == 'regional' ? $user['S_RegionalID'] : $user['M_BranchID']; $areatype = $user['loginLevel'] == 'regional' ? 'R' : 'B'; $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'); exit(); } $usrdivisiID = $queusrdivisi->row_array()['M_UserDivisionDivisionID']; if (!isset($usrdivisiID)) { $this->db->trans_rollback(); $this->sys_error_db('[Error] user divisi id null'); exit(); } $sqlnum = 'SELECT `fn_penomoran`(?, ?, ?, ?, ?, ?) AS numpd;'; $quenum = $this->db->query($sqlnum, [$typeLogistik, $usrdivisiID, $areatype, $areaid, 'SM', 'Y']); if (!$quenum) { $this->db->trans_rollback(); $this->sys_error_db('[Error] generate number PI'); exit(); } $numPL = $quenum->row_array()['numpd']; if (!isset($numPL)) { $this->db->trans_rollback(); $this->sys_error_db('[Error] number PI null'); exit(); } return $numPL; } private function generateNoBarcode($user, $lokasiID, $typeBarcode, $itemid) { $branchid = $user['loginLevel'] == 'branch' ? $user['M_BranchID'] : 0; if ($user['loginlevel'] == 'regional') { $this->db->trans_rollback(); $this->sys_error('Tidak bisa generare No Barcode, anda login sebagai regional'); exit(); } // -- numtype = tipe numbering // -- itemid = id item inventaris/asset // -- branchid = id cabang // -- ruanganid = id ruangan di cabang $sqlnum = 'SELECT `fn_num_nonpersediaan`(?, ?, ?, ?) AS numpd;'; $quenum = $this->db->query($sqlnum, [$typeBarcode, $itemid, $branchid, $lokasiID]); if (!$quenum) { $this->db->trans_rollback(); $this->sys_error_db('[Error] generate number Barcode'); exit(); } $numPL = $quenum->row_array()['numpd']; if (!isset($numPL)) { $this->db->trans_rollback(); $this->sys_error_db('[Error] number Barcode null'); exit(); } return $numPL; } private function insertUserActivty($id, $typePL, $status, $userID, $desc = '') { $sql = 'INSERT INTO user_activity ( UserActivityCode, UserActivityStatus, UserActivityDescription, UserActivityRefID, UserActivityUserID, UserActivityCreated ) VALUES (?, ?, ?, ?, ?, NOW())'; $que = $this->db->query($sql, [$typePL, $status, $desc, $id, $userID]); if (!$que) { $this->sys_error_db('[Error] inserting user activity'); $this->db->trans_rollback(); exit(); } } private function insertLogReceiveOrderPO($id, $type, $dataBefore, $dataAfter, $userID, $desc = '') { $sql = 'INSERT INTO acc_one_log.receive_order_po_log ( ReceiveOrderPoLogReceiveOrderPoID, ReceiveOrderPoLogType, ReceiveOrderPoLogDesc, ReceiveOrderPoLogJsonBefore, ReceiveOrderPoLogJsonAfter, ReceiveOrderPoLogUserID, ReceiveOrderPoLogCreated ) VALUES (?, ?, ?, ?, ?, ?, NOW())'; $que = $this->db->query($sql, [ $id, $type, $desc, !empty($dataBefore) ? json_encode($dataBefore) : '', !empty($dataAfter) ? json_encode($dataAfter) : '', $userID, ]); if (!$que) { $this->db->trans_rollback(); $this->sys_error_db('[Error] inserting log into insert LogReceiveOrderPo'); exit(); } } private function insertLogPoItemReceive($id, $type, $roID, $dataBefore, $dataAfter, $userID, $desc = '') { $sql = 'INSERT INTO acc_one_log.po_item_receive_log ( PoItemReceiveLogPoItemReceiveID, PoItemReceiveLogReceiveOrderPoID, PoItemReceiveLogType, PoItemReceiveLogDesc, PoItemReceiveLogJsonBefore, PoItemReceiveLogJsonAfter, PoItemReceiveLogUserID, PoItemReceiveLogCreated ) VALUES (?, ?, ?, ?, ?, ?, ?, NOW())'; $que = $this->db->query($sql, [ $id, $roID, $type, $desc, !empty($dataBefore) ? json_encode($dataBefore) : '', !empty($dataAfter) ? json_encode($dataAfter) : '', $userID, ]); if (!$que) { $this->sys_error_db('[Error] inserting log po item receive'); $this->db->trans_rollback(); exit(); } } }