跳到主要内容

覆盖Doctype的方法

· 阅读需 6 分钟
Jurin Liyun

对于那些刚接触 ERPNext 的人来说,ERPNext 是由印度软件公司 Frappe Technologies Pvt.Ltd. 开发的一个 free and open-source 的集成企业资源规划Enterprise resource planning (ERP)软件[2][3] . 它基于 MariaDB 数据库系统,使用基于 Python 的服务器端框架[4] (source: wikipedia)

你可以在他们的网站上了解更多有关 ERPNext 的详情。在这篇文章中,我将试图让你了解Frappe已经提供给我们关于他们的 ERP 系统的定制。

首先,我想给出我的场景,为什么我的团队需要定制核心。

在我工作的一个组织中,他们需要定制的工作流程来验证一个包含多个用户角色的用户,并且在这个角色中,并不是所有的用户都能以相同的批准价值来批准,即使他们被分配了相同的角色。相反,在同一个角色中,管理员可以设置他们希望允许批准的多个授权规则。

在 ERPNext 中,有两种内置的方法可以实现这一点,即,

  1. Authorization Rule 授权规则

    授权文档类型只允许组织设置授权销售的角色和用户。

img

  1. 工作流程

在工作流中,我们只能指定文档流在用户创建时的行为,直到销售批准为止。*

img

状态

img

规则

img

规则细节。条件支持

对于许多组织来说,内置特性已经足够好了。但是,当涉及到解决某些企业组织的复杂问题时,它总是令我着迷。导致这些复杂性的原因之一,是我一直发现的管理政策的遗留问题。

我的委托人要求我的团队再做一次验证。系统应该能够满足包含角色的人员授权规则。在 ERPNext 中,我们有角色管理器,在每个角色中都包括许多人。让我为你简化一下。

  1. 3个用户帐户用户的角色
  2. 用户在 A 部门工作
  3. 但并非所有具有帐户用户角色的用户都可以以相同的值进行授权。可能是授权值为10,000美元的2个用户和1个用户 $4,000。

在上面的例子中,我们使用角色管理器进行了一些变通,它为不同的授权目的创建了许多不同的角色。这使得管理变得更加复杂。因此,在这种情况下,我们做另一种解决方案,仍然使用内置的,但添加另一层的授权,即“公司树”,它作为多级授权,只是为了解决组织问题。

看看我们怎么做。

img

公司Doctype

img

工作流程,文档类型,相关人员

现在让我们看看销售发票的主要文件。我们如何覆盖它并添加自定义验证。首先我们创建如下的文件目录

umserp
|_overrides
|_doctypes
|_sales_invoice.py
from __future__ import unicode_literals
import frappe
import erpnext
from umserp.core.foundations.reporting import render_report
from erpnext.accounts.doctype.sales_invoice.sales_invoice import SalesInvoice
from frappe import _
from frappe.utils import add_days, cint, cstr, flt, formatdate, get_link_to_form, getdate, nowdate, now
from umserp.core.utils.accounting import money_to_words_malay
from umserp.umserp.doctype.module_mapper.module_mapper import validate_financial_period
from umserp.umserp.doctype.company_tree.company_tree import validate_approving_tree_authority
from frappe.model.naming import make_autoname
from erpnext.accounts.utils import get_account_currency, get_fiscal_year
import json
from frappe.model.workflow import get_workflow,get_transitions
from frappe.query_builder import DocType
from frappe.workflow.doctype.workflow_action.workflow_action import get_doc_workflow_state
from frappe.model.workflow import get_workflow_name

# sales_invoice.py
class UMSSalesInvoice(SalesInvoice):
def _validate(self):
super(UMSSalesInvoice,self).validate()
self.convert_amount_into_words()

if self._action == "submit":
self._validate_financial_period() # this is another custom validation for financial period

self._validate_approving_tree_authority() # this is the validation

if self._validate_posting_date():
self.clear_payment_schedule()
self.update_posting_date()
self.set_payment_schedule()
super(UMSSalesInvoice,self).set_missing_values()

方法 self._validate_approving_tree_authority() 取自公司树 doctype。这个逻辑太长了,所以我不能在这个例子中包含它。

我们使这些代码适用于 ERPNext 的最后一部分是在 hook.py 中包含重写类。

override_doctype_class = {
"Sales Invoice": "umserp.overrides.doctype.sales_invoice.UMSSalesInvoice",
}

现在,系统会自动识别我们的代码作为首先要读取的主代码。

我在这里想说的是,ERPNext 是一个由 Frappe 框架授权的系统,可以很容易地定制,即使是一个公司可以拥有的复杂规则。当然,需求必须在一定程度上发生变化,但是如果一个框架具有这样的灵活性,那就太好了。

Happy reading. 阅读愉快。

备注: 感谢我伟大而热情的团队,使一切成为可能,而我永远不能做到没有他们。还要感谢 Frappe Team 制作了这样一个伟大的框架。