Compras (proveedores y órdenes de compra)
Ruta: /inventario/compras · /inventario/compras/proveedores
Quién la usa: gerente (aprueba y recibe), cocina (arma la orden)
Permiso requerido: inventory.manage para ver y armar la orden; purchase.approve para aprobar, rechazar y recibir
Capturas: docs/manual/screenshots/inventario/
Qué es
Compras es el documento con el que entra la mercadería: una orden de compra con proveedor, líneas (artículo, cantidad, costo unitario, descuento) y un total. La pantalla tiene dos pestañas —Órdenes y Proveedores— y, en Órdenes, tres bloques: el formulario Nueva compra, el Historial de las últimas órdenes y, en cada una, sus acciones. La firma va antes que el inventario: recibir una orden aprobada es lo que mueve el stock y recalcula el costo promedio. Una orden ya recibida es historia y no se edita.
Cuándo se usa
Cuando llega el pedido del proveedor, o antes, para dejar la orden armada y que
el gerente la autorice. En frankies-sim la orden del día la creó cocina a las
06:30 y la aprobó y recibió el gerente: OC-000001 · Distribuidora Sim ·
recibida · Harina ×25 · Mozzarella ×10 · Reposición semanal · aprobada por
Gerente Sim · $200.00.
Paso a paso
- Desde Inventario, presione 🧾 Compras. Se abre la pestaña Órdenes.
- En Nueva compra, elija el Proveedor en el desplegable (en la simulación: Distribuidora Sim u Otro (texto libre)). Con Otro aparece un campo de texto libre al lado.
- Escriba la Nota (ej. factura #123) si quiere dejar el número de factura.
- En la línea, elija el Artículo. El campo $ unit. se llena solo con
el costo del artículo (elegir Harina (kg) pone
2.8); puede sobrescribirlo con el costo real de la factura. Escriba la Cant. - Si el proveedor dio descuento, escriba el monto en Desc. y use el botón $ al lado para alternar entre monto y porcentaje. Con 10 en modo % sobre una línea de $28.00, el Total pasa a $25.20 y el bruto $28.00 queda tachado a su izquierda.
- Agregue más líneas con + Agregar línea; quite una con ✕. Si hay un descuento sobre toda la compra, escríbalo en Descuento de la compra: con su propio botón $ / %.
- Cierre la orden con uno de los dos botones: Guardar orden la deja
registrada pendiente de aprobación; Registrar y recibir la aprueba y la
recibe en un solo paso, y sólo aparece si usted tiene
purchase.approve. - Revise el Historial. Cada orden muestra su número OC-000001, el
proveedor, el estado en chip (pendiente · aprobada · recibida · rechazada ·
cancelada), la fecha, sus líneas, la nota, quién la decidió y el total.

- Sobre una orden aprobada o recibida están Copiar (deja el texto de la orden en el portapapeles), WhatsApp (abre el chat con el teléfono del proveedor y el texto ya escrito) y PDF (abre el documento imprimible).
- Para el efecto en existencias, vuelva a ← Inventario: tras la recepción del día, Harina quedó en 95 kg con costo promedio $2.80/kg y Mozzarella en 26.648 kg a $13.00/kg (el costo promedio se recalcula ponderando el costo nuevo con el que ya había).
- Para el catálogo del proveedor, abra la pestaña Proveedores.

- Cree uno con Nuevo proveedor (ej. Distribuidora XYZ) + WhatsApp (ej. +507 6…) y Crear proveedor. Despliegue una ficha con ▸ para editar Nombre, Contacto (ej. Ana), WhatsApp, Email y Nota, y guarde con Guardar datos.
- Bajo CATÁLOGO, elija Artículo…, escriba el $ unit. que le cobra ese proveedor y su Código, y presione + Agregar. La lista de artículos del proveedor aparece encima de esa fila, cada uno con su costo, su unidad y una ✕ para quitarlo.
Campos y botones
| Campo/Botón | Qué hace | Notas |
|---|---|---|
| Órdenes / Proveedores | Cambian de pestaña | Ambas exigen inventory.manage |
| ← Inventario | Vuelve a /inventario | — |
| Proveedor | Elige a quién se le compra | Otro (texto libre) abre un campo para escribir el nombre |
| Nota (ej. factura #123) | Texto libre de la orden | Sale en el historial junto a las líneas |
| Artículo | Elige el insumo de la línea | Al elegirlo se autocompleta el costo unitario |
| Cant. | Cantidad comprada | Las líneas sin artículo o con cantidad 0 se descartan al guardar |
| $ unit. | Costo unitario de la línea | Admite hasta 4 decimales de centavo |
| Desc. + botón $ | Descuento de la línea | El botón alterna entre monto y porcentaje; el descuento nunca supera el bruto de la línea |
| ✕ | Quita la línea | No se puede quitar la última línea |
| + Agregar línea | Agrega una línea vacía | — |
| Descuento de la compra: + botón $ | Descuento sobre el total ya neto de líneas | Mismo alternador monto/porcentaje |
| Total | Suma de líneas menos descuentos | Si hay descuento, el bruto aparece tachado a la izquierda |
| Guardar orden | Registra la orden | Con purchase.approve responde «Orden creada y aprobada.»; sin él, «Orden creada — pendiente de aprobación.» |
| Registrar y recibir | Aprueba y recibe en un paso | Sólo con purchase.approve. Responde «Compra registrada y recibida — inventario y costos actualizados.» |
| Aprobar / Rechazar | Deciden una orden pendiente | Sólo con purchase.approve. Rechazar pide antes «Motivo del rechazo (opcional):» |
| Cancelar | Anula una orden pendiente o aprobada | Una orden recibida ya no se puede cancelar |
| Recibir | Mueve el stock de una orden aprobada | Sólo con purchase.approve |
| Copiar / WhatsApp / PDF | Comparten la orden | Sólo en órdenes aprobadas o recibidas |
| Nuevo proveedor + WhatsApp | Alta rápida de proveedor | Crear proveedor queda deshabilitado mientras el nombre esté vacío |
| Guardar datos / Desactivar | Guardan o desactivan el proveedor | No hay borrado: las órdenes lo siguen referenciando para siempre. En un proveedor inactivo el botón dice Reactivar |
| CATÁLOGO: Artículo… · $ unit. · Código · + Agregar | Precio del proveedor por artículo | + Agregar queda deshabilitado sin artículo elegido; la ✕ de cada fila lo quita del catálogo |
Lo que esta pantalla no hace: no envía la orden al proveedor por sí sola —Copiar y WhatsApp son manuales—, no permite editar una orden ya guardada (se cancela y se rehace) y no lleva cuenta por pagar del proveedor.
En la simulación, Distribuidora Sim tiene 0 producto(s) en su catálogo: por eso el costo que se autocompleta en la línea es el costo promedio del artículo, no un precio del proveedor. La única orden del día está en estado recibida, así que en el historial sólo se ven Copiar, WhatsApp y PDF; Aprobar, Rechazar, Cancelar y Recibir son las acciones que la misma fila muestra mientras la orden sigue pendiente o aprobada.
Con inventory.manage pero sin purchase.approve —el caso de la persona de
cocina— la pantalla se abre igual, pero el único botón bajo el total es
Guardar orden: Registrar y recibir no se dibuja, y las órdenes
pendientes no muestran Aprobar ni Rechazar. Un cajero sin
inventory.manage ve sólo el texto «Sin permiso para compras.» tanto en
/inventario/compras como en /inventario/compras/proveedores.
Mensajes y errores
"Esta compra ya fue decidida."
NG_PO_NOT_PENDING
"Esta compra necesita aprobación antes de recibirse."
NG_PO_NOT_APPROVED
"Esta compra ya no se puede cancelar."
NG_PO_IMMUTABLE
"Agrega al menos una línea."
NG_LINES_REQUIRED
"Artículo no válido."
NG_ITEM_INVALID
"Proveedor no válido."
NG_SUPPLIER_INVALID
"Ya existe un proveedor con ese nombre."
NG_SUPPLIER_DUPLICATE
"Escribe un nombre."
NG_NAME_REQUIRED
"El costo no es válido."
NG_COST_INVALID
"No tienes permiso para esta acción."
NG_FORBIDDEN
"Algo salió mal. Intenta de nuevo."
NG_UNKNOWN— es lo que se ve cuando la cantidad (NG_QTY_INVALID) o el descuento (NG_DISCOUNT_INVALID) no son válidos: esos códigos no tienen texto propio en español.
El formulario tiene además una validación propia, antes de llamar al servidor: si ninguna línea tiene artículo y cantidad, responde «Agrega al menos una línea con artículo y cantidad.»