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

3227 lines
140 KiB
PHP

<?php
class ReceiveItemPoInventaris extends MY_Controller
{
var $db;
public function index()
{
echo "Receive Item API versi";
}
public function __construct()
{
parent::__construct();
}
## QUERY ##
function getSupplier()
{
try {
if (!$this->isLogin) {
$this->sys_error("invalid token");
exit;
}
$payload = $this->sys_input;
$search = $payload['search'] . '%';
$sql = "SELECT
SupplierID,
SupplierCode,
SupplierName
FROM supplier
WHERE SupplierIsActive = 'Y'
AND SupplierName LIKE ?
ORDER BY SupplierName ASC ";
$que = $this->db->query($sql, [$search]);
if (!$que) {
$this->sys_error_db("[Error] query listing supplier");;
exit;
}
$data = $que->result_array();
$this->sys_ok($data);
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
function getRuangan()
{
try {
if (!$this->isLogin) {
$this->sys_error("invalid token");
exit;
}
$payload = $this->sys_input;
$user = $this->sys_user;
$search = $payload['search'] . '%';
$sql = "SELECT M_RuanganID,
M_RuanganM_BranchID,
M_RuanganName,
M_RuanganCode
FROM m_ruangan
WHERE M_RuanganIsActive = 'Y'
AND M_RuanganM_BranchID = ?
AND M_RuanganName LIKE ?
ORDER BY M_RuanganName ASC";
$qry = $this->db->query($sql, [$user['M_BranchID'], $search]);
if (!$qry) {
$this->sys_error_db("[Error] query listing ruangan");;
exit;
}
$data = $qry->result_array();
$this->sys_ok($data);
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
function getInventarisBelumSerah()
{
try {
if (!$this->isLogin) {
throw new Exception('invalid token');
}
$para = $this->sys_input;
$sql = "SELECT
rod.ReceiveOrderPoDetailID,
rod.ReceiveOrderPoItemID,
rod.ReceiveOrderPoItemUnitID,
mi.M_ItemDesc,
rod.ReceiveOrderPoDetailQty AS originalQty,
COALESCE(ahd_count.InsertedQty, 0) AS serahQty,
rod.ReceiveOrderPoDetailQty - COALESCE(ahd_count.InsertedQty, 0) AS sisaQty,
CASE
WHEN COALESCE(ahd_count.InsertedQty, 0) = rod.ReceiveOrderPoDetailQty THEN 'Y'
ELSE 'N'
END AS isHandoverDone
FROM receive_order_po_detail rod
JOIN m_item mi ON mi.M_ItemID = rod.ReceiveOrderPoItemID
LEFT JOIN (
SELECT
AssetHandoverDetailReceiveOrderPoDetailID,
COUNT(*) AS InsertedQty
FROM asset_handover_detail ahd
JOIN asset_handover ah ON ahd.AssetHandoverDetailAssetHandoverID = ah.AssetHandoverID
AND ah.AssetHandoverIsActive = 'Y'
WHERE ahd.AssetHandoverDetailIsActive = 'Y'
AND ah.AssetHandoverReceiveOrderPoID = ?
GROUP BY AssetHandoverDetailReceiveOrderPoDetailID
) ahd_count ON ahd_count.AssetHandoverDetailReceiveOrderPoDetailID = rod.ReceiveOrderPoDetailID
WHERE rod.ReceiveOrderPoDetailReceiveOrderPoID = ?
AND rod.ReceiveOrderPoDetailIsActive = 'Y'";
$que = $this->db->query($sql, [$para['ROID'], $para['ROID']]);
if (!$que) {
throw new Exception('listing inventory belum yg diserah terima', 1);
}
$data = $que->result_array();
$this->sys_ok($data);
} catch (Exception $e) {
$message = $e->getMessage();
$code = $e->getCode();
if ($code == 1) {
$this->sys_error_db("[Error] " . $message);
} else {
$this->sys_error("[Error] " . $message);
}
exit;
}
}
function getPurchaseOrder()
{
try {
if (!$this->isLogin) {
$this->sys_error("invalid token");
exit;
}
$payload = $this->sys_input;
$user = $this->sys_user;
$const_params = [
$user['M_BranchID'] ?? 0,
$user['S_RegionalID'],
$payload['SupplierID'],
$payload['search'] . '%'
];
$placeholders = '?';
$list_includeID = ["0"];
$localPO_deleted = $payload['localPO_deleted'];
if (sizeof($localPO_deleted) > 0) {
$placeholders = implode(", ", array_fill(0, count($localPO_deleted), '?'));
$list_includeID = $payload['localPO_deleted'];
}
$params = array_merge($list_includeID, $const_params);
$sql = "SELECT
GROUP_CONCAT(DISTINCT PurchaseOrderDetailWarehouseID) AS arrWarehouse,
purchase_order.*
FROM purchase_order
JOIN purchase_order_detail ON PurchaseOrderID = PurchaseOrderDetailPurchaseOrderID
AND PurchaseOrderDetailIsActive = 'Y'
AND
((SELECT IFNULL(SUM(PoItemReceiveQty - PoItemReceiveQtyReceived), 0)
FROM po_item_receive
WHERE PoItemReceivePurchaseOrderID = PurchaseOrderID) > 0)
OR
(SELECT PoItemReceiveID
FROM po_item_receive
WHERE PoItemReceivePurchaseOrderID = PurchaseOrderID
AND PoItemReceiveID IN ({$placeholders}))
JOIN warehouse ON PurchaseOrderDetailWarehouseID = WarehouseID
AND WarehouseM_BranchID = ?
WHERE WarehouseS_RegionalID = ?
AND PurchaseOrderSupplierID = ?
AND PurchaseOrderStatus = 'Approved'
AND PurchaseOrderItemCategoryID = 2
AND PurchaseOrderNumber LIKE ?
AND PurchaseOrderIsActive = 'Y'
GROUP BY PurchaseOrderID
ORDER BY PurchaseOrderID DESC LIMIT 50";
$que = $this->db->query($sql, $params);
if (!$que) {
$this->sys_error_db("[Error] query purhcase order");
exit;
}
$data = $que->result_array();
$this->sys_ok($data);
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
function getWarehouse()
{
try {
if (!$this->isLogin) {
$this->sys_error("invalid token");
exit;
}
$user = $this->sys_user;
$whtype = ($user['M_UserLocationFlag'] == 'R') ? 'R' : 'B';
$sql = "SELECT
WarehouseID,
WarehouseCode,
CASE
WHEN WarehouseType = 'B' THEN CONCAT(WarehouseCode,' ', WarehouseName, ' - ', M_BranchName)
WHEN WarehouseType = 'R' THEN CONCAT(WarehouseCode,' ', WarehouseName, ' - ', S_RegionalName)
ELSE ''
END WarehouseName,
WarehouseType,
WarehouseIsDefault,
WarehouseS_RegionalID,
WarehouseM_BranchID,
S_RegionalID,
S_RegionalName
FROM warehouse
JOIN s_regional ON WarehouseS_RegionalID = S_RegionalID AND S_RegionalIsActive = 'Y'
LEFT JOIN m_branch ON WarehouseM_BranchID = M_BranchID AND M_BranchIsActive = 'Y'
WHERE WarehouseS_RegionalID = ?
AND WarehouseIsActive = 'Y' AND WarehouseIsTransit = 'N'
AND WarehouseType = ? AND WarehouseM_BranchID = ?
ORDER BY WarehouseName ASC";
$que = $this->db->query($sql, [
$user['S_RegionalID'],
$whtype,
$user['M_BranchID']
]);
if (!$que) {
$this->sys_error_db("[Error] get list warehouse");
exit;
}
$data = $que->result_array();
$this->sys_ok($data);
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
function getItem()
{
try {
if (!$this->isLogin) {
$this->sys_error("invalid token");
exit;
}
$param = $this->sys_input;
$user = $this->sys_user;
$POID = $param['POID'];
$warehouseID = $param['WarehouseID'];
$sql = "SELECT
CONCAT(PoItemReceiveID,',','-') as keyID,
PoItemReceiveID,
PurchaseOrderNumber,
PurchaseOrderShippingCost,
PurchaseOrderShippingCostStatus,
PoItemReceivePurchaseOrderID,
PoItemReceivePurchaseOrderSummaryID,
PoItemReceivePurchaseOrderDetailID,
WarehouseID,
WarehouseCode,
CASE
WHEN WarehouseType = 'B'
THEN CONCAT(WarehouseCode,' ', WarehouseName, ' - ', M_BranchName)
WHEN WarehouseType = 'R'
THEN CONCAT(WarehouseCode,' ', WarehouseName, ' - ', S_RegionalName)
ELSE ''
END WarehouseName,
M_ItemID,
M_ItemCode,
M_ItemDesc,
ItemUnitID,
ItemUnitName,
M_ItemItem_CategoryID,
PoItemReceiveQty as originalQty,
PoItemReceiveQtyReceived as receivedQty,
0 as qty,
PoItemReceiveQty - PoItemReceiveQtyReceived AS qtyRest,
PoItemReceivePrice,
'N' as alreadySave
FROM po_item_receive
JOIN purchase_order ON PoItemReceivePurchaseOrderID = PurchaseOrderID
AND PurchaseOrderIsActive = 'Y'
AND PoItemReceiveIsActive = 'Y'
JOIN warehouse ON PoItemReceiveWarehouseID = WarehouseID
AND WarehouseIsActive = 'Y'
JOIN m_item ON PoItemReceiveItemID = M_ItemID
JOIN itemunit ON PoItemReceiveItemUnitID= ItemUnitID
JOIN s_regional ON WarehouseS_RegionalID = S_RegionalID
LEFT JOIN m_branch ON WarehouseM_BranchID = M_BranchID
WHERE PurchaseOrderID = ? AND WarehouseID = ?";
$que = $this->db->query($sql, [$POID, $warehouseID]);
if (!$que) {
$this->sys_error_db("[Error] ger item PO");;
exit;
}
$data = $que->result_array();
foreach ($data as $key => $value) {
$data[$key]['batchlist'] = [];
}
$this->sys_ok($data);
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
function getItemUpdate()
{
try {
if (!$this->isLogin) {
$this->sys_error("invalid token");
exit;
}
$param = $this->sys_input;
$ROID = $param['ROID'];
$sql = "SELECT
ReceiveOrderPoDetailID,
CONCAT(ReceiveOrderPoDetailPoItemReceiveID,',',ReceiveOrderPoDetailID) AS keyID,
ReceiveOrderPoDetailPoItemReceiveID AS PoItemReceiveID,
PurchaseOrderNumber,
PurchaseOrderShippingCost,
PurchaseOrderShippingCostStatus,
ReceiveOrderPoDetailPurchaseOrderID AS PoItemReceivePurchaseOrderID,
ReceiveOrderPoDetailPurchaseOrderSummaryID AS PoItemReceivePurchaseOrderSummaryID,
ReceiveOrderPoDetailPurchaseOrderDetailID AS PoItemReceivePurchaseOrderDetailID,
WarehouseID,
WarehouseCode,
CASE
WHEN WarehouseType = 'B'
THEN CONCAT(WarehouseCode,' ', WarehouseName, ' - ', M_BranchName)
WHEN WarehouseType = 'R'
THEN CONCAT(WarehouseCode,' ', WarehouseName, ' - ', S_RegionalName)
ELSE ''
END WarehouseName,
M_RuanganID,
M_RuanganName,
M_RuanganCode,
M_ItemID,
M_ItemCode,
M_ItemDesc,
ItemUnitID,
ItemUnitName,
M_ItemItem_CategoryID,
PoItemReceiveQty AS originalQty,
PoItemReceiveQtyReceived AS receivedQty,
ReceiveOrderPoDetailQty AS qty,
ReceiveOrderPoDetailQty AS tmpQty,
PoItemReceiveQty - PurchaseOrderSummaryQtyReceived AS qtyRest,
ReceiveOrderPoDetailQty,
PoItemReceivePrice,
'Y' AS alreadySave,
ReceiveOrderPoDetailBatchNo AS batchNo,
ReceiveOrderPoDetailEd AS itemEd,
ReceiveOrderPoDetailBatchList
FROM receive_order_po_detail
JOIN receive_order_po ON ReceiveOrderPoDetailReceiveOrderPoID = ReceiveOrderPoID
JOIN purchase_order ON ReceiveOrderPoDetailPurchaseOrderID = PurchaseOrderID
JOIN po_item_receive ON ReceiveOrderPoDetailPoItemReceiveID = PoItemReceiveID
JOIN purchase_order_summary ON PurchaseOrderSummaryID = PoItemReceivePurchaseOrderSummaryID
JOIN warehouse ON ReceiveOrderPoWarehouseID = WarehouseID
JOIN m_item ON ReceiveOrderPoItemID = M_ItemID
JOIN itemunit ON ReceiveOrderPoItemUnitID = ItemUnitID
JOIN s_regional ON WarehouseS_RegionalID = S_RegionalID
LEFT JOIN m_branch ON WarehouseM_BranchID = M_BranchID
LEFT JOIN m_ruangan ON M_RuanganM_BranchID = M_BranchID
WHERE ReceiveOrderPoDetailIsActive = 'Y'
AND ReceiveOrderPoDetailReceiveOrderPoID = ?
ORDER BY ReceiveOrderPoDetailID ASC";
$que = $this->db->query($sql, [$ROID]);
if (!$que) {
$this->sys_error_db("[Error] get item untuk update");
exit;
}
$data = $que->result_array();
foreach ($data as $key => $item) {
$jsonstr = $item['ReceiveOrderPoDetailBatchList'];
$batchlist = [];
if (!empty($jsonstr)) {
$decode = json_decode($jsonstr);
if ($decode !== null && json_last_error() === JSON_ERROR_NONE) {
$batchlist = $decode;
} else {
$this->sys_error("[Error] decode json batch list item received");
exit;
}
$data[$key]['batchlist'] = $batchlist;
unset($data[$key]['ReceiveOrderPoDetailBatchList']);
}
}
$detailID = array_column($data, 'ReceiveOrderPoDetailID');
$placeholders = implode(", ", array_fill(0, count($detailID), '?'));
$sqlInspeksi = "SELECT
ReceiveOrderPoInspeksiID,
ReceiveOrderPoInspeksiReceiveOrderPoDetailID,
ReceiveOrderPoInspeksiQtyPesan AS qty_po,
ReceiveOrderPoInspeksiQtyActual AS qty_ro,
ReceiveOrderPoInspeksiPricePesan AS price_po,
ReceiveOrderPoInspeksiPriceActual AS price_ro,
ReceiveOrderPoInspeksiDatePesan AS date_po,
ReceiveOrderPoInspeksiDateActual AS date_ro,
ReceiveOrderPoInspeksiExpireDate AS expire_date,
ReceiveOrderPoInspeksiKeadaanKemasan AS condt_kemasan,
ReceiveOrderPoInspeksiKeadaanKemasanNote AS catatan_kemasan,
ReceiveOrderPoInspeksiKondisiPengiriman AS condt_pengiriman,
ReceiveOrderPoInspeksiKondisiPengirimanNote AS catatan_kirim,
ReceiveOrderPoInspeksiSimpulan AS summary,
ReceiveOrderPoInspeksiCatatan AS catatan,
ReceiveOrderPoInspeksiStaffPenerimaID AS pemeriksa,
ReceiveOrderPoInspeksiPengirim AS pengirim
FROM receive_order_po_inspeksi
WHERE ReceiveOrderPoInspeksiIsActive = 'Y'
AND ReceiveOrderPoInspeksiReceiveOrderPoDetailID IN ({$placeholders})";
$queInspeksi = $this->db->query($sqlInspeksi, $detailID);
if (!$queInspeksi) {
$this->sys_error_db("[Error] get item inspeksi data");
exit;
}
$list_inspeksi = $queInspeksi->result_array();
$lookup_map = [];
foreach ($list_inspeksi as $inspeksi) {
$RODetailID = $inspeksi['ReceiveOrderPoInspeksiReceiveOrderPoDetailID'];
$lookup_map[$RODetailID] = $inspeksi;
}
$sql_barcode = "SELECT T_BarcodeBarangID,
T_BarcodeBarangReceiveOrderPoDetailID,
T_BarcodeBarangM_ItemID
FROM t_barcode_barang
WHERE T_BarcodeBarangIsActive = 'Y'
AND T_BarcodeBarangReceiveOrderPoDetailID IN ($placeholders)";
$qry_barcode = $this->db->query($sql_barcode, $detailID);
if (!$qry_barcode) {
$this->sys_error_db("[Error] get item barcode data");
exit;
}
$list_barcode = $qry_barcode->result_array();
$lookup_map_barcode = [];
foreach ($list_barcode as $barcode) {
$RODetailID = $barcode['T_BarcodeBarangReceiveOrderPoDetailID'];
$lookup_map_barcode[$RODetailID][] = $barcode;
}
$result = [];
foreach ($data as $rodetail) {
$rodetailID = $rodetail['ReceiveOrderPoDetailID'];
// gabung inspeksi
if (isset($lookup_map[$rodetailID])) {
$rodetail['inspeksi_item'] = $lookup_map[$rodetailID];
}
// gabung barcode
if (isset($lookup_map_barcode[$rodetailID])) {
$rodetail['barcode_item'] = $lookup_map_barcode[$rodetailID];
}
$result[] = $rodetail;
}
$this->sys_ok($result);
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
function searchRO()
{
try {
if (!$this->isLogin) {
$this->sys_error("invalid token");
exit;
}
$param = $this->sys_input;
$user = $this->sys_user;
$search = $param['search'] . '%';
$startdate = $param['startdate'];
$enddate = $param['enddate'];
$regID = $user['S_RegionalID'];
$brnCD = $user['M_BranchCode'] . '%';
$page = 0;
$limit = 15;
if ($param['page'] > 0) {
$page = ($param['page'] - 1) * $limit;
}
$sql = "SELECT
ReceiveOrderPoNumber,
ReceiveOrderPoID,
ReceiveOrderPoSupplierID,
ReceiveOrderPoIDate,
ReceiveOrderShippingCostAmount,
ReceiveOrderPoNote,
ReceiveOrderPoRefNumber,
ReceiveOrderPoDONumber,
ReceiveOrderPoIsHandover,
SupplierID,
SupplierName,
WarehouseID,
WarehouseCode,
CASE
WHEN WarehouseType = 'B'
THEN CONCAT(WarehouseCode,' ', WarehouseName, ' - ', M_BranchName)
WHEN WarehouseType = 'R'
THEN CONCAT(WarehouseCode,' ', WarehouseName, ' - ', S_RegionalName)
ELSE ''
END WarehouseName,
ReceiveOrderPoConfirmed,
DATE_FORMAT(ReceiveOrderPoConfirmedDate, '%d-%m-%Y %H:%i') AS ReceiveOrderPoConfirmedDate,
M_UserUsername AS ReceiveOrderPoConfirmedUserName
FROM receive_order_po
JOIN warehouse ON ReceiveOrderPoWarehouseID = WarehouseID
JOIN supplier ON ReceiveOrderPoSupplierID = SupplierID
JOIN s_regional ON WarehouseS_RegionalID = S_RegionalID
AND S_RegionalIsActive = 'Y'
LEFT JOIN m_branch ON WarehouseM_BranchID = M_BranchID
AND M_BranchIsActive = 'Y'
LEFT JOIN m_user ON ReceiveOrderPoConfirmedUserID = M_UserID
WHERE ReceiveOrderPoIsActive = 'Y'
AND (ReceiveOrderPoNumber LIKE ? OR ReceiveOrderPoDONumber LIKE ?)
AND ReceiveOrderPoIDate BETWEEN DATE(?) AND DATE(?)
AND ReceiveOrderPoS_RegionalID = ?
AND ReceiveOrderPoM_BranchCode LIKE ?
AND ReceiveOrderPoID NOT IN (
SELECT DISTINCT ReceiveOrderPoDetailReceiveOrderPoID
FROM receive_order_po_detail
JOIN purchase_order ON ReceiveOrderPoDetailPurchaseOrderID = PurchaseOrderID
WHERE PurchaseOrderItemCategoryID IN (1,3,4)
AND ReceiveOrderPoDetailIsActive = 'Y'
)
ORDER BY ReceiveOrderPoID DESC";
$sqltotal = "SELECT COUNT(*) as total FROM ($sql) as x";
$quetotal = $this->db->query($sqltotal, [$search, $search, $startdate, $enddate, $regID, $brnCD]);
if (!$quetotal) {
$this->sys_error_db("[Error] get total data RO");
exit;
}
$total = $quetotal->row_array()['total'];
$sqldata = $sql . " LIMIT ? OFFSET ?";
$quedata = $this->db->query($sqldata, [
$search,
$search,
$startdate,
$enddate,
$regID,
$brnCD,
$limit,
$page
]);
if (!$quedata) {
$this->sys_error_db("[Error] get list data RO");
exit;
}
$records = $quedata->result_array();
foreach ($records as $key => $value) {
$sql = "SELECT
ReceiveOrderPoDocumentID,
ReceiveOrderPoDocumentDate,
ReceiveOrderPoDocumentFile
FROM receive_order_po_document
WHERE ReceiveOrderPoDocumentIsActive = 'Y'
AND ReceiveOrderPoDocumentReceiveOrderPoID = ?";
$qry = $this->db->query($sql, [$value['ReceiveOrderPoID']]);
if (!$qry) {
$this->sys_error_db("[Error] get document RO");
exit;
}
$rowsdata = $qry->result_array();
if (count($rowsdata) > 0) {
$records[$key]['hasDocuments'] = true;
$records[$key]['documents'] = $rowsdata;
} else {
$records[$key]['hasDocuments'] = false;
$records[$key]['documents'] = [];
}
}
$result = array(
"records" => $records,
"total" => ceil($total / $limit)
);
$this->sys_ok($result);
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
function getItemDataInspeksi()
{
try {
if (!$this->isLogin) {
$this->sys_error("invalid token");
exit;
}
$param = $this->sys_input;
$RODetailID = $param['RODetailID'];
$sql = "SELECT
ReceiveOrderPoInspeksiID,
ReceiveOrderPoInspeksiReceiveOrderPoDetailID,
ReceiveOrderPoInspeksiQtyPesan,
ReceiveOrderPoInspeksiQtyActual,
ReceiveOrderPoInspeksiPricePesan,
ReceiveOrderPoInspeksiPriceActual,
ReceiveOrderPoInspeksiDatePesan,
ReceiveOrderPoInspeksiDateActual,
ReceiveOrderPoInspeksiExpireDate,
ReceiveOrderPoInspeksiKeadaanKemasan,
ReceiveOrderPoInspeksiKondisiPengiriman,
ReceiveOrderPoInspeksiSimpulan,
ReceiveOrderPoInspeksiCatatan,
ReceiveOrderPoInspeksiStaffPenerima,
ReceiveOrderPoInspeksiStaffPengirim
FROM receive_order_po_inspeksi
WHERE ReceiveOrderPoInspeksiIsActive = 'Y'
AND ReceiveOrderPoInspeksiReceiveOrderPoDetailID = ?";
$que = $this->db->query($sql, [$RODetailID]);
if (!$que) {
$this->sys_error_db("[Error] get data inspeksi item");
exit;
}
$data = $que->row_array();
$this->sys_ok($data);
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
function getListStaff()
{
try {
if (!$this->isLogin) {
$this->sys_error("Invalid token");
exit;
}
$user = $this->sys_user;
$param = $this->sys_input;
if ($param['isSerahTerima'] == 'Y') {
$sql = "SELECT DISTINCT
u.M_UserID,
u.M_UserUsername
FROM receive_order_po ro
JOIN receive_order_po_detail rod ON rod.ReceiveOrderPoDetailReceiveOrderPoID = ro.ReceiveOrderPoID
AND rod.ReceiveOrderPoDetailIsActive = 'Y'
JOIN purchase_order_detail pod ON pod.PurchaseOrderDetailID = rod.ReceiveOrderPoDetailPurchaseOrderDetailID
AND pod.PurchaseOrderDetailIsActive = 'Y'
JOIN purchase_request pr ON pr.PurchaseRequestID = pod.PurchaseOrderDetailPurchaseRequestID
AND pr.PurchaseRequestIsActive = 'Y'
JOIN m_user u ON u.M_UserID = pr.PurchaseRequestRequestedBy
AND u.M_UserIsActive = 'Y'
WHERE ro.ReceiveOrderPoID = ?
AND ro.ReceiveOrderPoIsActive = 'Y'";
$que = $this->db->query($sql, [$param['ROID']]);
} else {
$sql = "SELECT
M_UserID,
M_UserUsername
FROM m_user
WHERE M_UserM_BranchID = ?
AND M_UserS_RegionalID = ?
AND M_UserIsActive = 'Y'
ORDER BY M_UserUsername";
$que = $this->db->query($sql, [$user['M_BranchID'], $user['S_RegionalID']]);
}
if (!$que) {
$this->sys_error_db("[Error] get staff");
exit;
}
$data = $que->result_array();
$this->sys_ok($data);
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
private function generateNoLogistik($user, $typeLogistik): string
{
$areaid = ($user['loginLevel'] == 'regional') ? $user['S_RegionalID'] : $user['M_BranchID'];
$areatype = ($user['loginLevel'] == 'regional') ? 'R' : 'B';
$sqlusrdivisi = "SELECT M_UserDivisionDivisionID FROM m_userdivision
WHERE M_UserDivisionM_UserID = ? AND M_UserDivisionIsActive = 'Y'";
$queusrdivisi = $this->db->query($sqlusrdivisi, [$user['M_UserID']]);
if (!$queusrdivisi) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] get user divisi");
exit;
}
$usrdivisiID = $queusrdivisi->row_array()['M_UserDivisionDivisionID'];
if (!isset($usrdivisiID)) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] user divisi id null");
exit;
}
$sqlnum = "SELECT `fn_penomoran`(?, ?, ?, ?, ?, ?) AS numpd;";
$quenum = $this->db->query($sqlnum, [$typeLogistik, $usrdivisiID, $areatype, $areaid, 'SM', 'Y']);
if (!$quenum) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] generate number PI");
exit;
}
$numPL = $quenum->row_array()['numpd'];
if (!isset($numPL)) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] number PI null");
exit;
}
return $numPL;
}
private function generateNoBarcode($user, $lokasiID, $typeBarcode, $itemid)
{
$branchid = ($user['loginLevel'] == 'branch') ? $user['M_BranchID'] : 0;
if ($user['loginlevel'] == 'regional') {
$this->db->trans_rollback();
$this->sys_error('Tidak bisa generare No Barcode, anda login sebagai regional');
exit;
}
// -- numtype = tipe numbering
// -- itemid = id item inventaris/asset
// -- branchid = id cabang
// -- ruanganid = id ruangan di cabang
$sqlnum = "SELECT `fn_num_nonpersediaan`(?, ?, ?, ?) AS numpd;";
$quenum = $this->db->query($sqlnum, [$typeBarcode, $itemid, $branchid, $lokasiID]);
if (!$quenum) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] generate number Barcode");
exit;
}
$numPL = $quenum->row_array()['numpd'];
if (!isset($numPL)) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] number Barcode null");
exit;
}
return $numPL;
}
private function getPOItemReceived($id)
{
$sql = "SELECT * FROM po_item_receive
JOIN warehouse ON PoItemReceiveWarehouseID= WarehouseID
JOIN itemunit ON PoItemReceiveItemUnitID = ItemUnitID
WHERE PoItemReceiveID = ?";
$que = $this->db->query($sql, [$id]);
if (!$que) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] getDataPoItemReceive");;
exit;
}
return $que->row_array();
}
private function getDataROPO($id)
{
$sql = "SELECT * FROM receive_order_po WHERE ReceiveOrderPoID = ?";
$que = $this->db->query($sql, [$id]);
if (!$que) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] getDataReceiveOrderPO ");;
exit;
}
$ROheader = $que->row_array();
$sqldetail = "SELECT * FROM receive_order_po_detail
WHERE ReceiveOrderPoDetailReceiveOrderPoID = ? AND ReceiveOrderPoDetailIsActive = 'Y'";
$quedetail = $this->db->query($sqldetail, [$id]);
if (!$quedetail) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] getDataReceiveOrderPO detail");;
exit;
}
$ROdetail = $quedetail->result_array();
$ROheader['details'] = $ROdetail;
return $ROheader;
}
## MUTATION ##
function saveRO()
{
try {
if (!$this->isLogin) {
$this->sys_error("invalid token");
exit;
}
$this->db->trans_begin();
$param = $this->sys_input;
$user = $this->sys_user;
# generate nomor purchase invoice #
$numGR = $this->generateNoLogistik($user, 'GR');
# insert table ro #
$sqlInsRO = "INSERT INTO receive_order_po (
ReceiveOrderPoNumber,
ReceiveOrderPoSupplierID,
ReceiveOrderPoIDate,
ReceiveOrderPoWarehouseID,
ReceiveOrderPoM_BranchCode,
ReceiveOrderPoS_RegionalID,
ReceiveOrderShippingCostAmount,
ReceiveOrderShippingCostIsPaid,
ReceiveOrderPoNote,
ReceiveOrderPoRefNumber,
ReceiveOrderPoDONumber,
ReceiveOrderPoCreatedUserID
) VALUE (?,?,?,?,?,?,?,?,?,?,?,?)";
$queInsRO = $this->db->query($sqlInsRO, [
$numGR,
$param['supplierID'],
$param['date'],
$param['warehouseID'],
$user['M_BranchCode'],
$user['S_RegionalID'],
$param['shippingCost'],
$param['shippingIsPaid'],
$param['note'],
$param['refNumber'],
$param['refNumber'],
$user['M_UserID']
]);
if (!$queInsRO) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] insert into table receive order po");
exit;
}
$roID = $this->db->insert_id();
# inset to table ro detail #
$logDesc = [];
foreach ($param['detail'] as $key => $obj) {
$sqlRcvdItem = "SELECT * FROM po_item_receive WHERE PoItemReceiveID = ?";
$queRcvdItem = $this->db->query($sqlRcvdItem, [$obj['PoItemReceiveID']]);
if (!$queRcvdItem) {
$this->db->trans_rollback();
$this->sys_error_db("Error cek data item po_item_receive");
exit;
}
$cekReceived = $queRcvdItem->row_array();
# cek item received #
if ($cekReceived['PoItemReceiveIsActive'] == 'N') {
$this->db->trans_rollback();
$this->sys_error("[Error] Item {$obj['M_ItemDesc']} sudah diterima");
exit;
}
if ($cekReceived['PoItemReceiveQtyReceived'] == $cekReceived['PoItemReceiveQty']) {
$this->db->trans_rollback();
$this->sys_error("[Error] Item {$obj['M_ItemDesc']} sudah diterima semuanya");
exit;
}
if (intval($obj['qty']) > intval($cekReceived['PoItemReceiveQty'])) {
$this->db->trans_rollback();
$this->sys_error("Jumlah item {$obj['M_ItemDesc']} yang tersedia sudah berubah silahkan ulangi pilih item");
exit;
}
$jsonBatch = "[]";
if (isset($obj['batchlist']) && is_array($obj['batchlist'])) {
$batchlist = $obj['batchlist'];
if (sizeof($batchlist) > 0) {
$json = json_encode($batchlist);
if ($json === false) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] encode json batch number");
exit;
} else {
$jsonBatch = $json;
}
}
}
$sqlInsRODetail = "INSERT INTO receive_order_po_detail (
ReceiveOrderPoDetailReceiveOrderPoID,
ReceiveOrderPoDetailPurchaseOrderID,
ReceiveOrderPoDetailPurchaseOrderSummaryID,
ReceiveOrderPoDetailPurchaseOrderDetailID,
ReceiveOrderPoDetailPoItemReceiveID,
ReceiveOrderPoDetailQty,
ReceiveOrderPoDetailPrice,
ReceiveOrderPoDetailTotal,
ReceiveOrderPoDetailCreatedUserID,
ReceiveOrderPoItemID,
ReceiveOrderPoItemUnitID,
ReceiveOrderPoDetailBatchNo,
ReceiveOrderPoDetailEd,
ReceiveOrderPoDetailBatchList
) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
$queInsRODetail = $this->db->query($sqlInsRODetail, [
$roID,
$obj['PoItemReceivePurchaseOrderID'],
$obj['PoItemReceivePurchaseOrderSummaryID'],
$obj['PoItemReceivePurchaseOrderDetailID'],
$obj['PoItemReceiveID'],
$obj['qty'],
$obj['PoItemReceivePrice'],
(doubleval($obj['PoItemReceivePrice']) * intval($obj['qty'])),
$user['M_UserID'],
$obj['M_ItemID'],
$obj['ItemUnitID'],
$obj['batchNo'],
$obj['itemEd'],
$jsonBatch
]);
if (!$queInsRODetail) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] receive order detail");
exit;
}
$logDesc[] = "- ADD {$obj['M_ItemDesc']} {$obj['qty']} {$obj['ItemUnitName']} nomor batch {$obj['WarehouseName']}";
$RODetailID = $this->db->insert_id();
# INSERT INTO receive_order_po_inspeksi #
$inspeksi = $obj['inspeksi_item'];
$sqlInspeksi = "INSERT INTO receive_order_po_inspeksi (
ReceiveOrderPoInspeksiReceiveOrderPoDetailID,
ReceiveOrderPoInspeksiQtyPesan,
ReceiveOrderPoInspeksiQtyActual,
ReceiveOrderPoInspeksiPricePesan,
ReceiveOrderPoInspeksiPriceActual,
ReceiveOrderPoInspeksiDatePesan,
ReceiveOrderPoInspeksiDateActual,
ReceiveOrderPoInspeksiKeadaanKemasan,
ReceiveOrderPoInspeksiKeadaanKemasanNote,
ReceiveOrderPoInspeksiKondisiPengiriman,
ReceiveOrderPoInspeksiKondisiPengirimanNote,
ReceiveOrderPoInspeksiSimpulan,
ReceiveOrderPoInspeksiCatatan,
ReceiveOrderPoInspeksiStaffPenerimaID,
ReceiveOrderPoInspeksiPengirim,
ReceiveOrderPoInspeksiUserID
) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
$queInspeksi = $this->db->query($sqlInspeksi, [
$RODetailID,
$inspeksi['qty_po'],
$inspeksi['qty_ro'],
$inspeksi['price_po'],
$inspeksi['price_ro'],
$inspeksi['date_po'],
$inspeksi['date_ro'],
$inspeksi['condt_kemasan'],
$inspeksi['catatan_kemasan'],
$inspeksi['condt_pengiriman'],
$inspeksi['catatan_kirim'],
$inspeksi['summary'],
$inspeksi['catatan'],
$inspeksi['pemeriksa'],
$inspeksi['pengirim'],
$user['M_UserID']
]);
if (!$queInspeksi) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] insert data inspeksi item");
exit;
}
# po item received && log item change #
$jsonBefore = $this->getPOItemReceived($obj['PoItemReceiveID']);
$sqlupd = "UPDATE po_item_receive SET
PoItemReceiveQtyReceived = ?,
PoItemReceiveUpdatedUserID = ?
WHERE PoItemReceiveID = ?";
$queupd = $this->db->query($sqlupd, [
(intval($cekReceived['PoItemReceiveQtyReceived']) + intval($obj['qty'])),
$user['M_UserID'],
$obj['PoItemReceiveID']
]);
if (!$queupd) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] update item receive");
exit;
}
$jsonAfter = $this->getPOItemReceived($obj['PoItemReceiveID']);
$desc = "Diterima {$obj['M_ItemDesc']} sejumlah {$obj['qty']} {$obj['ItemUnitName']} di RO nomor {$numGR} *RO belum di konfirmasi";
$this->insertLogPoItemReceive(
$obj['PoItemReceiveID'],
'UPDATE',
$roID,
$jsonBefore,
$jsonAfter,
$user['M_UserID'],
$desc
);
}
$dataROAfter = $this->getDataROPO($roID);
$this->insertLogReceiveOrderPo($roID, 'ADD', '', $dataROAfter, $user['M_UserID'], implode("\n", $logDesc));
$this->insertUserActivty($roID, 'RO', 'ADD', $user['M_UserID'], implode("\n", $logDesc));
$this->db->trans_commit();
$this->sys_ok("Berhasil terima barang dengan nomor {$numGR}");
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
function saveEditRO()
{
try {
if (!$this->isLogin) {
$this->sys_error("invalid token");
exit;
}
$this->db->trans_begin();
$param = $this->sys_input;
$user = $this->sys_user;
$sql_ro = "UPDATE receive_order_po SET
ReceiveOrderPoNumber = ?,
ReceiveOrderPoSupplierID = ?,
ReceiveOrderPoIDate = ?,
ReceiveOrderPoWarehouseID = ?,
ReceiveOrderPoM_BranchCode = ?,
ReceiveOrderPoS_RegionalID = ?,
ReceiveOrderShippingCostAmount = ?,
ReceiveOrderShippingCostIsPaid = ?,
ReceiveOrderPoNote = ?,
ReceiveOrderPoRefNumber = ?,
ReceiveOrderPoDONumber = ?
WHERE ReceiveOrderPoID = ?";
$que_ro = $this->db->query($sql_ro, [
$param['numGR'],
$param['supplierID'],
$param['date'],
$param['warehouseID'],
$user['M_BranchCode'],
$user['S_RegionalID'],
$param['shippingCost'],
$param['shippingIsPaid'],
$param['note'],
$param['refNumber'],
$param['refNumber'],
$param['ReceiveOrderID']
]);
if (!$que_ro) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] insert into table receive order po");
exit;
}
# CHECK IF DETAIL ALREADY IN TABLE RECEIVE #
$sql_check_ro = "SELECT ReceiveOrderPoDetailID, ReceiveOrderPoDetailPoItemReceiveID
FROM receive_order_po_detail
WHERE ReceiveOrderPoDetailReceiveOrderPoID = ?
AND ReceiveOrderPoDetailIsActive = 'Y'";
$que_check_ro = $this->db->query($sql_check_ro, [$param['ReceiveOrderID']]);
if (!$que_check_ro) {
$this->db->trans_rollback();
$this->sys_error("[Error] get list ro detail id");
exit;
}
$list_detailID = $que_check_ro->result_array();
$master_detailID = array_column($list_detailID, 'ReceiveOrderPoDetailID');
$input_detailID = array_column($param['detail'], 'ReceiveOrderPoDetailID');
$update = [];
$insert = [];
$delete = [];
foreach ($param['detail'] as $key => $obj) {
if (empty($obj['ReceiveOrderPoDetailID'])) {
$insert[] = $obj;
continue;
}
if (in_array($obj['ReceiveOrderPoDetailID'], $master_detailID)) {
$update[] = $obj;
}
}
foreach ($list_detailID as $key => $obj) {
if (!in_array($obj['ReceiveOrderPoDetailID'], $input_detailID)) {
$delete[] = $obj;
}
}
# UPDATE #
foreach ($update as $key => $obj) {
# cek item received #
$sqlRcvdItem = "SELECT * FROM po_item_receive WHERE PoItemReceiveID = ?";
$queRcvdItem = $this->db->query($sqlRcvdItem, [$obj['PoItemReceiveID']]);
if (!$queRcvdItem) {
$this->db->trans_rollback();
$this->sys_error_db("Error cek data item po_item_receive");
exit;
}
$cekReceived = $queRcvdItem->row_array();
if ($cekReceived['PoItemReceiveIsActive'] == 'N') {
$this->db->trans_rollback();
$this->sys_error("[Error] Item {$obj['M_ItemDesc']} tidak aktif");
exit;
}
if (intval($obj['qty']) > intval($cekReceived['PoItemReceiveQty'])) {
$this->db->trans_rollback();
$this->sys_error("Jumlah item {$obj['M_ItemDesc']} yang tersedia sudah berubah silahkan ulangi pilih item");
exit;
}
# UPDATE po item receive #
$sql_up_po_receive = "UPDATE po_item_receive
JOIN receive_order_po_detail ON ReceiveOrderPoDetailPoItemReceiveID = PoItemReceiveID
AND ReceiveOrderPoDetailID = ?
SET
PoItemReceiveQtyReceived = (PoItemReceiveQtyReceived - ReceiveOrderPoDetailQty) + ?,
PoItemReceiveUpdatedUserID = ?
WHERE PoItemReceiveID = ?";
$que_up_po_receive = $this->db->query($sql_up_po_receive, [
$obj['ReceiveOrderPoDetailID'],
$obj['qty'],
$user['M_UserID'],
$obj['PoItemReceiveID']
]);
if (!$que_up_po_receive) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] update receive order detail");
exit;
}
# UPDATE receive detail po #
$jsonBatch = "[]";
if (isset($obj['batchlist']) && is_array($obj['batchlist'])) {
$batchlist = $obj['batchlist'];
if (sizeof($batchlist) > 0) {
$json = json_encode($batchlist);
if ($json === false) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] encode json batch number");
exit;
} else {
$jsonBatch = $json;
}
}
}
$sql_update_detail = "UPDATE receive_order_po_detail SET
ReceiveOrderPoDetailReceiveOrderPoID = ?,
ReceiveOrderPoDetailPurchaseOrderID = ?,
ReceiveOrderPoDetailPurchaseOrderSummaryID = ?,
ReceiveOrderPoDetailPurchaseOrderDetailID = ?,
ReceiveOrderPoDetailPoItemReceiveID = ?,
ReceiveOrderPoDetailQty = ?,
ReceiveOrderPoDetailPrice = ?,
ReceiveOrderPoDetailTotal = ?,
ReceiveOrderPoItemID = ?,
ReceiveOrderPoItemUnitID = ?,
ReceiveOrderPoDetailBatchNo = ?,
ReceiveOrderPoDetailEd = ?,
ReceiveOrderPoDetailBatchList = ?
WHERE ReceiveOrderPoDetailID = ?";
$que_update_detail = $this->db->query($sql_update_detail, [
$param['ReceiveOrderID'],
$obj['PoItemReceivePurchaseOrderID'],
$obj['PoItemReceivePurchaseOrderSummaryID'],
$obj['PoItemReceivePurchaseOrderDetailID'],
$obj['PoItemReceiveID'],
$obj['qty'],
$obj['PoItemReceivePrice'],
(doubleval($obj['PoItemReceivePrice']) * intval($obj['qty'])),
$obj['M_ItemID'],
$obj['ItemUnitID'],
$obj['batchNo'],
$obj['itemEd'],
$jsonBatch,
$obj['ReceiveOrderPoDetailID']
]);
if (!$que_update_detail) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] update receive order detail");
exit;
}
# update form inspeksi item #
$inspeksi = $obj['inspeksi_item'];
$sql_inspeksi = "UPDATE receive_order_po_inspeksi SET
ReceiveOrderPoInspeksiQtyPesan = ?,
ReceiveOrderPoInspeksiQtyActual = ?,
ReceiveOrderPoInspeksiPricePesan = ?,
ReceiveOrderPoInspeksiPriceActual = ?,
ReceiveOrderPoInspeksiDatePesan = ?,
ReceiveOrderPoInspeksiDateActual = ?,
ReceiveOrderPoInspeksiKeadaanKemasan = ?,
ReceiveOrderPoInspeksiKeadaanKemasanNote = ?,
ReceiveOrderPoInspeksiKondisiPengiriman = ?,
ReceiveOrderPoInspeksiKondisiPengirimanNote = ?,
ReceiveOrderPoInspeksiSimpulan = ?,
ReceiveOrderPoInspeksiCatatan = ?,
ReceiveOrderPoInspeksiStaffPenerimaID = ?,
ReceiveOrderPoInspeksiPengirim = ?
WHERE ReceiveOrderPoInspeksiID = ?";
$que_inspeksi = $this->db->query($sql_inspeksi, [
$inspeksi['qty_po'],
$inspeksi['qty_ro'],
$inspeksi['price_po'],
$inspeksi['price_ro'],
$inspeksi['date_po'],
$inspeksi['date_ro'],
$inspeksi['condt_kemasan'],
$inspeksi['catatan_kemasan'],
$inspeksi['condt_pengiriman'],
$inspeksi['catatan_kirim'],
$inspeksi['summary'],
$inspeksi['catatan'],
$inspeksi['pemeriksa'],
$inspeksi['pemeriksa'],
$inspeksi['ReceiveOrderPoInspeksiID']
]);
if (!$que_inspeksi) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] update form inspeksi");
exit;
}
}
# INSERT #
foreach ($insert as $key => $obj) {
# cek item received #
$sqlRcvdItem = "SELECT * FROM po_item_receive WHERE PoItemReceiveID = ?";
$queRcvdItem = $this->db->query($sqlRcvdItem, [$obj['PoItemReceiveID']]);
if (!$queRcvdItem) {
$this->db->trans_rollback();
$this->sys_error_db("Error cek data item po_item_receive");
exit;
}
$cekReceived = $queRcvdItem->row_array();
if ($cekReceived['PoItemReceiveIsActive'] == 'N') {
$this->db->trans_rollback();
$this->sys_error("[Error] Item {$obj['M_ItemDesc']} tidak aktif");
exit;
}
if (intval($obj['qty']) > intval($cekReceived['PoItemReceiveQty'])) {
$this->db->trans_rollback();
$this->sys_error("Jumlah item {$obj['M_ItemDesc']} yang tersedia sudah berubah silahkan ulangi pilih item");
exit;
}
# UPDATE po item receive #
$sql_up_po_receive = "UPDATE po_item_receive SET
PoItemReceiveQtyReceived = ?,
PoItemReceiveUpdatedUserID = ?
WHERE PoItemReceiveID = ?";
$que_up_po_receive = $this->db->query($sql_up_po_receive, [
(intval($cekReceived['PoItemReceiveQtyReceived']) + intval($obj['qty'])),
$user['M_UserID'],
$obj['PoItemReceiveID']
]);
if (!$que_up_po_receive) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] update receive order detail");
exit;
}
$jsonBatch = "[]";
if (isset($obj['batchlist']) && is_array($obj['batchlist'])) {
$batchlist = $obj['batchlist'];
if (sizeof($batchlist) > 0) {
$json = json_encode($batchlist);
if ($json === false) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] encode json batch number");
exit;
} else {
$jsonBatch = $json;
}
}
}
# RE-INSERT ITEM DETAIL #
$sql_insert_rodetail = "INSERT INTO receive_order_po_detail (
ReceiveOrderPoDetailReceiveOrderPoID,
ReceiveOrderPoDetailPurchaseOrderID,
ReceiveOrderPoDetailPurchaseOrderSummaryID,
ReceiveOrderPoDetailPurchaseOrderDetailID,
ReceiveOrderPoDetailPoItemReceiveID,
ReceiveOrderPoDetailQty,
ReceiveOrderPoDetailPrice,
ReceiveOrderPoDetailTotal,
ReceiveOrderPoDetailCreatedUserID,
ReceiveOrderPoItemID,
ReceiveOrderPoItemUnitID,
ReceiveOrderPoDetailBatchNo,
ReceiveOrderPoDetailEd,
ReceiveOrderPoDetailBatchList
) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
$que_insert_rodetail = $this->db->query($sql_insert_rodetail, [
$param['ReceiveOrderID'],
$obj['PoItemReceivePurchaseOrderID'],
$obj['PoItemReceivePurchaseOrderSummaryID'],
$obj['PoItemReceivePurchaseOrderDetailID'],
$obj['PoItemReceiveID'],
$obj['qty'],
$obj['PoItemReceivePrice'],
(doubleval($obj['PoItemReceivePrice']) * intval($obj['qty'])),
$user['M_UserID'],
$obj['M_ItemID'],
$obj['ItemUnitID'],
$obj['batchNo'],
$obj['itemEd'],
$jsonBatch
]);
if (!$que_insert_rodetail) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] insert receive order detail");
exit;
}
$ro_detail_ID = $this->db->insert_id();
# INSERT form inspeksi item #
$inspekitem = $obj['inspeksi_item'];
$sql_insert_inspeksi = " INSERT INTO receive_order_po_inspeksi (
ReceiveOrderPoInspeksiReceiveOrderPoDetailID,
ReceiveOrderPoInspeksiQtyPesan,
ReceiveOrderPoInspeksiQtyActual,
ReceiveOrderPoInspeksiPricePesan,
ReceiveOrderPoInspeksiPriceActual,
ReceiveOrderPoInspeksiDatePesan,
ReceiveOrderPoInspeksiDateActual,
ReceiveOrderPoInspeksiKeadaanKemasan,
ReceiveOrderPoInspeksiKeadaanKemasanNote,
ReceiveOrderPoInspeksiKondisiPengiriman,
ReceiveOrderPoInspeksiKondisiPengirimanNote,
ReceiveOrderPoInspeksiSimpulan,
ReceiveOrderPoInspeksiCatatan,
ReceiveOrderPoInspeksiStaffPenerimaID,
ReceiveOrderPoInspeksiPengirim,
ReceiveOrderPoInspeksiUserID
) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
$que_insert_inspeksi = $this->db->query($sql_insert_inspeksi, [
$ro_detail_ID,
$inspekitem['qty_po'],
$inspekitem['qty_ro'],
$inspekitem['price_po'],
$inspekitem['price_ro'],
$inspekitem['date_po'],
$inspekitem['date_ro'],
$inspekitem['condt_kemasan'],
$inspekitem['catatan_kemasan'],
$inspekitem['condt_pengiriman'],
$inspekitem['catatan_kirim'],
$inspekitem['summary'],
$inspekitem['catatan'],
$inspekitem['pemeriksa'],
$inspekitem['pengirim'],
$user['M_UserID']
]);
if (!$que_insert_inspeksi) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] insert hasil form inspeksi");
exit;
}
}
# DELETE #
if (count($delete) > 0) {
$deleted_id = array_column($delete, 'ReceiveOrderPoDetailID');
$placeholders = implode(', ', array_fill(0, count($deleted_id), '?'));
$deleted_poid = array_column($delete, 'ReceiveOrderPoDetailPoItemReceiveID');
$placeholders_po = implode(', ', array_fill(0, count($deleted_poid), '?'));
# UPDATE po item receive #
$del_param = array_merge(array($user['M_UserID']), $deleted_poid, $deleted_id);
$sql_up_po_receive = "UPDATE po_item_receive
JOIN receive_order_po_detail ON ReceiveOrderPoDetailPoItemReceiveID = PoItemReceiveID
SET PoItemReceiveQtyReceived = (PoItemReceiveQtyReceived - ReceiveOrderPoDetailQty),
PoItemReceiveUpdatedUserID = ?
WHERE PoItemReceiveID IN ($placeholders)
AND ReceiveOrderPoDetailID IN ($placeholders_po)";
$que_up_po_receive = $this->db->query($sql_up_po_receive, $del_param);
if (!$que_up_po_receive) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] update receive po item");
exit;
}
# UPDATE receive order po detail #
$upd_param = array_merge(array($user['M_UserID']), $deleted_id);
$sql_update_detail = "UPDATE receive_order_po_detail SET
ReceiveOrderPoDetailIsActive = 'N',
ReceiveOrderPoDetailDeleted = NOW(),
ReceiveOrderPoDetailDeletedUserID = ?
WHERE ReceiveOrderPoDetailID IN ($placeholders)";
$que_update_detail = $this->db->query($sql_update_detail, $upd_param);
if (!$que_update_detail) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] update status receive order detail");
exit;
}
# update status table form inspeksi #
$deleted_inspeksi = array_map(function ($item) {
if (isset($item['inspeksi_item']['ReceiveOrderPoInspeksiID'])) {
return $item['inspeksi_item']['ReceiveOrderPoInspeksiID'];
}
return null;
}, $delete);
$placeholders_inspeksi = implode(', ', array_fill(0, count($deleted_inspeksi), '?'));
$delinspeksi_param = array_merge($user['M_UserID'], $deleted_inspeksi);
$sql_inspeksi_status = "UPDATE receive_order_po_inspeksi SET
ReceiveOrderPoInspeksiIsActive = 'N',
ReceiveOrderPoInspeksiUserID = ?,
ReceiveOrderPoInspeksiDeleted = NOW()
WHERE ReceiveOrderPoInspeksiID IN ($placeholders_inspeksi)";
$que_inspeksi_status = $this->db->query($sql_inspeksi_status, $delinspeksi_param);
if (!$que_inspeksi_status) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] update status form receive item");
exit;
}
# update status barcode barang #
$sql_barcode = "UPDATE t_barcode_barang SET
T_BarcodeBarangIsActive = 'N',
T_BarcodeBarangUserID = ?,
T_BarcodeBarangLastUpdated = NOW()
WHERE T_BarcodeBarangReceiveOrderPoDetailID IN ($placeholders)";
$qry_barcode = $this->db->query($sql_barcode, $upd_param);
if (!$qry_barcode) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] update status barcode barang", $this->db);
exit;
}
}
$this->db->trans_commit();
$this->sys_ok("Success");
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
function confirmRO()
{
try {
if (!$this->isLogin) {
$this->sys_error("invalid token");
exit;
}
$this->db->trans_begin();
$param = $this->sys_input;
$user = $this->sys_user;
$ROID = $param['ROID'];
# GET DATA RO #
$json_ro_before = $this->getDataROPO($ROID);
$sql_ro = "SELECT
receive_order_po.*,
DATE_FORMAT(ReceiveOrderPoIDate, '%d-%m-%Y') AS formatedDate,
CASE
WHEN WarehouseType = 'B'
THEN CONCAT(WarehouseCode,' ', WarehouseName, ' - ', M_BranchName)
WHEN WarehouseType = 'R'
THEN CONCAT(WarehouseCode,' ', WarehouseName, ' - ', S_RegionalName)
ELSE ''
END WarehouseName,
WarehouseID
FROM receive_order_po
JOIN warehouse ON ReceiveOrderPoWarehouseID = WarehouseID
JOIN s_regional ON WarehouseS_RegionalID = S_RegionalID
AND S_RegionalIsActive = 'Y'
LEFT JOIN m_branch ON WarehouseM_BranchID = M_BranchID
AND M_BranchIsActive = 'Y'
WHERE ReceiveOrderPoID = ?";
$que_ro = $this->db->query($sql_ro, [$ROID]);
if (!$que_ro) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] get data RO");
exit;
}
$data_ro = $que_ro->row_array();
if ($data_ro['ReceiveOrderPoConfirmed'] == 'Y') {
$this->db->trans_rollback();
$this->sys_error_db("[Error] item dari RO{$data_ro['ReceiveOrderPoNumber']} sudah pernah di konfirmasi");
exit;
}
$sql_detail_ro = "SELECT
receive_order_po_detail.*,
PurchaseOrderID,
PurchaseOrderNumber,
PurchaseOrderTaxPercentPph,
PurchaseOrderTaxPercentPpn,
PurchaseOrderSummaryDiscountAmount as DiscountPerItem,
PurchaseOrderSummaryQty as QtyAllPO,
PurchaseOrderSummaryTotal as TotalAllPO,
PurchaseOrderDiscountPercent AS DiscPOPercent,
PurchaseOrderDiscountAmount AS DiscPORupiah
FROM receive_order_po_detail
JOIN purchase_order ON ReceiveOrderPoDetailPurchaseOrderID = PurchaseOrderID
JOIN purchase_order_summary ON ReceiveOrderPoDetailPurchaseOrderSummaryID = PurchaseOrderSummaryID
AND PurchaseOrderSummaryIsActive = 'Y'
WHERE ReceiveOrderPoDetailReceiveOrderPoID = ?
AND ReceiveOrderPoDetailIsActive='Y'
GROUP BY ReceiveOrderPoDetailID";
$que_detail_ro = $this->db->query($sql_detail_ro, [$ROID]);
if (!$que_detail_ro) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] get detail data ro");
exit;
}
$data_detail_ro = $que_detail_ro->result_array();
# UPDATE STATUS RO #
$sql_update_ro = "UPDATE receive_order_po SET
ReceiveOrderPoConfirmed = 'Y',
ReceiveOrderPoConfirmedDate = NOW(),
ReceiveOrderPoConfirmedUserID = ?
WHERE ReceiveOrderPoID = ?";
$que_update_ro = $this->db->query($sql_update_ro, [$user['M_UserID'], $ROID]);
if (!$que_update_ro) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] get update status ro");
exit;
}
# PREPARE DATA FOR JURNAL #
$sql_jrnl_num = "SELECT `fn_numbering`('J') AS numbering";
$que_jrnl_num = $this->db->query($sql_jrnl_num, []);
if (!$que_jrnl_num) {
$this->sys_error_db("[Error] generate jurnal number");
$this->db->trans_rollback();
exit;
}
$jurnal_number = $que_jrnl_num->row_array()['numbering'];
$sql_periode = "SELECT periodeID FROM periode
WHERE DATE(NOW()) BETWEEN periodeStartDate AND periodeEndDate
AND periodeIsActive= 'Y' AND periodeIsClosed = 'N'";
$que_periode = $this->db->query($sql_periode, []);
if (!$que_periode) {
$this->sys_error_db("[Error] get periode", $this->db);
$this->db->trans_rollback();
exit;
}
if ($que_periode->num_rows() === 0) {
$this->sys_error_db("[Error] waktu periode tidak ditemukan", $this->db);
$this->db->trans_rollback();
exit;
}
$jurnal_periode = $que_periode->row_array()['periodeID'];
$sql_jrnl_type = "SELECT JurnalTypeID FROM jurnal_type WHERE JurnalTypeCode = ? AND JurnalTypeIsActive = 'Y'";
$que_jrnl_type = $this->db->query($sql_jrnl_type, ['AUTOGOODRECEIVE']);
if (!$que_jrnl_type) {
$this->sys_error_db("[Error] get jurnal type", $this->db);
$this->db->trans_rollback();
exit;
}
if ($que_jrnl_type->num_rows() === 0) {
$this->sys_error_db("[Error] tipe jurnal tidak ditemukan", $this->db);
$this->db->trans_rollback();
exit;
}
$jurnal_type = $que_jrnl_type->row_array()['JurnalTypeID'];
$list_po_in_ro = array_column($data_detail_ro, 'PurchaseOrderNumber');
$str_po = implode(', ', array_unique($list_po_in_ro));
$jurnal_title = "Jurnal Penerimaan Barang Dari PO {$str_po} Tanggal {$data_ro['formatedDate']}";
$jurnal_desc = $jurnal_title . " Dengan Nomor DO {$data_ro['ReceiveOrderPoDONumber']} Di {$data_ro['WarehouseName']}";
# INSERT JURNAL HEADER #
$sql_head_jurnal = "INSERT INTO jurnal (
jurnalM_BranchCompanyID,
JurnalS_RegionalID,
jurnalM_BranchCode,
jurnalperiodeID,
jurnalNo,
jurnalTitle,
jurnalDescription,
jurnalDate,
jurnalJurnalTypeID,
jurnalM_UserID
) VALUES (?,?,?,?,?,?,?,NOW(),?,?)";
$que_head_jurnal = $this->db->query($sql_head_jurnal, [
$user['M_BranchCompanyID'],
$user['S_RegionalID'],
$user['M_BranchCode'],
$jurnal_periode,
$jurnal_number,
$jurnal_title,
$jurnal_desc,
$jurnal_type,
$user['M_UserID']
]);
if (!$que_head_jurnal) {
$this->sys_error_db("[Error] insert header jurnal", $this->db);
$this->db->trans_rollback();
exit;
}
$jurnal_ID = $this->db->insert_id();
$total_debet = 0.00;
$total_discount_item = 0.00;
$total_discount_po = 0.00;
$each_desc = [];
foreach ($data_detail_ro as $key => $detail) {
# UPDATE PO Summary #
$sql_posummary = "UPDATE purchase_order_summary SET
PurchaseOrderSummaryQtyReceived = PurchaseOrderSummaryQtyReceived + ?
WHERE PurchaseOrderSummaryIsActive = 'Y'
AND PurchaseOrderSummaryID = ?";
$que_posummary = $this->db->query($sql_posummary, [
intval($detail['ReceiveOrderPoDetailQty']),
$detail['ReceiveOrderPoDetailPurchaseOrderSummaryID']
]);
if (!$que_posummary) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] update qty received po summary");
exit;
}
$sql_cek_item = "SELECT * FROM m_item WHERE M_ItemID = ?";
$que_cek_item = $this->db->query($sql_cek_item, [$detail['ReceiveOrderPoItemID']]);
if (!$que_cek_item) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] cek item received");
exit;
}
$item_cek = $que_cek_item->row_array();
if (empty($item_cek['M_ItemItem_CategoryID'])) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] kategori item {$item_cek['M_ItemDesc']} tidak ditemukan pada PO
{$detail['PurchaseOrderNumber']}");
exit;
}
# INSERT JURNAL TX #
if (intval($item_cek['M_ItemItem_CategoryID']) == 2) {
if (empty($item_cek['M_ItemM_InventarisGolID'])) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] golongan inventaris item {$item_cek['M_ItemDesc']} tidak ditemukan pada PO
{$detail['PurchaseOrderNumber']}");
exit;
}
$sql_coa_inv = "SELECT
CoaMapInventarisCoaID,
CoaMapInventarisCoaNo,
CoaMapInventarisCoaDesc
FROM coa_map_inventaris
WHERE CoaMapInventarisM_InventarisGolID = ?
AND CoaMapInventarisIsActive = 'Y'";
$que_coa_inv = $this->db->query($sql_coa_inv, [$item_cek['M_ItemM_InventarisGolID']]);
if (!$que_coa_inv) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] failed to get coa biaya item inventaris");
exit;
}
$iteminv_coa = $que_coa_inv->row_array();
if (empty($iteminv_coa['CoaMapInventarisCoaID'])) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] coa gol inventaris not found");
exit;
}
$debet = doubleval($detail['ReceiveOrderPoDetailTotal']);
$total_debet = round($total_debet + $debet, 2);
# INSERT JURNAL TX DEBET #
$sql_tx_jurnal = "INSERT INTO jurnal_tx (
jurnalTxJurnalID,
jurnalTxCoaID,
jurnalTxDescription,
jurnalTxDebit,
jurnalTxCredit,
jurnalTxM_UserID
) VALUES (?,?,?,?,?,?)";
$que_tx_jurnal = $this->db->query($sql_tx_jurnal, [
$jurnal_ID,
$iteminv_coa['CoaMapInventarisCoaID'],
$iteminv_coa['CoaMapInventarisCoaDesc'],
$debet,
0,
$user['M_UserID']
]);
if (!$que_tx_jurnal) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] failed insert jurnal tx {$item_cek['M_ItemDesc']}
PO {$detail['PurchaseOrderNumber']}");
exit;
}
$juranl_tx_ID = $this->db->insert_id();
$each_desc[] = "- Add detail Jurnal debet {$item_cek['M_ItemDesc']}
{$iteminv_coa['CoaMapInventarisCoaDesc']} sejumlah {$this->formatRupiah($debet)}";
# INSERT JURNAL ADDON #
$sql_addon_jurnal = "INSERT INTO jurnal_addon (
jurnalAddOnJurnalID,
jurnalAddOnJurnalTxID,
jurnalAddOnCode,
jurnalAddOnValue,
jurnalAddOnM_ItemID,
jurnalAddOnCreated,
jurnalAddOnCreatedUserID
) VALUES (?,?,'PONUMB',?,?,NOW(),?)";
$que_addon_jurnal = $this->db->query($sql_addon_jurnal, [
$jurnal_ID,
$juranl_tx_ID,
$detail['PurchaseOrderNumber'],
$detail['ReceiveOrderPoItemID'],
$user['M_UserID']
]);
if (!$que_addon_jurnal) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] failed insert jurnal addon {$item_cek['M_ItemDesc']}
PO {$detail['PurchaseOrderNumber']}");
exit;
}
# INSERT JURNAL TX KREDIT DISKON #
$sql_po = "SELECT
SUM(subquery.PurchaseOrderSummaryQty) as totalAllQtyPO,
SUM(subquery.PurchaseOrderSummaryTotal) as totalAllPricePO
FROM (
SELECT
PurchaseOrderSummaryQty,
PurchaseOrderSummaryTotal
FROM receive_order_po_detail
JOIN purchase_order_summary ON PurchaseOrderSummaryPurchaseOrderID = ReceiveOrderPoDetailPurchaseOrderID
AND PurchaseOrderSummaryIsActive = 'Y'
WHERE ReceiveOrderPoDetailReceiveOrderPoID = ?
GROUP BY PurchaseOrderSummaryID
) as subquery";
$que_po = $this->db->query($sql_po, [$ROID]);
if (!$que_po) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] get detail total qty and price of item po");
exit;
}
$data_po = $que_po->row_array();
// calc diskon per item
$diskon = round(intval($detail['ReceiveOrderPoDetailQty'] * doubleval($detail['DiscountPerItem'])), 2);
$total_discount_item = round($total_discount_item + $diskon, 2);
// calc diskon prorata PO untuk item
$diskon_po = doubleval($detail['DiscPORupiah']);
if (doubleval($detail['DiscPOPercent']) != 0.00) {
$diskon_po = doubleval($data_po['totalAllPricePO']) * doubleval($detail['DiscPOPercent']) / 100;
}
$diskon_prorata_po = $diskon_po * (doubleval($detail['TotalAllPO'])) / doubleval($data_po['totalAllPricePO']);
$diskon_prorata_item = round((intval($detail['ReceiveOrderPoDetailQty']) / intval($detail['QtyAllPO'])) * $diskon_prorata_po, 2);
$total_discount_po = round($total_discount_po + $diskon_prorata_item, 2);
$input_diskon = [$diskon, $diskon_prorata_item];
// get account coa diskon
$sql_coa_disc = "SELECT * FROM coa WHERE coaAccountNo = ? LIMIT 1";
$que_coa_disc = $this->db->query($sql_coa_disc, ['2190100001']);
if (!$que_coa_disc) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] get account diskon");
exit;
}
$coa_diskon = $que_coa_disc->row_array();
foreach ($input_diskon as $kkey => $value) {
if (doubleval($value) === 0.00) {
continue;
}
$que_tx_jurnal = $this->db->query($sql_tx_jurnal, [
$jurnal_ID,
$coa_diskon['coaID'],
$coa_diskon['coaDescription'],
0,
$value,
$user['M_UserID']
]);
if (!$que_tx_jurnal) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] failed insert jurnal tx diskon
item {$item_cek['M_ItemDesc']} PO {$detail['PurchaseOrderNumber']}");
exit;
}
$juranl_txdisc_ID = $this->db->insert_id();
$que_addon_jurnal = $this->db->query($sql_addon_jurnal, [
$jurnal_ID,
$juranl_txdisc_ID,
$detail['PurchaseOrderNumber'],
$user['M_UserID']
]);
if (!$que_addon_jurnal) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] failed insert jurnal addon diskon
item {$item_cek['M_ItemDesc']} PO {$detail['PurchaseOrderNumber']}");
exit;
}
}
// save diskon prorata
$sql_save_diskon = "UPDATE receive_order_po_detail SET
ReceiveOrderPoDetailDiskonPoProrata = ?
WHERE ReceiveOrderPoDetailID = ?";
$que_save_diskon = $this->db->query($sql_save_diskon, [
$diskon_prorata_item,
$detail['ReceiveOrderPoDetailID']
]);
if (!$que_save_diskon) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] save diskon prorata
item {$item_cek['M_ItemDesc']} PO {$detail['PurchaseOrderNumber']}");
exit;
}
} else {
$this->db->trans_rollback();
$this->sys_error_db("[Error] BE Jurnal tipe selain Inventory tidak ada");
exit;
}
# HANDLE STOCK UPDATE #
// decode batchlist item diterima
$json_batch_item = $detail['ReceiveOrderPoDetailBatchList'];
$batch_list = [];
if (!empty($json_batch_item)) {
$decode = json_decode($json_batch_item, true);
if ($decode !== null && json_last_error() === JSON_ERROR_NONE) {
$batch_list = $decode;
} else {
$this->db->trans_rollback();
$this->sys_error_db("[Error] decode json for batches number");
exit;
}
}
// update stock based on batch
foreach ($batch_list as $key => $batch) {
$sql_cek_stock = "SELECT *
FROM stock s
JOIN m_item i ON s.StockItemID = i.M_ItemID
WHERE s.StockItemID = ?
AND s.StockItemUnitID = ?
AND s.StockWarehouseID = ?
AND i.M_ItemItem_CategoryID = ?";
$que_cek_stock = $this->db->query($sql_cek_stock, [
$detail['ReceiveOrderPoItemID'],
$detail['ReceiveOrderPoItemUnitID'],
$data_ro['WarehouseID'],
$batch['item_category']
]);
if (!$que_cek_stock) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] check stock exist or not");
exit;
}
$stock_exist = $que_cek_stock->row_array();
$stock_ID = $stock_exist['StockID'];
$stock_qty_ori = intval($stock_exist['StockQty']);
$stock_price = doubleval($stock_exist['StockItemPrice']);
$stock_qty_end = 0;
if (!empty($stock_exist)) {
// calc new prive average
$stock_qty_end = $stock_qty_ori + intval($batch['qty']);
$all_price = ($stock_qty_ori * $stock_price) + (intval($batch['qty']) * doubleval($detail['ReceiveOrderPoDetailPrice']));
$avg_prive = round($all_price / $stock_qty_end, 2);
$sql_update_stock = "UPDATE stock SET
StockItemPrice = ?,
StockQty = ?,
StockLastUpdated = NOW(),
StockUserID = ?
WHERE StockID = ?";
$que_update_stock = $this->db->query($sql_update_stock, [
$avg_prive,
$stock_qty_end,
$user['M_UserID'],
$stock_ID
]);
if (!$que_update_stock) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] insert update stock");
exit;
}
// insert stockid barcode barang
// $sql_update_barcode = "UPDATE t_barcode_barang SET
// T_BarcodeBarangStockID = ?
// WHERE T_BarcodeBarangReceiveOrderPoDetailID = ?";
// $qry_update_barcode = $this->db->query($sql_update_barcode, [
// $stock_ID,
// $detail['ReceiveOrderPoDetailID']
// ]);
// if (!$qry_update_barcode) {
// $this->db->trans_rollback();
// $this->sys_error_db("[Error] update barcode stockID", $this->db);
// exit;
// }
} else {
$sql_insert_stock = "INSERT INTO stock (
StockWarehouseAlmariID,
StockWarehouseRackID,
StockWarehouseID,
StockStockNumber,
StockItemID,
StockItemUnitID,
StockItemPrice,
StockQty,
StockLastUpdated,
StockUserID
) VALUES (0,0,?,fn_numbering('SN'),?,?,?,?,NOW(),?)";
$que_insert_stock = $this->db->query($sql_insert_stock, [
$data_ro['WarehouseID'],
$detail['ReceiveOrderPoItemID'],
$detail['ReceiveOrderPoItemUnitID'],
$detail['ReceiveOrderPoDetailPrice'],
$batch['qty'],
$user['M_UserID']
]);
if (!$que_insert_stock) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] insert new batch stock");
exit;
}
$stockID = $this->db->insert_id();
$stock_qty_ori = 0;
$stock_qty_end = intval($batch['qty']);
// insert stockid barcode barang
// $sql_update_barcode = "UPDATE t_barcode_barang SET
// T_BarcodeBarangStockID = ?
// WHERE T_BarcodeBarangReceiveOrderPoDetailID = ?";
// $qry_update_barcode = $this->db->query($sql_update_barcode, [
// $stockID,
// $detail['ReceiveOrderPoDetailID']
// ]);
// if (!$qry_update_barcode) {
// $this->db->trans_rollback();
// $this->sys_error_db("[Error] update barcode stockID", $this->db);
// exit;
// }
}
// insert stock card
$sql_stock_card = "INSERT INTO stockcard (
StockCardWarehouseID,
StockCardDatetime,
StockCardItemID,
StockCardItemUnitID,
StockCardReffID,
StockCardStatus,
StockCardBefore,
StockCardIn,
StockCardOut,
StockCardAfter,
StockCardUserID
) VALUES (?, NOW(), ?, ?, ?, 'PRV', ?, ?, 0, ?, ?)";
$que_stock_card = $this->db->query($sql_stock_card, [
$data_ro['WarehouseID'],
$detail['ReceiveOrderPoItemID'],
$detail['ReceiveOrderPoItemUnitID'],
$stock_ID,
$stock_qty_ori,
$batch['qty'],
$stock_qty_end,
$user['M_UserID']
]);
if (!$que_stock_card) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] insert stock card");
exit;
}
// insert stock log
$sql_stock = "SELECT * FROM stock WHERE StockID = ?";
$que_stock = $this->db->query($sql_stock, [$stock_ID]);
if (!$que_stock) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] get latest stock");
exit;
}
$stock_latest = $que_stock->row_array();
$sql_stock_log = "INSERT INTO stocklog (
StockLogWarehouseID,
StockLogDateTime,
StockLogItemID,
StockLogItemUnitID,
StockLogStockNumber,
StockLogReffID,
StockLogStatus,
StockLogQty,
StockLogUserID
) VALUES (?, NOW(), ?, ?, ?, ?, 'PRV', ?, ?)";
$que_stock_log = $this->db->query($sql_stock_log, [
$data_ro['WarehouseID'],
$detail['ReceiveOrderPoItemID'],
$detail['ReceiveOrderPoItemUnitID'],
$stock_latest['StockStockNumber'],
$stock_ID,
$batch['qty'],
$user['M_UserID']
]);
if (!$que_stock_log) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] get latest stock");
exit;
}
}
}
# insert shipping cost ke jurnal #
$ship_cost = round(doubleval($data_ro['ReceiveOrderShippingCostAmount']), 2);
if ($ship_cost > 0.00) {
$sql_tx_ship = "INSERT INTO jurnal_tx (
jurnalTxJurnalID,
jurnalTxCoaID,
jurnalTxDescription,
jurnalTxDebit,
jurnalTxCredit,
jurnalTxM_UserID
) SELECT ?, coaID, coaDescription, ?, 0, ?
FROM coa WHERE coaAccountNo = '5320700001' LIMIT 1";
$que_tx_ship = $this->db->query($sql_tx_ship, [$jurnal_ID, $ship_cost, $user['M_UserID']]);
if (!$que_tx_ship) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] insert jurnal tx shipping cost");
exit;
}
}
// insert jurnal tx for GRNI
$total_grni = round($total_debet - ($total_discount_item + $total_discount_po), 2) + $ship_cost;
$sql_grni = "INSERT INTO jurnal_tx (
jurnalTxJurnalID,
jurnalTxCoaID,
jurnalTxDescription,
jurnalTxDebit,
jurnalTxCredit,
jurnalTxM_UserID
) SELECT ?, coaID, coaDescription, 0, ?, ?
FROM coa WHERE coaAccountNo = '2110100030' LIMIT 1";
$que_grni = $this->db->query($sql_grni, [$jurnal_ID, $total_grni, $user['M_UserID']]);
if (!$que_grni) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] insert jurnal tx GRNI");
exit;
}
$grni_jurnal_id = $this->db->insert_id();
$sql_addon_grni = "INSERT INTO jurnal_addon (
jurnalAddOnJurnalID,
jurnalAddOnJurnalTxID,
jurnalAddOnCode,
jurnalAddOnValue,
jurnalAddOnCreated,
jurnalAddOnCreatedUserID
) VALUES (?,?,'RONUMB',?,NOW(),?)";
$que_addon_grni = $this->db->query($sql_addon_grni, [
$jurnal_ID,
$grni_jurnal_id,
$data_ro['ReceiveOrderPoNumber'],
$user['M_UserID']
]);
if (!$que_addon_grni) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] insert jurnal addon GRNI");
exit;
}
# insert into shipping table #
$sql_rec_ship = "INSERT INTO receive_order_po_shipping (
ReceiveOrderPoShippingPurchaseOrderID,
ReceiveOrderPoShippingReceiveOrderPoID,
ReceiveOrderPoShippingAmount,
ReceiveOrderPoShippingStatus,
ReceiveOrderPoShippingIsActive,
ReceiveOrderPoShippingCreatedUserID
) SELECT
PurchaseOrderID,
{$ROID},
PurchaseOrderShippingCost,
PurchaseOrderShippingCostStatus,
'Y',
{$user['M_UserID']}
FROM purchase_order
WHERE PurchaseOrderID IN (
SELECT DISTINCT ReceiveOrderPoDetailPurchaseOrderID
FROM receive_order_po
JOIN receive_order_po_detail ON ReceiveOrderPoDetailReceiveOrderPoID = ReceiveOrderPoID
WHERE ReceiveOrderPoID = {$user['M_UserID']}
)
AND PurchaseOrderShippingCost IS NOT NULL
AND PurchaseOrderShippingCost > 0";
$que_rec_ship = $this->db->query($sql_rec_ship, []);
if (!$que_rec_ship) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] insert table shipping cost");
exit;
}
# LOG #
$desc = "Konfirmasi penerimaan barang {$data_ro['ReceiveOrderPoNumber']} Tanggal {$data_ro['formatedDate']}
di {$data_ro['WarehouseName']} yang meliputi beberapa item dari PO {$str_po}";
$log_desc = $desc . "\n" . implode("\n", $each_desc);
$json_ro_after = $this->getDataROPO($ROID);
$this->insertLogReceiveOrderPo($ROID, 'CONFIRM', $json_ro_before, $json_ro_after, $user['M_UserID'], $log_desc);
$this->insertUserActivty($ROID, 'RO', 'CONFIRM', $user['M_UserID'], $log_desc);
# GENERATE PURCHASE INVOICE #
$this->generatePurchaseInvoice($user, $ROID, $total_grni, $total_discount_po, $ship_cost);
$this->db->trans_commit();
$this->sys_ok("[Success] Berhasil konfirmasi terima barang");
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
function deleteRO()
{
try {
if (!$this->isLogin) {
$this->sys_error("invalid token");
exit;
}
$this->db->trans_begin();
$param = $this->sys_input;
$user = $this->sys_user;
$ROID = $param['ROID'];
# data before fo logging #
$json_ro_before = $this->getDataROPO($ROID);
# update status header RO #
$sql = "UPDATE receive_order_po SET
ReceiveOrderPoIsActive = 'N',
ReceiveOrderPoDeleted = NOW(),
ReceiveOrderPoDeletedUserID = ?
WHERE ReceiveOrderPoID = ?";
$que = $this->db->query($sql, [$user['M_UserID'], $ROID]);
if (!$que) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] delete receive oder");
exit;
}
$sql_detail = "SELECT * FROM receive_order_po_detail
WHERE ReceiveOrderPoDetailReceiveOrderPoID = ?
AND ReceiveOrderPoDetailIsActive = 'Y'";
$que_detail = $this->db->query($sql_detail, [$ROID]);
if (!$que_detail) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] get detail RO ");
exit;
}
$details = $que_detail->result_array();
# update status detail RO #
foreach ($details as $key => $detail) {
# update receive detail po #
$sql_update_detail = "UPDATE receive_order_po_detail SET
ReceiveOrderPoDetailIsActive = 'N',
ReceiveOrderPoDetailDeletedUserID = ?,
ReceiveOrderPoDetailDeleted = NOW()
WHERE ReceiveOrderPoDetailID = ?";
$que_update_detail = $this->db->query($sql_update_detail, [
$user['M_UserID'],
$detail['ReceiveOrderPoDetailID']
]);
if (!$que_update_detail) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] update status detail RO");
exit;
}
# update status form inspeksi #
$sql_inspeksi = "UPDATE receive_order_po_inspeksi SET
ReceiveOrderPoInspeksiIsActive = 'N'
WHERE ReceiveOrderPoInspeksiReceiveOrderPoDetailID = ? ";
$que_inspeksi = $this->db->query($sql_inspeksi, [$detail['ReceiveOrderPoDetailID']]);
if (!$que_inspeksi) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] update status form inspeksi");
exit;
}
# update status barcode barang #
$sql_barcode = "UPDATE t_barcode_barang SET
T_BarcodeBarangIsActive = 'N',
T_BarcodeBarangUserID = ?,
T_BarcodeBarangLastUpdated = NOW()
WHERE T_BarcodeBarangReceiveOrderPoDetailID = ?";
$qry_barcode = $this->db->query($sql_barcode, [
$user['M_UserID'],
$detail['ReceiveOrderPoDetailID']
]);
if (!$qry_barcode) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] update status barcode barang", $this->db);
exit;
}
# update po item receive #
$json_po_before = $this->getPOItemReceived($detail['ReceiveOrderPoDetailPoItemReceiveID']);
$sql_upd_po_received = "UPDATE po_item_receive
JOIN receive_order_po_detail ON PoItemReceiveID = ReceiveOrderPoDetailPoItemReceiveID
AND ReceiveOrderPoDetailReceiveOrderPoID = ?
AND ReceiveOrderPoDetailID = ?
SET PoItemReceiveQtyReceived = PoItemReceiveQtyReceived - ReceiveOrderPoDetailQty,
PoItemReceiveUpdatedUserID = ?
WHERE PoItemReceiveID = ?";
$que_upd_po_received = $this->db->query($sql_upd_po_received, [
$ROID,
$detail['ReceiveOrderPoDetailID'],
$user['M_UserID'],
$detail['ReceiveOrderPoDetailPoItemReceiveID']
]);
if (!$que_upd_po_received) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] update qty PO item received");
exit;
}
$json_po_after = $this->getPOItemReceived($detail['ReceiveOrderPoDetailPoItemReceiveID']);
$descItem = "Dihapus {$detail['M_ItemDesc']} sejumlah {$detail['ReceiveOrderPoDetailQty']}
{$detail['ItemUnitName']} di RO nomor {$json_ro_before['ReceiveOrderPoNumber']}
*RO belum di konfirmasi";
# log #
$this->insertLogPoItemReceive(
$detail['ReceiveOrderPoDetailPoItemReceiveID'],
'UPDATE',
$ROID,
$json_po_before,
$json_po_after,
$user['M_UserID'],
$descItem
);
}
$json_ro_after = $this->getDataROPO($ROID);
$this->insertLogReceiveOrderPo(
$ROID,
'DELETE',
$json_ro_before,
$json_ro_after,
$user['M_UserID'],
"Update data RO ID: {$ROID}"
);
$this->insertUserActivty($ROID, 'RO', 'DELETE', $user['M_UserID'], "Update data RO ID: {$ROID}");
$this->db->trans_commit();
$this->sys_ok("[Success]");
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
function saveInspeksi()
{
try {
if (!$this->isLogin) {
$this->sys_error("invalid token");
exit;
}
$param = $this->sys_input;
$user = $this->sys_user;
# Prepare Data #
$inspeksi = $param['form_inspeksi'];
$ROdetailID = $param['ROdetailID'];
# Insert Query #
$this->db->trans_begin();
$sql_insert = "INSERT INTO receive_order_po_inspeksi (
ReceiveOrderPoInspeksiReceiveOrderPoDetailID,
ReceiveOrderPoInspeksiQtyPesan,
ReceiveOrderPoInspeksiQtyActual,
ReceiveOrderPoInspeksiPricePesan,
ReceiveOrderPoInspeksiPriceActual,
ReceiveOrderPoInspeksiDatePesan,
ReceiveOrderPoInspeksiDateActual,
ReceiveOrderPoInspeksiExpireDate,
ReceiveOrderPoInspeksiKeadaanKemasan,
ReceiveOrderPoInspeksiKondisiPengiriman,
ReceiveOrderPoInspeksiSimpulan,
ReceiveOrderPoInspeksiCatatan,
ReceiveOrderPoInspeksiStaffPenerima,
ReceiveOrderPoInspeksiStaffPengirim,
ReceiveOrderPoInspeksiUserID
) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
$que_insert = $this->db->query($sql_insert, [
$ROdetailID,
$inspeksi['qty_po'],
$inspeksi['qty_ro'],
$inspeksi['price_po'],
$inspeksi['price_ro'],
$inspeksi['date_po'],
$inspeksi['date_ro'],
$inspeksi['expire_date'],
$inspeksi['condt_kemasan'],
$inspeksi['condt_pengiriman'],
$inspeksi['summary'],
$inspeksi['catatan'],
$inspeksi['pemeriksa'],
$inspeksi['pengirim'],
$user['M_UserID']
]);
if (!$que_insert) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] insert into table receiec order po inspeksi");
exit;
}
$this->db->trans_commit();
$this->sys_ok("[Success] save inspeksi item");
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
function generateItemPO()
{
try {
if (!$this->isLogin) {
$this->sys_error("invalid token");
exit;
}
$param = $this->sys_input;
$userid = $this->sys_user;
$POID = $param['id'];
if (!isset($POID)) {
$this->sys_error("Missing required parameters");
exit;
}
$this->db->trans_begin();
$sql_po = "SELECT * FROM purchase_order WHERE PurchaseOrderID = ?";
$que_po = $this->db->query($sql_po, [$POID]);
if (!$que_po) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] get data PO");
exit;
}
$data_po = $que_po->row_array();
if ($data_po['PurchaseOrderStatus'] != 'Approved') {
$this->db->trans_rollback();
$this->sys_error_db("[Error] status PO belum Approved");
exit;
}
$data_detail = [];
if (strtolower($data_po['PurchaseOrderWarehouseType']) == 'single') {
$sql_POdetail = "SELECT
IFNULL(pir.PoItemReceiveID, 0) as receivedID,
IFNULL(pir.PoItemReceiveQtyReceived, 0) as qtyReceived,
pos.PurchaseOrderSummaryID as orderSummaryID,
pos.PurchaseOrderSummaryItemID as itemID,
pos.PurchaseOrderSummaryItemUnitID as itemUnitID,
pos.PurchaseOrderSummaryQty as qty,
pos.PurchaseOrderSummaryPrice as price,
m_itemDesc as itemName,
ItemUnitName as itemUnitName,
PurchaseOrderDetailID
FROM purchase_order_summary pos
JOIN purchase_order_detail ON PurchaseOrderDetailPurchaseOrderID = pos.PurchaseOrderSummaryPurchaseOrderID
AND PurchaseOrderSummaryItemID = PurchaseOrderDetailItemID
AND PurchaseOrderSummaryItemUnitID = PurchaseOrderDetailItemUnitID
JOIN m_item ON pos.PurchaseOrderSummaryItemID = M_ItemID
JOIN itemunit ON pos.PurchaseOrderSummaryItemUnitID = ItemUnitID
LEFT JOIN po_item_receive pir ON pos.PurchaseOrderSummaryPurchaseOrderID = pir.PoItemReceivePurchaseOrderID
AND pos.PurchaseOrderSummaryItemID = pir.PoItemReceiveItemID
WHERE pos.PurchaseOrderSummaryPurchaseOrderID = ?
AND pos.PurchaseOrderSummaryIsActive = 'Y'
AND IFNULL(pir.PoItemReceiveQtyReceived, 0) = 0";
$que_POdetail = $this->db->query($sql_POdetail, [$POID]);
if (!$que_POdetail) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] get data detail PO");
exit;
}
$data_detail = $que_POdetail->result_array();
foreach ($data_detail as $key => $obj) {
if (intval($obj['PoItemReceiveID']) == 0) {
$sql_ins = "INSERT INTO po_item_receive (
PoItemReceivePurchaseOrderID,
PoItemReceivePurchaseOrderSummaryID,
PoItemReceivePurchaseOrderDetailID,
PoItemReceiveWarehouseID,
PoItemReceiveItemID,
PoItemReceiveItemUnitID,
PoItemReceiveQty,
PoItemReceiveQtyReceived,
PoItemReceiveIsActive,
PoItemReceiveCreated,
PoItemReceiveCreatedUserID,
PoItemReceivePrice
) VALUES (?,?,?,?,?,?,?,0,'Y',NOW(),?,?)";
$que_ins = $this->db->query($sql_ins, [
$POID,
$obj['orderSummaryID'],
$obj['PurchaseOrderDetailID'],
$data_po['PurchaseOrderWarehouseID'],
$obj['itemID'],
$obj['itemUnitID'],
$obj['qty'],
$userid,
$obj['price']
]);
if (!$que_ins) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] insert po item receive");
exit;
}
$insertedID = $this->db->insert_id();
$desc = "ADD {$obj['itemName']} {$obj['qty']} {$obj['itemUnitName']} {$data_po['WarehouseName']}";
$jsonAfter = $this->getPOItemReceived($insertedID);
$this->insertLogPoItemReceive($insertedID, 'ADD', 0, '', $jsonAfter, $userid, $desc);
} else {
$jsonBefore = $this->getPOItemReceived($obj['PoItemReceiveID']);
$sql_upd = "UPDATE po_item_receive SET
PoItemReceiveQty = ?,
PoItemReceiveIsActive = 'Y',
PoItemReceiveUpdate = NOW(),
PoItemReceiveUpdatedUserID = ?,
PoItemReceiveWarehouseID = ?,
PoItemReceiveItemUnitID = ?,
PoItemReceivePrice = ?
WHERE PoItemReceiveID = ?";
$que_upd = $this->db->query($sql_upd, [
$obj['qty'],
$userid,
$data_po['PurchaseOrderWarehouseID'],
$obj['itemUnitID'],
$obj['price'],
$obj['receivedID']
]);
if (!$que_upd) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] update po item receive");
exit;
}
$jsonAfter = $this->getPOItemReceived($obj['PoItemReceiveID']);
$desc = "UPDATE {$obj['itemName']} {$obj['qty']} {$obj['itemUnitName']} {$data_po['WarehouseName']}";
$this->insertLogPoItemReceive($obj['PoItemReceiveID'], 'UPDATE', 0, $jsonBefore, $jsonAfter, $userid, $desc);
}
}
}
if (strtolower($data_po['PurchaseOrderWarehouseType']) == 'multiple') {
$sql_det = "SELECT
IFNULL(PoItemReceiveID, 0) as cekID,
IFNULL(PoItemReceiveQtyReceived, 0) as qtyCek,
pod.PurchaseOrderDetailPurchaseSummaryID as summaryID,
pod.PurchaseOrderDetailID as poDetailID,
pod.PurchaseOrderDetailWarehouseID as warehouseID,
WarehouseName,
pod.PurchaseOrderDetailItemID as itemID,
M_ItemDesc as itemName,
pos.PurchaseOrderSummaryItemUnitID as itemUnitID,
ItemUnitName as itemUnitName,
ConvertQuantityToPurchasedItemUnit(
pod.PurchaseOrderDetailItemID,
pod.PurchaseOrderDetailItemUnitID,
pod.PurchaseOrderDetailQty
) as poQty,
pos.PurchaseOrderSummaryPrice as price
FROM purchase_order_detail pod
JOIN purchase_order_summary pos ON pod.PurchaseOrderDetailPurchaseSummaryID = pos.PurchaseOrderSummaryID
JOIN m_item ON pod.PurchaseOrderDetailItemID = M_ItemID
JOIN itemunit ON pos.PurchaseOrderSummaryItemUnitID = ItemUnitID
JOIN warehouse ON pod.PurchaseOrderDetailWarehouseID = WarehouseID
LEFT JOIN po_item_receive p ON p.PoItemReceiveItemID = pod.PurchaseOrderDetailItemID
AND p.PoItemReceivePurchaseOrderID = ?
AND p.PoItemReceivePurchaseOrderSummaryID = pos.PurchaseOrderSummaryID
AND p.PoItemReceivePurchaseOrderDetailID = pod.PurchaseOrderDetailID
WHERE pod.PurchaseOrderDetailPurchaseOrderID = ?
AND IFNULL(PoItemReceiveQtyReceived, 0) = 0
AND pod.PurchaseOrderDetailIsActive = 'Y'";
$que_det = $this->db->query($sql_det, [$POID, $POID]);
if (!$que_det) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] get item");
exit;
}
$data_detail = $que_det->result_array();
foreach ($data_detail as $key => $obj) {
if (intval($obj['cekID']) == 0) {
$sql_ins = "INSERT INTO po_item_receive (
PoItemReceivePurchaseOrderID,
PoItemReceivePurchaseOrderSummaryID,
PoItemReceivePurchaseOrderDetailID,
PoItemReceiveWarehouseID,
PoItemReceiveItemID,
PoItemReceiveItemUnitID,
PoItemReceiveQty,
PoItemReceiveQtyReceived,
PoItemReceiveIsActive,
PoItemReceiveCreated,
PoItemReceiveCreatedUserID,
PoItemReceivePrice
) VALUES (?,?,?,?,?,?,?,0,'Y',NOW(),?,?)";
$que_ins = $this->db->query($sql_ins, [
$POID,
$obj['summaryID'],
$obj['poDetailID'],
$obj['warehouseID'],
$obj['itemID'],
$obj['itemUnitID'],
$obj['poQty'],
$userid,
$obj['price']
]);
if (!$que_ins) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] insert po item receive multiple wh");
exit;
}
$insertedID = $this->db->insert_id();
$desc = "ADD {$obj['itemName']} {$obj['poQty']} {$obj['itemUnitName']} {$obj['WarehouseName']}";
$jsonAfter = $this->getPOItemReceived($insertedID);
$this->insertLogPoItemReceive($insertedID, 'ADD', 0, '', $jsonAfter, $userid, $desc);
} else {
$jsonBefore = $this->getPOItemReceived($obj['cekID']);
$sql_upd = "UPDATE po_item_receive SET
PoItemReceiveQty = ?,
PoItemReceiveIsActive = 'Y',
PoItemReceiveUpdate = NOW(),
PoItemReceiveUpdatedUserID = ?,
PoItemReceiveWarehouseID = ?,
PoItemReceiveItemUnitID = ?,
PoItemReceivePrice = ?
WHERE PoItemReceiveID = ?";
$que_upd = $this->db->query($sql_upd, [
$obj['poQty'],
$userid,
$obj['warehouseID'],
$obj['itemUnitID'],
$obj['price'],
$obj['cekID']
]);
if (!$que_upd) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] update po item receive multiple wh");
exit;
}
$desc = "ADD {$obj['itemName']} {$obj['poQty']} {$obj['itemUnitName']} {$obj['WarehouseName']}";
$jsonAfter = $this->getPOItemReceived($obj['cekID']);
$this->insertLogPoItemReceive($obj['cekID'], 'UPDATE', 0, $jsonBefore, $jsonAfter, $userid, $desc);
}
}
}
$this->db->trans_commit();
$this->sys_ok([
'header' => $data_po,
'detail' => $data_detail
]);
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
function saveHandover()
{
try {
if (!$this->isLogin) {
$this->sys_error("invalid token");
exit;
}
$this->db->trans_begin();
$param = $this->sys_input;
$user = $this->sys_user;
# Ambil data PurchaseRequestID #
$sql_get_prid = "SELECT DISTINCT
pod.PurchaseOrderDetailPurchaseRequestID AS PurchaseRequestID
FROM receive_order_po_detail ropd
JOIN purchase_order_detail pod ON pod.PurchaseOrderDetailID = ropd.ReceiveOrderPoDetailPurchaseOrderDetailID
WHERE ropd.ReceiveOrderPoDetailReceiveOrderPoID = ?
AND pod.PurchaseOrderDetailPurchaseRequestID IS NOT NULL";
$que_get_prid = $this->db->query($sql_get_prid, [$param['receiveOrderPoID']]);
if (!$que_get_prid) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] get PurchaseRequestID from RO Detail");
exit;
}
$data_prid = $que_get_prid->row_array();
# insert handover #
$sql_insert_handover = "INSERT INTO asset_handover(
AssetHandoverPurchaseRequestID,
AssetHandoverReceiveOrderPoID,
AssetHandoverDate,
AssetHandoverM_RuanganID,
AssetHandoverToUserID,
AssetHandoverIsActive,
AssetHandoverCreated,
AssetHandoverUserID
) VALUES(?,?,NOW(),?,?,'Y',NOW(),?)";
$qry_insert_handover = $this->db->query($sql_insert_handover, [
$data_prid['PurchaseRequestID'],
$param['receiveOrderPoID'],
$param['ruanganID'],
$param['staffID'],
$user['M_UserID']
]);
if (!$qry_insert_handover) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] insert asset handover");
exit;
}
$handoverID = $this->db->insert_id();
foreach ($param['item'] as $key => $item) {
$qty_invnt = intval($item['serahQty']);
for ($i = 0; $i < $qty_invnt; $i++) {
# generate barcode number each inventory item #
$noBarcode = $this->generateNoBarcode($user, $param['ruanganID'], 'BNP', $item['ReceiveOrderPoItemID']);
$sql_insert_barcode = "INSERT INTO t_barcode_barang(
T_BarcodeBarangReceiveOrderPoID,
T_BarcodeBarangReceiveOrderPoDetailID,
T_BarcodeBarangRefType,
T_BarcodeBarangM_ItemID,
T_BarcodeBarangItemUnitID,
T_BarcodeBarangNumber,
T_BarcodeBarangM_RuanganID,
T_BarcodeBarangM_BranchID,
T_BarcodeBarangIsActive,
T_BarcodeBarangUserID,
T_BarcodeBarangCreated
) VALUES(?,?,'PO',?,?,?,?,?,'Y',?,NOW())";
$que_insert_barcode = $this->db->query($sql_insert_barcode, [
$param['receiveOrderPoID'],
$item['ReceiveOrderPoDetailID'],
$item['ReceiveOrderPoItemID'],
$item['ReceiveOrderPoItemUnitID'],
$noBarcode,
$param['ruanganID'],
$user['M_BranchID'],
$user['M_UserID']
]);
if (!$que_insert_barcode) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] insert no barcode invetaris");
exit;
}
$barcodeID = $this->db->insert_id();
# insert stock inventaris #
$sql_stockinventaris = "INSERT INTO stock_inventaris (
StockInventoryStockID,
StockInventoryRuanganID,
StockInventoryBarcode,
StockInventoryCabangID,
StockInventoryCreatedUserID
) VALUES (?,?,?,?,?)";
$que_stockinventaris = $this->db->query($sql_stockinventaris, []);
# insert each inventory handover detail #
$sql_insert_handover_detail = "INSERT INTO asset_handover_detail(
AssetHandoverDetailAssetHandoverID,
AssetHandoverDetailReceiveOrderPoDetailID,
AssetHandoverDetailT_BarcodeBarangID,
AssetHandoverDetailM_ItemID,
AssetHandoverDetailIsActive,
AssetHandoverDetailCreated,
AssetHandoverDetailUserID
) VALUES(?,?,?,?,'Y',NOW(),?)";
$que_insert_handover_detail = $this->db->query($sql_insert_handover_detail, [
$handoverID,
$item['ReceiveOrderPoDetailID'],
$barcodeID,
$item['ReceiveOrderPoItemID'],
$user['M_UserID']
]);
if (!$que_insert_handover_detail) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] insert asset handover detail");
exit;
}
}
}
# check if all received inventaris are all handed over #
$sql_cek_allhanded = "SELECT
rod.ReceiveOrderPoDetailID,
CASE
WHEN COALESCE(ahd_count.InsertedQty, 0) = rod.ReceiveOrderPoDetailQty THEN 'Y'
ELSE 'N'
END AS isHandoverDone
FROM receive_order_po_detail rod
JOIN m_item mi ON mi.M_ItemID = rod.ReceiveOrderPoItemID
LEFT JOIN (
SELECT
AssetHandoverDetailReceiveOrderPoDetailID,
COUNT(*) AS InsertedQty
FROM asset_handover_detail ahd
JOIN asset_handover ah
ON ahd.AssetHandoverDetailAssetHandoverID = ah.AssetHandoverID
AND ah.AssetHandoverIsActive = 'Y'
WHERE ahd.AssetHandoverDetailIsActive = 'Y'
AND ah.AssetHandoverReceiveOrderPoID = ?
GROUP BY AssetHandoverDetailReceiveOrderPoDetailID
) ahd_count
ON ahd_count.AssetHandoverDetailReceiveOrderPoDetailID = rod.ReceiveOrderPoDetailID
WHERE rod.ReceiveOrderPoDetailReceiveOrderPoID = ?
AND rod.ReceiveOrderPoDetailIsActive = 'Y'";
$que_cek_allhanded = $this->db->query($sql_cek_allhanded, [
$param['receiveOrderPoID'],
$param['receiveOrderPoID']
]);
if (!$que_cek_allhanded) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] cek data all handed over");
exit;
}
$cek_allhanded = $que_cek_allhanded->result_array();
$isAllHanded = count($cek_allhanded) > 0;
foreach ($cek_allhanded as $key => $value) {
if ($value['isHandoverDone'] != 'Y') {
$isAllHanded = false;
break;
}
}
# update status handover di receive order po #
if ($isAllHanded) {
$sql_update_ro = "UPDATE receive_order_po SET
ReceiveOrderPoIsHandover = 'Y',
ReceiveOrderPoLastUpdated = NOW(),
ReceiveOrderPoLastUpdatedUserID = ?
WHERE ReceiveOrderPoID = ?";
$que_update_ro = $this->db->query($sql_update_ro, [
$user['M_UserID'],
$param['receiveOrderPoID']
]);
if (!$que_update_ro) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] update status handover di RO");
exit;
}
}
$this->db->trans_commit();
$this->sys_ok("[Success] Berhasil menyimpan data serah terima barang");
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
function saveFiles()
{
try {
$this->db->trans_begin();
$param = $this->sys_input;
$user = $this->sys_user;
$path = "/home/one/project/accone/one-media/order-inventaris/";
$year = date('Y');
$targetpath = $path . $year . "/";
if (!is_dir($targetpath)) {
mkdir($targetpath, 0755, true);
}
$config['upload_path'] = $targetpath;
$config['allowed_types'] = 'jpg|jpeg|png';
$config['max_size'] = '10000';
$count = count($_FILES['files']['name']);
$this->load->library('upload', $config);
$error = [];
for ($i = 0; $i < $count; $i++) {
if (!empty($_FILES['files']['name'][$i])) {
$_FILES['file']['name'] = $_FILES['files']['name'][$i];
$_FILES['file']['type'] = $_FILES['files']['type'][$i];
$_FILES['file']['tmp_name'] = $_FILES['files']['tmp_name'][$i];
$_FILES['file']['error'] = $_FILES['files']['error'][$i];
$_FILES['file']['size'] = $_FILES['files']['size'][$i];
$ext = pathinfo($_FILES['name'][$i], PATHINFO_EXTENSION);
$random_str = bin2hex(random_bytes(4));
$new_filename = 'IVT' . $random_str . '_' . $param['receiveOrderPoNumber'] . $ext;
$config['file_name'] = $new_filename;
$this->upload->initialize($config);
if ($this->upload->do_upload('file')) {
$uploadData = $this->upload->data();
$filename = $uploadData['file_name'];
$sql_insert_file = "INSERT INTO receive_order_po_document (
ReceiveOrderPoDocumentReceiveOrderPoID,
ReceiveOrderPoDocumentDate,
ReceiveOrderPoDocumentFile,
ReceiveOrderPoDocumentIsActive,
ReceiveOrderPoDocumentCreated,
ReceiveOrderPoDocumentUserID
) VALUES(?,NOW(),?,'Y',NOW(),?)";
$que_insert_file = $this->db->query($sql_insert_file, [
$param['receiveOrderPoID'],
$filename,
$param['userId']
]);
if (!$que_insert_file) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] insert receive order po files");
exit;
}
} else {
$this->db->trans_rollback();
$error[] = $this->upload->display_errors();
$this->sys_error("[Error] " . $error);
exit;
}
}
}
$this->db->trans_commit();
$this->sys_ok("[Success] Berhasil upload file");
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
function getBarcodes()
{
try {
if (!$this->isLogin) {
$this->sys_error("invalid token");
exit;
}
$this->db->trans_begin();
$param = $this->sys_input;
$user = $this->sys_user;
$sql = "SELECT
T_BarcodeBarangID as id,
T_BarcodeBarangNumber,
M_ItemDesc,
M_BranchName,
M_RuanganName,
'N' as chex
FROM t_barcode_barang
JOIN m_item ON M_ItemID = T_BarcodeBarangM_ItemID
JOIN m_branch ON M_BranchID = T_BarcodeBarangM_BranchID
LEFT JOIN m_ruangan ON M_RuanganID = T_BarcodeBarangM_RuanganID
WHERE T_BarcodeBarangReceiveOrderPoID = ?
AND T_BarcodeBarangIsActive = 'Y'
ORDER BY T_BarcodeBarangID";
$que = $this->db->query($sql, [$param['ROID']]);
if (!$que) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] get barcodes");
exit;
}
$barcodes = $que->result_array();
if ($barcodes) {
foreach ($barcodes as $k => $v) {
if ($v['chex'] == 'N')
$barcodes[$k]['chex'] = false;
else
$barcodes[$k]['chex'] = true;
}
}
$this->db->trans_commit();
$this->sys_ok($barcodes);
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
private function insertJurnalPerItem($user, $detail_ro) {}
private function generatePurchaseInvoice($user, $ROID, $grni, $discpo, $shipping)
{
# generate nomor purchase invoice #
$numPI = $this->generateNoLogistik($user, 'PI');
# prepare data #
$sql_data_ro = "SELECT * FROM receive_order_po WHERE ReceiveOrderPoID = ?";
$que_data_ro = $this->db->query($sql_data_ro, [$ROID]);
if (!$que_data_ro) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] get data RO to generate PI");
exit;
}
$data_ro = $que_data_ro->row_array();
$sql_detail_ro = "SELECT
receive_order_po_detail.*,
M_ItemDesc,
PurchaseOrderSummaryDiscountType AS DiscountType,
PurchaseOrderSummaryDiscountRupiah AS DiscountRupiah,
PurchaseOrderSummaryDiscountPercent AS DiscountPercent,
PurchaseOrderSummaryDiscountAmount as DiscountPerItem
FROM receive_order_po_detail
JOIN m_item ON M_ItemID = ReceiveOrderPoItemID AND M_ItemIsActive = 'Y'
JOIN purchase_order_summary ON ReceiveOrderPoDetailPurchaseOrderSummaryID = PurchaseOrderSummaryID
WHERE ReceiveOrderPoDetailIsActive = 'Y'
AND ReceiveOrderPoDetailReceiveOrderPoID = ?";
$que_detail_ro = $this->db->query($sql_detail_ro, [$ROID]);
if (!$que_detail_ro) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] get data detail RO to generate PI");
exit;
}
$detail_ro = $que_detail_ro->result_array();
$due_date = new DateTime($data_ro['ReceiveOrderPoIDate']);
$due_date->add(new DateInterval('P30D'));
$due_date = $due_date->format('Y-m-d');
$subtotal = round(($grni - $shipping) + $discpo, 2);
# insert header purchase invoice #
$sql_insert_PI = "INSERT INTO supplier_invoice (
SupplierInvoiceNumber,
SupplierInvoiceReceiveOrderPoID,
SupplierInvoiceDate,
SupplierInvoiceDueDate,
SupplierInvoiceSupplierID,
SupplierInvoiceRefNumber,
SupplierInvoiceDeliveryOrderNumber,
SupplierInvoiceSubTotal,
SupplierInvoiceDiscountPercent,
SupplierInvoiceDiscountAmount,
SupplierInvoiceTaxPercentPph,
SupplierInvoiceTaxAmountPph,
SupplierInvoiceTaxPercentPpn,
SupplierInvoiceTaxAmountPpn,
SupplierInvoiceShippingCost,
SupplierInvoiceGrandTotal,
SupplierInvoiceUnpaid,
SupplierInvoiceNote,
SupplierInvoiceReceiveDate,
SupplierInvoiceReceivedBy,
SupplierInvoiceCreatedUserID
) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,NOW(),?,?)";
$que_insert_PI = $this->db->query($sql_insert_PI, [
$numPI,
$data_ro['ReceiveOrderPoID'],
$data_ro['ReceiveOrderPoIDate'],
$due_date,
$data_ro['ReceiveOrderPoSupplierID'],
$data_ro['ReceiveOrderPoRefNumber'],
$data_ro['ReceiveOrderPoDONumber'],
$subtotal,
0.00,
$discpo,
0.00,
0.00,
0.00,
0.00,
$shipping,
$grni,
$grni,
$data_ro['ReceiveOrderPoNote'],
$user['M_UserID'],
$user['M_UserID']
]);
if (!$que_insert_PI) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] insert header purchase invoice");
exit;
}
$Pinvoice_ID = $this->db->insert_id();
# insert detail purchase invoice #
$sql_insert_detailPI = "INSERT INTO supplier_invoice_detail (
SupplierInvoiceDetailSupplierInvoiceID,
SupplierInvoiceDetailPurchaseOrderID,
SupplierInvoiceDetailPurchaseOrderSummaryID,
SupplierInvoiceDetailReceiveOrderPoID,
SupplierInvoiceDetailReceiveOrderPoDetailID,
SupplierInvoiceDetailItemID,
SupplierInvoiceDetailItemUnitID,
SupplierInvoiceDetailDescription,
SupplierInvoiceDetailQty,
SupplierInvoiceDetailPrice,
SupplierInvoiceDetailDiscountPercent,
SupplierInvoiceDetailDiscountDiscountRupiah,
SupplierInvoiceDetailDiscountDiscountType,
SupplierInvoiceDetailDiscountPoProrata,
SupplierInvoiceDetailDiscountAmount,
SupplierInvoiceDetailTotal,
SupplierInvoiceDetailUnpaid,
SupplierInvoiceDetailCreatedUserID
) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
foreach ($detail_ro as $key => $item) {
$itemprice = doubleval($item['ReceiveOrderPoDetailPrice']) - doubleval($item['DiscountPerItem']);
$total_price = round($itemprice * intval($item['ReceiveOrderPoDetailQty']), 2);
$que_insert_itemPI = $this->db->query($sql_insert_detailPI, [
$Pinvoice_ID,
$item['ReceiveOrderPoDetailPurchaseOrderID'],
$item['ReceiveOrderPoDetailPurchaseOrderSummaryID'],
$item['ReceiveOrderPoDetailReceiveOrderPoID'],
$item['ReceiveOrderPoDetailID'],
$item['ReceiveOrderPoItemID'],
$item['ReceiveOrderPoItemUnitID'],
$item['M_ItemDesc'],
$item['ReceiveOrderPoDetailQty'],
$item['ReceiveOrderPoDetailPrice'],
$item['DiscountPercent'],
$item['DiscountRupiah'],
$item['DiscountType'],
$item['ReceiveOrderPoDetailDiskonPoProrata'],
$item['DiscountPerItem'],
$total_price,
$total_price,
$user['M_UserID']
]);
if (!$que_insert_itemPI) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] insert header purchase invoice");
exit;
}
}
# insert log activity #
$this->insertUserActivty($Pinvoice_ID, 'INV', 'CREATE', $user['M_UserID'], '');
}
private function insertLogReceiveOrderPo($id, $type, $dataBefore, $dataAfter, $userID, $desc = '')
{
$sql = "INSERT INTO acc_one_log.receive_order_po_log (
ReceiveOrderPoLogReceiveOrderPoID,
ReceiveOrderPoLogType,
ReceiveOrderPoLogDesc,
ReceiveOrderPoLogJsonBefore,
ReceiveOrderPoLogJsonAfter,
ReceiveOrderPoLogUserID,
ReceiveOrderPoLogCreated
) VALUES (?, ?, ?, ?, ?, ?, NOW())";
$que = $this->db->query($sql, [
$id,
$type,
$desc,
!empty($dataBefore) ? json_encode($dataBefore) : '',
!empty($dataAfter) ? json_encode($dataAfter) : '',
$userID
]);
if (!$que) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] inserting log into insert LogReceiveOrderPo");
exit;
}
}
private function insertLogPoItemReceive($id, $type, $roID, $dataBefore, $dataAfter, $userID, $desc = '')
{
$sql = "INSERT INTO acc_one_log.po_item_receive_log (
PoItemReceiveLogPoItemReceiveID,
PoItemReceiveLogReceiveOrderPoID,
PoItemReceiveLogType,
PoItemReceiveLogDesc,
PoItemReceiveLogJsonBefore,
PoItemReceiveLogJsonAfter,
PoItemReceiveLogUserID,
PoItemReceiveLogCreated
) VALUES (?, ?, ?, ?, ?, ?, ?, NOW())";
$que = $this->db->query($sql, [
$id,
$roID,
$type,
$desc,
!empty($dataBefore) ? json_encode($dataBefore) : '',
!empty($dataAfter) ? json_encode($dataAfter) : '',
$userID
]);
if (!$que) {
$this->sys_error_db("[Error] inserting log po item receive");
$this->db->trans_rollback();
exit;
}
}
private function insertUserActivty($id, $typePL, $status, $userID, $desc = '')
{
$sql = "INSERT INTO user_activity (
UserActivityCode,
UserActivityStatus,
UserActivityDescription,
UserActivityRefID,
UserActivityUserID,
UserActivityCreated
) VALUES (?, ?, ?, ?, ?, NOW())";
$que = $this->db->query($sql, [$typePL, $status, $desc, $id, $userID]);
if (!$que) {
$this->sys_error_db("[Error] inserting user activity");
$this->db->trans_rollback();
exit;
}
}
private function formatRupiah($data)
{
$data = str_replace(',', '.', $data);
if (!is_numeric($data)) {
return 'Input tidak valid';
}
$data = (float)$data;
$data = round($data, 2);
if (fmod($data, 1) == 0.0) {
$formatted = number_format($data, 0, ',', '.');
} else {
$formatted = number_format($data, 2, ',', '.');
}
return 'Rp ' . $formatted;
}
function template()
{
try {
if (!$this->isLogin) {
$this->sys_error("invalid token");
exit;
}
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
}