Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[14.0][FIX] l10n_es_pos: offline simplified number #2582

Closed
wants to merge 1 commit into from

Conversation

chienandalu
Copy link
Member

El cambio 2967122 cambió el comportamiento de la secuencia de factura simplificada para obtener el número via rpc en cada ticket. En caso de que el punto de venta estuvise sin conexión, se contemplaba que el valor fuese el de la secuencia única de Odoo, lo cual es algo incongruente.

Este cambio retorna al comportamiento anterior para los casos en los que no haya conexión, corriendo la secuencia en el lado del cliente hasta que la conexión vuelva y los pedidos pendientes se sincronicen.

La principal desventaja es que usuarios concurrentes sobre una misma sesión podrían solapar sus secuencias. En cualquier caso, sería deseable evitar esta situación añadiendo tantas configuraciones de punto de venta como puestos en los que se vaya a operar.

cc @Tecnativa

@pedrobaeza pedrobaeza added this to the 14.0 milestone Nov 3, 2022
@pedrobaeza
Copy link
Member

@AntoniRomera @omar7r revisad por favor, ya que vosotros fuisteis los validadores del anterior PR. El pre-commit ahora lo soluciono actualizando la plantilla de copier.

@anajuaristi
Copy link
Contributor

👍 LGTM

In 2967122 the behavior of the
simplified sequence was change to gather via rpc for each ticket
validation. For the case of offline the planned fallback was to set the
unique ID given by Odoo.

This change fallbacks to the former behavior for that case allowing to
obtain the proper sequence even offline.

The main drawback will be that concurrent users in the same session
could collide their sequence numbers if they happen to be offline.
Anyway, that would be easily fixed just by separating such cashiers in
separate configs.

As a solution to that, a different technique should be used (longpoll
for multi sessions or something like that)
@chienandalu chienandalu force-pushed the 14.0-fix-l10n_es_pos-offline branch from fa3f118 to 6e0bbec Compare November 3, 2022 14:14
@ao-landoo
Copy link
Contributor

ao-landoo commented Nov 3, 2022

Esta solución no nos parece válida para casos en los que hay un solo punto de venta y varias tablet realizando pedidos.

Por ejemplo en un restaurante en el que tienen un punto de venta y hay varios camareros realizando pedidos, en caso de que se fuera la conexión de internet se repetirían los números. Si además está implementado TicketBAI este es un gran problema ya que hay que enviar las facturas simplificadas en el momento que vuelva la conexión.

Proponemos una solución tipo Odoo Core, en la que agrega una subsecuencia por dispositivo que accede al punto de venta. En el caso de la localización española tal vez sería interesante asignar a cada empleado (hr.employee) un código único que se utilice para formar la secuencia de las facturas simplificadas de la siguiente manera <prefijo>-<código_empleado>-<número>.

@pedrobaeza
Copy link
Member

Esta solución es para cumplir con TicketBAI según nos ha reportado @anajuaristi, así que es igual de inválida la anterior por ello. @anajuaristi puedes explicar el por qué?

@anajuaristi
Copy link
Contributor

anajuaristi commented Nov 3, 2022

Nuestro caso concreto es que tienen un único equipo por tienda. Por lo tanto la solución de @pedrobaeza nos es válida ya que tal y como está ahora, si pierden la conexión, la secuencia de tickets se pierde y hay efectos laterales graves.
Efectivamente si hay más de un equipo al recuperar la conexión, es probable que haya un choque de secuencias.
La solución no creo que sea crear una subsecuencia por empleado, ya que un empleado puede utilizar cualquiera de los equipos.
Lo que yo creo que es mejor, es crear una subsecuencia por equipo concreto y quizas por sesión. Creo que es algo que se debe discutir entre todos para que quede correcto. Y esto, no es solo ticketbai. Entiendo que el problema ha saltado ahora por este tema pero es genérico para el pos y antes o ahora se estarían numerando mal o chocando las secuencias igualmente tanto si hay un único equipo como varios.
Ya direis.
Muchas gracias a todos!!

Copy link
Contributor

@omar7r omar7r left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yo no puedo aceptar un cambio que me rompe una implantación en un restaurante en producción, utilizando la concurrencia de accesos a una misma caja, algo de serie en Odoo 14.0 y posteriores, y que en estos casos es muy habitual, y de forma online, no es una casuística al perder conexión. Además si fuera una restaurante vasco, necesitaría Ticketbai también, entonces si soluciona una cosa y rompe otra no vale.

@anajuaristi
Copy link
Contributor

@omar7r no es concurrencia de usuarios. El problema no son los usuarios. No es tema del ticketbai, es del pos. Estamos intentando dar con una solución genérica en la creación de números de ticket correlativos y en fecha. Actualmente el pos, si pierde la conexión es posible que pierda esta secuencia y es cuando viene el problema. Nos ha saltado a nosotros porque ticketbai verifica esta secuencia de numeración en los tickets.

@ao-landoo
Copy link
Contributor

Nuestro caso concreto es que tienen un único equipo por tienda. Por lo tanto la solución de @pedrobaeza nos es válida para nuestro caso concreto ya que tal y como está ahora, si pierden la conexión, la secuencia de tickets se pierde y hay efectos laterales graves. Efectivamente si hay más de un equipo al recuperar la conexión, es probable que haya un choque de secuencias. La solución no creo que sea crear una subsecuencia por empleado, ya que un empleado puede utilizar cualquiera de los equipos. Lo que yo creo que es mejor, es crear una subsecuencia por equipo concreto y quizas por sesión. Creo que es algo que se debe discutir entre todos para que quede correcto. Y esto, no es solo ticketbai. Entiendo que el problema ha saltado ahora por este tema pero es genérico para el pos y antes o ahora se estarían numerando mal o chocando las secuencias igualmente tanto si hay un único equipo como varios. Ya direis. Muchas gracias a todos!!

Si el empleado al entrar en otro equipo vuelve a escoger su empleado al acceder al punto de venta funcionaría bien (dando por hecho que ha cerrado el punto de venta en el primer equipo). La única manera de que esta solución no funcione es que en dos equipos se seleccione el mismo empleado, pero esto ya es un error de usuario y no un error que sucede cada vez que se pierde la conexión.

@pedrobaeza
Copy link
Member

Bueno, el problema es que la secuencia es distinta online/offline, y de eso se queja el TicketBAI según dice @anajuaristi

Por qué es distinta esa secuencia y no puede ser la misma?

@anajuaristi
Copy link
Contributor

@pedrobaeza ese es el tema. Sí. Que cuando es offline, se pone a numerar los tickets con una secuencia genérica. No sigue la propia del TPV

@ao-landoo
Copy link
Contributor

ao-landoo commented Nov 3, 2022

Pero con esta "solución" surge otro problema, y es que se van a intentar enviar a TicketBAI facturas simplificadas con misma secuencia y numeración, y eso tampoco lo permite TicketBAI.

@pedrobaeza
Copy link
Member

Pero por qué se utiliza la misma sesión a la vez por dos personas? Por qué no se crean dos configuraciones?

@ao-landoo
Copy link
Contributor

Porque en muchos restaurantes hay una sola caja y varias personas que interfieren en ella con diferentes dispositivos.

@chienandalu
Copy link
Member Author

En mi opinión, la modificación anterior es la que rompe la funcionalidad ya existente y no debería haber pasado para contemplar un caso de uso que quizá debería resolverse de otro modo. Aparte de que la opción de usar la secuencia nativa cuando se pasa al offline rompe la serie de la factura simplificada completamente.

@pedrobaeza
Copy link
Member

Bueno, mi compañero @chienandalu puede decir al respecto más que conoce el PoS en profundidad, pero diría que no sería problema. Solo veo la cuenta de efectivo como posible fricción, pero para eso podría ser el método de pago.

@omar7r
Copy link
Contributor

omar7r commented Nov 3, 2022

En un restaurante sólo hay una caja por lo general y todos los camareros tienen que ver el estado de todas las mesas abiertas, ¿qué otro camino hay?, Odoo añadió el longpolling al TPV para sincronizar distintos dispositivos conectados a la misma sesión del TPV para esto

@chienandalu
Copy link
Member Author

Odoo añadió el longpolling al TPV para sincronizar distintos dispositivos conectados a la misma sesión del TPV para esto

Precisamente en el commit lo menciono:

As a solution to that, a different technique should be used (longpoll for multi sessions or something like that)

@pedrobaeza
Copy link
Member

Efectivamente, habrá que sincronizar la secuencia vía longpolling, pero no romper lo anterior que había e ir hacia otra secuencia que no tiene nada que ver.

@ao-landoo
Copy link
Contributor

Propongo mergear este PR para al menos evitar dar a las facturas simplificadas una secuencia completamente diferente, pero a la vez abrir un issue en el que podamos discutir una solución para el tema que estamos comentando aquí.

¿Os parece?

@omar7r
Copy link
Contributor

omar7r commented Nov 3, 2022

No, el PR se puede aplicar igualmente sin merge, para quien lo necesite, pero si puede romper implantaciones en una versión estable de largo recorrido no lo veo mergeable.

@pedrobaeza
Copy link
Member

Omar, ahora mismo estás pensando únicamente en tu caso de uso. Para la mayoría, ni una cosa ni la otra le afecta (bien por estar siempre online, o bien por no tener ese caso), pero lo cierto es que el PR anterior lo fusionamos de buena fe ya en mitad de la vida de la versión estable de v14, y aplicaría la misma cuestión que ahora tú aplicas como bloqueable. Hemos descubierto este problema bloqueante y se podría sin más hacer revert al anterior commit antes del PR, pero en cambio este PR mejora la situación del anterior PR y lo vuelve a dejar sin la problemática de cambio de secuencia, así que debería fusionarse.

@omar7r
Copy link
Contributor

omar7r commented Nov 3, 2022

Ahora mismo sí, en ese y otro que son dos dependientes con una sóla caja, igual que todos pensamos en nuestros proyectos.

En su momento no había esta necesidad y en un issue se planteó el problema (no lo hicimo nosotros) antes de hacer nada y se enlazó un epígrafe del BOE (no lo hicimo nosotros) y se autorizó el cambio, aunque la verdad es que estaba algo cogido con pinzas y se hizo la corrección para solucionarlo (no lo hicimo nosotros) y por útimo, se aprobó, que se pudo hacer mejor, seguramente, pero igual que este PR, por lo que no soy sólo yo, nosotros descubrimos ese issue tras toparnos con el problema.

Esto no busca la estabilidad, busca una solución raṕida y sin tener a favor a todo el mundo, por lo que si se quiere parchear, se puede aplicar el PR a mano, sin ningún problema.

@pedrobaeza
Copy link
Member

No estoy de acuerdo: como está ahora mismo, no es estable, y el parche rápido es lo que hay puesto, ¿o acaso es correcto que salgan secuencias distintas según tengas offline/online? Si queréis que esto no se fusione, debe plantearse el código correcto con longpolling. Podemos esperar un tiempo prudencial para que se implemente sin fusionar, pero si no hace ese trabajo, hay que volver a lo que había antes o fusionar este pull request. Siempre podéis hacer freeze de vuestra rama para que no entren los nuevos cambios si queréis preservar el comportamiento actual.

@omar7r
Copy link
Contributor

omar7r commented Nov 3, 2022

No es estable para Ticketbai (que es algo nuevo), si es estable para todo lo demás porque lo aceptamos bajo un epígrafe del BOE y no se ha dicho algo que lo contrarie. Yo lo aceptaría si solucionara ambos problemas, pero sino no, es un parche que le arregla el día a unos y se lo fastidia a otros, no es algo estable que se pueda mergear en mi opinión y por eso me opongo.
Yo puedo hacer freeze sí, igual que se puede aplicar a mano el parche, pero en toda España cualquier otra persona que use esto y no lo leyera, (recuerdo que el PR y el issue no son nuestros), le rompe mañana y y que se busquen la vida o paren de actualizar fiscalmente el software, en cambio quien se encuntre con el problema de Ticketbai, tiene un parche aquí que puede aplicar temporalmente y todos felices.

@AntoniRomera
Copy link

@pedrobaeza ese es el tema. Sí. Que cuando es offline, se pone a numerar los tickets con una secuencia genérica. No sigue la propia del TPV

Buenas, ahora he cogido el PR, en todo momento decis de un problema con TicketBAI, pero podrias indicar cual es el problema, o en la documentacion de TicketBAI la comprobacion de numeracion que estais hablando como se hace, si hay un Issue o algo, simplemente ponedlo y lo leere

@omar7r
Copy link
Contributor

omar7r commented Nov 10, 2022

Hola,

@AntoniRomera el problema es que en Ticketbai hay que imprimir un qr en el ticket con el número de factura simplificada y cuando se envía a la agencia foral, lleva una trazabilidad entre ese número y el anterior, para controlar que no haya huecos, por lo que no pueden ser de secuencias distintas, sino falla. Y esto tiene que hacerse tanto online como offline porque el cliente puede leer ese qr y comprobar si se ha declarado y con el offline, cambia la serie.

Hemos probado el PR y aunque se resuelve al buscar siempre la última secuencia en backend si hay conexión, el problema que había que si estás en la misma sesión online con dos dispositivos se repetían los números en todos los casos. No se resuelve cuando estás offline, si están offline sigue utilizando el comportamiento anterior al commit de @AntoniRomera por lo que mientras no vuelva la conexión, todas las sesiones están poniendo los mismos números, ya que los cogen del último guardado en el navegador, por lo que acabamos con repetidos de nuevo, con lo cual, no vale para esta casuística, tampoco para TicketBAI si se usa el TPV de esta forma, que es una forma oficial y normal en hostelería y con posibilidad de uso en tiendas con una sola caja, pero dos dependientes por ejemplo.

La única opción que vemos viable en todas las casuísticas, también offline, es la que proponía @ao-landoo, si se trabaja en dos dispositivos contra la misma sesión de TPV, en teoría el cajero de cada dispositivo es distinto, por lo que si cada cajero dentro de una sesión tuviera una secuencia independiente, no habría problema, ya sea online u offline, cada una continuaría numerando de forma correcta. Lo malo es que obliga a tener la gestión de cajeros activa, por lo que podría ser algo opcional usar esa funcionalidad o la actual, que como ya dije, se hizo bajo un epígrafe del BOE (#2047 (comment)) que no se ha desmentido, por lo que por ahora la considero correcta y no un error.

Ya sea componiéndola como el dijo Aritz o de otra forma, habría que lograr que cada dispositivo numere de forma independiente y desconectada, y que sea parametrizable y opcional, en la configuración de la sesión del TPV, numerar de esta forma o de la forma actual. Por ejemplo, un check "Secuencia por empleado" que sólo sea visible si se marca la opción de "Empleados Autorizados"

@chienandalu
Copy link
Member Author

se hizo bajo un epígrafe del BOE (#2047 (comment)) que no se ha desmentido, por lo que por ahora la considero correcta y no un error.

Me da a mí que eso fue una interpretación muy libre de la ley, porque además las secuencias de Odoo da valores únicos pero no necesariamente consecutivos: https://github.com/odoo/odoo/blob/14.0/addons/point_of_sale/static/src/js/models.js#L2932-L2947

Podemos llegar a tener la siguiente secuencia para un solo punto de venta:

  • TIENDA-22-00001
  • TIENDA-22-00002
  • TIENDA-22-00003

Se va la red y se coge el identificador único de Odoo:

  • 12345-123-1234
  • 12345-123-1235

Vuelve la red y volvemos a la secuencia normal:

  • TIENDA-22-00004
  • TIENDA-22-00005

Por lo que sea, recarga el punto de venta:

  • TIENDA-22-00006

Se va de nuevo la red:

  • 12345-124-1236 (!)

Vuelve de nuevo:

  • TIENDA-22-00007

Resultado:

  • TIENDA-22-00001
  • TIENDA-22-00002
  • TIENDA-22-00003
  • 12345-123-1234
  • 12345-123-1235
  • TIENDA-22-00004
  • TIENDA-22-00005
  • 12345-124-1236
  • TIENDA-22-00007

@AntoniRomera
Copy link

retación muy libre de la ley, porque además las secuencias de Odoo da valores únicos pero no

Una solución a plantear después de tu demostración seria la siguiente:

{OFFLINE-SEQUENCE}-{dispositivo}-{fecha y hora que entra en la sesion deJS}-0001

Cada vez que se salga de la sesión de JS se empieza de 0 ya que no hay manera de controlar las secuencias offline.

A ver que os parece.

Y para el tema del TicketBAI yo creo que se tiene que agrupar por secuencia y luego por fecha para que se haga de manera correcta. En ningún momento la ley exige una secuencia única por caja, solo que se tiene que agrupar correctamente al tener mas de una

A todo esto, el comentario que indicas que es un interpretación libre de la ley, si es así, todas las interpretaciones lo son. Y segundo es una solución para un mercado que nunca tenéis en cuenta que es la restauración (no decir que no contemplar el IVA incluido en OCA si es un problema con la ley, ya que es una imposición legal en venta a cliente final), que en cualquier sitio te piden una sola caja pero varios punto de venta y ya no decir si se añade la gestión de camareros.

Siguiendo tu ejemplo el resultado tendría que ser:

TIENDA-22-00001
TIENDA-22-00002
TIENDA-22-00003
TIENDA-22-00004
TIENDA-22-00005
TIENDA-22-00007

12345-123-1234
12345-123-1235
12345-123-1236

ya que aún siendo la misma caja, tenemos secuencias diferentes. Como puedes observar en la normativa:

https://sede.agenciatributaria.gob.es/Sede/iva/facturacion-registro/facturacion-iva.html
...
Si la Identificación de la factura incluye la Serie, se recomienda que figure en primer lugar, seguida del número de factura con un blanco por medio.
...
La numeración de las facturas dentro de cada serie será correlativa.
...

@blaskurain
Copy link

Coincido con @chienandalu, el cambio 2967122 debería echarse atrás como propone este PR porque fue un paso en la dirección incorrecta: la forma de conseguir que no haya conflictos en las numeraciones de las facturas no es requerir que el sistema funcione online sino generar los números de ticket siempre como si estuviéramos offline, es decir, con secuencias independientes para cada punto de venta. Como dice @anajuaristi no es un problema de ticketbai, ticketbai sólo hace que salga a la superficie (los duplicados son un problema idependientemente de ticketbai).

La forma natural de conseguir esto es tener una configuración de TPV por dispositivo, cada uno con su secuencia.
No termino de entender por qué no es aceptable en un restaurante tener una configuración de TPV por dispositivo (los datos de los pedidos están en cada dispositivo, no se comparten hasta que se validan ¿no?; en este punto da igual que sean la misma sesión o no) pero es verdad que no conozco el sector así que para esta argumentación voy a aceptar la premisa de que es necesario.

Si no se toman medidas específicas tener la misma sesión del TPV abierta en varios dispositivos es receta para el desastre: el contador de facturas simplificadas se define en l10n_es_pos y es el mismo para todas las sesiones del TPV. Con una configuración creativa del contador como la que @AntoniRomera parece que se podría solucionar el problema. Tiene el punto positivo de que no requiere ningún desarrollo, únicamente configurar el punto de venta de acuerdo a estos parámetros. Volveríamos a un estado en que el TPV puede funcionar 100% offline y no se rompería nada. Hace poco me encontré con una numeración de este estilo y aunque personalmente no me gusta me aseguran que es fiscalmente correcta. Sería mejor, en mi opinión, vincular la numeración al dispositivo (de manera que no tengamos tantas series como dispositvo*día del año sino tantas series como dispositivos) pero esto no creo que sea posible en la implementación actual.

@chienandalu
Copy link
Member Author

Una solución a plantear después de tu demostración seria la siguiente:

{OFFLINE-SEQUENCE}-{dispositivo}-{fecha y hora que entra en la sesion deJS}-0001

No sé muy bien de dónde sacas el dispositivo. Pero siguiendo este mismo razonamiento, ni siquiera sería necesario pasar a una secuencia distinta offline, ya que la secuencia de FS podría llegar a incorporarlo y correr independientemente en cada uno; claro, que serían necesarias varias secuencias y complicaría enormemente el sistema.

En cualquier caso, opino que seguirán siendo trucos para eludir implementar la verdadera solución a un problema esencialmente técnico

@AntoniRomera
Copy link

En cualquier caso, opino que seguirán siendo trucos para eludir implementar la verdadera solución a un problema esencialmente técnico.

Y me puedes decir cual es la verdadera solución (teniendo en cuenta como funciona la restauración).

No sé muy bien de dónde sacas el dispositivo

El tema del dispositivo, solo seria añadir una pequeña configuración al JS (Tal como se hizo en el shopfloor de WMS, creo que ahi le dicen API Key).

seguirán siendo trucos

Y realmente en ningún momento habéis comentado, ni habéis intentando llegar a una solución que pueda incluir las dos posturas, como seria añadir un check de configuración que indique si se necesita una secuencia de FS offline, si estuviera marcado pues se usaría y en el caso de solo tener un terminal de venta como es la mayoría de vuestros casos, lo dejáis desmarcado y ya estaría.

@blaskurain
Copy link

La secuencia siempre tiene que ser offline y no se pueden compartir los contadores. Es decir, siempre se deben generar los números de factura sin comunicación con el servidor garantizando unicidad. Esto es imprescindible para evitar duplicados.

En nuestro caso para que se cumpla lo que hacemos es: un contador por POS y una sesión abierta por pos POS. Pero realmente da igual, abrir la misma sesión varias veces o no es irrelevante siempre que lo de arriba se cumpla. Por otro lado, si lo de arriba no se cumple, es sólo cuestión de tiempo tener problemas con tickets.

@ao-landoo
Copy link
Contributor

Hemos estado pensando (@gelo-landoo y yo) cómo dar una solución válida en todos los casos planteados. Proponemos establecer secuencias por dispositivo. A continuación explicamos la solución encontrada:

Necesidad.

Cubrir el requerimiento legal de secuencias de facturas simplificadas del POS en el caso de que los dispositivos se queden sin conexión.

Solución.

Configuración general módulo POS.
Va a permitir que la funcionalidad sea opcional.
Activar este check permitirá hacer la configuración que se detalla a continuación.
Nuevo checkbox en la configuración del módulo POS para activar la secuenciación por dispositivo por compañía.

Registro y secuencia de dispositivos.
Va a permitir crear el registro de dispositivos a utilizar y establecer la secuencia para cada uno.
Botón para desbloquear manualmente dispositivos.

Nuevo modelo llamado POS Device (pos.device) donde se establecerán los diferentes dispositivos.
Modelo con los campos:

  • Nombre (name): Char
  • Secuencia (sequence): Many2one a ir.sequence
  • En uso (locked): Boolean readonly. True = dispositivo seleccionado al abrir sesión

Crear vista lista con opción de creación sobre ella. Contendrá los campos:

  • Nombre (name): Char
  • Secuencia (sequence): Many2one a ir.sequence
  • Botón para desbloquear dispositivo si locked = True.

Configuración del Punto de Venta
Va a permitir indicar los dispositivos disponibles en cada Punto de venta.

Nuevo campo Many2many relacionado a POS Device (pos.device). Si se queda en blanco se utilizan todos los dispositivos. Si no, se muestran solamente los seleccionados.

Apertura de sesión
Va a permitir seleccionar el dispositivo que se va a utilizar en esa sesión.
En la emisión de las facturas simplificadas utilizará la secuencia definida para ese dispositivo.
Al abrir una sesión y seleccionar el dispositivo quedará marcado como “en uso” y no podrá volver a ser seleccionado a menos que se desbloquee al cerrar la sesión o desbloquearlo manualmente.

Función JS para mostrar ventana de selección de dispositivo nada más cargar los datos para el inicio de la sesión.
Modificación de función JS que asigna el número de factura simplificada para que haga uso de la secuencia asignada para el dispositivo.
El propio JS llevará un contador para el siguiente número para el caso en el que se quede sin conexión el dispositivo.

Cierre de sesión
Actualizar el dato del número de la última factura simplificada emitida una vez cerrada la sesión con y sin conexión.

Función JS para que al cerrar la sesión con el dispositivo se desbloquee el mismo.
En el caso de que se cierre sesión sin conexión, se hará uso de la funcionalidad de ‘Recuperación sesión’ estándar de Odoo.


Se agradecería la participación y el debate sobre la propuesta. Gracias.

@blaskurain
Copy link

Antes de entrar en los detalles de la propuesta @ao-landoo tengo algunas dudas acerca de la propia necesidad.

Para mí la necesidad realmente se reduce a asegurar de que nunca se comparten contadores entre distintos navegadores. Hoy por hoy nosotros lo hacemos así (a mano) para evitar problemas: nada de abrir el mismo pos.config dos veces. A veces se nos cuela alguien, y entonces, en efecto, hay problemas. Esto me lleva a la pregunta: ¿cuál es la necesidad de abrir el mismo pos.config múltiples veces? Un dispositivo físico <-> un pos.config y no hay problema con los contadores. Incluso se puede usar el mismo usuario para todas las sesiones. Sencillamente no veo el caso de uso.

Odoo apunta en esta dirección ya que no permite abrir el mismo pos.config con distintos usuarios; sí que permite abrirlo varias veces con el mismo usuario pero en mi opinión esto sencillamente es una limitación de la implementación (identificar un usuario en Odoo es muy fácil, identificar un dispositivo en particular no tanto).

Bajo la premisa anterior, es suficiente con asociar un pos.config a un dispositivo (dispositivo == navegador) dado de manera que una vez que se abra desde mi dispositivo ya no se pueda abrir desde el tuyo (hasta cerrar sesión o liberar a mano).

Esto nos lleva a cómo conseguir esto. Yo haría lo siguiente. Lo primero es identificar cada dispositivo siempre. Sólo necesitamos esto dentro del contexto de POS. Para ello generaríamos en JS un etiqueta en forma de UUID para cada dispositivo y lo guardaríamos en el local storage. Al abrir la sesión de punto de venta el navegador comunicaría este UUID al servidor. Aquí podrían pasar tres cosas:
a) No hay sesión abierta. Se abre una y se asocia con el UUID.
b) Hay sesión abierta y el UUID asociado a la sesión coincide con la del dispositivo o la sesión no tiene UUID. Asociar con el UUID. Reanudar de forma normal.
c) Hay sesión abierta y el UUID asociado a la sesión NO coincide. Mostrar mensaje de error y no permitir abrir.

En cuanto a cómo implementar esto sería como sigue:
Agregar el campo device_tag en pos.session. Este campo no sería editable directamente.
Agregar un botón para disociar el dispositivo y la sesión sin cerrar la sesión (protegido con los permisos apropiados).
Modificar el controlador /pos/ui para que trate el parámetro device_tag. Si está presente actúa según lo arriba indicado. Si no está presente envía al navegador un HTML con el código Javascript para leer el UUID del dispositivo desde el local storage (generarlo si no está presente) y volver a llamar /pos/ui con los mimos parámetros agregando device_code.

Adicionalmente se podría permitir editar el nombre del dispositivo de manera que en vez de usar UUID el usuario pueda indicar BARRA01, BARRA01, CAMARERO01, CAMARERO02 o lo que se oportuno.

Creo que esto sería más sencillo de implementar, más sencillo de usar y más robusto; no hace falta gestión de dispositivos (más allá de cambiarles el nombre si fuera necesario); los dispositivos nuevos funcionan sin más; sería "transparente" en muchos casos; no se comparten nunca los contadores bajo ninguna condición.

@ghost
Copy link

ghost commented Jan 20, 2023

Hola,
Lo primero, gracias por la aportación. Analizándolo, encontramos un problema. Es práctica habitual en hostelería y en otros sectores, pero creo que es más claro el ejemplo de un restaurante. En este caso creo que la solución que aportas no es aplicable. Y es un caso que sí quedaría resuelto con lo que proponemos @ao-landoo y yo. Pongo un ejemplo.

Caso de uso:

Un restaurante donde hay una única caja central con un POS físico, donde se introduce el dinero en efectivo y se cuadra la caja al final de sesión.
En ese restaurante trabajan 5 camareros, cada uno con su dispositivo (tablet, PDA) con la que registra las comandas, el estado de las mesas y realiza los cobros en efectivo y tarjeta. Para poder trabajar y realizar los cuadres de caja, esos dispositivos deben estar conectados a la misma sesión de POS abierta desde la caja central. Todos los camareros deben poder conocer el estado de las demás mesas y hacer el cobro si fuese necesario. Además, un camarero puede usar más de un dispositivo, ya que puede ocasionalmente hacer un cobro desde el POS principal. O incluso si una tabet se queda sin batería, debe de poder reemplazala por otra.

Propuesta de trabajo

Se abre la sesión del POS con un usuario llamado POS 1 genérico.
Los camareros (empleados para Odoo), que no es necesario ni que tengan usuario, entran a la sesión del POS con el usuario genérico del POS, identificado cada operación seleccionando su empleado (estándar de Odoo).

Con nuestra propuesta, identificando los dispositivos al iniciar sesión, cada dispositivo llevará su secuencia y no habrá ningún problema en cubrir este caso de uso y otros más simples.

En cuanto a la necesidad de identificar dispositivos, ya es algo que Odoo usa con las impresoras, con lo que no creemos que vayamos en contra del flujo normal de Odoo.
Y esta propuesta respeta también el flujo que comentabas de que una sesión sólo es abierta por un único usuario.

Gracias por la aportación y a ver si podemos lograr un punto de acuerdo.
Un saludo,

@Mat-moran
Copy link
Contributor

Gracias por las aportaciones!, no había visto esto hasta ahora.

Desde mi punto de vista la propuesta de @ao-landoo y @gelo-landoo solucionarían un flujo de trabajo que actualmente no esta resuelto en Odoo teniendo en cuenta la legislación española. La mayoria de restaurantes y empresas que tienen PDA en tiendas, es justamente lo que se necesita, una caja y multiples PDA´s trabajando sobre la misma sesión. Seguramente por eso Odoo paso a un numero de ticket basado en UUID que garantiza numeros únicos sin llevar secuencia.

Según lo que proponéis habría que cambiar el funcionamiento del POS principal también para que la lógica de la secuencia sea interna y que aunque se quede sin conexion no coja la numeración original de Odoo no?.

S2 y gracias por el curro, si necesitais ayuda con algo podemos dedicar tiempo.

@ghost
Copy link

ghost commented Jan 20, 2023

Hola @Mat-moran ,
Gracias por tu respuesta.
Entiendo que con POS principal te refieres al funcionamiento del l10n_es_pos. Éste cambiará solamente si se activa el check que explica @ao-landoo en el punto "Configuración general módulo POS".
Si no el módulo seguirá como hasta ahora. De esta forma, quien prefiera seguir usando el actual sistema podrá seguir haciéndolo.
Un saludo,

@Mat-moran
Copy link
Contributor

Hola @Mat-moran , Gracias por tu respuesta. Entiendo que con POS principal te refieres al funcionamiento del l10n_es_pos. Éste cambiará solamente si se activa el check que explica @ao-landoo en el punto "Configuración general módulo POS". Si no el módulo seguirá como hasta ahora. De esta forma, quien prefiera seguir usando el actual sistema podrá seguir haciéndolo. Un saludo,

Me refería a aplicar los cambio propuestos por @chienandalu + @ao-landoo ya que si solo se aplica lo propuesto por @ao-landoo seguiríamos teniendo problemas con el funcionamiento actual.

¿Es esa la idea?

@ao-landoo
Copy link
Contributor

Hola @Mat-moran , Gracias por tu respuesta. Entiendo que con POS principal te refieres al funcionamiento del l10n_es_pos. Éste cambiará solamente si se activa el check que explica @ao-landoo en el punto "Configuración general módulo POS". Si no el módulo seguirá como hasta ahora. De esta forma, quien prefiera seguir usando el actual sistema podrá seguir haciéndolo. Un saludo,

Me refería a aplicar los cambio propuestos por @chienandalu + @ao-landoo ya que si solo se aplica lo propuesto por @ao-landoo seguiríamos teniendo problemas con el funcionamiento actual.

¿Es esa la idea?

Es la idea

@blaskurain
Copy link

@Mat-moran @ao-landoo, que la secuencias sean offline es necesario, el commit que en este pr @chienandalu quiere revertir no debió ser aceptado en primer lugar.

@ghost
Copy link

ghost commented Jan 23, 2023

Hola,
Para agilizar el proceso de desarrollo e intentar que este asunto quede zanjado lo antes posible, si para el miércoles 25 de enero de 2023 no hay cualquier tipo de objeción que lo impida, nos ponemos a desarrollarlo y abrir PR. La idea es tener lo antes posible todo listo para poder ir testando.
Un saludo,

@ao-landoo
Copy link
Contributor

ao-landoo commented Feb 1, 2023

Hemos creado el PR #2812 con la solución propuesta por @gelo-landoo en el último mensaje

@rafaelbn
Copy link
Member

Entiendo que hay otro PR, pero este FIX está corriendo en algunas instancias en PROD

OJO a la migración a v16: #2615

@ao-landoo
Copy link
Contributor

Entiendo que hay otro PR, pero este FIX está corriendo en algunas instancias en PROD

OJO a la migración a v16: #2615

El otro PR incluye el commit de este PR. El resto de cambios que se incluyen son opcionales, se activan solamente si se activa un checkbox en ajustes.

@chienandalu chienandalu closed this May 4, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

9 participants