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