De
g.cze
¿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
| Componente | Estado |
|---|---|
| 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:
| Orden | Módulo | Estado |
|---|---|---|
| 1 | Roles y permisos | ✅ Completado |
| 2 | Tabla metricas_mensuales | ✅ Completado |
| 3 | Service DashboardService | ⏳ Pendiente |
| 4 | Dashboard Gerencial (backend + frontend) | ⏳ Pendiente |
| 5 | Dashboard Odontólogo | ⏳ Pendiente |
| 6 | Exportación PDF/Excel | ⏳ Pendiente |
| 7 | Reporte 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?
- Obtener enlace
- X
- Correo electrónico
- Otras aplicaciones
- Obtener enlace
- X
- Correo electrónico
- Otras aplicaciones
Comentarios