HEX
Server: Apache/2.4.58 (Ubuntu)
System: Linux Bradford-Sitios 6.14.0-1017-azure #17~24.04.1-Ubuntu SMP Mon Dec 1 20:10:50 UTC 2025 x86_64
User: www-data (33)
PHP: 7.4.33
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
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';
    }
}