首页 > 解决方案 > ORM:发票。v10 中的 compute_taxes 的 v14 等价物是什么?

问题描述

什么是 V10 中的函数 compute_taxes() 的 V14 等效项,它在其他模块中用于计算创建的新发票的税金。谢谢。

 def compute_taxes(self):
        """Function used in other module to compute the taxes on a fresh invoice created (onchanges did not applied)"""
        account_invoice_tax = self.env['account.invoice.tax']
        ctx = dict(self._context)
        for invoice in self:
            # Delete non-manual tax lines
            self._cr.execute("DELETE FROM account_invoice_tax WHERE invoice_id=%s AND manual is False", (invoice.id,))
            if self._cr.rowcount:
                self.invalidate_cache()

            # Generate one tax line per tax, however many invoice lines it's applied to
            tax_grouped = invoice.get_taxes_values()

            # Create new tax lines
            for tax in tax_grouped.values():
                account_invoice_tax.create(tax)

        # dummy write on self to trigger recomputations
        return self.with_context(ctx).write({'invoice_line_ids': []})

标签: pythonodoo

解决方案


是的,我看到 v14 中的架构发生了“一点”变化(我刚刚比较了代码,但从未使用过 odoo)。

您现在正在寻找的是我相信 account_tax.py 文件中第 342 行的方法:

def compute_all(self, price_unit, currency=None, quantity=1.0, product=None, partner=None, is_refund=False, handle_price_include=True):
    """ Returns all information required to apply taxes (in self + their children in case of a tax group).
        We consider the sequence of the parent for group of taxes.
            Eg. considering letters as taxes and alphabetic order as sequence :
            [G, B([A, D, F]), E, C] will be computed as [A, D, F, C, E, G]

        'handle_price_include' is used when we need to ignore all tax included in price. If False, it means the
        amount passed to this method will be considered as the base of all computations.

    RETURN: {
        'total_excluded': 0.0,    # Total without taxes
        'total_included': 0.0,    # Total with taxes
        'total_void'    : 0.0,    # Total with those taxes, that don't have an account set
        'taxes': [{               # One dict for each tax in self and their children
            'id': int,
            'name': str,
            'amount': float,
            'sequence': int,
            'account_id': int,
            'refund_account_id': int,
            'analytic': boolean,
        }],
    } ..."""

...此方法返回如下内容:

return {
    'base_tags': taxes.mapped(is_refund and 'refund_repartition_line_ids' or 'invoice_repartition_line_ids').filtered(lambda x: x.repartition_type == 'base').mapped('tag_ids').ids,
    'taxes': taxes_vals,
    'total_excluded': sign * total_excluded,
    'total_included': sign * currency.round(total_included),
    'total_void': sign * currency.round(total_void),
}

所以我想如果你想实现一些自定义的东西,你需要改变这个方法。


推荐阅读