/** * Function to add or update rule * * @param array $params * @return array $result * @access public * @throws Exception when params is empty * @static */ public static function add($params) { $result = array(); if (empty($params)) { throw new Exception('Params can not be empty when adding or updating a civirule rule'); } if (!empty($params['id'])) { CRM_Utils_Hook::pre('edit', 'CiviRuleRule', $params['id'], $params); } else { CRM_Utils_Hook::pre('create', 'CiviRuleRule', NULL, $params); } $rule = new CRM_Civirules_BAO_Rule(); $fields = self::fields(); foreach ($params as $key => $value) { if (isset($fields[$key])) { $rule->{$key} = $value; } } if (!isset($rule->name) || empty($rule->name)) { if (isset($rule->label)) { $rule->name = CRM_Civirules_Utils::buildNameFromLabel($rule->label); } } $rule->save(); self::storeValues($rule, $result); if (!empty($params['id'])) { CRM_Utils_Hook::post('edit', 'CiviRuleRule', $rule->id, $rule); } else { CRM_Utils_Hook::post('create', 'CiviRuleRule', $rule->id, $rule); } return $result; }
/** * 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; }
/** * Returns a user friendly text explaining the condition params * e.g. 'Older than 65' * * @return string * @access public */ public function userFriendlyConditionParams() { $activityTypeLabel = CRM_Civirules_Utils::getOptionLabelWithValue(CRM_Civirules_Utils::getOptionGroupIdWithName('activity_type'), $this->conditionParams['activity_type_id']); if (!empty($activityTypeLabel)) { return 'Activity type is ' . $activityTypeLabel; } return ''; }
/** * Returns a user friendly text explaining the condition params * e.g. 'Older than 65' * * @return string * @access public */ public function userFriendlyConditionParams() { $activityTypeLabel = CRM_Civirules_Utils::getOptionLabelWithValue(CRM_Civirules_Utils::getOptionGroupIdWithName('activity_contacts'), $this->conditionParams['record_type_id']); if (!empty($activityTypeLabel)) { return ts('For all %1', array(1 => $activityTypeLabel)); } return ''; }
/** * Overridden parent method to build the form * * @access public */ public function buildQuickForm() { $this->add('hidden', 'rule_condition_id'); $activityTypeList = array('- select -') + CRM_Civirules_Utils::getActivityTypeList(); asort($activityTypeList); $this->add('select', 'activity_type_id', 'Activity Type', $activityTypeList, true); $this->addButtons(array(array('type' => 'next', 'name' => ts('Save'), 'isDefault' => TRUE), array('type' => 'cancel', 'name' => ts('Cancel')))); parent::buildQuickForm(); }
/** * Method to determine if the condition is valid * * @param CRM_Civirules_EventData_EventData $eventData * @return bool */ public function isConditionValid(CRM_Civirules_EventData_EventData $eventData) { $isConditionValid = FALSE; $contact_id = $eventData->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; }
/** * Overridden parent method to build form * * @access public */ public function buildQuickForm() { $this->add('hidden', 'rule_condition_id'); $membershipStatus = CRM_Civirules_Utils::getMembershipStatus(); $membershipStatus[0] = ts('- select -'); asort($membershipStatus); $this->add('select', 'membership_status_id', ts('Membership Status'), $membershipStatus, true); $this->add('select', 'operator', ts('Operator'), array('equals', 'is not equal to'), true); $this->addButtons(array(array('type' => 'next', 'name' => ts('Save'), 'isDefault' => TRUE), array('type' => 'cancel', 'name' => ts('Cancel')))); }
/** * Overridden parent method to build form * * @access public */ public function buildQuickForm() { $this->add('hidden', 'rule_condition_id'); $financialTypes = CRM_Civirules_Utils::getFinancialTypes(); $financialTypes[0] = ts('- select -'); asort($financialTypes); $this->add('select', 'financial_type_id', ts('Financial type'), $financialTypes, true); $this->add('select', 'operator', ts('Operator'), array('equals', 'is not equal to'), true); $this->addButtons(array(array('type' => 'next', 'name' => ts('Save'), 'isDefault' => TRUE), array('type' => 'cancel', 'name' => ts('Cancel')))); }
/** * Function to get the data * * @return array $rules * @access protected */ protected function getRules() { $rules = CRM_Civirules_BAO_Rule::getValues(array()); foreach ($rules as $ruleId => $rule) { $rules[$ruleId]['actions'] = $this->setRowActions($rule); if (isset($rule['event_id']) && !empty($rule['event_id'])) { $rules[$ruleId]['event_label'] = CRM_Civirules_BAO_Event::getEventLabelWithId($rule['event_id']); } $rules[$ruleId]['created_contact_name'] = CRM_Civirules_Utils::getContactName($rule['created_user_id']); $rules[$ruleId]['is_active'] = CRM_Civirules_Utils::formatIsActive($rule['is_active']); } return $rules; }
/** * Function to add the form elements * * @access protected */ protected function createFormElements() { $this->add('hidden', 'rule_id'); $this->add('hidden', 'rid'); $this->add('hidden', 'action'); /* * add select list only if it is not the first condition */ $linkList = array('AND' => 'AND', 'OR' => 'OR'); $this->add('select', 'rule_condition_link_select', ts('Select Link Operator'), $linkList); $conditionList = array(' - select - ') + CRM_Civirules_Utils::buildConditionList(); asort($conditionList); $this->add('select', 'rule_condition_select', ts('Select Condition'), $conditionList); $this->addButtons(array(array('type' => 'next', 'name' => ts('Save'), 'isDefault' => TRUE), array('type' => 'cancel', 'name' => ts('Cancel')))); }
/** * Method is mandatory and checks if the condition is met * * @param CRM_Civirules_EventData_EventData $eventData * @return bool * @access public */ public function isConditionValid(CRM_Civirules_EventData_EventData $eventData) { $isConditionValid = FALSE; $contactId = $eventData->getContactId(); $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) { $isConditionValid = TRUE; } } } catch (CiviCRM_API3_Exception $ex) { } return $isConditionValid; }
/** * 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; $contribution = $triggerData->getEntityData('Contribution'); /* * retrieve count of completed contributions for donor where recurring_contribution_id is not empty */ $query = 'SELECT COUNT(*) AS recurringContributions FROM civicrm_contribution WHERE contact_id = %1 AND civicrm_contribution.contribution_recur_id > %2 AND contribution_status_id = %3'; $params = array(1 => array($contribution['contact_id'], 'Positive'), 2 => array(0, 'Positive'), 3 => array(CRM_Civirules_Utils::getContributionStatusIdWithName('Completed'), 'String')); $dao = CRM_Core_DAO::executeQuery($query, $params); if ($dao->fetch()) { switch ($this->conditionParams['operator']) { case 1: if ($dao->recurringContributions != $this->conditionParams['no_of_recurring']) { $isConditionValid = TRUE; } break; case 2: if ($dao->recurringContributions > $this->conditionParams['no_of_recurring']) { $isConditionValid = TRUE; } break; case 3: if ($dao->recurringContributions >= $this->conditionParams['no_of_recurring']) { $isConditionValid = TRUE; } break; case 4: if ($dao->recurringContributions < $this->conditionParams['no_of_recurring']) { $isConditionValid = TRUE; } break; case 5: if ($dao->recurringContributions <= $this->conditionParams['no_of_recurring']) { $isConditionValid = TRUE; } break; default: if ($dao->recurringContributions == $this->conditionParams['no_of_recurring']) { $isConditionValid = TRUE; } break; } } return $isConditionValid; }
/** * Function to add or update condition * * @param array $params * @return array $result * @access public * @throws Exception when params is empty * @static */ public static function add($params) { $result = array(); if (empty($params)) { throw new Exception('Params can not be empty when adding or updating a civirule condition'); } $condition = new CRM_Civirules_BAO_Condition(); $fields = self::fields(); foreach ($params as $key => $value) { if (isset($fields[$key])) { $condition->{$key} = $value; } } if (!isset($condition->name) || empty($condition->name)) { $condition->name = CRM_Civirules_Utils::buildNameFromLabel($condition->label); } $condition->save(); self::storeValues($condition, $result); return $result; }
/** * Overridden parent method to build form * * @access public */ public function buildQuickForm() { $operatorList[0] = 'equals (=)'; $operatorList[1] = 'is not equal (!=)'; $operatorList[2] = 'is more than (>)'; $operatorList[3] = 'is more than or equal (>=)'; $operatorList[4] = 'is less than (<)'; $operatorList[5] = 'is less than or equal (<=)'; $financialTypes = CRM_Civirules_Utils::getFinancialTypes(); $financialTypes[0] = ts(' - any -'); asort($financialTypes); $this->add('hidden', 'rule_condition_id'); $this->add('select', 'count_operator', ts('Operator'), $operatorList, true); $this->add('select', 'amount_operator', ts('where Operator'), $operatorList, true); $this->add('select', 'financial_type', ts('of Financial Type'), $financialTypes, true); $this->add('text', 'no_of_contributions', ts('Number of Contributions'), array(), true); $this->addRule('no_of_contributions', 'Number of contributions must be a whole number', 'numeric'); $this->addRule('no_of_contributions', 'Number of contributions must be a whole number', 'nopunctuation'); $this->add('text', 'amount', ts('Amount'), array(), true); $this->addRule('amount', 'Amount can only contain numbers', 'numeric'); $this->addButtons(array(array('type' => 'next', 'name' => ts('Save'), 'isDefault' => TRUE), array('type' => 'cancel', 'name' => ts('Cancel')))); }
/** * Function to save rule * * @param array $formValues * @param int $userId * @access protected */ protected function saveRule($formValues, $userId) { if ($this->_action == CRM_Core_Action::ADD) { $ruleParams = array('created_date' => date('Ymd'), 'created_user_id' => $userId); } else { $ruleParams = array('modified_date' => date('Ymd'), 'modified_user_id' => $userId, 'id' => $formValues['id']); } $ruleParams['label'] = $formValues['rule_label']; $ruleParams['name'] = CRM_Civirules_Utils::buildNameFromLabel($formValues['rule_label']); $ruleParams['is_active'] = $formValues['rule_is_active'] ? 1 : 0; $savedRule = CRM_Civirules_BAO_Rule::add($ruleParams); $this->ruleId = $savedRule['id']; }
/** * Method to build the where Clauses and related Params * * @param array $contribution * @access protected */ protected function buildWhereClauses($contribution) { $this->whereClauses[] = 'contribution_status_id = %1'; $this->whereParams[1] = array(CRM_Civirules_Utils::getContributionStatusIdWithName('Completed'), 'Integer'); $this->whereClauses[] = 'is_test = %2'; $this->whereParams[2] = array(0, 'Integer'); $this->whereClauses[] = 'contact_id = %3'; $this->whereParams[3] = array($contribution['contact_id'], 'Integer'); $index = 3; if (!empty($this->conditionParams['amount'])) { $index++; $this->whereClauses[] = 'total_amount ' . $this->setOperator($this->conditionParams['amount_operator']) . ' %' . $index; $this->whereParams[$index] = array($this->conditionParams['amount'], 'Money'); } if (!empty($this->conditionParams['financial_type'])) { $index++; $this->whereClauses[] = 'financial_type_id = %' . $index; $this->whereParams[$index] = array($this->conditionParams['financial_type'], 'Integer'); } }
/** * Function to add the form elements * * @access protected */ protected function createFormElements() { $this->add('hidden', 'rule_id'); if ($this->ruleActionId) { $this->add('hidden', 'id'); } $actionList = array(' - select - ') + CRM_Civirules_Utils::buildActionList(); asort($actionList); $attributes = array(); if (empty($this->ruleActionId)) { $this->add('select', 'rule_action_select', ts('Select Action'), $actionList, $attributes); } $delayList = array(' - No Delay - ') + CRM_Civirules_Delay_Factory::getOptionList(); $this->add('select', 'delay_select', ts('Delay action to'), $delayList); foreach (CRM_Civirules_Delay_Factory::getAllDelayClasses() as $delay_class) { $delay_class->addElements($this); } $this->assign('delayClasses', CRM_Civirules_Delay_Factory::getAllDelayClasses()); $this->addButtons(array(array('type' => 'next', 'name' => ts('Save'), 'isDefault' => TRUE), array('type' => 'cancel', 'name' => ts('Cancel')))); }