Merge pull request #11972 from eileenmcnaughton/sch
[civicrm-core.git] / CRM / Pledge / Selector / Search.php
1 <?php
2 /*
3 +--------------------------------------------------------------------+
4 | CiviCRM version 5 |
5 +--------------------------------------------------------------------+
6 | Copyright CiviCRM LLC (c) 2004-2018 |
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-2018
32 */
33
34 /**
35 * This class is used to retrieve and display a range of
36 * contacts that match the given criteria (specifically for
37 * results of advanced search options.
38 */
39 class CRM_Pledge_Selector_Search extends CRM_Core_Selector_Base {
40
41 /**
42 * This defines two actions- View and Edit.
43 *
44 * @var array
45 */
46 static $_links = NULL;
47
48 /**
49 * We use desc to remind us what that column is, name is used in the tpl
50 *
51 * @var array
52 */
53 static $_columnHeaders;
54
55 /**
56 * Properties of contact we're interested in displaying
57 *
58 * @var array
59 */
60 static $_properties = array(
61 'contact_id',
62 'sort_name',
63 'display_name',
64 'pledge_id',
65 'pledge_amount',
66 'pledge_create_date',
67 'pledge_total_paid',
68 'pledge_next_pay_date',
69 'pledge_next_pay_amount',
70 'pledge_outstanding_amount',
71 'pledge_status_id',
72 'pledge_status',
73 'pledge_is_test',
74 'pledge_contribution_page_id',
75 'pledge_financial_type',
76 'pledge_campaign_id',
77 'pledge_currency',
78 );
79
80 /**
81 * Are we restricting ourselves to a single contact
82 *
83 * @var boolean
84 */
85 protected $_single = FALSE;
86
87 /**
88 * Are we restricting ourselves to a single contact
89 *
90 * @var boolean
91 */
92 protected $_limit = NULL;
93
94 /**
95 * What context are we being invoked from
96 *
97 * @var string
98 */
99 protected $_context = NULL;
100
101 /**
102 * QueryParams is the array returned by exportValues called on
103 * the HTML_QuickForm_Controller for that page.
104 *
105 * @var array
106 */
107 public $_queryParams;
108
109 /**
110 * Represent the type of selector
111 *
112 * @var int
113 */
114 protected $_action;
115
116 /**
117 * The additional clause that we restrict the search with
118 *
119 * @var string
120 */
121 protected $_additionalClause = NULL;
122
123 /**
124 * The query object
125 *
126 * @var string
127 */
128 protected $_query;
129
130 /**
131 * Class constructor.
132 *
133 * @param array $queryParams
134 * Array of parameters for query.
135 * @param \const|int $action - action of search basic or advanced.
136 * @param string $additionalClause
137 * If the caller wants to further restrict the search (used in participations).
138 * @param bool $single
139 * Are we dealing only with one contact?.
140 * @param int $limit
141 * How many signers do we want returned.
142 *
143 * @param string $context
144 *
145 * @return \CRM_Pledge_Selector_Search
146 */
147 public function __construct(
148 &$queryParams,
149 $action = CRM_Core_Action::NONE,
150 $additionalClause = NULL,
151 $single = FALSE,
152 $limit = NULL,
153 $context = 'search'
154 ) {
155 // submitted form values
156 $this->_queryParams = &$queryParams;
157
158 $this->_single = $single;
159 $this->_limit = $limit;
160 $this->_context = $context;
161
162 $this->_additionalClause = $additionalClause;
163
164 // type of selector
165 $this->_action = $action;
166
167 $this->_query = new CRM_Contact_BAO_Query($this->_queryParams, NULL, NULL, FALSE, FALSE,
168 CRM_Contact_BAO_Query::MODE_PLEDGE
169 );
170
171 $this->_query->_distinctComponentClause = "civicrm_pledge.id";
172 $this->_query->_groupByComponentClause = " GROUP BY civicrm_pledge.id ";
173 }
174
175 /**
176 * This method returns the links that are given for each search row.
177 *
178 * Currently the links added for each row are:
179 * - View
180 * - Edit
181 *
182 * @return array
183 */
184 public static function &links() {
185 $args = func_get_args();
186 $hideOption = CRM_Utils_Array::value(0, $args);
187 $key = CRM_Utils_Array::value(1, $args);
188
189 $extraParams = ($key) ? "&key={$key}" : NULL;
190
191 $cancelExtra = ts('Cancelling this pledge will also cancel any scheduled (and not completed) pledge payments.') . ' ' . ts('This action cannot be undone.') . ' ' . ts('Do you want to continue?');
192 self::$_links = array(
193 CRM_Core_Action::VIEW => array(
194 'name' => ts('View'),
195 'url' => 'civicrm/contact/view/pledge',
196 'qs' => 'reset=1&id=%%id%%&cid=%%cid%%&action=view&context=%%cxt%%&selectedChild=pledge' . $extraParams,
197 'title' => ts('View Pledge'),
198 ),
199 CRM_Core_Action::UPDATE => array(
200 'name' => ts('Edit'),
201 'url' => 'civicrm/contact/view/pledge',
202 'qs' => 'reset=1&action=update&id=%%id%%&cid=%%cid%%&context=%%cxt%%' . $extraParams,
203 'title' => ts('Edit Pledge'),
204 ),
205 CRM_Core_Action::DETACH => array(
206 'name' => ts('Cancel'),
207 'url' => 'civicrm/contact/view/pledge',
208 'qs' => 'reset=1&action=detach&id=%%id%%&cid=%%cid%%&context=%%cxt%%' . $extraParams,
209 'extra' => 'onclick = "return confirm(\'' . $cancelExtra . '\');"',
210 'title' => ts('Cancel Pledge'),
211 ),
212 CRM_Core_Action::DELETE => array(
213 'name' => ts('Delete'),
214 'url' => 'civicrm/contact/view/pledge',
215 'qs' => 'reset=1&action=delete&id=%%id%%&cid=%%cid%%&context=%%cxt%%' . $extraParams,
216 'title' => ts('Delete Pledge'),
217 ),
218 );
219
220 if (in_array('Cancel', $hideOption)) {
221 unset(self::$_links[CRM_Core_Action::DETACH]);
222 }
223
224 return self::$_links;
225 }
226
227 /**
228 * Getter for array of the parameters required for creating pager.
229 *
230 * @param $action
231 * @param array $params
232 */
233 public function getPagerParams($action, &$params) {
234 $params['status'] = ts('Pledge') . ' %%StatusMessage%%';
235 $params['csvString'] = NULL;
236 if ($this->_limit) {
237 $params['rowCount'] = $this->_limit;
238 }
239 else {
240 $params['rowCount'] = CRM_Utils_Pager::ROWCOUNT;
241 }
242
243 $params['buttonTop'] = 'PagerTopButton';
244 $params['buttonBottom'] = 'PagerBottomButton';
245 }
246
247 /**
248 * Returns total number of rows for the query.
249 *
250 * @param int $action
251 *
252 * @return int
253 * Total number of rows
254 */
255 public function getTotalCount($action) {
256 return $this->_query->searchQuery(0, 0, NULL,
257 TRUE, FALSE,
258 FALSE, FALSE,
259 FALSE,
260 $this->_additionalClause
261 );
262 }
263
264 /**
265 * Returns all the rows in the given offset and rowCount.
266 *
267 * @param string $action
268 * The action being performed.
269 * @param int $offset
270 * The row number to start from.
271 * @param int $rowCount
272 * The number of rows to return.
273 * @param string $sort
274 * The sql string that describes the sort order.
275 * @param string $output
276 * What should the result set include (web/email/csv).
277 *
278 * @return int
279 * the total number of rows for this action
280 */
281 public function &getRows($action, $offset, $rowCount, $sort, $output = NULL) {
282 $result = $this->_query->searchQuery($offset, $rowCount, $sort,
283 FALSE, FALSE,
284 FALSE, FALSE,
285 FALSE,
286 $this->_additionalClause
287 );
288
289 // process the result of the query
290 $rows = array();
291
292 // get all pledge status
293 $pledgeStatuses = CRM_Pledge_BAO_Pledge::buildOptions('status_id');
294
295 // get all campaigns.
296 $allCampaigns = CRM_Campaign_BAO_Campaign::getCampaigns(NULL, NULL, FALSE, FALSE, FALSE, TRUE);
297
298 // CRM-4418 check for view, edit and delete
299 $permissions = array(CRM_Core_Permission::VIEW);
300 if (CRM_Core_Permission::check('edit pledges')) {
301 $permissions[] = CRM_Core_Permission::EDIT;
302 }
303 if (CRM_Core_Permission::check('delete in CiviPledge')) {
304 $permissions[] = CRM_Core_Permission::DELETE;
305 }
306 $mask = CRM_Core_Action::mask($permissions);
307
308 while ($result->fetch()) {
309 $row = array();
310 // the columns we are interested in
311 foreach (self::$_properties as $property) {
312 if (isset($result->$property)) {
313 $row[$property] = $result->$property;
314 }
315 }
316
317 // carry campaign on selectors.
318 $row['campaign'] = CRM_Utils_Array::value($result->pledge_campaign_id, $allCampaigns);
319 $row['campaign_id'] = $result->pledge_campaign_id;
320
321 // add pledge status name
322 $row['pledge_status_name'] = CRM_Utils_Array::value($row['pledge_status_id'],
323 $pledgeStatuses
324 );
325 // append (test) to status label
326 if (!empty($row['pledge_is_test'])) {
327 $row['pledge_status'] .= ' (test)';
328 }
329
330 $hideOption = array();
331 if (CRM_Utils_Array::key('Cancelled', $row) ||
332 CRM_Utils_Array::key('Completed', $row)
333 ) {
334 $hideOption[] = 'Cancel';
335 }
336
337 $row['checkbox'] = CRM_Core_Form::CB_PREFIX . $result->pledge_id;
338
339 $row['action'] = CRM_Core_Action::formLink(self::links($hideOption, $this->_key),
340 $mask,
341 array(
342 'id' => $result->pledge_id,
343 'cid' => $result->contact_id,
344 'cxt' => $this->_context,
345 ),
346 ts('more'),
347 FALSE,
348 'pledge.selector.row',
349 'Pledge',
350 $result->pledge_id
351 );
352
353 $row['contact_type'] = CRM_Contact_BAO_Contact_Utils::getImage($result->contact_sub_type ? $result->contact_sub_type : $result->contact_type, FALSE, $result->contact_id
354 );
355 $rows[] = $row;
356 }
357 return $rows;
358 }
359
360 /**
361 * Get qill (display what was searched on).
362 *
363 * @inheritDoc
364 */
365 public function getQILL() {
366 return $this->_query->qill();
367 }
368
369 /**
370 * Returns the column headers as an array of tuples.
371 *
372 * Keys are name, sortName, key to the sort array
373 *
374 * @param string $action
375 * The action being performed.
376 * @param string $output
377 * What should the result set include (web/email/csv).
378 *
379 * @return array
380 * the column headers that need to be displayed
381 */
382 public function &getColumnHeaders($action = NULL, $output = NULL) {
383 if (!isset(self::$_columnHeaders)) {
384 self::$_columnHeaders = array(
385 array(
386 'name' => ts('Pledged'),
387 'sort' => 'pledge_amount',
388 'direction' => CRM_Utils_Sort::DONTCARE,
389 ),
390 array(
391 'name' => ts('Total Paid'),
392 'sort' => 'pledge_total_paid',
393 'direction' => CRM_Utils_Sort::DONTCARE,
394 ),
395 array(
396 'name' => ts('Balance'),
397 ),
398 array(
399 'name' => ts('Pledged For'),
400 'sort' => 'pledge_financial_type',
401 'direction' => CRM_Utils_Sort::DONTCARE,
402 ),
403 array(
404 'name' => ts('Pledge Made'),
405 'sort' => 'pledge_create_date',
406 'direction' => CRM_Utils_Sort::DESCENDING,
407 ),
408 array(
409 'name' => ts('Next Pay Date'),
410 'sort' => 'pledge_next_pay_date',
411 'direction' => CRM_Utils_Sort::DONTCARE,
412 ),
413 array(
414 'name' => ts('Next Amount'),
415 'sort' => 'pledge_next_pay_amount',
416 'direction' => CRM_Utils_Sort::DONTCARE,
417 ),
418 array(
419 'name' => ts('Status'),
420 'sort' => 'pledge_status',
421 'direction' => CRM_Utils_Sort::DONTCARE,
422 ),
423 array('desc' => ts('Actions')),
424 );
425
426 if (!$this->_single) {
427 $pre = array(
428 array('desc' => ts('Contact ID')),
429 array(
430 'name' => ts('Name'),
431 'sort' => 'sort_name',
432 'direction' => CRM_Utils_Sort::DONTCARE,
433 ),
434 );
435
436 self::$_columnHeaders = array_merge($pre, self::$_columnHeaders);
437 }
438 }
439 return self::$_columnHeaders;
440 }
441
442 /**
443 * Get sql query string.
444 *
445 * @return string
446 */
447 public function &getQuery() {
448 return $this->_query;
449 }
450
451 /**
452 * Name of export file.
453 *
454 * @param string $output
455 * Type of output.
456 *
457 * @return string
458 * name of the file
459 */
460 public function getExportFileName($output = 'csv') {
461 return ts('Pledge Search');
462 }
463
464 }