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][IMP] l10n_es_pos: Secuencias por dispositivo #2812

Merged
merged 3 commits into from
Mar 17, 2023

Conversation

ao-landoo
Copy link
Contributor

@ao-landoo ao-landoo commented Feb 1, 2023

Dejo el PR en el que se agrega la nueva funcionalidad al módulo del POS español para permitir usuarios concurrentes desde diferentes dispositivos en la misma sesión de POS.

Dejar claro que es una funcionalidad opcional, y si no se activa desde ajustes todo sigue igual. He dejado las instrucciones en el README, pero básicamente se trata de:

  • Activar en ajustes de TPV en checkbox para secuencias por dispositivo
  • Administrar dispositivos y sus secuencias en TPV -> Configuración -> Dispositivos físicos TPV
  • En la configuración del POS seleccionar los dispositivos disponibles o dejarlo vacío si se quieren poder utilizar todos

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)
@ao-landoo ao-landoo force-pushed the 14.0-imp-l10n_es_pos-seq_by_device branch 3 times, most recently from cd92dfb to ef89a7d Compare February 1, 2023 11:43
@ao-landoo ao-landoo marked this pull request as ready for review February 1, 2023 11:44
@ao-landoo
Copy link
Contributor Author

@ao-landoo ao-landoo force-pushed the 14.0-imp-l10n_es_pos-seq_by_device branch from afd9591 to d89502c Compare February 3, 2023 09:43
@Mat-moran
Copy link
Contributor

Muchas gracias por el PR 😄

el runbot da el siguiente error
image

No he podido probar en profundidad, lo he instalado en local y veo que te deja seleccionar un dispositivo en un punto de venta aunque no lo tenga asignado en la configuración. Para replicar

  • Crea dos dispositivos y dos puntos de venta
  • Asigna el primer dispositivo al primer punto de venta
  • Abre sesión en el primer punto de venta seleccionando el primer dispositivo
  • Abre sesión en el segundo punto de venta -> Te aparece el dispositivo 2 (que no esta asignado a ese TPV)

Seguiré testeando.

Otra cosilla.
Este PR resuelve el error del PR #2582 cuando no se utilizan dispositivos? o solo lo hace cuando se utilizan dispositivos?

@ao-landoo
Copy link
Contributor Author

ao-landoo commented Feb 9, 2023

Muchas gracias por el PR smile

el runbot da el siguiente error image

No he podido probar en profundidad, lo he instalado en local y veo que te deja seleccionar un dispositivo en un punto de venta aunque no lo tenga asignado en la configuración. Para replicar

  • Crea dos dispositivos y dos puntos de venta
  • Asigna el primer dispositivo al primer punto de venta
  • Abre sesión en el primer punto de venta seleccionando el primer dispositivo
  • Abre sesión en el segundo punto de venta -> Te aparece el dispositivo 2 (que no esta asignado a ese TPV)

Seguiré testeando.

Otra cosilla. Este PR resuelve el error del PR #2582 cuando no se utilizan dispositivos? o solo lo hace cuando se utilizan dispositivos?

Respecto al error del runboat, parece que es un problema funcional que no está relacionado con este PR.

Cuando un punto de venta no tiene seleccionado ningún dispositivo permite seleccionar todos los de esa compañía mientras no estén bloqueados. Lo pone en la 'ayuda' del campo: Si se deja vacío, se pueden seleccionar todos los dispositivos. ¿Te refieres a eso? En ese caso es el comportamiento esperado.

El commit del PR #2582 está incluido en este PR.

@ao-landoo ao-landoo force-pushed the 14.0-imp-l10n_es_pos-seq_by_device branch from d89502c to e654361 Compare February 9, 2023 08:02
@Mat-moran
Copy link
Contributor

Cuando un punto de venta no tiene seleccionado ningún dispositivo permite seleccionar todos los de esa compañía mientras no estén bloqueados. Lo pone en la 'ayuda' del campo: Si se deja vacío, se pueden seleccionar todos los dispositivos. ¿Te refieres a eso? En ese caso es el comportamiento esperado.

En ese caso el funcionamiento es correcto.

@rafaelbn
Copy link
Member

Hola,

@omar7r @chienandalu hay consenso?

Lo digo porque ya está el PR a v16 y deberíamos entra en v15 con consenso y coherencia, de hecho ahora mismo (no tengo pos) no sé cómo está en v15 😄

#2615

Mil gracias a todos por los esfuerzos de explicar, compartir y debatir la mejor solución en todos los escenarios.

Saludos

Copy link
Member

@chienandalu chienandalu left a comment

Choose a reason for hiding this comment

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

Muchas gracias por el esfuerzo @ao-landoo y @gelo-landoo . En cualquier caso, todo el tema de los pos.device debería ir en un módulo general a OCA/pos y, o bien hacer depender a l10n_es_pos de aquel o bien hacer un tercer módulo que unifique ambos para esa necesidad (abriendo hooks los hooks fuesen necesarios en l10n_es_pos).

@AntoniRomera
Copy link

Lo veo perfecto, al comentario de @chienandalu no creo que sea necesario separarlo, seria triplicar trabajo, ya que se tiene que modificar mucho el modulo base l10_es_pos y el otro quedaria con 3 lineas de codigo

@ao-landoo
Copy link
Contributor Author

En mi opinión llevarlo a la repo OCA/pos actualmente no tiene sentido porque el concepto de dispositivos POS es super simple y no tienen funcionalidad propia ahora mismo.

Si en un futuro se piensa agregar nuevas funcionalidades si que me parece adecuado llevar la definición de este modelo a ese repositorio, pero ahora mismo quedaría un módulo muy simple sin ninguna utilidad.

@pedrobaeza pedrobaeza added this to the 14.0 milestone Feb 14, 2023
@pedrobaeza
Copy link
Member

Pues todo esto no debería estar en el módulo principal. Debería ser un módulo l10n_es_pos_by_device, pero dejar el módulo simple sin toda esta complicación para los que no la necesitan.

@ao-landoo
Copy link
Contributor Author

No coincido en que esta funcionalidad debería de ir en otro módulo separado. El módulo principal (l10n_es_pos) pone en el primer punto de la descripción lo siguiente: Adapta el terminal punto de venta a la legislación Española.

Ahora mismo el módulo no lo adapta a todos los casos de uso reales porque en caso de utilizar mas de un dispositivo en una sesión hay casos en los que se imprime el mismo número de factura simplificada, cosa que no está permitido por la legislación española. Agregar esto al módulo l10n_es_pos no afectaría en nada a los que no quieran utilizarlo, y para los que lo necesiten les valdría con activar un checkbox y configurar los dispositivos.

Aparte de que no considero que se trate de una funcionalidad que haga que el código del módulo sea mucho mas complejo. Simplemente agrega un nuevo modelo y en la parte de JavaScript toca condiciones que ya estaban creadas por l10n_es_pos.

Como punto extra, agregar esta funcionalidad en otro módulo separado puede traer problemas que suele haber con módulos que no mucha gente utiliza: cuando sale una nueva versión de Odoo se atrasa la migración del mismo por falta de approvals o porque nadie se pone a migrarlo. Estando todo en el mismo módulo, que es utilizado por toda la gente de la localización española, no debería de existir este problema de atrasos en la migración del mismo.

@pedrobaeza
Copy link
Member

No seas más papista que el Papa, Aritz. Puestos así, el l10n_es_aeat_mod303 debería obligar a todo el mundo a poner los módulos del OSS en lugar de tener el módulo l10n_es_aeat_mod303_oss, porque también forma parte del 303. La modularidad de Odoo está para extractar las partes que interesen de forma separada por conveniencia, y separar esta necesidad de los dispositivos, que no es de todo el mundo, en un módulo, permite que los que no tenemos esa necesidad, no tengamos que cargar con ella a cuestas, así que insisto en que debe separarse.

@blaskurain
Copy link

Concuerdo con @pedrobaeza en que debe ser una funcionalidad separada. Nosotros, por ejemplo, no necesitamos esta funcionalidad para nada. Sencillamente nunca abrimos la misma sesión en dos dispositivos. En cualquier instalación que tenga que gestionar preferiría que no estuviera ni siquiera disponible/instalable: una cosa menos que pueda problemas.

@rafaelbn
Copy link
Member

Keep as simple as posible

Este módulo se hizo para una pequeña tienda de Madrid de la Calle Goya en el año 2015 #170

Cuanto menos código se le ponga a un pequeño cliente, mejor. Aquellos más grandes o de más volumen con más complejidad no tenéis problemas de agregar otros módulos.

Abogo por un divide y vencerás 😄 (en varios módulos)

¡Muchas gracias a todos!

@Mat-moran
Copy link
Contributor

Buenas, he intentado instalarlo en una base de datos de test junto con otros módulos instalados y me ha dado un error de conflicto con un módulo del repo sale-promotion al hacer un update all

2023-02-16 06:27:24,648 17782 INFO db_odoo odoo.addons.base.models.ir_ui_view: El campo "pos_sequence_by_device" no existe en el modelo "res.config.settings"

View name: res.config.settings.view.form.inherit.sale.coupon
Error context:
 view: ir.ui.view(3531,)
 xmlid: res_config_settings_view_form
 view.model: res.config.settings
 view.parent: ir.ui.view(856,)
 file: /opt/odoo/custom/src/odoo/addons/sale_coupon/views/res_config_settings_views.xml

2023-02-16 06:27:24,659 17782 WARNING db_odoo odoo.modules.loading: Transient module states were reset
2023-02-16 06:27:24,661 17782 ERROR db_odoo odoo.modules.registry: Failed to load registry
2023-02-16 06:27:24,661 17782 CRITICAL db_odoo odoo.service.server: Failed to initialize database `db_odoo`.
Traceback (most recent call last):
  File "/opt/odoo/custom/src/odoo/odoo/tools/convert.py", line 677, in _tag_root
    f(rec)
  File "/opt/odoo/custom/src/odoo/odoo/tools/convert.py", line 580, in _tag_record
    record = model._load_records([data], self.mode == 'update')
  File "/opt/odoo/custom/src/odoo/odoo/models.py", line 4234, in _load_records
    data['record']._load_records_write(data['values'])
  File "/opt/odoo/custom/src/odoo/odoo/addons/base/models/ir_ui_view.py", line 1858, in _load_records_write
    super(View, self)._load_records_write(values)
  File "/opt/odoo/custom/src/odoo/odoo/models.py", line 4158, in _load_records_write
    self.write(values)
  File "/opt/odoo/custom/src/odoo/addons/website/models/theme_models.py", line 295, in write
    res = super(IrUiView, other_views).write(vals)
  File "/opt/odoo/custom/src/odoo/addons/website/models/ir_ui_view.py", line 68, in write
    return super(View, self).write(vals)
  File "/opt/odoo/custom/src/odoo/odoo/addons/base/models/ir_ui_view.py", line 507, in write
    res = super(View, self).write(self._compute_defaults(vals))
  File "/opt/odoo/auto/addons/component_event/models/base.py", line 109, in write
    result = super(Base, self).write(vals)
  File "/opt/odoo/custom/src/odoo/odoo/models.py", line 3712, in write
    fields[0].determine_inverse(real_recs)
  File "/opt/odoo/custom/src/odoo/odoo/fields.py", line 1187, in determine_inverse
    getattr(records, self.inverse)()
  File "/opt/odoo/custom/src/odoo/odoo/addons/base/models/ir_ui_view.py", line 307, in _inverse_arch
    view.write(data)
  File "/opt/odoo/custom/src/odoo/addons/website/models/theme_models.py", line 295, in write
    res = super(IrUiView, other_views).write(vals)
  File "/opt/odoo/custom/src/odoo/addons/website/models/ir_ui_view.py", line 68, in write
    return super(View, self).write(vals)
  File "/opt/odoo/custom/src/odoo/odoo/addons/base/models/ir_ui_view.py", line 507, in write
    res = super(View, self).write(self._compute_defaults(vals))
  File "/opt/odoo/auto/addons/component_event/models/base.py", line 109, in write
    result = super(Base, self).write(vals)
  File "/opt/odoo/custom/src/odoo/odoo/models.py", line 3702, in write
    real_recs._validate_fields(vals, inverse_fields)
  File "/opt/odoo/custom/src/odoo/odoo/models.py", line 1266, in _validate_fields
    check(self)
  File "/opt/odoo/custom/src/odoo/odoo/addons/base/models/ir_ui_view.py", line 415, in _check_xml
    raise ValidationError(_(
  File "/opt/odoo/custom/src/odoo/odoo/addons/base/models/ir_ui_view.py", line 398, in _check_xml
    view.postprocess_and_fields(view_doc, validate=True)
  File "/opt/odoo/custom/src/odoo/odoo/addons/base/models/ir_ui_view.py", line 857, in postprocess_and_fields
    arch, name_manager = self._postprocess_view(node, model, validate=validate)
  File "/opt/odoo/custom/src/odoo/odoo/addons/base/models/ir_ui_view.py", line 869, in _postprocess_view
    self.postprocess(node, [], editable, name_manager)
  File "/opt/odoo/custom/src/odoo/odoo/addons/base/models/ir_ui_view.py", line 969, in postprocess
    self.postprocess(child, current_node_path, node_info['editable'], name_manager)
  File "/opt/odoo/custom/src/odoo/odoo/addons/base/models/ir_ui_view.py", line 969, in postprocess
    self.postprocess(child, current_node_path, node_info['editable'], name_manager)
  File "/opt/odoo/custom/src/odoo/odoo/addons/base/models/ir_ui_view.py", line 969, in postprocess
    self.postprocess(child, current_node_path, node_info['editable'], name_manager)
  [Previous line repeated 4 more times]
  File "/opt/odoo/custom/src/odoo/odoo/addons/base/models/ir_ui_view.py", line 960, in postprocess
    validator(node, name_manager, node_info)
  File "/opt/odoo/custom/src/odoo/odoo/addons/base/models/ir_ui_view.py", line 1096, in _validate_tag_field
    self.handle_view_error(msg)
  File "/opt/odoo/custom/src/odoo/odoo/addons/base/models/ir_ui_view.py", line 680, in handle_view_error
    raise ValueError(formatted_message).with_traceback(from_traceback) from from_exception
odoo.exceptions.ValidationError: Ocurrió un error al validar la vista:

El campo "pos_sequence_by_device" no existe en el modelo "res.config.settings"

View name: res.config.settings.view.form.inherit.sale.coupon
Error context:
 view: ir.ui.view(3531,)
 xmlid: res_config_settings_view_form
 view.model: res.config.settings
 view.parent: ir.ui.view(856,)
 file: /opt/odoo/custom/src/odoo/addons/sale_coupon/views/res_config_settings_views.xml


The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/opt/odoo/custom/src/odoo/odoo/service/server.py", line 1201, in preload_registries
    registry = Registry.new(dbname, update_module=update_module)
  File "/opt/odoo/custom/src/odoo/odoo/modules/registry.py", line 89, in new
    odoo.modules.load_modules(registry._db, force_demo, status, update_module)
  File "/opt/odoo/custom/src/odoo/odoo/modules/loading.py", line 455, in load_modules
    processed_modules += load_marked_modules(cr, graph,
  File "/opt/odoo/custom/src/odoo/odoo/modules/loading.py", line 347, in load_marked_modules
    loaded, processed = load_module_graph(
  File "/opt/odoo/custom/src/odoo/odoo/modules/loading.py", line 222, in load_module_graph
    load_data(cr, idref, mode, kind='data', package=package)
  File "/opt/odoo/custom/src/odoo/odoo/modules/loading.py", line 69, in load_data
    tools.convert_file(cr, package.name, filename, idref, mode, noupdate, kind)
  File "/opt/odoo/custom/src/odoo/odoo/tools/convert.py", line 733, in convert_file
    convert_xml_import(cr, module, fp, idref, mode, noupdate)
  File "/opt/odoo/custom/src/odoo/odoo/tools/convert.py", line 799, in convert_xml_import
    obj.parse(doc.getroot())
  File "/opt/odoo/custom/src/odoo/odoo/tools/convert.py", line 719, in parse
    self._tag_root(de)
  File "/opt/odoo/custom/src/odoo/odoo/tools/convert.py", line 681, in _tag_root
    raise ParseError('while parsing %s:%s, near\n%s' % (
odoo.tools.convert.ParseError: while parsing /opt/odoo/custom/src/odoo/addons/sale_coupon/views/res_config_settings_views.xml:4, near
<record id="res_config_settings_view_form" model="ir.ui.view">
        <field name="name">res.config.settings.view.form.inherit.sale.coupon</field>
        <field name="model">res.config.settings</field>
        <field name="inherit_id" ref="sale.res_config_settings_view_form"/>
        <field name="arch" type="xml">
            <xpath expr="//div[@id='sale_coupon']" position="after">
                <div class="content-group">
                    <div class="mt8" attrs="{'invisible': [('module_sale_coupon', '=', False)]}">
                        <button name="%(coupon.coupon_program_action_promo_program)d" icon="fa-arrow-right" type="action" string="Promotion Programs" class="btn-link"/>
                    </div>
                    <div class="mt8" attrs="{'invisible': [('module_sale_coupon', '=', False)]}">
                        <button name="%(coupon.coupon_program_action_coupon_program)d" icon="fa-arrow-right" type="action" string="Coupon Programs" class="btn-link"/>
                    </div>
                 </div>
             </xpath>
        </field>
    </record>
2023-02-16 06:27:24,664 17782 INFO db_odoo odoo.service.server: Stopping gracefully

@ao-landoo ao-landoo force-pushed the 14.0-imp-l10n_es_pos-seq_by_device branch from e654361 to de9ddc6 Compare February 24, 2023 11:36
@ao-landoo ao-landoo force-pushed the 14.0-imp-l10n_es_pos-seq_by_device branch 3 times, most recently from 71040e6 to fedf92c Compare February 24, 2023 11:56
@ao-landoo
Copy link
Contributor Author

He realizado unos cambios en l10n_es_pos para facilitar la herencia desde el módulo l10n_es_pos_by_device que he creado, pero sin tocar la lógica.

A ver que os parece, yo he realizado pruebas y me está funcionando bien.

@ao-landoo ao-landoo force-pushed the 14.0-imp-l10n_es_pos-seq_by_device branch from fedf92c to 15a70b6 Compare February 24, 2023 12:03
@ao-landoo
Copy link
Contributor Author

@pedrobaeza @rafaelbn @blaskurain @Mat-moran ¿De esta manera todos contentos?

@ao-landoo
Copy link
Contributor Author

Feedback de alguno? Nos convendría desbloquar esto para llevar l10n_es_pos a la versión 16 lo antes posible.

@pedrobaeza pedrobaeza requested a review from chienandalu March 15, 2023 08:25
@rafaelbn
Copy link
Member

Yo no tengo cliente del POS en 14 para probar y valorar.

@omar7r @chienandalu @pedrobaeza ?

@AntoniRomera
Copy link

Yo más modificaciones las veo bien, me parece correcto haberlo separado y probado en el runbot no da fallo, por mi parte se puede hacer el merge para que se pueda seguir con la migración a la v16

Copy link
Member

@chienandalu chienandalu left a comment

Choose a reason for hiding this comment

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

Revisada la parte de l10n_es_pos me parece bien. Gracias a todos 😄 👍

@pedrobaeza
Copy link
Member

/ocabot merge patch

@OCA-git-bot
Copy link
Contributor

On my way to merge this fine PR!
Prepared branch 14.0-ocabot-merge-pr-2812-by-pedrobaeza-bump-patch, awaiting test results.

@OCA-git-bot OCA-git-bot merged commit 5056186 into OCA:14.0 Mar 17, 2023
@OCA-git-bot
Copy link
Contributor

Congratulations, your PR was merged at 2ffd2cc. Thanks a lot for contributing to OCA. ❤️

@rafaelbn
Copy link
Member

¿Quién lo llevará a 15 y 16? Como comenté, por el momento no tengo ningún POS 😄 @ae-landoo puedes hacer tu el forwardport?

Muchísimas gracias de ❤️

@ao-landoo
Copy link
Contributor Author

¿Quién lo llevará a 15 y 16? Como comenté, por el momento no tengo ningún POS smile @ae-landoo puedes hacer tu el forwardport?

Muchísimas gracias de heart

Ya me encargo yo, a ver si saco un rato algún día de estos

@rafaelbn
Copy link
Member

Gracias @ae-landoo

@pedrobaeza propongo por favor planificar para el Code Sprint ampliar la cobertura de TEST de este módulo, puede ser interesante de cara a su mantenimiento

@ae-landoo
Copy link

@rafaelbn gracias por los créditos pero es mi compañero @ao-landoo el que está haciendo el trabajo.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

9 participants