diff --git a/src/app/Http/Controllers/ApiPersonaController.php b/src/app/Http/Controllers/ApiPersonaController.php index a25d5a8..e0a24bb 100644 --- a/src/app/Http/Controllers/ApiPersonaController.php +++ b/src/app/Http/Controllers/ApiPersonaController.php @@ -531,6 +531,93 @@ class ApiPersonaController extends Controller } } + /** + * 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")); + } + + if ($request->has("telefono")) { + return self::getSedesPor("telefono", $request->get("telefono")); + } + } + + /** + * Obtiene las sedes 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 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 + ); + } + } + // SUBRUTAS INVOCADAS POR LAS RUTAS: /**