yourcause: New importer.
This commit is contained in:
parent
a607ff8d11
commit
44762555d5
5 changed files with 211 additions and 1 deletions
41
README.rst
41
README.rst
|
@ -344,6 +344,47 @@ Stripe
|
||||||
retried_payout_net Decimal from the corresponding CSV column
|
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
|
Other output options
|
||||||
~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
|
79
import2ledger/importers/yourcause.py
Normal file
79
import2ledger/importers/yourcause.py
Normal 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
|
2
setup.py
2
setup.py
|
@ -30,7 +30,7 @@ REQUIREMENTS['tests_require'] = [
|
||||||
setup(
|
setup(
|
||||||
name='import2ledger',
|
name='import2ledger',
|
||||||
description="Import different sources of financial data to Ledger",
|
description="Import different sources of financial data to Ledger",
|
||||||
version='0.7.0',
|
version='0.8.0',
|
||||||
author='Brett Smith',
|
author='Brett Smith',
|
||||||
author_email='brettcsmith@brettcsmith.org',
|
author_email='brettcsmith@brettcsmith.org',
|
||||||
license='GNU AGPLv3+',
|
license='GNU AGPLv3+',
|
||||||
|
|
6
tests/data/YourCause.csv
Normal file
6
tests/data/YourCause.csv
Normal 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
|
|
|
@ -594,3 +594,87 @@
|
||||||
currency: USD
|
currency: USD
|
||||||
amount: !!python/object/apply:decimal.Decimal ["73.85"]
|
amount: !!python/object/apply:decimal.Decimal ["73.85"]
|
||||||
payee: "O'Reilly Media, Inc."
|
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
|
||||||
|
|
Loading…
Reference in a new issue