CRM-17155 improve links & options from all reports page
[civicrm-core.git] / CRM / Report / Page / InstanceList.php
CommitLineData
6a488035 1<?php
6a488035
TO
2/*
3 +--------------------------------------------------------------------+
7e9e8871 4 | CiviCRM version 4.7 |
6a488035 5 +--------------------------------------------------------------------+
e7112fa7 6 | Copyright CiviCRM LLC (c) 2004-2015 |
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
e7112fa7 31 * @copyright CiviCRM LLC (c) 2004-2015
6a488035
TO
32 */
33
34/**
04994ffc 35 * Page for invoking report instances.
6a488035
TO
36 */
37class CRM_Report_Page_InstanceList extends CRM_Core_Page {
38
39 static $_links = NULL;
40
481a74f4 41 static $_exceptions = array('logging/contact/detail');
2f4c2f5d 42
6a488035 43 /**
fe482240 44 * Name of component if report list is filtered.
6a488035
TO
45 *
46 * @var string
ae5ffbb7 47 */
6a488035
TO
48 protected $_compName = NULL;
49
50 /**
fe482240 51 * ID of component if report list is filtered.
6a488035
TO
52 *
53 * @var int
ae5ffbb7 54 */
6a488035
TO
55 protected $_compID = NULL;
56
2066e389 57 /**
fe482240 58 * ID of grouping if report list is filtered.
2066e389 59 *
60 * @var int
ae5ffbb7 61 */
37c20553 62 protected $_grouping = NULL;
2066e389 63
6a488035 64 /**
fe482240 65 * ID of parent report template if list is filtered by template.
6a488035
TO
66 *
67 * @var int
ae5ffbb7 68 */
6a488035
TO
69 protected $_ovID = NULL;
70
6a488035 71 /**
fe482240 72 * Title of parent report template if list is filtered by template.
6a488035
TO
73 *
74 * @var string
ae5ffbb7 75 */
6a488035
TO
76 protected $_title = NULL;
77
78 /**
04994ffc 79 * Retrieves report instances, optionally filtered.
80 *
81 * Filtering available by parent report template ($ovID) or by component ($compID).
6a488035 82 *
a6c01b45 83 * @return array
6a488035 84 */
182f5081 85 public function info() {
6a488035
TO
86
87 $report = '';
88 if ($this->ovID) {
89 $report .= " AND v.id = {$this->ovID} ";
90 }
2f4c2f5d 91
6a488035
TO
92 if ($this->compID) {
93 if ($this->compID == 99) {
94 $report .= " AND v.component_id IS NULL ";
95 $this->_compName = 'Contact';
37c20553 96 }
97 else {
2f4c2f5d 98 $report .= " AND v.component_id = {$this->compID} ";
6a488035
TO
99 $cmpName = CRM_Core_DAO::getFieldValue('CRM_Core_DAO_Component', $this->compID,
100 'name', 'id'
101 );
102 $this->_compName = substr($cmpName, 4);
103 if ($this->_compName == 'Contribute') {
104 $this->_compName = 'Contribution';
105 }
106 }
107 }
37c20553 108 elseif ($this->grouping) {
109 $report .= " AND v.grouping = '{$this->grouping}' ";
110 }
6a488035
TO
111
112 $sql = "
182f5081 113 SELECT inst.id, inst.title, inst.report_id, inst.description, v.label, v.grouping, v.name as class_name,
2066e389 114 CASE
115 WHEN comp.name IS NOT NULL THEN SUBSTRING(comp.name, 5)
116 WHEN v.grouping IS NOT NULL THEN v.grouping
117 ELSE 'Contact'
118 END as compName
6a488035
TO
119 FROM civicrm_option_group g
120 LEFT JOIN civicrm_option_value v
121 ON v.option_group_id = g.id AND
122 g.name = 'report_template'
123 LEFT JOIN civicrm_report_instance inst
124 ON v.value = inst.report_id
2f4c2f5d 125 LEFT JOIN civicrm_component comp
6a488035 126 ON v.component_id = comp.id
2f4c2f5d 127
6a488035
TO
128 WHERE v.is_active = 1 {$report}
129 AND inst.domain_id = %1
130 ORDER BY v.weight";
131
132 $dao = CRM_Core_DAO::executeQuery($sql, array(
37c20553 133 1 => array(CRM_Core_Config::domainID(), 'Integer'),
134 ));
6a488035
TO
135
136 $config = CRM_Core_Config::singleton();
37c20553 137 $rows = array();
138 $url = 'civicrm/report/instance';
6a488035
TO
139 while ($dao->fetch()) {
140 if (in_array($dao->report_id, self::$_exceptions)) {
141 continue;
142 }
143
144 $enabled = in_array("Civi{$dao->compName}", $config->enableComponents);
37c20553 145 if ($dao->compName == 'Contact' || $dao->compName == $dao->grouping) {
6a488035
TO
146 $enabled = TRUE;
147 }
148 //filter report listings by permissions
149 if (!($enabled && CRM_Report_Utils_Report::isInstancePermissioned($dao->id))) {
150 continue;
151 }
152 //filter report listing by group/role
153 if (!($enabled && CRM_Report_Utils_Report::isInstanceGroupRoleAllowed($dao->id))) {
154 continue;
155 }
156
157 if (trim($dao->title)) {
158 if ($this->ovID) {
159 $this->title = ts("Report(s) created from the template: %1", array(1 => $dao->label));
160 }
161 $rows[$dao->compName][$dao->id]['title'] = $dao->title;
162 $rows[$dao->compName][$dao->id]['label'] = $dao->label;
163 $rows[$dao->compName][$dao->id]['description'] = $dao->description;
182f5081 164 $rows[$dao->compName][$dao->id]['url'] = CRM_Utils_System::url("{$url}/{$dao->id}", "reset=1&output=criteria");
165 $rows[$dao->compName][$dao->id]['viewUrl'] = CRM_Utils_System::url("{$url}/{$dao->id}", 'force=1&reset=1');
166 $rows[$dao->compName][$dao->id]['actions'] = $this->getActionLinks($dao->id, $dao->class_name);
6a488035
TO
167 }
168 }
6a488035
TO
169 return $rows;
170 }
171
172 /**
100fef9d 173 * Run this page (figure out the action needed and perform it).
6a488035 174 */
00be9182 175 public function run() {
6a488035 176 //Filters by source report template or by component
353ffa53 177 $this->ovID = CRM_Utils_Request::retrieve('ovid', 'Positive', $this);
6a488035 178 $this->compID = CRM_Utils_Request::retrieve('compid', 'Positive', $this);
37c20553 179 $this->grouping = CRM_Utils_Request::retrieve('grp', 'String', $this);
180
353ffa53 181 $rows = $this->info();
6a488035
TO
182
183 $this->assign('list', $rows);
184 if ($this->ovID OR $this->compID) {
185 // link to view all reports
186 $reportUrl = CRM_Utils_System::url('civicrm/report/list', "reset=1");
187 $this->assign('reportUrl', $reportUrl);
188 if ($this->ovID) {
189 $this->assign('title', $this->title);
0db6c3e1
TO
190 }
191 else {
0c34116c 192 CRM_Utils_System::setTitle(ts('%1 Reports', array(1 => $this->_compName)));
6a488035
TO
193 }
194 }
195 // assign link to template list for users with appropriate permissions
196 if (CRM_Core_Permission::check('administer Reports')) {
197 if ($this->compID) {
198 $newButton = ts('New %1 Report', array(1 => $this->_compName));
199 $templateUrl = CRM_Utils_System::url('civicrm/report/template/list', "reset=1&compid={$this->compID}");
0db6c3e1
TO
200 }
201 else {
6a488035
TO
202 $newButton = ts('New Report');
203 $templateUrl = CRM_Utils_System::url('civicrm/report/template/list', "reset=1");
204 }
205 $this->assign('newButton', $newButton);
206 $this->assign('templateUrl', $templateUrl);
207 $this->assign('compName', $this->_compName);
208 }
209 return parent::run();
210 }
96025800 211
182f5081 212 /**
213 * Get action links.
214 *
215 * @param int $instanceID
216 * @param string $className
217 *
218 * @return array
219 */
220 protected function getActionLinks($instanceID, $className) {
221 $urlCommon = 'civicrm/report/instance/' . $instanceID;
222 $actions = array(
223 'copy' => array(
224 'url' => CRM_Utils_System::url($urlCommon, 'reset=1&output=copy'),
225 'label' => ts('Save a Copy'),
226 ),
227 'pdf' => array(
228 'url' => CRM_Utils_System::url($urlCommon, 'reset=1&force=1&output=pdf'),
229 'label' => ts('View as pdf'),
230 ),
231 'print' => array(
232 'url' => CRM_Utils_System::url($urlCommon, 'reset=1&force=1&output=print'),
233 'label' => ts('Print report'),
234 ),
235 );
236 // Hackery, Hackera, Hacker ahahahahahaha a super nasty hack.
237 // Almost all report classes support csv & loading each class to call the method seems too
238 // expensive. We also have on our later list 'do they support charts' which is instance specific
239 // e.g use of group by might affect it. So, lets just skip for the few that don't for now.
240 $csvBlackList = array(
241 'CRM_Report_Form_Contact_Detail',
242 'CRM_Report_Form_Event_Income',
243 );
244 if (!in_array($className, $csvBlackList)) {
245 $actions['csv'] = array(
246 'url' => CRM_Utils_System::url($urlCommon, 'reset=1&force=1&output=csv'),
247 'label' => ts('Export to csv'),
248 );
249 }
250 if (CRM_Core_Permission::check('administer Reports')) {
251 $actions['delete'] = array(
252 'url' => CRM_Utils_System::url($urlCommon, 'reset=1&action=delete'),
253 'label' => ts('Delete report'),
254 'confirm_message' => ts('Are you sure you want delete this report? This action cannot be undone.'),
255 );
256 }
257
258 return $actions;
259 }
260
6a488035 261}