You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

753 lines
24 KiB
PHP

<?php
use NN\files;
use NN\Post;
use NN\Session;
use NN\Module\DB;
use NN\Module\DD;
use NN\Module\Help;
use NN\Module\Datatable;
use NN\Link;
use NN\Enc;
use NN\module\View;
use NN\load;
class Jurubayar {
private static $prefix = "_jb";
public static function api(){
header('Content-Type: application/json');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type, Authorization');
if(isset($_GET['path'])){
if($_GET['path'] == 'master'){
self::master();
}
if($_GET['path'] == 'login'){
self::login();
}
if($_GET['path'] == 'anggota'){
self::anggota();
}
if($_GET['path'] == 'faktur_pinjaman'){
self::fakturPinajaman();
}
if($_GET['path'] == 'faktur_simpanan'){
self::fakturSimpanan();
}
if($_GET['path'] == 'faktur_angsuran'){
self::fakturAngsuran();
}
if($_GET['path'] == 'simpan_angsuran'){
self::simpan_angsuran();
}
if($_GET['path'] == 'simpan_pinjaman'){
self::simpanPinjaman();
}
if($_GET['path'] == 'simpan_simpanan'){
self::simpanSimpanan();
}
if($_GET['path'] == 'list_pinjaman'){
self::listPinjaman();
}
if($_GET['path'] == 'history'){
self::getHistoryTransaksi();
}
if($_GET['path'] == 'simpanan'){
self::getHistoryTransaksiSimpanan();
}
if($_GET['path'] == 'item-simpanan'){
self::itemSimpanan();
}
if($_GET['path'] == 'pinjaman'){
self::getHistoryTransaksiPinjaman();
}
if($_GET['path'] == 'item-pinjaman'){
self::itemPinjaman();
}
if($_GET['path'] == 'angsuran'){
self::getHistoryTransaksiAngsuran();
}
if($_GET['path'] == 'saldo'){
self::getTotalNominal();
}
}
echo json_encode([
'status' => 'success',
'message' => 'sorry no data request',
'path' => $_GET['path']
]);
}
public static function listPinjaman() {
$kodesp = $_GET['kodesp'];
$prefix = self::$prefix; // Prefix tabel
// Ambil bulan dan tahun saat ini
$currentMonth = date('m'); // Bulan sekarang (01-12)
$currentYear = date('Y'); // Tahun sekarang (YYYY)
$query = "
SELECT
p.faktur,
p.keterangan,
p.jumlah AS jumlah_pinjaman,
p.angsuran,
p.bunga,
IFNULL(SUM(CASE WHEN h.jenis_transaksi = 'pembayaran-pinjaman' THEN h.nominal ELSE 0 END), 0) AS total_pembayaran_pinjaman,
IFNULL(SUM(CASE WHEN h.jenis_transaksi = 'pembayaran-bunga' THEN h.nominal ELSE 0 END), 0) AS total_pembayaran_bunga,
(p.jumlah - IFNULL(SUM(CASE WHEN h.jenis_transaksi = 'pembayaran-pinjaman' THEN h.nominal ELSE 0 END), 0)) AS sisa_pinjaman,
COALESCE(MAX(h.created_at), '-') AS tgl_angsuran_terakhir,
COUNT(h.nominal) AS angsuran_ke,
p.tgl AS tgl_pinjaman,
CASE
WHEN MAX(h.created_at) IS NULL THEN DATE_ADD(p.tgl, INTERVAL 30 DAY) -- Jika tidak ada pembayaran sebelumnya, jatuh tempo pertama dari tgl pinjaman
ELSE DATE_ADD(DATE_ADD(MAX(h.created_at), INTERVAL 1 MONTH), INTERVAL 30 DAY) -- Jatuh tempo berikutnya dari tgl bayar terakhir + 1 bulan + 30 hari
END AS jatuh_tempo,
-- Menghitung masa angsuran
CASE
WHEN COUNT(h.nominal) = 0 THEN 0 -- Jika belum ada pembayaran, masa angsuran adalah 0
ELSE ROUND(COUNT(h.nominal) * p.angsuran / p.jumlah, 2) -- Masa angsuran dihitung dari jumlah angsuran yang sudah dibayar
END AS masa_angsuran,
-- Persentase bunga per tahun
p.bunga AS persentase_bunga_per_tahun
FROM mpinjam$prefix p
LEFT JOIN history_transaksi$prefix h
ON p.faktur = h.kode
WHERE p.kode = '$kodesp'
GROUP BY p.faktur, p.keterangan, p.jumlah, p.angsuran, p.bunga, p.tgl
";
$listPinjaman = DB::query_result_object($query);
echo json_encode([
"status" => "success",
"data" => $listPinjaman,
]);
die();
}
public static function fakturSimpanan(){
$kodesp = $_GET['kodesp'];
$code1 = date('y');
$prefix = self::$prefix;
$query = "SELECT concat('BKM/$kodesp/$code1/',lpad( ifnull(
(SELECT substring_index(MAX(RIGHT(faktur,5)), '$code1/',-1) FROM msimpan$prefix WHERE faktur LIKE 'BKM/$kodesp/$code1/%' ORDER BY faktur DESC LIMIT 1)
,0
) + 1,5,0)) faktur";
$faktur = DB::query_result_object_row($query);
echo json_encode([
"status" => "success",
"data" => $faktur,
]);
die();
}
public static function fakturAngsuran() {
if (!isset($_GET['kodesp'])) {
echo json_encode([
"status" => "error",
"message" => "Parameter 'kodesp' is required."
]);
die();
}
$kodesp = $_GET['kodesp'];
$code1 = date('y'); // Tahun 2 digit
$prefix = self::$prefix; // Prefix tabel tanpa _jb
$query = "
SELECT CONCAT('BKM/', '$kodesp', '/', '$code1', '/',
LPAD(
IFNULL(
(
SELECT MAX(CAST(RIGHT(faktur, 6) AS UNSIGNED))
FROM mags$prefix
WHERE faktur LIKE 'BKM/$kodesp/$code1/%'
),
0) + 1, 6, '0'
)
) AS faktur
";
$faktur = DB::query_result_object_row($query);
echo json_encode([
"status" => "success",
"data" => $faktur,
]);
die();
}
public static function simpanSimpanan() {
$data = $_POST;
// Data untuk msimpan_jb
$simpananData = [[
"tgl" => $data["tgl"] ?? null,
"kode" => $data["kode"] ?? null,
"nama" => '', // Tidak tersedia di form, bisa diisi otomatis kalau ada relasi
"faktur" => $data["faktur"] ?? null,
"golkar" => $data["golgaji"] ?? null,
"kodesp" => $data["kodesp"] ?? null,
"dk" => 'D', // Default "D" untuk simpanan masuk
"jumlah" => $data["jumlah"] ?? 0,
"status" => $data["status"] ?? '1',
"keterangan" => $data["keterangan"] ?? '',
"username" => $data["username"] ?? null,
"userlog" => date('Y-m-d H:i:s'),
"prima" => 0,
"jam" => date('H:i:s'),
"kasir" => '', // Bisa isi dengan user login jika ada
"cash" => 'Y',
"posting" => 'N',
]];
// Data untuk history_transaksi_jb
$historyData = [[
"kode" => $data["faktur"] ?? null,
"jenis_transaksi" => "simpanan",
"keterangan" => "simpanan",
"username" => $data["username"] ?? null,
"nominal" => $data["jumlah"] ?? 0
]];
try {
// Insert ke msimpan_jb
$sqlMain = self::toInsert($simpananData, 'msimpan_jb');
DB::query($sqlMain);
// Insert ke history_transaksi_jb
$sqlHistory = self::toInsert($historyData, 'history_transaksi_jb');
DB::query($sqlHistory);
echo json_encode([
"status" => "success",
"message" => "Data simpanan dan histori berhasil disimpan."
]);
} catch (Error $e) {
echo json_encode([
"status" => "error",
"message" => $e->getMessage(),
"sql" => $sqlMain,
"sql2" => $sqlHistory
]);
}
die();
}
public static function simpan_angsuran() {
$data = $_POST;
// Data untuk mags_jb
$magsData = [[
"status" => $data["status"] ?? null,
"cash" => $data["cash"] ?? null,
"tgl" => $data["tgl"] ?? null,
"kode" => $data["kode"] ?? null,
"nomor" => $data["nomor"] ?? null,
"faktur" => $data["faktur"] ?? null,
"fkt" => $data["fkt"] ?? null,
"ke" => $data["ke"] ?? 0,
"lama" => $data["lama"] ?? 0,
"pokok" => $data["pokok"] ?? 0,
"bunga" => $data["bunga"] ?? 0,
"penalti" => 0, // Di sini penalty default diset ke 0, bisa disesuaikan
"discount" => $data["discount"] ?? 0,
"keterangan" => $data["keterangan"] ?? '',
"user" => $data["user"] ?? null,
"userlog" => date('Y-m-d H:i:s'),
"date" => date('Y-m-d'),
"time" => date('H:i:s'),
"bank" => $data["bank"] ?? null,
"jthtmp" => $data["tgljt"] ?? null,
"lunas" => 'N', // Anggap pinjaman belum lunas pada saat penyimpanan
"prima" => 0, // Prima jika diperlukan
"shu" => $data["shu"] ?? 0,
"nonshu" => $data["nonshu"] ?? 0,
"posting" => 'N', // Status posting default "N"
]];
// Data untuk history_transaksi_jb
$historyData = [];
$jenisTransaksi = [
"shu" => "pembayaran-pinjaman",
"nonshu" => "pembayaran-pinjamannon",
"bunga" => "pembayaran-bunga",
"discount" => "pembayaran-discount"
];
foreach ($jenisTransaksi as $key => $jenis) {
$amount = $data[$key] ?? 0;
if ($amount > 0) {
$historyData[] = [
"kode" => $data["faktur"] . '-' . ($key == 'bunga' ? 'bng' : ($key == 'discount' ? 'dic' : 'non')),
"jenis_transaksi" => $jenis,
"username" => $data["user"] ?? null,
"keterangan" => $data["keterangan"] ?? '',
"nominal" => $amount,
];
}
}
try {
// Insert ke mags_jb
$sqlMain = self::toInsert($magsData, 'mags_jb');
DB::query($sqlMain);
// Insert ke history_transaksi_jb
foreach ($historyData as $history) {
$sqlHistory = self::toInsert([$history], 'history_transaksi_jb');
DB::query($sqlHistory);
}
echo json_encode([
"status" => "success",
"message" => "Data angsuran dan histori berhasil disimpan."
]);
} catch (Error $e) {
echo json_encode([
"status" => "error",
"message" => $e->getMessage()
]);
}
die();
}
public static function simpanPinjaman() {
$data = $_POST;
// Data untuk tabel msimpan_jb
$mainData = [[
"jenis" => $data["jenis"] ?? null,
"dept" => $data["dept"] ?? null,
"tr" => $data["tr"] ?? null,
"faktur" => $data["faktur"] ?? null,
"fkt" => '',
"tglmohon" => $data["tglmohon"] ?? null,
"tgl" => $data["tgl"] ?? null,
"jthtmp" => 0,
"kode" => $data["kode"] ?? null,
"golkar" => $data["golgaji"] ?? null,
"sisagaji" => $data["gaji"] ?? 0,
"kodesp" => $data["kodesp"] ?? null,
"keterangan" => $data["keterangan"] ?? null,
"jumlah" => $data["jumlah"] ?? 0,
"bungath" => $data["bungath"] ?? 0,
"lama" => $data["lama"] ?? 0,
"angsuran" => $data["angsuran"] ?? 0,
"pokok" => $data["pokok"] ?? 0,
"bunga" => $data["bunga"] ?? 0,
"penalti" => 0,
"lpokok" => 0,
"lbunga" => 0,
"slpokok" => 0,
"slbunga" => 0,
"ke" => 0,
"ske" => 0,
"lunas" => 'N',
"status" => '1',
"oldtr" => null,
"user" => $data["user"] ?? null,
"userlog" => date('Y-m-d H:i:s'),
"date" => date('Y-m-d'),
"time" => date('H:i:s'),
"nomor" => 0,
"prima" => 0,
"bga" => 0,
"bgb" => 0,
"mka" => 0,
"mkb" => 0,
]];
// Data untuk tabel history_transaksi_jb
$historyData = [[
"kode" => $data["faktur"] ?? null,
"jenis_transaksi" => "pinjaman",
"keterangan" => "pengajuan pinjaman",
"username" => $data["user"] ?? null,
"nominal" => $data["jumlah"] ?? 0
]];
try {
// Generate dan eksekusi insert ke msimpan_jb
$sqlMain = self::toInsert($mainData, 'mpinjam_jb');
DB::query($sqlMain);
// Generate dan eksekusi insert ke history_transaksi_jb
$sqlHistory = self::toInsert($historyData, 'history_transaksi_jb');
DB::query($sqlHistory);
echo json_encode([
"status" => "success",
"message" => "Data pinjaman dan histori transaksi berhasil disimpan."
]);
} catch (Error $e) {
echo json_encode([
"status" => "error",
"message" => $e->getMessage()
]);
}
die();
}
public static function fakturPinajaman(){
$kodesp = $_GET['kodesp'];
$code1 = date('y');
$prefix = self::$prefix;
$query = "SELECT concat('BKK/$kodesp/$code1/',lpad( ifnull(
(SELECT substring_index(faktur, '$code1/',-1) FROM mpinjam$prefix WHERE faktur LIKE 'BKK/$kodesp/$code1/%' ORDER BY faktur DESC LIMIT 1)
,0
) + 1,6,0)) faktur";
$faktur = DB::query_result_object_row($query);
echo json_encode([
"status" => "success",
"data" => $faktur
]);
die();
}
public static function getHistoryTransaksi() {
$query = "
SELECT
SUBSTRING_INDEX(h.kode,'-',1) kode,
h.jenis_transaksi,
h.keterangan,
h.nominal,
h.created_at,
a.nama
FROM
history_transaksi_jb h
LEFT JOIN msimpan_jb m ON h.kode = m.faktur
LEFT JOIN mpinjam_jb p ON h.kode = p.faktur
LEFT JOIN mags_jb ags ON SUBSTRING_INDEX(h.kode,'-',1) = ags.faktur
LEFT JOIN anggota a ON (m.kode = a.kode OR p.kode = a.kode OR ags.kode = a.kode)
ORDER BY
h.created_at DESC
";
try {
$result = DB::query_result_object($query);
echo json_encode([
"status" => "success",
"data" => $result
]);
} catch (Error $e) {
echo json_encode([
"status" => "error",
"message" => $e->getMessage()
]);
}
die();
}
public static function getHistoryTransaksiSimpanan() {
$query = "
SELECT
SUBSTRING_INDEX(h.kode,'-',1) kode,
h.jenis_transaksi,
h.keterangan,
h.nominal,
h.created_at,
a.nama
FROM
history_transaksi_jb h
LEFT JOIN msimpan_jb m ON h.kode = m.faktur
LEFT JOIN mpinjam_jb p ON h.kode = p.faktur
LEFT JOIN mags_jb ags ON SUBSTRING_INDEX(h.kode,'-',1) = ags.faktur
LEFT JOIN anggota a ON (m.kode = a.kode OR p.kode = a.kode OR ags.kode = a.kode)
WHERE h.jenis_transaksi = 'simpanan'
ORDER BY
h.created_at DESC
";
$querysum = "SELECT ifnull( ( SELECT sum(nominal) FROM history_transaksi_jb WHERE jenis_transaksi = 'simpanan'),0) total";
try {
$result = DB::query_result_object($query);
$total = DB::query_result_object_row($querysum);
echo json_encode([
"status" => "success",
"data" => $result,
"total" => $total->total
]);
} catch (Error $e) {
echo json_encode([
"status" => "error",
"message" => $e->getMessage()
]);
}
die();
}
public static function getHistoryTransaksiPinjaman() {
$query = "
SELECT
SUBSTRING_INDEX(h.kode,'-',1) kode,
h.jenis_transaksi,
h.keterangan,
h.nominal,
h.created_at,
a.nama
FROM
history_transaksi_jb h
LEFT JOIN msimpan_jb m ON h.kode = m.faktur
LEFT JOIN mpinjam_jb p ON h.kode = p.faktur
LEFT JOIN mags_jb ags ON SUBSTRING_INDEX(h.kode,'-',1) = ags.faktur
LEFT JOIN anggota a ON (m.kode = a.kode OR p.kode = a.kode OR ags.kode = a.kode)
WHERE h.jenis_transaksi = 'pinjaman'
ORDER BY
h.created_at DESC
";
$querysum = "SELECT ifnull( ( SELECT sum(nominal) FROM history_transaksi_jb WHERE jenis_transaksi = 'pinjaman'),0) total";
try {
$result = DB::query_result_object($query);
$total = DB::query_result_object_row($querysum);
echo json_encode([
"status" => "success",
"data" => $result,
"total" => $total->total
]);
} catch (Error $e) {
echo json_encode([
"status" => "error",
"message" => $e->getMessage()
]);
}
die();
}
public static function getHistoryTransaksiAngsuran() {
$query = "
SELECT
SUBSTRING_INDEX(h.kode,'-',1) kode,
h.jenis_transaksi,
h.keterangan,
h.nominal,
h.created_at,
a.nama
FROM
history_transaksi_jb h
LEFT JOIN msimpan_jb m ON h.kode = m.faktur
LEFT JOIN mpinjam_jb p ON h.kode = p.faktur
LEFT JOIN mags_jb ags ON SUBSTRING_INDEX(h.kode,'-',1) = ags.faktur
LEFT JOIN anggota a ON (m.kode = a.kode OR p.kode = a.kode OR ags.kode = a.kode)
WHERE h.jenis_transaksi LIKE 'pembayaran%'
ORDER BY
h.created_at DESC
";
$querysum = "SELECT ifnull( ( SELECT sum(nominal) FROM history_transaksi_jb WHERE jenis_transaksi like 'pembayaran%'),0) total";
try {
$result = DB::query_result_object($query);
$total = DB::query_result_object_row($querysum);
echo json_encode([
"status" => "success",
"data" => $result,
"total" => $total->total
]);
} catch (Error $e) {
echo json_encode([
"status" => "error",
"message" => $e->getMessage()
]);
}
die();
}
public static function login()
{
$data = $_POST;
$password = md5($data['password']);
$username = md5($data['username']);
$data = DB::query_result_object("SELECT * FROM juru_bayar WHERE md5(username) = '$username' AND md5(password) = '$password'");
if(count($data) > 0){
echo json_encode([
"status" => "success",
"message" => "login success",
"data" => $data
]);
die();
}
echo json_encode([
"status" => "failed",
"message" => "login gagal, username atau password salah",
"data" => []
]);
die();
}
public static function anggota(){
$jurubayar = $_GET['jurubayar'];
$anggota = DB::query_result_object("SELECT * FROM anggota" . (!empty($jurubayar) ? " WHERE jurubayar = '$jurubayar'" : ""));
echo json_encode([
"data" => $anggota,
"status" => "success",
]);
die();
}
public static function master(){
$data = DB::query_result_object("SELECT * FROM mjurubayar");
$anggota = DB::query_result_object("SELECT * FROM anggota");
echo json_encode([
"lokasi_juru_bayar" => $data,
"anggota" => $anggota,
"status" => "success"
]);
die();
}
public static function getTotalNominal() {
$query = "
SELECT
SUM(CASE
WHEN h.jenis_transaksi = 'pinjaman' THEN -h.nominal
ELSE h.nominal
END) AS total_nominal
FROM
history_transaksi_jb h
";
try {
$result = DB::query_result_object_row($query);
echo json_encode([
"status" => "success",
"total_nominal" => $result->total_nominal
]);
} catch (Error $e) {
echo json_encode([
"status" => "error",
"message" => $e->getMessage()
]);
}
die();
}
private static function itemPinjaman(){
$faktur = $_GET['faktur'];
$data = DB::query_result_object("SELECT * FROM mpinjam_jb WHERE faktur = '$faktur'");
echo json_encode([
"data" => $data,
"status" => "success"
]);
die();
}
private static function itemSimpanan(){
$faktur = $_GET['faktur'];
$data = DB::query_result_object("SELECT * FROM msimpan_jb WHERE faktur = '$faktur'");
echo json_encode([
"data" => $data,
"status" => "success"
]);
die();
}
private static function toInsert($data, $table = 'test', $wht = []) {
// Validasi data
if (!is_array($data) || count($data) === 0) {
throw new Error("Data harus berupa array dan tidak boleh kosong.");
}
// Validasi nama tabel
if (!is_string($table) || trim($table) === '') {
throw new Error("Nama tabel harus berupa string dan tidak boleh kosong.");
}
// Validasi where clause
if (!is_array($wht)) {
throw new Error("Where clause harus berupa array.");
}
// Ambil keys dari data pertama
$keys = array_keys($data[0]);
if (count($keys) === 0) {
throw new Error("Data harus memiliki setidaknya satu kolom.");
}
// Mulai membangun query
$query = 'INSERT INTO ' . $table . ' (';
$query .= implode(', ', array_map(function($key) {
return '`' . $key . '`';
}, $keys));
$query .= ') ';
$query .= 'SELECT ';
$query .= implode(', ', array_map(function($key) {
return 'a.' . $key;
}, $keys));
$query .= ' FROM (';
// Bangun subquery untuk setiap baris data
$subqueries = array_map(function($row) use ($keys) {
$values = array_map(function($key) use ($row) {
if (isset($row[$key]) && $row[$key] !== null) {
return '"' . str_replace('"', '\"', $row[$key]) . '" AS `' . $key . '`';
} else {
return 'NULL AS `' . $key . '`';
}
}, $keys);
return 'SELECT ' . implode(', ', $values);
}, $data);
$query .= implode(' UNION ALL ', $subqueries);
$query .= ') a';
// Tambahkan where clause jika ada
if (count($wht) > 0) {
$query .= ' LEFT JOIN ' . $table . ' ON ';
$query .= implode(' AND ', array_map(function($whtx) use ($table) {
return $table . '.' . $whtx . ' = a.' . $whtx;
}, $wht));
$query .= ' WHERE ';
$query .= implode(' AND ', array_map(function($whtx) use ($table) {
return $table . '.' . $whtx . ' IS NULL';
}, $wht));
}
return $query;
}
}