システムを作ろうとした理由
一番の理由は、今までエクセルで管理していたので記帳できる端末が限られていたことである。エクセルが入っている PC でないと記帳できない。
二番目は、自分で何かしらのシステムを作ってみたかったからである。今回の家計簿管理システムは、サーバーサイドからフロントサイドまで必要となる。これらを一人で構築してみたかった。
使用した技術やもの
- サーバー機材: RaspberryPi3
- API: Go
- フロント: Elm
- DB: MySQL 5.5
家計簿で管理したいこと
一文でいうと下記の通り。
「どういう種別のものをいくらでどの予算でいつどこから出したのか」
例1)
昼食という種別の900円ラーメンを、食費の予算で 2019/6/28 に財布からだした。
例2)
水道代という種別の3000円の水道代を、光熱費の予算で 2019/5/24 に〇〇銀行から引き落とされた
テーブルの説明
balance テーブルだけ説明する(他はマスタテーブルなので特に説明するほどでもない)。
balance
- balance_id: 主キー(auto_increment)
- amount: 使用した金額(もちろん支出がマイナスである)
- item: 使った項目の名前
- kind_id: 項目の種別
- purpose_id: 予算の場所
- place_id: お金を出した場所
上の例だと下記の通り入る。
例1
- amount: -900
- item: ラーメン
- kind_id: 2(昼食)
- purpose_id: 5(食費)
- place_id: 1(財布)
例2
- amount: -3000
- item: 水道代
- kind_id: 9(水道代)
- purpose_id: 9(光熱費)
- place_id: 8(〇〇銀行)
balance テーブルやその他テーブルの DDL は下記に置いてある。
https://github.com/firedial/midas/tree/master/db
移動処理
予算や場所の移動も balance テーブルを2レコード使うことで実現できる。
例3) 〇〇銀行から5000兆円を引き落として財布にいれる
1レコード目
- amount: -5000000000000000
- item: 場所移動元
- kind_id: 14(移動)
- purpose_id: 12(移動)
- place_id: 8(〇〇銀行)
2レコード目
- amount: 5000000000000000
- item: 場所移動先
- kind_id: 14(移動)
- purpose_id: 12(移動)
- place_id: 1(財布)
※ amount は 32bit なので実際に入れるとオーバーフローとなります(正確にいうと signed なので 31 bit)
※ なので5000兆円を僕に渡さないでください。管理できなくなります
API サーバー
触ってみたかったので Go 言語を使うことにした。
今回実装したのは下記の機能
- balance テーブルの情報を取得
- balance テーブルに登録
- kind, purpose, place テーブルの情報を取得
- 予算と場所移動の処理
- 集計機能(気が向いたら記事にします)
ソース: https://github.com/firedial/midas-go
フロント
こっちも使ってみたかった Elm を採用。関数型言語である。
最低限の機能だけ装備。
ソース: https://github.com/firedial/midas-elm
最後に
家計簿管理システム化の計画は2018年からあって、ようやく2019年4月1日に運用にのせることができた。その1年間で採用予定だった Haskell と Rails の勉強もしていた。なぜ採用されなかったのかはまた別記事にしようと思う。
あと、まだまだ開発中の部分があるので、今後の開発も楽しみである。
以上拙い文章でしたが、今後ともよろしくお願いします。