From 61465e3deed55c1e9406f54143eae9afffa8337b Mon Sep 17 00:00:00 2001 From: BTMS2 Date: Sun, 2 Mar 2025 16:38:10 +0800 Subject: [PATCH] add laporan lelong keseluruhan --- app/Exports/LelonganExport.php | 53 +++ app/Exports/LelonganPerTellerExport.php | 123 ++++++ app/Exports/LelonganSummaryExport.php | 121 ++++++ .../Reports/LelonganController.php | 111 ++++++ .../views/exports/lelongan/cawangan.blade.php | 95 +++++ .../views/exports/lelongan/summary.blade.php | 72 ++++ resources/views/indexOverallReport.blade.php | 6 + .../reports/laporan-lelong/index.blade.php | 359 ++++++++++++++++++ routes/reports.php | 3 + 9 files changed, 943 insertions(+) create mode 100644 app/Exports/LelonganExport.php create mode 100644 app/Exports/LelonganPerTellerExport.php create mode 100644 app/Exports/LelonganSummaryExport.php create mode 100644 app/Http/Controllers/Reports/LelonganController.php create mode 100644 resources/views/exports/lelongan/cawangan.blade.php create mode 100644 resources/views/exports/lelongan/summary.blade.php create mode 100644 resources/views/reports/laporan-lelong/index.blade.php diff --git a/app/Exports/LelonganExport.php b/app/Exports/LelonganExport.php new file mode 100644 index 0000000..8109596 --- /dev/null +++ b/app/Exports/LelonganExport.php @@ -0,0 +1,53 @@ +cawangan_detail = $data['cawangan_detail']; + $this->query = $data['query']; + $this->lelongan = $data['lelongan']; + $this->summary_lelongan = $data['summary_lelongan']; + } + + public function sheets(): array + { + $sheets = []; + + // Use array_reduce to calculate the sum of values + $data = $this->lelongan; + $teller_with_lelongan_summary_data = array_reduce(array_keys($data), function ($accumulator, $key) use ($data) { + $accumulator[] = [ + 'teller' => $key, + 'summary_lelongan_teller' => $data[$key]['summary_lelongan_teller'], + ]; + return $accumulator; + }, []); + + + + + $sheets[] = new LelonganSummaryExport($this->cawangan_detail, $this->query, $teller_with_lelongan_summary_data, $this->summary_lelongan); + + foreach ($this->lelongan as $teller => $data) { + + $teller_with_lelongan_data = [ + 'teller' => $teller, + 'data' => $data, + ]; + + $sheets[] = new LelonganPerTellerExport($this->cawangan_detail, $this->query, $teller_with_lelongan_data); + } + + return $sheets; + } +} diff --git a/app/Exports/LelonganPerTellerExport.php b/app/Exports/LelonganPerTellerExport.php new file mode 100644 index 0000000..9c79588 --- /dev/null +++ b/app/Exports/LelonganPerTellerExport.php @@ -0,0 +1,123 @@ +cawangan_detail = $cawangan_detail; + $this->query = $query; + $this->teller_with_lelongan_data = $teller_with_lelongan_data; + } + + public function title(): string + { + return sprintf("TELLER %s", $this->teller_with_lelongan_data['teller']); + } + + public function bindValue(Cell $cell, $value) + { + if (is_numeric($value)) { + $cell->setValueExplicit($value, DataType::TYPE_NUMERIC); + + return true; + } + + // else return default behavior + return parent::bindValue($cell, $value); + } + + public function columnWidths(): array + { + return [ + 'A' => 20.5, + 'B' => 42, + 'C' => 14.18, + 'D' => 14.18, + 'E' => 9.19, + 'F' => 27.5, + ]; + } + + public function columnFormats(): array + { + return [ + 'D' => NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1, + 'E' => NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1, + 'F' => NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1, + 'G' => NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1, + 'H' => NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1, + 'I' => NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1, + 'J' => NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1, + 'K' => NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1, + 'L' => NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1, + ]; + } + + public function registerEvents(): array + { + $table_style = [ + 'borders' => [ + 'allBorders' => [ + 'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN, + 'color' => ['argb' => '#000000'], + ], + ], + ]; + + $main_table_row_count = count($this->teller_with_lelongan_data) + 1; + $main_table_start_at_row = 9; + + $main_table_range = 'A' . $main_table_start_at_row . ':J' . ($main_table_row_count + $main_table_start_at_row); + + $summary_table_row_count = 1; + $summary_table_start_at_row = $main_table_row_count + $main_table_start_at_row + 5; + + $summary_table_range = 'A' . $summary_table_start_at_row . ':I' . ($summary_table_row_count + $summary_table_start_at_row); + + $summary_table_column_head = 'A' . $summary_table_start_at_row . ':F' . $summary_table_start_at_row; + + // return [ + // AfterSheet::class => function (AfterSheet $event) use ($main_table_range, $summary_table_range, $summary_table_column_head, $table_style) { + + // $event->sheet->getStyle($main_table_range)->applyFromArray($table_style); + // $event->sheet->getStyle($summary_table_range)->applyFromArray($table_style); + + // $event->sheet->mergeCells($summary_table_column_head); + + // }, + + // ]; + + return []; + } + + public function view(): View + { + return view('exports.lelongan.cawangan', [ + 'cawangan_detail' => $this->cawangan_detail, + 'query' => $this->query, + 'teller_with_lelongan_data' => $this->teller_with_lelongan_data, + ]); + } +} diff --git a/app/Exports/LelonganSummaryExport.php b/app/Exports/LelonganSummaryExport.php new file mode 100644 index 0000000..f6dad6d --- /dev/null +++ b/app/Exports/LelonganSummaryExport.php @@ -0,0 +1,121 @@ +cawangan_detail = $cawangan_detail; + $this->query = $query; + $this->teller_with_lelongan_summary_data = $teller_with_lelongan_data; + $this->summary_lelongan = $summary_lelongan; + } + + public function title(): string + { + return 'SUMMARY LELONGAN'; + } + + public function bindValue(Cell $cell, $value) + { + if (is_numeric($value)) { + $cell->setValueExplicit($value, DataType::TYPE_NUMERIC); + + return true; + } + + // else return default behavior + return parent::bindValue($cell, $value); + } + + public function columnWidths(): array + { + return [ + 'A' => 28, + 'B' => 14.67, + 'C' => 16.00, + 'D' => 14.18, + ]; + } + + public function columnFormats(): array + { + return [ + 'E' => NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1, + 'F' => NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1, + 'G' => NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1, + 'H' => NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1, + 'I' => NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1, + 'J' => NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1, + 'C' => NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1, + 'D' => NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1, + ]; + } + + public function registerEvents(): array + { + $table_style = [ + 'borders' => [ + 'allBorders' => [ + 'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN, + 'color' => ['argb' => '#000000'], + ], + ], + ]; + + $main_table_row_count = count($this->teller_with_lelongan_summary_data) + 1; + $main_table_start_at_row = 9; + + $main_table_range = 'A' . $main_table_start_at_row . ':J' . ($main_table_row_count + $main_table_start_at_row); + + $summary_table_row_count = 1; + $summary_table_start_at_row = $main_table_row_count + $main_table_start_at_row + 5; + + $summary_table_range = 'A' . $summary_table_start_at_row . ':I' . ($summary_table_row_count + $summary_table_start_at_row); + + $summary_table_column_head = 'A' . $summary_table_start_at_row . ':F' . $summary_table_start_at_row; + + // return [ + // AfterSheet::class => function (AfterSheet $event) use ($main_table_range, $summary_table_range, $summary_table_column_head, $table_style) { + + // $event->sheet->getStyle($main_table_range)->applyFromArray($table_style); + // $event->sheet->getStyle($summary_table_range)->applyFromArray($table_style); + + // $event->sheet->mergeCells($summary_table_column_head); + + // }, + + // ]; + + return []; + } + + public function view(): View + { + return view('exports.lelongan.summary', [ + 'cawangan_detail' => $this->cawangan_detail, + 'query' => $this->query, + 'teller_with_lelongan_data' => $this->teller_with_lelongan_summary_data, + 'summary_lelongan' => $this->summary_lelongan, + ]); + } +} diff --git a/app/Http/Controllers/Reports/LelonganController.php b/app/Http/Controllers/Reports/LelonganController.php new file mode 100644 index 0000000..5aca29f --- /dev/null +++ b/app/Http/Controllers/Reports/LelonganController.php @@ -0,0 +1,111 @@ +toDateString(); + } + + return $date_string; + }; + + $request->hostname = config('api.url'); + + $lelongan = Http::get($request->hostname . '/api/reports/lelongan', [ + 'startDate' => $getReportDate($request->startDate), + 'endDate' => $getReportDate($request->endDate), + ])->json(); + // dd($lelongan); + + $startDate = $getReportDate($request->startDate); + $endDate = $getReportDate($request->endDate); + + return view('reports.laporan-lelong.index', compact('lelongan', 'startDate', 'endDate')); + } + + public function show(Request $request) + { + $validated = $request->validate( + ['monthYear' => 'required'], + ['monthYear.required' => 'Sila isi tarikh sebelum hantar', + ]); + + $current = Carbon::now(); + $tarikh_cetak = $current->toDateString(); + $tokens = explode('-', $validated['monthYear']); + $month = ltrim($tokens[0], '0'); + $year = $tokens[1]; + + // Set the locale to Malaysian + App::setLocale('ms'); + + // Create a Carbon instance representing the date + $date = Carbon::createFromDate($year, $month, 1); // Set the day to 1st of the month + + // Get the name of the month in Malaysian local + $monthName = $date->translatedFormat('F'); + + $request->hostname = config('api.url'); + + $stokAudit = Http::get($request->hostname . '/api/reports/stok-audit', [ + 'month' => $month, + 'year' => $year, + ])->json(); + + $tebus_date = $monthName . ' ' . $year; + $file_title = sprintf("Laporan-StokAudit %s (%s - %s).xlsx", 'Semua cawanangan', $monthName, $year); + + if ($request->generateType === 'pdf') { + return view('reports.stok-audit.show', compact('tebus_date', 'tarikh_cetak', 'stokAudit', 'month', 'year')); + } else { + return Excel::download(new StokAuditExport($stokAudit), $file_title); + } + + } + public function downloadLelonganCawanganExcel(Request $request) + { + $api_url = $request->hostname; + $auth_user = Auth::user(); + $current = Carbon::now(); + $current = new Carbon(); + $tarikh_cetak = $current->toDateString(); + + $getReportDate = function ($date_string) use ($current) { + if ($date_string == null) { + return $current->toDateString(); + } + + return $date_string; + }; + + $request->hostname = config('api.url'); + $kod_cawangan = $request->kod_cawangan; + // dd($kod_cawangan); + + $data = Http::get($request->hostname . '/api/reports/lelongan/' . $kod_cawangan, [ + 'startDate' => $getReportDate($request->startDate), + 'endDate' => $getReportDate($request->endDate), + ])->json(); + // dd($data); + + + $file_title = sprintf("LaporanLelongan %s (%s - %s).xlsx", $kod_cawangan, $request->startDate, $request->endDate); + return Excel::download(new LelonganExport($data), $file_title); + } +} diff --git a/resources/views/exports/lelongan/cawangan.blade.php b/resources/views/exports/lelongan/cawangan.blade.php new file mode 100644 index 0000000..b1d7c59 --- /dev/null +++ b/resources/views/exports/lelongan/cawangan.blade.php @@ -0,0 +1,95 @@ + + + + + + + + + + + + + +
{{ $cawangan_detail['nama'] }}
{{ $cawangan_detail['code'] }}
{{ $cawangan_detail['alamat'] }}
{{ $cawangan_detail['waktu_operasi'] }}
+ + + + + + + + +
+ LAPORAN LELONGAN +
+ TARIKH DARI {{ $query['startDate'] }} hingga {{ $query['endDate'] }} +
+ + + +
+ TELLER : {{ $teller_with_lelongan_data['teller'] }} +
+ + + + + + + + + + + + + + + + + + + + + + + @foreach ($teller_with_lelongan_data['data']['lelongan'] as $lelongan_detail) + + + + + + + + + + + + + + + + + + + + + @endforeach + + + + + + + + + + + + + + + + + +
No rujukanNamaNo KPMarhunBeratNilai Marhun (RM)Pembiayaan (RM)%Baki Pembiayaan (RM)Keuntungan (RM)Caj Lelong (RM)Harga Jual (RM)Baki(RM)
{{ $lelongan_detail['no_rujukan'] }}{{ $lelongan_detail['nama'] }}'{{ $lelongan_detail['no_kp'] }}{{ $lelongan_detail['marhun'] }}{{ $lelongan_detail['berat'] }}{{ $lelongan_detail['nilai_marhun'] }}{{ $lelongan_detail['pinjaman'] }}{{ $lelongan_detail['peratusan_margin_pinjaman'] }}{{ $lelongan_detail['bakipjm'] }}{{ $lelongan_detail['keuntungan'] }}{{ $lelongan_detail['cajlelong'] }}{{ $lelongan_detail['hargajual'] }}{{ $lelongan_detail['baki'] }}
Jumlah{{ $teller_with_lelongan_data['data']['summary_lelongan_teller']['total_berat'] }}{{ $teller_with_lelongan_data['data']['summary_lelongan_teller']['total_nilai_marhun'] }}{{ $teller_with_lelongan_data['data']['summary_lelongan_teller']['total_pembiayaan'] }}{{ $teller_with_lelongan_data['data']['summary_lelongan_teller']['total_bakipjm'] }}{{ $teller_with_lelongan_data['data']['summary_lelongan_teller']['total_keuntungan'] }}{{ $teller_with_lelongan_data['data']['summary_lelongan_teller']['total_cajlelong'] }}{{ $teller_with_lelongan_data['data']['summary_lelongan_teller']['total_hargajual'] }}{{ $teller_with_lelongan_data['data']['summary_lelongan_teller']['total_baki'] }}
diff --git a/resources/views/exports/lelongan/summary.blade.php b/resources/views/exports/lelongan/summary.blade.php new file mode 100644 index 0000000..6875bde --- /dev/null +++ b/resources/views/exports/lelongan/summary.blade.php @@ -0,0 +1,72 @@ + + + + + + + + + + + + + +
{{ $cawangan_detail['nama'] }}
{{ $cawangan_detail['code'] }}
{{ $cawangan_detail['alamat'] }}
{{ $cawangan_detail['waktu_operasi'] }}
+ + + + + + + + +
+ LAPORAN LELONGAN +
+ TARIKH DARI {{ $query['startDate'] }} hingga {{ $query['endDate'] }} +
+ + + + + + + + + + + + + + + @foreach ($teller_with_lelongan_data as $data) + + + + + + + + + + + + + + + @endforeach + + + + + + + + + + + + + + +
TellerBilBeratN.MarhunPembiayaan(RM)Baki Pembiayaan(RM)Keuntungan(RM)Caj Lelong(RM)Harga Jual(RM)Baki(RM)
{{ $data['teller'] }}{{ $data['summary_lelongan_teller']['total_lelongan'] }}{{ $data['summary_lelongan_teller']['total_berat'] }}{{ $data['summary_lelongan_teller']['total_nilai_marhun'] }}{{ $data['summary_lelongan_teller']['total_pembiayaan'] }}{{ $data['summary_lelongan_teller']['total_bakipjm'] }}{{ $data['summary_lelongan_teller']['total_keuntungan'] }}{{ $data['summary_lelongan_teller']['total_cajlelong'] }}{{ $data['summary_lelongan_teller']['total_hargajual'] }}{{ $data['summary_lelongan_teller']['total_baki'] }}
{{ $summary_lelongan['total_lelongan'] }}{{ $summary_lelongan['total_berat'] }}{{ $summary_lelongan['total_nilai_marhun'] }}{{ $summary_lelongan['total_pembiayaan'] }}{{ $summary_lelongan['total_bakipjm'] }}{{ $summary_lelongan['total_keuntungan'] }}{{ $summary_lelongan['total_cajlelong'] }}{{ $summary_lelongan['total_hargajual'] }}{{ $summary_lelongan['total_baki'] }}
diff --git a/resources/views/indexOverallReport.blade.php b/resources/views/indexOverallReport.blade.php index a3e97b5..aaf134f 100644 --- a/resources/views/indexOverallReport.blade.php +++ b/resources/views/indexOverallReport.blade.php @@ -43,6 +43,12 @@

Stok Audit

+
+ +

Laporan Lelongan

+
+
diff --git a/resources/views/reports/laporan-lelong/index.blade.php b/resources/views/reports/laporan-lelong/index.blade.php new file mode 100644 index 0000000..dfb8961 --- /dev/null +++ b/resources/views/reports/laporan-lelong/index.blade.php @@ -0,0 +1,359 @@ +@extends('layouts.app') + +@section('content') + +
+
+ +
+ + + + +
+
+
+
Laporan Lelongan
+
+
+
+
+ Mula + + Hingga + + +
+ +
+
+
+
+
+
+
+
+ + +
+
+ + +
+
+ + +
+ + + + + + + + + + + + + + + + + + + @php + $totalbillelong = 0; + $totalberat = 0; + $totalnm = 0; + $totalpinjaman = 0; + $totalbakipjm = 0; + $totalkeuntungan = 0; + $totalcajlelong = 0; + $totalhargajual= 0; + $totalbaki= 0; + @endphp + + @forelse ($lelongan as $lelong) + @php + $totalbillelong += $lelong['total_lelongan']; + $totalberat += $lelong['sum_berat']; + $totalnm += $lelong['sum_nilai_marhun']; + $totalpinjaman += $lelong['sum_pinjaman']; + $totalbakipjm += $lelong['sum_bakipjm']; + $totalkeuntungan += $lelong['sum_bakiupah']; + $totalcajlelong+= $lelong['sum_cajlelong']; + $totalhargajual+= $lelong['sum_hargajual']; + $totalbaki+= $lelong['sum_baki']; + @endphp + + + + + + + + + + + + + + + + + @empty + + + + @endforelse + + + + + + + + + + + + + + + +
+ No + + Kod Cawangan + + Cawangan + + Bil + + Berat (g) + + Nilai Marhun(RM) + + Pembiayaan(RM) + + Baki Pembiayaan(RM) + + Keuntungan(RM) + + Caj Lelong(RM) + + Harga Jual(RM) + + Baki(RM) + + Action +
+
+
+

{{ $loop->iteration }}

+
+
+
+
+
+

{{ $lelong['kodcaw'] }}

+
+
+
+
+
+

{{ $lelong['details_caw'] }}

+
+
+
+
+
+

{{ $lelong['total_lelongan'] }} +

+
+
+
+
+
+

+ {{ number_format($lelong['sum_berat'], 2) }}

+
+
+
+
+
+

+ {{ number_format($lelong['sum_nilai_marhun'], 2) }}

+
+
+
+
+
+

+ {{ number_format($lelong['sum_pinjaman'], 2) }}

+
+
+
+
+
+

+ {{ number_format($lelong['sum_bakipjm'], 2) }}

+
+
+
+
+
+

+ {{ number_format($lelong['sum_bakiupah'], 2) }}

+
+
+
+
+
+

+ {{ number_format($lelong['sum_cajlelong'], 2) }}

+
+
+
+
+
+

+ {{ number_format($lelong['sum_hargajual'], 2) }}

+
+
+
+
+
+

+ {{ number_format($lelong['sum_baki'], 2) }}

+
+
+
+ +
+
+
+

Data not available

+
+
+
+
+
+

Jumlah Keseluruhan

+
+
+
+
+
+

{{ $totalbillelong}} +

+
+
+
+
+
+

+ {{ number_format($totalberat,2) }}

+
+
+
+
+
+

+ {{ number_format($totalnm,2) }}

+
+
+
+
+
+

+ {{ number_format($totalpinjaman,2) }}

+
+
+
+
+
+

+ {{ number_format($totalbakipjm,2) }}

+
+
+
+
+
+

+ {{ number_format($totalkeuntungan,2) }}

+
+
+
+
+
+

+ {{ number_format($totalcajlelong,2) }}

+
+
+
+
+
+

+ {{ number_format($totalhargajual,2) }}

+
+
+
+
+
+

+ {{ number_format($totalbaki,2) }}

+
+
+
+
+
+

+

+
+
+
+
+
+
+ @include('layouts.footer') + +
+@endsection \ No newline at end of file diff --git a/routes/reports.php b/routes/reports.php index 0748b1c..1831f78 100644 --- a/routes/reports.php +++ b/routes/reports.php @@ -5,6 +5,7 @@ use App\Http\Controllers\Reports\PenebusanController; use App\Http\Controllers\Reports\AnsuranController; use App\Http\Controllers\Reports\RingkasanHarianController; use App\Http\Controllers\Reports\StokAuditController; +use App\Http\Controllers\Reports\LelonganController; use Illuminate\Support\Facades\Route; Route::middleware(['roleChecker:admin,akaun,operasi,kpo, null'])->group(function () { @@ -19,4 +20,6 @@ Route::middleware(['roleChecker:admin,akaun,operasi,kpo, null'])->group(function Route::get('ringkasan-harian/{kod_cawangan}', [RingkasanHarianController::class, 'downloadRingkasanHarianPdf'])->name('reports.ringkasan-harian.cawangan.pdf'); Route::get('stok-audit', [StokAuditController::class, 'index'])->name('reports.stok-audit.index'); Route::get('stok-audit/view', [StokAuditController::class, 'show'])->name('reports.stok-audit.show'); + Route::get('laporan-lelong', [LelonganController::class, 'index'])->name('reports.lelongan.index'); + Route::get('lelongan/{kod_cawangan}', [LelonganController::class, 'downloadLelonganCawanganExcel'])->name('reports.lelongan.cawangan.excel'); });