193 lines
7.5 KiB
PHP
193 lines
7.5 KiB
PHP
<?php
|
|
|
|
namespace App\Exports;
|
|
|
|
use Maatwebsite\Excel\Concerns\FromCollection;
|
|
use Maatwebsite\Excel\Concerns\WithHeadings;
|
|
use Maatwebsite\Excel\Concerns\ShouldAutoSize;
|
|
use Maatwebsite\Excel\Concerns\WithTitle;
|
|
use Maatwebsite\Excel\Concerns\WithEvents;
|
|
use Maatwebsite\Excel\Events\AfterSheet;
|
|
use PhpOffice\PhpSpreadsheet\Worksheet\PageSetup;
|
|
use PhpOffice\PhpSpreadsheet\Style\Border;
|
|
use PhpOffice\PhpSpreadsheet\Style\Alignment;
|
|
use PhpOffice\PhpSpreadsheet\Style\Fill;
|
|
use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
|
|
|
|
class FormExport implements FromCollection, WithTitle, ShouldAutoSize, WithEvents
|
|
{
|
|
private $data;
|
|
private $isTemplate, $titleExcel, $inventoryYear;
|
|
|
|
private $instansi;
|
|
|
|
public function __construct($data)
|
|
{
|
|
$this->data = $data;
|
|
$this->isTemplate = $data['isTemplate'];
|
|
$this->titleExcel = $data['titleExcel'];
|
|
$this->inventoryYear = $data['inventoryYear'];
|
|
|
|
$this->instansi = $data['instansi'];
|
|
}
|
|
|
|
public function collection()
|
|
{
|
|
// Fetch necessary data
|
|
$data = $this->data;
|
|
$formDetails = $data['formDetails'];
|
|
$unitsMap = $data['unitsMap'];
|
|
$activityFormDetails = $data['activityFormDetails'];
|
|
|
|
$excelData = collect();
|
|
|
|
if (!$this->isTemplate) {
|
|
// Add title row
|
|
$titleRow = [$this->titleExcel];
|
|
$excelData->push($titleRow);
|
|
$excelData->push(['']);
|
|
|
|
// Add print date row
|
|
$tanggalCetakRow = ['Tanggal Cetak: ' . now()->format('Y-m-d')];
|
|
$excelData->push($tanggalCetakRow);
|
|
$excelData->push(['']);
|
|
}
|
|
|
|
// Add header row
|
|
$header = ['TAHUN'];
|
|
foreach ($formDetails as $detail) {
|
|
$activityName = $detail->activity ? $detail->activity->name : 'N/A';
|
|
$unitCode = $unitsMap[$detail->unit_code]->code ?? '';
|
|
$header[] = $activityName . "\n" . '(' . $unitCode . ')';
|
|
}
|
|
$excelData->push($header);
|
|
|
|
// Add data rows
|
|
$years = activityYearRange($this->inventoryYear);
|
|
foreach ($years as $year) {
|
|
$row = [$year];
|
|
foreach ($formDetails as $detail) {
|
|
$activityValue = isset($activityFormDetails[$year])
|
|
? $activityFormDetails[$year]
|
|
->where('activity_code', $detail->activity_code)
|
|
->where('activity_unit_code', $detail->unit_code)
|
|
->first()->activity_value ?? ''
|
|
: '';
|
|
|
|
$row[] = $activityValue;
|
|
}
|
|
$excelData->push($row);
|
|
}
|
|
|
|
return $excelData;
|
|
}
|
|
|
|
public function title(): string
|
|
{
|
|
return 'Template'; // Sheet name
|
|
}
|
|
|
|
public function registerEvents(): array
|
|
{
|
|
return [
|
|
AfterSheet::class => function (AfterSheet $event) {
|
|
// Set page properties
|
|
$event->sheet->getPageSetup()->setOrientation(PageSetup::ORIENTATION_LANDSCAPE);
|
|
$event->sheet->getPageSetup()->setFitToWidth(1);
|
|
$event->sheet->getPageSetup()->setFitToHeight(0);
|
|
$event->sheet->getPageMargins()->setTop(0.5);
|
|
$event->sheet->getPageMargins()->setBottom(0.5);
|
|
$event->sheet->getPageMargins()->setLeft(0.5);
|
|
$event->sheet->getPageMargins()->setRight(0.5);
|
|
$event->sheet->getPageSetup()->setPaperSize(PageSetup::PAPERSIZE_A4);
|
|
$event->sheet->getPageSetup()->setHorizontalCentered(true);
|
|
$event->sheet->getPageSetup()->setVerticalCentered(true);
|
|
|
|
if (!$this->isTemplate) {
|
|
// Merge cells for title and print date
|
|
// $event->sheet->mergeCells('A1:' . $event->sheet->getHighestColumn() . '1');
|
|
// $event->sheet->mergeCells('A3:' . $event->sheet->getHighestColumn() . '3');
|
|
|
|
$event->sheet->mergeCells('A1:' . 'S1');
|
|
$event->sheet->mergeCells('A3:' . 'S3');
|
|
}
|
|
|
|
// Set alignment and make header row bold and centered
|
|
$headerRow = $this->isTemplate == 1 ? 'A1' : 'A5';
|
|
$valueRow = $this->isTemplate == 1 ? 1 : 5;
|
|
$event->sheet->getStyle($headerRow . ':' . $event->sheet->getHighestColumn() . $valueRow)
|
|
->applyFromArray([
|
|
'font' => [
|
|
'bold' => true,
|
|
],
|
|
'alignment' => [
|
|
'horizontal' => Alignment::HORIZONTAL_CENTER,
|
|
'vertical' => Alignment::VERTICAL_CENTER,
|
|
'wrapText' => true, // Ensure wrap text is enabled for newlines
|
|
],
|
|
]);
|
|
|
|
// Apply borders to the table
|
|
$event->sheet->getDelegate()->getStyle($headerRow . ':' . $event->sheet->getDelegate()->getHighestColumn() . $event->sheet->getDelegate()->getHighestRow())
|
|
->applyFromArray([
|
|
'borders' => [
|
|
'allBorders' => [
|
|
'borderStyle' => Border::BORDER_THIN,
|
|
'color' => ['argb' => 'FF000000'],
|
|
],
|
|
],
|
|
]);
|
|
|
|
// Auto size columns starting from A onwards
|
|
$highestColumn = $event->sheet->getDelegate()->getHighestColumn();
|
|
$columns = $this->generateColumnsRange('A', $highestColumn);
|
|
|
|
$valueRow = $this->isTemplate == 1 ? '2' : '6';
|
|
foreach ($columns as $column) {
|
|
$event->sheet->getDelegate()->getColumnDimension($column)->setAutoSize(true);
|
|
|
|
// Apply number format to data columns (B onwards)
|
|
if ($column != 'A') {
|
|
$highestRow = $event->sheet->getDelegate()->getHighestRow($column);
|
|
for ($row = $valueRow; $row <= $highestRow; $row++) {
|
|
$cellValue = $event->sheet->getCell($column . $row)->getValue();
|
|
$formatCode = NumberFormat::FORMAT_GENERAL;
|
|
if (!$this->isTemplate) {
|
|
if (is_numeric($cellValue)) {
|
|
$formatCode = floor($cellValue) != $cellValue ? '#,##0.0###############' : '#,##0';
|
|
}
|
|
}
|
|
|
|
$event->sheet->getStyle($column . $row)->getNumberFormat()->setFormatCode($formatCode);
|
|
}
|
|
|
|
if ($this->isTemplate) {
|
|
$event->sheet->getStyle($column . '2:' . $column . $event->sheet->getDelegate()->getHighestRow())
|
|
->applyFromArray([
|
|
'fill' => [
|
|
'fillType' => Fill::FILL_SOLID,
|
|
'color' => ['argb' => 'FFFFFF00'],
|
|
],
|
|
]);
|
|
}
|
|
}
|
|
}
|
|
},
|
|
];
|
|
}
|
|
|
|
function generateColumnsRange($start, $end)
|
|
{
|
|
$columns = [];
|
|
$current = $start;
|
|
|
|
while ($current !== $end) {
|
|
$columns[] = $current;
|
|
$current++;
|
|
}
|
|
$columns[] = $end;
|
|
|
|
return $columns;
|
|
}
|
|
}
|