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.";
}
}
}