Saltar al contenido

Cómo funciona

De la venta a la receta: el flujo completo en FarmaWare

Por Eduardo Gallegos · Publicado el 22 de septiembre de 2026

Este es un recorrido de producto, no el caso de ninguna farmacia real: describe cómo se mueve -y dónde se desconecta de una receta real- la venta de un medicamento que la Ley General de Salud obliga a controlar, dentro de FarmaWare. La pregunta que resuelve es concreta: ¿en qué paso exacto el sistema deja de verificar que existe una receta, según lo visto en en FarmaWare, la venta de un medicamento con receta no se bloquea: sólo se advierte?

Esquema del recorrido · ilustración, no es una pantalla del sistema

  1. 1. El cliente lleva un medicamento que requiere recetaEl cajero agrega el producto al ticket; el sistema ya sabe, por catálogo, que ese producto requiere receta o está controlado.
  2. 2. El sistema decide si exige el folio, según una variable de entornoPOS_ENFORCE_PRESCRIPTION, sin definir, vale 'report' -no bloquea, sólo advierte-.
  3. 3. El cajero puede cobrar sin ningún folioEn modo 'report', la falta de folio sólo se agrega a un arreglo de avisos internos.
  4. 4. Aun en modo estricto, cualquier texto "cumple"prescriptionFolio acepta cualquier cadena de 1 a 120 caracteres, sin validarla contra una receta real.
  5. 5. El folio, si existe, queda en el ticket -no en el libro de controlSe guarda en pos.ticket_lines, pero el libro de control de medicamentos controlados no lo incorpora.
  6. 6. Ante una inspección, el libro de control no prueba la recetaRegistra lote, motivo y referencia del movimiento, pero no el folio de receta que exige el art. 226.

1-2. La venta se cobra, y el sistema decide exigir o sólo advertir

Cuando un producto marcado como requiresPrescription o controlled entra al ticket, la función enforcePrescriptions() del punto de venta de FarmaWare revisa cada renglón. La decisión de bloquear la venta, o sólo advertir, depende de una sola variable de entorno: POS_ENFORCE_PRESCRIPTION. Si no está definida -el estado por defecto-, su valor es 'report': la venta se cobra igual, y la falta de folio se acumula como un aviso interno, no como un rechazo.

Agenda una demo de FarmaWare

3-4. Aun en modo estricto, el folio no se compara contra nada

Poner POS_ENFORCE_PRESCRIPTION='enforce' sí bloquea la venta cuando el renglón no trae folio. Pero la condición para dejar pasar la venta no es "existe una receta real": es que el campo prescriptionFolio no esté vacío. Ese campo se valida con z.string().min(1).max(120).optional() -cualquier texto de uno a ciento veinte caracteres-, sin ninguna consulta contra un padrón de recetas, un médico tratante o una cédula profesional.

5-6. El folio se guarda en el ticket, pero el libro de control no lo ve

El folio capturado sí se persiste, en la columna prescription_folio de pos.ticket_lines. Pero el libro de control regulatorio de medicamentos controlados -la obligación que el propio artículo 226 nombra explícitamente- vive en otra tabla, inventory.stock_movements, y su consulta movements() sólo expone fecha, tipo de movimiento, cantidad, número de lote, motivo y referencia del movimiento. El folio de receta nunca cruza hacia ese libro: ante una inspección de la Secretaría de Salud, el registro que la ley exige no contiene el dato que la ley exige registrar.

Parada¿Se verifica una receta real?
1. Producto marcado como requiere receta / controladoNo aplica -aquí nace el dato real, desde el catálogo
2. POS_ENFORCE_PRESCRIPTION sin definir (default)No -modo 'report', sólo advierte
3. prescriptionFolio en el esquema del ticketNo -texto libre de 1 a 120 caracteres
4. Persistencia en pos.ticket_linesSe guarda el texto, sin validar su origen
5. Libro de control (controlled.repository.ts: movements())No -no incorpora el folio de receta

Puedes estimar la exposición de este hallazgo, con tus propios números, en la calculadora de exposición por venta de medicamento sin receta verificada.

Preguntas frecuentes

¿Por qué FarmaWare no exige el folio por defecto?
El propio comentario del código describe el valor 'report' como el ideal "mientras los clientes POS se actualizan" -una transición deliberada, no un descuido puntual-. El hallazgo es que, sin cambiar esa variable, una farmacia opera hoy sin el bloqueo que exige la ley.

¿Cambiar a modo 'enforce' resuelve todo el hallazgo?
No: resuelve que la venta se bloquee sin folio, pero no que el folio aceptado sea cualquier texto, ni que el libro de control regulatorio no lo incorpore.

¿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 el punto de venta, la captura del folio de receta y el libro de control de medicamentos.

Agenda una demo de FarmaWare
Agendar 30 min
Contacta a un especialista
Ventas y Proyectos (abre en una ventana nueva) Soporte Técnico (abre en una ventana nueva)