protected $masterAddressID;
public function tearDown() {
- $this->quickCleanup(['civicrm_contact', 'civicrm_email', 'civicrm_address']);
+ $this->quickCleanup(['civicrm_contact', 'civicrm_email', 'civicrm_address', 'civicrm_relationship']);
$this->quickCleanUpFinancialEntities();
parent::tearDown();
}
* Basic test to ensure the exportComponents function completes without error.
*/
public function testExportComponentsNull() {
- list($tableName, $sqlColumns) = CRM_Export_BAO_Export::exportComponents(
+ list($tableName) = CRM_Export_BAO_Export::exportComponents(
TRUE,
array(),
array(),
'trxn_id' => 1,
'contribution_id' => 1,
);
- $phoneTypes = CRM_Core_PseudoConstant::get('CRM_Core_DAO_Phone', 'phone_type_id');
- $imProviders = CRM_Core_PseudoConstant::get('CRM_Core_DAO_IM', 'provider_id');
+
$contactRelationshipTypes = CRM_Contact_BAO_Relationship::getContactRelationshipType(
NULL,
NULL,
$pattern = '/as `?([^`,]*)/';
$queryFieldAliases = array();
preg_match_all($pattern, $select, $queryFieldAliases, PREG_PATTERN_ORDER);
+ $processor = new CRM_Export_BAO_ExportProcessor(CRM_Contact_BAO_Query::MODE_CONTRIBUTE, 'AND');
+ $processor->setQueryFields($query->_fields);
- list($outputFields) = CRM_Export_BAO_Export::getExportStructureArrays($returnProperties, $query, $phoneTypes, $imProviders, $contactRelationshipTypes, '', array());
+ list($outputFields) = CRM_Export_BAO_Export::getExportStructureArrays($returnProperties, $processor, $contactRelationshipTypes, '');
foreach (array_keys($outputFields) as $fieldAlias) {
if ($fieldAlias == 'Home-country') {
$this->assertTrue(in_array($fieldAlias . '_id', $queryFieldAliases[1]), 'Country is subject to some funky translate so we make sure country id is present');
$this->assertEquals('Big campaign,', CRM_Core_DAO::singleValueQuery("SELECT GROUP_CONCAT(contribution_campaign_title) FROM {$tableName}"));
}
+ /**
+ * Test exporting relationships.
+ *
+ * This is to ensure that CRM-13995 remains fixed.
+ */
+ public function testExportRelationshipsMergeToHousehold() {
+ list($householdID, $houseHoldTypeID) = $this->setUpHousehold();
+
+ $selectedFields = [
+ ['Individual', $houseHoldTypeID . '_a_b', 'state_province', ''],
+ ['Individual', $houseHoldTypeID . '_a_b', 'city', ''],
+ ['Individual', 'city', ''],
+ ['Individual', 'state_province', ''],
+ ];
+ list($tableName) = CRM_Export_BAO_Export::exportComponents(
+ FALSE,
+ $this->contactIDs,
+ [],
+ NULL,
+ $selectedFields,
+ NULL,
+ CRM_Export_Form_Select::CONTACT_EXPORT,
+ "contact_a.id IN (" . implode(",", $this->contactIDs) . ")",
+ NULL,
+ FALSE,
+ TRUE,
+ [
+ 'exportOption' => CRM_Export_Form_Select::CONTACT_EXPORT,
+ 'suppress_csv_for_testing' => TRUE,
+ ]
+ );
+ $dao = CRM_Core_DAO::executeQuery("SELECT * FROM {$tableName}");
+ while ($dao->fetch()) {
+ $this->assertEquals('Portland', $dao->city);
+ $this->assertEquals('ME', $dao->state_province);
+ $this->assertEquals($householdID, $dao->civicrm_primary_id);
+ $this->assertEquals($householdID, $dao->civicrm_primary_id);
+ }
+
+ }
+
+ /**
+ * Test exporting relationships.
+ */
+ public function testExportRelationshipsMergeToHouseholdAllFields() {
+ $this->markTestIncomplete('Does not yet work under CI due to mysql limitation (number of columns in table). Works on some boxes');
+ list($householdID) = $this->setUpHousehold();
+ list($tableName) = CRM_Export_BAO_Export::exportComponents(
+ FALSE,
+ $this->contactIDs,
+ [],
+ NULL,
+ NULL,
+ NULL,
+ CRM_Export_Form_Select::CONTACT_EXPORT,
+ "contact_a.id IN (" . implode(",", $this->contactIDs) . ")",
+ NULL,
+ FALSE,
+ TRUE,
+ [
+ 'exportOption' => CRM_Export_Form_Select::CONTACT_EXPORT,
+ 'suppress_csv_for_testing' => TRUE,
+ ]
+ );
+ $dao = CRM_Core_DAO::executeQuery("SELECT * FROM {$tableName}");
+ while ($dao->fetch()) {
+ $this->assertEquals('Portland', $dao->city);
+ $this->assertEquals('ME', $dao->state_province);
+ $this->assertEquals($householdID, $dao->civicrm_primary_id);
+ $this->assertEquals($householdID, $dao->civicrm_primary_id);
+ $this->assertEquals('Unit Test Household', $dao->addressee);
+ $this->assertEquals('Unit Test Household', $dao->display_name);
+ }
+ }
+
+ /**
+ * Test master_address_id field.
+ */
+ public function testExportCustomData() {
+ $this->setUpContactExportData();
+
+ $customData = $this->entityCustomGroupWithSingleFieldCreate(__FUNCTION__, 'ContactTest.php');
+
+ $this->callAPISuccess('Contact', 'create', [
+ 'id' => $this->contactIDs[1],
+ 'custom_' . $customData['custom_field_id'] => 'BlahdeBlah',
+ 'api.Address.create' => ['location_type_id' => 'Billing', 'city' => 'Waipu'],
+ ]);
+ $selectedFields = [
+ ['Individual', 'city', CRM_Core_PseudoConstant::getKey('CRM_Core_BAO_Address', 'location_type_id', 'Billing')],
+ ['Individual', 'custom_1'],
+ ];
+
+ list($tableName, $sqlColumns) = $this->doExport($selectedFields, $this->contactIDs[1]);
+ $this->assertEquals([
+ 'billing_city' => 'billing_city text',
+ 'custom_1' => 'custom_1 varchar(255)',
+ ], $sqlColumns);
+
+ $dao = CRM_Core_DAO::executeQuery('SELECT * FROM ' . $tableName);
+ while ($dao->fetch()) {
+ $this->assertEquals('BlahdeBlah', $dao->custom_1);
+ $this->assertEquals('Waipu', $dao->billing_city);
+ }
+ }
+
+ /**
+ * Attempt to do a fairly full export of location data.
+ */
+ public function testExportIMData() {
+ // Use default providers.
+ $providers = ['AIM', 'GTalk', 'Jabber', 'MSN', 'Skype', 'Yahoo'];
+ $locationTypes = ['Billing', 'Home', 'Main', 'Other'];
+
+ $this->contactIDs[] = $this->individualCreate();
+ $this->contactIDs[] = $this->individualCreate();
+ $this->contactIDs[] = $this->householdCreate();
+ $this->contactIDs[] = $this->organizationCreate();
+ foreach ($this->contactIDs as $contactID) {
+ foreach ($providers as $provider) {
+ foreach ($locationTypes as $locationType) {
+ $this->callAPISuccess('IM', 'create', [
+ 'contact_id' => $contactID,
+ 'location_type_id' => $locationType,
+ 'provider_id' => $provider,
+ 'name' => $locationType . $provider . $contactID,
+ ]);
+ }
+ }
+ }
+
+ $relationships = [
+ $this->contactIDs[1] => ['label' => 'Spouse of'],
+ $this->contactIDs[2] => ['label' => 'Household Member of'],
+ $this->contactIDs[3] => ['label' => 'Employee of']
+ ];
+
+ foreach ($relationships as $contactID => $relationshipType) {
+ $relationshipTypeID = $this->callAPISuccess('RelationshipType', 'getvalue', ['label_a_b' => $relationshipType['label'], 'return' => 'id']);
+ $result = $this->callAPISuccess('Relationship', 'create', [
+ 'contact_id_a' => $this->contactIDs[0],
+ 'relationship_type_id' => $relationshipTypeID,
+ 'contact_id_b' => $contactID
+ ]);
+ $relationships[$contactID]['id'] = $result['id'];
+ $relationships[$contactID]['relationship_type_id'] = $relationshipTypeID;
+ }
+
+ $fields = [['Individual', 'contact_id']];
+ // ' ' denotes primary location type.
+ foreach (array_merge($locationTypes, [' ']) as $locationType) {
+ $fields[] = [
+ 'Individual',
+ 'im_provider',
+ CRM_Core_PseudoConstant::getKey('CRM_Core_BAO_IM', 'location_type_id', $locationType),
+ ];
+ foreach ($relationships as $contactID => $relationship) {
+ $fields[] = [
+ 'Individual',
+ $relationship['relationship_type_id'] . '_a_b',
+ 'im_provider',
+ CRM_Core_PseudoConstant::getKey('CRM_Core_BAO_IM', 'location_type_id', $locationType),
+ ];
+ }
+ foreach ($providers as $provider) {
+ $fields[] = [
+ 'Individual',
+ 'im',
+ CRM_Core_PseudoConstant::getKey('CRM_Core_BAO_IM', 'location_type_id', $locationType),
+ CRM_Core_PseudoConstant::getKey('CRM_Core_BAO_IM', 'provider_id', $provider),
+ ];
+ foreach ($relationships as $contactID => $relationship) {
+ $fields[] = [
+ 'Individual',
+ $relationship['relationship_type_id'] . '_a_b',
+ 'im',
+ CRM_Core_PseudoConstant::getKey('CRM_Core_BAO_IM', 'location_type_id', $locationType),
+ CRM_Core_PseudoConstant::getKey('CRM_Core_BAO_IM', 'provider_id', $provider),
+ ];
+ }
+ }
+ }
+ list($tableName, $sqlColumns) = $this->doExport($fields, $this->contactIDs[0]);
+
+ $dao = CRM_Core_DAO::executeQuery('SELECT * FROM ' . $tableName);
+ while ($dao->fetch()) {
+ $id = $dao->contact_id;
+ $this->assertEquals('AIM', $dao->billing_im_provider);
+ $this->assertEquals('BillingJabber' . $id, $dao->billing_im_screen_name_jabber);
+ $this->assertEquals('BillingSkype' . $id, $dao->billing_im_screen_name_skype);
+ foreach ($relationships as $relatedContactID => $relationship) {
+ $relationshipString = $field = $relationship['relationship_type_id'] . '_a_b';
+ $field = $relationshipString . '_billing_im_screen_name_yahoo';
+ $this->assertEquals('BillingYahoo' . $relatedContactID, $dao->$field);
+ // @todo efforts to output 'im_provider' for related contacts seem to be giving a blank field.
+ }
+ }
+
+ // early return for now until we solve a leakage issue.
+ return;
+
+ $this->assertEquals([
+ 'billing_im_provider' => 'billing_im_provider text',
+ 'billing_im_screen_name' => 'billing_im_screen_name text',
+ 'billing_im_screen_name_jabber' => 'billing_im_screen_name_jabber text',
+ 'billing_im_screen_name_skype' => 'billing_im_screen_name_skype text',
+ 'billing_im_screen_name_yahoo' => 'billing_im_screen_name_yahoo text',
+ 'home_im_provider' => 'home_im_provider text',
+ 'home_im_screen_name' => 'home_im_screen_name text',
+ 'home_im_screen_name_jabber' => 'home_im_screen_name_jabber text',
+ 'home_im_screen_name_skype' => 'home_im_screen_name_skype text',
+ 'home_im_screen_name_yahoo' => 'home_im_screen_name_yahoo text',
+ 'main_im_provider' => 'main_im_provider text',
+ 'main_im_screen_name' => 'main_im_screen_name text',
+ 'main_im_screen_name_jabber' => 'main_im_screen_name_jabber text',
+ 'main_im_screen_name_skype' => 'main_im_screen_name_skype text',
+ 'main_im_screen_name_yahoo' => 'main_im_screen_name_yahoo text',
+ 'other_im_provider' => 'other_im_provider text',
+ 'other_im_screen_name' => 'other_im_screen_name text',
+ 'other_im_screen_name_jabber' => 'other_im_screen_name_jabber text',
+ 'other_im_screen_name_skype' => 'other_im_screen_name_skype text',
+ 'other_im_screen_name_yahoo' => 'other_im_screen_name_yahoo text',
+ 'im_provider' => 'im_provider text',
+ 'im' => 'im varchar(64)',
+ 'contact_id' => 'contact_id varchar(255)',
+ '2_a_b_im_provider' => '2_a_b_im_provider text',
+ '2_a_b_billing_im_screen_name' => '2_a_b_billing_im_screen_name text',
+ '2_a_b_billing_im_screen_name_jabber' => '2_a_b_billing_im_screen_name_jabber text',
+ '2_a_b_billing_im_screen_name_skype' => '2_a_b_billing_im_screen_name_skype text',
+ '2_a_b_billing_im_screen_name_yahoo' => '2_a_b_billing_im_screen_name_yahoo text',
+ '2_a_b_home_im_screen_name' => '2_a_b_home_im_screen_name text',
+ '2_a_b_home_im_screen_name_jabber' => '2_a_b_home_im_screen_name_jabber text',
+ '2_a_b_home_im_screen_name_skype' => '2_a_b_home_im_screen_name_skype text',
+ '2_a_b_home_im_screen_name_yahoo' => '2_a_b_home_im_screen_name_yahoo text',
+ '2_a_b_main_im_screen_name' => '2_a_b_main_im_screen_name text',
+ '2_a_b_main_im_screen_name_jabber' => '2_a_b_main_im_screen_name_jabber text',
+ '2_a_b_main_im_screen_name_skype' => '2_a_b_main_im_screen_name_skype text',
+ '2_a_b_main_im_screen_name_yahoo' => '2_a_b_main_im_screen_name_yahoo text',
+ '2_a_b_other_im_screen_name' => '2_a_b_other_im_screen_name text',
+ '2_a_b_other_im_screen_name_jabber' => '2_a_b_other_im_screen_name_jabber text',
+ '2_a_b_other_im_screen_name_skype' => '2_a_b_other_im_screen_name_skype text',
+ '2_a_b_other_im_screen_name_yahoo' => '2_a_b_other_im_screen_name_yahoo text',
+ '2_a_b_im' => '2_a_b_im text',
+ '8_a_b_im_provider' => '8_a_b_im_provider text',
+ '8_a_b_billing_im_screen_name' => '8_a_b_billing_im_screen_name text',
+ '8_a_b_billing_im_screen_name_jabber' => '8_a_b_billing_im_screen_name_jabber text',
+ '8_a_b_billing_im_screen_name_skype' => '8_a_b_billing_im_screen_name_skype text',
+ '8_a_b_billing_im_screen_name_yahoo' => '8_a_b_billing_im_screen_name_yahoo text',
+ '8_a_b_home_im_screen_name' => '8_a_b_home_im_screen_name text',
+ '8_a_b_home_im_screen_name_jabber' => '8_a_b_home_im_screen_name_jabber text',
+ '8_a_b_home_im_screen_name_skype' => '8_a_b_home_im_screen_name_skype text',
+ '8_a_b_home_im_screen_name_yahoo' => '8_a_b_home_im_screen_name_yahoo text',
+ '8_a_b_main_im_screen_name' => '8_a_b_main_im_screen_name text',
+ '8_a_b_main_im_screen_name_jabber' => '8_a_b_main_im_screen_name_jabber text',
+ '8_a_b_main_im_screen_name_skype' => '8_a_b_main_im_screen_name_skype text',
+ '8_a_b_main_im_screen_name_yahoo' => '8_a_b_main_im_screen_name_yahoo text',
+ '8_a_b_other_im_screen_name' => '8_a_b_other_im_screen_name text',
+ '8_a_b_other_im_screen_name_jabber' => '8_a_b_other_im_screen_name_jabber text',
+ '8_a_b_other_im_screen_name_skype' => '8_a_b_other_im_screen_name_skype text',
+ '8_a_b_other_im_screen_name_yahoo' => '8_a_b_other_im_screen_name_yahoo text',
+ '8_a_b_im' => '8_a_b_im text',
+ '5_a_b_im_provider' => '5_a_b_im_provider text',
+ '5_a_b_billing_im_screen_name' => '5_a_b_billing_im_screen_name text',
+ '5_a_b_billing_im_screen_name_jabber' => '5_a_b_billing_im_screen_name_jabber text',
+ '5_a_b_billing_im_screen_name_skype' => '5_a_b_billing_im_screen_name_skype text',
+ '5_a_b_billing_im_screen_name_yahoo' => '5_a_b_billing_im_screen_name_yahoo text',
+ '5_a_b_home_im_screen_name' => '5_a_b_home_im_screen_name text',
+ '5_a_b_home_im_screen_name_jabber' => '5_a_b_home_im_screen_name_jabber text',
+ '5_a_b_home_im_screen_name_skype' => '5_a_b_home_im_screen_name_skype text',
+ '5_a_b_home_im_screen_name_yahoo' => '5_a_b_home_im_screen_name_yahoo text',
+ '5_a_b_main_im_screen_name' => '5_a_b_main_im_screen_name text',
+ '5_a_b_main_im_screen_name_jabber' => '5_a_b_main_im_screen_name_jabber text',
+ '5_a_b_main_im_screen_name_skype' => '5_a_b_main_im_screen_name_skype text',
+ '5_a_b_main_im_screen_name_yahoo' => '5_a_b_main_im_screen_name_yahoo text',
+ '5_a_b_other_im_screen_name' => '5_a_b_other_im_screen_name text',
+ '5_a_b_other_im_screen_name_jabber' => '5_a_b_other_im_screen_name_jabber text',
+ '5_a_b_other_im_screen_name_skype' => '5_a_b_other_im_screen_name_skype text',
+ '5_a_b_other_im_screen_name_yahoo' => '5_a_b_other_im_screen_name_yahoo text',
+ '5_a_b_im' => '5_a_b_im text',
+ ], $sqlColumns);
+
+ }
+
/**
* Test master_address_id field.
*/
));
//create address for contact A
- $result = $this->callAPISuccess('address', 'create', array(
+ $this->callAPISuccess('address', 'create', array(
'contact_id' => $contactA['id'],
'location_type_id' => 'Home',
'street_address' => 'ABC 12',
));
//create address for contact B
- $result = $this->callAPISuccess('address', 'create', array(
+ $this->callAPISuccess('address', 'create', array(
'contact_id' => $contactB['id'],
'location_type_id' => 'Home',
'street_address' => 'ABC 12',
CRM_Core_DAO::executeQuery($sql);
}
+ /**
+ * @return array
+ */
+ protected function setUpHousehold() {
+ $this->setUpContactExportData();
+ $householdID = $this->householdCreate([
+ 'api.Address.create' => [
+ 'city' => 'Portland',
+ 'state_province_id' => 'Maine',
+ 'location_type_id' => 'Home'
+ ]
+ ]);
+
+ $relationshipTypes = $this->callAPISuccess('RelationshipType', 'get', [])['values'];
+ $houseHoldTypeID = NULL;
+ foreach ($relationshipTypes as $id => $relationshipType) {
+ if ($relationshipType['name_a_b'] === 'Household Member of') {
+ $houseHoldTypeID = $relationshipType['id'];
+ }
+ }
+ $this->callAPISuccess('Relationship', 'create', [
+ 'contact_id_a' => $this->contactIDs[0],
+ 'contact_id_b' => $householdID,
+ 'relationship_type_id' => $houseHoldTypeID,
+ ]);
+ $this->callAPISuccess('Relationship', 'create', [
+ 'contact_id_a' => $this->contactIDs[1],
+ 'contact_id_b' => $householdID,
+ 'relationship_type_id' => $houseHoldTypeID,
+ ]);
+ return array($householdID, $houseHoldTypeID);
+ }
+
+ /**
+ * @param $selectedFields
+ * @return array
+ */
+ protected function doExport($selectedFields, $id) {
+ list($tableName, $sqlColumns) = CRM_Export_BAO_Export::exportComponents(
+ TRUE,
+ array($id),
+ array(),
+ NULL,
+ $selectedFields,
+ NULL,
+ CRM_Export_Form_Select::CONTACT_EXPORT,
+ "contact_a.id IN ({$id})",
+ NULL,
+ FALSE,
+ FALSE,
+ array(
+ 'exportOption' => CRM_Export_Form_Select::CONTACT_EXPORT,
+ 'suppress_csv_for_testing' => TRUE,
+ )
+ );
+ return array($tableName, $sqlColumns);
+ }
+
}