diff --git a/scrape.go b/scrape.go index d719c78..ca5e4a3 100755 --- a/scrape.go +++ b/scrape.go @@ -84,41 +84,63 @@ func (c *chaseScraper) scrape(m *mail.Message) ([]*Transaction, error) { } func (c *citiScraper) scrape(m *mail.Message) ([]*Transaction, error) { + date := fmt.Sprint(m.Header["Date"]) b, err := ioutil.ReadAll(m.Body) if err != nil { return nil, err } - targetLineRegexp := regexp.MustCompile(`Account #: XXXX[0-9]{4} .*`) - targetMatches := targetLineRegexp.FindAll(b, -1) - if len(targetMatches) == 0 { - return nil, errors.New("no lines with transactions found") + re := regexp.MustCompile(`Citi Alert: A \$[0-9][0-9]*\.[0-9][0-9] transaction was made at .* on card ending in`) + match := re.Find(b) + if len(match) == 0 { + return nil, nil } - results := make(map[string][]string) - for _, b := range targetMatches { - // Account #: XXXX3837 $137.87 at AMZN Mktp US Amzn.com/bill WA on 04/03/2020, 09:05 PM ET - regexp := regexp.MustCompile(`Account #: XXXX[0-9]{4} \$(?P[0-9]+\.[0-9]*) at (?P[^,]*)`) - matches := regexp.FindSubmatch(b) - if len(matches) < 2 { - return nil, fmt.Errorf("no full matches found: %s", b) + rePrice := regexp.MustCompile(`[0-9][0-9]*\.[0-9][0-9]`) + price := rePrice.Find(match) + + vendor := bytes.Split(bytes.Split(match, []byte(" on card ending in"))[0], []byte("transaction was made at "))[1] + + transaction := NewTransaction(string(price), string(vendor), date, Citi) + + return []*Transaction{transaction}, nil + //Citi Alert: A $598.14 transaction was made at REMIX MUSIC SPRINGDA on card ending in 3837 + /* + b, err := ioutil.ReadAll(m.Body) + if err != nil { + return nil, err } - for i, name := range regexp.SubexpNames() { - if i != 0 && name != "" { - if name == "account" { - matches[i] = bytes.Split(matches[i], []byte(" on "))[0] + targetLineRegexp := regexp.MustCompile(`Account #: XXXX[0-9]{4} .*`) + targetMatches := targetLineRegexp.FindAll(b, -1) + if len(targetMatches) == 0 { + return nil, errors.New("no lines with transactions found") + } + + results := make(map[string][]string) + for _, b := range targetMatches { + // Account #: XXXX3837 $137.87 at AMZN Mktp US Amzn.com/bill WA on 04/03/2020, 09:05 PM ET + regexp := regexp.MustCompile(`Account #: XXXX[0-9]{4} \$(?P[0-9]+\.[0-9]*) at (?P[^,]*)`) + matches := regexp.FindSubmatch(b) + if len(matches) < 2 { + return nil, fmt.Errorf("no full matches found: %s", b) + } + for i, name := range regexp.SubexpNames() { + if i != 0 && name != "" { + if name == "account" { + matches[i] = bytes.Split(matches[i], []byte(" on "))[0] + } + results[name] = append(results[name], string(matches[i])) } - results[name] = append(results[name], string(matches[i])) + } + if len(results) != 2 || len(results["amount"]) != len(results["account"]) { + return nil, fmt.Errorf("unexpected matches found looking for transactions: %+v", results) } } - if len(results) != 2 || len(results["amount"]) != len(results["account"]) { - return nil, fmt.Errorf("unexpected matches found looking for transactions: %+v", results) + + transactions := make([]*Transaction, len(results["amount"])) + for i := range results["amount"] { + transactions[i] = NewTransaction(results["amount"][i], results["account"][i], fmt.Sprint(m.Header["Date"]), Citi) } - } - transactions := make([]*Transaction, len(results["amount"])) - for i := range results["amount"] { - transactions[i] = NewTransaction(results["amount"][i], results["account"][i], fmt.Sprint(m.Header["Date"]), Citi) - } - - return transactions, nil + return transactions, nil + */ } diff --git a/transaction_test.go b/transaction_test.go old mode 100644 new mode 100755