clinica-dental/docs/01-epicas/DENTAL-006-presupuestos.md
rckrdmrd 0cb74ec2c1 [SPRINT-6] docs: Agregar documentacion y reportes
- Epicas documentadas
- Reporte de ejecucion Sprint 6

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-10 08:53:42 -06:00

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

  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

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