1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
from odoo import fields, models, api
from odoo.tools import DEFAULT_SERVER_DATETIME_FORMAT
class PurchaseOrderLine(models.Model):
_inherit = 'purchase.order.line'
sales_price = fields.Float(
'Sales Price', compute='compute_item_margin',
help="Sales Price in Purchase Order Line")
item_margin = fields.Float(
'Total Margin', compute='compute_item_margin',
help="Total Margin in Purchase Order Line")
item_percent_margin = fields.Float(
'Total Percent Margin', compute='compute_item_margin',
help="Total % Margin in Purchase Order Line")
# Override method from addons/purchase/models/purchase.py
@api.onchange('product_qty', 'product_uom')
def _onchange_quantity(self):
res = super(PurchaseOrderLine, self)._onchange_quantity()
# Custom script
purchase_pricelist = self.env['purchase.pricelist'].search([
('product_id', '=', self.product_id.id),
('vendor_id', '=', self.partner_id.id)
], limit=1)
price_unit = purchase_pricelist.product_price
if not price_unit:
product_supplierinfo = self.env['product.supplierinfo'].search([
('product_tmpl_id', '=', self.product_id.product_tmpl_id.id),
('name', '=', self.partner_id.id)
], limit=1)
price_unit = product_supplierinfo.price
self.price_unit = price_unit
return res
def compute_item_margin(self):
for line in self:
if not line.product_id or line.price_unit <= 0 or line.product_uom_qty <= 0 or line.product_id.type == 'service' or not line.order_id.sale_order_id.id:
line.item_margin = 0
line.item_percent_margin = 0
continue
sale_order_line = self.env['sale.order.line'].search(
[('product_id', '=', line.product_id.id),
('order_id', '=', line.order_id.sale_order_id.id)], limit=1, order='price_reduce_taxexcl')
# untaxed sales price
sales_price = sale_order_line.price_reduce_taxexcl * sale_order_line.product_uom_qty
# must add expedition price in sales_price, expedition payed by customer?
# sales_price -= round((line.order_id.sale_order_id.delivery_amount / line.order_id.sale_order_id.count_line_product), 2)
# untaxed purchase price
purchase_price = line.price_subtotal
# must add expedition price in purchase_price as expenses
purchase_price += round((line.order_id.delivery_amount / line.order_id.count_line_product), 2)
margin_per_item = sales_price - purchase_price
line.item_margin = margin_per_item
if sales_price > 0:
line.item_percent_margin = round((margin_per_item / sales_price), 2) * 100
|