write banks diff for ledger, filter by bank

master
bel 2021-07-29 22:50:17 -06:00
parent bbd51ea9c5
commit c5c77a2b9b
4 changed files with 24 additions and 14 deletions

View File

@ -33,6 +33,7 @@ type Config struct {
TodoTag string
Uploader Uploader
Storage storage.DB
Banks map[Bank]bool
}
var config Config
@ -51,6 +52,7 @@ func NewConfig() Config {
as.Append(args.STRING, "todotoken", "todo token", "")
as.Append(args.STRING, "todolist", "todo list", "")
as.Append(args.STRING, "todotag", "todo tag", "expense")
as.Append(args.STRING, "banks", "uccu,citi,chase", "uccu,citi,chase")
as.Append(args.STRING, "authaddr", "auth addr", "https://auth.remote.blapointe.com")
as.Append(args.STRING, "store", "store type", "map")
@ -81,6 +83,11 @@ func NewConfig() Config {
TodoTag: as.GetString("todotag"),
Storage: storage,
Uploader: ul,
Banks: map[Bank]bool{
Chase: strings.Contains(strings.ToLower(as.GetString("banks")), strings.ToLower(Chase.String())),
Citi: strings.Contains(strings.ToLower(as.GetString("banks")), strings.ToLower(Citi.String())),
UCCU: strings.Contains(strings.ToLower(as.GetString("banks")), strings.ToLower(UCCU.String())),
},
}
if config.Uploader == UploaderTodo {

View File

@ -17,7 +17,7 @@ func main() {
panic(err)
}
for email := range emails {
transactions, err := Scrape(email)
transactions, err := Scrape(email, config.Banks)
if err != nil {
log.Println("failed to scrape email:", err)
}

View File

@ -19,27 +19,27 @@ type chaseScraper struct{}
type citiScraper struct{}
type uccuScraper struct{}
func Scrape(m *mail.Message) ([]*Transaction, error) {
scraper, err := buildScraper(m)
func Scrape(m *mail.Message, banks map[Bank]bool) ([]*Transaction, error) {
scraper, err := buildScraper(m, banks)
if err != nil {
return nil, err
}
return scraper.scrape(m)
}
func buildScraper(m *mail.Message) (scraper, error) {
func buildScraper(m *mail.Message, banks map[Bank]bool) (scraper, error) {
subject := fmt.Sprint(m.Header["Subject"])
if !containsAny(subject, "transaction", "report", "Transaction") {
return nil, errors.New("cannot build scraper for subject " + subject)
}
from := fmt.Sprint(m.Header["From"])
if strings.Contains(from, "Chase") {
if strings.Contains(from, "Chase") && banks[Chase] {
return newChaseScraper(), nil
}
if strings.Contains(from, "Citi") {
if strings.Contains(from, "Citi") && banks[Citi] {
return newCitiScraper(), nil
}
if strings.Contains(from, "Notifications@uccu.com") {
if strings.Contains(from, "Notifications@uccu.com") && banks[UCCU] {
return newUCCUScraper(), nil
}
return nil, errors.New("unknown sender: " + from)

View File

@ -5,7 +5,6 @@ import (
"fmt"
"io/ioutil"
"local/oauth2"
"log"
"net/http"
"net/url"
"os"
@ -63,16 +62,20 @@ func uploadLedger(config Config, transaction *Transaction) error {
}
remote += strings.ReplaceAll(transaction.Account, " ", "")
fmt.Fprintf(f, "%-50s%-s\n", formatGMailDate(transaction.Date), transaction.Account)
fmt.Fprintf(f, "%-50s%-50s$%.2f\n", "", transaction.Bank, amount)
fmt.Fprintf(f, "%-50s%-50s$%.2f\n", "", "AssetAccount:"+transaction.Bank.String(), amount)
fmt.Fprintf(f, "%-50s%-s\n", "", remote)
return nil
}
func formatGMailDate(s string) string {
time, err := time.Parse("[Mon, 2 Jan 2006 15:04:05 -0700 (MST)]", s)
if err != nil {
log.Println(s, err)
return s
}
for _, format := range []string{
"[Mon, 2 Jan 2006 15:04:05 -0700 (MST)]",
"[Mon, 2 Jan 2006 15:04:05 -0700]",
} {
time, err := time.Parse(format, s)
if err == nil {
return time.Format("2006-01-02")
}
}
return s
}