X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;ds=sidebyside;f=tests%2Fphpunit%2FCRM%2FExport%2FBAO%2FExportTest.php;h=1a0418413a47ef52980850525be449fada2602d5;hb=fac55f2eb2d1a650d22900723b20db607a49a5f8;hp=6ff501f82ac23af5de3f01cacfad904853d578a3;hpb=1c5bc02c1bbfc3cbbee279e61b488787a4c41daf;p=civicrm-core.git diff --git a/tests/phpunit/CRM/Export/BAO/ExportTest.php b/tests/phpunit/CRM/Export/BAO/ExportTest.php index 6ff501f82a..1a0418413a 100644 --- a/tests/phpunit/CRM/Export/BAO/ExportTest.php +++ b/tests/phpunit/CRM/Export/BAO/ExportTest.php @@ -27,6 +27,14 @@ class CRM_Export_BAO_ExportTest extends CiviUnitTestCase { */ protected $activityIDs = []; + + /** + * Contribution IDs created for testing. + * + * @var array + */ + protected $membershipIDs = []; + /** * Master Address ID created for testing. * @@ -35,7 +43,16 @@ class CRM_Export_BAO_ExportTest extends CiviUnitTestCase { protected $masterAddressID; public function tearDown() { - $this->quickCleanup(['civicrm_contact', 'civicrm_email', 'civicrm_address']); + $this->quickCleanup([ + 'civicrm_contact', + 'civicrm_email', + 'civicrm_address', + 'civicrm_relationship', + 'civicrm_membership', + 'civicrm_case', + 'civicrm_case_contact', + 'civicrm_case_activity', + ]); $this->quickCleanUpFinancialEntities(); parent::tearDown(); } @@ -44,7 +61,7 @@ class CRM_Export_BAO_ExportTest extends CiviUnitTestCase { * 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(), @@ -84,7 +101,7 @@ class CRM_Export_BAO_ExportTest extends CiviUnitTestCase { array('Contribution', 'trxn_id'), ); - list($tableName, $sqlColumns) = CRM_Export_BAO_Export::exportComponents( + list($tableName) = CRM_Export_BAO_Export::exportComponents( TRUE, $this->contributionIDs, array(), @@ -192,8 +209,10 @@ class CRM_Export_BAO_ExportTest extends CiviUnitTestCase { $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, NULL, 'AND'); + $processor->setQueryFields($query->_fields); - list($outputFields) = CRM_Export_BAO_Export::getExportStructureArrays($returnProperties, $query, $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'); @@ -214,6 +233,32 @@ class CRM_Export_BAO_ExportTest extends CiviUnitTestCase { $this->contributionIDs[] = $this->contributionCreate(array('contact_id' => $this->contactIDs[1], 'trxn_id' => 'null', 'invoice_id' => 'null')); } + /** + * Set up some data for us to do testing on. + */ + public function setUpMembershipExportData() { + $this->setUpContactExportData(); + $this->membershipIDs[] = $this->contactMembershipCreate(['contact_id' => $this->contactIDs[0]]); + } + + /** + * Set up data to test case export. + */ + public function setupCaseExportData() { + $contactID1 = $this->individualCreate(); + $contactID2 = $this->individualCreate(array(), 1); + + $case = $this->callAPISuccess('case', 'create', array( + 'case_type_id' => 1, + 'subject' => 'blah', + 'contact_id' => $contactID1, + )); + $this->callAPISuccess('CaseContact', 'create', [ + 'case_id' => $case['id'], + 'contact_id' => $contactID2, + ]); + } + /** * Set up some data for us to do testing on. */ @@ -374,26 +419,7 @@ class CRM_Export_BAO_ExportTest extends CiviUnitTestCase { * This is to ensure that CRM-13995 remains fixed. */ public function testExportRelationshipsMergeToHousehold() { - $this->setUpContactExportData(); - $householdID = $this->householdCreate(['city' => 'Portland', 'state_province_id' => 'Oregan']); - - $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, - ]); + list($householdID, $houseHoldTypeID) = $this->setUpHousehold(); $selectedFields = [ ['Individual', $houseHoldTypeID . '_a_b', 'state_province', ''], @@ -420,11 +446,251 @@ class CRM_Export_BAO_ExportTest extends CiviUnitTestCase { ); $dao = CRM_Core_DAO::executeQuery("SELECT * FROM {$tableName}"); while ($dao->fetch()) { - // Do some checks here - // $this->assertEquals('Portland', $dao->city); - // $this->assertEquals('Oregan', $dao0>state_province); + $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. + } } + $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); + } /** @@ -484,7 +750,7 @@ class CRM_Export_BAO_ExportTest extends CiviUnitTestCase { )); //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', @@ -495,7 +761,7 @@ class CRM_Export_BAO_ExportTest extends CiviUnitTestCase { )); //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', @@ -506,7 +772,7 @@ class CRM_Export_BAO_ExportTest extends CiviUnitTestCase { )); //export and merge contacts with same address - list($tableName, $sqlColumns) = CRM_Export_BAO_Export::exportComponents( + list($tableName) = CRM_Export_BAO_Export::exportComponents( TRUE, array($contactA['id'], $contactB['id']), array(), @@ -538,4 +804,995 @@ class CRM_Export_BAO_ExportTest extends CiviUnitTestCase { 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); + } + + /** + * Do a CiviCRM export. + * + * @param $selectedFields + * @param int $id + * + * @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); + } + + /** + * Ensure component is enabled. + * + * @param int $exportMode + */ + public function ensureComponentIsEnabled($exportMode) { + if ($exportMode === CRM_Export_Form_Select::CASE_EXPORT) { + CRM_Core_BAO_ConfigSetting::enableComponent('CiviCase'); + } + } + + /** + * Test our export all field metadata retrieval. + * + * @dataProvider additionalFieldsDataProvider + * @param int $exportMode + * @param $expected + */ + public function testAdditionalReturnProperties($exportMode, $expected) { + $this->ensureComponentIsEnabled($exportMode); + $processor = new CRM_Export_BAO_ExportProcessor($exportMode, NULL, 'AND'); + $metadata = $processor->getAdditionalReturnProperties(); + $this->assertEquals($expected, $metadata); + } + + /** + * Test our export all field metadata retrieval. + * + * @dataProvider allFieldsDataProvider + * @param int $exportMode + * @param $expected + */ + public function testDefaultReturnProperties($exportMode, $expected) { + $this->ensureComponentIsEnabled($exportMode); + $processor = new CRM_Export_BAO_ExportProcessor($exportMode, NULL, 'AND'); + $metadata = $processor->getDefaultReturnProperties(); + $this->assertEquals($expected, $metadata); + } + + /** + * Get fields returned from additionalFields function. + * + * @return array + */ + public function additionalFieldsDataProvider() { + return [ + [ + 'anything that will then be defaulting ton contact', + $this->getExtraReturnProperties(), + ], + [ + CRM_Export_Form_Select::ACTIVITY_EXPORT, + array_merge($this->getExtraReturnProperties(), $this->getActivityReturnProperties()), + ], + [ + CRM_Export_Form_Select::CASE_EXPORT, + array_merge($this->getExtraReturnProperties(), $this->getCaseReturnProperties()), + ], + [ + CRM_Export_Form_Select::CONTRIBUTE_EXPORT, + array_merge($this->getExtraReturnProperties(), $this->getContributionReturnProperties()), + ], + [ + CRM_Export_Form_Select::EVENT_EXPORT, + array_merge($this->getExtraReturnProperties(), $this->getEventReturnProperties()), + ], + [ + CRM_Export_Form_Select::MEMBER_EXPORT, + array_merge($this->getExtraReturnProperties(), $this->getMembershipReturnProperties()), + ], + [ + CRM_Export_Form_Select::PLEDGE_EXPORT, + array_merge($this->getExtraReturnProperties(), $this->getPledgeReturnProperties()), + ], + + ]; + } + + /** + * get data for testing field metadata by query mode. + */ + public function allFieldsDataProvider() { + return [ + [ + 'anything that will then be defaulting ton contact', + $this->getBasicReturnProperties(TRUE), + ], + [ + CRM_Export_Form_Select::ACTIVITY_EXPORT, + array_merge($this->getBasicReturnProperties(FALSE), $this->getActivityReturnProperties()), + ], + [ + CRM_Export_Form_Select::CASE_EXPORT, + array_merge($this->getBasicReturnProperties(FALSE), $this->getCaseReturnProperties()), + ], + [ + CRM_Export_Form_Select::CONTRIBUTE_EXPORT, + array_merge($this->getBasicReturnProperties(FALSE), $this->getContributionReturnProperties()), + ], + [ + CRM_Export_Form_Select::EVENT_EXPORT, + array_merge($this->getBasicReturnProperties(FALSE), $this->getEventReturnProperties()), + ], + [ + CRM_Export_Form_Select::MEMBER_EXPORT, + array_merge($this->getBasicReturnProperties(FALSE), $this->getMembershipReturnProperties()), + ], + [ + CRM_Export_Form_Select::PLEDGE_EXPORT, + array_merge($this->getBasicReturnProperties(FALSE), $this->getPledgeReturnProperties()), + ], + ]; + } + + /** + * Get return properties manually added in. + */ + public function getExtraReturnProperties() { + return [ + 'location_type' => 1, + 'im_provider' => 1, + 'phone_type_id' => 1, + 'provider_id' => 1, + 'current_employer' => 1, + ]; + } + + /** + * Get basic return properties. + * + * @param bool $isContactMode + * Are we in contact mode or not + * + * @return array + */ + protected function getBasicReturnProperties($isContactMode) { + $returnProperties = [ + 'id' => 1, + 'contact_type' => 1, + 'contact_sub_type' => 1, + 'do_not_email' => 1, + 'do_not_phone' => 1, + 'do_not_mail' => 1, + 'do_not_sms' => 1, + 'do_not_trade' => 1, + 'is_opt_out' => 1, + 'legal_identifier' => 1, + 'external_identifier' => 1, + 'sort_name' => 1, + 'display_name' => 1, + 'nick_name' => 1, + 'legal_name' => 1, + 'image_URL' => 1, + 'preferred_communication_method' => 1, + 'preferred_language' => 1, + 'preferred_mail_format' => 1, + 'hash' => 1, + 'contact_source' => 1, + 'first_name' => 1, + 'middle_name' => 1, + 'last_name' => 1, + 'prefix_id' => 1, + 'suffix_id' => 1, + 'formal_title' => 1, + 'communication_style_id' => 1, + 'email_greeting_id' => 1, + 'postal_greeting_id' => 1, + 'addressee_id' => 1, + 'job_title' => 1, + 'gender_id' => 1, + 'birth_date' => 1, + 'is_deceased' => 1, + 'deceased_date' => 1, + 'household_name' => 1, + 'organization_name' => 1, + 'sic_code' => 1, + 'user_unique_id' => 1, + 'current_employer_id' => 1, + 'contact_is_deleted' => 1, + 'created_date' => 1, + 'modified_date' => 1, + 'addressee' => 1, + 'email_greeting' => 1, + 'postal_greeting' => 1, + 'current_employer' => 1, + 'location_type' => 1, + 'street_address' => 1, + 'street_number' => 1, + 'street_number_suffix' => 1, + 'street_name' => 1, + 'street_unit' => 1, + 'supplemental_address_1' => 1, + 'supplemental_address_2' => 1, + 'supplemental_address_3' => 1, + 'city' => 1, + 'postal_code_suffix' => 1, + 'postal_code' => 1, + 'geo_code_1' => 1, + 'geo_code_2' => 1, + 'address_name' => 1, + 'master_id' => 1, + 'county' => 1, + 'state_province' => 1, + 'country' => 1, + 'phone' => 1, + 'phone_ext' => 1, + 'email' => 1, + 'on_hold' => 1, + 'is_bulkmail' => 1, + 'signature_text' => 1, + 'signature_html' => 1, + 'im_provider' => 1, + 'im' => 1, + 'openid' => 1, + 'world_region' => 1, + 'url' => 1, + 'groups' => 1, + 'tags' => 1, + 'notes' => 1, + 'phone_type_id' => 1, + 'provider_id' => 1, + ]; + if (!$isContactMode) { + unset($returnProperties['groups']); + unset($returnProperties['tags']); + unset($returnProperties['notes']); + } + return $returnProperties; + } + + /** + * Get return properties for pledges. + * + * @return array + */ + public function getPledgeReturnProperties() { + return [ + 'contact_type' => 1, + 'contact_sub_type' => 1, + 'sort_name' => 1, + 'display_name' => 1, + 'pledge_id' => 1, + 'pledge_amount' => 1, + 'pledge_total_paid' => 1, + 'pledge_create_date' => 1, + 'pledge_start_date' => 1, + 'pledge_next_pay_date' => 1, + 'pledge_next_pay_amount' => 1, + 'pledge_status' => 1, + 'pledge_is_test' => 1, + 'pledge_contribution_page_id' => 1, + 'pledge_financial_type' => 1, + 'pledge_frequency_interval' => 1, + 'pledge_frequency_unit' => 1, + 'pledge_currency' => 1, + 'pledge_campaign_id' => 1, + 'pledge_balance_amount' => 1, + 'pledge_payment_id' => 1, + 'pledge_payment_scheduled_amount' => 1, + 'pledge_payment_scheduled_date' => 1, + 'pledge_payment_paid_amount' => 1, + 'pledge_payment_paid_date' => 1, + 'pledge_payment_reminder_date' => 1, + 'pledge_payment_reminder_count' => 1, + 'pledge_payment_status' => 1, + ]; + } + + /** + * Get membership return properties. + * + * @return array + */ + public function getMembershipReturnProperties() { + return [ + 'location_type' => 1, + 'im_provider' => 1, + 'phone_type_id' => 1, + 'provider_id' => 1, + 'current_employer' => 1, + 'contact_type' => 1, + 'contact_sub_type' => 1, + 'sort_name' => 1, + 'display_name' => 1, + 'membership_type' => 1, + 'member_is_test' => 1, + 'member_is_pay_later' => 1, + 'join_date' => 1, + 'membership_start_date' => 1, + 'membership_end_date' => 1, + 'membership_source' => 1, + 'membership_status' => 1, + 'membership_id' => 1, + 'owner_membership_id' => 1, + 'max_related' => 1, + 'membership_recur_id' => 1, + 'member_campaign_id' => 1, + 'member_is_override' => 1, + 'member_auto_renew' => 1, + ]; + } + + /** + * Get return properties for events. + * + * @return array + */ + public function getEventReturnProperties() { + return [ + 'contact_type' => 1, + 'contact_sub_type' => 1, + 'sort_name' => 1, + 'display_name' => 1, + 'event_id' => 1, + 'event_title' => 1, + 'event_start_date' => 1, + 'event_end_date' => 1, + 'event_type' => 1, + 'participant_id' => 1, + 'participant_status' => 1, + 'participant_status_id' => 1, + 'participant_role' => 1, + 'participant_role_id' => 1, + 'participant_note' => 1, + 'participant_register_date' => 1, + 'participant_source' => 1, + 'participant_fee_level' => 1, + 'participant_is_test' => 1, + 'participant_is_pay_later' => 1, + 'participant_fee_amount' => 1, + 'participant_discount_name' => 1, + 'participant_fee_currency' => 1, + 'participant_registered_by_id' => 1, + 'participant_campaign_id' => 1, + ]; + } + + /** + * Get return properties for activities. + * + * @return array + */ + public function getActivityReturnProperties() { + return [ + 'activity_id' => 1, + 'contact_type' => 1, + 'contact_sub_type' => 1, + 'sort_name' => 1, + 'display_name' => 1, + 'activity_type' => 1, + 'activity_type_id' => 1, + 'activity_subject' => 1, + 'activity_date_time' => 1, + 'activity_duration' => 1, + 'activity_location' => 1, + 'activity_details' => 1, + 'activity_status' => 1, + 'activity_priority' => 1, + 'source_contact' => 1, + 'source_record_id' => 1, + 'activity_is_test' => 1, + 'activity_campaign_id' => 1, + 'result' => 1, + 'activity_engagement_level' => 1, + 'parent_id' => 1, + ]; + } + + /** + * Get return properties for Case. + * + * @return array + */ + public function getCaseReturnProperties() { + return [ + 'contact_type' => 1, + 'contact_sub_type' => 1, + 'sort_name' => 1, + 'display_name' => 1, + 'phone' => 1, + 'case_start_date' => 1, + 'case_end_date' => 1, + 'case_subject' => 1, + 'case_source_contact_id' => 1, + 'case_activity_status' => 1, + 'case_activity_duration' => 1, + 'case_activity_medium_id' => 1, + 'case_activity_details' => 1, + 'case_activity_is_auto' => 1, + 'contact_id' => 1, + 'case_id' => 1, + 'case_activity_subject' => 1, + 'case_status' => 1, + 'case_type' => 1, + 'case_role' => 1, + 'case_deleted' => 1, + 'case_recent_activity_date' => 1, + 'case_recent_activity_type' => 1, + 'case_scheduled_activity_date' => 1, + ]; + } + + /** + * Get return properties for contribution. + * + * @return array + */ + public function getContributionReturnProperties() { + return [ + 'contact_type' => 1, + 'contact_sub_type' => 1, + 'sort_name' => 1, + 'display_name' => 1, + 'financial_type' => 1, + 'contribution_source' => 1, + 'receive_date' => 1, + 'thankyou_date' => 1, + 'cancel_date' => 1, + 'total_amount' => 1, + 'accounting_code' => 1, + 'payment_instrument' => 1, + 'payment_instrument_id' => 1, + 'contribution_check_number' => 1, + 'non_deductible_amount' => 1, + 'fee_amount' => 1, + 'net_amount' => 1, + 'trxn_id' => 1, + 'invoice_id' => 1, + 'invoice_number' => 1, + 'currency' => 1, + 'cancel_reason' => 1, + 'receipt_date' => 1, + 'product_name' => 1, + 'sku' => 1, + 'product_option' => 1, + 'fulfilled_date' => 1, + 'contribution_start_date' => 1, + 'contribution_end_date' => 1, + 'is_test' => 1, + 'is_pay_later' => 1, + 'contribution_status' => 1, + 'contribution_recur_id' => 1, + 'amount_level' => 1, + 'contribution_note' => 1, + 'contribution_batch' => 1, + 'contribution_campaign_title' => 1, + 'contribution_campaign_id' => 1, + 'contribution_product_id' => 1, + 'contribution_soft_credit_name' => 1, + 'contribution_soft_credit_amount' => 1, + 'contribution_soft_credit_type' => 1, + 'contribution_soft_credit_contact_id' => 1, + 'contribution_soft_credit_contribution_id' => 1, + ]; + } + + /** + * Test the column definition when 'all' fields defined. + * + * @param $exportMode + * @param $expected + * + * @dataProvider getSqlColumnsOutput + */ + public function testGetSQLColumns($exportMode, $expected) { + $this->ensureComponentIsEnabled($exportMode); + // We need some data so that we can get to the end of the export + // function. Hopefully one day that won't be required to get metadata info out. + // eventually aspire to call $provider->getSQLColumns straight after it + // is intiated. + $this->setupBaseExportData($exportMode); + + $result = CRM_Export_BAO_Export::exportComponents( + TRUE, + [1], + [], + NULL, + NULL, + NULL, + $exportMode, + NULL, + NULL, + FALSE, + FALSE, + array( + 'exportOption' => CRM_Export_Form_Select::CONTRIBUTE_EXPORT, + 'suppress_csv_for_testing' => TRUE, + ) + ); + $this->assertEquals($expected, $result[1]); + } + + /** + * @param string $exportMode + */ + public function setupBaseExportData($exportMode) { + $this->createLoggedInUser(); + if ($exportMode === CRM_Export_Form_Select::CASE_EXPORT) { + $this->setupCaseExportData(); + } + if ($exportMode === CRM_Export_Form_Select::CONTRIBUTE_EXPORT) { + $this->setUpContributionExportData(); + } + if ($exportMode === CRM_Export_Form_Select::MEMBER_EXPORT) { + $this->setUpMembershipExportData(); + } + if ($exportMode === CRM_Export_Form_Select::ACTIVITY_EXPORT) { + $this->setUpActivityExportData(); + } + } + + /** + * Get comprehensive sql columns output. + * + * @return array + */ + public function getSqlColumnsOutput() { + return [ + [ + 'anything that will then be defaulting ton contact', + $this->getBasicSqlColumnDefinition(TRUE), + ], + [ + CRM_Export_Form_Select::ACTIVITY_EXPORT, + array_merge($this->getBasicSqlColumnDefinition(FALSE), $this->getActivitySqlColumns()), + ], + [ + CRM_Export_Form_Select::CASE_EXPORT, + array_merge($this->getBasicSqlColumnDefinition(FALSE), $this->getCaseSqlColumns()), + ], + [ + CRM_Export_Form_Select::CONTRIBUTE_EXPORT, + array_merge($this->getBasicSqlColumnDefinition(FALSE), $this->getContributionSqlColumns()), + ], + [ + CRM_Export_Form_Select::EVENT_EXPORT, + array_merge($this->getBasicSqlColumnDefinition(FALSE), $this->getParticipantSqlColumns()), + ], + [ + CRM_Export_Form_Select::MEMBER_EXPORT, + array_merge($this->getBasicSqlColumnDefinition(FALSE), $this->getMembershipSqlColumns()), + ], + [ + CRM_Export_Form_Select::PLEDGE_EXPORT, + array_merge($this->getBasicSqlColumnDefinition(FALSE), $this->getPledgeSqlColumns()), + ], + + ]; + } + + /** + * Get the column definition for exports. + * + * @param bool $isContactExport + * + * @return array + */ + protected function getBasicSqlColumnDefinition($isContactExport) { + $columns = [ + 'civicrm_primary_id' => 'civicrm_primary_id varchar(16)', + 'contact_type' => 'contact_type varchar(64)', + 'contact_sub_type' => 'contact_sub_type varchar(255)', + 'do_not_email' => 'do_not_email varchar(16)', + 'do_not_phone' => 'do_not_phone varchar(16)', + 'do_not_mail' => 'do_not_mail varchar(16)', + 'do_not_sms' => 'do_not_sms varchar(16)', + 'do_not_trade' => 'do_not_trade varchar(16)', + 'is_opt_out' => 'is_opt_out varchar(16)', + 'legal_identifier' => 'legal_identifier varchar(32)', + 'external_identifier' => 'external_identifier varchar(64)', + 'sort_name' => 'sort_name varchar(128)', + 'display_name' => 'display_name varchar(128)', + 'nick_name' => 'nick_name varchar(128)', + 'legal_name' => 'legal_name varchar(128)', + 'image_url' => 'image_url longtext', + 'preferred_communication_method' => 'preferred_communication_method varchar(255)', + 'preferred_language' => 'preferred_language varchar(5)', + 'preferred_mail_format' => 'preferred_mail_format varchar(8)', + 'hash' => 'hash varchar(32)', + 'contact_source' => 'contact_source varchar(255)', + 'first_name' => 'first_name varchar(64)', + 'middle_name' => 'middle_name varchar(64)', + 'last_name' => 'last_name varchar(64)', + 'prefix_id' => 'prefix_id varchar(255)', + 'suffix_id' => 'suffix_id varchar(255)', + 'formal_title' => 'formal_title varchar(64)', + 'communication_style_id' => 'communication_style_id varchar(16)', + 'email_greeting_id' => 'email_greeting_id varchar(16)', + 'postal_greeting_id' => 'postal_greeting_id varchar(16)', + 'addressee_id' => 'addressee_id varchar(16)', + 'job_title' => 'job_title varchar(255)', + 'gender_id' => 'gender_id varchar(16)', + 'birth_date' => 'birth_date varchar(32)', + 'is_deceased' => 'is_deceased varchar(16)', + 'deceased_date' => 'deceased_date varchar(32)', + 'household_name' => 'household_name varchar(128)', + 'organization_name' => 'organization_name varchar(128)', + 'sic_code' => 'sic_code varchar(8)', + 'user_unique_id' => 'user_unique_id varchar(255)', + 'current_employer_id' => 'current_employer_id varchar(16)', + 'contact_is_deleted' => 'contact_is_deleted varchar(16)', + 'created_date' => 'created_date varchar(32)', + 'modified_date' => 'modified_date varchar(32)', + 'addressee' => 'addressee varchar(255)', + 'email_greeting' => 'email_greeting varchar(255)', + 'postal_greeting' => 'postal_greeting varchar(255)', + 'current_employer' => 'current_employer varchar(128)', + 'location_type' => 'location_type text', + 'street_address' => 'street_address varchar(96)', + 'street_number' => 'street_number varchar(16)', + 'street_number_suffix' => 'street_number_suffix varchar(8)', + 'street_name' => 'street_name varchar(64)', + 'street_unit' => 'street_unit varchar(16)', + 'supplemental_address_1' => 'supplemental_address_1 varchar(96)', + 'supplemental_address_2' => 'supplemental_address_2 varchar(96)', + 'supplemental_address_3' => 'supplemental_address_3 varchar(96)', + 'city' => 'city varchar(64)', + 'postal_code_suffix' => 'postal_code_suffix varchar(12)', + 'postal_code' => 'postal_code varchar(64)', + 'geo_code_1' => 'geo_code_1 varchar(32)', + 'geo_code_2' => 'geo_code_2 varchar(32)', + 'address_name' => 'address_name varchar(255)', + 'master_id' => 'master_id varchar(128)', + 'county' => 'county varchar(64)', + 'state_province' => 'state_province varchar(64)', + 'country' => 'country varchar(64)', + 'phone' => 'phone varchar(32)', + 'phone_ext' => 'phone_ext varchar(16)', + 'email' => 'email varchar(254)', + 'on_hold' => 'on_hold varchar(16)', + 'is_bulkmail' => 'is_bulkmail varchar(16)', + 'signature_text' => 'signature_text longtext', + 'signature_html' => 'signature_html longtext', + 'im_provider' => 'im_provider text', + 'im' => 'im varchar(64)', + 'openid' => 'openid varchar(255)', + 'world_region' => 'world_region varchar(128)', + 'url' => 'url varchar(128)', + 'groups' => 'groups text', + 'tags' => 'tags text', + 'notes' => 'notes text', + 'phone_type_id' => 'phone_type_id varchar(255)', + 'provider_id' => 'provider_id varchar(255)', + ]; + if (!$isContactExport) { + unset($columns['groups']); + unset($columns['tags']); + unset($columns['notes']); + } + return $columns; + } + + /** + * Get Case SQL columns. + * + * @return array + */ + protected function getCaseSqlColumns() { + return [ + 'case_start_date' => 'case_start_date varchar(32)', + 'case_end_date' => 'case_end_date varchar(32)', + 'case_subject' => 'case_subject varchar(128)', + 'case_source_contact_id' => 'case_source_contact_id varchar(255)', + 'case_activity_status' => 'case_activity_status text', + 'case_activity_duration' => 'case_activity_duration text', + 'case_activity_medium_id' => 'case_activity_medium_id varchar(255)', + 'case_activity_details' => 'case_activity_details text', + 'case_activity_is_auto' => 'case_activity_is_auto text', + 'contact_id' => 'contact_id varchar(255)', + 'case_id' => 'case_id varchar(16)', + 'case_activity_subject' => 'case_activity_subject text', + 'case_status' => 'case_status text', + 'case_type' => 'case_type text', + 'case_role' => 'case_role text', + 'case_deleted' => 'case_deleted varchar(16)', + 'case_recent_activity_date' => 'case_recent_activity_date text', + 'case_recent_activity_type' => 'case_recent_activity_type text', + 'case_scheduled_activity_date' => 'case_scheduled_activity_date text', + ]; + } + + /** + * Get activity sql columns. + * + * @return array + */ + protected function getActivitySqlColumns() { + return [ + 'activity_id' => 'activity_id varchar(16)', + 'activity_type' => 'activity_type varchar(255)', + 'activity_type_id' => 'activity_type_id varchar(16)', + 'activity_subject' => 'activity_subject varchar(255)', + 'activity_date_time' => 'activity_date_time varchar(32)', + 'activity_duration' => 'activity_duration varchar(16)', + 'activity_location' => 'activity_location varchar(255)', + 'activity_details' => 'activity_details longtext', + 'activity_status' => 'activity_status varchar(255)', + 'activity_priority' => 'activity_priority varchar(255)', + 'source_contact' => 'source_contact varchar(255)', + 'source_record_id' => 'source_record_id varchar(255)', + 'activity_is_test' => 'activity_is_test varchar(16)', + 'activity_campaign_id' => 'activity_campaign_id varchar(128)', + 'result' => 'result text', + 'activity_engagement_level' => 'activity_engagement_level varchar(16)', + 'parent_id' => 'parent_id varchar(255)', + ]; + } + + /** + * Get participant sql columns. + * + * @return array + */ + protected function getParticipantSqlColumns() { + return [ + 'event_id' => 'event_id varchar(16)', + 'event_title' => 'event_title varchar(255)', + 'event_start_date' => 'event_start_date varchar(32)', + 'event_end_date' => 'event_end_date varchar(32)', + 'event_type' => 'event_type varchar(255)', + 'participant_id' => 'participant_id varchar(16)', + 'participant_status' => 'participant_status varchar(255)', + 'participant_status_id' => 'participant_status_id varchar(16)', + 'participant_role' => 'participant_role varchar(255)', + 'participant_role_id' => 'participant_role_id varchar(128)', + 'participant_note' => 'participant_note text', + 'participant_register_date' => 'participant_register_date varchar(32)', + 'participant_source' => 'participant_source varchar(128)', + 'participant_fee_level' => 'participant_fee_level longtext', + 'participant_is_test' => 'participant_is_test varchar(16)', + 'participant_is_pay_later' => 'participant_is_pay_later varchar(16)', + 'participant_fee_amount' => 'participant_fee_amount varchar(32)', + 'participant_discount_name' => 'participant_discount_name varchar(16)', + 'participant_fee_currency' => 'participant_fee_currency varchar(3)', + 'participant_registered_by_id' => 'participant_registered_by_id varchar(16)', + 'participant_campaign_id' => 'participant_campaign_id varchar(128)', + ]; + } + + /** + * Get contribution sql columns. + * + * @return array + */ + public function getContributionSqlColumns() { + return [ + 'civicrm_primary_id' => 'civicrm_primary_id varchar(16)', + 'contact_type' => 'contact_type varchar(64)', + 'contact_sub_type' => 'contact_sub_type varchar(255)', + 'do_not_email' => 'do_not_email varchar(16)', + 'do_not_phone' => 'do_not_phone varchar(16)', + 'do_not_mail' => 'do_not_mail varchar(16)', + 'do_not_sms' => 'do_not_sms varchar(16)', + 'do_not_trade' => 'do_not_trade varchar(16)', + 'is_opt_out' => 'is_opt_out varchar(16)', + 'legal_identifier' => 'legal_identifier varchar(32)', + 'external_identifier' => 'external_identifier varchar(64)', + 'sort_name' => 'sort_name varchar(128)', + 'display_name' => 'display_name varchar(128)', + 'nick_name' => 'nick_name varchar(128)', + 'legal_name' => 'legal_name varchar(128)', + 'image_url' => 'image_url longtext', + 'preferred_communication_method' => 'preferred_communication_method varchar(255)', + 'preferred_language' => 'preferred_language varchar(5)', + 'preferred_mail_format' => 'preferred_mail_format varchar(8)', + 'hash' => 'hash varchar(32)', + 'contact_source' => 'contact_source varchar(255)', + 'first_name' => 'first_name varchar(64)', + 'middle_name' => 'middle_name varchar(64)', + 'last_name' => 'last_name varchar(64)', + 'prefix_id' => 'prefix_id varchar(255)', + 'suffix_id' => 'suffix_id varchar(255)', + 'formal_title' => 'formal_title varchar(64)', + 'communication_style_id' => 'communication_style_id varchar(16)', + 'email_greeting_id' => 'email_greeting_id varchar(16)', + 'postal_greeting_id' => 'postal_greeting_id varchar(16)', + 'addressee_id' => 'addressee_id varchar(16)', + 'job_title' => 'job_title varchar(255)', + 'gender_id' => 'gender_id varchar(16)', + 'birth_date' => 'birth_date varchar(32)', + 'is_deceased' => 'is_deceased varchar(16)', + 'deceased_date' => 'deceased_date varchar(32)', + 'household_name' => 'household_name varchar(128)', + 'organization_name' => 'organization_name varchar(128)', + 'sic_code' => 'sic_code varchar(8)', + 'user_unique_id' => 'user_unique_id varchar(255)', + 'current_employer_id' => 'current_employer_id varchar(16)', + 'contact_is_deleted' => 'contact_is_deleted varchar(16)', + 'created_date' => 'created_date varchar(32)', + 'modified_date' => 'modified_date varchar(32)', + 'addressee' => 'addressee varchar(255)', + 'email_greeting' => 'email_greeting varchar(255)', + 'postal_greeting' => 'postal_greeting varchar(255)', + 'current_employer' => 'current_employer varchar(128)', + 'location_type' => 'location_type text', + 'street_address' => 'street_address varchar(96)', + 'street_number' => 'street_number varchar(16)', + 'street_number_suffix' => 'street_number_suffix varchar(8)', + 'street_name' => 'street_name varchar(64)', + 'street_unit' => 'street_unit varchar(16)', + 'supplemental_address_1' => 'supplemental_address_1 varchar(96)', + 'supplemental_address_2' => 'supplemental_address_2 varchar(96)', + 'supplemental_address_3' => 'supplemental_address_3 varchar(96)', + 'city' => 'city varchar(64)', + 'postal_code_suffix' => 'postal_code_suffix varchar(12)', + 'postal_code' => 'postal_code varchar(64)', + 'geo_code_1' => 'geo_code_1 varchar(32)', + 'geo_code_2' => 'geo_code_2 varchar(32)', + 'address_name' => 'address_name varchar(255)', + 'master_id' => 'master_id varchar(128)', + 'county' => 'county varchar(64)', + 'state_province' => 'state_province varchar(64)', + 'country' => 'country varchar(64)', + 'phone' => 'phone varchar(32)', + 'phone_ext' => 'phone_ext varchar(16)', + 'email' => 'email varchar(254)', + 'on_hold' => 'on_hold varchar(16)', + 'is_bulkmail' => 'is_bulkmail varchar(16)', + 'signature_text' => 'signature_text longtext', + 'signature_html' => 'signature_html longtext', + 'im_provider' => 'im_provider text', + 'im' => 'im varchar(64)', + 'openid' => 'openid varchar(255)', + 'world_region' => 'world_region varchar(128)', + 'url' => 'url varchar(128)', + 'phone_type_id' => 'phone_type_id varchar(255)', + 'provider_id' => 'provider_id varchar(255)', + 'financial_type' => 'financial_type varchar(64)', + 'contribution_source' => 'contribution_source varchar(255)', + 'receive_date' => 'receive_date varchar(32)', + 'thankyou_date' => 'thankyou_date varchar(32)', + 'cancel_date' => 'cancel_date varchar(32)', + 'total_amount' => 'total_amount varchar(32)', + 'accounting_code' => 'accounting_code varchar(64)', + 'payment_instrument' => 'payment_instrument text', + 'payment_instrument_id' => 'payment_instrument_id varchar(16)', + 'contribution_check_number' => 'contribution_check_number varchar(255)', + 'non_deductible_amount' => 'non_deductible_amount varchar(32)', + 'fee_amount' => 'fee_amount varchar(32)', + 'net_amount' => 'net_amount varchar(32)', + 'trxn_id' => 'trxn_id varchar(255)', + 'invoice_id' => 'invoice_id varchar(255)', + 'invoice_number' => 'invoice_number varchar(255)', + 'currency' => 'currency varchar(3)', + 'cancel_reason' => 'cancel_reason longtext', + 'receipt_date' => 'receipt_date varchar(32)', + 'product_name' => 'product_name varchar(255)', + 'sku' => 'sku varchar(50)', + 'product_option' => 'product_option varchar(255)', + 'fulfilled_date' => 'fulfilled_date varchar(32)', + 'contribution_start_date' => 'contribution_start_date varchar(32)', + 'contribution_end_date' => 'contribution_end_date varchar(32)', + 'is_test' => 'is_test varchar(16)', + 'is_pay_later' => 'is_pay_later varchar(16)', + 'contribution_status' => 'contribution_status text', + 'contribution_recur_id' => 'contribution_recur_id varchar(16)', + 'amount_level' => 'amount_level longtext', + 'contribution_note' => 'contribution_note text', + 'contribution_batch' => 'contribution_batch text', + 'contribution_campaign_title' => 'contribution_campaign_title varchar(255)', + 'contribution_campaign_id' => 'contribution_campaign_id varchar(128)', + 'contribution_product_id' => 'contribution_product_id varchar(255)', + 'contribution_soft_credit_name' => 'contribution_soft_credit_name varchar(255)', + 'contribution_soft_credit_amount' => 'contribution_soft_credit_amount varchar(255)', + 'contribution_soft_credit_type' => 'contribution_soft_credit_type varchar(255)', + 'contribution_soft_credit_contact_id' => 'contribution_soft_credit_contact_id varchar(255)', + 'contribution_soft_credit_contribution_id' => 'contribution_soft_credit_contribution_id varchar(255)', + ]; + } + + /** + * Get pledge sql columns. + * + * @return array + */ + public function getPledgeSqlColumns() { + return [ + 'pledge_id' => 'pledge_id varchar(16)', + 'pledge_amount' => 'pledge_amount varchar(32)', + 'pledge_total_paid' => 'pledge_total_paid text', + 'pledge_create_date' => 'pledge_create_date varchar(32)', + 'pledge_start_date' => 'pledge_start_date text', + 'pledge_next_pay_date' => 'pledge_next_pay_date text', + 'pledge_next_pay_amount' => 'pledge_next_pay_amount text', + 'pledge_status' => 'pledge_status varchar(255)', + 'pledge_is_test' => 'pledge_is_test varchar(16)', + 'pledge_contribution_page_id' => 'pledge_contribution_page_id varchar(255)', + 'pledge_financial_type' => 'pledge_financial_type text', + 'pledge_frequency_interval' => 'pledge_frequency_interval varchar(255)', + 'pledge_frequency_unit' => 'pledge_frequency_unit varchar(255)', + 'pledge_currency' => 'pledge_currency text', + 'pledge_campaign_id' => 'pledge_campaign_id varchar(128)', + 'pledge_balance_amount' => 'pledge_balance_amount text', + 'pledge_payment_id' => 'pledge_payment_id varchar(16)', + 'pledge_payment_scheduled_amount' => 'pledge_payment_scheduled_amount varchar(32)', + 'pledge_payment_scheduled_date' => 'pledge_payment_scheduled_date varchar(32)', + 'pledge_payment_paid_amount' => 'pledge_payment_paid_amount text', + 'pledge_payment_paid_date' => 'pledge_payment_paid_date text', + 'pledge_payment_reminder_date' => 'pledge_payment_reminder_date varchar(32)', + 'pledge_payment_reminder_count' => 'pledge_payment_reminder_count varchar(16)', + 'pledge_payment_status' => 'pledge_payment_status varchar(255)', + ]; + } + + /** + * Get membership sql columns. + * + * @return array + */ + public function getMembershipSqlColumns() { + return [ + 'membership_type' => 'membership_type varchar(128)', + 'member_is_test' => 'member_is_test varchar(16)', + 'member_is_pay_later' => 'member_is_pay_later varchar(16)', + 'join_date' => 'join_date varchar(32)', + 'membership_start_date' => 'membership_start_date varchar(32)', + 'membership_end_date' => 'membership_end_date varchar(32)', + 'membership_source' => 'membership_source varchar(128)', + 'membership_status' => 'membership_status varchar(255)', + 'membership_id' => 'membership_id varchar(16)', + 'owner_membership_id' => 'owner_membership_id varchar(16)', + 'max_related' => 'max_related text', + 'membership_recur_id' => 'membership_recur_id varchar(255)', + 'member_campaign_id' => 'member_campaign_id varchar(128)', + 'member_is_override' => 'member_is_override text', + 'member_auto_renew' => 'member_auto_renew text', + ]; + } + }