# 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 1. Presupuestos detallados por paciente 2. Lineas por procedimiento y pieza 3. Descuentos globales y por linea 4. Opciones de financiamiento 5. 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 ```typescript interface PresupuestosService { getAll(filters?: PresupuestoFilters): Promise; getById(id: string): Promise; create(data: CreatePresupuesto): Promise; addLinea(presupuestoId: string, linea: CreateLinea): Promise; removeLinea(presupuestoId: string, lineaId: string): Promise; aprobar(id: string): Promise; rechazar(id: string, motivo?: string): Promise; generarPDF(id: string): Promise; calcularTotales(id: string): Promise; } 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 ```typescript 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