コード例 #1
0
ファイル: Add.php プロジェクト: elcapo/org.civicoop.civirules
 /**
  * Returns an array with parameters used for processing an action
  *
  * @param array $params
  * @param object CRM_Civirules_TriggerData_TriggerData $triggerData
  * @return array $params
  * @access protected
  */
 protected function alterApiParameters($params, CRM_Civirules_TriggerData_TriggerData $triggerData)
 {
     $action_params = $this->getActionParameters();
     //this function could be overridden in subclasses to alter parameters to meet certain criteraia
     $params['target_contact_id'] = $triggerData->getContactId();
     $params['activity_type_id'] = $action_params['activity_type_id'];
     $params['status_id'] = $action_params['status_id'];
     $params['subject'] = $action_params['subject'];
     if (!empty($action_params['assignee_contact_id'])) {
         $assignee = array();
         if (is_array($action_params['assignee_contact_id'])) {
             foreach ($action_params['assignee_contact_id'] as $contact_id) {
                 if ($contact_id) {
                     $assignee[] = $contact_id;
                 }
             }
         } else {
             $assignee[] = $action_params['assignee_contact_id'];
         }
         if (count($assignee)) {
             $params['assignee_contact_id'] = $action_params['assignee_contact_id'];
         } else {
             $params['assignee_contact_id'] = '';
         }
     }
     return $params;
 }
コード例 #2
0
 /**
  * Method is mandatory and checks if the condition is met
  *
  * @param CRM_Civirules_TriggerData_TriggerData $triggerData
  * @return bool
  * @access public
  */
 public function isConditionValid(CRM_Civirules_TriggerData_TriggerData $triggerData)
 {
     $contactId = $triggerData->getContactId();
     $donorHasAny = FALSE;
     $recurringParams = array('contact_id' => $contactId, 'is_test' => 0);
     try {
         $foundRecurring = civicrm_api3('ContributionRecur', 'Get', $recurringParams);
         foreach ($foundRecurring['values'] as $recurring) {
             if (CRM_Civirules_Utils::endDateLaterThanToday($recurring['end_date']) == TRUE || !isset($recurring['end_date'])) {
                 $donorHasAny = TRUE;
             }
         }
         if ($donorHasAny) {
             if ($this->conditionParams['has_recurring']) {
                 $isConditionValid = TRUE;
             } else {
                 $isConditionValid = FALSE;
             }
         } else {
             if ($this->conditionParams['has_recurring']) {
                 $isConditionValid = FALSE;
             } else {
                 $isConditionValid = TRUE;
             }
         }
     } catch (CiviCRM_API3_Exception $ex) {
         if ($this->conditionParams['has_recurring']) {
             $isConditionValid = FALSE;
         } else {
             $isConditionValid = TRUE;
         }
     }
     return $isConditionValid;
 }
コード例 #3
0
 /**
  * Returns an array with parameters used for processing an action
  *
  * @param array $params
  * @param object CRM_Civirules_TriggerData_TriggerData $triggerData
  * @return array $params
  * @access protected
  */
 protected function alterApiParameters($params, CRM_Civirules_TriggerData_TriggerData $triggerData)
 {
     //this function could be overridden in subclasses to alter parameters to meet certain criteraia
     $params['entity_id'] = $triggerData->getContactId();
     $params['entity_table'] = 'civicrm_contact';
     return $params;
 }
コード例 #4
0
 /**
  * Method processAction to execute the action
  *
  * @param CRM_Civirules_TriggerData_TriggerData $triggerData
  * @access public
  *
  */
 public function processAction(CRM_Civirules_TriggerData_TriggerData $triggerData)
 {
     $contactId = $triggerData->getContactId();
     $processContact = false;
     // retrieve contact type of contact
     $contactParams = array('id' => $contactId, 'return' => 'contact_type');
     $contactType = civicrm_api3('Contact', 'Getvalue', $contactParams);
     // retrieve contact type Donor and only execute if the same
     $donorType = civicrm_api3('ContactType', 'Getsingle', array('name' => 'Donor'));
     try {
         switch ($contactType) {
             case 'Individual':
                 if ($donorType['parent_id'] = 1) {
                     $processContact = true;
                 }
                 break;
             case 'Household':
                 if ($donorType['parent_id'] = 2) {
                     $processContact = true;
                 }
                 break;
             case 'Organization':
                 if ($donorType['parent_id'] = 3) {
                     $processContact = true;
                 }
                 break;
         }
     } catch (CiviCRM_API3_Exception $ex) {
     }
     if ($processContact) {
         $newParams = array('id' => $contactId, 'contact_sub_type' => 'Donor');
         civicrm_api3('Contact', 'Create', $newParams);
     }
 }
コード例 #5
0
 /**
  * Method processAction to execute the action
  *
  * @param CRM_Civirules_TriggerData_TriggerData $triggerData
  * @access public
  *
  */
 public function processAction(CRM_Civirules_TriggerData_TriggerData $triggerData)
 {
     $contactId = $triggerData->getContactId();
     //we cannot delete domain contacts
     if (CRM_Contact_BAO_Contact::checkDomainContact($contactId)) {
         return;
     }
     CRM_Contact_BAO_Contact::deleteContact($contactId);
 }
    /**
     * Method to determine if the condition is valid
     *
     * @param CRM_Civirules_TriggerData_TriggerData $triggerData
     * @return bool
     */
    public function isConditionValid(CRM_Civirules_TriggerData_TriggerData $triggerData)
    {
        $isConditionValid = FALSE;
        $contact_id = $triggerData->getContactId();
        /*
         * retrieve count of contributions for donor grouped by extracted YMD from receive_date
         */
        $query = 'SELECT COUNT(DISTINCT CONCAT(EXTRACT(YEAR FROM receive_date),
EXTRACT(MONTH FROM receive_date), EXTRACT(DAY FROM receive_date))) AS distinctDates
FROM civicrm_contribution WHERE contact_id = %1 AND civicrm_contribution.contribution_status_id = %2';
        $params = array(1 => array($contact_id, 'Positive'), 2 => array(CRM_Civirules_Utils::getContributionStatusIdWithName('Completed'), 'Positive'));
        $periodStartDate = CRM_CivirulesConditions_Utils_Period::convertPeriodToStartDate($this->conditionParams);
        $periodEndDate = CRM_CivirulesConditions_Utils_Period::convertPeriodToEndDate($this->conditionParams);
        if ($periodStartDate) {
            $query .= " AND DATE(`receive_date`) >= '" . $periodStartDate->format('Y-m-d') . "'";
        }
        if ($periodEndDate) {
            $query .= " AND DATE(`receive_date`) <= '" . $periodEndDate->format('Y-m-d') . "'";
        }
        $dao = CRM_Core_DAO::executeQuery($query, $params);
        if ($dao->fetch()) {
            switch ($this->conditionParams['operator']) {
                case 1:
                    if ($dao->distinctDates != $this->conditionParams['no_of_days']) {
                        $isConditionValid = TRUE;
                    }
                    break;
                case 2:
                    if ($dao->distinctDates > $this->conditionParams['no_of_days']) {
                        $isConditionValid = TRUE;
                    }
                    break;
                case 3:
                    if ($dao->distinctDates >= $this->conditionParams['no_of_days']) {
                        $isConditionValid = TRUE;
                    }
                    break;
                case 4:
                    if ($dao->distinctDates < $this->conditionParams['no_of_days']) {
                        $isConditionValid = TRUE;
                    }
                    break;
                case 5:
                    if ($dao->distinctDates <= $this->conditionParams['no_of_days']) {
                        $isConditionValid = TRUE;
                    }
                    break;
                default:
                    if ($dao->distinctDates == $this->conditionParams['no_of_days']) {
                        $isConditionValid = TRUE;
                    }
                    break;
            }
        }
        return $isConditionValid;
    }
コード例 #7
0
 /**
  * Returns value of the field
  *
  * @param object CRM_Civirules_TriggerData_TriggerData $triggerData
  * @return mixed
  * @access protected
  */
 protected function getFieldValue(CRM_Civirules_TriggerData_TriggerData $triggerData)
 {
     $sourceBirthDate = civicrm_api3('Contact', 'getvalue', array('id' => $triggerData->getContactId(), 'return' => 'birth_date'));
     if ($sourceBirthDate) {
         $birthDate = new DateTime($sourceBirthDate);
         return $birthDate->diff(new DateTime('now'))->y;
     }
     return false;
     //undefined birth date
 }
コード例 #8
0
 /**
  * Returns an array with parameters used for processing an action
  *
  * @param array $params
  * @param object CRM_Civirules_TriggerData_TriggerData $triggerData
  * @return array $params
  * @access protected
  */
 protected function alterApiParameters($params, CRM_Civirules_TriggerData_TriggerData $triggerData)
 {
     $action_params = $this->getActionParameters();
     //this function could be overridden in subclasses to alter parameters to meet certain criteraia
     $params['target_contact_id'] = $triggerData->getContactId();
     $params['activity_type_id'] = $action_params['activity_type_id'];
     $params['status_id'] = $action_params['status_id'];
     $params['subject'] = $action_params['subject'];
     if (!empty($action_params['assignee_contact_id'])) {
         $params['assignee_contact_id'] = $action_params['assignee_contact_id'];
     }
     return $params;
 }
コード例 #9
0
 /**
  * This method returns true or false when an condition is valid or not
  *
  * @param CRM_Civirules_TriggerData_TriggerData $triggerData
  * @return bool
  * @access public
  * @abstract
  */
 public function isConditionValid(CRM_Civirules_TriggerData_TriggerData $triggerData)
 {
     $phoneType = $this->conditionParams['phone_type'];
     $apiParams['contact_id'] = $triggerData->getContactId();
     if ($phoneType) {
         $apiParams['phone_type_id'] = $phoneType;
     }
     $count = civicrm_api3('Phone', 'getCount', $apiParams);
     if ($count) {
         return true;
     }
     return false;
 }
コード例 #10
0
 protected function getBodyParams(CRM_Civirules_TriggerData_TriggerData $triggerData)
 {
     $params = $this->getActionParameters();
     $bodyParams = explode("&", $params['request_body']);
     $return = array();
     foreach ($bodyParams as $bodyParam) {
         list($k, $v) = explode("=", $bodyParam);
         if (!empty($k)) {
             $return[$k] = trim($this->replaceTokens($v, $triggerData->getContactId()));
         }
     }
     return $return;
 }
コード例 #11
0
 public static function logError($reason, $original_error, CRM_Civirules_TriggerData_TriggerData $triggerData, $context = array())
 {
     $logger = CRM_Civirules_Utils_LoggerFactory::getLogger();
     if (empty($logger)) {
         return;
     }
     $error = "Rule: '{rule_title}' with id {rule_id} failed for contact {contact_id} because of {reason}";
     $context['rule_id'] = $triggerData->getTrigger()->getRuleId();
     $context['rule_title'] = $triggerData->getTrigger()->getRuleTitle();
     $context['original_error'] = $original_error;
     $context['contact_id'] = $triggerData->getContactId();
     $context['reason'] = $reason;
     $logger->error($error, $context);
 }
コード例 #12
0
 /**
  * Returns value of the field
  *
  * @param object CRM_Civirules_TriggerData_TriggerData $triggerData
  * @return mixed
  * @access protected
  */
 protected function getFieldValue(CRM_Civirules_TriggerData_TriggerData $triggerData)
 {
     $completed_status_id = CRM_Core_OptionGroup::getValue('contribution_status', 'completed', 'name');
     $contact_id = $triggerData->getContactId();
     $params[1] = array($completed_status_id, 'Integer');
     $params[2] = array($contact_id, 'Integer');
     $last_date = CRM_Core_DAO::singleValueQuery("SELECT MAX(`receive_date`) FROM `civicrm_contribution` WHERE `contribution_status_id` = %1 AND `contact_id` = %2", $params);
     if ($last_date) {
         $last_date = new DateTime($last_date);
         return $last_date->diff(new DateTime('now'))->days;
     }
     return false;
     //undefined contribution date
 }
コード例 #13
0
 /**
  * This method returns true or false when an condition is valid or not
  *
  * @param CRM_Civirules_TriggerData_TriggerData $triggerData
  * @return bool
  * @access public
  * @abstract
  */
 public function isConditionValid(CRM_Civirules_TriggerData_TriggerData $triggerData)
 {
     $isConditionValid = false;
     $contact_id = $triggerData->getContactId();
     switch ($this->conditionParams['operator']) {
         case 'in one of':
             $isConditionValid = $this->contactIsMemberOfOneGroup($contact_id, $this->conditionParams['group_ids']);
             break;
         case 'in all of':
             $isConditionValid = $this->contactIsMemberOfAllGroups($contact_id, $this->conditionParams['group_ids']);
             break;
         case 'not in':
             $isConditionValid = $this->contactIsNotMemberOfGroup($contact_id, $this->conditionParams['group_ids']);
             break;
     }
     return $isConditionValid;
 }
コード例 #14
0
 /**
  * This method returns true or false when an condition is valid or not
  *
  * @param CRM_Civirules_TriggerData_TriggerData $triggerData
  * @return bool
  * @access public
  * @abstract
  */
 public function isConditionValid(CRM_Civirules_TriggerData_TriggerData $triggerData)
 {
     $isConditionValid = false;
     $contact_id = $triggerData->getContactId();
     switch ($this->conditionParams['operator']) {
         case 'in one of':
             $isConditionValid = $this->contactHasOneOfTags($contact_id, $this->conditionParams['tag_ids']);
             break;
         case 'in all of':
             $isConditionValid = $this->contactHasAllTags($contact_id, $this->conditionParams['tag_ids']);
             break;
         case 'not in':
             $isConditionValid = $this->contactHasNotTag($contact_id, $this->conditionParams['tag_ids']);
             break;
     }
     return $isConditionValid;
 }
コード例 #15
0
 /**
  * Returns value of the field
  *
  * @param object CRM_Civirules_TriggerData_TriggerData $triggerData
  * @return mixed
  * @access protected
  */
 protected function getFieldValue(CRM_Civirules_TriggerData_TriggerData $triggerData)
 {
     $completed_status_id = CRM_Core_OptionGroup::getValue('contribution_status', 'completed', 'name');
     $contact_id = $triggerData->getContactId();
     $sql = "SELECT SUM(`total_amount`)\n            FROM `civicrm_contribution`\n            WHERE `contribution_status_id` = %1 AND `contact_id` = %2";
     $params[1] = array($completed_status_id, 'Integer');
     $params[2] = array($contact_id, 'Integer');
     $periodStartDate = CRM_CivirulesConditions_Utils_Period::convertPeriodToStartDate($this->conditionParams);
     $periodEndDate = CRM_CivirulesConditions_Utils_Period::convertPeriodToEndDate($this->conditionParams);
     if ($periodStartDate) {
         $sql .= " AND DATE(`receive_date`) >= '" . $periodStartDate->format('Y-m-d') . "'";
     }
     if ($periodEndDate) {
         $sql .= " AND DATE(`receive_date`) <= '" . $periodEndDate->format('Y-m-d') . "'";
     }
     $total_amount = (double) CRM_Core_DAO::singleValueQuery($sql, $params);
     return $total_amount;
 }
コード例 #16
0
 /**
  * Method is mandatory and checks if the condition is met
  *
  * @param CRM_Civirules_TriggerData_TriggerData $triggerData
  * @return bool
  * @access public
  */
 public function isConditionValid(CRM_Civirules_TriggerData_TriggerData $triggerData)
 {
     $contactId = $triggerData->getContactId();
     $contributionParams = array('contact_id' => $contactId);
     $countContributions = civicrm_api3('Contribution', 'getcount', $contributionParams);
     switch ($countContributions) {
         case 0:
             return TRUE;
             break;
         case 1:
             $existingContribution = civicrm_api3('Contribution', 'Getsingle', array('contact_id' => $contactId));
             $triggerContribution = $triggerData->getEntityData('Contribution');
             if ($triggerContribution['contribution_id'] == $existingContribution['contribution_id']) {
                 return TRUE;
             }
             break;
         default:
             return FALSE;
             break;
     }
 }
コード例 #17
0
 /**
  * Method processAction to execute the action
  *
  * @param CRM_Civirules_TriggerData_TriggerData $triggerData
  * @access public
  *
  */
 public function processAction(CRM_Civirules_TriggerData_TriggerData $triggerData)
 {
     $contactId = $triggerData->getContactId();
     $subTypes = CRM_Contact_BAO_Contact::getContactSubType($contactId);
     $contactType = CRM_Contact_BAO_Contact::getContactType($contactId);
     $changed = false;
     $action_params = $this->getActionParameters();
     foreach ($action_params['sub_type'] as $sub_type) {
         if (CRM_Contact_BAO_ContactType::isExtendsContactType($sub_type, $contactType)) {
             $subTypes[] = $sub_type;
             $changed = true;
         }
     }
     if ($changed) {
         $params['id'] = $contactId;
         $params['contact_id'] = $contactId;
         $params['contact_type'] = $contactType;
         $params['contact_sub_type'] = $subTypes;
         CRM_Contact_BAO_Contact::add($params);
     }
 }
コード例 #18
0
 /**
  * Process the action
  *
  * @param CRM_Civirules_TriggerData_TriggerData $triggerData
  * @access public
  */
 public function processAction(CRM_Civirules_TriggerData_TriggerData $triggerData)
 {
     $entity = $this->getApiEntity();
     $action = $this->getApiAction();
     $contactId = $triggerData->getContactId();
     $action_params = $this->getActionParameters();
     $group_ids = array();
     if (!empty($action_params['group_id'])) {
         $group_ids = array($action_params['group_id']);
     } elseif (!empty($action_params['group_ids']) && is_array($action_params['group_ids'])) {
         $group_ids = $action_params['group_ids'];
     }
     foreach ($group_ids as $group_id) {
         if (CRM_CivirulesConditions_Utils_GroupContact::isContactInGroup($contactId, $group_id)) {
             $params = array();
             $params['group_id'] = $group_id;
             //alter parameters by subclass
             $params = $this->alterApiParameters($params, $triggerData);
             //execute the action
             $this->executeApiAction($entity, $action, $params);
         }
     }
 }
コード例 #19
0
 /**
  * This function writes a record to the log table to indicate that this rule for this trigger is triggered
  *
  * The data this function stores is required by the cron type events.
  * @todo: think of a better handling for cron type events
  *
  * @param CRM_Civirules_TriggerData_TriggerData $triggerData
  */
 protected static function logRule(CRM_Civirules_TriggerData_TriggerData $triggerData)
 {
     $sql = "INSERT INTO `civirule_rule_log` (`rule_id`, `contact_id`, `log_date`) VALUES (%1, %2, NOW())";
     $params[1] = array($triggerData->getTrigger()->getRuleId(), 'Integer');
     $params[2] = array($triggerData->getContactId(), 'Integer');
     CRM_Core_DAO::executeQuery($sql, $params);
 }
コード例 #20
0
 /**
  * Logs a message to the logger
  *
  * @param $message
  * @param \CRM_Civirules_TriggerData_TriggerData|NULL $triggerData
  * @param string $level Should be one of \Psr\Log\LogLevel
  */
 protected function logCondition($message, CRM_Civirules_TriggerData_TriggerData $triggerData = null, $level = \Psr\Log\LogLevel::INFO)
 {
     $context = array();
     $context['message'] = $message;
     $context['rule_id'] = $this->ruleCondition['rule_id'];
     $rule = new CRM_Civirules_BAO_Rule();
     $rule->id = $this->ruleCondition['rule_id'];
     $context['rule_title'] = '';
     if ($rule->find(true)) {
         $context['rule_title'] = $rule->label;
     }
     $context['rule_condition_id'] = $this->ruleCondition['id'];
     $context['condition_label'] = CRM_Civirules_BAO_Condition::getConditionLabelWithId($this->ruleCondition['condition_id']);
     $context['condition_parameters'] = $this->userFriendlyConditionParams();
     $context['contact_id'] = $triggerData ? $triggerData->getContactId() : -1;
     $msg = "{condition_label} (ID: {rule_condition_id})\r\n\r\n{message}\r\n\r\nRule: '{rule_title}' with id {rule_id}";
     if ($context['contact_id'] > 0) {
         $msg .= "\r\nFor contact: {contact_id}";
     }
     CRM_Civirules_Utils_LoggerFactory::log($msg, $context, $level);
 }