Hi,
A better way is to add a new field called “Net Price” on the sales order line. With this field, the salesperson just types the final price they want to sell at (e.g., 4500). Odoo will then automatically calculate the correct discount percentage in the background and apply it. That way:
The salesperson works directly with the real selling price they agreed on.
Odoo still shows the discount percentage and the strikethrough list price on the quotation, so the customer sees the discount clearly.
Try with the following code,
Python
class SaleOrderLine(models.Model):
_inherit = "sale.order.line"
net_price = fields.Float(
string="Net Price",
help="Final selling price entered directly by the salesperson."
)
@api.onchange('net_price')
def _onchange_net_price(self):
for line in self:
if line.net_price and line.price_unit:
# Calculate discount %
discount = (1 - (line.net_price / line.price_unit)) * 100
line.discount = max(discount, 0.0)
XML
<record id="view_order_form_net_price" model="ir.ui.view">
<field name="name">sale.order.form.net.price</field>
<field name="model">sale.order</field>
<field name="inherit_id" ref="sale.view_order_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='order_line']/tree/field[@name='discount']" position="after">
<field name="net_price"/>
</xpath>
<xpath expr="//field[@name='order_line']/form/field[@name='discount']" position="after">
<field name="net_price"/>
</xpath>
</field>
</record>
Hope it helps