Vamos con la Etapa 12: actualizar DatabaseSeeder y hacer la prueba final del flujo completo.
馃幆 Objetivo de esta etapa
Actualizar
DatabaseSeederpara incluir los seeders base + elDemoSeederEjecutar el flujo completo desde cero
Verificar que el dashboard funcione con datos realistas
馃摑 1. Actualizar DatabaseSeeder
// database/seeders/DatabaseSeeder.php <?php namespace Database\Seeders; use Database\Seeders\Demo\DemoSeeder; use Illuminate\Database\Seeder; class DatabaseSeeder extends Seeder { public function run(): void { // ============================================ // SEEDERS BASE (siempre) // ============================================ $this->call([ RolePermissionSeeder::class, PrestacionSeeder::class, ConsultorioSeeder::class, PacienteSeeder::class, AntecedentesMedicosSeeder::class, RegistroClinicoSeeder::class, ]); // ============================================ // SEEDERS DEMO (solo en local/testing) // ============================================ if (app()->environment(['local', 'testing'])) { $this->call(DemoSeeder::class); } } }
馃敡 2. Verificar el DemoSeeder (orquestador)
Asegurate de que el orden sea el correcto:
// database/seeders/Demo/DemoSeeder.php public function run(): void { if (!app()->environment(['local', 'testing'])) { $this->command->warn('⚠️ Los seeders demo solo se ejecutan en local o testing.'); return; } mt_srand(42); $this->limpiarDatosDemo(); $this->command->info('馃尡 Generando datos demo...'); $this->call([ DemoUserSeeder::class, DemoPacienteSeeder::class, DemoOdontogramaSeeder::class, DemoPropuestaSeeder::class, DemoTratamientoRealizadoSeeder::class, DemoCuentaSeeder::class, DemoPagoSeeder::class, DemoMovimientoSeeder::class, ]); $this->command->info('✅ Datos demo generados correctamente.'); }
⚠️ 3. Antes de ejecutar: decisi贸n sobre la BD
Ten茅s dos caminos:
Opci贸n A: Ejecutar sobre la BD actual (conservar datos)
php artisan db:seed
✅ Conserva datos existentes
⚠️ Los seeders base podr铆an duplicar datos (roles, prestaciones, etc.)
✅ El
DemoSeederlimpia los datos demo previos antes de crear⚠️ Los seeders base podr铆an re-ejecutarse sobre datos existentes
Opci贸n B: Limpiar la BD y ejecutar todo desde cero
php artisan migrate:fresh --seed✅ Base de datos limpia
✅ Todos los seeders se ejecutan en orden
⚠️ Elimina TODOS los datos existentes
Mi recomendaci贸n: Opci贸n B (migrate:fresh --seed), porque:
Garantiza un estado limpio y conocido
Evita problemas de duplicaci贸n
Es la forma est谩ndar de probar seeders completos
Pero cuidado: Si ten茅s datos de producci贸n o datos que quer茅s conservar, NO uses migrate:fresh. En ese caso, us谩 la Opci贸n A.
馃И 4. Prueba del flujo completo
Paso 1: Ejecutar los seeders
# Opci贸n B (recomendada para pruebas) php artisan migrate:fresh --seed
Salida esperada:
INFO Seeding database. 馃尡 Generando datos demo... ✓ 2 gerentes creados. ✓ 4 odont贸logos creados. ✓ 2 recepcionistas creados. ✓ Total: 8 usuarios demo creados. ✓ 60 pacientes demo creados. Generando odontogramas para 60 pacientes... ✓ Odontogramas creados. Generando 200 propuestas... ✓ 200 propuestas creadas. Generando 300 tratamientos realizados... ✓ 300 tratamientos realizados creados. Creando cuentas para 60 pacientes... ✓ 60 cuentas nuevas creadas. Generando 150 pagos... ✓ 150 pagos creados. Generando movimientos para 60 cuentas... ✓ XXX movimientos creados. ✓ Saldos de cuentas actualizados. ✅ Datos demo generados correctamente.
Paso 2: Verificar los datos
php artisan tinker
// Usuarios demo >>> App\Models\User::where('email', 'like', '%@demo.local')->count(); // Esperado: 8 // Pacientes demo >>> App\Models\Paciente::where('prueba', true)->count(); // Esperado: 60 // Propuestas demo >>> App\Models\TratamientoPropuesta::where('prueba', true)->count(); // Esperado: 200 // Tratamientos realizados demo >>> App\Models\TratamientoRealizado::where('prueba', true)->count(); // Esperado: 300 // Pagos demo >>> App\Models\Pago::where('prueba', true)->count(); // Esperado: 150 // Movimientos demo >>> App\Models\Movimiento::where('prueba', true)->count(); // Esperado: ~400-500 // Saldos >>> App\Models\Cuenta::where('prueba', true)->where('saldo', '>', 0)->count(); >>> App\Models\Cuenta::where('prueba', true)->where('saldo', '<', 0)->count(); >>> App\Models\Cuenta::where('prueba', true)->where('saldo', 0)->count();
Paso 3: Probar el dashboard
Iniciar sesi贸n con un gerente:
Email:
gerente1@demo.localPassword:
password
Seleccionar un consultorio en la sesi贸n (si tu flujo lo requiere)
Navegar a
/dashboard/gerencialVerificar:
Los KPIs muestran valores realistas
Los gr谩ficos tienen barras visibles
La tabla de morosos tiene datos
Los tratamientos frecuentes est谩n poblados
Probar exportaciones:
PDF: clic en "PDF" → descarga el archivo
Excel: clic en "Excel" → descarga el archivo
Paso 4: Probar el dashboard del odont贸logo
Cerrar sesi贸n y volver a iniciar con un odont贸logo:
Email:
odontologo1@demo.localPassword:
password
Navegar a
/dashboard/mi-productividadVerificar:
Los KPIs reflejan la actividad del odont贸logo
El feedback personalizado aparece
El gr谩fico de productividad se renderiza
Paso 5: Probar el env铆o de email
# Asegurate de tener MAIL_MAILER=log en .env php artisan dashboard:enviar-reporte php artisan queue:work --once
Verificar:
# Ver los logs tail -n 100 storage/logs/laravel.log | grep -i "reporte\|dashboard" # Ver los adjuntos generados ls -la storage/app/reportes/
Deber铆as ver:
Entradas en el log con el email enviado
Archivos PDF y Excel en
storage/app/reportes/
Paso 6: Probar el comando de m茅tricas
php artisan dashboard:calcular-metricas --todosVerificar:
php artisan tinker >>> App\Models\MetricaMensual::count(); // Esperado: varios registros (uno por consultorio por mes)
馃搵 Checklist de verificaci贸n final
- □
php artisan migrate:fresh --seedcorre sin errores - □
Los 8 usuarios demo existen (2 gerentes, 4 odont贸logos, 2 recepcionistas)
- □
Los 60 pacientes demo existen
- □
Las 200 propuestas demo existen
- □
Los 300 tratamientos realizados existen
- □
Los 150 pagos existen
- □
Los movimientos se generaron (~400-500)
- □
Las cuentas tienen saldos calculados
- □
El dashboard gerencial muestra datos
- □
El dashboard odont贸logo muestra datos
- □
La exportaci贸n PDF funciona
- □
La exportaci贸n Excel funciona
- □
El comando
dashboard:enviar-reporteencola jobs - □
El job de email genera adjuntos
- □
El comando
dashboard:calcular-metricasfunciona
⚠️ Posibles errores y soluciones
| Error | Causa | Soluci贸n |
|---|---|---|
Call to undefined relationship | Falta una relaci贸n | Verificar Paciente::consultorios(), User::consultorios(), etc. |
Column not found | Falta migraci贸n | Ejecutar php artisan migrate |
Unique constraint violation | numero_documento duplicado | Verificar el unique() de Faker |
SQLSTATE: foreign key | Orden de seeders incorrecto | Verificar el orden en DemoSeeder |
| Dashboard vac铆o | No hay datos en el consultorio de sesi贸n | Verificar que el gerente tenga consultorios |
| PDF/Excel vac铆o | Consultorio sin datos | Ejecutar seeders nuevamente o verificar consultorio |
馃摑 Tareas para vos ahora
Actualizar
DatabaseSeedercon el contenido del Paso 1Verificar el
DemoSeederorquestadorEjecutar
migrate:fresh --seed(⚠️ cuidado: borra datos)Verificar los datos con las queries del Paso 2
Probar el dashboard (Paso 3 y 4)
Probar el email (Paso 5)
Probar el comando de m茅tricas (Paso 6)
Comentarios