Skip to content

M02 - Modelo de Datos: Cotización en Punto de Venta

CampoValor
MóduloM02 - Cotización
EstadoBorrador
Última actualización2026-03-25

Diagrama Entidad-Relación


Entidades

Recetario

Laboratorio magistral que produce los preparados y administra el catálogo de productos y precios.

CampoTipoObligatorioDescripción
idUUIDIdentificador único del recetario
nombreVARCHAR(200)Nombre comercial del recetario
rutVARCHAR(12)RUT de la empresa
direccionVARCHAR(300)Dirección física del laboratorio
telefonoVARCHAR(20)NoTeléfono de contacto
emailVARCHAR(100)NoCorreo electrónico de contacto
activoBOOLEANIndica si el recetario está activo en el sistema
created_atTIMESTAMPFecha de creación del registro
updated_atTIMESTAMPFecha de última modificación

Cliente

Farmacia, clínica u hospital que tiene convenio con un recetario y utiliza el cotizador.

CampoTipoObligatorioDescripción
idUUIDIdentificador único del cliente
nombreVARCHAR(200)Nombre comercial del cliente
tipoVARCHAR(20)Tipo de cliente: farmacia, clinica, hospital
rutVARCHAR(12)RUT de la empresa
direccionVARCHAR(300)NoDirección física
telefonoVARCHAR(20)NoTeléfono de contacto
emailVARCHAR(100)NoCorreo electrónico de contacto
activoBOOLEANIndica si el cliente está activo en el sistema
created_atTIMESTAMPFecha de creación del registro
updated_atTIMESTAMPFecha de última modificación

Convenio

Relación comercial entre un recetario y un cliente, con vigencia y estado.

CampoTipoObligatorioDescripción
idUUIDIdentificador único del convenio
recetario_idUUID (FK)Referencia al recetario que ofrece el servicio
cliente_idUUID (FK)Referencia al cliente (farmacia/clínica)
nombreVARCHAR(200)Nombre descriptivo del convenio
fecha_inicioDATEFecha de inicio de vigencia del convenio
fecha_finDATENoFecha de fin de vigencia (null = indefinido)
estadoVARCHAR(20)Estado del convenio: activo, suspendido, finalizado
created_atTIMESTAMPFecha de creación del registro
updated_atTIMESTAMPFecha de última modificación

Reglas de negocio:

  • Un recetario puede tener múltiples convenios con distintos clientes.
  • Un cliente puede tener múltiples convenios con distintos recetarios.
  • Solo los convenios en estado activo permiten cotizar.

Producto

Preparado magistral estandarizado que forma parte del catálogo de un recetario.

CampoTipoObligatorioDescripción
idUUIDIdentificador único del producto
recetario_idUUID (FK)Referencia al recetario propietario del catálogo
codigoVARCHAR(50)Código interno del producto en el ERP del recetario
activo_principioVARCHAR(200)Principio activo principal (ej. "Ciclosporina")
sinonimosTEXTNoNombres alternativos o sinónimos, separados por coma
concentracionVARCHAR(50)Concentración del principio activo (ej. "1%", "250mg")
unidad_medidaVARCHAR(20)Unidad de medida base (ej. "ml", "g", "unidad")
volumen_pesoVARCHAR(50)NoVolumen o peso de la presentación (ej. "10ml", "30g")
forma_farmaceuticaVARCHAR(100)Forma farmacéutica (ej. "colirio", "crema", "cápsula", "jarabe")
presentacionVARCHAR(100)NoDescripción de la presentación final (ej. "frasco gotario")
linea_fabricacionVARCHAR(100)Línea de fabricación (ej. "oftalmología", "dermatología", "veterinaria")
tipo_productoVARCHAR(20)Tipo: estandar, variable, dinamico
nombre_legibleVARCHAR(300)Nombre completo generado (ej. "Ciclosporina 1% 10ml colirio")
vigenteBOOLEANIndica si el producto está vigente en el catálogo
created_atTIMESTAMPFecha de creación del registro
updated_atTIMESTAMPFecha de última modificación

Tipos de producto:

  • estandar: Producto con presentación fija. La cantidad se mide en unidades enteras (ej. colirio 10ml, se compran 1, 2, 3 unidades).
  • variable: Producto con composición fija pero cantidad flexible. Se costea por unidad base: gramos para cremas, cápsulas individuales, mililitros para jarabes.
  • dinamico: Producto que no está en el catálogo regular y requiere cotización manual (genera ticket de excepción).

Índice único: (recetario_id, codigo) -- no puede haber dos productos con el mismo código dentro del mismo recetario.


PrecioConvenio

Precio de un producto para un convenio específico, con vigencia y trazabilidad.

CampoTipoObligatorioDescripción
idUUIDIdentificador único del registro de precio
producto_idUUID (FK)Referencia al producto
convenio_idUUID (FK)Referencia al convenio
precio_netoDECIMAL(12,2)Precio neto base que el recetario cobra al cliente
factor_margenDECIMAL(5,2)NoFactor de margen sugerido (ej. 1.20 para 20%, 1.50 para 50%)
precio_finalDECIMAL(12,2)Precio final visible en el punto de venta
vigencia_desdeDATEFecha desde la cual aplica este precio
vigencia_hastaDATENoFecha hasta la cual aplica este precio (null = vigente indefinidamente)
activoBOOLEANIndica si este registro de precio es el vigente
created_atTIMESTAMPFecha de creación del registro
updated_atTIMESTAMPFecha de última modificación

Reglas de negocio:

  • Para un mismo producto y convenio, solo puede haber un precio activo a la vez.
  • Al actualizar un precio, el registro anterior se marca como inactivo (activo = false) y se crea uno nuevo. Esto garantiza la trazabilidad histórica.
  • El factor_margen es configuración interna del recetario o de la farmacia y no se expone en el voucher del paciente.

Cotización

Documento de cotización generado por una farmacia en el punto de venta.

CampoTipoObligatorioDescripción
idUUIDIdentificador único de la cotización
convenio_idUUID (FK)Referencia al convenio bajo el cual se genera la cotización
usuario_idUUID (FK)Referencia al usuario que creó la cotización
numero_cotizacionVARCHAR(20)Número correlativo legible (ej. "COT-2026-00001")
fechaDATEFecha de emisión de la cotización
estadoVARCHAR(20)Estado: borrador, emitida, confirmada, expirada, cancelada
vigencia_hastaDATENoFecha límite de validez de la cotización
totalDECIMAL(12,2)Monto total de la cotización
created_atTIMESTAMPFecha de creación del registro
updated_atTIMESTAMPFecha de última modificación

Estados posibles:

EstadoDescripción
borradorCotización en proceso de armado, aún no emitida
emitidaCotización generada y entregada al cliente como voucher
confirmadaEl cliente confirmó la cotización (puede derivar a orden B2B)
expiradaLa cotización superó su fecha de vigencia sin ser confirmada
canceladaLa cotización fue cancelada por el usuario

LineaCotizacion

Detalle de cada producto incluido en una cotización.

CampoTipoObligatorioDescripción
idUUIDIdentificador único de la línea
cotizacion_idUUID (FK)Referencia a la cotización padre
producto_idUUID (FK)Referencia al producto cotizado
cantidadDECIMAL(10,2)Cantidad solicitada (unidades, gramos, ml según tipo)
unidadVARCHAR(20)Unidad de la cantidad (ej. "unidad", "g", "ml")
precio_unitarioDECIMAL(12,2)Precio unitario al momento de cotizar
subtotalDECIMAL(12,2)Subtotal de la línea: cantidad x precio_unitario
created_atTIMESTAMPFecha de creación del registro

Reglas de negocio:

  • El precio_unitario se congela al momento de agregar el producto a la cotización. Si el precio del convenio cambia después, la cotización ya emitida mantiene el precio original.
  • El campo cantidad es DECIMAL para soportar productos variables (ej. 30.5 gramos de crema), aunque para productos estándar siempre será un entero.

Relaciones Resumidas

RelaciónCardinalidadDescripción
Recetario - Convenio1:NUn recetario tiene múltiples convenios
Cliente - Convenio1:NUn cliente participa en múltiples convenios
Recetario - Producto1:NUn recetario administra múltiples productos
Convenio - PrecioConvenio1:NUn convenio define múltiples precios
Producto - PrecioConvenio1:NUn producto tiene múltiples precios (por convenio y por historial)
Convenio - Cotización1:NUn convenio genera múltiples cotizaciones
Cotización - LineaCotizacion1:NUna cotización contiene múltiples líneas de producto
Producto - LineaCotizacion1:NUn producto puede aparecer en múltiples cotizaciones

Notas Técnicas

  • Motor de base de datos sugerido: PostgreSQL vía Supabase (según lo definido en reunión 2026-03-24).
  • IDs: Se utilizan UUID v4 como identificadores primarios para facilitar la integración futura entre módulos y evitar colisiones.
  • Timestamps: Todos los registros incluyen created_at y updated_at para auditoría básica.
  • Soft delete: No se eliminan registros físicamente; se marcan como inactivos (activo = false o vigente = false) para mantener trazabilidad.
  • Precio congelado: El precio en LineaCotizacion se captura al momento de crear la línea. Cambios posteriores en PrecioConvenio no afectan cotizaciones ya emitidas.