MIF_E31230892/sim-pkpps/app/Http/Controllers/Api/ApiSppController.php

260 lines
11 KiB
PHP

<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Models\PembayaranSpp;
use App\Models\Santri;
use Illuminate\Http\Request;
use Carbon\Carbon;
class ApiSppController extends Controller
{
/**
* Get status SPP bulan berjalan
*/
public function statusBulanIni(Request $request)
{
try {
$idSantri = $request->user()->id_santri;
$bulanIni = date('n');
$tahunIni = date('Y');
$spp = PembayaranSpp::where('id_santri', $idSantri)
->where('bulan', $bulanIni)
->where('tahun', $tahunIni)
->first();
if (!$spp) {
return response()->json([
'success' => true,
'data' => [
'ada_tagihan' => false,
'status' => 'Belum Ada Tagihan',
'periode' => $this->getNamaBulan($bulanIni) . ' ' . $tahunIni,
]
]);
}
// ── TAMBAHAN: data cicilan ──────────────────────────────
$isCicilan = $spp->isCicilan();
$nominalTerbayar = (int) $spp->nominal_terbayar; // accessor dari Model
$nominalSisa = (int) $spp->nominal_sisa; // accessor dari Model
$porsentase = $spp->porsentase_cicilan; // accessor dari Model
// ───────────────────────────────────────────────────────
return response()->json([
'success' => true,
'data' => [
'ada_tagihan' => true,
'id_pembayaran' => $spp->id_pembayaran,
'periode' => $this->getNamaBulan($spp->bulan) . ' ' . $spp->tahun,
'nominal' => (int) $spp->nominal,
'status' => $spp->status,
'tanggal_bayar' => $spp->tanggal_bayar?->format('Y-m-d'),
'tanggal_bayar_formatted' => $spp->tanggal_bayar?->format('d M Y'),
'batas_bayar' => $spp->batas_bayar->format('Y-m-d'),
'batas_bayar_formatted' => $spp->batas_bayar->format('d M Y'),
'is_telat' => $spp->isTelat(),
// ── field baru ──
'is_cicilan' => $isCicilan,
'nominal_terbayar' => $nominalTerbayar,
'nominal_sisa' => $nominalSisa,
'porsentase_cicilan' => $porsentase,
]
]);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'Gagal mengambil status SPP: ' . $e->getMessage(),
], 500);
}
}
/**
* Get info tunggakan
*/
public function tunggakan(Request $request)
{
try {
$idSantri = $request->user()->id_santri;
$tunggakanList = PembayaranSpp::where('id_santri', $idSantri)
->where('status', 'Belum Lunas')
->orderBy('tahun', 'asc')
->orderBy('bulan', 'asc')
->get();
$totalTunggakan = $tunggakanList->sum('nominal');
$jumlahBulan = $tunggakanList->count();
$adaTelat = $tunggakanList->filter(fn($spp) => $spp->isTelat())->count() > 0;
return response()->json([
'success' => true,
'data' => [
'ada_tunggakan' => $jumlahBulan > 0,
'total_tunggakan' => (int) $totalTunggakan,
'jumlah_bulan' => $jumlahBulan,
'ada_telat' => $adaTelat,
]
]);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'Gagal mengambil tunggakan: ' . $e->getMessage(),
], 500);
}
}
/**
* Get riwayat pembayaran SPP
*
* Query param ?status= bisa berisi:
* semua | Lunas | Belum Lunas | Cicilan
*/
public function riwayat(Request $request)
{
try {
$idSantri = $request->user()->id_santri;
$query = PembayaranSpp::where('id_santri', $idSantri)
->select([
'id', 'id_pembayaran', 'bulan', 'tahun',
'nominal', 'status', 'tanggal_bayar',
'batas_bayar', 'keterangan',
])
->orderBy('tahun', 'desc')
->orderBy('bulan', 'desc');
// ── REVISI: filter status termasuk "Cicilan" ───────────
if ($request->filled('status') && $request->status !== 'semua') {
if ($request->status === 'Cicilan') {
// Cicilan = Belum Lunas + keterangan JSON punya field "terbayar" > 0
$query->where('status', 'Belum Lunas')
->where(function ($q) {
// JSON valid & mengandung "terbayar"
$q->whereRaw("JSON_VALID(keterangan) = 1")
->whereRaw("JSON_UNQUOTE(JSON_EXTRACT(keterangan, '$.terbayar')) > 0");
});
} else {
$query->where('status', $request->status);
}
}
// ───────────────────────────────────────────────────────
$riwayat = $query->paginate(20);
$data = $riwayat->map(function ($item) {
// ── TAMBAHAN: data cicilan per item ─────────────────
$isCicilan = $item->isCicilan();
$nominalTerbayar = (int) $item->nominal_terbayar;
$nominalSisa = (int) $item->nominal_sisa;
$porsentase = $item->porsentase_cicilan;
// ────────────────────────────────────────────────────
return [
'id' => $item->id,
'id_pembayaran' => $item->id_pembayaran,
'periode' => $this->getNamaBulan($item->bulan) . ' ' . $item->tahun,
'bulan' => $item->bulan,
'tahun' => $item->tahun,
'bulan_nama' => $this->getNamaBulan($item->bulan),
'nominal' => (int) $item->nominal,
'status' => $item->status,
'tanggal_bayar' => $item->tanggal_bayar?->format('Y-m-d'),
'tanggal_bayar_formatted' => $item->tanggal_bayar?->format('d M Y'),
'batas_bayar' => $item->batas_bayar->format('Y-m-d'),
'batas_bayar_formatted' => $item->batas_bayar->format('d M Y'),
'is_telat' => $item->isTelat(),
'keterangan' => $item->keterangan,
// ── field baru ──
'is_cicilan' => $isCicilan,
'nominal_terbayar' => $nominalTerbayar,
'nominal_sisa' => $nominalSisa,
'porsentase_cicilan' => $porsentase,
];
});
return response()->json([
'success' => true,
'data' => $data,
'pagination' => [
'current_page' => $riwayat->currentPage(),
'last_page' => $riwayat->lastPage(),
'total' => $riwayat->total(),
],
]);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'Gagal mengambil riwayat: ' . $e->getMessage(),
], 500);
}
}
/**
* Get statistik pembayaran SPP
*/
public function statistik(Request $request)
{
try {
$idSantri = $request->user()->id_santri;
$semuaBelumLunas = PembayaranSpp::where('id_santri', $idSantri)
->where('status', 'Belum Lunas')
->get();
$totalLunas = PembayaranSpp::where('id_santri', $idSantri)
->where('status', 'Lunas')
->count();
// ── TAMBAHAN: pisahkan cicilan dari belum lunas ─────────
$totalCicilan = $semuaBelumLunas->filter(fn($s) => $s->isCicilan())->count();
$totalBelumLunas = $semuaBelumLunas->filter(fn($s) => !$s->isCicilan())->count();
// ────────────────────────────────────────────────────────
$totalNominalLunas = PembayaranSpp::where('id_santri', $idSantri)
->where('status', 'Lunas')
->sum('nominal');
$totalNominalBelumLunas = PembayaranSpp::where('id_santri', $idSantri)
->where('status', 'Belum Lunas')
->sum('nominal');
return response()->json([
'success' => true,
'data' => [
'total_lunas' => $totalLunas,
'total_cicilan' => $totalCicilan, // ← baru
'total_belum_lunas' => $totalBelumLunas, // ← sekarang exclude cicilan
'total_nominal_lunas' => (int) $totalNominalLunas,
'total_nominal_belum_lunas' => (int) $totalNominalBelumLunas,
]
]);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'Gagal mengambil statistik: ' . $e->getMessage(),
], 500);
}
}
/**
* Helper: Get nama bulan
*/
private function getNamaBulan($bulan)
{
$namaBulan = [
1 => 'Januari', 2 => 'Februari', 3 => 'Maret',
4 => 'April', 5 => 'Mei', 6 => 'Juni',
7 => 'Juli', 8 => 'Agustus', 9 => 'September',
10 => 'Oktober', 11 => 'November', 12 => 'Desember',
];
return $namaBulan[$bulan] ?? '';
}
}