stokaudit = $stokaudit; $this->jenisLaporan = strtoupper($jenisLaporan); // ✅ Convert to uppercase for consistency $this->tebus_date = $tebus_date; $this->namacaw = $namacaw; } public function collection() { $data = collect($this->stokaudit); // ✅ Compute Totals $totals = [ 'norujukan' => 'TOTAL KESELURUHAN', // Label for total row 'tempoh' => '', 'nokp' => '', 'berat' => $data->sum('berat'), 'nilaimarhun' => $data->sum('nilaimarhun'), 'marhun' => '', 'pinjaman' => $data->sum('pinjaman'), 'bakipjm' => $data->sum('bakipjm'), 'kadarupah' => '', 'tempohbayar' => '', 'tunggakan' => $data->sum('tunggakan'), 'tunggakanujrah' => $data->sum('tunggakanujrah'), 'tunggakanonepercent' => $data->sum('tunggakanonepercent'), 'lelong_tawarruq' => '', ]; // ✅ Append Total Row to the Data Collection $data->push($totals); return $data; } public function headings(): array { return [ ['LAPORAN STOK AUDIT'], // ✅ Ensure proper title format ["Cawangan:", $this->namacaw], ["Tarikh:", $this->tebus_date], // ✅ Include tebus_date in Excel [], [ 'Bil', 'Norujukan', 'JBG', 'No. KP', 'Berat', 'Nilai Marhun (RM)', 'Marhun', 'Pembiayaan Asal (RM)', 'Baki Pembiayaan (RM)', 'Kadar Keuntungan', 'Tempoh Belum Bayar', 'Keuntungan Belum Bayar (RM)', 'Lain-Lain Caj (RM)', 'Keuntungan 1% (RM)', 'Lanjutan' ] ]; } public function startCell(): string { return 'A2'; } public function map($row): array { // ✅ Ensure $row is an array before accessing keys if (!is_array($row)) { return []; // Skip invalid rows } static $counter = 1; if ($row['norujukan'] === 'TOTAL KESELURUHAN') { return [ '', // Empty for numbering 'JUMLAH', '', '', $row['berat'], // Raw number $row['nilaimarhun'], // Raw number '', $row['pinjaman'], // Raw number $row['bakipjm'], // Raw number '', '', $row['tunggakan'], // Raw number $row['tunggakanujrah'], // Raw number $row['tunggakanonepercent'], // Raw number '', ]; } return [ $counter++, // Bil $row['norujukan'], $row['tempoh'], $row['nokp'], $row['berat'], // Raw number $row['nilaimarhun'], // Raw number $row['marhun'], $row['pinjaman'], // Raw number $row['bakipjm'], // Raw number $row['kadarupah'], // Raw number $row['tempoh'] - $row['tempohbayar'], // Raw number $row['tunggakan'], // Raw number $row['tunggakanujrah'], // Raw number $row['tunggakanonepercent'], // Raw number $row['lelong_tawarruq'], ]; } public function title(): string { return $this->jenisLaporan; // ✅ Now correctly uses the class property } public function styles(Worksheet $sheet) { // ✅ Merge and Style Title Row $sheet->mergeCells('A1:O1'); $sheet->getStyle('A1')->getFont()->setBold(true)->setSize(16); $sheet->getStyle('A1')->getAlignment()->setHorizontal('center'); // ✅ Bold Headers $sheet->getStyle('A2:O2')->getFont()->setBold(true)->setSize(12); // ✅ Bold Last Row (Total Row) $lastRow = $sheet->getHighestRow(); // Get last row number $sheet->getStyle("A{$lastRow}:O{$lastRow}")->getFont()->setBold(true)->setSize(12); $sheet->getStyle("A{$lastRow}:O{$lastRow}")->getAlignment()->setHorizontal('right'); // Align text properly return []; } public function columnWidths(): array { return [ 'A' => 5, 'B' => 25, 'C' => 5, 'D' => 18, 'E' => 10, 'F' => 10, 'G' => 10, ]; } public function columnFormats(): array { return [ 'E' => NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1, 'F' => NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1, 'H' => NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1, 'I' => NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1, 'L' => NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1, 'M' => NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1, 'N' => NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1, ]; } }