3 +--------------------------------------------------------------------+
4 | CiviCRM version 4.7 |
5 +--------------------------------------------------------------------+
6 | Copyright CiviCRM LLC (c) 2004-2016 |
7 +--------------------------------------------------------------------+
8 | This file is a part of CiviCRM. |
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. |
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. |
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 +--------------------------------------------------------------------+
31 * @copyright CiviCRM LLC (c) 2004-2016
35 * Page for invoking report instances.
37 class CRM_Report_Page_InstanceList
extends CRM_Core_Page
{
39 static $_links = NULL;
41 static $_exceptions = array('logging/contact/detail');
44 * Name of component if report list is filtered.
48 protected $_compName = NULL;
51 * ID of component if report list is filtered.
55 protected $_compID = NULL;
58 * ID of grouping if report list is filtered.
62 protected $_grouping = NULL;
65 * ID of parent report template if list is filtered by template.
69 protected $_ovID = NULL;
72 * Title of parent report template if list is filtered by template.
76 protected $_title = NULL;
79 * Retrieves report instances, optionally filtered.
81 * Filtering available by parent report template ($ovID) or by component ($compID).
85 public function info() {
89 $report .= " AND v.id = {$this->ovID} ";
93 if ($this->compID
== 99) {
94 $report .= " AND v.component_id IS NULL ";
95 $this->_compName
= 'Contact';
98 $report .= " AND v.component_id = {$this->compID} ";
99 $cmpName = CRM_Core_DAO
::getFieldValue('CRM_Core_DAO_Component', $this->compID
,
102 $this->_compName
= substr($cmpName, 4);
103 if ($this->_compName
== 'Contribute') {
104 $this->_compName
= 'Contribution';
108 elseif ($this->grouping
) {
109 $report .= " AND v.grouping = '{$this->grouping}' ";
111 elseif ($this->myReports
) {
112 $report .= " AND inst.owner_id = " . CRM_Core_Session
::getLoggedInContactID();
116 SELECT inst.id, inst.title, inst.report_id, inst.description, inst.owner_id, v.label, v.grouping, v.name as class_name,
118 WHEN comp.name IS NOT NULL THEN SUBSTRING(comp.name, 5)
119 WHEN v.grouping IS NOT NULL THEN v.grouping
122 FROM civicrm_option_group g
123 LEFT JOIN civicrm_option_value v
124 ON v.option_group_id = g.id AND
125 g.name = 'report_template'
126 LEFT JOIN civicrm_report_instance inst
127 ON v.value = inst.report_id
128 LEFT JOIN civicrm_component comp
129 ON v.component_id = comp.id
131 WHERE v.is_active = 1 {$report}
132 AND inst.domain_id = %1
135 $dao = CRM_Core_DAO
::executeQuery($sql, array(
136 1 => array(CRM_Core_Config
::domainID(), 'Integer'),
139 $config = CRM_Core_Config
::singleton();
141 $url = 'civicrm/report/instance';
142 $my_reports_grouping = 'My';
143 while ($dao->fetch()) {
144 if (in_array($dao->report_id
, self
::$_exceptions)) {
148 $enabled = in_array("Civi{$dao->compName}", $config->enableComponents
);
149 if ($dao->compName
== 'Contact' ||
$dao->compName
== $dao->grouping
) {
153 // filter report listings for private reports
154 if (!empty($dao->owner_id
) && CRM_Core_Session
::getLoggedInContactID() != $dao->owner_id
) {
158 //filter report listings by permissions
159 if (!($enabled && CRM_Report_Utils_Report
::isInstancePermissioned($dao->id
))) {
162 //filter report listing by group/role
163 if (!($enabled && CRM_Report_Utils_Report
::isInstanceGroupRoleAllowed($dao->id
))) {
167 if (trim($dao->title
)) {
169 $this->title
= ts("Report(s) created from the template: %1", array(1 => $dao->label
));
172 $report_grouping = $dao->compName
;
173 if ($dao->owner_id
!= NULL) {
174 $report_grouping = $my_reports_grouping;
176 $rows[$report_grouping][$dao->id
]['title'] = $dao->title
;
177 $rows[$report_grouping][$dao->id
]['label'] = $dao->label
;
178 $rows[$report_grouping][$dao->id
]['description'] = $dao->description
;
179 $rows[$report_grouping][$dao->id
]['url'] = CRM_Utils_System
::url("{$url}/{$dao->id}", "reset=1&output=criteria");
180 $rows[$report_grouping][$dao->id
]['viewUrl'] = CRM_Utils_System
::url("{$url}/{$dao->id}", 'force=1&reset=1');
181 $rows[$report_grouping][$dao->id
]['actions'] = $this->getActionLinks($dao->id
, $dao->class_name
);
184 // Move My Reports to the beginning of the reports list
185 if (isset($rows[$my_reports_grouping])) {
186 $my_reports = $rows[$my_reports_grouping];
187 unset($rows[$my_reports_grouping]);
188 $rows = array($my_reports_grouping => $my_reports) +
$rows;
194 * Run this page (figure out the action needed and perform it).
196 public function run() {
197 //Filters by source report template or by component
198 $this->ovID
= CRM_Utils_Request
::retrieve('ovid', 'Positive', $this);
199 $this->myReports
= CRM_Utils_Request
::retrieve('myreports', 'String', $this);
200 $this->compID
= CRM_Utils_Request
::retrieve('compid', 'Positive', $this);
201 $this->grouping
= CRM_Utils_Request
::retrieve('grp', 'String', $this);
203 $rows = $this->info();
205 $this->assign('list', $rows);
206 if ($this->ovID
OR $this->compID
) {
207 // link to view all reports
208 $reportUrl = CRM_Utils_System
::url('civicrm/report/list', "reset=1");
209 $this->assign('reportUrl', $reportUrl);
211 $this->assign('title', $this->title
);
214 CRM_Utils_System
::setTitle(ts('%1 Reports', array(1 => $this->_compName
)));
217 // assign link to template list for users with appropriate permissions
218 if (CRM_Core_Permission
::check('administer Reports')) {
220 $newButton = ts('New %1 Report', array(1 => $this->_compName
));
221 $templateUrl = CRM_Utils_System
::url('civicrm/report/template/list', "reset=1&compid={$this->compID}");
224 $newButton = ts('New Report');
225 $templateUrl = CRM_Utils_System
::url('civicrm/report/template/list', "reset=1");
227 $this->assign('newButton', $newButton);
228 $this->assign('templateUrl', $templateUrl);
229 $this->assign('compName', $this->_compName
);
230 $this->assign('myReports', $this->myReports
);
232 return parent
::run();
238 * @param int $instanceID
239 * @param string $className
243 protected function getActionLinks($instanceID, $className) {
244 $urlCommon = 'civicrm/report/instance/' . $instanceID;
247 'url' => CRM_Utils_System
::url($urlCommon, 'reset=1&output=copy'),
248 'label' => ts('Save a Copy'),
251 'url' => CRM_Utils_System
::url($urlCommon, 'reset=1&force=1&output=pdf'),
252 'label' => ts('View as pdf'),
255 'url' => CRM_Utils_System
::url($urlCommon, 'reset=1&force=1&output=print'),
256 'label' => ts('Print report'),
259 // Hackery, Hackera, Hacker ahahahahahaha a super nasty hack.
260 // Almost all report classes support csv & loading each class to call the method seems too
261 // expensive. We also have on our later list 'do they support charts' which is instance specific
262 // e.g use of group by might affect it. So, lets just skip for the few that don't for now.
263 $csvBlackList = array(
264 'CRM_Report_Form_Contact_Detail',
265 'CRM_Report_Form_Event_Income',
267 if (!in_array($className, $csvBlackList)) {
268 $actions['csv'] = array(
269 'url' => CRM_Utils_System
::url($urlCommon, 'reset=1&force=1&output=csv'),
270 'label' => ts('Export to csv'),
273 if (CRM_Core_Permission
::check('administer Reports')) {
274 $actions['delete'] = array(
275 'url' => CRM_Utils_System
::url($urlCommon, 'reset=1&action=delete'),
276 'label' => ts('Delete report'),
277 'confirm_message' => ts('Are you sure you want delete this report? This action cannot be undone.'),