Ir al contenido principal

Desarrollo de sistema gerencial (parte 7)

 Vamos con la Etapa 12: actualizar DatabaseSeeder y hacer la prueba final del flujo completo.


馃幆 Objetivo de esta etapa

  1. Actualizar DatabaseSeeder para incluir los seeders base + el DemoSeeder

  2. Ejecutar el flujo completo desde cero

  3. Verificar que el dashboard funcione con datos realistas


馃摑 1. Actualizar DatabaseSeeder

php
// 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:

php
// 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)

bash
php artisan db:seed
  • ✅ Conserva datos existentes

  • ⚠️ Los seeders base podr铆an duplicar datos (roles, prestaciones, etc.)

  • ✅ El DemoSeeder limpia 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

bash
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:

  1. Garantiza un estado limpio y conocido

  2. Evita problemas de duplicaci贸n

  3. 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

bash
# Opci贸n B (recomendada para pruebas)
php artisan migrate:fresh --seed

Salida esperada:

text
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

bash
php artisan tinker
php
// 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

  1. Iniciar sesi贸n con un gerente:

    • Email: gerente1@demo.local

    • Password: password

  2. Seleccionar un consultorio en la sesi贸n (si tu flujo lo requiere)

  3. Navegar a /dashboard/gerencial

  4. Verificar:

    • Los KPIs muestran valores realistas

    • Los gr谩ficos tienen barras visibles

    • La tabla de morosos tiene datos

    • Los tratamientos frecuentes est谩n poblados

  5. Probar exportaciones:

    • PDF: clic en "PDF" → descarga el archivo

    • Excel: clic en "Excel" → descarga el archivo


Paso 4: Probar el dashboard del odont贸logo

  1. Cerrar sesi贸n y volver a iniciar con un odont贸logo:

    • Email: odontologo1@demo.local

    • Password: password

  2. Navegar a /dashboard/mi-productividad

  3. Verificar:

    • 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

bash
# Asegurate de tener MAIL_MAILER=log en .env
php artisan dashboard:enviar-reporte
php artisan queue:work --once

Verificar:

bash
# 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

bash
php artisan dashboard:calcular-metricas --todos

Verificar:

bash
php artisan tinker
>>> App\Models\MetricaMensual::count();
// Esperado: varios registros (uno por consultorio por mes)

馃搵 Checklist de verificaci贸n final

  • □

    php artisan migrate:fresh --seed corre 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-reporte encola jobs

  • □

    El job de email genera adjuntos

  • □

    El comando dashboard:calcular-metricas funciona


⚠️ Posibles errores y soluciones

ErrorCausaSoluci贸n
Call to undefined relationshipFalta una relaci贸nVerificar Paciente::consultorios(), User::consultorios(), etc.
Column not foundFalta migraci贸nEjecutar php artisan migrate
Unique constraint violationnumero_documento duplicadoVerificar el unique() de Faker
SQLSTATE: foreign keyOrden de seeders incorrectoVerificar el orden en DemoSeeder
Dashboard vac铆oNo hay datos en el consultorio de sesi贸nVerificar que el gerente tenga consultorios
PDF/Excel vac铆oConsultorio sin datosEjecutar seeders nuevamente o verificar consultorio

馃摑 Tareas para vos ahora

  1. Actualizar DatabaseSeeder con el contenido del Paso 1

  2. Verificar el DemoSeeder orquestador

  3. Ejecutar migrate:fresh --seed (⚠️ cuidado: borra datos)

  4. Verificar los datos con las queries del Paso 2

  5. Probar el dashboard (Paso 3 y 4)

  6. Probar el email (Paso 5)

  7. Probar el comando de m茅tricas (Paso 6)


Comentarios