You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

270 lines
8.5 KiB
PHTML

2 months ago
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Postulante;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Str;
use Illuminate\Support\Facades\Http;
class PostulanteAuthController extends Controller
{
/**
* Registro de postulante (normal) con DNI
*/
public function register(Request $request)
{
$validator = Validator::make($request->all(), [
'name' => 'required|string|max:255|regex:/^[\pL\s\-]+$/u',
'email' => 'required|email|unique:postulantes,email|max:255',
'password' => [
'required',
'string',
'min:8',
'confirmed',
'regex:/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$/'
],
'dni' => 'required|string|max:20|unique:postulantes,dni',
], [
'password.regex' => 'La contraseña debe contener al menos una mayúscula, una minúscula, un número y un carácter especial.',
'name.regex' => 'El nombre solo puede contener letras y espacios.',
]);
if ($validator->fails()) {
return response()->json(['success' => false, 'errors' => $validator->errors()], 422);
}
$postulante = Postulante::create([
'name' => strip_tags(trim($request->name)),
'email' => strtolower(trim($request->email)),
'password' => $request->password,
'dni' => $request->dni,
]);
Log::info('Postulante registrado', ['id' => $postulante->id, 'dni' => $postulante->dni]);
return response()->json(['success' => true, 'message' => 'Postulante registrado exitosamente', 'postulante' => $postulante], 201);
}
public function login(Request $request)
{
$validator = Validator::make($request->all(), [
'email' => 'required|email|max:255',
'password' => 'required|string',
]);
if ($validator->fails()) {
return response()->json(['success' => false, 'errors' => $validator->errors()], 422);
}
$email = strtolower(trim($request->email));
$postulante = Postulante::where('email', $email)->first();
if (!$postulante || !Hash::check($request->password, $postulante->password)) {
Log::warning('Intento de login fallido', ['email' => $email]);
return response()->json([
'success' => false,
'message' => 'Credenciales inválidas'
], 401);
}
$deviceId = $request->header('Device-Id') ?? Str::random(10);
// Revocar tokens antiguos
$postulante->tokens()->delete();
// Crear token
$token = $postulante
->createToken($deviceId, ['*'], now()->addHour())
->plainTextToken;
$postulante->update([
'device_id' => $deviceId,
'last_activity' => now()
]);
Log::info('Login exitoso', ['id' => $postulante->id]);
return response()->json([
'success' => true,
'message' => 'Login exitoso',
'postulante' => [
'id' => $postulante->id,
'name' => $postulante->name,
'email' => $postulante->email,
'dni' => $postulante->dni
],
'token' => $token,
'token_type' => 'Bearer',
'expires_in' => 3600
]);
}
/**
* Logout
*/
public function logout(Request $request)
{
$postulante = $request->user();
if ($postulante) {
$postulante->tokens()->delete();
$postulante->device_id = null;
$postulante->last_activity = null;
$postulante->save();
}
return response()->json(['success' => true, 'message' => 'Sesión cerrada correctamente']);
}
/**
* Información del postulante logueado
*/
public function me(Request $request)
{
$postulante = $request->user();
if (!$postulante) {
return response()->json(['success' => false, 'message' => 'No autenticado'], 401);
}
// Actualizar última actividad al hacer request
$postulante->update(['last_activity' => now()]);
return response()->json([
'success' => true,
'postulante' => [
'id' => $postulante->id,
'name' => $postulante->name,
'email' => $postulante->email,
'dni' => $postulante->dni
]
]);
}
public function obtenerPagosPostulante(Request $request)
{
$postulante = $request->user(); // o Auth::guard('postulante')->user();
if (!$postulante) {
return response()->json([
'success' => false,
'message' => 'No autenticado'
], 401);
}
$dni = trim($postulante->dni);
$pagos = [];
// ===============================
// 1⃣ PAGOS PYTO PERÚ
// ===============================
$urlPyto = "https://service2.unap.edu.pe/PAYMENTS_MNG/v1/{$dni}/8/";
$responsePyto = Http::get($urlPyto);
if ($responsePyto->successful()) {
$dataPyto = $responsePyto->json();
if (!empty($dataPyto['data'])) {
foreach ($dataPyto['data'] as $pago) {
$pagos[] = [
'tipo' => 'pyto_peru',
'codigo' => $pago['autorizationCode'] ?? null,
'monto' => $pago['total'] ?? null,
'fecha_pago' => $pago['confirmedDate'] ?? null,
'estado' => true,
'raw' => $pago // devuelve toda la info original
];
}
}
}
// ===============================
// 2⃣ PAGOS CAJA
// ===============================
$urlCaja = "https://inscripciones.admision.unap.edu.pe/api/get-pagos-caja-dni/{$dni}";
$responseCaja = Http::get($urlCaja);
if ($responseCaja->successful()) {
$dataCaja = $responseCaja->json();
if (!empty($dataCaja)) {
foreach ($dataCaja as $pago) {
$pagos[] = [
'tipo' => 'caja',
'codigo' => $pago['paymentTitle'] ?? null,
'monto' => $pago['paymentAmount'] ?? null,
'fecha_pago' => $pago['paymentDatetime'] ?? null,
'estado' => true,
'raw' => $pago
];
}
}
}
// ===============================
// 3⃣ BANCO NACIÓN
// ===============================
$urlBanco = 'https://inscripciones.admision.unap.edu.pe/api/get-pagos-banco-dni';
$responseBanco = Http::post($urlBanco, [
'dni' => $dni,
]);
if ($responseBanco->successful()) {
$dataBanco = $responseBanco->json();
if (!empty($dataBanco['datos'])) {
foreach ($dataBanco['datos'] as $pago) {
$pagos[] = [
'tipo' => 'banco_nacion',
'codigo' => $pago['secuencia'] ?? null,
'monto' => $pago['imp_pag'] ?? null,
'fecha_pago' => $pago['fch_pag'] ?? null,
'estado' => true,
'raw' => $pago
];
}
}
}
return response()->json([
'success' => true,
'postulante' => [
'id' => $postulante->id,
'name' => $postulante->name,
'dni' => $dni,
'email' => $postulante->email,
],
'total_pagos' => count($pagos),
'pagos' => $pagos
]);
}
public function misProcesos(Request $request)
{
$dni = $request->user()->dni;
$procesos = ResultadoAdmision::select(
'procesos_admision.id',
'procesos_admision.nombre',
'resultados_admision.puntaje',
'resultados_admision.apto'
)
->join('procesos_admision', 'procesos_admision.id', '=', 'resultados_admision.idproceso')
->where('resultados_admision.dni', $dni)
->distinct()
->get();
return response()->json([
'success' => true,
'data' => $procesos
]);
}
}