Appearance
M03 B2B -- Modelo de Datos
| Campo | Valor |
|---|---|
| Estado | Borrador |
| Prioridad | Fase 1 |
| Última actualización | 2026-03-25 |
| Módulo | M03 B2B |
1. Diagrama entidad-relación
2. Detalle de entidades
2.1 CONVENIO
Representa el acuerdo comercial entre un recetario y un cliente (farmacia, clínica u hospital).
| Campo | Tipo | Nulo | Descripción |
|---|---|---|---|
| id | UUID | No | Identificador único del convenio |
| id_recetario | UUID | No | Referencia al recetario que ofrece el servicio |
| id_cliente | UUID | No | Referencia al cliente (farmacia/clínica) |
| razon_social_cliente | VARCHAR(255) | No | Razón social del cliente |
| rut_cliente | VARCHAR(20) | No | RUT del cliente |
| contacto_principal | VARCHAR(255) | No | Nombre del contacto principal del cliente |
| email_contacto | VARCHAR(255) | No | Email del contacto principal |
| telefono_contacto | VARCHAR(20) | Sí | Teléfono del contacto principal |
| descuento_pactado | DECIMAL(5,2) | Sí | Porcentaje de descuento global pactado (ej: 25.00, 30.00) |
| fecha_inicio | DATE | No | Fecha de inicio de vigencia del convenio |
| fecha_fin | DATE | Sí | Fecha de fin de vigencia (NULL = indefinido) |
| estado | VARCHAR(20) | No | Estado del convenio: Activo, Suspendido, Finalizado |
| condiciones_comerciales | JSONB | Sí | Condiciones adicionales en formato flexible (SLA, reglas de aprobación, productos habilitados) |
| created_at | TIMESTAMP | No | Fecha de creación del registro |
| updated_at | TIMESTAMP | No | Fecha de última modificación |
| created_by | VARCHAR(255) | No | Usuario que creó el convenio |
Índices sugeridos: id_recetario, id_cliente, estado, rut_cliente.
2.2 SOLICITUD
Representa un pedido o conjunto de recetas cargadas por un cliente convenio.
| Campo | Tipo | Nulo | Descripción |
|---|---|---|---|
| id | UUID | No | Identificador único de la solicitud |
| id_convenio | UUID | No | Convenio bajo el cual se carga la solicitud |
| id_cliente | UUID | No | Cliente que carga la solicitud |
| id_externo | VARCHAR(100) | Sí | Identificador propio del cliente para trazabilidad cruzada |
| id_lote | VARCHAR(100) | Sí | Identificador del lote si la solicitud viene de carga masiva |
| canal_entrada | VARCHAR(20) | No | Canal por el que ingresó: manual, masivo, api |
| estado_actual | VARCHAR(30) | No | Estado vigente: Cargado, Validado, Cotizado, Aprobado, Rechazado, EnProduccion, Despachado, Entregado, Observado |
| fecha_carga | TIMESTAMP | No | Fecha y hora de carga |
| fecha_estimada_entrega | DATE | Sí | Fecha estimada de entrega al cliente |
| monto_total | DECIMAL(12,2) | Sí | Monto total calculado de la solicitud |
| observaciones_generales | TEXT | Sí | Observaciones generales de la solicitud |
| id_orden_produccion | UUID | Sí | Referencia a la orden de producción en M04 (cuando se deriva) |
| created_at | TIMESTAMP | No | Fecha de creación del registro |
| updated_at | TIMESTAMP | No | Fecha de última modificación |
| created_by | VARCHAR(255) | No | Usuario que creó la solicitud |
Índices sugeridos: id_convenio, id_cliente, estado_actual, fecha_carga, id_externo, id_lote.
Estados válidos:
| Estado | Descripción |
|---|---|
| Cargado | Solicitud recibida, pendiente de validación |
| Validado | Información verificada por la ejecutiva |
| Cotizado | Precio calculado según condiciones del convenio |
| Aprobado | Cliente o regla automática aprueba la cotización |
| Rechazado | Solicitud rechazada (por el cliente o por el recetario) |
| EnProduccion | Solicitud derivada a M04 Producción |
| Despachado | Producto terminado y despachado |
| Entregado | Cliente confirma recepción |
| Observado | Faltan datos, receta ilegible u otro problema |
2.3 LINEA_SOLICITUD
Cada línea representa un producto individual dentro de una solicitud.
| Campo | Tipo | Nulo | Descripción |
|---|---|---|---|
| id | UUID | No | Identificador único de la línea |
| id_solicitud | UUID | No | Solicitud a la que pertenece |
| codigo_producto | VARCHAR(50) | Sí | Código interno del producto en el catálogo del recetario |
| nombre_producto | VARCHAR(255) | No | Nombre del producto o preparación solicitada |
| forma_farmaceutica | VARCHAR(100) | Sí | Forma farmacéutica: cápsula, crema, colirio, jarabe, etc. |
| presentacion | VARCHAR(100) | Sí | Presentación: 10 ml, 30 g, 60 cápsulas, etc. |
| cantidad | DECIMAL(10,2) | No | Cantidad solicitada |
| unidad_medida | VARCHAR(20) | No | Unidad: unidad, gramo, ml, frasco, etc. |
| precio_unitario_convenio | DECIMAL(12,2) | Sí | Precio unitario según condiciones del convenio |
| subtotal | DECIMAL(12,2) | Sí | Subtotal de la línea (cantidad x precio unitario) |
| datos_receta | TEXT | Sí | Datos textuales de la receta (paciente, médico, indicaciones) |
| archivo_receta_url | VARCHAR(500) | Sí | URL del archivo adjunto (imagen o PDF de la receta) |
| observaciones | TEXT | Sí | Observaciones específicas de esta línea |
| created_at | TIMESTAMP | No | Fecha de creación |
Índices sugeridos: id_solicitud, codigo_producto.
2.4 INCIDENCIA
Ticket de incidencia asociado a una solicitud.
| Campo | Tipo | Nulo | Descripción |
|---|---|---|---|
| id | UUID | No | Identificador único de la incidencia |
| id_solicitud | UUID | No | Solicitud a la que se vincula la incidencia |
| tipo | VARCHAR(50) | No | Tipo: dato_faltante, receta_ilegible, error_carga, retraso_produccion, problema_despacho, otro |
| descripcion | TEXT | No | Descripción del problema |
| estado | VARCHAR(20) | No | Estado: Abierto, EnProceso, Resuelto, Cerrado |
| responsable_id | UUID | Sí | Usuario asignado como responsable |
| responsable_nombre | VARCHAR(255) | Sí | Nombre del responsable |
| resolucion | TEXT | Sí | Detalle de cómo se resolvió |
| fecha_creacion | TIMESTAMP | No | Fecha de creación del ticket |
| fecha_resolucion | TIMESTAMP | Sí | Fecha en que se resolvió |
| updated_at | TIMESTAMP | No | Fecha de última modificación |
Índices sugeridos: id_solicitud, estado, tipo.
2.5 NOTIFICACION
Registro de notificaciones enviadas por eventos del módulo B2B.
| Campo | Tipo | Nulo | Descripción |
|---|---|---|---|
| id | UUID | No | Identificador único de la notificación |
| id_solicitud | UUID | Sí | Solicitud asociada (si aplica) |
| id_convenio | UUID | Sí | Convenio asociado (si aplica) |
| id_destinatario | UUID | No | Usuario destinatario |
| tipo_evento | VARCHAR(50) | No | Tipo de evento: nueva_carga, carga_con_errores, solicitud_observada, derivada_produccion, cambio_estado, despacho |
| canal | VARCHAR(20) | No | Canal de envío: email, plataforma, whatsapp |
| estado_envio | VARCHAR(20) | No | Estado: Pendiente, Enviado, Fallido, Leído |
| contenido | TEXT | No | Contenido del mensaje |
| fecha_envio | TIMESTAMP | Sí | Fecha y hora de envío |
| fecha_lectura | TIMESTAMP | Sí | Fecha y hora de lectura (si aplica) |
Índices sugeridos: id_solicitud, id_destinatario, tipo_evento, estado_envio.
2.6 HISTORIAL_ESTADO
Registro de cada cambio de estado de una solicitud, para trazabilidad completa.
| Campo | Tipo | Nulo | Descripción |
|---|---|---|---|
| id | UUID | No | Identificador único del registro |
| id_solicitud | UUID | No | Solicitud a la que pertenece el cambio |
| estado_anterior | VARCHAR(30) | Sí | Estado antes del cambio (NULL para el estado inicial) |
| estado_nuevo | VARCHAR(30) | No | Estado después del cambio |
| actor | VARCHAR(255) | No | Usuario o sistema que realizó el cambio |
| observacion | TEXT | Sí | Observación asociada al cambio |
| fecha_cambio | TIMESTAMP | No | Fecha y hora del cambio |
Índices sugeridos: id_solicitud, fecha_cambio.
3. Relaciones entre entidades
| Entidad origen | Entidad destino | Cardinalidad | Descripción |
|---|---|---|---|
| Convenio | Solicitud | 1:N | Un convenio puede tener muchas solicitudes |
| Solicitud | LineaSolicitud | 1:N | Una solicitud puede tener múltiples líneas de producto |
| Solicitud | Incidencia | 1:N | Una solicitud puede tener múltiples incidencias |
| Solicitud | Notificacion | 1:N | Una solicitud puede generar múltiples notificaciones |
| Convenio | Notificacion | 1:N | Un convenio puede generar notificaciones generales |
| Solicitud | HistorialEstado | 1:N | Cada cambio de estado queda registrado |
4. Relaciones con otros módulos
| Entidad M03 | Módulo externo | Relación | Detalle |
|---|---|---|---|
| Convenio | M06 Costeo (CostoProducto) | Consulta | El precio de convenio se calcula a partir del costo base definido en M06 |
| Solicitud | M04 Producción (OrdenTrabajo) | Referencia | Al derivar, la solicitud referencia la orden de producción creada en M04 |
| Solicitud | M02 Cotización | Referencia | Una cotización confirmada en M02 puede originar una solicitud B2B |
5. Notas de implementación
- Los campos de tipo JSONB (como condiciones_comerciales en Convenio) permiten flexibilidad para almacenar condiciones que varían entre convenios sin requerir cambios de esquema.
- El campo id_externo en Solicitud es clave para la trazabilidad cruzada: el cliente puede consultar con su propio código (por ejemplo, el número de contraseña que usa Salco en su Excel).
- El campo id_lote agrupa las solicitudes que vinieron de una misma carga masiva para facilitar reportes y reprocesos.
- Los archivos adjuntos (imágenes de receta, PDFs) se almacenan en storage externo (Supabase Storage) y la tabla solo guarda la URL de referencia.
Volver al Requerimientos M03 | Ver Historias de usuario M03 | Ver Índice general