23 de abril de 2026
Pedidos y ventas
Recorrido completo por Pedidos en Ballista: lista, filtros, indicadores, creación guiada, detalle, estados, factura y seguimiento.
Esta guía explica la página real de pedidos de Ballista, no el concepto genérico de vender. El módulo vive en la ruta /orders y su objetivo es convertir una solicitud comercial en una orden operativa que pueda seguir hacia inventario, tareas, facturación electrónica, historial y reportes.
En Ballista, Pedidos no es solo una tabla. Es el punto de entrada del flujo pedido-inventario-factura. Desde aquí una persona puede crear un pedido completo, buscar pedidos existentes, revisar estado, ver si ya hay factura electrónica asociada, corregir datos generales y abrir el detalle donde viven líneas, lotes, etiquetas, tareas y acciones de facturación.
Rutas del flujo
| Ruta | Qué es | Para qué se usa |
|---|---|---|
/orders | Lista y panel de trabajo de pedidos. | Buscar, filtrar, crear pedidos, revisar indicadores, cambiar estado, editar encabezado y eliminar cuando aplica. |
/orders/{id} | Detalle de un pedido específico. | Revisar y administrar una orden con sus líneas, lotes, totales, tareas, impresión y facturación. |
/order-detail | Entrada ruta anterior o alternativa del detalle. | Mantiene compatibilidad con rutas anteriores que también cargan el espacio de trabajo de detalle. |
/billing | Facturación electrónica. | Recibe contexto desde Facturar este pedido para emitir o simular el comprobante electrónico. |
/tasks | Seguimiento operativo. | Recibe tareas creadas desde el pedido o desde el detalle para coordinar trabajo pendiente. |
Estructura de /orders
La pantalla escritorio usa OrdersWorkbenchPanel. En móvil usa el mismo panel con variante compacta. La diferencia principal es visual: escritorio muestra indicadores, filtros y tabla; móvil muestra filtros compactos, indicadores y tarjetas por pedido.
Indicadores superiores
Al entrar a /orders, la primera lectura es el resumen:
| indicador | Qué muestra | Cómo se debe leer |
|---|---|---|
| Pedidos | Cantidad total de pedidos conocidos por el módulo. | Sirve para dimensionar volumen. Si parece bajo, revisa filtros o disponibilidad de datos. |
| Pendientes | Cantidad de pedidos en estado pendiente. | Ayuda a priorizar trabajo que todavía no avanza. |
| Monto total | Suma monetaria de los pedidos. | Se calcula desde detalles cuando existen; si no, usa totales disponibles del pedido. |
Estos indicadores no reemplazan la tabla. Funcionan cómo alerta rápida: si hay muchos pendientes o el monto no cuadra, el siguiente paso es filtrar y abrir pedidos concretos.
Permisos visibles
La pantalla respeta permisos:
| Permiso | Impacto visible |
|---|---|
create_orders | Habilita el botón Crear pedido. |
edit_orders | Habilita edición, cambio de estado y acciones por fila. |
Si falta un permiso, Ballista muestra un aviso de permisos y algunos botones quedan deshabilitados. Eso no es error de la pantalla: significa que el usuario puede consultar, pero no ejecutar esa acción.
Botón Crear pedido
Crear pedido abre el asistente de creación completa. Esta es la entrada recomendada para crear pedidos nuevos porque guarda encabezado, líneas, lotes o producto compuesto, notas, tarea opcional y notificación opcional en un flujo coherente.
No debe confundirse con editar una fila. Crear pedido crea una orden nueva; Editar corrige datos generales de una orden existente.
Filtro rápido por estado
En escritorio aparece como una tarjeta lateral de Estado rápido; en móvil aparece como selector dentro de los filtros. Permite ver:
| Estado | Significado operativo |
|---|---|
| Todos | No filtra por estado. |
| Pendiente | El pedido existe, pero todavía requiere trabajo o confirmación. |
| En proceso | El pedido ya está activo operativamente. |
| Pagado | El pedido se marcó como pagado. Ojo: pagado no siempre significa que la factura electrónica este aceptada. |
| Cancelado | El pedido se detuvo y no debería seguir avanzando. |
Este filtro no cambia datos. Solo reduce lo visible para revisar el grupo correcto.
Búsqueda simple
La pestaña Simple muestra un solo campo de búsqueda. Es útil cuando la persona recuerda algo general: número de pedido, nombre relacionado o texto que pueda aparecer en el registro.
Úsala cuando no necesitas precisión. Por ejemplo: "busca rápido todo lo que tenga ABC" o "encuentra el pedido 1042".
Filtros avanzados
La pestaña Avanzada separa la búsqueda en tres grupos.
Identificación
| Campo | Qué filtra | Cuando usarlo |
|---|---|---|
| ID | Número de pedido. | Cuando soporte, ventas o el cliente ya tienen el identificador. |
| Pedido por / Cliente | Cliente que hizo el pedido. | Cuando se revisa historial o pendientes de un cliente. |
| Dependent | Dependiente asociado, cuando aplica. | Útil en operaciones dónde el pedido se vincula a mascota/dependiente. |
| Type | Tipo de pedido. | Sirve para separar ventas, servicios, producción o clasificaciones internas. |
Fechas
| Campo | Qué filtra | Cuando usarlo |
|---|---|---|
| Creation date | Fecha de creación del pedido. | Para revisar pedidos capturados en un día o periodo. |
| Delivery date | Fecha prometida/entrega. | Para priorizar entregas, atrasos y promesas al cliente. |
Clasificacion
| Campo | Qué filtra | Cuando usarlo |
|---|---|---|
| Status | Estado operativo. | Para combinar estado con cliente, fecha o línea de producto. |
| Product line | Línea de producto. | Para separar tipos de producto o familias comerciales. |
Después de llenar filtros, usa Search. Si quieres volver a empezar, usa Clear.
Botones Search y Clear
| Botón | Qué hace |
|---|---|
| Search | Aplica la búsqueda simple o los filtros avanzados visibles. |
| Clear | Limpia búsqueda, filtros avanzados y vuelve al modo simple. |
Importante: cambiar campos no siempre significa que la consulta ya se aplico. Usa Search para confirmar la búsqueda.
Tabla de resultados
La tabla aparece en el bloque orders-results. Cada fila representa un pedido. Las columnas principales son:
| Columna | Qué significa |
|---|---|
| Order | Número de pedido. Es un link a /orders/{id}. |
| Cliente | Cliente asociado al pedido. |
| Dependent | Dependiente asociado, si aplica. |
| Type | Tipo de pedido. |
| Product line | Línea de producto. |
| Date | Fecha de creación. |
| Delivery date | Fecha prometida o de entrega. |
| Total | Total del pedido en CRC. |
| E-invoice issued | Indica si ya existe factura electrónica asociada y muestra estado cuando existe. |
| Status | Estado operativo editable si el usuario tiene permiso. |
| Actions | Acciones de fila como Editar y Delete. |
Columna E-invoice issued
Esta columna conecta pedidos con facturación electrónica.
| Valor | Qué indica |
|---|---|
| Invoiced | Hay documento electrónico asociado al pedido en el historial de facturación. |
| sin facturar | No se encontro factura asociada a ese pedido. |
| Invoice status | Estado registrado para el documento cuando existe. |
Si una orden debería estar facturada y aparece como sin facturar, abre el detalle del pedido y revisa si se uso Facturar este pedido o busca en historial de facturación.
Cambio de estado en la fila
Si tienes permiso edit_orders, la columna Status muestra un selector. Cambiarlo llama al ruta interna de cambio de estado y refresca la lista.
Estados esperados:
| Estado visible | Estado API aproximado | Uso |
|---|---|---|
| Pendiente | pendiente | Pedido recibido, todavía sin ejecución completa. |
| En proceso | en_proceso | Pedido activo. |
| Pagado | pagado | Pedido marcado como pagado. |
| Cancelado | cancelado | Pedido detenido. |
No uses el estado como sustituto de trazabilidad. Si necesitas explicar por qué cambio, agrega contexto en el detalle o en tareas.
Acción Editar
Editar abre un formulario de edición rápida del encabezado. Permite corregir:
| Campo | Uso |
|---|---|
| Cliente | Cambia el cliente asociado. |
| Order type | Cambia la clasificacion del pedido. |
| Product line | Cambia la línea de producto. |
| Dependent | Cambia el dependiente asociado. |
| External reference | Asocia proveedor/referencia externa cuando aplica. |
| Promised date | Fecha prometida. |
| Delivered date | Fecha de entrega. |
| E-invoice | Marca si el pedido requiere factura electrónica. |
| Notes | Notas generales del pedido. |
| Status | Estado operativo. |
Editar no es para administrar líneas, lotes o etiquetas. Para eso abre el pedido con el link #id y trabaja desde el detalle.
Acción Delete
Delete elimina el pedido después de confirmación. Debe usarse solo si el pedido fue creado por error y no debería conservarse como evidencia operativa.
Si el pedido ya tiene líneas, tareas, factura o historial, lo correcto normalmente es cancelar o corregir, no borrar.
Vista móvil
En móvil, la tabla se transforma en tarjetas. Cada tarjeta muestra:
| Bloque | Contenido |
|---|---|
| Encabezado | #id, cliente y selector/etiqueta de estado. |
| Resumen | Fecha, delivery date y total. |
| Facturación | Badge de Invoiced o sin facturar. |
| Datos secundarios | Dependent, Type y Product line. |
| Row management | Botones Editar y Delete. |
La funcion es la misma que escritorio, pero optimizada para pantalla estrecha.
Wizard Crear pedido
El asistente crea una orden completa. Internamente se divide en cuatro estaciones.
Antes de abrirlo conviene entender que este flujo no es solo "guardar un formulario". El envío llama al ruta interna /api/orders/create-complete. Ese ruta interna crea la orden, crea sus líneas, valida impuestos, valida inventario, descuenta cantidades de lotes, crea asignaciones de lote, registra movimiento de inventario cuando la tabla existe, puede crear tarea, puede crear notificación, emite eventos en tiempo real y guarda auditoría del intento con traceId.
Requisitos antes de crear una orden
Para qué una orden pueda crearse bien, varias cosas ya deben existir en la base de datos. Algunas son obligatorias y otras dependen del tipo de pedido.
| Dato previo | Dónde se administra | Obligatorio | Por qué importa |
|---|---|---|---|
| Cliente | Clientes | Si | El pedido necesita id_cliente. Sin cliente, el asistente detiene la creación. |
| Tipo de pedido | tipos de pedido / catálogos | Recomendado en interfaz | Clasifica la orden. El botón final queda incompleto si no se selecciona en el asistente. |
| Fecha prometida | Se captura en el asistente | Si | El servidor recibe promised_at y delivered_at; la interfaz exige fecha. |
| Lote con inventario disponible | Lotes / inventario | Si la línea es tipo lote | La línea tipo lot necesita id_lote y cantidad disponible. |
| Materia prima del lote | Materias primas | Si la línea es tipo lote | El lote apunta a materia prima; de ahí salen nombre, costo, unidad e impuesto. |
| Impuesto de venta del lote/materia prima | Taxes / raw material | Si la línea es tipo lote | El asistente deriva salesTaxRateId; si falta, bloquea la creación. |
| Producto compuesto variante | Compound Product Variations | Si la línea es tipo compuesto | La línea tipo compound necesita id_producto_compuesto_variacion. |
| Formula/componentes del producto compuesto | productos compuestos / componentes | Si la línea es tipo compuesto | El servidor usa la fórmula para saber que materias primas y cantidades reservar. |
| Materias primas con impuesto para la fórmula | Materias primas + Taxes | Si la línea es tipo compuesto | Si un componente no tiene impuesto, el asistente bloquea porque no puede derivar impuesto de la línea. |
| Lotes disponibles para cada materia prima de la fórmula | Lotes | Si la línea es tipo compuesto | El servidor autoasigna lotes para cumplir la fórmula. |
| Usuarios | Usuarios | Solo si se crea tarea/notificación | La tarea necesita responsable si se completa responsable; la notificación necesita usuario destino si se envía a alguien específico. |
Permiso orders:write / create_orders | Roles / permisos | Si | Sin permiso, no se puede ejecutar la creación. |
Checklist operativo antes de tocar Crear pedido
Antes de crear una orden, la persona usuaria debería poder responder estas preguntas. Si alguna respuesta falta, la orden probablemente va a quedar incompleta o va a fallar al guardar.
| Pregunta | Si la respuesta es no | Dónde corregir |
|---|---|---|
| Ya existe el cliente? | No se puede crear la orden porque falta id_cliente. | Crear o corregir el cliente en Clientes. |
| El cliente tiene datos correctos para facturar? | La orden puede crearse, pero la factura electrónica puede fallar después. | Completar datos fiscales del cliente antes de emitir. |
| Ya se sabe que tipo de pedido es? | La operación queda menos clasificable y más dificil de reportar. | Revisar catálogos de tipos de pedido. |
| La fecha prometida es realista? | El pedido puede prometer algo qué inventario/producción no puede cumplir. | Revisar disponibilidad, producción y calendario antes de prometer. |
| La venta sale de un lote existente? | Necesitas tener lotes con inventario disponible y precio/impuesto resoluble. | Revisar Lotes, Materias primas y taxes. |
| La venta sale de un producto compuesto? | Necesitas variante, fórmula, componentes, impuestos y lotes disponibles. | Revisar productos compuestos, variantes, materias primas y lotes. |
| Alguien debe hacer una acción después? | Conviene crear tarea desde el asistente para que el pedido no quede cómo nota suelta. | Activar Incluir tarea. |
| Hay que avisar a alguien? | Conviene crear notificación junto con la orden. | Activar Include notification. |
| El pedido necesita factura electrónica? | Marca E-invoice; eso no emite la factura, pero deja claro que debe pasar por Facturación. | Revisar también configuración de facturación. |
Datos que deben existir según el tipo de línea
La parte más importante del asistente no es solo llenar campos: es escoger de dónde sale lo que se vende. Ballista soporta dos caminos principales para las líneas del pedido.
| Tipo de línea | Requisitos minimos | Qué valida Ballista | Qué ocurre con inventario |
|---|---|---|---|
Lot | Lote existente, materia prima asociada, inventario disponible mayor que cero, impuesto resoluble, precio. | Qué haya lote, que la cantidad sea mayor que cero, que la cantidad no supere disponibilidad y que exista impuesto de venta. | Descuenta current_quantity del lote seleccionado y crea asignacion de lote. |
Compound product | Variante vendible, fórmula con componentes, materias primas, impuestos compatibles y lotes disponibles para cada componente. | Qué exista variante, que tenga componentes, que las materias primas tengan impuesto, que el impuesto sea consistente y que haya inventario disponible suficiente. | El servidor autoasigna lotes por cada componente de la fórmula y descuenta esas cantidades. |
Ejemplo simple: si vendes una materia prima ya empacada, normalmente usas Lot. Si vendes un producto preparado con fórmula, presentación o receta, normalmente usas Compound product.
Recorrido de creación de una orden de principio a fin
Este es el flujo completo que una persona debería seguir en la pantalla.
- Entrar a
/orders. - Revisar si el pedido ya existe usando búsqueda simple, filtros o cliente.
- Si no existe, presionar
Crear pedido. - Seleccionar
Cliente. - Seleccionar
Order type. - Elegir el estado inicial, normalmente
pendientesi todavía no se ha ejecutado. - Definir
Promised date. - Marcar
E-invoicesi el pedido debe terminar en factura electrónica. - Agregar dependiente si aplica.
- Agregar referencia externa si aplica.
- Crear una o varias líneas en
Order lines. - Para cada línea, decidir si viene de
Loto deCompound product. - Revisar cantidad, precio unitario, impuesto y total de línea.
- Activar
Incluir tareasi alguien debe preparar, revisar, llamar, producir o entregar. - Activar
Include notificationsi alguien debe recibir aviso inmediato. - Revisar mensajes de validación.
- Presionar
Crear pedido. - Si se guarda, abrir
/orders/{id}desde el link del pedido. - Revisar líneas, lotes, totales, estado y trazabilidad.
- Cuando corresponda, pasar a
Facturar este pedido.
La idea no es que la persona memorice la tecnología. La idea es que entienda que una venta queda lista cuando tiene cliente, fecha, líneas, cantidades, precio, impuesto, inventario trazable y siguiente acción.
Qué se calcula al crear la orden
Cuando presionas Crear pedido, Ballista calcula y persiste varios valores:
| Calculo | Dónde ocurre | Resultado |
|---|---|---|
| Nombre, descripción, precio y etiqueta desde lote | Interfaz | Al seleccionar lote, la interfaz llena item, descripción, precio unitario y etiqueta desde el lote/materia prima. |
| Nombre, descripción y precio desde producto compuesto | Interfaz | Al seleccionar variante, la interfaz llena item, presentación/descripción y precio de venta. |
| Total de línea | Interfaz y servidor | quantity * unitPrice - discount, con mínimo 0. Si no mandas precio_total, servidor calcula. |
| Impuesto por línea | Interfaz y servidor | La interfaz deriva salesTaxRateId; servidor guarda impuesto y porcentaje en sales_order_items. |
| Impuesto de encabezado | Interfaz/servidor | Si todas las líneas tienen el mismo impuesto, se usa como impuesto del pedido. Si son mixtas, queda por línea. |
| Disponibilidad de lote | Interfaz y servidor | Interfaz consulta disponibilidad en tiempo real; servidor valida con bloqueo transaccional FOR UPDATE. |
| Asignacion de lotes para producto compuesto | Servidor | El servidor lee la fórmula y toma lotes disponibles por vencimiento e id hasta cubrir la necesidad. |
| Movimiento de inventario | Servidor | Registra movimiento tipo reserve con cantidad negativa si existe core.inventory_movements. |
| indicadores y totales de lista | Interfaz | La lista suma detalles cuando existen; si no, usa total del pedido. |
Qué se guarda al crear la orden
El flujo completo puede guardar todo esto en una sola transaccion:
| Registro | Tabla/área aproximada | Cuando se crea |
|---|---|---|
| Orden | core.sales_orders | Siempre que la creación sea valida. |
| Líneas de pedido | core.sales_order_items | Una por cada detail del asistente. |
| Asignaciones de lote | core.sales_order_item_lot_allocations | Cuando la línea usa lote o cuando el compuesto autoasigna lotes. |
| Rebaja/reserva de inventario disponible | core.raw_material_lots.current_quantity | Cuando se asigna un lote. Se resta la cantidad solicitada. |
| Movimiento de inventario | core.inventory_movements | Si la tabla existe; movimiento reserve con cantidad negativa. |
| Tarea | Módulo Tareas | Si se activa Incluir tarea. |
| Notificacion | Módulo de notificaciones | Si se activa Include notification. |
| Evento de dominio | core.order_domain_events | Si la tabla existe; registra order_created. |
| Auditoría del intento | Auditoría de pedido completo | El controller registra exito/error con request, response, usuario y traceId. |
Todo esto ocurre de forma transaccional. Si falla inventario, impuesto, FK o validación, el servidor hace reversión: no debe quedar media orden creada ni inventario disponible rebajado a medias.
Qué significa que sea transaccional
Crear una orden toca muchas piezas al mismo tiempo. Por eso el servidor usa una transaccion: o se guarda todo bien, o no se guarda nada.
| Situacion | Qué confirma el sistema |
|---|---|
| Cliente valido, líneas validas y inventario disponible suficiente. | Se crea orden, líneas, asignaciones, rebaja de inventario y opcionales. |
| El cliente no existe. | No se crea la orden. |
| Una línea no tiene impuesto valido. | No se crea la orden. |
| El lote tenia inventario disponible cuando abriste el asistente, pero otro usuario lo consumio antes de guardar. | El servidor rechaza por conflicto de inventario y no descuenta nada a medias. |
| Una tarea opcional viene incompleta. | La validación bloquea el envío o el servidor rechaza según el caso. |
Doble click o reintento con el mismo traceId. | No debe duplicar orden ni descontar inventario dos veces. |
Esto es especialmente importante para inventario. La interfaz ayuda, pero la verdad final la decide el servidor con bloqueo de filas (FOR UPDATE) para evitar que dos pedidos reserven el mismo lote al mismo tiempo.
Cómo impacta inventario
Esta parte es clave: crear una orden completa con líneas que usan inventario rebaja la cantidad actual del lote.
Si la línea usa Lot
-
El usuario selecciona un lote.
-
La interfaz muestra disponibilidad (
Available) y precio. -
La interfaz valida que la cantidad pedida no supere disponibilidad en tiempo real.
-
El servidor vuelve a consultar el lote con
FOR UPDATE. -
Si
current_quantityalcanza, ejecuta:current_quantity = current_quantity - cantidad_solicitada -
Inserta una asignacion en
sales_order_item_lot_allocations. -
Inserta movimiento de inventario tipo
reservecon cantidad negativa si la tabla existe.
Ejemplo: si el lote tiene current_quantity = 10 y la orden reserva 2, después de crear la orden queda current_quantity = 8.
Ejemplo completo con línea Lot
Supongamos que una persona vende 2 unidades de una materia prima empacada.
| Paso | Qué hace el usuario | Qué hace Ballista |
|---|---|---|
| 1 | Abre Crear pedido. | Carga clientes, dependientes, tipos, proveedores, usuarios, lotes y catálogos necesarios. |
| 2 | Selecciona el cliente. | Guarda el futuro id_cliente del pedido. |
| 3 | Selecciona fecha prometida. | Prepara promised_at y delivered_at para el payload. |
| 4 | Agrega una línea tipo Lot. | Muestra lotes disponibles desde inventario. |
| 5 | Selecciona el lote. | Llena nombre, descripción, precio, disponibilidad, impuesto y datos de materia prima cuando existen. |
| 6 | Escribe cantidad 2. | Calcula total de línea y valida que 2 no supere Available. |
| 7 | Presiona Crear pedido. | Envia /api/orders/create-complete. |
| 8 | Servidor valida. | Confirma cliente, lote, impuesto, cantidad y permisos. |
| 9 | Servidor bloquea el lote. | Usa la cantidad real actual, no solo lo que vio la interfaz. |
| 10 | Servidor descuenta inventario disponible. | Resta 2 de core.raw_material_lots.current_quantity. |
| 11 | Servidor guarda trazabilidad. | Crea item, asignacion de lote y movimiento reserve. |
| 12 | La lista se refresca. | El pedido aparece en /orders con total, estado y facturación pendiente si aun no se facturo. |
Si en el paso 9 el lote ya no tiene 2 unidades porque otra orden lo reservo, el servidor responde conflicto. En ese caso no se crea una orden parcial y no se descuenta inventario.
Si la línea usa Compound product
-
El usuario selecciona una variante de producto compuesto.
-
La interfaz manda
id_producto_compuesto_variaciony cantidad. -
El servidor busca la fórmula en
compound_product_components. -
Por cada componente calcula:
cantidad_necesaria = cantidad_formula * cantidad_pedida -
Busca lotes disponibles de esa materia prima.
-
Ordena lotes por fecha de vencimiento y luego por id.
-
Toma cantidades de uno o varios lotes hasta cubrir la necesidad.
-
Si no alcanza, responde conflicto de inventario y no crea la orden.
-
Si alcanza, descuenta los lotes y crea asignaciones igual que una línea de lote.
Ejemplo: una crema compuesta requiere 0.5 unidades de materia prima A por unidad. Si el pedido pide 4, el servidor necesita 2 unidades de A. Puede tomarlas de un lote o repartirlas entre varios lotes disponibles.
Ejemplo completo con Compound product
Supongamos que se vende una variante llamada Crema 100 ml, compuesta por materia prima A y materia prima B.
| Paso | Qué hace el usuario | Qué hace Ballista |
|---|---|---|
| 1 | Selecciona cliente, tipo y fecha prometida. | Prepara encabezado del pedido. |
| 2 | Agrega una línea tipo Compound product. | Carga variantes vendibles y detalles de fórmula. |
| 3 | Selecciona Crema 100 ml. | Llena nombre, descripción/presentación y precio de venta de la variante. |
| 4 | Escribe cantidad 4. | Calcula total comercial: 4 * precio_unitario. |
| 5 | El asistente revisa componentes. | Verifica que la variante tenga fórmula y que sus materias primas tengan impuesto. |
| 6 | Presiona Crear pedido. | Servidor recibe id_producto_compuesto_variacion y cantidad. |
| 7 | Servidor lee la fórmula. | Por cada componente calcula necesidad: cantidad de fórmula por cantidad pedida. |
| 8 | Servidor busca lotes disponibles. | Toma lotes por fecha de vencimiento primero para usar inventario disponible de forma razonable. |
| 9 | Servidor descuenta lotes. | Resta cantidades de los lotes necesarios para A y B. |
| 10 | Servidor guarda asignaciones. | La orden queda trazable hasta los lotes usados por la fórmula. |
Ejemplo numerico: si Crema 100 ml usa 0.5 de A y 0.25 de B por unidad, vender 4 unidades requiere 2 de A y 1 de B. Si A está repartida entre dos lotes, Ballista puede reservar parte de un lote y parte de otro.
Si no hay suficiente A o B, la orden falla completa. Eso es correcto: vender un producto compuesto sin insumos suficientes sería prometer algo que producción no puede cumplir.
Qué significa reserve
El movimiento reserve significa que el inventario queda apartado por la orden. No es solo una nota visual. El lote baja su disponibilidad para que otro pedido no prometa el mismo inventario disponible.
Si después se elimina el pedido, el servidor restaura cantidades de las asignaciones y registra movimientos inversos/release según soporte disponible.
Relación con otros módulos
Crear una orden toca varias partes de Ballista:
| Módulo | Relación |
|---|---|
| Clientes | Provee el cliente obligatorio. |
| Dependents/Pets | Provee el dependiente opcional. |
| Suppliers | Provee referencia externa/proveedor opcional. |
| tipos de pedido | Clasifica el pedido. |
| Product Lines | Clasifica comercialmente el pedido. |
| Lotes | Provee inventario disponible real para líneas tipo lote. |
| Materias primas | Provee materia prima, impuesto y unidad asociada a lotes/fórmulas. |
| Taxes | Permite calcular impuesto de venta por línea. |
| productos compuestos | Define fórmulas para productos compuestos. |
| Compound Product Variations | Define variantes vendibles, presentación y precio de venta. |
| Inventario Movements | Recibe movimientos reserve cuando se descuenta inventario disponible. |
| Tareas | Recibe tarea vinculada si se activa Incluir tarea. |
| Notificaciones | Recibe notificación vinculada si se activa Include notification. |
| Facturación | Usa la orden y sus líneas como origen para factura electrónica. |
| historial de facturación | Muestra si una orden ya tiene documento electrónico asociado. |
| Reportes | Usa pedidos, montos, estados, costos e inventario para indicadores. |
Reglas de validación importantes
Estas son las reglas que más suelen bloquear una orden:
| Regla | Mensaje/efecto esperado |
|---|---|
| Debe haber cliente. | La interfaz muestra que debes seleccionar cliente. |
| Debe haber al menos una línea. | No se puede crear un pedido vacío. |
| La fecha prometida es obligatoria. | El formulario queda invalido. |
| Cada línea debe tener nombre de item. | La interfaz marca la línea especifica. |
| Línea compuesta necesita variante. | Debes seleccionar producto compuesto/variación. |
| Línea por lote necesita lote. | Debes seleccionar lote. |
| Cantidad de lote debe ser mayor que cero. | La interfaz/servidor rechazan cantidad invalida. |
| Cantidad no puede superar disponibilidad. | Interfaz valida y servidor responde conflicto si cambia el inventario disponible. |
| Lote debe tener impuesto de venta resoluble. | Si falta impuesto, la orden se bloquea. |
| Formula compuesta debe existir. | Si la variante no tiene componentes, servidor rechaza. |
| Materias primas de fórmula deben tener impuesto. | Si falta impuesto, la interfaz bloquea antes de enviar. |
| Formula no puede mezclar impuestos en una misma línea compuesta. | Si componentes tienen impuestos distintos, se bloquea por conflicto de impuesto. |
| Tarea necesita título si se activa. | Incluir tarea obliga título. |
| Tarea necesita fecha de vencimiento si se activa. | Sin fecha, no se envía. |
| Notificacion necesita mensaje si se activa. | Sin mensaje, no se envía. |
Idempotencia y traceId
El ruta interna de creación completa soporta X-Trace-Id. Si llega el mismo traceId con el mismo payload, el servidor puede devolver el resultado anterior sin duplicar pedido ni volver a descontar inventario.
Esto importa porque evita que doble click, reintentos o problemas de red creen dos órdenes iguales y descuenten inventario disponible dos veces.
Si llega el mismo traceId con payload diferente, el servidor responde conflicto. Eso protege la auditoría del flujo.
1. Order data
Define el encabezado comercial y operativo.
| Campo | Qué significa |
|---|---|
| Cliente | Cliente que compra o solicita. Es obligatorio. |
| Order type | Tipo de pedido. Ayuda a clasificar el trabajo. |
| Status | Estado inicial: pendiente, en proceso, pagado o cancelado. |
| Promised date | Fecha prometida. Es obligatoria y no debería ser anterior al día actual. |
| E-invoice | Indica si el pedido requiere factura electrónica. |
| Dependent checkbox | Muestra el selector de dependiente cuando aplica. |
| Dependent | Mascota/dependiente asociado al pedido. |
| External reference checkbox | Muestra referencia externa/proveedor cuando aplica. |
| External reference | Proveedor o referencia asociada. |
Lectura campo por campo:
| Campo | Requisito | Ejemplo de uso |
|---|---|---|
Cliente | Obligatorio. Debe existir en base de datos. | Seleccionar la empresa o persona que compra. |
Order type | Recomendado/esperado. Debe existir cómo catálogo. | Venta normal, pedido especial, reposicion, servicio, según configuración del negocio. |
Status | Requerido por operación. | pendiente si apenas se recibe, en_proceso si ya se está ejecutando. |
Promised date | Obligatorio. | Fecha que el negocio promete al cliente o fecha objetivo interna. |
E-invoice | Opcional pero importante. | Marcar cuando la venta debe terminar en factura electrónica. |
Dependent | Opcional. | Mascota, paciente, sucursal, contacto o entidad dependiente según el organización. |
External reference | Opcional. | Proveedor, referencia externa o dato de origen que ayuda a rastrear la solicitud. |
Si falta Cliente, el asistente no debería crear la orden. Si marcas factura electrónica, asegurate de que el cliente y la configuración FE tengan datos suficientes antes de emitir.
Lo que este bloque NO hace: no emite factura, no descuenta inventario y no crea líneas. Solo define el encabezado que luego usaran inventario, detalle, reportes y facturación.
2. Order lines
Define que se vende o prepara. Cada línea puede venir de dos fuentes:
| Fuente | Qué significa | Qué pasa en Ballista |
|---|---|---|
| Lot | La línea sale de un lote existente. | Se selecciona lote, cantidad disponible, precio y descripción. |
| Compound product | La línea sale de una variación de producto compuesto. | Ballista usa la variación, calcula campos derivados y puede autoasignar insumos/lotes según la configuración. |
Campos y lecturas importantes:
| Campo/bloque | Uso |
|---|---|
| Add detail | Agrega otra línea al pedido. |
| Remove | Quita una línea del borrador. |
| Quantity | Cantidad solicitada. |
| Compound variant | Producto compuesto/variación que se va a vender. |
| Assigned lots | Lote seleccionado para una línea tipo lot. |
| Available | Cantidad disponible del lote seleccionado. |
| Unit price | Precio unitario tomado o derivado del item. |
| Total price | Cantidad por precio unitario. |
| Inventario disponible hints | Mensajes que recuerdan si la línea depende de inventario disponible o autoasignacion. |
Si una línea usa lote y la cantidad supera disponibilidad, el asistente puede mostrar conflicto de inventario. Eso debe resolverse antes de prometer o crear el pedido.
Lectura práctica de una línea:
| Pregunta | Campo que responde | Por qué importa |
|---|---|---|
| Qué se está vendiendo? | Item name, lote o variante compuesta. | Es lo que vera operaciones y luego facturación. |
| Cuanto se está vendiendo? | Quantity. | Define total y consumo de inventario. |
| De dónde sale? | Lot o Compound variant. | Define si el inventario disponible se descuenta directo de un lote o por fórmula. |
| Cuanto cuesta cada unidad? | Unit price. | Alimenta total comercial del pedido. |
| Qué impuesto aplica? | salesTaxRateId derivado. | Necesario para facturación y consistencia fiscal. |
| Hay inventario disponible suficiente? | Available y validación servidor. | Evita prometer inventario que ya no existe. |
| Qué lote queda comprometido? | Assigned lots / asignaciones servidor. | Permite trazabilidad y auditoría. |
Criterio útil: no trates el precio y el inventario cómo campos separados. En Ballista, una línea completa debe decir que se vende, en que cantidad, de dónde sale, cuanto cuesta, que impuesto tiene y que inventario disponible queda reservado.
3. Optional actions
Esta seccion evita que el pedido quede sin seguimiento.
| Opcion | Qué agrega |
|---|---|
| Notes | Nota general del pedido. |
| Incluir tarea | Crea una tarea vinculada al pedido. |
| Task title | Título de la tarea. |
| Priority | Prioridad low, medium o high. |
| Owner ID | Responsable principal. |
| Fecha límite | Fecha de vencimiento de la tarea. |
| Task description | Detalle de lo que hay que hacer. |
| Include notification | Envia notificación a otro usuario. |
| Notification title | Título de la notificación. |
| User | Usuario destino. |
| Message | Mensaje que recibira el usuario. |
Usa tareas cuando alguien debe preparar, revisar, llamar, comprar o dar seguimiento. Usa notificación cuando necesitas avisar a una persona concreta.
Ejemplos concretos:
| Caso | Qué conviene activar |
|---|---|
| Ventas crea una orden que producción debe preparar. | Incluir tarea con responsable de producción y fecha limite. |
| Un pedido queda pendiente por falta de insumo. | Incluir tarea para compras o inventario. |
| Administración debe revisar datos fiscales antes de facturar. | Include notification al usuario de administración o Incluir tarea si requiere seguimiento formal. |
| El cliente pidio entrega urgente. | Tarea con prioridad high y nota clara. |
4. Feedback y envío
Antes de crear, el asistente puede mostrar:
| Mensaje | Significado |
|---|---|
| Validation message | Faltan datos requeridos o hay algo incoherente en el borrador. |
| Servidor validations | El servidor rechazo datos específicos. |
| Inventario conflict | Hay conflicto con lotes, inventario disponible o cantidades. |
| Trace ID | Identificador útil para soporte si el error viene del servidor. |
El botón final Crear pedido envía encabezado, líneas, tarea opcional y notificación opcional como un solo flujo. Si se crea correctamente, la lista se refresca.
Después de presionar el botón, piensa el resultado asi:
| Resultado | Qué significa | Siguiente acción |
|---|---|---|
| Orden creada | La transaccion término bien. | Abrir /orders/{id} y revisar detalle. |
| Error de validación | Falta campo o hay una incoherencia del formulario. | Corregir el campo indicado. |
| Error de inventario | El inventario disponible no alcanza o cambio mientras se creaba. | Revisar lote, cantidad o producto compuesto. |
| Error de impuesto | Falta impuesto en lote/materia prima o hay mezcla incompatible. | Corregir catálogos antes de crear. |
| Error de permisos | El usuario no puede crear órdenes. | Revisar roles/permisos. |
Error con traceId | Reintento inconsistente o conflicto de idempotencia. | Reportar a soporte con trace id y payload esperado. |
Abrir /orders/{id}
El número de pedido en la tabla abre el detalle. Ese detalle es el lugar correcto para trabajar con profundidad.
En el detalle se revisa:
| Sección/acción | Uso |
|---|---|
| Order overview actions | Acciones globales: volver, crear tarea, exportar, imprimir, facturar, copiar link. |
| Order data | Cliente, tipo, línea, fechas, estado, factura y notas. |
| Order lines | Líneas del pedido, lotes, productos compuestos, cantidades, impuestos, descuentos y totales. |
| Manage lots | Ajustar lotes asociados a una línea. |
| Create label | Crear etiqueta de preparación/farmacia cuando aplica. |
| Nueva tarea | Crear tarea conectada a la orden. |
| Facturar este pedido | Enviar contexto del pedido hacia Facturación. |
| View invoice | Abrir factura asociada si ya existe. |
| Print detail | Vista imprimible del pedido. |
| Export CSV | Exportar detalle para revisión externa. |
Criterio útil: usa /orders para encontrar y administrar pedidos; usa /orders/{id} para explicar y modificar un pedido con detalle.
Flujo hacia factura electrónica
Cuando el pedido está listo para facturar:
- Abre
/orders/{id}. - Revisa cliente, receptor, líneas, cantidades, impuestos y totales.
- Usa
Facturar este pedido. - Facturación carga el contexto del pedido.
- Revisa emisor, receptor, condición de venta, moneda, líneas, impuestos y total.
- Emite o simula según el ambiente configurado.
- Revisa el resultado en
historial de facturación.
Si la factura falla, normalmente no se arregla desde la lista de pedidos. Revisa cliente, datos fiscales, impuestos, CABYS, configuración FE o certificado en configuración de facturación.
Flujo recomendado para operar
- Entra a
/orders. - Revisa indicadores para saber volumen y pendientes.
- Usa filtro rápido o búsqueda avanzada para ubicar el pedido.
- Si el pedido no existe, usa
Crear pedido. - Completa
Order data. - Agrega líneas desde lotes o productos compuestos.
- Agrega tarea/notificación si alguien debe actuar.
- Crea el pedido.
- Abre
/orders/{id}. - Revisa líneas, lotes, totales y trazabilidad.
- Cambia estado solo cuando la operación realmente avanzo.
- Si corresponde, usa
Facturar este pedido. - Verifica factura en
historial de facturación. - Usa
Reportespara revisar resultados del periodo.
Problemas comunes
| Problema | Dónde revisar |
|---|---|
| No aparece un cliente en el selector. | Revisa Clientes; el pedido depende de clientes cargados. |
| No aparece un dependiente. | Revisa Dependents/Pets según el tipo de organización. |
| No aparece una línea de producto. | Revisa Product Lines. |
| No aparece un lote. | Revisa Lotes y disponibilidad actual. |
| El total no cuadra. | Abre /orders/{id} y revisa líneas, cantidades, descuentos, impuestos y precio unitario. |
El pedido dice sin facturar aunque se facturo. | Revisa historial de facturación y que la factura tenga orderId asociado. |
| No puedo crear o editar. | Revisa permisos create_orders y edit_orders. |
| Hay conflicto de inventario. | Revisa cantidad solicitada contra Available del lote o autoasignacion del producto compuesto. |
Para soporte
Cuando reportes un problema de pedidos, incluye:
- ruta exacta:
/orders,/orders/{id},/billingo/tasks; - id del pedido;
- cliente y dependiente si aplica;
- filtros usados;
- estado esperado y estado visible;
- si el problema está en lista, asistente, detalle, factura o tarea;
- mensaje de validación o
traceIdsi aparece; - si el pedido usa lote o producto compuesto.
Cómo se conecta
Pedidos conecta con Inventario y producción, porque las líneas pueden consumir lotes o productos compuestos. También conecta con Facturación y control, porque Facturar este pedido convierte el pedido en documento fiscal. Finalmente conecta con Reportes y decisiones, porque estados, fechas, montos y facturación alimentan indicadores.
Resumen
En Ballista, /orders sirve para encontrar, filtrar, crear y administrar pedidos. /orders/{id} sirve para trabajar el pedido en profundidad. Crear pedido captura encabezado, líneas, inventario disponible, tarea y notificación. Facturar este pedido conecta el pedido con facturación electrónica. Si algo no cuadra, revisa primero el módulo origen: clientes, lotes, productos compuestos, impuestos, configuración FE o permisos.