/** * Identify all the households to check and do it * * If max_count is set, it will stop after that amount, * saving the last household id for the next call */ public function checkAllHouseholds($max_count = NULL) { $max_count = (int) $max_count; $activity_type_id = CRM_Householdmerge_Logic_Configuration::getCheckHouseholdActivityTypeID(); $activity_status_ids = CRM_Householdmerge_Logic_Configuration::getLiveActivityStatusIDs(); if ($max_count) { $contact_id_minimum = CRM_Core_BAO_Setting::getItem(CRM_Householdmerge_Logic_Configuration::$HHMERGE_SETTING_DOMAIN, 'hh_check_last_id'); if (!$contact_id_minimum) { $contact_id_minimum = 0; } $limit_clause = "LIMIT {$max_count}"; } else { $contact_id_minimum = 0; $limit_clause = ''; } $last_contact_id_processed = 0; $selector_sql = "SELECT civicrm_contact.id AS contact_id\n FROM civicrm_contact\n LEFT JOIN civicrm_activity_contact ON civicrm_activity_contact.contact_id = civicrm_contact.id\n LEFT JOIN civicrm_activity ON civicrm_activity_contact.activity_id = civicrm_activity.id AND civicrm_activity.activity_type_id = {$activity_type_id} AND civicrm_activity.status_id IN ({$activity_status_ids})\n WHERE contact_type = 'Household'\n AND civicrm_activity.id IS NULL \n AND (civicrm_contact.is_deleted IS NULL or civicrm_contact.is_deleted = 0)\n AND civicrm_contact.id > {$contact_id_minimum}\n GROUP BY civicrm_contact.id\n ORDER BY civicrm_contact.id ASC\n {$limit_clause}"; $query = CRM_Core_DAO::executeQuery($selector_sql); while ($query->fetch()) { $last_contact_id_processed = $query->contact_id; $this->checkHousehold($last_contact_id_processed); $max_count--; } // done if ($max_count > 0) { // we're through the whole list, reset marker CRM_Core_BAO_Setting::setItem('0', CRM_Householdmerge_Logic_Configuration::$HHMERGE_SETTING_DOMAIN, 'hh_check_last_id'); } else { CRM_Core_BAO_Setting::setItem($last_contact_id_processed, CRM_Householdmerge_Logic_Configuration::$HHMERGE_SETTING_DOMAIN, 'hh_check_last_id'); } return; }
function postProcess() { // define some stats $activities_total = count($this->_activityHolderIds); $activities_processed = 0; $activities_detected = 0; $activities_fixed = 0; // filter for relevant activities $activity_type_id = (int) CRM_Householdmerge_Logic_Configuration::getCheckHouseholdActivityTypeID(); $activity_status_ids = CRM_Householdmerge_Logic_Configuration::getFixableActivityStatusIDs(); $activity_ids = implode(',', $this->_activityHolderIds); $filter_query = "SELECT id AS activity_id FROM civicrm_activity\n WHERE civicrm_activity.activity_type_id = {$activity_type_id} \n AND civicrm_activity.status_id IN ({$activity_status_ids})\n AND civicrm_activity.id IN ({$activity_ids});"; $filtered_activities = CRM_Core_DAO::executeQuery($filter_query); // go through all activites and try to fix them while ($filtered_activities->fetch()) { $activities_processed += 1; $problem = CRM_Householdmerge_Logic_Problem::extractProblem($filtered_activities->activity_id); if ($problem) { $activities_detected += 1; if ($problem->fix()) { $activities_fixed += 1; } } } // show stats CRM_Core_Session::setStatus(ts('%1 of the %2 selected activities were processed, %3 of them could be fixed.', array(1 => $activities_detected, 2 => $activities_total, 3 => $activities_fixed, 'domain' => 'de.systopia.householdmerge')), ts('%1 Household Problems Fixed', array(1 => $activities_fixed, 'domain' => 'de.systopia.householdmerge')), $activities_fixed > 0 ? 'info' : 'warn'); parent::postProcess(); }
/** * Check if there alread is an (active) 'check' activity with this household */ protected function hasLiveActivity() { $activity_type_id = (int) CRM_Householdmerge_Logic_Configuration::getCheckHouseholdActivityTypeID(); $household_id = (int) $this->household_id; $activity_status_ids = CRM_Householdmerge_Logic_Configuration::getLiveActivityStatusIDs(); $sentinel = "[{$this->code}] %"; if (empty($this->params['member_id'])) { $member_clause = ""; } else { $member_id = (int) $this->params['member_id']; $member_clause = "AND EXISTS (SELECT id FROM civicrm_activity_contact WHERE activity_id = civicrm_activity.id AND contact_id = {$member_id} AND record_type_id = 3)"; } $selector_sql = "SELECT civicrm_activity.id AS activity_id\n FROM civicrm_activity\n LEFT JOIN civicrm_activity_contact target ON target.activity_id = civicrm_activity.id AND target.record_type_id = 3\n WHERE civicrm_activity.activity_type_id = {$activity_type_id} \n AND civicrm_activity.status_id IN ({$activity_status_ids})\n AND civicrm_activity.subject LIKE %1\n AND target.contact_id = {$household_id}\n {$member_clause} ;"; $selector_params = array(1 => array($sentinel, 'String')); $query = CRM_Core_DAO::executeQuery($selector_sql, $selector_params); return $query->fetch(); }