feature: po pay downpayment

This commit is contained in:
2026-07-20 13:13:59 +07:00
parent 61e2e4f2ec
commit 64f434cd78
10 changed files with 2842 additions and 1485 deletions

View File

@@ -1,8 +1,10 @@
<?php <?php
class InventarisCoaMapping extends MY_Controller { class InventarisCoaMapping extends MY_Controller
{
var $db; var $db;
public function index() { public function index()
{
echo "Inventaris COA Mapping API"; echo "Inventaris COA Mapping API";
} }
@@ -11,8 +13,226 @@ class InventarisCoaMapping extends MY_Controller {
parent::__construct(); parent::__construct();
} }
## QUERY ##
public function getListCoa()
{
try {
if (!$this->isLogin) {
throw new Exception('Invalid token');
}
$para = $this->sys_input;
$keyword = "%" . $para['keyword'] . "%";
$sql = "SELECT
coaID,
coaAccountNo,
coaDescription
FROM coa
WHERE coaIsInput = 'Y'
AND (
coaDescription LIKE ?
OR coaAccountNo LIKE ?
)
AND coaIsActive = 'Y'
LIMIT 15";
$que = $this->db->query($sql, [$keyword, $keyword]);
if (!$que) {
throw new Exception('failed to query data inventaris gol', 1);
}
$data = $que->result_array();
$this->sys_ok($data);
} catch (Exception $e) {
$msg = '[Error] ' . $e->getMessage();
$code = $e->getCode();
if ($code == 0) {
$this->sys_error($msg);
} else {
$this->sys_error_db($msg);
}
exit;
}
}
public function getListInventarisGol()
{
try {
if (!$this->isLogin) {
throw new Exception('Invalid token');
}
$sql = "SELECT
M_InventarisGolID,
M_InventarisGolCode,
M_InventarisGolName
FROM m_inventaris_gol gol
WHERE gol.M_InventarisGolIsActive = 'Y'
AND NOT EXISTS (
SELECT 1
FROM m_inventaris_coa_mapping m
WHERE m.M_InventarisCoaMappingM_InventarisGolID = gol.M_InventarisGolID
AND m.M_InventarisCoaMappingIsActive = 'Y'
);";
$que = $this->db->query($sql);
if (!$que) {
throw new Exception('failed to query data inventaris gol', 1);
}
$data = $que->result_array();
$output = [
'records' => $data,
'total' => count($data)
];
$this->sys_ok($output);
} catch (Exception $e) {
$msg = '[Error] ' . $e->getMessage();
$code = $e->getCode();
if ($code == 0) {
$this->sys_error($msg);
} else {
$this->sys_error_db($msg);
}
exit;
}
}
public function getListInventorygolMapping()
{
try {
if (!$this->isLogin) {
throw new Exception('invalid token');
}
$para = $this->sys_input;
$keyword = "%" . $para['keyword'] . "%";
$limit = 10;
$offset = 0;
if ($para['currpage'] > 0) {
$offset = ($para['currpage'] - 1) * $limit;
}
$sql = "SELECT
M_InventarisGolID,
M_InventarisGolCode,
M_InventarisGolName,
M_InventarisCoaMappingID,
M_InventarisCoaMappingCoaInventarisID,
coaInv.coaAccountNo AS CoaInventarisAccountNo,
coaInv.coaDescription AS CoaInventarisDescription,
M_InventarisCoaMappingCoaHutangID,
coaHtg.coaAccountNo AS CoaHutangAccountNo,
coaHtg.coaDescription AS CoaHutangDescription,
M_InventarisCoaMappingCoaBebanPenyusutanID,
coaBbn.coaAccountNo AS CoaBebanPenyusutanAccountNo,
coaBbn.coaDescription AS CoaBebanPenyusutanDescription,
M_InventarisCoaMappingCoaAkumulasiPenyusutanID,
coaAkm.coaAccountNo AS CoaAkumulasiPenyusutanAccountNo,
coaAkm.coaDescription AS CoaAkumulasiPenyusutanDescription,
M_InventarisCoaMappingCoaLabaPelepasanID,
coaLab.coaAccountNo AS CoaLabaPelepasanAccountNo,
coaLab.coaDescription AS CoaLabaPelepasanDescription,
M_InventarisCoaMappingCoaRugiPelepasanID,
coaRug.coaAccountNo AS CoaRugiPelepasanAccountNo,
coaRug.coaDescription AS CoaRugiPelepasanDescription
FROM m_inventaris_gol
JOIN m_inventaris_coa_mapping
ON M_InventarisCoaMappingM_InventarisGolID = M_InventarisGolID
AND M_InventarisCoaMappingIsActive = 'Y'
AND M_InventarisGolIsActive = 'Y'
AND M_InventarisGolName LIKE ?
LEFT JOIN coa AS coaInv
ON M_InventarisCoaMappingCoaInventarisID = coaInv.coaID
LEFT JOIN coa AS coaHtg
ON M_InventarisCoaMappingCoaHutangID = coaHtg.coaID
LEFT JOIN coa AS coaBbn
ON M_InventarisCoaMappingCoaBebanPenyusutanID = coaBbn.coaID
LEFT JOIN coa AS coaAkm
ON M_InventarisCoaMappingCoaAkumulasiPenyusutanID = coaAkm.coaID
LEFT JOIN coa AS coaLab
ON M_InventarisCoaMappingCoaLabaPelepasanID = coaLab.coaID
LEFT JOIN coa AS coaRug
ON M_InventarisCoaMappingCoaRugiPelepasanID = coaRug.coaID
WHERE M_InventarisGolIsActive = 'Y'";
$sql_data = $sql . " ORDER BY M_InventarisGolID LIMIT ? OFFSET ? ";
$que = $this->db->query($sql_data, [
$keyword,
$limit,
$offset
]);
if (!$que) {
throw new Exception('failed to query data mapping coa inventaris golongan', 1);
}
$sql_total = "SELECT COUNT(*) AS total FROM ($sql) AS x";
$que_total = $this->db->query($sql_total, [$keyword]);
if (!$que_total) {
throw new Exception('failed to get total rows data', 1);
}
$this->sys_ok([
"records" => $que->result_array(),
"total" => $que_total->row_array()['total']
]);
} catch (Exception $e) {
$msg = '[Error] ' . $e->getMessage();
$code = $e->getCode();
if ($code == 0) {
$this->sys_error($msg);
} else {
$this->sys_error_db($msg);
}
exit;
}
}
public function getInvCoaMappingDetail()
{
try {
if (!$this->isLogin) {
$this->sys_error("invalid token");
exit;
}
$para = $this->sys_input;
$sql = "SELECT
M_InventarisCoaMappingID,
M_InventarisCoaMappingM_InventarisGolID,
M_InventarisCoaMappingCoaInventarisID,
M_InventarisCoaMappingCoaHutangID,
M_InventarisCoaMappingCoaPembelianID,
M_InventarisCoaMappingCoaBebanPenyusutanID,
M_InventarisCoaMappingCoaAkumulasiPenyusutanID,
M_InventarisCoaMappingCoaLabaPelepasanID,
M_InventarisCoaMappingCoaRugiPelepasanID,
M_InventarisCoaMappingCreatedUserID,
M_InventarisCoaMappingCreated,
M_InventarisCoaMappingLastUpdated
FROM m_inventaris_coa_mapping
WHERE M_InventarisCoaMappingIsActive = 'Y'
AND M_InventarisCoaMappingID = ?";
$query = $this->db->query($sql, [$para['M_InventarisCoaMappingID']]);
if (!$query) {
$this->sys_error_db("[Error] get data m_inventaris_coa_mapping");
exit;
}
$data = $query->row_array();
$this->sys_ok($data);
} catch (Exception $exc) {
$msg = $exc->getMessage();
$this->sys_error($msg);
}
}
## MUTATIONS ## ## MUTATIONS ##
public function createInvCoaMapping() { public function createInvCoaMapping()
{
try { try {
if (!$this->isLogin) { if (!$this->isLogin) {
$this->sys_error("invalid token"); $this->sys_error("invalid token");
@@ -64,48 +284,8 @@ class InventarisCoaMapping extends MY_Controller {
} }
} }
## QUERY ## public function editInvCoaMapping()
public function getInvCoaMapping() { {
try {
if (!$this->isLogin) {
$this->sys_error("invalid token");
exit;
}
$para = $this->sys_input;
$sql = "SELECT
M_InventarisCoaMappingID,
M_InventarisCoaMappingM_InventarisGolID,
M_InventarisCoaMappingCoaInventarisID,
M_InventarisCoaMappingCoaHutangID,
M_InventarisCoaMappingCoaPembelianID,
M_InventarisCoaMappingCoaBebanPenyusutanID,
M_InventarisCoaMappingCoaAkumulasiPenyusutanID,
M_InventarisCoaMappingCoaLabaPelepasanID,
M_InventarisCoaMappingCoaRugiPelepasanID,
M_InventarisCoaMappingCreatedUserID,
M_InventarisCoaMappingCreated,
M_InventarisCoaMappingLastUpdated
FROM m_inventaris_coa_mapping
WHERE M_InventarisCoaMappingIsActive = 'Y'
AND M_InventarisCoaMappingID = ?";
$query = $this->db->query($sql, [$para['M_InventarisCoaMappingID']]);
if (!$query) {
$this->sys_error_db("[Error] get data m_inventaris_coa_mapping");
exit;
}
$data = $query->row_array();
$this->sys_ok($data);
} catch (Exception $exc) {
$msg = $exc->getMessage();
$this->sys_error($msg);
}
}
## MUTATIONS ##
public function editInvCoaMapping() {
try { try {
if (!$this->isLogin) { if (!$this->isLogin) {
$this->sys_error("invalid token"); $this->sys_error("invalid token");
@@ -154,7 +334,8 @@ class InventarisCoaMapping extends MY_Controller {
} }
} }
public function deleteInvCoaMapping() { public function deleteInvCoaMapping()
{
try { try {
if (!$this->isLogin) { if (!$this->isLogin) {
$this->sys_error("invalid token"); $this->sys_error("invalid token");
@@ -185,8 +366,129 @@ class InventarisCoaMapping extends MY_Controller {
} }
} }
## QUERY ITEM ##
public function getListItemInventaris()
{
try {
if (!$this->isLogin) {
throw new Exception('Invalid token');
}
$para = $this->sys_input;
$sql = "SELECT
M_ItemID,
M_ItemCode,
M_ItemDesc,
M_ItemM_InventarisGolID AS itemGolID,
IFNULL(M_InventarisItemCoaMappingID, 0) AS itemCoaMapID,
M_InventarisItemCoaMappingCoaInventarisID,
coaInv.coaAccountNo AS CoaInventarisAccountNo,
coaInv.coaDescription AS CoaInventarisDescription,
M_InventarisItemCoaMappingCoaHutangID,
coaHtg.coaAccountNo AS CoaHutangAccountNo,
coaHtg.coaDescription AS CoaHutangDescription,
M_InventarisItemCoaMappingCoaBebanPenyusutanID,
coaBbn.coaAccountNo AS CoaBebanPenyusutanAccountNo,
coaBbn.coaDescription AS CoaBebanPenyusutanDescription,
M_InventarisItemCoaMappingCoaAkumulasiPenyusutanID,
coaAkm.coaAccountNo AS CoaAkumulasiPenyusutanAccountNo,
coaAkm.coaDescription AS CoaAkumulasiPenyusutanDescription,
M_InventarisItemCoaMappingCoaLabaPelepasanID,
coaLab.coaAccountNo AS CoaLabaPelepasanAccountNo,
coaLab.coaDescription AS CoaLabaPelepasanDescription,
M_InventarisItemCoaMappingCoaRugiPelepasanID,
coaRug.coaAccountNo AS CoaRugiPelepasanAccountNo,
coaRug.coaDescription AS CoaRugiPelepasanDescription
FROM m_item
LEFT JOIN m_inventaris_item_coa_mapping
ON M_ItemID = M_InventarisItemCoaMappingM_ItemID
AND M_InventarisItemCoaMappingIsActive = 'Y'
LEFT JOIN coa AS coaInv
ON M_InventarisItemCoaMappingCoaInventarisID = coaInv.coaID
LEFT JOIN coa AS coaHtg
ON M_InventarisItemCoaMappingCoaHutangID = coaHtg.coaID
LEFT JOIN coa AS coaBbn
ON M_InventarisItemCoaMappingCoaBebanPenyusutanID = coaBbn.coaID
LEFT JOIN coa AS coaAkm
ON M_InventarisItemCoaMappingCoaAkumulasiPenyusutanID = coaAkm.coaID
LEFT JOIN coa AS coaLab
ON M_InventarisItemCoaMappingCoaLabaPelepasanID = coaLab.coaID
LEFT JOIN coa AS coaRug
ON M_InventarisItemCoaMappingCoaRugiPelepasanID = coaRug.coaID
WHERE M_ItemItem_CategoryID = 2
AND M_ItemM_InventarisGolID = ?
AND M_ItemIsActive = 'Y'";
$que = $this->db->query($sql, [
$para['golID']
]);
if (!$que) {
throw new Exception('failed to query data inventaris gol', 1);
}
$data = $que->result_array();
$output = [
'records' => $data,
'total' => count($data)
];
$this->sys_ok($output);
} catch (Exception $e) {
$msg = '[Error] ' . $e->getMessage();
$code = $e->getCode();
if ($code == 0) {
$this->sys_error($msg);
} else {
$this->sys_error_db($msg);
}
exit;
}
}
public function getInvItemCoaMapping()
{
try {
if (!$this->isLogin) {
$this->sys_error("invalid token");
exit;
}
$para = $this->sys_input;
$sql = "SELECT
M_InventarisItemCoaMappingID,
M_InventarisItemCoaMappingM_ItemID,
M_InventarisItemCoaMappingCoaInventarisID,
M_InventarisItemCoaMappingCoaHutangID,
M_InventarisItemCoaMappingCoaPembelianID,
M_InventarisItemCoaMappingCoaBebanPenyusutanID,
M_InventarisItemCoaMappingCoaAkumulasiPenyusutanID,
M_InventarisItemCoaMappingCoaLabaPelepasanID,
M_InventarisItemCoaMappingCoaRugiPelepasanID,
M_InventarisItemCoaMappingCreatedUserID,
M_InventarisItemCoaMappingCreated,
M_InventarisItemCoaMappingLastUpdated
FROM m_inventaris_item_coa_mapping
WHERE M_InventarisItemCoaMappingIsActive = 'Y'
AND M_InventarisItemCoaMappingID = ?";
$query = $this->db->query($sql, [$para['M_InventarisItemCoaMappingID']]);
if (!$query) {
$this->sys_error_db("[Error] get data m_inventaris_item_coa_mapping");
exit;
}
$data = $query->row_array();
$this->sys_ok($data);
} catch (Exception $exc) {
$msg = $exc->getMessage();
$this->sys_error($msg);
}
}
## MUTATIONS ITEM ## ## MUTATIONS ITEM ##
public function createInvItemCoaMapping() { public function createInvItemCoaMapping()
{
try { try {
if (!$this->isLogin) { if (!$this->isLogin) {
$this->sys_error("invalid token"); $this->sys_error("invalid token");
@@ -231,55 +533,15 @@ class InventarisCoaMapping extends MY_Controller {
$insertID = $this->db->insert_id(); $insertID = $this->db->insert_id();
$this->db->trans_commit(); $this->db->trans_commit();
$this->sys_ok($insertID); $this->sys_ok("[Success] insert coa item");
} catch (Exception $exc) { } catch (Exception $exc) {
$msg = $exc->getMessage(); $msg = $exc->getMessage();
$this->sys_error($msg); $this->sys_error($msg);
} }
} }
## QUERY ITEM ## public function editInvItemCoaMapping()
public function getInvItemCoaMapping() { {
try {
if (!$this->isLogin) {
$this->sys_error("invalid token");
exit;
}
$para = $this->sys_input;
$sql = "SELECT
M_InventarisItemCoaMappingID,
M_InventarisItemCoaMappingM_ItemID,
M_InventarisItemCoaMappingCoaInventarisID,
M_InventarisItemCoaMappingCoaHutangID,
M_InventarisItemCoaMappingCoaPembelianID,
M_InventarisItemCoaMappingCoaBebanPenyusutanID,
M_InventarisItemCoaMappingCoaAkumulasiPenyusutanID,
M_InventarisItemCoaMappingCoaLabaPelepasanID,
M_InventarisItemCoaMappingCoaRugiPelepasanID,
M_InventarisItemCoaMappingCreatedUserID,
M_InventarisItemCoaMappingCreated,
M_InventarisItemCoaMappingLastUpdated
FROM m_inventaris_item_coa_mapping
WHERE M_InventarisItemCoaMappingIsActive = 'Y'
AND M_InventarisItemCoaMappingID = ?";
$query = $this->db->query($sql, [$para['M_InventarisItemCoaMappingID']]);
if (!$query) {
$this->sys_error_db("[Error] get data m_inventaris_item_coa_mapping");
exit;
}
$data = $query->row_array();
$this->sys_ok($data);
} catch (Exception $exc) {
$msg = $exc->getMessage();
$this->sys_error($msg);
}
}
## MUTATIONS ITEM ##
public function editInvItemCoaMapping() {
try { try {
if (!$this->isLogin) { if (!$this->isLogin) {
$this->sys_error("invalid token"); $this->sys_error("invalid token");
@@ -328,7 +590,8 @@ class InventarisCoaMapping extends MY_Controller {
} }
} }
public function deleteInvItemCoaMapping() { public function deleteInvItemCoaMapping()
{
try { try {
if (!$this->isLogin) { if (!$this->isLogin) {
$this->sys_error("invalid token"); $this->sys_error("invalid token");

View File

@@ -496,6 +496,7 @@ class Fakturv4 extends MY_Controller
ELSE '' ELSE ''
END as WarehouseName, END as WarehouseName,
ReceiveOrderPoID, ReceiveOrderPoID,
ReceiveOrderPoTypePurchase,
PurchaseOrderItemCategoryID PurchaseOrderItemCategoryID
FROM supplier_invoice FROM supplier_invoice
JOIN supplier_invoice_detail ON SupplierInvoiceID = SupplierInvoiceDetailSupplierInvoiceID JOIN supplier_invoice_detail ON SupplierInvoiceID = SupplierInvoiceDetailSupplierInvoiceID
@@ -588,12 +589,11 @@ class Fakturv4 extends MY_Controller
'P' 'P'
) AS DiscountType, ) AS DiscountType,
SupplierInvoiceReceiveOrderPoID, SupplierInvoiceReceiveOrderPoID,
ReceiveOrderPoNumber ReceiveOrderPoNumber,
ReceiveOrderPoTypePurchase AS typePurchase
FROM supplier_invoice FROM supplier_invoice
JOIN supplier ON SupplierInvoiceSupplierID = SupplierID JOIN supplier ON SupplierInvoiceSupplierID = SupplierID
JOIN receive_order_po ON ReceiveOrderPoID = SupplierInvoiceReceiveOrderPoID JOIN receive_order_po ON ReceiveOrderPoID = SupplierInvoiceReceiveOrderPoID
-- JOIN purchase_order ON SupplierInvoicePurchaseOrderID = PurchaseOrderID
-- AND PurchaseOrderIsActive = 'Y'
WHERE SupplierInvoiceIsActive = 'Y' WHERE SupplierInvoiceIsActive = 'Y'
AND SupplierInvoiceID = ?"; AND SupplierInvoiceID = ?";
$que = $this->db->query($sql, $para['SInvoiceID']); $que = $this->db->query($sql, $para['SInvoiceID']);
@@ -601,6 +601,7 @@ class Fakturv4 extends MY_Controller
$this->sys_error_db('[Error] get detail data invoice'); $this->sys_error_db('[Error] get detail data invoice');
exit; exit;
} }
$data = $que->row_array();
$sqldet = "SELECT $sqldet = "SELECT
SupplierInvoiceDetailID, SupplierInvoiceDetailID,
@@ -636,7 +637,30 @@ class Fakturv4 extends MY_Controller
exit; exit;
} }
$data = $que->result_array()[0]; 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(); $data['detail'] = $quedet->result_array();
$result = $data; $result = $data;
@@ -1317,7 +1341,8 @@ class Fakturv4 extends MY_Controller
supplier_invoice_detail.*, supplier_invoice_detail.*,
ReceiveOrderPoNumber, ReceiveOrderPoNumber,
ReceiveOrderPoM_BranchCode, ReceiveOrderPoM_BranchCode,
ReceiveOrderPoS_RegionalID ReceiveOrderPoS_RegionalID,
ReceiveOrderPoTypePurchase AS typePurchase
FROM supplier_invoice FROM supplier_invoice
JOIN supplier_invoice_detail ON SupplierInvoiceDetailSupplierInvoiceID = SupplierInvoiceID JOIN supplier_invoice_detail ON SupplierInvoiceDetailSupplierInvoiceID = SupplierInvoiceID
AND SupplierInvoiceDetailIsActive = 'Y' AND SupplierInvoiceDetailIsActive = 'Y'
@@ -1497,15 +1522,20 @@ class Fakturv4 extends MY_Controller
/* Insert jurnal tx for down payment asset */ /* Insert jurnal tx for down payment asset */
// ---------------------------------------------------------------------------------------- // ----------------------------------------------------------------------------------------
if (isset($invoice[0]['typePurchase']) && $invoice[0]['typePurchase'] == 'aset') {
$sql_dpasset = "SELECT $sql_dpasset = "SELECT
PurchaseOrderAssetContractID, PurchaseOrderAssetContractID,
PurchaseOrderAssetContractName, PurchaseOrderAssetContractName,
PurchaseOrderAssetContractInstallmentDownPayment, SupplierDownpaymentAmount,
coaID, coaID,
coaDescription coaDescription
FROM purchase_order_asset_contract FROM purchase_order_asset_contract
JOIN purchase_order ON PurchaseOrderID = PurchaseOrderAssetContractPurchaseOrderID JOIN purchase_order ON PurchaseOrderID = PurchaseOrderAssetContractPurchaseOrderID
JOIN purchase_order_detail ON PurchaseOrderID = PurchaseOrderDetailPurchaseOrderID JOIN supplier_downpayment
ON SupplierDownpaymentPurchasOrderID = PurchaseOrderID
AND SupplierDownpaymentIsActive = 'Y'
JOIN purchase_order_detail
ON PurchaseOrderID = PurchaseOrderDetailPurchaseOrderID
AND PurchaseOrderDetailIsActive = 'Y' AND PurchaseOrderDetailIsActive = 'Y'
JOIN m_item ON M_ItemID = PurchaseOrderDetailItemID JOIN m_item ON M_ItemID = PurchaseOrderDetailItemID
AND M_ItemItem_CategoryID = 3 AND M_ItemItem_CategoryID = 3
@@ -1526,7 +1556,7 @@ class Fakturv4 extends MY_Controller
} }
$dpasset_coa = $que_dpasset->row_array(); $dpasset_coa = $que_dpasset->row_array();
if (!empty($dpasset_coa)) { if (!empty($dpasset_coa)) {
$totalDP = round($dpasset_coa['PurchaseOrderAssetContractInstallmentDownPayment'], 2); $totalDP = round($dpasset_coa['SupplierDownpaymentAmount'], 2);
if ($totalDP > 0) { if ($totalDP > 0) {
$insert_dp = $this->InsertJurnalTx( $insert_dp = $this->InsertJurnalTx(
$jurnalID, $jurnalID,
@@ -1545,6 +1575,7 @@ class Fakturv4 extends MY_Controller
$invoice = $this->CalcProrateDownPaymentAsset($invoice, $totalDP); $invoice = $this->CalcProrateDownPaymentAsset($invoice, $totalDP);
} }
} }
}
// insert jurnal tx hutang per item (kredit) // insert jurnal tx hutang per item (kredit)
// ---------------------------------------------------------------------------------------- // ----------------------------------------------------------------------------------------

View File

@@ -228,11 +228,15 @@ class PurchaseOrderAset extends MY_Controller {
PurchaseOrderAssetContractEndDate AS contractEnd, PurchaseOrderAssetContractEndDate AS contractEnd,
IFNULL(attach.AttachmentCount, 0) AS AttachmentCount, IFNULL(attach.AttachmentCount, 0) AS AttachmentCount,
SupplierID, SupplierID,
SupplierName SupplierName,
SupplierDownpaymentID
FROM purchase_order FROM purchase_order
JOIN supplier ON SupplierID = PurchaseOrderSupplierID JOIN supplier ON SupplierID = PurchaseOrderSupplierID
JOIN purchase_order_asset_contract JOIN purchase_order_asset_contract
ON PurchaseOrderAssetContractPurchaseOrderID = PurchaseOrderID ON PurchaseOrderAssetContractPurchaseOrderID = PurchaseOrderID
LEFT JOIN supplier_downpayment
ON SupplierDownpaymentPurchasOrderID = PurchaseOrderID
AND SupplierDownpaymentIsActive = 'Y'
LEFT JOIN ( LEFT JOIN (
SELECT SELECT
ContractAssetAttachmentPurchaseOrderID, ContractAssetAttachmentPurchaseOrderID,
@@ -439,12 +443,16 @@ class PurchaseOrderAset extends MY_Controller {
PurchaseOrderAssetContractInstallmentPayAmount AS installmentPayAmount, PurchaseOrderAssetContractInstallmentPayAmount AS installmentPayAmount,
PurchaseOrderAssetContractInstallmentDownPaymentType AS installmentDownPaymentType, PurchaseOrderAssetContractInstallmentDownPaymentType AS installmentDownPaymentType,
PurchaseOrderAssetContractInstallmentDownPayment AS installmentDownPayment, PurchaseOrderAssetContractInstallmentDownPayment AS installmentDownPayment,
PurchaseOrderApprovedManagerUserID AS verifiedby PurchaseOrderApprovedManagerUserID AS verifiedby,
SupplierDownpaymentID
FROM purchase_order FROM purchase_order
JOIN supplier ON SupplierID = PurchaseOrderSupplierID JOIN supplier ON SupplierID = PurchaseOrderSupplierID
JOIN warehouse ON WarehouseID = PurchaseOrderWarehouseID JOIN warehouse ON WarehouseID = PurchaseOrderWarehouseID
JOIN purchase_order_asset_contract JOIN purchase_order_asset_contract
ON PurchaseOrderAssetContractPurchaseOrderID = PurchaseOrderID ON PurchaseOrderAssetContractPurchaseOrderID = PurchaseOrderID
LEFT JOIN supplier_downpayment
ON SupplierDownpaymentPurchasOrderID = PurchaseOrderID
AND SupplierDownpaymentIsActive = 'Y'
WHERE PurchaseOrderIsActive = 'Y' WHERE PurchaseOrderIsActive = 'Y'
AND PurchaseOrderID = ?"; AND PurchaseOrderID = ?";
$que_poasset = $this->db->query($sql_poasset, [$para['poID']]); $que_poasset = $this->db->query($sql_poasset, [$para['poID']]);
@@ -592,6 +600,7 @@ class PurchaseOrderAset extends MY_Controller {
$summary_subtotal = floatval($para['summary']['subtotal']); $summary_subtotal = floatval($para['summary']['subtotal']);
$summary_diskon = floatval($para['summary']['diskon']); $summary_diskon = floatval($para['summary']['diskon']);
$summary_pajak = floatval($para['summary']['pajak']); $summary_pajak = floatval($para['summary']['pajak']);
$summary_downpayment = floatval($para['summary']['downpayment']);
$summary_total = floatval($para['summary']['total']); $summary_total = floatval($para['summary']['total']);
$sql_po = "INSERT INTO purchase_order ( $sql_po = "INSERT INTO purchase_order (
@@ -762,6 +771,33 @@ class PurchaseOrderAset extends MY_Controller {
exit; exit;
} }
# INSERT into table supplier_downpayment #
$sql_dp = "INSERT INTO supplier_downpayment (
SupplierDownpaymentPurchasOrderID,
SupplierDownpaymentSupplierID,
SupplierDownpaymentAmount,
SupplierDownpaymentDate,
SupplierDownpaymentDueDate,
SupplierDownpaymentStatus,
SupplierDownpaymentCreatedUserID,
SupplierDownpaymentLastUpdatedUserID
) VALUES (?,?,?,?,?,?,?,?)";
$que_dp = $this->db->query($sql_dp, [
$PurchaseOrderID,
$para['supplierID'],
$summary_downpayment ?: 0.00,
$para['contractStart'],
$para['contractStart'],
'Draft',
$user['M_UserID'],
$user['M_UserID']
]);
if (!$que_dp) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] failed insert supplier downpayment");
exit;
}
$this->insertLog( $this->insertLog(
$PurchaseOrderID, 'CREATE', $para, '', $PurchaseOrderID, 'CREATE', $para, '',
[], $user['M_UserID'], 'create purchase order asset' [], $user['M_UserID'], 'create purchase order asset'
@@ -803,6 +839,7 @@ class PurchaseOrderAset extends MY_Controller {
$summary_subtotal = floatval($para['summary']['subtotal']); $summary_subtotal = floatval($para['summary']['subtotal']);
$summary_diskon = floatval($para['summary']['diskon']); $summary_diskon = floatval($para['summary']['diskon']);
$summary_pajak = floatval($para['summary']['pajak']); $summary_pajak = floatval($para['summary']['pajak']);
$summary_downpayment = floatval($para['summary']['downpayment']);
$summary_total = floatval($para['summary']['total']); $summary_total = floatval($para['summary']['total']);
# update po header # # update po header #
@@ -871,6 +908,29 @@ class PurchaseOrderAset extends MY_Controller {
exit; exit;
} }
## UPDATE existing downpayment ##
$sql = "UPDATE supplier_downpayment SET
SupplierDownpaymentAmount = ?,
SupplierDownpaymentDate = ?,
SupplierDownpaymentDueDate = ?,
SupplierDownpaymentStatus = ?,
SupplierDownpaymentLastUpdatedUserID = ?
WHERE SupplierDownpaymentID = ?
AND SupplierDownpaymentIsActive = 'Y'";
$que = $this->db->query($sql, [
$summary_downpayment ?: 0.00,
$para['contractStart'],
$para['contractStart'],
'Draft',
$user['M_UserID'],
$para['SupplierDownpaymentID']
]);
if (!$que) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] failed update supplier downpayment");
exit;
}
# update status old po summary isActive to 'N' # # update status old po summary isActive to 'N' #
$sql_active = "UPDATE purchase_order_summary SET $sql_active = "UPDATE purchase_order_summary SET
PurchaseOrderSummaryIsActive = 'N' PurchaseOrderSummaryIsActive = 'N'
@@ -956,7 +1016,7 @@ class PurchaseOrderAset extends MY_Controller {
PurchaseOrderDetailQty, PurchaseOrderDetailQty,
PurchaseOrderDetailPrice, PurchaseOrderDetailPrice,
PurchaseOrderDetailTotal, PurchaseOrderDetailTotal,
PurchaseOrderWarehouseID, PurchaseOrderDetailWarehouseID,
PurchaseOrderDetailUserID, PurchaseOrderDetailUserID,
PurchaseOrderDetailCreatedUserID, PurchaseOrderDetailCreatedUserID,
PurchaseOrderDetailCreated PurchaseOrderDetailCreated
@@ -1097,6 +1157,21 @@ class PurchaseOrderAset extends MY_Controller {
exit; exit;
} }
/* soft delete supplier_downpayment */
$sql_deldp = "UPDATE supplier_downpayment SET
SupplierDownpaymentIsActive = 'N',
SupplierDownpaymentLastUpdatedUserID = ?
WHERE SupplierDownpaymentID = ?
AND SupplierDownpaymentIsActive = 'Y'";
$que_deldp = $this->db->query($sql_deldp, [
$user['M_UserID'], $para['SupplierDownpaymentID']
]);
if (!$que_deldp) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] failed soft delete supplier downpayment");
exit;
}
/* soft delete purchase order */ /* soft delete purchase order */
$sql_delorder = "UPDATE purchase_order SET $sql_delorder = "UPDATE purchase_order SET
PurchaseOrderIsActive = 'N', PurchaseOrderIsActive = 'N',
@@ -1298,8 +1373,4 @@ class PurchaseOrderAset extends MY_Controller {
exit; exit;
} }
} }
private function generateDownPaymentPI() {
}
} }

View File

@@ -693,8 +693,9 @@ class ReceiveItemPOAsset extends MY_Controller
ReceiveOrderPoNote, ReceiveOrderPoNote,
ReceiveOrderPoRefNumber, ReceiveOrderPoRefNumber,
ReceiveOrderPoDONumber, ReceiveOrderPoDONumber,
ReceiveOrderPoTypePurchase,
ReceiveOrderPoCreatedUserID ReceiveOrderPoCreatedUserID
) VALUE (?,?,?,?,?,?,?,?,?,?,?,?)"; ) VALUE (?,?,?,?,?,?,?,?,?,?,?,?,?)";
$queInsRO = $this->db->query($sqlInsRO, [ $queInsRO = $this->db->query($sqlInsRO, [
$numGR, $numGR,
$param['supplier'], $param['supplier'],
@@ -707,6 +708,7 @@ class ReceiveItemPOAsset extends MY_Controller
$param['catatan'], $param['catatan'],
$param['reference'], $param['reference'],
$param['reference'], $param['reference'],
'aset',
$user['M_UserID'] $user['M_UserID']
]); ]);
if (!$queInsRO) { if (!$queInsRO) {
@@ -1465,12 +1467,15 @@ class ReceiveItemPOAsset extends MY_Controller
PurchaseOrderID, PurchaseOrderID,
PurchaseOrderTaxPpnType AS tax_type, PurchaseOrderTaxPpnType AS tax_type,
PurchaseOrderTaxPercentPpn AS tax_percent, PurchaseOrderTaxPercentPpn AS tax_percent,
PurchaseOrderTaxAmountPpn AS tax_amount PurchaseOrderTaxAmountPpn AS tax_amount,
IFNULL(SupplierDownpaymentAmount, 0) AS downpayment_amount
FROM receive_order_po FROM receive_order_po
JOIN receive_order_po_detail ON ReceiveOrderPoDetailReceiveOrderPoID = ReceiveOrderPoID JOIN receive_order_po_detail ON ReceiveOrderPoDetailReceiveOrderPoID = ReceiveOrderPoID
AND ReceiveOrderPoDetailIsActive = 'Y' AND ReceiveOrderPoDetailIsActive = 'Y'
AND ReceiveOrderPoIsActive = 'Y' AND ReceiveOrderPoIsActive = 'Y'
JOIN purchase_order ON ReceiveOrderPoDetailPurchaseOrderID = PurchaseOrderID JOIN purchase_order ON ReceiveOrderPoDetailPurchaseOrderID = PurchaseOrderID
LEFT JOIN supplier_downpayment
ON SupplierDownpaymentPurchasOrderID = PurchaseOrderID
WHERE ReceiveOrderPoID = ?"; WHERE ReceiveOrderPoID = ?";
$que_dataro = $this->db->query($sql_dataro, [$roID]); $que_dataro = $this->db->query($sql_dataro, [$roID]);
if (!$que_dataro) { if (!$que_dataro) {
@@ -1510,6 +1515,8 @@ class ReceiveItemPOAsset extends MY_Controller
$donumber = $data_ro['ReceiveOrderPoDONumber']; $donumber = $data_ro['ReceiveOrderPoDONumber'];
} }
$addedtax = round(($grni + $data_ro['tax_amount']), 2);
$grandtotal = round(($addedtax - $data_ro['downpayment_amount']), 2);
$sql_insert_pi = "INSERT INTO supplier_invoice ( $sql_insert_pi = "INSERT INTO supplier_invoice (
SupplierInvoiceNumber, SupplierInvoiceNumber,
SupplierInvoiceReceiveOrderPoID, SupplierInvoiceReceiveOrderPoID,
@@ -1542,8 +1549,8 @@ class ReceiveItemPOAsset extends MY_Controller
$diskonPO, $diskonPO,
$data_ro['tax_percent'], $data_ro['tax_percent'],
$data_ro['tax_amount'], $data_ro['tax_amount'],
$grni, $grandtotal,
$grni, $grandtotal,
$data_ro['ReceiveOrderPoNote'], $data_ro['ReceiveOrderPoNote'],
$user['M_UserID'], $user['M_UserID'],
$user['M_UserID'] $user['M_UserID']

View File

@@ -426,7 +426,7 @@ class ReceiveItemPoV2 extends MY_Controller {
AND ReceiveOrderPoIDate BETWEEN DATE(?) AND DATE(?) AND ReceiveOrderPoIDate BETWEEN DATE(?) AND DATE(?)
AND ReceiveOrderPoS_RegionalID = ? AND ReceiveOrderPoS_RegionalID = ?
AND ReceiveOrderPoM_BranchCode LIKE ? AND ReceiveOrderPoM_BranchCode LIKE ?
AND ReceiveOrderPoID NOT IN ( AND ReceiveOrderPoID IN (
SELECT DISTINCT ReceiveOrderPoDetailReceiveOrderPoID SELECT DISTINCT ReceiveOrderPoDetailReceiveOrderPoID
FROM receive_order_po_detail FROM receive_order_po_detail
JOIN purchase_order ON ReceiveOrderPoDetailPurchaseOrderID = PurchaseOrderID JOIN purchase_order ON ReceiveOrderPoDetailPurchaseOrderID = PurchaseOrderID

View File

@@ -28,29 +28,66 @@ class Billv2 extends MY_Controller {
$offset = ($params['currentpage'] - 1) * $limit; $offset = ($params['currentpage'] - 1) * $limit;
} }
$sql_base = "SELECT // ── UNION base — invoice branch + downpayment branch ────
SupplierPaymentID, $sql_base = "
SupplierPaymentDate, SELECT
SupplierPaymentNumber, sp.SupplierPaymentID,
SupplierPaymentAmount, sp.SupplierPaymentDate,
SupplierPaymentStatus, sp.SupplierPaymentNumber,
SupplierPaymentIsVerif, sp.SupplierPaymentAmount,
SupplierPaymentIsApproved, sp.SupplierPaymentStatus,
SupplierInvoiceID, sp.SupplierPaymentIsVerif,
SupplierInvoiceNumber, sp.SupplierPaymentIsApproved,
SupplierInvoiceDraftPaymentDate, sp.SupplierPaymentIsActive,
SupplierCode, si.SupplierInvoiceID,
SupplierName si.SupplierInvoiceNumber,
FROM supplier_payment si.SupplierInvoiceDraftPaymentDate,
JOIN supplier_invoice ON SupplierInvoiceID = SupplierPaymentSupplierInvoiceID sup.SupplierCode,
sup.SupplierName,
'INVOICE' AS type
FROM supplier_payment sp
JOIN supplier_invoice si
ON si.SupplierInvoiceID = sp.SupplierPaymentSupplierInvoiceID
JOIN supplier sup
ON sup.SupplierID = si.SupplierInvoiceSupplierID
WHERE sp.SupplierPaymentSupplierInvoiceID > 0
UNION ALL
SELECT
sp.SupplierPaymentID,
sp.SupplierPaymentDate,
sp.SupplierPaymentNumber,
sp.SupplierPaymentAmount,
sp.SupplierPaymentStatus,
sp.SupplierPaymentIsVerif,
sp.SupplierPaymentIsApproved,
sp.SupplierPaymentIsActive,
dp.SupplierDownpaymentID * -1 AS SupplierInvoiceID,
CONCAT('DP-', po.PurchaseOrderNumber) AS SupplierInvoiceNumber,
dp.SupplierDownpaymentDueDate AS SupplierInvoiceDraftPaymentDate,
dp_sup.SupplierCode AS SupplierCode,
dp_sup.SupplierName AS SupplierName,
'DP' AS type
FROM supplier_payment sp
JOIN supplier_downpayment dp
ON dp.SupplierDownpaymentID = sp.SupplierPaymentSupplierDownpaymentID
JOIN supplier dp_sup
ON dp_sup.SupplierID = dp.SupplierDownpaymentSupplierID
JOIN purchase_order po
ON po.PurchaseOrderID = dp.SupplierDownpaymentPurchasOrderID
WHERE sp.SupplierPaymentSupplierDownpaymentID IS NOT NULL";
// ── Outer: common filters + ordering + pagination ───────
$sql_data = "
SELECT * FROM ($sql_base) AS combined
WHERE SupplierPaymentIsActive = 'Y'
AND SupplierPaymentNumber LIKE ? AND SupplierPaymentNumber LIKE ?
AND (SupplierPaymentDate BETWEEN DATE(?) AND DATE(?)) AND (SupplierPaymentDate BETWEEN DATE(?) AND DATE(?))
AND (SupplierPaymentStatus = ? OR ? = 'All') AND (SupplierPaymentStatus = ? OR ? = 'All')
JOIN supplier ON SupplierID = SupplierInvoiceSupplierID ORDER BY SupplierPaymentID DESC
WHERE SupplierPaymentIsActive = 'Y' LIMIT ? OFFSET ?";
ORDER BY SupplierPaymentID DESC";
$sql_data = $sql_base . " LIMIT ? OFFSET ? ";
$que_data = $this->db->query($sql_data, [ $que_data = $this->db->query($sql_data, [
$keyword, $params['startdate'], $params['enddate'], $keyword, $params['startdate'], $params['enddate'],
$params['status'], $params['status'], $limit, $offset $params['status'], $params['status'], $limit, $offset
@@ -59,7 +96,14 @@ class Billv2 extends MY_Controller {
throw new Exception("[Error] failed get data supplier payment", 2); throw new Exception("[Error] failed get data supplier payment", 2);
} }
$sql_total = "SELECT COUNT(*) AS total FROM ($sql_base) AS x"; // ── COUNT — wrap UNION in outer filter ──────────────────
$sql_total = "
SELECT COUNT(*) AS total FROM ($sql_base) AS combined
WHERE SupplierPaymentIsActive = 'Y'
AND SupplierPaymentNumber LIKE ?
AND (SupplierPaymentDate BETWEEN DATE(?) AND DATE(?))
AND (SupplierPaymentStatus = ? OR ? = 'All')";
$que_total = $this->db->query($sql_total, [ $que_total = $this->db->query($sql_total, [
$keyword, $params['startdate'], $params['enddate'], $keyword, $params['startdate'], $params['enddate'],
$params['status'], $params['status'] $params['status'], $params['status']
@@ -96,28 +140,39 @@ class Billv2 extends MY_Controller {
$para = $this->sys_input; $para = $this->sys_input;
$sql = "SELECT // ── Detect payment type ──────────────────────────────────
SupplierInvoiceID, $sql_type = "SELECT
SupplierInvoiceRefNumber, SupplierPaymentSupplierInvoiceID,
SupplierInvoiceDeliveryOrderNumber, SupplierPaymentSupplierDownpaymentID
SupplierInvoiceSupplierInvoiceNumber,
SupplierInvoiceSupplierInvoiceDate,
SupplierInvoiceSubTotal,
SupplierInvoiceTaxPercentPph,
SupplierInvoiceTaxPercentPpn,
SupplierInvoiceTaxAmountPpn,
SupplierInvoiceDiscountAmount,
SupplierInvoiceDiscountPercent,
SupplierInvoiceShippingCost,
SupplierInvoiceGrandTotal,
SupplierInvoiceAdjustmentAmount,
SupplierInvoiceAdjustmentNote,
SupplierInvoiceNote,
IF (SupplierInvoiceDiscountAmount > 0, 'R', 'P') AS DiscountType
FROM supplier_payment FROM supplier_payment
JOIN supplier_invoice ON SupplierPaymentSupplierInvoiceID = SupplierInvoiceID WHERE SupplierPaymentID = ? AND SupplierPaymentIsActive = 'Y'";
AND SupplierPaymentID = ?
AND SupplierPaymentIsActive = 'Y'"; $que_type = $this->db->query($sql_type, [$para['paymentID']]);
if (!$que_type) {
throw new Exception("[Error] failed get payment header", 2);
}
$payment = $que_type->row_array();
if (!$payment) {
throw new Exception("[Error] payment not found", 2);
}
// ── INVOICE branch ──────────────────────────────────────
if ($payment['SupplierPaymentSupplierInvoiceID'] > 0) {
$sql = "SELECT
si.SupplierInvoiceSubTotal,
si.SupplierInvoiceShippingCost,
si.SupplierInvoiceDiscountPercent,
si.SupplierInvoiceDiscountAmount,
si.SupplierInvoiceTaxPercentPpn,
si.SupplierInvoiceTaxAmountPpn,
si.SupplierInvoiceGrandTotal,
si.SupplierInvoiceID,
'INVOICE' AS type
FROM supplier_payment sp
JOIN supplier_invoice si
ON si.SupplierInvoiceID = sp.SupplierPaymentSupplierInvoiceID
WHERE sp.SupplierPaymentID = ? AND sp.SupplierPaymentIsActive = 'Y'";
$que = $this->db->query($sql, [$para['paymentID']]); $que = $this->db->query($sql, [$para['paymentID']]);
if (!$que) { if (!$que) {
throw new Exception("[Error] failed get row data", 2); throw new Exception("[Error] failed get row data", 2);
@@ -125,33 +180,21 @@ class Billv2 extends MY_Controller {
$data = $que->row_array(); $data = $que->row_array();
$sql_detail = "SELECT $sql_detail = "SELECT
SupplierInvoiceDetailID, M_ItemDesc,
SupplierInvoiceDetailSupplierInvoiceID,
SupplierInvoiceDetailPurchaseOrderID,
SupplierInvoiceDetailPurchaseOrderSummaryID,
SupplierInvoiceDetailReceiveOrderPoID,
SupplierInvoiceDetailReceiveOrderPoDetailID,
SupplierInvoiceDetailItemID,
SupplierInvoiceDetailItemUnitID,
SupplierInvoiceDetailDescription,
SupplierInvoiceDetailQty, SupplierInvoiceDetailQty,
SupplierInvoiceDetailPrice, SupplierInvoiceDetailPrice,
SupplierInvoiceDetailDiscountPercent,
SupplierInvoiceDetailDiscountDiscountRupiah,
SupplierInvoiceDetailDiscountDiscountType,
SupplierInvoiceDetailDiscountAmount, SupplierInvoiceDetailDiscountAmount,
(SupplierInvoiceDetailPrice - SupplierInvoiceDetailDiscountAmount) AS DiscountedPrice, (SupplierInvoiceDetailPrice - SupplierInvoiceDetailDiscountAmount) AS DiscountedPrice,
SupplierInvoiceDetailDiscountPoProrata, SupplierInvoiceDetailTotal
SupplierInvoiceDetailTotal,
M_ItemCode,
M_ItemDesc
FROM supplier_payment_detail FROM supplier_payment_detail
JOIN supplier_invoice_detail ON SupplierInvoiceDetailIsActive = 'Y' JOIN supplier_invoice_detail
ON SupplierInvoiceDetailIsActive = 'Y'
AND SupplierPaymentDetailSupplierPaymentID = ? AND SupplierPaymentDetailSupplierPaymentID = ?
AND SupplierInvoiceDetailSupplierInvoiceID = ? AND SupplierInvoiceDetailSupplierInvoiceID = ?
JOIN m_item ON M_ItemID = SupplierInvoiceDetailItemID JOIN m_item
AND M_ItemIsActive = 'Y' ON M_ItemID = SupplierInvoiceDetailItemID AND M_ItemIsActive = 'Y'
GROUP BY SupplierInvoiceDetailID"; GROUP BY SupplierInvoiceDetailID";
$que_detail = $this->db->query($sql_detail, [ $que_detail = $this->db->query($sql_detail, [
$para['paymentID'], $data['SupplierInvoiceID'] $para['paymentID'], $data['SupplierInvoiceID']
]); ]);
@@ -159,8 +202,62 @@ class Billv2 extends MY_Controller {
throw new Exception("[Error] failed to get item payments", 2); throw new Exception("[Error] failed to get item payments", 2);
} }
unset($data['SupplierInvoiceID']);
$data['detail'] = $que_detail->result_array(); $data['detail'] = $que_detail->result_array();
// ── DOWNPAYMENT branch ──────────────────────────────────
} else {
$sql = "SELECT
dp.SupplierDownpaymentPurchasOrderID,
dp.SupplierDownpaymentAmount AS SupplierInvoiceSubTotal,
0 AS SupplierInvoiceShippingCost,
0 AS SupplierInvoiceDiscountPercent,
0 AS SupplierInvoiceDiscountAmount,
0 AS SupplierInvoiceTaxPercentPpn,
0 AS SupplierInvoiceTaxAmountPpn,
dp.SupplierDownpaymentAmount AS SupplierInvoiceGrandTotal,
'DP' AS type
FROM supplier_payment sp
JOIN supplier_downpayment dp
ON dp.SupplierDownpaymentID = sp.SupplierPaymentSupplierDownpaymentID
WHERE sp.SupplierPaymentID = ? AND sp.SupplierPaymentIsActive = 'Y'";
$que = $this->db->query($sql, [$para['paymentID']]);
if (!$que) {
throw new Exception("[Error] failed get DP row data", 2);
}
$data = $que->row_array();
$sql_detail = "SELECT
CONCAT('DP-', M_ItemDesc) AS M_ItemDesc,
PurchaseOrderDetailQty AS SupplierInvoiceDetailQty,
PurchaseOrderDetailPrice AS SupplierInvoiceDetailPrice,
PurchaseOrderSummaryDiscountAmount AS SupplierInvoiceDetailDiscountAmount,
(PurchaseOrderDetailPrice - PurchaseOrderSummaryDiscountAmount) AS DiscountedPrice,
PurchaseOrderSummaryTotal AS SupplierInvoiceDetailTotal
FROM supplier_downpayment
JOIN purchase_order
ON SupplierDownpaymentPurchasOrderID = PurchaseOrderID
JOIN purchase_order_detail
ON PurchaseOrderDetailPurchaseOrderID = PurchaseOrderID
AND PurchaseOrderDetailIsActive = 'Y'
JOIN purchase_order_summary
ON PurchaseOrderSummaryID = PurchaseOrderDetailPurchaseSummaryID
AND PurchaseOrderSummaryIsActive = 'Y'
JOIN m_item
ON M_ItemID = PurchaseOrderDetailItemID
WHERE SupplierDownpaymentPurchasOrderID = ?";
$que_detail = $this->db->query($sql_detail, [
$data['SupplierDownpaymentPurchasOrderID']
]);
if (!$que_detail) {
throw new Exception('failed to get dp detail', 2);
}
$data['detail'] = $que_detail->result_array();
}
$this->sys_ok($data); $this->sys_ok($data);
} catch (Exception $exc) { } catch (Exception $exc) {
$message = $exc->getMessage(); $message = $exc->getMessage();

View File

@@ -12,7 +12,8 @@ class Bill extends MY_Controller
$this->db_onedev = $this->load->database("onedev", true); $this->db_onedev = $this->load->database("onedev", true);
} }
public function add_notes($orderid){ public function add_notes($orderid)
{
$sql = "SELECT SupplierPaymentSupplierInvoiceID as note_order_id, $sql = "SELECT SupplierPaymentSupplierInvoiceID as note_order_id,
SupplierPaymentID as note_id, SupplierPaymentID as note_id,
SupplierPaymentDetailSupplierInvoiceDetailID as detail_id, SupplierPaymentDetailSupplierInvoiceDetailID as detail_id,
@@ -35,15 +36,18 @@ class Bill extends MY_Controller
CONCAT('Verified by : ',b.M_UserUsername, ' ',DATE_FORMAT(SupplierPaymentVerifDate,'%d-%m-%Y %H:%i')) as d_verif CONCAT('Verified by : ',b.M_UserUsername, ' ',DATE_FORMAT(SupplierPaymentVerifDate,'%d-%m-%Y %H:%i')) as d_verif
FROM supplier_payment FROM supplier_payment
JOIN supplier_payment_detail ON SupplierPaymentDetailSupplierPaymentID = SupplierPaymentID AND SupplierPaymentDetailIsActive = 'Y' JOIN supplier_payment_detail ON SupplierPaymentDetailSupplierPaymentID = SupplierPaymentID AND SupplierPaymentDetailIsActive = 'Y'
LEFT JOIN coa ON SupplierPaymentCoaID = coaID LEFT JOIN coa
LEFT JOIN m_user n ON SupplierPaymentUserID = n.M_UserID ON SupplierPaymentCoaID = coaID
LEFT JOIN m_user c ON SupplierPaymentConfirmUserID = c.M_UserID LEFT JOIN m_user n
LEFT JOIN m_user a ON SupplierPaymentApprovedUserID = a.M_UserID ON SupplierPaymentUserID = n.M_UserID
LEFT JOIN m_user b ON SupplierPaymentVerifUserID = b.M_UserID LEFT JOIN m_user c
WHERE ON SupplierPaymentConfirmUserID = c.M_UserID
SupplierPaymentSupplierInvoiceID = {$orderid} LEFT JOIN m_user a
AND ON SupplierPaymentApprovedUserID = a.M_UserID
SupplierPaymentIsActive = 'Y' LEFT JOIN m_user b
ON SupplierPaymentVerifUserID = b.M_UserID
WHERE SupplierPaymentSupplierInvoiceID = {$orderid}
AND SupplierPaymentIsActive = 'Y'
GROUP BY SupplierPaymentID"; GROUP BY SupplierPaymentID";
$query = $this->db_onedev->query($sql); $query = $this->db_onedev->query($sql);
if ($query) { if ($query) {
@@ -54,13 +58,71 @@ class Bill extends MY_Controller
} }
} }
return $rows; return $rows;
} else { } else {
$this->sys_error_db("get notes", $this->db_onedev); $this->sys_error_db("get notes", $this->db_onedev);
exit; exit;
} }
} }
public function add_tagihans($orderid){
public function add_notes_downpayment($orderid)
{
$sql = "SELECT SupplierPaymentSupplierDownpaymentID AS note_order_id,
SupplierPaymentID AS note_id,
SupplierDownpaymentID AS detail_id,
SupplierPaymentDate AS note_date,
SupplierPaymentNumber AS note_number,
GROUP_CONCAT(DISTINCT coaDescription separator ' , ') AS paymenttypes_name,
SUM(SupplierDownpaymentAmount) AS note_amount,
n.M_UserUsername AS note_user,
SupplierDownpaymentIsActive AS note_active,
'N' AS show_detail,
SupplierPaymentNote AS keterangan,
SupplierPaymentCoaID,
coaID,
coaDescription,
SupplierPaymentIsConfirm,
CONCAT(
'Confirmed by : ',c.M_UserUsername, ' ',
DATE_FORMAT(SupplierPaymentConfirmDate, '%d-%m-%Y %H:%i')
) AS d_confirm,
SupplierPaymentIsApproved,
CONCAT(
'Approved by : ',a.M_UserUsername, ' ',
DATE_FORMAT(SupplierPaymentApprovedDate,'%d-%m-%Y %H:%i')
) AS d_approved,
CONCAT(
'Verified by : ',b.M_UserUsername, ' ',
DATE_FORMAT(SupplierPaymentVerifDate,'%d-%m-%Y %H:%i')
) AS d_verif
FROM supplier_payment
JOIN supplier_downpayment
ON SupplierDownpaymentID = SupplierPaymentSupplierDownpaymentID
AND SupplierDownpaymentIsActive = 'Y'
LEFT JOIN coa
ON SupplierPaymentCoaID = coaID
LEFT JOIN m_user n
ON SupplierPaymentUserID = n.M_UserID
LEFT JOIN m_user c
ON SupplierPaymentConfirmUserID = c.M_UserID
LEFT JOIN m_user a
ON SupplierPaymentApprovedUserID = a.M_UserID
LEFT JOIN m_user b
ON SupplierPaymentVerifUserID = b.M_UserID
WHERE SupplierPaymentSupplierDownpaymentID = {$orderid}
AND SupplierPaymentIsActive = 'Y'
GROUP BY SupplierPaymentID";
$query = $this->db_onedev->query($sql);
if ($query) {
$rows = $query->result_array();
return $rows ?: [];
} else {
$this->sys_error_db("get DP notes", $this->db_onedev);
exit;
}
}
public function add_tagihans($orderid)
{
$sql = "SELECT SupplierInvoiceID as tagihan_id, $sql = "SELECT SupplierInvoiceID as tagihan_id,
PurchaseOrderNumber as tagihan_number, PurchaseOrderNumber as tagihan_number,
jurnalTxDescription as pasien, jurnalTxDescription as pasien,
@@ -73,25 +135,37 @@ class Bill extends MY_Controller
jurnalTxID SupplierInvoiceDetailID, jurnalTxID SupplierInvoiceDetailID,
PurchaseOrderID SupplierInvoiceDetailPurchaseOrderID PurchaseOrderID SupplierInvoiceDetailPurchaseOrderID
FROM supplier_invoice FROM supplier_invoice
JOIN purchase_order ON SupplierInvoicePurchaseOrderID = PurchaseOrderID JOIN purchase_order
JOIN jurnal_addon ON jurnalAddOnValue = SupplierInvoiceNumber ON SupplierInvoicePurchaseOrderID = PurchaseOrderID
JOIN jurnal_tx ON jurnalTxJurnalID = jurnalAddOnJurnalID AND jurnalTxCredit <> 0 AND jurnalTxCoaID <> 563 JOIN jurnal_addon
LEFT JOIN supplier_payment ON SupplierPaymentSupplierInvoiceID = SupplierInvoiceID AND SupplierInvoiceIsActive = 'Y' ON jurnalAddOnValue = SupplierInvoiceNumber
LEFT JOIN supplier_payment_detail ON SupplierPaymentDetailSupplierPaymentID = SupplierPaymentID AND SupplierPaymentDetailSupplierInvoiceDetailID = jurnalTxID AND SupplierPaymentDetailIsActive = 'Y' JOIN jurnal_tx
ON jurnalTxJurnalID = jurnalAddOnJurnalID
AND jurnalTxCredit <> 0
AND jurnalTxCoaID <> 563
LEFT JOIN supplier_payment
ON SupplierPaymentSupplierInvoiceID = SupplierInvoiceID
AND SupplierInvoiceIsActive = 'Y'
LEFT JOIN supplier_payment_detail
ON SupplierPaymentDetailSupplierPaymentID = SupplierPaymentID
AND SupplierPaymentDetailSupplierInvoiceDetailID = jurnalTxID
AND SupplierPaymentDetailIsActive = 'Y'
WHERE SupplierInvoiceID = ? WHERE SupplierInvoiceID = ?
GROUP BY jurnalTxID"; GROUP BY jurnalTxID";
$query = $this->db_onedev->query($sql, [$orderid]); $query = $this->db_onedev->query($sql, [$orderid]);
if ($query) { if ($query) {
$rows = $query->result_array(); $rows = $query->result_array();
return $rows; return $rows;
} else { } else {
$this->sys_error_db("get notes", $this->db_onedev); $this->sys_error_db("get notes", $this->db_onedev);
exit; exit;
} }
} }
public function add_tests($orderid){
$sql = " SELECT SupplierPaymentSupplierInvoiceID as note_order_id, public function add_tests($orderid)
{
$sql = "SELECT
SupplierPaymentSupplierInvoiceID as note_order_id,
SupplierPaymentID as note_id, SupplierPaymentID as note_id,
SupplierPaymentDate as note_date, SupplierPaymentDate as note_date,
SupplierPaymentNumber as note_number, SupplierPaymentNumber as note_number,
@@ -103,13 +177,17 @@ class Bill extends MY_Controller
SupplierInvoiceDetailTotal, SupplierInvoiceDetailTotal,
SupplierPaymentDetailAmount SupplierPaymentDetailAmount
FROM supplier_payment FROM supplier_payment
JOIN supplier_payment_detail ON SupplierPaymentDetailSupplierPaymentID = SupplierPaymentID JOIN supplier_payment_detail
LEFT JOIN supplier_invoice_detail ON SupplierPaymentDetailSupplierInvoiceDetailID = SupplierInvoiceDetailID ON SupplierPaymentDetailSupplierPaymentID = SupplierPaymentID
LEFT JOIN purchase_order ON SupplierInvoiceDetailPurchaseOrderID = PurchaseOrderID LEFT JOIN supplier_invoice_detail
JOIN coa ON SupplierPaymentCoaID = coaID ON SupplierPaymentDetailSupplierInvoiceDetailID = SupplierInvoiceDetailID
LEFT JOIN m_user ON SupplierPaymentDetailUserID = M_UserID LEFT JOIN purchase_order
WHERE ON SupplierInvoiceDetailPurchaseOrderID = PurchaseOrderID
SupplierPaymentID = {$orderid} JOIN coa
ON SupplierPaymentCoaID = coaID
LEFT JOIN m_user
ON SupplierPaymentDetailUserID = M_UserID
WHERE SupplierPaymentID = {$orderid}
GROUP BY SupplierPaymentDetailID"; GROUP BY SupplierPaymentDetailID";
$query = $this->db_onedev->query($sql); $query = $this->db_onedev->query($sql);
if ($query) { if ($query) {
@@ -117,19 +195,19 @@ class Bill extends MY_Controller
if ($rows) { if ($rows) {
} }
return $rows; return $rows;
} else { } else {
$this->sys_error_db("get notes", $this->db_onedev); $this->sys_error_db("get notes", $this->db_onedev);
exit; exit;
} }
} }
public function search()
public function search_old()
{ {
//# cek token valid
if (! $this->isLogin) { if (! $this->isLogin) {
$this->sys_error("Invalid Token"); $this->sys_error("Invalid Token");
exit; exit;
} }
$prm = $this->sys_input; $prm = $this->sys_input;
$supplier = $prm["supplier"]; $supplier = $prm["supplier"];
$search = $prm["search"]; $search = $prm["search"];
@@ -139,32 +217,42 @@ class Bill extends MY_Controller
$regionalid = $this->sys_user['S_RegionalID']; $regionalid = $this->sys_user['S_RegionalID'];
$number_limit = 10; $number_limit = 10;
$number_offset = ($prm['current_page'] - 1) * $number_limit ; $number_offset = ((int)$prm['current_page'] - 1) * $number_limit;
$where = "SupplierInvoiceIsActive = 'Y' // ── WHERE ────────────────────────────────────────────────
AND SupplierPaymentIsApproved = 'Y' $where = " si.SupplierInvoiceIsActive = 'Y'
AND SupplierPaymentIsVerif = 'Y' AND sp.SupplierPaymentIsApproved = 'Y'
AND SupplierPaymentIsConfirm = '{$status}' AND sp.SupplierPaymentIsVerif = 'Y'
AND (SupplierInvoiceNumber LIKE '%{$search}%' OR SupplierInvoiceSupplierInvoiceNumber LIKE '%{$search}%') AND sp.SupplierPaymentIsConfirm = ?
AND SupplierName LIKE '%{$supplier}%' AND (si.SupplierInvoiceNumber LIKE ?
AND ReceiveOrderPoS_RegionalID = {$regionalid} OR si.SupplierInvoiceSupplierInvoiceNumber LIKE ?)
AND SupplierInvoiceDraftPaymentDate BETWEEN '{$startdate}' AND '{$enddate}'"; AND sup.SupplierName LIKE ?
AND rop.ReceiveOrderPoS_RegionalID = ?
AND si.SupplierInvoiceDraftPaymentDate BETWEEN ? AND ? ";
$where_params = [
$status,
'%' . $search . '%',
'%' . $search . '%',
'%' . $supplier . '%',
$regionalid,
$startdate,
$enddate,
];
// ── COUNT ────────────────────────────────────────────────
$sql_count = "
SELECT count(*) as total
FROM supplier_invoice si
JOIN jurnal_addon ja ON ja.jurnalAddOnValue = si.SupplierInvoiceNumber
JOIN receive_order_po rop ON rop.ReceiveOrderPoID = si.SupplierInvoiceReceiveOrderPoID
LEFT JOIN supplier_payment sp
ON sp.SupplierPaymentSupplierInvoiceID = si.SupplierInvoiceID
AND sp.SupplierPaymentIsActive = 'Y'
LEFT JOIN supplier sup ON sup.SupplierID = si.SupplierInvoiceSupplierID
WHERE $where";
$query = $this->db_onedev->query($sql_count, $where_params);
$sql = " SELECT count(*) as total
FROM supplier_invoice
JOIN jurnal_addon ON jurnalAddOnValue = SupplierInvoiceNumber
LEFT JOIN supplier_payment ON SupplierInvoiceID = SupplierPaymentSupplierInvoiceID AND SupplierPaymentIsActive = 'Y'
LEFT JOIN supplier ON SupplierInvoiceSupplierID = SupplierID
JOIN receive_order_po ON SupplierInvoiceReceiveOrderPoID = ReceiveOrderPoID
WHERE
$where
";
// echo $sql;
$query = $this->db_onedev->query($sql, $sql_param);
$tot_count = 0; $tot_count = 0;
$tot_page = 0; $tot_page = 0;
@@ -176,80 +264,360 @@ class Bill extends MY_Controller
exit; exit;
} }
// ── DATA — only columns the frontend actually reads ──────
$sql_data = "
SELECT
si.SupplierInvoiceID,
si.SupplierInvoiceNumber,
si.SupplierInvoiceDraftPaymentDate,
si.SupplierInvoiceIsLunas AS flaglunas,
si.SupplierInvoiceSupplierInvoiceNumber,
DATE_FORMAT(
IFNULL(si.SupplierInvoiceSupplierInvoiceDate,''),'%d-%m-%Y'
) AS tanggalinvoice,
sup.SupplierName,
sp.SupplierPaymentID,
sp.SupplierPaymentIsConfirm,
IFNULL(sp.SupplierPaymentCashierNumber,'') AS SupplierPaymentCashierNumber,
DATE_FORMAT(
si.SupplierInvoiceDraftPaymentDate,'%d-%m-%Y'
) AS tanggalbayar,
0 AS totalbill,
0 AS paid,
0 AS unpaid,
'' AS SupplierPaymentNumber,
0 AS SupplierPaymentAmount,
'' AS SupplierPaymentDate,
'' AS notes,
'' AS tagihans,
0 AS xrounding,
'' AS chex
FROM supplier_invoice si
JOIN jurnal_addon ja ON ja.jurnalAddOnValue = si.SupplierInvoiceNumber
JOIN receive_order_po rop ON rop.ReceiveOrderPoID = si.SupplierInvoiceReceiveOrderPoID
LEFT JOIN supplier_payment sp
ON sp.SupplierPaymentSupplierInvoiceID = si.SupplierInvoiceID
AND sp.SupplierPaymentIsActive = 'Y'
LEFT JOIN supplier sup ON sup.SupplierID = si.SupplierInvoiceSupplierID
WHERE $where
GROUP BY si.SupplierInvoiceID
ORDER BY si.SupplierInvoiceID ASC
LIMIT ? OFFSET ?";
$sql = "SELECT supplier_invoice.*, $data_params = array_merge($where_params, [$number_limit, $number_offset]);
SupplierName, $query = $this->db_onedev->query($sql_data, $data_params);
'' M_MouName,
0 as totalbill,
0 as paid,
0 as unpaid,
SupplierInvoiceIsLunas as flaglunas,
'' as SupplierPaymentNumber,
0 as SupplierPaymentAmount,
'' as SupplierPaymentDate,
'' as SupplierInvoiceIssueRefNumber,
'' as notes,
'' as tagihans,
'N' as isbillterpusat,
DATE_FORMAT(SupplierInvoiceDraftPaymentDate,'%d-%m-%Y') as tanggalbayar,
DATE_FORMAT(SupplierInvoiceDraftPaymentDate,'%d%m%Y') as tanggalbayartext,
IF(SupplierPaymentID IS NULL,'N','Y') as status_invoice,
SupplierPaymentID,
SupplierPaymentIsConfirm,
DATE_FORMAT(IFNULL(SupplierInvoiceSupplierInvoiceDate,''),'%d-%m-%Y') as tanggalinvoice,
0 xrounding,
'' chex,
IFNULL(SupplierPaymentCashierNumber,'') SupplierPaymentCashierNumber
FROM supplier_invoice
LEFT JOIN supplier ON SupplierInvoiceSupplierID = SupplierID
JOIN jurnal_addon ON jurnalAddOnValue = SupplierInvoiceNumber
JOIN receive_order_po ON SupplierInvoiceReceiveOrderPoID = ReceiveOrderPoID
LEFT JOIN supplier_payment ON SupplierPaymentSupplierInvoiceID = SupplierInvoiceID AND SupplierPaymentIsActive = 'Y'
WHERE
$where
GROUP BY SupplierInvoiceID
ORDER BY SupplierInvoiceID ASC
limit $number_limit offset $number_offset";
//echo $sql;
$query = $this->db_onedev->query($sql, $sql_param);
$rows = $query->result_array(); $rows = $query->result_array();
// ── ENRICH ───────────────────────────────────────────────
if ($rows) { if ($rows) {
foreach ($rows as $k => $v) { foreach ($rows as $k => $v) {
$rows[$k]['chex'] = false; $rows[$k]['chex'] = false;
$s_payment = $this->db_onedev->query("SELECT GROUP_CONCAT(SupplierPaymentNumber SEPARATOR ', ') as SupplierPaymentNumber, $inv_id = $v['SupplierInvoiceID'];
SUM(IFNULL(SupplierPaymentAmount,0)) as SupplierPaymentAmount,
GROUP_CONCAT(DATE_FORMAT(SupplierPaymentDate,'%d-%m-%Y') SEPARATOR ', ') as SupplierPaymentDate
FROM supplier_payment
WHERE SupplierPaymentIsActive = 'Y' AND SupplierPaymentSupplierInvoiceID = {$v['SupplierInvoiceID']}")->row();
$s_jurnal = $this->db_onedev->query("SELECT SUM(jurnalTxCredit) totalbill $s_payment = $this->db_onedev->query("
FROM supplier_invoice SELECT
JOIN jurnal_addon ON jurnalAddOnValue = SupplierInvoiceNumber GROUP_CONCAT(SupplierPaymentNumber SEPARATOR ', ') as SupplierPaymentNumber,
JOIN jurnal_tx ON jurnalTxJurnalID = jurnalAddOnJurnalID AND jurnalTxCredit <> 0 AND jurnalTxCoaID <> 563 SUM(IFNULL(SupplierPaymentAmount,0)) as SupplierPaymentAmount,
WHERE SupplierInvoiceID = {$v['SupplierInvoiceID']} GROUP_CONCAT(
GROUP BY SupplierInvoiceID")->row(); DATE_FORMAT(SupplierPaymentDate,'%d-%m-%Y')
$amount = $s_payment->SupplierPaymentAmount ? $s_payment->SupplierPaymentAmount : "0.00"; SEPARATOR ', '
) as SupplierPaymentDate
FROM supplier_payment
WHERE SupplierPaymentIsActive = 'Y'
AND SupplierPaymentSupplierInvoiceID = ?",
[$inv_id]
)->row();
$s_jurnal = $this->db_onedev->query("
SELECT SUM(jurnalTxCredit) totalbill
FROM supplier_invoice si
JOIN jurnal_addon ja ON ja.jurnalAddOnValue = si.SupplierInvoiceNumber
JOIN jurnal_tx jt
ON jt.jurnalTxJurnalID = ja.jurnalAddOnJurnalID
AND jt.jurnalTxCredit <> 0
AND jt.jurnalTxCoaID <> 563
WHERE si.SupplierInvoiceID = ?
GROUP BY si.SupplierInvoiceID",
[$inv_id]
)->row();
$amount = $s_payment->SupplierPaymentAmount
? $s_payment->SupplierPaymentAmount
: "0.00";
$unpaid = (float)$s_jurnal->totalbill - (float)$amount; $unpaid = (float)$s_jurnal->totalbill - (float)$amount;
$rows[$k]['SupplierPaymentNumber'] = $s_payment->SupplierPaymentNumber; $rows[$k]['SupplierPaymentNumber'] = $s_payment->SupplierPaymentNumber;
$rows[$k]['SupplierPaymentAmount'] = $amount; $rows[$k]['SupplierPaymentAmount'] = $amount;
$rows[$k]['SupplierPaymentDate'] = $s_payment->SupplierPaymentDate; $rows[$k]['SupplierPaymentDate'] = $s_payment->SupplierPaymentDate;
$rows[$k]['paid'] = $amount; $rows[$k]['paid'] = $amount;
$rows[$k]['totalbill'] = $s_jurnal->totalbill ? $s_jurnal->totalbill : "0.00"; $rows[$k]['totalbill'] = $s_jurnal->totalbill
? $s_jurnal->totalbill
: "0.00";
$rows[$k]['unpaid'] = number_format($unpaid, 2, '.', ''); $rows[$k]['unpaid'] = number_format($unpaid, 2, '.', '');
$rows[$k]['notes'] = $this->add_notes($v['SupplierInvoiceID']); $rows[$k]['notes'] = $this->add_notes($inv_id);
$rows[$k]['tagihans'] = $this->add_tagihans($v['SupplierInvoiceID']); $rows[$k]['tagihans'] = $this->add_tagihans($inv_id);
} }
} }
$result = array("total" => $tot_page, "records" => $rows);
$result = array("total" => $tot_page, "records" => $rows, "sql"=> $this->db_onedev->last_query());
$this->sys_ok($result); $this->sys_ok($result);
exit; exit;
} }
public function search()
{
if (! $this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$prm = $this->sys_input;
$supplier = $prm["supplier"];
$search = $prm["search"];
$status = $prm["status"];
$startdate = $prm["startdate"];
$enddate = $prm["enddate"];
$regionalid = $this->sys_user['S_RegionalID'];
$number_limit = 10;
$number_offset = ((int)$prm['current_page'] - 1) * $number_limit;
// ── INVOICE branch WHERE ─────────────────────────────────
$inv_where = " si.SupplierInvoiceIsActive = 'Y'
AND rop.ReceiveOrderPoS_RegionalID = ? ";
$inv_params = [$regionalid];
// ── DOWNPAYMENT branch WHERE ─────────────────────────────
$dp_where = " dp.SupplierDownpaymentIsActive = 'Y'
AND po.PurchaseOrderS_RegionalID = ? ";
$dp_params = [$regionalid];
// ── UNION base ───────────────────────────────────────────
$sql_base = "
SELECT
si.SupplierInvoiceID,
si.SupplierInvoiceNumber,
si.SupplierInvoiceDraftPaymentDate,
si.SupplierInvoiceDraftPaymentDate AS filter_date,
si.SupplierInvoiceIsLunas AS flaglunas,
si.SupplierInvoiceSupplierInvoiceNumber,
DATE_FORMAT(
IFNULL(si.SupplierInvoiceSupplierInvoiceDate,''),'%d-%m-%Y'
) AS tanggalinvoice,
sup.SupplierName,
sp.SupplierPaymentID,
sp.SupplierPaymentIsConfirm,
sp.SupplierPaymentIsApproved,
sp.SupplierPaymentIsVerif,
sp.SupplierPaymentIsActive,
IFNULL(sp.SupplierPaymentCashierNumber,'') AS SupplierPaymentCashierNumber,
DATE_FORMAT(
si.SupplierInvoiceDraftPaymentDate,'%d-%m-%Y'
) AS tanggalbayar,
0 AS totalbill,
0 AS paid,
0 AS unpaid,
'' AS SupplierPaymentNumber,
0 AS SupplierPaymentAmount,
'' AS SupplierPaymentDate,
'' AS notes,
'' AS tagihans,
0 AS xrounding,
'' AS chex,
'INVOICE' AS type
FROM supplier_invoice si
JOIN jurnal_addon ja ON ja.jurnalAddOnValue = si.SupplierInvoiceNumber
JOIN receive_order_po rop ON rop.ReceiveOrderPoID = si.SupplierInvoiceReceiveOrderPoID
LEFT JOIN supplier_payment sp
ON sp.SupplierPaymentSupplierInvoiceID = si.SupplierInvoiceID
AND sp.SupplierPaymentIsActive = 'Y'
LEFT JOIN supplier sup ON sup.SupplierID = si.SupplierInvoiceSupplierID
WHERE $inv_where
GROUP BY si.SupplierInvoiceID
UNION ALL
SELECT
dp.SupplierDownpaymentID * -1 AS SupplierInvoiceID,
CONCAT('DP-', po.PurchaseOrderNumber) AS SupplierInvoiceNumber,
dp.SupplierDownpaymentDueDate AS SupplierInvoiceDraftPaymentDate,
dp.SupplierDownpaymentDueDate AS filter_date,
dp.SupplierDownpaymentIsLunas AS flaglunas,
'' AS SupplierInvoiceSupplierInvoiceNumber,
DATE_FORMAT(dp.SupplierDownpaymentDate,'%d-%m-%Y') AS tanggalinvoice,
dp_sup.SupplierName AS SupplierName,
sp.SupplierPaymentID,
sp.SupplierPaymentIsConfirm,
sp.SupplierPaymentIsApproved,
sp.SupplierPaymentIsVerif,
sp.SupplierPaymentIsActive,
IFNULL(sp.SupplierPaymentCashierNumber,'') AS SupplierPaymentCashierNumber,
DATE_FORMAT(
dp.SupplierDownpaymentDueDate,'%d-%m-%Y'
) AS tanggalbayar,
dp.SupplierDownpaymentAmount AS totalbill,
CASE WHEN dp.SupplierDownpaymentStatus = 'Paid'
THEN dp.SupplierDownpaymentAmount
ELSE 0 END AS paid,
CASE WHEN dp.SupplierDownpaymentStatus = 'Paid'
THEN 0
ELSE dp.SupplierDownpaymentAmount END AS unpaid,
'' AS SupplierPaymentNumber,
0 AS SupplierPaymentAmount,
'' AS SupplierPaymentDate,
'' AS notes,
'' AS tagihans,
0 AS xrounding,
'' AS chex,
'DP' AS type
FROM supplier_payment sp
JOIN supplier_downpayment dp
ON dp.SupplierDownpaymentID = sp.SupplierPaymentSupplierDownpaymentID
JOIN supplier dp_sup
ON dp_sup.SupplierID = dp.SupplierDownpaymentSupplierID
JOIN purchase_order po
ON po.PurchaseOrderID = dp.SupplierDownpaymentPurchasOrderID
WHERE $dp_where";
// ── Outer common filters ─────────────────────────────────
$outer_where = " SupplierPaymentIsActive = 'Y'
AND SupplierPaymentIsApproved = 'Y'
AND SupplierPaymentIsVerif = 'Y'
AND SupplierPaymentIsConfirm = ?
AND (SupplierInvoiceNumber LIKE ? OR SupplierInvoiceSupplierInvoiceNumber LIKE ?)
AND SupplierName LIKE ?
AND filter_date BETWEEN ? AND ? ";
$outer_params = [
$status,
'%' . $search . '%',
'%' . $search . '%',
'%' . $supplier . '%',
$startdate,
$enddate,
];
// ── COUNT ────────────────────────────────────────────────
$sql_count = "
SELECT COUNT(*) AS total
FROM ($sql_base) AS combined
WHERE $outer_where";
$count_params = array_merge($inv_params, $dp_params, $outer_params);
$query = $this->db_onedev->query($sql_count, $count_params);
$tot_count = 0;
$tot_page = 0;
if ($query) {
$tot_count = $query->result_array()[0]["total"];
$tot_page = ceil($tot_count / $number_limit);
} else {
$this->sys_error_db("supplier payment count", $this->db_onedev);
exit;
}
// ── DATA ─────────────────────────────────────────────────
$sql_data = "
SELECT * FROM ($sql_base) AS combined
WHERE $outer_where
ORDER BY SupplierInvoiceID ASC
LIMIT ? OFFSET ?";
$data_params = array_merge($inv_params, $dp_params, $outer_params, [$number_limit, $number_offset]);
$query = $this->db_onedev->query($sql_data, $data_params);
$rows = $query->result_array();
// ── ENRICH ───────────────────────────────────────────────
if ($rows) {
foreach ($rows as $k => $v) {
// ── Downpayment branch ──────────────────────────
if ($v['type'] === 'DP') {
$rows[$k]['chex'] = false;
$dp_id = abs($v['SupplierInvoiceID']);
$s_payment = $this->db_onedev->query("
SELECT
GROUP_CONCAT(SupplierPaymentNumber SEPARATOR ', ') as SupplierPaymentNumber,
SUM(IFNULL(SupplierPaymentAmount,0)) as SupplierPaymentAmount,
GROUP_CONCAT(
DATE_FORMAT(SupplierPaymentDate,'%d-%m-%Y')
SEPARATOR ', '
) as SupplierPaymentDate
FROM supplier_payment
WHERE SupplierPaymentIsActive = 'Y'
AND SupplierPaymentSupplierDownpaymentID = ?",
[$dp_id]
)->row();
$amount = $s_payment->SupplierPaymentAmount
? $s_payment->SupplierPaymentAmount
: "0.00";
$rows[$k]['SupplierPaymentNumber'] = $s_payment->SupplierPaymentNumber;
$rows[$k]['SupplierPaymentAmount'] = $amount;
$rows[$k]['SupplierPaymentDate'] = $s_payment->SupplierPaymentDate;
$rows[$k]['paid'] = $amount;
$rows[$k]['notes'] = $this->add_notes_downpayment($dp_id);
$rows[$k]['tagihans'] = [];
continue;
}
// ── Invoice branch ──────────────────────────────
$rows[$k]['chex'] = false;
$inv_id = $v['SupplierInvoiceID'];
$s_payment = $this->db_onedev->query("
SELECT
GROUP_CONCAT(SupplierPaymentNumber SEPARATOR ', ') as SupplierPaymentNumber,
SUM(IFNULL(SupplierPaymentAmount,0)) as SupplierPaymentAmount,
GROUP_CONCAT(
DATE_FORMAT(SupplierPaymentDate,'%d-%m-%Y')
SEPARATOR ', '
) as SupplierPaymentDate
FROM supplier_payment
WHERE SupplierPaymentIsActive = 'Y'
AND SupplierPaymentSupplierInvoiceID = ?",
[$inv_id]
)->row();
$s_jurnal = $this->db_onedev->query("
SELECT SUM(jurnalTxCredit) totalbill
FROM supplier_invoice si
JOIN jurnal_addon ja ON ja.jurnalAddOnValue = si.SupplierInvoiceNumber
JOIN jurnal_tx jt
ON jt.jurnalTxJurnalID = ja.jurnalAddOnJurnalID
AND jt.jurnalTxCredit <> 0
AND jt.jurnalTxCoaID <> 563
WHERE si.SupplierInvoiceID = ?
GROUP BY si.SupplierInvoiceID",
[$inv_id]
)->row();
$amount = $s_payment->SupplierPaymentAmount
? $s_payment->SupplierPaymentAmount
: "0.00";
$unpaid = (float)$s_jurnal->totalbill - (float)$amount;
$rows[$k]['SupplierPaymentNumber'] = $s_payment->SupplierPaymentNumber;
$rows[$k]['SupplierPaymentAmount'] = $amount;
$rows[$k]['SupplierPaymentDate'] = $s_payment->SupplierPaymentDate;
$rows[$k]['paid'] = $amount;
$rows[$k]['totalbill'] = $s_jurnal->totalbill
? $s_jurnal->totalbill
: "0.00";
$rows[$k]['unpaid'] = number_format($unpaid, 2, '.', '');
$rows[$k]['notes'] = $this->add_notes($inv_id);
$rows[$k]['tagihans'] = $this->add_tagihans($inv_id);
}
}
$result = array("total" => $tot_page, "records" => $rows);
$this->sys_ok($result);
exit;
}
} }

View File

@@ -70,6 +70,19 @@ class PaymentV2 extends MY_Controller
} }
# UPDATE status lunas supplier invoice # # UPDATE status lunas supplier invoice #
if ($param['type'] == 'DP') {
$sql_updatedp = "UPDATE supplier_downpayment
SET SupplierDownpaymentIsLunas = 'Y'
WHERE SupplierDownpaymentID = ?";
$que_updatedp = $this->db->query($sql_updatedp, [
abs($param['SupplierInvoiceID'])
]);
if (!$que_updatedp) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] update status lunas downpayment");
exit;
}
} else {
$sql_suppinvoice = "UPDATE supplier_invoice $sql_suppinvoice = "UPDATE supplier_invoice
SET SupplierInvoiceIsLunas = 'Y' SET SupplierInvoiceIsLunas = 'Y'
WHERE SupplierInvoiceID = ?"; WHERE SupplierInvoiceID = ?";
@@ -79,6 +92,7 @@ class PaymentV2 extends MY_Controller
$this->sys_error_db("[Error] update status lunas invoice"); $this->sys_error_db("[Error] update status lunas invoice");
exit; exit;
} }
}
# GET Latest data supplier payment # # GET Latest data supplier payment #
$sql_suppayment = "SELECT * FROM supplier_payment WHERE SupplierPaymentID = ?"; $sql_suppayment = "SELECT * FROM supplier_payment WHERE SupplierPaymentID = ?";
@@ -89,7 +103,23 @@ class PaymentV2 extends MY_Controller
exit; exit;
} }
$suppayment_header = $que_suppayment->row_array(); $suppayment_header = $que_suppayment->row_array();
$suppayment_detail = [];
if ($param['type'] == 'DP') {
$sql_suppaymentdetail = "SELECT supplier_downpayment.*
FROM supplier_payment
JOIN supplier_downpayment
ON SupplierPaymentSupplierDownpaymentID = SupplierDownpaymentID
AND SupplierDownpaymentIsActive = 'Y'
WHERE SupplierPaymentID = ?";
$que_suppaymentdetail = $this->db->query($sql_suppaymentdetail, [$param['orderid']]);
if (!$que_suppaymentdetail) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] get data latest supplier downpayment");
exit;
}
$suppayment_detail = $que_suppaymentdetail->result_array();
} else {
$sql_suppaymentdetail = "SELECT * FROM supplier_payment_detail $sql_suppaymentdetail = "SELECT * FROM supplier_payment_detail
WHERE SupplierPaymentDetailSupplierPaymentID = ?"; WHERE SupplierPaymentDetailSupplierPaymentID = ?";
$que_suppaymentdetail = $this->db->query($sql_suppaymentdetail, [$param['orderid']]); $que_suppaymentdetail = $this->db->query($sql_suppaymentdetail, [$param['orderid']]);
@@ -99,6 +129,7 @@ class PaymentV2 extends MY_Controller
exit; exit;
} }
$suppayment_detail = $que_suppaymentdetail->result_array(); $suppayment_detail = $que_suppaymentdetail->result_array();
}
$data_log = [ $data_log = [
"header" => $suppayment_header, "header" => $suppayment_header,
@@ -121,6 +152,52 @@ class PaymentV2 extends MY_Controller
# INSERT JURNAL # # INSERT JURNAL #
$detail_transac = []; $detail_transac = [];
if ($param['type'] == "DP") {
$sql_coaDP = "SELECT
coaID,
coaDescription,
SupplierDownpaymentAmount,
M_ItemID,
SupplierPaymentNumber,
M_ItemID
FROM supplier_payment
JOIN supplier_downpayment
ON SupplierDownpaymentID = SupplierPaymentSupplierDownpaymentID
AND SupplierDownpaymentIsActive = 'Y'
JOIN purchase_order_detail
ON SupplierDownpaymentPurchasOrderID = PurchaseOrderDetailPurchaseOrderID
AND PurchaseOrderDetailIsActive = 'Y'
JOIN m_item
ON M_ItemID = PurchaseOrderDetailItemID
AND M_ItemIsActive = 'Y'
JOIN fa_class
ON Fa_ClassID = M_ItemFa_ClassID
AND M_ItemIsActive = 'Y'
JOIN coa
ON coaID = Fa_ClassDownPaymentCoaID
AND coaIsActive = 'Y'
WHERE SupplierPaymentID = ?";
$que_coaDP = $this->db->query($sql_coaDP, [
$param['orderid']
]);
if (!$que_coaDP) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] get data hutang item");
exit;
}
$data_dp = $que_coaDP->result_array();
foreach ($data_dp as $key => $dp) {
$detail_transac[] = [
"coaID" => $dp['coaID'],
"coaDescription" => $dp['coaDescription'],
"debit" => $dp['SupplierDownpaymentAmount'],
"credit" => 0,
"addoncode" => "DP-JFA",
"addonvalue" => $dp['SupplierPaymentNumber'],
"addonitemid" => $dp['M_ItemID']
];
}
} else {
# GET data hutang # # GET data hutang #
$sql_datahutang = "SELECT $sql_datahutang = "SELECT
SupplierPaymentNumber AS addonvalue, SupplierPaymentNumber AS addonvalue,
@@ -154,6 +231,7 @@ class PaymentV2 extends MY_Controller
"addonitemid" => $debt['SupplierInvoiceDetailItemID'] "addonitemid" => $debt['SupplierInvoiceDetailItemID']
]; ];
} }
}
# GET data bayar # # GET data bayar #
$sql_databayar = "SELECT $sql_databayar = "SELECT

View File

@@ -62,6 +62,58 @@ class Bill extends MY_Controller
} }
} }
public function add_notes_downpayment($orderid)
{
$sql = "SELECT SupplierPaymentSupplierDownpaymentID AS note_order_id,
SupplierPaymentID AS note_id,
SupplierDownpaymentID AS detail_id,
SupplierPaymentDate AS note_date,
SupplierPaymentNumber AS note_number,
GROUP_CONCAT(DISTINCT coaDescription separator ' , ') AS paymenttypes_name,
SUM(SupplierDownpaymentAmount) AS note_amount,
n.M_UserUsername AS note_user,
SupplierDownpaymentIsActive AS note_active,
'N' AS show_detail,
SupplierPaymentNote AS keterangan,
SupplierPaymentCoaID,
coaID,
coaDescription,
SupplierPaymentIsConfirm,
CONCAT(
'Confirmed by : ',c.M_UserUsername, ' ',
DATE_FORMAT(SupplierPaymentConfirmDate, '%d-%m-%Y %H:%i')
) AS d_confirm,
SupplierPaymentIsApproved,
CONCAT(
'Approved by : ',a.M_UserUsername, ' ',
DATE_FORMAT(SupplierPaymentApprovedDate,'%d-%m-%Y %H:%i')
) AS d_approved,
CONCAT(
'Verified by : ',b.M_UserUsername, ' ',
DATE_FORMAT(SupplierPaymentVerifDate,'%d-%m-%Y %H:%i')
) AS d_verif
FROM supplier_payment
JOIN supplier_downpayment
ON SupplierDownpaymentID = SupplierPaymentSupplierDownpaymentID
AND SupplierDownpaymentIsActive = 'Y'
LEFT JOIN coa ON SupplierPaymentCoaID = coaID
LEFT JOIN m_user n ON SupplierPaymentUserID = n.M_UserID
LEFT JOIN m_user c ON SupplierPaymentConfirmUserID = c.M_UserID
LEFT JOIN m_user a ON SupplierPaymentApprovedUserID = a.M_UserID
LEFT JOIN m_user b ON SupplierPaymentVerifUserID = b.M_UserID
WHERE SupplierPaymentSupplierDownpaymentID = {$orderid}
AND SupplierPaymentIsActive = 'Y'
GROUP BY SupplierPaymentID";
$query = $this->db_onedev->query($sql);
if ($query) {
$rows = $query->result_array();
return $rows ?: [];
} else {
$this->sys_error_db("get DP notes", $this->db_onedev);
exit;
}
}
public function add_tagihans($orderid) public function add_tagihans($orderid)
{ {
$sql = "SELECT SupplierInvoiceID as tagihan_id, $sql = "SELECT SupplierInvoiceID as tagihan_id,
@@ -132,13 +184,14 @@ class Bill extends MY_Controller
} }
} }
public function search() public function search_old()
{ {
//# cek token valid //# cek token valid
if (! $this->isLogin) { if (! $this->isLogin) {
$this->sys_error("Invalid Token"); $this->sys_error("Invalid Token");
exit; exit;
} }
$prm = $this->sys_input; $prm = $this->sys_input;
$supplier = $prm["supplier"]; $supplier = $prm["supplier"];
$search = $prm["search"]; $search = $prm["search"];
@@ -255,4 +308,270 @@ class Bill extends MY_Controller
$this->sys_ok($result); $this->sys_ok($result);
exit; exit;
} }
/**
* search — unified invoice + downpayment list:
* - Only columns the frontend actually reads (no wildcard, no dead aliases)
* - UNION ALL merges supplier_invoice and supplier_downpayment
* - DP rows enriched via SupplierPaymentSupplierDownpaymentID FK
* - All queries use PDO parameterised placeholders
*/
public function search()
{
if (! $this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$prm = $this->sys_input;
$supplier = $prm["supplier"];
$search = $prm["search"];
$status = $prm["status"];
$startdate = $prm["startdate"];
$enddate = $prm["enddate"];
$regionalid = $this->sys_user['S_RegionalID'];
$number_limit = 10;
$number_offset = ((int)$prm['current_page'] - 1) * $number_limit;
// ── INVOICE WHERE ──────────────────────────────────────────
$inv_where = " SupplierInvoiceIsActive = 'Y'
AND SupplierInvoiceStatus = 'Approved'
AND SupplierInvoiceGrandTotal > 0
AND SupplierInvoiceIsInstallment = 'N'
AND IF(SupplierPaymentID IS NULL,'N','Y') = ?
AND SupplierInvoiceNumber LIKE ?
AND SupplierName LIKE ?
AND ReceiveOrderPoS_RegionalID = ?
AND SupplierInvoiceDraftPaymentDate BETWEEN ? AND ? ";
$inv_params = [
$status,
'%' . $search . '%',
'%' . $supplier . '%',
$regionalid,
$startdate,
$enddate,
];
// ── DOWNPAYMENT WHERE ──────────────────────────────────────
$dp_where = " SupplierDownpaymentIsActive = 'Y'
AND IF(SupplierDownpaymentStatus = 'Paid','Y','N') = ?
AND PurchaseOrderNumber LIKE ?
AND SupplierName LIKE ?
AND PurchaseOrderS_RegionalID = ?
AND SupplierDownpaymentDueDate BETWEEN ? AND ? ";
$dp_params = [
$status,
'%' . $search . '%',
'%' . $supplier . '%',
$regionalid,
$startdate,
$enddate,
];
// ── COUNT query — UNION of both sources ────────────────────
$sql_count = "SELECT SUM(cnt) as total FROM (
SELECT count(*) as cnt
FROM supplier_invoice
JOIN jurnal_addon ON jurnalAddOnValue = SupplierInvoiceNumber
LEFT JOIN supplier_payment
ON SupplierInvoiceID = SupplierPaymentSupplierInvoiceID
AND SupplierPaymentIsActive = 'Y'
LEFT JOIN supplier ON SupplierInvoiceSupplierID = SupplierID
JOIN receive_order_po ON SupplierInvoiceReceiveOrderPoID = ReceiveOrderPoID
WHERE $inv_where
UNION ALL
SELECT count(*) as cnt
FROM supplier_downpayment
JOIN purchase_order ON PurchaseOrderID = SupplierDownpaymentPurchasOrderID
JOIN supplier ON SupplierID = SupplierDownpaymentSupplierID
WHERE $dp_where
) AS combined";
$count_params = array_merge($inv_params, $dp_params);
$query = $this->db_onedev->query($sql_count, $count_params);
$tot_count = 0;
$tot_page = 0;
if ($query) {
$tot_count = $query->result_array()[0]["total"];
$tot_page = ceil($tot_count / $number_limit);
} else {
$this->sys_error_db("payment instructions count", $this->db_onedev);
exit;
}
// ── DATA query — UNION with identical columns ──────────────
$sql_data = "
SELECT * FROM (
SELECT
SupplierInvoiceID,
SupplierInvoiceNumber,
SupplierInvoiceDraftPaymentDate,
SupplierInvoiceIsLunas as flaglunas,
SupplierName,
DATE_FORMAT(SupplierInvoiceDraftPaymentDate,'%d-%m-%Y') as tanggalbayar,
IFNULL(SupplierPaymentIsApproved,'N') as SupplierPaymentIsApproved,
IFNULL(SupplierPaymentCashierNumber,'') as SupplierPaymentCashierNumber,
0 as totalbill,
0 as paid,
0 as unpaid,
0 as SupplierPaymentID,
'' as SupplierPaymentNumber,
0 as SupplierPaymentAmount,
'' as SupplierPaymentDate,
'' as notes,
'' as tagihans,
'INVOICE' as type
FROM supplier_invoice
LEFT JOIN supplier ON SupplierInvoiceSupplierID = SupplierID
JOIN jurnal_addon ON jurnalAddOnValue = SupplierInvoiceNumber
JOIN receive_order_po ON SupplierInvoiceReceiveOrderPoID = ReceiveOrderPoID
LEFT JOIN supplier_payment
ON SupplierPaymentSupplierInvoiceID = SupplierInvoiceID
AND SupplierPaymentIsActive = 'Y'
WHERE $inv_where
GROUP BY SupplierInvoiceID
UNION ALL
SELECT
SupplierDownpaymentID * -1 as SupplierInvoiceID,
CONCAT('DP-', PurchaseOrderNumber) as SupplierInvoiceNumber,
SupplierDownpaymentDueDate as SupplierInvoiceDraftPaymentDate,
SupplierDownpaymentIsLunas as flaglunas,
SupplierName,
DATE_FORMAT(SupplierDownpaymentDueDate,'%d-%m-%Y') as tanggalbayar,
'N' as SupplierPaymentIsApproved,
'' as SupplierPaymentCashierNumber,
SupplierDownpaymentAmount as totalbill,
CASE WHEN SupplierDownpaymentStatus = 'Paid'
THEN SupplierDownpaymentAmount
ELSE 0 END as paid,
CASE WHEN SupplierDownpaymentStatus = 'Paid'
THEN 0
ELSE SupplierDownpaymentAmount END as unpaid,
0 as SupplierPaymentID,
'' as SupplierPaymentNumber,
0 as SupplierPaymentAmount,
'' as SupplierPaymentDate,
'' as notes,
'' as tagihans,
'DP' as type
FROM supplier_downpayment
JOIN purchase_order ON PurchaseOrderID = SupplierDownpaymentPurchasOrderID
JOIN supplier ON SupplierID = SupplierDownpaymentSupplierID
WHERE $dp_where
) AS combined
ORDER BY SupplierInvoiceID ASC
LIMIT ? OFFSET ?";
$data_params = array_merge($inv_params, $dp_params, [$number_limit, $number_offset]);
$query = $this->db_onedev->query($sql_data, $data_params);
$rows = $query->result_array();
// ── ENRICH — per-row sub-queries ───────────────────────────
if ($rows) {
foreach ($rows as $k => $v) {
// ── Downpayment branch ──────────────────────────
if ($v['type'] === 'DP') {
$dp_id = abs($v['SupplierInvoiceID']);
$s_payment = $this->db_onedev->query("
SELECT
GROUP_CONCAT(SupplierPaymentNumber SEPARATOR ', ') as SupplierPaymentNumber,
SUM(IFNULL(SupplierPaymentAmount,0)) as SupplierPaymentAmount,
IFNULL(SupplierPaymentID,0) as SupplierPaymentID,
GROUP_CONCAT(
DATE_FORMAT(SupplierPaymentDate,'%d-%m-%Y')
SEPARATOR ', '
) as SupplierPaymentDate
FROM supplier_payment
WHERE SupplierPaymentIsActive = 'Y'
AND SupplierPaymentSupplierDownpaymentID = ?",
[$dp_id]
)->row();
$amount = $s_payment->SupplierPaymentAmount
? $s_payment->SupplierPaymentAmount
: "0.00";
$rows[$k]['SupplierPaymentID'] = $s_payment->SupplierPaymentID
? $s_payment->SupplierPaymentID
: '0';
$rows[$k]['SupplierPaymentNumber'] = $s_payment->SupplierPaymentNumber
? $s_payment->SupplierPaymentNumber
: '';
$rows[$k]['SupplierPaymentAmount'] = $amount;
$rows[$k]['SupplierPaymentDate'] = $s_payment->SupplierPaymentDate;
$rows[$k]['paid'] = $amount;
$rows[$k]['notes'] = $this->add_notes_downpayment($dp_id);
$rows[$k]['tagihans'] = [];
// totalbill, unpaid already correct from UNION CASE
continue;
}
// ── Invoice branch ───────────────────────────────
$inv_id = $v['SupplierInvoiceID'];
$s_payment = $this->db_onedev->query("
SELECT
GROUP_CONCAT(SupplierPaymentNumber SEPARATOR ', ') as SupplierPaymentNumber,
SUM(IFNULL(SupplierPaymentAmount,0)) as SupplierPaymentAmount,
IFNULL(SupplierPaymentID,0) as SupplierPaymentID,
GROUP_CONCAT(
DATE_FORMAT(SupplierPaymentDate,'%d-%m-%Y')
SEPARATOR ', '
) as SupplierPaymentDate
FROM supplier_payment
WHERE SupplierPaymentIsActive = 'Y'
AND SupplierPaymentSupplierInvoiceID = ?",
[$inv_id]
)->row();
$s_jurnal = $this->db_onedev->query("
SELECT SUM(jurnalTxCredit) totalbill
FROM supplier_invoice
JOIN jurnal_addon ON jurnalAddOnValue = SupplierInvoiceNumber
JOIN jurnal_tx
ON jurnalTxJurnalID = jurnalAddOnJurnalID
AND jurnalTxCredit <> 0
AND jurnalTxCoaID <> 563
WHERE SupplierInvoiceID = ?
GROUP BY SupplierInvoiceID",
[$inv_id]
)->row();
$amount = $s_payment->SupplierPaymentAmount
? $s_payment->SupplierPaymentAmount
: "0.00";
$unpaid = (float)$s_jurnal->totalbill - (float)$amount;
$rows[$k]['SupplierPaymentID'] = $s_payment->SupplierPaymentID
? $s_payment->SupplierPaymentID
: '0';
$rows[$k]['SupplierPaymentNumber'] = $s_payment->SupplierPaymentNumber
? $s_payment->SupplierPaymentNumber
: '';
$rows[$k]['SupplierPaymentAmount'] = $amount;
$rows[$k]['SupplierPaymentDate'] = $s_payment->SupplierPaymentDate;
$rows[$k]['paid'] = $amount;
$rows[$k]['totalbill'] = $s_jurnal->totalbill
? $s_jurnal->totalbill
: "0.00";
$rows[$k]['unpaid'] = number_format($unpaid, 2, '.', '');
$rows[$k]['notes'] = $this->add_notes($inv_id);
$rows[$k]['tagihans'] = $this->add_tagihans($inv_id);
}
}
$result = array("total" => $tot_page, "records" => $rows);
$this->sys_ok($result);
exit;
}
} }

View File

@@ -39,7 +39,12 @@ class Payment extends MY_Controller
0 as leftvalue, 0 as leftvalue,
0 as rightvalue 0 as rightvalue
FROM m_paymenttype WHERE coaIsActive = 'Y'"; FROM m_paymenttype WHERE coaIsActive = 'Y'";
$rows = $this->db_onedev->query($query)->result_array(); $que = $this->db_onedev->query($query);
if (!$que) {
$this->sys_error_db("failed to query tipe");
exit;
}
$rows = $que->result_array();
foreach ($rows as $k => $v) { foreach ($rows as $k => $v) {
$rows[$k]['selected_card'] = array('id' => 0, 'name' => ''); $rows[$k]['selected_card'] = array('id' => 0, 'name' => '');
$rows[$k]['selected_edc'] = array('id' => 0, 'name' => ''); $rows[$k]['selected_edc'] = array('id' => 0, 'name' => '');
@@ -56,7 +61,9 @@ class Payment extends MY_Controller
$this->sys_ok($result); $this->sys_ok($result);
exit; exit;
} }
function selectpaymenttypeold(){
function selectpaymenttypeold()
{
try { try {
//# cek token valid //# cek token valid
@@ -77,15 +84,14 @@ class Payment extends MY_Controller
"records" => $rows, "records" => $rows,
); );
$this->sys_ok($result); $this->sys_ok($result);
} catch (Exception $exc) { } catch (Exception $exc) {
$message = $exc->getMessage(); $message = $exc->getMessage();
$this->sys_error($message); $this->sys_error($message);
} }
} }
function selectpaymenttype(){
function selectpaymenttype()
{
try { try {
//# cek token valid //# cek token valid
@@ -134,15 +140,14 @@ ORDER BY coaAccountNo ASC";
"records" => $rows, "records" => $rows,
); );
$this->sys_ok($result); $this->sys_ok($result);
} catch (Exception $exc) { } catch (Exception $exc) {
$message = $exc->getMessage(); $message = $exc->getMessage();
$this->sys_error($message); $this->sys_error($message);
} }
} }
function selectbank(){
function selectbank()
{
try { try {
//# cek token valid //# cek token valid
@@ -158,7 +163,12 @@ ORDER BY coaAccountNo ASC";
ORDER BY Nat_BankCode DESC ORDER BY Nat_BankCode DESC
"; ";
//echo $query; //echo $query;
$rows['banks'] = $this->db_onedev->query($query)->result_array(); $que = $this->db_onedev->query($query);
if (!$que) {
$this->sys_error_db("failed");
exit;
}
$rows['banks'] = $que->result_array();
$result = array( $result = array(
@@ -166,15 +176,14 @@ ORDER BY coaAccountNo ASC";
"records" => $rows, "records" => $rows,
); );
$this->sys_ok($result); $this->sys_ok($result);
} catch (Exception $exc) { } catch (Exception $exc) {
$message = $exc->getMessage(); $message = $exc->getMessage();
$this->sys_error($message); $this->sys_error($message);
} }
} }
function selectaccount(){
function selectaccount()
{
try { try {
//# cek token valid //# cek token valid
@@ -190,7 +199,12 @@ ORDER BY coaAccountNo ASC";
M_BankAccountIsActive = 'Y' M_BankAccountIsActive = 'Y'
ORDER BY Nat_BankCode DESC"; ORDER BY Nat_BankCode DESC";
//echo $query; //echo $query;
$rows['accounts'] = $this->db_onedev->query($query)->result_array(); $que = $this->db_onedev->query($query);
if (!$que) {
$this->sys_error_db("failed");
exit;
}
$rows['accounts'] = $que->result_array();
$result = array( $result = array(
@@ -198,14 +212,12 @@ ORDER BY coaAccountNo ASC";
"records" => $rows, "records" => $rows,
); );
$this->sys_ok($result); $this->sys_ok($result);
} catch (Exception $exc) { } catch (Exception $exc) {
$message = $exc->getMessage(); $message = $exc->getMessage();
$this->sys_error($message); $this->sys_error($message);
} }
} }
function lookup_banks() function lookup_banks()
{ {
//# cek token valid //# cek token valid
@@ -218,7 +230,12 @@ ORDER BY coaAccountNo ASC";
WHERE WHERE
Nat_BankIsActive = 'Y' Nat_BankIsActive = 'Y'
ORDER BY Nat_BankCode DESC"; ORDER BY Nat_BankCode DESC";
$rows = $this->db_onedev->query($query)->result_array(); $que = $this->db_onedev->query($query);
if (!$que) {
$this->sys_error_db("failed to query tipe");
exit;
}
$rows = $que->result_array();
$result = array( $result = array(
"total" => count($rows), "total" => count($rows),
@@ -241,19 +258,22 @@ ORDER BY coaAccountNo ASC";
WHERE WHERE
M_BankAccountIsActive = 'Y' M_BankAccountIsActive = 'Y'
ORDER BY Nat_BankCode DESC"; ORDER BY Nat_BankCode DESC";
$rows = $this->db_onedev->query($query)->result_array(); $que = $this->db_onedev->query($query);
if (!$que) {
$this->sys_error_db("failed to query tipe");
exit;
}
$rows = $que->result_array();
$result = array( $result = array(
"total" => count($rows), "total" => count($rows),
"records" => $rows, "records" => $rows,
); );
$this->sys_ok($result); $this->sys_ok($result);
exit;
} }
function searchcard()
{
function searchcard(){
if (! $this->isLogin) { if (! $this->isLogin) {
$this->sys_error("Invalid Token"); $this->sys_error("Invalid Token");
exit; exit;
@@ -267,8 +287,7 @@ ORDER BY coaAccountNo ASC";
'search' => '%' 'search' => '%'
]; ];
if ($prm['search'] != '') if ($prm['search'] != '') {
{
$q['search'] = "%{$prm['search']}%"; $q['search'] = "%{$prm['search']}%";
} }
@@ -282,8 +301,7 @@ ORDER BY coaAccountNo ASC";
AND Nat_BankIsActive = 'Y' AND Nat_BankIsActive = 'Y'
ORDER BY Nat_BankName DESC ORDER BY Nat_BankName DESC
"; ";
} } else {
else{
$sql = " $sql = "
SELECT count(*) as total SELECT count(*) as total
FROM nat_bank FROM nat_bank
@@ -296,8 +314,7 @@ ORDER BY coaAccountNo ASC";
//echo $query; //echo $query;
if ($query) { if ($query) {
$tot_count = $query->result_array()[0]["total"]; $tot_count = $query->result_array()[0]["total"];
} } else {
else {
$this->sys_error_db("m_city count", $this->db_onedev); $this->sys_error_db("m_city count", $this->db_onedev);
exit; exit;
} }
@@ -310,8 +327,7 @@ ORDER BY coaAccountNo ASC";
AND Nat_BankIsActive = 'Y' AND Nat_BankIsActive = 'Y'
ORDER BY Nat_BankName DESC ORDER BY Nat_BankName DESC
"; ";
} } else {
else{
$sql = " $sql = "
SELECT Nat_BankID as id, Nat_BankName as name SELECT Nat_BankID as id, Nat_BankName as name
FROM nat_bank FROM nat_bank
@@ -328,14 +344,12 @@ ORDER BY coaAccountNo ASC";
//echo $this->db_onedev->last_query(); //echo $this->db_onedev->last_query();
$result = array("total" => $tot_count, "records" => $rows, "total_display" => sizeof($rows)); $result = array("total" => $tot_count, "records" => $rows, "total_display" => sizeof($rows));
$this->sys_ok($result); $this->sys_ok($result);
} } else {
else {
$this->sys_error_db("m_city rows", $this->db_onedev); $this->sys_error_db("m_city rows", $this->db_onedev);
exit; exit;
} }
} }
function pay() function pay()
{ {
//# cek token valid //# cek token valid
@@ -353,9 +367,11 @@ ORDER BY coaAccountNo ASC";
$sql = "INSERT INTO supplier_payment $sql = "INSERT INTO supplier_payment
(SupplierPaymentSupplierInvoiceID,SupplierPaymentDate,SupplierPaymentCreated,SupplierPaymentUserID) (SupplierPaymentSupplierInvoiceID,SupplierPaymentDate,SupplierPaymentCreated,SupplierPaymentUserID)
VALUES (?,CURDATE(),NOW(),?)"; VALUES (?,CURDATE(),NOW(),?)";
$query = $this->db_onedev->query($sql, $query = $this->db_onedev->query(
$sql,
array( array(
$orderid, $xuserid $orderid,
$xuserid
) )
); );
@@ -376,8 +392,7 @@ ORDER BY coaAccountNo ASC";
$change = $v['rightvalue']; $change = $v['rightvalue'];
if ($actual > 0) { if ($actual > 0) {
$amount = intval($v['leftvalue']) - intval($v['rightvalue']); $amount = intval($v['leftvalue']) - intval($v['rightvalue']);
} } else {
else{
$amount = $actual; $amount = $actual;
} }
@@ -388,9 +403,7 @@ ORDER BY coaAccountNo ASC";
$this->sys_error_db("supplier_payment_detail cash insert"); $this->sys_error_db("supplier_payment_detail cash insert");
exit; exit;
} }
} else {
}
else{
if (intval($v['leftvalue']) > 0) { if (intval($v['leftvalue']) > 0) {
$actual = 0; $actual = 0;
$change = 0; $change = 0;
@@ -448,6 +461,106 @@ ORDER BY coaAccountNo ASC";
$this->sys_ok($result); $this->sys_ok($result);
exit; exit;
} }
function payDownpayment()
{
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$xuserid = $this->sys_user['M_UserID'];
$prm = $this->sys_input;
$supllierDPID = abs($prm['orderid']); // SupplierDownpaymentID sent as orderid
$this->db_onedev->trans_begin();
$xnumber = $this->db_onedev->query(
"SELECT `fn_numbering`('PINV') as numberx"
)->row()->numberx;
// Insert payment header (SupplierInvoiceID = 0, linked via Downpayment FK)
$sql = "INSERT INTO supplier_payment (
SupplierPaymentSupplierInvoiceID,
SupplierPaymentSupplierDownpaymentID,
SupplierPaymentNumber,
SupplierPaymentDate,
SupplierPaymentAmount,
SupplierPaymentCoaID,
SupplierPaymentNote,
SupplierPaymentCreated,
SupplierPaymentUserID
) VALUES (0, ?, ?, CURDATE(), ?, ?, ?, NOW(), ?)";
$que = $this->db_onedev->query($sql, [
$supllierDPID,
$xnumber,
$prm['amount'],
$prm['paymenttype'],
$prm['keterangan'],
$xuserid
]);
if (!$que) {
$this->db_onedev->trans_rollback();
$this->sys_error_db("supplier_payment insert for DP");
exit;
}
$headerid = $this->db_onedev->insert_id();
// Mark downpayment as paid
$sql_dp = "UPDATE supplier_downpayment SET
SupplierDownpaymentDueDate = ?,
SupplierDownpaymentStatus = 'Paid',
SupplierDownpaymentDate = CURDATE(),
SupplierDownpaymentLastUpdatedUserID = ?
WHERE SupplierDownpaymentID = ?
AND SupplierDownpaymentIsActive = 'Y'
AND SupplierDownpaymentStatus != 'Paid'";
$que_dp = $this->db_onedev->query($sql_dp, [
$prm['tanggalbayar'],
$xuserid,
$supllierDPID
]);
if (!$que_dp) {
$this->db_onedev->trans_rollback();
$this->sys_error_db("supplier_downpayment update status");
exit;
}
// Audit
$sql_audit = "SELECT * FROM supplier_payment
JOIN m_user ON M_UserID = SupplierPaymentUserID
WHERE SupplierPaymentID = ?";
$que_audit = $this->db_onedev->query($sql_audit, [$headerid]);
$row = $que_audit->row_array();
$data = array("header" => $row, "details" => []);
$message = "Nomor Pembayaran DP: " . $row["SupplierPaymentNumber"]
. " berhasil dibuat oleh " . $row["M_UserUsername"];
$this->insert_act_log(
"PF",
"NEW",
$message,
$headerid,
$this->safeJsonEncode($data),
$xuserid
);
$this->db_onedev->trans_commit();
$xdata = $this->db_onedev->query(
"SELECT SupplierPaymentID as idx, SupplierPaymentNumber as numberx
FROM supplier_payment WHERE SupplierPaymentID = ?",
[$headerid]
)->row();
$result = array(
"total" => 1,
"records" => array('data' => $xdata)
);
$this->sys_ok($result);
exit;
}
function paymanual() function paymanual()
{ {
//# cek token valid //# cek token valid
@@ -479,15 +592,9 @@ ORDER BY coaAccountNo ASC";
SupplierPaymentNote, SupplierPaymentNote,
SupplierPaymentCreated, SupplierPaymentCreated,
SupplierPaymentUserID) SupplierPaymentUserID)
VALUES (?, VALUES (?,?,CURDATE(),?,?,?,NOW(),?)";
?, $query = $this->db_onedev->query(
CURDATE(), $sql,
?,
?,
?,
NOW(),
?)";
$query = $this->db_onedev->query($sql,
array( array(
$orderid, $orderid,
$xnumber, $xnumber,
@@ -593,10 +700,9 @@ ORDER BY coaAccountNo ASC";
*/ */
} }
} }
} }
$sql = "SELECT * FROM supplier_payment $sql = "SELECT * FROM supplier_payment
JOIN m_user ON M_UserID = SupplierPaymentUserID JOIN m_user ON M_UserID = SupplierPaymentUserID
WHERE SupplierPaymentID = ?"; WHERE SupplierPaymentID = ?";
@@ -608,8 +714,10 @@ ORDER BY coaAccountNo ASC";
$query = $this->db_onedev->query($sql, [$headerid]); $query = $this->db_onedev->query($sql, [$headerid]);
$rows = $query->row_array(); $rows = $query->row_array();
$data = array("header" => $row, $data = array(
"details" => $rows); "header" => $row,
"details" => $rows
);
$message = "Nomor Pembayaran Faktur: " . $row["SupplierPaymentNumber"] . " berhasil dibuat oleh " . $row["M_UserUsername"]; $message = "Nomor Pembayaran Faktur: " . $row["SupplierPaymentNumber"] . " berhasil dibuat oleh " . $row["M_UserUsername"];
$this->insert_act_log("PF", "NEW", $message, $headerid, $this->safeJsonEncode($data), $xuserid); $this->insert_act_log("PF", "NEW", $message, $headerid, $this->safeJsonEncode($data), $xuserid);
@@ -621,6 +729,7 @@ ORDER BY coaAccountNo ASC";
$this->sys_ok($result); $this->sys_ok($result);
exit; exit;
} }
function editpaymanual() function editpaymanual()
{ {
//# cek token valid //# cek token valid
@@ -656,8 +765,10 @@ ORDER BY coaAccountNo ASC";
$query = $this->db_onedev->query($sql, [$headerid]); $query = $this->db_onedev->query($sql, [$headerid]);
$rows = $query->row_array(); $rows = $query->row_array();
$data = array("header" => $row, $data = array(
"details" => $rows); "header" => $row,
"details" => $rows
);
$message = "Nomor Pembayaran Faktur: " . $row["SupplierPaymentNumber"] . " berhasil diubah oleh " . $row["M_UserUsername"]; $message = "Nomor Pembayaran Faktur: " . $row["SupplierPaymentNumber"] . " berhasil diubah oleh " . $row["M_UserUsername"];
$this->insert_act_log("PF", "NEW", $message, $headerid, $this->safeJsonEncode($data), $xuserid); $this->insert_act_log("PF", "NEW", $message, $headerid, $this->safeJsonEncode($data), $xuserid);
@@ -669,6 +780,7 @@ ORDER BY coaAccountNo ASC";
$this->sys_ok($result); $this->sys_ok($result);
exit; exit;
} }
function delete_note() function delete_note()
{ {
//# cek token valid //# cek token valid
@@ -694,8 +806,10 @@ ORDER BY coaAccountNo ASC";
$query = $this->db_onedev->query($sql, [$headerid]); $query = $this->db_onedev->query($sql, [$headerid]);
$rows = $query->row_array(); $rows = $query->row_array();
$data = array("header" => $row, $data = array(
"details" => $rows); "header" => $row,
"details" => $rows
);
$sql = "UPDATE supplier_payment $sql = "UPDATE supplier_payment
SET SupplierPaymentIsActive = 'N' SET SupplierPaymentIsActive = 'N'
@@ -746,6 +860,7 @@ ORDER BY coaAccountNo ASC";
$this->sys_ok($result); $this->sys_ok($result);
exit; exit;
} }
function edit_note() function edit_note()
{ {
//# cek token valid //# cek token valid
@@ -850,6 +965,7 @@ ORDER BY coaAccountNo ASC";
$this->sys_ok($result); $this->sys_ok($result);
exit; exit;
} }
function insert_act_log($code, $status, $description, $refId, $data, $userId) function insert_act_log($code, $status, $description, $refId, $data, $userId)
{ {
$sql = "INSERT INTO user_activity( $sql = "INSERT INTO user_activity(
@@ -867,7 +983,9 @@ ORDER BY coaAccountNo ASC";
exit; exit;
} }
} }
private function safeJsonEncode($data) {
private function safeJsonEncode($data)
{
// Coba encode data ke JSON // Coba encode data ke JSON
$jsonData = json_encode($data); $jsonData = json_encode($data);
@@ -894,7 +1012,8 @@ ORDER BY coaAccountNo ASC";
} }
// Fungsi untuk memperbaiki masalah encoding JSON // Fungsi untuk memperbaiki masalah encoding JSON
private function fixJsonEncodeIssues($data, $errorMsg) { private function fixJsonEncodeIssues($data, $errorMsg)
{
// Buat salinan data untuk dimodifikasi // Buat salinan data untuk dimodifikasi
$fixedData = $data; $fixedData = $data;
@@ -917,7 +1036,8 @@ ORDER BY coaAccountNo ASC";
} }
// Perbaiki masalah karakter UTF-8 // Perbaiki masalah karakter UTF-8
private function fixUTF8Issues($data) { private function fixUTF8Issues($data)
{
if (is_string($data)) { if (is_string($data)) {
return mb_convert_encoding($data, 'UTF-8', 'UTF-8'); return mb_convert_encoding($data, 'UTF-8', 'UTF-8');
} else if (is_array($data)) { } else if (is_array($data)) {
@@ -929,7 +1049,8 @@ ORDER BY coaAccountNo ASC";
} }
// Perbaiki masalah nilai Infinity atau NaN // Perbaiki masalah nilai Infinity atau NaN
private function fixInfNanIssues($data) { private function fixInfNanIssues($data)
{
if (is_array($data)) { if (is_array($data)) {
foreach ($data as $key => $value) { foreach ($data as $key => $value) {
if (is_float($value) && (is_nan($value) || is_infinite($value))) { if (is_float($value) && (is_nan($value) || is_infinite($value))) {
@@ -943,7 +1064,8 @@ ORDER BY coaAccountNo ASC";
} }
// Perbaiki masalah referensi recursif // Perbaiki masalah referensi recursif
private function fixRecursiveReferences($data, $depth = 0) { private function fixRecursiveReferences($data, $depth = 0)
{
// Batasi kedalaman rekursi untuk menghindari infinite loop // Batasi kedalaman rekursi untuk menghindari infinite loop
if ($depth > 50) { if ($depth > 50) {
return "[MAX_DEPTH_REACHED]"; return "[MAX_DEPTH_REACHED]";
@@ -965,7 +1087,8 @@ ORDER BY coaAccountNo ASC";
} }
// Cari dan konversi numerik ke string secara rekursif // Cari dan konversi numerik ke string secara rekursif
private function convertNumericValuesToStrings($data) { private function convertNumericValuesToStrings($data)
{
if (is_array($data)) { if (is_array($data)) {
foreach ($data as $key => $value) { foreach ($data as $key => $value) {
if (is_array($value)) { if (is_array($value)) {