- Epicas documentadas - Reporte de ejecucion Sprint 6 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
262 lines
9.1 KiB
Markdown
262 lines
9.1 KiB
Markdown
# 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<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
|
|
|
|
```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
|