使用beancount进行复式记账

使用beancount进行复式记账

Louis 1569 2021-04-17

这个项目的起源是最近团队的小伙伴说我的帐记得不好,不能清楚指出各个账户还有多少钱,只能知道赚了多少钱,不知道赚的钱放到哪里去了。

作为一个工商管理的学生,一拍脑门。哟,这不是要复式记账嘛,于是就开始在手机上找各种能够使用复式记账的APP。广告实在是太多了,无法忍受。

我突然想起,不对喔,我明明是学工科的,找一下开源解决方案吧。于是就有了这个一晚搭建在线复式记账平台的项目。

谈一下复式记账

一般个人使用手机APP进行记账都是使用单式记账的方式,特点是比较方便,就是最普通的流水账。这种记账方式可以知道花了多少钱,赚了多少钱,使得总体上达到收支平衡。

但是企业/公司的报账一般都使用复式记账,每一笔花费,不仅要知道是花到哪里去了,还要知道从哪里出资的。每一笔收入,不仅要知道钱从哪里来,还要知道钱最后存放到哪里了。

标准的会计学上的复式记账定义似乎没有这么简单,我这里是做了简化。

假设:7月1日,打车花费30元,使用银行卡支付。

普通记账一般包括日期、收支分类和金额,如下:

2019-08-28: 交通-打车 -200元

复式记账把账户变化也一并记账,如下:

2019-08-28:
    交通-打车    200元
    银行卡      -200元

复式记账会记录每笔交易的资金流动,各账户变化「有正有负,正负相等」。这便是复式记账的基本原理,称之为「会计恒等式」。这种方式能够保证记账准确无误,也能提供更详细的财务分析。

这句话中的账户是广义的,也可理解为分类,「银行卡」和「交通-打车」都是账户。

搭建fava

beanconunt是一个记账工具,或者说是一个文本分析工具。可以将特定格式的账本转换成可分析的账本。

需要搭建一个python环境,在搭建环境的时候踩了不少坑,fava在python3.8的环境下会出问题。

先下载一个Python3.9的环境。

wget https://www.python.org/ftp/python/3.9.4/Python-3.9.4.tar.xz
tar -xvf Python-3.9.4.tar.xz
cd Python-3.9.4.tar.xz
./configure
make
sudo make install

安装完成后,可能需要按照某些方法切换一下python环境到刚刚安装到3.9。

然后在本地环境创建Python虚拟环境,并且下载Fava。Fava是一个beancount的可视化工具,可以将beancount解析出来的账本数据生成可视化的现金流量表、资产负债表等。

mkdir venv
python -m venv venv/
source venv/bin/activity
pip3 install fava

此时,新建一个实例账本为moneybook.bean

;【一、账本信息】
option "title" "我的账本" ;账本名称
option "operating_currency" "CNY" ;账本主货币

;【二、账户设置】
;1、开设账户
1990-01-01 open Assets:Card:1234 CNY, USD ;尾号1234的银行卡,支持CNY和USD
1990-01-01 open Liabilities:CreditCard:5678 CNY, USD ;双币信用卡
1990-01-01 open Income:Salary CNY ;工资收入
1990-01-01 open Expenses:Tax CNY ;交税
1990-01-01 open Expenses:Traffic:Taxi CNY ;打车消费,只支持CNY
1990-01-01 open Equity:OpenBalance ;用于账户初始化,支持任意货币

;2、账户初始化
2019-08-27 * "" "银行卡,初始余额10000元"
    Assets:Card:1234           10000.00 CNY
    Equity:OpenBalance        -10000.00 CNY

;【三、交易记录】
2019-08-28 * "杭州出租车公司" "打车到公司,银行卡支付"
    Expenses:Traffic:Taxi        200.00 CNY
    Assets:Card:1234            -200.00 CNY

2019-08-29 * "" "餐饮"
    Assets:Card:1234           -1100.00 CNY
    Liabilities:CreditCard:5678 1100.00 CNY

2019-08-31 * "XX公司" "工资收入"
    Assets:Card:1234           12000.00 CNY
    Expenses:Tax                1000.00 CNY
    Income:Salary

启动fava

fava maneybook.bean

再到浏览器中打开http://localhost:5000就能看到账本,下图分别是损益表、资产负债表、日记账的截图。其它栏目自行探索。

使用nginx做端口转发

不进行端口转发,需要打开防火墙、关闭selinux,然后通过5000端口进行访问。

sudo setenforce 0
sudo ufw allow 5000
curl "http://localhost:5000"

这种直接使用端口号的方法不是很清真,而且没有办法使用SSL证书。于是在Nginx中添加一下反向代理。

Nginx的更多用法查看:Nginx配置略解

编辑nginx配置文件/etc/nginx/nginx.conf

    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
#省略
        location / {
	proxy_pass http://127.0.0.1:5000;
        }
# 省略
    }

上述配置完成后,可以在本地的80端口访问在线账本了。

尾声

学而时习之,不亦乐乎。本科时候人力资源课的老师跟我们说,孔子的习不是指复习,而是指练习或者是实习。学到的知识要拿出来用,是一件很快乐的事情。

参考网站

(知乎)记账神器Beancount