Este es un recorrido de producto, no el caso de ninguna farmacia real: describe cómo se mueve -y dónde se desconecta de la norma- una venta de medicamento controlado dentro de FarmaWare. La pregunta que resuelve es concreta: ¿en qué paso exacto se pierde el dato del médico que exige la fracción III del artículo 117 del Reglamento de Insumos para la Salud? Según lo visto en en FarmaWare, el libro de control de medicamentos controlados nunca registra al médico que prescribe.
Esquema del recorrido · ilustración, no es una pantalla del sistema
- 1. El cajero cobra un medicamento controladoEl producto trae la bandera
controlledorequiresPrescriptionen el catálogo. - 2. Captura el folio de la recetaEs el único dato de receta que el renglón de venta acepta: texto libre, sin campo para el médico.
- 3. La venta se guarda con ese folio
pos.ticket_linespersiste producto, cantidad, lote y folio -nada del médico. - 4. El inventario registra el movimiento
inventory.stock_movementsguarda fecha, tipo, cantidad, lote y una referencia genérica. - 5. El libro de control se arma desde el inventario, no desde la ventaEl folio ni siquiera cruza hasta aquí, y el médico nunca existió como dato.
- 6. Un inspector pide el libro de controlVe fecha, cantidad y saldo -las fracciones I, II y IV a medias, y la III (médico) vacía.
1-3. El folio se captura y se guarda; el médico nunca tiene campo
El renglón de venta (posTicketLineInputSchema) acepta producto, cantidad, precio, descuento, lote y un folio de receta de hasta 120 caracteres de texto libre. Cuando el cajero cierra la venta, insertTicketLine() guarda ese folio en pos.ticket_lines junto con el resto del renglón. Hasta aquí, el sistema al menos intenta capturar una de las cuatro fracciones del artículo 117 -la del folio-. Nombre, domicilio y cédula profesional del médico no aparecen en ningún punto de este formulario ni de esta tabla.
4-6. El libro de control se arma desde otra tabla, y pierde hasta el folio
El libro de control que expone ControlledService no lee pos.ticket_lines. Lee inventory.stock_movements, el ledger append-only de inventario -una tabla distinta, pensada para el kardex, no para la receta-. Ahí ni siquiera el folio de la venta sobrevive: la consulta trae fecha, tipo, cantidad, lote, motivo y una referencia genérica (ref_type/ref_id), sin ningún vínculo a los datos del médico porque esos datos nunca existieron en el sistema para vincularse.
| Parada | ¿Captura el dato del médico (art. 117 fr. III)? |
|---|---|
| 1-2. Venta del producto controlado (folio) | No -el renglón sólo tiene campo para el folio |
3. pos.ticket_lines | No -mismas columnas que el renglón, sin médico |
4. inventory.stock_movements | No -ni el folio llega hasta aquí |
5. Libro de control (ControlledLedger) | No -se arma desde el inventario, no desde la venta |
| 6. Vista para un inspector | No -la fracción III queda vacía |
Puedes estimar la exposición de este hallazgo, con tus propios números, en la calculadora de exposición por libro de control incompleto.
Preguntas frecuentes
¿FarmaWare no sabe qué medicamento controlado se vendió?
Sí lo sabe: producto, cantidad, lote y saldo corriente quedan registrados. Lo que no captura es quién prescribió la receta que autorizó esa venta.
¿El folio de receta al menos llega al libro de control?
No en la versión actual: el libro se arma desde el ledger de inventario, que no incluye el folio de la venta -aunque el folio sí se haya guardado en la tabla de la venta.
¿FarmaWare corrige esto automáticamente?
No, hoy no. Es un hallazgo verificado en el código actual, no una función ya resuelta.
Ve el recorrido completo en tu propia demo
Te mostramos en vivo la venta de un medicamento controlado y su libro de control.
Agenda una demo gratis