-
-
Save simonmichael/06eed26bcc85c76d1604373418bc6c58 to your computer and use it in GitHub Desktop.
# XpenseTracker iOS app -> hledger import & reports | |
# | |
# Fetch csv files from XpenseTracker iphone app (requires curl, funzip). | |
# Procedure: | |
# connect phone and computer to same network | |
# make csv | |
# start XpenseTracker app | |
# enter each XpenseTracker log, as prompted on computer | |
# (first time: options, set appropriate CSV fields) | |
# options, export, export | |
# (if phone shows IP different from above, ctrl-c, adjust IP below, redo) | |
# computer prints ok and prompts for next log | |
# | |
PHONEIP=192.168.0.3 | |
# one per XT log | |
CSVFILES=\ | |
2017-business.csv \ | |
2017-personal.csv \ | |
# 2018-business.csv \ | |
# 2018-personal.csv \ | |
JOURNALS=\ | |
2017-business.journal \ | |
2017-personal.journal \ | |
# 2018-business.journal \ | |
# 2018-personal.journal \ | |
REPORTS= \ | |
out/2017-business-is.html \ | |
out/2017-business-is-summary.html \ | |
out/2017-personal-is.html \ | |
out/2017-personal-is-summary.html \ | |
out/2017-business-is.csv \ | |
out/2017-business-is-summary.csv \ | |
out/2017-personal-is.csv \ | |
out/2017-personal-is-summary.csv \ | |
REPORTOPTS=-MAT --flat --drop 1 | |
REPORTOPTSSUMMARY=$(REPORTOPTS) depth:2 | |
.PHONY: $(CSVFILES) $(JOURNALS) $(REPORTS) | |
default: journals reports open | |
# FETCH CSV | |
csv: $(CSVFILES) | |
CURLOPTS=-s #--connect-timeout 1 | |
# Fetch, unzip, clean space-terminated account names, report success/failure | |
$(CSVFILES): | |
@echo "waiting for $(@:.csv= log) from $(PHONEIP) ..." | |
@(curl $(CURLOPTS) 'http://$(PHONEIP):8080/XT Export.zip' | funzip >$@.tmp 2>/dev/null && echo ok || (echo failed; false)) \ | |
&& (mv $@.tmp $@ && perl -pi -e 's/ :/:/' $@) \ | |
|| rm -f $@.tmp | |
# CONVERT ALL TXNS TO JOURNAL | |
journals: $(JOURNALS) | |
# recreate journal from csv, and include corresponding accounts file | |
$(JOURNALS): | |
[[ -x $@ ]] || printf "# converted from $(@:.journal=.csv)\n\ninclude $(@:.journal=.accounts)\n\n" > $@ | |
hledger -f $(@:.journal=.csv) print >> $@ | |
# IMPORT NEW TXNS TO JOURNAL | |
# # make 2018-business-import: import new csv txns to this journal | |
# %-import: | |
# hledger import -f $*.journal $*.csv | |
# # YEAR-import-dry: convert YEAR csv and show new transactions | |
# %-import-dry: | |
# hledger import -f $*.journal $**.csv --dry-run | |
# # YEAR-import-dry-watch: convert YEAR csv and show first N new transactions, repeatedly | |
# %-import-dry-watch: | |
# ls $**.csv* | entr bash -c "echo; date; echo; hledger import -f $*.journal $**.csv --dry-run | head -20" | |
# # YEAR-import-unknowns-watch: convert YEAR csv and show uncategorised new transactions, repeatedly | |
# %-import-unknowns-watch: | |
# ls $**.csv* | entr bash -c "echo; date; echo; hledger import -f $*.journal $**.csv --dry-run | hledger -I -f- print unknown" | |
# GENERATE CSV REPORTS FROM CSV | |
# # Generate per-log csv income statement reports from csv and open in Numbers. | |
# reports-from-csv: \ | |
# 2017-business-monthly-is.csv \ | |
# 2017-personal-monthly-is.csv \ | |
# 2017-%-monthly-is.csv: #2017-$*.csv | |
# hledger -f 2017-$*.csv bal -M ^income ^expenses depth:2 -o $@ && open -a Numbers $@ | |
# GENERATE CSV REPORTS FROM JOURNAL | |
# # Generate csv income statement reports from journals and open in Numbers. | |
# %-is.csv: #$*.journal | |
# hledger -f $*.journal is -M depth:2 -o $@ && open -a Numbers $@ | |
# # hledger -f $*.journal bal ^income ^expenses -M depth:2 -o $@ && open -a Numbers $@ | |
# GENERATE REPORTS FROM JOURNAL | |
reports: $(REPORTS) | |
# Generate per-year html income statement reports from journals | |
#$(REPORTS): | |
out/2017-business-is.html \ | |
out/2017-personal-is.html: | |
hledger -f $(subst out/,,$(@:-is.html=.journal)) is -o $@ $(REPORTOPTS) | |
#%-summary.html: | |
out/2017-business-is-summary.html \ | |
out/2017-personal-is-summary.html: | |
hledger -f $(subst out/,,$(subst -is-summary.html,.journal,$@)) is -o $@ $(REPORTOPTSSUMMARY) | |
out/2017-business-is.csv \ | |
out/2017-personal-is.csv: | |
hledger -f $(subst out/,,$(@:-is.csv=.journal)) is -o $@ $(REPORTOPTS) | |
out/2017-business-is-summary.csv \ | |
out/2017-personal-is-summary.csv: | |
hledger -f $(subst out/,,$(subst -is-summary.csv,.journal,$@)) is -o $@ $(REPORTOPTSSUMMARY) | |
# BROWSE HTML REPORTS | |
open: | |
open $(REPORTS) | |
# MISC | |
clean: | |
rm -f $(JOURNALS) | |
rm -f $(REPORTS) | |
I tried it out for a little while only. I've never used the phone consistently for expense tracking. Once in a while when it's the best option for remembering eg cash transactions till I get to the laptop, I'll jot them down in the notepad.
My workflow is to shoot a photo on the spot, 'forward' it to a CASH YYYY-MM-DD
Note in iOS Notes (you can select an existing note when forwarding, making it possible to have one note with multiple photos), and later for each day/note, create a PDF which I can put in my cash statements directory. Since I use hledger-flow, there are some extension points for additional steps (OCR, extracting PDF images into individual images again, etc..). I still have to look at each image and type the entries manually in a CSV file, but I'm hoping to use Google Cloud Vision OCR to help with that later as well, just haven't found an easy command-line way to interface with it.
Is XpenseTracker still your goto app for expense tracking?