- Epicas documentadas - Reporte de ejecucion Sprint 6 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
9.1 KiB
9.1 KiB
DENTAL-006: Presupuestos
Metadata
- Codigo: DENTAL-006
- Modulo: Presupuestos
- Prioridad: P0
- Estado: DDL Completado
- Fase: 2 - Tratamientos
Descripcion
Sistema de presupuestos dentales: creacion de planes de tratamiento con costos, lineas de presupuesto por procedimiento y pieza, descuentos, planes de pago, y seguimiento de aceptacion.
Objetivos
- Presupuestos detallados por paciente
- Lineas por procedimiento y pieza
- Descuentos globales y por linea
- Opciones de financiamiento
- Seguimiento de estado
Alcance
Incluido
- Presupuestos con numero correlativo
- Lineas con tratamiento, pieza, cantidad, precio
- Descuentos porcentuales y en monto
- Fecha de vencimiento
- Estados: pendiente, aprobado, rechazado, vencido
- Plan de pago (enganche + mensualidades)
- Impresion/PDF del presupuesto
Excluido
- Firma electronica
- Consentimiento informado integrado
- Generacion automatica desde odontograma
Modelo de Datos
Tablas
dental.presupuestos
- id, tenant_id, patient_id, odontologo_id
- numero (correlativo)
- fecha, fecha_vencimiento
- estado (pendiente, aprobado, rechazado, vencido)
- subtotal, descuento_porcentaje, descuento_monto, total
- requiere_financiamiento, enganche, numero_pagos, monto_pago
- notas
dental.presupuesto_lineas
- id, tenant_id, presupuesto_id
- tratamiento_id, pieza_id
- descripcion
- cantidad, precio_unitario, descuento, subtotal
- sequence
Estados del Presupuesto
pendiente ──► aprobado ──► en_tratamiento ──► completado
│
├──► rechazado
│
└──► vencido (automatico por fecha)
| Estado | Descripcion |
|---|---|
| pendiente | Presentado, esperando decision |
| aprobado | Aceptado por el paciente |
| rechazado | Rechazado por el paciente |
| vencido | Expiro la vigencia |
| en_tratamiento | Tratamientos en curso |
| completado | Todos los tratamientos finalizados |
Endpoints API
| Metodo | Endpoint | Descripcion |
|---|---|---|
| GET | /presupuestos | Listar presupuestos |
| GET | /presupuestos/:id | Detalle |
| POST | /presupuestos | Crear presupuesto |
| PUT | /presupuestos/:id | Actualizar |
| DELETE | /presupuestos/:id | Eliminar (solo pendientes) |
| PUT | /presupuestos/:id/aprobar | Aprobar |
| PUT | /presupuestos/:id/rechazar | Rechazar |
| GET | /patients/:id/presupuestos | Presupuestos del paciente |
| GET | /presupuestos/:id/pdf | Generar PDF |
| POST | /presupuestos/:id/lineas | Agregar linea |
| PUT | /presupuestos/:id/lineas/:lineaId | Actualizar linea |
| DELETE | /presupuestos/:id/lineas/:lineaId | Eliminar linea |
Interfaz del Servicio
interface PresupuestosService {
getAll(filters?: PresupuestoFilters): Promise<Presupuesto[]>;
getById(id: string): Promise<Presupuesto>;
create(data: CreatePresupuesto): Promise<Presupuesto>;
addLinea(presupuestoId: string, linea: CreateLinea): Promise<PresupuestoLinea>;
removeLinea(presupuestoId: string, lineaId: string): Promise<void>;
aprobar(id: string): Promise<Presupuesto>;
rechazar(id: string, motivo?: string): Promise<Presupuesto>;
generarPDF(id: string): Promise<Buffer>;
calcularTotales(id: string): Promise<PresupuestoTotales>;
}
interface CreatePresupuesto {
patientId: string;
odontologoId: string;
fechaVencimiento?: Date;
descuentoPorcentaje?: number;
requiereFinanciamiento?: boolean;
enganche?: number;
numeroPagos?: number;
notas?: string;
}
interface CreateLinea {
tratamientoId: string;
piezaId?: string;
descripcion?: string;
cantidad: number;
precioUnitario: number;
descuento?: number;
}
Flujos
Crear Presupuesto
1. Odontologo realiza exploracion
2. Identifica tratamientos necesarios
3. Crear nuevo presupuesto
4. Agregar lineas:
- Seleccionar tratamiento del catalogo
- Asociar pieza dental (si aplica)
- Ajustar precio si es diferente al base
- Aplicar descuento por linea
5. Aplicar descuento global (si aplica)
6. Configurar plan de pago (si requiere)
7. Guardar presupuesto
8. Presentar al paciente (imprimir o enviar)
Aprobar Presupuesto
1. Paciente acepta presupuesto
2. Marcar como "aprobado"
3. Si requiere financiamiento:
- Registrar enganche recibido
- Generar calendario de pagos
4. Crear tratamientos a partir de lineas
5. Agendar primera cita
Calculo de Totales
function calcularTotales(presupuesto: Presupuesto): PresupuestoTotales {
// Sumar lineas
const subtotal = presupuesto.lineas.reduce((sum, linea) => {
const lineaTotal = linea.cantidad * linea.precioUnitario;
const lineaDescuento = lineaTotal * (linea.descuento / 100);
return sum + (lineaTotal - lineaDescuento);
}, 0);
// Descuento global
let descuentoMonto = 0;
if (presupuesto.descuentoPorcentaje > 0) {
descuentoMonto = subtotal * (presupuesto.descuentoPorcentaje / 100);
}
const total = subtotal - descuentoMonto;
// Plan de pago
let montoPago = 0;
if (presupuesto.requiereFinanciamiento && presupuesto.numeroPagos > 0) {
const saldo = total - (presupuesto.enganche || 0);
montoPago = saldo / presupuesto.numeroPagos;
}
return { subtotal, descuentoMonto, total, montoPago };
}
Formato PDF
┌─────────────────────────────────────────────────────────┐
│ [LOGO] CLINICA DENTAL XYZ │
│ RFC: ABC123456789 │
│ Direccion: Calle 123, Ciudad │
├─────────────────────────────────────────────────────────┤
│ PRESUPUESTO No. PRE-2026-0001 │
│ Fecha: 07/01/2026 Vigencia: 07/02/2026 │
├─────────────────────────────────────────────────────────┤
│ PACIENTE: Juan Perez Garcia │
│ ODONTOLOGO: Dr. Maria Lopez │
├─────────────────────────────────────────────────────────┤
│ # │ Tratamiento │ Pieza │ Cant │ P.U. │Total │
│────┼──────────────────────┼───────┼──────┼───────┼──────│
│ 1 │ Limpieza dental │ - │ 1 │ $500 │ $500 │
│ 2 │ Resina simple │ 36 │ 1 │ $600 │ $600 │
│ 3 │ Endodoncia unirrad. │ 16 │ 1 │$2,500 │$2,500│
│ 4 │ Corona zirconia │ 16 │ 1 │$6,000 │$6,000│
├─────────────────────────────────────────────────────────┤
│ Subtotal: $9,600 │
│ Descuento (10%): -$960 │
│ TOTAL: $8,640 │
├─────────────────────────────────────────────────────────┤
│ PLAN DE PAGO: │
│ Enganche: $2,640 12 pagos de: $500 │
├─────────────────────────────────────────────────────────┤
│ Notas: │
│ - Vigencia de 30 dias │
│ - Precios incluyen materiales │
│ - No incluye radiografias adicionales │
└─────────────────────────────────────────────────────────┘
Entregables
| Entregable | Estado | Archivo |
|---|---|---|
| DDL presupuestos | Completado | database/schemas/01-dental-schema-ddl.sql |
| presupuestos.module.ts | Pendiente | backend/modules/presupuestos/ |
| presupuestos.service.ts | Pendiente | backend/services/ |
| pdf.generator.ts | Pendiente | backend/services/ |
| PresupuestoForm.tsx | Pendiente | frontend/components/ |
| PresupuestoViewer.tsx | Pendiente | frontend/components/ |
Dependencias
Depende de
- clinica.patients (erp-clinicas)
- DENTAL-001 (Odontograma - piezas)
- DENTAL-002 (Tratamientos - catalogo)
Bloquea a
- Facturacion
- Reportes financieros
Criterios de Aceptacion
- CRUD de presupuestos
- Agregar/quitar lineas
- Calculos correctos
- Descuentos funcionan
- Estados se actualizan
- Plan de pago se configura
- PDF se genera correctamente
- Vencimiento automatico
Ultima actualizacion: 2026-01-07