isLogin) { $this->sys_error("Invalid Token"); exit; } $sql = "SELECT * FROM jurnal_type WHERE JurnalTypeIsActive = 'Y'"; $qry = $this->db->query($sql, []); if (!$qry) { $this->sys_error_db("getTipeJurnal: ", $this->db); exit; } $rst = $qry->result_array(); foreach ($rst as $key => $value) { if ($value['JurnalTypeCode'] == 'GOODRECEIVE') { $default = $value; } } $this->sys_ok([ "default" => $default, "records" => $rst ]); } catch (Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } public function getPeriode() { try { if (! $this->isLogin) { $this->sys_error("Invalid Token"); exit; } $prm = $this->sys_input; $search = '%' . $prm['search'] . '%'; $sql = "SELECT CONCAT(periodeYear, ' - ', periodeName) as displayPeriode, CONCAT(DATE_FORMAT(periodeStartDate, '%d %M %Y'), ' - ', DATE_FORMAT(periodeEndDate, '%d %M %Y')) as periode, periode.* FROM periode WHERE periodeIsActive = 'Y' AND periodeIsClosed = 'N' AND CONCAT(periodeYear, ' - ', periodeName) LIKE ? LIMIT 70 "; $qry = $this->db->query($sql, [$search]); if (!$qry) { $this->sys_error_db("Error get periode", $this->db); exit; } $data = $qry->result_array(); $this->sys_ok($data); } catch (Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } public function getSupplier() { try { if (! $this->isLogin) { $this->sys_error("Invalid Token"); exit; } $prm = $this->sys_input; $search = '%%'; if (isset($prm['search'])) { $search = trim($prm["search"]); if ($search != "") { $search = '%' . $search . '%'; } else { $search = '%%'; } } $sql = "SELECT CONCAT(SupplierCode, ' - ', SupplierName) as displaySupplier, supplier.* FROM supplier WHERE SupplierIsActive = 'Y' AND CONCAT(SupplierCode, ' - ', SupplierName) LIKE ?"; $qry = $this->db->query($sql, [$search]); if (!$qry) { $this->sys_error_db("select supplier", $this->db); exit; } $rst = $qry->result_array(); $this->sys_ok($rst); } catch (Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } public function getCoa() { try { if (! $this->isLogin) { $this->sys_error("Invalid Token"); exit; } $prm = $this->sys_input; $search = ""; if (isset($prm['search'])) { $search = trim($prm["search"]); if ($search != "") { $search = '%' . $prm['search'] . '%'; } else { $search = '%%'; } } $limit = 70; // dihapus jika perlu tampil semua $sql = "SELECT * FROM coa WHERE coaIsActive = 'Y' -- AND coaIsInput = 'Y' -- TODO: uncomment setelah diinject AND coaAccountNo != '' AND (coaDescription LIKE ? OR coaSubDescription LIKE ? OR coaAccountNo LIKE ?) ORDER BY coaAccountNo ASC LIMIT ?"; $qry = $this->db->query($sql, [$search, $search, $search, $limit]); if ($qry) { $rows = $qry->result_array(); } else { $this->db->trans_rollback(); $this->sys_error_db("select coa", $this->db); exit; } $result = array( "records" => $rows, ); $this->sys_ok($result); } catch (Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } public function createJurnal() { try { if (! $this->isLogin) { $this->sys_error("Invalid Token"); exit; } // Get Parameter $userID = $this->sys_user["M_UserID"]; $prm = $this->sys_input; $jurnalTypeID = $prm['jurnalType'] ?? 2; // Harusnya 2 : GOODRECEIVE $details = $prm['details']; // TODO: Dihapus jika sudah ada M_BranchCode di parameter $sql = "SELECT M_BranchCode FROM m_branch WHERE M_BranchID = ?"; $qry = $this->db->query($sql, [$prm['M_BranchID']]); if (!$qry) { $this->sys_error_db("Failed to get branch code", $this->db); exit; } $rst = $qry->row(); $branchCode = $rst->M_BranchCode; $sql = "SELECT `fn_numbering`('J') as jurnalNo"; $qry = $this->db->query($sql, []); if (!$qry) { $this->sys_error_db("Failed to get jurnal number", $this->db); exit; } $rst = $qry->row(); $jurnalNo = $rst->jurnalNo; // Start Transaction $this->db->trans_start(); $sqlHeader = "INSERT INTO jurnal (jurnalM_BranchCompanyID, JurnalS_RegionalID, jurnalM_BranchCode, jurnalperiodeID, jurnalNo, jurnalTitle, jurnalDescription, jurnalDate, jurnalJurnalTypeID, jurnalM_UserID, jurnalCreated) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, NOW())"; $this->db->query($sqlHeader, [ $prm['M_BranchCompanyID'], $prm['S_RegionalID'], $branchCode, $prm['periodeID'], $jurnalNo, $prm['jurnalTitle'], $prm['jurnalDescription'], $prm['jurnalDate'], $jurnalTypeID, $userID ]); $jurnalID = $this->db->insert_id(); foreach ($details as $detail) { $this->createFormDetail($detail, $jurnalID); // Child Transaction } $this->db->trans_complete(); if ($this->db->trans_status() === FALSE) { $this->sys_error_db('Failed to create jurnal: ', $this->db); exit; } else { $this->sys_ok("Berhasil simpan jurnal"); } } catch (Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } public function deleteJurnal() { try { if (! $this->isLogin) { $this->sys_error("Invalid Token"); exit; } $prm = $this->sys_input; $jurnalID = $prm['jurnalID']; $userID = $this->sys_user["M_UserID"]; $sql = "SELECT jurnalIsPosted FROM jurnal WHERE jurnalID = ?"; $isPosted = $this->db->query($sql, [$jurnalID])->row()->jurnalIsPosted ?? null; if (!$isPosted) { $this->sys_error_db("Failed to get jurnalIsPosted", $this->db); exit; } if ($isPosted == 'Y') { $this->sys_error("Jurnal sudah diposting, tidak bisa dihapus"); exit; } // Start Transaction $this->db->trans_start(); // 1. Update jurnal where jurnalID = ? $this->db->set('jurnalIsActive', 'N'); $this->db->set('jurnalLastUpdated', 'NOW()', FALSE); $this->db->set('jurnalM_UserID', $userID); $this->db->where('jurnalID', $jurnalID); $this->db->update('jurnal'); // 2. Update jurnal_tx where jurnalTxJurnalID = ? $this->db->set('jurnalTxIsActive', 'N'); $this->db->set('jurnalTxLastUpdated', 'NOW()', FALSE); $this->db->set('jurnalTxM_UserID', $userID); $this->db->where('jurnalTxJurnalID', $jurnalID); $this->db->update('jurnal_tx'); // 3. Update jurnal_addon where jurnalAddOnJurnalID = ? $this->db->set('jurnalAddOnIsActive', 'N'); $this->db->set('jurnalAddOnLastUpdated', 'NOW()', FALSE); $this->db->set('jurnalAddOnLastUpdatedUserID', $userID); $this->db->where('jurnalAddOnJurnalID', $jurnalID); $this->db->update('jurnal_addon'); $this->db->trans_complete(); if ($this->db->trans_status() === FALSE) { $this->sys_error_db('Failed to delete jurnal: ', $this->db); exit; } else { $this->sys_ok("Berhasil hapus jurnal"); } } catch (Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } // TODO: Mungkin ini nanti bisa lebih efektif untuk addOns public function loadEditDialog() { try { if (! $this->isLogin) { $this->sys_error("Invalid Token"); exit; } $prm = $this->sys_input; // Get jurnal, jurnal_tx, and jurnal_addon by jurnalID $sql = "SELECT jurnalID, jurnalperiodeID, jurnalNo, jurnalTitle, jurnalDescription, DATE_FORMAT(jurnalDate, '%Y-%m-%d') as jurnalDate, jurnalIsPosted, M_BranchCompanyName, S_RegionalName, M_BranchName, M_BranchCompanyID, S_RegionalID, M_BranchID, JurnalTypeID, JurnalTypeCode, JurnalTypeName, JurnalTypeAccesRight FROM jurnal JOIN m_branch ON jurnalM_BranchCode = M_BranchCode AND M_BranchIsActive = 'Y' JOIN s_regional ON JurnalS_RegionalID = S_RegionalID AND S_RegionalIsActive = 'Y' JOIN m_branch_company ON jurnalM_BranchCompanyID = M_BranchCompanyID AND M_BranchCompanyIsActive = 'Y' JOIN jurnal_type ON jurnalJurnalTypeID = JurnalTypeID AND JurnalTypeIsActive = 'Y' WHERE jurnalID = ? AND jurnalIsActive = 'Y'"; $qryj = $this->db->query($sql, [$prm['jurnalID']]); if (!$qryj) { $this->sys_error_db("Failed to get jurnal", $this->db); exit; } $jurnal = $qryj->row_array(); if ($jurnal == null) { $this->sys_error("JurnalID: " . $prm['jurnalID'] . " tidak ditemukan"); exit; } $result['jurnalHead'] = $jurnal; // Get Selected Periode $sql = "SELECT CONCAT(periodeYear, ' - ', periodeName) as displayPeriode, CONCAT(DATE_FORMAT(periodeStartDate, '%d %M %Y'), ' - ', DATE_FORMAT(periodeEndDate, '%d %M %Y')) as periode, periode.* FROM jurnal JOIN periode ON jurnalperiodeID = periodeID AND periodeIsActive = 'Y' AND periodeIsClosed = 'N' WHERE jurnalID = ? AND jurnalIsActive = 'Y'"; $periode = $this->db->query($sql, [$prm['jurnalID']])->row_array(); if (!$periode) { $this->sys_error_db("Failed to get periode", $this->db); exit; } $result['periode'] = $periode; // Get suppliercode and grni/invoice code result object $sql = "SELECT * FROM jurnal_addon WHERE jurnalAddOnJurnalID = ? AND jurnalAddOnIsActive = 'Y'"; $qryaddon = $this->db->query($sql, [$prm['jurnalID']]); if (!$qryaddon) { $this->sys_error_db("Failed to get jurnal_addon", $this->db); exit; } $addon = $qryaddon->result_array(); foreach ($addon as $key => $value) { $result['jurnalHead'][$value['jurnalAddOnCode']] = $value['jurnalAddOnValue']; if ($value['jurnalAddOnCode'] == 'SUPCD') { $supcd = $value['jurnalAddOnValue']; } } // Get supplier $sql = "SELECT CONCAT(SupplierCode, ' - ', SupplierName) as displaySupplier, supplier.* FROM supplier WHERE SupplierCode = ? AND SupplierIsActive = 'Y'"; $qrysupplier = $this->db->query($sql, [$supcd]); if (!$qrysupplier) { $this->sys_error_db("Failed to get supplier", $this->db); exit; } $supplier = $qrysupplier->row_array(); $result['supplier'] = $supplier; $txsql = "SELECT jurnalTxID, jurnalTxCoaID as coaID, jurnalTxDescription as coaDescription, jurnalTxDebit, jurnalTxCredit, coaAccountNo FROM jurnal_tx JOIN coa ON jurnalTxCoaID = coaID WHERE jurnalTxJurnalID = ? AND jurnalTxIsActive = 'Y'"; $qrytx = $this->db->query($txsql, [$prm['jurnalID']]); if (!$qrytx) { $this->sys_error_db("Failed to get jurnal tx", $this->db); exit; } $tx = $qrytx->result_array(); $result['details'] = $tx; foreach ($result['details'] as $key => $value) { if ($value['jurnalTxCredit'] > 0) { $addonsql = "SELECT jurnalAddOnID, jurnalAddOnCode, jurnalAddOnValue FROM jurnal_addon WHERE jurnalAddOnJurnalTxID = ? AND jurnalAddOnIsActive = 'Y'"; $qryaddon = $this->db->query($addonsql, [$value['jurnalTxID']]); if (!$qryaddon) { $this->sys_error_db("Failed to get jurnal_addon", $this->db); exit; } $addon = $qryaddon->result_array(); $result['details'][$key]['addOns'] = $addon; } } $this->sys_ok($result); } catch (Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } public function updateJurnal() { try { if (! $this->isLogin) { $this->sys_error("Invalid Token"); exit; } $prm = $this->sys_input; $userID = $this->sys_user["M_UserID"]; $jurnalID = $prm['jurnalID']; $details = $prm['details']; $sql = "SELECT jurnalIsPosted FROM jurnal WHERE jurnalID = ?"; $isPosted = $this->db->query($sql, [$jurnalID])->row()->jurnalIsPosted ?? null; if (!$isPosted) { $this->sys_error_db("Failed to get jurnalIsPosted", $this->db); exit; } if ($isPosted == 'Y') { $this->sys_error("Jurnal sudah diposting, tidak bisa diubah"); exit; } // Start Transaction $this->db->trans_start(); // 1. Update jurnal $sql = "UPDATE jurnal SET jurnalDate = ?, jurnalperiodeID = ?, jurnalTitle = ?, jurnalDescription = ?, jurnalLastUpdated = NOW(), jurnalM_UserID = ? WHERE jurnalID = ?"; $qry = $this->db->query($sql, [$prm['jurnalDate'], $prm['periodeID'], $prm['jurnalTitle'], $prm['jurnalDescription'], $userID, $jurnalID]); if (!$qry) { $this->db->trans_rollback(); $this->sys_error_db("Failed to update jurnal", $this->db); exit; } // 2. Soft delete semua existing jurnal_tx and jurnal_addon where jurnalID = ? $tx = "UPDATE jurnal_tx SET jurnalTxIsActive = 'N' WHERE jurnalTxJurnalID = ?"; $qrytx = $this->db->query($tx, [$jurnalID]); if (!$qrytx) { $this->db->trans_rollback(); $this->sys_error_db("Failed to update jurnal", $this->db); exit; } $addon = "UPDATE jurnal_addon SET jurnalAddOnIsActive = 'N' WHERE jurnalAddOnJurnalID = ?"; $qryaddon = $this->db->query($addon, [$jurnalID]); if (!$qryaddon) { $this->db->trans_rollback(); $this->sys_error_db("Failed to update jurnal", $this->db); exit; } // 3. Insert new jurnal_tx and jurnal_addon records foreach ($details as $detail) { $this->createFormDetail($detail, $jurnalID); } $this->db->trans_complete(); if ($this->db->trans_status() === FALSE) { $this->sys_error_db('Failed to update jurnal: ', $this->db); exit; } else { $this->sys_ok("Berhasil update jurnal"); } } catch (Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } //* --- bandingkan dulu baru hapus --- public function updateJurnalV2() { try { if (! $this->isLogin) { $this->sys_error("Invalid Token"); exit; } $prm = $this->sys_input; $userID = $this->sys_user["M_UserID"]; $jurnalID = $prm['jurnalID']; $details = $prm['details']; $sql = "SELECT jurnalIsPosted FROM jurnal WHERE jurnalID = ?"; $isPosted = $this->db->query($sql, [$jurnalID])->row()->jurnalIsPosted ?? null; if (!$isPosted) { $this->sys_error_db("Failed to get jurnalIsPosted", $this->db); exit; } if ($isPosted == 'Y') { $this->sys_error("Jurnal sudah diposting, tidak bisa diubah"); exit; } // Start Transaction $this->db->trans_start(); // 1. Update jurnal $sql = "UPDATE jurnal SET jurnalDate = ?, jurnalperiodeID = ?, jurnalTitle = ?, jurnalDescription = ?, jurnalLastUpdated = NOW(), jurnalM_UserID = ? WHERE jurnalID = ?"; $qry = $this->db->query($sql, [$prm['jurnalDate'], $prm['periodeID'], $prm['jurnalTitle'], $prm['jurnalDescription'], $userID, $jurnalID]); if (!$qry) { $this->db->trans_rollback(); $this->sys_error_db("Failed to update jurnal", $this->db); exit; } // 2. Ambil data existing jurnal_tx and jurnal_addon where jurnalID = ? $tx = "SELECT * FROM jurnal_tx WHERE jurnalTxJurnalID = ? AND jurnalTxIsActive = 'Y'"; $oldTx = $this->db->query($tx, [$jurnalID])->result_array() ?? null; if (!$oldTx) { $this->sys_error_db("Failed to get jurnalTx", $this->db); exit; } // 3. Bandingin data jurnalTx: coaAccountNo, jurnalTxDebit, jurnalTxCredit } catch (Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } public function diffJurnalTx() { try { if (! $this->isLogin) { $this->sys_error("Invalid Token"); exit; } $prm = $this->sys_input; $jurnalID = $prm['jurnalID']; $details = $prm['details']; $tx = "SELECT * FROM jurnal_tx WHERE jurnalTxJurnalID = ? AND jurnalTxIsActive = 'Y'"; $oldTx = $this->db->query($tx, [$jurnalID])->result_array() ?? null; if (!$oldTx) { $this->sys_error_db("Failed to get jurnalTx", $this->db); exit; } var_dump($oldTx); var_dump($details); } catch (Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } /* * --- HELPER FUNCTION --- * */ private function createFormDetail($prm, $jurnalID) { $userid = $this->sys_user["M_UserID"]; $coaID = $prm['coaID']; $jurnalTxDescription = $prm['coaDescription']; $jurnalTxDebit = $prm['jurnalTxDebit']; $jurnalTxCredit = $prm['jurnalTxCredit']; $addOns = $prm['addOns']; // array // Validasi debit dan kredit if ($jurnalTxCredit == 0 && $jurnalTxDebit > 0) { $isDebit = true; $isCredit = false; } else if ($jurnalTxDebit == 0 && $jurnalTxCredit > 0) { $isDebit = false; $isCredit = true; } else { $isDebit = false; $isCredit = false; $this->sys_error("Debit atau Kredit harus diisi"); exit; } if ($isDebit && $isCredit) { $this->sys_error("Debit dan Kredit tidak boleh diisi bersamaan"); exit; } // Jika kredit, maka masuk ke jurnal_tx dan jurnal_addon else if ($isCredit && !$isDebit) { $insertTx = "INSERT INTO jurnal_tx (jurnalTxJurnalID, jurnalTxCoaID, jurnalTxDescription, jurnalTxCredit, jurnalTxIsActive, jurnalTxCreated, jurnalTxLastUpdated, jurnalTxM_UserID) VALUES (?, ?, ?, ?, 'Y', NOW(), NOW(), ?)"; $insertAddOn = "INSERT INTO jurnal_addon (jurnalAddOnJurnalID, jurnalAddOnJurnalTxID, jurnalAddOnCode, jurnalAddOnValue, jurnalAddOnIsActive, jurnalAddOnCreated, jurnalAddOnCreatedUserID, jurnalAddOnLastUpdated, jurnalAddOnLastUpdatedUserID) VALUES (?, ?, ?, ?, 'Y', NOW(), ?, NOW(), ?)"; // Ikut parents transaction agar rollbacknya bisa langsung semua $insertTxCr = $this->db->query($insertTx, [$jurnalID, $coaID, $jurnalTxDescription, $jurnalTxCredit, $userid]); if (!$insertTxCr) { $this->db->trans_rollback(); $this->sys_error_db("Failed Insert JurnalTx Credit", $this->db); exit; } $getTxId = $this->db->insert_id(); // Insert jurnalAddOn 1 kredit bisa ada 2-3 addOn foreach ($addOns as $item) { $addOnState = $this->db->query($insertAddOn, [$jurnalID, $getTxId, $item['jurnalAddOnCode'], $item['jurnalAddOnValue'], $userid, $userid]); if (!$addOnState) { $this->db->trans_rollback(); $this->sys_error_db("Failed Insert JurnalAddOn Credit", $this->db); exit; } } } // Jika debit maka hanya masuk ke jurnal_tx else if ($isDebit && !$isCredit) { $sql = "INSERT INTO jurnal_tx (jurnalTxJurnalID, jurnalTxCoaID, jurnalTxDescription, jurnalTxDebit, jurnalTxIsActive, jurnalTxCreated, jurnalTxLastUpdated, jurnalTxM_UserID) VALUES (?, ?, ?, ?, 'Y', NOW(), NOW(), ?)"; $qry = $this->db->query($sql, [$jurnalID, $coaID, $jurnalTxDescription, $jurnalTxDebit, $userid]); if (!$qry) { $this->db->trans_rollback(); $this->sys_error_db("Failed Insert JurnalTx Debit", $this->db); exit; } } else { $this->sys_error("Debit atau Kredit harus diisi"); exit; } } public function getListFormDetail() { try { if (! $this->isLogin) { $this->sys_error("Invalid Token"); exit; } $jurnalID = $this->sys_input['jurnalID']; $sql = "SELECT * FROM jurnal_tx WHERE jurnalTxJurnalID = ? AND jurnalTxIsActive = 'Y'"; $qry = $this->db->query($sql, [$jurnalID]); if (!$qry) { $this->sys_error_db("select jurnal_tx", $this->db); exit; } $rst = $qry->result_array(); $this->sys_ok($rst); } catch (Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } }