serviciosbaeza / serviciosbaeza-odoo-addons

Odoo addons from Serv. Tecn. Avanzados - Pedro M. Baeza
20 stars 41 forks source link

sale_recurring_orders in odoo 8 #10

Closed javierobcn closed 9 years ago

javierobcn commented 9 years ago

Hola Pedro

Me gustaría intentar migrar "sale_recurring_orders" a odoo 8 ¿lo ves factible e interesante? ¿alguna consideración?

En mi openerp 7 utilizo el módulo para generar pedidos periódicos, y me gustaría seguir haciendolo en odoo 8. He obtenido varios errores que he podido ir resolviendo tocando el código... basicamente algunos imports y algo relacionado con las fechas...

En este momento todo parece estar funcionando bien a nivel de interface, sin embargo parece que obtengo algún error cuando se ejecutan las tareas del cron, he visto estos errores en el log ¿se te ocurre que puede pasar?

2015-05-03 09:43:57,518 6202 ERROR bd_prod_migrated openerp.sql_db: bad query: INSERT INTO "sale_order_line" ("id", "product_uos_qty", "name", "product_uom", "sequence", "order_id", "price_unit", "product_uom_qty", "delay", "discount", "state", "invoiced", "th_weight", "product_uos", "product_packaging", "product_id", "create_uid", "write_uid", "create_date", "write_date") VALUES(nextval('sale_order_line_id_seq'), '1.000', 'HCloud WServer Mensual xxx.xxxxxxxx.com', 27, 10, 2670, '10.00', '1.000', 0.0, '0.00', 'draft', false, 0.0, NULL, NULL, 194, 1, 1, (now() at time zone 'UTC'), (now() at time zone 'UTC')) RETURNING id Traceback (most recent call last): File "/media/Datos/workspace_odoo/odoo_ri/openerp/sql_db.py", line 234, in execute res = self._obj.execute(query, params) TransactionRollbackError: could not serialize access due to concurrent update CONTEXT: SQL statement "SELECT 1 FROM ONLY "public"."res_users" x WHERE "id" OPERATOR(pg_catalog.=) $1 FOR KEY SHARE OF x"

2015-05-03 09:43:57,536 6202 ERROR bd_prod_migrated openerp.addons.base.ir.ir_cron: Call of self.pool.get('sale.recurring_orders.agreement').generate_next_year_ordersplanned(cr, uid, ()) failed in Job 12 Traceback (most recent call last): File "/media/Datos/workspace_odoo/odoo_ri/openerp/addons/base/ir/ir_cron.py", line 138, in _callback getattr(model, method_name)(cr, uid, args) File "/media/Datos/workspace_odoo/odoo_ri/openerp/api.py", line 241, in wrapper return old_api(self, args, _kwargs) File "/media/Datos/workspace_odoo/odoo_ri/addons/sale_recurring_orders/recurring_orders.py", line 363, in generate_next_year_orders_planned self.generate_next_year_orders(cr, uid, ids, context) File "/media/Datos/workspace_odoo/odoo_ri/openerp/api.py", line 241, in wrapper return old_api(self, _args, _kwargs) File "/media/Datos/workspace_odoo/odoo_ri/addons/sale_recurring_orders/recurring_orders.py", line 372, in generate_next_year_orders self.generate_agreement_orders(cr, uid, agreement, startDate, endDate, context) File "/media/Datos/workspace_odoo/odoo_ri/openerp/api.py", line 241, in wrapper return old_api(self, _args, _kwargs) File "/media/Datos/workspace_odoo/odoo_ri/addons/sale_recurring_orders/recurring_orders.py", line 321, in generate_agreement_orders order_id = self.create_order(cr, uid, agreement, date, lines_to_order[date], False, context=context) File "/media/Datos/workspace_odoo/odoo_ri/openerp/api.py", line 241, in wrapper return old_api(self, _args, _kwargs) File "/media/Datos/workspace_odoo/odoo_ri/addons/sale_recurring_orders/recurring_orders.py", line 245, in create_order order_line_obj.create(cr, uid, order_line, context=context) File "/media/Datos/workspace_odoo/odoo_ri/openerp/api.py", line 241, in wrapper return old_api(self, _args, _kwargs) File "/media/Datos/workspace_odoo/odoo_ri/addons/sale/sale.py", line 1059, in create return super(sale_order_line, self).create(cr, uid, values, context=context) File "/media/Datos/workspace_odoo/odoo_ri/openerp/api.py", line 241, in wrapper return old_api(self, _args, _kwargs) File "/media/Datos/workspace_odoo/odoo_ri/openerp/api.py", line 336, in old_api result = method(recs, _args, _kwargs) File "/media/Datos/workspace_odoo/odoo_ri/openerp/models.py", line 4059, in create record = self.browse(self._create(old_vals)) File "/media/Datos/workspace_odoo/odoo_ri/openerp/api.py", line 239, in wrapper return new_api(self, _args, _kwargs) File "/media/Datos/workspace_odoo/odoo_ri/openerp/api.py", line 462, in new_api result = method(self._model, cr, uid, _args, _kwargs) File "/media/Datos/workspace_odoo/odoo_ri/openerp/models.py", line 4197, in _create tuple([u[2] for u in updates if len(u) > 2]) File "/media/Datos/workspace_odoo/odoo_ri/openerp/sql_db.py", line 158, in wrapper return f(self, _args, _kwargs) File "/media/Datos/workspace_odoo/odoo_ri/openerp/sql_db.py", line 234, in execute res = self._obj.execute(query, params) TransactionRollbackError: could not serialize access due to concurrent update CONTEXT: SQL statement "SELECT 1 FROM ONLY "public"."res_users" x WHERE "id" OPERATOR(pg_catalog.=) $1 FOR KEY SHARE OF x"

Tras estos errores, la generación de pedidos se detiene y se me queda a medias...

pedrobaeza commented 9 years ago

Buenas, Javier, ese error es debido a que se está accediendo a la secuencia de manera concurrente entre dos sesiones. Puede ser que mientras se creaba un pedido, también se estuviera ejecutando el cron de generación de pedidos, y de ahí el error.

De todas formas, la migración del módulo no debería llevar ningún problema, ya que al ser compatible con la antigua API, no hay que cambiar prácticamente nada.

javierobcn commented 9 years ago

Hola Pedro, sigo intentando migrar "sale_recurring_orders" a odoo 8... parece que la "Próxima fecha de expiración" no se actualiza después de generar los pedidos. ¿alguna idea? por lo demás todo va bien, pero me preocupa eso...

pedrobaeza commented 9 years ago

Esa fecha se actualiza automáticamente en caso de plazo indefinido, o manualmente si se pone plazo fijo renovable.

javierobcn commented 9 years ago

Pedro, entiendo, tengo plazo indefinido en todos los contratos y no se actualiza... ¿alguna idea?

pedrobaeza commented 9 years ago

No, pero se actualizará cuando llegue el momento de caducar

javierobcn commented 9 years ago

El contrato caducó el 15/05/2015 y se confirmó automáticamente el pedido correspondiente a esa fecha pero sigue teniendo como "próxima fecha de expiración" 15/05/2015 ... no se ha actualizado....

pedrobaeza commented 9 years ago

Pero eso es en v7 o v8?

Éste es el código que calcula la próxima fecha de expiración: https://github.com/serviciosbaeza/serviciosbaeza-odoo-addons/blob/7.0/sale_recurring_orders/recurring_orders.py#L65

javierobcn commented 9 years ago

Es en V8... voy a intentar depurar ese código a ver si veo algo...

javierobcn commented 9 years ago

Hola Pedro

Cuando creo o edito un contrato y lo guardo si que actualiza la fecha de ultima expiracion correctamente pasando por la funcion __get_next_expiration_date y guardando en la BD el valor correcto.

Sin embargo cuando se ejecuta el trabajo programado "revise_agreements_expirations_planned" ,que entiendo que es el que debería actualizar esa fecha, este self.write en las lineas 200/201 no parece actualizar el campo en la base de datos. Si que pasa por ahí, calcula la fecha y hace el write pero no guarda. Ese "force recalculate next_expiration_date" no parece funcionar, quizá sea algo de odoo 8

¿se mantienen los campos field.function en odoo 8?, lo pregunto por que en la documentación se habla de campos de tipo computed. No se si puede ir por ahí y tendremos que migrar ese campo a computed.

pedrobaeza commented 9 years ago

La compatibilidad con la API antigua asegura el que fields.function funcione. Haz si no un PR para ver lo que has hecho de código.

javierobcn commented 9 years ago

Parece que lo he resuelto, he agregado un campo en el self.write, si no hay ningún campo en el write parece que no hace nada...

pedrobaeza commented 9 years ago

Javier, puedes proponer el módulo en v8?

javierobcn commented 9 years ago

Disculpa Pedro, ¿a que te refieres con "proponer"?

pedrobaeza commented 9 years ago

Me refería a hacer un PR para integrar tu módulo en la rama y que quede publicado.