Files
MKM/app/Filament/Exports/TransmittalExcelExport.php
Jp 6eeedbeeb0 feat(transmittal): replace PDF export with Excel export and add logo
- Remove PDF export functionality from TransmittalResource and CreateTransmittal page
- Add new TransmittalExcelExport class for formatted Excel exports with company logo
- Update export jobs to generate unique filenames per user and refresh user data
- Replace PDF export action with Excel export in table actions
- Comment out logo in PDF view template as it's no longer used
- Fix import alias for Excel export action in GeneralLedger
2026-02-19 03:11:17 +08:00

143 lines
5.5 KiB
PHP

<?php
namespace App\Filament\Exports;
use App\Models\Transmittal;
use pxlrbt\FilamentExcel\Columns\Column;
use pxlrbt\FilamentExcel\Exports\ExcelExport;
use Maatwebsite\Excel\Events\AfterSheet;
use PhpOffice\PhpSpreadsheet\Worksheet\Drawing;
use PhpOffice\PhpSpreadsheet\Style\Alignment;
use PhpOffice\PhpSpreadsheet\Style\Border;
class TransmittalExcelExport extends ExcelExport
{
public function setUp(): void
{
$this->fromTable()
->withFilename('transmittals-' . now()->format('Y-m-d'))
->modifyQueryUsing(
fn ($query) => $query->with([
'client',
'branch',
'files.notes',
'files.remarks',
])
)
->withColumns([
Column::make('series')
->heading('series'),
Column::make('client')
->heading('Client')
->formatStateUsing(fn (Transmittal $record) => $record->client?->company),
Column::make('branch')
->heading('Branch')
->formatStateUsing(fn (Transmittal $record) => $record->branch?->code),
Column::make('files')
->heading('files')
->formatStateUsing(
fn (Transmittal $record) => $record->files
->pluck('description')
->filter()
->join(PHP_EOL)
),
]);
}
public function registerEvents(): array
{
$recordIds = $this->getRecordIds();
return [
AfterSheet::class => function (AfterSheet $event) use ($recordIds) {
$sheet = $event->sheet->getDelegate();
$sheet->insertNewRowBefore(1, 2);
$sheet->mergeCells('A1:F1');
$sheet->getRowDimension(1)->setRowHeight(90);
$sheet->getStyle('A1:F1')
->getAlignment()
->setHorizontal(Alignment::HORIZONTAL_CENTER);
$logo = new Drawing();
$logo->setName('MKM Logo');
$logo->setDescription('MKM Tax & Accounting Services');
$logo->setPath(public_path('images/logo-light.png'));
$logo->setHeight(100);
$logo->setOffsetX(120);
$logo->setOffsetY(10);
$logo->setCoordinates('A1');
$logo->setWorksheet($sheet);
$transmittal = Transmittal::with(['client', 'branch', 'files.notes', 'files.remarks'])->find($recordIds[0] ?? null);
if ($transmittal) {
$sheet->mergeCells('A2:F2');
$sheet->setCellValue('A2', $transmittal->client?->company);
$sheet->getStyle('A2')->getFont()->setBold(true);
$sheet->getStyle('A2')->getAlignment()->setHorizontal('center');
}
// Headings row
$sheet->setCellValue('A3', 'series');
$sheet->setCellValue('B3', 'Client');
$sheet->setCellValue('C3', 'Branch');
$sheet->setCellValue('D3', 'files');
$sheet->setCellValue('E3', 'notes');
$sheet->setCellValue('F3', 'remarks');
$sheet->getStyle('A3:F3')->getFont()->setBold(true);
$sheet->getStyle('A3:F3')->getAlignment()->setHorizontal('center');
$rows = [];
$firstRow = true;
if ($transmittal) {
foreach ($transmittal->files as $file) {
$fileNotes = $file->notes->pluck('comment')->values();
$fileRemarks = $file->remarks->pluck('remark')->values();
$maxLines = max(1, $fileNotes->count(), $fileRemarks->count());
for ($i = 0; $i < $maxLines; $i++) {
$rows[] = [
'series' => $firstRow ? $transmittal->series : '',
'client' => $firstRow ? $transmittal->client?->company : '',
'branch' => $firstRow ? $transmittal->branch?->code : '',
'file' => $i === 0 ? $file->description : '',
'note' => $fileNotes[$i] ?? '',
'remark' => $fileRemarks[$i] ?? '',
];
$firstRow = false;
}
}
}
$currentRow = 4;
foreach ($rows as $dataRow) {
$sheet->setCellValue("A{$currentRow}", $dataRow['series']);
$sheet->setCellValue("B{$currentRow}", $dataRow['client']);
$sheet->setCellValue("C{$currentRow}", $dataRow['branch']);
$sheet->setCellValue("D{$currentRow}", $dataRow['file']);
$sheet->setCellValue("E{$currentRow}", $dataRow['note']);
$sheet->setCellValue("F{$currentRow}", $dataRow['remark']);
$currentRow++;
}
$lastRow = max($currentRow - 1, 3);
$sheet->getStyle("A3:F{$lastRow}")
->getBorders()
->getAllBorders()
->setBorderStyle(Border::BORDER_THIN);
},
];
}
}