一年中こたつ出てる

こたつは最高

Zaim APIを用いた家計折半アプリをリニューアルした

我が家の家計は結婚時に作成した折半アプリで精算しています。
こんなやつ。
f:id:kxn4t:20200813153048p:plain:w600

うちの家計は日々の記録をzaim(夫婦で共同のアカウントを運用)で行い、定期的にこのアプリで精算して多くお金を使っているほうにお金を渡す。という運用を行っています。

2人でいい感じに折半できるアプリってないよねってことで、夫婦2人で作って、これはこれでこの数年いい感じに運用は回っていたんですが、色々問題がでてきました。

ちょっと突貫で作ったので、

  • 今見ると何やってるかよくわかんない
    • 計算部分が魔窟
  • 最近立ち上げるだけでエラーでる
    • でもまぁ動いてるから放置…
  • コードがpushできる状態にないくらいやばい
    • さらに突貫で機能を継ぎ足していった結果、なんかいろいろハードコーディングされてるしなんかもうめちゃくちゃ
    • 妻に改善したいからコードくれと言われても見せられないよ状態
  • pushできてないので自分しか実行できない
    • 毎回精算を急かされることに

色々問題あるし、最近あんまりコード書いてないし、お盆で時間あるし、いっちょ書き直してみるか〜ってことで書き直してみました。

できたもの

f:id:kxn4t:20200813160337p:plain:w600

f:id:kxn4t:20200813153126p:plain:w200

調子に乗ってロゴも作った。

できること
  • Zaimから特定期間のレコードを取得、折半金額の計算
  • Slackへ通知
つかいかた
日々の記録
  • お互いZaimで使った金額を入力する
    • 登録する際、コメント欄にGroupByしたいキーワードを入れておく
精算
  1. Saifuで期間とキーワードを入力し集計
    f:id:kxn4t:20200813162527p:plain:w400

  2. キーワードでGroupByされた合計金額と、折半金額が出力される
    f:id:kxn4t:20200813162641p:plain:w400
    キーワードに一致しないレコードは別途出力されるので、確認してZaimにて修正する

  3. 必要に応じてSlackへ通知する
    こんな通知がくる
    f:id:kxn4t:20200813162119p:plain:w300

  4. おかねをわたす
    f:id:kxn4t:20200813163214p:plain:w200

言語・フレームワーク
  • Kotlin
  • Spring boot

以前はJavaで書いていたんですが、SpringもKotlinに対応したので、全部Kotlinで書き直してみました。

Kotlin

あらためてKotlin最高ってなりました。
久しぶりに書いてみて、この2点が特に書き味が良いポイントかなと思いました。

コレクション操作

Java8でだいぶ楽にはなったけど、Kotlinのほうが直感的な気がする。
stream()ってムズカシイ。。

// キーワード毎に合計する
val sumResults = mutableMapOf<String, Int>()
condition.keyword.forEach { keyword ->
        sumResults[keyword] = calculateSource.filter { it.comment == keyword }.sumBy { it.amount }
}
拡張関数と拡張プロパティ
拡張関数

日付とかのパースとかってくそ面倒だけど、こう書ける。

fun String.toLocalDate(dateTimeFormatter: DateTimeFormatter): LocalDate {
    return LocalDate.parse(this, dateTimeFormatter)
}

val date: LocalDate = "2000-09-23".toLocalDate(formatter)

日付の比較とかも楽になれる

fun LocalDate.between(from: LocalDate, to: LocalDate): Boolean {
    return !(from.isAfter(this) || to.isBefore(this))
}
// 入力された日付が期間内か
val bool = inputDate.toLocalDate(formatter).between(fromDate, toDate)
拡張プロパティ

例えば、出力用にフォーマットを整えたいとき、こんなふうに書ける。

val Int.displayFormat get() = String.format("%,8d", this)

println(3000.displayFormat) // "   3,000"

さいごに

Kotlinでいろいろ書き直してだいぶスッキリしたので、これから共同開発もよりスムーズにできるようになりそうです。

我が家は2人ともWebエンジニアなので他にも面倒なことはシステムでやるようにしています。

  • 予定の共有はGoogleカレンダー
    • お互いのカレンダーになにか追加されたらLINEに通知して、予定の言った言わないがないように
  • 引っ越しなどの大型プロジェクトはBacklogで管理
    • 家具の配置はCacooで作成
  • 買い物リストはTrelloで管理
  • 諸々の通知はSlackとLINEへ

これからもどんどん面倒なことはシステムに押し付けていくようにしていきたいと思います。

github.com