Appearance
M02 - Modelo de Datos: Cotización en Punto de Venta
| Campo | Valor |
|---|---|
| Módulo | M02 - Cotización |
| Estado | Borrador |
| Última actualización | 2026-03-25 |
Diagrama Entidad-Relación
Entidades
Recetario
Laboratorio magistral que produce los preparados y administra el catálogo de productos y precios.
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| id | UUID | Sí | Identificador único del recetario |
| nombre | VARCHAR(200) | Sí | Nombre comercial del recetario |
| rut | VARCHAR(12) | Sí | RUT de la empresa |
| direccion | VARCHAR(300) | Sí | Dirección física del laboratorio |
| telefono | VARCHAR(20) | No | Teléfono de contacto |
| VARCHAR(100) | No | Correo electrónico de contacto | |
| activo | BOOLEAN | Sí | Indica si el recetario está activo en el sistema |
| created_at | TIMESTAMP | Sí | Fecha de creación del registro |
| updated_at | TIMESTAMP | Sí | Fecha de última modificación |
Cliente
Farmacia, clínica u hospital que tiene convenio con un recetario y utiliza el cotizador.
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| id | UUID | Sí | Identificador único del cliente |
| nombre | VARCHAR(200) | Sí | Nombre comercial del cliente |
| tipo | VARCHAR(20) | Sí | Tipo de cliente: farmacia, clinica, hospital |
| rut | VARCHAR(12) | Sí | RUT de la empresa |
| direccion | VARCHAR(300) | No | Dirección física |
| telefono | VARCHAR(20) | No | Teléfono de contacto |
| VARCHAR(100) | No | Correo electrónico de contacto | |
| activo | BOOLEAN | Sí | Indica si el cliente está activo en el sistema |
| created_at | TIMESTAMP | Sí | Fecha de creación del registro |
| updated_at | TIMESTAMP | Sí | Fecha de última modificación |
Convenio
Relación comercial entre un recetario y un cliente, con vigencia y estado.
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| id | UUID | Sí | Identificador único del convenio |
| recetario_id | UUID (FK) | Sí | Referencia al recetario que ofrece el servicio |
| cliente_id | UUID (FK) | Sí | Referencia al cliente (farmacia/clínica) |
| nombre | VARCHAR(200) | Sí | Nombre descriptivo del convenio |
| fecha_inicio | DATE | Sí | Fecha de inicio de vigencia del convenio |
| fecha_fin | DATE | No | Fecha de fin de vigencia (null = indefinido) |
| estado | VARCHAR(20) | Sí | Estado del convenio: activo, suspendido, finalizado |
| created_at | TIMESTAMP | Sí | Fecha de creación del registro |
| updated_at | TIMESTAMP | Sí | Fecha 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
activopermiten cotizar.
Producto
Preparado magistral estandarizado que forma parte del catálogo de un recetario.
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| id | UUID | Sí | Identificador único del producto |
| recetario_id | UUID (FK) | Sí | Referencia al recetario propietario del catálogo |
| codigo | VARCHAR(50) | Sí | Código interno del producto en el ERP del recetario |
| activo_principio | VARCHAR(200) | Sí | Principio activo principal (ej. "Ciclosporina") |
| sinonimos | TEXT | No | Nombres alternativos o sinónimos, separados por coma |
| concentracion | VARCHAR(50) | Sí | Concentración del principio activo (ej. "1%", "250mg") |
| unidad_medida | VARCHAR(20) | Sí | Unidad de medida base (ej. "ml", "g", "unidad") |
| volumen_peso | VARCHAR(50) | No | Volumen o peso de la presentación (ej. "10ml", "30g") |
| forma_farmaceutica | VARCHAR(100) | Sí | Forma farmacéutica (ej. "colirio", "crema", "cápsula", "jarabe") |
| presentacion | VARCHAR(100) | No | Descripción de la presentación final (ej. "frasco gotario") |
| linea_fabricacion | VARCHAR(100) | Sí | Línea de fabricación (ej. "oftalmología", "dermatología", "veterinaria") |
| tipo_producto | VARCHAR(20) | Sí | Tipo: estandar, variable, dinamico |
| nombre_legible | VARCHAR(300) | Sí | Nombre completo generado (ej. "Ciclosporina 1% 10ml colirio") |
| vigente | BOOLEAN | Sí | Indica si el producto está vigente en el catálogo |
| created_at | TIMESTAMP | Sí | Fecha de creación del registro |
| updated_at | TIMESTAMP | Sí | Fecha 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.
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| id | UUID | Sí | Identificador único del registro de precio |
| producto_id | UUID (FK) | Sí | Referencia al producto |
| convenio_id | UUID (FK) | Sí | Referencia al convenio |
| precio_neto | DECIMAL(12,2) | Sí | Precio neto base que el recetario cobra al cliente |
| factor_margen | DECIMAL(5,2) | No | Factor de margen sugerido (ej. 1.20 para 20%, 1.50 para 50%) |
| precio_final | DECIMAL(12,2) | Sí | Precio final visible en el punto de venta |
| vigencia_desde | DATE | Sí | Fecha desde la cual aplica este precio |
| vigencia_hasta | DATE | No | Fecha hasta la cual aplica este precio (null = vigente indefinidamente) |
| activo | BOOLEAN | Sí | Indica si este registro de precio es el vigente |
| created_at | TIMESTAMP | Sí | Fecha de creación del registro |
| updated_at | TIMESTAMP | Sí | Fecha 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_margenes 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.
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| id | UUID | Sí | Identificador único de la cotización |
| convenio_id | UUID (FK) | Sí | Referencia al convenio bajo el cual se genera la cotización |
| usuario_id | UUID (FK) | Sí | Referencia al usuario que creó la cotización |
| numero_cotizacion | VARCHAR(20) | Sí | Número correlativo legible (ej. "COT-2026-00001") |
| fecha | DATE | Sí | Fecha de emisión de la cotización |
| estado | VARCHAR(20) | Sí | Estado: borrador, emitida, confirmada, expirada, cancelada |
| vigencia_hasta | DATE | No | Fecha límite de validez de la cotización |
| total | DECIMAL(12,2) | Sí | Monto total de la cotización |
| created_at | TIMESTAMP | Sí | Fecha de creación del registro |
| updated_at | TIMESTAMP | Sí | Fecha de última modificación |
Estados posibles:
| Estado | Descripción |
|---|---|
| borrador | Cotización en proceso de armado, aún no emitida |
| emitida | Cotización generada y entregada al cliente como voucher |
| confirmada | El cliente confirmó la cotización (puede derivar a orden B2B) |
| expirada | La cotización superó su fecha de vigencia sin ser confirmada |
| cancelada | La cotización fue cancelada por el usuario |
LineaCotizacion
Detalle de cada producto incluido en una cotización.
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| id | UUID | Sí | Identificador único de la línea |
| cotizacion_id | UUID (FK) | Sí | Referencia a la cotización padre |
| producto_id | UUID (FK) | Sí | Referencia al producto cotizado |
| cantidad | DECIMAL(10,2) | Sí | Cantidad solicitada (unidades, gramos, ml según tipo) |
| unidad | VARCHAR(20) | Sí | Unidad de la cantidad (ej. "unidad", "g", "ml") |
| precio_unitario | DECIMAL(12,2) | Sí | Precio unitario al momento de cotizar |
| subtotal | DECIMAL(12,2) | Sí | Subtotal de la línea: cantidad x precio_unitario |
| created_at | TIMESTAMP | Sí | Fecha de creación del registro |
Reglas de negocio:
- El
precio_unitariose 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
cantidades DECIMAL para soportar productos variables (ej. 30.5 gramos de crema), aunque para productos estándar siempre será un entero.
Relaciones Resumidas
| Relación | Cardinalidad | Descripción |
|---|---|---|
| Recetario - Convenio | 1:N | Un recetario tiene múltiples convenios |
| Cliente - Convenio | 1:N | Un cliente participa en múltiples convenios |
| Recetario - Producto | 1:N | Un recetario administra múltiples productos |
| Convenio - PrecioConvenio | 1:N | Un convenio define múltiples precios |
| Producto - PrecioConvenio | 1:N | Un producto tiene múltiples precios (por convenio y por historial) |
| Convenio - Cotización | 1:N | Un convenio genera múltiples cotizaciones |
| Cotización - LineaCotizacion | 1:N | Una cotización contiene múltiples líneas de producto |
| Producto - LineaCotizacion | 1:N | Un 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_atyupdated_atpara auditoría básica. - Soft delete: No se eliminan registros físicamente; se marcan como inactivos (
activo = falseovigente = false) para mantener trazabilidad. - Precio congelado: El precio en
LineaCotizacionse captura al momento de crear la línea. Cambios posteriores enPrecioConveniono afectan cotizaciones ya emitidas.