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/gestion-formularios.bdfschool/app/Imports/UploadStudentImport.php
<?php

namespace App\Imports;

namespace App\Imports;

use App\Models\Courses;
use App\Models\Students;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log;
use Maatwebsite\Excel\Concerns\ToCollection;
use Maatwebsite\Excel\Concerns\WithHeadingRow;


class UploadStudentImport implements ToCollection, WithHeadingRow
{
    protected $expectedHeaders = [
        'rut',
        'primer_nombre',
        'segundo_nombre',
        'primer_apellido',
        'segundo_apellido',
        'sexo',
        'fecha_nacimiento',
        'nacionalidad',
        'codigo_curso',
        'letra',
    ];

    public $errorMessage;
    public $successMessage;

    public function __construct() {}

    public function collection(Collection $rows)
    {
        if ($rows->isEmpty()) {
            $this->errorMessage = 'El archivo está vacío.';
            return;
        }

        $headers = $rows->first()->keys()->toArray();
        foreach ($this->expectedHeaders as $header) {
            if (!in_array($header, $headers)) {
                $this->errorMessage = 'Falta el encabezado requerido: ' . $header;
                return;
            }
        }
        $courses = Courses::all()->keyBy(function ($course) {
            return (strUpper($course->code));
        });

        $success = 0;
        $errors = [];

        foreach ($rows as $index => $row) {
            $fila = $index + 2;

            try {
                $rut = str_replace('.', '', strtoupper(formateaRut($row['rut'] ?? '')));
                if (empty($rut) || !validateRut($rut)) {
                    $errors[] = "Fila $fila: RUT $rut inválido.";
                    continue;
                }

                $courseCode = $row['codigo_curso'] ?? null;
                if (empty($courseCode) || !isset($courses[$courseCode])) {
                    $errors[] = "Fila $fila: Curso $courseCode no válido.";
                    continue;
                }
    
                Students::updateOrCreate(
                    ['rut' => $rut],
                    [
                        'rut'               => $rut,
                        'first_name'        => strCapital($row['primer_nombre']),
                        'second_name'       => strCapital($row['segundo_nombre']),
                        'last_name'         => strCapital($row['primer_apellido']),
                        'second_last_name'  => strCapital($row['segundo_apellido']),
                        'gender'            => strtoupper($row['sexo']) === 'F' ? 'F' : 'M',
                        'birth_date'        => ordenar_fechaServidor($row['fecha_nacimiento']),
                        'nationality'       => strCapital($row['nacionalidad'] ?? 'Chilena'),
                        'course_id'            => $courses[$courseCode]->id,
                        'letter'            => strtoupper($row['letra'] ?? 'A'),
                        'status'            => true,
                        'deleted'           => false,
                        'user_created'      => auth()->id(),
                        'created_at'        => now(),
                        'updated_at'        => now(),
                        'annual_load'       => 1,
                        'annual_load_at'    => now(),
                    ]
                );

                $success++;
            } catch (\Exception $e) {
                $errors[] = "Fila $fila: Error al procesar. " . $e->getMessage();
            }
        }

        if (!empty($errors)) {
            $this->errorMessage = implode('<br>', $errors);
        }

        if ($success > 0) {
            $this->successMessage = "Importación realizada correctamente. Registros exitosos: $success.";
        } elseif (empty($errors)) {
            $this->errorMessage = "No se encontraron datos válidos para importar.";
        }
    }
}