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