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

RutaQué esPara qué se usa
/ordersLista 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-detailEntrada ruta anterior o alternativa del detalle.Mantiene compatibilidad con rutas anteriores que también cargan el espacio de trabajo de detalle.
/billingFacturación electrónica.Recibe contexto desde Facturar este pedido para emitir o simular el comprobante electrónico.
/tasksSeguimiento 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:

indicadorQué muestraCómo se debe leer
PedidosCantidad total de pedidos conocidos por el módulo.Sirve para dimensionar volumen. Si parece bajo, revisa filtros o disponibilidad de datos.
PendientesCantidad de pedidos en estado pendiente.Ayuda a priorizar trabajo que todavía no avanza.
Monto totalSuma 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:

PermisoImpacto visible
create_ordersHabilita el botón Crear pedido.
edit_ordersHabilita 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:

EstadoSignificado operativo
TodosNo filtra por estado.
PendienteEl pedido existe, pero todavía requiere trabajo o confirmación.
En procesoEl pedido ya está activo operativamente.
PagadoEl pedido se marcó como pagado. Ojo: pagado no siempre significa que la factura electrónica este aceptada.
CanceladoEl 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

CampoQué filtraCuando usarlo
IDNúmero de pedido.Cuando soporte, ventas o el cliente ya tienen el identificador.
Pedido por / ClienteCliente que hizo el pedido.Cuando se revisa historial o pendientes de un cliente.
DependentDependiente asociado, cuando aplica.Útil en operaciones dónde el pedido se vincula a mascota/dependiente.
TypeTipo de pedido.Sirve para separar ventas, servicios, producción o clasificaciones internas.

Fechas

CampoQué filtraCuando usarlo
Creation dateFecha de creación del pedido.Para revisar pedidos capturados en un día o periodo.
Delivery dateFecha prometida/entrega.Para priorizar entregas, atrasos y promesas al cliente.

Clasificacion

CampoQué filtraCuando usarlo
StatusEstado operativo.Para combinar estado con cliente, fecha o línea de producto.
Product lineLí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ónQué hace
SearchAplica la búsqueda simple o los filtros avanzados visibles.
ClearLimpia 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:

ColumnaQué significa
OrderNúmero de pedido. Es un link a /orders/{id}.
ClienteCliente asociado al pedido.
DependentDependiente asociado, si aplica.
TypeTipo de pedido.
Product lineLínea de producto.
DateFecha de creación.
Delivery dateFecha prometida o de entrega.
TotalTotal del pedido en CRC.
E-invoice issuedIndica si ya existe factura electrónica asociada y muestra estado cuando existe.
StatusEstado operativo editable si el usuario tiene permiso.
ActionsAcciones de fila como Editar y Delete.

Columna E-invoice issued

Esta columna conecta pedidos con facturación electrónica.

ValorQué indica
InvoicedHay documento electrónico asociado al pedido en el historial de facturación.
sin facturarNo se encontro factura asociada a ese pedido.
Invoice statusEstado 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 visibleEstado API aproximadoUso
PendientependientePedido recibido, todavía sin ejecución completa.
En procesoen_procesoPedido activo.
PagadopagadoPedido marcado como pagado.
CanceladocanceladoPedido 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:

CampoUso
ClienteCambia el cliente asociado.
Order typeCambia la clasificacion del pedido.
Product lineCambia la línea de producto.
DependentCambia el dependiente asociado.
External referenceAsocia proveedor/referencia externa cuando aplica.
Promised dateFecha prometida.
Delivered dateFecha de entrega.
E-invoiceMarca si el pedido requiere factura electrónica.
NotesNotas generales del pedido.
StatusEstado 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:

BloqueContenido
Encabezado#id, cliente y selector/etiqueta de estado.
ResumenFecha, delivery date y total.
FacturaciónBadge de Invoiced o sin facturar.
Datos secundariosDependent, Type y Product line.
Row managementBotones 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 previoDónde se administraObligatorioPor qué importa
ClienteClientesSiEl pedido necesita id_cliente. Sin cliente, el asistente detiene la creación.
Tipo de pedidotipos de pedido / catálogosRecomendado en interfazClasifica la orden. El botón final queda incompleto si no se selecciona en el asistente.
Fecha prometidaSe captura en el asistenteSiEl servidor recibe promised_at y delivered_at; la interfaz exige fecha.
Lote con inventario disponibleLotes / inventarioSi la línea es tipo loteLa línea tipo lot necesita id_lote y cantidad disponible.
Materia prima del loteMaterias primasSi la línea es tipo loteEl lote apunta a materia prima; de ahí salen nombre, costo, unidad e impuesto.
Impuesto de venta del lote/materia primaTaxes / raw materialSi la línea es tipo loteEl asistente deriva salesTaxRateId; si falta, bloquea la creación.
Producto compuesto varianteCompound Product VariationsSi la línea es tipo compuestoLa línea tipo compound necesita id_producto_compuesto_variacion.
Formula/componentes del producto compuestoproductos compuestos / componentesSi la línea es tipo compuestoEl servidor usa la fórmula para saber que materias primas y cantidades reservar.
Materias primas con impuesto para la fórmulaMaterias primas + TaxesSi la línea es tipo compuestoSi 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órmulaLotesSi la línea es tipo compuestoEl servidor autoasigna lotes para cumplir la fórmula.
UsuariosUsuariosSolo si se crea tarea/notificaciónLa 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_ordersRoles / permisosSiSin 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.

PreguntaSi la respuesta es noDó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íneaRequisitos minimosQué valida BallistaQué ocurre con inventario
LotLote 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 productVariante 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.

  1. Entrar a /orders.
  2. Revisar si el pedido ya existe usando búsqueda simple, filtros o cliente.
  3. Si no existe, presionar Crear pedido.
  4. Seleccionar Cliente.
  5. Seleccionar Order type.
  6. Elegir el estado inicial, normalmente pendiente si todavía no se ha ejecutado.
  7. Definir Promised date.
  8. Marcar E-invoice si el pedido debe terminar en factura electrónica.
  9. Agregar dependiente si aplica.
  10. Agregar referencia externa si aplica.
  11. Crear una o varias líneas en Order lines.
  12. Para cada línea, decidir si viene de Lot o de Compound product.
  13. Revisar cantidad, precio unitario, impuesto y total de línea.
  14. Activar Incluir tarea si alguien debe preparar, revisar, llamar, producir o entregar.
  15. Activar Include notification si alguien debe recibir aviso inmediato.
  16. Revisar mensajes de validación.
  17. Presionar Crear pedido.
  18. Si se guarda, abrir /orders/{id} desde el link del pedido.
  19. Revisar líneas, lotes, totales, estado y trazabilidad.
  20. 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:

CalculoDónde ocurreResultado
Nombre, descripción, precio y etiqueta desde loteInterfazAl seleccionar lote, la interfaz llena item, descripción, precio unitario y etiqueta desde el lote/materia prima.
Nombre, descripción y precio desde producto compuestoInterfazAl seleccionar variante, la interfaz llena item, presentación/descripción y precio de venta.
Total de líneaInterfaz y servidorquantity * unitPrice - discount, con mínimo 0. Si no mandas precio_total, servidor calcula.
Impuesto por líneaInterfaz y servidorLa interfaz deriva salesTaxRateId; servidor guarda impuesto y porcentaje en sales_order_items.
Impuesto de encabezadoInterfaz/servidorSi todas las líneas tienen el mismo impuesto, se usa como impuesto del pedido. Si son mixtas, queda por línea.
Disponibilidad de loteInterfaz y servidorInterfaz consulta disponibilidad en tiempo real; servidor valida con bloqueo transaccional FOR UPDATE.
Asignacion de lotes para producto compuestoServidorEl servidor lee la fórmula y toma lotes disponibles por vencimiento e id hasta cubrir la necesidad.
Movimiento de inventarioServidorRegistra movimiento tipo reserve con cantidad negativa si existe core.inventory_movements.
indicadores y totales de listaInterfazLa 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:

RegistroTabla/área aproximadaCuando se crea
Ordencore.sales_ordersSiempre que la creación sea valida.
Líneas de pedidocore.sales_order_itemsUna por cada detail del asistente.
Asignaciones de lotecore.sales_order_item_lot_allocationsCuando la línea usa lote o cuando el compuesto autoasigna lotes.
Rebaja/reserva de inventario disponiblecore.raw_material_lots.current_quantityCuando se asigna un lote. Se resta la cantidad solicitada.
Movimiento de inventariocore.inventory_movementsSi la tabla existe; movimiento reserve con cantidad negativa.
TareaMódulo TareasSi se activa Incluir tarea.
NotificacionMódulo de notificacionesSi se activa Include notification.
Evento de dominiocore.order_domain_eventsSi la tabla existe; registra order_created.
Auditoría del intentoAuditoría de pedido completoEl 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.

SituacionQué 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

  1. El usuario selecciona un lote.

  2. La interfaz muestra disponibilidad (Available) y precio.

  3. La interfaz valida que la cantidad pedida no supere disponibilidad en tiempo real.

  4. El servidor vuelve a consultar el lote con FOR UPDATE.

  5. Si current_quantity alcanza, ejecuta:

    current_quantity = current_quantity - cantidad_solicitada

  6. Inserta una asignacion en sales_order_item_lot_allocations.

  7. Inserta movimiento de inventario tipo reserve con 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.

PasoQué hace el usuarioQué hace Ballista
1Abre Crear pedido.Carga clientes, dependientes, tipos, proveedores, usuarios, lotes y catálogos necesarios.
2Selecciona el cliente.Guarda el futuro id_cliente del pedido.
3Selecciona fecha prometida.Prepara promised_at y delivered_at para el payload.
4Agrega una línea tipo Lot.Muestra lotes disponibles desde inventario.
5Selecciona el lote.Llena nombre, descripción, precio, disponibilidad, impuesto y datos de materia prima cuando existen.
6Escribe cantidad 2.Calcula total de línea y valida que 2 no supere Available.
7Presiona Crear pedido.Envia /api/orders/create-complete.
8Servidor valida.Confirma cliente, lote, impuesto, cantidad y permisos.
9Servidor bloquea el lote.Usa la cantidad real actual, no solo lo que vio la interfaz.
10Servidor descuenta inventario disponible.Resta 2 de core.raw_material_lots.current_quantity.
11Servidor guarda trazabilidad.Crea item, asignacion de lote y movimiento reserve.
12La 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

  1. El usuario selecciona una variante de producto compuesto.

  2. La interfaz manda id_producto_compuesto_variacion y cantidad.

  3. El servidor busca la fórmula en compound_product_components.

  4. Por cada componente calcula:

    cantidad_necesaria = cantidad_formula * cantidad_pedida

  5. Busca lotes disponibles de esa materia prima.

  6. Ordena lotes por fecha de vencimiento y luego por id.

  7. Toma cantidades de uno o varios lotes hasta cubrir la necesidad.

  8. Si no alcanza, responde conflicto de inventario y no crea la orden.

  9. 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.

PasoQué hace el usuarioQué hace Ballista
1Selecciona cliente, tipo y fecha prometida.Prepara encabezado del pedido.
2Agrega una línea tipo Compound product.Carga variantes vendibles y detalles de fórmula.
3Selecciona Crema 100 ml.Llena nombre, descripción/presentación y precio de venta de la variante.
4Escribe cantidad 4.Calcula total comercial: 4 * precio_unitario.
5El asistente revisa componentes.Verifica que la variante tenga fórmula y que sus materias primas tengan impuesto.
6Presiona Crear pedido.Servidor recibe id_producto_compuesto_variacion y cantidad.
7Servidor lee la fórmula.Por cada componente calcula necesidad: cantidad de fórmula por cantidad pedida.
8Servidor busca lotes disponibles.Toma lotes por fecha de vencimiento primero para usar inventario disponible de forma razonable.
9Servidor descuenta lotes.Resta cantidades de los lotes necesarios para A y B.
10Servidor 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óduloRelación
ClientesProvee el cliente obligatorio.
Dependents/PetsProvee el dependiente opcional.
SuppliersProvee referencia externa/proveedor opcional.
tipos de pedidoClasifica el pedido.
Product LinesClasifica comercialmente el pedido.
LotesProvee inventario disponible real para líneas tipo lote.
Materias primasProvee materia prima, impuesto y unidad asociada a lotes/fórmulas.
TaxesPermite calcular impuesto de venta por línea.
productos compuestosDefine fórmulas para productos compuestos.
Compound Product VariationsDefine variantes vendibles, presentación y precio de venta.
Inventario MovementsRecibe movimientos reserve cuando se descuenta inventario disponible.
TareasRecibe tarea vinculada si se activa Incluir tarea.
NotificacionesRecibe notificación vinculada si se activa Include notification.
FacturaciónUsa la orden y sus líneas como origen para factura electrónica.
historial de facturaciónMuestra si una orden ya tiene documento electrónico asociado.
ReportesUsa pedidos, montos, estados, costos e inventario para indicadores.

Reglas de validación importantes

Estas son las reglas que más suelen bloquear una orden:

ReglaMensaje/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.

CampoQué significa
ClienteCliente que compra o solicita. Es obligatorio.
Order typeTipo de pedido. Ayuda a clasificar el trabajo.
StatusEstado inicial: pendiente, en proceso, pagado o cancelado.
Promised dateFecha prometida. Es obligatoria y no debería ser anterior al día actual.
E-invoiceIndica si el pedido requiere factura electrónica.
Dependent checkboxMuestra el selector de dependiente cuando aplica.
DependentMascota/dependiente asociado al pedido.
External reference checkboxMuestra referencia externa/proveedor cuando aplica.
External referenceProveedor o referencia asociada.

Lectura campo por campo:

CampoRequisitoEjemplo de uso
ClienteObligatorio. Debe existir en base de datos.Seleccionar la empresa o persona que compra.
Order typeRecomendado/esperado. Debe existir cómo catálogo.Venta normal, pedido especial, reposicion, servicio, según configuración del negocio.
StatusRequerido por operación.pendiente si apenas se recibe, en_proceso si ya se está ejecutando.
Promised dateObligatorio.Fecha que el negocio promete al cliente o fecha objetivo interna.
E-invoiceOpcional pero importante.Marcar cuando la venta debe terminar en factura electrónica.
DependentOpcional.Mascota, paciente, sucursal, contacto o entidad dependiente según el organización.
External referenceOpcional.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:

FuenteQué significaQué pasa en Ballista
LotLa línea sale de un lote existente.Se selecciona lote, cantidad disponible, precio y descripción.
Compound productLa 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/bloqueUso
Add detailAgrega otra línea al pedido.
RemoveQuita una línea del borrador.
QuantityCantidad solicitada.
Compound variantProducto compuesto/variación que se va a vender.
Assigned lotsLote seleccionado para una línea tipo lot.
AvailableCantidad disponible del lote seleccionado.
Unit pricePrecio unitario tomado o derivado del item.
Total priceCantidad por precio unitario.
Inventario disponible hintsMensajes 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:

PreguntaCampo que respondePor 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.

OpcionQué agrega
NotesNota general del pedido.
Incluir tareaCrea una tarea vinculada al pedido.
Task titleTítulo de la tarea.
PriorityPrioridad low, medium o high.
Owner IDResponsable principal.
Fecha límiteFecha de vencimiento de la tarea.
Task descriptionDetalle de lo que hay que hacer.
Include notificationEnvia notificación a otro usuario.
Notification titleTítulo de la notificación.
UserUsuario destino.
MessageMensaje 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:

CasoQué 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:

MensajeSignificado
Validation messageFaltan datos requeridos o hay algo incoherente en el borrador.
Servidor validationsEl servidor rechazo datos específicos.
Inventario conflictHay conflicto con lotes, inventario disponible o cantidades.
Trace IDIdentificador ú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:

ResultadoQué significaSiguiente acción
Orden creadaLa transaccion término bien.Abrir /orders/{id} y revisar detalle.
Error de validaciónFalta campo o hay una incoherencia del formulario.Corregir el campo indicado.
Error de inventarioEl inventario disponible no alcanza o cambio mientras se creaba.Revisar lote, cantidad o producto compuesto.
Error de impuestoFalta impuesto en lote/materia prima o hay mezcla incompatible.Corregir catálogos antes de crear.
Error de permisosEl usuario no puede crear órdenes.Revisar roles/permisos.
Error con traceIdReintento 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ónUso
Order overview actionsAcciones globales: volver, crear tarea, exportar, imprimir, facturar, copiar link.
Order dataCliente, tipo, línea, fechas, estado, factura y notas.
Order linesLíneas del pedido, lotes, productos compuestos, cantidades, impuestos, descuentos y totales.
Manage lotsAjustar lotes asociados a una línea.
Create labelCrear etiqueta de preparación/farmacia cuando aplica.
Nueva tareaCrear tarea conectada a la orden.
Facturar este pedidoEnviar contexto del pedido hacia Facturación.
View invoiceAbrir factura asociada si ya existe.
Print detailVista imprimible del pedido.
Export CSVExportar 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:

  1. Abre /orders/{id}.
  2. Revisa cliente, receptor, líneas, cantidades, impuestos y totales.
  3. Usa Facturar este pedido.
  4. Facturación carga el contexto del pedido.
  5. Revisa emisor, receptor, condición de venta, moneda, líneas, impuestos y total.
  6. Emite o simula según el ambiente configurado.
  7. 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

  1. Entra a /orders.
  2. Revisa indicadores para saber volumen y pendientes.
  3. Usa filtro rápido o búsqueda avanzada para ubicar el pedido.
  4. Si el pedido no existe, usa Crear pedido.
  5. Completa Order data.
  6. Agrega líneas desde lotes o productos compuestos.
  7. Agrega tarea/notificación si alguien debe actuar.
  8. Crea el pedido.
  9. Abre /orders/{id}.
  10. Revisa líneas, lotes, totales y trazabilidad.
  11. Cambia estado solo cuando la operación realmente avanzo.
  12. Si corresponde, usa Facturar este pedido.
  13. Verifica factura en historial de facturación.
  14. Usa Reportes para revisar resultados del periodo.

Problemas comunes

ProblemaDó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}, /billing o /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 traceId si 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.