这个项目的起源是最近团队的小伙伴说我的帐记得不好,不能清楚指出各个账户还有多少钱,只能知道赚了多少钱,不知道赚的钱放到哪里去了。
作为一个工商管理的学生,一拍脑门。哟,这不是要复式记账嘛,于是就开始在手机上找各种能够使用复式记账的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端口访问在线账本了。
尾声
学而时习之,不亦乐乎。本科时候人力资源课的老师跟我们说,孔子的习不是指复习,而是指练习或者是实习。学到的知识要拿出来用,是一件很快乐的事情。