Skip to content

Commit

Permalink
[REF] extract calculation of basic stats
Browse files Browse the repository at this point in the history
  • Loading branch information
eileenmcnaughton committed Feb 15, 2019
1 parent e8e178f commit 8ef6eb7
Showing 1 changed file with 50 additions and 27 deletions.
77 changes: 50 additions & 27 deletions CRM/Contact/BAO/Query.php
Original file line number Diff line number Diff line change
Expand Up @@ -5089,44 +5089,27 @@ public function setSkipPermission($val) {
*/
public function summaryContribution($context = NULL) {
list($innerselect, $from, $where, $having) = $this->query(TRUE);
if ($this->_permissionWhereClause) {
$where .= " AND " . $this->_permissionWhereClause;
}
if ($context == 'search') {
$where .= " AND contact_a.is_deleted = 0 ";
}

// hack $select
$select = "
SELECT COUNT( conts.total_amount ) as total_count,
SUM( conts.total_amount ) as total_amount,
AVG( conts.total_amount ) as total_avg,
conts.currency as currency";
if ($this->_permissionWhereClause) {
$where .= " AND " . $this->_permissionWhereClause;
}
if ($context == 'search') {
$where .= " AND contact_a.is_deleted = 0 ";
}

$query = $this->appendFinancialTypeWhereAndFromToQueryStrings($where, $from);
$this->appendFinancialTypeWhereAndFromToQueryStrings($where, $from);

// make sure contribution is completed - CRM-4989
$completedWhere = $where . " AND civicrm_contribution.contribution_status_id = 1 ";
$summary = ['total' => []];
$this->addBasicStatsToSummary($summary, $where, $from);

$summary = array();
$summary['total'] = array();
$summary['total']['count'] = $summary['total']['amount'] = $summary['total']['avg'] = "n/a";
$innerQuery = "SELECT civicrm_contribution.total_amount, COUNT(civicrm_contribution.total_amount) as civicrm_contribution_total_amount_count,
civicrm_contribution.currency $from $completedWhere";
$query = "$select FROM (
$innerQuery GROUP BY civicrm_contribution.id
) as conts
GROUP BY currency";

$dao = CRM_Core_DAO::executeQuery($query);

$summary['total']['count'] = 0;
$summary['total']['amount'] = $summary['total']['avg'] = array();
while ($dao->fetch()) {
$summary['total']['count'] += $dao->total_count;
$summary['total']['amount'][] = CRM_Utils_Money::format($dao->total_amount, $dao->currency);
$summary['total']['avg'][] = CRM_Utils_Money::format($dao->total_avg, $dao->currency);
}
civicrm_contribution.currency $from $where AND civicrm_contribution.contribution_status_id = 1 ";

$orderBy = 'ORDER BY civicrm_contribution_total_amount_count DESC';
$groupBy = 'GROUP BY currency, civicrm_contribution.total_amount';
Expand All @@ -5139,6 +5122,8 @@ public function summaryContribution($context = NULL) {

$summary['total']['mode'] = CRM_Contribute_BAO_Contribution::computeStats('mode', $modeSQL);

// make sure contribution is completed - CRM-4989
$completedWhere = $where . " AND civicrm_contribution.contribution_status_id = 1 ";
$medianSQL = "{$from} {$completedWhere}";
$summary['total']['median'] = CRM_Contribute_BAO_Contribution::computeStats('median', $medianSQL, 'civicrm_contribution');
$summary['total']['currencyCount'] = count($summary['total']['median']);
Expand Down Expand Up @@ -6644,4 +6629,42 @@ public function getSelect() {
return $select;
}

/**
* Add basic statistics to the summary.
*
* @param array $summary
* @param string $where
* @param string $from
*
* @return array
*/
protected function addBasicStatsToSummary(&$summary, $where, $from) {
$summary['total']['count'] = $summary['total']['amount'] = $summary['total']['avg'] = "n/a";

$query = "
SELECT COUNT( conts.total_amount ) as total_count,
SUM( conts.total_amount ) as total_amount,
AVG( conts.total_amount ) as total_avg,
conts.currency as currency
FROM (
SELECT civicrm_contribution.total_amount, COUNT(civicrm_contribution.total_amount) as civicrm_contribution_total_amount_count,
civicrm_contribution.currency
$from
$where AND civicrm_contribution.contribution_status_id = 1
GROUP BY civicrm_contribution.id
) as conts
GROUP BY currency";

$dao = CRM_Core_DAO::executeQuery($query);

$summary['total']['count'] = 0;
$summary['total']['amount'] = $summary['total']['avg'] = [];
while ($dao->fetch()) {
$summary['total']['count'] += $dao->total_count;
$summary['total']['amount'][] = CRM_Utils_Money::format($dao->total_amount, $dao->currency);
$summary['total']['avg'][] = CRM_Utils_Money::format($dao->total_avg, $dao->currency);
}
return $summary;
}

}

0 comments on commit 8ef6eb7

Please sign in to comment.