yourcause: New importer.

This commit is contained in:
Brett Smith 2019-02-25 12:39:19 -05:00
parent a607ff8d11
commit 44762555d5
5 changed files with 211 additions and 1 deletions

View file

@ -344,6 +344,47 @@ Stripe
retried_payout_net Decimal from the corresponding CSV column
========================== ==============================================
YourCause
^^^^^^^^^
``yourcause donations ledger entry``
Imports one transaction per row in YourCause's donations report CSV.
This template can use these variables:
================= ==========================================================
Name Contents
================= ==========================================================
comment The comment from the donor
----------------- ----------------------------------------------------------
corporation The name of the participating corporation
----------------- ----------------------------------------------------------
dedication Text from the corresponding CSV column
----------------- ----------------------------------------------------------
dedication_type Text from the corresponding CSV column
----------------- ----------------------------------------------------------
designation Text from the corresponding CSV column
----------------- ----------------------------------------------------------
donor Name of the individual who donated
----------------- ----------------------------------------------------------
donor_amount The amount donated by the individual donor named
----------------- ----------------------------------------------------------
match_amount The amount of the donation match by the participating
corporation
----------------- ----------------------------------------------------------
original_amount The amount of the original donation in the original
currency
----------------- ----------------------------------------------------------
original_currency The local currency the original donation was made in
----------------- ----------------------------------------------------------
payment_id The ID of the payment from YourCause that includes this
donation
----------------- ----------------------------------------------------------
received_amount Decimal from the corresponding CSV column
----------------- ----------------------------------------------------------
transaction_id The ID of this donation from YourCause
================= ==========================================================
Other output options
~~~~~~~~~~~~~~~~~~~~

View file

@ -0,0 +1,79 @@
import decimal
try:
import enum
except ImportError:
import enum34 as enum
from . import _csv
from .. import strparse
ZERO_DECIMAL = decimal.Decimal(0)
class _DonorType(enum.Enum):
Individual = 1
Company = 2
@classmethod
def from_donation_type(cls, donation_type):
if donation_type.startswith('Individual-'):
return cls.Individual
elif donation_type.startswith('Employer Match-'):
return cls.Company
else:
raise ValueError("unknown donation type {!r}".format(donation_type))
class DonationsImporter(_csv.CSVImporterBase):
ANONYMOUS = "Anonymous"
DATE_FMT = '%m/%d/%Y %I:%M:%S %p'
DONATION_TYPE_FIELD = 'Donation Type'
ENTRY_SEED = {
'currency': 'USD',
'donor_amount': ZERO_DECIMAL,
'match_amount': ZERO_DECIMAL,
}
DECIMAL_FIELDS = {
'Local Currency Receipt Amount': 'original_amount',
'Received Amount': 'received_amount',
'Transaction Amount': 'amount',
}
NEEDED_FIELDS = frozenset([
DONATION_TYPE_FIELD,
'Donor First Name',
'Donor Last Name',
'Match Donor First Name',
'Match Donor Last Name',
*DECIMAL_FIELDS,
])
COPIED_FIELDS = {
'Company_Name': 'corporation',
'Dedication Type': 'dedication_type',
'Dedication': 'dedication',
'Designation': 'designation',
'Local Currency Type': 'original_currency',
'Payment ID': 'payment_id',
'Transaction_ID': 'transaction_id',
}
def _donor_name(self, row, *keys):
names = [row[key] for key in keys]
if any(s and s != self.ANONYMOUS for s in names):
return ' '.join(names).strip()
else:
return self.ANONYMOUS
def _read_row(self, row):
donor_type = _DonorType.from_donation_type(row[self.DONATION_TYPE_FIELD])
retval = {retkey: strparse.currency_decimal(row[rowkey])
for rowkey, retkey in self.DECIMAL_FIELDS.items()}
retval['date'] = strparse.date(row['Donation_Date'], self.DATE_FMT)
if donor_type is _DonorType.Individual:
retval['donor'] = self._donor_name(row, 'Donor First Name', 'Donor Last Name')
retval['donor_amount'] = retval['amount']
retval['payee'] = retval['donor']
else:
retval['donor'] = self._donor_name(row, 'Match Donor First Name', 'Match Donor Last Name')
retval['match_amount'] = retval['amount']
retval['payee'] = row['Company_Name']
return retval

View file

@ -30,7 +30,7 @@ REQUIREMENTS['tests_require'] = [
setup(
name='import2ledger',
description="Import different sources of financial data to Ledger",
version='0.7.0',
version='0.8.0',
author='Brett Smith',
author_email='brettcsmith@brettcsmith.org',
license='GNU AGPLv3+',

6
tests/data/YourCause.csv Normal file
View file

@ -0,0 +1,6 @@
Donation_Date,Company_Name,Transaction_ID,Donation Type,Transaction Amount,Received Amount,Is Disbursed?,Payment ID,Payment Create Date,Payment Status Date,Payment Status,Donor Type,Donor ID,Donor First Name,Donor Last Name,Donor Full Name,Donor Email Address,Donor Address,Donor Address2,Donor City,Donor State/Province/Region,Donor Postal Code,Donor Country,Match Donor ID,Match Donor First Name,Match Donor Last Name,Dedication Type,Dedication,Designation,Registration ID,Designated Charity Name,Donation Status,Alternate Recognition Name,Segment Name,Local Currency Receipt Amount,Local Currency Type
12/20/2018 1:13:00 PM,Company A,2-34567891,Individual-Credit Card,12,12,TRUE,10006789,01/22/2019 5:46:00 PM,,Outstanding,Individual,E1,Dakota,Smith,Dakota Smith,ds@example.com,123 Any Street,,Anytown,Maine,01234,US,,,,,,Note,410123456,Test Charity,Disbursed,,US Segment,12,USD
12/31/2018 10:17:00 PM,Company B,2-34567893,Individual-Credit Card,14,14,TRUE,10006789,01/22/2019 5:46:00 PM,,Outstanding,Individual,E2,,,,,,,,,,,,,,,,,410123456,Test Charity,Disbursed,,US Segment,14,USD
12/20/2018 1:13:00 PM,Company A,2-34567895,Employer Match-Credit Card Match,12,12,TRUE,10006789,01/22/2019 5:46:00 PM,,Outstanding,Company,C1,,,Company A,,,,,,,,E1,Dakota,Smith,,,Note,410123456,Test Charity,Disbursed,,US Segment,12,USD
12/31/2018 10:17:00 PM,Company B,2-34567897,Employer Match-Credit Card,14,14,TRUE,10006789,01/22/2019 5:46:00 PM,,Outstanding,Individual,E2,,,,,,,,,,,,,,,,,410123456,Test Charity,Disbursed,,US Segment,14,USD
12/15/2018 10:17:00 AM,Company C,2-34567899,Individual-Credit Card,12.50000,12.50000,TRUE,10006789,01/22/2019 5:46:00 PM,,Outstanding,Individual,E3,Alex,Jones,Alex Jones,,,,,,,,,,,,,,410123456,Test Charity,Disbursed,,US Segment,10,GBP
1 Donation_Date Company_Name Transaction_ID Donation Type Transaction Amount Received Amount Is Disbursed? Payment ID Payment Create Date Payment Status Date Payment Status Donor Type Donor ID Donor First Name Donor Last Name Donor Full Name Donor Email Address Donor Address Donor Address2 Donor City Donor State/Province/Region Donor Postal Code Donor Country Match Donor ID Match Donor First Name Match Donor Last Name Dedication Type Dedication Designation Registration ID Designated Charity Name Donation Status Alternate Recognition Name Segment Name Local Currency Receipt Amount Local Currency Type
2 12/20/2018 1:13:00 PM Company A 2-34567891 Individual-Credit Card 12 12 TRUE 10006789 01/22/2019 5:46:00 PM Outstanding Individual E1 Dakota Smith Dakota Smith ds@example.com 123 Any Street Anytown Maine 01234 US Note 410123456 Test Charity Disbursed US Segment 12 USD
3 12/31/2018 10:17:00 PM Company B 2-34567893 Individual-Credit Card 14 14 TRUE 10006789 01/22/2019 5:46:00 PM Outstanding Individual E2 410123456 Test Charity Disbursed US Segment 14 USD
4 12/20/2018 1:13:00 PM Company A 2-34567895 Employer Match-Credit Card Match 12 12 TRUE 10006789 01/22/2019 5:46:00 PM Outstanding Company C1 Company A E1 Dakota Smith Note 410123456 Test Charity Disbursed US Segment 12 USD
5 12/31/2018 10:17:00 PM Company B 2-34567897 Employer Match-Credit Card 14 14 TRUE 10006789 01/22/2019 5:46:00 PM Outstanding Individual E2 410123456 Test Charity Disbursed US Segment 14 USD
6 12/15/2018 10:17:00 AM Company C 2-34567899 Individual-Credit Card 12.50000 12.50000 TRUE 10006789 01/22/2019 5:46:00 PM Outstanding Individual E3 Alex Jones Alex Jones 410123456 Test Charity Disbursed US Segment 10 GBP

View file

@ -594,3 +594,87 @@
currency: USD
amount: !!python/object/apply:decimal.Decimal ["73.85"]
payee: "O'Reilly Media, Inc."
- source: YourCause.csv
importer: yourcause.DonationsImporter
expect:
- date: !!python/object/apply:datetime.date [2018, 12, 20]
currency: USD
original_currency: USD
payment_id: "10006789"
transaction_id: 2-34567891
amount: !!python/object/apply:decimal.Decimal [12]
original_amount: !!python/object/apply:decimal.Decimal [12]
received_amount: !!python/object/apply:decimal.Decimal [12]
donor_amount: !!python/object/apply:decimal.Decimal [12]
match_amount: !!python/object/apply:decimal.Decimal [0]
dedication_type: ""
dedication: ""
designation: Note
payee: Dakota Smith
donor: Dakota Smith
corporation: Company A
- date: !!python/object/apply:datetime.date [2018, 12, 31]
currency: USD
original_currency: USD
payment_id: "10006789"
transaction_id: 2-34567893
amount: !!python/object/apply:decimal.Decimal [14]
original_amount: !!python/object/apply:decimal.Decimal [14]
received_amount: !!python/object/apply:decimal.Decimal [14]
donor_amount: !!python/object/apply:decimal.Decimal [14]
match_amount: !!python/object/apply:decimal.Decimal [0]
dedication_type: ""
dedication: ""
designation: ""
payee: Anonymous
donor: Anonymous
corporation: Company B
- date: !!python/object/apply:datetime.date [2018, 12, 20]
currency: USD
original_currency: USD
payment_id: "10006789"
transaction_id: 2-34567895
amount: !!python/object/apply:decimal.Decimal [12]
original_amount: !!python/object/apply:decimal.Decimal [12]
received_amount: !!python/object/apply:decimal.Decimal [12]
donor_amount: !!python/object/apply:decimal.Decimal [0]
match_amount: !!python/object/apply:decimal.Decimal [12]
dedication_type: ""
dedication: ""
designation: Note
payee: Company A
donor: Dakota Smith
corporation: Company A
- date: !!python/object/apply:datetime.date [2018, 12, 31]
currency: USD
original_currency: USD
payment_id: "10006789"
transaction_id: 2-34567897
amount: !!python/object/apply:decimal.Decimal [14]
original_amount: !!python/object/apply:decimal.Decimal [14]
received_amount: !!python/object/apply:decimal.Decimal [14]
donor_amount: !!python/object/apply:decimal.Decimal [0]
match_amount: !!python/object/apply:decimal.Decimal [14]
dedication_type: ""
dedication: ""
designation: ""
payee: Company B
donor: Anonymous
corporation: Company B
- date: !!python/object/apply:datetime.date [2018, 12, 15]
currency: USD
original_currency: GBP
payment_id: "10006789"
transaction_id: 2-34567899
amount: !!python/object/apply:decimal.Decimal ["12.50"]
original_amount: !!python/object/apply:decimal.Decimal [10]
received_amount: !!python/object/apply:decimal.Decimal ["12.50"]
donor_amount: !!python/object/apply:decimal.Decimal ["12.50"]
match_amount: !!python/object/apply:decimal.Decimal [0]
dedication_type: ""
dedication: ""
designation: ""
payee: Alex Jones
donor: Alex Jones
corporation: Company C