aboutsummaryrefslogtreecommitdiff
path: root/quickLedger.sh
diff options
context:
space:
mode:
Diffstat (limited to 'quickLedger.sh')
-rwxr-xr-xquickLedger.sh105
1 files changed, 105 insertions, 0 deletions
diff --git a/quickLedger.sh b/quickLedger.sh
new file mode 100755
index 0000000..88f410f
--- /dev/null
+++ b/quickLedger.sh
@@ -0,0 +1,105 @@
+#!/bin/sh
+
+# quickLedger.sh: Quickly create a new entry for ledger
+#
+# Usage: quickLedger.sh [-t] [-f LEDGER_FILE] [-r REMOTE_LEDGER_FILE] [-c CURRENCY_SYMBOL]
+
+usageMessage='Usage: quickLedger.sh [-d] [-f LEDGER_FILE] [-r REMOTE_LEDGER_FILE] [-c CURRENCY_SYMBOL]'
+
+ledgerFile="$LEDGER_FILE"
+remoteLedgerFile="$REMOTE_LEDGER_FILE"
+currencySymbol='€'
+debug=''
+
+# $1: message
+# $2: exit code
+fatalError() {
+ printf "Error: $1" 1>&2
+ exit "$2"
+}
+
+organizeLines() {
+ sort | uniq -c | sort -nr | sed 's/^\s*[0-9]* //'
+}
+
+getPayee() {
+ grep '^\w' "$ledgerFile" | cut -d' ' -f2- | organizeLines | fzf --prompt 'Payee: '
+}
+
+# $1: fzf prompt
+getAccount() {
+ grep '^\s' "$ledgerFile" | awk '{print $1}' | organizeLines | fzf --prompt "$1" --no-clear
+}
+
+getComment() {
+ grep -o ';.*$' "$ledgerFile" | organizeLines | fzf --prompt "Comment: "
+}
+
+getAmount() {
+ read amount
+ while ! echo "$amount" | grep -Eq '[0-9]+(\.[0-9][0-9])?'; do
+ read amount
+ done
+ echo "$amount" | grep -Fq '.' || amount="${amount}.00"
+ amount="${amount}${currencySymbol}"
+ echo "$amount"
+}
+
+getTransaction() {
+ printf '%s %s\n\t%s\t%s\t%s\n\t%s\n' "$date" "$payee" "$targetAccount" "$amount" "$comment" "$originAccount"
+}
+
+# Process options
+while getopts ':tf:r:c:' opt; do
+ case $opt in
+
+ 't' )
+ debug='y' ;;
+
+ 'f' )
+ ledgerFile="$OPTARG" ;;
+
+ 'r' )
+ remoteLedgerFile="$OPTARG" ;;
+
+ 'c' )
+ currencySymbol="$OPTARG" ;;
+
+ '?' )
+ printf "${usageMessage}\n"
+ exit 1
+
+ esac
+done
+shift $(($OPTIND - 1))
+
+[ -z "$ledgerFile" ] &&
+ fatalError 'No ledger file. Set ledger file as $LEDGER_FILE or with -f option.\n' 2
+[ ! -f "$ledgerFile" ] && fatalError "No file [${ledgerFile}] found to use as ledger.\n" 3
+
+targetAccount="$(getAccount 'Target account: ')"
+[ -z "$targetAccount" ] && tput rmcup && exit 0
+originAccount="$(getAccount 'Origin account: ')"
+[ -z "$originAccount" ] && tput rmcup && exit 0
+
+payee="$(getPayee)"
+
+printf 'Amount: '
+amount="$(getAmount)"
+[ -z "$amount" ] && exit 0
+
+comment="$(getComment)"
+
+date="$(date '+%Y/%m/%d')"
+
+getTransaction
+
+printf 'Correct? [Yn]: '
+read correct
+[ "$correct" = "n" ] && exit 0
+
+[ -n "$debug" ] && exit 0
+
+echo >> "$ledgerFile"
+getTransaction >> "$ledgerFile"
+rsync -t "$ledgerFile" "$remoteLedgerFile" || fatalError 'rsync failed.' 4