I have changed the way of computing price_subtotal in sale order line
price_subtotal = number of members * price unit
I tried to override the method that compute the following:
amount_total, amount_untaxed, amount_to_invoice and amount_untaxed_to_invoice But no change
Here is my code:
class SaleOrderLine(models.Model): _inherit = 'sale.order.line'
num_members = fields.Integer(string="Number of Members", default=1) price_subtotal = fields.Monetary( string="Subtotal", compute='_compute_amount', store=True, precompute=True) @api.depends('num_members', 'price_unit') def _compute_amount(self): for line in self: line.price_subtotal = line.num_members * line.price_unit line.price_tax = 0 line.price_total = line.price_subtotal
def _prepare_invoice_line(self, **optional_vals): res = super(SaleOrderLine, self)._prepare_invoice_line(**optional_vals) res['num_members'] = self.num_members
return res
@api.depends('state', 'product_id', 'untaxed_amount_invoiced', 'qty_delivered', 'num_members', 'price_unit') def _compute_untaxed_amount_to_invoice(self): """ Total of remaining amount to invoice on the sale order line (taxes excl.) as total_sol - amount already invoiced where Total_sol depends on the invoice policy of the product.
Note: Draft invoice are ignored on purpose, the 'to invoice' amount should come only from the SO lines. """ for line in self: amount_to_invoice = 0.0 if line.state == 'sale': # Note: do not use price_subtotal field as it returns zero when the ordered quantity is # zero. It causes problem for expense line (e.i.: ordered qty = 0, deli qty = 4, # price_unit = 20 ; subtotal is zero), but when you can invoice the line, you see an # amount and not zero. Since we compute untaxed amount, we can use directly the price # reduce (to include discount) without using `compute_all()` method on taxes. price_subtotal = 0.0 uom_qty_to_consider = line.qty_delivered if line.product_id.invoice_policy == 'delivery' else line.num_members price_reduce = line.price_unit * (1 - (line.discount or 0.0) / 100.0) price_subtotal = price_reduce * uom_qty_to_consider if len(line.tax_id.filtered(lambda tax: tax.price_include)) > 0: # As included taxes are not excluded from the computed subtotal, `compute_all()` method # has to be called to retrieve the subtotal without them. # `price_reduce_taxexcl` cannot be used as it is computed from `price_subtotal` field. (see upper Note) price_subtotal = line.tax_id.compute_all( price_reduce, currency=line.currency_id, quantity=uom_qty_to_consider, product=line.product_id, partner=line.order_id.partner_shipping_id)['total_excluded'] inv_lines = line._get_invoice_lines() if any(inv_lines.mapped(lambda l: l.discount != line.discount)): # In case of re-invoicing with different discount we try to calculate manually the # remaining amount to invoice amount = 0 for l in inv_lines: if len(l.tax_ids.filtered(lambda tax: tax.price_include)) > 0: amount += l.tax_ids.compute_all(l.currency_id._convert(l.price_unit, line.currency_id, line.company_id, l.date or fields.Date.today(), round=False) * l.quantity)['total_excluded'] else: amount += l.currency_id._convert(l.price_unit, line.currency_id, line.company_id, l.date or fields.Date.today(), round=False) * l.quantity
amount_to_invoice = max(price_subtotal - amount, 0) else: amount_to_invoice = price_subtotal - line.untaxed_amount_invoiced
line.untaxed_amount_to_invoice = amount_to_invoice print('YYYYYYYYYYYYYYYYYYYYYYYYY') print('_compute_untaxed_amount_to_invoice', line.untaxed_amount_to_invoice)
class SaleOrder(models.Model): _inherit = 'sale.order'
amount_untaxed = fields.Monetary(string="Untaxed Amount", store=True, compute='_compute_amounts', tracking=5) amount_total = fields.Monetary(string="Total", store=True, compute='_compute_amounts', tracking=4) amount_to_invoice = fields.Monetary(string="Amount to invoice", store=True, compute='_compute_amount_to_invoice')
@api.onchange('order_line.price_subtotal') @api.depends('order_line.price_subtotal', 'order_line.price_tax', 'order_line.price_total') def _compute_amounts(self): # super(SaleOrder, self)._compute_amounts() for order in self: amount_untaxed = 0 for line in order.order_line: amount_untaxed += line.price_subtotal order.amount_tax = 0 order.amount_untaxed = amount_untaxed order.amount_total = amount_untaxed print('TTTTTTTTTTTTTTTTTTTTTTTTTTGGGGGGGGGGGG') print('amount_total', order.amount_total)
#@api.depends('invoice_ids.state', 'currency_id', 'amount_total') @api.depends('amount_total') def _compute_amount_to_invoice(self): for order in self: order.amount_to_invoice = 99999 print('FFFFFFFFFFFFFEEEEEEEEEEEEEEEEE') print("amount_to_invoice", order.amount_to_invoice) ''' # If the invoice status is 'Fully Invoiced' force the amount to invoice to equal zero and return early. if order.invoice_status == 'invoiced': order.amount_to_invoice = 0.0 continue
invoices = order.invoice_ids.filtered(lambda x: x.state == 'posted') # Note: A negative amount can happen, since we can invoice more than the sales order amount. # Care has to be taken when summing amount_to_invoice of multiple orders. # E.g. consider one invoiced order with -100 and one uninvoiced order of 100: 100 + -100 = 0 order.amount_to_invoice = order.amount_total - invoices._get_sale_order_invoiced_amount(order)
'''
class AccountMoveLine(models.Model): _inherit = 'account.move.line'
num_members = fields.Integer(string="Number of Members", default=1, store=True, compute='_compute_num_members_from_sale_order') price_subtotal = fields.Monetary(string='Subtotal', store=True, compute='_compute_price_subtotal')
@api.depends('move_id', 'move_id.invoice_line_ids') def _compute_num_members_from_sale_order(self): for line in self: sale_order_line = line.sale_line_ids if sale_order_line: line.num_members = sale_order_line.num_members else: line.num_members = 1 print('MEEEEEEEEEEEEMMMMMMMMMMMMM')
@api.depends('num_members', 'price_unit', 'discount') def _compute_price_subtotal(self): for line in self: print('PPPPPPPPRRRRRRRRRRRRRRIIIIICCCCCCCCCCEEEEEEEEEEEE') print('num_members:', line.num_members) price = line.num_members * line.price_unit line.price_subtotal = line.move_id.currency_id.round(price) #line.write({'price_subtotal': line.move_id.currency_id.round(price)}) print('FFFFFFFFFFFFGGGGGGGGGGGGGGGGG')
Could you add your full code here