- Migration + AiUsageLog model with tokens, duration, time, cost fields - GeminiIntentService and GeminiVisionService log every API call with input/output token counts from usageMetadata and response time - TelegramBotService logs Whisper calls with audio duration (from Telegram) and calculates cost at $1/second - Whisper voice duration now passed from TelegramWebhookController - Free text in Telegram now tries Gemini intent detection before showing menu - /chat/ia-logs: Livewire component with summary cards + filterable table - Whisper connection test button in config panel - "Logs IA" link added to Chat/Bot nav section Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
119 lines
7.2 KiB
PHP
119 lines
7.2 KiB
PHP
<?php
|
|
|
|
use App\Http\Controllers\ChatController;
|
|
use App\Http\Controllers\MenuController;
|
|
use App\Http\Controllers\TelegramWebhookController;
|
|
use App\Http\Controllers\WhatsappController;
|
|
use App\Http\Controllers\WhatsappWebhookController;
|
|
use Illuminate\Support\Facades\Route;
|
|
|
|
Route::get('/', function () {
|
|
if (auth()->check()) {
|
|
return redirect('/servicios'); // Usuario autenticado
|
|
}
|
|
return redirect('/login'); // Usuario no autenticado
|
|
});
|
|
|
|
Route::any('/dashboard', function () {
|
|
return view('dashboard');
|
|
})->middleware(['auth', 'verified'])->name('dashboard');
|
|
|
|
|
|
Route::get('/politica-privacidad', fn() => view('politica-privacidad'))->name('politica-privacidad');
|
|
Route::get('/eliminacion-datos', fn() => view('eliminacion-datos'))->name('eliminacion-datos');
|
|
Route::get('/condiciones-servicio', fn() => view('condiciones-servicio'))->name('condiciones-servicio');
|
|
|
|
Route::get('/comprar', [MenuController::class, 'showcomprar'])->name('comprar');
|
|
|
|
Route::get('/orders', [MenuController::class, 'order'])->name('orders');
|
|
Route::get('/wompi_pagos', [MenuController::class, 'wompi_pagos'])->name('wompi_pagos');
|
|
Route::any('/wompi_hook', [MenuController::class, 'wompi_hook'])->name('wompi_hook');
|
|
Route::get('/compras', [MenuController::class, 'compras'])->name('compras');
|
|
Route::get('/pay/{estado}', [MenuController::class, 'pay'])->name('pay');
|
|
Route::get('/webhooks', [WhatsappWebhookController::class, 'verify']);
|
|
Route::post('/webhooks', [WhatsappWebhookController::class, 'handle'])
|
|
->withoutMiddleware([\App\Http\Middleware\VerifyCsrfToken::class]);
|
|
Route::get('/credenciales', [MenuController::class, 'showcredenciales'])->name('credenciales');
|
|
Route::get('/oferta', [MenuController::class, 'showoferta'])->name('oferta');
|
|
Route::get('/single', [MenuController::class, 'showsingle'])->name('single');
|
|
Route::get('/promo', [MenuController::class, 'showpromo'])->name('promo');
|
|
Route::get('/categorias', [MenuController::class, 'showcategorias'])->name('categorias');
|
|
Route::get('/nequi', [MenuController::class, 'nequi'])->name('nequi');
|
|
Route::get('sendSMS', [App\Http\Controllers\TwilioSMSController::class, 'index']);
|
|
Route::any('/mp', [MenuController::class, 'showmp'])->name('mp');
|
|
Route::any('/pruebas', [MenuController::class, 'pruebas'])->name('pruebas');
|
|
|
|
|
|
//Logueados
|
|
Route::middleware(["auth"])->group(function () {
|
|
Route::any('/clientes', [MenuController::class, 'showclientes'])->name('clientes');
|
|
Route::get('/servicios', [MenuController::class, 'showservicios'])->name('servicios');
|
|
Route::get('/top', [MenuController::class, 'showtop'])->name('top');
|
|
Route::any('/reportes', [MenuController::class, 'showreportes'])->name('reportes');
|
|
Route::get('/perfil', [MenuController::class, 'showperfil'])->name('perfil');
|
|
Route::get('/recarga', [MenuController::class, 'showrecarga'])->name('recarga');
|
|
Route::post('/recargas', [MenuController::class, 'recargas'])->name('recargas');
|
|
Route::get('/promociones', [MenuController::class, 'showpromociones'])->name('promociones');
|
|
Route::get('/wompi/{monto}', [MenuController::class, 'showwompi'])->name('wompi');
|
|
Route::any('/logs', [MenuController::class, 'showlogs'])->name('logs');
|
|
Route::any('/logs-comisiones', [MenuController::class, 'showlogscomisiones'])->name('logs-comisiones');
|
|
Route::any('/usuarios', [MenuController::class, 'showusuarios'])->name('usuarios');
|
|
Route::any('/roles', [MenuController::class, 'showroles'])->name('roles');
|
|
Route::any('/tarifas', [MenuController::class, 'showtarifas'])->name('tarifas');
|
|
});
|
|
|
|
// Editores
|
|
Route::middleware(["auth", "solo_usuario_editor"])->group(function () {
|
|
Route::any('/planes', [MenuController::class, 'showplanes'])->name('planes');
|
|
Route::get('/import', [MenuController::class, 'showimport'])->name('import');
|
|
});
|
|
|
|
//Administradores
|
|
Route::middleware(["auth", "solo_usuario_administrador"])->group(function () {
|
|
Route::get('/admin', [MenuController::class, 'showadmin'])->middleware(['auth'])->name('admin');
|
|
Route::any('/pendientes', [MenuController::class, 'showpendientes'])->name('pendientes');
|
|
Route::get('/servicio', [MenuController::class, 'showservicio'])->name('servicio');
|
|
Route::get('/configuracion', [MenuController::class, 'showconfiguracion'])->name('configuracion');
|
|
Route::get('/categoria', [MenuController::class, 'showcategoria'])->name('categoria');
|
|
Route::any('/logs', [MenuController::class, 'showlogs'])->name('logs');
|
|
Route::any('/logs-recargas', [MenuController::class, 'showLogRecargas'])->name('logsRecargas');
|
|
Route::any('/log-general', [MenuController::class, 'showLogGeneral'])->name('logGeneral');
|
|
Route::any('/log-historial', [MenuController::class, 'showLogHistorial'])->name('logHistorial'); Route::get('/diagnostico', [MenuController::class, 'showDiagnostico'])->name('diagnostico'); Route::get('/utilidades', [MenuController::class, 'showutilidad'])->name('utilidades');
|
|
Route::get('/mantenimiento', [MenuController::class, 'mantenimiento'])->name('mantenimiento');
|
|
Route::get('/reversar', [MenuController::class, 'showReversarCompra'])->name('reversar');
|
|
Route::get('/rank-management', [MenuController::class, 'showgestionrangos'])->name('gestion-rangos');
|
|
|
|
// Módulo WhatsApp
|
|
Route::prefix('whatsapp')->name('whatsapp.')->group(function () {
|
|
Route::get('/conversaciones', [WhatsappController::class, 'conversaciones'])->name('conversaciones');
|
|
Route::get('/menus', [WhatsappController::class, 'menus'])->name('menus');
|
|
Route::get('/plantillas', [WhatsappController::class, 'plantillas'])->name('plantillas');
|
|
Route::get('/programados', [WhatsappController::class, 'programados'])->name('programados');
|
|
Route::get('/configuracion', [WhatsappController::class, 'configuracion'])->name('configuracion');
|
|
Route::get('/logs', [WhatsappController::class, 'logs'])->name('logs');
|
|
Route::get('/correo', [WhatsappController::class, 'correo'])->name('correo');
|
|
});
|
|
|
|
// Módulo Chat (web + Telegram)
|
|
Route::prefix('chat')->name('chat.')->group(function () {
|
|
Route::get('/conversaciones', [ChatController::class, 'conversaciones'])->name('conversaciones');
|
|
Route::get('/menus', [ChatController::class, 'menus'])->name('menus');
|
|
Route::get('/configuracion', [ChatController::class, 'configuracion'])->name('configuracion');
|
|
Route::get('/ia-logs', [ChatController::class, 'iaLogs'])->name('ia-logs');
|
|
});
|
|
});
|
|
|
|
Route::post('/registrar-accion-compra', [MenuController::class, 'click_compra'])->name('click_compra');
|
|
|
|
// Rutas públicas del módulo Chat (sin autenticación)
|
|
Route::get('/chat', [ChatController::class, 'publicPage'])->name('chat.publico');
|
|
Route::post('/chat/webhook/telegram', [TelegramWebhookController::class, 'handle'])
|
|
->name('chat.telegram.webhook')
|
|
->withoutMiddleware([\App\Http\Middleware\VerifyCsrfToken::class]);
|
|
|
|
// Route::get('/ip-test', [MenuController::class, 'ip_test'])->name('ip');
|
|
|
|
|
|
|
|
require __DIR__ . '/auth.php';
|