enter image description hereI got this error while trying to get my new added margin field computed in price_subtotal into customer invoice line (account.move.line) model . I already made override for both functions create() and _get_price_total_and_subtotal_model() and my Code as Follow :
any solutions for this issue ?
`
class AccountMoveLine(models.Model):
_inherit = 'account.move.line'
margin = fields.Float(string='Margin (%)', digits='Margin',default=0.0)
@api.model
def _get_price_total_and_subtotal_model(self, price_unit, quantity, discount, margin,
currency, product, partner, taxes, move_type):
''' This method is used to compute 'price_total' & 'price_subtotal'.
:param price_unit: The current price unit.
:param quantity: The current quantity.
:param discount: The current discount.
:param currency: The line's currency.
:param product: The line's product.
:param partner: The line's partner.
:param taxes: The applied taxes.
:param move_type: The type of the move.
:return: A dictionary containing 'price_subtotal' & 'price_total'.
'''
res = {}
# Compute 'price_subtotal'.
line_discount_price_unit = price_unit * (1 (margin / 100.0) - (discount / 100.0))
subtotal = quantity * line_discount_price_unit
# Compute 'price_total'.
if taxes:
taxes_res = taxes._origin.with_context(force_sign=1).
compute_all(line_discount_price_unit, quantity=quantity,currency=currency,
product=product, partner=partner,
is_refund=move_type in ('out_refund','in_refund'))
res['price_subtotal'] = taxes_res['total_excluded']
res['price_total'] = taxes_res['total_included']
else:
res['price_total'] = res['price_subtotal'] = subtotal
# In case of multi currency, round before it's use for computing debit credit
if currency:
res = {k: currency.round(v) for k, v in res.items()}
return res
@api.model_create_multi
def create(self, vals_list):
# OVERRIDE
lines = super(AccountMoveLine, self).create(vals_list)
ACCOUNTING_FIELDS = ('debit', 'credit', 'amount_currency')
BUSINESS_FIELDS = ('price_unit', 'quantity', 'margin', 'discount', 'tax_ids')
for vals in vals_list:
move = self.env['account.move'].browse(vals['move_id'])
vals.setdefault('company_currency_id',
move.company_id.currency_id.id) # important to bypass the ORM limitation where monetary fields are not rounded; more info in the commit message
# Ensure balance == amount_currency in case of missing currency or same currency as the one from the
# company.
currency_id = vals.get('currency_id') or move.company_id.currency_id.id
if currency_id == move.company_id.currency_id.id:
balance = vals.get('debit', 0.0) - vals.get('credit', 0.0)
vals.update({
'currency_id': currency_id,
'amount_currency': balance,
})
else:
vals['amount_currency'] = vals.get('amount_currency', 0.0)
if move.is_invoice(include_receipts=True):
currency = move.currency_id
partner = self.env['res.partner'].browse(vals.get('partner_id'))
taxes = self.new({'tax_ids': vals.get('tax_ids', [])}).tax_ids
tax_ids = set(taxes.ids)
taxes = self.env['account.tax'].browse(tax_ids)
# Ensure consistency between accounting & business fields.
# As we can't express such synchronization as computed fields without cycling, we need to do it both
# in onchange and in create/write. So, if something changed in accounting [resp. business] fields,
# business [resp. accounting] fields are recomputed.
if any(vals.get(field) for field in ACCOUNTING_FIELDS):
price_subtotal = self._get_price_total_and_subtotal_model(
vals.get('price_unit', 0.0),
vals.get('quantity', 0.0),
vals.get('discount', 0.0),
vals.get('margin', 0.0),
currency,
self.env['product.product'].browse(vals.get('product_id')),
partner,
taxes,
move.move_type,
).get('price_subtotal', 0.0)
vals.update(self._get_fields_onchange_balance_model(
vals.get('quantity', 0.0),
vals.get('discount', 0.0),
vals['amount_currency'],
move.move_type,
currency,
taxes,
price_subtotal
))
vals.update(sel`your text`f._get_price_total_and_subtotal_model(
vals.get('price_unit', 0.0),
vals.get('quantity', 0.0),
vals.get('discount', 0.0),
vals.get('margin', 0.0),
currency,
self.env['product.product'].browse(vals.get('product_id')),
partner,
taxes,
move.move_type,
))
elif any(vals.get(field) for field in BUSINESS_FIELDS):
vals.update(self._get_price_total_and_subtotal_model(
vals.get('price_unit', 0.0),
vals.get('quantity', 0.0),
vals.get('discount', 0.0),
vals.get('margin', 0.0),
currency,
self.env['product.product'].browse(vals.get('product_id')),
partner,
taxes,
move.move_type,
))
vals.update(self._get_fields_onchange_subtotal_model(
vals['price_subtotal'],
move.move_type,
currency,
move.company_id,
move.date,
))
moves = lines.mapped('move_id')
if self._context.get('check_move_validity', True):
moves._check_balanced()
moves.filtered(lambda m: m.state == 'posted')._check_fiscalyear_lock_date()
lines.filtered(lambda l: l.parent_state == 'posted')._check_tax_lock_date()
moves._synchronize_business_models({'line_ids'})
return lines
`
CodePudding user response:
When you override a method and change the signature by adding a new argument, this can be work if you called _get_price_total_and_subtotal_model
from the same class, but your overrided create
method calls the super
and the super will call _get_price_total_and_subtotal_model
in the same class so you get this error because the super class uses a different signature for that same method name.
CodePudding user response:
Odoo tries to call the _get_price_total_and_subtotal_model
function and pass 8 parameters but you redefined the function to use 9 parameters and move_type
is the last and missing parameter:
price_subtotal = self._get_price_total_and_subtotal_model(
vals.get('price_unit', 0.0),
vals.get('quantity', 0.0),
vals.get('discount', 0.0),
currency,
self.env['product.product'].browse(vals.get('product_id')),
partner,
taxes,
move.move_type,
).get('price_subtotal', 0.0)
by adding the margin
parameter just after discount
, you created a new function that is inconsistent with the default function used by Odoo and will return an unexpected result.
Also when Odoo triggers the _onchange_price_subtotal
function, it uses the parameter names and will raise the following error
TypeError: _get_price_total_and_subtotal_model() missing 1 required positional argument: 'margin'
To overload the function you can use optional parameters