对于那些刚接触 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 中,有两种内置的方法可以实现这一点,即,
Authorization Rule 授权规则
授权文档类型只允许组织设置授权销售的角色和用户。
- 工作流程
在工作流中,我们只能指定文档流在用户创建时的行为,直到销售批准为止。*
状态
规则
规则细节。条件支持
对于许多组织来说,内置特性已经足够好了。但是,当涉及到解决某些企业组织的复杂问题时,它总是令我着迷。导致这些复杂性的原因之一,是我一直发现的管理政策的遗留问题。
我的委托人要求我的团队再做一次验证。系统应该能够满足包含角色的人员授权规则。在 ERPNext 中,我们有角色管理器,在每个角色中都包括许多人。让我为你简化一下。
- 3个用户帐户用户的角色
- 用户在 A 部门工作
- 但并非所有具有帐户用户角色的用户都可以以相同的值进行授权。可能是授权值为10,000美元的2个用户和1个用户 $4,000。
在上面的例子中,我们使用角色管理器进行了一些变通,它为不同的授权目的创建了许多不同的角色。这使得管理变得更加复杂。因此,在这种情况下,我们做另一种解决方案,仍然使用内置的,但添加另一层的授权,即“公司树”,它作为多级授权,只是为了解决组织问题。
看看我们怎么做。
公司Doctype
工作流程,文档类型,相关人员
现在让我们看看销售发票的主要文件。我们如何覆盖它并添加自定义验证。首先我们创建如下的文件目录
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 制作了这样一个伟大的框架。