_columns = array( 'civicrm_contact' => array( 'dao' => 'CRM_Contact_DAO_Contact', 'fields' => array( 'sort_name' => array( 'title' => ts('Supporter'), 'required' => TRUE, 'default' => TRUE, ), 'id' => array( 'required' => TRUE, 'no_display' => TRUE, ), 'contact_type' => array( 'title' => ts('Supporter Contact Type'), ), 'contact_sub_type' => array( 'title' => ts('Supporter Contact Subtype'), ), ), 'filters' => array( 'sort_name' => array( 'title' => ts('Supporter Name'), 'type' => CRM_Utils_Type::T_STRING, 'operator' => 'like', ), 'id' => array( 'title' => ts('Contact ID'), 'no_display' => TRUE, ), ), 'grouping' => 'pcp-fields', ), 'civicrm_contribution_page' => array( 'dao' => 'CRM_Contribute_DAO_ContributionPage', 'fields' => array( 'page_title' => array( 'title' => ts('Contribution Page Title'), 'name' => 'title', 'default' => TRUE, ), ), 'filters' => array( 'page_title' => array( 'title' => ts('Contribution Page Title'), 'name' => 'title', 'type' => CRM_Utils_Type::T_STRING, ), ), 'grouping' => 'pcp-fields', ), 'civicrm_pcp' => array( 'dao' => 'CRM_PCP_DAO_PCP', 'fields' => array( 'title' => array( 'title' => ts('Personal Campaign Title'), 'default' => TRUE, ), 'goal_amount' => array( 'title' => ts('Goal Amount'), 'type' => CRM_Utils_Type::T_MONEY, 'default' => TRUE, ), ), 'filters' => array( 'title' => array( 'title' => ts('Personal Campaign Title'), 'type' => CRM_Utils_Type::T_STRING, ), ), 'grouping' => 'pcp-fields', ), 'civicrm_contribution_soft' => array( 'dao' => 'CRM_Contribute_DAO_ContributionSoft', 'fields' => array( 'amount_1' => array( 'title' => ts('Committed Amount'), 'name' => 'amount', 'type' => CRM_Utils_Type::T_MONEY, 'default' => TRUE, 'statistics' => array( 'sum' => ts('Committed Amount'), ), ), 'amount_2' => array( 'title' => ts('Amount Received'), 'name' => 'amount', 'type' => CRM_Utils_Type::T_MONEY, 'default' => TRUE, // nice trick with dbAlias 'dbAlias' => 'SUM(IF( contribution_civireport.contribution_status_id > 1, 0, contribution_soft_civireport.amount))', ), 'soft_id' => array( 'title' => ts('Number of Donors'), 'name' => 'id', 'default' => TRUE, 'statistics' => array( 'count' => ts('Number of Donors'), ), ), ), 'filters' => array( 'amount_2' => array( 'title' => ts('Amount Received'), 'type' => CRM_Utils_Type::T_MONEY, 'dbAlias' => 'SUM(IF( contribution_civireport.contribution_status_id > 1, 0, contribution_soft_civireport.amount))', ), ), 'grouping' => 'pcp-fields', ), 'civicrm_contribution' => array( 'dao' => 'CRM_Contribute_DAO_Contribution', 'fields' => array( 'contribution_id' => array( 'name' => 'id', 'no_display' => TRUE, 'required' => TRUE, ), 'receive_date' => array( 'title' => ts('Most Recent Contribution'), 'default' => TRUE, 'statistics' => array( 'max' => ts('Most Recent Contribution'), ), ), ), 'grouping' => 'pcp-fields', ), ); parent::__construct(); } function from() { $this->_from = " FROM civicrm_pcp {$this->_aliases['civicrm_pcp']} LEFT JOIN civicrm_contribution_soft {$this->_aliases['civicrm_contribution_soft']} ON {$this->_aliases['civicrm_pcp']}.id = {$this->_aliases['civicrm_contribution_soft']}.pcp_id LEFT JOIN civicrm_contribution {$this->_aliases['civicrm_contribution']} ON {$this->_aliases['civicrm_contribution_soft']}.contribution_id = {$this->_aliases['civicrm_contribution']}.id LEFT JOIN civicrm_contact {$this->_aliases['civicrm_contact']} ON {$this->_aliases['civicrm_pcp']}.contact_id = {$this->_aliases['civicrm_contact']}.id LEFT JOIN civicrm_contribution_page {$this->_aliases['civicrm_contribution_page']} ON {$this->_aliases['civicrm_pcp']}.page_id = {$this->_aliases['civicrm_contribution_page']}.id"; } function groupBy() { $this->_groupBy = "GROUP BY {$this->_aliases['civicrm_pcp']}.id"; } function orderBy() { $this->_orderBy = " ORDER BY {$this->_aliases['civicrm_contact']}.sort_name "; } function where() { $whereClauses = $havingClauses = array(); foreach ($this->_columns as $tableName => $table) { if (array_key_exists('filters', $table)) { foreach ($table['filters'] as $fieldName => $field) { $clause = NULL; if (CRM_Utils_Array::value('type', $field) & CRM_Utils_Type::T_DATE) { $relative = CRM_Utils_Array::value("{$fieldName}_relative", $this->_params); $from = CRM_Utils_Array::value("{$fieldName}_from", $this->_params); $to = CRM_Utils_Array::value("{$fieldName}_to", $this->_params); $clause = $this->dateClause($field['name'], $relative, $from, $to, $field['type']); } else { $op = CRM_Utils_Array::value("{$fieldName}_op", $this->_params); if ($op) { $clause = $this->whereClause($field, $op, CRM_Utils_Array::value("{$fieldName}_value", $this->_params), CRM_Utils_Array::value("{$fieldName}_min", $this->_params), CRM_Utils_Array::value("{$fieldName}_max", $this->_params) ); } } if (!empty($clause)) { if ($tableName == 'civicrm_contribution_soft' && $fieldName == 'amount_2' ) { $havingClauses[] = $clause; } else { $whereClauses[] = $clause; } } } } } if (empty($whereClauses)) { $this->_where = "WHERE ( 1 ) "; } else { $this->_where = "WHERE " . implode(' AND ', $whereClauses); } if ($this->_aclWhere) { $this->_where .= " AND {$this->_aclWhere} "; } $this->_having = ""; if (!empty($havingClauses)) { // use this clause to construct group by clause. $this->_having = "HAVING " . implode(' AND ', $havingClauses); } } /** * @param $rows * * @return array */ function statistics(&$rows) { $statistics = parent::statistics($rows); $select = "SELECT SUM({$this->_aliases['civicrm_pcp']}.goal_amount) as goal_total, " . "SUM({$this->_aliases['civicrm_contribution_soft']}.amount) as committed_total, " . "COUNT({$this->_aliases['civicrm_contribution_soft']}.id) as donors_total, " . "SUM(IF( contribution_civireport.contribution_status_id > 1, 0, contribution_soft_civireport.amount)) AS received_total "; $sql = "{$select} {$this->_from} {$this->_where}"; $dao = CRM_Core_DAO::executeQuery($sql); $dao->fetch(); $statistics['counts']['goal_total'] = array( 'title' => ts('Goal Total'), 'value' => $dao->goal_total, 'type' => CRM_Utils_Type::T_MONEY ); $statistics['counts']['committed_total'] = array( 'title' => ts('Total Committed'), 'value' => $dao->committed_total, 'type' => CRM_Utils_Type::T_MONEY ); $statistics['counts']['received_total'] = array( 'title' => ts('Total Received'), 'value' => $dao->received_total, 'type' => CRM_Utils_Type::T_MONEY ); $statistics['counts']['donors_total'] = array( 'title' => ts('Total Donors'), 'value' => $dao->donors_total, 'type' => CRM_Utils_Type::T_INT ); return $statistics; } /** * @param $rows */ function alterDisplay(&$rows) { // custom code to alter rows $entryFound = FALSE; $checkList = array(); foreach ($rows as $rowNum => $row) { if (!empty($this->_noRepeats) && $this->_outputMode != 'csv') { // not repeat contact sort names if it matches with the one // in previous row $repeatFound = FALSE; foreach ($row as $colName => $colVal) { if (!empty($checkList[$colName]) && is_array($checkList[$colName]) && in_array($colVal, $checkList[$colName]) ) { $rows[$rowNum][$colName] = ""; $repeatFound = TRUE; } if (in_array($colName, $this->_noRepeats)) { $checkList[$colName][] = $colVal; } } } if (array_key_exists('civicrm_contact_sort_name', $row) && $rows[$rowNum]['civicrm_contact_sort_name'] && array_key_exists('civicrm_contact_id', $row) ) { $url = CRM_Utils_System::url("civicrm/contact/view", 'reset=1&cid=' . $row['civicrm_contact_id'], $this->_absoluteUrl ); $rows[$rowNum]['civicrm_contact_sort_name_link'] = $url; $rows[$rowNum]['civicrm_contact_sort_name_hover'] = ts("View Contact Summary for this Contact."); $entryFound = TRUE; } if (!$entryFound) { break; } } } }