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

