Agregando descuentos globales en los pedidos de venta

21 de agosto de 2023 por
Gustavo Orrillo
| Sin comentarios aún
 

Odoo soporta agregar descuentos a las líneas de los pedidos de venta, pedidos de compra y facturas. Lo cual esta más que bien hasta que el usuario tiene que aplicar descuentos sobre decenas de líneas, en ese caso te piden que hagas algo al respecto. No solo por la incomodidad que le genera al usuario, sino también por la posibilidad de que se cometan errores en el ingreso de los datos.

OCA brinda una serie de módulos bastante completos para definir políticas de descuentos y aplicar descuentos globales, pero honestamente me parece que era demasiada funcionalidad. Es por eso que decidimos desarrollar nuestro propio módulo (llamado sale_order_discount) y agregarle la posibilidad de consultar los descuentos otorgados en USD (algo que le va a interesar a más de un dueño de la muy golpeada pyme argentina)

El módulo agrega un botón al pedido de venta para que el usuario le agregue un descuento global


Y al confirmarse el descuento, el mismo se aplica línea a línea del pedido de ventas (así el usuario puede modificar para algunas líneas el monto del descuento)

Luego al confirmarse el pedido, el módulo computa el monto en dolares otorgado por los descuentos, el cual se puede apreciar en el pedido de ventas


O en el nuevo menú de Descuentos Otorgados


En el menú de descuentos otorgados se puede consultar ya sea mediante la vista tipo lista o tipo pivot por cliente, el monto en USD de los descuentos otorgados.

Notas técnicas

Este módulo hace dos cosas. Por una parte invoca un wizard desde un formulario. Para ello al clickearse en el botón de "Agregar descuentos" se invoca un método que retorna una acción relacionada con el wizard que deseamos desplegar

def btn_add_discount(self):
self.ensure_one()
if self.state not in ['draft','sent']:
raise ValidationError(_('Pedido en estado incorrecto'))
vals = {
'order_id': self.id,
}
wizard_id = self.env['sale.order.discount.wizard'].create(vals)
return {
'name': _('Add Discount'),
'res_model': 'sale.order.discount.wizard',
'view_mode': 'form',
'res_id': wizard_id.id,
'type': 'ir.actions.act_window',
'target': 'new',
}

Por otra parte extendemos el modelo sale.order.line, le agregamos un nuevo campo llamado discount_amt_usd y lo actualizamos al confirmar el pedido. Para ello extendemos el método action_confirm del modelo sale.order

def action_confirm(self):
res = super(SaleOrder, self).action_confirm()
for rec in self:
for order_line in rec.order_line.filtered(lambda l: l.discount != 0):
amt_discount = order_line.price_unit * order_line.product_uom_qty * order_line.discount / 100
order_line.discount_amt_usd = order_line.currency_id._convert(
amt_discount,
self.env.ref('base.USD'),
order_line.company_id,
order_line.order_id.date_order,
)
return res

Aquí para cada línea que tenga un descuento, se le actualiza el monto en dolares del descuento.

Por último agregamos un menú para que el usuario pueda consultar el monto de los descuentos y realizar una vista pivot sobre los mismos

    <record id="view_sale_order_line_discount_tree" model="ir.ui.view">
<field name="name">sale.order.line.discount.tree</field>
<field name="model">sale.order.line</field>
<field name="arch" type="xml">
<tree edit="0" create="0" delete="0">
<field name="order_id" />
<field name="order_partner_id" />
<field name="product_id" />
<field name="create_date" />
<field name="discount" />
<field name="discount_amt_usd" />
</tree>
</field>
</record>

<record model="ir.actions.act_window" id="action_sale_order_line_discount">
<field name="name">Descuentos Otorgados</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">sale.order.line</field>
<field name="view_mode">tree,form,pivot</field>
</record>

<menuitem
id="menu_sale_order_line_import"
name="Descuentos Otorgados"
action="action_sale_order_line_discount"
parent="sale.sale_order_menu"
sequence="200"
/>
Gustavo Orrillo 21 de agosto de 2023
Compartir
Archivar
Identificarse dejar un comentario