怎么了
几年前,我对获得被动收入产生了兴趣,并决定尝试使用p2b平台进行投资。 一段时间后,人们发现资金非常分散,分布在地点,银行,债务中,这使人们很难了解情况。 我无法回答两个最重要的问题:
我有多少钱?
趋势如何? 我变得更富或更穷吗?
必须以某种方式将信息收集在一起并保持最新状态。
该问题的解决方案如下:
Google表格中的表格
优点:快速,灵活,免费
缺点:需要手动更新数据
最初,我使用了这个选项,但是要维持它很累人:我不得不去许多个人帐户,然后从那里重写数据。 此外,某些资产的波动性很大,因此数据的不规则性影响了决策的质量。
专业解决方案
在大多数情况下,这些都是相同的表,只是具有一个不错的/便捷的界面。
在极少数情况下,可以与几家银行进行整合,但在我尝试过的所有情况下-都是不稳定且不可靠的。 还使您不必从网上银行提供用户名/密码,也不必与非标准数据源集成。
很明显,您必须自己编写一个合适的服务-这是使财务数据接收完全自动化的唯一方法,同时又不必担心将详细信息传输给第三方的情况。 另外,它将允许实现任何期望的接口。 因此,开始了BudgetTracker项目,我已经成功使用了两年。 它可以作为源下载和/或作为现成的Docker容器安装在您自己的服务器上。
主要思想
您如何看待金融有两个方面。 一方面,存在当前状态(有条件-现在帐户“ X”上有“ Y”笔钱),另一方面,有交易(有条件-在时间T上用“ UUU”钱购买“ XX”)。
财务的这两个方面实际上是相互独立的,但是对于了解总体趋势是必不可少的。 一个简单的例子是我们拥有类似于定期购买的存款的资产(例如,债券)。
为了建立这种资产(和预测)价值变化的图表,重要的是不要考虑购买。
资料来源
有不同的提供程序-数据源,例如,从客户银行收集数据。
支持的提供商列表- FX-汇率:欧元,美元
- LiveCoin-加密货币交换
- Penenza
- 阿尔法银行
- 阿尔法资本
- Alpha Direct
- 阿尔法流
- 模块银行
- ModuleMoney
- 雷菲森
- 债务和贷款(用于手动输入的债务)
- POST-api,用于从外部系统接收任意数据
由于某些提供商需要SMS身份验证,因此还可以通过IFTTT与SMS集成(仅适用于Android手机)。
提供商每天都会收集每个帐户的状态以及所有交易的列表,并将其保存在数据库中。 为此,Chrome启动,并在Selenium的帮助下从在线银行提取必要的数据。
帐目
每个帐户的状态形成以下形式的表格:

这样就可以查看每个帐户的详细信息和状况,但是却无助于了解全局,也无法回答“我有多少钱?”这个简单问题。
为了回答这个问题,添加了对“计算列”的支持,您可以在其中指定一个公式,例如:

但是除了特定的值外,我还希望查看趋势,排放量和预测-换句话说,请查看此值的动态变化(有时不仅是一个)。
为此,存在“主页”的概念,您可以在其中配置各个窗口小部件,以便专注于特定的列/趋势。
小部件

有几种类型的小部件:
- 甜甜圈带费用(来自交易)
- “最后值”是任意列的折线图,显示了预计的年度变化(%)和最后一天的实际变化(%)。 当它仅显示当前(最后一个)值时,也会在“紧凑”模式下发生。
- “ Delta”-显示最近24小时,48小时,1周和1个月的列数变化
- “甜甜圈”-用于计算列
- “图表”-用于计算列
每种类型的窗口小部件都有其自己的大小,可以使用“箭头”彼此相对移动。 默认情况下,它们是隐藏的,并在您单击页面顶部的“眼睛”按钮时出现:

另外,在创建或编辑窗口小部件时,可以更改其任何设置:

交易次数
要处理事务或DDS ,有一个单独的页面,您可以在其中查看按类别分组的所有事务。

每笔交易都有一种“类型”的交易-它是“收入”,“费用”或“转移”。 手动设置翻译以从主页的图表中排除翻译。
可以简化没有交易的提供者的资产计划时间表。 例如,股票市场。 您可以购买股票,它们也可以上涨价格,在图表上,您通常只希望看到第二种事件。
如果数据提供者没有交易支持在这种情况下,可以在列属性中添加自动生成的交易,并且在购买时编辑购买股票的交易并将类型设置为“转让”非常方便。
类别和类型既可以手动设置(必须先获取它们),也可以基于规则设置。 在为交易设置类别时,它会自动将其自身安装在具有相同描述的所有其他交易上(将来也将应用于类似的交易)。 除了手动为交易设置类别外,您还可以添加正则表达式或子字符串形式的规则,以自动将类别设置为所有合适的交易。
还有一个单独的部分“债务”,您可以在其中手动进行债务。 对于每个债务,您都可以类似地为交易设置一个模板,以便在与此债务相关的新DDS出现时,剩余金额得到更新。

技术栈
当前,后端运行在.NET Core 3上,前端运行在Svelte 3上。
ObjectRepository + LiteDB用于存储数据。
为了与数据源集成,使用了Selenium + Chrome捆绑包。
最初,所有内容都是完全用.NET Core编写的,但是前一段时间,前端是用Svelte重写的。
由于这种传统,与服务器的通信未达到最佳状态,因此计划将项目的这一部分重写为反应模型。
如何尝试
存储库中的docker-compose.yml文件将帮助:
version: "3.3" services: budgettracker: image: diverofdark/budgettracker:master restart: unless-stopped environment: Properties__IsProduction: 'true' # true . ConnectionStrings__LiteDb: '/data/budgettracker.db' volumes: - /dev/shm:/dev/shm # Google Chrome - /root/bt:/data ports: - "80:80" networks: public: {} networks: public: driver: bridge