isLogin) { $this->sys_error("Invalid Token"); exit; } // $userId = $this->sys_user["M_UserID"]; $prm = $this->sys_input; $userId = $prm["userId"]; $rows = []; $query = "SELECT DISTINCT DivisionID, DivisionCode, DivisionName FROM division WHERE DivisionIsActive = 'Y' ORDER BY DivisionID ASC "; $exec = $this->db->query($query); if ($exec) { $rows = $exec->result_array(); } else { $this->db->trans_rollback(); $this->sys_error_db("select division", $this->db); exit; } $sql = "SELECT DISTINCT DivisionID, DivisionCode, DivisionName FROM division JOIN m_userdivision ON M_UserDivisionDivisionID = DivisionID AND M_UserDivisionM_UserID = ? WHERE DivisionIsActive = 'Y' ORDER BY M_UserDivisionID DESC LIMIT 1"; $exec = $this->db->query($sql, [$userId]); if ($exec) { $row = $exec->result_array(); } else { $this->sys_error_db("select division by user", $this->db); exit; } $result = array( "records" => $rows, "selected" => $row ); $this->sys_ok($result); } catch (Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } function search() { try { if (!$this->isLogin) { $this->sys_error("Invalid Token"); exit; } // $userId = $this->sys_user["M_UserID"]; $prm = $this->sys_input; $divisionID = $prm["divisionID"]; $search = $prm["search"]; if (empty($search)) { $search = "%"; } else { $search = "%" . $search . "%"; } // $filter = ""; // if ($divisionID != "0") { // $filter = " AND ItemUsageDivisionID = {$divisionID}"; // } $number_offset = 0; $number_limit = 10; if ($prm["current_page"] > 0) { $number_offset = ($prm["current_page"] - 1) * $number_limit; } $sql_total = "SELECT COUNT(*) AS total FROM item_usage JOIN division ON ItemUsageDivisionID = DivisionID AND DivisionIsActive = 'Y' JOIN m_item ON ItemUsageM_ItemID = M_ItemID AND M_ItemIsActive = 'Y' JOIN itemunit ON ItemUsageItemUnitID = ItemUnitID AND ItemUnitIsActive = 'Y' JOIN s_regional ON ItemUsageS_RegionalID= S_RegionalID AND S_RegionalIsActive = 'Y' LEFT JOIN m_branch ON ItemUsageM_BranchCode = M_BranchCode AND M_BranchIsActive = 'Y' WHERE ItemUsageIsActive = 'Y' AND ItemUsageDivisionID = ? AND (M_ItemDesc LIKE ?)"; $qry_total = $this->db->query($sql_total, [$divisionID, $search]); $tot_count = 0; $tot_page = 0; if ($qry_total) { $tot_count = $qry_total->result_array()[0]["total"]; $tot_page = ceil($tot_count / $number_limit); } else { $this->sys_error_db("Failed select item usage total", $this->db); exit; } $sql = "SELECT ItemUsageID, ItemUsageQty, ItemUsagePrice, DivisionID, DivisionCode, DivisionName, DivisionKodeSurat, M_ItemID, M_ItemCode, M_ItemDesc, ItemUnitID, ItemUnitCode, ItemUnitName, S_RegionalID, S_RegionalName, M_BranchID, M_BranchName, '' as listItemUsed FROM item_usage JOIN division ON ItemUsageDivisionID = DivisionID AND DivisionIsActive = 'Y' JOIN m_item ON ItemUsageM_ItemID = M_ItemID AND M_ItemIsActive = 'Y' JOIN itemunit ON ItemUsageItemUnitID = ItemUnitID AND ItemUnitIsActive = 'Y' JOIN s_regional ON ItemUsageS_RegionalID= S_RegionalID AND S_RegionalIsActive = 'Y' LEFT JOIN m_branch ON ItemUsageM_BranchCode = M_BranchCode AND M_BranchIsActive = 'Y' WHERE ItemUsageIsActive = 'Y' AND ItemUsageDivisionID = ? AND (M_ItemDesc LIKE ?) ORDER BY ItemUsageID DESC LIMIT ? OFFSET ?"; $qry = $this->db->query($sql, [$divisionID, $search, $number_limit, $number_offset]); if ($qry) { $rows = $qry->result_array(); } else { $this->sys_error_db("Failed select item usage", $this->db); exit; } foreach ($rows as $key => $value) { $sqldetail = "SELECT ItemUsageDetailID, ItemUsageDetailItemUsageID, ItemUsageDetailWarehouseID as WarehouseID, ItemUsageDetailWarehouseName as WarehouseName, ItemUsageDetailStockID as StockID, ItemUsageDetailStockNumber as StockNumber, ItemUsageDetailStockItemID as StockItemID, ItemUsageDetailStockItemUnitID as StockItemUnitID, ItemUsageDetailItemUnitCode as ItemUnitCode, ItemUsageDetailItemUnitName as ItemUnitName, ItemUsageDetailStockItemPrice as StockItemPrice, ItemUsageDetailStockBatchNo as StockBatchNo, ItemUsageDetailStockED as StockED, ItemUsageDetailStockQty as StockQty, ItemUsageDetailQtyReq as QtyReq, 0 as amountUsed FROM item_usage_detail WHERE ItemUsageDetailIsActive = 'Y' AND ItemUsageDetailItemUsageID = ?"; $qrydetail = $this->db->query($sqldetail, [$value['ItemUsageID']]); if ($qrydetail) { $batches = $qrydetail->result_array(); } else { $this->sys_error_db("Failed select item usage detail", $this->db); exit; } // Hitung total StockQty $totalStockQtyReq = 0; foreach ($batches as $batch) { $totalStockQtyReq += floatval($batch['QtyReq']); } $rows[$key]['TotalStockQtyReq'] = $totalStockQtyReq; $rows[$key]['ItemRequest'] = $batches; } $result = array( "toal_count" => $tot_count, "total_page" => $tot_page, "records" => $rows, ); $this->sys_ok($result); } catch (Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } function getUnit() { try { if (!$this->isLogin) { $this->sys_error("Invalid Token"); exit; } $prm = $this->sys_input; $itemUnitID = $prm["itemUnitID"]; $sql = "SELECT uc.UnitConvertID, uc.UnitConvertFromItemUnitID AS FromUnitID, uf.ItemUnitName AS FromUnitName, uc.UnitConvertToItemUnitID AS ToUnitID, ut.ItemUnitName AS ToUnitName, uc.UnitConvertAmount FROM unitconvert uc JOIN itemunit uf ON uf.ItemUnitID = uc.UnitConvertFromItemUnitID JOIN itemunit ut ON ut.ItemUnitID = uc.UnitConvertToItemUnitID WHERE uc.UnitConvertIsActive = 'Y' AND uc.UnitConvertFromItemUnitID = ?"; $qry = $this->db->query($sql, [$itemUnitID]); $rows = $qry->result_array(); // if ($qry && $qry->num_rows() > 0) { // } else { // // fallback → ambil langsung dari itemunit kalau tidak ada konversi // $sql2 = "SELECT // 0 AS UnitConvertID, // iu.ItemUnitID AS FromUnitID, // iu.ItemUnitName AS FromUnitName, // iu.ItemUnitID AS ToUnitID, // iu.ItemUnitName AS ToUnitName, // 1 AS UnitConvertAmount // FROM itemunit iu // WHERE iu.ItemUnitID = ?"; // $qry2 = $this->db->query($sql2, [$itemUnitID]); // $rows = $qry2->result_array(); // } $result = array("records" => $rows); $this->sys_ok($result); } catch (Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } function getUnitByItemId() { try { if (!$this->isLogin) { $this->sys_error("Invalid Token"); exit; } $prm = $this->sys_input; $itemId = isset($prm["itemId"]) ? $prm["itemId"] : ""; if ($itemId == "") { $this->sys_error("Invalid Item ID"); exit; } $sql = "SELECT DISTINCT ItemUnitID as StockItemUnitID, ItemUnitCode, ItemUnitName FROM itemunitmap JOIN itemunit ON ItemUnitID = ItemUnitMapItemUnitID AND ItemUnitIsActive = 'Y' WHERE ItemUnitMapM_ItemID = ? AND ItemUnitMapIsActive = 'Y'"; $query = $this->db->query($sql, [$itemId]); if (!$query) { $this->sys_error_db("item unit list", $this->db); exit; } $rows = $query->result_array(); $result = array( "records" => $rows ); $this->sys_ok($result); } catch (Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } function saveItemUsage() { try { if (!$this->isLogin) { $this->sys_error("Invalid Token"); exit; } $this->db->trans_begin(); $prm = $this->sys_input; $userId = $this->sys_user["M_UserID"]; $ItemUsageID = $prm["ItemUsageID"]; $ItemRequest = $prm["ItemRequest"]; $date = date('Y-m-d'); $sqlnum = "SELECT `fn_numbering`('IU') as IUnumber"; $qrynum = $this->db->query($sqlnum, []); $IUnumber = $qrynum->row()->IUnumber; foreach ($ItemRequest as $key => $value) { $amountUsed = intval($value['amountUsed']); // ambil amountUsed yang ada isinya maka lakukan insert if ($amountUsed > 0) { // ambil data item_usage_detail dulu $sqldetail = "SELECT ItemUsageDetailID, ItemUsageDetailItemUsageID, ItemUsageDetailWarehouseID as WarehouseID, ItemUsageDetailWarehouseName as WarehouseName, ItemUsageDetailStockID as StockID, ItemUsageDetailStockNumber as StockNumber, ItemUsageDetailStockItemID as StockItemID, ItemUsageDetailStockItemUnitID as StockItemUnitID, ItemUsageDetailItemUnitCode as ItemUnitCode, ItemUsageDetailItemUnitName as ItemUnitName, ItemUsageDetailStockItemPrice as StockItemPrice, ItemUsageDetailStockBatchNo as StockBatchNo, ItemUsageDetailStockED as StockED, ItemUsageDetailStockQty as StockQty, ItemUsageDetailQtyReq as QtyReq, 0 as amountUsed FROM item_usage_detail WHERE ItemUsageDetailIsActive = 'Y' AND ItemUsageDetailID = ?"; $qrydetail = $this->db->query($sqldetail, [$value['ItemUsageDetailID']]); if ($qrydetail) { $batches = $qrydetail->result_array(); } else { $this->sys_error_db("Failed select item usage detail", $this->db); exit; } foreach ($batches as $k => $batch) { // cari batch yang sesuai StockID if ($batch['StockID'] == $value['StockID']) { $hargaBase = doubleval($batch['StockItemPrice'] ?? 0); $fromUnitID = intval($batch['StockItemUnitID']); $toUnitID = intval($value['StockItemUnitID']); // dari request if ($fromUnitID == $toUnitID) { // unit sama persis, tidak perlu konversi $batches[$k]['QtyReq'] = floatval($batch['QtyReq']) - $amountUsed; $batches[$k]['amountUsed'] = $amountUsed; $batches[$k]['HargaPerUnit'] = $hargaBase; $batches[$k]['TotalHarga'] = round($amountUsed * $hargaBase, 2); } else if ($fromUnitID != $toUnitID) { // unit beda, ambil konversi dari unitconvert $resultAmountConvert = $this->getConvertAmount($fromUnitID, $toUnitID); // konversi jumlah $pemakaianBase = $amountUsed / $resultAmountConvert; $batches[$k]['QtyReq'] = floatval($batch['QtyReq']) - $pemakaianBase; // harga per unit kecil $hargaPerUnit = $resultAmountConvert > 0 ? $hargaBase / $resultAmountConvert : 0; $batches[$k]['amountUsed'] = $amountUsed; $batches[$k]['HargaPerUnit'] = $hargaPerUnit; $batches[$k]['TotalHarga'] = round($amountUsed * $hargaPerUnit, 2); } } } foreach ($batches as $k => $ub) { $sql = "INSERT INTO item_used( ItemUsedDate, ItemUsedNumber, ItemUsedItemUsageID, ItemUsedBatchNo, ItemUsedM_ItemID, ItemUsedItemUnitID, ItemUsedQty, ItemUsedPrice, ItemUsedTotal, ItemUsedIsActive, ItemUsedUserID, ItemUsedCreated ) VALUES(?,?,?,?,?,?,?,?,?,'Y',?,NOW())"; $qry = $this->db->query($sql, [ $date, $IUnumber, $ItemUsageID, $value['StockBatchNo'], $value['StockItemID'], $value['StockItemUnitID'], $ub['amountUsed'], $ub['HargaPerUnit'], $ub['TotalHarga'], $userId ]); if (!$qry) { $this->db->trans_rollback(); $this->sys_error_db("Failed insert item used", $this->db); exit; } $sqlUpdate = "UPDATE item_usage_detail SET ItemUsageDetailQtyReq = ?, ItemUsageDetailLastUpdated = NOW() WHERE ItemUsageDetailID = ?"; $qryUpdate = $this->db->query($sqlUpdate, [ $ub['QtyReq'], $ub['ItemUsageDetailID'] ]); if (!$qryUpdate) { $this->db->trans_rollback(); $this->sys_error_db("Failed update item usage detail", $this->db); exit; } } } } $this->insertUserActivityUsage($ItemUsageID, $userId, 'UPDATE', 'Pemakaian item pada tanggal ' . date('d-m-Y')); $this->insertUserActivityUsed($ItemUsageID, $userId, 'SAVE', 'Pemakaian item dengan kode ' . $IUnumber . ' telah dibuat'); $this->db->trans_commit(); $result = array( "records" => "0", "message" => "Item usage saved successfully", ); $this->sys_ok($result); } catch (Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } function getConvertAmount($fromUnitID, $toUnitID) { $sql = "SELECT UnitConvertAmount FROM unitconvert WHERE UnitConvertFromItemUnitID = ? AND UnitConvertToItemUnitID = ? AND UnitConvertIsActive = 'Y'"; $convert = $this->db->query($sql, [$fromUnitID, $toUnitID])->row(); if (!$convert) { $this->sys_error("Konversi unit tidak ditemukan."); exit; } return intval($convert->UnitConvertAmount); } function getItemUsed() { try { if (!$this->isLogin) { $this->sys_error("Invalid Token"); exit; } $prm = $this->sys_input; $itemUsageID = $prm["itemUsageID"]; $startdate = $prm["startdate"]; $enddate = $prm["enddate"]; $search = $prm["search"]; if (empty($search)) { $search = "%"; } else { $search = "%" . $search . "%"; } $statusConfirm = $prm["statusConfirm"]; if ($statusConfirm == "Y") { $statusConfirm = "AND ItemUsedIsConfirm = 'Y'"; } elseif ($statusConfirm == "N") { $statusConfirm = "AND ItemUsedIsConfirm = 'N'"; } else { $statusConfirm = ""; } $number_offset = 0; $number_limit = 10; if ($prm["current_page"] > 0) { $number_offset = ($prm["current_page"] - 1) * $number_limit; } $sql_total = "SELECT COUNT(*) AS total FROM item_used JOIN m_item ON ItemUsedM_ItemID = M_ItemID AND M_ItemIsActive = 'Y' JOIN itemunit ON ItemUsedItemUnitID = ItemUnitID AND ItemUnitIsActive = 'Y' LEFT JOIN m_user ON ItemUsedUserID = M_UserID AND M_UserIsActive = 'Y' WHERE ItemUsedIsActive = 'Y' AND ItemUsedItemUsageID = ? AND (M_ItemDesc LIKE ?) AND ItemUsedDate BETWEEN ? AND ? $statusConfirm"; $qry_total = $this->db->query($sql_total, [$itemUsageID, $search, $startdate, $enddate]); $tot_count = 0; $tot_page = 0; if ($qry_total) { $tot_count = $qry_total->result_array()[0]["total"]; $tot_page = ceil($tot_count / $number_limit); } else { $this->sys_error_db("Failed select item used total", $this->db); exit; } $sql = "SELECT ItemUsedID, ItemUsedNumber, ItemUsedBatchNo, ItemUsedDate, ItemUsedQty, ItemUsedPrice, ItemUsedTotal, ItemUsedIsConfirm, ItemUnitID, ItemUnitName, M_ItemID, M_ItemCode, M_ItemDesc, M_UserUsername FROM item_used JOIN m_item ON ItemUsedM_ItemID = M_ItemID AND M_ItemIsActive = 'Y' JOIN itemunit ON ItemUsedItemUnitID = ItemUnitID AND ItemUnitIsActive = 'Y' LEFT JOIN m_user ON ItemUsedUserID = M_UserID AND M_UserIsActive = 'Y' WHERE ItemUsedIsActive = 'Y' AND ItemUsedItemUsageID = ? AND (M_ItemDesc LIKE ?) AND ItemUsedDate BETWEEN ? AND ? $statusConfirm ORDER BY ItemUsedID DESC LIMIT ? OFFSET ?"; $qry = $this->db->query($sql, [$itemUsageID, $search, $startdate, $enddate, $number_limit, $number_offset]); if ($qry) { $rows = $qry->result_array(); } else { $this->sys_error_db("Failed select item used", $this->db); exit; } $result = array( "total_count" => $tot_count, "total_page" => $tot_page, "records" => $rows ); $this->sys_ok($result); } catch (Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } public function updateItemUsed() { try { $payload = $this->sys_input; $userId = $this->sys_user["M_UserID"]; $itemUsedID = (int)$payload['itemUsedID']; $newUsedQty = (float)$payload['ItemUsedQty']; // qty baru $this->db->trans_begin(); // ambil data lama dari item_used $sql_used = "SELECT ItemUsedQty, ItemUsedItemUsageID, ItemUsedItemUnitID FROM item_used WHERE ItemUsedID = ?"; $oldData = $this->db->query($sql_used, [$itemUsedID])->row(); if (!$oldData) { $this->db->trans_rollback(); $this->sys_error("Data pemakaian tidak ditemukan."); return; } $oldQty = (float)$oldData->ItemUsedQty; $itemUsageID = $oldData->ItemUsedItemUsageID; $fromUnitID = $oldData->ItemUsedItemUnitID; // ambil item_usage untuk tahu unit besar $sql_usage = "SELECT ItemUsageQty, ItemUsageItemUnitID FROM item_usage WHERE ItemUsageID = ?"; $usageData = $this->db->query($sql_usage, [$itemUsageID])->row(); if (!$usageData) { $this->db->trans_rollback(); $this->sys_error("Data usage tidak ditemukan."); return; } $currentUsageQty = (float)$usageData->ItemUsageQty; $toUnitID = $usageData->ItemUsageItemUnitID; // unit besar // ambil konversi unit kecil -> unit besar $sql_convert = "SELECT UnitConvertAmount FROM unitconvert WHERE UnitConvertFromItemUnitID = ? AND UnitConvertToItemUnitID = ?"; $convert = $this->db->query($sql_convert, [$toUnitID, $fromUnitID])->row(); if (!$convert) { $this->db->trans_rollback(); $this->sys_error("Konversi unit tidak ditemukan."); return; } $convertAmount = (float)$convert->UnitConvertAmount; // hitung perubahan qty dalam unit besar $oldQtyInBig = $oldQty / $convertAmount; $newQtyInBig = $newUsedQty / $convertAmount; $diffInBig = $newQtyInBig - $oldQtyInBig; // jika diff positif (pemakaian bertambah) → stok dikurangi if ($diffInBig > 0) { if ($currentUsageQty < $diffInBig) { $this->db->trans_rollback(); $this->sys_error("Stok tidak mencukupi. Stok tersedia: {$currentUsageQty}."); return; } $newUsageQty = $currentUsageQty - $diffInBig; } // jika diff negatif (pemakaian berkurang) → stok dikembalikan else { $newUsageQty = $currentUsageQty + abs($diffInBig); } // update item_usage $sql_update_usage = "UPDATE item_usage SET ItemUsageQty = ?, ItemUsageLastUpdated = NOW(), ItemUsageUserID = ? WHERE ItemUsageID = ?"; $this->db->query($sql_update_usage, [ $newUsageQty, $userId, $itemUsageID ]); // update item_used $sql_update_used = "UPDATE item_used SET ItemUsedQty = ?, ItemUsedLastUpdated = NOW(), ItemUsedUserID = ? WHERE ItemUsedID = ?"; $this->db->query($sql_update_used, [ $newUsedQty, $userId, $itemUsedID ]); $sqlu = "SELECT ItemUsedID, ItemUsedNumber FROM item_used WHERE ItemUsedIsActive = 'Y' AND ItemUsedID = ?"; $qryu = $this->db->query($sqlu, [$itemUsedID]); if (!$qryu) { $this->db->trans_rollback(); $this->sys_error_db("Failed get item", $this->db); exit; } $rowitem = $qryu->row_array(); $this->insertUserActivityUsage($itemUsageID, $userId, 'UPDATE', 'Pemakaian item pada tanggal ' . date('d-m-Y')); $this->insertUserActivityUsed($itemUsageID, $userId, 'UPDATE', 'Pemakaian item dengan kode ' . $rowitem['ItemUsedNumber'] . ' telah diupdate'); $this->db->trans_commit(); $this->sys_ok("Item used berhasil diupdate."); } catch (Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } public function deleteItemUsed() { try { if (!$this->isLogin) { $this->sys_error("Invalid Token"); } $payload = $this->sys_input; $userId = $this->sys_user["M_UserID"]; $itemUsedID = $payload["itemUsedID"]; // ambil data item_used $sql = "SELECT * FROM item_used WHERE ItemUsedID = ? AND ItemUsedIsActive = 'Y'"; $itemUsed = $this->db->query($sql, [$itemUsedID])->row(); if (!$itemUsed) { $this->sys_error("Data item_used tidak ditemukan atau sudah tidak aktif"); return; } // ambil item_usage $sql_usage = "SELECT * FROM item_usage WHERE ItemUsageID = ?"; $itemUsage = $this->db->query($sql_usage, [$itemUsed->ItemUsedItemUsageID])->row(); if (!$itemUsage) { $this->sys_error("Data item_usage tidak ditemukan"); return; } $restoreQty = (float)$itemUsed->ItemUsedQty; // cek apakah unit sama atau perlu konversi if ($itemUsed->ItemUsedItemUnitID != $itemUsage->ItemUsageItemUnitID) { $sql_convert = "SELECT UnitConvertAmount FROM unitconvert WHERE UnitConvertFromItemUnitID = ? AND UnitConvertToItemUnitID = ?"; $convert = $this->db->query($sql_convert, [ $itemUsage->ItemUsageItemUnitID, $itemUsed->ItemUsedItemUnitID ])->row(); if (!$convert) { $this->sys_error("Konversi unit tidak ditemukan, tidak bisa restore qty"); return; } // ubah qty ke unit besar $restoreQty = $restoreQty / $convert->UnitConvertAmount; } $this->db->trans_begin(); // 1. update item_used menjadi tidak aktif $sql_update_used = "UPDATE item_used SET ItemUsedIsActive = 'N', ItemUsedLastUpdated = NOW(), ItemUsedUserID = ? WHERE ItemUsedID = ?"; $this->db->query($sql_update_used, [$userId, $itemUsedID]); // 2. kembalikan qty ke item_usage $sql_update_usage = "UPDATE item_usage SET ItemUsageQty = ItemUsageQty + ?, ItemUsageLastUpdated = NOW(), ItemUsageUserID = ? WHERE ItemUsageID = ?"; $this->db->query($sql_update_usage, [ $restoreQty, $userId, $itemUsage->ItemUsageID ]); $sqlu = "SELECT ItemUsedID, ItemUsedNumber FROM item_used WHERE ItemUsedIsActive = 'Y' AND ItemUsedID = ?"; $qryu = $this->db->query($sqlu, [$itemUsedID]); if (!$qryu) { $this->db->trans_rollback(); $this->sys_error_db("Failed get item", $this->db); exit; } $rowitem = $qryu->row_array(); $this->insertUserActivityUsage($itemUsage->ItemUsageID, $userId, 'UPDATE', 'Pemakaian item pada tanggal ' . date('d-m-Y')); $this->insertUserActivityUsed($itemUsedID, $userId, 'DELETE', 'Pemakaian item dengan kode ' . $rowitem['ItemUsedNumber'] . ' telah dihapus'); $this->db->trans_commit(); $this->sys_ok("ItemUsed berhasil dihapus dan qty dikembalikan"); } catch (Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } public function confirmItemUsed() { try { if (!$this->isLogin) { $this->sys_error("Invalid Token"); } $payload = $this->sys_input; $userId = $this->sys_user["M_UserID"]; $this->db->trans_begin(); $itemUsedID = $payload["itemUsedID"]; // ambil data item_used $sql = "SELECT * FROM item_used WHERE ItemUsedID = ? AND ItemUsedIsActive = 'Y'"; $itemUsed = $this->db->query($sql, [$itemUsedID])->row(); if (!$itemUsed) { $this->db->trans_rollback(); $this->sys_error("Data item_used tidak ditemukan atau sudah tidak aktif"); exit; } // update status konfirmasi $sql_update = "UPDATE item_used SET ItemUsedIsConfirm = 'Y', ItemUsedLastUpdated = NOW(), ItemUsedUserID = ? WHERE ItemUsedID = ?"; $this->db->query($sql_update, [$userId, $itemUsedID]); // generate jurnal $this->generateJurnal($itemUsedID); $sqlu = "SELECT ItemUsedID, ItemUsedNumber FROM item_used WHERE ItemUsedIsActive = 'Y' AND ItemUsedID = ?"; $qryu = $this->db->query($sqlu, [$itemUsedID]); if (!$qryu) { $this->db->trans_rollback(); $this->sys_error_db("Failed get item", $this->db); exit; } $rowitem = $qryu->row_array(); $this->insertUserActivityUsed($itemUsedID, $userId, 'KONFIRMASI', 'Pemakaian item dengan kode ' . $rowitem['ItemUsedNumber'] . ' telah dikonfirmasi'); $this->db->trans_commit(); $this->sys_ok("ItemUsed berhasil dikonfirmasi"); } catch (Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } function generateJurnal($itemusedID) { try { $this->db->trans_begin(); $user = $this->sys_user; $sqldata = "SELECT ItemUsedID, DATE_FORMAT(ItemUsedDate, '%d-%m-%Y') as ItemUsedDate, ItemUsedNumber, ItemUsedBatchNo, ItemUsedQty, ItemUsedPrice, ItemUsedTotal, ItemUsageID, ItemUsageQty, ItemUsagePrice, ItemUsedTotal, M_ItemID, CASE WHEN M_ItemCode IS NULL OR M_ItemCode = '' THEN M_ItemDesc ELSE CONCAT(M_ItemCode, ' - ', M_ItemDesc) END AS M_ItemDesc, ItemUnitID, ItemUnitCode, ItemUnitName, M_UserUsername, DivisionID, DivisionCode, DivisionName FROM item_used JOIN item_usage ON ItemUsedItemUsageID = ItemUsageID AND ItemUsageIsActive = 'Y' JOIN m_item ON ItemUsedM_ItemID = M_ItemID AND M_ItemIsActive = 'Y' JOIN itemunit ON ItemUsedItemUnitID = ItemUnitID AND ItemUnitIsActive = 'Y' LEFT JOIN m_user ON ItemUsedUserID = M_UserID LEFT JOIN m_userdivision ON M_UserDivisionM_UserID = M_UserID AND M_UserDivisionIsActive = 'Y' LEFT JOIN division ON M_UserDivisionDivisionID = DivisionID AND DivisionIsActive = 'Y' WHERE ItemUsedIsActive = 'Y' AND ItemUsedID = ?"; $qrydata = $this->db->query($sqldata, [$itemusedID]); if (!$qrydata) { $this->db->trans_rollback(); $this->sys_error_db("get data item used error", $this->db); exit; } $datarow = $qrydata->row_array(); // generate numbering jurnal $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"]; // ambil data periode $sql = "SELECT periodeID FROM periode WHERE DATE_FORMAT(NOW(), '%Y-%m-%d') BETWEEN periodeStartDate AND periodeEndDate AND periodeIsActive= 'Y' AND periodeIsClosed = 'N'"; $qry = $this->db->query($sql, []); 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 pemakaian item No. {$datarow['ItemUsedNumber']} Tanggal {$datarow['ItemUsedDate']}"; $jurnalDesc = "Jurnal pemakaian item No. {$datarow['ItemUsedNumber']} Tanggal {$datarow['ItemUsedDate']} dengan nama item {$datarow['M_ItemDesc']}, Batch No {$datarow['ItemUsedBatchNo']} oleh {$datarow['M_UserUsername']} divisi {$datarow['DivisionName']}"; // ambil item untuk cek persediaan $sqlItem = "SELECT * FROM m_item WHERE M_ItemID = ?"; $qryItem = $this->db->query($sqlItem, [ $datarow["M_ItemID"] ]); if (!$sqlItem) { $this->db->trans_rollback(); $this->sys_error_db("ERROR, qry item", $this->db); exit; } $cekItem = $qryItem->row_array(); if (empty($cekItem)) { $this->db->trans_rollback(); $this->sys_error_db("Item {$datarow['ItemUsedNumber']} {$datarow['M_ItemDesc']} tidak ditemukan", $this->db); exit; } if ($cekItem['M_ItemItem_CategoryID'] == 0 || $cekItem['M_ItemItem_CategoryID'] == null || $cekItem['M_ItemItem_CategoryID'] == '') { $this->db->trans_rollback(); $this->sys_error_db("Item {$datarow['ItemUsedNumber']} {$datarow['M_ItemDesc']} belum memiliki kategori", $this->db); exit; } // cek persediaan $date = date('Y-m-d'); $detailJurnal = []; 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 {$datarow['ItemUsedNumber']} {$datarow['M_ItemDesc']} belum memiliki sub grup", $this->db); exit; } $sqlSubGrup = "SELECT * FROM map_nat_subgroup WHERE MapNatSub_NatGroupID = ? AND MapNatSub_NatSubGroupID = ? AND MapNatSub_IsActive = 'Y'"; $qrySubGrup = $this->db->query($sqlSubGrup, [ $cekItem['M_ItemNat_GroupID'], $cekItem['M_ItemNat_SubGroupID'] ]); if (!$qrySubGrup) { $this->db->trans_rollback(); $this->sys_error_db("ERROR, get map nat subgrup", $this->db); exit; } $rowMapNatSubGrup = $qrySubGrup->row_array(); // print_r($rowMapNatSubGrup); if ( $rowMapNatSubGrup['MapNatSub_PersediaanCoaID'] == null || $rowMapNatSubGrup['MapNatSub_PersediaanCoaID'] == '' || $rowMapNatSubGrup['MapNatSub_PersediaanCoaAccountNo'] == null || $rowMapNatSubGrup['MapNatSub_PersediaanCoaAccountNo'] == '' || $rowMapNatSubGrup['MapNatSub_PersediaanCoaDescription'] == null || $rowMapNatSubGrup['MapNatSub_PersediaanCoaDescription'] == '' ) { $this->db->trans_rollback(); $this->sys_error_db("Coa persediann, item {$datarow['ItemUsedNumber']} {$datarow['M_ItemDesc']} belum termapping", $this->db);; exit; } if ( $rowMapNatSubGrup['MapNatSub_BiayaCoaID'] == null || $rowMapNatSubGrup['MapNatSub_BiayaCoaID'] == '' || $rowMapNatSubGrup['MapNatSub_BiayaCoaAccountNo'] == null || $rowMapNatSubGrup['MapNatSub_BiayaCoaAccountNo'] == '' || $rowMapNatSubGrup['MapNatSub_BiayaCoaDescription'] == null || $rowMapNatSubGrup['MapNatSub_BiayaCoaDescription'] == '' ) { $this->db->trans_rollback(); $this->sys_error_db("Coa biaya pemakaian, item {$datarow['ItemUsedNumber']} {$datarow['M_ItemDesc']} belum termapping", $this->db);; exit; } $detailJurnal = [ [ 'coaID' => $rowMapNatSubGrup['MapNatSub_BiayaCoaID'], 'xdescription' => $rowMapNatSubGrup['MapNatSub_BiayaCoaDescription'], 'debit' => $datarow['ItemUsedTotal'], 'credit' => 0 ], [ 'coaID' => $rowMapNatSubGrup['MapNatSub_PersediaanCoaID'], 'xdescription' => $rowMapNatSubGrup['MapNatSub_PersediaanCoaDescription'], 'debit' => 0, 'credit' => $datarow['ItemUsedTotal'] ] ]; } $this->saveJurnal( $date, $jurnalDesc, $periodeID, $numbering, $jurnalTitle, $detailJurnal, $user['M_BranchCompanyID'], $user['S_RegionalID'], $user['M_BranchCode'], $datarow['ItemUsedNumber'] ); $this->db->trans_commit(); } catch (Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } function saveJurnal( $date, $jurnalDesc, $periodeID, $numbering, $jurnalTitle, $detailJurnal, $branchCompanyID, $regionalID, $branchCode, $noIU ) { try { $this->db->trans_begin(); $userid = $this->sys_user['M_UserID']; $sql = "INSERT INTO jurnal( jurnalM_BranchCompanyID, JurnalS_RegionalID, jurnalM_BranchCode, jurnalperiodeID, jurnalNo, jurnalTitle, jurnalDescription, jurnalDate, jurnalJurnalTypeID, jurnalIsActive, jurnalCreated, jurnalM_UserID ) VALUES(?,?,?,?,?,?,?,?,?,'Y',NOW(),?)"; $qry = $this->db->query($sql, array( $branchCompanyID, $regionalID, $branchCode, $periodeID, $numbering, $jurnalTitle, $jurnalDesc, $date, 23, $userid )); $last_qry = $this->db->last_query(); if (!$qry) { $this->db->trans_rollback(); $error = array( "message" => $this->db->error()["message"], "sql" => $last_qry ); $this->sys_error_db($error, $this->db); exit; } $last_id = $this->db->insert_id(); foreach ($detailJurnal as $key => $value) { $sql_detail = "INSERT INTO jurnal_tx( jurnalTxJurnalID, jurnalTxCoaID, jurnalTxDescription, jurnalTxDebit, jurnalTxCredit, jurnalTxIsActive, jurnalTxCreated, jurnalTxM_UserID) VALUES(?,?,?,?,?,'Y',NOW(),?)"; $qry_detail = $this->db->query($sql_detail, array( $last_id, $value["coaID"], $value["xdescription"], $value["debit"], $value["credit"], $userid )); $last_qry = $this->db->last_query(); if (!$qry_detail) { $this->db->trans_rollback(); $error = array( "message" => $this->db->error()["message"], "sql" => $last_qry ); $this->sys_error_db($error, $this->db); exit; } $tx_id = $this->db->insert_id(); $sql = "INSERT INTO jurnal_addon (jurnalAddOnJurnalID, jurnalAddOnJurnalTxID, jurnalAddOnCode, jurnalAddOnValue, jurnalAddOnCreated, jurnalAddOnCreatedUserID, jurnalAddOnLastUpdatedUserID, jurnalAddOnLastUpdated) VALUES (?, ?, 'AUTOITEMUSAGE', ?, now(), ?, ?, now())"; $qry = $this->db->query($sql, array( $last_id, $tx_id, $noIU, $userid, $userid )); $last_qry = $this->db->last_query(); if (!$qry) { $this->db->trans_rollback(); $error = array( "message" => $this->db->error()["message"], "sql" => $last_qry ); $this->sys_error_db($error, $this->db); exit; } } $this->db->trans_commit(); } catch (Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } function insertUserActivityUsage($itemusageID, $userId, $status, $userdesc) { try { // insert log $sql_json = "SELECT item_usage.* FROM item_usage WHERE ItemUsageIsActive = 'Y' AND ItemUsageID = ?"; $qry_json = $this->db->query($sql_json, [$itemusageID]); if (!$qry_json) { $this->db->trans_rollback(); $this->sys_error_db("select json io error"); exit; } $row_json = $qry_json->row_array(); $sql_log = "INSERT INTO user_activity( UserActivityCode, UserActivityStatus, UserActivityDescription, UserActivityRefID, UserActivityData, UserActivityUserID, UserActivityCreated ) VALUES('USAGE',?,?,?,?,?,NOW())"; $qry_log = $this->db->query($sql_log, [ $status, $userdesc, $itemusageID, json_encode($row_json), $userId ]); if (!$qry_log) { $this->db->trans_rollback(); $this->sys_error_db("insert user activity error", $this->db); exit; } } catch (Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } function insertUserActivityUsed($itemusedID, $userId, $status, $userdesc) { try { // insert log $sql_json = "SELECT item_used.* FROM item_used WHERE ItemUsedIsActive = 'Y' AND ItemUsedID = ?"; $qry_json = $this->db->query($sql_json, [$itemusedID]); if (!$qry_json) { $this->db->trans_rollback(); $this->sys_error_db("select json io error"); exit; } $row_json = $qry_json->row_array(); $sql_log = "INSERT INTO user_activity( UserActivityCode, UserActivityStatus, UserActivityDescription, UserActivityRefID, UserActivityData, UserActivityUserID, UserActivityCreated ) VALUES('USED',?,?,?,?,?,NOW())"; $qry_log = $this->db->query($sql_log, [ $status, $userdesc, $itemusedID, json_encode($row_json), $userId ]); if (!$qry_log) { $this->db->trans_rollback(); $this->sys_error_db("insert user activity error", $this->db); exit; } } catch (Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } }