Files
shopit-back/app/Domains/Ticket/Services/AdminAppTicketExcelService.php

104 lines
4.2 KiB
PHP

<?php
namespace App\Domains\Ticket\Services;
use App\Domains\Tenant\Models\Tenant;
use App\Domains\Ticket\Models\Ticket;
use Carbon\CarbonInterface;
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 AdminAppTicketExcelService
{
public function __construct(private readonly AdminAppTicketReportService $reportService) {}
/** @param Collection<int, Ticket> $tickets */
public function download(Tenant $tenant, Collection $tickets, string $timeZone): StreamedResponse
{
$generatedAt = now();
$rows = $this->reportService->rows($tickets);
$spreadsheet = new Spreadsheet;
$spreadsheet->getProperties()
->setCreator('Shopit')
->setTitle('Listado de tickets')
->setSubject($tenant->nombre);
$sheet = $spreadsheet->getActiveSheet();
$sheet->setTitle('Tickets');
$sheet->fromArray([
'N° de orden',
'Categoría',
'Producto',
'Tipo',
'Importe',
'Cliente',
'ID',
'Fecha',
'Estado',
'Escaneado por',
], null, 'A1');
foreach ($rows as $index => $ticket) {
$row = $index + 2;
$sheet->setCellValueExplicit(
"A{$row}",
$ticket['order_number'] === null ? '-' : '#'.$ticket['order_number'],
DataType::TYPE_STRING,
);
$sheet->setCellValueExplicit("B{$row}", $ticket['category'], DataType::TYPE_STRING);
$sheet->setCellValueExplicit("C{$row}", $ticket['product'], DataType::TYPE_STRING);
$sheet->setCellValueExplicit("D{$row}", $ticket['type'], DataType::TYPE_STRING);
if ($ticket['amount'] !== null) {
$sheet->setCellValue("E{$row}", $ticket['amount']);
}
$sheet->setCellValueExplicit("F{$row}", $ticket['client'], DataType::TYPE_STRING);
$sheet->setCellValueExplicit("G{$row}", $ticket['ticket'], DataType::TYPE_STRING);
if ($ticket['date'] instanceof CarbonInterface) {
$sheet->setCellValue(
"H{$row}",
Date::dateTimeToExcel($ticket['date']->copy()->timezone($timeZone)),
);
}
$sheet->setCellValueExplicit("I{$row}", $ticket['status'], DataType::TYPE_STRING);
$sheet->setCellValueExplicit("J{$row}", $ticket['scanned_by'], DataType::TYPE_STRING);
}
$lastRow = max(2, $rows->count() + 1);
$sheet->getStyle("E2:E{$lastRow}")->getNumberFormat()->setFormatCode('$ #,##0.00');
$sheet->getStyle("H2:H{$lastRow}")->getNumberFormat()->setFormatCode('dd/mm/yyyy hh:mm');
$sheet->getStyle('A1:J1')->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:J{$lastRow}");
foreach ([
'A' => 14, 'B' => 18, 'C' => 22, 'D' => 18, 'E' => 15,
'F' => 30, 'G' => 39, 'H' => 20, 'I' => 13, 'J' => 28,
] as $column => $width) {
$sheet->getColumnDimension($column)->setWidth($width);
}
$filename = 'tickets_'.$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',
]);
}
}