Ir al contenido principal

Desarrollo de sistema gerencial (parte 2)

¿Empezamos con la migración de metricas_mensuales?

Sí.

Perfecto. Vamos a crear la migración para la tabla metricas_mensuales.


📊 Crear la Migración

bash
php artisan make:migration create_metricas_mensuales_table
php
// database/migrations/xxxx_xx_xx_create_metricas_mensuales_table.php

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    public function up(): void
    {
        Schema::create('metricas_mensuales', function (Blueprint $table) {
            $table->id();

            // Período
            $table->year('anio');
            $table->unsignedTinyInteger('mes');

            // KPIs financieros
            $table->decimal('valor_presupuestos_aceptados', 12, 2)->default(0);
            $table->decimal('deuda_total', 12, 2)->default(0);
            $table->decimal('cobranza_total', 12, 2)->default(0);

            // KPIs de propuestas
            $table->unsignedInteger('propuestas_emitidas')->default(0);
            $table->unsignedInteger('propuestas_aceptadas')->default(0);
            $table->unsignedInteger('propuestas_rechazadas')->default(0);

            // KPIs de pacientes
            $table->unsignedInteger('nuevos_pacientes')->default(0);
            $table->unsignedInteger('pacientes_activos')->default(0);

            // KPIs de tratamientos realizados
            $table->unsignedInteger('tratamientos_realizados')->default(0);

            // KPIs de pagos
            $table->unsignedInteger('pagos_registrados')->default(0);

            // Detalle de tratamientos (JSON con conteo por prestación)
            $table->json('tratamientos_detalle')->nullable();

            // Consultorio (si se quiere segmentar por consultorio)
            $table->foreignId('consultorio_id')->nullable()->constrained()->nullOnDelete();

            $table->timestamps();

            // Índices
            $table->unique(['anio', 'mes', 'consultorio_id']);
            $table->index('anio');
            $table->index('mes');
            $table->index('consultorio_id');
        });
    }

    public function down(): void
    {
        Schema::dropIfExists('metricas_mensuales');
    }
};

🚀 Ejecutar la Migración

bash
php artisan migrate

📝 Modelo MetricaMensual

php
// app/Models/MetricaMensual.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;

class MetricaMensual extends Model
{
    protected $table = 'metricas_mensuales';

    protected $fillable = [
        'anio',
        'mes',
        'valor_presupuestos_aceptados',
        'deuda_total',
        'cobranza_total',
        'propuestas_emitidas',
        'propuestas_aceptadas',
        'propuestas_rechazadas',
        'nuevos_pacientes',
        'pacientes_activos',
        'tratamientos_realizados',
        'pagos_registrados',
        'tratamientos_detalle',
        'consultorio_id',
    ];

    protected $casts = [
        'valor_presupuestos_aceptados' => 'decimal:2',
        'deuda_total' => 'decimal:2',
        'cobranza_total' => 'decimal:2',
        'propuestas_emitidas' => 'integer',
        'propuestas_aceptadas' => 'integer',
        'propuestas_rechazadas' => 'integer',
        'nuevos_pacientes' => 'integer',
        'pacientes_activos' => 'integer',
        'tratamientos_realizados' => 'integer',
        'pagos_registrados' => 'integer',
        'tratamientos_detalle' => 'array',
        'consultorio_id' => 'integer',
    ];

    public function consultorio(): BelongsTo
    {
        return $this->belongsTo(Consultorio::class);
    }
}

Verificación

bash
php artisan tinker
php
>>> Schema::getColumnListing('metricas_mensuales');

Deberías ver todas las columnas que definiste.


¿Migración ejecutada sin errores?

Migración ejecutada sin errores.

Excelente. La tabla metricas_mensuales ya está en la base de datos.


Estado Actual

ComponenteEstado
Spatie/laravel-permission✅ Instalado y configurado
Migraciones de permisos✅ Ejecutadas
Seeder de roles y permisos✅ Ejecutado
Tabla metricas_mensuales✅ Creada
Modelo MetricaMensual✅ Creado

📋 Próximos Pasos

Ahora podemos continuar con:

OrdenMóduloEstado
1Roles y permisos✅ Completado
2Tabla metricas_mensuales✅ Completado
3Service DashboardService⏳ Pendiente
4Dashboard Gerencial (backend + frontend)⏳ Pendiente
5Dashboard Odontólogo⏳ Pendiente
6Exportación PDF/Excel⏳ Pendiente
7Reporte automático por email⏳ Pendiente

🚀 ¿Empezamos con el Service DashboardService?

Este servicio va a contener todos los métodos para:

  • Calcular KPIs (valor de presupuestos aceptados, deuda, cobranza, etc.)

  • Obtener evolución de facturación

  • Obtener tratamientos más frecuentes

  • Obtener productividad por odontólogo

  • Obtener datos de morosidad (top 5 morosos, deuda por rango de días)

  • Obtener datos demográficos

  • Calcular y cachear métricas mensuales

¿Arrancamos?

 

Comentarios