/** * Validation. * * @param array $params * (ref.) an assoc array of name/value pairs. * * @param $files * @param $self * * @throws CiviCRM_API3_Exception * @return bool|array * mixed true or array of errors */ public static function formRule($params, $files, $self) { $errors = array(); $priceSetId = CRM_Utils_Array::value('price_set_id', $params); if ($priceSetId) { CRM_Price_BAO_PriceField::priceSetValidation($priceSetId, $params, $errors); $priceFieldIDS = array(); foreach ($self->_priceSet['fields'] as $priceIds => $field) { if (!empty($params['price_' . $priceIds])) { if (is_array($params['price_' . $priceIds])) { foreach ($params['price_' . $priceIds] as $priceFldVal => $isSet) { if ($isSet) { $priceFieldIDS[] = $priceFldVal; } } } elseif (!$field['is_enter_qty']) { $priceFieldIDS[] = $params['price_' . $priceIds]; } } } if (!empty($priceFieldIDS)) { $ids = implode(',', $priceFieldIDS); $count = CRM_Price_BAO_PriceSet::getMembershipCount($ids); foreach ($count as $id => $occurance) { if ($occurance > 1) { $errors['_qf_default'] = ts('Select at most one option associated with the same membership type.'); } } foreach ($priceFieldIDS as $priceFieldId) { if ($id = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceFieldValue', $priceFieldId, 'membership_type_id')) { $self->_memTypeSelected[$id] = $id; } } } } elseif (empty($params['membership_type_id'][1])) { $errors['membership_type_id'] = ts('Please select a membership type.'); } else { $self->_memTypeSelected[] = $params['membership_type_id'][1]; } if (!$priceSetId) { $numterms = CRM_Utils_Array::value('num_terms', $params); if ($numterms && intval($numterms) != $numterms) { $errors['num_terms'] = ts('Please enter an integer for the number of terms.'); } } // Return error if empty $self->_memTypeSelected if ($priceSetId && empty($errors) && empty($self->_memTypeSelected)) { $errors['_qf_default'] = ts('Select at least one membership option.'); } if (!empty($errors) && count($self->_memTypeSelected) > 1) { $memberOfContacts = CRM_Member_BAO_MembershipType::getMemberOfContactByMemTypes($self->_memTypeSelected); $duplicateMemberOfContacts = array_count_values($memberOfContacts); foreach ($duplicateMemberOfContacts as $countDuplicate) { if ($countDuplicate > 1) { $errors['_qf_default'] = ts('Please do not select more than one membership associated with the same organization.'); } } } if (!empty($errors)) { return $errors; } if ($priceSetId && !$self->_mode && empty($params['record_contribution'])) { $errors['record_contribution'] = ts('Record Membership Payment is required when you using price set.'); } if (!$priceSetId && $self->_mode && empty($params['financial_type_id'])) { $errors['financial_type_id'] = ts('Please enter the financial Type.'); } if (!empty($params['record_contribution']) && empty($params['payment_instrument_id'])) { $errors['payment_instrument_id'] = ts('Paid By is a required field.'); } if (!empty($params['is_different_contribution_contact'])) { if (empty($params['soft_credit_type_id'])) { $errors['soft_credit_type_id'] = ts('Please Select a Soft Credit Type'); } if (empty($params['soft_credit_contact_id'])) { $errors['soft_credit_contact_id'] = ts('Please select a contact'); } } if (!empty($params['payment_processor_id'])) { // validate payment instrument (e.g. credit card number) CRM_Core_Payment_Form::validatePaymentInstrument($params['payment_processor_id'], $params, $errors, $self); } $joinDate = NULL; if (!empty($params['join_date'])) { $joinDate = CRM_Utils_Date::processDate($params['join_date']); foreach ($self->_memTypeSelected as $memType) { $startDate = NULL; if (!empty($params['start_date'])) { $startDate = CRM_Utils_Date::processDate($params['start_date']); } // if end date is set, ensure that start date is also set // and that end date is later than start date $endDate = NULL; if (!empty($params['end_date'])) { $endDate = CRM_Utils_Date::processDate($params['end_date']); } $membershipDetails = CRM_Member_BAO_MembershipType::getMembershipTypeDetails($memType); if ($startDate && CRM_Utils_Array::value('period_type', $membershipDetails) == 'rolling') { if ($startDate < $joinDate) { $errors['start_date'] = ts('Start date must be the same or later than Member since.'); } } if ($endDate) { if ($membershipDetails['duration_unit'] == 'lifetime') { // Check if status is NOT cancelled or similar. For lifetime memberships, there is no automated // process to update status based on end-date. The user must change the status now. $result = civicrm_api3('MembershipStatus', 'get', array('sequential' => 1, 'is_current_member' => 0)); $tmp_statuses = $result['values']; $status_ids = array(); foreach ($tmp_statuses as $cur_stat) { $status_ids[] = $cur_stat['id']; } if (empty($params['status_id']) || in_array($params['status_id'], $status_ids) == FALSE) { $errors['status_id'] = ts('Please enter a status that does NOT represent a current membership status.'); $errors['is_override'] = ts('This must be checked because you set an End Date for a lifetime membership'); } } else { if (!$startDate) { $errors['start_date'] = ts('Start date must be set if end date is set.'); } if ($endDate < $startDate) { $errors['end_date'] = ts('End date must be the same or later than start date.'); } } } // Default values for start and end dates if not supplied // on the form $defaultDates = CRM_Member_BAO_MembershipType::getDatesForMembershipType($memType, $joinDate, $startDate, $endDate); if (!$startDate) { $startDate = CRM_Utils_Array::value('start_date', $defaultDates); } if (!$endDate) { $endDate = CRM_Utils_Array::value('end_date', $defaultDates); } //CRM-3724, check for availability of valid membership status. if (empty($params['is_override']) && !isset($errors['_qf_default'])) { $calcStatus = CRM_Member_BAO_MembershipStatus::getMembershipStatusByDate($startDate, $endDate, $joinDate, 'today', TRUE, $memType, $params); if (empty($calcStatus)) { $url = CRM_Utils_System::url('civicrm/admin/member/membershipStatus', 'reset=1&action=browse'); $errors['_qf_default'] = ts('There is no valid Membership Status available for selected membership dates.'); $status = ts('Oops, it looks like there is no valid membership status available for the given membership dates. You can <a href="%1">Configure Membership Status Rules</a>.', array(1 => $url)); if (!$self->_mode) { $status .= ' ' . ts('OR You can sign up by setting Status Override? to true.'); } CRM_Core_Session::setStatus($status, ts('Membership Status Error'), 'error'); } } } } else { $errors['join_date'] = ts('Please enter the Member Since.'); } if (isset($params['is_override']) && $params['is_override'] && empty($params['status_id'])) { $errors['status_id'] = ts('Please enter the status.'); } //total amount condition arise when membership type having no //minimum fee if (isset($params['record_contribution'])) { if (!$params['financial_type_id']) { $errors['financial_type_id'] = ts('Please enter the financial Type.'); } if (CRM_Utils_System::isNull($params['total_amount'])) { $errors['total_amount'] = ts('Please enter the contribution.'); } } // validate contribution status for 'Failed'. if ($self->_onlinePendingContributionId && !empty($params['record_contribution']) && CRM_Utils_Array::value('contribution_status_id', $params) == array_search('Failed', CRM_Contribute_PseudoConstant::contributionStatus(NULL, 'name'))) { $errors['contribution_status_id'] = ts('Please select a valid payment status before updating.'); } return empty($errors) ? TRUE : $errors; }
/** * Function for validation * * @param array $params (ref.) an assoc array of name/value pairs * * @return mixed true or array of errors * @access public * @static */ public function formRule($params, $files, $self) { $errors = array(); $priceSetId = CRM_Utils_Array::value('price_set_id', $params); if ($priceSetId) { CRM_Price_BAO_Field::priceSetValidation($priceSetId, $params, $errors); $priceFieldIDS = array(); foreach ($self->_priceSet['fields'] as $priceIds => $dontCare) { if (!empty($params['price_' . $priceIds])) { if (is_array($params['price_' . $priceIds])) { foreach ($params['price_' . $priceIds] as $priceFldVal => $isSet) { if ($isSet) { $priceFieldIDS[] = $priceFldVal; } } } else { $priceFieldIDS[] = $params['price_' . $priceIds]; } } } if (!empty($priceFieldIDS)) { $ids = implode(',', $priceFieldIDS); $count = CRM_Price_BAO_Set::getMembershipCount($ids); foreach ($count as $id => $occurance) { if ($occurance > 1) { $errors['_qf_default'] = ts('Select at most one option associated with the same membership type.'); } } foreach ($priceFieldIDS as $priceFieldId) { if ($id = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_FieldValue', $priceFieldId, 'membership_type_id')) { $self->_memTypeSelected[$id] = $id; } } } } elseif (!CRM_Utils_Array::value(1, $params['membership_type_id'])) { $errors['membership_type_id'] = ts('Please select a membership type.'); } else { $self->_memTypeSelected[] = $params['membership_type_id'][1]; } // Return error if empty $self->_memTypeSelected if ($priceSetId && empty($errors) && empty($self->_memTypeSelected)) { $errors['_qf_default'] = ts('Select at least one membership option.'); } if (!empty($errors) && count($self->_memTypeSelected) > 1) { $memberOfContacts = CRM_Member_BAO_MembershipType::getMemberOfContactByMemTypes($self->_memTypeSelected); $duplicateMemberOfContacts = array_count_values($memberOfContacts); foreach ($duplicateMemberOfContacts as $countDuplicate) { if ($countDuplicate > 1) { $errors['_qf_default'] = ts('Please do not select more than one membership associated with the same organization.'); } } } //check if contact is selected in standalone mode if (isset($params['contact_select_id'][1]) && !$params['contact_select_id'][1]) { $errors['contact[1]'] = ts('Please select a contact or create new contact'); } if (!empty($errors)) { return $errors; } if ($priceSetId && !$self->_mode && !CRM_Utils_Array::value('record_contribution', $params)) { $errors['record_contribution'] = ts('Record Membership Payment is required when you using price set.'); } if (CRM_Utils_Array::value('payment_processor_id', $params)) { // make sure that credit card number and cvv are valid if (CRM_Utils_Array::value('credit_card_type', $params)) { if (CRM_Utils_Array::value('credit_card_number', $params) && !CRM_Utils_Rule::creditCardNumber($params['credit_card_number'], $params['credit_card_type'])) { $errors['credit_card_number'] = ts("Please enter a valid Credit Card Number"); } if (CRM_Utils_Array::value('cvv2', $params) && !CRM_Utils_Rule::cvv($params['cvv2'], $params['credit_card_type'])) { $errors['cvv2'] = ts("Please enter a valid Credit Card Verification Number"); } } } $joinDate = NULL; if (CRM_Utils_Array::value('join_date', $params)) { $joinDate = CRM_Utils_Date::processDate($params['join_date']); foreach ($self->_memTypeSelected as $memType) { $startDate = NULL; if (CRM_Utils_Array::value('start_date', $params)) { $startDate = CRM_Utils_Date::processDate($params['start_date']); } // if end date is set, ensure that start date is also set // and that end date is later than start date // If selected membership type has duration unit as 'lifetime' // and end date is set, then give error $endDate = NULL; if (CRM_Utils_Array::value('end_date', $params)) { $endDate = CRM_Utils_Date::processDate($params['end_date']); } $membershipDetails = CRM_Member_BAO_MembershipType::getMembershipTypeDetails($memType); if ($startDate && CRM_Utils_Array::value('period_type', $membershipDetails) == 'rolling') { if ($startDate < $joinDate) { $errors['start_date'] = ts('Start date must be the same or later than Member since.'); } } if ($endDate) { if ($membershipDetails['duration_unit'] == 'lifetime') { $errors['end_date'] = ts('The selected Membership Type has a lifetime duration. You cannot specify an End Date for lifetime memberships. Please clear the End Date OR select a different Membership Type.'); } else { if (!$startDate) { $errors['start_date'] = ts('Start date must be set if end date is set.'); } if ($endDate < $startDate) { $errors['end_date'] = ts('End date must be the same or later than start date.'); } } } // Default values for start and end dates if not supplied // on the form $defaultDates = CRM_Member_BAO_MembershipType::getDatesForMembershipType($memType, $joinDate, $startDate, $endDate); if (!$startDate) { $startDate = CRM_Utils_Array::value('start_date', $defaultDates); } if (!$endDate) { $endDate = CRM_Utils_Array::value('end_date', $defaultDates); } //CRM-3724, check for availability of valid membership status. if (!CRM_Utils_Array::value('is_override', $params) && !isset($errors['_qf_default'])) { $calcStatus = CRM_Member_BAO_MembershipStatus::getMembershipStatusByDate($startDate, $endDate, $joinDate, 'today', TRUE); if (empty($calcStatus)) { $url = CRM_Utils_System::url('civicrm/admin/member/membershipStatus', 'reset=1&action=browse'); $errors['_qf_default'] = ts('There is no valid Membership Status available for selected membership dates.'); $status = ts('Oops, it looks like there is no valid membership status available for the given membership dates. You can <a href="%1">Configure Membership Status Rules</a>.', array(1 => $url)); if (!$self->_mode) { $status .= ' ' . ts('OR You can sign up by setting Status Override? to true.'); } CRM_Core_Session::setStatus($status); } } } } else { $errors['join_date'] = ts('Please enter the Member Since.'); } if (isset($params['is_override']) && $params['is_override'] && !CRM_Utils_Array::value('status_id', $params)) { $errors['status_id'] = ts('Please enter the status.'); } //total amount condition arise when membership type having no //minimum fee if (isset($params['record_contribution'])) { if (!$params['contribution_type_id']) { $errors['contribution_type_id'] = ts('Please enter the contribution Type.'); } if (CRM_Utils_System::isNull($params['total_amount'])) { $errors['total_amount'] = ts('Please enter the contribution.'); } } // validate contribution status for 'Failed'. if ($self->_onlinePendingContributionId && CRM_Utils_Array::value('record_contribution', $params) && CRM_Utils_Array::value('contribution_status_id', $params) == array_search('Failed', CRM_Contribute_PseudoConstant::contributionStatus(NULL, 'name'))) { $errors['contribution_status_id'] = ts("Please select a valid payment status before updating."); } return empty($errors) ? TRUE : $errors; }