You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Odoo 9自定义模块自动添加印花税至发票失败求助

解决Odoo 9自动添加印花税到发票的问题

嘿,我来帮你排查这个印花税无法自动添加到发票的问题~ 先看了你的代码,发现几个关键问题,咱们一步步来修正:

1. 先修正res.company继承的类名(规范问题,避免混淆)

你代码里把继承res.company的类命名为res_partner,这虽然不影响功能,但非常容易误导,先改成正确的类名:

class res_company(osv.osv):
    _name = "res.company"
    _inherit = "res.company"
    _columns = {
        "default_stamp_tax_account": fields.many2one('account.account', "Stamp Tax Account"),
        "default_stamp_tax_value": fields.float('Stamp Tax Value'),
    }

2. 核心问题:company_id获取可能为空 + 税行字段不匹配

在account_invoice的create方法里,你直接用values.get('company_id'),但创建发票时这个值可能不存在(比如依赖系统默认值填充),导致无法读取公司的印花税设置。另外,税行的字段名也和Odoo 9的实际字段不匹配,比如base_amount应该是base,tax_amount字段并不存在。

修正后的account_invoice类代码:

from openerp import tools, osv
from openerp.osv import fields
import logging

_logger = logging.getLogger(__name__)

class account_invoice(osv.osv):
    _name = "account.invoice"
    _inherit = "account.invoice"
    
    def create(self, cr, uid, values, context=None):
        # 获取公司ID:优先取values里的,没有则取当前用户的默认公司
        company_id = values.get('company_id')
        if not company_id:
            company_id = self.pool.get('res.users').browse(cr, uid, uid, context=context).company_id.id
        
        # 读取公司的印花税设置
        company = self.pool.get('res.company').browse(cr, uid, company_id, context=context)
        stamp_account = company.default_stamp_tax_account.id
        tax_value = company.default_stamp_tax_value
        
        _logger.info("读取到的印花税设置:科目ID=%s,税额=%s", stamp_account, tax_value)
        
        # 只有当科目和税额都有效时才添加税行
        if stamp_account and tax_value > 0:
            # 保留原有的税行(如果有的话),避免覆盖用户已添加的税
            existing_tax_lines = values.get('tax_line', [])
            # 构建符合Odoo 9规范的印花税行
            stamp_tax_line = [
                0, False, 
                {
                    'base': 0.0,  # 印花税是固定额,计税基数设为0
                    'amount': tax_value,
                    'name': 'Timbre',
                    'account_id': stamp_account,
                    'sequence': 999,  # 设置排序,让印花税行显示在最后
                    'manual': True  # 标记为手动添加,避免后续自动计算覆盖
                }
            ]
            existing_tax_lines.append(stamp_tax_line)
            values.update({'tax_line': existing_tax_lines})
            _logger.info("已为发票添加印花税行:%s", stamp_tax_line)
        
        # 调用父类的create方法创建发票
        return super(account_invoice, self).create(cr, uid, values, context)

3. 额外注意事项

  • 权限检查:确保当前用户有读取res.company和account.account的权限,否则无法获取印花税设置。
  • 测试验证:先在公司设置页面确认已正确填写Stamp Tax Account和Stamp Tax Value,再创建新发票测试。
  • 发票类型适配:如果只需要给特定类型的发票(如客户发票)添加印花税,可以增加判断逻辑:
    invoice_type = values.get('type')
    if invoice_type in ['out_invoice', 'out_refund']:  # 仅针对客户发票/退款
        # 这里添加印花税行逻辑
    

内容的提问来源于stack exchange,提问作者Dhouha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:49:03