about summary refs log tree commit diff
path: root/tools/monzo_ynab/main.go
diff options
context:
space:
mode:
authorWilliam Carroll <wpcarro@gmail.com>2020-07-20T09·15+0100
committerWilliam Carroll <wpcarro@gmail.com>2020-07-20T09·15+0100
commit5add8ddc13be3a7a5fbb6deb3f70cb18594f8750 (patch)
treebd36fd690f6765e6a270b7ad71fe3bf7a4266091 /tools/monzo_ynab/main.go
parent4ed3254709263abf3aaa1e9469968c6be9615948 (diff)
Move monzo_ynab into //tools
Optimizing is difficult: I like flat hierarchies because I don't like
directory-hopping, but I also would like a cleaner root for my mono-repo. Bombs
away!

Well it's that time again, folks: spring cleaning!

Here I am musing about a few things that bother me:
- Should I use kebab-case or snake_case?
- It feels ~confusing to have //tools and //utils. What a //projects? Isn't
  everything a project? *sigh*
Diffstat (limited to 'tools/monzo_ynab/main.go')
-rw-r--r--tools/monzo_ynab/main.go43
1 files changed, 43 insertions, 0 deletions
diff --git a/tools/monzo_ynab/main.go b/tools/monzo_ynab/main.go
new file mode 100644
index 000000000000..06f1944eab70
--- /dev/null
+++ b/tools/monzo_ynab/main.go
@@ -0,0 +1,43 @@
+// Exporting Monzo transactions to my YouNeedABudget.com (i.e. YNAB)
+// account. YNAB unfortunately doesn't currently offer an Monzo integration. As
+// a workaround and a practical excuse to learn Go, I decided to write one
+// myself.
+//
+// This job is going to run N times per 24 hours. Monzo offers webhooks for
+// reacting to certain types of events. I don't expect I'll need realtime data
+// for my YNAB integration. That may change, however, so it's worth noting.
+
+package main
+
+import (
+	"fmt"
+)
+
+var (
+	ynabAccountID = os.Getenv("ynab_account_id")
+)
+
+////////////////////////////////////////////////////////////////////////////////
+// Business Logic
+////////////////////////////////////////////////////////////////////////////////
+
+// Convert a Monzo transaction struct, `tx`, into a YNAB transaction struct.
+func toYnab(tx monzoSerde.Transaction) ynabSerde.Transaction {
+	return ynabSerde.Transaction{
+		Id: tx.Id,
+		Date: tx.Created,
+		Amount: tx.Amount,
+		Memo: tx.Notes,
+		AccountId: ynabAccountID,
+	}
+}
+
+func main() {
+	txs := monzo.TransactionsLast24Hours()
+	var ynabTxs []ynabSerde.Transaction{}
+	for tx := range txs {
+		append(ynabTxs, toYnab(tx))
+	}
+	ynab.PostTransactions(ynabTxs)
+	os.Exit(0)
+}