container: hledger-flow: paypal: add uniform quotes

- Allows undesirable characters in variable-text columns
- Related refactoring
This commit is contained in:
2026-02-13 11:32:37 -08:00
parent c650d9bbc9
commit dae2880c06

View File

@@ -2,7 +2,7 @@
# docker-finance | modern accounting for the power-user
#
# Copyright (C) 2021-2025 Aaron Fiore (Founder, Evergreen Crypto LLC)
# Copyright (C) 2021-2026 Aaron Fiore (Founder, Evergreen Crypto LLC)
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -47,10 +47,10 @@ function parse_report()
# Paypal is known to allow commas within description ("Name") and amounts
# NOTE: using custom timezone offset instead of provided timezone
# TODO: refactor xan/sed -> gawk (the sed line should remove non-csv commas and quotations)
xan select "Date,Time,Name,Type,Status,Currency,Amount,Fees,Total,Exchange Rate,Receipt ID,Balance,Transaction ID,Item Title" "$global_in_path" \
| sed -e 's:, : :g' -e 's:,",:,:g' -e 's:,"\([0-9]*\),:,\1:g' -e 's:,"-\([0-9]*\),:,-\1:g' -e 's:"::g' \
| gawk -v global_year="$global_year" -v global_subaccount="$global_subaccount" \
| gawk --csv \
-v global_year="$global_year" \
-v global_subaccount="$global_subaccount" \
'{
if (NR<2 || $1 !~ global_year)
next
@@ -71,32 +71,44 @@ function parse_report()
# Print
printf timestamp OFS # timestamp
# description (Name)
sub(/%/, "%%", $3)
printf $3 OFS # description (Name)
gsub(/"/, "", $3)
printf "\"" $3 "\"" OFS
printf $4 OFS # type
printf $5 OFS # status
printf $6 OFS # currency
printf "\"" $4 "\"" OFS # type
printf "\"" $5 "\"" OFS # status
printf "\"" $6 "\"" OFS # currency
# amount
direction=($7 ~ /^-/ ? "OUT" : "IN")
sub(/^-/, "", $7)
printf $7 OFS # amount
gsub(/,/, "", $7)
printf "\"" $7 "\"" OFS
# fees
sub(/^-/, "", $8)
printf $8 OFS # fees
gsub(/,/, "", $8)
printf "\"" $8 "\"" OFS
# total
sub(/^-/, "", $9)
printf $9 OFS # total
gsub(/,/, "", $9)
printf "\"" $9 "\"" OFS
printf $10 OFS # exchange rate
# exchange rate
gsub(/,/, "", $10)
printf "\"" $10 "\"" OFS
printf $11 OFS # code (Receipt ID)
printf $12 OFS # balance
printf "\"" $11 "\"" OFS # code (Receipt ID)
printf "\"" $12 "\"" OFS # balance
printf $13 OFS # txid (Transaction ID)
printf $13 OFS # txid (Transaction ID)
# title (Item Title)
sub(/%/, "%%", $14)
printf $14 OFS # title (Item Title)
gsub(/"/, "", $14)
printf "\"" $14 "\"" OFS
printf direction OFS
printf global_subaccount OFS
@@ -110,7 +122,7 @@ function parse_report()
# fiat_value
printf "\n"
}' FS=, OFS=, >"$global_out_path"
}' OFS=, >"$global_out_path"
}
# NOTE: crypto transactions CSV, not crypto statement CSV
@@ -122,7 +134,9 @@ function parse_crypto()
# TODO: refactor into gawk after assert_header is fixed
xan select "DateTime,Transaction Type,Asset In (Quantity),Asset In (Currency),Asset Out (Quantity),Asset Out (Currency),Transaction Fee (Quantity),Transaction Fee (Currency),Market Value (USD)" <(tail +4 "$global_in_path") \
| gawk -v global_year="$global_year" -v global_subaccount="$global_subaccount" \
| gawk --csv \
-v global_year="$global_year" \
-v global_subaccount="$global_subaccount" \
'{
if (NR<2 || $1 !~ global_year)
next
@@ -150,16 +164,19 @@ function parse_crypto()
printf OFS # direction
printf global_subaccount OFS
printf $3 OFS # in_value
printf $4 OFS # in_ticker
printf $5 OFS # out_value
printf $6 OFS # out_ticker
printf $7 OFS # tx_fee_value
printf $8 OFS # tx_fee_ticker
printf $3 OFS # in_value
printf "\"" $4 "\"" OFS # in_ticker
printf $5 OFS # out_value
printf "\"" $6 "\"" OFS # out_ticker
printf $7 OFS # tx_fee_value
printf "\"" $8 "\"" OFS # tx_fee_ticker
printf $9 # fiat_value
printf "\n"
}' FS=, OFS=, >"$global_out_path"
}' OFS=, >"$global_out_path"
}
function main()