X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=CRM%2FCore%2FForm%2FRecurringEntity.php;h=c202188193ec1bcdee0e4a240d4fe6a7f8c49220;hb=2e2605fe44474eb861c337eeeedc1717b7bcc84f;hp=975985562d57bf5e2069b6862b1113eabc35c8c6;hpb=c52174d854bcc01af1e112d3bb0eee0e201d65e6;p=civicrm-core.git diff --git a/CRM/Core/Form/RecurringEntity.php b/CRM/Core/Form/RecurringEntity.php index 975985562d..c202188193 100644 --- a/CRM/Core/Form/RecurringEntity.php +++ b/CRM/Core/Form/RecurringEntity.php @@ -1,490 +1,504 @@ -id; - } - } - if ($entityTable) { - CRM_Core_OptionValue::getValues(array('name' => $entityTable.'_repeat_exclude_dates_'.self::$_parentEntityId), $optionValue); - $excludeOptionValues = array(); - if (!empty($optionValue)) { - foreach($optionValue as $key => $val) { - $excludeOptionValues[$val['value']] = date('m/d/Y', strtotime($val['value'])); - } - self::$_excludeDateInfo = $excludeOptionValues; - } - } - } - - /** - * Set default values for the form. For edit/view mode - * the default values are retrieved from the database - * - * @access public - * - * @return None - */ - static function setDefaultValues() { - $defaults = array(); - if (self::$_scheduleReminderID) { - $defaults['repetition_frequency_unit'] = self::$_scheduleReminderDetails->repetition_frequency_unit; - $defaults['repetition_frequency_interval'] = self::$_scheduleReminderDetails->repetition_frequency_interval; - $defaults['start_action_condition'] = array_flip(explode(",",self::$_scheduleReminderDetails->start_action_condition)); - foreach($defaults['start_action_condition'] as $key => $val) { - $val = 1; - $defaults['start_action_condition'][$key] = $val; - } - $defaults['start_action_offset'] = self::$_scheduleReminderDetails->start_action_offset; - if (self::$_scheduleReminderDetails->start_action_offset) { - $defaults['ends'] = 1; - } - list($defaults['repeat_absolute_date']) = CRM_Utils_Date::setDateDefaults(self::$_scheduleReminderDetails->absolute_date); - if (self::$_scheduleReminderDetails->absolute_date) { - $defaults['ends'] = 2; - } - $defaults['limit_to'] = self::$_scheduleReminderDetails->limit_to; - if (self::$_scheduleReminderDetails->limit_to) { - $defaults['repeats_by'] = 1; - } - $explodeStartActionCondition = array(); - if (self::$_scheduleReminderDetails->entity_status) { - $explodeStartActionCondition = explode(" ", self::$_scheduleReminderDetails->entity_status); - $defaults['entity_status_1'] = $explodeStartActionCondition[0]; - $defaults['entity_status_2'] = $explodeStartActionCondition[1]; - } - if (self::$_scheduleReminderDetails->entity_status) { - $defaults['repeats_by'] = 2; - } - } - return $defaults; - } - - static function buildQuickForm(&$form) { - if (self::$_entityTable) { - $entityType = explode("_", self::$_entityTable); - if ($entityType[1]) { - $form->assign('entityType', ucwords($entityType[1])); - } - } - $form->assign('currentEntityId', self::$_entityId); - $form->assign('entityTable', self::$_entityTable); - $form->assign('scheduleReminderId', self::$_scheduleReminderID); - $form->assign('hasParent', self::$_hasParent); - - $form->_freqUnits = array('hour' => 'hour') + CRM_Core_OptionGroup::values('recur_frequency_units'); - foreach ($form->_freqUnits as $val => $label) { - if ($label == "day") { - $label = "dai"; - } - $freqUnitsDisplay[$val] = ts('%1ly', array(1 => $label)); - } - // echo "
";print_r($freqUnitsDisplay); - $dayOfTheWeek = array('monday' => 'Monday', - 'tuesday' => 'Tuesday', - 'wednesday' => 'Wednesday', - 'thursday' => 'Thursday', - 'friday' => 'Friday', - 'saturday' => 'Saturday', - 'sunday' => 'Sunday' - ); - $form->add('select', 'repetition_frequency_unit', ts('Repeats:'), $freqUnitsDisplay); - $numericOptions = CRM_Core_SelectValues::getNumericOptions(1, 30); - $form->add('select', 'repetition_frequency_interval', ts('Repeats every:'), $numericOptions, '', array('style' => 'width:55px;')); - $form->addDateTime('repetition_start_date', ts('Repetition Start Date'), FALSE, array('formatType' => 'activityDateTime')); - foreach($dayOfTheWeek as $key => $val) { - $startActionCondition[] = $form->createElement('checkbox', $key, NULL, substr($val." ", 0, 3)); - } - $form->addGroup($startActionCondition, 'start_action_condition', ts('Repeats on')); - $roptionTypes = array('1' => ts('day of the month'), - '2' => ts('day of the week'), - ); - $form->addRadio('repeats_by', ts("Repeats By:"), $roptionTypes, array(), NULL); - $getMonths = CRM_Core_SelectValues::getNumericOptions(1, 31); - $form->add('select', 'limit_to', '', $getMonths, FALSE, array('style' => 'width:55px;')); - $dayOfTheWeekNo = array('first' => 'First', - 'second'=> 'Second', - 'third' => 'Third', - 'fourth'=> 'Fourth', - 'last' => 'Last' - ); - $form->add('select', 'entity_status_1', ts(''), $dayOfTheWeekNo); - $form->add('select', 'entity_status_2', ts(''), $dayOfTheWeek); - $eoptionTypes = array('1' => ts('After'), - '2' => ts('On'), - ); - $form->addRadio('ends', ts("Ends:"), $eoptionTypes, array(), NULL); - $form->add('text', 'start_action_offset', ts(''), array('size' => 3, 'maxlength' => 2)); - $form->addFormRule(array('CRM_Core_Form_RecurringEntity', 'formRule')); - $form->addDate('repeat_absolute_date', ts('On'), FALSE, array('formatType' => 'mailing')); - $form->addDate('exclude_date', ts('Exclude Date(s)'), FALSE); - $select = $form->add('select', 'exclude_date_list', ts(''), self::$_excludeDateInfo, FALSE, array('style' => 'width:150px;', 'size' => 4)); - $select->setMultiple(TRUE); - $form->addElement('button','add_to_exclude_list','>>','onClick="addToExcludeList(document.getElementById(\'exclude_date\').value);"'); - $form->addElement('button','remove_from_exclude_list', '<<', 'onClick="removeFromExcludeList(\'exclude_date_list\')"'); - $form->addElement('hidden', 'copyExcludeDates', '', array('id' => 'copyExcludeDates')); - $form->addElement('hidden', 'allowRepeatConfigToSubmit', '', array('id' => 'allowRepeatConfigToSubmit')); - $form->addButtons(array( - array( - 'type' => 'submit', - 'name' => ts('Save'), - 'isDefault' => TRUE, - ), - array( - 'type' => 'cancel', - 'name' => ts('Cancel') - ), - ) - ); - } - - /** - * Global validation rules for the form - * - * @param array $fields posted values of the form - * - * @return array list of errors to be posted back to the form - * @static - * @access public - */ - static function formRule($values) { - $errors = array(); - //Process this function only when you get this variable - if ($values['allowRepeatConfigToSubmit'] == 1) { - $dayOfTheWeek = array('monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday'); - //Repeats - if (!CRM_Utils_Array::value('repetition_frequency_unit', $values)) { - $errors['repetition_frequency_unit'] = ts('This is a required field'); - } - //Repeats every - if (!CRM_Utils_Array::value('repetition_frequency_interval', $values)) { - $errors['repetition_frequency_interval'] = ts('This is a required field'); - } - //Ends - if (CRM_Utils_Array::value('ends', $values)) { - if ($values['ends'] == 1) { - if (empty($values['start_action_offset'])) { - $errors['start_action_offset'] = ts('This is a required field'); - } - else if ($values['start_action_offset'] > 30) { - $errors['start_action_offset'] = ts('Occurrences should be less than or equal to 30'); - } - } - if ($values['ends'] == 2) { - if (CRM_Utils_Array::value('repeat_absolute_date', $values)) { - $entityStartDate = CRM_Utils_Date::processDate($values['repetition_start_date']); - $end = CRM_Utils_Date::processDate($values['repeat_absolute_date']); - if (($end < $entityStartDate) && ($end != 0)) { - $errors['repeat_absolute_date'] = ts('End date should be after current entity\'s start date'); - } - } - else { - $errors['repeat_absolute_date'] = ts('This is a required field'); - } - } - } - else { - $errors['ends'] = ts('This is a required field'); - } - - //Repeats BY - if (CRM_Utils_Array::value('repeats_by', $values)) { - if ($values['repeats_by'] == 1) { - if (CRM_Utils_Array::value('limit_to', $values)) { - if ($values['limit_to'] < 1 && $values['limit_to'] > 31) { - $errors['limit_to'] = ts('Invalid day of the month'); - } - } - else { - $errors['limit_to'] = ts('Invalid day of the month'); - } - } - if ($values['repeats_by'] == 2) { - if (CRM_Utils_Array::value('entity_status_1', $values)) { - $dayOfTheWeekNo = array(first, second, third, fourth, last); - if (!in_array($values['entity_status_1'], $dayOfTheWeekNo)) { - $errors['entity_status_1'] = ts('Invalid option'); - } - } - else { - $errors['entity_status_1'] = ts('Invalid option'); - } - if (CRM_Utils_Array::value('entity_status_2', $values)) { - if (!in_array($values['entity_status_2'], $dayOfTheWeek)) { - $errors['entity_status_2'] = ts('Invalid day name'); - } - } - else { - $errors['entity_status_2'] = ts('Invalid day name'); - } - } - } - } - return $errors; - } - - /** - * Process the form submission - * - * @access public - * - * @return None - */ - static function postProcess($params = array(), $type, $linkedEntities = array()) { - //Check entity_id not present in params take it from class variable - if (!CRM_Utils_Array::value('entity_id', $params)) { - $params['entity_id'] = self::$_entityId; - } - //Process this function only when you get this variable - if ($params['allowRepeatConfigToSubmit'] == 1) { - if (CRM_Utils_Array::value('entity_table', $params) && CRM_Utils_Array::value('entity_id', $params) && $type) { - $params['used_for'] = $type; - if (!CRM_Utils_Array::value('parent_entity_id', $params)) { - $params['parent_entity_id'] = self::$_parentEntityId; - } - if (CRM_Utils_Array::value('schedule_reminder_id', $params)) { - $params['id'] = $params['schedule_reminder_id']; - } - else { - $params['id'] = self::$_scheduleReminderID; - } - - //Save post params to the schedule reminder table - $recurobj = new CRM_Core_BAO_RecurringEntity(); - $dbParams = $recurobj->mapFormValuesToDB($params); - - //Delete repeat configuration and rebuild - if (CRM_Utils_Array::value('id', $params)) { - CRM_Core_BAO_ActionSchedule::del($params['id']); - unset($params['id']); - } - $actionScheduleObj = CRM_Core_BAO_ActionSchedule::add($dbParams); - - //exclude dates - $excludeDateList = array(); - if (CRM_Utils_Array::value('copyExcludeDates', $params) && CRM_Utils_Array::value('parent_entity_id', $params) && $actionScheduleObj->entity_value) { - //Since we get comma separated values lets get them in array - $excludeDates = array(); - $excludeDates = explode(",", $params['copyExcludeDates']); - - //Check if there exists any values for this option group - $optionGroupIdExists = CRM_Core_DAO::getFieldValue('CRM_Core_DAO_OptionGroup', - $type.'_repeat_exclude_dates_'.$params['parent_entity_id'], - 'id', - 'name' - ); - if ($optionGroupIdExists) { - CRM_Core_BAO_OptionGroup::del($optionGroupIdExists); - } - $optionGroupParams = - array( - 'name' => $type.'_repeat_exclude_dates_'.$actionScheduleObj->entity_value, - 'title' => $type.' recursion', - 'is_reserved' => 0, - 'is_active' => 1 - ); - $opGroup = CRM_Core_BAO_OptionGroup::add($optionGroupParams); - if ($opGroup->id) { - $oldWeight= 0; - $fieldValues = array('option_group_id' => $opGroup->id); - foreach($excludeDates as $val) { - $optionGroupValue = - array( - 'option_group_id' => $opGroup->id, - 'label' => CRM_Utils_Date::processDate($val), - 'value' => CRM_Utils_Date::processDate($val), - 'name' => $opGroup->name, - 'description' => 'Used for recurring '.$type, - 'weight' => CRM_Utils_Weight::updateOtherWeights('CRM_Core_DAO_OptionValue', $oldWeight, CRM_Utils_Array::value('weight', $params), $fieldValues), - 'is_active' => 1 - ); - $excludeDateList[] = $optionGroupValue['value']; - CRM_Core_BAO_OptionValue::add($optionGroupValue); - } - } - } - - //Set type for API - $apiEntityType = array(); - $apiEntityType = explode("_", $type); - if (!empty($apiEntityType[1])) { - $apiType = $apiEntityType[1]; - } - //Delete relations if any from recurring entity tables before inserting new relations for this entity id - if ($params['entity_id']) { - //If entity has any pre delete function, consider that first - if (CRM_Utils_Array::value('pre_delete_func', CRM_Core_BAO_RecurringEntity::$_recurringEntityHelper[$params['entity_table']]) && - CRM_Utils_Array::value('helper_class', CRM_Core_BAO_RecurringEntity::$_recurringEntityHelper[$params['entity_table']])) { - call_user_func(array( - CRM_Core_BAO_RecurringEntity::$_recurringEntityHelper[$params['entity_table']]['helper_class'], - call_user_func_array(CRM_Core_BAO_RecurringEntity::$_recurringEntityHelper[$params['entity_table']]['pre_delete_func'], array($params['entity_id']))) - ); - } - //Ready to execute delete on entities if it has delete function set - if (CRM_Utils_Array::value('delete_func', CRM_Core_BAO_RecurringEntity::$_recurringEntityHelper[$params['entity_table']]) && - CRM_Utils_Array::value('helper_class', CRM_Core_BAO_RecurringEntity::$_recurringEntityHelper[$params['entity_table']])) { - //Check if pre delete function has some ids to be deleted - if (!empty(CRM_Core_BAO_RecurringEntity::$_entitiesToBeDeleted)) { - foreach (CRM_Core_BAO_RecurringEntity::$_entitiesToBeDeleted as $eid) { - $result = civicrm_api3( - ucfirst(strtolower($apiType)), - CRM_Core_BAO_RecurringEntity::$_recurringEntityHelper[$params['entity_table']]['delete_func'], - array( - 'sequential' => 1, - 'id' => $eid, - ) - ); - if ($result['error']) { - CRM_Core_Error::statusBounce('Error creating recurring list'); - } - } - } - else { - $getRelatedEntities = CRM_Core_BAO_RecurringEntity::getEntitiesFor($params['entity_id'], $params['entity_table'], FALSE); - foreach ($getRelatedEntities as $key => $value) { - $result = civicrm_api3( - ucfirst(strtolower($apiType)), - CRM_Core_BAO_RecurringEntity::$_recurringEntityHelper[$params['entity_table']]['delete_func'], - array( - 'sequential' => 1, - 'id' => $value['id'], - ) - ); - if ($result['error']) { - CRM_Core_Error::statusBounce('Error creating recurring list'); - } - } - } - } - - // find all entities from the recurring set. At this point we 'll get entities which were not deleted - // for e.g due to participants being present. We need to delete them from recurring tables anyway. - $pRepeatingEntities = CRM_Core_BAO_RecurringEntity::getEntitiesFor($params['entity_id'], $params['entity_table']); - foreach($pRepeatingEntities as $val) { - CRM_Core_BAO_RecurringEntity::delEntity($val['id'], $val['table'], TRUE); - } - } - - $recursion = new CRM_Core_BAO_RecurringEntity(); - $recursion->dateColumns = $params['dateColumns']; - $recursion->scheduleId = $actionScheduleObj->id; - - if (!empty($excludeDateList)) { - $recursion->excludeDates = $excludeDateList; - $recursion->excludeDateRangeColumns = $params['excludeDateRangeColumns']; - } - if (CRM_Utils_Array::value('intervalDateColumns', $params)) { - $recursion->intervalDateColumns = $params['intervalDateColumns']; - } - $recursion->entity_id = $params['entity_id']; - $recursion->entity_table = $params['entity_table']; - if (!empty($linkedEntities)) { - $recursion->linkedEntities = $linkedEntities; - } - - $recurResult = $recursion->generate(); - - $status = ts('Repeat Configuration has been saved'); - CRM_Core_Session::setStatus($status, ts('Saved'), 'success'); - } - } - } - - /** - * Return a descriptive name for the page, used in wizard header - * - * @return string - * @access public - */ - public function getTitle() { - return ts('Repeat Entity'); - } - -} +id; + } + } + if ($entityTable) { + CRM_Core_OptionValue::getValues(array('name' => $entityTable . '_repeat_exclude_dates_' . self::$_parentEntityId), $optionValue); + $excludeOptionValues = array(); + if (!empty($optionValue)) { + foreach ($optionValue as $key => $val) { + $excludeOptionValues[$val['value']] = date('m/d/Y', strtotime($val['value'])); + } + self::$_excludeDateInfo = $excludeOptionValues; + } + } + } + + /** + * Set default values for the form. For edit/view mode + * the default values are retrieved from the database + * + * + * @return array + */ + public static function setDefaultValues() { + $defaults = array(); + if (self::$_scheduleReminderID) { + $defaults['repetition_frequency_unit'] = self::$_scheduleReminderDetails->repetition_frequency_unit; + $defaults['repetition_frequency_interval'] = self::$_scheduleReminderDetails->repetition_frequency_interval; + $defaults['start_action_condition'] = array_flip(explode(",", self::$_scheduleReminderDetails->start_action_condition)); + foreach ($defaults['start_action_condition'] as $key => $val) { + $val = 1; + $defaults['start_action_condition'][$key] = $val; + } + $defaults['start_action_offset'] = self::$_scheduleReminderDetails->start_action_offset; + if (self::$_scheduleReminderDetails->start_action_offset) { + $defaults['ends'] = 1; + } + list($defaults['repeat_absolute_date']) = CRM_Utils_Date::setDateDefaults(self::$_scheduleReminderDetails->absolute_date); + if (self::$_scheduleReminderDetails->absolute_date) { + $defaults['ends'] = 2; + } + $defaults['limit_to'] = self::$_scheduleReminderDetails->limit_to; + if (self::$_scheduleReminderDetails->limit_to) { + $defaults['repeats_by'] = 1; + } + $explodeStartActionCondition = array(); + if (self::$_scheduleReminderDetails->entity_status) { + $explodeStartActionCondition = explode(" ", self::$_scheduleReminderDetails->entity_status); + $defaults['entity_status_1'] = $explodeStartActionCondition[0]; + $defaults['entity_status_2'] = $explodeStartActionCondition[1]; + } + if (self::$_scheduleReminderDetails->entity_status) { + $defaults['repeats_by'] = 2; + } + } + return $defaults; + } + + /** + * Build form. + * + * @param $form + */ + public static function buildQuickForm(&$form) { + if (self::$_entityTable) { + $entityType = explode("_", self::$_entityTable); + if ($entityType[1]) { + $form->assign('entityType', ucwords($entityType[1])); + } + } + $form->assign('currentEntityId', self::$_entityId); + $form->assign('entityTable', self::$_entityTable); + $form->assign('scheduleReminderId', self::$_scheduleReminderID); + $form->assign('hasParent', self::$_hasParent); + + $form->_freqUnits = array('hour' => 'hour') + CRM_Core_OptionGroup::values('recur_frequency_units'); + foreach ($form->_freqUnits as $val => $label) { + if ($label == "day") { + $label = "dai"; + } + $freqUnitsDisplay[$val] = ts('%1ly', array(1 => $label)); + } + // echo "";print_r($freqUnitsDisplay); + $dayOfTheWeek = array( + 'monday' => 'Monday', + 'tuesday' => 'Tuesday', + 'wednesday' => 'Wednesday', + 'thursday' => 'Thursday', + 'friday' => 'Friday', + 'saturday' => 'Saturday', + 'sunday' => 'Sunday', + ); + $form->add('select', 'repetition_frequency_unit', ts('Repeats:'), $freqUnitsDisplay); + $numericOptions = CRM_Core_SelectValues::getNumericOptions(1, 30); + $form->add('select', 'repetition_frequency_interval', ts('Repeats every:'), $numericOptions, '', array('style' => 'width:55px;')); + $form->addDateTime('repetition_start_date', ts('Repetition Start Date'), FALSE, array('formatType' => 'activityDateTime')); + foreach ($dayOfTheWeek as $key => $val) { + $startActionCondition[] = $form->createElement('checkbox', $key, NULL, substr($val . " ", 0, 3)); + } + $form->addGroup($startActionCondition, 'start_action_condition', ts('Repeats on')); + $roptionTypes = array( + '1' => ts('day of the month'), + '2' => ts('day of the week'), + ); + $form->addRadio('repeats_by', ts("Repeats By:"), $roptionTypes, array(), NULL); + $getMonths = CRM_Core_SelectValues::getNumericOptions(1, 31); + $form->add('select', 'limit_to', '', $getMonths, FALSE, array('style' => 'width:55px;')); + $dayOfTheWeekNo = array( + 'first' => 'First', + 'second' => 'Second', + 'third' => 'Third', + 'fourth' => 'Fourth', + 'last' => 'Last', + ); + $form->add('select', 'entity_status_1', ts(''), $dayOfTheWeekNo); + $form->add('select', 'entity_status_2', ts(''), $dayOfTheWeek); + $eoptionTypes = array( + '1' => ts('After'), + '2' => ts('On'), + ); + $form->addRadio('ends', ts("Ends:"), $eoptionTypes, array(), NULL); + $form->add('text', 'start_action_offset', ts(''), array('size' => 3, 'maxlength' => 2)); + $form->addFormRule(array('CRM_Core_Form_RecurringEntity', 'formRule')); + $form->addDate('repeat_absolute_date', ts('On'), FALSE, array('formatType' => 'mailing')); + $form->addDate('exclude_date', ts('Exclude Date(s)'), FALSE); + $select = $form->add('select', 'exclude_date_list', ts(''), self::$_excludeDateInfo, FALSE, array( + 'style' => 'width:150px;', + 'size' => 4, + )); + $select->setMultiple(TRUE); + $form->addElement('button', 'add_to_exclude_list', '>>', 'onClick="addToExcludeList(document.getElementById(\'exclude_date\').value);"'); + $form->addElement('button', 'remove_from_exclude_list', '<<', 'onClick="removeFromExcludeList(\'exclude_date_list\')"'); + $form->addElement('hidden', 'copyExcludeDates', '', array('id' => 'copyExcludeDates')); + $form->addElement('hidden', 'allowRepeatConfigToSubmit', '', array('id' => 'allowRepeatConfigToSubmit')); + $form->addButtons(array( + array( + 'type' => 'submit', + 'name' => ts('Save'), + 'isDefault' => TRUE, + ), + array( + 'type' => 'cancel', + 'name' => ts('Cancel'), + ), + ) + ); + } + + /** + * Global validation rules for the form + * + * @param array $values + * Posted values of the form. + * + * @return array + * list of errors to be posted back to the form + */ + public static function formRule($values) { + $errors = array(); + //Process this function only when you get this variable + if ($values['allowRepeatConfigToSubmit'] == 1) { + $dayOfTheWeek = array('monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday'); + //Repeats + if (!CRM_Utils_Array::value('repetition_frequency_unit', $values)) { + $errors['repetition_frequency_unit'] = ts('This is a required field'); + } + //Repeats every + if (!CRM_Utils_Array::value('repetition_frequency_interval', $values)) { + $errors['repetition_frequency_interval'] = ts('This is a required field'); + } + //Ends + if (CRM_Utils_Array::value('ends', $values)) { + if ($values['ends'] == 1) { + if (empty($values['start_action_offset'])) { + $errors['start_action_offset'] = ts('This is a required field'); + } + elseif ($values['start_action_offset'] > 30) { + $errors['start_action_offset'] = ts('Occurrences should be less than or equal to 30'); + } + } + if ($values['ends'] == 2) { + if (CRM_Utils_Array::value('repeat_absolute_date', $values)) { + $entityStartDate = CRM_Utils_Date::processDate($values['repetition_start_date']); + $end = CRM_Utils_Date::processDate($values['repeat_absolute_date']); + if (($end < $entityStartDate) && ($end != 0)) { + $errors['repeat_absolute_date'] = ts('End date should be after current entity\'s start date'); + } + } + else { + $errors['repeat_absolute_date'] = ts('This is a required field'); + } + } + } + else { + $errors['ends'] = ts('This is a required field'); + } + + //Repeats BY + if (CRM_Utils_Array::value('repeats_by', $values)) { + if ($values['repeats_by'] == 1) { + if (CRM_Utils_Array::value('limit_to', $values)) { + if ($values['limit_to'] < 1 && $values['limit_to'] > 31) { + $errors['limit_to'] = ts('Invalid day of the month'); + } + } + else { + $errors['limit_to'] = ts('Invalid day of the month'); + } + } + if ($values['repeats_by'] == 2) { + if (CRM_Utils_Array::value('entity_status_1', $values)) { + $dayOfTheWeekNo = array(first, second, third, fourth, last); + if (!in_array($values['entity_status_1'], $dayOfTheWeekNo)) { + $errors['entity_status_1'] = ts('Invalid option'); + } + } + else { + $errors['entity_status_1'] = ts('Invalid option'); + } + if (CRM_Utils_Array::value('entity_status_2', $values)) { + if (!in_array($values['entity_status_2'], $dayOfTheWeek)) { + $errors['entity_status_2'] = ts('Invalid day name'); + } + } + else { + $errors['entity_status_2'] = ts('Invalid day name'); + } + } + } + } + return $errors; + } + + /** + * Process the form submission + * + * + * @return void + */ + public static function postProcess($params = array(), $type, $linkedEntities = array()) { + //Check entity_id not present in params take it from class variable + if (!CRM_Utils_Array::value('entity_id', $params)) { + $params['entity_id'] = self::$_entityId; + } + //Process this function only when you get this variable + if ($params['allowRepeatConfigToSubmit'] == 1) { + if (CRM_Utils_Array::value('entity_table', $params) && CRM_Utils_Array::value('entity_id', $params) && $type) { + $params['used_for'] = $type; + if (!CRM_Utils_Array::value('parent_entity_id', $params)) { + $params['parent_entity_id'] = self::$_parentEntityId; + } + if (CRM_Utils_Array::value('schedule_reminder_id', $params)) { + $params['id'] = $params['schedule_reminder_id']; + } + else { + $params['id'] = self::$_scheduleReminderID; + } + + //Save post params to the schedule reminder table + $recurobj = new CRM_Core_BAO_RecurringEntity(); + $dbParams = $recurobj->mapFormValuesToDB($params); + + //Delete repeat configuration and rebuild + if (CRM_Utils_Array::value('id', $params)) { + CRM_Core_BAO_ActionSchedule::del($params['id']); + unset($params['id']); + } + $actionScheduleObj = CRM_Core_BAO_ActionSchedule::add($dbParams); + + //exclude dates + $excludeDateList = array(); + if (CRM_Utils_Array::value('copyExcludeDates', $params) && CRM_Utils_Array::value('parent_entity_id', $params) && $actionScheduleObj->entity_value) { + //Since we get comma separated values lets get them in array + $excludeDates = array(); + $excludeDates = explode(",", $params['copyExcludeDates']); + + //Check if there exists any values for this option group + $optionGroupIdExists = CRM_Core_DAO::getFieldValue('CRM_Core_DAO_OptionGroup', + $type . '_repeat_exclude_dates_' . $params['parent_entity_id'], + 'id', + 'name' + ); + if ($optionGroupIdExists) { + CRM_Core_BAO_OptionGroup::del($optionGroupIdExists); + } + $optionGroupParams = array( + 'name' => $type . '_repeat_exclude_dates_' . $actionScheduleObj->entity_value, + 'title' => $type . ' recursion', + 'is_reserved' => 0, + 'is_active' => 1, + ); + $opGroup = CRM_Core_BAO_OptionGroup::add($optionGroupParams); + if ($opGroup->id) { + $oldWeight = 0; + $fieldValues = array('option_group_id' => $opGroup->id); + foreach ($excludeDates as $val) { + $optionGroupValue = array( + 'option_group_id' => $opGroup->id, + 'label' => CRM_Utils_Date::processDate($val), + 'value' => CRM_Utils_Date::processDate($val), + 'name' => $opGroup->name, + 'description' => 'Used for recurring ' . $type, + 'weight' => CRM_Utils_Weight::updateOtherWeights('CRM_Core_DAO_OptionValue', $oldWeight, CRM_Utils_Array::value('weight', $params), $fieldValues), + 'is_active' => 1, + ); + $excludeDateList[] = $optionGroupValue['value']; + CRM_Core_BAO_OptionValue::add($optionGroupValue); + } + } + } + + //Set type for API + $apiEntityType = array(); + $apiEntityType = explode("_", $type); + if (!empty($apiEntityType[1])) { + $apiType = $apiEntityType[1]; + } + //Delete relations if any from recurring entity tables before inserting new relations for this entity id + if ($params['entity_id']) { + //If entity has any pre delete function, consider that first + if (CRM_Utils_Array::value('pre_delete_func', CRM_Core_BAO_RecurringEntity::$_recurringEntityHelper[$params['entity_table']]) && + CRM_Utils_Array::value('helper_class', CRM_Core_BAO_RecurringEntity::$_recurringEntityHelper[$params['entity_table']]) + ) { + call_user_func(array( + CRM_Core_BAO_RecurringEntity::$_recurringEntityHelper[$params['entity_table']]['helper_class'], + call_user_func_array(CRM_Core_BAO_RecurringEntity::$_recurringEntityHelper[$params['entity_table']]['pre_delete_func'], array($params['entity_id'])), + ) + ); + } + //Ready to execute delete on entities if it has delete function set + if (CRM_Utils_Array::value('delete_func', CRM_Core_BAO_RecurringEntity::$_recurringEntityHelper[$params['entity_table']]) && + CRM_Utils_Array::value('helper_class', CRM_Core_BAO_RecurringEntity::$_recurringEntityHelper[$params['entity_table']]) + ) { + //Check if pre delete function has some ids to be deleted + if (!empty(CRM_Core_BAO_RecurringEntity::$_entitiesToBeDeleted)) { + foreach (CRM_Core_BAO_RecurringEntity::$_entitiesToBeDeleted as $eid) { + $result = civicrm_api3( + ucfirst(strtolower($apiType)), + CRM_Core_BAO_RecurringEntity::$_recurringEntityHelper[$params['entity_table']]['delete_func'], + array( + 'sequential' => 1, + 'id' => $eid, + ) + ); + if ($result['error']) { + CRM_Core_Error::statusBounce('Error creating recurring list'); + } + } + } + else { + $getRelatedEntities = CRM_Core_BAO_RecurringEntity::getEntitiesFor($params['entity_id'], $params['entity_table'], FALSE); + foreach ($getRelatedEntities as $key => $value) { + $result = civicrm_api3( + ucfirst(strtolower($apiType)), + CRM_Core_BAO_RecurringEntity::$_recurringEntityHelper[$params['entity_table']]['delete_func'], + array( + 'sequential' => 1, + 'id' => $value['id'], + ) + ); + if ($result['error']) { + CRM_Core_Error::statusBounce('Error creating recurring list'); + } + } + } + } + + // find all entities from the recurring set. At this point we 'll get entities which were not deleted + // for e.g due to participants being present. We need to delete them from recurring tables anyway. + $pRepeatingEntities = CRM_Core_BAO_RecurringEntity::getEntitiesFor($params['entity_id'], $params['entity_table']); + foreach ($pRepeatingEntities as $val) { + CRM_Core_BAO_RecurringEntity::delEntity($val['id'], $val['table'], TRUE); + } + } + + $recursion = new CRM_Core_BAO_RecurringEntity(); + $recursion->dateColumns = $params['dateColumns']; + $recursion->scheduleId = $actionScheduleObj->id; + + if (!empty($excludeDateList)) { + $recursion->excludeDates = $excludeDateList; + $recursion->excludeDateRangeColumns = $params['excludeDateRangeColumns']; + } + if (CRM_Utils_Array::value('intervalDateColumns', $params)) { + $recursion->intervalDateColumns = $params['intervalDateColumns']; + } + $recursion->entity_id = $params['entity_id']; + $recursion->entity_table = $params['entity_table']; + if (!empty($linkedEntities)) { + $recursion->linkedEntities = $linkedEntities; + } + + $recurResult = $recursion->generate(); + + $status = ts('Repeat Configuration has been saved'); + CRM_Core_Session::setStatus($status, ts('Saved'), 'success'); + } + } + } + + /** + * Return a descriptive name for the page, used in wizard header + * + * @return string + */ + public function getTitle() { + return ts('Repeat Entity'); + } + +}