Commit | Line | Data |
---|---|---|
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 | */ |
33 | ||
34 | /** | |
04994ffc | 35 | * Page for invoking report instances. |
6a488035 TO |
36 | */ |
37 | class 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 | } |