From f32fb5aad12430e8654954c2437e37271391be90 Mon Sep 17 00:00:00 2001 From: Bel LaPointe Date: Mon, 13 Jul 2020 14:55:20 -0600 Subject: [PATCH] Impl uccu --- bank.go | 3 +++ scrape.go | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/bank.go b/bank.go index e595485..fe3d8cc 100755 --- a/bank.go +++ b/bank.go @@ -5,6 +5,7 @@ type Bank int const ( Chase Bank = iota + 1 Citi Bank = iota + 1 + UCCU Bank = iota + 1 ) func (b Bank) String() string { @@ -13,6 +14,8 @@ func (b Bank) String() string { return "Chase" case Citi: return "Citi" + case UCCU: + return "UCCU" } return "?" } diff --git a/scrape.go b/scrape.go index ca5e4a3..fa9c8de 100755 --- a/scrape.go +++ b/scrape.go @@ -7,6 +7,7 @@ import ( "io/ioutil" "net/mail" "regexp" + "strconv" "strings" ) @@ -16,6 +17,7 @@ type scraper interface { type chaseScraper struct{} type citiScraper struct{} +type uccuScraper struct{} func Scrape(m *mail.Message) ([]*Transaction, error) { scraper, err := buildScraper(m) @@ -37,6 +39,9 @@ func buildScraper(m *mail.Message) (scraper, error) { if strings.Contains(from, "Citi") { return newCitiScraper(), nil } + if strings.Contains(from, "Notifications@uccu.com") { + return newUCCUScraper(), nil + } return nil, errors.New("unknown sender: " + from) } @@ -44,6 +49,10 @@ func newChaseScraper() scraper { return &chaseScraper{} } +func newUCCUScraper() scraper { + return &uccuScraper{} +} + func newCitiScraper() scraper { return &citiScraper{} } @@ -144,3 +153,26 @@ func (c *citiScraper) scrape(m *mail.Message) ([]*Transaction, error) { return transactions, nil */ } + +func (c *uccuScraper) scrape(m *mail.Message) ([]*Transaction, error) { + b, err := ioutil.ReadAll(m.Body) + if err != nil { + return nil, err + } + regexp := regexp.MustCompile(`\$([0-9]+,?)+\.[0-9][0-9]`) + match := regexp.Find(b) + if len(match) == 0 { + return nil, fmt.Errorf("no matches found") + } + match = match[1:] + match = bytes.ReplaceAll(match, []byte(","), []byte{}) + f, err := strconv.ParseFloat(string(match), 10) + if err != nil { + return nil, err + } + if !bytes.Contains(b, []byte("credit")) { + f *= -1.0 + } + transaction := NewTransaction(fmt.Sprintf("%.2f", f), "?", fmt.Sprint(m.Header["Date"]), UCCU) + return []*Transaction{transaction}, nil +}