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

Odoo11区分手动/自动操作 优化日记账过账校验方案咨询

Odoo v11 日记账分录手动过账校验优化方案

原有实现问题排查

  • 校验顺序错误:先调用父类post方法完成过账再做校验,即使校验失败也已经生成了已过账的分录,产生脏数据
  • 校验规则过松:仅依赖上下文is_manual参数判断是否为手动操作,API调用、后台定时任务等场景如果意外携带该上下文参数,会被误拦截,导致无法正常过账

优化后实现方案

1. XML配置部分(基本保留,确保仅目标菜单传递手动标记)

<!-- 仅给日记账分录菜单的动作添加手动标记 -->
<record id="account.action_move_journal_line" model="ir.actions.act_window">
    <field name="context">
          {'default_move_type': 'entry', 'search_default_misc_filter':1, 'view_no_maturity': True, 'is_manual': True}
    </field>
</record>

2. Python post方法重写优化

调整校验顺序,补充多重过滤条件,新增校验跳过开关兼容API场景:

@api.multi
def post(self):
    # 校验前置:过账前先执行规则校验
    current_user_id = self.env.user.id
    for rec in self:
        # 仅命中手动操作场景时触发校验
        # 判定逻辑:上下文有手动标记 + 未设置跳过校验标记 + 是杂项分录类型 + 无关联业务单据(非系统自动生成)
        if (
            self._context.get('is_manual')
            and not self._context.get('skip_manual_journal_check')
            and rec.move_type == 'entry'
            and not rec.invoice_id
            and not rec.payment_id
            and not rec.statement_line_id
            and rec.journal_id.requires_approval
        ):
            approval_user_ids = rec.journal_id.rule_id.user_ids.ids
            if current_user_id not in approval_user_ids:
                raise UserError(_("您没有权限过账该日记账下的分录!"))
    # 校验通过再执行父类过账逻辑
    res = super(AccountMove, self).post()
    return res

方案说明

  • 新增的skip_manual_journal_check上下文参数专为API、后台任务等非前端手动操作场景设计,调用过账接口时主动传入{'skip_manual_journal_check': True}即可绕过校验,不影响正常自动业务执行
  • 补充的move_type判断、关联业务单据判断,进一步过滤了系统自动生成的分录,彻底避免误拦截非手动录入的日记账分录
  • 校验前置避免了校验失败后产生脏数据的问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 16:39:04