isLogin) { $this->sys_error("invalid token"); exit; } $payload = $this->sys_input; $search = $payload['search'] . '%'; $sql = "SELECT SupplierID, SupplierCode, SupplierName FROM supplier WHERE SupplierIsActive = 'Y' AND SupplierName LIKE ? ORDER BY SupplierName ASC "; $que = $this->db->query($sql, [$search]); if (!$que) { $this->sys_error_db("[Error] query listing supplier");; exit; } $data = $que->result_array(); $this->sys_ok($data); } catch (Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } function getRuangan() { try { if (!$this->isLogin) { $this->sys_error("invalid token"); exit; } $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) { $this->sys_error_db("[Error] query listing ruangan");; exit; } $data = $qry->result_array(); $this->sys_ok($data); } catch (Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } function getPurchaseOrder() { try { if (!$this->isLogin) { $this->sys_error("invalid token"); exit; } $payload = $this->sys_input; $user = $this->sys_user; $const_params = [ $user['M_BranchID'] ?? 0, $user['S_RegionalID'], $payload['SupplierID'], $payload['search'] . '%' ]; $placeholders = '?'; $list_includeID = ["0"]; $localPO_deleted = $payload['localPO_deleted']; if (sizeof($localPO_deleted) > 0) { $placeholders = implode(", ", array_fill(0, count($localPO_deleted), '?')); $list_includeID = $payload['localPO_deleted']; } $params = array_merge($list_includeID, $const_params); $sql = "SELECT GROUP_CONCAT(DISTINCT PurchaseOrderDetailWarehouseID) AS arrWarehouse, purchase_order.* FROM purchase_order JOIN purchase_order_detail ON PurchaseOrderID = PurchaseOrderDetailPurchaseOrderID AND PurchaseOrderDetailIsActive = 'Y' AND ((SELECT IFNULL(SUM(PoItemReceiveQty - PoItemReceiveQtyReceived), 0) FROM po_item_receive WHERE PoItemReceivePurchaseOrderID = PurchaseOrderID) > 0) OR (SELECT PoItemReceiveID FROM po_item_receive WHERE PoItemReceivePurchaseOrderID = PurchaseOrderID AND PoItemReceiveID IN ({$placeholders})) JOIN warehouse ON PurchaseOrderDetailWarehouseID = WarehouseID AND WarehouseM_BranchID = ? WHERE WarehouseS_RegionalID = ? AND PurchaseOrderSupplierID = ? AND PurchaseOrderStatus = 'Approved' AND PurchaseOrderItemCategoryID = 2 AND PurchaseOrderNumber LIKE ? AND PurchaseOrderIsActive = 'Y' GROUP BY PurchaseOrderID ORDER BY PurchaseOrderID DESC LIMIT 50"; $que = $this->db->query($sql, $params); if (!$que) { $this->sys_error_db("[Error] query purhcase order"); exit; } $data = $que->result_array(); $this->sys_ok($data); } catch (Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } function getWarehouse() { try { if (!$this->isLogin) { $this->sys_error("invalid token"); exit; } $user = $this->sys_user; $whtype = ($user['M_UserLocationFlag'] == 'R') ? 'R' : 'B'; $sql = "SELECT WarehouseID, WarehouseCode, CASE WHEN WarehouseType = 'B' THEN CONCAT(WarehouseCode,' ', WarehouseName, ' - ', M_BranchName) WHEN WarehouseType = 'R' THEN CONCAT(WarehouseCode,' ', WarehouseName, ' - ', S_RegionalName) ELSE '' END WarehouseName, WarehouseType, WarehouseIsDefault, WarehouseS_RegionalID, WarehouseM_BranchID, S_RegionalID, S_RegionalName FROM warehouse JOIN s_regional ON WarehouseS_RegionalID = S_RegionalID AND S_RegionalIsActive = 'Y' LEFT JOIN m_branch ON WarehouseM_BranchID = M_BranchID AND M_BranchIsActive = 'Y' WHERE WarehouseS_RegionalID = ? AND WarehouseIsActive = 'Y' AND WarehouseIsTransit = 'N' AND WarehouseType = ? AND WarehouseM_BranchID = ? ORDER BY WarehouseName ASC"; $que = $this->db->query($sql, [ $user['S_RegionalID'], $whtype, $user['M_BranchID'] ]); if (!$que) { $this->sys_error_db("[Error] get list warehouse"); exit; } $data = $que->result_array(); $this->sys_ok($data); } catch (Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } function getItem() { try { if (!$this->isLogin) { $this->sys_error("invalid token"); exit; } $param = $this->sys_input; $user = $this->sys_user; $POID = $param['POID']; $warehouseID = $param['WarehouseID']; $sql = "SELECT CONCAT(PoItemReceiveID,',','-') as keyID, PoItemReceiveID, PurchaseOrderNumber, PurchaseOrderShippingCost, PurchaseOrderShippingCostStatus, PoItemReceivePurchaseOrderID, PoItemReceivePurchaseOrderSummaryID, PoItemReceivePurchaseOrderDetailID, WarehouseID, WarehouseCode, CASE WHEN WarehouseType = 'B' THEN CONCAT(WarehouseCode,' ', WarehouseName, ' - ', M_BranchName) WHEN WarehouseType = 'R' THEN CONCAT(WarehouseCode,' ', WarehouseName, ' - ', S_RegionalName) ELSE '' END WarehouseName, M_ItemID, M_ItemCode, M_ItemDesc, ItemUnitID, ItemUnitName, M_ItemItem_CategoryID, PoItemReceiveQty as originalQty, PoItemReceiveQtyReceived as receivedQty, 0 as qty, PoItemReceiveQty - PurchaseOrderSummaryQtyReceived AS qtyRest, PoItemReceivePrice, 'N' as alreadySave FROM po_item_receive JOIN purchase_order ON PoItemReceivePurchaseOrderID = PurchaseOrderID AND PurchaseOrderIsActive = 'Y' AND PoItemReceiveIsActive = 'Y' -- AND (PoItemReceiveQty - PoItemReceiveQtyReceived) > 0 JOIN purchase_order_summary ON PurchaseOrderSummaryID = PoItemReceivePurchaseOrderSummaryID JOIN warehouse ON PoItemReceiveWarehouseID = WarehouseID AND WarehouseIsActive = 'Y' JOIN m_item ON PoItemReceiveItemID = M_ItemID JOIN itemunit ON PoItemReceiveItemUnitID= ItemUnitID JOIN s_regional ON WarehouseS_RegionalID = S_RegionalID LEFT JOIN m_branch ON WarehouseM_BranchID = M_BranchID WHERE PurchaseOrderID = ? AND WarehouseID = ?"; $que = $this->db->query($sql, [$POID, $warehouseID]); if (!$que) { $this->sys_error_db("[Error] ger item PO");; exit; } $data = $que->result_array(); foreach ($data as $key => $value) { $data[$key]['batchlist'] = []; } $this->sys_ok($data); } catch (Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } function getItemUpdate() { try { if (!$this->isLogin) { $this->sys_error("invalid token"); exit; } $param = $this->sys_input; $ROID = $param['ROID']; $sql = "SELECT ReceiveOrderPoDetailID, CONCAT(ReceiveOrderPoDetailPoItemReceiveID,',',ReceiveOrderPoDetailID) AS keyID, ReceiveOrderPoDetailPoItemReceiveID AS PoItemReceiveID, PurchaseOrderNumber, PurchaseOrderShippingCost, PurchaseOrderShippingCostStatus, ReceiveOrderPoDetailPurchaseOrderID AS PoItemReceivePurchaseOrderID, ReceiveOrderPoDetailPurchaseOrderSummaryID AS PoItemReceivePurchaseOrderSummaryID, ReceiveOrderPoDetailPurchaseOrderDetailID AS PoItemReceivePurchaseOrderDetailID, WarehouseID, WarehouseCode, CASE WHEN WarehouseType = 'B' THEN CONCAT(WarehouseCode,' ', WarehouseName, ' - ', M_BranchName) WHEN WarehouseType = 'R' THEN CONCAT(WarehouseCode,' ', WarehouseName, ' - ', S_RegionalName) ELSE '' END WarehouseName, M_RuanganID, M_RuanganName, M_RuanganCode, M_ItemID, M_ItemCode, M_ItemDesc, ItemUnitID, ItemUnitName, M_ItemItem_CategoryID, PoItemReceiveQty AS originalQty, PoItemReceiveQtyReceived AS receivedQty, ReceiveOrderPoDetailQty AS qty, ReceiveOrderPoDetailQty AS tmpQty, PoItemReceiveQty - PurchaseOrderSummaryQtyReceived AS qtyRest, ReceiveOrderPoDetailQty, PoItemReceivePrice, 'Y' AS alreadySave, ReceiveOrderPoDetailBatchNo AS batchNo, ReceiveOrderPoDetailEd AS itemEd, ReceiveOrderPoDetailBatchList FROM receive_order_po_detail JOIN receive_order_po ON ReceiveOrderPoDetailReceiveOrderPoID = ReceiveOrderPoID JOIN purchase_order ON ReceiveOrderPoDetailPurchaseOrderID = PurchaseOrderID JOIN po_item_receive ON ReceiveOrderPoDetailPoItemReceiveID = PoItemReceiveID JOIN purchase_order_summary ON PurchaseOrderSummaryID = PoItemReceivePurchaseOrderSummaryID JOIN warehouse ON ReceiveOrderPoWarehouseID = WarehouseID JOIN m_item ON ReceiveOrderPoItemID = M_ItemID JOIN itemunit ON ReceiveOrderPoItemUnitID = ItemUnitID JOIN s_regional ON WarehouseS_RegionalID = S_RegionalID LEFT JOIN m_branch ON WarehouseM_BranchID = M_BranchID LEFT JOIN m_ruangan ON M_RuanganM_BranchID = M_BranchID WHERE ReceiveOrderPoDetailIsActive = 'Y' AND ReceiveOrderPoDetailReceiveOrderPoID = ? ORDER BY ReceiveOrderPoDetailID ASC"; $que = $this->db->query($sql, [$ROID]); if (!$que) { $this->sys_error_db("[Error] get item untuk update"); exit; } $data = $que->result_array(); foreach ($data as $key => $item) { $jsonstr = $item['ReceiveOrderPoDetailBatchList']; $batchlist = []; if (!empty($jsonstr)) { $decode = json_decode($jsonstr); if ($decode !== null && json_last_error() === JSON_ERROR_NONE) { $batchlist = $decode; } else { $this->sys_error("[Error] decode json batch list item received"); exit; } $data[$key]['batchlist'] = $batchlist; unset($data[$key]['ReceiveOrderPoDetailBatchList']); } } $detailID = array_column($data, 'ReceiveOrderPoDetailID'); $placeholders = implode(", ", array_fill(0, count($detailID), '?')); $sqlInspeksi = "SELECT ReceiveOrderPoInspeksiID, ReceiveOrderPoInspeksiReceiveOrderPoDetailID, ReceiveOrderPoInspeksiQtyPesan AS qty_po, ReceiveOrderPoInspeksiQtyActual AS qty_ro, ReceiveOrderPoInspeksiPricePesan AS price_po, ReceiveOrderPoInspeksiPriceActual AS price_ro, ReceiveOrderPoInspeksiDatePesan AS date_po, ReceiveOrderPoInspeksiDateActual AS date_ro, ReceiveOrderPoInspeksiExpireDate AS expire_date, 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 ReceiveOrderPoInspeksiIsActive = 'Y' AND ReceiveOrderPoInspeksiReceiveOrderPoDetailID IN ({$placeholders})"; $queInspeksi = $this->db->query($sqlInspeksi, $detailID); if (!$queInspeksi) { $this->sys_error_db("[Error] get item inspeksi data"); exit; } $list_inspeksi = $queInspeksi->result_array(); $lookup_map = []; foreach ($list_inspeksi as $inspeksi) { $RODetailID = $inspeksi['ReceiveOrderPoInspeksiReceiveOrderPoDetailID']; $lookup_map[$RODetailID] = $inspeksi; } $sql_barcode = "SELECT T_BarcodeBarangID, T_BarcodeBarangReceiveOrderPoDetailID, T_BarcodeBarangM_ItemID FROM t_barcode_barang WHERE T_BarcodeBarangIsActive = 'Y' AND T_BarcodeBarangReceiveOrderPoDetailID IN ($placeholders)"; $qry_barcode = $this->db->query($sql_barcode, $detailID); if (!$qry_barcode) { $this->sys_error_db("[Error] get item barcode data"); exit; } $list_barcode = $qry_barcode->result_array(); $lookup_map_barcode = []; foreach ($list_barcode as $barcode) { $RODetailID = $barcode['T_BarcodeBarangReceiveOrderPoDetailID']; $lookup_map_barcode[$RODetailID][] = $barcode; } $result = []; foreach ($data as $rodetail) { $rodetailID = $rodetail['ReceiveOrderPoDetailID']; // gabung inspeksi if (isset($lookup_map[$rodetailID])) { $rodetail['inspeksi_item'] = $lookup_map[$rodetailID]; } // gabung barcode if (isset($lookup_map_barcode[$rodetailID])) { $rodetail['barcode_item'] = $lookup_map_barcode[$rodetailID]; } $result[] = $rodetail; } $this->sys_ok($result); } catch (Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } function searchRO() { try { if (!$this->isLogin) { $this->sys_error("invalid token"); exit; } $param = $this->sys_input; $user = $this->sys_user; $search = $param['search'] . '%'; $startdate = $param['startdate']; $enddate = $param['enddate']; $regID = $user['S_RegionalID']; $brnCD = $user['M_BranchCode'] . '%'; $page = 0; $limit = 15; if ($param['page'] > 0) { $page = ($param['page'] - 1) * $limit; } $sql = "SELECT ReceiveOrderPoNumber, ReceiveOrderPoID, ReceiveOrderPoSupplierID, ReceiveOrderPoIDate, ReceiveOrderShippingCostAmount, ReceiveOrderPoNote, ReceiveOrderPoRefNumber, ReceiveOrderPoDONumber, ReceiveOrderPoIsHandover, SupplierID, SupplierName, WarehouseID, WarehouseCode, CASE WHEN WarehouseType = 'B' THEN CONCAT(WarehouseCode,' ', WarehouseName, ' - ', M_BranchName) WHEN WarehouseType = 'R' THEN CONCAT(WarehouseCode,' ', WarehouseName, ' - ', S_RegionalName) ELSE '' END WarehouseName, M_RuanganID, M_RuanganName, M_RuanganCode, ReceiveOrderPoConfirmed, DATE_FORMAT(ReceiveOrderPoConfirmedDate, '%d-%m-%Y %H:%i') AS ReceiveOrderPoConfirmedDate, M_UserUsername AS ReceiveOrderPoConfirmedUserName FROM receive_order_po JOIN warehouse ON ReceiveOrderPoWarehouseID = WarehouseID JOIN supplier ON ReceiveOrderPoSupplierID = SupplierID JOIN s_regional ON WarehouseS_RegionalID = S_RegionalID AND S_RegionalIsActive = 'Y' LEFT JOIN m_branch ON WarehouseM_BranchID = M_BranchID AND M_BranchIsActive = 'Y' LEFT JOIN m_user ON ReceiveOrderPoConfirmedUserID = M_UserID LEFT JOIN m_ruangan ON M_RuanganM_BranchID = M_BranchID WHERE ReceiveOrderPoIsActive = 'Y' AND (ReceiveOrderPoNumber LIKE ? OR ReceiveOrderPoDONumber LIKE ?) AND ReceiveOrderPoIDate BETWEEN DATE(?) AND DATE(?) AND ReceiveOrderPoS_RegionalID = ? AND ReceiveOrderPoM_BranchCode LIKE ? AND ReceiveOrderPoID NOT IN ( SELECT DISTINCT ReceiveOrderPoDetailReceiveOrderPoID FROM receive_order_po_detail JOIN purchase_order ON ReceiveOrderPoDetailPurchaseOrderID = PurchaseOrderID WHERE PurchaseOrderItemCategoryID IN (1, 4) AND ReceiveOrderPoDetailIsActive = 'Y' ) ORDER BY ReceiveOrderPoID DESC"; $sqltotal = "SELECT COUNT(*) as total FROM ($sql) as x"; $quetotal = $this->db->query($sqltotal, [$search, $search, $startdate, $enddate, $regID, $brnCD]); if (!$quetotal) { $this->sys_error_db("[Error] get total data RO"); exit; } $total = $quetotal->row_array()['total']; $sqldata = $sql . " LIMIT ? OFFSET ?"; $quedata = $this->db->query($sqldata, [ $search, $search, $startdate, $enddate, $regID, $brnCD, $limit, $page ]); if (!$quedata) { $this->sys_error_db("[Error] get list data RO"); exit; } $records = $quedata->result_array(); foreach ($records as $key => $value) { $sql = "SELECT ReceiveOrderPoDocumentID, ReceiveOrderPoDocumentDate, ReceiveOrderPoDocumentFile FROM receive_order_po_document WHERE ReceiveOrderPoDocumentIsActive = 'Y' AND ReceiveOrderPoDocumentReceiveOrderPoID = ?"; $qry = $this->db->query($sql, [$value['ReceiveOrderPoID']]); if (!$qry) { $this->sys_error_db("[Error] get document RO"); exit; } $rowsdata = $qry->result_array(); if (count($rowsdata) > 0) { $records[$key]['hasDocuments'] = true; $records[$key]['documents'] = $rowsdata; } else { $records[$key]['hasDocuments'] = false; $records[$key]['documents'] = []; } } $result = array( "records" => $records, "total" => ceil($total / $limit) ); $this->sys_ok($result); } catch (Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } function getItemDataInspeksi() { try { if (!$this->isLogin) { $this->sys_error("invalid token"); exit; } $param = $this->sys_input; $RODetailID = $param['RODetailID']; $sql = "SELECT ReceiveOrderPoInspeksiID, ReceiveOrderPoInspeksiReceiveOrderPoDetailID, ReceiveOrderPoInspeksiQtyPesan, ReceiveOrderPoInspeksiQtyActual, ReceiveOrderPoInspeksiPricePesan, ReceiveOrderPoInspeksiPriceActual, ReceiveOrderPoInspeksiDatePesan, ReceiveOrderPoInspeksiDateActual, ReceiveOrderPoInspeksiExpireDate, ReceiveOrderPoInspeksiKeadaanKemasan, ReceiveOrderPoInspeksiKondisiPengiriman, ReceiveOrderPoInspeksiSimpulan, ReceiveOrderPoInspeksiCatatan, ReceiveOrderPoInspeksiStaffPenerima, ReceiveOrderPoInspeksiStaffPengirim FROM receive_order_po_inspeksi WHERE ReceiveOrderPoInspeksiIsActive = 'Y' AND ReceiveOrderPoInspeksiReceiveOrderPoDetailID = ?"; $que = $this->db->query($sql, [$RODetailID]); if (!$que) { $this->sys_error_db("[Error] get data inspeksi item"); exit; } $data = $que->row_array(); $this->sys_ok($data); } catch (Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } function getListStaff() { try { if (!$this->isLogin) { $this->sys_error("Invalid token"); exit; } $user = $this->sys_user; $param = $this->sys_input; // $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']]); // $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); } } 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 getPOItemReceived($id) { $sql = "SELECT * FROM po_item_receive JOIN warehouse ON PoItemReceiveWarehouseID= WarehouseID JOIN itemunit ON PoItemReceiveItemUnitID = ItemUnitID WHERE PoItemReceiveID = ?"; $que = $this->db->query($sql, [$id]); if (!$que) { $this->db->trans_rollback(); $this->sys_error_db("[Error] getDataPoItemReceive");; exit; } return $que->row_array(); } private function getDataROPO($id) { $sql = "SELECT * FROM receive_order_po WHERE ReceiveOrderPoID = ?"; $que = $this->db->query($sql, [$id]); if (!$que) { $this->db->trans_rollback(); $this->sys_error_db("[Error] getDataReceiveOrderPO ");; exit; } $ROheader = $que->row_array(); $sqldetail = "SELECT * FROM receive_order_po_detail WHERE ReceiveOrderPoDetailReceiveOrderPoID = ? AND ReceiveOrderPoDetailIsActive = 'Y'"; $quedetail = $this->db->query($sqldetail, [$id]); if (!$quedetail) { $this->db->trans_rollback(); $this->sys_error_db("[Error] getDataReceiveOrderPO detail");; exit; } $ROdetail = $quedetail->result_array(); $ROheader['details'] = $ROdetail; return $ROheader; } ## MUTATION ## function saveRO() { try { if (!$this->isLogin) { $this->sys_error("invalid token"); exit; } $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, ReceiveOrderPoCreatedUserID ) VALUE (?,?,?,?,?,?,?,?,?,?,?,?)"; $queInsRO = $this->db->query($sqlInsRO, [ $numGR, $param['supplierID'], $param['date'], $param['warehouseID'], $user['M_BranchCode'], $user['S_RegionalID'], $param['shippingCost'], $param['shippingIsPaid'], $param['note'], $param['refNumber'], $param['refNumber'], $user['M_UserID'] ]); if (!$queInsRO) { $this->db->trans_rollback(); $this->sys_error_db("[Error] insert into table receive order po"); exit; } $roID = $this->db->insert_id(); # inset to table ro detail # $logDesc = []; 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(); $this->sys_error_db("Error cek data item po_item_receive"); exit; } $cekReceived = $queRcvdItem->row_array(); # cek item received # if ($cekReceived['PoItemReceiveIsActive'] == 'N') { $this->db->trans_rollback(); $this->sys_error("[Error] Item {$obj['M_ItemDesc']} sudah diterima"); exit; } if ($cekReceived['PoItemReceiveQtyReceived'] == $cekReceived['PoItemReceiveQty']) { $this->db->trans_rollback(); $this->sys_error("[Error] Item {$obj['M_ItemDesc']} sudah diterima semuanya"); exit; } if (intval($obj['qty']) > intval($cekReceived['PoItemReceiveQty'])) { $this->db->trans_rollback(); $this->sys_error("Jumlah item {$obj['M_ItemDesc']} yang tersedia sudah berubah silahkan ulangi pilih item"); exit; } $jsonBatch = "[]"; if (isset($obj['batchlist']) && is_array($obj['batchlist'])) { $batchlist = $obj['batchlist']; if (sizeof($batchlist) > 0) { $json = json_encode($batchlist); if ($json === false) { $this->db->trans_rollback(); $this->sys_error_db("[Error] encode json batch number"); exit; } else { $jsonBatch = $json; } } } $sqlInsRODetail = "INSERT INTO receive_order_po_detail ( ReceiveOrderPoDetailReceiveOrderPoID, ReceiveOrderPoDetailPurchaseOrderID, ReceiveOrderPoDetailPurchaseOrderSummaryID, ReceiveOrderPoDetailPurchaseOrderDetailID, ReceiveOrderPoDetailPoItemReceiveID, ReceiveOrderPoDetailQty, ReceiveOrderPoDetailPrice, ReceiveOrderPoDetailTotal, ReceiveOrderPoDetailCreatedUserID, ReceiveOrderPoItemID, ReceiveOrderPoItemUnitID, ReceiveOrderPoDetailBatchNo, ReceiveOrderPoDetailEd, ReceiveOrderPoDetailBatchList ) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; $queInsRODetail = $this->db->query($sqlInsRODetail, [ $roID, $obj['PoItemReceivePurchaseOrderID'], $obj['PoItemReceivePurchaseOrderSummaryID'], $obj['PoItemReceivePurchaseOrderDetailID'], $obj['PoItemReceiveID'], $obj['qty'], $obj['PoItemReceivePrice'], (doubleval($obj['PoItemReceivePrice']) * intval($obj['qty'])), $user['M_UserID'], $obj['M_ItemID'], $obj['ItemUnitID'], $obj['batchNo'], $obj['itemEd'], $jsonBatch ]); if (!$queInsRODetail) { $this->db->trans_rollback(); $this->sys_error_db("[Error] receive order detail"); exit; } $logDesc[] = "- ADD {$obj['M_ItemDesc']} {$obj['qty']} {$obj['ItemUnitName']} nomor batch {$obj['WarehouseName']}"; $RODetailID = $this->db->insert_id(); if (intval($obj['qty']) > 0) { $qty = intval($obj['qty']); for ($i = 0; $i < $qty; $i++) { # generate nomor barcode # $noBarcode = $this->generateNoBarcode($user, $param['lokasiID'], 'BNP', $obj['M_ItemID']); # INSERT INTO t_barcode_barang # $sqlInsertBarcode = "INSERT INTO t_barcode_barang( 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())"; $qryInsertBarcode = $this->db->query($sqlInsertBarcode, array( $roID, $RODetailID, $obj['M_ItemID'], $obj['ItemUnitID'], $noBarcode, $param['lokasiID'], $user['M_BranchID'], $user['M_UserID'] )); if (!$qryInsertBarcode) { $this->db->trans_rollback(); $this->sys_error_db("[Error] insert data barcode item"); exit; } } } # INSERT INTO receive_order_po_inspeksi # $inspeksi = $obj['inspeksi_item']; $sqlInspeksi = "INSERT INTO receive_order_po_inspeksi ( ReceiveOrderPoInspeksiReceiveOrderPoDetailID, ReceiveOrderPoInspeksiQtyPesan, ReceiveOrderPoInspeksiQtyActual, ReceiveOrderPoInspeksiPricePesan, ReceiveOrderPoInspeksiPriceActual, 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['price_po'], $inspeksi['price_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) { $this->db->trans_rollback(); $this->sys_error_db("[Error] insert data inspeksi item"); exit; } # po item received && log item change # $jsonBefore = $this->getPOItemReceived($obj['PoItemReceiveID']); $sqlupd = "UPDATE po_item_receive SET PoItemReceiveQtyReceived = ?, PoItemReceiveUpdatedUserID = ? WHERE PoItemReceiveID = ?"; $queupd = $this->db->query($sqlupd, [ (intval($cekReceived['PoItemReceiveQtyReceived']) + intval($obj['qty'])), $user['M_UserID'], $obj['PoItemReceiveID'] ]); if (!$queupd) { $this->db->trans_rollback(); $this->sys_error_db("[Error] update item receive"); exit; } $jsonAfter = $this->getPOItemReceived($obj['PoItemReceiveID']); $desc = "Diterima {$obj['M_ItemDesc']} sejumlah {$obj['qty']} {$obj['ItemUnitName']} di RO nomor {$numGR} *RO belum di konfirmasi"; $this->insertLogPoItemReceive( $obj['PoItemReceiveID'], 'UPDATE', $roID, $jsonBefore, $jsonAfter, $user['M_UserID'], $desc ); } $dataROAfter = $this->getDataROPO($roID); $this->insertLogReceiveOrderPo($roID, 'ADD', '', $dataROAfter, $user['M_UserID'], implode("\n", $logDesc)); $this->insertUserActivty($roID, 'RO', 'ADD', $user['M_UserID'], implode("\n", $logDesc)); $this->db->trans_commit(); $this->sys_ok("Berhasil terima barang dengan nomor {$numGR}"); } catch (Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } function saveEditRO() { try { if (!$this->isLogin) { $this->sys_error("invalid token"); exit; } $this->db->trans_begin(); $param = $this->sys_input; $user = $this->sys_user; $sql_ro = "UPDATE receive_order_po SET ReceiveOrderPoNumber = ?, ReceiveOrderPoSupplierID = ?, ReceiveOrderPoIDate = ?, ReceiveOrderPoWarehouseID = ?, ReceiveOrderPoM_BranchCode = ?, ReceiveOrderPoS_RegionalID = ?, ReceiveOrderShippingCostAmount = ?, ReceiveOrderShippingCostIsPaid = ?, ReceiveOrderPoNote = ?, ReceiveOrderPoRefNumber = ?, ReceiveOrderPoDONumber = ? WHERE ReceiveOrderPoID = ?"; $que_ro = $this->db->query($sql_ro, [ $param['numGR'], $param['supplierID'], $param['date'], $param['warehouseID'], $user['M_BranchCode'], $user['S_RegionalID'], $param['shippingCost'], $param['shippingIsPaid'], $param['note'], $param['refNumber'], $param['refNumber'], $param['ReceiveOrderID'] ]); if (!$que_ro) { $this->db->trans_rollback(); $this->sys_error_db("[Error] insert into table receive order po"); exit; } # CHECK IF DETAIL ALREADY IN TABLE RECEIVE # $sql_check_ro = "SELECT ReceiveOrderPoDetailID, ReceiveOrderPoDetailPoItemReceiveID FROM receive_order_po_detail WHERE ReceiveOrderPoDetailReceiveOrderPoID = ? AND ReceiveOrderPoDetailIsActive = 'Y'"; $que_check_ro = $this->db->query($sql_check_ro, [$param['ReceiveOrderID']]); if (!$que_check_ro) { $this->db->trans_rollback(); $this->sys_error("[Error] get list ro detail id"); exit; } $list_detailID = $que_check_ro->result_array(); $master_detailID = array_column($list_detailID, 'ReceiveOrderPoDetailID'); $input_detailID = array_column($param['detail'], 'ReceiveOrderPoDetailID'); $update = []; $insert = []; $delete = []; foreach ($param['detail'] as $key => $obj) { if (empty($obj['ReceiveOrderPoDetailID'])) { $insert[] = $obj; continue; } if (in_array($obj['ReceiveOrderPoDetailID'], $master_detailID)) { $update[] = $obj; } } foreach ($list_detailID as $key => $obj) { if (!in_array($obj['ReceiveOrderPoDetailID'], $input_detailID)) { $delete[] = $obj; } } # UPDATE # foreach ($update as $key => $obj) { # cek item received # $sqlRcvdItem = "SELECT * FROM po_item_receive WHERE PoItemReceiveID = ?"; $queRcvdItem = $this->db->query($sqlRcvdItem, [$obj['PoItemReceiveID']]); if (!$queRcvdItem) { $this->db->trans_rollback(); $this->sys_error_db("Error cek data item po_item_receive"); exit; } $cekReceived = $queRcvdItem->row_array(); if ($cekReceived['PoItemReceiveIsActive'] == 'N') { $this->db->trans_rollback(); $this->sys_error("[Error] Item {$obj['M_ItemDesc']} tidak aktif"); exit; } if (intval($obj['qty']) > intval($cekReceived['PoItemReceiveQty'])) { $this->db->trans_rollback(); $this->sys_error("Jumlah item {$obj['M_ItemDesc']} yang tersedia sudah berubah silahkan ulangi pilih item"); exit; } # UPDATE po item receive # $sql_up_po_receive = "UPDATE po_item_receive JOIN receive_order_po_detail ON ReceiveOrderPoDetailPoItemReceiveID = PoItemReceiveID AND ReceiveOrderPoDetailID = ? SET PoItemReceiveQtyReceived = (PoItemReceiveQtyReceived - ReceiveOrderPoDetailQty) + ?, PoItemReceiveUpdatedUserID = ? WHERE PoItemReceiveID = ?"; $que_up_po_receive = $this->db->query($sql_up_po_receive, [ $obj['ReceiveOrderPoDetailID'], $obj['qty'], $user['M_UserID'], $obj['PoItemReceiveID'] ]); if (!$que_up_po_receive) { $this->db->trans_rollback(); $this->sys_error_db("[Error] update receive order detail"); exit; } # UPDATE receive detail po # $jsonBatch = "[]"; if (isset($obj['batchlist']) && is_array($obj['batchlist'])) { $batchlist = $obj['batchlist']; if (sizeof($batchlist) > 0) { $json = json_encode($batchlist); if ($json === false) { $this->db->trans_rollback(); $this->sys_error_db("[Error] encode json batch number"); exit; } else { $jsonBatch = $json; } } } $sql_update_detail = "UPDATE receive_order_po_detail SET ReceiveOrderPoDetailReceiveOrderPoID = ?, ReceiveOrderPoDetailPurchaseOrderID = ?, ReceiveOrderPoDetailPurchaseOrderSummaryID = ?, ReceiveOrderPoDetailPurchaseOrderDetailID = ?, ReceiveOrderPoDetailPoItemReceiveID = ?, ReceiveOrderPoDetailQty = ?, ReceiveOrderPoDetailPrice = ?, ReceiveOrderPoDetailTotal = ?, ReceiveOrderPoItemID = ?, ReceiveOrderPoItemUnitID = ?, ReceiveOrderPoDetailBatchNo = ?, ReceiveOrderPoDetailEd = ?, ReceiveOrderPoDetailBatchList = ? WHERE ReceiveOrderPoDetailID = ?"; $que_update_detail = $this->db->query($sql_update_detail, [ $param['ReceiveOrderID'], $obj['PoItemReceivePurchaseOrderID'], $obj['PoItemReceivePurchaseOrderSummaryID'], $obj['PoItemReceivePurchaseOrderDetailID'], $obj['PoItemReceiveID'], $obj['qty'], $obj['PoItemReceivePrice'], (doubleval($obj['PoItemReceivePrice']) * intval($obj['qty'])), $obj['M_ItemID'], $obj['ItemUnitID'], $obj['batchNo'], $obj['itemEd'], $jsonBatch, $obj['ReceiveOrderPoDetailID'] ]); if (!$que_update_detail) { $this->db->trans_rollback(); $this->sys_error_db("[Error] update receive order detail"); exit; } if (intval($obj['qty']) > 0) { $qty = intval($obj['qty']); for ($i = 0; $i < $qty; $i++) { # INSERT INTO t_barcode_barang # $barcode_item = $obj['barcode_item']; foreach ($barcode_item as $key => $barcode) { # generate nomor barcode # $noBarcode = $this->generateNoBarcode($user, $param['lokasiID'], 'BNP', $obj['M_ItemID']); $sqlInsertBarcode = "UPDATE t_barcode_barang SET T_BarcodeBarangReceiveOrderPoID = ?, T_BarcodeBarangReceiveOrderPoDetailID = ?, T_BarcodeBarangRefType = 'PO', T_BarcodeBarangM_ItemID = ?, T_BarcodeBarangItemUnitID = ?, T_BarcodeBarangNumber = ?, T_BarcodeBarangM_RuanganID = ?, T_BarcodeBarangM_BranchID = ?, T_BarcodeBarangIsActive = 'Y', T_BarcodeBarangUserID = ?, T_BarcodeBarangLastUpdated = NOW() WHERE T_BarcodeBarangID = ?"; $qryInsertBarcode = $this->db->query($sqlInsertBarcode, array( $param['ReceiveOrderID'], $obj['ReceiveOrderPoDetailID'], $obj['M_ItemID'], $obj['ItemUnitID'], $noBarcode, $param['lokasiID'], $user['M_BranchID'], $user['M_UserID'], $barcode['T_BarcodeBarangID'] )); if (!$qryInsertBarcode) { $this->db->trans_rollback(); $this->sys_error_db("[Error] update data barcode item", $this->db); exit; } } } } # update form inspeksi item # $inspeksi = $obj['inspeksi_item']; $sql_inspeksi = "UPDATE receive_order_po_inspeksi SET ReceiveOrderPoInspeksiQtyPesan = ?, ReceiveOrderPoInspeksiQtyActual = ?, ReceiveOrderPoInspeksiPricePesan = ?, ReceiveOrderPoInspeksiPriceActual = ?, ReceiveOrderPoInspeksiDatePesan = ?, ReceiveOrderPoInspeksiDateActual = ?, ReceiveOrderPoInspeksiKeadaanKemasan = ?, ReceiveOrderPoInspeksiKeadaanKemasanNote = ?, ReceiveOrderPoInspeksiKondisiPengiriman = ?, ReceiveOrderPoInspeksiKondisiPengirimanNote = ?, ReceiveOrderPoInspeksiSimpulan = ?, ReceiveOrderPoInspeksiCatatan = ?, ReceiveOrderPoInspeksiStaffPenerimaID = ?, ReceiveOrderPoInspeksiPengirim = ? WHERE ReceiveOrderPoInspeksiID = ?"; $que_inspeksi = $this->db->query($sql_inspeksi, [ $inspeksi['qty_po'], $inspeksi['qty_ro'], $inspeksi['price_po'], $inspeksi['price_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['pemeriksa'], $inspeksi['ReceiveOrderPoInspeksiID'] ]); if (!$que_inspeksi) { $this->db->trans_rollback(); $this->sys_error_db("[Error] update form inspeksi"); exit; } } # INSERT # foreach ($insert as $key => $obj) { # cek item received # $sqlRcvdItem = "SELECT * FROM po_item_receive WHERE PoItemReceiveID = ?"; $queRcvdItem = $this->db->query($sqlRcvdItem, [$obj['PoItemReceiveID']]); if (!$queRcvdItem) { $this->db->trans_rollback(); $this->sys_error_db("Error cek data item po_item_receive"); exit; } $cekReceived = $queRcvdItem->row_array(); if ($cekReceived['PoItemReceiveIsActive'] == 'N') { $this->db->trans_rollback(); $this->sys_error("[Error] Item {$obj['M_ItemDesc']} tidak aktif"); exit; } if (intval($obj['qty']) > intval($cekReceived['PoItemReceiveQty'])) { $this->db->trans_rollback(); $this->sys_error("Jumlah item {$obj['M_ItemDesc']} yang tersedia sudah berubah silahkan ulangi pilih item"); exit; } # UPDATE po item receive # $sql_up_po_receive = "UPDATE po_item_receive SET PoItemReceiveQtyReceived = ?, PoItemReceiveUpdatedUserID = ? WHERE PoItemReceiveID = ?"; $que_up_po_receive = $this->db->query($sql_up_po_receive, [ (intval($cekReceived['PoItemReceiveQtyReceived']) + intval($obj['qty'])), $user['M_UserID'], $obj['PoItemReceiveID'] ]); if (!$que_up_po_receive) { $this->db->trans_rollback(); $this->sys_error_db("[Error] update receive order detail"); exit; } $jsonBatch = "[]"; if (isset($obj['batchlist']) && is_array($obj['batchlist'])) { $batchlist = $obj['batchlist']; if (sizeof($batchlist) > 0) { $json = json_encode($batchlist); if ($json === false) { $this->db->trans_rollback(); $this->sys_error_db("[Error] encode json batch number"); exit; } else { $jsonBatch = $json; } } } # RE-INSERT ITEM DETAIL # $sql_insert_rodetail = "INSERT INTO receive_order_po_detail ( ReceiveOrderPoDetailReceiveOrderPoID, ReceiveOrderPoDetailPurchaseOrderID, ReceiveOrderPoDetailPurchaseOrderSummaryID, ReceiveOrderPoDetailPurchaseOrderDetailID, ReceiveOrderPoDetailPoItemReceiveID, ReceiveOrderPoDetailQty, ReceiveOrderPoDetailPrice, ReceiveOrderPoDetailTotal, ReceiveOrderPoDetailCreatedUserID, ReceiveOrderPoItemID, ReceiveOrderPoItemUnitID, ReceiveOrderPoDetailBatchNo, ReceiveOrderPoDetailEd, ReceiveOrderPoDetailBatchList ) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; $que_insert_rodetail = $this->db->query($sql_insert_rodetail, [ $param['ReceiveOrderID'], $obj['PoItemReceivePurchaseOrderID'], $obj['PoItemReceivePurchaseOrderSummaryID'], $obj['PoItemReceivePurchaseOrderDetailID'], $obj['PoItemReceiveID'], $obj['qty'], $obj['PoItemReceivePrice'], (doubleval($obj['PoItemReceivePrice']) * intval($obj['qty'])), $user['M_UserID'], $obj['M_ItemID'], $obj['ItemUnitID'], $obj['batchNo'], $obj['itemEd'], $jsonBatch ]); if (!$que_insert_rodetail) { $this->db->trans_rollback(); $this->sys_error_db("[Error] insert receive order detail"); exit; } $ro_detail_ID = $this->db->insert_id(); if (intval($obj['qty']) > 0) { $qty = intval($obj['qty']); for ($i = 0; $i < $qty; $i++) { # generate nomor barcode # $noBarcode = $this->generateNoBarcode($user, $param['lokasiID'], 'BNP', $obj['M_ItemID']); # INSERT INTO t_barcode_barang # $sqlInsertBarcode = "INSERT INTO t_barcode_barang( 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())"; $qryInsertBarcode = $this->db->query($sqlInsertBarcode, array( $param['ReceiveOrderID'], $ro_detail_ID, $obj['M_ItemID'], $obj['ItemUnitID'], $noBarcode, $param['lokasiID'], $user['M_BranchID'], $user['M_UserID'] )); if (!$qryInsertBarcode) { $this->db->trans_rollback(); $this->sys_error_db("[Error] insert data barcode item"); exit; } } } # INSERT form inspeksi item # $inspekitem = $obj['inspeksi_item']; $sql_insert_inspeksi = " INSERT INTO receive_order_po_inspeksi ( ReceiveOrderPoInspeksiReceiveOrderPoDetailID, ReceiveOrderPoInspeksiQtyPesan, ReceiveOrderPoInspeksiQtyActual, ReceiveOrderPoInspeksiPricePesan, ReceiveOrderPoInspeksiPriceActual, ReceiveOrderPoInspeksiDatePesan, ReceiveOrderPoInspeksiDateActual, ReceiveOrderPoInspeksiKeadaanKemasan, ReceiveOrderPoInspeksiKeadaanKemasanNote, ReceiveOrderPoInspeksiKondisiPengiriman, ReceiveOrderPoInspeksiKondisiPengirimanNote, ReceiveOrderPoInspeksiSimpulan, ReceiveOrderPoInspeksiCatatan, ReceiveOrderPoInspeksiStaffPenerimaID, ReceiveOrderPoInspeksiPengirim, ReceiveOrderPoInspeksiUserID ) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; $que_insert_inspeksi = $this->db->query($sql_insert_inspeksi, [ $ro_detail_ID, $inspekitem['qty_po'], $inspekitem['qty_ro'], $inspekitem['price_po'], $inspekitem['price_ro'], $inspekitem['date_po'], $inspekitem['date_ro'], $inspekitem['condt_kemasan'], $inspekitem['catatan_kemasan'], $inspekitem['condt_pengiriman'], $inspekitem['catatan_kirim'], $inspekitem['summary'], $inspekitem['catatan'], $inspekitem['pemeriksa'], $inspekitem['pengirim'], $user['M_UserID'] ]); if (!$que_insert_inspeksi) { $this->db->trans_rollback(); $this->sys_error_db("[Error] insert hasil form inspeksi"); exit; } } # DELETE # if (count($delete) > 0) { $deleted_id = array_column($delete, 'ReceiveOrderPoDetailID'); $placeholders = implode(', ', array_fill(0, count($deleted_id), '?')); $deleted_poid = array_column($delete, 'ReceiveOrderPoDetailPoItemReceiveID'); $placeholders_po = implode(', ', array_fill(0, count($deleted_poid), '?')); # UPDATE po item receive # $del_param = array_merge(array($user['M_UserID']), $deleted_poid, $deleted_id); $sql_up_po_receive = "UPDATE po_item_receive JOIN receive_order_po_detail ON ReceiveOrderPoDetailPoItemReceiveID = PoItemReceiveID SET PoItemReceiveQtyReceived = (PoItemReceiveQtyReceived - ReceiveOrderPoDetailQty), PoItemReceiveUpdatedUserID = ? WHERE PoItemReceiveID IN ($placeholders) AND ReceiveOrderPoDetailID IN ($placeholders_po)"; $que_up_po_receive = $this->db->query($sql_up_po_receive, $del_param); if (!$que_up_po_receive) { $this->db->trans_rollback(); $this->sys_error_db("[Error] update receive po item"); exit; } # UPDATE receive order po detail # $upd_param = array_merge(array($user['M_UserID']), $deleted_id); $sql_update_detail = "UPDATE receive_order_po_detail SET ReceiveOrderPoDetailIsActive = 'N', ReceiveOrderPoDetailDeleted = NOW(), ReceiveOrderPoDetailDeletedUserID = ? WHERE ReceiveOrderPoDetailID IN ($placeholders)"; $que_update_detail = $this->db->query($sql_update_detail, $upd_param); if (!$que_update_detail) { $this->db->trans_rollback(); $this->sys_error_db("[Error] update status receive order detail"); exit; } # update status table form inspeksi # $deleted_inspeksi = array_map(function ($item) { if (isset($item['inspeksi_item']['ReceiveOrderPoInspeksiID'])) { return $item['inspeksi_item']['ReceiveOrderPoInspeksiID']; } return null; }, $delete); $placeholders_inspeksi = implode(', ', array_fill(0, count($deleted_inspeksi), '?')); $delinspeksi_param = array_merge($user['M_UserID'], $deleted_inspeksi); $sql_inspeksi_status = "UPDATE receive_order_po_inspeksi SET ReceiveOrderPoInspeksiIsActive = 'N', ReceiveOrderPoInspeksiUserID = ?, ReceiveOrderPoInspeksiDeleted = NOW() WHERE ReceiveOrderPoInspeksiID IN ($placeholders_inspeksi)"; $que_inspeksi_status = $this->db->query($sql_inspeksi_status, $delinspeksi_param); if (!$que_inspeksi_status) { $this->db->trans_rollback(); $this->sys_error_db("[Error] update status form receive item"); exit; } # update status barcode barang # $sql_barcode = "UPDATE t_barcode_barang SET T_BarcodeBarangIsActive = 'N', T_BarcodeBarangUserID = ?, T_BarcodeBarangLastUpdated = NOW() WHERE T_BarcodeBarangReceiveOrderPoDetailID IN ($placeholders)"; $qry_barcode = $this->db->query($sql_barcode, $upd_param); if (!$qry_barcode) { $this->db->trans_rollback(); $this->sys_error_db("[Error] update status barcode barang", $this->db); exit; } } $this->db->trans_commit(); $this->sys_ok("Success"); } catch (Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } function confirmRO() { try { if (!$this->isLogin) { $this->sys_error("invalid token"); exit; } $this->db->trans_begin(); $param = $this->sys_input; $user = $this->sys_user; $ROID = $param['ROID']; # GET DATA RO # $json_ro_before = $this->getDataROPO($ROID); $sql_ro = "SELECT receive_order_po.*, DATE_FORMAT(ReceiveOrderPoIDate, '%d-%m-%Y') AS formatedDate, CASE WHEN WarehouseType = 'B' THEN CONCAT(WarehouseCode,' ', WarehouseName, ' - ', M_BranchName) WHEN WarehouseType = 'R' THEN CONCAT(WarehouseCode,' ', WarehouseName, ' - ', S_RegionalName) ELSE '' END WarehouseName, WarehouseID FROM receive_order_po JOIN warehouse ON ReceiveOrderPoWarehouseID = WarehouseID JOIN s_regional ON WarehouseS_RegionalID = S_RegionalID AND S_RegionalIsActive = 'Y' LEFT JOIN m_branch ON WarehouseM_BranchID = M_BranchID AND M_BranchIsActive = 'Y' WHERE ReceiveOrderPoID = ?"; $que_ro = $this->db->query($sql_ro, [$ROID]); if (!$que_ro) { $this->db->trans_rollback(); $this->sys_error_db("[Error] get data RO"); exit; } $data_ro = $que_ro->row_array(); if ($data_ro['ReceiveOrderPoConfirmed'] == 'Y') { $this->db->trans_rollback(); $this->sys_error_db("[Error] item dari RO{$data_ro['ReceiveOrderPoNumber']} sudah pernah di konfirmasi"); exit; } $sql_detail_ro = "SELECT receive_order_po_detail.*, PurchaseOrderID, PurchaseOrderNumber, PurchaseOrderTaxPercentPph, PurchaseOrderTaxPercentPpn, PurchaseOrderSummaryDiscountAmount as DiscountPerItem, PurchaseOrderSummaryQty as QtyAllPO, PurchaseOrderSummaryTotal as TotalAllPO, PurchaseOrderDiscountPercent AS DiscPOPercent, PurchaseOrderDiscountAmount AS DiscPORupiah FROM receive_order_po_detail JOIN purchase_order ON ReceiveOrderPoDetailPurchaseOrderID = PurchaseOrderID JOIN purchase_order_summary ON ReceiveOrderPoDetailPurchaseOrderSummaryID = PurchaseOrderSummaryID AND PurchaseOrderSummaryIsActive = 'Y' WHERE ReceiveOrderPoDetailReceiveOrderPoID = ? AND ReceiveOrderPoDetailIsActive='Y' GROUP BY ReceiveOrderPoDetailID"; $que_detail_ro = $this->db->query($sql_detail_ro, [$ROID]); if (!$que_detail_ro) { $this->db->trans_rollback(); $this->sys_error_db("[Error] get detail data ro"); exit; } $data_detail_ro = $que_detail_ro->result_array(); # UPDATE STATUS RO # $sql_update_ro = "UPDATE receive_order_po SET ReceiveOrderPoConfirmed = 'Y', ReceiveOrderPoConfirmedDate = NOW(), ReceiveOrderPoConfirmedUserID = ? WHERE ReceiveOrderPoID = ?"; $que_update_ro = $this->db->query($sql_update_ro, [$user['M_UserID'], $ROID]); if (!$que_update_ro) { $this->db->trans_rollback(); $this->sys_error_db("[Error] get update status ro"); exit; } # PREPARE DATA FOR JURNAL # $sql_jrnl_num = "SELECT `fn_numbering`('J') AS numbering"; $que_jrnl_num = $this->db->query($sql_jrnl_num, []); if (!$que_jrnl_num) { $this->sys_error_db("[Error] generate jurnal number"); $this->db->trans_rollback(); exit; } $jurnal_number = $que_jrnl_num->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->sys_error_db("[Error] get periode", $this->db); $this->db->trans_rollback(); exit; } if ($que_periode->num_rows() === 0) { $this->sys_error_db("[Error] waktu periode tidak ditemukan", $this->db); $this->db->trans_rollback(); exit; } $jurnal_periode = $que_periode->row_array()['periodeID']; $sql_jrnl_type = "SELECT JurnalTypeID FROM jurnal_type WHERE JurnalTypeCode = ? AND JurnalTypeIsActive = 'Y'"; $que_jrnl_type = $this->db->query($sql_jrnl_type, ['AUTOGOODRECEIVE']); if (!$que_jrnl_type) { $this->sys_error_db("[Error] get jurnal type", $this->db); $this->db->trans_rollback(); exit; } if ($que_jrnl_type->num_rows() === 0) { $this->sys_error_db("[Error] tipe jurnal tidak ditemukan", $this->db); $this->db->trans_rollback(); exit; } $jurnal_type = $que_jrnl_type->row_array()['JurnalTypeID']; $list_po_in_ro = array_column($data_detail_ro, 'PurchaseOrderNumber'); $str_po = implode(', ', array_unique($list_po_in_ro)); $jurnal_title = "Jurnal Penerimaan Barang Dari PO {$str_po} Tanggal {$data_ro['formatedDate']}"; $jurnal_desc = $jurnal_title . " Dengan Nomor DO {$data_ro['ReceiveOrderPoDONumber']} Di {$data_ro['WarehouseName']}"; # INSERT JURNAL HEADER # $sql_head_jurnal = "INSERT INTO jurnal ( jurnalM_BranchCompanyID, JurnalS_RegionalID, jurnalM_BranchCode, jurnalperiodeID, jurnalNo, jurnalTitle, jurnalDescription, jurnalDate, jurnalJurnalTypeID, jurnalM_UserID ) VALUES (?,?,?,?,?,?,?,NOW(),?,?)"; $que_head_jurnal = $this->db->query($sql_head_jurnal, [ $user['M_BranchCompanyID'], $user['S_RegionalID'], $user['M_BranchCode'], $jurnal_periode, $jurnal_number, $jurnal_title, $jurnal_desc, $jurnal_type, $user['M_UserID'] ]); if (!$que_head_jurnal) { $this->sys_error_db("[Error] insert header jurnal", $this->db); $this->db->trans_rollback(); exit; } $jurnal_ID = $this->db->insert_id(); $total_debet = 0.00; $total_discount_item = 0.00; $total_discount_po = 0.00; $each_desc = []; foreach ($data_detail_ro as $key => $detail) { # UPDATE PO Summary # $sql_posummary = "UPDATE purchase_order_summary SET PurchaseOrderSummaryQtyReceived = PurchaseOrderSummaryQtyReceived + ? WHERE PurchaseOrderSummaryIsActive = 'Y' AND PurchaseOrderSummaryID = ?"; $que_posummary = $this->db->query($sql_posummary, [ intval($detail['ReceiveOrderPoDetailQty']), $detail['ReceiveOrderPoDetailPurchaseOrderSummaryID'] ]); if (!$que_posummary) { $this->db->trans_rollback(); $this->sys_error_db("[Error] update qty received po summary"); exit; } $sql_cek_item = "SELECT * FROM m_item WHERE M_ItemID = ?"; $que_cek_item = $this->db->query($sql_cek_item, [$detail['ReceiveOrderPoItemID']]); if (!$que_cek_item) { $this->db->trans_rollback(); $this->sys_error_db("[Error] cek item received"); exit; } $item_cek = $que_cek_item->row_array(); if (empty($item_cek['M_ItemItem_CategoryID'])) { $this->db->trans_rollback(); $this->sys_error_db("[Error] kategori item {$item_cek['M_ItemDesc']} tidak ditemukan pada PO {$detail['PurchaseOrderNumber']}"); exit; } # INSERT JURNAL TX # if (intval($item_cek['M_ItemItem_CategoryID']) == 2) { if (empty($item_cek['M_ItemNat_SubGroupID'])) { $this->db->trans_rollback(); $this->sys_error_db("[Error] subgroup item {$item_cek['M_ItemDesc']} tidak ditemukan pada PO {$detail['PurchaseOrderNumber']}"); exit; } $sql_item_group = "SELECT * FROM map_nat_subgroup WHERE MapNatSub_NatGroupID = ? AND MapNatSub_NatSubGroupID = ? AND MapNatSub_IsActive = 'Y'"; $que_item_group = $this->db->query($sql_item_group, [ $item_cek['M_ItemNat_GroupID'], $item_cek['M_ItemNat_SubGroupID'] ]); if (!$que_item_group) { $this->db->trans_rollback(); $this->sys_error_db("[Error] get item group/subgroup"); exit; } $item_group = $que_item_group->row_array(); if ( empty($item_group['MapNatSub_BiayaCoaID']) || empty($item_group['MapNatSub_BiayaCoaAccountNo']) || empty($item_group['MapNatSub_BiayaCoaDescription']) ) { $this->db->trans_rollback(); $this->sys_error_db("[Error] Account inventory item {$item_cek['M_ItemDesc']} tidak ditemukan"); exit; } $debet = doubleval($detail['ReceiveOrderPoDetailTotal']); $total_debet = round($total_debet + $debet, 2); # INSERT JURNAL TX DEBET # $sql_tx_jurnal = "INSERT INTO jurnal_tx ( jurnalTxJurnalID, jurnalTxCoaID, jurnalTxDescription, jurnalTxDebit, jurnalTxCredit, jurnalTxM_UserID ) VALUES (?,?,?,?,?,?)"; $que_tx_jurnal = $this->db->query($sql_tx_jurnal, [ $jurnal_ID, $item_group['MapNatSub_BiayaCoaID'], $item_group['MapNatSub_BiayaCoaDescription'], $debet, 0, $user['M_UserID'] ]); if (!$que_tx_jurnal) { $this->db->trans_rollback(); $this->sys_error_db("[Error] failed insert jurnal tx {$item_cek['M_ItemDesc']} PO {$detail['PurchaseOrderNumber']}"); exit; } $juranl_tx_ID = $this->db->insert_id(); $each_desc[] = "- Add detail Jurnal debet {$item_cek['M_ItemDesc']} {$item_group['MapNatSub_BiayaCoaDescription']} sejumlah {$this->formatRupiah($debet)}"; # INSERT JURNAL ADDON # $sql_addon_jurnal = "INSERT INTO jurnal_addon ( jurnalAddOnJurnalID, jurnalAddOnJurnalTxID, jurnalAddOnCode, jurnalAddOnValue, jurnalAddOnM_ItemID, jurnalAddOnCreated, jurnalAddOnCreatedUserID ) VALUES (?,?,'PONUMB',?,?,NOW(),?)"; $que_addon_jurnal = $this->db->query($sql_addon_jurnal, [ $jurnal_ID, $juranl_tx_ID, $detail['PurchaseOrderNumber'], $detail['ReceiveOrderPoItemID'], $user['M_UserID'] ]); if (!$que_addon_jurnal) { $this->db->trans_rollback(); $this->sys_error_db("[Error] failed insert jurnal addon {$item_cek['M_ItemDesc']} PO {$detail['PurchaseOrderNumber']}"); exit; } # INSERT JURNAL TX KREDIT DISKON # $sql_po = "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 PurchaseOrderSummaryPurchaseOrderID = ReceiveOrderPoDetailPurchaseOrderID AND PurchaseOrderSummaryIsActive = 'Y' WHERE ReceiveOrderPoDetailReceiveOrderPoID = ? GROUP BY PurchaseOrderSummaryID ) as subquery"; $que_po = $this->db->query($sql_po, [$ROID]); if (!$que_po) { $this->db->trans_rollback(); $this->sys_error_db("[Error] get detail total qty and price of item po"); exit; } $data_po = $que_po->row_array(); // calc diskon per item $diskon = round(intval($detail['ReceiveOrderPoDetailQty'] * doubleval($detail['DiscountPerItem'])), 2); $total_discount_item = round($total_discount_item + $diskon, 2); // calc diskon prorata PO untuk item $diskon_po = doubleval($detail['DiscPORupiah']); if (doubleval($detail['DiscPOPercent']) != 0.00) { $diskon_po = doubleval($data_po['totalAllPricePO']) * doubleval($detail['DiscPOPercent']) / 100; } $diskon_prorata_po = $diskon_po * (doubleval($detail['TotalAllPO'])) / doubleval($data_po['totalAllPricePO']); $diskon_prorata_item = round((intval($detail['ReceiveOrderPoDetailQty']) / intval($detail['QtyAllPO'])) * $diskon_prorata_po, 2); $total_discount_po = round($total_discount_po + $diskon_prorata_item, 2); $input_diskon = [$diskon, $diskon_prorata_item]; // get account coa diskon $sql_coa_disc = "SELECT * FROM coa WHERE coaAccountNo = ? LIMIT 1"; $que_coa_disc = $this->db->query($sql_coa_disc, ['2190100001']); if (!$que_coa_disc) { $this->db->trans_rollback(); $this->sys_error_db("[Error] get account diskon"); exit; } $coa_diskon = $que_coa_disc->row_array(); foreach ($input_diskon as $kkey => $value) { if (doubleval($value) === 0.00) { continue; } $que_tx_jurnal = $this->db->query($sql_tx_jurnal, [ $jurnal_ID, $coa_diskon['coaID'], $coa_diskon['coaDescription'], 0, $value, $user['M_UserID'] ]); if (!$que_tx_jurnal) { $this->db->trans_rollback(); $this->sys_error_db("[Error] failed insert jurnal tx diskon item {$item_cek['M_ItemDesc']} PO {$detail['PurchaseOrderNumber']}"); exit; } $juranl_txdisc_ID = $this->db->insert_id(); $que_addon_jurnal = $this->db->query($sql_addon_jurnal, [ $jurnal_ID, $juranl_txdisc_ID, $detail['PurchaseOrderNumber'], $user['M_UserID'] ]); if (!$que_addon_jurnal) { $this->db->trans_rollback(); $this->sys_error_db("[Error] failed insert jurnal addon diskon item {$item_cek['M_ItemDesc']} PO {$detail['PurchaseOrderNumber']}"); exit; } } // save diskon prorata $sql_save_diskon = "UPDATE receive_order_po_detail SET ReceiveOrderPoDetailDiskonPoProrata = ? WHERE ReceiveOrderPoDetailID = ?"; $que_save_diskon = $this->db->query($sql_save_diskon, [ $diskon_prorata_item, $detail['ReceiveOrderPoDetailID'] ]); if (!$que_save_diskon) { $this->db->trans_rollback(); $this->sys_error_db("[Error] save diskon prorata item {$item_cek['M_ItemDesc']} PO {$detail['PurchaseOrderNumber']}"); exit; } } else { $this->db->trans_rollback(); $this->sys_error_db("[Error] BE Jurnal tipe selain Inventory tidak ada"); exit; } # HANDLE STOCK UPDATE # // decode batchlist item diterima $json_batch_item = $detail['ReceiveOrderPoDetailBatchList']; $batch_list = []; if (!empty($json_batch_item)) { $decode = json_decode($json_batch_item, true); if ($decode !== null && json_last_error() === JSON_ERROR_NONE) { $batch_list = $decode; } else { $this->db->trans_rollback(); $this->sys_error_db("[Error] decode json for batches number"); exit; } } // update stock based on batch foreach ($batch_list as $key => $batch) { $sql_cek_stock = "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_cek_stock = $this->db->query($sql_cek_stock, [ $detail['ReceiveOrderPoItemID'], $detail['ReceiveOrderPoItemUnitID'], $data_ro['WarehouseID'], $batch['item_category'] ]); if (!$que_cek_stock) { $this->db->trans_rollback(); $this->sys_error_db("[Error] check stock exist or not"); exit; } $stock_exist = $que_cek_stock->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)) { // calc new prive average $stock_qty_end = $stock_qty_ori + intval($batch['qty']); $all_price = ($stock_qty_ori * $stock_price) + (intval($batch['qty']) * doubleval($detail['ReceiveOrderPoDetailPrice'])); $avg_prive = 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_prive, $stock_qty_end, $user['M_UserID'], $stock_ID ]); if (!$que_update_stock) { $this->db->trans_rollback(); $this->sys_error_db("[Error] insert update stock"); exit; } // insert stockid barcode barang $sql_update_barcode = "UPDATE t_barcode_barang SET T_BarcodeBarangStockID = ? WHERE T_BarcodeBarangReceiveOrderPoDetailID = ?"; $qry_update_barcode = $this->db->query($sql_update_barcode, [ $stock_ID, $detail['ReceiveOrderPoDetailID'] ]); if (!$qry_update_barcode) { $this->db->trans_rollback(); $this->sys_error_db("[Error] update barcode stockID", $this->db); exit; } } 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['WarehouseID'], $detail['ReceiveOrderPoItemID'], $detail['ReceiveOrderPoItemUnitID'], $detail['ReceiveOrderPoDetailPrice'], $batch['qty'], $user['M_UserID'] ]); if (!$que_insert_stock) { $this->db->trans_rollback(); $this->sys_error_db("[Error] insert new batch stock"); exit; } $stockID = $this->db->insert_id(); $stock_qty_ori = 0; $stock_qty_end = intval($batch['qty']); // insert stockid barcode barang $sql_update_barcode = "UPDATE t_barcode_barang SET T_BarcodeBarangStockID = ? WHERE T_BarcodeBarangReceiveOrderPoDetailID = ?"; $qry_update_barcode = $this->db->query($sql_update_barcode, [ $stockID, $detail['ReceiveOrderPoDetailID'] ]); if (!$qry_update_barcode) { $this->db->trans_rollback(); $this->sys_error_db("[Error] update barcode stockID", $this->db); exit; } } // 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['WarehouseID'], $detail['ReceiveOrderPoItemID'], $detail['ReceiveOrderPoItemUnitID'], $stock_ID, $stock_qty_ori, $batch['qty'], $stock_qty_end, $user['M_UserID'] ]); if (!$que_stock_card) { $this->db->trans_rollback(); $this->sys_error_db("[Error] insert stock card"); exit; } // 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(); $this->sys_error_db("[Error] get latest stock"); exit; } $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'], $detail['ReceiveOrderPoItemID'], $detail['ReceiveOrderPoItemUnitID'], $stock_latest['StockStockNumber'], $stock_ID, $batch['qty'], $user['M_UserID'] ]); if (!$que_stock_log) { $this->db->trans_rollback(); $this->sys_error_db("[Error] get latest stock"); exit; } } } # insert shipping cost ke jurnal # $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, [$jurnal_ID, $ship_cost, $user['M_UserID']]); if (!$que_tx_ship) { $this->db->trans_rollback(); $this->sys_error_db("[Error] insert jurnal tx shipping cost"); exit; } } // insert jurnal tx for GRNI $total_grni = round($total_debet - ($total_discount_item + $total_discount_po), 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, [$jurnal_ID, $total_grni, $user['M_UserID']]); if (!$que_grni) { $this->db->trans_rollback(); $this->sys_error_db("[Error] insert jurnal tx GRNI"); exit; } $grni_jurnal_id = $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, [ $jurnal_ID, $grni_jurnal_id, $data_ro['ReceiveOrderPoNumber'], $user['M_UserID'] ]); if (!$que_addon_grni) { $this->db->trans_rollback(); $this->sys_error_db("[Error] insert jurnal addon GRNI"); exit; } # insert into shipping table # $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(); $this->sys_error_db("[Error] insert table shipping cost"); exit; } # LOG # $desc = "Konfirmasi penerimaan barang {$data_ro['ReceiveOrderPoNumber']} Tanggal {$data_ro['formatedDate']} di {$data_ro['WarehouseName']} yang meliputi beberapa item dari PO {$str_po}"; $log_desc = $desc . "\n" . implode("\n", $each_desc); $json_ro_after = $this->getDataROPO($ROID); $this->insertLogReceiveOrderPo($ROID, 'CONFIRM', $json_ro_before, $json_ro_after, $user['M_UserID'], $log_desc); $this->insertUserActivty($ROID, 'RO', 'CONFIRM', $user['M_UserID'], $log_desc); # GENERATE PURCHASE INVOICE # $this->generatePurchaseInvoice($user, $ROID, $total_grni, $total_discount_po, $ship_cost); $this->db->trans_commit(); $this->sys_ok("[Success] Berhasil konfirmasi terima barang"); } catch (Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } function deleteRO() { try { if (!$this->isLogin) { $this->sys_error("invalid token"); exit; } $this->db->trans_begin(); $param = $this->sys_input; $user = $this->sys_user; $ROID = $param['ROID']; # data before fo logging # $json_ro_before = $this->getDataROPO($ROID); # update status header RO # $sql = "UPDATE receive_order_po SET ReceiveOrderPoIsActive = 'N', ReceiveOrderPoDeleted = NOW(), ReceiveOrderPoDeletedUserID = ? WHERE ReceiveOrderPoID = ?"; $que = $this->db->query($sql, [$user['M_UserID'], $ROID]); if (!$que) { $this->db->trans_rollback(); $this->sys_error_db("[Error] delete receive oder"); exit; } $sql_detail = "SELECT * FROM receive_order_po_detail WHERE ReceiveOrderPoDetailReceiveOrderPoID = ? AND ReceiveOrderPoDetailIsActive = 'Y'"; $que_detail = $this->db->query($sql_detail, [$ROID]); if (!$que_detail) { $this->db->trans_rollback(); $this->sys_error_db("[Error] get detail RO "); exit; } $details = $que_detail->result_array(); # update status detail RO # foreach ($details as $key => $detail) { # update receive detail po # $sql_update_detail = "UPDATE receive_order_po_detail SET ReceiveOrderPoDetailIsActive = 'N', ReceiveOrderPoDetailDeletedUserID = ?, ReceiveOrderPoDetailDeleted = NOW() WHERE ReceiveOrderPoDetailID = ?"; $que_update_detail = $this->db->query($sql_update_detail, [ $user['M_UserID'], $detail['ReceiveOrderPoDetailID'] ]); if (!$que_update_detail) { $this->db->trans_rollback(); $this->sys_error_db("[Error] update status detail RO"); exit; } # update status form inspeksi # $sql_inspeksi = "UPDATE receive_order_po_inspeksi SET ReceiveOrderPoInspeksiIsActive = 'N' WHERE ReceiveOrderPoInspeksiReceiveOrderPoDetailID = ? "; $que_inspeksi = $this->db->query($sql_inspeksi, [$detail['ReceiveOrderPoDetailID']]); if (!$que_inspeksi) { $this->db->trans_rollback(); $this->sys_error_db("[Error] update status form inspeksi"); exit; } # update status barcode barang # $sql_barcode = "UPDATE t_barcode_barang SET T_BarcodeBarangIsActive = 'N', T_BarcodeBarangUserID = ?, T_BarcodeBarangLastUpdated = NOW() WHERE T_BarcodeBarangReceiveOrderPoDetailID = ?"; $qry_barcode = $this->db->query($sql_barcode, [ $user['M_UserID'], $detail['ReceiveOrderPoDetailID'] ]); if (!$qry_barcode) { $this->db->trans_rollback(); $this->sys_error_db("[Error] update status barcode barang", $this->db); exit; } # update po item receive # $json_po_before = $this->getPOItemReceived($detail['ReceiveOrderPoDetailPoItemReceiveID']); $sql_upd_po_received = "UPDATE po_item_receive JOIN receive_order_po_detail ON PoItemReceiveID = ReceiveOrderPoDetailPoItemReceiveID AND ReceiveOrderPoDetailReceiveOrderPoID = ? AND ReceiveOrderPoDetailID = ? SET PoItemReceiveQtyReceived = PoItemReceiveQtyReceived - ReceiveOrderPoDetailQty, PoItemReceiveUpdatedUserID = ? WHERE PoItemReceiveID = ?"; $que_upd_po_received = $this->db->query($sql_upd_po_received, [ $ROID, $detail['ReceiveOrderPoDetailID'], $user['M_UserID'], $detail['ReceiveOrderPoDetailPoItemReceiveID'] ]); if (!$que_upd_po_received) { $this->db->trans_rollback(); $this->sys_error_db("[Error] update qty PO item received"); exit; } $json_po_after = $this->getPOItemReceived($detail['ReceiveOrderPoDetailPoItemReceiveID']); $descItem = "Dihapus {$detail['M_ItemDesc']} sejumlah {$detail['ReceiveOrderPoDetailQty']} {$detail['ItemUnitName']} di RO nomor {$json_ro_before['ReceiveOrderPoNumber']} *RO belum di konfirmasi"; # log # $this->insertLogPoItemReceive( $detail['ReceiveOrderPoDetailPoItemReceiveID'], 'UPDATE', $ROID, $json_po_before, $json_po_after, $user['M_UserID'], $descItem ); } $json_ro_after = $this->getDataROPO($ROID); $this->insertLogReceiveOrderPo( $ROID, 'DELETE', $json_ro_before, $json_ro_after, $user['M_UserID'], "Update data RO ID: {$ROID}" ); $this->insertUserActivty($ROID, 'RO', 'DELETE', $user['M_UserID'], "Update data RO ID: {$ROID}"); $this->db->trans_commit(); $this->sys_ok("[Success]"); } catch (Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } function saveInspeksi() { try { if (!$this->isLogin) { $this->sys_error("invalid token"); exit; } $param = $this->sys_input; $user = $this->sys_user; # Prepare Data # $inspeksi = $param['form_inspeksi']; $ROdetailID = $param['ROdetailID']; # Insert Query # $this->db->trans_begin(); $sql_insert = "INSERT INTO receive_order_po_inspeksi ( ReceiveOrderPoInspeksiReceiveOrderPoDetailID, ReceiveOrderPoInspeksiQtyPesan, ReceiveOrderPoInspeksiQtyActual, ReceiveOrderPoInspeksiPricePesan, ReceiveOrderPoInspeksiPriceActual, ReceiveOrderPoInspeksiDatePesan, ReceiveOrderPoInspeksiDateActual, ReceiveOrderPoInspeksiExpireDate, ReceiveOrderPoInspeksiKeadaanKemasan, ReceiveOrderPoInspeksiKondisiPengiriman, ReceiveOrderPoInspeksiSimpulan, ReceiveOrderPoInspeksiCatatan, ReceiveOrderPoInspeksiStaffPenerima, ReceiveOrderPoInspeksiStaffPengirim, ReceiveOrderPoInspeksiUserID ) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; $que_insert = $this->db->query($sql_insert, [ $ROdetailID, $inspeksi['qty_po'], $inspeksi['qty_ro'], $inspeksi['price_po'], $inspeksi['price_ro'], $inspeksi['date_po'], $inspeksi['date_ro'], $inspeksi['expire_date'], $inspeksi['condt_kemasan'], $inspeksi['condt_pengiriman'], $inspeksi['summary'], $inspeksi['catatan'], $inspeksi['pemeriksa'], $inspeksi['pengirim'], $user['M_UserID'] ]); if (!$que_insert) { $this->db->trans_rollback(); $this->sys_error_db("[Error] insert into table receiec order po inspeksi"); exit; } $this->db->trans_commit(); $this->sys_ok("[Success] save inspeksi item"); } catch (Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } function generateItemPO() { try { if (!$this->isLogin) { $this->sys_error("invalid token"); exit; } $param = $this->sys_input; $userid = $this->sys_user; $POID = $param['id']; if (!isset($POID)) { $this->sys_error("Missing required parameters"); exit; } $this->db->trans_begin(); $sql_po = "SELECT * FROM purchase_order WHERE PurchaseOrderID = ?"; $que_po = $this->db->query($sql_po, [$POID]); if (!$que_po) { $this->db->trans_rollback(); $this->sys_error_db("[Error] get data PO"); exit; } $data_po = $que_po->row_array(); if ($data_po['PurchaseOrderStatus'] != 'Approved') { $this->db->trans_rollback(); $this->sys_error_db("[Error] status PO belum Approved"); exit; } $data_detail = []; if (strtolower($data_po['PurchaseOrderWarehouseType']) == 'single') { $sql_POdetail = "SELECT IFNULL(pir.PoItemReceiveID, 0) as receivedID, IFNULL(pir.PoItemReceiveQtyReceived, 0) as qtyReceived, pos.PurchaseOrderSummaryID as orderSummaryID, pos.PurchaseOrderSummaryItemID as itemID, pos.PurchaseOrderSummaryItemUnitID as itemUnitID, pos.PurchaseOrderSummaryQty as qty, pos.PurchaseOrderSummaryPrice as price, m_itemDesc as itemName, ItemUnitName as itemUnitName, PurchaseOrderDetailID FROM purchase_order_summary pos JOIN purchase_order_detail ON PurchaseOrderDetailPurchaseOrderID = pos.PurchaseOrderSummaryPurchaseOrderID AND PurchaseOrderSummaryItemID = PurchaseOrderDetailItemID AND PurchaseOrderSummaryItemUnitID = PurchaseOrderDetailItemUnitID JOIN m_item ON pos.PurchaseOrderSummaryItemID = M_ItemID JOIN itemunit ON pos.PurchaseOrderSummaryItemUnitID = ItemUnitID LEFT JOIN po_item_receive pir ON pos.PurchaseOrderSummaryPurchaseOrderID = pir.PoItemReceivePurchaseOrderID AND pos.PurchaseOrderSummaryItemID = pir.PoItemReceiveItemID WHERE pos.PurchaseOrderSummaryPurchaseOrderID = ? AND pos.PurchaseOrderSummaryIsActive = 'Y' AND IFNULL(pir.PoItemReceiveQtyReceived, 0) = 0"; $que_POdetail = $this->db->query($sql_POdetail, [$POID]); if (!$que_POdetail) { $this->db->trans_rollback(); $this->sys_error_db("[Error] get data detail PO"); exit; } $data_detail = $que_POdetail->result_array(); foreach ($data_detail as $key => $obj) { if (intval($obj['PoItemReceiveID']) == 0) { $sql_ins = "INSERT INTO po_item_receive ( PoItemReceivePurchaseOrderID, PoItemReceivePurchaseOrderSummaryID, PoItemReceivePurchaseOrderDetailID, PoItemReceiveWarehouseID, PoItemReceiveItemID, PoItemReceiveItemUnitID, PoItemReceiveQty, PoItemReceiveQtyReceived, PoItemReceiveIsActive, PoItemReceiveCreated, PoItemReceiveCreatedUserID, PoItemReceivePrice ) VALUES (?,?,?,?,?,?,?,0,'Y',NOW(),?,?)"; $que_ins = $this->db->query($sql_ins, [ $POID, $obj['orderSummaryID'], $obj['PurchaseOrderDetailID'], $data_po['PurchaseOrderWarehouseID'], $obj['itemID'], $obj['itemUnitID'], $obj['qty'], $userid, $obj['price'] ]); if (!$que_ins) { $this->db->trans_rollback(); $this->sys_error_db("[Error] insert po item receive"); exit; } $insertedID = $this->db->insert_id(); $desc = "ADD {$obj['itemName']} {$obj['qty']} {$obj['itemUnitName']} {$data_po['WarehouseName']}"; $jsonAfter = $this->getPOItemReceived($insertedID); $this->insertLogPoItemReceive($insertedID, 'ADD', 0, '', $jsonAfter, $userid, $desc); } else { $jsonBefore = $this->getPOItemReceived($obj['PoItemReceiveID']); $sql_upd = "UPDATE po_item_receive SET PoItemReceiveQty = ?, PoItemReceiveIsActive = 'Y', PoItemReceiveUpdate = NOW(), PoItemReceiveUpdatedUserID = ?, PoItemReceiveWarehouseID = ?, PoItemReceiveItemUnitID = ?, PoItemReceivePrice = ? WHERE PoItemReceiveID = ?"; $que_upd = $this->db->query($sql_upd, [ $obj['qty'], $userid, $data_po['PurchaseOrderWarehouseID'], $obj['itemUnitID'], $obj['price'], $obj['receivedID'] ]); if (!$que_upd) { $this->db->trans_rollback(); $this->sys_error_db("[Error] update po item receive"); exit; } $jsonAfter = $this->getPOItemReceived($obj['PoItemReceiveID']); $desc = "UPDATE {$obj['itemName']} {$obj['qty']} {$obj['itemUnitName']} {$data_po['WarehouseName']}"; $this->insertLogPoItemReceive($obj['PoItemReceiveID'], 'UPDATE', 0, $jsonBefore, $jsonAfter, $userid, $desc); } } } if (strtolower($data_po['PurchaseOrderWarehouseType']) == 'multiple') { $sql_det = "SELECT IFNULL(PoItemReceiveID, 0) as cekID, IFNULL(PoItemReceiveQtyReceived, 0) as qtyCek, pod.PurchaseOrderDetailPurchaseSummaryID as summaryID, pod.PurchaseOrderDetailID as poDetailID, pod.PurchaseOrderDetailWarehouseID as warehouseID, WarehouseName, pod.PurchaseOrderDetailItemID as itemID, M_ItemDesc as itemName, pos.PurchaseOrderSummaryItemUnitID as itemUnitID, ItemUnitName as itemUnitName, ConvertQuantityToPurchasedItemUnit( pod.PurchaseOrderDetailItemID, pod.PurchaseOrderDetailItemUnitID, pod.PurchaseOrderDetailQty ) as poQty, pos.PurchaseOrderSummaryPrice as price FROM purchase_order_detail pod JOIN purchase_order_summary pos ON pod.PurchaseOrderDetailPurchaseSummaryID = pos.PurchaseOrderSummaryID JOIN m_item ON pod.PurchaseOrderDetailItemID = M_ItemID JOIN itemunit ON pos.PurchaseOrderSummaryItemUnitID = ItemUnitID JOIN warehouse ON pod.PurchaseOrderDetailWarehouseID = WarehouseID LEFT JOIN po_item_receive p ON p.PoItemReceiveItemID = pod.PurchaseOrderDetailItemID AND p.PoItemReceivePurchaseOrderID = ? AND p.PoItemReceivePurchaseOrderSummaryID = pos.PurchaseOrderSummaryID AND p.PoItemReceivePurchaseOrderDetailID = pod.PurchaseOrderDetailID WHERE pod.PurchaseOrderDetailPurchaseOrderID = ? AND IFNULL(PoItemReceiveQtyReceived, 0) = 0 AND pod.PurchaseOrderDetailIsActive = 'Y'"; $que_det = $this->db->query($sql_det, [$POID, $POID]); if (!$que_det) { $this->db->trans_rollback(); $this->sys_error_db("[Error] get item"); exit; } $data_detail = $que_det->result_array(); foreach ($data_detail as $key => $obj) { if (intval($obj['cekID']) == 0) { $sql_ins = "INSERT INTO po_item_receive ( PoItemReceivePurchaseOrderID, PoItemReceivePurchaseOrderSummaryID, PoItemReceivePurchaseOrderDetailID, PoItemReceiveWarehouseID, PoItemReceiveItemID, PoItemReceiveItemUnitID, PoItemReceiveQty, PoItemReceiveQtyReceived, PoItemReceiveIsActive, PoItemReceiveCreated, PoItemReceiveCreatedUserID, PoItemReceivePrice ) VALUES (?,?,?,?,?,?,?,0,'Y',NOW(),?,?)"; $que_ins = $this->db->query($sql_ins, [ $POID, $obj['summaryID'], $obj['poDetailID'], $obj['warehouseID'], $obj['itemID'], $obj['itemUnitID'], $obj['poQty'], $userid, $obj['price'] ]); if (!$que_ins) { $this->db->trans_rollback(); $this->sys_error_db("[Error] insert po item receive multiple wh"); exit; } $insertedID = $this->db->insert_id(); $desc = "ADD {$obj['itemName']} {$obj['poQty']} {$obj['itemUnitName']} {$obj['WarehouseName']}"; $jsonAfter = $this->getPOItemReceived($insertedID); $this->insertLogPoItemReceive($insertedID, 'ADD', 0, '', $jsonAfter, $userid, $desc); } else { $jsonBefore = $this->getPOItemReceived($obj['cekID']); $sql_upd = "UPDATE po_item_receive SET PoItemReceiveQty = ?, PoItemReceiveIsActive = 'Y', PoItemReceiveUpdate = NOW(), PoItemReceiveUpdatedUserID = ?, PoItemReceiveWarehouseID = ?, PoItemReceiveItemUnitID = ?, PoItemReceivePrice = ? WHERE PoItemReceiveID = ?"; $que_upd = $this->db->query($sql_upd, [ $obj['poQty'], $userid, $obj['warehouseID'], $obj['itemUnitID'], $obj['price'], $obj['cekID'] ]); if (!$que_upd) { $this->db->trans_rollback(); $this->sys_error_db("[Error] update po item receive multiple wh"); exit; } $desc = "ADD {$obj['itemName']} {$obj['poQty']} {$obj['itemUnitName']} {$obj['WarehouseName']}"; $jsonAfter = $this->getPOItemReceived($obj['cekID']); $this->insertLogPoItemReceive($obj['cekID'], 'UPDATE', 0, $jsonBefore, $jsonAfter, $userid, $desc); } } } $this->db->trans_commit(); $this->sys_ok([ 'header' => $data_po, 'detail' => $data_detail ]); } catch (Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } function saveHandover() { try { if (!$this->isLogin) { $this->sys_error("invalid token"); exit; } $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) { $this->db->trans_rollback(); $this->sys_error_db("[Error] get PurchaseRequestID from RO Detail"); exit; } $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) { $this->db->trans_rollback(); $this->sys_error_db("[Error] insert asset handover"); exit; } $handoverID = $this->db->insert_id(); # ambil data barcode # $sql_get_barcode = "SELECT ropd.ReceiveOrderPoDetailID, ropd.ReceiveOrderPoItemID AS M_ItemID, bb.T_BarcodeBarangID FROM receive_order_po_detail ropd JOIN t_barcode_barang bb ON bb.T_BarcodeBarangReceiveOrderPoDetailID = ropd.ReceiveOrderPoDetailID AND bb.T_BarcodeBarangIsActive = 'Y' WHERE ropd.ReceiveOrderPoDetailReceiveOrderPoID = ?"; $que_get_barcode = $this->db->query($sql_get_barcode, [$param['receiveOrderPoID']]); if (!$que_get_barcode) { $this->db->trans_rollback(); $this->sys_error_db("[Error] get barcode barang from RO Detail"); exit; } $barcodes = $que_get_barcode->result_array(); # insert handover detail # foreach ($barcodes as $key => $value) { $sql_insert_handover_detail = "INSERT INTO asset_handover_detail( AssetHandoverDetailAssetHandoverID, AssetHandoverDetailT_BarcodeBarangID, AssetHandoverDetailM_ItemID, AssetHandoverDetailIsActive, AssetHandoverDetailCreated, AssetHandoverDetailUserID) VALUES(?,?,?,'Y',NOW(),?)"; $que_insert_handover_detail = $this->db->query($sql_insert_handover_detail, [ $handoverID, $value['T_BarcodeBarangID'], $value['M_ItemID'], $user['M_UserID'] ]); if (!$que_insert_handover_detail) { $this->db->trans_rollback(); $this->sys_error_db("[Error] insert asset handover detail"); exit; } } # update status handover di receive order po # $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) { $this->db->trans_rollback(); $this->sys_error_db("[Error] update status handover di RO"); exit; } $this->db->trans_commit(); $this->sys_ok("[Success] Berhasil menyimpan data serah terima barang"); } catch (Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } function saveFiles() { try { $this->db->trans_begin(); $param = $this->sys_input; $user = $this->sys_user; $path = "/home/one/project/accone/one-media/order-inventaris/"; $year = date('Y'); $targetpath = $path . $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); $error = []; 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['name'][$i], PATHINFO_EXTENSION); $random_str = bin2hex(random_bytes(4)); $new_filename = 'IVT' . $random_str . '_' . $param['receiveOrderPoNumber'] . $ext; $config['file_name'] = $new_filename; $this->upload->initialize($config); if ($this->upload->do_upload('file')) { $uploadData = $this->upload->data(); $filename = $uploadData['file_name']; $sql_insert_file = "INSERT INTO receive_order_po_document ( ReceiveOrderPoDocumentReceiveOrderPoID, ReceiveOrderPoDocumentDate, ReceiveOrderPoDocumentFile, ReceiveOrderPoDocumentIsActive, ReceiveOrderPoDocumentCreated, ReceiveOrderPoDocumentUserID ) VALUES(?,NOW(),?,'Y',NOW(),?)"; $que_insert_file = $this->db->query($sql_insert_file, [ $param['receiveOrderPoID'], $filename, $param['userId'] ]); if (!$que_insert_file) { $this->db->trans_rollback(); $this->sys_error_db("[Error] insert receive order po files"); exit; } } else { $this->db->trans_rollback(); $error[] = $this->upload->display_errors(); $this->sys_error("[Error] " . $error); exit; } } } $this->db->trans_commit(); $this->sys_ok("[Success] Berhasil upload file"); } catch (Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } function getBarcodes() { try { if (!$this->isLogin) { $this->sys_error("invalid token"); exit; } $this->db->trans_begin(); $param = $this->sys_input; $user = $this->sys_user; $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 LEFT 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) { $this->db->trans_rollback(); $this->sys_error_db("[Error] get barcodes"); exit; } $barcodes = $que->result_array(); if ($barcodes) { foreach ($barcodes as $k => $v) { if ($v['chex'] == 'N') $barcodes[$k]['chex'] = false; else $barcodes[$k]['chex'] = true; } } $this->db->trans_commit(); $this->sys_ok($barcodes); } catch (Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } private function insertJurnalPerItem($user, $detail_ro) {} private function generatePurchaseInvoice($user, $ROID, $grni, $discpo, $shipping) { # generate nomor purchase invoice # $numPI = $this->generateNoLogistik($user, 'PI'); # prepare data # $sql_data_ro = "SELECT * FROM receive_order_po WHERE ReceiveOrderPoID = ?"; $que_data_ro = $this->db->query($sql_data_ro, [$ROID]); if (!$que_data_ro) { $this->db->trans_rollback(); $this->sys_error_db("[Error] get data RO to generate PI"); exit; } $data_ro = $que_data_ro->row_array(); $sql_detail_ro = "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_detail_ro = $this->db->query($sql_detail_ro, [$ROID]); if (!$que_detail_ro) { $this->db->trans_rollback(); $this->sys_error_db("[Error] get data detail RO to generate PI"); exit; } $detail_ro = $que_detail_ro->result_array(); $due_date = new DateTime($data_ro['ReceiveOrderPoIDate']); $due_date->add(new DateInterval('P30D')); $due_date = $due_date->format('Y-m-d'); $subtotal = round(($grni - $shipping) + $discpo, 2); # insert header purchase invoice # $sql_insert_PI = "INSERT INTO supplier_invoice ( SupplierInvoiceNumber, SupplierInvoiceReceiveOrderPoID, SupplierInvoiceDate, SupplierInvoiceDueDate, SupplierInvoiceSupplierID, SupplierInvoiceRefNumber, SupplierInvoiceDeliveryOrderNumber, SupplierInvoiceSubTotal, SupplierInvoiceDiscountPercent, SupplierInvoiceDiscountAmount, SupplierInvoiceTaxPercentPph, SupplierInvoiceTaxAmountPph, SupplierInvoiceTaxPercentPpn, SupplierInvoiceTaxAmountPpn, SupplierInvoiceShippingCost, SupplierInvoiceGrandTotal, SupplierInvoiceUnpaid, SupplierInvoiceNote, SupplierInvoiceReceiveDate, SupplierInvoiceReceivedBy, SupplierInvoiceCreatedUserID ) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,NOW(),?,?)"; $que_insert_PI = $this->db->query($sql_insert_PI, [ $numPI, $data_ro['ReceiveOrderPoID'], $data_ro['ReceiveOrderPoIDate'], $due_date, $data_ro['ReceiveOrderPoSupplierID'], $data_ro['ReceiveOrderPoRefNumber'], $data_ro['ReceiveOrderPoDONumber'], $subtotal, 0.00, $discpo, 0.00, 0.00, 0.00, 0.00, $shipping, $grni, $grni, $data_ro['ReceiveOrderPoNote'], $user['M_UserID'], $user['M_UserID'] ]); if (!$que_insert_PI) { $this->db->trans_rollback(); $this->sys_error_db("[Error] insert header purchase invoice"); exit; } $Pinvoice_ID = $this->db->insert_id(); # insert detail purchase invoice # $sql_insert_detailPI = "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 => $item) { $itemprice = doubleval($item['ReceiveOrderPoDetailPrice']) - doubleval($item['DiscountPerItem']); $total_price = round($itemprice * intval($item['ReceiveOrderPoDetailQty']), 2); $que_insert_itemPI = $this->db->query($sql_insert_detailPI, [ $Pinvoice_ID, $item['ReceiveOrderPoDetailPurchaseOrderID'], $item['ReceiveOrderPoDetailPurchaseOrderSummaryID'], $item['ReceiveOrderPoDetailReceiveOrderPoID'], $item['ReceiveOrderPoDetailID'], $item['ReceiveOrderPoItemID'], $item['ReceiveOrderPoItemUnitID'], $item['M_ItemDesc'], $item['ReceiveOrderPoDetailQty'], $item['ReceiveOrderPoDetailPrice'], $item['DiscountPercent'], $item['DiscountRupiah'], $item['DiscountType'], $item['ReceiveOrderPoDetailDiskonPoProrata'], $item['DiscountPerItem'], $total_price, $total_price, $user['M_UserID'] ]); if (!$que_insert_itemPI) { $this->db->trans_rollback(); $this->sys_error_db("[Error] insert header purchase invoice"); exit; } } # insert log activity # $this->insertUserActivty($Pinvoice_ID, 'INV', 'CREATE', $user['M_UserID'], ''); } 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; } } 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 formatRupiah($data) { $data = str_replace(',', '.', $data); if (!is_numeric($data)) { return 'Input tidak valid'; } $data = (float)$data; $data = round($data, 2); if (fmod($data, 1) == 0.0) { $formatted = number_format($data, 0, ',', '.'); } else { $formatted = number_format($data, 2, ',', '.'); } return 'Rp ' . $formatted; } function template() { try { if (!$this->isLogin) { $this->sys_error("invalid token"); exit; } } catch (Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } }