* @access public
*/
function import($onDuplicate, &$values) {
-
+ try{
// first make sure this is a valid line
$response = $this->summary($values);
if ($response != CRM_Import_Parser::VALID) {
// don't add to recent items, CRM-4399
$formatted['skipRecentView'] = TRUE;
-
+ $dateLabels = array(
+ 'join_date' => ts('Member Since'),
+ 'membership_start_date' => ts('Start Date'),
+ 'membership_end_date' => ts('End Date'),
+ );
foreach ($params as $key => $val) {
if ($val) {
switch ($key) {
case 'join_date':
- if (CRM_Utils_Date::convertToDefaultDate($params, $dateType, $key)) {
- if (!CRM_Utils_Rule::date($params[$key])) {
- CRM_Contact_Import_Parser_Contact::addToErrorMsg('Member Since', $errorMessage);
- }
- }
- else {
- CRM_Contact_Import_Parser_Contact::addToErrorMsg('Member Since', $errorMessage);
- }
- break;
-
case 'membership_start_date':
- if (CRM_Utils_Date::convertToDefaultDate($params, $dateType, $key)) {
- if (!CRM_Utils_Rule::date($params[$key])) {
- CRM_Contact_Import_Parser_Contact::addToErrorMsg('Start Date', $errorMessage);
- }
- }
- else {
- CRM_Contact_Import_Parser_Contact::addToErrorMsg('Start Date', $errorMessage);
- }
- break;
-
case 'membership_end_date':
if (CRM_Utils_Date::convertToDefaultDate($params, $dateType, $key)) {
if (!CRM_Utils_Rule::date($params[$key])) {
- CRM_Contact_Import_Parser_Contact::addToErrorMsg('End Date', $errorMessage);
+ CRM_Contact_Import_Parser_Contact::addToErrorMsg($dateLabels[$key], $errorMessage);
}
}
else {
- CRM_Contact_Import_Parser_Contact::addToErrorMsg('End Date', $errorMessage);
+ CRM_Contact_Import_Parser_Contact::addToErrorMsg($dateLabels[$key], $errorMessage);
}
break;
$formatValues[$key] = $field;
}
- require_once 'CRM/Utils/DeprecatedUtils.php';
- //TODO calling API function directly is unsupported.
- $formatError = _civicrm_api3_deprecated_membership_format_params($formatValues, $formatted, TRUE);
- if ($formatError) {
- array_unshift($values, $formatError['error_message']);
- return CRM_Import_Parser::ERROR;
- }
+ //format params to meet api v2 requirements.
+ //@todo find a way to test removing this formatting
+ $formatError = $this->membership_format_params($formatValues, $formatted, TRUE);
if ($onDuplicate != CRM_Import_Parser::DUPLICATE_UPDATE) {
$formatted['custom'] = CRM_Core_BAO_CustomField::postProcess($formatted,
}
}
- $formatted['version'] = 3;
- $newMembership = civicrm_api('membership', 'create', $formatted);
- if (civicrm_error($newMembership)) {
- array_unshift($values, $newMembership['error_message']);
- return CRM_Import_Parser::ERROR;
- }
+ $newMembership = civicrm_api3('membership', 'create', $formatted);
$this->_newMemberships[] = $newMembership['id'];
return CRM_Import_Parser::VALID;
}
}
- $formatted['version'] = 3;
- $newMembership = civicrm_api('membership', 'create', $formatted);
- if (civicrm_error($newMembership)) {
- array_unshift($values, $newMembership['error_message']);
- return CRM_Import_Parser::ERROR;
- }
+ $newMembership = civicrm_api3('membership', 'create', $formatted);
$this->_newMemberships[] = $newMembership['id'];
return CRM_Import_Parser::VALID;
}
+ }
+ catch (Exception $e) {
+ array_unshift($values, $e->getMessage());
+ return CRM_Import_Parser::ERROR;
+ }
}
/**
}
}
}
+ /**
+ * @deprecated - this function formats params according to v2 standards but
+ * need to be sure about the impact of not calling it so retaining on the import class
+ * take the input parameter list as specified in the data model and
+ * convert it into the same format that we use in QF and BAO object
+ *
+ * @param array $params Associative array of property name/value
+ * pairs to insert in new contact.
+ * @param array $values The reformatted properties that we can use internally
+ *
+ * @param array $create Is the formatted Values array going to
+ * be used for CRM_Member_BAO_Membership:create()
+ *
+ * @return array|error
+ * @access public
+ */
+ function membership_format_params($params, &$values, $create = FALSE) {
+ require_once 'api/v3/utils.php';
+ $fields = CRM_Member_DAO_Membership::fields();
+ _civicrm_api3_store_values($fields, $params, $values);
+
+ $customFields = CRM_Core_BAO_CustomField::getFields( 'Membership');
+
+ foreach ($params as $key => $value) {
+ // ignore empty values or empty arrays etc
+ if (CRM_Utils_System::isNull($value)) {
+ continue;
+ }
+
+ //Handling Custom Data
+ if ($customFieldID = CRM_Core_BAO_CustomField::getKeyID($key)) {
+ $values[$key] = $value;
+ $type = $customFields[$customFieldID]['html_type'];
+ if( $type == 'CheckBox' || $type == 'Multi-Select' || $type == 'AdvMulti-Select') {
+ $mulValues = explode( ',' , $value );
+ $customOption = CRM_Core_BAO_CustomOption::getCustomOption($customFieldID, true);
+ $values[$key] = array();
+ foreach( $mulValues as $v1 ) {
+ foreach($customOption as $customValueID => $customLabel) {
+ $customValue = $customLabel['value'];
+ if (( strtolower($customLabel['label']) == strtolower(trim($v1)) ) ||
+ ( strtolower($customValue) == strtolower(trim($v1)) )) {
+ if ( $type == 'CheckBox' ) {
+ $values[$key][$customValue] = 1;
+ } else {
+ $values[$key][] = $customValue;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ switch ($key) {
+ case 'membership_contact_id':
+ if (!CRM_Utils_Rule::integer($value)) {
+ throw new Exception("contact_id not valid: $value");
+ }
+ $dao = new CRM_Core_DAO();
+ $qParams = array();
+ $svq = $dao->singleValueQuery("SELECT id FROM civicrm_contact WHERE id = $value",
+ $qParams
+ );
+ if (!$svq) {
+ throw new Exception("Invalid Contact ID: There is no contact record with contact_id = $value.");
+ }
+ $values['contact_id'] = $values['membership_contact_id'];
+ unset($values['membership_contact_id']);
+ break;
+
+ case 'membership_type_id':
+ if (!CRM_Utils_Array::value($value, CRM_Member_PseudoConstant::membershipType())) {
+ throw new Exception('Invalid Membership Type Id');
+ }
+ $values[$key] = $value;
+ break;
+
+ case 'membership_type':
+ $membershipTypeId = CRM_Utils_Array::key(ucfirst($value),
+ CRM_Member_PseudoConstant::membershipType()
+ );
+ if ($membershipTypeId) {
+ if (CRM_Utils_Array::value('membership_type_id', $values) &&
+ $membershipTypeId != $values['membership_type_id']
+ ) {
+ throw new Exception('Mismatched membership Type and Membership Type Id');
+ }
+ }
+ else {
+ throw new Exception('Invalid Membership Type');
+ }
+ $values['membership_type_id'] = $membershipTypeId;
+ break;
+
+ case 'status_id':
+ if (!CRM_Utils_Array::value($value, CRM_Member_PseudoConstant::membershipStatus())) {
+ throw new Exception('Invalid Membership Status Id');
+ }
+ $values[$key] = $value;
+ break;
+
+ case 'membership_status':
+ $membershipStatusId = CRM_Utils_Array::key(ucfirst($value),
+ CRM_Member_PseudoConstant::membershipStatus()
+ );
+ if ($membershipStatusId) {
+ if (CRM_Utils_Array::value('status_id', $values) &&
+ $membershipStatusId != $values['status_id']
+ ) {
+ throw new Exception('Mismatched membership Status and Membership Status Id');
+ }
+ }
+ else {
+ throw new Exception('Invalid Membership Status');
+ }
+ $values['status_id'] = $membershipStatusId;
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ _civicrm_api3_custom_format_params($params, $values, 'Membership');
+
+
+ if ($create) {
+ // CRM_Member_BAO_Membership::create() handles membership_start_date,
+ // membership_end_date and membership_source. So, if $values contains
+ // membership_start_date, membership_end_date or membership_source,
+ // convert it to start_date, end_date or source
+ $changes = array(
+ 'membership_start_date' => 'start_date',
+ 'membership_end_date' => 'end_date',
+ 'membership_source' => 'source',
+ );
+
+ foreach ($changes as $orgVal => $changeVal) {
+ if (isset($values[$orgVal])) {
+ $values[$changeVal] = $values[$orgVal];
+ unset($values[$orgVal]);
+ }
+ }
+ }
+
+ return NULL;
+ }
}