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