Surtido en POS de un pedido (especificación funcional)



© 2024 Napse. Todos los derechos reservados.

REVISIONES


FechaVersiónDescripciónAutorJira


 

1.0Creación del documento

NAPSEPD-17067 - Obtendo detalhes do item... STATUS

NAPSEPD-16306 - Obtendo detalhes do item... STATUS

 

1.1Se agregan scripts del canal delivery, workflow y workflowStep creados para el flujo de POS


 

1.2Se completa el documento con tareas y se actualiza el diagrama de actividades


 

1.3Se ajustan algunos flujos y se actualiza con las mejoras que aún queden pendientes de implementación (futura)


 

1.4

Se agregan notas sobre descuentos sin edición y pantallas por bloqueo (con imágenes) 

Se agrega channel (ej Diarco) y workflow ajustado a ese canal


 

1.5

Se agrega nota sobre las actualizaciones luego de editar un pedido con la distribución del tlog


 

1.6

Se agregan flujos para alcance de editar pedido con pagos asociados al pedido original 

NAPSEPD-17537 - Obtendo detalhes do item... STATUS

 

1.7

Se agregan notas sobre alcance pedido con pagos


 

1.8

Se ajustan los escenarios de factura y NC


 

1.9

Se agrega tarea de devolución para pedidos con pagos con item AJUSTE

NAPSEPD-20655 - Obtendo detalhes do item... STATUS

Contenido

CONTENIDO


Nota Importante

Este manual contiene enlaces a documentos internos que refieren a contenidos específicos de uso restringido. Dichos contenidos han sido limitados y, por lo tanto, no están disponibles para el cliente final. En caso de necesitar más detalles o aclaraciones sobre los puntos referidos, se recomienda contactar con el equipo interno correspondiente.


Alcance

  • v7.5
  • Limitaciones del Sistema en Modo Offline: Este proceso no puede llevarse a cabo cuando el Punto de Venta (POS) se encuentra en modo offline en la tienda, ya que en esas circunstancias se utilizan los servicios REST de BCORE para las operaciones del POS.
  • Requisitos para el Surtido de Pedidos en POS: Solo se podrán surtir en el POS aquellos pedidos que cumplan con el modelo de ORDER, es decir, aquellos que hayan sido enviados a través del servicio API order/create hacia BMC, y que tengan asignado el código de la tienda de surtido a nivel de ítem.La información de los pedidos se debe adecuar a lo especificado para el servicio BRIDGE API - REST - Importación de Pedidos (publicado en el espacio NAPSE)
    • Conformidad de la Información de Pedidos: La información de los pedidos debe estar alineada con las especificaciones del servicio BRIDGE API - REST para la Importación de Pedidos.


Diagrama de actividades

Gestión de pedidos en POS

Funcionalidades

Precondición de configuración

  • Debido a que desde el POS se requiere invocar a una operación de API (cambio de estado) la siguiente property debería setearse con la IP, ya no se podría dejar como LOCALHOST



Funcionalidad/ ConfiguraciónDetalles de la funcionalidad / Configuración
1

Funcionallidad_POS/BCORE: pantalla de listado de pedidos con configuración por terminal 


a) Nuevo botón desde el menú de Operaciones

  • En el menú principal agregar un nuevo botón "PEDIDOS"
  • Sólo mostrar nuevo botón PEDIDOS si la configuración "Habilita la gestión de pedidos omni desde el POS"= SI 
    • Con esto podremos limitar la funcionalidad por terminal
    • En su defecto de no poder ocultarse, debería informarse que no está disponible la operación



b) Nueva pantalla del "Listado de pedidos"

Se requiere implementar una nueva pantalla para listar los pedidos (similar a la de CONSULTAR PRESUPUESTOS) 

  • Datos a mostrar en pantalla 

Label en pantallaDescripciónEjemplo
1
  • Canal
order.channel.namePedidos YA
2
  • Estado (del pedido)
order.orderState.nameConfirmado
3
  • Nro. de pedido 
order.internalNumberbridge0000077
4
  • Nro de pedido externo 
order.externalNumberPY123456
5
  • Total (monto total del pedido)
order.netAmount$1500.00
6
  • Fecha y hora (de creación del pedido)

order.createdAt

  "createdAt" : ISODate("2022-10-19T19:30:01.677Z"),

19/10/2022 19.30
7
  • Tiempo (PARA ESMAX: tiempo desde

fecha/hora de creación del pedido

a la hora actual) expresado en minutos 

calculado entre la fecha/hora actual con el campo order.createdAt

0.10hs
8
  • Cliente (nombre)

tipo de cliente OGN: order.party.name

tipo de cliente PRS: order.party.firstName lastName

Juan Perez


  • Filtros: opcionales

Label del filtro

en pantalla

DescripciónEjemplo
1
  • Canal  
filtrando por order.channel

Combo de selección (default: todos)

  • Informar la lista de channel.name cuyo campo disabled=false
2
  • Estado del pedido

(se pasa como ultima columna)

filtrando por order.orderState

Combo de selección (default: todos)

  • Informar la lista de orderState.name cuyo campo disabled=false
3
  • Nro. de pedido (externo)

Campo de texto libre

filtrando por order.externalNumber

Campo de texto libre
4
  • Cliente (nombre, nro documento)

Campo de texto libre

filtrando por order.party.name o order.party.firstName lastName (like, no debería ser case sensitive)

Campo de texto libre 
5
  • Fecha pedido desde
  • Fecha pedido  hasta (default: fecha actual) 
Default: fecha actual 

Mockup

  • Con el botón X (lupa) podré salir de esta pantalla volviendo al menú de selección de operaciones


Nuevo rol para la operación 

  • Se incorpora un role asociado a los grupos: operador, cajero y supervisor de caja
  • Role: 
        "name" : "pos-orderInvoice",
        "roleName" : "ROLE_pos-orderInvoice",
        "description" : "POS-Surtir y facturar pedidos",
        
2

Funcionalidad_POS/BCORE: consulta del servicio de BCORE del listado de pedidos 

Consulta de Listado de Pedidos en el POS

Para obtener el listado de pedidos en el POS, se debe realizar una consulta a través del servicio BCORE REST. Esta consulta se basa en el modelo de datos de la tabla "Order" y utiliza los siguientes parámetros de filtrado:

  • Fecha desde: Si se especifica una fecha de inicio, se utilizará esta como filtro. En caso contrario, se tomará el valor predeterminado configurado en la propiedad "Cantidad de días" o, si no está configurado, se usará la fecha actual.
  • Fecha hasta: Similarmente, si se especifica una fecha de fin, se utilizará como filtro. De lo contrario, se tomará la fecha actual como valor por defecto.
  • Número de Pedido: Filtra los resultados por el número externo del pedido (order.externalNumber). Si no se proporciona, se incluirán todos los pedidos.
  • Canal: Filtra por el canal del pedido (order.channel). Si no se especifica un canal, se mostrarán todos los canales.
  • Estado del Pedido: Filtra por el estado del pedido (order.state). Si no se especifica, se incluirán todos los estados.
  • Cliente: Filtra por el cliente asociado al pedido (order.party). Este filtro utiliza una búsqueda parcial (like) y no distingue entre mayúsculas y minúsculas. Si no se especifica un cliente, se mostrarán todos los pedidos.
3

Funcionalidad_POS/BCORE: consulta del servicio para obtener el detalle de un pedido 

Servicio consulta de un pedido (tablas Order, OrderItem, OrderPayment, etc)

  • Consulta por servicio de tienda a BCORE de un pedido
  • Nuevo servicio en el cual obtener del pedido seleccionado: 
    • Order, OrderItem, OrderPayment
4

Funcionalidad_POS/BCORE: flujo "seleccionar pedido" nuevo popUp de detalle del pedido

Flujo "SELECCIONAR PEDIDO"

Al seleccionar un pedido con doble clic en el listado de pedidos, se obtendrán los datos del pedido a través del servicio BCORE. El detalle del pedido se mostrará en un pop-up o una nueva pantalla. Esta interfaz contará con botones de acción que dependerán del estado del pedido, así como secciones que contienen los datos del pedido, del cliente y de los artículos.

Botones de Acción:

  • VOLVER: Este botón siempre estará presente. Al presionarlo, se cerrará el pop-up y se regresará a la pantalla del listado de pedidos.
  • CONFIRMAR PEDIDO: Cambia el estado del pedido a "Confirmed" y regresa al listado de pedidos.
  • SURTIR: Lleva a la pantalla de surtido del pedido si el estado es "ReadyToPick".
  • CANCELAR PEDIDO: Cambia el estado del pedido a "Cancelled" y regresa al listado de pedidos.

Los datos que se informarán en cada sección serán:

1) Encabezado: datos del pedido


LabelDato de donde obtenerlo
1CANAL/DELIVERYorder.channel.name
2NRO PEDIDOorder.externalNumber
3ESTADO DEL PEDIDOorder.orderState.name
4FECHA/HORA PEDIDOorder.createdAt 
5TIEMPO

campo calculado (diferencia entre la fecha y hora actual con la del campo order.createdAt)

6MONTO TOTALorder.netAmount
7DESC AL TOTALorder.manualDiscountAmount 

2) Encabezado: datos del cliente

    


LabelDato de donde obtenerlo

1

NOMBREorder.party.firstName + lastName
2DOCorder.party.partyIdentificationType.description
order.party.identifier
Nota: Este dato puede agregarse para los pedidos de DIARCO
3DIRECCIONorder.party.partyContactMethod.address
(address.firstLine + city)
4EMAILorder.party.partyContactMethod.emailAddress
5TELEFONOorder.party.partyContactMethod.telephone.countryCode + areaCode + telephoneNumber

3) Lista de artículos - LABEL DE PANTALLA "ARTICULOS"

  1. Lista de Artículos - "ARTÍCULOS"

LabelDato de donde obtenerlo
1CANTIDADorderItem.orderedQty (numberDecimal)
2CODIGO ARTICULOorderItem.item.internalCode (string)
3DESCRIPCIONorderItem.description (string)
4PRECIO UNITARIOorderItem.unitPrice (numberDecimal)
5DESCUENTOorderItem.priceModifiers.amount (numberDecimal)
6TOTALorderItem.netAmount (numberDecimal)
7STOCKEste dato se obtiene mediante una consulta al stock de la tienda para cada ítem.
Se debe informar solo el stock del ítem en estado Onsale del depósito de la tienda.

4) Información Adicional

LabelDato de donde obtenerlo
Información Adicionalorder.notes (string)
Nota: Este campo es de solo lectura y no es editable.


5) Botones de acción 

Estos botones de acción van a depender del estado del pedido (evaluar como BCORE puede obtener esto del workflow)

  • CONFIRMAR PEDIDO (con este botón de acción pasará a la pantalla del listado de pedidos y BCORE solicitará a API que aplique un "statusChange" a "Confirmed")
    • ver flujo "Confirmar pedido" - cuando el estado del pedido es CREADO ("Open")
  • SURTIR (con este botón de acción deberá pasar a la pantalla popUp del surtido del pedido)
    • ver flujo "Surtir pedido" – cuando el estado del pedido es LISTO PARA SURTIR ("ReadyToPick")
  • CANCELAR PEDIDO (con este botón de acción se debe disparar el cambio de estado "Cancelled" del pedido)
    • ver flujo "Cancelar pedido"
  • VOLVER (con este botón de acción se cierra el popUp sin acción alguna volviendo a la pantalla de listado de pedidos)

MOCKUP - pantalla en modo ver pedido

5

Funcionalidad_POS/BCORE:  Flujo "Confirmar pedido", actualización de estado de un pedido.


Cuando desde el POS se selecciona una acción del popUp como CONFIRMAR, SURTIR PEDIDO, BCORE debe actualizar el estado del mismo. 

  • Para ese fin se utilizará API (statusChange) el cual modifica el estado del pedido y genera la replicación de BMT a BMC de la order actualizada


Flujo "CONFIRMAR PEDIDO" 

  • El operador seleccionó un pedido del listado
  • La aplicación POS al recuperar un pedido en estado CREADO habilita los botones de Acción: CONFIRMAR PEDIDO, CANCELAR PEDIDO, VOLVER
  • El operador selecciona el botón CONFIRMAR PEDIDO
  • La aplicación POS vuelve a la pantalla del listado de pedidos y solicita el cambio de estado a API (statusChange) 
    • API replica el cambio de estado de la order a BMC y de alli por medio de configuración del workflow se alimenta la cola Rabbit de auditoría de estado de un pedido
    • Los botones de acción quedan determinados por el workflowStep del canal


Según el workflow definido para estos pedidos, API al cambiar a CONFIRMADO tiene el pasaje automático a LISTO PARA SURTIR. 

Entonces el pedido una vez que se CONFIRMA, pasa  a LISTO PARA SURTIR lo cual habilita el SURTIDO DEL PEDIDO desde el POS





6

Funcionalidad_POS/BCORE:  Flujo "Cancelar pedido", actualización de estado de un pedido.

Cuando desde el POS se selecciona una acción del popUp como CONFIRMAR, CANCELAR PEDIDO, BCORE debe actualizar el estado del mismo. 

  • Para ese fin se utilizará API (statusChange) el cual modifica el estado del pedido y genera la replicación de BMT a BMC de la order actualizada

Flujo "CANCELAR PEDIDO" 

  • El operador seleccionó un pedido del listado
  • La aplicación POS al recuperar un pedido en estado CREADO o LISTO PARA SURTIR habilita los botones de Acción: CANCELAR PEDIDO, CONFIRMAR PEDIDO (sólo si el estado es CREADO), SURTIR PEDIDO (solo si el estado es LISTO PARA SURTIR), VOLVER
  • El operador selecciona el botón CANCELAR PEDIDO
  • La aplicación POS informa con un mensaje si confirma la acción CANCELAR con un popUp con botones ACEPTAR y CANCELAR
  • El operador presiona
    • CANCELAR: cierra el popUp y permanece en el popUp previo sin que se proceda a cancelar
    • ACEPTAR: vuelve a la pantalla del listado de pedidos y solicita el cambio de estado a API (statusChange) a "Cancelled" 
    • API replica el cambio de estado de la order a BMC y de allí por medio de configuración del workflow se alimenta la cola Rabbit de auditoria de estado de un pedido (notificando el plugin al canal de delivery o sistema externo)
    • Los botones de acción quedan determinados por el workflowStep del canal

7

Funcionalidad_POS/BCORE:  Pantalla de detalle del pedido con botones de acción cuando está Listo para surtir

MOCKUP de pantalla - Pedido listo para surtir

Botones de acción:

  • SURTIR PEDIDO: pasa a un popUp donde poder marcar los ítems del pedido
  • CANCELAR PEDIDO: cambia de estado del pedido a cancelado y ya no puede continuar
  • VOLVER: vuelve al listado de pedidos sin acción alguna sobre el pedido



8

Funcionalidad_POS/BCORE: pantalla de surtido de pedido. Flujo "Surtir pedido"

  • Luego de que el operador haya elegido la acción SURTIR PEDIDO, pasa a una nueva pantalla de "surtido de pedido" o popUp


Flujo "SURTIR PEDIDO" – cuando el estado del pedido es LISTO PARA SURTIR ("ReadyToPick") definido por workflow

  • El Operador seleccionó el botón de acción SURTIR PEDIDO de un pedido cuyo estado es "LISTO PARA SURTIR" (ver flujo BLOQUEAR PEDIDO)
  • La aplicación POS recupera la lista de artículos del pedido y los informa en la pantalla popUp (la pantalla es la misma base de ver pedido con modo rápido de surtido de un ítem)
  • El operador podrá ingresar un artículo por alguno de estos medios 
    • scanner: lectura del código de barras (evento escuchando el scanner) 
    • con un check en el registro (contemplando el total de la cantidad de unidades)
    • presionando el botón (mais) o (menos)
    • A medida que se van seleccionando o agregando los artículos se irá completando la cantidad de unidades solicitadas
  • El operador una vez marcados todos los artículos presiona el botón CONTINUAR (flujo alternativo CANCELAR PEDIDO)(flujo alternativo VOLVER)
    • Flujo volver: vuelve a la pantalla de listado de pedidos sin realizar acción alguna sobre el mismo 
  • La aplicación POS valida que todos los artículos hayan sido surtidos y pasa a la pantalla de VENTAS (ver flujo transformar pedido en VENTA)
    • Esto cuando tiene pagos asociados por ejemplo (NO DEBERIA poder modificarse el pedido original) #14

Datos a mostrar en pantalla (mismos que de la acción ver, con posibilidad de marcar con un check el total de unidades o con los botones de (mais) o (menos) para ir indicando las cantidades surtidas del ítem)

  • Encabezado del pedido
  • Lista de artículos del pedido original (con su precio, total y stock al momento de consultar el pedido) 


MOCKUP DE PANTALLA de surtido de pedido 



9

Funcionalidad_BCORE: Flujo "bloquear pedido/desbloquear pedido"

Flujo "BLOQUEAR PEDIDO"

  • Bloquear un pedido cuando se toma desde el listado de pedidos con alguna acción que puede determinar un cambio de estado 
    • Al surtir orden 
  • Se debe generar un registro en la tabla registerProcessTransactionEvent
  • Esto es para que no quede visible en el listado de pedidos hasta no quedar desbloqueado por el usuario que lo tiene surtiendo (y por los tiempos en los cuales puede demorar la actualización de estado de API) 

Ejemplo de un pedido bloqueado por un usuario o porque se encuentra facturado y se está procesando su tlog


Flujo "DESBLOQUEAR PEDIDO"

  • Se debe desbloquear un pedido cuando
    • se CANCELA una orden el pedido se debería desbloquear
    • se presiona el botón VOLVER (desde el surtido)
    • Esto es para que quede visible nuevamente desde el listado de pedidos
  • Crear nuevo tipo de bloqueo (de OMNI_ORDER)


Una vez procesado el tlog, se desbloquea y ya no queda visible el icono del candado 


NOTA: de requerir el desbloqueo forzado, se podrá utilizar el menú de Bridge Manager tienda Monitoreo/Adm de transacciones


En el POS, se muestra con el candado y se concatena el nro de pedido externo - nro de pedido interno, con el usuario que lo tiene bloequeado, tienda, terminal y fecha


  • Si un pedido LISTO PARA SURTIR se encuentra bloqueado:
    •  Al seleccionarlo, solo tendrá la posibilidad de verlo. Con un botón VOLVER. No tendrá posibilidad de cambiarlo de estado. 

10

Funcionalidad_BCORE: escuchar evento de scanner en surtido de pedidos. En la pantalla popUp de surtir pedido

EVENTO SCANNER

  • Permitir el ingreso por scanner de un código de barras de un ítem
  • Este código de barras se buscará asociado a alguno de los ítems del pedido
    • Si se encuentra y está activo se agrega como cantidad = 1
    • Si no se encuentra informar error: "Código de barras no pertenece a ninguno de los artículos del listado" o similar


Ejemplo de dos ítems con código de barras

a) Si se ingresa un código de barras de un artículo que no está en la orden original, al momento de surtir se informará: "No se corresponde con un artículo de la orden"

b) Si se ingresa un código de barras de un item que no existe en el maestro, se informará: "El artículo no existe"

c) Si se ingresa un código de barras de un ítem existente, se tomará como cantidad 1 del ítem ingresado.

11

Funcionalidad_BCORE: validar el surtido total de ítems del pedido original 

VALIDACION TOTAL ITEMS SURTIDOS 

  • Validar que no se permita pasar a ventas si no se surtieron todos los ítem del pedido
    • Esto es para que no apliquen modificaciones sobre el pedido original (ya que no es soportado por 2 de los plugins) y si existieran pagos 
    • Por configuración 
      • Se utiliza el parámetro “store.orderEditItemsAllowed”  = NO (valida que se surta la totalidad de los artículos del pedido)

  • Si no se completa el total de ítems, se informará: "Debe completar la orden para continuar" y no permite continuar.


12

Funcionalidad_POS/BCORE: recuperar lista de artículos del pedido surtido y agregarlos a la venta. Flujo transformar pedido en venta 

Flujo "TRANSFORMAR PEDIDO EN VENTA"

  • El Operador luego de surtir el pedido presionó el botón de acción CONTINUAR del popUp del surtido
  • La aplicación POS pasa a la pantalla de venta con la lista de artículos del pedido con sus cantidades, precios y totales
    • Se convierte el pedido en una transaction (tipo: sale)
    • Los ítems y sus precios son los recibidos del pedido (no se recalculan) 
  • La aplicación POS valida si puede o no modificar la venta de la orden 
    • Esto solo si no tiene pagos asociados (configuración)  (ver flujo alternativo EDITAR PEDIDO)(ver flujo alternativo RESTRINGIR CAMBIO DE CLIENTE)
  • El Operador presiona el botón PAGAR para finalizar la venta
  • La aplicación POS pasa a la pantalla de PAGOS 
  • El Operador selecciona el medio de pago (se validará que sean los definidos para el canal) 
  • La aplicación POS una vez saldada la venta la finaliza 
    • Imprime comprobante según categoría fiscal del cliente (le agrega canal y nro de pedido externo) 
    • genera TLOG

Ticket ejemplo


Flujo alternativo RESTRINGIR CAMBIO DE CLIENTE

  • La aplicación POS al estar en la pantalla de ingreso de artículos de la venta del pedido:
    • valida que no se pueda cambiar el cliente del pedido por otro informando mediante mensaje (esta validación aplica siempre que sea facturación de un pedido con o sin edición) 


Restricciones con configuración "Admite la edición de items" = NO


a) No se puede agregar artículos que no estaban en el pedido

b) No se puede anular artículos del pedido

c) Descuento manual a un articulo

d) Descuento manual al total de la transacción

e) Anular descuentos al total del pedido

f) Anular descuento de un artículo del pedido

13

Funcionalidad_POS: flujo cancelar surtido

Flujo alternativo - "CANCELAR SURTIDO" con botón VOLVER en popUp de surtido

  • El operador estando en la pantalla de surtido presiona el botón VOLVER.
    • El pedido no cambia de estado
    • El pedido no queda surtido parcial, sino que se pierde lo ingresado regresando al listado de pedidos


Flujo alternativo - "CANCELAR SURTIDO" con botón "X"de la pantalla de venta

  • El operador estando en la pantalla de ventas luego de haber pasado por la de surtido, presiona el boton "X" 
    • El pedido no cambia de estado
    • El pedido no queda surtido parcial, sino que se pierde lo ingresado regresando al listado de pedidos
    • Se genera un tlog de una venta con cancelFlag=TRUE

14

Funcionalidad_POS/BCORE: pago de la venta que factura un pedido



  • Los medios de pago serán los habilitados para el canal


Se crea el medio de pago delivery (tipo cash, sin solicitud de datos adicionales)

Se debe evaluar si creamos uno por cada canal con su propio nombre (Rappi, UberEats y PedidosYA)


FINALIZAR

  • Si hubiera un único medio de pago asociado al canal, se muestra el botón FINALIZAR y al presionarlo se asigna ese medio de pago para el cierre de la venta. 


15

Funcionalidad_POS/BCORE: flujo "Editar pedido" (sólo si no hay pagos)

El sistema debe tener configurado este parámetro = SI

Flujo alternativo - "SURTIDO PARCIAL DEL PEDIDO"

  • La aplicación POS muestra en pantalla el listado de todos los ítems surtidos del pedido original en el estado "Listo para surtir" luego de haber seleccionado el botón de acción SURTIR PEDIDO 
  • El Operador podrá:
    • marcar el surtido de los ítems total o parcial 
    • con el botón CONTINUAR da por completo el surtido del pedido original, pudiendo luego editarlo al pasar a la pantalla de ventas
    • ver flujo alternativo: "SURTIDO PARCIAL DEL PEDIDO CON DESCUENTOS" 

Ejemplo del surtido parcial:


Flujo alternativo - "SURTIDO PARCIAL DEL PEDIDO CON DESCUENTOS" 

Este escenario se da solo si en el pedido hay descuentos al total de la transacción o a un ítem surtido parcialmente y hay surtido parcial. 

  • La aplicación POS muestra en pantalla el listado de todos los ítems del pedido original a surtir (luego de seleccionado el botón de acción SURTIR PEDIDO)
  • El Operador seleccionó una cantidad menor de artículos a surtir:
    • al presionar el botón CONTINUAR del popUp de surtido se validará 
      • si hay artículos surtidos parcialmente y tienen descuento asociado
        • se informará: "Artículo XXX tiene un descuento aplicado y no puede ser surtido en forma parcial. Debe marcarlo en su totalidad o no marcarlo como surtido. Luego en la pantalla de venta podrá reingresar el articulo y aplicar nuevamente el descuento"
          • este mensaje se informará en un popUp con el botón ACEPTAR (ya que es la única acción porque es solo notificación y vuelve al popUp de surtido)


En el ejemplo, el articulo SPRITE354 tiene un descuento al ítem y se ingresó solo una unidad de las 2 pedidas. Al presionar el botón CONTINUAR, se informará con un popUp para que anule todos o agregue todas las cantidades de ese articulo. 

  • si es surtido parcial y existe descuento al total de la transacción 
    • se informará: "Como el surtido no está completo, para continuar es necesario que confirme la anulación del descuento a la transacción. Luego puede reingresarlo en forma manual"
      • este mensaje se informará en un popUp con los botones CONTINUAR y CANCELAR
        • si presiona CONTINUAR pasa a la pantalla de ventas y se anula automáticamente el descuento al total de la transacción que tenia
        • si presiona CANCELAR vuelve al popUp de surtido para surtir por el total como opción

  • Con el botón Continuar pasa a la pantalla de ventas y se anula el descuento al total


Flujo alternativo - "EDITAR PEDIDO"

Este escenario admitiría surtir una cantidad menor a la del pedido original previo a pasar a la venta

  • La aplicación POS muestra en pantalla el listado de todos los ítems surtidos del pedido original 
  • El Operador podrá:
    • los ítems no surtidos deberían aparecer como anulados (si es facturación de una orden, se omite la configuración: terminal.discardVoidingsOnScreen
    • pagar el pedido (mediante el botón PAGAR o FINALIZAR si hubiera solo un medio de pago asociado al canal) 
    • (ver flujo alternativo: Agregar/anular articulo al pedido) 
  • El operador pasa a la pantalla de PAGOS, selecciona el o los medios de pago
  • La aplicación POS con los pagos salda la transacción y finaliza la venta
    • Emite el comprobante (ticket factura, factura)
    • Genera el TLOG


En la pantalla de surtido no se surte uno de ellos

Al presionar Continuar, pasa a la pantalla de ventas y se muestra ese artículo como anulado 


Flujo alternativo - "AGREGAR/ANULAR ARTICULO AL PEDIDO"

  • El POS en la pantalla de ingreso de artículos (ídem venta) se podrá:
    • ver el canal del pedido y los datos del cliente
    • agregar ítems (al agregarse será considerando las reglas de BCORE de cálculo de precios: busca si tiene lista de precios por canal, sino lista de la tienda, sino maestro de item)
    • anular un ítem
    • aplicar descuento al ítem o a la transacción 


Al editar un pedido se podrá agregar otros artículos

También se podrá anular o agregar descuentos

  • Ejemplo ítem anulado: Heineken 
  • Ejemplo de descuento: 10% a Pilsen 600 

No hay restricción de envío a PROMO (de no aplicar deberían restringirse por configuración de la promo)


REGISTRO EN TLOG

  • Ante estos escenarios de debe contemplar tener auditoria de los cambios a partir de los ítems del pedido original y los ítems facturados
  • Esto al ser procesado por API debería dejar alguna auditoria en la ORDER.


ITEMS con magnitud

  • Se podrá surtir completo o no surtir y de aplicar cambios se podrán realizar desde la pantalla de ventas.
  • El (mais) y (menos) es por unidad (no contempla fracción) 
16

Funcionalidad_POS/BCORE: agregar información del pedido al TLOG de la venta (proveniente de una order/pedido) 

  • En el TLOG de la venta se deben agregar los datos de la orden facturada
      • "orderNumber" : "bridge0000000095",
         "order" : {
                "externalNumber" : "FD1223450",
                "internalNumber" : "bridge0000000095",
                "channel" : "online"
            },
        - Considerar agregar el StoreID (vendrá asociado al canal)
        - Se agrega a nivel ítem los dos campos de cantidad del pedido original y cantidad surtida
        fullfilledItemCount y originalQtyRequested




17

Funcionalidad_API: procesar TLOG de facturación de orden

TLOG de venta finalizada (cancelFlag=false)

  • Cambia el estado del pedido a FACTURADO con statusChange de API 
  • Esto replicaría el cambio de estado de la ORDER de BMT a BMC y por consiguiente ser notificado al plugin
  • Se debe asociar a la order en su lista de transactions con los datos del TLOG
  • Se debe setear en Order, el flag "invoiced" : true,
  • Se debe actualizar el pago 


Ejemplo de una venta facturada en forma automática donde en Order se asocia la misma

  •   "transactions" : [ 
            {
                "_id" : ObjectId("63ee5abca2f4121f6ade92cc"),
                "id" : ObjectId("63ee5aaf1282ad35989bf7b3"),
                "storeCode" : "1",
                "terminalCode" : "0",
                "operatorCode" : "juan",
                "trxNumber" : 174,
                "trxDate" : ISODate("2023-02-16T16:32:46.743Z"),
                "trxType" : "Sale",
                "billType" : "TF B",
                "serieOfficialBill" : "B",
                "fiscalPOSNumber" : "0",
                "docNumber" : "00000174",
                "billNumber" : "TF B B-0000-00000174"
            }
        ],
18

Funcionalidad_API: procesar TLOG de cancelación de orden

TLOG de venta cancelada

  • Al procesar un TLOG de una venta de una orden que fue cancelada, es decir, su factura no fue finalizada exitosamente:
    • API debe desbloguear la orden (pendiente)
    • Distribuye la información de la venta como cancelada (ídem funcionalidad actual) 
    • Esto no modifica el estado del pedido (order) 
19

Reporte "Detalle de venta por items"

En el reporte "Detalle de venta por ítems" 

  • Se cuenta con un filtro de canal
  • En el listado, se agregaron los campos:
    • Canal (código del canal) 
    • Nro pedido (nro de pedido externo del canal) 
    • Cod barras (cod de barras si fue ingresado, sino el cod del item)

20

Funcionalidad_API: procesar TLOG de facturación de orden / auditoria del pedido con pagos, cuando el pedido recibido no tenia pagos asociados y se le agrega el pago dummy 



REGISTRO EN TLOG - distribución y actualización de datos (pago)

  • A partir de la factura de un pedido se debe contemplar actualizar los pagos del pedido original luego de su distribución. 
    • En orderPayment, se debe actualizar el pago del pedido original con el o los pagos de la factura
    • En dist.transaction.retail.ts/distributeToOrder, actualizar el registro del pedido facturado con los sig. datos según el tipo de medio de pago
      • Considerará que sea para venta, no así devolución (por si a futuro hay una NC automática)

Medio de pagoDescripciónCampos a actualizar
1Efectivo

Si el pago de la transactionRetail de la factura de la orden es en efectivo 


En el pedido original, sin pagos se asocia uno dummy (según configuración) 

{
    "_id" : ObjectId("642cc3b83af082e36df7cc24"),
    "order" : ObjectId("642cc3b83af082e36df7cc23"),
    "tender" : ObjectId("606f016d2c84790ba7a4e135"),
    "amount" : NumberDecimal("590"),
    "paymentTypeCode" : "DummyOnline",
    "version" : 0,
    "createdAt" : ISODate("2023-04-05T00:41:28.581Z"),
    "updatedAt" : ISODate("2023-04-05T01:03:00.108Z"),
    "paymentDate" : ISODate("2023-04-05T00:48:06.015Z")
}

Se podrían considerar estos datos, para actualizar luego de la distribución del TLOG

en dist.transaction.retail.ts

 if (tran?.transaction?.trxType == trxTypeSale) {
                        //completo la fecha del pago para todos los pagos de la orden
                        let orderPayments: iOrderPayment[] = await OrderPayment.find({order: order._id})
                        if (orderPayments.length > 0) {
                            for (const orderPayment of orderPayments) {
                                orderPayment.paymentDate = moment(tran?.transaction?.beginDateTime).toDate()
                                orderPayment.save({session})
                            }

Se debería actualizar:

  • tender
  • amount 
  • paymentTypeCode
2

Tarjeta


Si el pago de la transactionRetail de la factura de la orden es en tarjeta

Actualizar (de contar con esta información en el TLOG de la factura de la venta)

  • tender
  • amount 
  • paymentTypeCode

Propios de tarjeta

  • planDescriptor
  • selllerName
  • authorizationCode
  • couponNumber
  • lotNumber
  • installments
  • reference Number              

Ejemplos de la implementación

21

Funcionalidad_API: procesar TLOG de facturación de orden / auditoria de la edición del pedido artículos 


REGISTRO EN TLOG - distribución y actualización de datos (ítems)

  • Ante estos escenarios de debe contemplar tener auditoria de los cambios a partir de los ítems del pedido original y los ítems facturados (con su actualización)
  • Esto al ser procesado por API debería dejar alguna auditoria en la ORDER  (ítems agregados, cantidades surtidas y un indicador si fue editado, es decir surtido de menos o agregado al pedido)
  • Considerar el agregado de un campo flag que indique su edición en el pedido

-------------------

  • Si se agregaron items, se genera un nuevo registro en orderItem
  • Los del pedido original se actualizan (si fueron anulados o no surtidos, su cantidad fullfilledQty será = 0, idem su netAmount)

Datos a actualizar del ítem

   order: order._id,
                item: item._id,
                store: storeId,
                location: locationId,
                description: lineItem.description ? lineItem.description : item.description,
                orderedQty: orderedQty, ----------si es un item agregado = 0
                unitPrice: mongoose.Types.Decimal128.fromString(lineItem.unitPrice.toString()),
                requiredDate: lineItem.requiredDate ? moment(lineItem.requiredDate, FORMAT_DATE_ORDER).toDate() : null,
                priceModifiers: priceModifiers, ----------si se agregó un descuento o se quitó
                fulfilledQty: serializedUnits?.length > 0 ? mongoose.Types.Decimal128.fromString(serializedUnits.length.toString()) : fulfilledQty, ----------- con el campo fullfilledItemCount del TLOG
                netAmount: netAmount,----------con el precio extendido del TLOG


  • Se actualizan los descuentos que se hayan agregado a los ítems en la venta
  • Se guardan los descuentos originales que haya tenido el ítem en el pedido original para que queden como auditoria 


22

Funcionalidad_API: agregar al request del pedido la posibilidad de enviar el partyRole para el cliente si no se envía, asume el  que se haya definido como rol por defecto (por configuración del sistema) 


Inclusión del partyRole en el request de pedido

  • Se incluye la posiblidad de enviar para un cliente la lista de partyRoleAssignment

a) Incluir en request de un pedido un campo asociado al party que permita recibir su partyRole

  • En el request incluirlo como campo:
    •  "party":{
            "code":"998040688",
            "firstName":"Analia",
            "lastName":"Luz",
            "email":"contacto@electroweb.com.ar",
            "typeCode":"Person",
            "identificationType":1,
            "identifier":"998040688",

                 "partyRoleAssignment": [{

"partyRole": "EMPLE"}

],  ---------- se podría recibir una lista con los códigos del tipo de cliente o partyRole.code


  • Si el partyRole no se envia o se envía uno inexistente
    • Se le asocia el definido si lo estuviera en la systemProperty: 
      • Código de tipo de cliente por defecto = CLI (ejemplo)
        • name: store.defaultCustomerPartyRole
23

Funcionalidad_API/POS: agregar la presentación o código de barras en request y pantalla del pedido

Incluir la presentación en el request del pedido y en el surtido 

Manejo de código de barras o presentaciones

  • Request del pedido: agregar el campo de código de barra, no obligatorio, si existe descripción del código de barra se informa esa descripción, si no, usar la descripción de SKU.
    • campo "barcode" 
    • tipo string 
    • opcional
    • NOTA: la descripción se la debería enviar en el mismo campo actual (ya sea por el ítem o por la presentación/código de barras) 
    • VALIDACION: al crear el pedido, validar contra la tabla barcode (por ítem y barcode) Si no existe esa relación, informar error.
    • MODELO OrderItem: agregar el campo barcode
  • En pantalla del pos: si viene el pedido con código de barra, en pantalla mostrar el ítem con el código de barra, no por SKU.

El popUp del pedido y en la pantalla de ventas.

  • Al pasar del popUp del pedido a la venta, simular el ingreso por código de barras (ídem la venta por presentación actual) 

  • NO DEBERIA APLICAR CAMBIO si mantiene la misma lógica de la venta. Solo se menciona como punto a revisar y controlar en pruebas

Ejemplo de como se ve en la consulta de artículos y luego como se agrega a la venta cuando tiene código de barras

--------------------------

  • TLOG: Debe viajar en el TLOG el código de barra, como cuando vendo un barra en una venta que no es pedido.
  • Estos puntos se mencionan pero no requieren desarrollo porque sería lo mismo que de una venta
    • Exportación a Rabbit: Tienen que viajar en la exportación el código de barra, tal como viaja hoy en una venta que no es un pedido.
    • FF: enviar a FF el código de barra.

Alcance edición de pedidos con pagos asociados.

Funcionalidades


Funcionalidad / ConfiguraciónDescripción 
1

Reservas


Incorporación de Reservas del Pedido en el Proceso de Venta

Durante el proceso de recuperación de un pedido en el POS, a partir de la acción del workflow de reserva, se debe incorporar el código de reserva (orderItem.reservationCode) en el ticket. Esta información asegura que las reservas vinculadas a los ítems del pedido se reflejen correctamente en la transacción de venta.

Además, es fundamental considerar la cancelación automática de las reservas de aquellos ítems que no sean surtidos. Esta cancelación debe registrarse en el TLOG, específicamente en la etiqueta itemTicketListStockInformation.

El API se encarga de realizar las reservas a través de las acciones del workflow, y el POS debe levantar el pedido con las reservas ya asignadas. Al surtir el pedido, el código de reserva debe ser agregado al ticket de venta.

Escenarios a Considerar:

  1. Reservas por Artículo: Cada artículo del pedido puede tener una reserva asociada.
  2. Surtido Parcial: En el caso de surtido parcial (por ejemplo, artículo A con 2 unidades, de las cuales solo se surte una), al pasar de la pantalla de surtido a la de venta, se debe cancelar la reserva de la unidad que no fue surtida.
  3. Anulación de Ítems: Si un pedido es marcado como surtido total pero luego se anula un ítem en la pantalla de venta, es necesario cancelar la reserva correspondiente a esa unidad anulada.

Se agrega un ejemplo de una venta hecha en el POS con reserva y anulación

FARMA - Prueba de reserva de items con anulación parcial .msg

2

Pago del pedido

Asociación del Pago Original al Ticket al Facturar un Pedido

Al momento de facturar un pedido, es necesario agregar el pago original al ticket de venta. En la pantalla de VENTA, se debe utilizar el botón "FINALIZAR" para evitar la selección de un nuevo medio de pago, asegurando que se asocie el medio de pago original del pedido.

La implementación de esta funcionalidad puede apoyarse en la operación "billOperation" de BCORE, que permite recibir y procesar los datos del pago asociados a la orden.

Se detallan los datos que se hayan recibido del pago en el pedido

NOTA: para determinar si el pedido tiene un pago asociado, se evaluará con lo registrado en orderPayment.

Se deberá validar que el medio de pago no sea el definido por configuración:

  • key: store.orderAutomaticPaymentCode
  • name: Medio de pago dummy que se agrega a una orden web
3

Escenarios factura y NC con surtido parcial y sustitutos


Generación de Nota de Crédito (NC) para Ítems No Surtidos

Para los ítems que no hayan sido surtidos, se debe generar una Nota de Crédito (NC) por el valor correspondiente a esos ítems, según los escenarios especificados. Es crucial que el monto de la NC nunca supere el valor total del pedido original.

Nota: El monto del pedido original debe extraerse del campo order.netAmount. Este valor se utilizará para comparar y validar que el total de la factura de venta no exceda el monto del pedido original.

Escenarios de Surtido:

  1. Surtido Completo (Flujo Normal): Se emite una factura por el total del pedido. (Este flujo ya está implementado).

  2. Surtido Parcial (Menos Artículos que el Pedido Original): Se emite una factura por el total del pedido original y se genera una NC por el valor de los ítems no surtidos, asegurando que el total a facturar se base en el monto original del pedido.

  3. Surtido Parcial con Sustituto de Igual Monto: Se emite una factura por el total del pedido, considerando los ítems surtidos. El cálculo se realiza en base al monto original del pedido.

  4. Surtido Parcial con Sustituto de Menor Monto: Se emite una factura por el total del pedido y una NC por la diferencia entre el ítem original y el ítem de menor valor. El cálculo se basa en el monto original del pedido.

  5. Surtido Parcial con Sustituto de Mayor Monto: Si el sustituto supera el monto original del pedido, el sistema no permite continuar con el proceso de facturación. En este caso, se debe aplicar un descuento por la diferencia entre el monto agregado y el monto original del pedido, para luego emitir la factura con los ítems surtidos y el descuento aplicado.

Mensaje de Validación al Finalizar: Si el total de la venta supera el monto del pedido original, el sistema debe mostrar un mensaje indicando: "El monto de la venta supera el monto del pedido original. Debe aplicar un descuento o modificar algún artículo."

Ejemplo de Pedido Original:

  • Artículo A: $800
  • Artículo B: $200
  • Total Pago: $1000 (VISA)

EscenarioDescripciónFlujo
1

Surtido completo

(flujo normal: emite factura) = Ya implementado =


  • PEDIDO ORIGINAL 
    • articulo A, $800.- 
    • artículo B, $200.-
    • PAGO: VISA OFF $1000.- 

Factura por Articulo A y Articulo B, total $1000.-

Pago: Visa off $1000.-

2

Surtido parcial (Surtir menos artículos del pedido): 

Emite factura por el total. Emite NC por la diferencia de los no surtidos.

Calculando total a facturar con monto original del pedido

(ajuste al doc v1.8)

Ejemplo

  • Se agrega en la factura el item "Ajuste financiero" por el monto de menos que se surtiria

  • Se agrega en la NC el item "Ajuste financiero" por el monto de menos que se surtió

  • PEDIDO ORIGINAL 
    • articulo A, $800.- 
    • artículo B, $200.-
    • PAGO: VISA OFF $1000.- 
  • Se surte sólo artículo A $800.-

Se emite factura por

  • Articulo A $800.0
  • Articulo B  $200.0
  • Articulo B anulado - $200.0
  • ARTICULO AJUSTE $200.0
  • Total $1000.-

Pago: Visa off $1000.

NC monto equivale articulo B $200.- (ARTICULO AJUSTE $200.0)

Pago: NC $200.-

3

Surtido parcial con sustituto de igual monto: 

Emite factura por el total. Items surtidos. 

Calculando total a facturar con monto original del pedido

(ajuste al doc v1.8)

  • PEDIDO ORIGINAL 
    • articulo A, $800.- 
    • artículo B, $200.-
    • PAGO: VISA OFF $1000.- 
  • Se surte artículo A $800.-
  • Se cambia el B por C de $200.-

Factura por

  • Articulo A $800.0
  • Articulo C $200.0
  • Articulo B $200.0
  • Articulo B anulado -$200.0.
  • Total $1000.-

Pago: Visa off $1000.

4

Surtido parcial con sustituto de menor monto: 

Emite factura por el total. Emite NC por la diferencia. 

Calculando total a facturar con monto original del pedido

(ajuste al doc v1.8)

  • PEDIDO ORIGINAL 
    • articulo A, $800.- 
    • artículo B, $200.-
    • PAGO: VISA OFF $1000.- 
  • Se surte artículo A $800.-
  • Se cambia el B por D de $100.-

Factura Total $1000.-

  • Articulo A $800.0
  • Artículo B $200.0
  • Articulo B anulado -$200.0
  • Artículo D $100.0
  • ARTICULO AJUSTE $100.0

Pago: Visa off $1000.-

NC monto equivale a diferencia entre B y C $100.0

  • ARTICULO AJUSTE $100.0
5

Surtido parcial con sustituto de mayor monto:

 Informa que supera el monto original del pedido.

NO puede continuar. informando con mensaje:

"Supera el monto original del pedido. Puede agregar un descuento o cambiar artículos" o similar.

El operador debe aplicar descuento (diferencia de lo agregado a la venta con el monto original del pedido) o cambiar por algún artículo con el cual no supere el monto del pedido original.

Emite factura por el total. Ítems surtidos + descuento o artículos modificados

  • PEDIDO ORIGINAL 
    • articulo A, $800.- 
    • artículo B, $200.-
    • PAGO: VISA OFF $1000.- 
  • Se surte artículo A $800.-
  • Se cambia el B por E de $300.-

Factura Total $1000.- (artículos + descuento $100.-)

  • Articulo A $800.0
  • Artículo B $200.0
  • Articulo B anulado -$200.0
  • Artículo D $300.0
  • Se valida que supera el total del pedido y se debe ingresar un descuento o cambiar el item (no es automático) Ej: se ingresa DESC $100.0

Pago: Visa off $1000.-


Consideraciones/definiciones

  • La NC se cierra con el medio de pago NC (por configuración) 
  • La NC no tiene movimiento de stock, sino que su finalidad es financiera (no agregar los tags en tlog o que sea processStock=false (o no se asocia directamente el tag itemTicketListInformation)
  • Se creará un nuevo tipo de itemType (para el item que se agregará a la nota de crédito financiera) 
    • itemType.code: ADJFINANCE
    • itemType.name: Item de ajuste financiero para NC automática 
  • Se agrega un nuevo artículo a los scripts de producto
  • Se agregarán dos nuevas properties a nivel tienda/ordenes
    • Medio de pago para NC
      • key: store.orderPartialPickupAutomaticNCTenderCode
      • name: Surtido Parcial: Medio de pago para la nota de crédito automática
    • Artículo para NC


-----------

  • Script de property de Medio de pago para nota de crédito automática

{ "_id" : { "$oid" : "645915742145be0c662d07f4" }, "key" : "store.orderPartialPickupAutomaticNCTenderCode", "name" : "Sutido Parcial Ordenes: Medio de pago para la nota de crédito automática", "description" : "Sutido Parcial Ordenes: Medio de pago para la nota de crédito automática", "newValue" : "", "propertyType" : { "$oid" : "5ea556535604c8593c60273e" }, "propertyCategory" : { "$oid" : "608c56da82cb4435461ca125" }, "propertyModule" : { "$oid" : "5ea556535604c8593c60273d" }, "version" : 0 },

PropertyValue  { "_id" : { "$oid" : "645cd75c2145be0c662d0814" }, "systemProperty" : { "$oid" : "645915742145be0c662d07f4" }, "newValue" : "NCC", "version" : 0 },


  • Script de property de artículo para nota de crédito automática

      { "_id" : { "$oid" : "645915852145be0c662d07f5" }, "key" : "store.orderPartialPickupAutomaticNCItemCode", "name" : "Sutido Parcial Ordenes: Item genérico para la nota de crédito automática", "description" : "Sutido Parcial Ordenes: Item genérico para la nota de crédito automática", "newValue" : "", "propertyType" : { "$oid" : "5ea556535604c8593c60273e" }, "propertyCategory" : { "$oid" : "608c56da82cb4435461ca125" }, "propertyModule" : { "$oid" : "5ea556535604c8593c60273d" }, "version" : 0 },

PropertyValue  { "_id" : { "$oid" : "645cd76d2145be0c662d0815" }, "systemProperty" : { "$oid" : "645915852145be0c662d07f5" }, "newValue" : "ADJFINAN", "version" : 0 },


  • Script por nuevo itemType

{ "_id" : { "$oid" : "645918122145be0c662d07f8" }, "ref" : 42, "code" : "ADJFINANCE", "name" : "Ajuste Financiero", "disabled" : false, "promoCatalog" : false, "version" : 0 }

4

Configuración POS - configuración de validación del monto total del pedido


Validación del Monto Total del Pedido en el POS

Se ha configurado una validación en el POS que asegura que el monto total de la factura no exceda el monto original del pedido al momento de facturarlo.

  • Clave: store.orderValidateExcessInOrderTotalAmount
  • Nombre: "Validación del monto total de la factura respecto al pedido original"
  • Tipo: booleano
  • Valor por defecto: true
  • Categoría: tienda/órdenes

Funcionamiento:

a) Sin pagos asociados: Si esta validación está habilitada (true), el sistema genera una alerta al finalizar o pagar el pedido si el monto total de la factura supera el monto del pedido original.

b) Con pagos asociados: En escenarios con pagos asociados, la validación se aplica de forma obligatoria, asegurando que el monto total de la factura no exceda el monto del pedido original.

5

Funcionalidad POS - datos del pedido en pantalla de ventas


  • Agregar el monto total del pedido en la pantalla de VENTA al facturar una orden (MONTO TOTAL PED: mapeando con order.netAmount)
  • Agregar el nro de pedido externo (N° PEDIDO: mapeando a order.externalNumber)
    • Debajo del área de ingreso del artículo se podrían ubicar estos dos datos del pedido

PRINT de lo IMPLEMENTADO

6

Actualizar orden con NC

  • Actualizar el pedido con la NC asociada, no se deben actualizar totales del pedido
  • Se agrega a la lista de transacciones del pedido y se lista en el detalle del pedido al cual pertenece
  • Al actualizar la orden con los items de la factura generada (si el mismo tuviera un item del tipo AJUSTE, este no debería incluirse al pedido) nota v1.7


7

Funcionalidad_POS/CORE: devolución de ventas de pedidos con surtido parcial (con pagos) 


v1.9
Una venta de un surtido parcial de un pedido con pagos puede tener incluido el ítem AJUSTE (ítem configurado en la property: "Sutido Parcial Ordenes: Ítem genérico para la nota de crédito automática") 
  • Al generar una devolución de una venta de este tipo de escenario, se debe omitir el ítem AJUSTE como item disponible a devolver (esto debido a que ya se generó una Nota de crédito automática por este item AJUSTE y no debería volver a incluirse) 


REQUERIMIENTO

  • no incluir en la devolución de venta (proveniente de una order) los items según la property "Surtido Parcial Ordenes: Ítem genérico para la nota de crédito automática"



ANEXO - Datos de prueba: artículos 

CódigoDescripciónCategoríaMarcaTipo de ArtículoPrecio de VentaProveedor
CEPITA200Jugo Cepita Del Valle Naranja 200 MlBEBIDAS SIN ALCOHOL->JUGOSCEPITANormal$110,00FEM S.A.
MANIKING120Maní pelado King 120 gSNACKSKINGNormal$215,00FEM S.A.
LAYS94Papas Lays 94gramosSNACKSLAYSNormal$495,00FEM S.A.
SPRITE354Lata de Sprite 354mlBebidasCOCANormal$210,00FEM S.A.
COCA354Lata Coca Cola 354ml sin azúcarBebidasCOCANormal$210,00FEM S.A.


ANEXO - Workflow


Estado InicialEstado FinalAcciones API en el workflowAcción Manual/autoAcciones POS
1CREADOCONFIRMADOauditar cambio de estado (Rabbit)manual Opción: CONFIRMAR PEDIDO/CANCELAR PEDIDO/VOLVER.
Interviene el operador (apretando botón CONFIRMAR PEDIDO) vuelve a la pantalla del listado de PEDIDOS
llamada StatusChange (API Tienda) directo BCORE
API replicaría la order a BMC
2CREADOCANCELADOauditar cambio de estado (Rabbit)manual Opción: CONFIRMAR PEDIDO/CANCELAR PEDIDO/VOLVER.
Interviene el operador (apretando botón CANCELAR PEDIDO)
llamada StatusChange (API Tienda) directo BCORE
3CONFIRMADOLISTO PARA SURTIR
auto

4LISTO PARA SURTIR

manualOpción del popUp: SURTIR PEDIDO/CANCELAR PEDIDO/VOLVER
Interviene operador (apretando botón SURTIR PEDIDO) pasa a popUp de surtido
No cambia de estado
  • bloquea el pedido
5LISTO PARA SURTIR

manualpopUp de surtido con opciones: CONTINUAR/VOLVER SIN GUARDAR
Interviene el operador (apretando CONTINUAR pasa a la pantalla de ventas, transforma la order en SALE)
apretando VOLVER SIN GUARDAR se pierde el surtido realizado, se desbloquea la orden y vuelve a la pantalla del listado de pedidos (sin cambio alguno)
  • se surte el pedido (parcial o total)
  • pasa a la pantalla de venta
  • NOTA: si fuera sumamente necesario, luego de surtir el pedido, podríamos pasarlo a SURTIDO. 
6LISTO PARA SURTIR

manualen pantalla de ventas, agrego ítems, anulo ítems y pasa a la pantalla de PAGOS
  • proceso pago
  • facturo pedido
  • genero TLOG 
7LISTO PARA SURTIRFACTURADO
automáticoproceso TLOG 

Por distribución del TLOG 

  • cambio de estado
  • desbloqueo del pedido 
  • asocio factura al pedido
  • auditoria
8LISTO PARA SURTIRCANCELADO

N/A


Request de referencia

Cliente persona

request_PRS_canalDIARCO.json

Cliente empresa


request_OGN_canalDIARCO

Scripts utilizados para el channel, workflow y workflowStep 

Ambos se agregan a BMT y BMC del entorno 7.5 QA

OrderWOrkflow delivery

{

    "_id" : ObjectId("640fa5b8abd50e86f3465ee3"),

    "code" : "default_delivery",

    "name" : "Default delivery",

    "orderType" : ObjectId("5f105c882a3a154318888731"),

    "disabled" : false,

    "version" : 0,

    "channel" : ObjectId("6402708699927d08bc0bb04e")

}


Step creado / confirmado

{

    "_id" : ObjectId("640fa644abd50e86f3466e2d"),

    "orderWorkflowActions" : [

        ObjectId("5fe9de898d93b01cab6918cd")

    ],

    "orderWorkflow" : ObjectId("640fa5b8abd50e86f3465ee3"),

    "initialState" : ObjectId("5f105c882a3a154318888732"),

    "finalState" : ObjectId("5f105c882a3a154318888734"),

    "isInitial" : true,

    "isFinal" : false,

    "allowChange" : false,

    "version" : 0,

    "is_automatic" : false,

    "priority" : 1,

    "autMessage" : "Este cambio de estado es manual"

}


Confirmado/listo para surtir

{

    "_id" : ObjectId("640fa719abd50e86f3468307"),

    "orderWorkflowActions" : [

        ObjectId("5fe9de898d93b01cab6918cd")

    ],

    "orderWorkflow" : ObjectId("640fa5b8abd50e86f3465ee3"),

    "initialState" : ObjectId("5f105c882a3a154318888734"),

    "finalState" : ObjectId("60083ed3b6ab19d3d5de81a0"),

    "isInitial" : false,

    "isFinal" : false,

    "allowChange" : false,

    "version" : 0,

    "is_automatic" : true,

    "priority" : 1,

    "autMessage" : "Este cambio de estado es automatico"

}


Listo para surtir / facturado

{

    "_id" : ObjectId("640fa76eabd50e86f3468d1e"),

    "orderWorkflowActions" : [

        ObjectId("5fe9de898d93b01cab6918cd")

    ],

    "orderWorkflow" : ObjectId("640fa5b8abd50e86f3465ee3"),

    "initialState" : ObjectId("60083ed3b6ab19d3d5de81a0"),

    "finalState" : ObjectId("61eaf3d4cb9f405c76482a8d"),

    "isInitial" : false,

    "isFinal" : false,

    "allowChange" : false,

    "version" : 0,

    "is_automatic" : false,

    "priority" : 1,

    "autMessage" : "Este cambio de estado es por tlog API"

}


---confirmado / cancelado

{

    "_id" : ObjectId("640fa7feabd50e86f3469a5b"),

    "orderWorkflowActions" : [

        ObjectId("5fe9de898d93b01cab6918cd")

    ],

    "orderWorkflow" : ObjectId("640fa5b8abd50e86f3465ee3"),

    "initialState" : ObjectId("5f105c882a3a154318888732"),

    "finalState" : ObjectId("5f107027098334f5ecb20485"),

    "isInitial" : true,

    "isFinal" : true,

    "allowChange" : false,

    "version" : 0,

    "is_automatic" : false,

    "priority" : 2,

    "autMessage" : "Este cambio de estado es manual"

}


 

Channel delivery


{

    "_id" : ObjectId("6402708699927d08bc0bb04e"),

    "code" : "delivery",

    "disabled" : false,

    "isDirty" : true,

    "stores" : [

        "1",

        "2"

    ],

    "automaticPublish" : false,

    "queues" : [

        {

            "keyDescription" : "Novedades del stock al canal",

            "disabled" : true,

            "code" : "queueForStock_delivery",

            "key" : "queueForStock",

            "name" : "-"

        },

        {

            "keyDescription" : "Novedades de movimientos de stock",

            "disabled" : true,

            "code" : "queueForStockJournal_delivery",

            "key" : "queueForStockJournal",

            "name" : "-"

        },

        {

            "keyDescription" : "Novedades de cambios de estado de las ordenes",

            "disabled" : false,

            "code" : "queueForStatusChange_delivery",

            "key" : "queueForStatusChange",

            "name" : "-"

        },

        {

            "keyDescription" : "Novedades de facturación de ordenes",

            "disabled" : true,

            "code" : "queueForTransaction_delivery",

            "key" : "queueForTransaction",

            "name" : "-"

        },

        {

            "keyDescription" : "Novedades de auditorías de las ordenes",

            "disabled" : true,

            "code" : "queueForAudit_delivery",

            "key" : "queueForAudit",

            "name" : "-"

        },

        {

            "keyDescription" : "Novedades de publicaciones de artículos",

            "disabled" : false,

            "code" : "queueForPublish_delivery",

            "key" : "queueForPublish",

            "name" : "-"

        },

        {

            "keyDescription" : "Novedades de precios de publicaciones de artículos",

            "disabled" : true,

            "code" : "queueForPrice_delivery",

            "key" : "queueForPrice",

            "name" : "-"

        },

        {

            "keyDescription" : "Novedades de mensajes al canal",

            "disabled" : false,

            "code" : "queueForMessages_delivery",

            "key" : "queueForMessages",

            "name" : "-"

        },

        {

            "keyDescription" : "Novedades de artículos",

            "disabled" : false,

            "code" : "queueForItem_delivery",

            "key" : "queueForItem",

            "name" : "-"

        },

        {

            "keyDescription" : "Novedades de ordenes",

            "disabled" : false,

            "code" : "queueNewOrder_delivery",

            "key" : "queueNewOrder",

            "name" : "-"

        },

        {

            "keyDescription" : "Novedades del stock actual",

            "disabled" : false,

            "code" : "queueForStockRealTime_delivery",

            "key" : "queueForStockRealTime",

            "name" : "-"

        }

    ],

    "minStockQty" : 5,

    "name" : "delivery",

    "allowedInpackingList" : false,

    "depositsInformedInStock" : [

        ObjectId("5ea5565b5604c8593c6081a3")

    ],

    "tenders" : [

        ObjectId("5ea5565d5604c8593c60841f"),

        ObjectId("640f069199927d8fa4feccf8")

    ],

    "version" : 13,

    "createdAt" : ISODate("2023-03-03T22:11:18.290Z"),

    "id" : ObjectId("6402708699927d08bc0bb04e"),

    "updatedAt" : ISODate("2023-03-13T11:21:18.577Z")

}



ANEXO Modelo de datos 

Para mayor referencia de los conceptos del modelo de order, ver: https://share.linx.com.br/x/w3xnFQ (.pptx)

Order

Orden


<entity name="Order" index="internalNumber" unique="yes" index2="externalNumber" unique2="no">
<field name="channel" type="Channel" required="false"/>
<field name="originStore" type="Store" required="false"/>
<field name="store" type="Store" required="false"/>
<field name="orderWorkflow" type="OrderWorkflow" required="false"/>
<field name="orderType" type="OrderType" required="true"/>
<field name="currency" type="Currency" required="false"/>
<field name="party" type="Party" required="false"/>
<field name="omniType" type="String" required="true"/>
<field name="estimatedAvailabilityDate" type="Date" required="true"/>
<field name="actualAvailabilityDate" type="Date" required="false"/>
<field name="orderState" type="OrderState" required="true"/>
<field name="promoMapVersion" type="String" required="false"/>
<field name="externalNumber" type="String" required="false"/>
<field name="internalNumber" type="String" required="true"/>
<field name="notes" type="String" required="false"/>
<field name="grossAmount" type="Number" required="true" default="0"/>
<field name="promoDiscountAmount" type="Number" required="true" default="0"/>
<field name="manualDiscountAmount" type="Number" required="true" default="0"/>
<field name="ivaTaxAmount" type="Number" required="true"/>
<field name="internalTaxAmount" type="Number" required="true"/>
<field name="perceptionAmount" type="Number" required="true"/>
<field name="netAmount" type="Number" required="true" default="0"/>
<!--Transacciones o Facturas asociadas-->
<field name="transactions" type="Object" required="false" >
<field name="id" type="mongoose.Schema.Types.ObjectId" required="false"/>
<field name="storeCode" type="String" required="false"/>
<field name="terminalCode" type="String" required="false"/>
<field name="operatorCode" type="String" required="false"/>
<field name="trxNumber" type="Number" required="false"/>
<field name="trxDate" type="Date" required="false"/>
<field name="billType" type="String" required="true"/>
<field name="serieOfficialBill" type="String" required="false"/>
<field name="fiscalPosNumber" type="String" required="false"/>
<field name="docNumber" type="String" required="false"/>
<field name="billNumber" type="String" required="false"/>
</field>
<field name="completeData" type="Object" required="false"/>
<field name="orderReference" type="Object" required="false"/>
<field name="createdAt" type="Date"/>
<field name="updatedAt" type="Date"/>
</entity>

Items de una orden


<entity name="OrderItem" index="order" unique="no">
<field name="order" type="Order" required="true"/>
<field name="description" type="String" required="true"/>
<field name="item" type="Item" required="true"/>
<field name="store" type="Store" required="true"/>
<field name="location" type="Location" required="true"/>
<field name="orderedQty" type="Number" required="true"/>
<field name="fulfilledQty" type="Number" required="true"/>
<field name="unitPrice" type="Number" required="true"/>
<field name="netAmount" type="Number" required="false"/>
<field name="requiredDate" type="Date" required="false"/>
<field name="realDate" type="Date" required="false"/>
<field name="orderShippingInfo" type="OrderShippingInfo" required="false" />
<field name="taxes" type="[Object]" required="false" >
<field name="amount" type="Number" required="false"/>
<field name="taxAuthority" type="String" required="false"/>
<field name="taxableAmount" type="Number" required="false"/>
</field>
<field name="priceModifiers" type="[Object]" required="false" >
<field name="promotionID" type="String" required="false"/>
<field name="percent" type="Number" required="false"/>
<field name="amount" type="Number" required="false"/>
<field name="reasonCode" type="String" required="false"/>
<field name="previousPrice" type="Number" required="false"/>
<field name="newPrice" type="Number" required="false"/>
</field>
<field name="serializedUnits" type="[Object]" required="false" >
<field name="serialNumber" type="String" required="false"/>
<field name="importDocNumber" type="String" required="false"/>
<field name="customsNumber" type="String" required="false"/>
<field name="customsDate" type="Date" required="false"/>
<field name="unitCount" type="Number" required="false" default="1"/>
</field>
<field name="createdAt" type="Date"/>
<field name="updatedAt" type="Date"/>
</entity>


Pagos de una orden


<entity name="OrderPayment" index="order" unique="no">
<field name="order" type="Order" required="true"/>
<field name="tender" type="Tender" required="true"/>
<field name="amount" type="Number" required="true"/>
<field name="paymentDate" type="Date" required="false"/>
<field name="paymentTypeCode" type="String" required="false"/>
<field name="planDescriptor" type="String" required="false"/>
<field name="sellerName" type="String" required="false"/>
<field name="authorizationCode" type="String" required="false"/>
<field name="couponNumber" type="String" required="false"/>
<field name="lotNumber" type="String" required="false"/>
<field name="installments" type="String" required="false"/>
<field name="referenceNumber" type="String" required="false"/>
<field name="createdAt" type="Date"/>
<field name="updatedAt" type="Date"/>
</entity>


OrderPickupLocation


    <entity name="OrderPickupLocation" index="code" unique="yes">
        <field name="code" type="String" required="true"/>
        <field name="name" type="String" required="true"/>
        <field name="address" type="String" required="true"/>
        <field name="telephone" type="String" required="false"/>
        <field name="mail" type="String" required="false"/>
        <field name="zipCode" type="String" required="false"/>
        <field name="country" type="Country" required="true"/>
        <field name="state" type="State" required="true"/>
        <field name="city" type="City" required="true"/>
        <field name="isStore" type="Boolean" required="true"/>
        <field name="store" type="Store" required="false"/>
        <field name="disabled" type="Boolean" required="true" default="false"/>
        <field name="createdAt" type="Date"/>
        <field name="updatedAt" type="Date"/>
    </entity>


OrderShippingInfo


    <entity name="OrderShippingInfo" index="order" unique="no">
        <field name="order" type="Order" required="true"/>
        <field name="deliveryOrPickup" type="String" default="delivery" />
        <field name="deliveryCompany" type="OrderDeliveryCompany" required="false" />
        <field name="pickupLocation" type="OrderPickupLocation" required="false" />
        <field name="pickupInformation" type="String" required="false" />
        <field name="partyContactMethod" type="PartyContactMethod" required="false" />
        <field name="partyContactMethodText" type="String" required="false" />
        <field name="documents" type="[Object]" required="false">
            <field name="documentBytes" type="String" required="false"/>
            <field name="documentExtension" type="String" required="false"/>
        </field>
        <field name="packageId" type="String" required="true" />
        <field name="trackingCode" type="String" required="false" />
        <field name="trackingUrl" type="String" required="false" />
        <field name="createdAt" type="Date"/>
        <field name="updatedAt" type="Date"/>
    </entity>


OrderState - estados de una orden

<entity name="OrderState" index="code" unique="yes">
        <field name="code" type="String" required="true"/>
        <field name="name" type="String" required="false"/>
        <field name="description" type="String" required="false"/>
        <field name="disabled" type="Boolean" required="false" default="false"/>
        <field name="createdAt" type="Date"/>
        <field name="updatedAt" type="Date"/>
    </entity>


OrderType - tipo de ordenes


    <entity name="OrderType" index="code" unique="yes">
        <field name="code" type="String" required="true"/>
        <field name="name" type="String" required="false"/>
        <field name="createdAt" type="Date"/>
        <field name="updatedAt" type="Date"/>
        <field name="allowedInpackingList" type="Boolean" default="false"/>
        <field name="viewAsAction" type="Boolean" required="false"/>
        <field name="orderStateGroup" type="String" required="false"/>
    </entity>


OrderHistory - historial de cambios de estado de una orden


    <entity name="OrderHistory" index="order" unique="no">
        <field name="user" type="User" required="true"/>
        <field name="order" type="Order" required="true"/>
        <field name="initialState" type="OrderState" required="true"/>
        <field name="finalState" type="OrderState" required="true"/>
        <field name="notes" type="String" required="false"/>
        <field name="originator" type="String" required="true"/>
        <field name="processed" type="Boolean" required="true"/>
        <field name="createdAt" type="Date"/>
        <field name="updatedAt" type="Date"/>
    </entity>


OrderWorkFlow - flujo de estados


    <entity name="OrderWorkflow" index="code" unique="yes">
        <field name="code" type="String" required="true"/>
        <field name="name" type="String" required="true"/>
        <field name="orderType" type="OrderType" required="true"/>
        <field name="channel" type="Channel" required="false"/>
        <field name="disabled" type="Boolean" required="true"/>
        <field name="createdAt" type="Date"/>
        <field name="updatedAt" type="Date"/>
    </entity>


OrderrWorkflowStep - pasos dentro del workflow


    <entity name="OrderWorkflowStep" index="OrderWorkflow" unique="no">
        <field name="orderWorkflow" type="OrderWorkflow" required="true"/>
        <field name="initialState" type="OrderState" required="false"/>
        <field name="finalState" type="OrderState" required="true"/>
        <field name="isInitial" type="Boolean" required="true"/>
        <field name="isFinal" type="Boolean" required="true"/>
        <field name="allowChange" type="Boolean" required="true"/>
        <field name="orderWorkflowActions" type="[Object]">
            <field name="action" type="OrderWorkflowAction" required="false"/>
        </field>
        <field name="is_automatic" type="Boolean" required="false"/>
        <field name="priority" type="Number" required="false"/>
        <field name="createdAt" type="Date"/>
        <field name="updatedAt" type="Date"/>
    </entity>


OrderWorkFlowAction - acciones o validaciones


    <entity name="OrderWorkflowAction" index="code" unique="yes">
        <field name="code" type="String" required="true"/>
        <field name="name" type="String" required="false"/>
        <field name="isForValidation" type="Boolean" required="true" default="true"/>
        <field name="disabled" type="Boolean" required="true"/>
        <field name="priority" type="Number" required="false"/>
        <field name="createdAt" type="Date"/>
        <field name="updatedAt" type="Date"/>
    </entity>


OrderAudit - auditoria de una orden


    <entity name="OrderAudit" index="order" unique="no">
        <field name="order" type="Order" required="true"/>
        <field name="action" type="String" required="false"/>
        <field name="user" type="User" required="true"/>
        <field name="origin" type="String" required="false"/>
        <field name="orderState" type="OrderState" required="false"/>
        <field name="notes" type="String" required="false"/>
        <field name="originator" type="String" required="true"/>
        <field name="processed" type="Boolean" required="true"/>
        <field name="createdAt" type="Date"/>
        <field name="updatedAt" type="Date"/>
    </entity>


OrderDeliveryCompany - operador logístico


    <entity name="OrderDeliveryCompany" index="code" unique="yes">
        <field name="code" type="String" required="true"/>
        <field name="name" type="String" required="true"/>
        <field name="address" type="String" required="false"/>
        <field name="country" type="Country" required="false"/>
        <field name="state" type="State" required="false"/>
        <field name="city" type="City" required="false"/>
        <field name="phone" type="String" required="false"/>
        <field name="disabled" type="Boolean" required="true"/>
        <field name="createdAt" type="Date"/>
        <field name="updatedAt" type="Date"/>
        <field name="allowedInpackingList" type="Boolean" default="false"/>
    </entity>

Scripts para DIARCO

Channel, orderWorrkflow, orderWorkflowStep

Scripts Channel_OrderW_OrderWSteps.json


OrderWorflow para Diarco


Publicación de un artículo

Gestión de pedidos en POS Public Art


Creación y surtido de un pedido

Gestión de pedidos en POS Copy




  • Sem rótulos