From 824e9d67c77c3ee592938984e6fdc2f43804aa24 Mon Sep 17 00:00:00 2001 From: Nur Izzati Date: Wed, 27 Aug 2025 12:26:19 +0800 Subject: [PATCH] tambah baik laporan SA by sag --- app/Http/Controllers/StokAuditController.php | 147 +++++++++++++++++++ routes/web.php | 1 + 2 files changed, 148 insertions(+) diff --git a/app/Http/Controllers/StokAuditController.php b/app/Http/Controllers/StokAuditController.php index d0188c1..cc6129f 100644 --- a/app/Http/Controllers/StokAuditController.php +++ b/app/Http/Controllers/StokAuditController.php @@ -432,4 +432,151 @@ class StokAuditController extends Controller 'totaltunggakan'=>$totaltunggakan ?? null]; return response()->json($arrayrekod,200); } + + + public function LaporanAuditKhasByNorujukan($kodcaw, Request $request) + { + $daritempoh = $request->daritempoh; + $hinggatempoh = $request->hinggatempoh; + + $cawangan = Cawangan::on('mysql7')->where('kodcaw', '=', $request->kodcaw)->first(); + + // Ambil semua rekod gadai asas + $audit = Gadai::on($cawangan['mysql']) + ->where([ + ['tagpalsu', '=', 0], + ['tempoh', '>=', $daritempoh], + ['tempoh', '<=', $hinggatempoh], + ['sttebus', '=', ''], + ['taglel', '=', 0], + ]) + ->orderBy('norujukan', 'ASC') // susun ikut norujukan + ->get(); + + $arraynorujukan = $audit->pluck('norujukan')->toArray(); + + // Tarikh terkini ikut trans_type T + $tarikhTerkiniT = Transaction::on('mysql7') + ->select('norujukan', DB::raw('MAX(created_at) as tarikh_max')) + ->where('trans_type', 'T') + ->whereIn('norujukan', $arraynorujukan) + ->groupBy('norujukan') + ->pluck('tarikh_max', 'norujukan') + ->toArray(); + + // Tarikh terkini ikut trans_type A + $tarikhTerkiniA = Transaction::on('mysql7') + ->select('norujukan', DB::raw('MAX(created_at) as tarikh_max')) + ->where('trans_type', 'A') + ->whereIn('norujukan', $arraynorujukan) + ->groupBy('norujukan') + ->pluck('tarikh_max', 'norujukan') + ->toArray(); + + // Filter audit + $rekodaudit = $audit->filter(function ($item) use ($tarikhTerkiniT, $tarikhTerkiniA) { + $norujukan = $item->norujukan; + + $adaTebusTerkini = isset($tarikhTerkiniT[$norujukan]) && + Transaction::on('mysql7') + ->where('norujukan', $norujukan) + ->where('trans_type', 'T') + ->whereDate('created_at', '>=', date('Y-m-d', strtotime($tarikhTerkiniT[$norujukan]))) + ->exists(); + + $adaAnsuranTerkini = isset($tarikhTerkiniA[$norujukan]) && + Transaction::on('mysql7') + ->where('norujukan', $norujukan) + ->where('trans_type', 'A') + ->whereDate('created_at', '>=', date('Y-m-d', strtotime($tarikhTerkiniA[$norujukan]))) + ->exists(); + + return !$adaTebusTerkini && !$adaAnsuranTerkini; + })->values(); + + // Attach customer info + blast untuk setiap norujukan + foreach ($rekodaudit as $index => $rekod) { + $customer = Customer::on('mysql7') + ->where('kpbaru', '=', $rekod->nokp) + ->orWhere('kplama', '=', $rekod->nokp) + ->first(); + + $rekodaudit[$index]['customer'] = $customer; + + $rekodaudit[$index]['blasted'] = BlastWasap::on('mysql7') + ->where('nokp', $rekod->nokp) + ->where('norujukan', $rekod->norujukan) + ->where('kodcaw', $kodcaw) + ->first(); + + // 👉 Kira keuntungan (tunggakan sebenar) guna function + $upah = $this->kiraupahUjrahOnePercent($kodcaw, $rekod->norujukan); + $keuntungan = $upah['ujrah'] + $upah['onepercent']; + + // Save ke dalam rekod + $rekodaudit[$index]['tunggakan'] = $this->floorTo5SenFrom2dp($keuntungan); + } + + // Summary total + $summary = [ + 'totalrekod' => $rekodaudit->count(), + 'totalberat' => $rekodaudit->sum('berat'), + 'totalnilaimarhun'=> $rekodaudit->sum('nilaimarhun'), + 'totalpinjaman' => $rekodaudit->sum('pinjaman'), + 'totalbakipjm' => $rekodaudit->sum('bakipjm'), + 'totaltunggakan' => $rekodaudit->sum('tunggakan'), + ]; + + return response()->json([ + 'rekod' => $rekodaudit, + 'summary' => $summary, + ]); + } + + public function kiraupahUjrahOnePercent($kodcaw,$norujukan){ + $onepercentservices = new OnePercentServices(); + + $cawangan = Cawangan::on('mysql7') + ->where('kodcaw','=',$kodcaw) + ->first(); + + $gadai_data = Gadai::on($cawangan['mysql']) + ->where('norujukan','=',$norujukan) + ->first(); + + if($gadai_data['tempoh'] >= 12.0){ + $tempoh = 12; + }else{ + $tempoh = $gadai_data['tempoh']; + } + + $bilang_bln = $tempoh - $gadai_data['tempohbayar']; + $array_upah = $onepercentservices->kiraanKeuntunganSebenar($gadai_data['pinjaman'],$gadai_data['nilaimarhun'],$gadai_data['kadarupah'],$gadai_data['percentpinj']); + $ujrah = $bilang_bln * $array_upah['ujrah']; + $onepercent = $bilang_bln * $array_upah['onepercent']; + $onepercent_semasa = $onepercent; + $ujrah_semasa = $ujrah; + + return ['ujrah' => $ujrah_semasa, 'onepercent' => $onepercent_semasa]; + } + + // dalam Controller (private/protected) + private function floorTo5SenFrom2dp($amount) + { + // pastikan numeric + $amount = (float) $amount; + + // 1) Tukar ke sen dan buang sebarang pecahan sen (hanya baca 2 dp) + // tambah epsilon kecil untuk elak isu floating point + $cents = (int) floor($amount * 100 + 0.0000001); + + // 2) Floor ke gandaan 5 sen + $cents5 = (int) (floor($cents / 5) * 5); + + // balik ke ringgit + return $cents5 / 100; + } + + + } diff --git a/routes/web.php b/routes/web.php index 73a8349..359456b 100644 --- a/routes/web.php +++ b/routes/web.php @@ -666,6 +666,7 @@ $router->group(['prefix'=>'api'], function () use ($router){ //STOKAUDITKHAS $router->get('stokauditkhas/aktif/{kodcaw}',['uses'=>'StokAuditController@LaporanAuditKhasAktif']); + $router->get('stokauditkhasbynorujukan/aktif/{kodcaw}',['uses'=>'StokAuditController@LaporanAuditKhasByNorujukan']); //API BLAST WASAP $router->post('blastwasap/{kodcaw}',['uses'=>'StokAuditController@blastwasap']);