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.
 
 
 
 

1180 lines
44 KiB

<?php
namespace App\Http\Controllers;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\HttpKernel\Exception\HttpException;
use InvalidArgumentException;
use Illuminate\Support\Facades\Log;
use Illuminate\Http\Request;
use App\Constants\HttpStatus;
use App\Models\UaderMapuchePersona;
class ApiPersonaController extends Controller
{
/**
* Funcion de la ruta getDatos.
* Devuelve los datos básicos de una persona en formato JSON.
*
* @param \Illuminate\Http\Request $request La solicitud HTTP que contiene los parámetros de búsqueda.
* @return \Illuminate\Http\JsonResponse La respuesta JSON con los datos de la persona encontrada, o un mensaje de error si no se encuentra.
*/
public function getDatos(Request $request)
{
if (!$request->has("dni") && !$request->has("telefono")) {
return response()->json(
["error" => trans("persona.DEBE_INGRESAR_DNI_O_TELEFONO")],
HttpStatus::BAD_REQUEST
);
}
try {
if ($request->has("dni")) {
$persona = UaderMapuchePersona::buscarPersonaPorDni(
$request->get("dni")
);
if ($persona) {
return ApiPersonaController::extraerDatosJson($persona);
}
}
if ($request->has("telefono")) {
$persona = UaderMapuchePersona::BuscarPersonaPorTelefono(
$request->get("telefono")
);
if ($persona) {
return ApiPersonaController::extraerDatosJson($persona);
}
}
return response()->json(
["error" => trans("persona.NO_ENCONTRADA")],
HttpStatus::NOT_FOUND
);
} catch (\Exception $e) {
Log::error(trans("persona.LOG_DATOS") . $e->getMessage());
return response()->json(
["error" => trans("persona.ERROR")],
HttpStatus::INTERNAL_SERVER_ERROR
);
}
}
/**
* Funcion de ruta, obtiene los horarios de una persona en una sede específica según el DNI o teléfono.
*
* @param \Illuminate\Http\Request $request La solicitud HTTP que contiene los parámetros necesarios:
* - 'dni' o 'telefono' para identificar a la persona.
* - 'sede' para especificar la sede.
* - 'funcion' para especificar la función.
* - 'dia' para especificar el día de la semana.
* - 'tipo_horario' para especificar el tipo de horario.
* @return \Illuminate\Http\JsonResponse La respuesta JSON con los horarios de la persona, o un mensaje de error si no se encuentra la información.
*/
public function getHorariosPorSede(Request $request)
{
if (!$request->has("telefono") && !$request->has("dni")) {
return response()->json(
["error" => trans("persona.DEBE_INGRESAR_DNI_O_TELEFONO")],
HttpStatus::BAD_REQUEST
);
}
if (!$request->has("sede")) {
return response()->json(
["error" => trans("persona.DEBE_INGRESAR_SEDE")],
HttpStatus::BAD_REQUEST
);
}
if (!$request->has("funcion")) {
return response()->json(
["error" => trans("persona.DEBE_INGRESAR_FUNCION")],
HttpStatus::BAD_REQUEST
);
}
if (!$request->has("dia")) {
return response()->json(
["error" => trans("persona.DEBE_INGRESAR_DIA")],
HttpStatus::BAD_REQUEST
);
}
if (!$request->has("tipo_horario")) {
return response()->json(
["error" => trans("persona.DEBE_INGRESAR_TIPO_HORARIO")],
HttpStatus::BAD_REQUEST
);
}
try {
if ($request->has("dni")) {
$persona = UaderMapuchePersona::buscarPersonaPorDni(
$request->get("dni")
);
if ($persona) {
return ApiPersonaController::extraerHorariosPorSede(
$persona,
$request->get("sede"),
$request->get("funcion"),
$request->get("dia"),
$request->get("tipo_horario")
);
}
}
if ($request->has("telefono")) {
$persona = UaderMapuchePersona::BuscarPersonaPorTelefono(
$request->get("telefono")
);
if ($persona) {
return ApiPersonaController::extraerHorariosPorSede(
$persona,
$request->get("sede"),
$request->get("funcion"),
$request->get("dia"),
$request->get("tipo_horario")
);
}
}
return response()->json(
["error" => trans("persona.NO_ENCONTRADA")],
HttpStatus::NOT_FOUND
);
} catch (\Exception $e) {
Log::error(trans("persona.LOG_HORARIOS") . $e->getMessage());
return response()->json(
["error" => trans("persona.ERROR")],
HttpStatus::INTERNAL_SERVER_ERROR
);
}
}
/**
* Funcion de ruta, obtiene los horarios de una persona en una unidad académica específica según el DNI o teléfono.
*
* @param \Illuminate\Http\Request $request La solicitud HTTP que contiene los parámetros necesarios:
* - 'dni' o 'telefono' para identificar a la persona.
* - 'unidad_academica' para especificar la unidad académica.
* - 'funcion' para especificar la función.
* - 'dia' para especificar el día de la semana.
* - 'tipo_horario' para especificar el tipo de horario.
* @return \Illuminate\Http\JsonResponse La respuesta JSON con los horarios de la persona, o un mensaje de error si no se encuentra la información.
*/
public function getHorariosPorUnidadAcademica(Request $request)
{
if (!$request->has("telefono") && !$request->has("dni")) {
return response()->json(
["error" => trans("persona.DEBE_INGRESAR_DNI_O_TELEFONO")],
HttpStatus::BAD_REQUEST
);
}
if (!$request->has("unidad_academica")) {
return response()->json(
["error" => trans("persona.DEBE_INGRESAR_UNIDAD_ACADEMICA")],
HttpStatus::BAD_REQUEST
);
}
if (!$request->has("funcion")) {
return response()->json(
["error" => trans("persona.DEBE_INGRESAR_FUNCION")],
HttpStatus::BAD_REQUEST
);
}
if (!$request->has("dia")) {
return response()->json(
["error" => trans("persona.DEBE_INGRESAR_DIA")],
HttpStatus::BAD_REQUEST
);
}
if (!$request->has("tipo_horario")) {
return response()->json(
["error" => trans("persona.DEBE_INGRESAR_TIPO_HORARIO")],
HttpStatus::BAD_REQUEST
);
}
try {
if ($request->has("dni")) {
$persona = UaderMapuchePersona::buscarPersonaPorDni(
$request->get("dni")
);
if ($persona) {
return ApiPersonaController::extraerHorariosPorUnidadAcademica(
$persona,
$request->get("unidad_academica"),
$request->get("funcion"),
$request->get("dia"),
$request->get("tipo_horario")
);
}
}
if ($request->has("telefono")) {
$persona = UaderMapuchePersona::BuscarPersonaPorTelefono(
$request->get("telefono")
);
if ($persona) {
return ApiPersonaController::extraerHorariosPorUnidadAcademica(
$persona,
$request->get("unidad_academica"),
$request->get("funcion"),
$request->get("dia"),
$request->get("tipo_horario")
);
}
}
return response()->json(
["error" => trans("persona.NO_ENCONTRADA")],
HttpStatus::NOT_FOUND
);
} catch (\Exception $e) {
Log::error(trans("persona.LOG_HORARIOS") . $e->getMessage());
return response()->json(
["error" => trans("persona.ERROR")],
HttpStatus::INTERNAL_SERVER_ERROR
);
}
}
/**
* Funcion de ruta, obtiene la dirección de una persona según el DNI o el número de teléfono.
*
* @param \Illuminate\Http\Request $request La solicitud HTTP que contiene los parámetros de búsqueda:
* - 'dni' o 'telefono' para identificar a la persona.
* @return \Illuminate\Http\JsonResponse La respuesta JSON con los datos de la persona encontrada, o un mensaje de error si no se encuentra.
*/
public function getDireccion(Request $request)
{
/**
* Obtiene la direccion de una persona según el DNI o el número de teléfono.
*
* @param \Illuminate\Http\Request $request La solicitud HTTP que contiene los parámetros de búsqueda.
* @return \Illuminate\Http\JsonResponse La respuesta JSON con los datos de la persona encontrada, o un mensaje de error si no se encuentra.
*/
if (!$request->has("dni") && !$request->has("telefono")) {
return response()->json(
["error" => trans("persona.DEBE_INGRESAR_DNI_O_TELEFONO")],
HttpStatus::BAD_REQUEST
);
}
try {
if ($request->has("dni")) {
$persona = UaderMapuchePersona::buscarPersonaPorDni(
$request->get("dni")
);
if ($persona) {
return ApiPersonaController::extraerDireccion($persona);
}
}
if ($request->has("telefono")) {
$persona = UaderMapuchePersona::BuscarPersonaPorTelefono(
$request->get("telefono")
);
if ($persona) {
return ApiPersonaController::extraerDireccion($persona);
}
}
return response()->json(
["error" => trans("persona.NO_ENCONTRADA")],
HttpStatus::NOT_FOUND
);
} catch (\Exception $e) {
Log::error(trans("persona.LOG_DATOS") . $e->getMessage());
return response()->json(
["error" => trans("persona.ERROR")],
HttpStatus::INTERNAL_SERVER_ERROR
);
}
}
/**
* Funcion de ruta que obtiene las funciones de una persona en una determinada unidad academica
* según el DNI o el número de teléfono.
*
* @param \Illuminate\Http\Request $request La solicitud HTTP que contiene los parámetros de búsqueda.
* @return \Illuminate\Http\JsonResponse La respuesta JSON con los datos de la persona encontrada, o un mensaje de error si no se encuentra.
*/
public function getFuncionesPorUnidadAcademica(Request $request)
{
if (!$request->has("unidad_academica")) {
return response()->json(
["error" => trans("persona.DEBE_INGRESAR_UNIDAD_ACADEMICA")],
HttpStatus::BAD_REQUEST
);
}
if (!$request->has("dni") && !$request->has("telefono")) {
return response()->json(
["error" => trans("persona.DEBE_INGRESAR_DNI_O_TELEFONO")],
HttpStatus::BAD_REQUEST
);
}
try {
if ($request->has("dni")) {
$persona = UaderMapuchePersona::buscarPersonaPorDni(
$request->get("dni")
);
if ($persona) {
return ApiPersonaController::extraerFuncionesPorUnidadAcademica(
$persona,
$request->get("unidad_academica")
);
}
}
if ($request->has("telefono")) {
$persona = UaderMapuchePersona::BuscarPersonaPorTelefono(
$request->get("telefono")
);
if ($persona) {
return ApiPersonaController::extraerFuncionesPorUnidadAcademica(
$persona,
$request->get("unidad_academica")
);
}
}
return response()->json(
["error" => trans("persona.NO_ENCONTRADA")],
HttpStatus::NOT_FOUND
);
} catch (\Exception $e) {
Log::error(trans("persona.LOG_DATOS") . $e->getMessage());
return response()->json(
["error" => trans("persona.ERROR")],
HttpStatus::INTERNAL_SERVER_ERROR
);
}
}
/**
* Funcion de ruta que obtiene las funciones de una persona en una determinada sede
* según el DNI o el número de teléfono.
*
* @param \Illuminate\Http\Request $request La solicitud HTTP que contiene los parámetros de búsqueda.
* @return \Illuminate\Http\JsonResponse La respuesta JSON con los datos de la persona encontrada, o un mensaje de error si no se encuentra.
*/
public function getFuncionesPorSede(Request $request)
{
if (!$request->has("sede")) {
return response()->json(
["error" => trans("persona.DEBE_INGRESAR_SEDE")],
HttpStatus::BAD_REQUEST
);
}
if (!$request->has("dni") && !$request->has("telefono")) {
return response()->json(
["error" => trans("persona.DEBE_INGRESAR_DNI_O_TELEFONO")],
HttpStatus::BAD_REQUEST
);
}
try {
if ($request->has("dni")) {
$persona = UaderMapuchePersona::buscarPersonaPorDni(
$request->get("dni")
);
if ($persona) {
return ApiPersonaController::extraerFuncionesPorSede(
$persona,
$request->get("sede")
);
}
}
if ($request->has("telefono")) {
$persona = UaderMapuchePersona::BuscarPersonaPorTelefono(
$request->get("telefono")
);
if ($persona) {
return ApiPersonaController::extraerFuncionesPorSede(
$persona,
$request->get("sede")
);
}
}
return response()->json(
["error" => trans("persona.NO_ENCONTRADA")],
HttpStatus::NOT_FOUND
);
} catch (\Exception $e) {
Log::error(trans("persona.LOG_DATOS") . $e->getMessage());
return response()->json(
["error" => trans("persona.ERROR")],
HttpStatus::INTERNAL_SERVER_ERROR
);
}
}
/**
* Obtiene las unidades académicas asociadas a una persona.
*
* Este método verifica si se ha proporcionado un DNI o un teléfono en la solicitud.
* Si ninguno de los dos está presente, se devuelve un error de solicitud incorrecta.
* Si se proporciona un DNI, se llama al método `getUnidadesAcademicasPor` con el tipo 'dni'.
* Si se proporciona un teléfono, se llama a `getUnidadesAcademicasPor` con el tipo 'telefono'.
*
* @param Request $request La solicitud que contiene los parámetros de búsqueda (dni o teléfono).
* @return JsonResponse La respuesta en formato JSON con las unidades académicas o un mensaje de error.
*/
public static function getUnidadesAcademicas(Request $request)
{
if (!$request->has("dni") && !$request->has("telefono")) {
return response()->json(
["error" => __("persona.DEBE_INGRESAR_DNI_O_TELEFONO")],
HttpStatus::BAD_REQUEST
);
}
if ($request->has("dni")) {
return self::getUnidadesAcademicasPor("dni", $request->get("dni"));
}
if ($request->has("telefono")) {
return self::getUnidadesAcademicasPor(
"telefono",
$request->get("telefono")
);
}
}
/**
* Obtiene las unidades académicas de una persona según el tipo de búsqueda.
*
* Este método realiza la búsqueda de una persona utilizando el DNI o el teléfono, dependiendo
* del tipo especificado. Si la persona se encuentra, se devuelve su información sobre unidades
* académicas. Si no se encuentra o si el tipo de búsqueda no es válido, se devuelve un error correspondiente.
*
* @param string $tipo El tipo de búsqueda, que puede ser 'dni' o 'telefono'.
* @param string $valor El valor correspondiente al tipo de búsqueda (DNI o número de teléfono).
* @return JsonResponse La respuesta en formato JSON con las unidades académicas o un mensaje de error.
* @throws InvalidArgumentException Si el tipo de búsqueda no es válido.
*/
private static function getUnidadesAcademicasPor(
string $tipo,
string $valor
) {
try {
if ($tipo === "dni") {
$persona = UaderMapuchePersona::buscarPersonaPorDni($valor);
} elseif ($tipo === "telefono") {
$persona = UaderMapuchePersona::buscarPersonaPorTelefono(
$valor
);
} else {
throw new InvalidArgumentException(
"Tipo de búsqueda no válido. Debe ser 'dni' o 'telefono'."
);
}
if ($persona) {
return response()->json(
$persona->getUnidadesAcademicas(),
HttpStatus::OK
);
}
return response()->json(
["error" => __("persona.NO_ENCONTRADA")],
HttpStatus::NOT_FOUND
);
} catch (NotFoundHttpException $e) {
return response()->json(
["error" => trans($e->getMessage())],
HttpStatus::NOT_FOUND
);
} catch (HttpException $e) {
return response()->json(
["error" => trans("persona.ERROR")],
$e->getStatusCode()
);
} catch (InvalidArgumentException $e) {
return response()->json(
["error" => trans("persona.ERROR")],
HttpStatus::INTERNAL_SERVER_ERROR
);
} catch (Exception $e) {
return response()->json(
["error" => trans("persona.ERROR")],
HttpStatus::INTERNAL_SERVER_ERROR
);
}
}
/**
* Obtiene las sedes asociadas a una persona.
*
* Este método verifica si se ha proporcionado un DNI o un teléfono en la solicitud.
* Si ninguno de los dos está presente, se devuelve un error de solicitud incorrecta.
* Si se proporciona un DNI, se llama al método `getSedesPor` con el tipo 'dni'.
* Si se proporciona un teléfono, se llama a `getSedesPor` con el tipo 'telefono'.
*
* @param Request $request La solicitud que contiene los parámetros de búsqueda (dni o teléfono).
* @return JsonResponse La respuesta en formato JSON con las sedes o un mensaje de error.
*/
public static function getSedesPorDia(Request $request)
{
if (!$request->has("dia")) {
return response()->json(
["error" => __("persona.DEBE_INGRESAR_DIA")],
HttpStatus::BAD_REQUEST
);
}
if (!$request->has("dni") && !$request->has("telefono")) {
return response()->json(
["error" => __("persona.DEBE_INGRESAR_DNI_O_TELEFONO")],
HttpStatus::BAD_REQUEST
);
}
if ($request->has("dni")) {
return self::getSedesPorDiaPor("dni", $request->get("dni"), $request->has("dia"));
}
if ($request->has("telefono")) {
return self::getSedesPorDiaPor("telefono", $request->get("telefono"), $request->has("dia"));
}
}
/**
* Obtiene las sedes asociadas a una persona.
*
* Este método verifica si se ha proporcionado un DNI o un teléfono en la solicitud.
* Si ninguno de los dos está presente, se devuelve un error de solicitud incorrecta.
* Si se proporciona un DNI, se llama al método `getSedesPor` con el tipo 'dni'.
* Si se proporciona un teléfono, se llama a `getSedesPor` con el tipo 'telefono'.
*
* @param Request $request La solicitud que contiene los parámetros de búsqueda (dni o teléfono).
* @return JsonResponse La respuesta en formato JSON con las sedes o un mensaje de error.
*/
public static function getSedes(Request $request)
{
if (!$request->has("dni") && !$request->has("telefono")) {
return response()->json(
["error" => __("persona.DEBE_INGRESAR_DNI_O_TELEFONO")],
HttpStatus::BAD_REQUEST
);
}
if ($request->has("dni")) {
return self::getSedesPor("dni", $request->get("dni"), $request->has("dia"));
}
if ($request->has("telefono")) {
return self::getSedesPor("telefono", $request->get("telefono"), $request->has("dia"));
}
}
/**
* Obtiene las sedes en las que trabaja hoy una persona según el tipo de búsqueda.
*
* Este método realiza la búsqueda de una persona utilizando el DNI o el teléfono, dependiendo
* del tipo especificado. Si la persona se encuentra, se devuelve su codigos de sede donde trabaja.
* Si no se encuentra o si el tipo de búsqueda no es válido, se devuelve un error correspondiente.
*
* @param string $tipo El tipo de búsqueda, que puede ser 'dni' o 'telefono'.
* @param string $valor El valor correspondiente al tipo de búsqueda (DNI o número de teléfono).
* @return JsonResponse La respuesta en formato JSON con las sedes o un mensaje de error.
* @throws InvalidArgumentException Si el tipo de búsqueda no es válido.
*/
private static function getSedesPor(string $tipo, string $valor)
{
try {
if ($tipo === "dni") {
$persona = UaderMapuchePersona::buscarPersonaPorDni($valor);
} elseif ($tipo === "telefono") {
$persona = UaderMapuchePersona::buscarPersonaPorTelefono(
$valor
);
} else {
throw new InvalidArgumentException(
"Tipo de búsqueda no válido. Debe ser 'dni' o 'telefono'."
);
}
if ($persona) {
return response()->json($persona->getSedes(), HttpStatus::OK);
}
return response()->json(
["error" => __("persona.NO_ENCONTRADA")],
HttpStatus::NOT_FOUND
);
} catch (NotFoundHttpException $e) {
return response()->json(
["error" => trans($e->getMessage())],
HttpStatus::NOT_FOUND
);
} catch (HttpException $e) {
return response()->json(
["error" => trans("persona.ERROR")],
$e->getStatusCode()
);
} catch (InvalidArgumentException $e) {
return response()->json(
["error" => trans("persona.ERROR")],
HttpStatus::INTERNAL_SERVER_ERROR
);
} catch (Exception $e) {
return response()->json(
["error" => trans("persona.ERROR")],
HttpStatus::INTERNAL_SERVER_ERROR
);
}
}
/**
* Obtiene las sedes en las que trabaja hoy una persona según el tipo de búsqueda.
*
* Este método realiza la búsqueda de una persona utilizando el DNI o el teléfono, dependiendo
* del tipo especificado. Si la persona se encuentra, se devuelve su codigos de sede donde trabaja.
* Si no se encuentra o si el tipo de búsqueda no es válido, se devuelve un error correspondiente.
*
* @param string $tipo El tipo de búsqueda, que puede ser 'dni' o 'telefono'.
* @param string $valor El valor correspondiente al tipo de búsqueda (DNI o número de teléfono).
* @return JsonResponse La respuesta en formato JSON con las sedes o un mensaje de error.
* @throws InvalidArgumentException Si el tipo de búsqueda no es válido.
*/
private static function getSedesPorDiaPor(string $tipo, string $valor, $dia)
{
try {
if ($tipo === "dni") {
$persona = UaderMapuchePersona::buscarPersonaPorDni($valor);
} elseif ($tipo === "telefono") {
$persona = UaderMapuchePersona::buscarPersonaPorTelefono(
$valor
);
} else {
throw new InvalidArgumentException(
"Tipo de búsqueda no válido. Debe ser 'dni' o 'telefono'."
);
}
if ($persona) {
return response()->json($persona->getSedesPorDia($dia), HttpStatus::OK);
}
return response()->json(
["error" => __("persona.NO_ENCONTRADA")],
HttpStatus::NOT_FOUND
);
} catch (NotFoundHttpException $e) {
return response()->json(
["error" => trans($e->getMessage())],
HttpStatus::NOT_FOUND
);
} catch (HttpException $e) {
return response()->json(
["error" => trans("persona.ERROR")],
$e->getStatusCode()
);
} catch (InvalidArgumentException $e) {
return response()->json(
["error" => trans("persona.ERROR")],
HttpStatus::INTERNAL_SERVER_ERROR
);
} catch (Exception $e) {
return response()->json(
["error" => trans("persona.ERROR")],
HttpStatus::INTERNAL_SERVER_ERROR
);
}
}
// SUBRUTAS INVOCADAS POR LAS RUTAS:
/**
* Devuelve en formato JSON los horarios asignados a una persona en una sede específica, filtrados por función, día y tipo de horario.
*
* @param \App\Models\Persona $persona El objeto de la persona cuya declaración jurada se utiliza para extraer los horarios.
* @param string $sede El código de la sede para filtrar las funciones.
* @param int $funcion El ID de la función para filtrar los horarios.
* @param int $dia El día de la semana para filtrar los horarios.
* @param string $tipoHorario El tipo de horario para filtrar los horarios.
* @return \Illuminate\Http\JsonResponse Una respuesta JSON que contiene la información de la persona, la función y los horarios correspondientes a la sede especificada.
*/
public function extraerHorariosPorSede(
$persona,
$sede,
$funcion,
$dia,
$tipoHorario
) {
$declaracion_jurada = $persona->declaracion_jurada;
if (!$declaracion_jurada) {
return response()->json(
["error" => trans("persona.DECLARACION_JURADA_NO_ENCONTRADA")],
HttpStatus::NOT_FOUND
);
}
$cargos = $declaracion_jurada
->CargosGrupo()
->where("estado", "A")
->get();
if (empty($cargos)) {
return response()->json(
["error" => trans("persona.NO_TIENE_DESIGNACIONES")],
HttpStatus::NOT_FOUND
);
}
$horarios = [];
$aux_horario = null;
$unidadAcademica = null;
foreach ($cargos as $cargo) {
if ($unidadAcademica == null) {
$unidadAcademica = $cargo->Sede->ua_guarani;
}
if (
$cargo->id_funcion == $funcion &&
$cargo->sede == $sede
) {
// Si vino
foreach ($cargo->GrupoHorario as $grupo_horario) {
foreach ($grupo_horario->Horarios as $horario) {
if (
$horario->dia_semanal == $dia &&
$horario->tipo_horario == $tipoHorario
) {
$aux_horario = [
"tipo_horario" => $horario->tipo_horario,
"hora_entra" => $horario->hora_entra,
"hora_sale" => $horario->hora_sale,
];
if (!in_array($aux_horario, $horarios)) {
$horarios[] = [
"tipo_horario" => $horario->tipo_horario,
"hora_entra" => $horario->hora_entra,
"hora_sale" => $horario->hora_sale,
];
}
}
}
}
}
}
if (empty($horarios)) {
return response()->json(
["error" => trans("persona.SIN_HORARIOS")],
HttpStatus::NOT_FOUND
);
}
// Ordenar el arreglo de horarios usando la función de comparación
usort($horarios, [ApiPersonaController::class, "compararHorarios"]);
$datos = [
"id" => $declaracion_jurada->id_persona,
"nombre" =>
ucwords(strtolower(trim($persona->desc_nombr))) .
" " .
ucwords(strtolower(trim($persona->desc_appat))),
"funcion" => [
"tipo" => $funcion,
"unidad_academica" => $unidadAcademica,
"sede" => $sede,
],
"horarios" => $horarios,
];
return response()->json($datos, HttpStatus::OK);
}
/**
* Devuelve en formato JSON los horarios asignados a una persona en una unidad académica específica, filtrados por función, día y tipo de horario.
*
* @param \App\Models\Persona $persona El objeto de la persona cuya declaración jurada se utiliza para extraer los horarios.
* @param string $unidadAcademica El código de la unidad académica para filtrar las funciones.
* @param int $funcion El ID de la función para filtrar los horarios.
* @param int $dia El día de la semana para filtrar los horarios.
* @param string $tipoHorario El tipo de horario para filtrar los horarios.
* @return \Illuminate\Http\JsonResponse Una respuesta JSON que contiene la información de la persona, la función y los horarios correspondientes a la unidad académica especificada.
*/
public function extraerHorariosPorUnidadAcademica(
$persona,
$unidadAcademica,
$funcion,
$dia,
$tipoHorario
) {
$declaracion_jurada = $persona->declaracion_jurada;
if (!$declaracion_jurada) {
return response()->json(
["error" => trans("persona.DECLARACION_JURADA_NO_ENCONTRADA")],
HttpStatus::NOT_FOUND
);
}
$cargos = $declaracion_jurada
->CargosGrupo()
->where("estado", "A")
->get();
if (empty($cargos)) {
return response()->json(
["error" => trans("persona.NO_TIENE_DESIGNACIONES")],
HttpStatus::NOT_FOUND
);
}
$horarios = [];
$aux_horario = null;
$sede = null;
foreach ($cargos as $cargo) {
if ($sede == null) {
$sede = $cargo->Sede->uacad;
}
if (
$cargo->id_funcion == $funcion &&
$cargo->Sede->ua_guarani == $unidadAcademica
) {
// Si vino
foreach ($cargo->GrupoHorario as $grupo_horario) {
foreach ($grupo_horario->Horarios as $horario) {
if (
$horario->dia_semanal == $dia &&
$horario->tipo_horario == $tipoHorario
) {
$aux_horario = [
"tipo_horario" => $horario->tipo_horario,
"hora_entra" => $horario->hora_entra,
"hora_sale" => $horario->hora_sale,
];
if (!in_array($aux_horario, $horarios)) {
$horarios[] = [
"tipo_horario" => $horario->tipo_horario,
"hora_entra" => $horario->hora_entra,
"hora_sale" => $horario->hora_sale,
];
}
}
}
}
}
}
if (empty($horarios)) {
return response()->json(
["error" => trans("persona.SIN_HORARIOS")],
HttpStatus::NOT_FOUND
);
}
// Ordenar el arreglo de horarios usando la función de comparación
usort($horarios, [ApiPersonaController::class, "compararHorarios"]);
$datos = [
"id" => $declaracion_jurada->id_persona,
"nombre" =>
ucwords(strtolower(trim($persona->desc_nombr))) .
" " .
ucwords(strtolower(trim($persona->desc_appat))),
"funcion" => [
"tipo" => $funcion,
"unidad_academica" => $unidadAcademica,
"sede" => $sede,
],
"horarios" => $horarios,
];
return response()->json($datos, HttpStatus::OK);
}
/**
* Extrae los datos de la declaracion jurada de una persona y los retorna como JSON.
*
* @param mixed $persona La instancia de la persona de la cual se extraerán los datos.
* @return \Illuminate\Http\JsonResponse La respuesta JSON con los datos extraídos de la persona.
*/
public static function extraerDatosJson($persona)
{
$declaracion_jurada = $persona->declaracion_jurada;
if (!$declaracion_jurada) {
return response()->json(
["error" => trans("persona.DECLARACION_JURADA_NO_ENCONTRADA")],
HttpStatus::NOT_FOUND
);
}
$datos = [
"id" => $declaracion_jurada->id_persona ?? null, // id persona de la tabla 'uader_persona'
"dni" => $persona->nro_docum ?? null,
"apellido" =>
ucwords(strtolower(trim($persona->desc_appat))) ?? null,
"nombres" =>
ucwords(strtolower(trim($persona->desc_nombr))) ?? null,
"telefono" =>
"549" .
preg_replace(
"([^0-9])",
"",
trim($persona->telefono_celular)
) ??
null,
"email" => strtolower(trim($persona->correo_electronico)) ?? null,
];
return response()->json($datos, HttpStatus::OK);
}
/**
* Extrae los datos de la direccion de una persona para ser devueltos como respuesta JSON.
*
* @param App\Models\UaderMapuchePersona $persona La instancia de la persona de la cual se extraerán los datos.
* @return \Illuminate\Http\JsonResponse La respuesta JSON con los datos extraídos de la persona.
**/
public static function extraerDireccion($persona)
{
$declaracion_jurada = $persona->declaracion_jurada;
if (!$declaracion_jurada) {
return response()->json(
["error" => trans("persona.DECLARACION_JURADA_NO_ENCONTRADA")],
HttpStatus::NOT_FOUND
);
}
$datos = [
"id" => $declaracion_jurada->id_persona,
"nombre" =>
ucwords(strtolower(trim($persona->desc_nombr))) .
" " .
ucwords(strtolower(trim($persona->desc_appat))) ??
null,
"domicilio" => [
"calle" => strtolower(trim($persona->calle)) ?? null,
"numero" => strtolower(trim($persona->numero)) ?? null,
"piso" => strtolower(trim($persona->piso)) ?? null,
"dpto_oficina" =>
strtolower(trim($persona->dpto_oficina)) ?? null,
"calles_entre" =>
strtolower(trim($persona->calles_entre)) ?? null,
"domicilio_referencia" =>
strtolower(trim($persona->domicilio_referencia)) ?? null,
"zona_paraje" =>
strtolower(trim($persona->zona_paraje)) ?? null,
"casa_nro" => strtolower(trim($persona->casa_nro)) ?? null,
"casa_manzana" =>
strtolower(trim($persona->casa_manzana)) ?? null,
"localidad" =>
ucfirst(
strtolower(trim($persona->Localidad->desc_localidad))
) ?? null,
"provincia" =>
trim($persona->Provincia->descripcion_pcia) ?? null,
],
];
return response()->json($datos, HttpStatus::OK);
}
/**
* Extrae las funciones asignadas a una persona en una unidad académica específica
* y las devuelve en un formato JSON.
*
* @param \App\Models\Persona $persona El objeto de la persona cuya declaración jurada se utiliza para extraer las funciones.
* @param string $unidadAcademica El código de la unidad académica para filtrar las funciones.
* @return \Illuminate\Http\JsonResponse Una respuesta JSON que contiene la información de la persona y las funciones correspondientes a la unidad académica especificada.
*/
public static function extraerFuncionesPorUnidadAcademica(
$persona,
$unidadAcademica
) {
$declaracion_jurada = $persona->declaracion_jurada;
if (!$declaracion_jurada) {
return response()->json(
["error" => trans("persona.DECLARACION_JURADA_NO_ENCONTRADA")],
HttpStatus::NOT_FOUND
);
}
$cargos = $declaracion_jurada
->CargosGrupo()
->where("estado", "A")
->get();
if (empty($cargos)) {
return response()->json(
["error" => trans("persona.NO_TIENE_DESIGNACIONES")],
HttpStatus::NOT_FOUND
);
}
$cargosUnidadAcademica = [];
foreach ($cargos as $cargo) {
if ($cargo->Sede->ua_guarani == $unidadAcademica) {
$cargosUnidadAcademica[] = $cargo;
}
}
if (empty($cargosUnidadAcademica)) {
return response()->json(
["error" => trans("persona.NO_TIENE_DESIGNACIONES_UA")],
HttpStatus::NOT_FOUND
);
}
$funciones = [];
$funcion = null;
foreach ($cargosUnidadAcademica as $cargoUnidadAcademica) {
$funcion = [
"tipo" => $cargoUnidadAcademica->id_funcion,
"unidad_academica" => $unidadAcademica,
"sede" => $cargoUnidadAcademica->Sede->uacad,
];
if (!in_array($funcion, $funciones)) {
// para que no se repitan las funciones por cargo
$funciones[] = $funcion;
}
}
$datos = [
"id" => $declaracion_jurada->id_persona,
"nombre" =>
ucwords(strtolower(trim($persona->desc_nombr))) .
" " .
ucwords(strtolower(trim($persona->desc_appat))),
"funciones" => $funciones,
];
return response()->json($datos, HttpStatus::OK);
}
/**
* Extrae las funciones asignadas a una persona en una sede específica
* y las devuelve en un formato JSON.
*
* @param \App\Models\Persona $persona El objeto de la persona cuya declaración jurada se utiliza para extraer las funciones.
* @param string $sede El código de la sede para filtrar las funciones.
* @return \Illuminate\Http\JsonResponse Una respuesta JSON que contiene la información de la persona y las funciones correspondientes a la sede especificada.
*/
public static function extraerFuncionesPorSede($persona, $sede)
{
$declaracion_jurada = $persona->declaracion_jurada;
if (!$declaracion_jurada) {
return response()->json(
["error" => trans("persona.DECLARACION_JURADA_NO_ENCONTRADA")],
HttpStatus::NOT_FOUND
);
}
$cargos = $declaracion_jurada
->CargosGrupo()
->where("estado", "A")
->get();
if (empty($cargos)) {
return response()->json(
["error" => trans("persona.NO_TIENE_DESIGNACIONES")],
HttpStatus::NOT_FOUND
);
}
$cargosSedes = [];
$unidadAcademica = null;
foreach ($cargos as $cargo) {
if ($cargo->Sede->uacad == $sede) {
$cargosSedes[] = $cargo;
if ($unidadAcademica == null) {
$unidadAcademica = $cargo->Sede->ua_guarani;
}
}
}
if (empty($cargosSedes)) {
return response()->json(
["error" => trans("persona.NO_TIENE_DESIGNACIONES_SEDE")],
HttpStatus::NOT_FOUND
);
}
$funciones = [];
$funcion = null;
foreach ($cargosSedes as $cargoSede) {
$funcion = [
"tipo" => $cargoSede->id_funcion,
"unidad_academica" => $unidadAcademica,
"sede" => $sede,
];
if (!in_array($funcion, $funciones)) {
// para que no se repitan las funciones por tarea o designacion
$funciones[] = $funcion;
}
}
$datos = [
"id" => $declaracion_jurada->id_persona,
"nombre" =>
ucwords(strtolower(trim($persona->desc_nombr))) .
" " .
ucwords(strtolower(trim($persona->desc_appat))),
"funciones" => $funciones,
];
return response()->json($datos, HttpStatus::OK);
}
// FUNCIONES STANDALONE:
/**
* Compara dos horarios por su hora de entrada.
*
* Utilizada para ordenar un arreglo de horarios.
*
* @param array $a El primer horario a comparar.
* @param array $b El segundo horario a comparar.
* @return int Un valor negativo si $a es menor que $b, cero si son iguales, o un valor positivo si $a es mayor que $b.
*/
public static function compararHorarios($a, $b)
{
return strcmp($a["hora_entra"], $b["hora_entra"]);
}
}