diff --git a/app/Http/Controllers/ApiPersonaController.php b/app/Http/Controllers/ApiPersonaController.php index 780b7b4..c3f2c38 100644 --- a/app/Http/Controllers/ApiPersonaController.php +++ b/app/Http/Controllers/ApiPersonaController.php @@ -11,133 +11,114 @@ use Illuminate\Support\Facades\Log; class ApiPersonaController extends Controller { - public function getDatos(Request $request) - { - if ($request->has('dni')) { - return ApiPersonaController::rutaGetDatosPorDni($request->get('dni')); - } - - if ($request->has('telefono')) { - return ApiPersonaController::rutaGetDatosPorTelefono($request->get('telefono')); - } - - return response()->json(['error' => trans('persona.DEBE_INGRESAR_DNI_O_TELEFONO')], HttpStatus::BAD_REQUEST); - } - - public static function rutaGetDatosPorDni($dni){ - - try{ + public function getDatos(Request $request){ - $persona = UaderMapuchePersona::buscarPersonaPorDni($dni); + /** + * Obtiene datos 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 ($persona) { + if(!$request->has('dni') && !$request->has('telefono')){ - return ApiPersonaController::extraerDatos($persona); - } - - return response()->json(['error' => trans('persona.NO_ENCONTRADA_POR_DNI')], HttpStatus::NOT_FOUND); - - } catch (\Exception $e) { - Log::error(trans('persona.LOG_POR_DNI') . $e->getMessage()); - return response()->json(['error' => trans('persona.ERROR_POR_DNI')], HttpStatus::INTERNAL_SERVER_ERROR); + return response()->json(['error' => trans('persona.DEBE_INGRESAR_DNI_O_TELEFONO')], HttpStatus::BAD_REQUEST); } - } - - public static function rutaGetDatosPorTelefono($telefono){ try{ - $persona = UaderMapuchePersona::BuscarPersonaPorTelefono($telefono); - if ($persona) { - return ApiPersonaController::extraerDatos($persona); - } + throw new \Exception("prueba"); - return response()->json(['error' => trans('persona.NO_ENCONTRADA_POR_TELEFONO')], HttpStatus::NOT_FOUND); + if ($request->has('dni')) { - } catch (\Exception $e) { - Log::error(trans('persona.LOG_POR_TELEFONO') . $e->getMessage()); - return response()->json(['error' => trans('persona.ERROR_POR_TELEFONO')], HttpStatus::INTERNAL_SERVER_ERROR); - } - } - - public static function extraerDatos($persona){ + $persona = UaderMapuchePersona::buscarPersonaPorDni($request->get('dni')); - $declaracion_jurada = $persona->declaracion_jurada; + if ($persona) { + return ApiPersonaController::extraerDatos($persona); + } + } + + if ($request->has('telefono')) { - if(!$declaracion_jurada){ + $persona = UaderMapuchePersona::BuscarPersonaPorTelefono($request->get('telefono')); + + if ($persona) { + return ApiPersonaController::extraerDatos($persona); + } + } - return response()->json(['error' => trans('persona.DECLARACION_JURADA_NO_ENCONTRADA')], HttpStatus::NOT_FOUND); - } + return response()->json(['error' => trans('persona.NO_ENCONTRADA')], HttpStatus::NOT_FOUND); - $datos = array( - '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, - ); + } catch (\Exception $e) { - return response()->json($datos, HttpStatus::OK); + Log::error(trans('persona.LOG_DATOS') . $e->getMessage()); + return response()->json(['error' => trans('persona.ERROR')], HttpStatus::INTERNAL_SERVER_ERROR); + } } - public function store(Request $request) - { - $input = $request->input(); - - $persona = UaderMapuchePersona::BuscarPersonaPorTelefono($input['cel']); - $dia = $input['dia']; - # lanzar error si es invalido o no vino - $tipo_horario = $input['tipo_horario']; - # lanzar error si es invalido o no vino + public function getHorarios(Request $request){ - if (!empty($persona)) { - - $funciones = array(); - - $declaracion_jurada = UaderDjPersona::find($persona->id_dj_persona); - $designaciones = $declaracion_jurada->CargosGrupo()->where('estado', 'A')->get(); - - foreach ($designaciones as $designacion) { + if(!$request->has('telefono') && !$request->has('dni')){ + return response()->json(['error' => trans('persona.DEBE_INGRESAR_DNI_O_TELEFONO')], HttpStatus::BAD_REQUEST); + } - $horarios = array(); - #dd( $designaciones); + if(!$request->has('unidad_academica')){ + return response()->json(['error' => trans('persona.DEBE_INGRESAR_UNIDAD_ACADEMICA')], HttpStatus::BAD_REQUEST); + } - foreach ($designacion->GrupoHorario as $grupo_horario) { + if(!$request->has('funcion')){ + return response()->json(['error' => trans('persona.DEBE_INGRESAR_FUNCION')], HttpStatus::BAD_REQUEST); + } - foreach ($grupo_horario->Horarios as $horario) { + if(!$request->has('dia')){ + return response()->json(['error' => trans('persona.DEBE_INGRESAR_DIA')], HttpStatus::BAD_REQUEST); + } - if ($horario->dia_semanal == $dia && $horario->tipo_horario == $tipo_horario){ # dia del horario es el mismo que el dia actual y que no sea horario de disposicion + if(!$request->has('tipo_horario')){ + return response()->json(['error' => trans('persona.DEBE_INGRESAR_TIPO_HORARIO')], HttpStatus::BAD_REQUEST); + } - $horarios[] = [ - 'tipo' => $horario->tipo_horario, - 'hora_entra' => $horario->hora_entra, - 'hora_sale' => $horario->hora_sale - ]; - } - } + try { + + if($request->has('dni')){ + + $persona = UaderMapuchePersona::buscarPersonaPorDni($request->get('dni')); + + if($persona){ + + return ApiPersonaController::extraerHorarios( + $persona, + $request->get('unidad_academica'), + $request->get('funcion'), + $request->get('dia'), + $request->get('tipo_horario') + ); } - - # si bien las designaciones son distintas los datos requeridos en esta ruta son pocos y solo necesitamos las designaciones (funciones) con datos diferentes - $nueva_funcion = ['funcion' => $designacion->id_funcion, 'ua' => intval($designacion->Sede->ua_guarani), 'horarios' => $horarios]; - if (!in_array($nueva_funcion, $funciones)) { - $funciones[] = $nueva_funcion; + } + + if($request->has('telefono')){ + + $persona = UaderMapuchePersona::BuscarPersonaPorTelefono($request->get('telefono')); + + if($persona){ + + return ApiPersonaController::extraerHorarios( + $persona, + $request->get('unidad_academica'), + $request->get('funcion'), + $request->get('dia'), + $request->get('tipo_horario') + ); } } + + return response()->json(['error' => trans('persona.NO_ENCONTRADA')], HttpStatus::BAD_REQUEST); - $datos = array( - 'id' => $declaracion_jurada->id_persona, - 'dni' => $persona->nro_docum, - 'apellido' => ucwords(strtolower(trim($persona->desc_appat))), - 'nombres' => ucwords(strtolower(trim($persona->desc_nombr))), - 'telefono' => '549' . preg_replace('([^0-9])', '', trim($persona->telefono_celular)), - 'email' => strtolower(trim($persona->correo_electronico)), - 'funciones' => $funciones, - ); - return response()->json($datos); - } else { - return response()->json(array(), 404); + } catch (\Exception $e) { + + Log::error(trans('persona.LOG_HORARIOS') . $e->getMessage()); + return response()->json(['error' => trans('persona.ERROR')], HttpStatus::INTERNAL_SERVER_ERROR); } } @@ -173,4 +154,103 @@ class ApiPersonaController extends Controller } } + # SUB RUTAS ADICIONALES + + public function extraerHorarios($persona, $unidad_academica, $funcion, $dia, $tipo_horario){ + + $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; + + foreach ($designaciones as $designacion) { + + if($designacion->id_funcion == $funcion && $designacion->Sede->ua_guarani == $unidad_academica){ + + foreach ($designacion->GrupoHorario as $grupo_horario) { + + foreach ($grupo_horario->Horarios as $horario) { + + if ($horario->dia_semanal == $dia && $horario->tipo_horario == $tipo_horario){ + + $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' => $unidad_academica], + 'horarios' => $horarios, + ); + + return response()->json($datos, HttpStatus::OK); + } + + public static function extraerDatos($persona){ + + /** + * Extrae los datos necesarios de una persona para ser devueltos como respuesta 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. + */ + + $declaracion_jurada = $persona->declaracion_jurada; + + if(!$declaracion_jurada){ + + return response()->json(['error' => trans('persona.DECLARACION_JURADA_NO_ENCONTRADA')], HttpStatus::NOT_FOUND); + } + + $datos = array( + '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); + } + + # FUNCION STANDALONE: + public static function compararHorarios($a, $b) { + return strcmp($a['hora_entra'], $b['hora_entra']); + } + } diff --git a/resources/lang/es/persona.php b/resources/lang/es/persona.php index a2e3038..0cedd8c 100644 --- a/resources/lang/es/persona.php +++ b/resources/lang/es/persona.php @@ -1,13 +1,20 @@ 'Persona no encontrada.', 'DECLARACION_JURADA_NO_ENCONTRADA' => 'Declaración jurada de la persona no encontrada.', - 'NO_ENCONTRADA_POR_DNI' => 'Persona no encontrada por DNI.', - 'NO_ENCONTRADA_POR_TELEFONO' => 'Persona no encontrada por teléfono.', + 'NO_ENCONTRADA' => 'Persona no encontrada con los datos proporcionados.', + 'DEBE_INGRESAR_DNI_O_TELEFONO' => 'Debe ingresar un dni o un telefono de la persona', - 'ERROR_POR_DNI' => 'Ha ocurrido un error mientras se buscaban los datos de la persona por dni.', - 'ERROR_POR_TELEFONO' => 'Ha ocurrido un error mientras se buscaban los datos de la persona por telefono.', - 'LOG_POR_TELEFONO' => 'Error al buscar persona por telefono: ', - 'LOG_POR_DNI' => 'Error al buscar persona por dni: ', + 'DEBE_INGRESAR_UNIDAD_ACADEMICA' => 'Debe ingresar la unidad academica.', + 'DEBE_INGRESAR_FUNCION' => 'Debe ingresar la funcion.', + 'DEBE_INGRESAR_DIA' => 'Debe ingresar el dia.', + 'DEBE_INGRESAR_TIPO_HORARIO' => 'Debe ingresar el tipo de horario.', + + 'NO_TIENE_DESIGNACIONES' => 'La persona no tiene designaciones activas.', + 'SIN_HORARIOS' => 'La persona no tiene horarios para los datos proporcionados', + + 'LOG_DATOS' => 'Error al buscar datos de persona: ', + 'LOG_HORARIOS' => 'Error al buscar horarios de persona: ', + + 'ERROR' => 'Ha ocurrido un error mientras se buscaban los datos de la persona.', ]; diff --git a/routes/api.php b/routes/api.php index a02a390..a42c164 100644 --- a/routes/api.php +++ b/routes/api.php @@ -26,12 +26,11 @@ Route::get('/', [ApiController::class, 'bienvenida'])->name('api.bienvenida'); # Rutas de personas: -# Rutas de datos basicos: +# Ruta de datos basicos: Route::get('persona/datos', [ApiPersonaController::class, 'getDatos'])->name('persona.getDatos'); -# Rutas de horarios (por unidad academica, funcion y tipo de horario): -Route::post('persona/horarios/dni/{dni}', [ApiPersonaController::class, 'getHorariosPorTelefono'])->name('persona.getHorariosPorDni'); -Route::post('persona/horarios/telefono/{telefono}', [ApiPersonaController::class, 'getDatosPorTelefono'])->name('persona.getHorariosPorTelefono'); +# Ruta de horarios (por unidad academica, funcion y tipo de horario): +Route::get('persona/horarios', [ApiPersonaController::class, 'getHorarios'])->name('persona.getHorarios'); # Rutas de familiares: Route::get('familiar/{dni}', [ApiFamilliaresController::class, 'buscar'])->name('familiar.buscar');