You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

171 lines
6.3 KiB

<?php
namespace App\Models;
use DB;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
/**
* Modelo Eloquent para la tabla `uader_mapuche_persona`.
* Este modelo representa los datos de las personas en el sistema Mapuche.
*/
class UaderMapuchePersona extends Model
{
use HasFactory;
protected $table = "uader_mapuche_persona";
/**
* Obtiene la lista de familiares asociados a una persona.
*
* Utiliza la relación 'hasMany' para recuperar los registros de la tabla 'uader_mapuche_familiares'
* relacionados con el identificador de la persona en la tabla actual.
*
* @return Illuminate\Database\Eloquent\Collection Una colección de objetos UaderMapucheFamiliares.
*/
public function familiares()
{
return $this->hasMany(
UaderMapucheFamiliares::class,
"id_uader_mapu_pers",
"id"
);
}
/**
* Obtiene la localidad a la que pertenece una persona.
*
* Utiliza la relación 'hasOne' para recuperar el registro de la tabla 'mapuche_ciudades'
* asociado al identificador de la localidad en la tabla actual.
*
* @return Illuminate\Database\Eloquent\Model|null El objeto MapucheCiudades
* representando la localidad, o null si no se encuentra.
*/
public function localidad()
{
return $this->hasOne(MapucheCiudades::class, "id", "localidad_id");
}
/**
* Obtiene la declaración jurada asociada a una persona.
*
* Utiliza la relación 'hasOne' para recuperar el registro de la tabla 'uader_dj_persona'
* asociado al identificador de la declaración jurada en la tabla actual.
*
* @return Illuminate\Database\Eloquent\Model|null El objeto UaderDjPersona
* representando la declaración jurada, o null si no se encuentra.
*/
public function declaracion_jurada()
{
return $this->hasOne(UaderDjPersona::class, "id", "id_dj_persona");
}
/**
* Obtiene la provincia a la que pertenece una persona.
*
* Utiliza la relación 'hasOne' para recuperar el registro de la tabla 'mapuche_provincias'
* asociado al código de provincia en la tabla actual.
*
* @return Illuminate\Database\Eloquent\Model|null El objeto MapucheProvincias
* representando la provincia, o null si no se encuentra.
*/
public function provincia()
{
return $this->hasOne(
MapucheProvincias::class,
"codigo_pcia",
"codigo_provincia"
);
}
/**
* Busca los datos de una persona y su ultima declaracion juarada por su número de teléfono.
*
* Elimina los guiones y el prefijo '15' del número de teléfono antes de realizar la búsqueda.
* Solo considera personas con estado de declaración jurada 'C' (Completa) o 'V' (Verificada).
* Ordena los resultados por la fecha de cierre de la declaración jurada (descendente).
*
* @param string $telefono El número de teléfono de la persona a buscar.
* @return UaderMapuchePersona|null El objeto UaderMapuchePersona
* representando la persona encontrada, o null si no se encuentra.
*/
public static function buscarPersonaPorTelefono(string $telefono)
{
return self::buscarPersona("telefono", $telefono);
}
/**
* Busca los datos de una persona y su ultima declaracion juarada por el DNI.
*
* Solo considera personas con estado de declaración jurada 'C' (Completa) o 'V' (Verificada).
* Ordena los resultados por la fecha de cierre de la declaración jurada (descendente).
*
* @param string $telefono El número de documento de la persona a buscar.
* @return UaderMapuchePersona|null El objeto UaderMapuchePersona
* representando la persona encontrada, o null si no se encuentra.
*/
public static function buscarPersonaPorDni(string $dni)
{
return self::buscarPersona("dni", $dni);
}
/**
* Busca una persona en el sistema según el tipo de filtro especificado (DNI o teléfono).
*
* La función realiza una búsqueda en la base de datos para encontrar una persona
* que tenga una declaración jurada en estado "C" (cerrado) o "V" (validado).
* Se aplica un filtro de búsqueda según el DNI o el teléfono proporcionado.
*
* @param string $tipoFiltro El tipo de filtro a aplicar, puede ser "dni" o "telefono".
* @param string $valor El valor del filtro (DNI o teléfono) que se utilizará para la búsqueda.
*
* @return \App\Models\Persona|null Retorna el registro de la persona encontrada o null si no existe.
*
* @throws \InvalidArgumentException Si el tipo de filtro no es soportado.
*/
public static function buscarPersona(string $tipoFiltro, string $valor)
{
$declaracionesJuradas = self::join(
"uader_dj_persona",
"uader_mapuche_persona.id_dj_persona",
"=",
"uader_dj_persona.id"
)
->selectRaw("uader_mapuche_persona.id_dj_persona as id_dj")
->whereIn("uader_dj_persona.estado", ["C", "V"])
->orderBy("uader_dj_persona.fecha_cierre", "desc");
// Aplicar la lógica de búsqueda según el tipo de filtro
switch ($tipoFiltro) {
case "dni":
$declaracionesJuradas->where(
"uader_mapuche_persona.nro_docum",
$valor
);
break;
case "telefono":
$declaracionesJuradas->whereRaw(
"'549'||REGEXP_REPLACE(telefono_celular, '-|-15','','g') = '$valor'"
);
break;
default:
throw new \InvalidArgumentException(
"Filtro de búsqueda no soportado: $tipoFiltro"
);
}
$ultimaDeclaracionJurada = $declaracionesJuradas->first();
if (empty($ultimaDeclaracionJurada)) {
return null;
}
return self::where(
"id_dj_persona",
$ultimaDeclaracionJurada->id_dj
)->first();
}
}