From 127855759dc4568ea48329369a8289704455e063 Mon Sep 17 00:00:00 2001 From: jirho Date: Sat, 7 Sep 2024 23:18:15 -0300 Subject: [PATCH] Se agregand rutas para obtener funcione y horarios por sede y no por ua, ademas se agregan docstring a todas las funcione y se actualizan las rutas. --- app/Http/Controllers/ApiPersonaController.php | 390 ++++++++++++++++-- routes/api.php | 6 +- 2 files changed, 366 insertions(+), 30 deletions(-) diff --git a/app/Http/Controllers/ApiPersonaController.php b/app/Http/Controllers/ApiPersonaController.php index 7bc9041..1140532 100644 --- a/app/Http/Controllers/ApiPersonaController.php +++ b/app/Http/Controllers/ApiPersonaController.php @@ -54,7 +54,97 @@ class ApiPersonaController extends Controller } } - public function getHorarios(Request $request){ + /** + * 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::BAD_REQUEST); + + + } 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); @@ -84,7 +174,7 @@ class ApiPersonaController extends Controller if($persona){ - return ApiPersonaController::extraerHorarios( + return ApiPersonaController::extraerHorariosPorUnidadAcademica( $persona, $request->get('unidad_academica'), $request->get('funcion'), @@ -100,7 +190,7 @@ class ApiPersonaController extends Controller if($persona){ - return ApiPersonaController::extraerHorarios( + return ApiPersonaController::extraerHorariosPorUnidadAcademica( $persona, $request->get('unidad_academica'), $request->get('funcion'), @@ -120,6 +210,14 @@ class ApiPersonaController extends Controller } } + /** + * 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) { /** @@ -163,13 +261,14 @@ class ApiPersonaController extends Controller } } - public function getFunciones(Request $request){ - /** - * Obtiene las funciones 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. - */ + /** + * 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')){ @@ -188,7 +287,7 @@ class ApiPersonaController extends Controller $persona = UaderMapuchePersona::buscarPersonaPorDni($request->get('dni')); if ($persona) { - return ApiPersonaController::extraerFunciones($persona, $request->get('unidad_academica')); + return ApiPersonaController::extraerFuncionesPorUnidadAcademica($persona, $request->get('unidad_academica')); } } @@ -197,7 +296,7 @@ class ApiPersonaController extends Controller $persona = UaderMapuchePersona::BuscarPersonaPorTelefono($request->get('telefono')); if ($persona) { - return ApiPersonaController::extraerFunciones($persona, $request->get('unidad_academica')); + return ApiPersonaController::extraerFuncionesPorUnidadAcademica($persona, $request->get('unidad_academica')); } } @@ -210,34 +309,180 @@ class ApiPersonaController extends Controller } } - # SUB RUTAS ADICIONALES + /** + * 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){ - public function extraerHorarios($persona, $unidad_academica, $funcion, $dia, $tipo_horario){ + if(!$request->has('sede')){ - $declaracion_jurada = $persona->declaracion_jurada; + 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); + } + } + + # 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); } $designaciones = $declaracion_jurada->CargosGrupo()->where('estado', 'A')->get(); + if(empty($designaciones)){ + return response()->json(['error' => trans('persona.NO_TIENE_DESIGNACIONES')], HttpStatus::NOT_FOUND); + } + + $horarios = array(); + $aux_horario = null; + $unidadAcademica = null; + + foreach ($designaciones as $designacion) { + + if($unidadAcademica == null){ + $unidadAcademica = $designacion->Sede->ua_guarani; + } + + if($designacion->id_funcion == $funcion && $designacion->Sede->uacad == $sede){ + + # Si vino + + foreach ($designacion->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 = array( + '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); + } + $designaciones = $declaracion_jurada->CargosGrupo()->where('estado', 'A')->get(); if(empty($designaciones)){ return response()->json(['error' => trans('persona.NO_TIENE_DESIGNACIONES')], HttpStatus::NOT_FOUND); } $horarios = array(); $aux_horario = null; - + $sede = null; + foreach ($designaciones as $designacion) { - if($designacion->id_funcion == $funcion && $designacion->Sede->ua_guarani == $unidad_academica){ + if($sede == null){ + $sede = $designacion->Sede->uacad; + } + + if($designacion->id_funcion == $funcion && $designacion->Sede->ua_guarani == $unidadAcademica){ + + # Si vino foreach ($designacion->GrupoHorario as $grupo_horario) { foreach ($grupo_horario->Horarios as $horario) { - if ($horario->dia_semanal == $dia && $horario->tipo_horario == $tipo_horario){ + if ($horario->dia_semanal == $dia && $horario->tipo_horario == $tipoHorario){ $aux_horario = [ 'tipo_horario' => $horario->tipo_horario, @@ -269,7 +514,11 @@ class ApiPersonaController extends Controller $datos = array( 'id' => $declaracion_jurada->id_persona, 'nombre' => ucwords(strtolower(trim($persona->desc_nombr))) . ' ' . ucwords(strtolower(trim($persona->desc_appat))), - 'funcion' => ['tipo' => $funcion, 'unidad_academica' => $unidad_academica], + 'funcion' => [ + 'tipo' => $funcion, + 'unidad_academica' => $unidadAcademica, + 'sede' => $sede, + ], 'horarios' => $horarios, ); @@ -338,35 +587,120 @@ class ApiPersonaController extends Controller return response()->json($datos, HttpStatus::OK); } - public static function extraerFunciones($persona, $unidad_academica){ + /** + * 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); } $designaciones = $declaracion_jurada->CargosGrupo()->where('estado', 'A')->get(); - if(empty($designaciones)){ return response()->json(['error' => trans('persona.NO_TIENE_DESIGNACIONES')], HttpStatus::NOT_FOUND); } + $designacionesUnidadAcademica = array(); + + foreach ($designaciones as $designacion) { + + if($designacion->Sede->ua_guarani == $unidadAcademica){ + + $designacionesUnidadAcademica[] = $designacion; + } + } + + if(empty($designacionesUnidadAcademica)){ + return response()->json(['error' => trans('persona.NO_TIENE_DESIGNACIONES_UA')], HttpStatus::NOT_FOUND); + } + $funciones = array(); $funcion = null; - - foreach ($designaciones as $designacion) { - if($designacion->Sede->ua_guarani == $unidad_academica){ + foreach ($designacionesUnidadAcademica as $designacionUA) { + + $funcion = [ + 'tipo' => $designacionUA->id_funcion, + 'unidad_academica' => $unidadAcademica, + 'sede' => $designacionUA->Sede->uacad + ]; + + if(!in_array($funcion, $funciones)){ # para que no se repitan las funciones por tarea o designacion + $funciones[] = $funcion; + } + } - $funcion = ['tipo' => $designacion->id_funcion, 'unidad_academica' => $unidad_academica]; + $datos = array( + '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); + } + + $designaciones = $declaracion_jurada->CargosGrupo()->where('estado', 'A')->get(); + if(empty($designaciones)){ + return response()->json(['error' => trans('persona.NO_TIENE_DESIGNACIONES')], HttpStatus::NOT_FOUND); + } + + $designacionesSede = array(); + $unidadAcademica = null; + + foreach ($designaciones as $designacion) { + + if($designacion->Sede->uacad == $sede){ - if(!in_array($funcion, $funciones)){ # para que no se repitan las funciones por tarea o designacion - $funciones[] = $funcion; + $designacionesSede[] = $designacion; + + if($unidadAcademica == null){ + $unidadAcademica = $designacion->Sede->ua_guarani; } } } + if(empty($designacionesSede)){ + return response()->json(['error' => trans('persona.NO_TIENE_DESIGNACIONES_SEDE')], HttpStatus::NOT_FOUND); + } + + $funciones = array(); + $funcion = null; + + foreach ($designacionesSede as $designacionSede) { + + $funcion = [ + 'tipo' => $designacionSede->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 = array( 'id' => $declaracion_jurada->id_persona, 'nombre' => ucwords(strtolower(trim($persona->desc_nombr))) . ' ' . ucwords(strtolower(trim($persona->desc_appat))), diff --git a/routes/api.php b/routes/api.php index 85483fa..0ebeddb 100644 --- a/routes/api.php +++ b/routes/api.php @@ -27,9 +27,11 @@ Route::get('/', [ApiController::class, 'bienvenida'])->name('api.bienvenida'); # Rutas de personas: Route::get('persona/datos', [ApiPersonaController::class, 'getDatos'])->name('persona.getDatos'); -Route::get('persona/horarios', [ApiPersonaController::class, 'getHorarios'])->name('persona.getHorarios'); +Route::get('persona/horarios/unidadacademica', [ApiPersonaController::class, 'getHorariosPorUnidadAcademica'])->name('persona.horarios.unidadacademica'); +Route::get('persona/horarios/sede', [ApiPersonaController::class, 'getHorariosPorSede'])->name('persona.horarios.sede'); Route::get('persona/direccion', [ApiPersonaController::class, 'getDireccion'])->name('persona.getDireccion'); -Route::get('persona/funciones', [ApiPersonaController::class, 'getFunciones'])->name('persona.funciones'); +Route::get('persona/funciones/sede', [ApiPersonaController::class, 'getFuncionesPorSede'])->name('persona.funciones.sede'); +Route::get('persona/funciones/unidadacademica', [ApiPersonaController::class, 'getFuncionesPorUnidadAcademica'])->name('persona.funciones.unidadacademica'); # Rutas de familiares: Route::get('familiar/{dni}', [ApiFamilliaresController::class, 'buscar'])->name('familiar.buscar');