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/matriculas_api_dev/app/Repositories/StudentRepository.php
<?php

namespace App\Repositories;

use App\Models\Student;
use Exception;

class StudentRepository
{
    public function getByRut($rut, $id = null)
    {
        $query = Student::where('rut', $rut)->where('deleted', false);
        $parentId = null;
        if (auth()->check() && auth()->user()->profile->code === 'parent') {
            $parentId = auth()->user()->parent->id ?? 0;
        }

        if ($parentId > 0) {
            $query->where('financial_parent_id', $parentId);
        }
        if ($id > 0) {
            $query->where('id', '!=', $id);
        }

        $register = $query->first();
        if (!$register) {
            return false;
        }

        return $register;
    }

    public function getAll($parentId = null)
    {
        $query = Student::where('deleted', false);

        if (auth()->check() && auth()->user()->profile->code === 'parent') {
            $parentId = auth()->user()->parent->id ?? 0;
        }

        if ($parentId > 0) {
            $query->where('financial_parent_id', $parentId);
        }

        return $query->orderBy('first_name', 'asc')->get();
    }


    public function getById($id, $validateProfile = true)
    {
        $query = Student::where('deleted', false)->where('id', $id);
        $parentId = null;
        if (auth()->check() && auth()->user()->profile->code === 'parent') {
            $parentId = auth()->user()->parent->id ?? 0;
        }

        if ($parentId > 0) {
            $query->where('financial_parent_id', $parentId);
        }

        $register = $query->first();
        if (!$register) {
            throw new Exception("Estudiante no existe o fue eliminado", 404);
        }
        return $register;
    }


    public function create($data)
    {

        $isPassport = ($data->document_type ?? 'RUT') === 'PASSPORT';

        $createData = [
            'document_type'         => $data->document_type ?? 'RUT',
            'rut'                   => !empty($data->rut) ? ($isPassport ? strUpper($data->rut) : formatterRut($data->rut, false)) : null,
            'first_name'            => strUpper($data->first_name),
            'second_name'           => $data->second_name ? strUpper($data->second_name) : null,
            'last_name'             => strUpper($data->last_name),
            'second_last_name'      => $data->second_last_name ? strUpper($data->second_last_name) : null,
            'birth_date'            => $data->birth_date ?? null,
            'email'                 => strLower($data->email ?? null),
            'mobile'                => $data->mobile ?? null,
            'academic_parent_id'   => $data->parent ?? null,
            'financial_parent_id'   => $data->parent ?? null,
            'course_id'             => $data->course ?? null,
            'course_letter_id'      => $data->course_letter ?? null,
            'letter'                => $data->letter ?? null,
            'date_entry'            => $data->date_entry ?? null,
            'status'                => true,
            'gender_id'             => $data->gender ?? null,
            'country_id'            => $data->country ?? null,
            'region_id'             => $data->region ?? null,
            'commune_id'            => $data->commune ?? null,
            'address'               => $data->address ?? null,
            'image'                 => $data->image ?? null,
            'last_registration_year' => $data->last_registration_year ?? null,
            'blocked_student'       => !empty($data->blocked_student) ? $data->blocked_student : null,
            'subscribe_pac'         => $data->subscribe_pac ?? false,
            'family'                => isset($data->family) ? (bool)$data->family : true,
            'deleted'               => false,
            'created_at'            => now(),
            'updated_at'            => now(),
        ];

        if (auth()->check()) {
            $createData['user_created'] = auth()->id();
            $createData['user_updated'] = auth()->id();
        }

        return Student::create($createData);
    }

    /**
     * createOrUpdate para API v1 (clave: student_rut)
     */
    public function createOrUpdateByRut($data, $parentId, $isPassport = false)
    {
        $documentType = $isPassport ? 'PASSPORT' : 'RUT';
        $rut = $isPassport
            ? strUpper($data->student_rut)
            : formatterRut($data->student_rut, false);

        // Search globally (no parent filter for API v1)
        $existing = Student::where('rut', $rut)->where('deleted', false)->first();

        if ($existing) {
            if (!empty($data->first_name))       $existing->first_name       = strUpper($data->first_name);
            if (!empty($data->second_name))      $existing->second_name      = strUpper($data->second_name);
            if (!empty($data->last_name))        $existing->last_name        = strUpper($data->last_name);
            if (!empty($data->second_last_name)) $existing->second_last_name = strUpper($data->second_last_name);
            if (isset($data->gender_id))         $existing->gender_id        = $data->gender_id;
            if (!empty($data->external_id))      $existing->external_id      = $data->external_id;
            if (!empty($data->course_id))        $existing->course_id        = $data->course_id;
            if (!empty($data->course_letter_id)) $existing->course_letter_id = $data->course_letter_id;
            if (isset($data->family))            $existing->family           = (bool) $data->family;
            if (!empty($data->email))            $existing->email            = strLower($data->email);
            if (!empty($data->mobile))           $existing->mobile           = $data->mobile;
            if (!empty($data->birth_date))       $existing->birth_date       = $data->birth_date;
            if (!empty($data->address))          $existing->address          = $data->address;

            $existing->document_type       = $documentType;
            $existing->financial_parent_id = $parentId;
            $existing->academic_parent_id  = $parentId;
            $existing->enrollment_source   = 'api';
            $existing->updated_at          = now();
            $existing->save();

            return ['operation' => 'update', 'student' => $existing];
        }

        // Create new student
        $student = Student::create([
            'external_id'          => $data->external_id ?? null,
            'enrollment_source'    => 'api',
            'document_type'        => $documentType,
            'rut'                  => $rut,
            'first_name'           => strUpper($data->first_name ?? ''),
            'second_name'          => !empty($data->second_name) ? strUpper($data->second_name) : null,
            'last_name'            => strUpper($data->last_name ?? ''),
            'second_last_name'     => !empty($data->second_last_name) ? strUpper($data->second_last_name) : null,
            'email'                => !empty($data->email) ? strLower($data->email) : null,
            'mobile'               => $data->mobile ?? null,
            'birth_date'           => $data->birth_date ?? null,
            'address'              => $data->address ?? null,
            'financial_parent_id'  => $parentId,
            'academic_parent_id'   => $parentId,
            'course_id'            => $data->course_id ?? null,
            'course_letter_id'     => $data->course_letter_id ?? null,
            'gender_id'            => $data->gender_id ?? null,
            'family'               => isset($data->family) ? (bool) $data->family : true,
            'status'               => true,
            'deleted'              => false,
            'created_at'           => now(),
            'updated_at'           => now(),
        ]);

        return ['operation' => 'create', 'student' => $student];
    }

    /**
     * Buscar estudiante por RUT (sin filtro de parent para API v1)
     */
    public function getByRutGlobal($rut)
    {
        return Student::where('rut', formatterRut($rut, false))
            ->where('deleted', false)
            ->first();
    }

    public function update($registerData, $data)
    {



        $isPassport = ($data->document_type ?? $registerData->document_type ?? 'RUT') === 'PASSPORT';
        $registerData->document_type         = $data->document_type ?? $registerData->document_type ?? 'RUT';
        $registerData->rut                   = !empty($data->rut) ? ($isPassport ? strUpper($data->rut) : formatterRut($data->rut, false)) : $registerData->rut;
        $registerData->first_name            = strUpper($data->first_name ?? $registerData->first_name);
        $registerData->second_name           = $data->second_name ? strUpper($data->second_name) : $registerData->second_name;
        $registerData->last_name             = strUpper($data->last_name ?? $registerData->last_name);
        $registerData->second_last_name      = $data->second_last_name ? strUpper($data->second_last_name) : $registerData->second_last_name;
        $registerData->birth_date            = $data->birth_date ?? $registerData->birth_date;
        $registerData->email                 = strLower($data->email ?? $registerData->email);
        $registerData->mobile                = $data->mobile ?? $registerData->mobile;
        $registerData->academic_parent_id    = $data->parent ?? $registerData->parent_id;
        $registerData->financial_parent_id   = $data->parent ?? $registerData->parent_id;
        $registerData->course_id             = $data->course ?? $registerData->course_id;
        $registerData->course_letter_id      = $data->course_letter ?? $registerData->course_letter_id;
        $registerData->letter                = $data->letter ?? $registerData->letter;
        $registerData->date_entry            = $data->date_entry ?? $registerData->date_entry;
        $registerData->gender_id             = $data->gender ?? $registerData->gender_id;
        $registerData->country_id            = $data->country ?? $registerData->country_id;
        $registerData->region_id             = $data->region ?? $registerData->region_id;
        $registerData->commune_id            = $data->commune ?? $registerData->commune_id;
        $registerData->address               = $data->address ?? $registerData->address;
        $registerData->image                 = $data->image ?? $registerData->image;
        $registerData->last_registration_year = $data->last_registration_year ?? $registerData->last_registration_year;
        $registerData->blocked_student       = in_array($data->blocked_student, ['CAE', 'CFE']) ? $data->blocked_student : null;
        $registerData->subscribe_pac         = $data->subscribe_pac == 1;
        $registerData->family                = isset($data->family) ? (bool)$data->family : $registerData->family;
        $registerData->status                = isset($data->status) ? (bool)$data->status : $registerData->status;
        $registerData->user_updated          = auth()->check() ? auth()->id() : $registerData->user_updated;
        $registerData->updated_at            = now();

        $registerData->save();

        return $registerData;
    }
}