dev/lampone#30-Vincular-las-nuevas-columnas-Area-y-Maquina-a-las-órdenes-de-compra
Motivos por los cuales se refactorizo, el siguiente codigo es como estaba antes (previo incluso a la incorporacion pedida por el ticket).
def create_purchase_order(self, selected_ids):
selected_records = self.env['purchase.internal.order.line'].browse(selected_ids)
purchase_order = self.env['purchase.order'].create({})
PRIMER ERROR: crear el registro antes de chequear las restricciones, entonces si no se realizan las operaciones de todas formas el registro ya creado quedaria dando vueltas en la base de datos y ocupando espacio.
for rec in selected_records:
if rec.status == 'purchase_order':
raise UserError("Una de las lineas que está intentando agregar ya se encuentra asociada a una Orden de compra existente")
PRIMER MEJORA: no se listan los registros que no cumplen las condiciones
for rec in selected_records:
if rec.purchase_internal_order_id.state == 'posted':
vals = {
'product_id': rec.product_id.id,
'name' : rec.product_id.name,
'price_unit' : rec.product_id.price,
'product_qty': rec.quantity,
'product_uom_qty': 0,
'product_uom': rec.uom_id.id,
'order_id': purchase_order.id,
SEGUNDA MEJORA: al enlazar la linea creada al pedido de compra de esta manera no se entiende el procedimiento. siguiendo la documentacion hecha en la wiki https://wiki.coodesoft.com.ar/books/documentaci%C3%B3n-t%C3%A9cnica/page/one-2-many-odoo vemos que hay dos maneras de enlazar dos registros, pero enlazarlo diciendo que la linea esta enlazada a la compra no se termina de entender porque estamos creando una compra y enlazando sus lineas tal y como esta es crear una linea y enlazarla a una compra cual es al revez de como deberia. 'date_planned': datetime.today().date(), 'petitioner' : rec.purchase_internal_order_id.petitioner, 'internal_order': rec.purchase_internal_order_id.name } SEGUNDO ERROR:
-
se sigue chequeando un error posterior a la creacion del registro, ademas de cambiarse sus valores en la base de datos asique no se podria hacer un rollback si algo falla.
-
se crean mas registros en la base de datos que no llegaran a usarse nunca o quedaran a medias sin nisiquiera enlazarse al pedido de compra si se levanta un error
self.env['purchase.order.line'].create(vals)
TERCER ERROR: no deberiamos crear lineas y enlazarlas a la orden de compra ya que perderiamos las restricciones que podria proponer el funcionamiento sea creador,init o demas metodos del pedido de compra. en cambio deberiamos pasarle la informacion al creador de pedido de compra para que este genere los registros se respete el flujo de su creacion con sus restricciones o demas pasos que haga. esto esta solucionado en el commit usar comandos y crear una lista con las instruccions de creacion de estos nuevas lineas asi ya el creador de orden de compra las ejecuta y mientras tanto no se crean registros en la base de datos rec.write({
'status' : 'purchase_order',
'order_id' : purchase_order.id
})
TERCERA MEJORA: no es necesario hacer varios llamados al write (uno por cada registro) se podria hacer un llamado solo desde el recordset (la variable selected_records) else: raise UserError("Se está intentando agregar una linea de la orden interna " + rec.purchase_internal_order_id.name + " que tiene estado Borrador") return { 'type': 'ir.actions.act_window', 'res_model': 'purchase.order', 'views': [(False, 'form'), (False, 'tree')], 'name': 'Nueva Orden de Compra', 'res_id': purchase_order.id, }
Por ultimo se cambiaron los nombres de variables y parametros para que respete algunos estandares de odoo (no son veredicto final, depende del standar y el codigo de referencia que se tome).