File: /var/www/api_matriculas/app/Exports/ExcelUploadAllLinesExport.php
<?php
namespace App\Exports;
use App\Models\ExcelUploadLine;
use Illuminate\Support\Collection;
use Maatwebsite\Excel\Concerns\FromArray;
use Maatwebsite\Excel\Concerns\WithHeadings;
use Maatwebsite\Excel\Concerns\WithTitle;
use Maatwebsite\Excel\Concerns\ShouldAutoSize;
class ExcelUploadAllLinesExport implements FromArray, WithHeadings, WithTitle, ShouldAutoSize
{
protected int $uploadId;
protected array $columns = [];
protected array $rows = [];
protected bool $initialized = false;
public function __construct(int $uploadId)
{
$this->uploadId = $uploadId;
}
protected function initialize(): void
{
if ($this->initialized) {
return;
}
$lines = ExcelUploadLine::where('upload_id', $this->uploadId)
->orderBy('line_number')
->get();
if ($lines->isEmpty()) {
$this->initialized = true;
return;
}
// Detectar TODAS las claves únicas de data
$this->columns = $lines
->flatMap(fn($line) => array_keys($line->data ?? []))
->unique()
->values()
->toArray();
// Construir filas con Error al final
foreach ($lines as $line) {
$row = [
'Línea' => $line->line_number,
'Status' => $line->status,
];
// Agregar cada columna de data en el orden definido
foreach ($this->columns as $col) {
$row[$col] = $line->data[$col] ?? '';
}
// Error al final
$row['Error'] = $line->error_message ?? '';
$this->rows[] = $row;
}
$this->initialized = true;
}
public function array(): array
{
$this->initialize();
return $this->rows;
}
public function headings(): array
{
$this->initialize();
// Cabeceras: Línea, Status, [columnas de data], Error
return array_merge(['Línea', 'Status'], $this->columns, ['Error']);
}
public function title(): string
{
return 'Carga completa';
}
}