diff --git a/app/Http/Controllers/GadaianController.php b/app/Http/Controllers/GadaianController.php index 2dff3673..2ac08566 100644 --- a/app/Http/Controllers/GadaianController.php +++ b/app/Http/Controllers/GadaianController.php @@ -259,6 +259,121 @@ class GadaianController extends Controller return redirect()->route('customer_info'); } + public function printBorangPengesahanOnline($norujukan) + { + $auth_user = Auth::user(); + $kodcaw = $auth_user['cawangan']; + + $onlineResp = Http::withOptions(['verify' => config('app.api_verify')]) + ->get(config('api.url') . '/api/pembiayaan-online/' . $kodcaw . '/by-norujukan/' . $norujukan); + + if (!$onlineResp->successful()) { + abort(404, 'Pembiayaan online tidak dijumpai.'); + } + + $line = $onlineResp->json(); + if (!is_array($line) || empty($line['norujukan'])) { + abort(404, 'Pembiayaan online tidak dijumpai.'); + } + + return $this->renderBorangPengesahanOnline($line, $kodcaw); + } + + public function previewBorangPengesahanOnline(Request $request) + { + $auth_user = Auth::user(); + $kodcaw = $auth_user['cawangan']; + + $line = [ + 'norujukan' => $request->input('norujukan'), + 'nokp' => $request->input('nokp'), + 'nopelanggan' => $request->input('nopelanggan'), + 'nama_pelanggan' => $request->input('nama_pelanggan'), + 'pinjaman' => $request->input('pinjaman'), + 'kodbank' => $request->input('kodbank'), + 'nama_bank' => $request->input('nama_bank'), + 'noakaun' => $request->input('noakaun'), + 'nama_akaun' => $request->input('nama_akaun'), + 'created_by' => $auth_user['name'] ?? '', + 'created_at' => Carbon::now()->toDateTimeString(), + ]; + + if (empty($line['norujukan']) || empty($line['noakaun'])) { + abort(422, 'Sila lengkapkan maklumat bank sebelum cetak borang.'); + } + + return $this->renderBorangPengesahanOnline($line, $kodcaw); + } + + private function renderBorangPengesahanOnline(array $line, $kodcaw) + { + $auth_user = Auth::user(); + + $cawanganResp = Http::withOptions(['verify' => config('app.api_verify')]) + ->get(config('api.url') . '/api/cawangan/detail/' . $kodcaw) + ->json(); + $cawangan_detail = (is_array($cawanganResp) && isset($cawanganResp[0])) + ? $cawanganResp[0] + : (is_array($cawanganResp) ? $cawanganResp : []); + + $nokpRaw = $line['nokp'] ?? ''; + $customer = []; + if ($nokpRaw !== '') { + $customerResp = Http::withOptions(['verify' => config('app.api_verify')]) + ->get(config('api.url') . '/api/customers/' . $nokpRaw) + ->json(); + if (is_array($customerResp)) { + $customer = $customerResp; + } + } + + $cawangan = $cawangan_detail['namacaw'] + ?? $cawangan_detail['details_caw'] + ?? $kodcaw; + $alamat1 = $cawangan_detail['alamat1'] ?? ''; + $alamat2 = $cawangan_detail['alamat2'] ?? ''; + $notel = $cawangan_detail['notel'] ?? ''; + + $nama = $line['nama_pelanggan'] ?? ($customer['nama'] ?? ''); + $nokp = !empty($customer['kpbaru']) ? $customer['kpbaru'] : ($customer['kplama'] ?? $nokpRaw); + $nopelanggan = $line['nopelanggan'] ?? ($customer['nopelanggan'] ?? ''); + $telefon = $customer['telefon'] ?? ''; + $teller = $line['created_by'] ?? ($auth_user['name'] ?? ''); + $bank = $line['nama_bank'] ?? ($line['kodbank'] ?? ''); + $noakaun = $line['noakaun'] ?? ''; + $nama_akaun = $line['nama_akaun'] ?? $nama; + $pinjaman = number_format((float) ($line['pinjaman'] ?? 0), 2); + $norujukan = $line['norujukan'] ?? ''; + + $tarikhSumber = $line['created_at'] ?? null; + try { + $tarikh = $tarikhSumber + ? Carbon::parse($tarikhSumber)->format('d/m/Y') + : Carbon::now()->format('d/m/Y'); + } catch (\Exception $e) { + $tarikh = Carbon::now()->format('d/m/Y'); + } + + return view('print.borang_pengesahan_online', compact( + 'cawangan', + 'kodcaw', + 'alamat1', + 'alamat2', + 'notel', + 'norujukan', + 'tarikh', + 'teller', + 'nama', + 'nokp', + 'nopelanggan', + 'telefon', + 'pinjaman', + 'bank', + 'noakaun', + 'nama_akaun' + )); + } + public function editstore(Request $request) { $auth_user = Auth::user(); diff --git a/app/Http/Controllers/PembiayaanOnlineController.php b/app/Http/Controllers/PembiayaanOnlineController.php index f7414a21..ef11bd52 100644 --- a/app/Http/Controllers/PembiayaanOnlineController.php +++ b/app/Http/Controllers/PembiayaanOnlineController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers; +use Carbon\Carbon; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Http; @@ -346,6 +347,98 @@ class PembiayaanOnlineController extends Controller ]); } + /** + * Operasi: printable batch kelulusan form. + */ + public function operasiPrintBatch($kodcaw, $batchId) + { + $api_url = config('api.url'); + + $detail = $this->api() + ->get($api_url . '/api/pembiayaan-online/operasi/' . $kodcaw . '/batches/' . $batchId) + ->json(); + + if (!is_array($detail) || empty($detail['batch'])) { + return redirect() + ->route('pembiayaan.online.operasi') + ->with('error', 'Batch tidak dijumpai.'); + } + + $batch = $detail['batch']; + $lines = $detail['lines'] ?? []; + if (!is_array($lines)) { + $lines = []; + } + + $cawanganResp = $this->api() + ->get($api_url . '/api/cawangan/detail/' . $kodcaw) + ->json(); + $cawangan_detail = (is_array($cawanganResp) && isset($cawanganResp[0])) + ? $cawanganResp[0] + : (is_array($cawanganResp) ? $cawanganResp : []); + + $cawangan = $cawangan_detail['namacaw'] + ?? $cawangan_detail['details_caw'] + ?? $cawangan_detail['nama'] + ?? $kodcaw; + $alamat1 = $cawangan_detail['alamat1'] ?? ''; + $alamat2 = $cawangan_detail['alamat2'] ?? ''; + $notel = $cawangan_detail['notel'] ?? ''; + + $batchNo = $batch['batch_no'] ?? '-'; + $slot = $batch['slot'] ?? '-'; + $status = $batch['status'] ?? '-'; + $dihantarOleh = $batch['pc_submitted_by'] ?? '-'; + + $jumlah = (float) ($batch['jumlah_keseluruhan'] ?? 0); + if ($jumlah <= 0 && count($lines) > 0) { + $jumlah = (float) collect($lines)->sum(function ($line) { + return (float) ($line['pinjaman'] ?? 0); + }); + } + + $opsBy = Auth::user()['name'] ?? ''; + foreach ($lines as $line) { + if (!empty($line['ops_by'])) { + $opsBy = $line['ops_by']; + break; + } + } + + $tarikh = $this->formatPrintDate($batch['tarikh'] ?? null); + $dihantarPada = $this->formatPrintDate($batch['submitted_at'] ?? null, true); + + return view('print.borang_batch_pembiayaan_online', compact( + 'cawangan', + 'kodcaw', + 'alamat1', + 'alamat2', + 'notel', + 'tarikh', + 'batchNo', + 'slot', + 'status', + 'dihantarOleh', + 'dihantarPada', + 'opsBy', + 'lines', + 'jumlah' + )); + } + + protected function formatPrintDate($value, $withTime = false) + { + if ($value === null || $value === '' || $value === '-') { + return '-'; + } + + try { + return Carbon::parse($value)->format($withTime ? 'd/m/Y H:i' : 'd/m/Y'); + } catch (\Exception $e) { + return (string) $value; + } + } + public function operasiApproveLine(Request $request, $kodcaw, $id) { $res = $this->api() diff --git a/resources/views/components/datatable.blade.php b/resources/views/components/datatable.blade.php new file mode 100644 index 00000000..fbe981b6 --- /dev/null +++ b/resources/views/components/datatable.blade.php @@ -0,0 +1,137 @@ +@props([ + 'id', + 'columns' => [], + 'exportable' => true, + 'filename' => '', + 'skipExport' => ['Bil', 'Cetak'], +]) + + + + + +
| {{ $column }} | + @endforeach +
|---|
KOPERASI PERMODALAN KELANTAN BERHAD (D-5-0228)
+Ar-Rahn {{ $cawangan }}
+{{ $alamat1 }}
+{{ $alamat2 }}
+Tel: {{ $notel }}
+
+
+ Untuk semakan Operasi dan kelulusan Pengurus Besar. Bukan untuk tandatangan pelanggan.
+| No. Batch | +{{ $batchNo }} | +Cawangan | +{{ $kodcaw }} — {{ $cawangan }} | +
|---|---|---|---|
| Tarikh / Slot | +{{ $tarikh }} · {{ $slot }} | +Status Batch | +{{ $status }} | +
| Dihantar Oleh (PC) | +{{ $dihantarOleh }} | +Dihantar Pada | +{{ $dihantarPada }} | +
| Bilangan Rekod | +{{ count($lines) }} | +Jumlah Keseluruhan | +RM {{ number_format($jumlah, 2) }} | +
| Bil | +No. SAG | +Pelanggan | +No. KP | +Bank | +No. Akaun | +Nama Akaun | +Pinjaman (RM) | +
|---|---|---|---|---|---|---|---|
| {{ $i + 1 }} | +{{ $line['norujukan'] }} | +{{ $line['nama'] }} | +{{ $line['nokp'] }} | +{{ $line['bank'] }} | +{{ $line['noakaun'] }} | +{{ $line['nama_akaun'] }} | +{{ number_format($line['pinjaman'], 2) }} | +
| JUMLAH | +{{ number_format($jumlah, 2) }} | +||||||
Nama: {{ $opsBy }}
+Jawatan: Operasi
+Tarikh: {{ $tarikh }}
+Nama:
+Cop / Paraf:
+Tarikh:
+1. Borang ini dicetak dari skrin Operasi — Pembiayaan Online (Batch) untuk kelulusan pembayaran.
+2. Hanya dua tandatangan diperlukan: Operasi dan Pengurus Besar.
+3. Simpan salinan bersama bukti pindahan bank selepas status PAID.
+Untuk diisi dan ditandatangani oleh pelanggan semasa transaksi gadai.
+| Nama Pelanggan | +{{ $nama }} | +||
|---|---|---|---|
| No. MyKad / Passport | +{{ $nokp }} | +No. Pelanggan | +{{ $nopelanggan }} | +
| No. Telefon | +{{ $telefon }} | +Cawangan | +{{ $cawangan }} | +
| No. Surat Akuan Gadai | +{{ $norujukan }} | +
|---|---|
| Amaun Pembiayaan | +RM {{ $pinjaman }} | +
| Cara Terima Pembiayaan | +Online (kredit ke akaun bank) — bukan tunai | +
| Teller | +{{ $teller }} | +
| Nama Bank | +{{ $bank }} | +
|---|---|
| No. Akaun | +{{ $noakaun }} | +
| Nama Pemegang Akaun | +{{ $nama_akaun }} | +
Nama: {{ $nama }}
+No. KP: {{ $nokp }}
+Tarikh: {{ $tarikh }}
+Nama: {{ $teller }}
+Cop / Paraf:
+Tarikh: {{ $tarikh }}
+Nama:
+Cop cawangan:
+Tarikh:
+1. Borang ini dicetak semasa pelanggan memilih cara terima pembiayaan secara Online.
+2. Pembiayaan akan dikreditkan ke akaun selepas semakan PC. Pelanggan tidak menerima wang tunai di kaunter.
+3. Sila pastikan nama pemegang akaun sepadan dengan nama pelanggan pada MyKad.
+