diff --git a/config.go b/config.go index 9fb6979..f7b3068 100755 --- a/config.go +++ b/config.go @@ -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 { diff --git a/main.go b/main.go index b4d5b63..15ac082 100755 --- a/main.go +++ b/main.go @@ -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) } diff --git a/scrape.go b/scrape.go index fa9c8de..00a50c6 100755 --- a/scrape.go +++ b/scrape.go @@ -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) diff --git a/upload.go b/upload.go index 1e81f22..0041e53 100755 --- a/upload.go +++ b/upload.go @@ -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 time.Format("2006-01-02") + return s }