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