From 9df51ce5a03f23d061adc5f5c4f6a73c50e7e3e6 Mon Sep 17 00:00:00 2001 From: jirho Date: Mon, 2 Dec 2024 03:15:05 -0300 Subject: [PATCH] vuelvo a agregar la ruta para get sedes en general, no solo por dia, ahora estan ambas rutas --- .../Http/Controllers/ApiPersonaController.php | 94 ++++++++++++++++++- src/app/Models/UaderMapuchePersona.php | 54 +++++++++++ src/routes/api.php | 1 + 3 files changed, 145 insertions(+), 4 deletions(-) diff --git a/src/app/Http/Controllers/ApiPersonaController.php b/src/app/Http/Controllers/ApiPersonaController.php index 02d3aaa..d3af20f 100644 --- a/src/app/Http/Controllers/ApiPersonaController.php +++ b/src/app/Http/Controllers/ApiPersonaController.php @@ -542,9 +542,8 @@ class ApiPersonaController extends Controller * @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) + public static function getSedesPorDia(Request $request) { - if (!$request->has("dia")) { return response()->json( ["error" => __("persona.DEBE_INGRESAR_DIA")], @@ -559,6 +558,35 @@ class ApiPersonaController extends Controller ); } + 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")); } @@ -569,7 +597,65 @@ class ApiPersonaController extends Controller } /** - * Obtiene las sedes de una persona según el tipo de búsqueda. + * 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. @@ -580,7 +666,7 @@ class ApiPersonaController extends Controller * @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, $dia) + private static function getSedesPorDiaPor(string $tipo, string $valor, $dia) { try { if ($tipo === "dni") { diff --git a/src/app/Models/UaderMapuchePersona.php b/src/app/Models/UaderMapuchePersona.php index 39fbc14..ce2894c 100644 --- a/src/app/Models/UaderMapuchePersona.php +++ b/src/app/Models/UaderMapuchePersona.php @@ -180,6 +180,60 @@ class UaderMapuchePersona extends Model * @return array Un arreglo que contiene el ID de la persona, su nombre completo y las sedes activas. * @throws NotFoundHttpException Si no se encuentra la declaración jurada o si la persona no tiene designaciones. */ + public function getSedes() + { + $declaracionJurada = $this->declaracion_jurada; + if (!$declaracionJurada) { + throw new NotFoundHttpException( + __("persona.DECLARACION_JURADA_NO_ENCONTRADA") + ); + } + + $cargos = $declaracionJurada + ->CargosGrupo() + ->where("estado", "A") + ->get(); + if (empty($cargos)) { + throw new NotFoundHttpException( + __("persona.NO_TIENE_DESIGNACIONES") + ); + } + + // Agrego la sede + $sedes = []; + foreach ($cargos as $cargo) { + $codigoSede = trim($cargo->Sede->uacad); // Eliminar espacios en blanco + // Verificar que no exista ya en el arreglo + if (!in_array($codigoSede, $sedes)) { + $sedes[] = $codigoSede; + } + } + + return [ + "id" => $declaracionJurada->id_persona, + "nombre" => + ucwords(strtolower(trim($this->desc_nombr))) . + " " . + ucwords(strtolower(trim($this->desc_appat))), + "sedes activas" => $sedes, + ]; + } + + /** + * Obtiene los codigos de sedes asociadas a la declaración jurada de la persona + * filtrados por si trabaja en esa sede en el dia indicado por parametro. + * + * Este método verifica si la persona tiene una declaración jurada. Si no la tiene, + * se lanza una excepción indicando que no se encontró la declaración jurada. + * Luego, se obtienen los cargos activos de la declaración jurada. Si no hay cargos, + * se lanza una excepción indicando que la persona no tiene designaciones. + * Finalmente, se construye un arreglo con las sedes activas asociadas a los cargos, + * asegurando que no haya duplicados, y se devuelve un array con el ID de la persona, su nombre + * completo y las unidades académicas activas. + * + * @return $codigoDia codigo de dia para filtrar las sedes. + * @throws NotFoundHttpException Si no se encuentra la declaración jurada o si la persona no tiene designaciones. + */ public function getSedesPorDia($codigoDia) { $declaracionJurada = $this->declaracion_jurada; diff --git a/src/routes/api.php b/src/routes/api.php index bd8ee00..7d9a34a 100644 --- a/src/routes/api.php +++ b/src/routes/api.php @@ -50,6 +50,7 @@ Route::middleware("jwt.auth")->group(function () { ]); Route::get("persona/sede", [ApiPersonaController::class, "getSedes"]); + Route::get("persona/sedespordia", [ApiPersonaController::class, "getSedesPorDia"]); // Rutas de familiares: Route::get("familiar/{dni}", [