diff --git a/back/app/Http/Controllers/PostulanteAuthController.php b/back/app/Http/Controllers/PostulanteAuthController.php index 02206c8..e1729a6 100644 --- a/back/app/Http/Controllers/PostulanteAuthController.php +++ b/back/app/Http/Controllers/PostulanteAuthController.php @@ -340,4 +340,78 @@ public function obtenerAvanceProcesoPostulante(Request $request, $idProceso) } } +public function miObservacion(Request $request) +{ + $postulante = $request->user(); + + if (!$postulante) { + return response()->json([ + 'success' => false, + 'message' => 'No autenticado' + ], 401); + } + + $dni = trim($postulante->dni); + + if (!$dni) { + return response()->json([ + 'success' => false, + 'message' => 'El postulante no tiene DNI registrado' + ], 422); + } + + $url = "https://test-admision.unap.edu.pe/service_observados/api/v1/observaciones/dni/{$dni}"; + + try { + $response = Http::timeout(15)->get($url); + + if (!$response->successful()) { + return response()->json([ + 'success' => false, + 'message' => 'No se pudo consultar observaciones', + 'status_http' => $response->status(), + ], 502); + } + + $payload = $response->json(); + + // si no viene, asumimos false + $esObservado = (bool)($payload['es_observado'] ?? false); + + // opcional: traer una observación "principal" + $detalle = null; + if (!empty($payload['observados']) && is_array($payload['observados'])) { + $o = $payload['observados'][0]; + $detalle = [ + 'tipo_observacion' => $o['tipo_observacion'] ?? null, + 'categoria' => $o['categoria'] ?? null, + 'observaciones' => $o['observaciones'] ?? null, + 'fecha_sancion' => $o['fecha_sancion'] ?? null, + 'fecha_fin' => $o['fecha_fin'] ?? null, + ]; + } + + return response()->json([ + 'success' => true, + 'dni' => $dni, + 'es_observado' => $esObservado, + 'mensaje' => $esObservado + ? 'Usted tiene una observación. Acérquese a la Dirección de Admisión para regularizar su situación.' + : 'Usted está apto para postular en este proceso.', + 'detalle' => $detalle, // si no lo quieres, bórralo + ]); + + } catch (\Throwable $e) { + Log::error('Error consultando observaciones del postulante', [ + 'dni' => $dni, + 'error' => $e->getMessage() + ]); + + return response()->json([ + 'success' => false, + 'message' => 'Error interno consultando observaciones' + ], 500); + } +} + } diff --git a/back/routes/api.php b/back/routes/api.php index de7c509..3c1476c 100644 --- a/back/routes/api.php +++ b/back/routes/api.php @@ -226,4 +226,6 @@ Route::middleware('auth:sanctum')->prefix('admin')->group(function () { Route::delete('/comunicados/{id}', [ComunicadoController::class, 'destroy']); Route::patch('/comunicados/{id}/toggle-activo', [ComunicadoController::class, 'toggleActivo']); Route::delete('/comunicados/imagenes/{imagenId}', [ComunicadoController::class, 'destroyImagen']); -}); \ No newline at end of file +}); + +Route::middleware('auth:sanctum')->get('/postulante/observacion', [PostulanteAuthController::class, 'miObservacion']); \ No newline at end of file diff --git a/front/src/store/postulanteStore.js b/front/src/store/postulanteStore.js index 7eba30f..4c0b1bc 100644 --- a/front/src/store/postulanteStore.js +++ b/front/src/store/postulanteStore.js @@ -112,6 +112,25 @@ export const useAuthStore = defineStore('auth', () => { return false } + const getObservacion = async () => { + try { + loading.value = true + error.value = null + + const response = await api.get('/postulante/observacion', { + headers: { Authorization: `Bearer ${token.value}` } + }) + + return response.data + } catch (err) { + error.value = err.response?.data?.message || 'Error consultando observación' + return { success: false, message: error.value } + } finally { + loading.value = false + } +} + + return { token, @@ -128,6 +147,7 @@ export const useAuthStore = defineStore('auth', () => { register, login, logout, - checkAuth + checkAuth, + getObservacion, } }) diff --git a/front/src/views/postulante/AvanceProceso.vue b/front/src/views/postulante/AvanceProceso.vue index 4bb91c7..ed5e98a 100644 --- a/front/src/views/postulante/AvanceProceso.vue +++ b/front/src/views/postulante/AvanceProceso.vue @@ -6,7 +6,7 @@