brightfunds: Add importer for new CSV format.
This commit is contained in:
		
							parent
							
								
									347203b5f4
								
							
						
					
					
						commit
						c13ddd1274
					
				
					 3 changed files with 86 additions and 27 deletions
				
			
		| 
						 | 
				
			
			@ -1,40 +1,68 @@
 | 
			
		|||
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',
 | 
			
		||||
    }
 | 
			
		||||
    NAME_KEYS = ['company_name', 'donor_name', 'on_behalf_of']
 | 
			
		||||
 | 
			
		||||
    def _cell_is_blank(self, value):
 | 
			
		||||
        return value == '-' or not value
 | 
			
		||||
    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'
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										3
									
								
								tests/data/BrightFunds.csv
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								tests/data/BrightFunds.csv
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,3 @@
 | 
			
		|||
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
 | 
			
		||||
		
		
			
  | 
| 
						 | 
				
			
			@ -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:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue