Folios repetidos en ventas offline al refrescar navegador con F5
Cuando se realizan ventas y por alguna razon se pierde conexion con el servidor(se va internet, se desconecta la red, etc) el sistema permite seguir vendiendo y todos los pedidos se quedan en la cola, para cuando se restablezca la conexión se envien al server. Esto funciona bien desde odoo base, sin embargo hay un pequeño gran error cuando se restablece la conexion y el usuario refresca el navegador con F5. Cuando pasa esto, se vuelven a cargar todos los datos de la sesion(clientes, productos, etc) y tambien se vuelve a refrescar dos campos importantes de pos.session: start_number, numero_ordenes(y los respectivos para boleta exenta), pero despues de esto recien se envian los pedidos que se quedaron en cola. El problema esta en el orden que se hacen las cosas, al primero refrescar los campos de la sesion y luego enviar los pedidos, esos campos de start_number y numero_ordenes quedan desactualizados, provocando que se vuelvan a dar los mismos folios que se quedaron en cola, esto repite los folios en el pos. Muestro imagenes del error esperando que se entienda el problema: Voy a iniciar desde el folio 1, no tengo ni pedidos ni sesiones, es una BD nueva Emito 2 ventas en el pos, con folio 1 y 2 que se envian al server: Venta 1 Venta 2 Hasta ahi se enviaron dos pedidos al server y todo esta bien: continuando con las ventas desde el pos, voy a detener el servicio de odoo(simulando una perdida de internet o problemas de red), esto provocara que los pedidos que venda se queden en cola, lo cual es trabajar offline. Venta 3, se da el folio 3 y se queda 1 pedido en cola Venta 4, se da el folio 4 y se quedan 2 pedidos en cola(3 y 4) Inicio el servicio de odoo nuevamente(simulando que se restauro el servicio de internet) y no presiono el boton de reconectar y enviar las ordenes al servidor(si hago esto si funciona bien), lo que hago es refrescar la pestaña del navegador con F5
Refresco navegador con F5 y se recarga la sesion y luego de eso se envian los pedidos al server Los pedidos quedan bien Luego realizo otra venta y aca es donde esta el problema Venta 5 deberia tener el folio 5, pero me da el folio 3 Al revisar los pedidos veo un folio repetido y si sigo vendiendo, me va a seguir dando folios a partir del 3 en adelante, repitiendose el 3 y 4 que ya se habian generado( y todos los folios que se pudieran quedar en cola, en este ejemplo solo fueron 2) Venta 6 deberia tener folio 6 pero me da el folio 4 Pedidos con folios repetidos 3 y 4
Como digo al incio del bug, el problema esta al refrescar la pagina, se vuelven a cargar todos los datos incluyendo los campos importantes de pos.session: start_number, numero_ordenes(y los respectivos para boleta exenta), pero luego de refrescar esos campos, recien se envian los pedidos al servidor. Cuando se recarga la sesion estos campos tienen: start_number = 1 numero_ordenes = 3 hasta ahi es correcto xq no se han enviado los pedidos al server, luego de que se envien los pedidos al server, si revisamos la sesion va a tener start_number = 1 numero_ordenes = 5 Pero ya en JS se quedo el valor anterior, provocando que se repitan los folios.
Las posibles soluciones a esto seria: 1.- Enviar primero los pedidos al server y luego refrescar los datos de la sesion, pero revisando la traza de ejecucion es complicado xq odoo es quien controla el orden del codigo a ejecutar: Primero ejecuta la funcion load_server_data que se encarga de cargar todos los datos(clientes, productos, pos.config. pos.session, etc), luego que se termina de cargar todos los datos se llama a la funcion after_load_server_data que se encarga de enviar los pedidos que pudieran estar en cola. Esa secuencia es correcta pero no permite solucionar el problema mensionado aqui asi que la mejor solucion seria. 2.- Despues que odoo ejecute todo su codigo en el orden preestablecido, verificar si hay pedidos pendientes, luego que se envien dichos pedidos al server, volver a recargar los dos campos de la ssesion: start_number y numero_ordenes para que traigan los valores actualizados(haciendo una llamada rpc para leer esos dos campos de la sesion nuevamente).
Voy a crear un PR para solucionar este tema esperando que lo aceptes.