Actualizando las cantidades recibidas en la ordenes de compra

2 de noviembre de 2023 por
Gustavo Orrillo
| Sin comentarios aún
 

Hay veces que los usuarios necesitan actualizar a mano las cantidades recibidas de las órdenes de compra (por diferentes motivos, todos relacionados con procedimientos no seguidos al pie de la letra). Para solucionar ese problema acabamos de desarrollar un módulo que le permite al usuario actualizar las cantidades recibidas. Los principios que utiliza este módulo se pueden utilizar no solo para los pedidos de compra sino tambien para los pedidos de venta, y para las cantidades facturadas también.

El módulo se llama purchase_line_qties y puede descargarse de nuestro repositorio. Luego de instalarse, se puede ver que en las líneas de las órdenes de compra confirmadas se muestra un botón llamado "Cambiar cantidades".


Al clickear en el botón, veremos un pop-up que nos pide la nueva cantidad


Al clickear confirmar veremos como la cantidad recibida paso a ser la cantidad indicada en el wizard.


Por último, se postea un mensaje en el chatter loggeando el cambio.


Notas técnicas

El módulo hace varias cosas que son buenas aprenderlas. La primera es como se extiende mediante xpath la línea de la orden de compra para agregar el botón

<xpath expr="//field[@name='order_line']/tree/field[@name='price_subtotal']" 
​position="after" >
<button name="btn_update_qties"
type="object"
states="purchase,done"
string="Change quantities" />
</xpath>

Luego al clickear en el botón, invocamos un wizard con la información de la línea clickeada

class PurchaseOrderLine(models.Model):
_inherit = 'purchase.order.line'

def btn_update_qties(self):
self.ensure_one()
if self.state not in ['done','purchase']:
raise ValidationError(_('Order line in incorrect state'))
vals = {
'line_id': self.id,
}
wizard_id = self.env['purchase.line.qties.wizard'].create(vals)
res = {
'name': _('Update line qties wizard'),
'res_model': 'purchase.line.qties.wizard',
'view_mode': 'form',
'res_id': wizard_id.id,
'type': 'ir.actions.act_window',
'target': 'new',
}
return res

Como pueden ver, se retorna una acción de ventana relacionada con el objeto de wizard que cambia las cantidades.

Por último, al confirmar el wizard, se actualiza mediante SQL las cantidades recibidas con la cantidad ingresada por el usuario.


def btn_confirm(self):
if self.new_qty_received < 0:
raise ValidationError(_('New quantity received has to be greater than 0'))
msg = 'Quantities for line %s changed from %s to %s'%(self.line_id.name,self.qty_received,self.new_qty_received)
sql_statement = "UPDATE PURCHASE_ORDER_LINE SET QTY_RECEIVED = %s WHERE ID = %s"%(self.new_qty_received,self.line_id.id)
self.env.cr.execute(sql_statement)
self.env.cr.commit()
self.order_id.message_post(body=msg)
Gustavo Orrillo 2 de noviembre de 2023
Compartir
Categorías
Archivar
Identificarse dejar un comentario