人财事物信息化 - 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 类继承自 AccountsControllerPWANotificationsMixin,用于处理费用报销单的各种操作。
  • 包含了一系列方法,如 onloadafter_insertvalidate 等,这些方法在费用报销单的不同生命周期阶段被调用,例如插入后通知审批人、验证报销单信息等。

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:计算预付款的分配金额。

关键业务逻辑

  • 状态管理:根据报销单的文档状态、审批状态和支付状态,动态更新报销单的状态,如草稿、提交、已支付、未支付、拒绝、取消等。
  • 金额计算:计算报销单的总申请金额、总批准金额、税费、总金额、预付款金额、已报销金额和未支付金额等。
  • 会计分录生成:根据报销单的费用明细、预付款项和支付情况,生成相应的会计分录,确保财务数据的准确性。
  • 数据验证:在报销单的创建、提交、更新和取消过程中,对员工状态、金额、账户、成本中心等信息进行验证,确保数据的合法性和完整性。

总结

这段代码实现了一个完整的费用报销单管理系统,涵盖了报销单的生命周期管理、金额计算、会计分录生成、数据验证等核心功能,为企业的费用报销业务提供了可靠的支持。同时,代码中使用了异常处理和数据验证机制,提高了系统的健壮性和可靠性。

Discard
Save
Review Changes ← Back to Content
Message Status Space Raised By Last update on