92 lines
3.7 KiB
PHP
92 lines
3.7 KiB
PHP
<?php
|
|
|
|
namespace App\Domains\Ticketing\Desfile\Services;
|
|
|
|
use App\Domains\Core\Tenant\Models\Tenant;
|
|
use App\Domains\Ticketing\Desfile\Models\EntryReservation;
|
|
use Illuminate\Support\Collection;
|
|
use PhpOffice\PhpSpreadsheet\Cell\DataType;
|
|
use PhpOffice\PhpSpreadsheet\Shared\Date;
|
|
use PhpOffice\PhpSpreadsheet\Spreadsheet;
|
|
use PhpOffice\PhpSpreadsheet\Style\Alignment;
|
|
use PhpOffice\PhpSpreadsheet\Style\Fill;
|
|
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
|
|
use Symfony\Component\HttpFoundation\StreamedResponse;
|
|
|
|
class EntryReservationExcelService
|
|
{
|
|
public function __construct(private readonly EntryReservationReportService $report) {}
|
|
|
|
/** @param Collection<int, EntryReservation> $reservations */
|
|
public function download(Tenant $tenant, Collection $reservations, string $timeZone): StreamedResponse
|
|
{
|
|
$generatedAt = now();
|
|
$rows = $this->report->rows($reservations);
|
|
$spreadsheet = new Spreadsheet;
|
|
$spreadsheet->getProperties()
|
|
->setCreator('Shopit')
|
|
->setTitle('Reservas de entradas')
|
|
->setSubject($tenant->nombre);
|
|
$sheet = $spreadsheet->getActiveSheet();
|
|
$sheet->setTitle('Reservas');
|
|
$sheet->fromArray([
|
|
'Tipo',
|
|
'Sector',
|
|
'Fila',
|
|
'Asiento',
|
|
'ID',
|
|
'Fecha',
|
|
'Importe',
|
|
'Pago',
|
|
], null, 'A1');
|
|
|
|
foreach ($rows as $index => $reservation) {
|
|
$row = $index + 2;
|
|
foreach (['A' => 'tipo', 'B' => 'sector', 'C' => 'fila', 'D' => 'asiento'] as $column => $key) {
|
|
$sheet->setCellValueExplicit("{$column}{$row}", $reservation[$key], DataType::TYPE_STRING);
|
|
}
|
|
$sheet->setCellValueExplicit(
|
|
"E{$row}",
|
|
$reservation['ticket_id'] === null ? '-' : (string) $reservation['ticket_id'],
|
|
DataType::TYPE_STRING,
|
|
);
|
|
$sheet->setCellValue(
|
|
"F{$row}",
|
|
Date::dateTimeToExcel($reservation['fecha_reserva']->copy()->timezone($timeZone)),
|
|
);
|
|
if ($reservation['importe'] !== null) {
|
|
$sheet->setCellValue("G{$row}", (float) $reservation['importe']);
|
|
}
|
|
$sheet->setCellValueExplicit("H{$row}", $reservation['pago'], DataType::TYPE_STRING);
|
|
}
|
|
|
|
$lastRow = max(2, $rows->count() + 1);
|
|
$sheet->getStyle("F2:F{$lastRow}")->getNumberFormat()->setFormatCode('dd/mm/yyyy hh:mm');
|
|
$sheet->getStyle("G2:G{$lastRow}")->getNumberFormat()->setFormatCode('$ #,##0.00');
|
|
$sheet->getStyle('A1:H1')->applyFromArray([
|
|
'font' => ['bold' => true, 'color' => ['rgb' => 'FFFFFF']],
|
|
'fill' => [
|
|
'fillType' => Fill::FILL_SOLID,
|
|
'startColor' => ['rgb' => '26382E'],
|
|
],
|
|
'alignment' => ['vertical' => Alignment::VERTICAL_CENTER],
|
|
]);
|
|
$sheet->getRowDimension(1)->setRowHeight(24);
|
|
$sheet->freezePane('A2');
|
|
$sheet->setAutoFilter("A1:H{$lastRow}");
|
|
foreach (['A' => 20, 'B' => 22, 'C' => 12, 'D' => 12, 'E' => 16, 'F' => 20, 'G' => 16, 'H' => 18] as $column => $width) {
|
|
$sheet->getColumnDimension($column)->setWidth($width);
|
|
}
|
|
|
|
$filename = 'reservas_entradas_'.$tenant->codigo.'_'
|
|
.$generatedAt->copy()->timezone($timeZone)->format('Ymd_His').'.xlsx';
|
|
|
|
return response()->streamDownload(function () use ($spreadsheet): void {
|
|
(new Xlsx($spreadsheet))->save('php://output');
|
|
$spreadsheet->disconnectWorksheets();
|
|
}, $filename, [
|
|
'Content-Type' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
|
|
]);
|
|
}
|
|
}
|