formating fixes
[civicrm-core.git] / CRM / Mailing / Selector / Event.php
1 <?php
2 /*
3 +--------------------------------------------------------------------+
4 | CiviCRM version 4.6 |
5 +--------------------------------------------------------------------+
6 | Copyright CiviCRM LLC (c) 2004-2014 |
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-2014
32 * $Id$
33 *
34 */
35
36 /**
37 * This class is used to retrieve and display a range of
38 * contacts that match the given criteria (specifically for
39 * results of advanced search options.
40 *
41 */
42 class CRM_Mailing_Selector_Event extends CRM_Core_Selector_Base implements CRM_Core_Selector_API {
43
44 /**
45 * Array of supported links, currenly null
46 *
47 * @var array
48 */
49 static $_links = NULL;
50
51 /**
52 * What event type are we browsing?
53 */
54 private $_event;
55
56 /**
57 * Should we only count distinct contacts?
58 */
59 private $_is_distinct;
60
61 /**
62 * Which mailing are we browsing events from?
63 */
64 private $_mailing_id;
65
66 /**
67 * Do we want events tied to a specific job?
68 */
69 private $_job_id;
70
71 /**
72 * For click-through events, do we only want those from a specific url?
73 */
74 private $_url_id;
75
76 /**
77 * We use desc to remind us what that column is, name is used in the tpl
78 *
79 * @var array
80 */
81 public $_columnHeaders;
82
83 /**
84 * Class constructor.
85 *
86 * @param string $event
87 * The event type (queue/delivered/open...).
88 * @param bool $distinct
89 * Count only distinct contact events?.
90 * @param int $mailing
91 * ID of the mailing to query.
92 * @param int $job
93 * ID of the job to query. If null, all jobs from $mailing are queried.
94 * @param int $url
95 * If the event type is a click-through, do we want only those from a specific url?.
96 *
97 * @return \CRM_Mailing_Selector_Event
98 */
99 public function __construct($event, $distinct, $mailing, $job = NULL, $url = NULL) {
100 $this->_event_type = $event;
101 $this->_is_distinct = $distinct;
102 $this->_mailing_id = $mailing;
103 $this->_job_id = $job;
104 $this->_url_id = $url;
105 }
106
107 /**
108 * This method returns the links that are given for each search row.
109 *
110 * @return array
111 */
112 public static function &links() {
113 return self::$_links;
114 }
115
116 /**
117 * Getter for array of the parameters required for creating pager.
118 *
119 * @param $action
120 * @param array $params
121 */
122 public function getPagerParams($action, &$params) {
123 $params['csvString'] = NULL;
124 $params['rowCount'] = CRM_Utils_Pager::ROWCOUNT;
125 $params['status'] = ts('%1 %%StatusMessage%%', array(1 => $this->eventToTitle()));
126 $params['buttonTop'] = 'PagerTopButton';
127 $params['buttonBottom'] = 'PagerBottomButton';
128 }
129
130 /**
131 * Returns the column headers as an array of tuples:
132 * (name, sortName (key to the sort array))
133 *
134 * @param string $action
135 * The action being performed.
136 * @param string $output
137 * What should the result set include (web/email/csv).
138 *
139 * @return array
140 * the column headers that need to be displayed
141 */
142 public function &getColumnHeaders($action = NULL, $output = NULL) {
143 $mailing = CRM_Mailing_BAO_Mailing::getTableName();
144
145 $contact = CRM_Contact_BAO_Contact::getTableName();
146
147 $email = CRM_Core_BAO_Email::getTableName();
148
149 $job = CRM_Mailing_BAO_MailingJob::getTableName();
150 if (!isset($this->_columnHeaders)) {
151
152 $this->_columnHeaders = array(
153 'sort_name' => array(
154 'name' => ts('Contact'),
155 'sort' => $contact . '.sort_name',
156 'direction' => CRM_Utils_Sort::ASCENDING,
157 ),
158 'email' => array(
159 'name' => ts('Email Address'),
160 'sort' => $email . '.email',
161 'direction' => CRM_Utils_Sort::DONTCARE,
162 ),
163 );
164
165 switch ($this->_event_type) {
166 case 'queue':
167 $dateSort = $job . '.start_date';
168 break;
169
170 case 'delivered':
171 $this->_columnHeaders = array(
172 'contact_id' => array(
173 'name' => ts('Internal Contact ID'),
174 'sort' => $contact . '.id',
175 'direction' => CRM_Utils_Sort::ASCENDING,
176 ),
177 ) + $this->_columnHeaders;
178 $dateSort = CRM_Mailing_Event_BAO_Delivered::getTableName() . '.time_stamp';
179 break;
180
181 case 'opened':
182 $dateSort = CRM_Mailing_Event_BAO_Opened::getTableName() . '.time_stamp';
183 break;
184
185 case 'bounce':
186 $dateSort = CRM_Mailing_Event_BAO_Bounce::getTableName() . '.time_stamp';
187 $this->_columnHeaders = array_merge($this->_columnHeaders,
188 array(
189 array(
190 'name' => ts('Bounce Type'),
191 ),
192 array(
193 'name' => ts('Bounce Reason'),
194 ),
195 )
196 );
197 break;
198
199 case 'forward':
200 $dateSort = CRM_Mailing_Event_BAO_Forward::getTableName() . '.time_stamp';
201
202 $this->_columnHeaders = array_merge($this->_columnHeaders,
203 array(
204 array(
205 'name' => ts('Forwarded Email'),
206 ),
207 )
208 );
209 break;
210
211 case 'reply':
212 $dateSort = CRM_Mailing_Event_BAO_Reply::getTableName() . '.time_stamp';
213 break;
214
215 case 'unsubscribe':
216 $dateSort = CRM_Mailing_Event_BAO_Unsubscribe::getTableName() . '.time_stamp';
217 $this->_columnHeaders = array_merge($this->_columnHeaders, array(
218 array(
219 'name' => ts('Unsubscribe'),
220 ),
221 ));
222 break;
223
224 case 'optout':
225 $dateSort = CRM_Mailing_Event_BAO_Unsubscribe::getTableName() . '.time_stamp';
226 $this->_columnHeaders = array_merge($this->_columnHeaders, array(
227 array(
228 'name' => ts('Opt-Out'),
229 ),
230 ));
231 break;
232
233 case 'click':
234 $dateSort = CRM_Mailing_Event_BAO_TrackableURLOpen::getTableName() . '.time_stamp';
235 $this->_columnHeaders = array_merge($this->_columnHeaders, array(
236 array(
237 'name' => ts('URL'),
238 ),
239 ));
240 break;
241
242 default:
243 return 0;
244 }
245
246 $this->_columnHeaders = array_merge($this->_columnHeaders, array(
247 'date' => array(
248 'name' => ts('Date'),
249 'sort' => $dateSort,
250 'direction' => CRM_Utils_Sort::DESCENDING,
251 ),
252 ));
253 }
254 return $this->_columnHeaders;
255 }
256
257 /**
258 * Returns total number of rows for the query.
259 *
260 * @param
261 *
262 * @return int
263 * Total number of rows
264 */
265 public function getTotalCount($action) {
266 switch ($this->_event_type) {
267 case 'queue':
268 $event = new CRM_Mailing_Event_BAO_Queue();
269 $result = $event->getTotalCount($this->_mailing_id,
270 $this->_job_id
271 );
272 return $result;
273
274 case 'delivered':
275 $event = new CRM_Mailing_Event_BAO_Delivered();
276 $result = $event->getTotalCount($this->_mailing_id,
277 $this->_job_id,
278 $this->_is_distinct
279 );
280 return $result;
281
282 case 'opened':
283 $event = new CRM_Mailing_Event_BAO_Opened();
284 $result = $event->getTotalCount($this->_mailing_id,
285 $this->_job_id,
286 $this->_is_distinct
287 );
288 return $result;
289
290 case 'bounce':
291 $event = new CRM_Mailing_Event_BAO_Bounce();
292 $result = $event->getTotalCount($this->_mailing_id,
293 $this->_job_id,
294 $this->_is_distinct
295 );
296 return $result;
297
298 case 'forward':
299 $event = new CRM_Mailing_Event_BAO_Forward();
300 $result = $event->getTotalCount($this->_mailing_id,
301 $this->_job_id,
302 $this->_is_distinct
303 );
304 return $result;
305
306 case 'reply':
307 $event = new CRM_Mailing_Event_BAO_Reply();
308 $result = $event->getTotalCount($this->_mailing_id,
309 $this->_job_id,
310 $this->_is_distinct
311 );
312 return $result;
313
314 case 'unsubscribe':
315 $event = new CRM_Mailing_Event_BAO_Unsubscribe();
316 $result = $event->getTotalCount($this->_mailing_id,
317 $this->_job_id,
318 $this->_is_distinct
319 );
320 return $result;
321
322 case 'optout':
323 $event = new CRM_Mailing_Event_BAO_Unsubscribe();
324 $result = $event->getTotalCount($this->_mailing_id,
325 $this->_job_id,
326 $this->_is_distinct,
327 FALSE
328 );
329 return $result;
330
331 case 'click':
332 $event = new CRM_Mailing_Event_BAO_TrackableURLOpen();
333 $result = $event->getTotalCount($this->_mailing_id,
334 $this->_job_id,
335 $this->_is_distinct,
336 $this->_url_id
337 );
338 return $result;
339
340 default:
341 return 0;
342 }
343 }
344
345 /**
346 * Returns all the rows in the given offset and rowCount.
347 *
348 * @param string $action
349 * The action being performed.
350 * @param int $offset
351 * The row number to start from.
352 * @param int $rowCount
353 * The number of rows to return.
354 * @param string $sort
355 * The sql string that describes the sort order.
356 * @param string $output
357 * What should the result set include (web/email/csv).
358 *
359 * @return int
360 * the total number of rows for this action
361 */
362 public function &getRows($action, $offset, $rowCount, $sort, $output = NULL) {
363 switch ($this->_event_type) {
364 case 'queue':
365 $rows = CRM_Mailing_Event_BAO_Queue::getRows($this->_mailing_id,
366 $this->_job_id, $offset, $rowCount, $sort
367 );
368 return $rows;
369
370 case 'delivered':
371 $rows = CRM_Mailing_Event_BAO_Delivered::getRows($this->_mailing_id,
372 $this->_job_id, $this->_is_distinct,
373 $offset, $rowCount, $sort
374 );
375 return $rows;
376
377 case 'opened':
378 $rows = CRM_Mailing_Event_BAO_Opened::getRows($this->_mailing_id,
379 $this->_job_id, $this->_is_distinct,
380 $offset, $rowCount, $sort
381 );
382 return $rows;
383
384 case 'bounce':
385 $rows = CRM_Mailing_Event_BAO_Bounce::getRows($this->_mailing_id,
386 $this->_job_id, $this->_is_distinct,
387 $offset, $rowCount, $sort
388 );
389 return $rows;
390
391 case 'forward':
392 $rows = CRM_Mailing_Event_BAO_Forward::getRows($this->_mailing_id,
393 $this->_job_id, $this->_is_distinct,
394 $offset, $rowCount, $sort
395 );
396 return $rows;
397
398 case 'reply':
399 $rows = CRM_Mailing_Event_BAO_Reply::getRows($this->_mailing_id,
400 $this->_job_id, $this->_is_distinct,
401 $offset, $rowCount, $sort
402 );
403 return $rows;
404
405 case 'unsubscribe':
406 $rows = CRM_Mailing_Event_BAO_Unsubscribe::getRows($this->_mailing_id,
407 $this->_job_id, $this->_is_distinct,
408 $offset, $rowCount, $sort, TRUE
409 );
410 return $rows;
411
412 case 'optout':
413 $rows = CRM_Mailing_Event_BAO_Unsubscribe::getRows($this->_mailing_id,
414 $this->_job_id, $this->_is_distinct,
415 $offset, $rowCount, $sort, FALSE
416 );
417 return $rows;
418
419 case 'click':
420 $rows = CRM_Mailing_Event_BAO_TrackableURLOpen::getRows(
421 $this->_mailing_id, $this->_job_id,
422 $this->_is_distinct, $this->_url_id,
423 $offset, $rowCount, $sort
424 );
425 return $rows;
426
427 default:
428 return NULL;
429 }
430 }
431
432 /**
433 * Name of export file.
434 *
435 * @param string $output
436 * Type of output.
437 *
438 * @return string|NULL
439 * name of the file
440 */
441 public function getExportFileName($output = 'csv') {
442 return NULL;
443 }
444
445 public function eventToTitle() {
446 static $events = NULL;
447
448 if (empty($events)) {
449 $events = array(
450 'queue' => ts('Intended Recipients'),
451 'delivered' => ts('Successful Deliveries'),
452 'bounce' => ts('Bounces'),
453 'forward' => ts('Forwards'),
454 'reply' => $this->_is_distinct ? ts('Unique Replies') : ts('Replies'),
455 'unsubscribe' => ts('Unsubscribe Requests'),
456 'optout' => ts('Opt-out Requests'),
457 'click' => $this->_is_distinct ? ts('Unique Click-throughs') : ts('Click-throughs'),
458 'opened' => $this->_is_distinct ? ts('Unique Tracked Opens') : ts('Tracked Opens'),
459 );
460 }
461 return $events[$this->_event_type];
462 }
463
464 public function getTitle() {
465 return $this->eventToTitle();
466 }
467
468 }