结合智能会计中的“权责发生制”与“系统性分摊原则”,用 Python 打造一套租赁资产智能折旧摊销引擎,实现真正的 “一次录入,终身受益”。

 

一、 实际应用场景描述

 

场景:

 

某连锁餐饮企业,租入一家新门店,发生大额装修费(长期待摊费用)50万元,租赁期5年;同时购入厨房设备(固定资产)30万元,预计使用5年,残值率5%。

 

老做法:

 

1. 会计手动计算月摊销额:

"500,000 / (5*12)"。

2. 每个月末,手工做凭证:借:管理费用‑装修费摊销,贷:长期待摊费用。

3. 每到年底,还要检查是否需要对折旧年限进行调整。

4. 痛苦点:如果公司有 50 家门店,每家都有装修和设备,每月光算折旧就要花半天,还容易抄错行。

 

二、 引入痛点 (The Pain Points)

 

我们要终结的“按月手动算折旧”模式有以下顽疾:

 

1. 极度枯燥且易错:简单的除法和复制粘贴,大脑处于停滞状态,最容易把 

"5,000" 写成 

"50,000"。

2. 中断即混乱:如果某个月忘记计提,后面需要补提,历史数据就对不上了。

3. 无法前瞻性分析:老板问“明年Q1的折旧费是多少?”,手算党只能掏出计算器当场按。

4. 政策变更麻烦:如果税法调整折旧年限,需要逐个资产修改 Excel 公式。

 

三、 核心逻辑讲解 (The Algorithm)

 

我们将采用“资产台账驱动 + 现金流日历生成”模型。

 

核心思想:

 

将每一件资产视为一个独立的对象 (Object),具备自己的生命周期。程序只需遍历资产池,询问每一个资产:“今天是不是该你出钱了?”

 

计算逻辑:

 

1. 直线法折旧 (Straight‑Line Method)

月折旧额 = (原值 − 预计残值) / 使用月份

2. 长期待摊费用摊销

月摊销额 = 总额 / 租赁期月份

 

流程:

 

1. 建立资产主数据(Asset Master Data)。

2. 设定当前会计期间(Current Accounting Period)。

3. 遍历资产,判断是否处于“服役期”。

4. 若在服役期,自动生成当月折旧/摊销凭证数据。

 

四、 代码模块化实现 (Python Code)

 

1. 项目结构

 

asset_depreciation_system/

├── main.py

├── modules/

│ ├── __init__.py

│ ├── asset_factory.py # 资产类定义

│ ├── depreciation.py # 折旧计算逻辑

│ └── scheduler.py # 凭证生成调度器

├── asset_master.csv # 资产台账

└── README.md

 

2. 核心代码

 

"modules/asset_factory.py"

 

"""

模块功能:资产工厂

定义固定资产和长期待摊费用的基类与派生类

"""

from dataclasses import dataclass

from datetime import date

from abc import ABC, abstractmethod

 

@dataclass

class Asset(ABC):

    """

    资产抽象基类 (Abstract Base Class)

    所有资产都必须继承此类并实现 calculate_monthly_expense 方法

    """

    asset_id: str

    name: str

    start_date: date

    total_amount: float

    

    @abstractmethod

    def calculate_monthly_expense(self, current_date: date) -> float:

        """计算当月应承担的费用"""

        pass

    

    def is_active(self, current_date: date) -> bool:

        """判断资产在特定日期是否有效(简化版:只检查起始日)"""

        return current_date >= self.start_date

 

 

@dataclass

class FixedAsset(Asset):

    """

    固定资产类

    """

    useful_life_months: int

    salvage_value_rate: float = 0.05 # 默认残值率5%

    

    def calculate_monthly_expense(self, current_date: date) -> float:

        if not self.is_active(current_date):

            return 0.0

            

        # 计算净残值

        salvage_value = self.total_amount * self.salvage_value_rate

        depreciable_amount = self.total_amount - salvage_value

        

        monthly_depreciation = depreciable_amount / self.useful_life_months

        return round(monthly_depreciation, 2)

 

 

@dataclass

class LongTermPrepaid(Asset):

    """

    长期待摊费用类 (如装修费)

    """

    amortization_period_months: int

    

    def calculate_monthly_expense(self, current_date: date) -> float:

        if not self.is_active(current_date):

            return 0.0

            

        monthly_amortization = self.total_amount / self.amortization_period_months

        return round(monthly_amortization, 2)

 

"modules/scheduler.py"

 

"""

模块功能:凭证生成调度器

"""

import pandas as pd

from datetime import date

from typing import List

from .asset_factory import Asset

 

class DepreciationScheduler:

    """

    折旧摊销调度器

    负责遍历资产池,生成指定期间的凭证

    """

    

    def __init__(self, assets: List[Asset]):

        self.assets = assets

        print(f"📦 调度器已加载 {len(assets)} 项资产")

        

    def generate_monthly_journal_entries(self, target_date: date) -> pd.DataFrame:

        """

        生成指定月份的折旧/摊销凭证

        

        参数:

            target_date (date): 目标会计期间 (只需年月)

            

        返回:

            pd.DataFrame: 凭证明细表

        """

        entries = []

        

        for asset in self.assets:

            expense_amount = asset.calculate_monthly_expense(target_date)

            

            if expense_amount > 0:

                entry = {

                    "Asset_ID": asset.asset_id,

                    "Asset_Name": asset.name,

                    "Account_Date": target_date,

                    "Debit_Account": self._get_debit_account(asset),

                    "Credit_Account": self._get_credit_account(asset),

                    "Amount": expense_amount

                }

                entries.append(entry)

                

        return pd.DataFrame(entries)

    

    def _get_debit_account(self, asset: Asset) -> str:

        """根据资产类型确定借方科目"""

        if isinstance(asset, FixedAsset):

            return "制造费用-折旧费" if "设备" in asset.name else "管理费用-折旧费"

        elif isinstance(asset, LongTermPrepaid):

            return "管理费用-装修费摊销"

        return "未知科目"

        

    def _get_credit_account(self, asset: Asset) -> str:

        """根据资产类型确定贷方科目"""

        if isinstance(asset, FixedAsset):

            return "累计折旧"

        elif isinstance(asset, LongTermPrepaid):

            return "长期待摊费用"

        return "未知科目"

 

"main.py"

 

"""

主执行程序:租赁资产智能折旧摊销系统

"""

import pandas as pd

from datetime import date

from modules.asset_factory import FixedAsset, LongTermPrepaid

from modules.scheduler import DepreciationScheduler

 

def load_asset_master_data() -> list:

    """

    模拟加载资产主数据

    实际生产中应从CSV/数据库读取

    """

    assets = [

        FixedAsset(

            asset_id="FA-001",

            name="厨房设备",

            start_date=date(2026, 1, 1),

            total_amount=300000.00,

            useful_life_months=60, # 5年

            salvage_value_rate=0.05

        ),

        LongTermPrepaid(

            asset_id="LTP-001",

            name="门店装修费",

            start_date=date(2026, 1, 1),

            total_amount=500000.00,

            amortization_period_months=60 # 租赁期5年

        ),

        FixedAsset(

            asset_id="FA-002",

            name="办公电脑",

            start_date=date(2026, 3, 1),

            total_amount=50000.00,

            useful_life_months=36,

            salvage_value_rate=0.0

        )

    ]

    print("✅ 资产主数据加载完毕")

    return assets

 

def main():

    print("🚀 启动资产智能折旧摊销系统...\n")

    

    # 1. 加载资产池

    asset_pool = load_asset_master_data()

    

    # 2. 初始化调度器

    scheduler = DepreciationScheduler(asset_pool)

    

    # 3. 设定目标会计期间 (例如:2026年4月)

    TARGET_MONTH = date(2026, 4, 30)

    

    # 4. 生成凭证

    journal_entries = scheduler.generate_monthly_journal_entries(TARGET_MONTH)

    

    # 5. 输出结果

    print("\n" + "="*60)

    print(f" 📅 {TARGET_MONTH.strftime('%Y-%m')} 折旧摊销凭证")

    print("="*60)

    print(journal_entries[['Asset_Name', 'Debit_Account', 'Credit_Account', 'Amount']])

    

    # 6. 导出Excel

    total_amount = journal_entries['Amount'].sum()

    journal_entries.to_excel(f"depreciation_{TARGET_MONTH.strftime('%Y%m')}.xlsx", index=False)

    

    print("\n" + "-"*60)

    print(f"本月合计计提/摊销金额: ¥{total_amount:,.2f}")

    print(f"✅ 凭证已导出至 depreciation_{TARGET_MONTH.strftime('%Y%m')}.xlsx")

 

if __name__ == "__main__":

    main()

 

五、 README 文件与使用说明

 

Asset-Depreciation-Automation

 

简介

 

本系统通过 Python 面向对象编程,实现固定资产折旧与长期待摊费用摊销的全自动计算,替代人工月度重复计算。

 

使用前准备

 

1. 安装 Python 3.8+

2. 安装依赖:

"pip install pandas"

3. 修改 

"load_asset_master_data()" 函数,录入您的实际资产信息。

 

运行方式

 

python main.py

 

输出结果

 

程序将生成 

"depreciation_YYYYMM.xlsx",包含可直接导入财务软件的凭证分录。

 

六、 核心知识点卡片 (Knowledge Cards)

 

知识点 说明

面向对象 (OOP) 使用 

"Class" 封装资产属性与行为,完美映射现实世界的“资产卡片”。

抽象基类 (ABC) 强制 

"FixedAsset" 和 

"LongTermPrepaid" 遵守统一的接口规范,保证系统扩展性。

权责发生制 程序逻辑严格遵循“费用归属期”而非“支付期”,实现精准配比。

DRY 原则 Don't Repeat Yourself,一套代码处理所有资产类型,避免复制粘贴导致的错误。

 

七、 总结

 

作为全栈工程师,我始终认为:“会计的严谨,应该由代码的确定性来保证。”

 

这套智能折旧摊销系统的价值在于:

 

1. 零人工干预:录入资产那一刻起,未来5年的折旧凭证都已“预定”好了。

2. 绝对精准:机器不会累,不会算错除法,也不会忘记哪个月该提折旧。

3. 前瞻可控:修改 

"TARGET_MONTH" 变量,即可瞬间预览未来任意月份的折旧费用。

 

利用AI解决实际问题,如果你觉得这个工具好用,欢迎关注长安牧笛!

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐