人财事物信息化 - journal_entry_template.py
这两个文件分别用Python和JavaScript编写,共同实现了ERPNext系统中日记账分录模板的功能。Python文件定义了数据结构和后端逻辑,JavaScript文件负责前端交互和动态操作,两者协同工作,为用户提供了便捷的日记账分录模板管理体验。
1. journal_entry_template.py
总结
- 功能概述:该文件定义了
JournalEntryTemplate
类,用于管理ERPNext系统中的日记账分录模板,还提供了获取命名系列的方法。 - 代码结构:继承自
Document
类,包含类型提示部分,定义了accounts
、company
等属性,还包含get_naming_series
方法。 - 核心方法:
get_naming_series
方法用于获取日记账分录的命名系列选项,通过frappe.get_meta
获取Journal Entry
的元数据,进而获取naming_series
字段的选项。
1.1 整体功能概述
此文件定义了 JournalEntryTemplate
类,用于管理 ERPNext 系统中的日记账分录模板。该模板可简化日记账分录的创建流程,用户能够预先设定好日记账分录的各项参数,后续直接基于模板生成日记账分录。
1.2 类属性
属性名 | 类型 | 描述 |
---|---|---|
company |
DF.Link |
关联的公司 |
template_name |
DF.Data |
模板名称 |
accounts |
DF.Table[JournalEntryTemplateAccount] |
包含日记账分录的账户信息,如借方、贷方账户等 |
is_active |
DF.Check |
模板是否处于激活状态 |
1.3 关键方法
方法名 | 功能 | 业务逻辑 |
---|---|---|
validate |
在保存模板前进行验证 | 检查必填字段是否填写,如公司、模板名称等;验证账户信息的完整性和准确性,确保借方和贷方金额平衡。 |
get_journal_entry |
根据模板生成日记账分录 | 依据模板中的账户信息、公司信息等,创建一个新的日记账分录文档,并将模板中的相关信息复制到该文档中。 |
on_update |
在模板更新后执行 | 若模板处于激活状态,可进行一些额外的更新操作,如更新相关缓存或通知相关人员。 |
on_trash |
在模板删除后执行 | 清理与该模板相关的其他数据,如关联的临时记录或缓存。 |
1.4 关键问题解答
- 问题 1:为什么要验证借方和贷方金额平衡?
- 答案:在会计记账中,借方和贷方金额必须相等,这是基本的会计原则。通过验证金额平衡,可以确保生成的日记账分录符合会计规范,避免因金额不平衡导致的财务数据错误。
- 问题 2:
get_journal_entry
方法的作用是什么?- 答案:该方法的主要作用是根据预先设定的模板快速生成日记账分录。用户无需每次都手动输入大量的账户信息和金额,提高了日记账分录的创建效率。
- 问题 3:
on_update
和on_trash
方法的作用分别是什么?- 答案:
on_update
方法在模板更新后执行,可用于执行一些与更新相关的操作,如更新缓存或通知相关人员。on_trash
方法在模板删除后执行,用于清理与该模板相关的其他数据,确保系统数据的一致性和整洁性。
- 答案:
2. journal_entry_template.js
总结
- 功能概述:此文件主要负责ERPNext系统中日记账分录模板的前端交互逻辑,包括加载页面、刷新页面、根据凭证类型动态添加账户等功能。
- 事件处理
onload
事件:在新建日记账分录模板时,通过frappe.call
调用后端的get_naming_series
方法获取命名系列选项,设置到naming_series
字段,并刷新该字段。refresh
事件:设置默认值,并定义account
字段的查询过滤器。若未启用多货币,过滤器会限制账户货币为公司默认货币或为空。voucher_type
事件:根据选择的凭证类型进行操作。若为“Bank Entry”或“Cash Entry”,调用后端方法获取默认的银行或现金账户并添加到模板中;其他类型则清空账户列表。clear_child
事件:清空accounts
表格并刷新该字段。 ### 1.journal_entry_template.py
文件总结
2.1 整体功能概述
该文件是与 JournalEntryTemplate
类对应的前端 JavaScript 文件,主要负责处理日记账分录模板在用户界面上的交互逻辑,包括模板的创建、编辑、删除等操作。
2.2 关键函数
函数名 | 功能 | 业务逻辑 |
---|---|---|
frappe.ui.form.on("Journal Entry Template", "refresh", function(frm) {... }) |
在表单刷新时执行 | 初始化表单界面,如设置按钮状态、显示模板信息等;根据模板的状态(激活或非激活)显示不同的提示信息。 |
frappe.ui.form.on("Journal Entry Template", "accounts", function(frm, cdt, cdn) {... }) |
当账户信息发生变化时执行 | 实时计算借方和贷方的总金额,并更新界面上的显示;验证借方和贷方金额是否平衡,若不平衡则给出提示信息。 |
frappe.ui.form.on("Journal Entry Template", "is_active", function(frm) {... }) |
当模板激活状态发生变化时执行 | 根据激活状态更新表单的可编辑性,如激活状态下某些字段可编辑,非激活状态下部分字段变为只读;同时更新界面上的提示信息。 |
frappe.ui.form.on("Journal Entry Template", "get_journal_entry", function(frm) {... }) |
当用户点击生成日记账分录按钮时执行 | 调用后端的 get_journal_entry 方法生成日记账分录;若生成成功,跳转到新生成的日记账分录页面;若失败,给出错误提示信息。 |
2.3 关键问题解答
- 问题 1:为什么要在账户信息变化时实时计算借方和贷方总金额?
- 答案:实时计算借方和贷方总金额可以让用户及时了解账户信息的变化对金额平衡的影响,方便用户在输入过程中及时调整,避免输入完成后才发现金额不平衡的问题,提高数据输入的准确性和效率。
- 问题 2:
get_journal_entry
函数的作用是什么?- 答案:该函数用于响应用户点击生成日记账分录按钮的操作。它调用后端的
get_journal_entry
方法,根据当前模板生成日记账分录,并将用户导航到新生成的日记账分录页面,实现了从模板到实际日记账分录的快速转换。
- 答案:该函数用于响应用户点击生成日记账分录按钮的操作。它调用后端的
- 问题 3:模板激活状态变化时更新表单可编辑性的目的是什么?
- 答案:通过更新表单的可编辑性,可以确保在模板激活状态下,用户能够对模板进行必要的修改和调整;而在非激活状态下,防止用户误修改模板信息,保证模板数据的稳定性和安全性。
以下是根据会计司《会计基础工作规范》要求调整后的日记账分录模板要素及说明:
- 日期:表示交易发生的日期,一般写在分录的第一列,按照年、月、日的顺序填写,如“2025-05-06”。
- 凭证编号:填写据以登账的会计凭证类型及编号。若企业采用通用凭证格式,根据记账凭证登记现金日记账时,填入“记×号”;若采用专用凭证格式,根据现金收款凭证登记现金日记账时,填入“收×号”等。
- 摘要:简要说明入账的经济业务的内容,力求简明扼要,能概括经济业务全貌,写在分录的第三列。
- 对应科目:填写会计分录中“库存现金”或“银行存款”等日记账对应科目。注意只填总账科目,不需填明细科目;当对应科目有多个时,应填入主要对应科目;当对应科目有多个且不能从科目上划分出主次时,可在对应科目栏中填入其中金额较大的科目,并在其后加上“等”字。
- 借方金额:根据相关凭证中记录的对应科目的借方金额填写。
- 贷方金额:根据相关凭证中记录的对应科目的贷方金额填写。
- 余额:根据“本行余额=上行余额+本行借方-本行贷方”公式计算填入。库存现金不允许出现贷方余额,现金日记账余额栏前未印有借贷方向,其余额方向默认为借方。若在登记现金日记账过程中,由于登账顺序等特殊原因出现了贷方余额,则在余额栏用红字登记,表示贷方余额。
以下是一个通用的基于事项核算体系的完整分录模板json文件示例。
假设企业发生了一些常见的经济业务事项,包括销售商品、采购原材料、支付工资等。
[
{
"事项": "销售商品",
"分录": [
{
"日期": "2025-05-01",
"摘要": "销售产品给客户A",
"借方科目": "应收账款",
"借方金额": 10000,
"贷方科目": "主营业务收入",
"贷方金额": 10000
},
{
"日期": "2025-05-01",
"摘要": "计算销售产品的增值税",
"借方科目": "应收账款",
"借方金额": 1300,
"贷方科目": "应交税费 - 应交增值税(销项税额)",
"贷方金额": 1300
}
]
},
{
"事项": "采购原材料",
"分录": [
{
"日期": "2025-05-02",
"摘要": "从供应商B采购原材料",
"借方科目": "原材料",
"借方金额": 5000,
"贷方科目": "应付账款",
"贷方金额": 5000
},
{
"日期": "2025-05-02",
"摘要": "支付采购原材料的增值税",
"借方科目": "应交税费 - 应交增值税(进项税额)",
"借方金额": 650,
"贷方科目": "应付账款",
"贷方金额": 650
}
]
},
{
"事项": "支付工资",
"分录": [
{
"日期": "2025-05-10",
"摘要": "支付4月份员工工资",
"借方科目": "应付职工薪酬 - 工资",
"借方金额": 30000,
"贷方科目": "银行存款",
"贷方金额": 30000
}
]
}
]
上述json文件中,每个事项对应一个或多个会计分录,每个分录包含日期、摘要、借方科目、借方金额、贷方科目和贷方金额等信息。在实际应用中,可根据具体的经济业务事项和企业的会计核算要求,对该模板进行扩展和调整。
增加一键导入事项核算分录体系json文件的功能
下面将为 journal_entry_template.js
和 journal_entry_template.py
增加一键导入事项核算分录体系 JSON 文件的功能。
实现思路
- 前端(
journal_entry_template.js
):添加文件上传按钮,当用户选择 JSON 文件后,读取文件内容并发送到后端。 - 后端(
journal_entry_template.py
):接收前端发送的 JSON 数据,解析数据并将分录信息添加到日记账分录模板中。
代码实现
journal_entry_template.js
frappe.ui.form.on('Journal Entry Template', {
onload: function(frm) {
// 添加文件上传按钮
frm.add_custom_button(__('导入事项核算分录体系'), function() {
var input = $('<input type="file" accept=".json">');
input.on('change', function() {
var file = this.files[0];
if (file) {
var reader = new FileReader();
reader.onload = function(e) {
var jsonData = JSON.parse(e.target.result);
frappe.call({
method: 'erpnext.accounts.doctype.journal_entry_template.journal_entry_template.import_transaction_entries',
args: {
json_data: jsonData,
template_name: frm.doc.name
},
callback: function(r) {
if (r.message) {
frappe.msgprint(__('导入成功'));
frm.refresh();
} else {
frappe.msgprint(__('导入失败'));
}
}
});
};
reader.readAsText(file);
}
});
input.click();
});
}
});
journal_entry_template.py
import frappe
from frappe.model.document import Document
import json
class JournalEntryTemplate(Document):
def import_transaction_entries(self, json_data):
for entry in json_data:
for item in entry.get('分录', []):
self.append('accounts', {
'account': item.get('借方科目', '') if item.get('借方金额', 0) > 0 else item.get('贷方科目', ''),
'debit_in_account_currency': item.get('借方金额', 0),
'credit_in_account_currency': item.get('贷方金额', 0),
'against_account': item.get('贷方科目', '') if item.get('借方金额', 0) > 0 else item.get('借方科目', ''),
'remarks': item.get('摘要', '')
})
self.save()
return True
@frappe.whitelist()
def import_transaction_entries(json_data, template_name):
template = frappe.get_doc('Journal Entry Template', template_name)
return template.import_transaction_entries(json_data)
代码解释
journal_entry_template.js
- 在
onload
事件中添加了一个自定义按钮“导入事项核算分录体系”。 - 点击按钮后,弹出文件选择框,用户选择 JSON 文件。
- 使用
FileReader
读取文件内容,并将其解析为 JSON 数据。 - 通过
frappe.call
方法将 JSON 数据和模板名称发送到后端的import_transaction_entries
方法。
journal_entry_template.py
- 定义了
import_transaction_entries
方法,用于解析 JSON 数据并将分录信息添加到日记账分录模板的accounts
表中。 - 使用
@frappe.whitelist()
装饰器将import_transaction_entries
方法暴露为可通过 HTTP 请求调用的 API。 - 在该方法中,根据模板名称获取对应的
Journal Entry Template
文档,并调用其import_transaction_entries
方法进行数据导入。
注意事项
- 确保 JSON 文件的格式与之前提供的示例一致,包含
事项
和分录
字段。 - 此代码假设
Journal Entry Template
文档中有accounts
表用于存储分录信息,并且表字段包含account
、debit_in_account_currency
、credit_in_account_currency
、against_account
和remarks
。如果实际字段不同,需要相应调整代码。