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