From 01a86107d7e4884dc50b490b625b0054a07905d6 Mon Sep 17 00:00:00 2001 From: Brett Smith Date: Mon, 30 Dec 2019 15:45:14 -0500 Subject: [PATCH] benevity: Add support for latest Benevity format. --- README.rst | 9 +- import2ledger/importers/benevity.py | 37 +++++++ tests/data/Benevity2020.csv | 22 +++++ tests/data/imports.yml | 144 ++++++++++++++++++++++++++++ 4 files changed, 210 insertions(+), 2 deletions(-) create mode 100644 tests/data/Benevity2020.csv diff --git a/README.rst b/README.rst index 9c01058..7e57f80 100644 --- a/README.rst +++ b/README.rst @@ -137,14 +137,19 @@ Benevity This information was not available in reports before 2019, so this amount will always be 0.00 in those reports. ---------------- ----------------------------------------------------------- + fee_comment The note from the Fee Comment column in the report. + This information was not available in reports before 2020, + so this field will always be empty in those reports. + ---------------- ----------------------------------------------------------- frequency The frequency of this donation as indicated in the report ---------------- ----------------------------------------------------------- match_amount The amount of the donation match by the participating corporation ---------------- ----------------------------------------------------------- match_fee The fee taken from the donation match. - This information was not available in reports before 2019, - so this amount will always be 0.00 in those reports. + This information is not available in reports from + before 2019 or since 2020, so this amount will always be + 0.00 in those reports. ---------------- ----------------------------------------------------------- merchant_fee The merchant fee taken from the donation total. This information was not available in reports before 2019, diff --git a/import2ledger/importers/benevity.py b/import2ledger/importers/benevity.py index b1cf008..7891c1f 100644 --- a/import2ledger/importers/benevity.py +++ b/import2ledger/importers/benevity.py @@ -34,6 +34,9 @@ class _DonationsImporterBase(_csv.CSVImporterBase): retval.update((retkey, strparse.currency_decimal(row[rowkey])) for rowkey, retkey in self.DECIMAL_FIELDS.items()) retval['amount'] = retval['donation_amount'] + retval['match_amount'] + retval.setdefault('net_amount', retval['amount'] - sum( + fee for key, fee in retval.items() if key.endswith('_fee') + )) return retval @@ -43,6 +46,7 @@ class Donations2018Importer(_DonationsImporterBase): 'donation_fee': ZERO_DECIMAL, 'match_fee': ZERO_DECIMAL, 'merchant_fee': ZERO_DECIMAL, + 'fee_comment': None, } DATE_FIELD = 'Date of Donation' DATE_FMT = '%Y-%m-%d' @@ -72,6 +76,7 @@ class Donations2018Importer(_DonationsImporterBase): class Donations2019Importer(_DonationsImporterBase): ENTRY_SEED = { 'ledger template': 'benevity donations ledger entry', + 'fee_comment': None, } DATE_FIELD = 'Donation Date' DATE_FMT = '%Y-%m-%dT%H:%M:%SZ' @@ -99,3 +104,35 @@ class Donations2019Importer(_DonationsImporterBase): 'Transaction ID': 'transaction_id', 'Donation Frequency': 'frequency', } + + +class Donations2020Importer(_DonationsImporterBase): + ENTRY_SEED = { + 'ledger template': 'benevity donations ledger entry', + 'match_fee': ZERO_DECIMAL, + } + DATE_FIELD = 'Donation Date' + DATE_FMT = '%Y-%m-%dT%H:%M:%SZ' + HEADER_FIELDS = { + 'Disbursement ID': 'disbursement_id', + } + DECIMAL_FIELDS = { + 'Total Donation to be Acknowledged': 'donation_amount', + 'Cause Support Fee': 'donation_fee', + 'Match Amount': 'match_amount', + 'Merchant Fee': 'merchant_fee', + } + NEEDED_FIELDS = frozenset([ + DATE_FIELD, + *_DonationsImporterBase.NAME_FIELDS, + *DECIMAL_FIELDS, + ]) + COPIED_FIELDS = { + 'Company': 'corporation', + 'Currency': 'currency', + 'Project': 'project', + 'Comment': 'comment', + 'Transaction ID': 'transaction_id', + 'Donation Frequency': 'frequency', + 'Fee Comment': 'fee_comment', + } diff --git a/tests/data/Benevity2020.csv b/tests/data/Benevity2020.csv new file mode 100644 index 0000000..99fb3e2 --- /dev/null +++ b/tests/data/Benevity2020.csv @@ -0,0 +1,22 @@ +Donations Report +"#-------------------------------------------" +Charity Name,"Software Freedom Conservancy, Inc." +Charity ID,850-607080900 +Period Ending,Tue 1 Jan 2019 0:00:00 +Currency,USD +Payment Method,EFT +Disbursement ID,ABCDE12345 +Note,Rounding may be applied to some values in this report. Learn more at https://causes.benevity.org/feedback-support +"#-------------------------------------------" + +Company,Project,Donation Date,Donor First Name,Donor Last Name,Email,Address,City,State/Province,Postal Code,Activity,Comment,Transaction ID,Donation Frequency,Currency,Project Remote ID,Source,Reason,Total Donation to be Acknowledged,Match Amount,Cause Support Fee,Merchant Fee,Fee Comment +Company A,,2019-10-28T12:00:01Z,Dakota,Smith,a@example.com,Not shared by donor,Not shared by donor,Not shared by donor,0,Volunteering,,67890QWERT,One-time,USD,,,,20,0,0,0, +Company A,,2019-10-30T12:00:03Z,Dakota,Smith,a@example.com,Not shared by donor,Not shared by donor,Not shared by donor,0,Volunteering,,67890WERTY,One-time,USD,,,,25,0,0,0, +Company B,,2019-10-19T12:00:05Z,Not shared by donor,Not shared by donor,Not shared by donor,Not shared by donor,Not shared by donor,Not shared by donor,12345,,,67890ERTYU,Unknown,USD,,,,0,10,0,0, +Company B,,2019-10-19T12:00:07Z,Not shared by donor,Not shared by donor,Not shared by donor,Not shared by donor,Not shared by donor,Not shared by donor,12345,,,67890RTYUI,Unknown,USD,,,,0,20,0,0, +Company B,,2019-10-19T12:00:09Z,Not shared by donor,Not shared by donor,Not shared by donor,Not shared by donor,Not shared by donor,Not shared by donor,12345,,,67890TYUIO,Recurring,USD,,,,30,0,0,0, +Company C,,2019-10-18T12:00:11Z,Not shared by donor,Not shared by donor,Not shared by donor,Not shared by donor,Not shared by donor,Not shared by donor,12345,,,67890YUIOP,Unknown,USD,,,,10,10,0.3,0.15, +Company C,,2019-10-21T12:00:13Z,Not shared by donor,Not shared by donor,Not shared by donor,Not shared by donor,Not shared by donor,Not shared by donor,12345,,,67890ASDFG,Unknown,USD,,,,10,10,0.3,0.15, +Totals,,,,,,,,,,,,,,,,,,95,50,0.6,0.3, +Check Fee,0 +Total Donations (Gross),144.1 diff --git a/tests/data/imports.yml b/tests/data/imports.yml index 1301b8c..49af4d7 100644 --- a/tests/data/imports.yml +++ b/tests/data/imports.yml @@ -304,6 +304,7 @@ donation_fee: !!python/object/apply:decimal.Decimal [0] match_fee: !!python/object/apply:decimal.Decimal [0] merchant_fee: !!python/object/apply:decimal.Decimal [0] + fee_comment: null payee: Dakota Smith corporation: Company A project: "" @@ -321,6 +322,7 @@ donation_fee: !!python/object/apply:decimal.Decimal [0] match_fee: !!python/object/apply:decimal.Decimal [0] merchant_fee: !!python/object/apply:decimal.Decimal [0] + fee_comment: null payee: Dakota Smith corporation: Company A project: "" @@ -338,6 +340,7 @@ donation_fee: !!python/object/apply:decimal.Decimal [0] match_fee: !!python/object/apply:decimal.Decimal [0] merchant_fee: !!python/object/apply:decimal.Decimal [0] + fee_comment: null payee: Anonymous corporation: Company B project: "" @@ -355,6 +358,7 @@ donation_fee: !!python/object/apply:decimal.Decimal [0] match_fee: !!python/object/apply:decimal.Decimal [0] merchant_fee: !!python/object/apply:decimal.Decimal [0] + fee_comment: null payee: Anonymous corporation: Company B project: "" @@ -373,6 +377,7 @@ donation_fee: !!python/object/apply:decimal.Decimal [0] match_fee: !!python/object/apply:decimal.Decimal [0] merchant_fee: !!python/object/apply:decimal.Decimal [0] + fee_comment: null corporation: Company B project: "" comment: "" @@ -395,6 +400,7 @@ donation_fee: !!python/object/apply:decimal.Decimal [0] match_fee: !!python/object/apply:decimal.Decimal [0] merchant_fee: !!python/object/apply:decimal.Decimal [0] + fee_comment: null payee: Dakota Smith corporation: Company A project: "" @@ -412,6 +418,7 @@ donation_fee: !!python/object/apply:decimal.Decimal [0] match_fee: !!python/object/apply:decimal.Decimal [0] merchant_fee: !!python/object/apply:decimal.Decimal [0] + fee_comment: null payee: Dakota Smith corporation: Company A project: "" @@ -429,6 +436,7 @@ donation_fee: !!python/object/apply:decimal.Decimal [0] match_fee: !!python/object/apply:decimal.Decimal [0] merchant_fee: !!python/object/apply:decimal.Decimal [0] + fee_comment: null payee: Anonymous corporation: Company B project: "" @@ -446,6 +454,7 @@ donation_fee: !!python/object/apply:decimal.Decimal [0] match_fee: !!python/object/apply:decimal.Decimal [0] merchant_fee: !!python/object/apply:decimal.Decimal [0] + fee_comment: null payee: Anonymous corporation: Company B project: "" @@ -463,6 +472,7 @@ donation_fee: !!python/object/apply:decimal.Decimal [0] match_fee: !!python/object/apply:decimal.Decimal [0] merchant_fee: !!python/object/apply:decimal.Decimal [0] + fee_comment: null payee: Anonymous corporation: Company B project: "" @@ -480,6 +490,7 @@ donation_fee: !!python/object/apply:decimal.Decimal [".1"] match_fee: !!python/object/apply:decimal.Decimal [".2"] merchant_fee: !!python/object/apply:decimal.Decimal [".15"] + fee_comment: null payee: Anonymous corporation: Company C project: "" @@ -497,6 +508,139 @@ donation_fee: !!python/object/apply:decimal.Decimal [".1"] match_fee: !!python/object/apply:decimal.Decimal [".2"] merchant_fee: !!python/object/apply:decimal.Decimal [".15"] + fee_comment: null + payee: Anonymous + corporation: Company C + project: "" + comment: "" + frequency: Unknown + transaction_id: 67890ASDFG + ledger template: benevity donations ledger entry + +- source: Benevity2020.csv + importer: benevity.Donations2020Importer + header_rows: 11 + header_cols: 23 + expect: + - date: !!python/object/apply:datetime.date [2019, 10, 28] + currency: USD + disbursement_id: ABCDE12345 + amount: !!python/object/apply:decimal.Decimal [20] + net_amount: !!python/object/apply:decimal.Decimal [20] + donation_amount: !!python/object/apply:decimal.Decimal [20] + match_amount: !!python/object/apply:decimal.Decimal [0] + donation_fee: !!python/object/apply:decimal.Decimal [0] + merchant_fee: !!python/object/apply:decimal.Decimal [0] + match_fee: !!python/object/apply:decimal.Decimal [0] + fee_comment: "" + payee: Dakota Smith + corporation: Company A + project: "" + comment: "" + frequency: One-time + transaction_id: 67890QWERT + ledger template: benevity donations ledger entry + - date: !!python/object/apply:datetime.date [2019, 10, 30] + currency: USD + disbursement_id: ABCDE12345 + amount: !!python/object/apply:decimal.Decimal [25] + net_amount: !!python/object/apply:decimal.Decimal [25] + donation_amount: !!python/object/apply:decimal.Decimal [25] + match_amount: !!python/object/apply:decimal.Decimal [0] + donation_fee: !!python/object/apply:decimal.Decimal [0] + merchant_fee: !!python/object/apply:decimal.Decimal [0] + match_fee: !!python/object/apply:decimal.Decimal [0] + fee_comment: "" + payee: Dakota Smith + corporation: Company A + project: "" + comment: "" + frequency: One-time + transaction_id: 67890WERTY + ledger template: benevity donations ledger entry + - date: !!python/object/apply:datetime.date [2019, 10, 19] + currency: USD + disbursement_id: ABCDE12345 + amount: !!python/object/apply:decimal.Decimal [10] + net_amount: !!python/object/apply:decimal.Decimal [10] + donation_amount: !!python/object/apply:decimal.Decimal [0] + match_amount: !!python/object/apply:decimal.Decimal [10] + donation_fee: !!python/object/apply:decimal.Decimal [0] + merchant_fee: !!python/object/apply:decimal.Decimal [0] + match_fee: !!python/object/apply:decimal.Decimal [0] + fee_comment: "" + payee: Anonymous + corporation: Company B + project: "" + comment: "" + frequency: Unknown + transaction_id: 67890ERTYU + ledger template: benevity donations ledger entry + - date: !!python/object/apply:datetime.date [2019, 10, 19] + currency: USD + disbursement_id: ABCDE12345 + amount: !!python/object/apply:decimal.Decimal [20] + net_amount: !!python/object/apply:decimal.Decimal [20] + donation_amount: !!python/object/apply:decimal.Decimal [0] + match_amount: !!python/object/apply:decimal.Decimal [20] + donation_fee: !!python/object/apply:decimal.Decimal [0] + merchant_fee: !!python/object/apply:decimal.Decimal [0] + match_fee: !!python/object/apply:decimal.Decimal [0] + fee_comment: "" + payee: Anonymous + corporation: Company B + project: "" + comment: "" + frequency: Unknown + transaction_id: 67890RTYUI + ledger template: benevity donations ledger entry + - date: !!python/object/apply:datetime.date [2019, 10, 19] + currency: USD + disbursement_id: ABCDE12345 + amount: !!python/object/apply:decimal.Decimal [30] + net_amount: !!python/object/apply:decimal.Decimal [30] + donation_amount: !!python/object/apply:decimal.Decimal [30] + match_amount: !!python/object/apply:decimal.Decimal [0] + donation_fee: !!python/object/apply:decimal.Decimal [0] + merchant_fee: !!python/object/apply:decimal.Decimal [0] + match_fee: !!python/object/apply:decimal.Decimal [0] + fee_comment: "" + payee: Anonymous + corporation: Company B + project: "" + comment: "" + frequency: Recurring + transaction_id: 67890TYUIO + ledger template: benevity donations ledger entry + - date: !!python/object/apply:datetime.date [2019, 10, 18] + currency: USD + disbursement_id: ABCDE12345 + amount: !!python/object/apply:decimal.Decimal [20] + net_amount: !!python/object/apply:decimal.Decimal ["19.55"] + donation_amount: !!python/object/apply:decimal.Decimal [10] + match_amount: !!python/object/apply:decimal.Decimal [10] + donation_fee: !!python/object/apply:decimal.Decimal [".3"] + merchant_fee: !!python/object/apply:decimal.Decimal [".15"] + match_fee: !!python/object/apply:decimal.Decimal [0] + fee_comment: "" + payee: Anonymous + corporation: Company C + project: "" + comment: "" + frequency: Unknown + transaction_id: 67890YUIOP + ledger template: benevity donations ledger entry + - date: !!python/object/apply:datetime.date [2019, 10, 21] + currency: USD + disbursement_id: ABCDE12345 + amount: !!python/object/apply:decimal.Decimal [20] + net_amount: !!python/object/apply:decimal.Decimal ["19.55"] + donation_amount: !!python/object/apply:decimal.Decimal [10] + match_amount: !!python/object/apply:decimal.Decimal [10] + donation_fee: !!python/object/apply:decimal.Decimal [".3"] + merchant_fee: !!python/object/apply:decimal.Decimal [".15"] + match_fee: !!python/object/apply:decimal.Decimal [0] + fee_comment: "" payee: Anonymous corporation: Company C project: ""