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
相关产品推荐
相关产品推荐

