/**
  * 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'))));
 }