Ejegg has uploaded a new change for review. ( https://gerrit.wikimedia.org/r/398778 )
Change subject: Reset deploy branch to match production ...................................................................... Reset deploy branch to match production Will need to redo commits between 798e2467 and this one next week Change-Id: I5d830389ff5f2fa7ca76d01467adfd248dc784dd --- M civicrm M composer.json M composer.lock M sites/all/modules/queue2civicrm/DonationQueueConsumer.php D sites/all/modules/queue2civicrm/DonationStats.php M sites/all/modules/queue2civicrm/queue2civicrm.info M sites/all/modules/queue2civicrm/queue2civicrm.module D sites/all/modules/queue2civicrm/tests/phpunit/DonationStatsTest.php M sites/all/modules/thank_you/make_thank_you.drush.inc M sites/all/modules/wmf_civicrm/wmf_civicrm.module M vendor 11 files changed, 44 insertions(+), 521 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/wikimedia/fundraising/crm refs/changes/78/398778/1 diff --git a/civicrm b/civicrm index b2fab9d..a82f2e7 160000 --- a/civicrm +++ b/civicrm @@ -1 +1 @@ -Subproject commit b2fab9d9d24b1187e845ec601f4165683278243c +Subproject commit a82f2e7ea633af7477a2c8859b97dbe13ddda5d7 diff --git a/composer.json b/composer.json index 81456c6..72a398e 100644 --- a/composer.json +++ b/composer.json @@ -25,8 +25,7 @@ "phpseclib/phpseclib": "~2.0", "predis/predis": "1.*", "twig/twig": "1.*", - "wikimedia/composer-merge-plugin": "^1.4", - "jackgleeson/stats-collector": "dev-master" + "wikimedia/composer-merge-plugin": "^1.4" }, "repositories": [ { diff --git a/composer.lock b/composer.lock index 2ae68da..e06dee5 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "content-hash": "f5b1e547c9865d17802925641c804265", + "content-hash": "32a4c6d1dba52d233ae8892c1908badf", "packages": [ { "name": "addshore/psr-6-mediawiki-bagostuff-adapter", @@ -353,65 +353,6 @@ "time": "2017-06-30T14:54:48+00:00" }, { - "name": "dflydev/dot-access-data", - "version": "v1.1.0", - "source": { - "type": "git", - "url": "https://github.com/dflydev/dflydev-dot-access-data.git", - "reference": "3fbd874921ab2c041e899d044585a2ab9795df8a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/3fbd874921ab2c041e899d044585a2ab9795df8a", - "reference": "3fbd874921ab2c041e899d044585a2ab9795df8a", - "shasum": "" - }, - "require": { - "php": ">=5.3.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "psr-0": { - "Dflydev\\DotAccessData": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Dragonfly Development Inc.", - "email": "i...@dflydev.com", - "homepage": "http://dflydev.com" - }, - { - "name": "Beau Simensen", - "email": "b...@dflydev.com", - "homepage": "http://beausimensen.com" - }, - { - "name": "Carlos Frutos", - "email": "car...@kiwing.it", - "homepage": "https://github.com/cfrutos" - } - ], - "description": "Given a deep data structure, access data by dot notation.", - "homepage": "https://github.com/dflydev/dflydev-dot-access-data", - "keywords": [ - "access", - "data", - "dot", - "notation" - ], - "time": "2017-01-20T21:14:22+00:00" - }, - { "name": "geoip2/geoip2", "version": "v2.6.0", "source": { @@ -686,46 +627,6 @@ "password" ], "time": "2014-11-20T16:49:30+00:00" - }, - { - "name": "jackgleeson/stats-collector", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/jackgleeson/stats-collector.git", - "reference": "1c792bbeac77d4781fbb788f341b601636696df5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/jackgleeson/stats-collector/zipball/1c792bbeac77d4781fbb788f341b601636696df5", - "reference": "1c792bbeac77d4781fbb788f341b601636696df5", - "shasum": "" - }, - "require": { - "dflydev/dot-access-data": "^1.1" - }, - "require-dev": { - "phpunit/phpunit": "^6.4" - }, - "type": "library", - "autoload": { - "psr-4": { - "Statistics\\": "src/", - "Samples\\": "samples/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jack Gleeson", - "email": "m...@jackgleeson.co.uk" - } - ], - "description": "Utility to help record, analyse and export statistics across any PHP process e.g. http request, batch jobs or cli-scrpts", - "time": "2017-11-22T13:56:02+00:00" }, { "name": "league/csv", @@ -2186,7 +2087,7 @@ "GPL-2.0" ], "description": "Wikimedia Foundation payment processing library", - "time": "2017-11-16T16:31:29+00:00" + "time": "2017-11-16 16:31:29" }, { "name": "wikimedia/omnimail-silverpop", @@ -3884,7 +3785,6 @@ "stability-flags": { "amzn/login-and-pay-with-amazon-sdk-php": 20, "wikimedia/donation-interface": 20, - "jackgleeson/stats-collector": 20, "wikimedia/omnimail-silverpop": 20, "mrmarkfrench/silverpop-php-connector": 20, "omnimail/omnimail": 20 diff --git a/sites/all/modules/queue2civicrm/DonationQueueConsumer.php b/sites/all/modules/queue2civicrm/DonationQueueConsumer.php index 88a217c..3108d8c 100644 --- a/sites/all/modules/queue2civicrm/DonationQueueConsumer.php +++ b/sites/all/modules/queue2civicrm/DonationQueueConsumer.php @@ -1,11 +1,10 @@ <?php namespace queue2civicrm; -use SmashPig\Core\DataStores\PendingDatabase; use Queue2civicrmTrxnCounter; +use SmashPig\Core\DataStores\PendingDatabase; use SmashPig\Core\UtcDate; use wmf_common\TransactionalWmfQueueConsumer; use WmfException; -use DonationStats; class DonationQueueConsumer extends TransactionalWmfQueueConsumer { @@ -69,21 +68,12 @@ _queue2civicrm_log( $log ); } - $DonationStats = new DonationStats(); - $DonationStats->recordDonationStats( $message, $contribution ); + $age = UtcDate::getUtcTimestamp() - UtcDate::getUtcTimestamp( $contribution['receive_date'] ); - - /** - * === Legacy Donations Counter implementation === - */ - $age = UtcDate::getUtcTimestamp() - UtcDate::getUtcTimestamp( $contribution['receive_date'] ); - $counter = Queue2civicrmTrxnCounter::instance(); - $counter->increment( $message['gateway'] ); - $counter->addAgeMeasurement( $message['gateway'], $age ); - /** - * === End of Legacy Donations Counter implementation === - */ - + // keep count of the transactions + $counter = Queue2civicrmTrxnCounter::instance(); + $counter->increment( $message['gateway'] ); + $counter->addAgeMeasurement( $message['gateway'], $age ); // Delete any pending db entries with matching gateway and order_id PendingDatabase::get()->deleteMessage( $message ); diff --git a/sites/all/modules/queue2civicrm/DonationStats.php b/sites/all/modules/queue2civicrm/DonationStats.php deleted file mode 100644 index 1e930f4..0000000 --- a/sites/all/modules/queue2civicrm/DonationStats.php +++ /dev/null @@ -1,209 +0,0 @@ -<?php - -use Statistics\Collector\Collector; -use Statistics\Exporter\Prometheus as PrometheusStatsExporter; -use SmashPig\Core\UtcDate; - -/** - * Class DonationStats - * - * Handles donation stats recording & exporting using Stats Collector - * - * @see Collector - */ -class DonationStats { - - /** - * Default output filename for Prometheus .prom file - * - * @var string - */ - public $prometheusOutputFileName = "donations"; - - /** - * Custom Prometheus output file path. Default export behaviour is to use drupal global - * variable 'metrics_reporting_prometheus_path' unless this value is set. - * - * @var string - */ - public $prometheusOutputFilePath; - - /** - * @var Statistics\Collector\Collector - */ - public $statsCollector; - - public function __construct() { - $this->statsCollector = Collector::getInstance(); - // set the root namespace for all donation related stats - $this->statsCollector->ns("donations"); - } - - /** - * Record donation stats: - * 1) Number of donations by gateway - * 2) Number of overall donations - * 3) Time between gateway transaction time and civiCRM import time (now) - * 4) Gateway specific moving average of (3) - * 5) Overall moving average of (3) - * 6) Time between donation message enqueued time and civiCRM import time (now) - * 7) Gateway specific moving average of (6) - * 8) Overall moving average of (6) - * - * @param array $message - * @param array $contribution - */ - public function recordDonationStats($message, $contribution) { - $paymentGateway = $message['gateway']; - $gatewayTransactionTime = $contribution['receive_date']; - - // donation counter - $this->recordGatewayDonation($paymentGateway); - $this->recordOverallDonations(); - - // difference between gateway transaction time to civiCRM save time - $this->recordGatewayTransactionAge($paymentGateway, $gatewayTransactionTime); - $this->recordAverageGatewayTransactionAge($paymentGateway); - $this->recordOverallAverageGatewayTransactionAge(); - - // difference between message enqueued time to civiCRM save time - if (isset($message['source_enqueued_time'])) { - $messageEnqueuedTime = $message['source_enqueued_time']; - $this->recordMessageEnqueuedAge($paymentGateway, $messageEnqueuedTime); - $this->recordAverageGatewayMessageEnqueuedAge($paymentGateway); - $this->recordOverallAverageMessageEnqueuedAge(); - } - } - - /** - * Get overall average gateway transaction age at end of queue consumer batch run - * - * @return float|int - */ - public function getOverallAverageGatewayTransactionAge() { - return $this->statsCollector->get("overall.average.transaction_age"); - } - - /** - * Get overall average message age at end of queue consumer batch run - * - * @return float|int - */ - public function getOverallAverageMessageEnqueuedAge() { - return $this->statsCollector->get("overall.average.enqueued_age"); - } - - /** - * Export recorded stats to an output format to then be consumed upstream. - * - * Currently we only export to Prometheus. - */ - public function export() { - $this->exportToPrometheus(); - } - - /** - * Export stats data to a Prometheus .prom out file using the - * PrometheusStatsExporter exporter. - * - * @see PrometheusStatsExporter - */ - protected function exportToPrometheus() { - // get the output file name and file path - if (isset($this->prometheusOutputFilePath)) { - $path = $this->prometheusOutputFilePath; - } else { - $path = variable_get( - 'metrics_reporting_prometheus_path', '/var/spool/prometheus' - ); - } - $filename = $this->prometheusOutputFileName; - - // instantiate a Stats Collector Prometheus specific exporter and pass it the current - // instance of $statsCollector to then export all stats to {$path}/{$filename}.prom - $prometheusStatsExporter = new PrometheusStatsExporter($filename, $path); - $prometheusStatsExporter->export($this->statsCollector); - } - - /** - * Record a stat to count/increment the number of gateway specific donations - * - * @param string $paymentGateway - */ - protected function recordGatewayDonation($paymentGateway) { - $this->statsCollector->inc("gateway.{$paymentGateway}", 1); - } - - /** - * Set/update the current total count of all donations during this queue consumer run - */ - protected function recordOverallDonations() { - $this->statsCollector->clobber("overall.donations", $this->statsCollector->sum("gateway.*")); - } - - /** - * Record a stat for the difference between gateway transaction time to civiCRM save time - * - * @param string $paymentGateway - * @param $gatewayTransactionTime - */ - protected function recordGatewayTransactionAge($paymentGateway, $gatewayTransactionTime) { - // work out time between gateway's official transaction time and now - $gatewayReceivedAge = UtcDate::getUtcTimestamp() - UtcDate::getUtcTimestamp($gatewayTransactionTime); - $this->statsCollector->add("transaction_age.{$paymentGateway}", $gatewayReceivedAge); - } - - /** - * Set/update the current moving average of gateway transaction age - * - * @param string $paymentGateway - */ - protected function recordAverageGatewayTransactionAge($paymentGateway) { - $this->statsCollector->clobber("average.transaction_age.{$paymentGateway}", - $this->statsCollector->avg("transaction_age.{$paymentGateway}") - ); - } - - /** - * Set/update the overall current moving average for all payment gateway transaction ages - */ - protected function recordOverallAverageGatewayTransactionAge() { - $this->statsCollector->clobber("overall.average.transaction_age", - $this->statsCollector->avg("transaction_age.*") - ); - } - - /** - * Record a stat for the difference between message enqueued time to civiCRM save time - * - * @param string $paymentGateway - * @param $messageEnqueuedTime - */ - protected function recordMessageEnqueuedAge($paymentGateway, $messageEnqueuedTime) { - // work out time between the message enqueued time and now if 'source_enqueued_time' is set - $enqueuedAge = UtcDate::getUtcTimestamp() - $messageEnqueuedTime; - $this->statsCollector->add("enqueued_age.{$paymentGateway}", $enqueuedAge); - } - - /** - * Set/update the current moving average of gateway enqueued message ages - * - * @param string $paymentGateway - */ - protected function recordAverageGatewayMessageEnqueuedAge($paymentGateway) { - $this->statsCollector->clobber("average.enqueued_age.{$paymentGateway}", - $this->statsCollector->avg("enqueued_age.{$paymentGateway}") - ); - } - - /** - * Set/update the current moving average of enqueued message ages - */ - protected function recordOverallAverageMessageEnqueuedAge() { - $this->statsCollector->clobber("overall.average.enqueued_age", - $this->statsCollector->avg("enqueued_age.*") - ); - } - - -} \ No newline at end of file diff --git a/sites/all/modules/queue2civicrm/queue2civicrm.info b/sites/all/modules/queue2civicrm/queue2civicrm.info index a6cdd6d..40db4d2 100644 --- a/sites/all/modules/queue2civicrm/queue2civicrm.info +++ b/sites/all/modules/queue2civicrm/queue2civicrm.info @@ -6,6 +6,5 @@ dependencies[] = wmf_civicrm package = queue2civicrm files[] = Queue2civicrmTrxnCounter.php -files[] = DonationStats.php files[] = DonationQueueConsumer.php diff --git a/sites/all/modules/queue2civicrm/queue2civicrm.module b/sites/all/modules/queue2civicrm/queue2civicrm.module index 1a7e300..3f2f4cc 100644 --- a/sites/all/modules/queue2civicrm/queue2civicrm.module +++ b/sites/all/modules/queue2civicrm/queue2civicrm.module @@ -9,7 +9,7 @@ */ function queue2civicrm_menu() { $items = array(); - + $items['admin/config/queue2civicrm'] = array( 'title' => 'Queue to CiviCRM', 'access arguments' => array('administer queue2civicrm'), @@ -102,7 +102,7 @@ '#required' => TRUE, '#default_value' => variable_get('queue2civicrm_batch_time', 90), ); - + return system_settings_form($form); } @@ -135,13 +135,9 @@ ); $processed = $consumer->dequeueMessages(); - $DonationStats = new DonationStats(); - $DonationStats->export(); - - /** - * === Legacy Donations Counter implementation === - * + * this may some day supersede the process counts handled above... + * * Note that this might be a little whack. At least, it feels a little sloppy. * We might consider specifying the names of gateways to keep track of, rather than auto-generate * the gateways to keep track of during queue consumption. With the latter (current) method, @@ -163,17 +159,11 @@ } module_invoke( 'metrics_reporting', 'report_metrics', 'donation_message_age', $ageMetrics ); - /** - * === End of Legacy Donations Counter implementation === - */ - if ($processed > 0) { watchdog('queue2civicrm', 'Successfully processed ' . $processed . ' contribution(s).'); - watchdog('queue2civicrm', - 'Average Transaction age: ' . $DonationStats->getOverallAverageGatewayTransactionAge() . ' seconds.'); - watchdog('queue2civicrm', - 'Average Message Enqueued age: ' . $DonationStats->getOverallAverageMessageEnqueuedAge() . ' seconds.'); - } else { + watchdog('queue2civicrm', 'Average message age: ' . $ageMetrics['overall'] . ' seconds.'); + } + else { watchdog('queue2civicrm', 'No contributions processed.'); } } diff --git a/sites/all/modules/queue2civicrm/tests/phpunit/DonationStatsTest.php b/sites/all/modules/queue2civicrm/tests/phpunit/DonationStatsTest.php deleted file mode 100644 index c4a2f83..0000000 --- a/sites/all/modules/queue2civicrm/tests/phpunit/DonationStatsTest.php +++ /dev/null @@ -1,172 +0,0 @@ -<?php - -/** - * The tests for the testOverallAverage*() methods are admittedly a little confusing due to the - * DonationStats API not allowing access to individual stat values once recorded. - * - * However! fear not because even though testing averages to confirm individual records appears - * counter-intuitive, we are only adding a single donation per test meaning the averages will be - * identical be the individual values used per test because `avg(1) == 1` - * - * @group Queue2Civicrm - * @group DonationStats - */ -class DonationStatsTest extends BaseWmfDrupalPhpUnitTestCase { - - protected $statsFilename; - - protected $statsFilePath; - - protected $statsFileExtension; - - public function setUp() { - parent::setUp(); - $this->setupStatsCollector(); - } - - public function testOverallAverageGatewayTransactionAgeRecorded() { - $message = [ - 'gateway' => "ACME_PAYMENTS", - ]; - $contribution = [ - //simulate a transaction date 1 hour earlier from now() - 'receive_date' => \SmashPig\Core\UtcDate::getUtcDatabaseString('-1 hour'), - ]; - - $DonationStats = new DonationStats(); - $DonationStats->recordDonationStats($message, $contribution); - $OverallAverageGatewayTransactionAge = $DonationStats->getOverallAverageGatewayTransactionAge(); - - //compare recorded stats data with expected age in seconds (3600 seconds = 1 hour) - $this->assertEquals(3600, $OverallAverageGatewayTransactionAge); - } - - public function testOverallAverageMessageEnqueuedAgeRecordedWhenPresent() { - $message = [ - 'gateway' => "ACME_PAYMENTS", - // populating 'source_enqueued_time' with a timestamp one hour earlier from now() - 'source_enqueued_time' => \SmashPig\Core\UtcDate::getUtcTimestamp('-1 hour'), - ]; - $contribution = [ - 'receive_date' => \SmashPig\Core\UtcDate::getUtcDatabaseString('-1 hour'), - ]; - - $DonationStats = new DonationStats(); - $DonationStats->recordDonationStats($message, $contribution); - $OverallAverageMessageEnqueuedAge = $DonationStats->getOverallAverageMessageEnqueuedAge(); - - //compare written stats data with expected age in seconds (3600 seconds = 1 hour) - $this->assertEquals(3600, $OverallAverageMessageEnqueuedAge); - } - - public function testOverallAverageMessageEnqueuedAgeNotRecordedWhenNotPresent() { - $message = [ - 'gateway' => "ACME_PAYMENTS", - // omitting 'source_enqueued_time' - ]; - $contribution = [ - 'receive_date' => \SmashPig\Core\UtcDate::getUtcDatabaseString(), - ]; - - $DonationStats = new DonationStats(); - $DonationStats->recordDonationStats($message, $contribution); - $OverallAverageMessageEnqueuedAge = $DonationStats->getOverallAverageMessageEnqueuedAge(); - - $this->assertNull($OverallAverageMessageEnqueuedAge); - } - - public function testExportingStatsToFile() { - $this->setUpStatsOutFileProperties(); - $message = [ - 'gateway' => "ACME_PAYMENTS", - ]; - $contribution = [ - 'receive_date' => \SmashPig\Core\UtcDate::getUtcDatabaseString(), - ]; - - // test output file does not currently exist - $this->assertFileNotExists($this->statsFilePath . $this->statsFilename . $this->statsFileExtension); - - $DonationStats = new DonationStats(); - $DonationStats->recordDonationStats($message, $contribution); - $DonationStats->prometheusOutputFileName = $this->statsFilename; - $DonationStats->prometheusOutputFilePath = rtrim($this->statsFilePath, '/'); - $DonationStats->export(); - - //test output file has been created - $this->assertFileExists($this->statsFilePath . $this->statsFilename . $this->statsFileExtension); - - // clean up - $this->removeStatsOutFile(); - } - - public function testExportedStatsValues() { - $this->setUpStatsOutFileProperties(); - $message = [ - 'gateway' => "ACME_PAYMENTS", - ]; - $contribution = [ - //simulate a transaction date 1 hour earlier from now() - 'receive_date' => \SmashPig\Core\UtcDate::getUtcDatabaseString('-1 hour'), - ]; - - $DonationStats = new DonationStats(); - $DonationStats->recordDonationStats($message, $contribution); - $DonationStats->prometheusOutputFileName = $this->statsFilename; - $DonationStats->prometheusOutputFilePath = rtrim($this->statsFilePath, '/'); - $DonationStats->export(); - - $expectedStats = [ - 'donations_gateway_ACME_PAYMENTS' => 1, - 'donations_overall_donations' => 1, - 'donations_overall_average_transaction_age' => 3600, // should be -1 hour from now (3600 secs) - 'donations_average_transaction_age_ACME_PAYMENTS' => 3600, - 'donations_transaction_age_ACME_PAYMENTS' => 3600, - ]; - - $statsFileFullPath = $this->statsFilePath . $this->statsFilename . $this->statsFileExtension; - $statsWrittenAssocArray = []; - $statsWritten = rtrim(file_get_contents($statsFileFullPath)); // remove trailing \n - $statsWrittenLinesArray = explode("\n", $statsWritten); - foreach ($statsWrittenLinesArray as $statsLine) { - list($name, $value) = explode(' ', $statsLine); - $statsWrittenAssocArray[$name] = $value; - } - - //compare written stats data with expected - $this->assertEquals($expectedStats, $statsWrittenAssocArray); - - // clean up - $this->removeStatsOutFile(); - } - - public function tearDown() { - parent::tearDown(); - } - - private function setUpStatsOutFileProperties() { - $this->statsFilename = "test_stats"; - $this->statsFilePath = CRM_Utils_File::tempdir(); - $this->statsFileExtension = '.prom'; - } - - private function removeStatsOutFile() { - unlink($this->statsFilePath . $this->statsFilename . $this->statsFileExtension); - rmdir($this->statsFilePath); - } - - /** - * Stats Collector singleton (used internally by DonationStats) needs resetting before each test. - * - * DonationQueueTest indirectly records stats when calling - * DonationQueueConsumer::processMessage() so we clear all instances before each run to test - * from a known starting point. - * - * @see DonationQueueTest - */ - private function setupStatsCollector() { - \Statistics\Collector\Collector::tearDown(TRUE); - } - - -} diff --git a/sites/all/modules/thank_you/make_thank_you.drush.inc b/sites/all/modules/thank_you/make_thank_you.drush.inc index b7e98cf..b542966 100644 --- a/sites/all/modules/thank_you/make_thank_you.drush.inc +++ b/sites/all/modules/thank_you/make_thank_you.drush.inc @@ -17,6 +17,7 @@ function drush_make_thank_you() { $generators = get_thank_you_generators(); + $default_gen = get_default_thank_you_generator(); if (drush_get_option('listgen', false)) { drush_print(t('Available thank you generators')); diff --git a/sites/all/modules/wmf_civicrm/wmf_civicrm.module b/sites/all/modules/wmf_civicrm/wmf_civicrm.module index 9485811..184cedc 100644 --- a/sites/all/modules/wmf_civicrm/wmf_civicrm.module +++ b/sites/all/modules/wmf_civicrm/wmf_civicrm.module @@ -2501,6 +2501,9 @@ } if (substr($moveField, 0, 13) === 'move_location') { + if (!isset($refs['is_major_gift'])) { + $refs['is_major_gift'] = _wmf_civicrm_is_merged_contact_major_donor($mainId, $otherId); + } $fieldParts = explode('_', $moveField); if ($fieldParts[2] == 'email') { @@ -2976,6 +2979,28 @@ } /** + * Has the combined contact given $500 or more? + * + * @param int $mainId + * @param int $otherId + * + * @return bool + * + * @throws \CiviCRM_API3_Exception + */ +function _wmf_civicrm_is_merged_contact_major_donor($mainId, $otherId) { + $total = 0; + $donations = civicrm_api3('Contribution', 'get', array( + 'return' => 'total_amount', + 'contact_id' => array('IN' => array($mainId, $otherId)), + )); + foreach ($donations['values'] as $donation) { + $total += $donation['total_amount']; + } + return ($total >= 500) ? TRUE : FALSE; +} + +/** * * We are testing a nuanced real life situation where the address data of the * most recent donor gets priority - resulting in the primary address being set diff --git a/vendor b/vendor index e0bee4e..4a2f871 160000 --- a/vendor +++ b/vendor @@ -1 +1 @@ -Subproject commit e0bee4e764568f286bf14f2da1c14cfd8249e9d3 +Subproject commit 4a2f871ce564adfa60c15eabb53ad7fc2f85dcd3 -- To view, visit https://gerrit.wikimedia.org/r/398778 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I5d830389ff5f2fa7ca76d01467adfd248dc784dd Gerrit-PatchSet: 1 Gerrit-Project: wikimedia/fundraising/crm Gerrit-Branch: deployment Gerrit-Owner: Ejegg <ej...@ejegg.com> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits