Files
be-accone/application/controllers/mockup/receive-item-po/Receiveitempo_backup.php

2956 lines
123 KiB
PHP

<?php
class Receiveitempo extends MY_Controller
{
var $db;
public function index()
{
echo "Receive item po API";
}
public function __construct()
{
parent::__construct();
}
function getSupplier()
{
try {
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$payload = $this->sys_input;
$userId = $this->sys_user["M_UserID"];
$search = '%%';
if (isset($payload['search'])) {
$search = trim($payload["search"]);
if ($search != "") {
$search = '%' . $search . '%';
} else {
$search = '%%';
}
}
$sql = "SELECT SupplierID,
SupplierCode,
SupplierName
FROM supplier
WHERE SupplierIsActive = 'Y'
AND SupplierName LIKE '{$search}'
ORDER BY SupplierName ASC ";
$qry = $this->db->query($sql, []);
if (!$qry) {
$this->db->trans_rollback();
$this->sys_error_db("select supplier", $this->db);;
exit;
}
$rows = $qry->result_array();
$result = array(
"records" => $rows,
"sql" => $this->db->last_query()
);
$this->sys_ok($rows);
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
function getPurchaseOrder()
{
try {
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$payload = $this->sys_input;
$userId = $this->sys_user["M_UserID"];
$regionalID = $this->sys_user["S_RegionalID"];;
$search = '%%';
if (isset($payload['search'])) {
$search = trim($payload["search"]);
if ($search != "") {
$search = '%' . $search . '%';
} else {
$search = '%%';
}
}
$sql = " SELECT
GROUP_CONCAT(DISTINCT PurchaseOrderDetailWarehouseID) arrWarehouse,
purchase_order.*
FROM purchase_order
JOIN purchase_order_detail
ON PurchaseOrderID = PurchaseOrderDetailPurchaseOrderID
AND PurchaseOrderDetailIsActive = 'Y'
AND (SELECT IFNULL(SUM(PoItemReceiveQty - PoItemReceiveQtyReceived), 0)
FROM po_item_receive
WHERE PoItemReceivePurchaseOrderID = PurchaseOrderID) > 0
JOIN warehouse
ON PurchaseOrderDetailWarehouseID = WarehouseID
WHERE
WarehouseS_RegionalID = ?
AND PurchaseOrderStatus = 'Approved'
AND PurchaseOrderNumber LIKE ?
GROUP BY PurchaseOrderID
LIMIT 50";
$qry = $this->db->query($sql, [$regionalID, $search]);
if (!$qry) {
$this->sys_error_db("select po", $this->db);;
exit;
}
$rows = $qry->result_array();
$this->sys_ok($rows);
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
function getWarehouse()
{
try {
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$payload = $this->sys_input;
$user = $this->sys_user;
$userId = $this->sys_user["M_UserID"];
$regionalId = $this->sys_user["S_RegionalID"];
$sqlWhere = "";
if ($user['M_UserLocationFlag'] == "R") {
$sqlWhere = "AND WarehouseType = 'R'";
}
if ($user['M_UserLocationFlag'] == "RB" || $user['M_UserLocationFlag'] == "B") {
$sqlWhere = "AND WarehouseType = 'B' AND WarehouseM_BranchID = {$user['M_BranchID']}";
}
$sql = "SELECT
WarehouseID,
WarehouseCode,
CASE
WHEN WarehouseType = 'B' THEN CONCAT(WarehouseCode,' ', WarehouseName, ' - ', M_BranchName)
WHEN WarehouseType = 'R' THEN CONCAT(WarehouseCode,' ', WarehouseName, ' - ', S_RegionalName)
ELSE ''
END WarehouseName,
WarehouseType,
WarehouseIsDefault,
WarehouseS_RegionalID,
WarehouseM_BranchID,
S_RegionalID,
S_RegionalName
FROM warehouse
JOIN s_regional ON WarehouseS_RegionalID = S_RegionalID AND S_RegionalIsActive = 'Y'
LEFT JOIN m_branch ON WarehouseM_BranchID = M_BranchID AND M_BranchIsActive = 'Y'
where WarehouseS_RegionalID = ?
AND WarehouseIsActive = 'Y'
AND WarehouseIsTransit = 'N'
$sqlWhere
ORDER BY WarehouseName ASC ";
$qry = $this->db->query($sql, [$regionalId]);
if (!$qry) {
$this->db->trans_rollback();
$this->sys_error_db("select warehouse", $this->db);;
exit;
}
$rows = $qry->result_array();
$result = array(
"records" => $rows,
"sql" => $this->db->last_query()
);
$this->sys_ok($rows);
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
function getItem()
{
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$prm = $this->sys_input;
$user = $this->sys_user;
$userId = $user["M_UserID"];
$POID = $prm["POID"];
$regionalId = $user["S_RegionalID"];
$branchID = $user["M_BranchID"];
$userLogin = $user["M_UserLocationFlag"];
$sqlTambahan = "";
$sql = "SELECT
CONCAT(PoItemReceiveID,',','-') as keyID,
PoItemReceiveID,
PurchaseOrderNumber,
PurchaseOrderShippingCost,
PurchaseOrderShippingCostStatus,
PoItemReceivePurchaseOrderID,
PoItemReceivePurchaseOrderSummaryID,
PoItemReceivePurchaseOrderDetailID,
WarehouseID,
WarehouseCode,
CASE
WHEN WarehouseType = 'B' THEN CONCAT(WarehouseCode,' ', WarehouseName, ' - ', M_BranchName)
WHEN WarehouseType = 'R' THEN CONCAT(WarehouseCode,' ', WarehouseName, ' - ', S_RegionalName)
ELSE ''
END WarehouseName,
M_ItemID,
M_ItemCode,
M_ItemDesc,
ItemUnitID,
ItemUnitName,
PoItemReceiveQty as originalQty,
PoItemReceiveQtyReceived as receivedQty,
0 as qty,
PoItemReceiveQty - PoItemReceiveQtyReceived AS qtyRest,
PoItemReceivePrice,
'N' as alreadySave,
'' as batchNo,
'' as itemEd
FROM po_item_receive
JOIN purchase_order
ON PoItemReceivePurchaseOrderID = PurchaseOrderID
AND PurchaseOrderIsActive = 'Y'
AND PoItemReceiveIsActive = 'Y'
AND PurchaseOrderID = ?
AND (PoItemReceiveQty - PoItemReceiveQtyReceived) > 0
JOIN warehouse
ON PoItemReceiveWarehouseID = WarehouseID
JOIN m_item
ON PoItemReceiveItemID = M_ItemID
JOIN itemunit
ON PoItemReceiveItemUnitID= ItemUnitID
JOIN s_regional
ON WarehouseS_RegionalID = S_RegionalID
LEFT JOIN m_branch
ON WarehouseM_BranchID = M_BranchID";
$qry = $this->db->query($sql, [$POID]);
if (!$qry) {
$this->db->trans_rollback();
$this->sys_error_db("select item ", $this->db);;
exit;
}
$dataItem = $qry->result_array();
$this->sys_ok($dataItem);
}
function getItemUpdate()
{
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$prm = $this->sys_input;
$user = $this->sys_user;
$id = $prm["id"];
$sql = "SELECT
ReceiveOrderPoDetailID,
CONCAT(ReceiveOrderPoDetailPoItemReceiveID,',',ReceiveOrderPoDetailID) as keyID,
ReceiveOrderPoDetailPoItemReceiveID PoItemReceiveID,
PurchaseOrderNumber,
PurchaseOrderShippingCost,
PurchaseOrderShippingCostStatus,
ReceiveOrderPoDetailPurchaseOrderID PoItemReceivePurchaseOrderID,
ReceiveOrderPoDetailPurchaseOrderSummaryID PoItemReceivePurchaseOrderSummaryID,
ReceiveOrderPoDetailPurchaseOrderDetailID PoItemReceivePurchaseOrderDetailID,
WarehouseID,
WarehouseCode,
CASE
WHEN WarehouseType = 'B' THEN CONCAT(WarehouseCode,' ', WarehouseName, ' - ', M_BranchName)
WHEN WarehouseType = 'R' THEN CONCAT(WarehouseCode,' ', WarehouseName, ' - ', S_RegionalName)
ELSE ''
END WarehouseName,
M_ItemID,
M_ItemCode,
M_ItemDesc,
ItemUnitID,
ItemUnitName,
PoItemReceiveQty as originalQty,
PoItemReceiveQtyReceived as receivedQty,
0 as qty,
ReceiveOrderPoDetailQty as tmpQty,
PoItemReceiveQty - PoItemReceiveQtyReceived AS qtyRest,
ReceiveOrderPoDetailQty,
PoItemReceivePrice,
'Y' as alreadySave,
ReceiveOrderPoDetailBatchNo batchNo,
ReceiveOrderPoDetailEd itemEd
FROM receive_order_po_detail
JOIN receive_order_po
ON ReceiveOrderPoDetailReceiveOrderPoID = ReceiveOrderPoID
JOIN purchase_order
ON ReceiveOrderPoDetailPurchaseOrderID = PurchaseOrderID
JOIN po_item_receive
ON ReceiveOrderPoDetailPoItemReceiveID = PoItemReceiveID
JOIN warehouse
ON ReceiveOrderPoWarehouseID = WarehouseID
JOIN m_item
ON ReceiveOrderPoItemID = M_ItemID
JOIN itemunit
ON ReceiveOrderPoItemUnitID = ItemUnitID
JOIN s_regional
ON WarehouseS_RegionalID = S_RegionalID
LEFT JOIN m_branch
ON WarehouseM_BranchID = M_BranchID
WHERE ReceiveOrderPoDetailReceiveOrderPoID = ?
AND ReceiveOrderPoDetailIsActive = 'Y'";
$qry = $this->db->query($sql, [$id]);
if (!$qry) {
$this->db->trans_rollback();
$this->sys_error_db("select item ", $this->db);;
exit;
}
$dataItem = $qry->result_array();
$this->sys_ok($dataItem);
}
function getItemold()
{
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$prm = $this->sys_input;
$userId = $this->sys_user["M_UserID"];
$POID = $prm["POID"];
$regionalId = $prm["regionalId"];
// echo $prm;
$sql = "SELECT * FROM purchase_order WHERE PurchaseOrderID = ?";
$qry = $this->db->query($sql, [$POID]);
if (!$qry) {
$this->db->trans_rollback();
$this->sys_error_db("select PO", $this->db);;
exit;
}
$dataPO = $qry->row_array();
// single berdasarkan summary
// multiple berdasarkan detail
$sql = "SELECT
PurchaseOrderWarehouseType,
PurchaseOrderWarehouseID,
PurchaseOrderDetailWarehouseID,
WarehouseID as warehouseID,
CASE
WHEN WarehouseType = 'B' THEN CONCAT(WarehouseCode,' ', WarehouseName, ' - ', M_BranchName)
WHEN WarehouseType = 'R' THEN CONCAT(WarehouseCode,' ', WarehouseName, ' - ', S_RegionalName)
ELSE ''
END warehouseName,
CASE
WHEN PurchaseOrderWarehouseType = 'Single' THEN PurchaseOrderSummaryQty - PurchaseOrderSummaryQtyReceived
WHEN PurchaseOrderWarehouseType = 'Multiple' THEN (ConvertQuantityToPurchasedItemUnit(PurchaseOrderDetailItemID, PurchaseOrderDetailItemUnitID,
PurchaseOrderDetailQty)) - (ConvertQuantityToPurchasedItemUnit(PurchaseOrderDetailItemID, PurchaseOrderDetailItemUnitID,
PurchaseOrderDetailQtyReceived))
END as qtyRest, -- qty sisa barang yang sudah di terima
CASE
WHEN PurchaseOrderWarehouseType = 'Single' THEN PurchaseOrderSummaryQty
WHEN PurchaseOrderWarehouseType = 'Multiple' THEN ConvertQuantityToPurchasedItemUnit(PurchaseOrderDetailItemID, PurchaseOrderDetailItemUnitID,
PurchaseOrderDetailQty)
END as qty, -- qty asli
CASE
WHEN PurchaseOrderWarehouseType = 'Single' THEN PurchaseOrderSummaryQty
WHEN PurchaseOrderWarehouseType = 'Multiple' THEN PurchaseOrderDetailQty
END as qtyNotConvert,
CASE
WHEN PurchaseOrderWarehouseType = 'Single' THEN PurchaseOrderSummaryQtyReceived
WHEN PurchaseOrderWarehouseType = 'Multiple' THEN (ConvertQuantityToPurchasedItemUnit(PurchaseOrderDetailItemID, PurchaseOrderDetailItemUnitID,
PurchaseOrderDetailQtyReceived))
END as qtyReceived,
CASE
WHEN PurchaseOrderWarehouseType = 'Single' THEN PurchaseOrderSummaryQtyReceived
WHEN PurchaseOrderWarehouseType = 'Multiple' THEN PurchaseOrderDetailQtyReceived
END as qtyReceivedNotConvert,
PurchaseOrderID,
PurchaseOrderDate,
PurchaseOrderNumber,
PurchaseOrderSupplierID,
SupplierName,
PurchaseOrderStatus,
PurchaseOrderSummaryID,
PurchaseOrderSummaryQty,
PurchaseOrderSummaryQtyReceived,
ism.M_ItemID as summaryItemID,
ism.M_ItemCode as summaryItemCode,
ism.M_ItemDesc as summaryItemDesc,
iusm.ItemUnitID as summaryItemUnitID,
iusm.ItemUnitName as summaryItemUnitName,
PurchaseOrderDetailID,
PurchaseOrderDetailQty,
PurchaseOrderDetailQtyReceived,
idt.M_ItemID as detailItemID,
idt.M_ItemCode as detailItemCode,
idt.M_ItemDesc as detailItemDesc,
iudt.ItemUnitID as detailItemUnitID,
iudt.ItemUnitName as detailItemUnitName
FROM purchase_order
JOIN purchase_order_summary
ON PurchaseOrderID = PurchaseOrderSummaryPurchaseOrderID
AND PurchaseOrderSummaryIsActive = 'Y'
AND PurchaseOrderSummaryPurchaseOrderID = ?
JOIN purchase_order_detail
ON PurchaseOrderID = PurchaseOrderDetailPurchaseOrderID
AND PurchaseOrderSummaryID = PurchaseOrderDetailPurchaseSummaryID
AND PurchaseOrderDetailIsActive = 'Y'
JOIN supplier
ON PurchaseOrderSupplierID = SupplierID
JOIN m_item ism
ON PurchaseOrderSummaryItemID = ism.M_ItemID
JOIN itemunit iusm
ON PurchaseOrderSummaryItemUnitID = iusm.ItemUnitID
JOIN m_item idt
ON PurchaseOrderDetailItemID = idt.M_ItemID
JOIN itemunit iudt
ON PurchaseOrderDetailItemUnitID = iudt.ItemUnitID
JOIN warehouse
ON (
CASE
WHEN PurchaseOrderWarehouseType = 'Single' THEN PurchaseOrderWarehouseID = WarehouseID
WHEN PurchaseOrderWarehouseType = 'Multiple' THEN PurchaseOrderDetailWarehouseID = WarehouseID
END
)
JOIN s_regional
ON WarehouseS_RegionalID = S_RegionalID
LEFT JOIN m_branch
ON WarehouseM_BranchID = M_BranchID
WHERE
CASE
WHEN PurchaseOrderWarehouseType = 'Single' THEN (PurchaseOrderSummaryQty - PurchaseOrderSummaryQtyReceived) > 0
WHEN PurchaseOrderWarehouseType = 'Multiple' THEN ((ConvertQuantityToPurchasedItemUnit(PurchaseOrderDetailItemID, PurchaseOrderDetailItemUnitID,
PurchaseOrderDetailQty)) - (ConvertQuantityToPurchasedItemUnit(PurchaseOrderDetailItemID, PurchaseOrderDetailItemUnitID,
PurchaseOrderDetailQtyReceived))) > 0
END ";
$qry = $this->db->query($sql, [$POID]);
if (!$qry) {
$this->db->trans_rollback();
$this->sys_error_db("select item ", $this->db);;
exit;
}
$dataItem = $qry->result_array();
$newItem = [];
if ($dataPO['PurchaseOrderWarehouseType'] == 'Single') {
foreach ($dataItem as $key => $item) {
$search_id = $item['PurchaseOrderSummaryID'];
$ids = array_column($newItem, 'PurchaseOrderSummaryID');
$index = array_search($search_id, $ids);
if (in_array($search_id, $ids) && $index !== false) {
$newItem[$index]['detail'][] = $item;
} else {
$item['itemID'] = $item['summaryItemID'];
$item['itemCode'] = $item['summaryItemCode'];
$item['itemDesc'] = $item['summaryItemDesc'];
$item['itemUnitID'] = $item['summaryItemUnitID'];
$item['itemUnitName'] = $item['summaryItemUnitName'];
$item['detail'] = [$item];
$newItem[] = $item;
}
}
}
if ($dataPO['PurchaseOrderWarehouseType'] == 'Multiple') {
foreach ($dataItem as $key => $item) {
$item['itemID'] = $item['summaryItemID'];
$item['itemCode'] = $item['summaryItemCode'];
$item['itemDesc'] = $item['summaryItemDesc'];
$item['itemUnitID'] = $item['summaryItemUnitID'];
$item['itemUnitName'] = $item['summaryItemUnitName'];
$item['detail'] = [];
$newItem[] = $item;
}
}
$this->sys_ok($newItem);
}
public function saveRo()
{
// $this->db->trans_commit();
// $this->db->trans_rollback();
$this->db->trans_begin();
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$prm = $this->sys_input;
$user = $this->sys_user;
$userId = $this->sys_user["M_UserID"];
$sql = "SELECT `fn_numbering`('RO') AS RO";
$qry = $this->db->query($sql, []);
if (!$qry) {
$this->sys_error_db("purchase order insert error", $this->db);
$this->db->trans_rollback();
exit;
}
$numbering = $qry->row_array()["RO"];
$sql = "INSERT INTO `receive_order_po` (
`ReceiveOrderPoNumber`,
`ReceiveOrderPoSupplierID`,
`ReceiveOrderPoIDate`,
`ReceiveOrderPoWarehouseID`,
`ReceiveOrderPoM_BranchCode`,
`ReceiveOrderPoS_RegionalID`,
`ReceiveOrderShippingCostAmount`,
`ReceiveOrderPoNote`,
`ReceiveOrderPoRefNumber`,
`ReceiveOrderPoCreatedUserID`
) VALUES (
?,
?,
?,
?,
?,
?,
?,
?,
?,
?
);";
$qry = $this->db->query($sql, [
$numbering,
$prm['selectedSupplier']['SupplierID'],
$prm['date'],
$prm['selectedWarehouse']['WarehouseID'],
$user['M_BranchCode'],
$user['S_RegionalID'],
$prm['shippingCost'],
$prm['note'],
$prm['refNumber'],
$userId
]);
if (!$qry) {
$this->sys_error_db("Error insert receive oder", $this->db);
$this->db->trans_rollback();
exit;
}
$roID = $this->db->insert_id();
$descDetail = [];
foreach ($prm['detail'] as $key => $item) {
$sql = "SELECT * FROM po_item_receive WHERE PoItemReceiveID = ?";
$qry = $this->db->query($sql, [
$item['PoItemReceiveID'],
]);
if (!$qry) {
$this->sys_error_db("Error cek data", $this->db);
$this->db->trans_rollback();
exit;
}
$cek = $qry->row_array();
if ($cek['PoItemReceiveIsActive'] == 'N') {
$this->sys_error("Item {$item['M_ItemDesc']} sudah terhapus");
$this->db->trans_rollback();
exit;
}
if ($cek['PoItemReceiveQty'] == $cek['PoItemReceiveQtyReceived']) {
$this->sys_error("Item {$item['M_ItemDesc']} sudah diterima semuanya");
$this->db->trans_rollback();
exit;
}
if (intval($item['qty']) > intval($cek['PoItemReceiveQty'])) {
$this->sys_error("Jumlah item {$item['M_ItemDesc']} yang tersedia sudah berubah silahkan ulangi pilih item");
$this->db->trans_rollback();
exit;
}
$sql = "INSERT INTO `receive_order_po_detail` (
`ReceiveOrderPoDetailReceiveOrderPoID`,
`ReceiveOrderPoDetailPurchaseOrderID`,
`ReceiveOrderPoDetailPurchaseOrderSummaryID`,
`ReceiveOrderPoDetailPurchaseOrderDetailID`,
`ReceiveOrderPoDetailPoItemReceiveID`,
`ReceiveOrderPoDetailQty`,
`ReceiveOrderPoDetailPrice`,
`ReceiveOrderPoDetailTotal`,
`ReceiveOrderPoDetailCreatedUserID`,
`ReceiveOrderPoItemID`,
`ReceiveOrderPoItemUnitID`,
ReceiveOrderPoDetailBatchNo,
ReceiveOrderPoDetailEd
) VALUES (
?,
?,
?,
?,
?,
?,
?,
?,
?,
?,
?,
?,
?
);";
$qry = $this->db->query($sql, [
$roID,
$item['PoItemReceivePurchaseOrderID'],
$item['PoItemReceivePurchaseOrderSummaryID'],
$item['PoItemReceivePurchaseOrderDetailID'] ?? 0,
$item['PoItemReceiveID'],
$item['qty'],
$item['PoItemReceivePrice'],
(doubleval($item['PoItemReceivePrice']) * intval($item['qty'])),
$userId,
$item['M_ItemID'],
$item['ItemUnitID'],
$item['batchNo'],
$item['itemEd'],
]);
if (!$qry) {
$this->sys_error_db("Error receive order detail", $this->db);
$this->db->trans_rollback();
exit;
}
$roDetailID = $this->db->insert_id();
$descDetail[] = "- ADD {$item['M_ItemDesc']} {$item['qty']} {$item['ItemUnitName']} nomor batch {$item['WarehouseName']}";
$jsonBefore = $this->getDataPoItemReceive($item['PoItemReceiveID']);
$sql = "UPDATE `po_item_receive`
SET
`PoItemReceiveQtyReceived` = ?,
`PoItemReceiveUpdatedUserID` = ?
WHERE `PoItemReceiveID` = ?;";
$qry = $this->db->query($sql, [
(intval($cek['PoItemReceiveQtyReceived']) + intval($item['qty'])),
$userId,
$item['PoItemReceiveID'],
]);
if (!$qry) {
$this->sys_error_db("Error update item receive", $this->db);
$this->db->trans_rollback();
exit;
}
$jsonAfter = $this->getDataPoItemReceive($item['PoItemReceiveID']);
$descItem = "Diterima {$item['M_ItemDesc']} sejumlah {$item['qty']} {$item['ItemUnitName']} di RO nomor {$numbering} *RO belum di konfirmasi";
$this->insertLogPoItemReceive(
$item['PoItemReceiveID'],
'UPDATE',
$roID,
$jsonBefore,
$jsonAfter,
$userId,
$descItem
);
}
$jsonROAfter = $this->getDataReceiveOrderPO($roID);
$this->insertLogReceiveOrderPo(
$roID,
'ADD',
'',
$jsonROAfter,
$userId,
implode("\n", $descDetail)
);
$this->insertUserActivty($roID, 'ADD', $userId, implode("\n", $descDetail));
$this->db->trans_commit();
$this->sys_ok("Berhasil terima barang {$numbering}");
}
public function updateRoHeader()
{
// $this->db->trans_commit();
// $this->db->trans_rollback();
$this->db->trans_begin();
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$prm = $this->sys_input;
$user = $this->sys_user;
$userId = $this->sys_user["M_UserID"];
$ro = $prm['ro'];
$roID = $ro['ReceiveOrderPoID'];
$jsonROBefore = $this->getDataReceiveOrderPO($roID);
$sql = "UPDATE `receive_order_po` SET
`ReceiveOrderPoIDate` = ?,
`ReceiveOrderShippingCostAmount` = ?,
`ReceiveOrderPoNote` = ?,
`ReceiveOrderPoRefNumber` = ?,
`ReceiveOrderPoLastUpdatedUserID` = ?
WHERE ReceiveOrderPoID = ?;";
$qry = $this->db->query($sql, [
$prm['date'],
$prm['shippingCost'],
$prm['note'],
$prm['refNumber'],
$userId,
$roID
]);
if (!$qry) {
$this->sys_error_db("Error update receive oder", $this->db);
$this->db->trans_rollback();
exit;
}
$jsonROAfter = $this->getDataReceiveOrderPO($roID);
$desc = "Update data Ro {$ro['ReceiveOrderPoNumber']}";
$descDetail = [];
if ($jsonROBefore['ReceiveOrderPoIDate'] != $jsonROAfter['ReceiveOrderPoIDate']) {
$descDetail[] = "- Perubahan tanggal dari {$jsonROBefore['ReceiveOrderPoIDate']} menjadi {$jsonROAfter['ReceiveOrderPoIDate']}";
}
if ($jsonROBefore['ReceiveOrderPoNote'] != $jsonROAfter['ReceiveOrderPoNote']) {
$descDetail[] = "- Perubahan catatan dari '{$jsonROBefore['ReceiveOrderPoNote']}' menjadi '{$jsonROAfter['ReceiveOrderPoNote']}'";
}
if ($jsonROBefore['ReceiveOrderPoRefNumber'] != $jsonROAfter['ReceiveOrderPoRefNumber']) {
$descDetail[] = "- Perubahan nomor referensi dari '{$jsonROBefore['ReceiveOrderPoRefNumber']}' menjadi '{$jsonROAfter['ReceiveOrderPoRefNumber']}'";
}
if ($jsonROBefore['ReceiveOrderShippingCostAmount'] != $jsonROAfter['ReceiveOrderShippingCostAmount']) {
$bfr = $this->formatRupiah($jsonROBefore['ReceiveOrderShippingCostAmount']);
$aftr = $this->formatRupiah($jsonROAfter['ReceiveOrderShippingCostAmount']);
$descDetail[] = "- Perubahan biaya ekspedisi dari {$bfr} menjadi {$aftr}";
}
if (count($descDetail) == 0) {
$descDetail[] = '* user menyimpan data namun tidak ada perubahan';
}
$this->insertLogReceiveOrderPo(
$roID,
'UPDATE HEADER',
$jsonROBefore,
$jsonROAfter,
$userId,
$desc . "\n" . implode("\n", $descDetail)
);
$this->insertUserActivty($roID, 'UPDATE HEADER', $userId, $desc . "\n" . implode("\n", $descDetail));
$this->db->trans_commit();
$this->sys_ok("Berhasil update header {$ro['ReceiveOrderPoNumber']}");
}
function addItem()
{
// $this->db->trans_commit();
// $this->db->trans_rollback();
$this->db->trans_begin();
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$prm = $this->sys_input;
$user = $this->sys_user;
$userId = $this->sys_user["M_UserID"];
$detail = $prm['detail'];
$ro = $prm['ro'];
$roID = $ro['ReceiveOrderPoID'];
$sql = "SELECT * FROM receive_order_po WHERE ReceiveOrderPoID = ?";
$qry = $this->db->query($sql, [
$ro['ReceiveOrderPoID'],
]);
if (!$qry) {
$this->sys_error_db("Error cek order receive", $this->db);
$this->db->trans_rollback();
exit;
}
$cek = $qry->row_array();
if ($cek['ReceiveOrderPoConfirmed'] == 'Y') {
$this->sys_error("Penerimaan barang sudah dikonfirmasi");
$this->db->trans_rollback();
exit;
}
$jsonROBefore = $this->getDataReceiveOrderPO($roID);
$descDetail = [];
foreach ($detail as $key => $item) {
//insert
$sql = "SELECT * FROM po_item_receive WHERE PoItemReceiveID = ?";
$qry = $this->db->query($sql, [
$item['PoItemReceiveID'],
]);
if (!$qry) {
$this->sys_error_db("Error cek data", $this->db);
$this->db->trans_rollback();
exit;
}
$cekDetail = $qry->row_array();
if ($cekDetail['PoItemReceiveIsActive'] == 'N') {
$this->sys_error("Item {$item['M_ItemDesc']} sudah terhapus");
$this->db->trans_rollback();
exit;
}
if ($cekDetail['PoItemReceiveQty'] == $cekDetail['PoItemReceiveQtyReceived']) {
$this->sys_error("Item {$item['M_ItemDesc']} sudah diterima semuanya");
$this->db->trans_rollback();
exit;
}
if (intval($item['qty']) > intval($cekDetail['PoItemReceiveQty'])) {
$this->sys_error("Jumlah item {$item['M_ItemDesc']} yang tersedia sudah berubah silahkan ulangi pilih item");
$this->db->trans_rollback();
exit;
}
$sql = "INSERT INTO `receive_order_po_detail` (
`ReceiveOrderPoDetailReceiveOrderPoID`,
`ReceiveOrderPoDetailPurchaseOrderID`,
`ReceiveOrderPoDetailPurchaseOrderSummaryID`,
`ReceiveOrderPoDetailPurchaseOrderDetailID`,
`ReceiveOrderPoDetailPoItemReceiveID`,
`ReceiveOrderPoDetailQty`,
`ReceiveOrderPoDetailPrice`,
`ReceiveOrderPoDetailTotal`,
`ReceiveOrderPoDetailCreatedUserID`,
`ReceiveOrderPoItemID`,
`ReceiveOrderPoItemUnitID`
) VALUES (
?,
?,
?,
?,
?,
?,
?,
?,
?,
?,
?
);";
$qry = $this->db->query($sql, [
$roID,
$item['PoItemReceivePurchaseOrderID'],
$item['PoItemReceivePurchaseOrderSummaryID'],
$item['PoItemReceivePurchaseOrderDetailID'] ?? 0,
$item['PoItemReceiveID'],
$item['qty'],
$item['PoItemReceivePrice'],
(doubleval($item['PoItemReceivePrice']) * intval($item['qty'])),
$userId,
$item['M_ItemID'],
$item['ItemUnitID'],
]);
if (!$qry) {
$this->sys_error_db("Error receive order detail", $this->db);
$this->db->trans_rollback();
exit;
}
$descDetail[] = "- ADD {$item['M_ItemDesc']} {$item['qty']} {$item['ItemUnitName']} {$item['WarehouseName']}";
$jsonBefore = $this->getDataPoItemReceive($item['PoItemReceiveID']);
$sql = "UPDATE `po_item_receive`
SET
`PoItemReceiveQtyReceived` = ?,
`PoItemReceiveUpdatedUserID` = ?
WHERE `PoItemReceiveID` = ?;";
$qry = $this->db->query($sql, [
(intval($cekDetail['PoItemReceiveQtyReceived']) + intval($item['qty'])),
$userId,
$item['PoItemReceiveID'],
]);
if (!$qry) {
$this->sys_error_db("Error update item receive", $this->db);
$this->db->trans_rollback();
exit;
}
$jsonAfter = $this->getDataPoItemReceive($item['PoItemReceiveID']);
$descItem = "Diterima {$item['M_ItemDesc']} sejumlah {$item['qty']} {$item['ItemUnitName']} di RO nomor {$jsonROBefore['ReceiveOrderPoNumber']} *RO belum di konfirmasi";
$this->insertLogPoItemReceive(
$item['PoItemReceiveID'],
'UPDATE',
$roID,
$jsonBefore,
$jsonAfter,
$userId,
$descItem
);
}
$jsonROAfter = $this->getDataReceiveOrderPO($roID);
$this->insertLogReceiveOrderPo(
$roID,
'UPDATE',
$jsonROBefore,
$jsonROAfter,
$userId,
implode("\n", $descDetail)
);
$this->insertUserActivty($roID, 'UPDATE', $userId, implode("\n", $descDetail));
$this->db->trans_commit();
$this->sys_ok("Berhasil update item");
}
function formatRupiah($angka)
{
// Ganti koma ke titik agar jadi desimal yang valid
$angka = str_replace(',', '.', $angka);
// Validasi input
if (!is_numeric($angka)) {
return 'Input tidak valid';
}
// Konversi ke float
$angka = (float)$angka;
// Bulatkan ke 3 angka desimal
$angka = round($angka, 3);
// Cek apakah angka desimalnya nol
if (fmod($angka, 1) == 0.0) {
// Tanpa desimal
$formatted = number_format($angka, 0, ',', '.');
} else {
// Dengan 3 angka desimal
$formatted = number_format($angka, 3, ',', '.');
}
return 'Rp ' . $formatted;
}
function addItemOld()
{
// $this->db->trans_commit();
// $this->db->trans_rollback();
$this->db->trans_begin();
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$prm = $this->sys_input;
$user = $this->sys_user;
$userId = $this->sys_user["M_UserID"];
$detail = $prm['detail'];
$ro = $prm['ro'];
$roID = $ro['ReceiveOrderPoID'];
$sql = "SELECT * FROM receive_order_po WHERE ReceiveOrderPoID = ?";
$qry = $this->db->query($sql, [
$ro['ReceiveOrderPoID'],
]);
if (!$qry) {
$this->sys_error_db("Error cek order receive", $this->db);
$this->db->trans_rollback();
exit;
}
$cek = $qry->row_array();
if ($cek['ReceiveOrderPoConfirmed'] == 'Y') {
$this->sys_error("Penerimaan barang sudah dikonfirmasi");
$this->db->trans_rollback();
exit;
}
$sql = "SELECT * FROM receive_order_po_detail WHERE ReceiveOrderPoDetailReceiveOrderPoID = ? AND PoItemReceiveIsActive = 'Y'";
$qry = $this->db->query($sql, [
$roID,
]);
if (!$qry) {
$this->sys_error_db("Error cek order receive", $this->db);
$this->db->trans_rollback();
exit;
}
$oldDetail = $qry->result_array();
$updatedID = [];
foreach ($detail as $key => $item) {
$sql = "SELECT * FROM receive_order_po_detail WHERE ReceiveOrderPoDetailPoItemReceiveID = ? AND PoItemReceiveIsActive = 'Y'";
$qry = $this->db->query($sql, [
$item['PoItemReceiveID'],
]);
if (!$qry) {
$this->sys_error_db("Error cek order receive", $this->db);
$this->db->trans_rollback();
exit;
}
$cekItem = $qry->row_array();
if (empty($cekItem)) {
//insert
$sql = "SELECT * FROM po_item_receive WHERE PoItemReceiveID = ?";
$qry = $this->db->query($sql, [
$item['PoItemReceiveID'],
]);
if (!$qry) {
$this->sys_error_db("Error cek data", $this->db);
$this->db->trans_rollback();
exit;
}
$cekDetail = $qry->row_array();
if ($cekDetail['PoItemReceiveIsActive'] == 'N') {
$this->sys_error("Item {$item['M_ItemDesc']} sudah terhapus");
$this->db->trans_rollback();
exit;
}
if ($cekDetail['PoItemReceiveQty'] == $cekDetail['PoItemReceiveQtyReceived']) {
$this->sys_error("Item {$item['M_ItemDesc']} sudah diterima semuanya");
$this->db->trans_rollback();
exit;
}
if (intval($item['qty']) > intval($cekDetail['PoItemReceiveQty'])) {
$this->sys_error("Jumlah item {$item['M_ItemDesc']} yang tersedia sudah berubah silahkan ulangi pilih item");
$this->db->trans_rollback();
exit;
}
$sql = "INSERT INTO `receive_order_po_detail` (
`ReceiveOrderPoDetailReceiveOrderPoID`,
`ReceiveOrderPoDetailPurchaseOrderID`,
`ReceiveOrderPoDetailPurchaseOrderSummaryID`,
`ReceiveOrderPoDetailPurchaseOrderDetailID`,
`ReceiveOrderPoDetailPoItemReceiveID`,
`ReceiveOrderPoDetailQty`,
`ReceiveOrderPoDetailPrice`,
`ReceiveOrderPoDetailTotal`,
`ReceiveOrderPoDetailCreatedUserID`,
`ReceiveOrderPoItemID`,
`ReceiveOrderPoItemUnitID`
) VALUES (
?,
?,
?,
?,
?,
?,
?,
?,
?,
?,
?
);";
$qry = $this->db->query($sql, [
$roID,
$item['PoItemReceivePurchaseOrderID'],
$item['PoItemReceivePurchaseOrderSummaryID'],
$item['PoItemReceivePurchaseOrderDetailID'] ?? 0,
$item['PoItemReceiveID'],
$item['qty'],
$item['PoItemReceivePrice'],
(doubleval($item['PoItemReceivePrice']) * intval($item['qty'])),
$userId,
$item['M_ItemID'],
$item['ItemUnitID'],
]);
if (!$qry) {
$this->sys_error_db("Error receive order detail", $this->db);
$this->db->trans_rollback();
exit;
}
$sql = "UPDATE `po_item_receive`
SET
`PoItemReceiveQtyReceived` = ?,
`PoItemReceiveUpdatedUserID` = ?
WHERE `PoItemReceiveID` = ?;";
$qry = $this->db->query($sql, [
(intval($cekDetail['PoItemReceiveQtyReceived']) + intval($item['qty'])),
$userId,
$item['PoItemReceiveID'],
]);
if (!$qry) {
$this->sys_error_db("Error update item receive", $this->db);
$this->db->trans_rollback();
exit;
}
} else {
$updatedID[] = $cekItem['ReceiveOrderPoDetailID'];
$sql = "SELECT * FROM po_item_receive WHERE PoItemReceiveID = ?";
$qry = $this->db->query($sql, [
$item['PoItemReceiveID'],
]);
if (!$qry) {
$this->sys_error_db("Error cek data", $this->db);
$this->db->trans_rollback();
exit;
}
$cekDetail = $qry->row_array();
// if ($cekDetail['PoItemReceiveIsActive'] == 'N') {
// $this->sys_error("Item {$item['M_ItemDesc']} sudah terhapus");
// $this->db->trans_rollback();
// exit;
// }
$newReceivedQty = intval($cekDetail['PoItemReceiveQtyReceived']) - intval($cekItem['ReceiveOrderPoDetailQty']);
$newQtyRest = intval($cekDetail['PoItemReceiveQty']) - $newReceivedQty;
// if ($cekDetail['PoItemReceiveQty'] == $cekDetail['PoItemReceiveQtyReceived']) {
// $this->sys_error("Item {$item['M_ItemDesc']} sudah diterima semuanya");
// $this->db->trans_rollback();
// exit;
// }
if (intval($item['qty']) > $newQtyRest) {
$this->sys_error("Jumlah item {$item['M_ItemDesc']} yang tersedia tidak memenuhi banyak penerimaan item");
$this->db->trans_rollback();
exit;
}
$sql = "UPDATE receive_order_po_detail
SET
ReceiveOrderPoDetailQty = ?,
ReceiveOrderPoDetailTotal = ReceiveOrderPoDetailPrice * {$item['qty']}
ReceiveOrderPoDetailLastUpdatedUserID = ?,
ReceiveOrderPoDetailLastUpdated = NOW()
WHERE ReceiveOrderPoDetailID = ?;
";
$qry = $this->db->query($sql, [
$item['qty'],
$userId,
$cekItem['ReceiveOrderPoDetailID']
]);
if (!$qry) {
$this->sys_error_db("Error update item", $this->db);
$this->db->trans_rollback();
exit;
}
$sql = "UPDATE `po_item_receive`
SET
`PoItemReceiveQtyReceived` = ?,
`PoItemReceiveUpdatedUserID` = ?
WHERE `PoItemReceiveID` = ?;";
$qry = $this->db->query($sql, [
(intval($newReceivedQty) + intval($item['qty'])),
$userId,
$item['PoItemReceiveID'],
]);
if (!$qry) {
$this->sys_error_db("Error update item receive", $this->db);
$this->db->trans_rollback();
exit;
}
}
}
$this->db->trans_commit();
$this->sys_ok("Berhasil update item");
}
public function updateItem()
{
// $this->db->trans_commit();
// $this->db->trans_rollback();
$this->db->trans_begin();
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$prm = $this->sys_input;
$user = $this->sys_user;
$userId = $this->sys_user["M_UserID"];
$detail = $prm['detail'];
$ro = $prm['ro'];
$roID = $ro['ReceiveOrderPoID'];
$detail = $prm['detail'];
$detailID = $detail['ReceiveOrderPoDetailID'];
$jsonROBefore = $this->getDataReceiveOrderPO($roID);
$sql = "SELECT * FROM receive_order_po_detail WHERE ReceiveOrderPoDetailID = ? ";
$qry = $this->db->query($sql, [
$detail['ReceiveOrderPoDetailID'],
]);
if (!$qry) {
$this->sys_error_db("Error cek order receive", $this->db);
$this->db->trans_rollback();
exit;
}
$cekItem = $qry->row_array();
$sql = "SELECT * FROM po_item_receive WHERE PoItemReceiveID = ?";
$qry = $this->db->query($sql, [
$detail['PoItemReceiveID'],
]);
if (!$qry) {
$this->sys_error_db("Error cek data", $this->db);
$this->db->trans_rollback();
exit;
}
$cekDetail = $qry->row_array();
// if ($cekDetail['PoItemReceiveIsActive'] == 'N') {
// $this->sys_error("Item {$item['M_ItemDesc']} sudah terhapus");
// $this->db->trans_rollback();
// exit;
// }
$newReceivedQty = intval($cekDetail['PoItemReceiveQtyReceived']) - intval($cekItem['ReceiveOrderPoDetailQty']);
$newQtyRest = intval($cekDetail['PoItemReceiveQty']) - $newReceivedQty;
// if ($cekDetail['PoItemReceiveQty'] == $cekDetail['PoItemReceiveQtyReceived']) {
// $this->sys_error("Item {$item['M_ItemDesc']} sudah diterima semuanya");
// $this->db->trans_rollback();
// exit;
// }
if (intval($detail['qty']) <= 0) {
$this->sys_error("Jumlah qty {$detail['M_ItemDesc']} tidak sesuai");
$this->db->trans_rollback();
exit;
}
if (intval($detail['qty']) > $newQtyRest) {
$this->sys_error("Jumlah item {$detail['M_ItemDesc']} yang tersedia tidak memenuhi banyak penerimaan item");
$this->db->trans_rollback();
exit;
}
$jsonBefore = $this->getDataPoItemReceive($detail['PoItemReceiveID']);
$sql = "UPDATE receive_order_po_detail
SET
ReceiveOrderPoDetailQty = ?,
ReceiveOrderPoDetailTotal = ReceiveOrderPoDetailPrice * {$detail['qty']},
ReceiveOrderPoDetailLastUpdatedUserID = ?,
ReceiveOrderPoDetailLastUpdated = NOW() ,
ReceiveOrderPoDetailBatchNo = ?,
ReceiveOrderPoDetailEd = ?
WHERE ReceiveOrderPoDetailID = ?;
";
$qry = $this->db->query($sql, [
$detail['qty'],
$userId,
$detail['batchNo'],
$detail['itemEd'],
$cekItem['ReceiveOrderPoDetailID']
]);
if (!$qry) {
$this->sys_error_db("Error update item", $this->db);
$this->db->trans_rollback();
exit;
}
$descDetail = 'UPDATE item detail';
if (intval($detail['qty']) != intval($cekItem['ReceiveOrderPoDetailQty'])) {
$descDetail = $descDetail . "\n" . " UPDATE ITEM qty {$detail['M_ItemDesc']} dari {$cekItem['ReceiveOrderPoDetailQty']} {$detail['ItemUnitName']} menjadi {$detail['qty']} {$detail['ItemUnitName']} {$detail['WarehouseName']}";
}
if ($cekItem['ReceiveOrderPoDetailBatchNo'] != $detail['batchNo']) {
$descDetail = $descDetail . "\n" . "UPDATE nomor batch dari {$cekItem['ReceiveOrderPoDetailBatchNo']} menjadi {$detail['batchNo']}";
}
if ($cekItem['ReceiveOrderPoDetailEd'] != $detail['itemEd']) {
$descDetail = $descDetail . "\n" . "UPDATE tanggal expaired {$cekItem['ReceiveOrderPoDetailEd']} menjadi {$detail['itemEd']}";
}
$jsonBefore = $this->getDataPoItemReceive($detail['PoItemReceiveID']);
$sql = "UPDATE `po_item_receive`
SET
`PoItemReceiveQtyReceived` = ?,
`PoItemReceiveUpdatedUserID` = ?
WHERE `PoItemReceiveID` = ?;";
$qry = $this->db->query($sql, [
(intval($newReceivedQty) + intval($detail['qty'])),
$userId,
$detail['PoItemReceiveID'],
]);
if (!$qry) {
$this->sys_error_db("Error update item receive", $this->db);
$this->db->trans_rollback();
exit;
}
$jsonAfter = $this->getDataPoItemReceive($detail['PoItemReceiveID']);
$dtlDesc = '';
if (intval($cekItem['ReceiveOrderPoDetailQty']) > intval($detail['qty'])) {
$nwQty = intval($cekItem['ReceiveOrderPoDetailQty']) - intval($detail['qty']);
$dtlDesc = ", mengembalikan {$nwQty} {$detail['ItemUnitName']} ke jumlah item yang belum diterima ";
}
if (intval($detail['qty']) > intval($cekItem['ReceiveOrderPoDetailQty'])) {
$nwQty = intval($detail['qty']) - intval($cekItem['ReceiveOrderPoDetailQty']);
$dtlDesc = ", mengambil {$nwQty} {$detail['ItemUnitName']} dari jumlah item yang belum diterima ";
}
$descItem = "UPDATE ITEM qty {$detail['M_ItemDesc']} dari {$cekItem['ReceiveOrderPoDetailQty']} {$detail['ItemUnitName']} menjadi {$detail['qty']} {$detail['ItemUnitName']}{$dtlDesc} di RO nomor {$jsonROBefore['ReceiveOrderPoNumber']} *RO belum di konfirmasi";
$this->insertLogPoItemReceive(
$detail['PoItemReceiveID'],
'UPDATE',
$roID,
$jsonBefore,
$jsonAfter,
$userId,
$descItem
);
$jsonROAfter = $this->getDataReceiveOrderPO($roID);
$this->insertLogReceiveOrderPo(
$roID,
'UPDATE DETAIL',
$jsonROBefore,
$jsonROAfter,
$userId,
$descDetail
);
$this->insertUserActivty($roID, 'UPDATE DETAIL', $userId, $descDetail);
$this->db->trans_commit();
$this->sys_ok("Berhasil updatw qty item {$detail['M_ItemDesc']}");
}
public function deleteItem()
{
// $this->db->trans_commit();
// $this->db->trans_rollback();
$this->db->trans_begin();
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$prm = $this->sys_input;
$user = $this->sys_user;
$userId = $this->sys_user["M_UserID"];
$detail = $prm['detail'];
$ro = $prm['ro'];
$roID = $ro['ReceiveOrderPoID'];
$detail = $prm['detail'];
$detailID = $detail['ReceiveOrderPoDetailID'];
$jsonROBefore = $this->getDataReceiveOrderPO($roID);
$sql = "UPDATE receive_order_po_detail
SET
ReceiveOrderPoDetailIsActive = 'N',
ReceiveOrderPoDetailDeletedUserID = ?,
ReceiveOrderPoDetailDeleted = NOW()
WHERE ReceiveOrderPoDetailID = ?;
";
$qry = $this->db->query($sql, [
$userId,
$detailID
]);
if (!$qry) {
$this->sys_error_db("Error update item", $this->db);
$this->db->trans_rollback();
exit;
}
$descDetail = " DELETE ITEM {$detail['M_ItemDesc']} {$detail['tmpQty']} {$detail['ItemUnitName']} {$detail['WarehouseName']}";
$jsonBefore = $this->getDataPoItemReceive($detail['PoItemReceiveID']);
$sql = "UPDATE `po_item_receive`
JOIN receive_order_po_detail
ON PoItemReceiveID = ReceiveOrderPoDetailPoItemReceiveID
AND ReceiveOrderPoDetailReceiveOrderPoID = ?
AND ReceiveOrderPoDetailID = ?
SET
`PoItemReceiveQtyReceived` = PoItemReceiveQtyReceived - ReceiveOrderPoDetailQty,
`PoItemReceiveUpdatedUserID` = ?
WHERE `PoItemReceiveID` = ?;";
$qry = $this->db->query($sql, [
$ro['ReceiveOrderPoID'],
$detail['ReceiveOrderPoDetailID'],
$userId,
$detail['PoItemReceiveID']
]);
if (!$qry) {
$this->sys_error_db("Error update item receive", $this->db);
$this->db->trans_rollback();
exit;
}
$jsonAfter = $this->getDataPoItemReceive($detail['PoItemReceiveID']);
$descItem = "Dihapus {$detail['M_ItemDesc']} sejumlah {$detail['tmpQty']} {$detail['ItemUnitName']} di RO nomor {$jsonROBefore['ReceiveOrderPoNumber']} *RO belum di konfirmasi";
$this->insertLogPoItemReceive(
$detail['PoItemReceiveID'],
'UPDATE',
$roID,
$jsonBefore,
$jsonAfter,
$userId,
$descItem
);
$jsonROAfter = $this->getDataReceiveOrderPO($roID);
$this->insertLogReceiveOrderPo(
$roID,
'DELETE DETAIL',
$jsonROBefore,
$jsonROAfter,
$userId,
$descDetail
);
$this->insertUserActivty($roID, 'DELETE DETAIL', $userId, $descDetail);
$this->db->trans_commit();
$this->sys_ok("Berhasil hapus item {$detail['M_ItemDesc']}");
}
public function deleteHeader()
{
$this->db->trans_begin();
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$prm = $this->sys_input;
$user = $this->sys_user;
$userId = $this->sys_user["M_UserID"];
$ro = $prm['ro'];
$roID = $ro['ReceiveOrderPoID'];
$jsonROBefore = $this->getDataReceiveOrderPO($roID);
if ($jsonROBefore['ReceiveOrderPoConfirmed'] === 'Y') {
$this->sys_error("{$jsonROBefore['ReceiveOrderPoNumber']} tidak bisa di hapus karena sudah di konfirmasi pada {$jsonROBefore['ReceiveOrderPoIDate']}");
exit;
}
$sql = "UPDATE `receive_order_po` SET
ReceiveOrderPoIsActive = 'N',
ReceiveOrderPoDeleted = NOW(),
`ReceiveOrderPoDeletedUserID` = ?
WHERE ReceiveOrderPoID = ?;";
$qry = $this->db->query($sql, [
$userId,
$roID
]);
if (!$qry) {
$this->sys_error_db("Error delete receive oder", $this->db);
$this->db->trans_rollback();
exit;
}
$sql = "SELECT * FROM receive_order_po_detail
JOIN m_item
ON ReceiveOrderPoItemID = M_ItemID
JOIN itemunit
ON ReceiveOrderPoItemUnitID = ItemUnitID
WHERE ReceiveOrderPoDetailReceiveOrderPoID = ?
AND ReceiveOrderPoDetailIsActive = 'Y'";
$qry = $this->db->query($sql, [
$roID
]);
if (!$qry) {
$this->sys_error_db("Error get receive oder detail", $this->db);
$this->db->trans_rollback();
exit;
}
$details = $qry->result_array();
$descDetail = [];
foreach ($details as $key => $detail) {
$detailID = $detail['ReceiveOrderPoDetailID'];
$sql = "UPDATE receive_order_po_detail
SET
ReceiveOrderPoDetailIsActive = 'N',
ReceiveOrderPoDetailDeletedUserID = ?,
ReceiveOrderPoDetailDeleted = NOW()
WHERE ReceiveOrderPoDetailID = ?;
";
$qry = $this->db->query($sql, [
$userId,
$detailID
]);
if (!$qry) {
$this->sys_error_db("Error update item", $this->db);
$this->db->trans_rollback();
exit;
}
$descDetail[] = "- DELETE ITEM {$detail['M_ItemDesc']} {$detail['ReceiveOrderPoDetailQty']} {$detail['ItemUnitName']} {$ro['WarehouseName']}";
$jsonBefore = $this->getDataPoItemReceive($detail['ReceiveOrderPoDetailPoItemReceiveID']);
$sql = "UPDATE `po_item_receive`
JOIN receive_order_po_detail
ON PoItemReceiveID = ReceiveOrderPoDetailPoItemReceiveID
AND ReceiveOrderPoDetailReceiveOrderPoID = ?
AND ReceiveOrderPoDetailID = ?
SET
`PoItemReceiveQtyReceived` = PoItemReceiveQtyReceived - ReceiveOrderPoDetailQty,
`PoItemReceiveUpdatedUserID` = ?
WHERE `PoItemReceiveID` = ?;";
$qry = $this->db->query($sql, [
$ro['ReceiveOrderPoID'],
$detail['ReceiveOrderPoDetailID'],
$userId,
$detail['ReceiveOrderPoDetailPoItemReceiveID']
]);
if (!$qry) {
$this->sys_error_db("Error update item receive", $this->db);
$this->db->trans_rollback();
exit;
}
$jsonAfter = $this->getDataPoItemReceive($detail['ReceiveOrderPoDetailPoItemReceiveID']);
$descItem = "Dihapus {$detail['M_ItemDesc']} sejumlah {$detail['ReceiveOrderPoDetailQty']} {$detail['ItemUnitName']} di RO nomor {$jsonROBefore['ReceiveOrderPoNumber']} *RO belum di konfirmasi";
$this->insertLogPoItemReceive(
$detail['ReceiveOrderPoDetailPoItemReceiveID'],
'UPDATE',
$roID,
$jsonBefore,
$jsonAfter,
$userId,
$descItem
);
}
$jsonROAfter = $this->getDataReceiveOrderPO($roID);
$desc = "Update data Ro {$ro['ReceiveOrderPoNumber']}";
$this->insertLogReceiveOrderPo(
$roID,
'DELETE HEADER',
$jsonROBefore,
$jsonROAfter,
$userId,
$desc . "\n" . implode("\n", $descDetail)
);
$this->insertUserActivty($roID, 'DELETE HEADER', $userId, $desc . "\n" . implode("\n", $descDetail));
$this->db->trans_commit();
$this->sys_ok("Berhasil hapus {$ro['ReceiveOrderPoNumber']}");
}
public function search()
{
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$prm = $this->sys_input;
$userid = $this->sys_user["M_UserID"];
$user = $this->sys_user;
$search = '%' . $prm['search'] . '%';
$page = $prm["page"];
$startDate = $prm["startDate"];
$endDate = $prm["endDate"];
$ROW_PER_PAGE = 20;
$start_offset = 0;
// print_r($prm);
if (isset($prm["page"])) {
if (
is_numeric($prm["page"]) && $prm["page"] > 0
) {
$start_offset = ($page - 1) * $ROW_PER_PAGE;
}
}
$regionalId = $this->sys_user["S_RegionalID"];
$sqlWhere = "";
if ($user['M_UserLocationFlag'] == "R") {
$sqlWhere = "AND ReceiveOrderPoS_RegionalID ={$regionalId}";
}
if ($user['M_UserLocationFlag'] == "RB" || $user['M_UserLocationFlag'] == "B") {
$sqlWhere = "AND ReceiveOrderPoS_RegionalID ={$regionalId} AND ReceiveOrderPoM_BranchCode = {$user['M_BranchCode']}";
}
$sql = "SELECT
COUNT(*) as total
FROM receive_order_po
JOIN warehouse
ON ReceiveOrderPoWarehouseID = WarehouseID
JOIN supplier
ON ReceiveOrderPoSupplierID = SupplierID
JOIN s_regional ON WarehouseS_RegionalID = S_RegionalID AND S_RegionalIsActive = 'Y'
LEFT JOIN m_branch ON WarehouseM_BranchID = M_BranchID AND M_BranchIsActive = 'Y'
WHERE ReceiveOrderPoNumber LIKE ?
AND ReceiveOrderPoIsActive = 'Y'
AND ReceiveOrderPoIDate BETWEEN ? AND ?
$sqlWhere";
$qry = $this->db->query($sql, [$search, $startDate, $endDate]);
if (!$qry) {
$this->sys_error_db("Error get total", $this->db);
exit;
}
// print_r($this->db->last_query());
$total = $qry->row_array()['total'];
$sql = "SELECT
ReceiveOrderPoNumber,
ReceiveOrderPoID,
ReceiveOrderPoSupplierID,
ReceiveOrderPoIDate,
ReceiveOrderShippingCostAmount,
ReceiveOrderPoNote,
ReceiveOrderPoRefNumber,
SupplierID,
SupplierName,
WarehouseID,
WarehouseCode,
CASE
WHEN WarehouseType = 'B' THEN CONCAT(WarehouseCode,' ', WarehouseName, ' - ', M_BranchName)
WHEN WarehouseType = 'R' THEN CONCAT(WarehouseCode,' ', WarehouseName, ' - ', S_RegionalName)
ELSE ''
END WarehouseName,
ReceiveOrderPoConfirmed,
DATE_FORMAT(ReceiveOrderPoConfirmedDate, '%d-%m-%Y %H:%i') AS ReceiveOrderPoConfirmedDate,
M_UserUsername ReceiveOrderPoConfirmedUserName
FROM receive_order_po
JOIN warehouse
ON ReceiveOrderPoWarehouseID = WarehouseID
JOIN supplier
ON ReceiveOrderPoSupplierID = SupplierID
JOIN s_regional ON WarehouseS_RegionalID = S_RegionalID AND S_RegionalIsActive = 'Y'
LEFT JOIN m_branch ON WarehouseM_BranchID = M_BranchID AND M_BranchIsActive = 'Y'
LEFT JOIN m_user ON ReceiveOrderPoConfirmedUserID = M_UserID
WHERE ReceiveOrderPoNumber LIKE ?
AND ReceiveOrderPoIsActive = 'Y'
AND ReceiveOrderPoIDate BETWEEN ? AND ?
{$sqlWhere}
LIMIT ? OFFSET ?";
$qry = $this->db->query($sql, [$search, $startDate, $endDate, $ROW_PER_PAGE, $start_offset]);
if (!$qry) {
$this->sys_error_db("Error get search", $this->db);
exit;
}
// echo $this->db->last_query();
$rst = array(
"total" => ceil($total / $ROW_PER_PAGE),
"records" => $qry->result_array()
);
$this->sys_ok($rst);
}
public function getChecklist()
{
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$prm = $this->sys_input;
$userid = $this->sys_user["M_UserID"];
$user = $this->sys_user;
$id = $prm["id"];
$sql = "SELECT rc.*,
IFNULL(ReceiveOrderPoChecklistValue, 'N') RoChecklistValue,
IFNULL(ReceiveOrderPoChecklistNote,'') RoChecklistNote,
IFNULL (ReceiveOrderPoChecklistID, 0) idCek
FROM ro_checklist rc
LEFT JOIN ro_checklist_map rcm ON rc.RoChecklistID = rcm.RoChecklistMapRoChecklistID
JOIN receive_order_po_detail rop ON rop.ReceiveOrderPoDetailReceiveOrderPoID = ?
JOIN m_item mi ON mi.M_ItemID = rop.ReceiveOrderPoItemID
LEFT JOIN receive_order_po_checklist ON rc.RoChecklistID = ReceiveOrderPoChecklistRoChecklistID
AND ReceiveOrderPoChecklistReceiveOrderPoID = rop.ReceiveOrderPoDetailReceiveOrderPoID
AND ReceiveOrderPoChecklistIsActive = 'Y'
WHERE rc.RoChecklistIsActive = 'Y'
AND (
rc.RoChecklistType = 'G'
OR (
rc.RoChecklistType = 'C'
AND rcm.RoChecklistMapItemCategoryID = mi.M_ItemItem_CategoryID
AND rcm.RoChecklistMapIsActive = 'Y'
)
OR (
rc.RoChecklistType = 'P'
AND rcm.RoChecklistMapNat_GroupID = mi.M_ItemNat_GroupID
AND rcm.RoChecklistMapNat_SubGroupID = mi.M_ItemNat_SubGroupID
AND rcm.RoChecklistMapIsActive = 'Y'
)
)
GROUP BY rc.RoChecklistID;";
$qry = $this->db->query($sql, [$id]);
if (!$qry) {
$this->sys_error_db("Error get ro checklist", $this->db);
exit;
}
$data = $qry->result_array();
$cek = 'N';
foreach ($data as $key => $value) {
if (intval($value['idCek']) > 0) $cek = 'Y';
}
$this->sys_ok([
"data" => $data,
"status" => $cek
]);
}
public function saveChecklist()
{
// $this->db->trans_commit();
// $this->db->trans_rollback();
$this->db->trans_begin();
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$prm = $this->sys_input;
$userid = $this->sys_user["M_UserID"];
$user = $this->sys_user;
$id = $prm["id"];
$ron = $prm["ron"];
$checklist = $prm["checklist"];
$sql = "SELECT * FROM receive_order_po_checklist WHERE ReceiveOrderPoChecklistReceiveOrderPoID = ? AND ReceiveOrderPoChecklistIsActive = 'Y'";
$qry = $this->db->query($sql, [$id]);
if (!$qry) {
$this->db->trans_rollback();
$this->sys_error_db("get checklist before", $this->db);;
exit;
}
$dataBefore = $qry->result_array();
$logMsg = ["Update checklist RO nomor {$ron}"];
foreach ($checklist as $key => $value) {
$sql = "SELECT * FROM receive_order_po_checklist
WHERE ReceiveOrderPoChecklistReceiveOrderPoID = ?
AND ReceiveOrderPoChecklistRoChecklistID = ?
AND ReceiveOrderPoChecklistIsActive = 'Y'";
$qry = $this->db->query($sql, [$id, $value['RoChecklistID']]);
if (!$qry) {
$this->db->trans_rollback();
$this->sys_error_db("get checklist", $this->db);;
exit;
}
$dataChecklist = $qry->row_array();
if (empty($dataChecklist)) {
//insert
$sql = "INSERT INTO receive_order_po_checklist (
ReceiveOrderPoChecklistReceiveOrderPoID,
ReceiveOrderPoChecklistRoChecklistID,
ReceiveOrderPoChecklistValue,
ReceiveOrderPoChecklistNote,
ReceiveOrderPoChecklistCreated,
ReceiveOrderPoChecklistCreatedUserID)
VALUES (?, ?, ?, ?, NOW(), ?)";
$qry = $this->db->query($sql, [
$id,
$value['RoChecklistID'],
$value['RoChecklistValue'],
$value['RoChecklistNote'],
$userid
]);
if (!$qry) {
$this->db->trans_rollback();
$this->sys_error_db("insert checklist checklist", $this->db);;
exit;
}
$ket = "memenuhi dan catatan '{$value['RoChecklistNote']}'";
if ($value['RoChecklistValue'] == 'N') {
$ket = "tidak memenuhi dan catatan '{$value['RoChecklistNote']}'";
}
$logMsg[] = "- Tambah checklist {$value['RoChecklistName']} dengan nilai {$ket} ";
} else {
$sql = "UPDATE receive_order_po_checklist SET
ReceiveOrderPoChecklistValue = ?,
ReceiveOrderPoChecklistNote = ?,
ReceiveOrderPoChecklistLastUpdatedUserID = ?
WHERE ReceiveOrderPoChecklistID = ?";
$qry = $this->db->query($sql, [
$value['RoChecklistValue'],
$value['RoChecklistNote'],
$userid,
$dataChecklist['ReceiveOrderPoChecklistID']
]);
if (!$qry) {
$this->db->trans_rollback();
$this->sys_error_db("update checklist checklist", $this->db);;
exit;
}
$ket = "memenuhi dan catatan '{$value['RoChecklistNote']}'";
if ($value['RoChecklistValue'] == 'N') {
$ket = "tidak memenuhi dan catatan '{$value['RoChecklistNote']}'";
}
$logMsg[] = "- Update checklist {$value['RoChecklistName']} dengan nilai {$ket} ";
}
}
$sql = "SELECT * FROM receive_order_po_checklist WHERE ReceiveOrderPoChecklistReceiveOrderPoID = ? AND ReceiveOrderPoChecklistIsActive = 'Y'";
$qry = $this->db->query($sql, [$id]);
if (!$qry) {
$this->db->trans_rollback();
$this->sys_error_db("get checklist before", $this->db);;
exit;
}
$dataAfter = $qry->result_array();
$this->insertLogReceiveOrderPo(
$id,
'UPDATE CHECKLIST',
$dataBefore,
$dataAfter,
$userid,
implode("\n", $logMsg)
);
$this->insertUserActivty(
$id,
'UPDATE CHECKLIST',
$userid,
implode("\n", $logMsg)
);
$this->db->trans_commit();
$this->sys_ok("Berhasil simpan checklist");
}
public function confirmRo()
{
// $this->db->trans_commit();
// $this->db->trans_rollback();
$this->db->trans_begin();
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$prm = $this->sys_input;
$user = $this->sys_user;
$userId = $this->sys_user["M_UserID"];
$id = $prm['id'];
$jsonROBefore = $this->getDataReceiveOrderPO($id);
$sql = "SELECT receive_order_po.*, DATE_FORMAT(ReceiveOrderPoIDate, '%d-%m-%Y') formatedDate,
CASE
WHEN WarehouseType = 'B' THEN CONCAT(WarehouseCode,' ', WarehouseName, ' - ', M_BranchName)
WHEN WarehouseType = 'R' THEN CONCAT(WarehouseCode,' ', WarehouseName, ' - ', S_RegionalName)
ELSE ''
END WarehouseName,
WarehouseID
FROM receive_order_po
JOIN warehouse
ON ReceiveOrderPoWarehouseID = WarehouseID
JOIN s_regional ON WarehouseS_RegionalID = S_RegionalID AND S_RegionalIsActive = 'Y'
LEFT JOIN m_branch ON WarehouseM_BranchID = M_BranchID AND M_BranchIsActive = 'Y'
WHERE ReceiveOrderPoID = ?";
$qry = $this->db->query($sql, [$id]);
if (!$qry) {
$this->db->trans_rollback();
$this->sys_error_db("get PO ", $this->db);;
exit;
}
$dataRo = $qry->row_array();
if ($dataRo['ReceiveOrderPoConfirmed'] == 'Y') {
$this->db->trans_rollback();
$this->sys_error("Penerimaan barang {$dataRo['ReceiveOrderPoNumber']} sudah pernah dikonfirmasi");
exit;
}
$tabelNameJurnal = "jurnal";
$tabelNameJurnaltx = "jurnal_tx";
$tabelNameJurnalAddon = "jurnal_addon";
// if (doubleval($dataRo['ReceiveOrderOtherExpensesAmount']) > 0) {
// $tabelNameJurnal = "jurnalTmp";
// $tabelNameJurnaltx = "jurnal_txTmp";
// $tabelNameJurnalAddon = "jurnal_addonTmp";
// # code...
// }
$sql = "SELECT receive_order_po_detail.*, PurchaseOrderID, PurchaseOrderNumber
FROM receive_order_po_detail
JOIN purchase_order
ON ReceiveOrderPoDetailPurchaseOrderID = PurchaseOrderID
WHERE ReceiveOrderPoDetailReceiveOrderPoID = ? AND ReceiveOrderPoDetailIsActive='Y'";
$qry = $this->db->query($sql, [$id]);
if (!$qry) {
$this->db->trans_rollback();
$this->sys_error_db("get ro detail ", $this->db);;
exit;
}
$detailRo = $qry->result_array();
$sql = "SELECT GROUP_CONCAT(DISTINCT PurchaseOrdernumber SEPARATOR ', ') as ponumber
FROM receive_order_po_detail
JOIN purchase_order
ON ReceiveOrderPoDetailPurchaseOrderID = PurchaseOrderID
WHERE ReceiveOrderPoDetailReceiveOrderPoID = ?
AND ReceiveOrderPoDetailIsActive='Y'";
$qry = $this->db->query($sql, [$id]);
if (!$qry) {
$this->db->trans_rollback();
$this->sys_error_db("get ro detail ", $this->db);;
exit;
}
$strPoNumber = $qry->row_array()['ponumber'];
$desc = "Konfirmasi penerimaan barang {$dataRo['ReceiveOrderPoNumber']} yang meliputi beberapa item dari PO {$strPoNumber}";
$sql = "SELECT `fn_numbering`('J') AS numbering";
$qry = $this->db->query($sql, []);
if (!$qry) {
$this->sys_error_db("get numbering error", $this->db);
$this->db->trans_rollback();
exit;
}
$numbering = $qry->row_array()["numbering"];
$sql = "SELECT periodeID FROM periode
WHERE NOW() BETWEEN periodeStartDate AND periodeEndDate
AND periodeIsActive= 'Y'
AND periodeIsClosed = 'N'";
$qry = $this->db->query($sql, []); //pakai confirm datenya
if (!$qry) {
$this->sys_error_db("get periode error", $this->db);
$this->db->trans_rollback();
exit;
}
$dataPeriode = $qry->row_array();
if (empty($dataPeriode)) {
$this->sys_error("Periode untuk generate jurnal tidak ditemukan");
$this->db->trans_rollback();
exit;
}
$periodeID = $dataPeriode["periodeID"];
$jurnalTitle = "Jurnal Penerimaan Barang Dari PO {$strPoNumber} Tanggal {$dataRo['formatedDate']}";
$jurnalDesc = "Jurnal Penerimaan Barang Dari PO {$strPoNumber} Tanggal {$dataRo['formatedDate']} Di {$dataRo['WarehouseName']}";
$descJurnal = "ADD Jurnal Penerimaan Barang Dari PO {$strPoNumber} Tanggal {$dataRo['formatedDate']} Di {$dataRo['WarehouseName']}";
$descJurnalDetail = [];
$sql = "INSERT INTO {$tabelNameJurnal}
(jurnalM_BranchCompanyID,
JurnalS_RegionalID,
jurnalM_BranchCode,
jurnalperiodeID,
jurnalNo,
jurnalTitle,
jurnalDescription,
jurnalDate,
jurnalJurnalTypeID,
jurnalM_UserID)
VALUES(?,?,?,?,?,?,?,NOW(),?,?)
";
$qry = $this->db->query($sql, [
$user['M_BranchCompanyID'],
$user['S_RegionalID'],
$user['M_BranchCode'],
$periodeID,
$numbering,
$jurnalTitle,
$jurnalDesc,
2,
$userId
]);
if (!$qry) {
$this->db->trans_rollback();
$this->sys_error_db("Error insert jurnal ", $this->db);;
exit;
}
$jurnalID = $this->db->insert_id();
$sql = "INSERT INTO {$tabelNameJurnalAddon} (
jurnalAddOnJurnalID,
jurnalAddOnCode,
jurnalAddOnValue,
jurnalAddOnCreated,
jurnalAddOnCreatedUserID)
VALUES(?,'RONUMB',?,NOW(),?)
";
$qry = $this->db->query($sql, [
$jurnalID,
$dataRo['ReceiveOrderPoNumber'],
$userId
]);
if (!$qry) {
$this->db->trans_rollback();
$this->sys_error_db("error insert jurnal addon ", $this->db);;
exit;
}
$sql = "UPDATE `receive_order_po` SET
ReceiveOrderPoConfirmed = 'Y',
ReceiveOrderPoConfirmedDate = NOW(),
ReceiveOrderPoConfirmedUserID = ?
WHERE ReceiveOrderPoID = ?;";
$qry = $this->db->query($sql, [
$userId,
$id
]);
if (!$qry) {
$this->sys_error_db("Error confirm receive oder", $this->db);
$this->db->trans_rollback();
exit;
}
$totalDebet = 0;
foreach ($detailRo as $key => $item) {
$sql = "SELECT * FROM m_item WHERE M_ItemID = ?";
$qry = $this->db->query($sql, [
$item['ReceiveOrderPoItemID'],
]);
if (!$qry) {
$this->db->trans_rollback();
$this->sys_error_db("error cek item ", $this->db);;
exit;
}
$cekItem = $qry->row_array();
if (empty($cekItem)) {
$this->db->trans_rollback();
$this->sys_error_db("Item {$item['PurchaseOrderNumber']} {$cekItem['M_ItemDesc']} tidak ditemukan ", $this->db);
exit;
}
if (
$cekItem['M_ItemItem_CategoryID'] == null
|| $cekItem['M_ItemItem_CategoryID'] == 0
|| $cekItem['M_ItemItem_CategoryID'] == ''
) {
$this->db->trans_rollback();
$this->sys_error_db("Item {$item['PurchaseOrderNumber']} {$cekItem['M_ItemDesc']} belum memiliki kategori ", $this->db);
exit;
}
//persediaan
if (intval($cekItem['M_ItemItem_CategoryID']) == 1) {
if (
$cekItem['M_ItemNat_SubGroupID'] == null
|| $cekItem['M_ItemNat_SubGroupID'] == 0
|| $cekItem['M_ItemNat_SubGroupID'] == ''
) {
$this->db->trans_rollback();
$this->sys_error_db("Item {$item['PurchaseOrderNumber']} {$cekItem['M_ItemDesc']} belum memiliki sub group ", $this->db);
exit;
}
$sql = "SELECT * FROM map_nat_subgroup
WHERE MapNatSub_NatGroupID = ?
AND MapNatSub_NatSubGroupID = ?
AND MapNatSub_IsActive = 'Y'";
$qry = $this->db->query($sql, [
$cekItem['M_ItemNat_GroupID'],
$cekItem['M_ItemNat_SubGroupID'],
]);
if (!$qry) {
$this->db->trans_rollback();
$this->sys_error_db("error get map_nat_subgroup ", $this->db);;
exit;
}
$mapNatSubGroup = $qry->row_array();
if (
$mapNatSubGroup['MapNatSub_PersediaanCoaID'] == null ||
$mapNatSubGroup['MapNatSub_PersediaanCoaID'] == '' ||
$mapNatSubGroup['MapNatSub_PersediaanCoaAccountNo'] == null ||
$mapNatSubGroup['MapNatSub_PersediaanCoaAccountNo'] == '' ||
$mapNatSubGroup['MapNatSub_PersediaanCoaDescription'] == null ||
$mapNatSubGroup['MapNatSub_PersediaanCoaDescription'] == ''
) {
$this->db->trans_rollback();
$this->sys_error_db("Coa item {$item['PurchaseOrderNumber']} {$cekItem['M_ItemDesc']} belum termapping", $this->db);;
exit;
}
$debet = intval($item['ReceiveOrderPoDetailQty']) * doubleval($item['ReceiveOrderPoDetailPrice']);
$totalDebet = $totalDebet + $debet;
$sql = "INSERT INTO {$tabelNameJurnaltx}(
jurnalTxJurnalID,
jurnalTxCoaID,
jurnalTxDescription,
jurnalTxDebit,
jurnalTxCredit,
jurnalTxM_UserID)
VALUES(?,?,?,?,?,?)";
$qry = $this->db->query($sql, array(
$jurnalID,
$mapNatSubGroup['MapNatSub_PersediaanCoaID'],
$mapNatSubGroup['MapNatSub_PersediaanCoaDescription'],
$debet,
0,
$userId
));
if (!$qry) {
$this->db->trans_rollback();
$this->sys_error_db("Error insert jurnal tx {$item['PurchaseOrderNumber']} {$cekItem['M_ItemDesc']}");
exit;
}
$jurnalTxID = $this->db->insert_id();
$formatDebet = $this->formatRupiah($debet);
$descJurnalDetail[] = "- Add detail Jurnal debet {$cekItem['M_ItemDesc']} {$mapNatSubGroup['MapNatSub_PersediaanCoaDescription']} sejumlah {$formatDebet}";
$sql = "INSERT INTO {$tabelNameJurnalAddon}(
jurnalAddOnJurnalID,
jurnalAddOnJurnalTxID,
jurnalAddOnCode,
jurnalAddOnValue,
jurnalAddOnCreated,
jurnalAddOnCreatedUserID)
VALUES(?,?,'PONUMB',?,NOW(),?)
";
$qry = $this->db->query($sql, [
$jurnalID,
$jurnalTxID,
$item['PurchaseOrderNumber'],
$userId
]);
if (!$qry) {
$this->db->trans_rollback();
$this->sys_error_db("error insert jurnal addon {$item['PurchaseOrderNumber']} {$cekItem['M_ItemDesc']}", $this->db);;
exit;
}
} else if (intval($cekItem['M_ItemItem_CategoryID']) == 2) {
//Inventaris
$this->db->trans_rollback();
$this->sys_error_db("Item {$cekItem['M_ItemDesc']} memiliki kategori inventaris belum tersedia untuk auto jurnal");
exit;
} else if (intval($cekItem['M_ItemItem_CategoryID']) == 3) {
//Aset
if (
$cekItem['M_ItemFa_ClassID'] == null
|| $cekItem['M_ItemFa_ClassID'] == 0
|| $cekItem['M_ItemFa_ClassID'] == ''
) {
$this->db->trans_rollback();
$this->sys_error_db("{$item['PurchaseOrderNumber']} Item {$cekItem['M_ItemDesc']} belum memiliki class asset ", $this->db);
exit;
}
$sql = "SELECT * FROM fa_calss WHERE Fa_ClassID = ? AND Fa_ClassIsActive = 'Y'";
$qry = $this->db->query($sql, [
$cekItem['M_ItemFa_ClassID']
]);
if (!$qry) {
$this->db->trans_rollback();
$this->sys_error_db("error get class asset {$item['PurchaseOrderNumber']} {$cekItem['M_ItemDesc']} ", $this->db);;
exit;
}
$faClass = $qry->row_array();
if (empty($faClass)) {
$this->db->trans_rollback();
$this->sys_error_db("{$item['PurchaseOrderNumber']} Item {$cekItem['M_ItemDesc']} class asset sudah terhapus", $this->db);;
exit;
}
$debet = intval($item['ReceiveOrderPoDetailQty']) * doubleval($item['ReceiveOrderPoDetailPrice']);
$totalDebet = $totalDebet + $debet;
$sql = "INSERT INTO {$tabelNameJurnaltx}(
jurnalTxJurnalID,
jurnalTxCoaID,
jurnalTxDescription,
jurnalTxDebit,
jurnalTxCredit,
jurnalTxM_UserID)
VALUES(?,?,?,?,?,?)";
$qry = $this->db->query($sql, array(
$jurnalID,
$faClass['Fa_ClassCoaID'],
$faClass['Fa_ClassCoaDesc'],
$debet,
0,
$userId
));
if (!$qry) {
$this->db->trans_rollback();
$this->sys_error_db("Error insert jurnal tx {$item['PurchaseOrderNumber']} {$cekItem['M_ItemDesc']}");
exit;
}
$jurnalTxID = $this->db->insert_id();
$formatDebet = $this->formatRupiah($debet);
$descJurnalDetail[] = "- Add detail Jurnal debet {$cekItem['M_ItemDesc']} {$faClass['Fa_ClassCoaDesc']} sejumlah {$formatDebet}";
$sql = "INSERT INTO {$tabelNameJurnalAddon}(
jurnalAddOnJurnalID,
jurnalAddOnJurnalTxID,
jurnalAddOnCode,
jurnalAddOnValue,
jurnalAddOnCreated,
jurnalAddOnCreatedUserID)
VALUES(?,?,'PONUMB',?,NOW(),?)
";
$qry = $this->db->query($sql, [
$jurnalID,
$jurnalTxID,
$item['PurchaseOrderNumber'],
$userId
]);
if (!$qry) {
$this->db->trans_rollback();
$this->sys_error_db("error insert jurnal addon {$item['PurchaseOrderNumber']} {$cekItem['M_ItemDesc']}", $this->db);
exit;
}
}
// handle stock
$sql = "INSERT INTO stock (
StockWarehouseAlmariID,
StockWarehouseRackID,
StockWarehouseID,
StockStockNumber,
StockBatchNo,
StockItemID,
StockItemUnitID,
StockED,
StockItemPrice,
StockQty,
StockLastUpdated,
StockUserID
) VALUES (
0, 0, ?, fn_numbering('SN'), ?, ?, ?, ?, ?, ?, NOW(), ?
)
ON DUPLICATE KEY UPDATE
StockItemPrice = VALUES(StockItemPrice),
StockQty = StockQty + VALUES(StockQty),
StockLastUpdated = NOW(),
StockUserID = VALUES(StockUserID);";
$qry = $this->db->query($sql, array(
$dataRo['WarehouseID'],
$item['ReceiveOrderPoDetailBatchNo'],
$item['ReceiveOrderPoItemID'],
$item['ReceiveOrderPoItemUnitID'],
$item['ReceiveOrderPoDetailEd'],
$item['ReceiveOrderPoDetailPrice'],
$item['ReceiveOrderPoDetailQty'],
$userId
));
if (!$qry) {
$this->db->trans_rollback();
$this->sys_error_db("Error insert update or insert stock");
exit;
}
$sql = "SELECT * FROM stock
WHERE StockWarehouseID = ?
AND StockWarehouseAlmariID = 0
AND StockWarehouseRackID = 0
AND StockBatchNo = ?
AND StockItemID = ?
AND StockItemUnitID = ?
AND StockED = ?
";
$qry = $this->db->query($sql, array(
$dataRo['WarehouseID'],
$item['ReceiveOrderPoDetailBatchNo'],
$item['ReceiveOrderPoItemID'],
$item['ReceiveOrderPoItemUnitID'],
$item['ReceiveOrderPoDetailEd'],
));
if (!$qry) {
$this->db->trans_rollback();
$this->sys_error_db("Error get stock stock");
exit;
}
$stock = $qry->row_array();
$sql = "INSERT INTO stockcard (
StockCardWarehouseID,
StockCardDatetime,
StockCardItemID,
StockCardItemUnitID,
StockCardBatchNo,
StockCardED,
StockCardReffID,
StockCardStatus,
StockCardBefore,
StockCardIn,
StockCardOut,
StockCardAfter,
StockCardUserID
) VALUES (
?, NOW(), ?, ?, ?, ?, ?, 'PRV', ?, ?, 0, ?, ?
);";
$qry = $this->db->query($sql, array(
$dataRo['WarehouseID'],
$item['ReceiveOrderPoItemID'],
$item['ReceiveOrderPoItemUnitID'],
$item['ReceiveOrderPoDetailBatchNo'],
$item['ReceiveOrderPoDetailEd'],
$stock['StockID'],
(intval($stock['StockQty']) - intval($item['ReceiveOrderPoDetailQty'])) < 0 ? 0 : (intval($stock['StockQty']) - intval($item['ReceiveOrderPoDetailQty'])),
intval($item['ReceiveOrderPoDetailQty']),
intval($stock['StockQty']),
$userId
));
if (!$qry) {
$this->db->trans_rollback();
$this->sys_error_db("Error insert stock card");
exit;
}
$sql = "INSERT INTO stocklog (
StockLogWarehouseID,
StockLogDateTime,
StockLogItemID,
StockLogItemUnitID,
StockLogStockNumber,
StockLogBatchNo,
StockLogED,
StockLogReffID,
StockLogStatus,
StockLogQty,
StockLogUserID
) VALUES (
?, NOW(), ?, ?, ?, ?, ?, ?, 'PRV', ?, ?
);";
$qry = $this->db->query($sql, array(
$dataRo['WarehouseID'],
$item['ReceiveOrderPoItemID'],
$item['ReceiveOrderPoItemUnitID'],
$stock['StockStockNumber'],
$item['ReceiveOrderPoDetailBatchNo'],
$item['ReceiveOrderPoDetailEd'],
$stock['StockID'],
$item['ReceiveOrderPoDetailQty'],
$userId
));
if (!$qry) {
$this->db->trans_rollback();
$this->sys_error_db("Error insert stock log");
exit;
}
}
$sql = "INSERT INTO {$tabelNameJurnaltx}(
jurnalTxJurnalID,
jurnalTxCoaID,
jurnalTxDescription,
jurnalTxDebit,
jurnalTxCredit,
jurnalTxM_UserID)
SELECT
{$jurnalID},
coaID,
coaDescription,
0,
{$totalDebet},
{$userId}
FROM coa WHERE coaAccountNo = '2110100030'
LIMIT 1";
$qry = $this->db->query($sql, array());
if (!$qry) {
$this->db->trans_rollback();
$this->sys_error_db("Error insert jurnal tx GRNI");
exit;
}
$formatDebet = $this->formatRupiah($totalDebet);
$sql = "INSERT INTO receive_order_po_shipping
(ReceiveOrderPoShippingPurchaseOrderID,
ReceiveOrderPoShippingReceiveOrderPoID,
ReceiveOrderPoShippingAmount,
ReceiveOrderPoShippingStatus,
ReceiveOrderPoShippingIsActive,
ReceiveOrderPoShippingCreatedUserID)
SELECT
PurchaseOrderID,
{$id},
PurchaseOrderShippingCost,
PurchaseOrderShippingCostStatus,
'Y',
{$userId}
FROM purchase_order
WHERE PurchaseOrderID IN ( SELECT DISTINCT ReceiveOrderPoDetailPurchaseOrderID
FROM receive_order_po
JOIN receive_order_po_detail
ON ReceiveOrderPoDetailReceiveOrderPoID = ReceiveOrderPoID
WHERE ReceiveOrderPoID = {$id} )
AND PurchaseOrderShippingCost IS NOT NULL
AND PurchaseOrderShippingCost > 0
";
$qry = $this->db->query($sql, array());
if (!$qry) {
$this->db->trans_rollback();
$this->sys_error_db("Error insert temporary shipping cost");
exit;
}
$descJurnalDetail[] = "- Add detail Jurnal Kredit GRNI sejumlah {$formatDebet}";
$jsonROAfter = $this->getDataReceiveOrderPO($id);
$this->insertLogReceiveOrderPo(
$id,
'CONFIRM',
$jsonROBefore,
$jsonROAfter,
$userId,
$desc . "\n" . $descJurnal . "\n" . implode("\n", $descJurnalDetail)
);
$this->insertUserActivty(
$id,
'CONFIRM',
$userId,
$desc . "\n" . $descJurnal . "\n" . implode("\n", $descJurnalDetail)
);
$this->db->trans_commit();
$this->sys_ok("Berhasil konfirmasi terima barang ");
}
public function generateItemPo()
{
// $this->db->trans_commit();
// $this->db->trans_rollback();
$this->db->trans_begin();
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$prm = $this->sys_input;
$userId = $this->sys_user["M_UserID"];
$POID = $prm["id"];
$regionalId = $prm["regionalId"];
if (!isset($prm['id'])) {
$this->sys_error("Missing required parameters");
return;
}
$sql = "SELECT * FROM purchase_order
LEFT JOIN warehouse ON PurchaseOrderWarehouseID = WarehouseID WHERE PurchaseOrderID = ?";
$qry = $this->db->query($sql, [$POID]);
if (!$qry) {
$this->db->trans_rollback();
$this->sys_error_db("get PO ", $this->db);;
exit;
}
$dataPo = $qry->row_array();
// print_r($dataPo);
if ($dataPo['PurchaseOrderStatus'] != 'Approved') {
$this->sys_error("Status Po tidak approved");
return;
}
$dataDetail = [];
if ($dataPo['PurchaseOrderWarehouseType'] == 'Single') {
$sql = "SELECT
IFNULL(p.PoItemReceiveID, 0) as receivedID,
IFNULL(p.PoItemReceiveQtyReceived, 0) qtyReceived,
pos.PurchaseOrderSummaryID orderSummaryID,
pos.PurchaseOrderSummaryItemID itemID,
pos.PurchaseOrderSummaryItemUnitID itemUnitID,
pos.PurchaseOrderSummaryQty qty,
pos.PurchaseOrderSummaryPrice price
m_itemDesc itemName,
ItemUnitName itemUnitName
FROM purchase_order_summary pos
JOIN m_item
ON pos.PurchaseOrderSummaryItemID = M_ItemID
JOIN itemunit
ON pos.PurchaseOrderSummaryItemUnitID = ItemUnitID
LEFT JOIN po_item_receive p
ON pos.PurchaseOrderSummaryPurchaseOrderID = p.PoItemReceivePurchaseOrderID
AND pos.PurchaseOrderSummaryItemID = p.PoItemReceiveItemID
WHERE pos.PurchaseOrderSummaryPurchaseOrderID = ?
AND pos.PurchaseOrderSummaryIsActive = 'Y'
AND IFNULL(p.PoItemReceiveQtyReceived, 0) = 0";
$qry = $this->db->query($sql, [$POID]);
if (!$qry) {
$this->db->trans_rollback();
$this->sys_error_db("get item", $this->db);;
exit;
}
$row = $qry->result_array();
$dataDetail = $row;
foreach ($row as $key => $v) {
if (intval($v['PoItemReceiveID']) == 0) {
//insert
$sql = "INSERT INTO po_item_receive (
PoItemReceivePurchaseOrderID,
PoItemReceivePurchaseOrderSummaryID,
PoItemReceivePurchaseOrderDetailID,
PoItemReceiveWarehouseID,
PoItemReceiveItemID,
PoItemReceiveItemUnitID,
PoItemReceiveQty,
PoItemReceiveQtyReceived,
PoItemReceiveIsActive,
PoItemReceiveCreated,
PoItemReceiveCreatedUserID,
PoItemReceivePrice
)
VALUES(
?,
?,
NULL,
?,
?,
?,
?,
0,
'Y',
NOW(),
?,
?
)";
$qry = $this->db->query($sql, [
$POID,
$v['orderSummaryID'],
$dataPo['PurchaseOrderWarehouseID'],
$v['itemID'],
$v['itemUnitID'],
$v['qty'],
$userId,
$v['price']
]);
if (!$qry) {
$this->db->trans_rollback();
$this->sys_error_db("insert item", $this->db);;
exit;
}
$desc = "ADD {$v['itemName']} {$v['qty']} {$v['itemUnitName']} {$dataPo['WarehouseName']}";
$insertedID = $this->db->insert_id();
$jsonAfter = $this->getDataPoItemReceive($insertedID);
$this->insertLogPoItemReceive($insertedID, 'ADD', 0, '', $jsonAfter, $userId, $desc);
}
if (intval($v['PoItemReceiveID']) != 0) {
//boleh update
$jsonBefore = $this->getDataPoItemReceive($v['PoItemReceiveID']);
$sql = "UPDATE po_item_receive
SET PoItemReceiveQty = ?,
PoItemReceiveIsActive = 'Y',
PoItemReceiveUpdate = NOW(),
PoItemReceiveUpdatedUserID = ?,
PoItemReceiveWarehouseID = ?,
PoItemReceiveItemUnitID = ?,
PoItemReceivePrice = ?
WHERE PoItemReceiveID = ?
";
$qry = $this->db->query($sql, [
$v['qty'],
$userId,
$dataPo['PurchaseOrderWarehouseID'],
$v['itemUnitID'],
$v['price'],
$v['receivedID']
]);
if (!$qry) {
$this->db->trans_rollback();
$this->sys_error_db("update item ", $this->db);;
exit;
}
$desc = [];
if ($jsonBefore['WarehouseID'] != $jsonBefore['WarehouseID']) {
$desc[] = "- UPDATE {$v['itemName']} berubah warehouse dari {$jsonBefore['WarehouseName']} menjadi {$jsonAfter['WarehouseName']}";
}
if ($jsonBefore['PoItemReceiveItemUnitID'] != $jsonBefore['PoItemReceiveItemUnitID']) {
$desc[] = "- UPDATE {$v['itemName']} berubah unit item dari {$jsonBefore['ItemUnitName']} menjadi {$jsonAfter['ItemUnitName']}";
}
if ($jsonBefore['PoItemReceiveQty'] != $jsonBefore['PoItemReceiveQty']) {
$desc[] = "- UPDATE {$v['itemName']} berubah jumlah dari {$jsonBefore['PoItemReceiveQty']} menjadi {$jsonAfter['PoItemReceiveQty']}";
}
if ($jsonBefore['PoItemReceivePrice'] != $jsonBefore['PoItemReceivePrice']) {
$desc[] = "- UPDATE {$v['itemName']} berubah harga dari {$jsonBefore['PoItemReceivePrice']} menjadi {$jsonAfter['PoItemReceivePrice']}";
}
$insertedID = $this->db->insert_id();
$jsonAfter = $this->getDataPoItemReceive($v['PoItemReceiveID']);
$this->insertLogPoItemReceive(
$v['PoItemReceiveID'],
'UPDATE',
0,
$jsonBefore,
$jsonAfter,
$userId,
implode("\n", $desc)
);
}
}
}
if ($dataPo['PurchaseOrderWarehouseType'] == 'Multiple') {
$sql = "SELECT
IFNULL(PoItemReceiveID, 0) as cekID,
IFNULL(PoItemReceiveQtyReceived, 0) as qtyCek,
pod.PurchaseOrderDetailPurchaseSummaryID summaryID,
pod.PurchaseOrderDetailID poDetailID,
pod.PurchaseOrderDetailWarehouseID warehouseID,
WarehouseName,
pod.PurchaseOrderDetailItemID itemID,
M_ItemDesc itemName,
pos.PurchaseOrderSummaryItemUnitID itemUnitID,
ItemUnitName itemUnitName,
ConvertQuantityToPurchasedItemUnit(pod.PurchaseOrderDetailItemID, pod.PurchaseOrderDetailItemUnitID, pod.PurchaseOrderDetailQty) poQty,
pos.PurchaseOrderSummaryPrice price
FROM purchase_order_detail pod
JOIN purchase_order_summary pos
ON pod.PurchaseOrderDetailPurchaseSummaryID = pos.PurchaseOrderSummaryID
JOIN m_item
ON pod.PurchaseOrderDetailItemID = M_ItemID
JOIN itemunit
ON pos.PurchaseOrderSummaryItemUnitID = ItemUnitID
JOIN warehouse
ON pod.PurchaseOrderDetailWarehouseID = WarehouseID
LEFT JOIN po_item_receive p
ON p.PoItemReceiveItemID = pod.PurchaseOrderDetailItemID
AND p.PoItemReceivePurchaseOrderID = ?
AND p.PoItemReceivePurchaseOrderSummaryID = pos.PurchaseOrderSummaryID
AND p.PoItemReceivePurchaseOrderDetailID = pod.PurchaseOrderDetailID
WHERE pod.PurchaseOrderDetailPurchaseOrderID = ?
AND IFNULL(PoItemReceiveQtyReceived, 0) = 0
AND pod.PurchaseOrderDetailIsActive = 'Y'";
$qry = $this->db->query($sql, [$POID, $POID]);
if (!$qry) {
$this->db->trans_rollback();
$this->sys_error_db("get item ", $this->db);;
exit;
}
$mRow = $qry->result_array();
$dataDetail = $mRow;
foreach ($mRow as $key => $v) {
if (intval($v['cekID']) == 0) {
//insert
$sql = "INSERT INTO po_item_receive (
PoItemReceivePurchaseOrderID,
PoItemReceivePurchaseOrderSummaryID,
PoItemReceivePurchaseOrderDetailID,
PoItemReceiveWarehouseID,
PoItemReceiveItemID,
PoItemReceiveItemUnitID,
PoItemReceiveQty,
PoItemReceiveQtyReceived,
PoItemReceiveIsActive,
PoItemReceiveCreated,
PoItemReceiveCreatedUserID,
PoItemReceivePrice
)
VALUES(
?,
?,
?,
?,
?,
?,
?,
0,
'Y',
NOW(),
?,
?
);";
$qry = $this->db->query($sql, [
$POID,
$v['summaryID'],
$v['poDetailID'],
$v['warehouseID'],
$v['itemID'],
$v['itemUnitID'],
$v['poQty'],
$userId,
$v['price']
]);
if (!$qry) {
$this->db->trans_rollback();
$this->sys_error_db("insert item", $this->db);;
exit;
}
$desc = "ADD {$v['itemName']} {$v['poQty']} {$v['itemUnitName']} {$v['WarehouseName']}";
$insertedID = $this->db->insert_id();
$jsonAfter = $this->getDataPoItemReceive($insertedID);
$this->insertLogPoItemReceive($insertedID, 'ADD', 0, '', $jsonAfter, $userId, $desc);
}
if (intval($v['cekID']) != 0) {
//update
$jsonBefore = $this->getDataPoItemReceive($v['cekID']);
$sql = "UPDATE po_item_receive p
SET
PoItemReceiveQty = ?,
PoItemReceiveIsActive = 'Y',
PoItemReceiveUpdate = NOW(),
PoItemReceiveUpdatedUserID = ?,
PoItemReceiveWarehouseID = ?,
PoItemReceiveItemUnitID = ?,
PoItemReceivePrice = ?
WHERE PoItemReceiveID = ?";
$qry = $this->db->query($sql, [
$v['poQty'],
$userId,
$v['warehouseID'],
$v['itemUnitID'],
$v['price'],
$v['cekID']
]);
if (!$qry) {
$this->db->trans_rollback();
$this->sys_error_db("update item ", $this->db);;
exit;
}
$desc = [];
if ($jsonBefore['WarehouseID'] != $jsonBefore['WarehouseID']) {
$desc[] = "- UPDATE {$v['itemName']} berubah warehouse dari {$jsonBefore['WarehouseName']} menjadi {$jsonAfter['WarehouseName']}";
}
if ($jsonBefore['PoItemReceiveItemUnitID'] != $jsonBefore['PoItemReceiveItemUnitID']) {
$desc[] = "- UPDATE {$v['itemName']} berubah unit item dari {$jsonBefore['ItemUnitName']} menjadi {$jsonAfter['ItemUnitName']}";
}
if ($jsonBefore['PoItemReceiveQty'] != $jsonBefore['PoItemReceiveQty']) {
$desc[] = "- UPDATE {$v['itemName']} berubah jumlah dari {$jsonBefore['PoItemReceiveQty']} menjadi {$jsonAfter['PoItemReceiveQty']}";
}
if ($jsonBefore['PoItemReceivePrice'] != $jsonBefore['PoItemReceivePrice']) {
$desc[] = "- UPDATE {$v['itemName']} berubah harga dari {$jsonBefore['PoItemReceivePrice']} menjadi {$jsonAfter['PoItemReceivePrice']}";
}
$insertedID = $this->db->insert_id();
$jsonAfter = $this->getDataPoItemReceive($v['cekID']);
$this->insertLogPoItemReceive(
$v['cekID'],
'UPDATE',
0,
$jsonBefore,
$jsonAfter,
$userId,
implode("\n", $desc)
);
}
}
}
$this->db->trans_commit();
$this->sys_ok([
'header' => $dataPo,
'detail' => $dataDetail,
]);
}
public function getDataReceiveOrderPO($id)
{
$sql = "SELECT * FROM
receive_order_po
WHERE ReceiveOrderPoID = ?";
$qry = $this->db->query($sql, [$id]);
if (!$qry) {
$this->db->trans_rollback();
$this->sys_error_db("Error getDataReceiveOrderPO ", $this->db);;
exit;
}
$header = $qry->row_array();
$sql = "SELECT * FROM
receive_order_po_detail
WHERE ReceiveOrderPoDetailReceiveOrderPoID = ?
AND ReceiveOrderPoDetailIsActive";
$qry = $this->db->query($sql, [$id]);
if (!$qry) {
$this->db->trans_rollback();
$this->sys_error_db("Error getDataReceiveOrderPO detail", $this->db);;
exit;
}
$detail = $qry->row_array();
$header['details'] = $detail;
return $header;
}
public function getDataPoItemReceive($id)
{
$sql = "SELECT * FROM
po_item_receive
JOIN warehouse ON PoItemReceiveWarehouseID= WarehouseID
JOIN itemunit ON PoItemReceiveItemUnitID = ItemUnitID
WHERE PoItemReceiveID = ?";
$qry = $this->db->query($sql, [$id]);
if (!$qry) {
$this->db->trans_rollback();
$this->sys_error_db("Error getDataPoItemReceive ", $this->db);;
exit;
}
return $qry->row_array();
}
function insertLogReceiveOrderPo($id, $type, $dataBefore, $dataAfter, $userID, $desc = '')
{
// Query untuk menyisipkan log ke dalam tabel purchase_order_log
$sql = "INSERT INTO acc_one_log.receive_order_po_log (
ReceiveOrderPoLogReceiveOrderPoID,
ReceiveOrderPoLogType,
ReceiveOrderPoLogDesc,
ReceiveOrderPoLogJsonBefore,
ReceiveOrderPoLogJsonAfter,
ReceiveOrderPoLogUserID,
ReceiveOrderPoLogCreated
) VALUES (
?, ?, ?, ?, ?, ?, NOW()
)";
// Eksekusi query dengan parameter yang diberikan
$exec = $this->db->query($sql, [
$id,
$type,
$desc,
$dataBefore != '' ? json_encode($dataBefore) : '',
$dataAfter != '' ? json_encode($dataAfter) : "",
$userID
]);
// Jika query gagal, lempar error
if (!$exec) {
$this->sys_error_db("Error inserting log into insert LogReceiveOrderPo", $this->db);
$this->db->trans_rollback();
exit;
}
}
function insertLogPoItemReceive($id, $type, $roID, $dataBefore, $dataAfter, $userID, $desc = '')
{
// Query untuk menyisipkan log ke dalam tabel purchase_order_log
$sql = "INSERT INTO acc_one_log.po_item_receive_log (
PoItemReceiveLogPoItemReceiveID,
PoItemReceiveLogReceiveOrderPoID,
PoItemReceiveLogType,
PoItemReceiveLogDesc,
PoItemReceiveLogJsonBefore,
PoItemReceiveLogJsonAfter,
PoItemReceiveLogUserID,
PoItemReceiveLogCreated
) VALUES (
?, ?, ?, ?, ?, ?, ?, NOW()
)";
// Eksekusi query dengan parameter yang diberikan
$exec = $this->db->query($sql, [
$id,
$roID,
$type,
$desc,
$dataBefore != '' ? json_encode($dataBefore) : '',
$dataAfter != '' ? json_encode($dataAfter) : "",
$userID
]);
// Jika query gagal, lempar error
if (!$exec) {
$this->sys_error_db("Error inserting log into po_item_receive_log", $this->db);
$this->db->trans_rollback();
exit;
}
}
function insertUserActivty($id, $type, $userID, $desc = '')
{
// Query untuk menyisipkan log ke dalam tabel purchase_order_log
$sql = "INSERT INTO user_activity (
UserActivityCode,
UserActivityStatus,
UserActivityDescription,
UserActivityRefID,
UserActivityUserID,
UserActivityCreated
) VALUES (
?, ?, ?, ?, ?, NOW()
)";
// Eksekusi query dengan parameter yang diberikan
$exec = $this->db->query($sql, [
'RO',
$type,
$desc,
$id,
$userID
]);
// Jika query gagal, lempar error
if (!$exec) {
$this->sys_error_db("Error inserting user activity", $this->db);
$this->db->trans_rollback();
exit;
}
}
public function generateItemPoOld()
{
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$prm = $this->sys_input;
$userId = $this->sys_user["M_UserID"];
$POID = $prm["id"];
$regionalId = $prm["regionalId"];
if (!isset($prm['id'])) {
$this->sys_error("Missing required parameters");
return;
}
$sql = "SELECT * FROM purchase_order WHERE PurchaseOrderID = ?";
$qry = $this->db->query($sql, [$POID]);
if (!$qry) {
$this->db->trans_rollback();
$this->sys_error_db("get PO ", $this->db);;
exit;
}
$dataPo = $qry->row_array();
// print_r($dataPo);
if ($dataPo['PurchaseOrderStatus'] != 'Approved') {
$this->sys_error("Status Po tidak approved");
return;
}
if ($dataPo['PurchaseOrderWarehouseType'] == 'Single') {
$sql = "UPDATE po_item_receive p
JOIN purchase_order_summary pos ON p.PoItemReceivePurchaseOrderSummaryID = pos.PurchaseOrderSummaryID
SET p.PoItemReceiveQty = pos.PurchaseOrderSummaryQty,
p.PoItemReceiveIsActive = 'Y',
p.PoItemReceiveUpdate = NOW(),
p.PoItemReceiveUpdatedUserID = ?,
p.PoItemReceiveWarehouseID = ?,
p.PoItemReceiveItemUnitID = pos.PurchaseOrderSummaryItemUnitID,
p.PoItemReceivePrice = pos.PurchaseOrderSummaryPrice
WHERE p.PoItemReceivePurchaseOrderID = ?
AND p.PoItemReceiveItemID = pos.PurchaseOrderSummaryItemID
AND p.PoItemReceiveQtyReceived = 0";
$qry = $this->db->query($sql, [$userId, $dataPo['PurchaseOrderWarehouseID'], $POID]);
if (!$qry) {
$this->db->trans_rollback();
$this->sys_error_db("update item ", $this->db);;
exit;
}
$sql = "INSERT INTO po_item_receive (
PoItemReceivePurchaseOrderID,
PoItemReceivePurchaseOrderSummaryID,
PoItemReceivePurchaseOrderDetailID,
PoItemReceiveWarehouseID,
PoItemReceiveItemID,
PoItemReceiveItemUnitID,
PoItemReceiveQty,
PoItemReceiveQtyReceived,
PoItemReceiveIsActive,
PoItemReceiveCreated,
PoItemReceiveCreatedUserID,
PoItemReceivePrice
)
SELECT
{$POID},
pos.PurchaseOrderSummaryID,
NULL, -- Tidak ada detail, karena diambil dari summary
{$dataPo['PurchaseOrderWarehouseID']},
pos.PurchaseOrderSummaryItemID,
pos.PurchaseOrderSummaryItemUnitID,
pos.PurchaseOrderSummaryQty,
0, -- Awalnya belum diterima
'Y',
NOW(),
{$userId},
pos.PurchaseOrderSummaryPrice
FROM purchase_order_summary pos
WHERE pos.PurchaseOrderSummaryPurchaseOrderID = {$POID}
AND pos.PurchaseOrderSummaryIsActive = 'Y'
AND NOT EXISTS (
SELECT 1 FROM po_item_receive p
WHERE p.PoItemReceivePurchaseOrderID = {$POID}
AND p.PoItemReceiveItemID = pos.PurchaseOrderSummaryItemID
)";
$qry = $this->db->query($sql, []);
if (!$qry) {
$this->db->trans_rollback();
$this->sys_error_db("insert item", $this->db);;
exit;
}
}
if ($dataPo['PurchaseOrderWarehouseType'] == 'Multiple') {
$sql = "UPDATE po_item_receive p
JOIN purchase_order_detail pod ON p.PoItemReceivePurchaseOrderDetailID = pod.PurchaseOrderDetailID
JOIN purchase_order_summary pos ON pod.PurchaseOrderDetailPurchaseSummaryID = pos.PurchaseOrderSummaryID
SET
p.PoItemReceiveQty = ConvertQuantityToPurchasedItemUnit(pod.PurchaseOrderDetailItemID, pod.PurchaseOrderDetailItemUnitID, pod.PurchaseOrderDetailQty),
p.PoItemReceiveIsActive = 'Y',
p.PoItemReceiveUpdate = NOW(),
p.PoItemReceiveUpdatedUserID = {$userId},
p.PoItemReceiveWarehouseID = pod.PurchaseOrderDetailWarehouseID,
p.PoItemReceiveItemUnitID = pos.PurchaseOrderSummaryItemUnitID,
p.PoItemReceivePrice = pos.PurchaseOrderSummaryPrice
WHERE p.PoItemReceivePurchaseOrderID = {$POID}
AND p.PoItemReceivePurchaseOrderSummaryID = pos.PurchaseOrderSummaryID
AND p.PoItemReceivePurchaseOrderDetailID = pod.PurchaseOrderDetailID
AND p.PoItemReceiveItemID = pod.PurchaseOrderDetailitemID
AND p.PoItemReceiveQtyReceived = 0";
$qry = $this->db->query($sql, []);
if (!$qry) {
$this->db->trans_rollback();
$this->sys_error_db("update item ", $this->db);;
exit;
}
$sql = "INSERT INTO po_item_receive (
PoItemReceivePurchaseOrderID,
PoItemReceivePurchaseOrderSummaryID,
PoItemReceivePurchaseOrderDetailID,
PoItemReceiveWarehouseID,
PoItemReceiveItemID,
PoItemReceiveItemUnitID,
PoItemReceiveQty,
PoItemReceiveQtyReceived,
PoItemReceiveIsActive,
PoItemReceiveCreated,
PoItemReceiveCreatedUserID,
PoItemReceivePrice
)
SELECT
{$POID},
pod.PurchaseOrderDetailPurchaseSummaryID,
pod.PurchaseOrderDetailID,
pod.PurchaseOrderDetailWarehouseID,
pod.PurchaseOrderDetailItemID,
pos.PurchaseOrderSummaryItemUnitID,
ConvertQuantityToPurchasedItemUnit(pod.PurchaseOrderDetailItemID, pod.PurchaseOrderDetailItemUnitID, pod.PurchaseOrderDetailQty),
0, -- Awalnya belum diterima
'Y',
NOW(),
{$userId},
pos.PurchaseOrderSummaryPrice
FROM purchase_order_detail pod
JOIN purchase_order_summary pos
ON pod.PurchaseOrderDetailPurchaseSummaryID = pos.PurchaseOrderSummaryID
WHERE pod.PurchaseOrderDetailPurchaseOrderID = {$POID}
AND pod.PurchaseOrderDetailIsActive = 'Y'
AND NOT EXISTS (
SELECT 1 FROM po_item_receive p
WHERE p.PoItemReceivePurchaseOrderID = {$POID}
AND p.PoItemReceiveItemID = pod.PurchaseOrderDetailItemID
AND p.PoItemReceivePurchaseOrderSummaryID = pos.PurchaseOrderSummaryID
AND p.PoItemReceivePurchaseOrderDetailID = pod.PurchaseOrderDetailID
);";
$qry = $this->db->query($sql, []);
if (!$qry) {
$this->db->trans_rollback();
$this->sys_error_db("insert item", $this->db);;
exit;
}
}
}
}