HEX
Server: Apache/2.4.58 (Ubuntu)
System: Linux Bradford-Sitios 6.14.0-1017-azure #17~24.04.1-Ubuntu SMP Mon Dec 1 20:10:50 UTC 2025 x86_64
User: www-data (33)
PHP: 7.4.33
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
File: /var/www/plan-b.bradford/routes/web.php
<?php

use App\Http\Controllers\RelationshipsController;
use App\Http\Controllers\PaymentMethodsController;
use App\Http\Controllers\AreasController;
use App\Http\Controllers\ContractCommentsController;
use App\Http\Controllers\ContractController;
use App\Http\Controllers\ContractFormatsController;
use App\Http\Controllers\ContractTimelineController;
use App\Http\Controllers\CoursesController;
use App\Http\Controllers\CurrencyTypesController;
use App\Http\Controllers\DashboardController;
use App\Http\Controllers\LoginController;
use App\Http\Controllers\MyProfileController;
use App\Http\Controllers\ParentsController;
use App\Http\Controllers\PaymentConceptsController;
use App\Http\Controllers\PaymentConceptDetailsController;
use App\Http\Controllers\ProfileController;
use App\Http\Controllers\RegisterController;
use App\Http\Controllers\StudentsController;
use App\Http\Controllers\UsersController;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\Route;

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider and all of them will
| be assigned to the "web" middleware group. Make something great!
|
*/

Route::get('/', [LoginController::class, 'login']);

#RUTAS PARA CLIENTE
Route::get('/login', [LoginController::class, 'login'])->name('login');
Route::post('/login', [LoginController::class, 'login_validate'])->name('login-post');
Route::get('/dashboard', [DashboardController::class, 'index'])->name('dashboard');


#GESTIÓN DE CONTRATOS
Route::get('/dashboard/matriculas', [ContractController::class, 'index'])->name('contracts');
Route::get('/dashboard/matriculas/nuevo', [ContractController::class, 'create'])->name('contract');
Route::post('/dashboard/matriculas/nuevo', [ContractController::class, 'store'])->name('contract-store');
Route::get('/dashboard/matriculas/{id}/editar', [ContractController::class, 'edit'])->name('contract-edit');
Route::post('/dashboard/matriculas/{id}/editar', [ContractController::class, 'update'])->name('contract-update');
Route::post('/dashboard/matriculas/asignar-estudiante', [ContractController::class, 'assign_student'])->name('contract-assign-student');
Route::get('/dashboard/matriculas/{id}/detalle', [ContractController::class, 'detail'])->name('contract-detail');
Route::post('/dashboard/matriculas/asignar-beneficiario', [ContractController::class, 'contract_detail_assign'])->name('contract-detail-assign');
Route::post('/dashboard/matriculas/cancelar', [ContractController::class, 'cancel'])->name('contract-cancel');
Route::post('/dashboard/matriculas/{id}/editar-pago', [ContractController::class, 'update_detail'])->name('contract-update-detail');
Route::post('/dashboard/matriculas/{id}/aprobar', [ContractController::class, 'approved'])->name('contract-approved');
Route::post('/dashboard/matriculas/{id}/terminar-solicitud', [ContractController::class, 'end_contract'])->name('contract-end');
Route::post('/dashboard/matriculas/{id}/cargar-comprobantes', [ContractController::class, 'upload_file_detail'])->name('contract-detail-upload-file');

Route::get('/dashboard/matriculas/{id}/generar-pdf', [ContractController::class, 'generate_pdf'])->name('contract-detail-pdf');
// Route::get('/dashboard/matriculas/{id}/cronologia', [ContractTimelineController::class, 'timeline'])->name('contract-timeline');

Route::get('/dashboard/matriculas/{id}/comentarios', [ContractCommentsController::class, 'comments'])->name('contract-comments');
Route::post('/dashboard/matriculas/{id}/nuevo-comentario', [ContractCommentsController::class, 'comments_store'])->name('contract-comment-store');
Route::post('/ashboard/matriculas/eliminar-comentario', [ContractCommentsController::class, 'comment_destroy'])->name('contract-comment-delete');

Route::get('/dashboard/matriculas/{id}/generar-conceptos-pago', [ContractController::class, 'generate_payment_concept'])->name('contract-generate-payment-concept');
Route::get('/dashboard/matriculas/{id}/detalle-contrato-frame', [ContractController::class, 'frame_contract'])->name('contract-frame');

#GESTIÓN DE APODERADOS
Route::get('/dashboard/apoderados', [ParentsController::class, 'index'])->name('parents');
Route::get('/dashboard/apoderados/nuevo', [ParentsController::class, 'create'])->name('parent');
Route::post('/dashboard/apoderados/nuevo', [ParentsController::class, 'store'])->name('parent-store');
Route::get('/dashboard/apoderados/{id}/editar', [ParentsController::class, 'edit'])->name('parent-edit');
Route::post('/dashboard/apoderados/{id}/editar', [ParentsController::class, 'update'])->name('parent-update');
Route::post('/dashboard/apoderados/eliminar', [ParentsController::class, 'destroy'])->name('parent-delete');
Route::post('/dashboard/apoderados/buscar', [ParentsController::class, 'search_parents'])->name('search-parents');

#GESTIÓN DE ALUMNOS
Route::get('/dashboard/estudiantes', [StudentsController::class, 'index'])->name('students');
Route::get('/dashboard/estudiantes/nuevo', [StudentsController::class, 'create'])->name('student');
Route::post('/dashboard/estudiantes/nuevo', [StudentsController::class, 'store'])->name('student-store');
Route::get('/dashboard/estudiantes/{id}/editar', [StudentsController::class, 'edit'])->name('student-edit');
Route::post('/dashboard/estudiantes/{id}/editar', [StudentsController::class, 'update'])->name('student-update');
Route::post('/dashboard/estudiantes/eliminar', [StudentsController::class, 'destroy'])->name('student-delete');
Route::post('/dashboard/estudiantes/eliminar-imagen', [StudentsController::class, 'destroy_image'])->name('student-delete-image');

#GESTIÓN DE USUARIOS
Route::get('/dashboard/usuarios', [UsersController::class, 'index'])->name('users');
Route::get('/dashboard/usuarios/nuevo', [UsersController::class, 'create'])->name('user');
Route::post('/dashboard/usuarios/nuevo', [UsersController::class, 'store'])->name('user-store');
Route::get('/dashboard/usuarios/{id}/editar', [UsersController::class, 'edit'])->name('user-edit');
Route::post('/dashboard/usuarios/{id}/editar', [UsersController::class, 'update'])->name('user-update');
Route::post('/dashboard/usuarios/eliminar', [UsersController::class, 'destroy'])->name('user-delete');
Route::post('/dashboard/usuarios/restablecer-contrasena', [UsersController::class, 'restore_password'])->name('user-restore-password');
Route::post('/dashboard/usuarios/confirmar-cuenta', [UsersController::class, 'confirm_account'])->name('user-confirm-account');

#GESTIÓN DE PERFILES
Route::get('/dashboard/perfiles', [ProfileController::class, 'index'])->name('profiles');
Route::get('/dashboard/perfiles/nuevo', [ProfileController::class, 'create'])->name('profile-create');
Route::post('/dashboard/perfiles/nuevo', [ProfileController::class, 'store'])->name('profile-store');
Route::get('/dashboard/perfiles/{id}/editar', [ProfileController::class, 'edit'])->name('profile-edit');
Route::post('/dashboard/perfiles/{id}/editar', [ProfileController::class, 'update'])->name('profile-update');
Route::get('/dashboard/perfiles/{id}/asignar-permisos', [ProfileController::class, 'edit_permission'])->name('profile-edit-permission');
Route::post('/dashboard/perfiles/{id}/asignar-permisos', [ProfileController::class, 'update_permission'])->name('profile-update-permission');
Route::post('/dashboard/perfiles/eliminar', [ProfileController::class, 'destroy'])->name('profile-delete');

#GESTIÓN DE AREAS
Route::get('/dashboard/areas', [AreasController::class, 'index'])->name('areas');
Route::get('/dashboard/areas/nueva', [AreasController::class, 'create'])->name('area');
Route::post('/dashboard/areas/nueva', [AreasController::class, 'store'])->name('area-store');
Route::get('/dashboard/areas/{id}/editar', [AreasController::class, 'edit'])->name('area-edit');
Route::post('/dashboard/areas/{id}/editar', [AreasController::class, 'update'])->name('area-update');
Route::post('/dashboard/areas/eliminar', [AreasController::class, 'destroy'])->name('area-delete');

#GESTIÓN DE FORMATOS DE CONTRATOS
Route::get('/dashboard/formatos-contratos', [ContractFormatsController::class, 'index'])->name('contract-formats');
Route::get('/dashboard/formatos-contratos/nueva', [ContractFormatsController::class, 'create'])->name('contract-format');
Route::post('/dashboard/formatos-contratos/nueva', [ContractFormatsController::class, 'store'])->name('contract-format-store');
Route::get('/dashboard/formatos-contratos/{id}/editar', [ContractFormatsController::class, 'edit'])->name('contract-format-edit');
Route::post('/dashboard/formatos-contratos/{id}/editar', [ContractFormatsController::class, 'update'])->name('contract-format-update');
Route::post('/dashboard/formatos-contratos/eliminar', [ContractFormatsController::class, 'destroy'])->name('contract-format-delete');
Route::post('/dashboard/contratos/obtener-formato-contrato', [ContractFormatsController::class, 'get_description'])->name('contract-format-description');

#GESTIÓN DE DIVISAS
Route::get('/dashboard/divisas', [CurrencyTypesController::class, 'index'])->name('currency-types');
Route::get('/dashboard/divisas/nueva', [CurrencyTypesController::class, 'create'])->name('currency-type');
Route::post('/dashboard/divisas/nueva', [CurrencyTypesController::class, 'store'])->name('currency-type-store');
Route::get('/dashboard/divisas/{id}/editar', [CurrencyTypesController::class, 'edit'])->name('currency-type-edit');
Route::post('/dashboard/divisas/{id}/editar', [CurrencyTypesController::class, 'update'])->name('currency-type-update');
Route::post('/dashboard/divisas/eliminar', [CurrencyTypesController::class, 'destroy'])->name('currency-type-delete');

#GESTIÓN DE CURSOS
Route::get('/dashboard/cursos', [CoursesController::class, 'index'])->name('courses');
Route::get('/dashboard/cursos/nueva', [CoursesController::class, 'create'])->name('course');
Route::post('/dashboard/cursos/nueva', [CoursesController::class, 'store'])->name('course-store');
Route::get('/dashboard/cursos/{id}/editar', [CoursesController::class, 'edit'])->name('course-edit');
Route::post('/dashboard/cursos/{id}/editar', [CoursesController::class, 'update'])->name('course-update');
Route::post('/dashboard/cursos/eliminar', [CoursesController::class, 'destroy'])->name('course-delete');

#GESTIÓN DE PARENTESCOS
Route::get('/dashboard/parentescos', [RelationshipsController::class, 'index'])->name('relationships');
Route::get('/dashboard/parentescos/nueva', [RelationshipsController::class, 'create'])->name('relationship');
Route::post('/dashboard/parentescos/nueva', [RelationshipsController::class, 'store'])->name('relationship-store');
Route::get('/dashboard/parentescos/{id}/editar', [RelationshipsController::class, 'edit'])->name('relationship-edit');
Route::post('/dashboard/parentescos/{id}/editar', [RelationshipsController::class, 'update'])->name('relationship-update');
Route::post('/dashboard/parentescos/eliminar', [RelationshipsController::class, 'destroy'])->name('relationship-delete');

#GESTIÓN DE MÉTODOS DE PAGO
Route::get('/dashboard/metodos-pagos', [PaymentMethodsController::class, 'index'])->name('payment-methods');
Route::get('/dashboard/metodos-pagos/nueva', [PaymentMethodsController::class, 'create'])->name('payment-method');
Route::post('/dashboard/metodos-pagos/nueva', [PaymentMethodsController::class, 'store'])->name('payment-method-store');
Route::get('/dashboard/metodos-pagos/{id}/editar', [PaymentMethodsController::class, 'edit'])->name('payment-method-edit');
Route::post('/dashboard/metodos-pagos/{id}/editar', [PaymentMethodsController::class, 'update'])->name('payment-method-update');
Route::post('/dashboard/metodos-pagos/eliminar', [PaymentMethodsController::class, 'destroy'])->name('payment-method-delete');

#GESTIÓN DE CONCEPTOS DE PAGOS
Route::get('/dashboard/conceptos-pagos', [PaymentConceptsController::class, 'index'])->name('payment-concepts');
Route::get('/dashboard/conceptos-pagos/nuevo', [PaymentConceptsController::class, 'create'])->name('payment-concept');
Route::post('/dashboard/conceptos-pagos/nuevo', [PaymentConceptsController::class, 'store'])->name('payment-concept-store');
Route::get('/dashboard/conceptos-pagos/{id}/editar', [PaymentConceptsController::class, 'edit'])->name('payment-concept-edit');
Route::post('/dashboard/conceptos-pagos/{id}/editar', [PaymentConceptsController::class, 'update'])->name('payment-concept-update');
Route::post('/dashboard/conceptos-pagos/eliminar', [PaymentConceptsController::class, 'destroy'])->name('payment-concept-delete');
#GESTIÓN DE CONCEPTOS DE PAGOS ITEMS
Route::get('/dashboard/conceptos-pagos/{id}/items', [PaymentConceptDetailsController::class, 'items_list'])->name('payment-concept-details');
Route::post('/dashboard/conceptos-pagos/{id}/items/agregar', [PaymentConceptDetailsController::class, 'items_action'])->name('payment-concept-details-store');
Route::post('/dashboard/conceptos-pagos/{id}/items/eliminar', [PaymentConceptDetailsController::class, 'items_destroy'])->name('payment-concept-details-delete');
#MI PERFIL
Route::get('/dashboard/mi-perfil', [MyProfileController::class, 'profile_edit'])->name('profile');
Route::post('/dashboard/mi-perfil', [MyProfileController::class, 'profile_update'])->name('profile-post');
#MI PERFIL - CAMBIO DE CONTRASEÑA
Route::get('/dashboard/mi-perfil/cambiar-contrasena', [MyProfileController::class, 'change_password_edit'])->name('change-password');
Route::post('/dashboard/mi-perfil/cambiar-contrasena', [MyProfileController::class, 'change_password_update'])->name('change-password-post');


#RUTAS GENERALES
Route::get('/logout', [LoginController::class, 'logout'])->name('logout');
Route::get('/restablecer-contrasena', [LoginController::class, 'recovery_password'])->name('recovery-password');
Route::post('/restablecer-contrasena', [LoginController::class, 'recovery_password_validate'])->name('recovery-password-post');
Route::get('/restablecimiento-contrasena', [LoginController::class, 'restore_password'])->name('restore-password');
Route::post('/restablecimiento-contrasena', [LoginController::class, 'restore_password_validate'])->name('restore-password-post');
Route::get('/cambio-contrasena-requerido', [LoginController::class, 'change_password_required'])->name('change-password-required');
Route::post('/cambio-contrasena-requerido', [LoginController::class, 'change_password_required_validate'])->name('change-password-required-post');
Route::get('/confirmar-cuenta', [LoginController::class, 'confirm_account'])->name('confirm-account');
Route::get('/sesion-finalizada', [LoginController::class, 'session_finish'])->name('session-finish');
Route::get('/generar-usuario', [RegisterController::class, 'su_register'])->name('generate-root');

Route::get('/clear-cache', function () {
    Artisan::call('cache:clear');
});

use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
use Illuminate\Http\Request;
use App\Http\Middleware\VerifyCsrfToken;

Route::post('/payment-webhook', function (Request $request) {
    // Guardar log en storage/logs/laravel.log
    Log::info('Webhook /payment-webhook recibido', [
        'ip'      => $request->ip(),
        'headers' => $request->headers->all(),
        'payload' => $request->all(),
    ]);

    return response()->json(['ok' => true], 200);
})->withoutMiddleware([VerifyCsrfToken::class]);

Route::post('/signapis-webhook', function (Request $request) {
    // Guardar log en storage/logs/laravel.log
    Log::info('Webhook /signapis-webhook recibido', [
        'ip'      => $request->ip(),
        'headers' => $request->headers->all(),
        'payload' => $request->all(),
    ]);

    return response()->json(['ok' => true], 200);
})->withoutMiddleware([VerifyCsrfToken::class]);