isLogin) { $this->sys_error("invalid token"); exit; } $para = $this->sys_input; $name = "%"; if ($para['name'] != "") { $name = $para['name'] . "%"; } $branchid = $this->sys_user['M_BranchID']; $sql = "SELECT M_StaffID, M_StaffName, M_StaffCode FROM m_staff WHERE M_StaffM_BranchID = ? AND M_StaffName LIKE ? AND M_StaffIsActive = 'Y' "; $qry = $this->db->query($sql, [$branchid, $name]); if (!$qry) { $this->sys_error_db("[Error] get data staff"); exit; } $result = array( "records" => $qry->result_array(), "total" => sizeof($qry->result_array()) ); $this->sys_ok($result); } catch (Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } public function LookupSupplier() { try { if (!$this->isLogin) { $this->sys_error("invalid token"); exit; } $para = $this->sys_input; $name = "%"; if ($para['name'] != "") { $name = $para['name'] . "%"; } $sql = "SELECT SupplierID, SupplierCode, SupplierName, IFNULL(SupplierTermOfPayment, 0) AS SupplierTermOfPayment FROM supplier WHERE SupplierName LIKE ? AND SupplierIsActive = 'Y'"; $qry = $this->db->query($sql, [$name]); if (!$qry) { $this->sys_error_db("[Error] get data supplier"); exit; } $result = array( "records" => $qry->result_array(), "total" => sizeof($qry->result_array()) ); $this->sys_ok($result); } catch (Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } public function LookupPOold() { try { if (!$this->isLogin) { $this->sys_error("invalid token"); exit; } $para = $this->sys_input; $supID = $para['supID']; $regionalID = $this->sys_user["S_RegionalID"]; $branchID = $this->sys_user["M_BranchID"] ?? 0; // 0 untuk user regional $sql = "SELECT PurchaseOrderID, PurchaseOrderDate, PurchaseOrderNumber, PurchaseOrderDetailID FROM purchase_order JOIN purchase_order_detail ON PurchaseOrderDetailPurchaseOrderID = PurchaseOrderID AND PurchaseOrderDetailIsActive = 'Y' JOIN warehouse ON WarehouseID = PurchaseOrderDetailWarehouseID AND WarehouseIsActive = 'Y' JOIN receive_order_po_detail ON ReceiveOrderPoDetailPurchaseOrderDetailID = PurchaseOrderDetailID WHERE PurchaseOrderIsActive = 'Y' AND PurchaseOrderStatus = 'Approved' AND PurchaseOrderSupplierID = ? AND WarehouseS_RegionalID = ? AND WarehouseM_BranchID = ? AND NOT EXISTS ( SELECT 1 FROM supplier_invoice_detail WHERE SupplierInvoiceDetailReceiveOrderPoDetailID = ReceiveOrderPoDetailID AND SupplierInvoiceDetailIsActive = 'Y' AND SupplierInvoiceDetailIsVerified = 'Y' ) GROUP BY PurchaseOrderID "; $qry = $this->db->query($sql, [$supID, $regionalID, $branchID]); if (!$qry) { $this->sys_error_db("[Error] get list PO"); exit; } $result = array( "records" => $qry->result_array(), "total" => sizeof($qry->result_array()) ); $this->sys_ok($result); } catch (Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } public function LookupPO() { try { if (!$this->isLogin) { $this->sys_error("invalid token"); exit; } $para = $this->sys_input; $supID = $para['supID']; $regionalID = $this->sys_user["S_RegionalID"]; $branchID = $this->sys_user["M_BranchID"] ?? 0; // 0 untuk user regional $sql = "SELECT PurchaseOrderID, PurchaseOrderDate, PurchaseOrderNumber, PurchaseOrderDetailID FROM purchase_order JOIN purchase_order_detail ON PurchaseOrderDetailPurchaseOrderID = PurchaseOrderID AND PurchaseOrderDetailIsActive = 'Y' JOIN warehouse ON WarehouseID = PurchaseOrderDetailWarehouseID AND WarehouseIsActive = 'Y' JOIN receive_order_po_detail ON ReceiveOrderPoDetailPurchaseOrderDetailID = PurchaseOrderDetailID WHERE PurchaseOrderIsActive = 'Y' AND PurchaseOrderStatus = 'Approved' AND PurchaseOrderSupplierID = ? AND WarehouseS_RegionalID = ? AND WarehouseM_BranchID = ? AND NOT EXISTS ( SELECT 1 FROM supplier_invoice_detail WHERE SupplierInvoiceDetailReceiveOrderPoDetailID = ReceiveOrderPoDetailID AND SupplierInvoiceDetailIsActive = 'Y' AND SupplierInvoiceDetailIsVerified = 'Y' ) GROUP BY PurchaseOrderID "; $qry = $this->db->query($sql, [$supID, $regionalID, $branchID]); if (!$qry) { $this->sys_error_db("[Error] get list PO"); exit; } $result = array( "records" => $qry->result_array(), "total" => sizeof($qry->result_array()) ); $this->sys_ok($result); } catch (Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } public function LookupDetailPO() { try { if (!$this->isLogin) { $this->sys_error("invalid token"); exit; } $para = $this->sys_input; $numPO = $para['numPO']; $supID = $para['supID']; $sql = "SELECT PurchaseOrderID, PurchaseOrderDate, PurchaseOrderPaymentTerm, PurchaseOrderNumber, PurchaseOrderRefNumber, PurchaseOrderTaxPercentPph, PurchaseOrderTaxPercentPpn, PurchaseOrderGrandTotal, PurchaseOrderShippingCost, PurchaseOrderDiscountAmount, PurchaseOrderDiscountPercent, IF (PurchaseOrderDiscountAmount > 0, 'R', 'P' ) AS DiscountType FROM purchase_order WHERE PurchaseOrderIsActive = 'Y' AND PurchaseOrderNumber = ? AND PurchaseOrderSupplierID = ?"; $qry = $this->db->query($sql, [$numPO, $supID]); if (!$qry) { $this->sys_error_db("[Error] get detail PO"); exit; } $result = array( "records" => $qry->result_array()[0], "total" => sizeof($qry->result_array()[0]) ); $this->sys_ok($result); } catch (Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } public function LookupRO() { try { if (!$this->isLogin) { $this->sys_error("invalid token"); exit; } $para = $this->sys_input; $branchID = $this->sys_user['M_BranchID'] ?? 0; $poID = $para['poID']; $supID = $para['supplierID']; $sql = "SELECT DISTINCT ReceiveOrderPoID, ReceiveOrderPoNumber, ReceiveOrderPoSupplierID FROM receive_order_po_detail JOIN receive_order_po ON ReceiveOrderPoDetailReceiveOrderPoID = ReceiveOrderPoID AND ReceiveOrderPoIsActive = 'Y' JOIN warehouse ON WarehouseID = ReceiveOrderPoWarehouseID AND WarehouseM_BranchID = ? WHERE ReceiveOrderPoDetailIsActive = 'Y' AND ReceiveOrderPoDetailPurchaseOrderID = ? AND ReceiveOrderPoSupplierID = ?"; $qry = $this->db->query($sql, [$branchID, $poID, $supID]); if (!$qry) { $this->sys_error_db("[Error] get list RO"); exit; } $result = array( "records" => $qry->result_array(), "total" => sizeof($qry->result_array()) ); $this->sys_ok($result); } catch (Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } public function LookupItemRO() { try { if (!$this->isLogin) { $this->sys_error("invalid token"); exit; } $para = $this->sys_input; $roID = $para['roID']; $poID = $para['poID']; $name = "%"; if ($para['name'] != "") { $name = $para['name'] . "%"; } $page = 0; $limit = 5; if ($para['currpage'] > 0) { $page = ($para['currpage'] - 1) * $limit; } $sql = "SELECT ReceiveOrderPoDetailPurchaseOrderID, ReceiveOrderPoDetailPurchaseOrderSummaryID, ReceiveOrderPoDetailReceiveOrderPoID, ReceiveOrderPoDetailID, M_ItemID, M_ItemCode, M_ItemDesc, ReceiveOrderPoItemUnitID, unitreceive.ItemUnitName as ReceiveOrderPoItemUnitName, ReceiveOrderPoDetailQty, ReceiveOrderPoDetailPrice, IF (PurchaseOrderSummaryDiscountType = 'R', PurchaseOrderSummaryDiscountRupiah, PurchaseOrderSummaryDiscountPercent ) as Discount, PurchaseOrderSummaryDiscountType, ReceiveOrderPoDetailDiskonPoProrata FROM receive_order_po_detail JOIN receive_order_po ON ReceiveOrderPoDetailReceiveOrderPoID = ReceiveOrderPoID AND ReceiveOrderPoIsActive = 'Y' JOIN purchase_order_summary ON ReceiveOrderPoDetailPurchaseOrderSummaryID = PurchaseOrderSummaryID AND PurchaseOrderSummaryIsActive = 'Y' JOIN m_item ON M_ItemID = ReceiveOrderPoItemID AND M_ItemIsActive = 'Y' JOIN itemunit unitreceive ON unitreceive.ItemUnitID = ReceiveOrderPoItemUnitID WHERE ReceiveOrderPoDetailIsActive = 'Y' AND ReceiveOrderPoDetailPurchaseOrderID = ? AND ReceiveOrderPoID = ? AND M_ItemDesc LIKE ? AND NOT EXISTS ( SELECT 1 FROM supplier_invoice_detail WHERE SupplierInvoiceDetailReceiveOrderPoDetailID = ReceiveOrderPoDetailID AND SupplierInvoiceDetailIsActive = 'Y' ) LIMIT ? OFFSET ?"; $qry = $this->db->query($sql, [$poID, $roID, $name, $limit, $page]); if (!$qry) { $this->sys_error_db("[Error] get data item RO"); exit; } $total = "SELECT COUNT(*) as total FROM receive_order_po_detail JOIN receive_order_po ON ReceiveOrderPoDetailReceiveOrderPoID = ReceiveOrderPoID AND ReceiveOrderPoIsActive = 'Y' JOIN purchase_order_summary ON ReceiveOrderPoDetailPurchaseOrderSummaryID = PurchaseOrderSummaryID AND PurchaseOrderSummaryIsActive = 'Y' JOIN m_item ON M_ItemID = ReceiveOrderPoItemID AND M_ItemIsActive = 'Y' JOIN itemunit unitreceive ON unitreceive.ItemUnitID = ReceiveOrderPoItemUnitID WHERE ReceiveOrderPoDetailIsActive = 'Y' AND ReceiveOrderPoDetailPurchaseOrderID = ? AND ReceiveOrderPoID = ? AND M_ItemDesc LIKE ? AND NOT EXISTS ( SELECT 1 FROM supplier_invoice_detail WHERE SupplierInvoiceDetailReceiveOrderPoDetailID = ReceiveOrderPoDetailID AND SupplierInvoiceDetailIsActive = 'Y' )"; $qryto = $this->db->query($total, [$poID, $roID, $name]); if (!$qryto) { $this->sys_error_db("[Error] get total item ro"); exit; } $result = array( "records" => $qry->result_array(), "total" => $qryto->result_array()[0]['total'], ); $this->sys_ok($result); } catch (Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } public function LookupListFaktur() { try { if (!$this->isLogin) { $this->sys_error("invalid token"); exit; } $para = $this->sys_input; $branchID = $this->sys_user['M_BranchID'] ?? 0; // 0 untuk user regional $date = $para['date']; $enddate = $para['enddate']; $status = $para['status']; $supplier = $para['supplier']; $page = $para['page']; $keyw = $para['nomor']; if ($supplier == "") { $supplier = "0"; } $nomo = "%"; if ($keyw != "") { $nomo = $keyw . "%"; } $hal = 0; $limit = 10; if ($page > 0) { $hal = ($page - 1) * $limit; } $sqltal = "SELECT COUNT(*) as total FROM supplier_invoice JOIN supplier_invoice_detail ON SupplierInvoiceID = SupplierInvoiceDetailSupplierInvoiceID JOIN receive_order_po ON SupplierInvoiceDetailReceiveOrderPoID = ReceiveOrderPoID JOIN purchase_order ON SupplierInvoiceDetailPurchaseOrderID = PurchaseOrderID LEFT JOIN warehouse ON ReceiveOrderPoWarehouseID = WarehouseID AND WarehouseM_BranchID = ? JOIN supplier ON SupplierID = SupplierInvoiceSupplierID AND SupplierIsActive = 'Y' LEFT JOIN m_branch ON M_BranchID = WarehouseM_BranchID LEFT JOIN s_regional ON S_RegionalID = WarehouseS_RegionalID WHERE SupplierInvoiceIsActive = 'Y' AND ( SupplierInvoiceNumber LIKE ? OR SupplierInvoiceRefNumber LIKE ? OR SupplierInvoiceSupplierInvoiceNumber LIKE ? ) AND SupplierInvoiceDate >= DATE(?) AND SupplierInvoiceDate <= DATE(?) AND (? = 'All' OR SupplierInvoiceStatus = ?) AND (? = '0' OR SupplierInvoiceSupplierID = ?) GROUP BY SupplierInvoiceID ORDER BY SUpplierInvoiceID DESC"; $quetal = $this->db->query($sqltal, [ $branchID, $nomo, $nomo, $nomo, $date, $enddate, $status, $status, $supplier, $supplier ]); if (!$quetal) { $this->sys_error_db("[Error] get total data faktur"); exit; } $total = $quetal->result_array()[0]['total']; $sqlfak = "SELECT SupplierInvoiceID, SupplierInvoiceNumber, SupplierInvoiceDate, SupplierInvoiceDueDate, SupplierInvoiceDraftPaymentDate, SupplierInvoiceSupplierID, SupplierName, SupplierInvoiceStatus, SupplierInvoiceNote, SupplierInvoiceGrandTotal, SupplierInvoiceSupplierInvoiceNumber, CASE WHEN WarehouseType = 'B' THEN CONCAT(WarehouseCode,' ', WarehouseName, ' - ', M_BranchName) WHEN WarehouseType = 'R' THEN CONCAT(WarehouseCode,' ', WarehouseName, ' - ', S_RegionalName) ELSE '' END as WarehouseName, ReceiveOrderPoID, ReceiveOrderPoTypePurchase, PurchaseOrderItemCategoryID FROM supplier_invoice JOIN supplier_invoice_detail ON SupplierInvoiceID = SupplierInvoiceDetailSupplierInvoiceID JOIN receive_order_po ON SupplierInvoiceDetailReceiveOrderPoID = ReceiveOrderPoID JOIN purchase_order ON SupplierInvoiceDetailPurchaseOrderID = PurchaseOrderID LEFT JOIN warehouse ON ReceiveOrderPoWarehouseID = WarehouseID AND WarehouseM_BranchID = ? JOIN supplier ON SupplierID = SupplierInvoiceSupplierID AND SupplierIsActive = 'Y' LEFT JOIN m_branch ON M_BranchID = WarehouseM_BranchID LEFT JOIN s_regional ON S_RegionalID = WarehouseS_RegionalID WHERE SupplierInvoiceIsActive = 'Y' AND ( SupplierInvoiceNumber LIKE ? OR SupplierInvoiceRefNumber LIKE ? OR SupplierInvoiceSupplierInvoiceNumber LIKE ? ) AND SupplierInvoiceDate >= DATE(?) AND SupplierInvoiceDate <= DATE(?) AND (? = 'All' OR SupplierInvoiceStatus = ?) AND (? = '0' OR SupplierInvoiceSupplierID = ?) GROUP BY SupplierInvoiceID ORDER BY SUpplierInvoiceID DESC LIMIT ? OFFSET ?"; $quefak = $this->db->query($sqlfak, [ $branchID, $nomo, $nomo, $nomo, $date, $enddate, $status, $status, $supplier, $supplier, $limit, $hal ]); if (!$quefak) { $this->sys_error_db("[Error] get list data faktur"); exit; } $result = array( "records" => $quefak->result_array(), "total" => $total ); $this->sys_ok($result); } catch (Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } public function LookupFakturDetail() { try { if (!$this->isLogin) { $this->sys_error('invalid token'); exit; } $para = $this->sys_input; $sql = "SELECT SupplierInvoiceID, SupplierInvoiceDate, SupplierInvoiceDueDate, SupplierInvoiceDraftPaymentDate, SupplierInvoiceSupplierID, SupplierName, SupplierCode, SupplierInvoicePurchaseOrderID, '' PurchaseOrderDate, '' PurchaseOrderNumber, SupplierInvoiceRefNumber, SupplierInvoiceDeliveryOrderNumber, SupplierInvoiceSupplierInvoiceNumber, SupplierInvoiceSupplierInvoiceDate, SupplierInvoiceTaxPercentPph, SupplierInvoiceTaxPercentPpn, SupplierInvoiceDiscountAmount, SupplierInvoiceDiscountPercent, SupplierInvoiceShippingCost, SupplierInvoiceAdjustmentAmount, SupplierInvoiceAdjustmentNote, SupplierInvoiceNote, IF (SupplierInvoiceDiscountAmount > 0, 'R', 'P' ) AS DiscountType, SupplierInvoiceReceiveOrderPoID, ReceiveOrderPoNumber, ReceiveOrderPoTypePurchase AS typePurchase FROM supplier_invoice JOIN supplier ON SupplierInvoiceSupplierID = SupplierID JOIN receive_order_po ON ReceiveOrderPoID = SupplierInvoiceReceiveOrderPoID WHERE SupplierInvoiceIsActive = 'Y' AND SupplierInvoiceID = ?"; $que = $this->db->query($sql, $para['SInvoiceID']); if (!$que) { $this->sys_error_db('[Error] get detail data invoice'); exit; } $data = $que->row_array(); $sqldet = "SELECT SupplierInvoiceDetailID, SupplierInvoiceDetailSupplierInvoiceID, SupplierInvoiceDetailPurchaseOrderID, SupplierInvoiceDetailPurchaseOrderSummaryID, SupplierInvoiceDetailReceiveOrderPoID, SupplierInvoiceDetailReceiveOrderPoDetailID, SupplierInvoiceDetailItemID, SupplierInvoiceDetailItemUnitID, SupplierInvoiceDetailDescription, SupplierInvoiceDetailQty, SupplierInvoiceDetailPrice, SupplierInvoiceDetailDiscountPercent, SupplierInvoiceDetailDiscountDiscountRupiah, SupplierInvoiceDetailDiscountDiscountType, SupplierInvoiceDetailDiscountAmount, SupplierInvoiceDetailDiscountPoProrata, SupplierInvoiceDetailTotal, M_ItemCode, M_ItemDesc, PurchaseOrderNumber FROM supplier_invoice_detail JOIN m_item ON M_ItemID = SupplierInvoiceDetailItemID AND M_ItemIsActive = 'Y' JOIN purchase_order ON SupplierInvoiceDetailPurchaseOrderID = PurchaseOrderID AND PurchaseOrderIsActive = 'Y' WHERE SupplierInvoiceDetailIsActive = 'Y' AND SupplierInvoiceDetailSupplierInvoiceID = ?"; $quedet = $this->db->query($sqldet, [$para['SInvoiceID']]); if (!$quedet) { $this->sys_error_db("[Error] get detail item faktur"); exit; } if (isset($data['typePurchase']) && $data['typePurchase'] == 'aset') { $sql_dp = "SELECT IFNULL(SupplierDownpaymentAmount, 0) AS dp_amount FROM supplier_invoice JOIN receive_order_po ON ReceiveOrderPoID = SupplierInvoiceReceiveOrderPoID JOIN purchase_order_asset_contract ON PurchaseOrderAssetContractReceiveOrderPoID = ReceiveOrderPoID AND PurchaseOrderAssetContractIsActive = 'Y' JOIN supplier_downpayment ON SupplierDownpaymentPurchasOrderID = PurchaseOrderAssetContractPurchaseOrderID AND SupplierDownpaymentIsActive = 'Y' WHERE SupplierInvoiceID = ?"; $que_dp = $this->db->query($sql_dp, [ $para['SInvoiceID'] ]); if (!$que_dp) { $this->sys_error_db("[Error] get info contract asset"); exit; } $dp_amount = $que_dp->row_array()['dp_amount']; $data['dp_amount'] = $dp_amount; } $data['detail'] = $quedet->result_array(); $result = $data; $this->sys_ok($result); } catch (Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } public function LookupAttachment() { try { if (!$this->isLogin) { $this->sys_error("invalid token"); exit; } $para = $this->sys_input; $data = []; $sql = "SELECT ReceiveOrderPoDocumentID AS attach_id, ReceiveOrderPoDocumentFile AS img_url, ReceiveOrderPoDocumentCreated AS created FROM receive_order_po_document WHERE ReceiveOrderPoDocumentReceiveOrderPoID = ? AND ReceiveOrderPoDocumentIsActive = 'Y'"; $que = $this->db->query($sql, [$para['roID']]); if (!$que) { $this->sys_error_db("[Error] failed get data attachment inventaris"); exit; } $rows = $que->result_array(); foreach ($rows as $key => $value) { $rows[$key]['category'] = $para['category']; } if (count($rows) > 0) { $data = $rows; } $this->sys_ok($data); } catch (Exception $exc) { $msg = $exc->getMessage(); $this->sys_error($msg); } } // ---------------------------------------------------------------------------------- public function CreateFaktur() { try { if (!$this->isLogin) { $this->sys_error("invalid token"); exit; } $user = $this->sys_user; $para = $this->sys_input; $userID = $this->sys_user["M_UserID"]; $this->db->trans_begin(); // $sqlnum = "SELECT `fn_numbering`('INV') as SINum"; // $qrynum = $this->db->query($sqlnum, []); // if (!$qrynum) { // $this->db->trans_rollback(); // $this->sys_error_db("[Error] failed generate number"); // exit; // } // $SINum = $qrynum->row_array()['SINum']; $areaid = $user['M_BranchID']; $areatype = 'B'; if ($user['loginLevel'] == 'regional') { $areaid = $user['S_RegionalID']; $areatype = 'R'; } $sqlusrdivisi = "SELECT M_UserDivisionDivisionID FROM m_userdivision WHERE M_UserDivisionM_UserID = ? AND M_UserDivisionIsActive = 'Y'"; $queusrdivisi = $this->db->query($sqlusrdivisi, [$user['M_UserID']]); if (!$queusrdivisi) { $this->db->trans_rollback(); $this->sys_error_db("[Error] get user divisi", $this->db); exit; } $userDivID = $queusrdivisi->row_array()['M_UserDivisionDivisionID']; $sqlnum = "SELECT `fn_penomoran`(?, ?, ?, ?, ?, ?) AS numpd;"; $quenum = $this->db->query($sqlnum, ['PI', $userDivID, $areatype, $areaid, 'SM', 'Y']); if (!$quenum) { $this->db->trans_rollback(); $this->sys_error_db("[Error] generate number doc", $this->db); exit; } $numpd = $quenum->row_array()['numpd']; /* *== Validasi untuk mencegah double click simpan faktur */ $sqlcheck = "SELECT SupplierInvoiceID FROM supplier_invoice WHERE SupplierInvoiceSupplierInvoiceNumber = ? AND SupplierInvoiceRefNumber = ? AND SupplierInvoicePurchaseOrderID = ? AND SupplierInvoiceGrandTotal = ? AND SupplierInvoiceIsActive = 'Y'"; $qrycheck = $this->db->query($sqlcheck, [ $para['SISupplierInvoiceNumber'], $para['SIRefNumber'], $para['SIPoID'], $para['SIGrandTotal'] ]); if (!$qrycheck) { $this->db->trans_rollback(); $this->sys_error_db("[Error] checking for duplicate invoice"); exit; } if ($qrycheck->num_rows() > 0) { $msg = "Faktur sudah dibuat. Hapus yang sudah ada lalu buat baru jika belum sesuai. Detail Faktur: No.Faktur {$para['SISupplierInvoiceNumber']} | PO ID {$para['SIPoID']} | RefNumber {$para['SIRefNumber']} | GrandTotal {$para['SIGrandTotal']}"; throw new Exception($msg); } $sqlinsert = "INSERT INTO supplier_invoice ( SupplierInvoiceNumber, SupplierInvoicePurchaseOrderID, SupplierInvoiceDate, SupplierInvoiceDueDate, SupplierInvoiceDraftPaymentDate, SupplierInvoiceSupplierID, SupplierInvoiceRefNumber, SupplierInvoiceSupplierInvoiceNumber, SupplierInvoiceSupplierInvoiceDate, SupplierInvoiceSubTotal, SupplierInvoiceDiscountPercent, SupplierInvoiceDiscountAmount, SupplierInvoiceTaxPercentPph, SupplierInvoiceTaxAmountPph, SupplierInvoiceTaxPercentPpn, SupplierInvoiceTaxAmountPpn, SupplierInvoiceShippingCost, SupplierInvoiceAdjustmentAmount, SupplierInvoiceAdjustmentNote, SupplierInvoiceGrandTotal, SupplierInvoiceUnpaid, SupplierInvoiceNote, SupplierInvoiceReceiveDate, SupplierInvoiceReceivedBy, SupplierInvoiceStatus, SupplierInvoiceCreatedUserID ) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; $qryinsert = $this->db->query($sqlinsert, [ $numpd, $para['SIPoID'], $para['SIDate'], $para['SIDueDate'], $para['SIDraftDate'], $para['SISupplierID'], $para['SIRefNumber'], $para['SISupplierInvoiceNumber'], $para['SISupplierInvoiceDate'], $para['SISubTotal'], $para['SIDiscountPercent'], $para['SIDiscountAmount'], $para['SITaxPercentPph'], $para['SITaxAmountPph'], $para['SITaxPercentPpn'], $para['SITaxAmountPpn'], $para['SIShippingCost'], $para['SIAdjustmentAmount'], $para['SIAdjustmentNote'], $para['SIGrandTotal'], $para['SIGrandTotal'], $para['SINote'], $para['SIReceiveDate'], $para['SIReceivedBy'], $para['SIStatus'], $userID ]); if (!$qryinsert) { $this->db->trans_rollback(); $this->sys_error_db("[Error] insert faktur"); exit; } $fakturID = $this->db->insert_id(); $itemData = $para['SIDetail']; foreach ($itemData as $key => $item) { $itemInsert = $this->InsertItemFaktur($fakturID, $item, $userID); if (!$itemInsert['status']) { $this->db->trans_rollback(); $this->sys_error_db("[Error] insert faktur detail"); exit; } } $sqldata = "SELECT * FROM supplier_invoice WHERE SupplierInvoiceID = ?"; $quedata = $this->db->query($sqldata, [$fakturID]); if (!$quedata) { $this->db->trans_rollback(); $this->sys_error_db("[Error] get last data inserted"); exit; } $desc = 'create faktur no: ' . $numpd; $log = $this->InsertLogActivity("INV", "CREATE", $desc, $fakturID, $quedata->result_array()[0], $userID); if (!$log['status']) { $this->db->trans_rollback(); $this->sys_error_db("[Error] log activity user on create faktur"); exit; } $this->db->trans_commit(); $result = array(); $this->sys_ok($result); } catch (Exception $exc) { $message = $exc->getMessage(); $this->db->trans_rollback(); $this->sys_error($message); } } public function UpdateFaktur() { try { if (!$this->isLogin) { $this->sys_error("invalid token"); exit; } $para = $this->sys_input; $fakturID = $para['fakturID']; $userID = $this->sys_user["M_UserID"]; $this->db->trans_begin(); $sqlupdate = "UPDATE supplier_invoice SET SupplierInvoicePurchaseOrderID = ?, SupplierInvoiceDate = ?, SupplierInvoiceDueDate = ?, SupplierInvoiceSupplierID = ?, SupplierInvoiceRefNumber = ?, SupplierInvoiceSupplierInvoiceNumber = ?, SupplierInvoiceSupplierInvoiceDate = ?, SupplierInvoiceSubTotal = ?, SupplierInvoiceDiscountPercent = ?, SupplierInvoiceDiscountAmount = ?, SupplierInvoiceTaxPercentPph = ?, SupplierInvoiceTaxAmountPph = ?, SupplierInvoiceTaxPercentPpn = ?, SupplierInvoiceTaxAmountPpn = ?, SupplierInvoiceShippingCost = ?, SupplierInvoiceAdjustmentAmount = ?, SupplierInvoiceAdjustmentNote = ?, SupplierInvoiceGrandTotal = ?, SupplierInvoiceUnpaid = ?, SupplierInvoicePaidAmount = ?, SupplierInvoiceNote = ?, SupplierInvoiceStatus = ?, SupplierInvoiceDraftPaymentDate = ?, SupplierInvoiceLastUpdated = NOW(), SupplierInvoiceLastUpdatedUserID = ? WHERE SupplierInvoiceID = ?"; $qryupdate = $this->db->query($sqlupdate, [ $para['SIPoID'], $para['SIDate'], $para['SIDueDate'], $para['SISupplierID'], $para['SIRefNumber'], $para['SISupplierInvoiceNumber'], $para['SISupplierInvoiceDate'], $para['SISubTotal'], $para['SIDiscountPercent'], $para['SIDiscountAmount'], $para['SITaxPercentPph'], $para['SITaxAmountPph'], $para['SITaxPercentPpn'], $para['SITaxAmountPpn'], $para['SIShippingCost'], $para['SIAdjustmentAmount'], $para['SIAdjustmentNote'], $para['SIGrandTotal'], $para['SIGrandTotal'], $para['SIPaidAmount'], $para['SINote'], $para['SIStatus'], $para['SIDraftDate'], $userID, $fakturID ]); if (!$qryupdate) { $this->db->trans_rollback(); $this->sys_error_db("[Error] error update faktur"); exit; } $sqldel = "UPDATE supplier_invoice_detail SET SupplierInvoiceDetailIsActive = 'N' WHERE SupplierInvoiceDetailIsActive = 'Y' AND SupplierInvoiceDetailSupplierInvoiceID = ?"; $qrydel = $this->db->query($sqldel, [$fakturID]); if (!$qrydel) { $this->db->trans_rollback(); $this->sys_error_db("[Error] error de-activate item faktur"); exit; } $itemData = $para['SIDetail']; foreach ($itemData as $key => $item) { $itemInsert = $this->InsertItemFaktur($fakturID, $item, $userID); if (!$itemInsert['status']) { $this->sys_error_db("[Error] insert faktur"); exit; } } $sqldata = "SELECT * FROM supplier_invoice WHERE SupplierInvoiceID = ?"; $quedata = $this->db->query($sqldata, [$fakturID]); if (!$quedata) { $this->db->trans_rollback(); $this->sys_error_db("[Error] get last data updated"); exit; } $data = $quedata->result_array()[0]; $desc = 'update faktur no: ' . $data['SupplierInvoiceNumber']; $log = $this->InsertLogActivity("INV", "UPDATE", $desc, $fakturID, $data, $userID); if (!$log['status']) { $this->db->trans_rollback(); $this->sys_error_db("[Error] log activity user on create faktur"); exit; } $this->db->trans_commit(); $result = array(); $this->sys_ok($result); } catch (Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } function InsertItemFaktur($fakturID, $item, $userID): array { try { $sqlinsert = "INSERT INTO supplier_invoice_detail ( SupplierInvoiceDetailSupplierInvoiceID, SupplierInvoiceDetailPurchaseOrderID, SupplierInvoiceDetailPurchaseOrderSummaryID, SupplierInvoiceDetailReceiveOrderPoID, SupplierInvoiceDetailReceiveOrderPoDetailID, SupplierInvoiceDetailItemID, SupplierInvoiceDetailItemUnitID, SupplierInvoiceDetailDescription, SupplierInvoiceDetailQty, SupplierInvoiceDetailPrice, SupplierInvoiceDetailDiscountPercent, SupplierInvoiceDetailDiscountDiscountRupiah, SupplierInvoiceDetailDiscountDiscountType, SupplierInvoiceDetailDiscountPoProrata, SupplierInvoiceDetailDiscountAmount, SupplierInvoiceDetailTotal, SupplierInvoiceDetailUnpaid, SupplierInvoiceDetailCreatedUserID ) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; $qryinsert = $this->db->query($sqlinsert, [ $fakturID, $item['SIDPOID'], $item['SIDPOSummaryID'], $item['SIDROID'], $item['SIDRODetailID'], $item['SIDItemID'], $item['SIDItemUnitID'], $item['SIDDescription'], $item['SIDQty'], $item['SIDPrice'], $item['SIDDiscountPercent'], $item['SIDDiscountRupiah'], $item['SIDDiscountType'], $item['SIDDiscountPOProrata'], $item['SIDDiscountAmount'], $item['SIDTotal'], $item['SIDTotal'], $userID ]); if (!$qryinsert) { $this->db->trans_rollback(); return [ 'status' => false, 'message' => '[Error] insert item faktur' ]; } return [ 'status' => true, 'message' => 'Item successfully added to invoice' ]; } catch (Exception $exc) { return [ 'status' => false, 'message' => $exc->getMessage() ]; } } function InsertLogActivity($Code, $Status, $Description, $RefID, $Data, $userID): array { try { $json = json_encode($Data); $sqllog = "INSERT INTO user_activity ( UserActivityCode, UserActivityStatus, UserActivityDescription, UserActivityRefID, UserActivityData, UserActivityUserID, UserActivityCreated ) VALUES (?,?,?,?,?,?,NOW())"; $quelog = $this->db->query($sqllog, [ $Code, $Status, $Description, $RefID, $json, $userID ]); if (!$quelog) { $this->db->trans_rollback(); return [ 'status' => false, 'message' => '[Error] insert into user activity' ]; } return [ 'status' => true, 'message' => 'Log written' ]; } catch (Exception $exc) { return [ 'status' => false, 'message' => $exc->getMessage() ]; } } public function DeleteFaktur() { try { if (!$this->isLogin) { $this->sys_error("invalid token"); exit; } $para = $this->sys_input; $userID = $this->sys_user["M_UserID"]; $this->db->trans_begin(); $sqldel = "UPDATE supplier_invoice SET SupplierInvoiceIsActive = 'N' WHERE SupplierInvoiceIsActive = 'Y' AND SupplierInvoiceID = ?"; $qrydel = $this->db->query($sqldel, [$para['SInvoiceID']]); if (!$qrydel) { $this->db->trans_rollback(); $this->sys_error_db("[Error] error de-activate faktur"); exit; } $sqldel2 = "UPDATE supplier_invoice_detail SET SupplierInvoiceDetailIsActive = 'N' WHERE SupplierInvoiceDetailIsActive = 'Y' AND SupplierInvoiceDetailSupplierInvoiceID = ?"; $qrydel2 = $this->db->query($sqldel2, [$para['SInvoiceID']]); if (!$qrydel2) { $this->db->trans_rollback(); $this->sys_error_db("[Error] error de-activate item faktur"); exit; } $sqldata = "SELECT * FROM supplier_invoice WHERE SupplierInvoiceID = ?"; $quedata = $this->db->query($sqldata, [$para['SInvoiceID']]); if (!$quedata) { $this->db->trans_rollback(); $this->sys_error_db("[Error] get data deleted"); exit; } $data = $quedata->result_array()[0]; $desc = 'delete faktur no: ' . $data['SupplierInvoiceNumber']; $log = $this->InsertLogActivity("INV", "DELETE", $desc, $para['SInvoiceID'], $data, $userID); if (!$log['status']) { $this->db->trans_rollback(); $this->sys_error_db("[Error] log activity user on create faktur"); exit; } $this->db->trans_commit(); $result = array( 'status' => 'OK', 'message' => 'succes delete' ); $this->sys_ok($result); } catch (Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } public function VerifyFaktur() { try { if (!$this->isLogin) { $this->sys_error("invalid token"); exit; } $para = $this->sys_input; $user = $this->sys_user; $fakturID = $para['fakturID']; $this->db->trans_begin(); // update status faktur ke approved $sqlupd = "UPDATE supplier_invoice SET SupplierInvoiceStatus = 'Verified', SupplierInvoiceVerifiedDate = NOW(), SupplierInvoiceVerifiedUserID = ?, SupplierInvoiceLastUpdated = NOW(), SupplierInvoiceLastUpdatedUserID = ? WHERE SupplierInvoiceIsActive = 'Y' AND SupplierInvoiceID = ?"; $queupd = $this->db->query($sqlupd, [$user['M_UserID'], $user['M_UserID'], $fakturID]); if (!$queupd) { $this->db->trans_rollback(); $this->sys_error_db("[Error] update status supplier invoice to verified"); exit; } $sqldet = "UPDATE supplier_invoice_detail SET SupplierInvoiceDetailIsVerified = 'Y', SupplierInvoiceDetailLastUpdated = NOW(), SupplierInvoiceDetailLastUpdatedUserID = ? WHERE SupplierInvoiceDetailSupplierInvoiceID = ? AND SupplierInvoiceDetailIsActive = 'Y'"; $quedet = $this->db->query($sqldet, [$user['M_UserID'], $fakturID]); if (!$quedet) { $this->db->trans_rollback(); $this->sys_error_db("[Error] update status supplier invoice detail to verified"); exit; } $this->db->trans_commit(); $this->sys_ok("[Success] update status faktur to verified"); } catch (Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } public function RejectFaktur() { try { if (!$this->isLogin) { $this->sys_error("invalid token"); exit; } $para = $this->sys_input; $user = $this->sys_user; $fakturID = $para['fakturID']; $this->db->trans_begin(); $sqlupd = "UPDATE supplier_invoice SET SupplierInvoiceStatus = 'Reject', SupplierInvoiceLastUpdated = NOW(), SupplierInvoiceLastUpdatedUserID = ? WHERE SupplierInvoiceIsActive = 'Y' AND SupplierInvoiceID = ?"; $queupd = $this->db->query($sqlupd, [$user['M_UserID'], $fakturID]); if (!$queupd) { $this->db->trans_rollback(); $this->sys_error_db("[Error] update status supplier invoice to rejected"); exit; } // TODO: Need Confirmation // ? Apakah setelah reject, item faktur masih bisa difaktur lagi atau tidak? // Kalau bisa, maka perlu update detail supplier_invoice_detail ke N $sqldet = "UPDATE supplier_invoice_detail SET SupplierInvoiceDetailIsActive = 'N', SupplierInvoiceDetailLastUpdated = NOW(), SupplierInvoiceDetailLastUpdatedUserID = ? WHERE SupplierInvoiceDetailSupplierInvoiceID = ? AND SupplierInvoiceDetailIsActive = 'Y' "; $quedet = $this->db->query($sqldet, [$user['M_UserID'], $fakturID]); if (!$quedet) { $this->db->trans_rollback(); $this->sys_error_db("[Error] update status supplier invoice detail to non active"); exit; } $this->db->trans_commit(); $this->sys_ok("[Success] update status faktur to reject"); } catch (Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } public function ApproveFaktur() { try { if (!$this->isLogin) { $this->sys_error("invalid token"); exit; } $para = $this->sys_input; $user = $this->sys_user; $fakturID = $para['fakturID']; $this->db->trans_begin(); // update status faktur ke approved $sqlupd = "UPDATE supplier_invoice SET SupplierInvoiceStatus = 'Approved', SupplierInvoiceApprovedDate = NOW(), SupplierInvoiceApprovedUserID = ?, SupplierInvoiceLastUpdated = NOW(), SupplierInvoiceLastUpdatedUserID = ? WHERE SupplierInvoiceIsActive = 'Y' AND SupplierInvoiceID = ?"; $queupd = $this->db->query($sqlupd, [$user['M_UserID'], $user['M_UserID'], $fakturID]); if (!$queupd) { $this->db->trans_rollback(); $this->sys_error_db("[Error] update status supplier invoice to approved"); exit; } // get periode untuk jurnal // ---------------------------------------------------------------------------------------- $sqlprd = "SELECT periodeID FROM periode WHERE DATE(NOW()) BETWEEN DATE(periodeStartDate) AND DATE(periodeEndDate) AND periodeIsActive = 'Y' AND periodeIsClosed = 'N'"; $queprd = $this->db->query($sqlprd, []); if (!$queprd) { $this->db->trans_rollback(); $this->sys_error_db("[Error] get periode jurnal"); exit; } $periodeJurnal = $queprd->row_array()['periodeID']; // generate number jurnal $sqljno = "SELECT `fn_numbering`('J') AS numbering"; $quejno = $this->db->query($sqljno, []); if (!$quejno) { $this->db->trans_rollback(); $this->sys_error_db("[Error] generate number jurnal"); exit; } $jurnalNumber = $quejno->row_array()['numbering']; // get data faktur // ---------------------------------------------------------------------------------------- $sqlinv = "SELECT supplier_invoice.* , supplier_invoice_detail.*, ReceiveOrderPoNumber, ReceiveOrderPoM_BranchCode, ReceiveOrderPoS_RegionalID, ReceiveOrderPoTypePurchase AS typePurchase FROM supplier_invoice JOIN supplier_invoice_detail ON SupplierInvoiceDetailSupplierInvoiceID = SupplierInvoiceID AND SupplierInvoiceDetailIsActive = 'Y' JOIN receive_order_po ON SupplierInvoiceDetailReceiveOrderPoID = ReceiveOrderPoID AND ReceiveOrderPoIsActive = 'Y' WHERE SupplierInvoiceIsActive = 'Y' AND SupplierInvoiceID = ?"; $queinv = $this->db->query($sqlinv, [$fakturID]); if (!$queinv) { $this->db->trans_rollback(); $this->sys_error_db("[Error] get detail data faktur"); exit; } $invoice = $queinv->result_array(); $invoiceNumber = $invoice[0]['SupplierInvoiceNumber']; $invoiceDate = $invoice[0]['SupplierInvoiceDate']; $invDONumber = $invoice[0]['SupplierInvoiceDeliveryOrderNumber']; $invROList = []; foreach ($invoice as $key => $value) { if (!in_array($value['ReceiveOrderPoNumber'], $invROList)) { $invROList[] = $value['ReceiveOrderPoNumber']; } } $invRONumbers = implode(", ", $invROList); $sqljrtype = "SELECT JurnalTypeID FROM jurnal_type WHERE JurnalTypeCode = 'AUTOINVOICE' AND JurnalTypeIsActive = 'Y'"; $quejrtype = $this->db->query($sqljrtype, []); if (!$quejrtype) { $this->db->trans_rollback(); $this->sys_error_db("[Error] get jurnal type"); exit; } $jrtype = $quejrtype->result_array()[0]['JurnalTypeID']; // insert into table jurnal // ---------------------------------------------------------------------------------------- $sqljrnl = "INSERT INTO jurnal ( jurnalM_BranchCompanyID, JurnalS_RegionalID, jurnalM_BranchCode, jurnalperiodeID, jurnalNo, jurnalTitle, jurnalDescription, jurnalDate, jurnalJurnalTypeID, jurnalM_UserID ) VALUES (?,?,?,?,?,?,?,NOW(),?,?)"; $quejrnl = $this->db->query($sqljrnl, [ $user['M_BranchCompanyID'], $invoice[0]['ReceiveOrderPoS_RegionalID'], $invoice[0]['ReceiveOrderPoM_BranchCode'], $periodeJurnal, $jurnalNumber, "Jurnal Tukar Faktur Nomor {$invoiceNumber} Tanggal {$invoiceDate}", "Faktur Nomor: {$invoiceNumber}, Tanggal: {$invoiceDate}, Nomor PO: {$invDONumber}, RO: {$invRONumbers}", $jrtype, $user['M_UserID'] ]); if (!$quejrnl) { $this->db->trans_rollback(); $this->sys_error_db("[Error] insert into table jurnal"); exit; } $jurnalID = $this->db->insert_id(); // insert jurnal tx for GRNI (debit) // ---------------------------------------------------------------------------------------- $ship_cost = round(doubleval($invoice[0]['SupplierInvoiceShippingCost']), 2); $totalGRNI = 0; foreach ($invoice as $key => $inv) { $totalGRNI = $totalGRNI + (doubleval($inv['SupplierInvoiceDetailTotal']) - doubleval($inv['SupplierInvoiceDetailDiscountPoProrata'])) + $ship_cost; } $sqlcoa = "SELECT coaID, coaDescription, coaAccountNo FROM coa WHERE coaAccountNo = ? AND coaIsActive = 'Y'"; $quegrn = $this->db->query($sqlcoa, ['2110100030']); if (!$quegrn) { $this->db->trans_rollback(); $this->sys_error_db("[Error] get coa id grn"); exit; } $coaGRNI = $quegrn->result_array()[0]; $insertgrni = $this->InsertJurnalTx( $jurnalID, $coaGRNI['coaID'], $coaGRNI['coaDescription'], $user['M_UserID'], round($totalGRNI, 2), 0 ); if (!$insertgrni['status']) { $this->db->trans_rollback(); $this->sys_error_db($insertgrni['msg']); exit; } // insert jurnal tx for Pajak masukan (debit) // ---------------------------------------------------------------------------------------- $totalPajak = doubleval($invoice[0]['SupplierInvoiceTaxAmountPph']) + doubleval($invoice[0]['SupplierInvoiceTaxAmountPpn']); $quetax = $this->db->query($sqlcoa, ['1140101005']); if (!$quetax) { $this->db->trans_rollback(); $this->sys_error_db("[Error] get coa id pajak masukan"); exit; } $coaTax = $quetax->result_array()[0]; if ($totalPajak > 0.00) { $insertpajak = $this->InsertJurnalTx( $jurnalID, $coaTax['coaID'], $coaTax['coaDescription'], $user['M_UserID'], round($totalPajak, 2), 0 ); if (!$insertpajak['status']) { $this->db->trans_rollback(); $this->sys_error_db($insertpajak['msg']); exit; } } // insert jurnal tx hutang pph23 (kredit) // ---------------------------------------------------------------------------------------- $quepph = $this->db->query($sqlcoa, ['2120100003']); if (!$quepph) { $this->db->trans_rollback(); $this->sys_error_db("[Error] get coa hutang pph 23 "); exit; } $coapph = $quepph->result_array()[0]; $pphval = doubleval($invoice[0]['SupplierInvoiceTaxAmountPph']); if ($pphval > 0.00) { $insertpph = $this->InsertJurnalTx( $jurnalID, $coapph['coaID'], $coapph['coaDescription'], $user['M_UserID'], 0, round($pphval, 2) ); if (!$insertpph['status']) { $this->db->trans_rollback(); $this->sys_error_db($insertpph['msg']); exit; } } # insert shipping cost ke jurnal # // ---------------------------------------------------------------------------------------- if ($ship_cost > 0.00) { $queryshipcost = $this->db->query($sqlcoa, ['5320700001']); if (!$queryshipcost) { $this->db->trans_rollback(); $this->sys_error_db("[Error] get coa cost "); exit; } $coashipcost = $queryshipcost->result_array()[0]; $insertcost = $this->InsertJurnalTx( $jurnalID, $coashipcost['coaID'], $coashipcost['coaDescription'], $user['M_UserID'], 0, $ship_cost ); if (!$insertcost['status']) { $this->db->trans_rollback(); $this->sys_error_db("[Error] insert jurnal tx shipping cost"); exit; } } /* Insert jurnal tx for down payment asset */ // ---------------------------------------------------------------------------------------- if (isset($invoice[0]['typePurchase']) && $invoice[0]['typePurchase'] == 'aset') { $sql_dpasset = "SELECT PurchaseOrderAssetContractID, PurchaseOrderAssetContractName, SupplierDownpaymentAmount, coaID, coaDescription FROM purchase_order_asset_contract JOIN purchase_order ON PurchaseOrderID = PurchaseOrderAssetContractPurchaseOrderID JOIN supplier_downpayment ON SupplierDownpaymentPurchasOrderID = PurchaseOrderID AND SupplierDownpaymentIsActive = 'Y' JOIN purchase_order_detail ON PurchaseOrderID = PurchaseOrderDetailPurchaseOrderID AND PurchaseOrderDetailIsActive = 'Y' JOIN m_item ON M_ItemID = PurchaseOrderDetailItemID AND M_ItemItem_CategoryID = 3 JOIN fa_class ON Fa_ClassID = M_ItemFa_ClassID AND Fa_ClassIsActive = 'Y' JOIN coa ON coaID = Fa_ClassDownPaymentCoaID AND coaIsActive = 'Y' WHERE PurchaseOrderAssetContractReceiveOrderPoID = ? AND PurchaseOrderAssetContractIsActive = 'Y' LIMIT 1"; $que_dpasset = $this->db->query($sql_dpasset, [ $invoice[0]['SupplierInvoiceReceiveOrderPoID'] ]); if (!$que_dpasset) { $this->db->trans_rollback(); $this->sys_error_db("[Error] query dp asset not error"); exit; } $dpasset_coa = $que_dpasset->row_array(); if (!empty($dpasset_coa)) { $totalDP = round($dpasset_coa['SupplierDownpaymentAmount'], 2); if ($totalDP > 0) { $insert_dp = $this->InsertJurnalTx( $jurnalID, $dpasset_coa['coaID'], $dpasset_coa['coaDescription'], $user['M_UserID'], 0, $totalDP ); if (!$insert_dp['status']) { $this->db->trans_rollback(); $this->sys_error_db($insert_dp['msg']); exit; } $invoice = $this->CalcProrateDownPaymentAsset($invoice, $totalDP); } } } // insert jurnal tx hutang per item (kredit) // ---------------------------------------------------------------------------------------- foreach ($invoice as $key => $inv) { $sqlitem = "SELECT * FROM m_item WHERE M_ItemID = ?"; $queitem = $this->db->query($sqlitem, [$inv['SupplierInvoiceDetailItemID']]); if (!$queitem) { $this->db->trans_rollback(); $this->sys_error_db("[Error] get item id"); exit; } $item = $queitem->row_array(); if (empty($item) || empty($item['M_ItemItem_CategoryID'])) { $this->db->trans_rollback(); $this->sys_error_db("[Error] RO: {$inv['ReceiveOrderPoNumber']} item {$item['M_ItemDesc']} tidak ditemukan / kategori tidak ada"); exit; } if ($item['M_ItemItem_CategoryID'] == '1' && !empty($item['M_ItemNat_SubGroupID'])) { $sqlsgp = "SELECT map_nat_group.* FROM map_nat_group JOIN map_nat_subgroup ON MapNatSub_NatGroupID = MapNatGroup_NatGroupID AND MapNatSub_IsActive = 'Y' WHERE MapNatGroup_NatGroupID = ? AND MapNatSub_NatSubGroupID = ? AND MapNatGroup_IsActive = 'Y'"; $quesgp = $this->db->query($sqlsgp, [$item['M_ItemNat_GroupID'], $item['M_ItemNat_SubGroupID']]); if (!$quesgp) { $this->db->trans_rollback(); $this->sys_error_db("[Error] get map_nat_subgroup"); exit; } $itemGroup = $quesgp->row_array(); if ( empty($itemGroup['MapNatGroup_Debt_coaID']) || empty($itemGroup['MapNatGroup_Debt_coaAccNo']) || empty($itemGroup['MapNatGroup_Debt_coaDesc']) ) { $this->db->trans_rollback(); $this->sys_error_db("[Error] coa item tidak ditemukan / belum dimapping"); exit; } $price = (doubleval($inv['SupplierInvoiceDetailTotal']) - doubleval($inv['SupplierInvoiceDetailDiscountPoProrata'])); // $taxPPH = doubleval($inv['SupplierInvoiceTaxPercentPph']) * $price / 100; $taxPPN = doubleval($inv['SupplierInvoiceTaxPercentPpn']) * $price / 100; $kredit = round($price + $taxPPN, 2); $status = $this->InsertJurnalTx( $jurnalID, $itemGroup['MapNatGroup_Debt_coaID'], $itemGroup['MapNatGroup_Debt_coaDesc'], $user['M_UserID'], 0, $kredit ); if (!$status['status']) { $this->sys_error_db($status['msg']); exit; } } else if ($item['M_ItemItem_CategoryID'] == '2') { $this->InsertJurnalTxInventaris($jurnalID, $item, $inv, $user['M_UserID']); } else if ($item['M_ItemItem_CategoryID'] == '3') { $this->InsertJurnalTxAsset($jurnalID, $item['M_ItemID'], $inv, $user['M_UserID']); } else if ($item['M_ItemItem_CategoryID'] == '4') { $this->InsertJurnalTxJasa($jurnalID, $item['M_ItemID'], $inv, $user['M_UserID']); } } $sqlinvgr = "INSERT INTO jurnal_addon ( jurnalAddOnJurnalID, jurnalAddOnCode, jurnalAddOnValue, jurnalAddOnCreated, jurnalAddOnCreatedUserID ) VALUES (?,?,?,NOW(),?)"; $queinvgr = $this->db->query($sqlinvgr, [ $jurnalID, 'INVGR', $invoiceNumber, $user['M_UserID'] ]); if (!$queinvgr) { $this->db->trans_rollback(); $this->sys_error_db("[Error] insert jurnal addon"); exit; } // end------------------------------------------------------------------------------------------------ $this->db->trans_commit(); $this->sys_ok("[Success] update status faktur to approved"); } catch (Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } private function InsertJurnalTxInventaris($jurnalID, $items, $invoice, $userid) { if (empty($items['M_ItemM_InventarisGolID'])) { $this->db->trans_rollback(); $this->sys_error_db("[Error] item golongan inventaris belum ditentukan"); exit; } $sql_coa = "SELECT COALESCE( i.M_InventarisItemCoaMappingID, g.M_InventarisCoaMappingID ) AS MappingID, COALESCE( i.M_InventarisItemCoaMappingCoaHutangID, g.M_InventarisCoaMappingCoaHutangID ) AS CoaHutangID, c.coaDescription AS CoaHutangDesc FROM (SELECT 1) AS inventory LEFT JOIN m_inventaris_item_coa_mapping i ON i.M_InventarisItemCoaMappingM_ItemID = ? AND i.M_InventarisItemCoaMappingIsActive = 'Y' LEFT JOIN m_inventaris_coa_mapping g ON g.M_InventarisCoaMappingM_InventarisGolID = ? AND g.M_InventarisCoaMappingIsActive = 'Y' LEFT JOIN coa c ON c.coaID = COALESCE(i.M_InventarisItemCoaMappingCoaHutangID, g.M_InventarisCoaMappingCoaHutangID) AND c.coaIsActive = 'Y'"; $que_coa = $this->db->query($sql_coa, [ $items['M_ItemID'], $items['M_ItemM_InventarisGolID'], ]); if (!$que_coa) { $this->db->trans_rollback(); $this->sys_error_db("[Error] failed query coa hutang inventaris"); exit; } $item_coainv = $que_coa->row_array(); if (empty($item_coainv['CoaHutangID'])) { $this->db->trans_rollback(); $this->sys_error_db("[Error] coa ivnentory item {$items['M_ItemDesc']} not found"); exit; } $invtotal = doubleval($invoice['SupplierInvoiceDetailTotal']); $disprorata = doubleval($invoice['SupplierInvoiceDetailDiscountPoProrata']); $price = $invtotal - $disprorata; $taxPPN = doubleval($invoice['SupplierInvoiceTaxPercentPpn']) * $price / 100; $kredit = round($price + $taxPPN, 2); $insert = $this->InsertJurnalTx( $jurnalID, $item_coainv['CoaHutangID'], $item_coainv['CoaHutangDesc'], $userid, 0, $kredit ); if (!$insert['status']) { $this->db->trans_rollback(); $this->sys_error_db($insert['msg']); exit; } } private function InsertJurnalTxJasa($jurnalID, $itemid, $invoice, $userid) { $sql_coa = "SELECT JasaCoaMapHutangCoaID, JasaCoaMapHutangCoaNo, JasaCoaMapHutangCoaDesc FROM jasa_coa_map JOIN coa ON coaID = JasaCoaMapHutangCoaID AND coaIsActive = 'Y' WHERE JasaCoaMapM_ItemID = ?"; $que_coa = $this->db->query($sql_coa, [$itemid]); if (!$que_coa) { $this->db->trans_rollback(); $this->sys_error_db("[Error] failed get coa hutang jasa"); exit; } $coajasa = $que_coa->row_array(); if ($que_coa->num_rows() <= 0) { $this->db->trans_rollback(); $this->sys_error_db("[Error] item debt coa not found"); exit; } $invtotal = doubleval($invoice['SupplierInvoiceDetailTotal']); $disprorata = doubleval($invoice['SupplierInvoiceDetailDiscountPoProrata']); $price = $invtotal - $disprorata; $taxPPN = doubleval($invoice['SupplierInvoiceTaxPercentPpn']) * $price / 100; $kredit = round($price + $taxPPN, 2); $insert = $this->InsertJurnalTx( $jurnalID, $coajasa['JasaCoaMapHutangCoaID'], $coajasa['JasaCoaMapHutangCoaDesc'], $userid, 0, $kredit ); if (!$insert['status']) { $this->db->trans_rollback(); $this->sys_error_db($insert['msg']); exit; } } private function InsertJurnalTxAsset($jurnalID, $itemid, $invoice, $userid) { $sql_coa = "SELECT Fa_ClassHutangCoaID, Fa_ClassHutangCoaAccountNo, Fa_ClassHutangCoaDesc FROM m_item JOIN fa_class ON Fa_ClassID = M_ItemFa_ClassID WHERE M_ItemID = ?"; $que_coa = $this->db->query($sql_coa, $itemid); if (!$que_coa) { $this->db->trans_rollback(); $this->sys_error_db("[Error] failed get coa hutang asset"); exit; } $coaasset = $que_coa->row_array(); if ($que_coa->num_rows() <= 0) { $this->db->trans_rollback(); $this->sys_error_db("[Error] aset debt coa not found"); exit; } $invtotal = doubleval($invoice['SupplierInvoiceDetailTotal']); $disprorata = doubleval($invoice['SupplierInvoiceDetailDiscountPoProrata']); $price = $invtotal - $disprorata; $taxPPN = doubleval($invoice['SupplierInvoiceTaxPercentPpn']) * $price / 100; $kredit = round($price + $taxPPN, 2); $finalValue = round($kredit - doubleval($invoice['dpReduction']), 2); $insert = $this->InsertJurnalTx( $jurnalID, $coaasset['Fa_ClassHutangCoaID'], $coaasset['Fa_ClassHutangCoaDesc'], $userid, 0, $finalValue ); if (!$insert['status']) { $this->db->trans_rollback(); $this->sys_error_db($insert['msg']); exit; } } private function CalcProrateDownPaymentAsset($items, $dpAmount) { $totalKredit = 0; foreach ($items as $key => $value) { $invtotal = doubleval($value['SupplierInvoiceDetailTotal']); $disprorata = doubleval($value['SupplierInvoiceDetailDiscountPoProrata']); $price = $invtotal - $disprorata; $taxPPN = doubleval($value['SupplierInvoiceTaxPercentPpn']) * $price / 100; $kredit = round($price + $taxPPN, 2); $totalKredit = $totalKredit + $kredit; $items[$key]['kredit'] = $kredit; } if ($totalKredit <= 0) { foreach ($items as $key => $value) { $items[$key]['dpReduction'] = 0; } return $items; } $runningReduction = 0; end($items); $lastKey = key($items); reset($items); foreach ($items as $key => $value) { if ($key === $lastKey) { $reduction = round($dpAmount - $runningReduction, 2); } else { $ratio = $value['kredit'] / $totalKredit; $reduction = round($dpAmount * $ratio, 2); $runningReduction += $reduction; } $items[$key]['dpReduction'] = $reduction; } return $items; } function InsertJurnalTx($jurnalID, $coaID, $desc, $userID, $debit = 0, $kredit = 0): array { try { $sql = "INSERT INTO jurnal_tx ( jurnalTxJurnalID, jurnalTxCoaID, jurnalTxDescription, jurnalTxDebit, jurnalTxCredit, jurnalTxM_UserID ) VALUES (?,?,?,?,?,?)"; $que = $this->db->query($sql, [$jurnalID, $coaID, $desc, $debit, $kredit, $userID]); if (!$que) { $this->db->trans_rollback(); return [ 'status' => false, 'msg' => "[Error] error insert into table jurnal tx" ]; } return [ 'status' => true, 'msg' => "[Success] insert into table jurnal tx" ]; } catch (Exception $exc) { $message = $exc->getMessage(); return [ 'status' => false, 'msg' => "[Error] {$message}" ]; } } }