Merge pull request #851 from eileenmcnaughton/CRM-12686
[civicrm-core.git] / CRM / Report / Form / Member / Summary.php
CommitLineData
6a488035
TO
1<?php
2// $Id$
3
4/*
5 +--------------------------------------------------------------------+
6 | CiviCRM version 4.3 |
7 +--------------------------------------------------------------------+
8 | Copyright CiviCRM LLC (c) 2004-2013 |
9 +--------------------------------------------------------------------+
10 | This file is a part of CiviCRM. |
11 | |
12 | CiviCRM is free software; you can copy, modify, and distribute it |
13 | under the terms of the GNU Affero General Public License |
14 | Version 3, 19 November 2007 and the CiviCRM Licensing Exception. |
15 | |
16 | CiviCRM is distributed in the hope that it will be useful, but |
17 | WITHOUT ANY WARRANTY; without even the implied warranty of |
18 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
19 | See the GNU Affero General Public License for more details. |
20 | |
21 | You should have received a copy of the GNU Affero General Public |
22 | License and the CiviCRM Licensing Exception along |
23 | with this program; if not, contact CiviCRM LLC |
24 | at info[AT]civicrm[DOT]org. If you have questions about the |
25 | GNU Affero General Public License or the licensing of CiviCRM, |
26 | see the CiviCRM license FAQ at http://civicrm.org/licensing |
27 +--------------------------------------------------------------------+
28*/
29
30/**
31 *
32 * @package CRM
33 * @copyright CiviCRM LLC (c) 2004-2013
34 * $Id$
35 *
36 */
37class CRM_Report_Form_Member_Summary extends CRM_Report_Form {
38
39 protected $_summary = NULL;
40 protected $_interval = NULL;
41 protected $_charts = array(
42 '' => 'Tabular',
43 'barChart' => 'Bar Chart',
44 'pieChart' => 'Pie Chart',
45 );
46 protected $_add2groupSupported = FALSE;
47
48 protected $_customGroupExtends = array('Membership');
49 protected $_customGroupGroupBy = FALSE;
50 public $_drilldownReport = array('member/detail' => 'Link to Detail Report');
51
a7dbbc5d
CD
52 function __construct() {
53
6a488035 54 // UI for selecting columns to appear in the report list
a7dbbc5d
CD
55 // Array containing the columns, group_bys and filters build and provided to Form
56
57 // Check if CiviCampaign is a) enabled and b) has active campaigns
58 $config = CRM_Core_Config::singleton();
59 $campaignEnabled = in_array("CiviCampaign", $config->enableComponents);
60 if ($campaignEnabled) {
61 $getCampaigns = CRM_Campaign_BAO_Campaign::getPermissionedCampaigns(NULL, NULL, TRUE, FALSE, TRUE);
62 $this->activeCampaigns = $getCampaigns['campaigns'];
63 asort($this->activeCampaigns);
64 }
6a488035
TO
65
66 $this->_columns = array(
67 'civicrm_membership' =>
68 array(
69 'dao' => 'CRM_Member_DAO_MembershipType',
70 'grouping' => 'member-fields',
71 'fields' =>
72 array(
73 'membership_type_id' =>
74 array(
75 'title' => 'Membership Type',
76 'required' => TRUE,
77 ),
78 ),
79 'filters' =>
80 array(
81 'join_date' =>
82 array('title' => ts('Member Since'),
83 'type' => CRM_Utils_Type::T_DATE,
84 'operatorType' => CRM_Report_Form::OP_DATE,
85 ),
86 'membership_start_date' =>
87 array(
88 'name' => 'start_date',
89 'title' => ts('Membership Start Date'),
90 'type' => CRM_Utils_Type::T_DATE,
91 'operatorType' => CRM_Report_Form::OP_DATE,
92 ),
93 'membership_end_date' =>
94 array(
95 'name' => 'end_date',
96 'title' => ts('Membership End Date'),
97 'type' => CRM_Utils_Type::T_DATE,
98 'operatorType' => CRM_Report_Form::OP_DATE,
99 ),
100 'membership_type_id' =>
101 array('title' => ts('Membership Type'),
102 'operatorType' => CRM_Report_Form::OP_MULTISELECT,
103 'options' => CRM_Member_PseudoConstant::membershipType(),
104 ),
105 'status_id' =>
106 array('title' => ts('Membership Status'),
107 'operatorType' => CRM_Report_Form::OP_MULTISELECT,
108 'options' => CRM_Member_PseudoConstant::membershipStatus(NULL, NULL, 'label'),
109 ),
110 ),
111 'group_bys' =>
112 array(
113 'join_date' =>
114 array('title' => ts('Member Since'),
115 'default' => TRUE,
116 'frequency' => TRUE,
117 'chart' => TRUE,
118 'type' => 12,
119 ),
120 'membership_type_id' =>
121 array(
122 'title' => 'Membership Type',
123 'default' => TRUE,
124 'chart' => TRUE,
125 ),
126 ),
127 ),
128 'civicrm_contact' =>
129 array(
130 'dao' => 'CRM_Contact_DAO_Contact',
131 'fields' =>
132 array(
133 'contact_id' =>
134 array(
135 'no_display' => TRUE,
136 ),
137 ),
138 ),
139 'civicrm_contribution' =>
140 array(
141 'dao' => 'CRM_Contribute_DAO_Contribution',
142 'fields' =>
143 array(
35d8497b 144 'currency' =>
145 array('required' => TRUE,
146 'no_display' => TRUE,
147 ),
6a488035
TO
148 'total_amount' =>
149 array('title' => ts('Amount Statistics'),
150 'required' => TRUE,
151 'statistics' =>
152 array('sum' => ts('Total Payments Made'),
153 'count' => ts('Contribution Count'),
154 'avg' => ts('Average'),
155 ),
156 ),
157 ),
158 'filters' =>
159 array(
35d8497b 160 'currency' =>
161 array('title' => 'Currency',
162 'operatorType' => CRM_Report_Form::OP_MULTISELECT,
163 'options' => CRM_Core_OptionGroup::values('currencies_enabled'),
d1b0931b 164 'default' => NULL,
35d8497b 165 'type' => CRM_Utils_Type::T_STRING,
166 ),
6a488035
TO
167 'contribution_status_id' =>
168 array('title' => ts('Contribution Status'),
169 'operatorType' => CRM_Report_Form::OP_MULTISELECT,
170 'options' => CRM_Contribute_PseudoConstant::contributionStatus(),
171 ),
172 ),
173 'grouping' => 'member-fields',
174 ),
175 );
176 $this->_tagFilter = TRUE;
a7dbbc5d
CD
177
178 // If we have a campaign, build out the relevant elements
179 if ($campaignEnabled && !empty($this->activeCampaigns)) {
180 $this->_columns['civicrm_membership']['fields']['campaign_id'] = array(
181 'title' => 'Campaign',
182 'default' => 'false',
183 );
184 $this->_columns['civicrm_membership']['filters']['campaign_id'] = array('title' => ts('Campaign'),
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 }
191
192
6a488035 193 $this->_groupFilter = TRUE;
35d8497b 194 $this->_currencyColumn = 'civicrm_contribution_currency';
6a488035
TO
195 parent::__construct();
196 }
197
198 function select() {
199 $select = array();
200 $groupBys = FALSE;
201 $this->_columnHeaders = array();
202 $select[] = " COUNT( DISTINCT {$this->_aliases['civicrm_membership']}.id ) as civicrm_membership_member_count";
203 $select['joinDate'] = " {$this->_aliases['civicrm_membership']}.join_date as civicrm_membership_member_join_date";
204 $this->_columnHeaders["civicrm_membership_member_join_date"] = array('title' => ts('Member Since'),
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) {
210 if (CRM_Utils_Array::value($fieldName, $this->_params['group_bys'])) {
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
216 $select[] = "YEARWEEK({$field['dbAlias']}) AS {$tableName}_{$fieldName}_subtotal";
217 $select[] = "WEEKOFYEAR({$field['dbAlias']}) AS {$tableName}_{$fieldName}_interval";
218 $field['title'] = 'Week';
219 break;
220
221 case 'YEAR':
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";
225 $field['title'] = 'Year';
226 break;
227
228 case 'MONTH':
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";
232 $field['title'] = 'Month';
233 break;
234
235 case 'QUARTER':
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";
239 $field['title'] = 'Quarter';
240 break;
241 }
242 if (CRM_Utils_Array::value($fieldName, $this->_params['group_bys_freq'])) {
243 $this->_interval = $field['title'];
244 $this->_columnHeaders["{$tableName}_{$fieldName}_start"]['title'] = $field['title'] . ' Beginning';
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) {
262 if (CRM_Utils_Array::value('required', $field) ||
263 CRM_Utils_Array::value($fieldName, $this->_params['fields'])
264 ) {
265
266 // only include statistics columns if set
267 if (CRM_Utils_Array::value('statistics', $field)) {
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') {
295 if (!CRM_Utils_Array::value('membership_type_id', $this->_params['group_bys']) &&
296 CRM_Utils_Array::value('join_date', $this->_params['group_bys'])
297 ) {
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 }
314 $this->_columnHeaders["civicrm_membership_member_count"] = array('title' => ts('Member Count'),
315 'type' => CRM_Utils_Type::T_INT,
316 );
317 }
318 //If grouping is availabled then remove join date from field
319 if ($groupBys) {
320 unset($select['joinDate']);
321 unset($this->_columnHeaders["civicrm_membership_member_join_date"]);
322 }
323 $this->_select = "SELECT " . implode(', ', $select) . " ";
324 }
325
326 function from() {
327 $this->_from = "
328 FROM civicrm_membership {$this->_aliases['civicrm_membership']}
329
330 LEFT JOIN civicrm_contact {$this->_aliases['civicrm_contact']} ON ( {$this->_aliases['civicrm_membership']}.contact_id = {$this->_aliases['civicrm_contact']}.id )
331
332 LEFT JOIN civicrm_membership_status
333 ON ({$this->_aliases['civicrm_membership']}.status_id = civicrm_membership_status.id )
334 LEFT JOIN civicrm_membership_payment payment
335 ON ( {$this->_aliases['civicrm_membership']}.id = payment.membership_id )
336 LEFT JOIN civicrm_contribution {$this->_aliases['civicrm_contribution']}
337 ON payment.contribution_id = {$this->_aliases['civicrm_contribution']}.id";
338 }
339 // end of from
340
341 function where() {
342 $clauses = array();
343 foreach ($this->_columns as $tableName => $table) {
344 if (array_key_exists('filters', $table)) {
345 foreach ($table['filters'] as $fieldName => $field) {
346 $clause = NULL;
347
348 if ($field['operatorType'] & CRM_Utils_Type::T_DATE) {
349 $relative = CRM_Utils_Array::value("{$fieldName}_relative", $this->_params);
350 $from = CRM_Utils_Array::value("{$fieldName}_from", $this->_params);
351 $to = CRM_Utils_Array::value("{$fieldName}_to", $this->_params);
352
353 if ($relative || $from || $to) {
354 $clause = $this->dateClause($field['name'], $relative, $from, $to, $field['type']);
355 }
356 }
357 else {
358 $op = CRM_Utils_Array::value("{$fieldName}_op", $this->_params);
359 if ($op) {
360 $clause = $this->whereClause($field,
361 $op,
362 CRM_Utils_Array::value("{$fieldName}_value", $this->_params),
363 CRM_Utils_Array::value("{$fieldName}_min", $this->_params),
364 CRM_Utils_Array::value("{$fieldName}_max", $this->_params)
365 );
366 }
367 }
368 if (!empty($clause)) {
369 $clauses[$fieldName] = $clause;
370 }
371 }
372 }
373 }
374
375 if (!empty($clauses)) {
376 $this->_where = "WHERE {$this->_aliases['civicrm_membership']}.is_test = 0 AND " . implode(' AND ', $clauses);
377 }
378 else {
379 $this->_where = "WHERE {$this->_aliases['civicrm_membership']}.is_test = 0";
380 }
381 }
382
383 function groupBy() {
384 $this->_groupBy = "";
385 if (is_array($this->_params['group_bys']) &&
386 !empty($this->_params['group_bys'])
387 ) {
388 foreach ($this->_columns as $tableName => $table) {
389 if (array_key_exists('group_bys', $table)) {
390 foreach ($table['group_bys'] as $fieldName => $field) {
391 if (CRM_Utils_Array::value($fieldName, $this->_params['group_bys'])) {
392 if (CRM_Utils_Array::value('chart', $field)) {
393 $this->assign('chartSupported', TRUE);
394 }
395 if (CRM_Utils_Array::value('frequency', $table['group_bys'][$fieldName]) &&
396 CRM_Utils_Array::value($fieldName, $this->_params['group_bys_freq'])
397 ) {
398
399 $append = "YEAR({$field['dbAlias']}),";
400 if (in_array(strtolower($this->_params['group_bys_freq'][$fieldName]),
401 array('year')
402 )) {
403 $append = '';
404 }
405 $this->_groupBy[] = "$append {$this->_params['group_bys_freq'][$fieldName]}({$field['dbAlias']})";
406 $append = TRUE;
407 }
408 else {
409 $this->_groupBy[] = $field['dbAlias'];
410 }
411 }
412 }
413 }
414 }
415
416 $this->_rollup = ' WITH ROLLUP';
417 $this->_groupBy = 'GROUP BY ' . implode(', ', $this->_groupBy) . " {$this->_rollup} ";
418 }
419 else {
420 $this->_groupBy = "GROUP BY {$this->_aliases['civicrm_membership']}.join_date";
421 }
422 }
423
424 function statistics(&$rows) {
425 $statistics = parent::statistics($rows);
6a488035
TO
426 $select = "
427 SELECT COUNT({$this->_aliases['civicrm_contribution']}.total_amount ) as count,
428 IFNULL(SUM({$this->_aliases['civicrm_contribution']}.total_amount ), 0) as amount,
429 IFNULL(ROUND(AVG({$this->_aliases['civicrm_contribution']}.total_amount), 2),0) as avg,
35d8497b 430 COUNT( DISTINCT {$this->_aliases['civicrm_membership']}.id ) as memberCount,
431 {$this->_aliases['civicrm_contribution']}.currency as currency
6a488035
TO
432 ";
433
35d8497b 434 $sql = "{$select} {$this->_from} {$this->_where}
435GROUP BY {$this->_aliases['civicrm_contribution']}.currency
436";
6a488035 437
35d8497b 438 $dao = CRM_Core_DAO::executeQuery($sql);
439
440 $totalAmount = $average = array();
441 $count = $memberCount = 0;
442 while ($dao->fetch()) {
443 $totalAmount[] = CRM_Utils_Money::format($dao->amount, $dao->currency)."(".$dao->count.")";
444 $average[] = CRM_Utils_Money::format($dao->avg, $dao->currency);
445 $count += $dao->count;
446 $memberCount += $dao->memberCount;
447 }
448 $statistics['counts']['amount'] = array(
449 'title' => ts('Total Amount'),
450 'value' => implode(', ', $totalAmount),
451 'type' => CRM_Utils_Type::T_STRING,
452 );
453 $statistics['counts']['count'] = array(
454 'title' => ts('Total Donations'),
455 'value' => $count,
456 );
457 $statistics['counts']['memberCount'] = array(
458 'title' => ts('Total Members'),
459 'value' => $memberCount,
460 );
461 $statistics['counts']['avg'] = array(
462 'title' => ts('Average'),
463 'value' => implode(', ', $average),
464 'type' => CRM_Utils_Type::T_STRING,
465 );
6a488035 466
35d8497b 467 if (!(int)$statistics['counts']['amount']['value']) {
468 //if total amount is zero then hide Chart Options
469 $this->assign('chartSupported', FALSE);
6a488035
TO
470 }
471
472 return $statistics;
473 }
474
475 function postProcess() {
476 parent::postProcess();
477 }
478
479 function buildChart(&$rows) {
480 $graphRows = array();
481 $count = 0;
482 $membershipTypeValues = CRM_Member_PseudoConstant::membershipType();
483 $isMembershipType = CRM_Utils_Array::value('membership_type_id', $this->_params['group_bys']);
484 $isJoiningDate = CRM_Utils_Array::value('join_date', $this->_params['group_bys']);
485 if (CRM_Utils_Array::value('charts', $this->_params)) {
486 foreach ($rows as $key => $row) {
487 if (!($row['civicrm_membership_join_date_subtotal'] &&
488 $row['civicrm_membership_membership_type_id']
489 )) {
490 continue;
491 }
492 if ($isMembershipType) {
493 $join_date = CRM_Utils_Array::value('civicrm_membership_join_date_start', $row);
494 $displayInterval = CRM_Utils_Array::value('civicrm_membership_join_date_interval', $row);
495 if ($join_date) {
496 list($year, $month) = explode('-', $join_date);
497 }
498 if (CRM_Utils_Array::value('civicrm_membership_join_date_subtotal', $row)) {
499
500 switch ($this->_interval) {
501 case 'Month':
502 $displayRange = $displayInterval . ' ' . $year;
503 break;
504
505 case 'Quarter':
506 $displayRange = 'Quarter ' . $displayInterval . ' of ' . $year;
507 break;
508
509 case 'Week':
510 $displayRange = 'Week ' . $displayInterval . ' of ' . $year;
511 break;
512
513 case 'Year':
514 $displayRange = $year;
515 break;
516 }
517 $membershipType = $displayRange . "-" . $membershipTypeValues[$row['civicrm_membership_membership_type_id']];
518 }
519 else {
520
521 $membershipType = $membershipTypeValues[$row['civicrm_membership_membership_type_id']];
522 }
523
524 $interval[$membershipType] = $membershipType;
525 $display[$membershipType] = $row['civicrm_contribution_total_amount_sum'];
526 }
527 else {
528 $graphRows['receive_date'][] = CRM_Utils_Array::value('civicrm_membership_join_date_start', $row);
529 $graphRows[$this->_interval][] = CRM_Utils_Array::value('civicrm_membership_join_date_interval', $row);
530 $graphRows['value'][] = $row['civicrm_contribution_total_amount_sum'];
531 $count++;
532 }
533 }
534
535 // build chart.
536 if ($isMembershipType) {
537 $graphRows['value'] = $display;
538 $chartInfo = array(
539 'legend' => 'Membership Summary',
540 'xname' => 'Member Since / Member Type',
541 'yname' => 'Fees',
542 );
543 CRM_Utils_OpenFlashChart::reportChart($graphRows, $this->_params['charts'], $interval, $chartInfo);
544 }
545 else {
546 CRM_Utils_OpenFlashChart::chart($graphRows, $this->_params['charts'], $this->_interval);
547 }
548 }
549 $this->assign('chartType', $this->_params['charts']);
550 }
551
552 function alterDisplay(&$rows) {
553 // custom code to alter rows
554 $entryFound = FALSE;
555 foreach ($rows as $rowNum => $row) {
556 // make count columns point to detail report
557 if (CRM_Utils_Array::value('join_date', $this->_params['group_bys']) &&
558 CRM_Utils_Array::value('civicrm_membership_join_date_start', $row) &&
559 $row['civicrm_membership_join_date_start'] &&
560 $row['civicrm_membership_join_date_subtotal']
561 ) {
562
563 $dateStart = CRM_Utils_Date::customFormat($row['civicrm_membership_join_date_start'], '%Y%m%d');
564 $endDate = new DateTime($dateStart);
565 $dateEnd = array();
566
567 list($dateEnd['Y'], $dateEnd['M'], $dateEnd['d']) = explode(':', $endDate->format('Y:m:d'));
568
569 switch (strtolower($this->_params['group_bys_freq']['join_date'])) {
570 case 'month':
571 $dateEnd = date("Ymd", mktime(0, 0, 0, $dateEnd['M'] + 1,
572 $dateEnd['d'] - 1, $dateEnd['Y']
573 ));
574 break;
575
576 case 'year':
577 $dateEnd = date("Ymd", mktime(0, 0, 0, $dateEnd['M'],
578 $dateEnd['d'] - 1, $dateEnd['Y'] + 1
579 ));
580 break;
581
582 case 'yearweek':
583 $dateEnd = date("Ymd", mktime(0, 0, 0, $dateEnd['M'],
584 $dateEnd['d'] + 6, $dateEnd['Y']
585 ));
586 break;
587
588 case 'quarter':
589 $dateEnd = date("Ymd", mktime(0, 0, 0, $dateEnd['M'] + 3,
590 $dateEnd['d'] - 1, $dateEnd['Y']
591 ));
592 break;
593 }
594 $typeUrl = '';
595 if (CRM_Utils_Array::value('membership_type_id', $this->_params['group_bys']) &&
596 $typeID = $row['civicrm_membership_membership_type_id']
597 ) {
598 $typeUrl = "&tid_op=in&tid_value={$typeID}";
599 }
600 $statusUrl = '';
601 if (!empty($this->_params['status_id_value'])) {
602 $statusUrl = "&sid_op=in&sid_value=" . implode(",", $this->_params['status_id_value']);
603 }
604 $url = CRM_Report_Utils_Report::getNextUrl('member/detail',
605 "reset=1&force=1&join_date_from={$dateStart}&join_date_to={$dateEnd}{$typeUrl}{$statusUrl}",
606 $this->_absoluteUrl, $this->_id, $this->_drilldownReport
607 );
608 $row['civicrm_membership_join_date_start'] = CRM_Utils_Date::format($row['civicrm_membership_join_date_start']);
609 $rows[$rowNum]['civicrm_membership_join_date_start_link'] = $url;
610 $rows[$rowNum]['civicrm_membership_join_date_start_hover'] = ts("Lists Summary of Memberships for this date unit.");
611
612 $entryFound = TRUE;
613 }
614
615 // handle Membership Types
616 if (array_key_exists('civicrm_membership_membership_type_id', $row)) {
617 if ($value = $row['civicrm_membership_membership_type_id']) {
618 $value = explode(',', $value);
619 foreach ($value as $key => $id) {
620 $value[$key] = CRM_Member_PseudoConstant::membershipType($id, FALSE);
621 }
622 $rows[$rowNum]['civicrm_membership_membership_type_id'] = implode(' , ', $value);
623 }
624 $entryFound = TRUE;
625 }
626
627 // make subtotals look nicer
628 if (array_key_exists('civicrm_membership_join_date_subtotal', $row) &&
629 !$row['civicrm_membership_join_date_subtotal']
630 ) {
631 $this->fixSubTotalDisplay($rows[$rowNum], $this->_statFields);
632 $entryFound = TRUE;
633 }
634 elseif (array_key_exists('civicrm_membership_join_date_subtotal', $row) &&
635 $row['civicrm_membership_join_date_subtotal'] &&
636 !$row['civicrm_membership_membership_type_id']
637 ) {
638 $this->fixSubTotalDisplay($rows[$rowNum], $this->_statFields, FALSE);
639 $rows[$rowNum]['civicrm_membership_membership_type_id'] = '<b>SubTotal</b>';
640 $entryFound = TRUE;
641 }
a7dbbc5d
CD
642
643
644 // If using campaigns, convert campaign_id to campaign title
645 if (array_key_exists('civicrm_membership_campaign_id', $row)) {
646 if ($value = $row['civicrm_membership_campaign_id']) {
647 $rows[$rowNum]['civicrm_membership_campaign_id'] = $this->activeCampaigns[$value];
648 }
649 $entryFound = TRUE;
650 }
6a488035
TO
651
652 // skip looking further in rows, if first row itself doesn't
653 // have the column we need
654 if (!$entryFound) {
655 break;
656 }
657 }
658 }
659}
660