人财事物信息化 - expense_claim.py
这个代码文件 expense_claim.py
主要用于处理费用报销单相关的业务逻辑,属于一个企业资源规划(ERP)系统的一部分,可能集成在ERPNext或HRMS(人力资源管理系统)中。以下是对该文件的详细介绍:
1. 导入模块
import frappe
from frappe import _
from frappe.model.mapper import get_mapped_doc
from frappe.query_builder.functions import Sum
from frappe.utils import cstr, flt, get_link_to_form
import erpnext
from erpnext.accounts.doctype.repost_accounting_ledger.repost_accounting_ledger import (
validate_docs_for_voucher_types,
)
from erpnext.accounts.doctype.sales_invoice.sales_invoice import get_bank_cash_account
from erpnext.accounts.general_ledger import make_gl_entries
from erpnext.controllers.accounts_controller import AccountsController
import hrms
from hrms.hr.utils import set_employee_name, share_doc_with_approver, validate_active_employee
from hrms.mixins.pwa_notifications import PWANotificationsMixin
导入了多个模块,包括 frappe
框架相关的模块、erpnext
财务相关模块以及 hrms
人力资源相关模块。这些模块提供了处理文档映射、数据库查询、财务记账、员工信息验证等功能。
2. 自定义异常类
class InvalidExpenseApproverError(frappe.ValidationError):
...
class ExpenseApproverIdentityError(frappe.ValidationError):
...
class MismatchError(frappe.ValidationError):
...
定义了三个自定义异常类,用于处理费用报销审批人相关的验证错误。
3. ExpenseClaim
类
class ExpenseClaim(AccountsController, PWANotificationsMixin):
def onload(self):
pass # function body is omitted
def after_insert(self):
self.notify_approver()
def validate(self):
pass # function body is omitted
def set_status(self, update=False):
pass # function body is omitted
# 其他方法...
ExpenseClaim
类继承自AccountsController
和PWANotificationsMixin
,用于处理费用报销单的各种操作。- 包含了一系列方法,如
onload
、after_insert
、validate
等,这些方法在费用报销单的不同生命周期阶段被调用,例如插入后通知审批人、验证报销单信息等。
4. 全局函数
def update_reimbursed_amount(doc):
pass # function body is omitted
def get_total_reimbursed_amount(doc):
pass # function body is omitted
# 其他全局函数...
定义了多个全局函数,用于更新报销金额、获取总报销金额、生成银行分录等操作。这些函数提供了与费用报销单相关的辅助功能。
总结
这个代码文件围绕费用报销单的处理,提供了一系列的类和函数,涵盖了费用报销单的创建、验证、审批、记账等多个环节。虽然大部分方法的具体实现被省略,但可以推测出这些方法将处理费用报销单的核心业务逻辑,包括与财务系统的交互、员工信息的验证以及审批流程的管理。
主要方法及其功能
生命周期方法
onload
:在加载报销单时,从Accounts Settings
中获取make_payment_via_journal_entry
配置并存储在__onload
属性中。after_insert
:报销单插入后,通知审批人。validate
:执行多项验证和计算操作,包括验证员工状态、设置员工姓名、验证批准金额、计算总金额、验证预付款、设置费用账户、计算税费、设置状态等。on_update
:报销单更新时,共享文档给审批人,发布更新通知并通知审批状态变化。after_delete
:报销单删除时,发布更新通知。before_submit
:提交报销单前,检查payable_account是否为空,若为空且未支付则抛出异常。on_submit
:提交报销单时,验证审批状态,更新任务和项目相关数据,生成会计分录,更新已报销金额,更新员工预付款中的已申请金额。on_update_after_submit
:提交后更新报销单时,检查特定字段是否更新,若更新则重新验证和过账会计条目。- #
on_cancel
#:取消报销单时,更新任务和项目相关数据,生成反向会计分录(若有应付账款账户),更新已报销金额,更新员工预付款中的已申请金额,发布更新通知。
金额计算与验证方法
calculate_total_amount
:计算报销单的总申请金额和总批准金额,若审批状态为拒绝,则将批准金额设为 0。calculate_taxes
:计算报销单的税费和总金额,根据税率计算每个税费项的金额,累加得到总税费和总金额。validate_advances
:验证报销单中的预付款项,计算总预付款金额,检查分配金额是否超过未申请金额,检查总预付款金额是否超过总批准金额(含税费)。validate_sanctioned_amount
:验证费用明细中批准金额是否大于申请金额,若大于则抛出异常。
会计分录相关方法
make_gl_entries
:当总批准金额大于 0 时,调用get_gl_entries
方法获取会计分录条目,并调用makeglentries方法生成会计分录,可选择取消操作(生成反向分录)。get_gl_entries
:构建会计分录条目,包括应付账款、费用、预付款、税费、支付(若已支付)等相关条目。add_tax_gl_entries
:遍历报销单中的税费项,为每个税费项添加会计分录条目。
辅助方法
set_status
:根据报销单的docstatus(文档状态)、approvalstatus(审批状态)、ispaid(是否已支付)等字段,计算并设置报销单的状态,可选择更新数据库并发布状态更新通知。set_expense_account
:为费用明细设置默认费用账户,可选择验证账户。update_reimbursed_amount
:获取报销单的已报销金额,更新报销单的totalamountreimbursed字段和状态。get_total_reimbursed_amount
:根据报销单是否已支付,获取已报销金额。若已支付,返回总金额;否则从日记账条目或支付条目中获取。
其他辅助函数
get_outstanding_amount_for_claim
:计算报销单的未支付金额。make_bank_entry
:生成银行分录,用于支付报销费用。get_expense_claim_account_and_cost_center
:获取费用报销类型对应的账户和成本中心。get_expense_claim_account
:获取费用报销类型对应的默认账户。get_advances
:获取员工的预付款信息。get_expense_claim
:创建一个新的费用报销单文档。update_payment_for_expense_claim
:在付款凭证或日记账凭证提交或取消时,更新费用报销单的已支付金额。update_outstanding_amount_in_payment_entry
:更新付款凭证参考中的未支付金额。validate_expense_claim_in_jv
:验证日记账凭证中费用报销单的金额是否超过未支付金额。make_expense_claim_for_delivery_trip
:根据送货行程创建费用报销单。get_allocation_amount
:计算预付款的分配金额。
关键业务逻辑
- 状态管理:根据报销单的文档状态、审批状态和支付状态,动态更新报销单的状态,如草稿、提交、已支付、未支付、拒绝、取消等。
- 金额计算:计算报销单的总申请金额、总批准金额、税费、总金额、预付款金额、已报销金额和未支付金额等。
- 会计分录生成:根据报销单的费用明细、预付款项和支付情况,生成相应的会计分录,确保财务数据的准确性。
- 数据验证:在报销单的创建、提交、更新和取消过程中,对员工状态、金额、账户、成本中心等信息进行验证,确保数据的合法性和完整性。
总结
这段代码实现了一个完整的费用报销单管理系统,涵盖了报销单的生命周期管理、金额计算、会计分录生成、数据验证等核心功能,为企业的费用报销业务提供了可靠的支持。同时,代码中使用了异常处理和数据验证机制,提高了系统的健壮性和可靠性。