Ir al contenido

Configurar Presupuesto

Control detallado de partidas presupuestarias y tracking de gastos vs. estimaciones.

  • Tipo: ProjectBudgetItem
  • Tabla: project_budget_items
  • Vista: Tab “Presupuesto” en detalle del proyecto

Cada item del presupuesto incluye:

interface ProjectBudgetItem {
id: string;
project_id: string;
milestone_id?: string; // Asociar a hito específico
category: string; // Categoría del gasto
name: string; // Nombre descriptivo
description?: string; // Detalles adicionales
estimated_cost: number; // Coste estimado
actual_cost: number; // Coste real
is_approved: boolean; // Aprobación requerida
approved_by?: string; // Quién aprobó
approved_at?: string; // Cuándo se aprobó
}
  • Recursos Humanos
  • Equipamiento
  • Software y Licencias
  • Materiales
  • Servicios Externos
  • Marketing
  • Contingencia
  • Otros
  1. Se crea partida con is_approved: false
  2. Requiere aprobación de manager o admin
  3. Al aprobar: se registra approved_by y approved_at
  4. Solo partidas aprobadas se suman a budget_used

Muestra 3 cards principales:

  1. Presupuesto Total: Monto asignado
  2. Gastado: Suma de actual_cost de items aprobados
  3. Restante: Diferencia, color rojo si es negativo
  • Verde: Dentro del presupuesto (0-80%)
  • Amarillo: Aproximándose al límite (80-100%)
  • Rojo: Sobre presupuesto (>100%)

Las partidas pueden asociarse a hitos específicos:

  • Permite tracking de presupuesto por fase
  • milestone_id vincula item a hito
  • Cálculo de budget_used del hito automático
  • Vista consolidada por hito y global

El sistema genera alertas cuando:

  • ⚠️ Presupuesto usado > 80%
  • 🚨 Presupuesto excedido
  • 📊 Diferencia significativa entre estimado y real
Cálculo de presupuesto usado
// Cálculo automático en ProjectDetail.tsx
const budgetPercentage = project.budget_total > 0
? (project.budget_used / project.budget_total) * 100
: 0;
// Suma de costes reales de items aprobados
const totalBudgetUsed = project.budget_items
?.filter(item => item.is_approved)
.reduce((sum, item) => sum + item.actual_cost, 0) || 0;
// Actualización en proyecto
await supabase
.from('projects')
.update({ budget_used: totalBudgetUsed })
.eq('id', projectId);