From a4b235511be5595587b46bd169c813b337654770 Mon Sep 17 00:00:00 2001 From: Nur Izzati Date: Tue, 10 Feb 2026 10:42:18 +0800 Subject: [PATCH] update tast uum bycaw --- .../Controllers/Reports/AnalisaController.php | 239 ++++++++++++++++++ routes/report.php | 1 + 2 files changed, 240 insertions(+) diff --git a/app/Http/Controllers/Reports/AnalisaController.php b/app/Http/Controllers/Reports/AnalisaController.php index 7f9b8e1..86a4b27 100644 --- a/app/Http/Controllers/Reports/AnalisaController.php +++ b/app/Http/Controllers/Reports/AnalisaController.php @@ -402,10 +402,249 @@ public function getSummaryLaporanPelangganAktif(Request $request) } + public function getSummaryLaporanDataPelangganBycaw(Request $request) + { + $year = $request->year; + if (!$year) { + return response()->json(['error' => 'Sila pilih tahun'], 400); + } + // =============================== + // INPUT CAWANGAN (MULTIPLE) + // =============================== + $cawangan = $request->input('cawangan', []); + if (!is_array($cawangan)) { + $cawangan = [$cawangan]; + } + + $startOfYear = Carbon::create($year, 1, 1)->startOfDay(); + $endOfYear = Carbon::create($year, 12, 31)->endOfDay(); + Carbon::setLocale('ms'); + // =============================== + // 1️⃣ AMBIL PELANGGAN (FILTER CAWANGAN) + // =============================== + $pelangganQuery = Customer::whereYear('tarikhdaftar', $year); + if (!empty($cawangan)) { + $pelangganQuery->whereIn('kodcaw', $cawangan); + } + + $pelanggan = $pelangganQuery + ->select( + 'id','nama','kpbaru','kplama','t_lahir','jantina', + 'kodkerja','poskod','kodcaw','tarikhdaftar', + 'tujuangadai','nopelanggan' + ) + ->get(); + + if ($pelanggan->isEmpty()) { + return response()->json([ + 'year' => $year, + 'summary' => [ + 'total_pelanggan' => 0, + 'jumlah_cawangan' => 0, + ], + 'pelanggan' => [] + ], 200); + } + + // =============================== + // 2️⃣ CONNECTION CAWANGAN + // =============================== + $connections = $this->getActiveCawanganConnections(); + + // =============================== + // 3️⃣ MASTER DATA + // =============================== + $pekerjaanAll = Pekerjaan::pluck('keterangan', 'kodkerja'); + $poskodAll = Poskod::with('daerah')->get()->keyBy('poskod'); + + // =============================== + // 4️⃣ NOKP PELANGGAN + // =============================== + $nokps = $pelanggan + ->map(fn($p) => $p->kpbaru ?? $p->kplama) + ->filter() + ->values(); + + // =============================== + // 5️⃣ TRANSAKSI GADAI / TEBUS + // =============================== + $allTransaksi = collect(); + + foreach ($connections as $conn) { + $data = DB::connection($conn->mysql) + ->table('gadai as g') + ->leftJoin('tebus as t', 'g.norujukan', '=', 't.norujukan') + ->leftJoin('lelong as l', 'g.norujukan', '=', 'l.norujukan') + ->whereIn('g.nokp', $nokps) + ->whereBetween('g.t_gadai', [$startOfYear, $endOfYear]) + ->select( + 'g.nokp', + 'g.norujukan', + 'g.t_gadai', + 't.t_tebus', + 'g.pinjaman', + 'g.upah12', + 'g.tempoh', + 'l.t_lelong', + 'g.sttebus' + ) + ->get(); + + $allTransaksi = $allTransaksi->concat($data); + } + + $transGrouped = $allTransaksi->groupBy('nokp'); + + // =============================== + // 6️⃣ NORUJUKAN BAYARAN ONLINE + // =============================== + $onlineNorujukan = TransactionOnline::pluck('norujukan')->unique(); + + // =============================== + // 7️⃣ MAP DATA PELANGGAN + // =============================== + $result = $pelanggan->map(function ($row) use ( + $transGrouped, + $onlineNorujukan, + $pekerjaanAll, + $poskodAll, + $year + ) { + + $nokp = $row->kpbaru ?? $row->kplama; + + $tempohData = $transGrouped->get($nokp, collect()); + + $norujukanPelanggan = $tempohData->pluck('norujukan')->unique(); + + // Cara Bayaran + $adaOnline = $norujukanPelanggan + ->intersect($onlineNorujukan) + ->isNotEmpty(); + + $caraBayaran = $adaOnline ? 'Online' : 'Kaunter'; + + // Bilangan + $bilTransaksi = $tempohData->count(); + + $bilOutstanding = $tempohData->filter(function ($row) use ($year) { + $endOfYear = Carbon::create($year, 12, 31)->endOfDay(); + + if (empty($row->sttebus)) return true; + + return Carbon::parse($row->t_tebus)->gt($endOfYear); + })->count(); + + $bilTebus = $tempohData->whereNotNull('t_tebus')->count(); + + // Jumlah + $jumlahPinjaman = $tempohData->sum('pinjaman'); + + $jumlahUjrah = $tempohData->reduce(function ($carry, $trx) { + if (!$trx->upah12 || !$trx->tempoh) return $carry; + return $carry + ($trx->upah12 / 12 * $trx->tempoh); + }, 0); + + // Tarikh + $tarikhMula = $tempohData->min('t_gadai'); + $tarikhTamat = $tempohData->max('t_tebus'); + $tarikhLelong = $tempohData->max('t_lelong'); + + // Tempoh Pajakan + if (!$tarikhMula) { + $tempohPajakan = '-'; + } elseif (!$tarikhTamat || $tarikhMula == $tarikhTamat) { + $tempohPajakan = Carbon::parse($tarikhMula)->translatedFormat('M Y'); + } else { + $tempohPajakan = + Carbon::parse($tarikhMula)->translatedFormat('M Y') . + ' - ' . + Carbon::parse($tarikhTamat)->translatedFormat('M Y'); + } + + // Hari sejak transaksi terakhir + $hariTempohPajakan = $tarikhMula + ? Carbon::parse($tarikhMula)->diffInDays($tarikhTamat ? Carbon::parse($tarikhTamat) : Carbon::now()) + : null; + + // Tujuan gadai + $tujuangadai = $row->tujuangadai ?: '-'; + + // Status aktif: ada transaksi dalam tahun tu + $now = Carbon::now(); + + // Status Aktif + $startOfYear = Carbon::create($year, 1, 1)->startOfDay(); + $endOfYear = Carbon::create($year, 12, 31)->endOfDay(); + + $statusAktif = $tempohData->contains(function ($trx) use ($startOfYear, $endOfYear) { + if (!$trx->t_gadai) return false; + + $tGadai = Carbon::parse($trx->t_gadai); + $tTebus = $trx->t_tebus ? Carbon::parse($trx->t_tebus) : null; + + return $tGadai->lte($endOfYear) && + (is_null($tTebus) || $tTebus->gte($startOfYear)); + }); + + // Umur + $umur = $row->t_lahir ? Carbon::parse($row->t_lahir)->age : null; + + // Pekerjaan + $pekerjaan = $row->kodkerja + ? ($pekerjaanAll[ltrim($row->kodkerja, '0')] ?? 'Lain-lain') + : '-'; + + // Daerah + $lokasi = $row->poskod && isset($poskodAll[$row->poskod]) + ? ($poskodAll[$row->poskod]->daerah->namadaerah ?? 'Lain-lain') + : 'Lain-lain'; + + + return [ + 'cawangan' => $row->kodcaw, + 'nama' => $row->nama, + 'nopelanggan' => $row->nopelanggan, + 'nokp' => $nokp, + 'tarikhdaftar' => Carbon::parse($row->tarikhdaftar)->format('d-m-Y'), + 'umur' => $umur, + 'jantina' => $row->jantina, + 'pekerjaan' => $pekerjaan, + 'daerah' => $lokasi, + 'tempoh_pajakan' => $tempohPajakan, + 'tarikh_mula' => $tarikhMula ? Carbon::parse($tarikhMula)->format('d-m-Y') : null, + 'tarikh_tamat' => $tarikhTamat ? Carbon::parse($tarikhTamat)->format('d-m-Y') : null, + 'hari_sejak_transaksi' => $hariTempohPajakan, + 'bil_transaksi' => $bilTransaksi, + 'bil_outstanding' => $bilOutstanding, + 'bil_tebus' => $bilTebus, + 'jumlah_pinjaman' => $jumlahPinjaman, + 'jumlah_ujrah' => $jumlahUjrah, + 'tujuan_gadai' => $tujuangadai, + 'cara_bayaran' => $caraBayaran, + 'status_aktif' => $statusAktif ? 'AKTIF' : 'TIDAK AKTIF', + 'tarikh_lelong' => $tarikhLelong + ? Carbon::parse($tarikhLelong)->format('d-m-Y') + : null, + ]; + }); + + $result = $result->sortBy('cawangan')->values(); + + return response()->json([ + 'year' => $year, + 'cawangan' => $cawangan, + 'summary' => [ + 'total_pelanggan' => $result->count(), + 'jumlah_cawangan' => $result->pluck('cawangan')->unique()->count(), + ], + 'pelanggan' => $result, + ], 200); + } } diff --git a/routes/report.php b/routes/report.php index 2ed721d..c202553 100644 --- a/routes/report.php +++ b/routes/report.php @@ -59,5 +59,6 @@ $router->group(['prefix' => 'api/reports'], function () use ($router) { $router->get('saringan/gadaian', ['uses' => 'SaringanGadaianController@getLaporanGadai']); $router->get('data-pelanggan', ['uses' => 'AnalisaController@getSummaryLaporanDataPelanggan']); + $router->get('data-pelanggan-bycaw', ['uses' => 'AnalisaController@getSummaryLaporanDataPelangganBycaw']); }); });