jenkins-bot has submitted this change and it was merged. ( https://gerrit.wikimedia.org/r/397716 )
Change subject: Add stripe import ...................................................................... Add stripe import At this stage an exception is thrown if non-USD currencies are in use and utm_campaign column is respected if set, ditto utm_medium with a default of MGEventEmail There is a desire for currency support & I think that might be the case for another import too. I also feel there is a desire for being able to set an import-wide default for a field. I've left these out of this iteration. Bug: T172423 Change-Id: I63a85f352caec1d695724a9b1dd1129f9a29781c --- A sites/all/modules/offline2civicrm/StripeFile.php M sites/all/modules/offline2civicrm/offline2civicrm.info M sites/all/modules/offline2civicrm/offline2civicrm.module A sites/all/modules/offline2civicrm/tests/StripeFileTest.php A sites/all/modules/offline2civicrm/tests/data/stripe.csv 5 files changed, 184 insertions(+), 0 deletions(-) Approvals: jenkins-bot: Verified Ejegg: Looks good to me, approved diff --git a/sites/all/modules/offline2civicrm/StripeFile.php b/sites/all/modules/offline2civicrm/StripeFile.php new file mode 100644 index 0000000..49b9f03 --- /dev/null +++ b/sites/all/modules/offline2civicrm/StripeFile.php @@ -0,0 +1,119 @@ +<?php + +class StripeFile extends ChecksFile { + protected function getRequiredColumns() { + return array( + 'Created (UTC)', + 'Card Name', + 'Converted Amount', + 'id', + ); + } + + /** + * Do any final transformation on a normalized and default-laden queue message. + * + * @param array $msg + * + * @throws \WmfException + */ + protected function mungeMessage(&$msg) { + list($msg['first_name'], $msg['last_name']) = wmf_civicrm_janky_split_name( $msg['full_name'] ); + $msg['currency'] = strtoupper($msg['currency']); + $msg['original_currency'] = strtoupper($msg['original_currency']); + parent::mungeMessage($msg); + } + + protected function getFieldMapping() { + return array( + // Is this correct? - maps to gateway_refund_id' on refund? + 'id' => 'gateway_txn_id', + 'utm_source' => 'utm_source', + 'utm_campaign' => 'utm_campaign', + 'utm_medium' => 'utm_medium', + 'Card Address Line1' => 'street_address', + 'Card Address Line2' => 'supplemental_address_1', + 'Card Address City' => 'city', + 'Converted Amount' => 'gross', + 'Amount' => 'original_gross', + 'Created (UTC)' => 'date', + 'Customer Email' => 'email', + 'Converted Currency' => 'currency', + 'Currency' => 'original_currency', + 'Card Name' => 'full_name', + 'Card Address State' => 'state_province', + 'Card Address Zip' => 'postal_code', + 'Card Address Country' => 'country', + + + //id, + //Description, + //Amount ,, + //Amount Refunded, + //Currency, + //Converted Amount Refunded,Fee, + //Tax, + //Converted Currency, + //Mode, + //Status, + //Statement Descriptor, + //Customer ID, + //Customer Description,, + //Captured,Card ID, + //Card Last4, + //Card Brand, + //Card Funding, + //Card Exp Month, + //Card Exp Year, + //Card Issue Country, + //Card Fingerprint, + //Card CVC Status, + //Card AVS Zip Status, + //Card AVS Line1 Status, + //Card Tokenization Method, + //Disputed Amount, + //Dispute Status, + //Dispute Reason, + //Dispute Date (UTC), + //Dispute Evidence Due (UTC) + //Invoice ID, + //Payment Source Type, + //Destination, + //Transfer, + //Transfer Group, + //event_id (metadata), + //event_name (metadata), + //order_number (metadata) + ); + } + + protected function getDefaultValues() { + return array_merge(parent::getDefaultValues(), array( + 'gateway' => 'stripe', + 'no_thank_you' => 'stripe', + 'payment_instrument' => 'Stripe', + 'payment_method' => 'Stripe', + 'utm_medium' => 'MGEventEmail', + 'contact_source' => 'Stripe import', + ) + ); + } + + /** + * Read a row and transform into normalized queue message form + * + * @param $data + * + * @return array queue message format + * + * @throws \EmptyRowException + * @throws \WmfException + */ + protected function parseRow($data) { + if (!empty($data['Converted Amount Refunded'])) { + throw new WmfException(WmfException::INVALID_MESSAGE, 'Refunds not currently handled. Please log a Phab if required'); + } + return parent::parseRow($data); + } + +} diff --git a/sites/all/modules/offline2civicrm/offline2civicrm.info b/sites/all/modules/offline2civicrm/offline2civicrm.info index 4a49a4f..967c081 100644 --- a/sites/all/modules/offline2civicrm/offline2civicrm.info +++ b/sites/all/modules/offline2civicrm/offline2civicrm.info @@ -22,6 +22,7 @@ files[] = PayPalChecksFile.php files[] = RefundFile.php files[] = SquareFile.php +files[] = StripeFile.php files[] = TrilogyFile.php files[] = WmfImportFile.php files[] = WmfOrgImportFile.php diff --git a/sites/all/modules/offline2civicrm/offline2civicrm.module b/sites/all/modules/offline2civicrm/offline2civicrm.module index 71cb137..ed491c3 100644 --- a/sites/all/modules/offline2civicrm/offline2civicrm.module +++ b/sites/all/modules/offline2civicrm/offline2civicrm.module @@ -115,6 +115,7 @@ 'jpmorgan' => t('JP Morgan'), 'paypal' => t('PayPal EFT'), 'square' => t('Square'), + 'stripe' => t('Stripe'), 'trilogy' => t('Trilogy'), ), ); @@ -194,6 +195,11 @@ case 'square': $importer = new SquareFile($file->uri); break; + + case 'stripe': + $importer = new StripeFile($file->uri); + break; + case 'trilogy': $importer = new TrilogyFile($file->uri); break; diff --git a/sites/all/modules/offline2civicrm/tests/StripeFileTest.php b/sites/all/modules/offline2civicrm/tests/StripeFileTest.php new file mode 100644 index 0000000..b05630a --- /dev/null +++ b/sites/all/modules/offline2civicrm/tests/StripeFileTest.php @@ -0,0 +1,54 @@ +<?php + +/** + * @group Import + * @group Offline2Civicrm + */ +class StripeTest extends BaseChecksFileTest { + + function setUp() { + parent::setUp(); + $this->gateway = 'stripe'; + } + + /** + * Test basic import. + */ + function testImport() { + civicrm_initialize(); + + $importer = new StripeFile(__DIR__ . "/data/stripe.csv"); + $messages = $importer->import(); + $this->assertEquals('2 out of 3 rows were imported.', $messages['Result']); + $firstGateWayID = 'ch_1Al1231231231231231231123'; + $contribution = wmf_civicrm_get_contributions_from_gateway_id($this->gateway, $firstGateWayID); + $this->assertEquals(1, count($contribution)); + $this->assertEquals('STRIPE CH_1AL1231231231231231231123', $contribution[0]['trxn_id']); + $this->assertEquals('500', $contribution[0]['total_amount']); + $this->assertEquals('USD', $contribution[0]['currency']); + $this->assertEquals('big campaign', db_query("SELECT {utm_campaign} from {contribution_tracking} WHERE contribution_id = {$contribution[0]['id']}")->fetchField()); + + $contact = $this->callAPISuccessGetSingle('Contact', array('id' => $contribution[0]['contact_id'], 'return' => array( + 'first_name', + 'last_name', + 'contact_source', + ))); + $this->assertEquals('Charles', $contact['first_name']); + $this->assertEquals('Darwin', $contact['last_name']); + $this->assertEquals('Stripe import', $contact['contact_source']); + + $contribution2 = wmf_civicrm_get_contributions_from_gateway_id($this->gateway, 'ch_1Bl1231231231231231231123'); + $contribution2 = $contribution2[0]; + $this->assertEquals(1000, $contribution2['original_amount']); + $this->assertEquals('GBP', $contribution2['original_currency']); + $this->assertEquals('USD', $contribution2['currency']); + $this->assertEquals(1500, $contribution2['total_amount']); + $this->assertEquals('GBP 1000', $contribution2['source']); + + $this->callAPISuccess('Contribution', 'delete', array('id' => $contribution[0]['id'])); + $this->callAPISuccess('Contribution', 'delete', array('id' => $contribution[0]['id'] + 1)); + $this->callAPISuccess('Contact', 'delete', array('id' => $contact['id'])); + $this->callAPISuccess('Contact', 'delete', array('id' => $contact['id'] + 1)); + } + +} diff --git a/sites/all/modules/offline2civicrm/tests/data/stripe.csv b/sites/all/modules/offline2civicrm/tests/data/stripe.csv new file mode 100644 index 0000000..cb7826a --- /dev/null +++ b/sites/all/modules/offline2civicrm/tests/data/stripe.csv @@ -0,0 +1,4 @@ +id,Description,Created (UTC),Amount,Amount Refunded,Currency,Converted Amount,Converted Amount Refunded,Fee ,Tax,Converted Currency,Mode,Status,Statement Descriptor,Customer ID,Customer Description,Customer Email,Captured,Card ID,Card Last4,Card Brand,Card Funding,Card Exp Month,Card Exp Year,Card Name,Card Address Line1,Card Address Line2,Card Address City,Card Address State,Card Address Country,Card Address Zip,Card Issue Country,Card Fingerprint,Card CVC Status,Card AVS Zip Status,Card AVS Line1 Status,Card Tokenization Method,Disputed Amount,Dispute Status,Dispute Reason,Dispute Date (UTC),Dispute Evidence Due (UTC),Invoice ID,Payment Source Type,Destination,Transfer,Transfer Group,event_id (metadata),event_name (metadata),order_number (metadata),utm_campaign +ch_1Al1231231231231231231123,Event Tickets for Event: 3302,07/30/17 12:24 PM,500 ,0 ,usd ,500,0 ,18.3,0 ,usd ,Live,Paid , , , , ,TRUE ,card_1Al12312312312312323123 ,3389 ,MasterCard,credit ,6 ,2020 ,Charles Darwin, , , , ,US ,20910 ,US ,2SGj123123123123,pass ,pass , , , , , , , , ,card , , , ,3302 ,Wikipedia D.C. Fall Fundraiser,ET-LHY1231591231233123a-3302,big campaign +ch_1Bl1231231231231231231123,Event Tickets for Event: 3302,07/28/17 04:04 AM,1000 ,0 ,gbp ,1500 ,0 ,62.3,0 ,usd ,Live,Paid , , , , ,TRUE ,card_1234234234234234234234uR,2012 ,MasterCard,credit ,9 ,2019 ,Marie Currie , , , , ,US ,20854 ,US ,uI234234234234vW,pass ,pass , , , , , , , , ,card , , , ,3302 ,Wikipedia D.C. Fall Fundraiser,ET-Q2342342342342342347-3302, +ch_1Bl12312312312888888888,Event Tickets for Event: 3302,07/28/17 04:04 AM,0 ,1000 ,usd ,0 ,1000 ,62.3,0 ,usd ,Live,Paid , , , , ,TRUE ,card_1234234234234234234234uR,2012 ,MasterCard,credit ,9 ,2019 ,Marie Currie , , , , ,US ,20854 ,US ,uI234234234234vW,pass ,pass , , , , , , , , ,card , , , ,3302 ,Wikipedia D.C. Fall Fundraiser,ET-Q2342342342342342347-3302, -- To view, visit https://gerrit.wikimedia.org/r/397716 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: merged Gerrit-Change-Id: I63a85f352caec1d695724a9b1dd1129f9a29781c Gerrit-PatchSet: 1 Gerrit-Project: wikimedia/fundraising/crm Gerrit-Branch: deployment Gerrit-Owner: Ejegg <ej...@ejegg.com> Gerrit-Reviewer: Eileen <emcnaugh...@wikimedia.org> Gerrit-Reviewer: Ejegg <ej...@ejegg.com> Gerrit-Reviewer: jenkins-bot <> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits