update tast uum bycaw
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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']);
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user