Changeset - c13ddd12746b
[Not reviewed]
0 2 1
Brett Smith - 4 years ago 2020-11-09 21:58:19
brettcsmith@brettcsmith.org
brightfunds: Add importer for new CSV format.
3 files changed with 87 insertions and 28 deletions:
0 comments (0 inline, 0 general)
import2ledger/importers/brightfunds.py
Show inline comments
 
import collections
 

	
 
from . import _csv
 
from . import _xls
 
from .. import strparse
 

	
 
class DonorReportImporter(_xls.XLSImporterBase):
 
    BOOK_KWARGS = {'encoding_override': 'utf-8'}
 
class _BrightFundsMixin:
 
    DATE_FMT = '%m/%d/%y'
 
    ENTRY_SEED = {'currency': 'USD'}
 
    NEEDED_FIELDS = frozenset(['Created', 'Amount'])
 
    COPIED_FIELDS = {
 
        'Company Name': 'company_name',
 
        'Donor Name': 'donor_name',
 
        'Donor Email': 'donor_email',
 
        'On Behalf Of': 'on_behalf_of',
 
        'Designation': 'designation',
 
        'Fund': 'fund',
 
        'Type': 'type',
 
    }
 

	
 
    def _cell_is_blank(self, value):
 
        return value == '-' or not value
 
    NAME_KEYS = ['company_name', 'donor_name', 'on_behalf_of']
 

	
 
    DATE_FIELD = 'Date'
 
    DONOR_FIELD = 'Name'
 
    EMAIL_FIELD = 'Email'
 
    TYPE_FIELD = 'Donation Type'
 

	
 
    def __init_subclass__(cls):
 
        cls.FIELDS_TO_COPY = {
 
            'Company Name': 'company_name',
 
            'On Behalf Of': 'on_behalf_of',
 
            'Designation': 'designation',
 
            'Fund': 'fund',
 
            cls.DONOR_FIELD: 'donor_name',
 
            cls.EMAIL_FIELD: 'donor_email',
 
            cls.TYPE_FIELD: 'type',
 
        }
 
        cls.NEEDED_FIELDS = frozenset(['Amount', cls.DATE_FIELD, *cls.FIELDS_TO_COPY])
 

	
 
    def _get_value(self, value):
 
        return '' if (value == '-' or not value) else value
 

	
 
    def _read_row(self, row):
 
        if any(self._cell_is_blank(row[key]) for key in self.NEEDED_FIELDS):
 
        if not (row['Amount'] and row[self.DATE_FIELD]):
 
            return None
 
        names = [row[key] for key in ['Company Name', 'Donor Name', 'On Behalf Of']
 
                 if not self._cell_is_blank(row[key])]
 
        entry_data = {
 
            entry_key: self._get_value(row[row_key])
 
            for row_key, entry_key in self.FIELDS_TO_COPY.items()
 
        }
 
        print(entry_data, row['Amount'])
 
        names = []
 
        for key in self.NAME_KEYS:
 
            name = entry_data[key].strip()
 
            entry_data[key] = name
 
            if name:
 
                names.append(name)
 
        try:
 
            corporation, payee, *_ = names
 
        except ValueError:
 
            corporation = names[0]
 
            payee = corporation
 
        entry_data = {
 
            'amount': '{:.2f}'.format(row['Amount']),
 
            'corporation': corporation,
 
            'date': strparse.date(row['Created'], '%m/%d/%Y'),
 
            'payee': payee,
 
        }
 
        entry_data.update((entry_key, '')
 
                          for row_key, entry_key in self.COPIED_FIELDS.items()
 
                          if self._cell_is_blank(row[row_key]))
 
        entry_data['amount'] = str(row['Amount'])
 
        entry_data['corporation'] = corporation
 
        entry_data['date'] = strparse.date(row[self.DATE_FIELD], self.DATE_FMT)
 
        entry_data['payee'] = payee
 
        return entry_data
 

	
 

	
 
class DonorReportImporter(_BrightFundsMixin, _csv.CSVImporterBase):
 
    pass
 

	
 

	
 
class DonorReportXLSImporter(_BrightFundsMixin, _xls.XLSImporterBase):
 
    BOOK_KWARGS = {'encoding_override': 'utf-8'}
 
    DATE_FMT = '%m/%d/%Y'
 
    DATE_FIELD = 'Created'
 
    DONOR_FIELD = 'Donor Name'
 
    EMAIL_FIELD = 'Donor Email'
 
    TYPE_FIELD = 'Type'
tests/data/BrightFunds.csv
Show inline comments
 
new file 100644
 
Date,Disbursement ID,Name,Fund,Amount,Designation,On Behalf Of,Email,Company Name,Donation Type
 
10/01/20,123456,Company ,,15,,Employed Person,,Company,MatchingTransaction
 
09/24/20,123456,Employed Person ,,15,,-,person@example.com,Company,CreditCardTransaction
tests/data/imports.yml
Show inline comments
...
 
@@ -686,7 +686,7 @@
 
      ledger template: benevity donations ledger entry
 

	
 
- source: BrightFunds.xls
 
  importer: brightfunds.DonorReportImporter
 
  importer: brightfunds.DonorReportXLSImporter
 
  expect:
 
    - date: !!python/object/apply:datetime.date [2017, 10, 20]
 
      currency: USD
...
 
@@ -701,6 +701,34 @@
 
      on_behalf_of: Dakota Smith
 
      type: Matched Donation
 

	
 
- source: BrightFunds.csv
 
  importer: brightfunds.DonorReportImporter
 
  expect:
 
    - date: !!python/object/apply:datetime.date [2020, 10, 01]
 
      currency: USD
 
      amount: !!python/object/apply:decimal.Decimal [15]
 
      payee: Company
 
      corporation: Company
 
      company_name: Company
 
      designation: ""
 
      donor_name: Company
 
      donor_email: ""
 
      fund: ""
 
      on_behalf_of: Employed Person
 
      type: MatchingTransaction
 
    - date: !!python/object/apply:datetime.date [2020, 9, 24]
 
      currency: USD
 
      amount: !!python/object/apply:decimal.Decimal [15]
 
      payee: Employed Person
 
      corporation: Company
 
      company_name: Company
 
      designation: ""
 
      donor_name: Employed Person
 
      donor_email: person@example.com
 
      fund: ""
 
      on_behalf_of: ""
 
      type: CreditCardTransaction
 

	
 
- source: OReillyRoyalties.csv
 
  importer: oreilly.RoyaltiesImporter
 
  expect:
0 comments (0 inline, 0 general)