Skip to main content

财务会计图书馆

项目描述

Finac - 人类财务会计

Finac 是 Jupyter/ipython 的库和函数集,提供复式记账数据库。

Finac 简单、开放且免费。它可以使用 SQLite 或 SQLAlchemy 支持的任何数据库(测试:SQLite、MySQL、PostgreSQL)。

Finac 可以在与 JupyterSpyder-IDE、ipython 或其他类似环境的交互模式下使用,或者 Finac 库可以嵌入到 3rd 方项目中。该库可用于会计应用程序,对金融科技服务很有用。

Finac支持多币种、简单交易、复式记账交易、手表透支、余额限制等功能,让记账变得简单有趣。

安装

pip3 install finac

资料来源:https ://github.com/alttch/finac

文档:https ://finac.readthedocs.io/

更新

从 0.4.10

ALTER TABLE transact ADD service bool;
UPDATE transact SET service=true WHERE d_created<'1970-01-03';
ALTER TABLE transact ADD FOREIGN KEY(chain_transact_id)
  REFERENCES transact(id) ON DELETE SET null;

从 0.3.x

从 0.4 开始,Finac 将 DateTime 列用于:

  • 资产率.d
  • 交易.d
  • 交易.d_created
  • 交易删除

根据数据库类型,需要将这些列转换为 DATETIME(SQLite,推荐 MySQL DATETIME(6))或 TIMESTAMPTZ(PostgreSQL,带时区)。

如何在交互模式下使用

Finac 数据库包含 3 种实体类型:

  • 资产货币、ISIN、股票代码等,货币“美元”和“欧元”是自动创建的。Finac 不会将资产分为货币、财产和其他。这允许使用单个库为各个领域创建应用程序。

  • 帐户银行帐户,交易对手帐户,税务帐户,特殊帐户等。一切都是帐户:)

  • 从(贷方)/到(借方)和账户之间的交易变动

资产有利率——一种资产相对于另一种资产的价值。

交易可以是简单的(无交易对手)或经典的复式记账(借记账户和贷记账户之间)。

import finac as f
# init finac, 
f.init('/tmp/test.db')
# create a couple of accounts
f.account_create('acc1', 'USD')
f.account_create('acc2', 'USD')
f.account_create('depo', 'USD', 'saving')
# import initial balance with a simple transaction
f.tr('acc1', 10000, tag='import')
# move some assets to other accounts
f.mv(dt='acc2', ct='acc1', amount=2000)
f.mv(dt='depo', ct='acc1', amount=3000)
# display statement for acc1
f.ls('acc1')
id     amount  cparty  tag     note  created              completed
-----------------------------------------------------------------------------
7   10 000.00          import        2019-10-26 03:04:02  2019-10-26 03:04:02
8   -2 000.00  ACC2                  2019-10-26 03:04:02  2019-10-26 03:04:02
9   -3 000.00  DEPO                  2019-10-26 03:04:02  2019-10-26 03:04:02
-----------------------------------------------------------------------------
Debit turnover: 10 000.00, credit turnover: 5 000.00

Net profit/loss: 5 000.00 USD
# display summary for all accounts
f.ls()
account  type      asset     balance  balance USD
-------------------------------------------------
ACC1     current    USD     5 000.00     5 000.00
ACC2     current    USD     2 000.00     2 000.00
DEPO     saving     USD     3 000.00     3 000.00
-------------------------------------------------
Total: 10 000.00 USD
# display summary only for current accounts
f.ls(tp='current')
account  type     asset     balance   balance USD
-------------------------------------------------
ACC1     current    USD     5 000.00     5 000.00
ACC2     current    USD     2 000.00     2 000.00
-------------------------------------------------
Total: 7 000.00 USD
# display assets pie chart, (wrapper for matplotlib.pyplot, requires Jupyter,
# Spyder-IDE or a similar interactive environment)
f.pie()

注意:在交互和 API 模式下处理货币和帐户时,应使用帐户和资产代码作为对象标识符。所有代码都不区分大小写

内部数据库 Finac 使用数字 ID 连接对象,因此可以毫无问题地更改代码。

特殊功能

懒惰的交换

如果在交易详情中设置或指定汇率,Finac 可以自动在不同货币的账户之间转移资产:

# create EUR account
f.account_create('acc5', 'eur')
# set exchange rate (in real life you would probably use cron job)
f.asset_set_rate('eur/usd', value=1.1)
f.mv(dt='acc5', ct='acc1', amount=100)

万岁,账户 acc5 有 100 欧元!汇率为1.1。核实:

>>> f.ls('acc1')
id     amount  cparty  tag     note  created              completed
-----------------------------------------------------------------------------
..............
..............
14    -110.00                        2019-10-26 03:15:41  2019-10-26 03:15:41
-----------------------------------------------------------------------------
>>> f.ls('acc5')
id  amount  cparty  tag  note  created              completed
-----------------------------------------------------------------------
15  100.00                     2019-10-26 03:15:41  2019-10-26 03:15:41
-----------------------------------------------------------------------
Debit turnover: 100.00, credit turnover: 0.00

Net profit/loss: 100.00 EUR

如图所示,惰性交易所中没有交易对手账户。此功能对个人会计和特殊应用很有用,但对于专业会计,应创建交易对手交易账户,并在它们之间进行买卖交易。

目标

Targets 是我创建 Finac 的一个功能。考虑在银行和会计中存在账户余额。它们在一定程度上有所不同,这需要通过单笔交易记录在会计中。

但问题是:有很多交易需要总结。或者必须手动计算银行余额和会计之间的差异。很常见吧?不要这样做,Finac 有目标。

指定目标而不是金额要求 Finac 自行计算交易金额。

在前面的操作之后,“acc1”上有4,890.00美元,考虑到除了 1000 美元之外的所有东西都应该转移到“acc2”。让我们这样做:

>>> f.mv(dt='acc2', ct='acc1', target_ct=1000)
id     amount  cparty  tag     note  created              completed
-----------------------------------------------------------------------------
......
......
16  -3 890.00  ACC2                  2019-10-26 03:25:56  2019-10-26 03:25:56
-----------------------------------------------------------------------------
Debit turnover: 10 000.00, credit turnover: 9 000.00

Net profit/loss: 1 000.00 USD

交易金额是自动计算的。懒惰的人是快乐的:)

如果应指定借方账户余额目标, 则可以使用target_dt函数参数。注意:计算的交易金额必须始终大于零(如果指定信用账户目标高于其当前余额,则会引发ValueError

对于简单的交易(f.tr(...))),使用target=

交易模板

示例:银行有重复付款订单,每月第 5 天支付办公室水电费,并自动将 100 美元转入储蓄账户。要将其填写到会计中,可以使用 YAML 交易模板:

transactions:
  - account: acc1
    amount: 200
    tag: electricity
    note: energy company deposit
  - account: acc1
    amount: 800
    tag: rent
    note: office rent
  - dt: depo
    ct: acc1
    amount: 200
    tag: savings
    note: rainy day savings

然后创建一个调用f.transaction_apply("/path/to/file.yml")的 cron 作业 ,就是这样。

实际上,事务模板对于任何重复操作都很有用。可以指定与核心功能相同的参数。

数字格式

Finac 不使用系统语言环境。如果金额和目标作为字符串输入,它们可以以任何格式指定,Finac 会尝试将字符串自动转换为浮点数。以下金额和目标值是有效的,并且会自动解析:

  • 1 000,00 = 1000.0
  • 1,000.00 = 1000.0
  • 1.000,00 = 1000.0
  • 1,000.00 = 1000.0
  • 10,0 = 10.0
  • 10.0 = 10.0

被动账户

如果帐户是被动的,则其资产将从总数中减少。要创建被动帐户,必须使用被动参数:

f.account_create('passive1', 'usd', passive=True)

“tax”、“supplier”和“finagent”类型的账户默认是被动的。

数据乘数

根据数据,在数据库中将数值存储为整数而不是浮点数可能很有用。Finac 库具有内置的数据乘法器功能。要启用它,请在finac.init()方法中设置multiplier=N,例如 multiplier=1000。这使得 Finac 将整数存储到表中,并使用逗号后 3 位的最大精度。

注意:表格字段必须手动转换为数字/整数类型。在生产数据库中,字段值也必须手动相乘。

dict finac.core.multiply_fields中提供了需要转换的表和字段的完整列表。

注意:乘数只能用于整数和数字(X)字段类型,因为核心转换函数总是返回四舍五入的值。

如何将 Finac 库嵌入到自己的项目中

有关核心函数 API 的详细信息,请参阅Finac 文档

客户端-服务器模式和 HTTP API

有关服务器模式和 HTTP API 详细信息,请参阅Finac 文档

企业服务器和支持

想要将 Finac 集成到自己的企业应用程序或服务中?需要支持吗?检查Finac 企业服务器