Merge pull request #2033 from JoeMurray/master
[civicrm-core.git] / CRM / Report / Form / Member / Summary.php
1 <?php
2 /*
3 +--------------------------------------------------------------------+
4 | CiviCRM version 4.4 |
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 */
35 class 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');
47 protected $_customGroupGroupBy = FALSE;
48 public $_drilldownReport = array('member/detail' => 'Link to Detail Report');
49
50 function __construct() {
51
52 // UI for selecting columns to appear in the report list
53 // Array containing the columns, group_bys and filters build and provided to Form
54
55 // Check if CiviCampaign is a) enabled and b) has active campaigns
56 $config = CRM_Core_Config::singleton();
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 }
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 ),
98 'owner_membership_id' =>
99 array('title' => ts('Membership Owner ID'),
100 'type' => CRM_Utils_Type::T_INT,
101 'operatorType' => CRM_Report_Form::OP_INT,
102 ),
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 'contact_type' =>
141 array(
142 'title' => ts('Contact Type'),
143 ),
144 'contact_sub_type' =>
145 array(
146 'title' => ts('Contact SubType'),
147 ),
148 ),
149 ),
150 'civicrm_contribution' =>
151 array(
152 'dao' => 'CRM_Contribute_DAO_Contribution',
153 'fields' =>
154 array(
155 'currency' =>
156 array('required' => TRUE,
157 'no_display' => TRUE,
158 ),
159 'total_amount' =>
160 array('title' => ts('Amount Statistics'),
161 'required' => TRUE,
162 'statistics' =>
163 array('sum' => ts('Total Payments Made'),
164 'count' => ts('Contribution Count'),
165 'avg' => ts('Average'),
166 ),
167 ),
168 ),
169 'filters' =>
170 array(
171 'currency' =>
172 array('title' => 'Currency',
173 'operatorType' => CRM_Report_Form::OP_MULTISELECT,
174 'options' => CRM_Core_OptionGroup::values('currencies_enabled'),
175 'default' => NULL,
176 'type' => CRM_Utils_Type::T_STRING,
177 ),
178 'contribution_status_id' =>
179 array('title' => ts('Contribution Status'),
180 'operatorType' => CRM_Report_Form::OP_MULTISELECT,
181 'options' => CRM_Contribute_PseudoConstant::contributionStatus(),
182 ),
183 ),
184 'grouping' => 'member-fields',
185 ),
186 );
187 $this->_tagFilter = TRUE;
188
189 // If we have a campaign, build out the relevant elements
190 if ($campaignEnabled && !empty($this->activeCampaigns)) {
191 $this->_columns['civicrm_membership']['fields']['campaign_id'] = array(
192 'title' => 'Campaign',
193 'default' => 'false',
194 );
195 $this->_columns['civicrm_membership']['filters']['campaign_id'] = array('title' => ts('Campaign'),
196 'operatorType' => CRM_Report_Form::OP_MULTISELECT,
197 'options' => $this->activeCampaigns,
198 );
199 $this->_columns['civicrm_membership']['grouping']['campaign_id'] = 'contri-fields';
200 $this->_columns['civicrm_membership']['group_bys']['campaign_id'] = array('title' => ts('Campaign'));
201 }
202
203
204 $this->_groupFilter = TRUE;
205 $this->_currencyColumn = 'civicrm_contribution_currency';
206 parent::__construct();
207 }
208
209 function select() {
210 $select = array();
211 $groupBys = FALSE;
212 $this->_columnHeaders = array();
213 $select[] = " COUNT( DISTINCT {$this->_aliases['civicrm_membership']}.id ) as civicrm_membership_member_count";
214 $select['joinDate'] = " {$this->_aliases['civicrm_membership']}.join_date as civicrm_membership_member_join_date";
215 $this->_columnHeaders["civicrm_membership_member_join_date"] = array('title' => ts('Member Since'),
216 'type' => CRM_Utils_Type::T_DATE,
217 );
218 foreach ($this->_columns as $tableName => $table) {
219 if (array_key_exists('group_bys', $table)) {
220 foreach ($table['group_bys'] as $fieldName => $field) {
221 if (CRM_Utils_Array::value($fieldName, $this->_params['group_bys'])) {
222
223 switch (CRM_Utils_Array::value($fieldName, $this->_params['group_bys_freq'])) {
224 case 'YEARWEEK':
225 $select[] = "DATE_SUB({$field['dbAlias']}, INTERVAL WEEKDAY({$field['dbAlias']}) DAY) AS {$tableName}_{$fieldName}_start";
226
227 $select[] = "YEARWEEK({$field['dbAlias']}) AS {$tableName}_{$fieldName}_subtotal";
228 $select[] = "WEEKOFYEAR({$field['dbAlias']}) AS {$tableName}_{$fieldName}_interval";
229 $field['title'] = 'Week';
230 break;
231
232 case 'YEAR':
233 $select[] = "MAKEDATE(YEAR({$field['dbAlias']}), 1) AS {$tableName}_{$fieldName}_start";
234 $select[] = "YEAR({$field['dbAlias']}) AS {$tableName}_{$fieldName}_subtotal";
235 $select[] = "YEAR({$field['dbAlias']}) AS {$tableName}_{$fieldName}_interval";
236 $field['title'] = 'Year';
237 break;
238
239 case 'MONTH':
240 $select[] = "DATE_SUB({$field['dbAlias']}, INTERVAL (DAYOFMONTH({$field['dbAlias']})-1) DAY) as {$tableName}_{$fieldName}_start";
241 $select[] = "MONTH({$field['dbAlias']}) AS {$tableName}_{$fieldName}_subtotal";
242 $select[] = "MONTHNAME({$field['dbAlias']}) AS {$tableName}_{$fieldName}_interval";
243 $field['title'] = 'Month';
244 break;
245
246 case 'QUARTER':
247 $select[] = "STR_TO_DATE(CONCAT( 3 * QUARTER( {$field['dbAlias']} ) -2 , '/', '1', '/', YEAR( {$field['dbAlias']} ) ), '%m/%d/%Y') AS {$tableName}_{$fieldName}_start";
248 $select[] = "QUARTER({$field['dbAlias']}) AS {$tableName}_{$fieldName}_subtotal";
249 $select[] = "QUARTER({$field['dbAlias']}) AS {$tableName}_{$fieldName}_interval";
250 $field['title'] = 'Quarter';
251 break;
252 }
253 if (CRM_Utils_Array::value($fieldName, $this->_params['group_bys_freq'])) {
254 $this->_interval = $field['title'];
255 $this->_columnHeaders["{$tableName}_{$fieldName}_start"]['title'] = $field['title'] . ' Beginning';
256 $this->_columnHeaders["{$tableName}_{$fieldName}_start"]['type'] = $field['type'];
257 $this->_columnHeaders["{$tableName}_{$fieldName}_start"]['group_by'] = $this->_params['group_bys_freq'][$fieldName];
258
259 // just to make sure these values are transfered to rows.
260 // since we need that for calculation purpose,
261 // e.g making subtotals look nicer or graphs
262 $this->_columnHeaders["{$tableName}_{$fieldName}_interval"] = array('no_display' => TRUE);
263 $this->_columnHeaders["{$tableName}_{$fieldName}_subtotal"] = array('no_display' => TRUE);
264 }
265 $groupBys = TRUE;
266 }
267 }
268 }
269 // end of select
270
271 if (array_key_exists('fields', $table)) {
272 foreach ($table['fields'] as $fieldName => $field) {
273 if (CRM_Utils_Array::value('required', $field) ||
274 CRM_Utils_Array::value($fieldName, $this->_params['fields'])
275 ) {
276
277 // only include statistics columns if set
278 if (CRM_Utils_Array::value('statistics', $field)) {
279 $this->_statFields[] = 'civicrm_membership_member_count';
280 foreach ($field['statistics'] as $stat => $label) {
281 switch (strtolower($stat)) {
282 case 'sum':
283 $select[] = "IFNULL(SUM({$field['dbAlias']}), 0) as {$tableName}_{$fieldName}_{$stat}";
284 $this->_columnHeaders["{$tableName}_{$fieldName}_{$stat}"]['title'] = $label;
285 $this->_columnHeaders["{$tableName}_{$fieldName}_{$stat}"]['type'] = $field['type'];
286 $this->_statFields[] = "{$tableName}_{$fieldName}_{$stat}";
287 break;
288
289 case 'count':
290 $select[] = "COUNT({$field['dbAlias']}) as {$tableName}_{$fieldName}_{$stat}";
291 $this->_columnHeaders["{$tableName}_{$fieldName}_{$stat}"]['type'] = CRM_Utils_Type::T_INT;
292 $this->_columnHeaders["{$tableName}_{$fieldName}_{$stat}"]['title'] = $label;
293 $this->_statFields[] = "{$tableName}_{$fieldName}_{$stat}";
294 break;
295
296 case 'avg':
297 $select[] = "IFNULL(ROUND(AVG({$field['dbAlias']}),2), 0) as {$tableName}_{$fieldName}_{$stat}";
298 $this->_columnHeaders["{$tableName}_{$fieldName}_{$stat}"]['type'] = $field['type'];
299 $this->_columnHeaders["{$tableName}_{$fieldName}_{$stat}"]['title'] = $label;
300 $this->_statFields[] = "{$tableName}_{$fieldName}_{$stat}";
301 break;
302 }
303 }
304 }
305 elseif ($fieldName == 'membership_type_id') {
306 if (!CRM_Utils_Array::value('membership_type_id', $this->_params['group_bys']) &&
307 CRM_Utils_Array::value('join_date', $this->_params['group_bys'])
308 ) {
309 $select[] = "GROUP_CONCAT(DISTINCT {$field['dbAlias']} ORDER BY {$field['dbAlias']} ) as {$tableName}_{$fieldName}";
310 }
311 else {
312 $select[] = "{$field['dbAlias']} as {$tableName}_{$fieldName}";
313 }
314 $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = $field['title'];
315 $this->_columnHeaders["{$tableName}_{$fieldName}"]['operatorType'] = CRM_Utils_Array::value('operatorType', $field);
316 }
317 else {
318 $select[] = "{$field['dbAlias']} as {$tableName}_{$fieldName}";
319 $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = $field['title'];
320 $this->_columnHeaders["{$tableName}_{$fieldName}"]['operatorType'] = CRM_Utils_Array::value('operatorType', $field);
321 }
322 }
323 }
324 }
325 $this->_columnHeaders["civicrm_membership_member_count"] = array('title' => ts('Member Count'),
326 'type' => CRM_Utils_Type::T_INT,
327 );
328 }
329 //If grouping is availabled then remove join date from field
330 if ($groupBys) {
331 unset($select['joinDate']);
332 unset($this->_columnHeaders["civicrm_membership_member_join_date"]);
333 }
334 $this->_select = "SELECT " . implode(', ', $select) . " ";
335 }
336
337 function from() {
338 $this->_from = "
339 FROM civicrm_membership {$this->_aliases['civicrm_membership']}
340
341 LEFT JOIN civicrm_contact {$this->_aliases['civicrm_contact']} ON ( {$this->_aliases['civicrm_membership']}.contact_id = {$this->_aliases['civicrm_contact']}.id )
342
343 LEFT JOIN civicrm_membership_status
344 ON ({$this->_aliases['civicrm_membership']}.status_id = civicrm_membership_status.id )
345 LEFT JOIN civicrm_membership_payment payment
346 ON ( {$this->_aliases['civicrm_membership']}.id = payment.membership_id )
347 LEFT JOIN civicrm_contribution {$this->_aliases['civicrm_contribution']}
348 ON payment.contribution_id = {$this->_aliases['civicrm_contribution']}.id";
349 }
350 // end of from
351
352 function where() {
353 $this->_whereClauses[] = "{$this->_aliases['civicrm_membership']}.is_test = 0";
354 parent::where();
355 }
356
357 function groupBy() {
358 $this->_groupBy = "";
359 if (is_array($this->_params['group_bys']) &&
360 !empty($this->_params['group_bys'])
361 ) {
362 foreach ($this->_columns as $tableName => $table) {
363 if (array_key_exists('group_bys', $table)) {
364 foreach ($table['group_bys'] as $fieldName => $field) {
365 if (CRM_Utils_Array::value($fieldName, $this->_params['group_bys'])) {
366 if (CRM_Utils_Array::value('chart', $field)) {
367 $this->assign('chartSupported', TRUE);
368 }
369 if (CRM_Utils_Array::value('frequency', $table['group_bys'][$fieldName]) &&
370 CRM_Utils_Array::value($fieldName, $this->_params['group_bys_freq'])
371 ) {
372
373 $append = "YEAR({$field['dbAlias']}),";
374 if (in_array(strtolower($this->_params['group_bys_freq'][$fieldName]),
375 array('year')
376 )) {
377 $append = '';
378 }
379 $this->_groupBy[] = "$append {$this->_params['group_bys_freq'][$fieldName]}({$field['dbAlias']})";
380 $append = TRUE;
381 }
382 else {
383 $this->_groupBy[] = $field['dbAlias'];
384 }
385 }
386 }
387 }
388 }
389
390 $this->_rollup = ' WITH ROLLUP';
391 $this->_groupBy = 'GROUP BY ' . implode(', ', $this->_groupBy) . " {$this->_rollup} ";
392 }
393 else {
394 $this->_groupBy = "GROUP BY {$this->_aliases['civicrm_membership']}.join_date";
395 }
396 }
397
398 function statistics(&$rows) {
399 $statistics = parent::statistics($rows);
400 $select = "
401 SELECT COUNT({$this->_aliases['civicrm_contribution']}.total_amount ) as count,
402 IFNULL(SUM({$this->_aliases['civicrm_contribution']}.total_amount ), 0) as amount,
403 IFNULL(ROUND(AVG({$this->_aliases['civicrm_contribution']}.total_amount), 2),0) as avg,
404 COUNT( DISTINCT {$this->_aliases['civicrm_membership']}.id ) as memberCount,
405 {$this->_aliases['civicrm_contribution']}.currency as currency
406 ";
407
408 $sql = "{$select} {$this->_from} {$this->_where}
409 GROUP BY {$this->_aliases['civicrm_contribution']}.currency
410 ";
411
412 $dao = CRM_Core_DAO::executeQuery($sql);
413
414 $totalAmount = $average = array();
415 $count = $memberCount = 0;
416 while ($dao->fetch()) {
417 $totalAmount[] = CRM_Utils_Money::format($dao->amount, $dao->currency)."(".$dao->count.")";
418 $average[] = CRM_Utils_Money::format($dao->avg, $dao->currency);
419 $count += $dao->count;
420 $memberCount += $dao->memberCount;
421 }
422 $statistics['counts']['amount'] = array(
423 'title' => ts('Total Amount'),
424 'value' => implode(', ', $totalAmount),
425 'type' => CRM_Utils_Type::T_STRING,
426 );
427 $statistics['counts']['count'] = array(
428 'title' => ts('Total Donations'),
429 'value' => $count,
430 );
431 $statistics['counts']['memberCount'] = array(
432 'title' => ts('Total Members'),
433 'value' => $memberCount,
434 );
435 $statistics['counts']['avg'] = array(
436 'title' => ts('Average'),
437 'value' => implode(', ', $average),
438 'type' => CRM_Utils_Type::T_STRING,
439 );
440
441 if (!(int)$statistics['counts']['amount']['value']) {
442 //if total amount is zero then hide Chart Options
443 $this->assign('chartSupported', FALSE);
444 }
445
446 return $statistics;
447 }
448
449 function postProcess() {
450 parent::postProcess();
451 }
452
453 function buildChart(&$rows) {
454 $graphRows = array();
455 $count = 0;
456 $membershipTypeValues = CRM_Member_PseudoConstant::membershipType();
457 $isMembershipType = CRM_Utils_Array::value('membership_type_id', $this->_params['group_bys']);
458 $isJoiningDate = CRM_Utils_Array::value('join_date', $this->_params['group_bys']);
459 if (CRM_Utils_Array::value('charts', $this->_params)) {
460 foreach ($rows as $key => $row) {
461 if (!($row['civicrm_membership_join_date_subtotal'] &&
462 $row['civicrm_membership_membership_type_id']
463 )) {
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 }
472 if (CRM_Utils_Array::value('civicrm_membership_join_date_subtotal', $row)) {
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 }
491 $membershipType = $displayRange . "-" . $membershipTypeValues[$row['civicrm_membership_membership_type_id']];
492 }
493 else {
494
495 $membershipType = $membershipTypeValues[$row['civicrm_membership_membership_type_id']];
496 }
497
498 $interval[$membershipType] = $membershipType;
499 $display[$membershipType] = $row['civicrm_contribution_total_amount_sum'];
500 }
501 else {
502 $graphRows['receive_date'][] = CRM_Utils_Array::value('civicrm_membership_join_date_start', $row);
503 $graphRows[$this->_interval][] = CRM_Utils_Array::value('civicrm_membership_join_date_interval', $row);
504 $graphRows['value'][] = $row['civicrm_contribution_total_amount_sum'];
505 $count++;
506 }
507 }
508
509 // build chart.
510 if ($isMembershipType) {
511 $graphRows['value'] = $display;
512 $chartInfo = array(
513 'legend' => 'Membership Summary',
514 'xname' => 'Member Since / Member Type',
515 'yname' => 'Fees',
516 );
517 CRM_Utils_OpenFlashChart::reportChart($graphRows, $this->_params['charts'], $interval, $chartInfo);
518 }
519 else {
520 CRM_Utils_OpenFlashChart::chart($graphRows, $this->_params['charts'], $this->_interval);
521 }
522 }
523 $this->assign('chartType', $this->_params['charts']);
524 }
525
526 function alterDisplay(&$rows) {
527 // custom code to alter rows
528 $entryFound = FALSE;
529 foreach ($rows as $rowNum => $row) {
530 // make count columns point to detail report
531 if (CRM_Utils_Array::value('join_date', $this->_params['group_bys']) &&
532 CRM_Utils_Array::value('civicrm_membership_join_date_start', $row) &&
533 $row['civicrm_membership_join_date_start'] &&
534 $row['civicrm_membership_join_date_subtotal']
535 ) {
536
537 $dateStart = CRM_Utils_Date::customFormat($row['civicrm_membership_join_date_start'], '%Y%m%d');
538 $endDate = new DateTime($dateStart);
539 $dateEnd = array();
540
541 list($dateEnd['Y'], $dateEnd['M'], $dateEnd['d']) = explode(':', $endDate->format('Y:m:d'));
542
543 switch (strtolower($this->_params['group_bys_freq']['join_date'])) {
544 case 'month':
545 $dateEnd = date("Ymd", mktime(0, 0, 0, $dateEnd['M'] + 1,
546 $dateEnd['d'] - 1, $dateEnd['Y']
547 ));
548 break;
549
550 case 'year':
551 $dateEnd = date("Ymd", mktime(0, 0, 0, $dateEnd['M'],
552 $dateEnd['d'] - 1, $dateEnd['Y'] + 1
553 ));
554 break;
555
556 case 'yearweek':
557 $dateEnd = date("Ymd", mktime(0, 0, 0, $dateEnd['M'],
558 $dateEnd['d'] + 6, $dateEnd['Y']
559 ));
560 break;
561
562 case 'quarter':
563 $dateEnd = date("Ymd", mktime(0, 0, 0, $dateEnd['M'] + 3,
564 $dateEnd['d'] - 1, $dateEnd['Y']
565 ));
566 break;
567 }
568 $typeUrl = '';
569 if (CRM_Utils_Array::value('membership_type_id', $this->_params['group_bys']) &&
570 $typeID = $row['civicrm_membership_membership_type_id']
571 ) {
572 $typeUrl = "&tid_op=in&tid_value={$typeID}";
573 }
574 $statusUrl = '';
575 if (!empty($this->_params['status_id_value'])) {
576 $statusUrl = "&sid_op=in&sid_value=" . implode(",", $this->_params['status_id_value']);
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);
613 $rows[$rowNum]['civicrm_membership_membership_type_id'] = '<b>SubTotal</b>';
614 $entryFound = TRUE;
615 }
616
617
618 // If using campaigns, convert campaign_id to campaign title
619 if (array_key_exists('civicrm_membership_campaign_id', $row)) {
620 if ($value = $row['civicrm_membership_campaign_id']) {
621 $rows[$rowNum]['civicrm_membership_campaign_id'] = $this->activeCampaigns[$value];
622 }
623 $entryFound = TRUE;
624 }
625
626 // skip looking further in rows, if first row itself doesn't
627 // have the column we need
628 if (!$entryFound) {
629 break;
630 }
631 }
632 }
633 }
634