Merge pull request #13967 from eileenmcnaughton/activity_token
[civicrm-core.git] / CRM / Report / Form / Member / Summary.php
CommitLineData
6a488035 1<?php
6a488035
TO
2/*
3 +--------------------------------------------------------------------+
fee14197 4 | CiviCRM version 5 |
6a488035 5 +--------------------------------------------------------------------+
6b83d5bd 6 | Copyright CiviCRM LLC (c) 2004-2019 |
6a488035
TO
7 +--------------------------------------------------------------------+
8 | This file is a part of CiviCRM. |
9 | |
10 | CiviCRM is free software; you can copy, modify, and distribute it |
11 | under the terms of the GNU Affero General Public License |
12 | Version 3, 19 November 2007 and the CiviCRM Licensing Exception. |
13 | |
14 | CiviCRM is distributed in the hope that it will be useful, but |
15 | WITHOUT ANY WARRANTY; without even the implied warranty of |
16 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
17 | See the GNU Affero General Public License for more details. |
18 | |
19 | You should have received a copy of the GNU Affero General Public |
20 | License and the CiviCRM Licensing Exception along |
21 | with this program; if not, contact CiviCRM LLC |
22 | at info[AT]civicrm[DOT]org. If you have questions about the |
23 | GNU Affero General Public License or the licensing of CiviCRM, |
24 | see the CiviCRM license FAQ at http://civicrm.org/licensing |
25 +--------------------------------------------------------------------+
d25dd0ee 26 */
6a488035
TO
27
28/**
29 *
30 * @package CRM
6b83d5bd 31 * @copyright CiviCRM LLC (c) 2004-2019
6a488035
TO
32 */
33class CRM_Report_Form_Member_Summary extends CRM_Report_Form {
34
35 protected $_summary = NULL;
36 protected $_interval = NULL;
37 protected $_charts = array(
38 '' => 'Tabular',
39 'barChart' => 'Bar Chart',
40 'pieChart' => 'Pie Chart',
41 );
42 protected $_add2groupSupported = FALSE;
43
44 protected $_customGroupExtends = array('Membership');
f813f78e 45 protected $_customGroupGroupBy = FALSE;
6a488035
TO
46 public $_drilldownReport = array('member/detail' => 'Link to Detail Report');
47
74cf4551 48 /**
1728e9a0 49 * This report has not been optimised for group filtering.
50 *
51 * The functionality for group filtering has been improved but not
52 * all reports have been adjusted to take care of it. This report has not
53 * and will run an inefficient query until fixed.
54 *
55 * CRM-19170
56 *
57 * @var bool
74cf4551 58 */
1728e9a0 59 protected $groupFilterNotOptimised = TRUE;
60
74cf4551 61 /**
73b448bf 62 * Class constructor.
74cf4551 63 */
00be9182 64 public function __construct() {
6a488035 65 $this->_columns = array(
9d72cede 66 'civicrm_membership' => array(
6a488035
TO
67 'dao' => 'CRM_Member_DAO_MembershipType',
68 'grouping' => 'member-fields',
9d72cede
EM
69 'fields' => array(
70 'membership_type_id' => array(
ccc29f8e 71 'title' => ts('Membership Type'),
6a488035
TO
72 'required' => TRUE,
73 ),
74 ),
9d72cede
EM
75 'filters' => array(
76 'join_date' => array(
77 'title' => ts('Member Since'),
6a488035
TO
78 'type' => CRM_Utils_Type::T_DATE,
79 'operatorType' => CRM_Report_Form::OP_DATE,
80 ),
9d72cede 81 'membership_start_date' => array(
6a488035
TO
82 'name' => 'start_date',
83 'title' => ts('Membership Start Date'),
84 'type' => CRM_Utils_Type::T_DATE,
85 'operatorType' => CRM_Report_Form::OP_DATE,
86 ),
9d72cede 87 'membership_end_date' => array(
6a488035
TO
88 'name' => 'end_date',
89 'title' => ts('Membership End Date'),
90 'type' => CRM_Utils_Type::T_DATE,
91 'operatorType' => CRM_Report_Form::OP_DATE,
92 ),
9d72cede
EM
93 'owner_membership_id' => array(
94 'title' => ts('Membership Owner ID'),
8043337a 95 'type' => CRM_Utils_Type::T_INT,
5a9a44d9
DS
96 'operatorType' => CRM_Report_Form::OP_INT,
97 ),
9d72cede
EM
98 'membership_type_id' => array(
99 'title' => ts('Membership Type'),
8ee006e7 100 'type' => CRM_Utils_Type::T_INT,
6a488035
TO
101 'operatorType' => CRM_Report_Form::OP_MULTISELECT,
102 'options' => CRM_Member_PseudoConstant::membershipType(),
103 ),
9d72cede
EM
104 'status_id' => array(
105 'title' => ts('Membership Status'),
8ee006e7 106 'type' => CRM_Utils_Type::T_INT,
6a488035
TO
107 'operatorType' => CRM_Report_Form::OP_MULTISELECT,
108 'options' => CRM_Member_PseudoConstant::membershipStatus(NULL, NULL, 'label'),
109 ),
110 ),
9d72cede
EM
111 'group_bys' => array(
112 'join_date' => array(
113 'title' => ts('Member Since'),
6a488035
TO
114 'default' => TRUE,
115 'frequency' => TRUE,
116 'chart' => TRUE,
117 'type' => 12,
118 ),
9d72cede 119 'membership_type_id' => array(
ccc29f8e 120 'title' => ts('Membership Type'),
6a488035
TO
121 'default' => TRUE,
122 'chart' => TRUE,
123 ),
124 ),
125 ),
9d72cede 126 'civicrm_contact' => array(
6a488035 127 'dao' => 'CRM_Contact_DAO_Contact',
9d72cede
EM
128 'fields' => array(
129 'contact_id' => array(
6a488035
TO
130 'no_display' => TRUE,
131 ),
9d72cede 132 'contact_type' => array(
30f85891
RN
133 'title' => ts('Contact Type'),
134 ),
9d72cede 135 'contact_sub_type' => array(
b8f96eb8 136 'title' => ts('Contact Subtype'),
30f85891 137 ),
6a488035
TO
138 ),
139 ),
9d72cede 140 'civicrm_contribution' => array(
6a488035 141 'dao' => 'CRM_Contribute_DAO_Contribution',
9d72cede
EM
142 'fields' => array(
143 'currency' => array(
144 'required' => TRUE,
35d8497b 145 'no_display' => TRUE,
146 ),
9d72cede
EM
147 'total_amount' => array(
148 'title' => ts('Amount Statistics'),
1c786c96 149 'default' => TRUE,
9d72cede
EM
150 'statistics' => array(
151 'sum' => ts('Total Payments Made'),
6a488035
TO
152 'count' => ts('Contribution Count'),
153 'avg' => ts('Average'),
154 ),
155 ),
156 ),
9d72cede
EM
157 'filters' => array(
158 'currency' => array(
ccc29f8e 159 'title' => ts('Currency'),
35d8497b 160 'operatorType' => CRM_Report_Form::OP_MULTISELECT,
161 'options' => CRM_Core_OptionGroup::values('currencies_enabled'),
d1b0931b 162 'default' => NULL,
35d8497b 163 'type' => CRM_Utils_Type::T_STRING,
164 ),
9d72cede
EM
165 'contribution_status_id' => array(
166 'title' => ts('Contribution Status'),
6a488035
TO
167 'operatorType' => CRM_Report_Form::OP_MULTISELECT,
168 'options' => CRM_Contribute_PseudoConstant::contributionStatus(),
169 ),
170 ),
171 'grouping' => 'member-fields',
172 ),
173 );
174 $this->_tagFilter = TRUE;
f813f78e 175
a5f92eba 176 // If we have campaigns enabled, add those elements to both the fields, filters and group by
177 $this->addCampaignFields('civicrm_membership', TRUE);
f813f78e 178
6a488035 179 $this->_groupFilter = TRUE;
35d8497b 180 $this->_currencyColumn = 'civicrm_contribution_currency';
6a488035
TO
181 parent::__construct();
182 }
183
00be9182 184 public function select() {
6a488035
TO
185 $select = array();
186 $groupBys = FALSE;
187 $this->_columnHeaders = array();
188 $select[] = " COUNT( DISTINCT {$this->_aliases['civicrm_membership']}.id ) as civicrm_membership_member_count";
189 $select['joinDate'] = " {$this->_aliases['civicrm_membership']}.join_date as civicrm_membership_member_join_date";
9d72cede
EM
190 $this->_columnHeaders["civicrm_membership_member_join_date"] = array(
191 'title' => ts('Member Since'),
6a488035
TO
192 'type' => CRM_Utils_Type::T_DATE,
193 );
194 foreach ($this->_columns as $tableName => $table) {
195 if (array_key_exists('group_bys', $table)) {
196 foreach ($table['group_bys'] as $fieldName => $field) {
a7488080 197 if (!empty($this->_params['group_bys'][$fieldName])) {
6a488035
TO
198
199 switch (CRM_Utils_Array::value($fieldName, $this->_params['group_bys_freq'])) {
200 case 'YEARWEEK':
201 $select[] = "DATE_SUB({$field['dbAlias']}, INTERVAL WEEKDAY({$field['dbAlias']}) DAY) AS {$tableName}_{$fieldName}_start";
202
9d72cede
EM
203 $select[] = "YEARWEEK({$field['dbAlias']}) AS {$tableName}_{$fieldName}_subtotal";
204 $select[] = "WEEKOFYEAR({$field['dbAlias']}) AS {$tableName}_{$fieldName}_interval";
6a488035
TO
205 $field['title'] = 'Week';
206 break;
207
208 case 'YEAR':
9d72cede
EM
209 $select[] = "MAKEDATE(YEAR({$field['dbAlias']}), 1) AS {$tableName}_{$fieldName}_start";
210 $select[] = "YEAR({$field['dbAlias']}) AS {$tableName}_{$fieldName}_subtotal";
211 $select[] = "YEAR({$field['dbAlias']}) AS {$tableName}_{$fieldName}_interval";
6a488035
TO
212 $field['title'] = 'Year';
213 break;
214
215 case 'MONTH':
9d72cede
EM
216 $select[] = "DATE_SUB({$field['dbAlias']}, INTERVAL (DAYOFMONTH({$field['dbAlias']})-1) DAY) as {$tableName}_{$fieldName}_start";
217 $select[] = "MONTH({$field['dbAlias']}) AS {$tableName}_{$fieldName}_subtotal";
218 $select[] = "MONTHNAME({$field['dbAlias']}) AS {$tableName}_{$fieldName}_interval";
6a488035
TO
219 $field['title'] = 'Month';
220 break;
221
222 case 'QUARTER':
9d72cede
EM
223 $select[] = "STR_TO_DATE(CONCAT( 3 * QUARTER( {$field['dbAlias']} ) -2 , '/', '1', '/', YEAR( {$field['dbAlias']} ) ), '%m/%d/%Y') AS {$tableName}_{$fieldName}_start";
224 $select[] = "QUARTER({$field['dbAlias']}) AS {$tableName}_{$fieldName}_subtotal";
225 $select[] = "QUARTER({$field['dbAlias']}) AS {$tableName}_{$fieldName}_interval";
6a488035
TO
226 $field['title'] = 'Quarter';
227 break;
228 }
a7488080 229 if (!empty($this->_params['group_bys_freq'][$fieldName])) {
6a488035 230 $this->_interval = $field['title'];
389bcebf 231 $this->_columnHeaders["{$tableName}_{$fieldName}_start"]['title'] = $field['title'] . ' Beginning';
6a488035
TO
232 $this->_columnHeaders["{$tableName}_{$fieldName}_start"]['type'] = $field['type'];
233 $this->_columnHeaders["{$tableName}_{$fieldName}_start"]['group_by'] = $this->_params['group_bys_freq'][$fieldName];
234
b44e3f84 235 // just to make sure these values are transferred to rows.
6a488035
TO
236 // since we need that for calculation purpose,
237 // e.g making subtotals look nicer or graphs
238 $this->_columnHeaders["{$tableName}_{$fieldName}_interval"] = array('no_display' => TRUE);
239 $this->_columnHeaders["{$tableName}_{$fieldName}_subtotal"] = array('no_display' => TRUE);
240 }
241 $groupBys = TRUE;
242 }
243 }
244 }
245 // end of select
246
247 if (array_key_exists('fields', $table)) {
248 foreach ($table['fields'] as $fieldName => $field) {
9d72cede
EM
249 if (!empty($field['required']) ||
250 !empty($this->_params['fields'][$fieldName])
251 ) {
6a488035
TO
252
253 // only include statistics columns if set
a7488080 254 if (!empty($field['statistics'])) {
6a488035
TO
255 $this->_statFields[] = 'civicrm_membership_member_count';
256 foreach ($field['statistics'] as $stat => $label) {
257 switch (strtolower($stat)) {
258 case 'sum':
259 $select[] = "IFNULL(SUM({$field['dbAlias']}), 0) as {$tableName}_{$fieldName}_{$stat}";
260 $this->_columnHeaders["{$tableName}_{$fieldName}_{$stat}"]['title'] = $label;
261 $this->_columnHeaders["{$tableName}_{$fieldName}_{$stat}"]['type'] = $field['type'];
262 $this->_statFields[] = "{$tableName}_{$fieldName}_{$stat}";
263 break;
264
265 case 'count':
266 $select[] = "COUNT({$field['dbAlias']}) as {$tableName}_{$fieldName}_{$stat}";
267 $this->_columnHeaders["{$tableName}_{$fieldName}_{$stat}"]['type'] = CRM_Utils_Type::T_INT;
268 $this->_columnHeaders["{$tableName}_{$fieldName}_{$stat}"]['title'] = $label;
269 $this->_statFields[] = "{$tableName}_{$fieldName}_{$stat}";
270 break;
271
272 case 'avg':
273 $select[] = "IFNULL(ROUND(AVG({$field['dbAlias']}),2), 0) as {$tableName}_{$fieldName}_{$stat}";
274 $this->_columnHeaders["{$tableName}_{$fieldName}_{$stat}"]['type'] = $field['type'];
275 $this->_columnHeaders["{$tableName}_{$fieldName}_{$stat}"]['title'] = $label;
276 $this->_statFields[] = "{$tableName}_{$fieldName}_{$stat}";
277 break;
278 }
279 }
280 }
281 elseif ($fieldName == 'membership_type_id') {
9d72cede
EM
282 if (empty($this->_params['group_bys']['membership_type_id']) &&
283 !empty($this->_params['group_bys']['join_date'])
284 ) {
6a488035
TO
285 $select[] = "GROUP_CONCAT(DISTINCT {$field['dbAlias']} ORDER BY {$field['dbAlias']} ) as {$tableName}_{$fieldName}";
286 }
287 else {
288 $select[] = "{$field['dbAlias']} as {$tableName}_{$fieldName}";
289 }
290 $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = $field['title'];
291 $this->_columnHeaders["{$tableName}_{$fieldName}"]['operatorType'] = CRM_Utils_Array::value('operatorType', $field);
292 }
293 else {
294 $select[] = "{$field['dbAlias']} as {$tableName}_{$fieldName}";
295 $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = $field['title'];
296 $this->_columnHeaders["{$tableName}_{$fieldName}"]['operatorType'] = CRM_Utils_Array::value('operatorType', $field);
297 }
298 }
299 }
300 }
9d72cede
EM
301 $this->_columnHeaders["civicrm_membership_member_count"] = array(
302 'title' => ts('Member Count'),
6a488035
TO
303 'type' => CRM_Utils_Type::T_INT,
304 );
305 }
306 //If grouping is availabled then remove join date from field
307 if ($groupBys) {
308 unset($select['joinDate']);
309 unset($this->_columnHeaders["civicrm_membership_member_join_date"]);
310 }
d1641c51 311 $this->_selectClauses = $select;
6a488035
TO
312 $this->_select = "SELECT " . implode(', ', $select) . " ";
313 }
314
00be9182 315 public function from() {
6a488035
TO
316 $this->_from = "
317 FROM civicrm_membership {$this->_aliases['civicrm_membership']}
f813f78e 318
319 LEFT JOIN civicrm_contact {$this->_aliases['civicrm_contact']} ON ( {$this->_aliases['civicrm_membership']}.contact_id = {$this->_aliases['civicrm_contact']}.id )
320
321 LEFT JOIN civicrm_membership_status
6a488035
TO
322 ON ({$this->_aliases['civicrm_membership']}.status_id = civicrm_membership_status.id )
323 LEFT JOIN civicrm_membership_payment payment
324 ON ( {$this->_aliases['civicrm_membership']}.id = payment.membership_id )
f813f78e 325 LEFT JOIN civicrm_contribution {$this->_aliases['civicrm_contribution']}
6a488035
TO
326 ON payment.contribution_id = {$this->_aliases['civicrm_contribution']}.id";
327 }
9d72cede 328
00be9182 329 public function where() {
74cf4551 330 $this->_whereClauses[] = "{$this->_aliases['civicrm_membership']}.is_test = 0 AND
d51206ff 331 {$this->_aliases['civicrm_contact']}.is_deleted = 0";
aa83a942 332 parent::where();
6a488035
TO
333 }
334
00be9182 335 public function groupBy() {
47c0ee09 336 $this->_groupBy = "";
6a488035
TO
337 if (is_array($this->_params['group_bys']) &&
338 !empty($this->_params['group_bys'])
339 ) {
70e504f2 340 foreach ($this->_columns as $table) {
6a488035
TO
341 if (array_key_exists('group_bys', $table)) {
342 foreach ($table['group_bys'] as $fieldName => $field) {
a7488080
CW
343 if (!empty($this->_params['group_bys'][$fieldName])) {
344 if (!empty($field['chart'])) {
6a488035
TO
345 $this->assign('chartSupported', TRUE);
346 }
9d72cede
EM
347 if (!empty($table['group_bys'][$fieldName]['frequency']) &&
348 !empty($this->_params['group_bys_freq'][$fieldName])
349 ) {
6a488035 350
20047181 351 $append = "YEAR({$field['dbAlias']})";
6a488035 352 if (in_array(strtolower($this->_params['group_bys_freq'][$fieldName]),
9d72cede
EM
353 array('year')
354 )) {
6a488035
TO
355 $append = '';
356 }
70e504f2 357 $this->_groupByArray[] = $append;
358 $this->_groupByArray[] = "{$this->_params['group_bys_freq'][$fieldName]}({$field['dbAlias']})";
6a488035
TO
359 $append = TRUE;
360 }
361 else {
70e504f2 362 $this->_groupByArray[] = $field['dbAlias'];
6a488035
TO
363 }
364 }
365 }
366 }
367 }
368
369 $this->_rollup = ' WITH ROLLUP';
70e504f2 370 $this->_select = CRM_Contact_BAO_Query::appendAnyValueToSelect($this->_selectClauses, array_filter($this->_groupByArray));
371 $this->_groupBy = 'GROUP BY ' . implode(', ', array_filter($this->_groupByArray)) .
9d72cede 372 " {$this->_rollup} ";
6a488035
TO
373 }
374 else {
b708c08d 375 $this->_groupBy = CRM_Contact_BAO_Query::getGroupByFromSelectColumns($this->_selectClauses, "{$this->_aliases['civicrm_membership']}.join_date");
6a488035
TO
376 }
377 }
378
74cf4551
EM
379 /**
380 * @param $rows
381 *
382 * @return array
383 */
00be9182 384 public function statistics(&$rows) {
6a488035 385 $statistics = parent::statistics($rows);
6a488035
TO
386 $select = "
387 SELECT COUNT({$this->_aliases['civicrm_contribution']}.total_amount ) as count,
388 IFNULL(SUM({$this->_aliases['civicrm_contribution']}.total_amount ), 0) as amount,
389 IFNULL(ROUND(AVG({$this->_aliases['civicrm_contribution']}.total_amount), 2),0) as avg,
35d8497b 390 COUNT( DISTINCT {$this->_aliases['civicrm_membership']}.id ) as memberCount,
391 {$this->_aliases['civicrm_contribution']}.currency as currency
6a488035
TO
392 ";
393
35d8497b 394 $sql = "{$select} {$this->_from} {$this->_where}
f813f78e 395GROUP BY {$this->_aliases['civicrm_contribution']}.currency
35d8497b 396";
6a488035 397
35d8497b 398 $dao = CRM_Core_DAO::executeQuery($sql);
f813f78e 399
35d8497b 400 $totalAmount = $average = array();
401 $count = $memberCount = 0;
402 while ($dao->fetch()) {
389bcebf 403 $totalAmount[] = CRM_Utils_Money::format($dao->amount, $dao->currency) . "(" . $dao->count . ")";
9d72cede 404 $average[] = CRM_Utils_Money::format($dao->avg, $dao->currency);
35d8497b 405 $count += $dao->count;
406 $memberCount += $dao->memberCount;
407 }
408 $statistics['counts']['amount'] = array(
409 'title' => ts('Total Amount'),
410 'value' => implode(', ', $totalAmount),
411 'type' => CRM_Utils_Type::T_STRING,
412 );
413 $statistics['counts']['count'] = array(
be205937 414 'title' => ts('Total Contributions'),
35d8497b 415 'value' => $count,
416 );
417 $statistics['counts']['memberCount'] = array(
418 'title' => ts('Total Members'),
419 'value' => $memberCount,
420 );
421 $statistics['counts']['avg'] = array(
422 'title' => ts('Average'),
423 'value' => implode(', ', $average),
424 'type' => CRM_Utils_Type::T_STRING,
425 );
6a488035 426
9d72cede 427 if (!(int) $statistics['counts']['amount']['value']) {
35d8497b 428 //if total amount is zero then hide Chart Options
429 $this->assign('chartSupported', FALSE);
6a488035
TO
430 }
431
432 return $statistics;
433 }
434
00be9182 435 public function postProcess() {
6a488035
TO
436 parent::postProcess();
437 }
438
74cf4551
EM
439 /**
440 * @param $rows
441 */
00be9182 442 public function buildChart(&$rows) {
6a488035
TO
443 $graphRows = array();
444 $count = 0;
445 $membershipTypeValues = CRM_Member_PseudoConstant::membershipType();
446 $isMembershipType = CRM_Utils_Array::value('membership_type_id', $this->_params['group_bys']);
447 $isJoiningDate = CRM_Utils_Array::value('join_date', $this->_params['group_bys']);
a7488080 448 if (!empty($this->_params['charts'])) {
6a488035
TO
449 foreach ($rows as $key => $row) {
450 if (!($row['civicrm_membership_join_date_subtotal'] &&
9d72cede
EM
451 $row['civicrm_membership_membership_type_id']
452 )
453 ) {
6a488035
TO
454 continue;
455 }
456 if ($isMembershipType) {
457 $join_date = CRM_Utils_Array::value('civicrm_membership_join_date_start', $row);
458 $displayInterval = CRM_Utils_Array::value('civicrm_membership_join_date_interval', $row);
459 if ($join_date) {
460 list($year, $month) = explode('-', $join_date);
461 }
a7488080 462 if (!empty($row['civicrm_membership_join_date_subtotal'])) {
6a488035
TO
463
464 switch ($this->_interval) {
465 case 'Month':
466 $displayRange = $displayInterval . ' ' . $year;
467 break;
468
469 case 'Quarter':
470 $displayRange = 'Quarter ' . $displayInterval . ' of ' . $year;
471 break;
472
473 case 'Week':
474 $displayRange = 'Week ' . $displayInterval . ' of ' . $year;
475 break;
476
477 case 'Year':
478 $displayRange = $year;
479 break;
480 }
9d72cede
EM
481 $membershipType = $displayRange . "-" .
482 $membershipTypeValues[$row['civicrm_membership_membership_type_id']];
6a488035
TO
483 }
484 else {
485
486 $membershipType = $membershipTypeValues[$row['civicrm_membership_membership_type_id']];
487 }
488
489 $interval[$membershipType] = $membershipType;
490 $display[$membershipType] = $row['civicrm_contribution_total_amount_sum'];
491 }
492 else {
493 $graphRows['receive_date'][] = CRM_Utils_Array::value('civicrm_membership_join_date_start', $row);
494 $graphRows[$this->_interval][] = CRM_Utils_Array::value('civicrm_membership_join_date_interval', $row);
495 $graphRows['value'][] = $row['civicrm_contribution_total_amount_sum'];
496 $count++;
497 }
498 }
499
500 // build chart.
501 if ($isMembershipType) {
502 $graphRows['value'] = $display;
503 $chartInfo = array(
b35e00df 504 'legend' => ts('Membership Summary'),
e60e0c01 505 'xname' => ts('Member Since / Member Type'),
506 'yname' => ts('Fees'),
6a488035
TO
507 );
508 CRM_Utils_OpenFlashChart::reportChart($graphRows, $this->_params['charts'], $interval, $chartInfo);
509 }
510 else {
511 CRM_Utils_OpenFlashChart::chart($graphRows, $this->_params['charts'], $this->_interval);
512 }
513 }
514 $this->assign('chartType', $this->_params['charts']);
515 }
516
74cf4551 517 /**
ced9bfed
EM
518 * Alter display of rows.
519 *
520 * Iterate through the rows retrieved via SQL and make changes for display purposes,
521 * such as rendering contacts as links.
522 *
523 * @param array $rows
524 * Rows generated by SQL, with an array for each row.
74cf4551 525 */
00be9182 526 public function alterDisplay(&$rows) {
6a488035
TO
527 $entryFound = FALSE;
528 foreach ($rows as $rowNum => $row) {
529 // make count columns point to detail report
9d72cede
EM
530 if (!empty($this->_params['group_bys']['join_date']) &&
531 !empty($row['civicrm_membership_join_date_start']) &&
6a488035
TO
532 $row['civicrm_membership_join_date_start'] &&
533 $row['civicrm_membership_join_date_subtotal']
534 ) {
535
536 $dateStart = CRM_Utils_Date::customFormat($row['civicrm_membership_join_date_start'], '%Y%m%d');
9d72cede
EM
537 $endDate = new DateTime($dateStart);
538 $dateEnd = array();
6a488035
TO
539
540 list($dateEnd['Y'], $dateEnd['M'], $dateEnd['d']) = explode(':', $endDate->format('Y:m:d'));
541
542 switch (strtolower($this->_params['group_bys_freq']['join_date'])) {
543 case 'month':
544 $dateEnd = date("Ymd", mktime(0, 0, 0, $dateEnd['M'] + 1,
9d72cede
EM
545 $dateEnd['d'] - 1, $dateEnd['Y']
546 ));
6a488035
TO
547 break;
548
549 case 'year':
550 $dateEnd = date("Ymd", mktime(0, 0, 0, $dateEnd['M'],
9d72cede
EM
551 $dateEnd['d'] - 1, $dateEnd['Y'] + 1
552 ));
6a488035
TO
553 break;
554
555 case 'yearweek':
556 $dateEnd = date("Ymd", mktime(0, 0, 0, $dateEnd['M'],
9d72cede
EM
557 $dateEnd['d'] + 6, $dateEnd['Y']
558 ));
6a488035
TO
559 break;
560
561 case 'quarter':
562 $dateEnd = date("Ymd", mktime(0, 0, 0, $dateEnd['M'] + 3,
9d72cede
EM
563 $dateEnd['d'] - 1, $dateEnd['Y']
564 ));
6a488035
TO
565 break;
566 }
567 $typeUrl = '';
a7488080 568 if (!empty($this->_params['group_bys']['membership_type_id']) &&
6a488035
TO
569 $typeID = $row['civicrm_membership_membership_type_id']
570 ) {
571 $typeUrl = "&tid_op=in&tid_value={$typeID}";
572 }
573 $statusUrl = '';
574 if (!empty($this->_params['status_id_value'])) {
9d72cede
EM
575 $statusUrl = "&sid_op=in&sid_value=" .
576 implode(",", $this->_params['status_id_value']);
6a488035
TO
577 }
578 $url = CRM_Report_Utils_Report::getNextUrl('member/detail',
579 "reset=1&force=1&join_date_from={$dateStart}&join_date_to={$dateEnd}{$typeUrl}{$statusUrl}",
580 $this->_absoluteUrl, $this->_id, $this->_drilldownReport
581 );
582 $row['civicrm_membership_join_date_start'] = CRM_Utils_Date::format($row['civicrm_membership_join_date_start']);
583 $rows[$rowNum]['civicrm_membership_join_date_start_link'] = $url;
584 $rows[$rowNum]['civicrm_membership_join_date_start_hover'] = ts("Lists Summary of Memberships for this date unit.");
585
586 $entryFound = TRUE;
587 }
588
589 // handle Membership Types
590 if (array_key_exists('civicrm_membership_membership_type_id', $row)) {
591 if ($value = $row['civicrm_membership_membership_type_id']) {
592 $value = explode(',', $value);
593 foreach ($value as $key => $id) {
594 $value[$key] = CRM_Member_PseudoConstant::membershipType($id, FALSE);
595 }
596 $rows[$rowNum]['civicrm_membership_membership_type_id'] = implode(' , ', $value);
597 }
598 $entryFound = TRUE;
599 }
600
601 // make subtotals look nicer
602 if (array_key_exists('civicrm_membership_join_date_subtotal', $row) &&
603 !$row['civicrm_membership_join_date_subtotal']
604 ) {
605 $this->fixSubTotalDisplay($rows[$rowNum], $this->_statFields);
606 $entryFound = TRUE;
607 }
608 elseif (array_key_exists('civicrm_membership_join_date_subtotal', $row) &&
609 $row['civicrm_membership_join_date_subtotal'] &&
610 !$row['civicrm_membership_membership_type_id']
611 ) {
612 $this->fixSubTotalDisplay($rows[$rowNum], $this->_statFields, FALSE);
8c2959c8 613 $rows[$rowNum]['civicrm_membership_membership_type_id'] = '<b>' . ts('Subtotal') . '</b>';
6a488035
TO
614 $entryFound = TRUE;
615 }
f813f78e 616
a7dbbc5d
CD
617 // If using campaigns, convert campaign_id to campaign title
618 if (array_key_exists('civicrm_membership_campaign_id', $row)) {
619 if ($value = $row['civicrm_membership_campaign_id']) {
a5f92eba 620 $rows[$rowNum]['civicrm_membership_campaign_id'] = $this->campaigns[$value];
a7dbbc5d
CD
621 }
622 $entryFound = TRUE;
623 }
6a488035
TO
624
625 // skip looking further in rows, if first row itself doesn't
626 // have the column we need
627 if (!$entryFound) {
628 break;
629 }
630 }
631 }
96025800 632
6a488035 633}