Merge pull request #12526 from agh1/relpermicons
[civicrm-core.git] / tests / phpunit / CRM / Export / BAO / ExportTest.php
1 <?php
2
3 /**
4 * Class CRM_Core_DAOTest
5 * @group headless
6 */
7 class CRM_Export_BAO_ExportTest extends CiviUnitTestCase {
8
9 /**
10 * Contact IDs created for testing.
11 *
12 * @var array
13 */
14 protected $contactIDs = [];
15
16 /**
17 * Contribution IDs created for testing.
18 *
19 * @var array
20 */
21 protected $contributionIDs = [];
22
23 /**
24 * Contribution IDs created for testing.
25 *
26 * @var array
27 */
28 protected $activityIDs = [];
29
30
31 /**
32 * Contribution IDs created for testing.
33 *
34 * @var array
35 */
36 protected $membershipIDs = [];
37
38 /**
39 * Master Address ID created for testing.
40 *
41 * @var int
42 */
43 protected $masterAddressID;
44
45 public function tearDown() {
46 $this->quickCleanup([
47 'civicrm_contact',
48 'civicrm_email',
49 'civicrm_address',
50 'civicrm_relationship',
51 'civicrm_membership',
52 'civicrm_case',
53 'civicrm_case_contact',
54 'civicrm_case_activity',
55 ]);
56 $this->quickCleanUpFinancialEntities();
57 parent::tearDown();
58 }
59
60 /**
61 * Basic test to ensure the exportComponents function completes without error.
62 */
63 public function testExportComponentsNull() {
64 list($tableName) = CRM_Export_BAO_Export::exportComponents(
65 TRUE,
66 array(),
67 array(),
68 NULL,
69 NULL,
70 NULL,
71 CRM_Export_Form_Select::CONTACT_EXPORT,
72 NULL,
73 NULL,
74 FALSE,
75 FALSE,
76 array(
77 'exportOption' => 1,
78 'suppress_csv_for_testing' => TRUE,
79 )
80 );
81
82 // delete the export temp table and component table
83 $sql = "DROP TABLE IF EXISTS {$tableName}";
84 CRM_Core_DAO::executeQuery($sql);
85 }
86
87 /**
88 * Basic test to ensure the exportComponents function can export selected fields for contribution.
89 */
90 public function testExportComponentsContribution() {
91 $this->setUpContributionExportData();
92 $selectedFields = array(
93 array('Individual', 'first_name'),
94 array('Individual', 'last_name'),
95 array('Contribution', 'receive_date'),
96 array('Contribution', 'contribution_source'),
97 array('Individual', 'street_address', 1),
98 array('Individual', 'city', 1),
99 array('Individual', 'country', 1),
100 array('Individual', 'email', 1),
101 array('Contribution', 'trxn_id'),
102 );
103
104 list($tableName, $sqlColumns) = CRM_Export_BAO_Export::exportComponents(
105 TRUE,
106 $this->contributionIDs,
107 array(),
108 'receive_date desc',
109 $selectedFields,
110 NULL,
111 CRM_Export_Form_Select::CONTRIBUTE_EXPORT,
112 'civicrm_contribution.id IN ( ' . implode(',', $this->contributionIDs) . ')',
113 NULL,
114 FALSE,
115 FALSE,
116 array(
117 'exportOption' => CRM_Export_Form_Select::CONTRIBUTE_EXPORT,
118 'suppress_csv_for_testing' => TRUE,
119 )
120 );
121
122 // delete the export temp table and component table
123 $sql = "DROP TABLE IF EXISTS {$tableName}";
124 CRM_Core_DAO::executeQuery($sql);
125 }
126
127 /**
128 * Basic test to ensure the exportComponents function can export selected fields for contribution.
129 */
130 public function testExportComponentsActivity() {
131 $this->setUpActivityExportData();
132 $selectedFields = array(
133 array('Individual', 'display_name'),
134 array('Individual', '5_a_b', 'display_name'),
135 );
136
137 list($tableName) = CRM_Export_BAO_Export::exportComponents(
138 FALSE,
139 $this->activityIDs,
140 array(),
141 '`activity_date_time` desc',
142 $selectedFields,
143 NULL,
144 CRM_Export_Form_Select::ACTIVITY_EXPORT,
145 'civicrm_activity.id IN ( ' . implode(',', $this->activityIDs) . ')',
146 NULL,
147 FALSE,
148 FALSE,
149 array(
150 'exportOption' => CRM_Export_Form_Select::ACTIVITY_EXPORT,
151 'suppress_csv_for_testing' => TRUE,
152 )
153 );
154
155 // delete the export temp table and component table
156 $sql = "DROP TABLE IF EXISTS {$tableName}";
157 CRM_Core_DAO::executeQuery($sql);
158 }
159
160 /**
161 * Test the function that extracts the arrays used to structure the output.
162 *
163 * The keys in the output fields array should by matched by field aliases in the sql query (with
164 * exceptions of course - currently country is one - although maybe a future refactor can change that!).
165 *
166 * We are trying to move towards simpler processing in the per row iteration as that may be
167 * repeated 100,000 times and in general we should simply be able to match the query fields to
168 * our expected rows & do a little pseudoconstant mapping.
169 */
170 public function testGetExportStructureArrays() {
171 // This is how return properties are formatted internally within the function for passing to the BAO query.
172 $returnProperties = array(
173 'first_name' => 1,
174 'last_name' => 1,
175 'receive_date' => 1,
176 'contribution_source' => 1,
177 'location' => array(
178 'Home' => array(
179 'street_address' => 1,
180 'city' => 1,
181 'country' => 1,
182 'email' => 1,
183 'im-1' => 1,
184 'im_provider' => 1,
185 'phone-1' => 1,
186 ),
187 ),
188 'phone' => 1,
189 'trxn_id' => 1,
190 'contribution_id' => 1,
191 );
192
193 $contactRelationshipTypes = CRM_Contact_BAO_Relationship::getContactRelationshipType(
194 NULL,
195 NULL,
196 NULL,
197 NULL,
198 TRUE,
199 'name',
200 FALSE
201 );
202
203 $query = new CRM_Contact_BAO_Query(array(), $returnProperties, NULL,
204 FALSE, FALSE, CRM_Contact_BAO_Query::MODE_CONTRIBUTE,
205 FALSE, TRUE, TRUE, NULL, 'AND'
206 );
207
208 list($select) = $query->query();
209 $pattern = '/as `?([^`,]*)/';
210 $queryFieldAliases = array();
211 preg_match_all($pattern, $select, $queryFieldAliases, PREG_PATTERN_ORDER);
212 $processor = new CRM_Export_BAO_ExportProcessor(CRM_Contact_BAO_Query::MODE_CONTRIBUTE, NULL, 'AND');
213 $processor->setQueryFields($query->_fields);
214
215 list($outputFields) = CRM_Export_BAO_Export::getExportStructureArrays($returnProperties, $processor, $contactRelationshipTypes, '');
216 foreach (array_keys($outputFields) as $fieldAlias) {
217 if ($fieldAlias == 'Home-country') {
218 $this->assertTrue(in_array($fieldAlias . '_id', $queryFieldAliases[1]), 'Country is subject to some funky translate so we make sure country id is present');
219 }
220 else {
221 $this->assertTrue(in_array($fieldAlias, $queryFieldAliases[1]), 'looking for field ' . $fieldAlias . ' in generaly the alias fields need to match the outputfields');
222 }
223 }
224
225 }
226
227 /**
228 * Set up some data for us to do testing on.
229 */
230 public function setUpContributionExportData() {
231 $this->setUpContactExportData();
232 $this->contributionIDs[] = $this->contributionCreate(array('contact_id' => $this->contactIDs[0], 'trxn_id' => 'null', 'invoice_id' => 'null'));
233 $this->contributionIDs[] = $this->contributionCreate(array('contact_id' => $this->contactIDs[1], 'trxn_id' => 'null', 'invoice_id' => 'null'));
234 }
235
236 /**
237 * Set up some data for us to do testing on.
238 */
239 public function setUpMembershipExportData() {
240 $this->setUpContactExportData();
241 $this->membershipIDs[] = $this->contactMembershipCreate(['contact_id' => $this->contactIDs[0]]);
242 }
243
244 /**
245 * Set up data to test case export.
246 */
247 public function setupCaseExportData() {
248 $contactID1 = $this->individualCreate();
249 $contactID2 = $this->individualCreate(array(), 1);
250
251 $case = $this->callAPISuccess('case', 'create', array(
252 'case_type_id' => 1,
253 'subject' => 'blah',
254 'contact_id' => $contactID1,
255 ));
256 $this->callAPISuccess('CaseContact', 'create', [
257 'case_id' => $case['id'],
258 'contact_id' => $contactID2,
259 ]);
260 }
261
262 /**
263 * Set up some data for us to do testing on.
264 */
265 public function setUpActivityExportData() {
266 $this->setUpContactExportData();
267 $this->activityIDs[] = $this->activityCreate(array('contact_id' => $this->contactIDs[0]))['id'];
268 }
269
270 /**
271 * Set up some data for us to do testing on.
272 */
273 public function setUpContactExportData() {
274 $this->contactIDs[] = $contactA = $this->individualCreate(['gender_id' => 'Female']);
275 // Create address for contact A.
276 $params = array(
277 'contact_id' => $contactA,
278 'location_type_id' => 'Home',
279 'street_address' => 'Ambachtstraat 23',
280 'postal_code' => '6971 BN',
281 'country_id' => '1152',
282 'city' => 'Brummen',
283 'is_primary' => 1,
284 );
285 $result = $this->callAPISuccess('address', 'create', $params);
286 $addressId = $result['id'];
287
288 $this->callAPISuccess('email', 'create', array(
289 'id' => $this->callAPISuccessGetValue('Email', ['contact_id' => $params['contact_id'], 'return' => 'id']),
290 'location_type_id' => 'Home',
291 'email' => 'home@example.com',
292 'is_primary' => 1,
293 ));
294 $this->callAPISuccess('email', 'create', array('contact_id' => $params['contact_id'], 'location_type_id' => 'Work', 'email' => 'work@example.com', 'is_primary' => 0));
295
296 $params['is_primary'] = 0;
297 $params['location_type_id'] = 'Work';
298 $this->callAPISuccess('address', 'create', $params);
299 $this->contactIDs[] = $contactB = $this->individualCreate();
300
301 $this->callAPISuccess('address', 'create', array(
302 'contact_id' => $contactB,
303 'location_type_id' => "Home",
304 'master_id' => $addressId,
305 ));
306 $this->masterAddressID = $addressId;
307
308 }
309
310 /**
311 * Test variants of primary address exporting.
312 *
313 * @param int $isPrimaryOnly
314 *
315 * @dataProvider getPrimarySearchOptions
316 */
317 public function testExportPrimaryAddress($isPrimaryOnly) {
318 \Civi::settings()->set('searchPrimaryDetailsOnly', $isPrimaryOnly);
319 $this->setUpContactExportData();
320
321 $selectedFields = [['Individual', 'email', ' '], ['Individual', 'email', '1'], ['Individual', 'email', '2']];
322 list($tableName) = CRM_Export_BAO_Export::exportComponents(
323 TRUE,
324 [],
325 [['email', 'LIKE', 'c', 0, 1]],
326 NULL,
327 $selectedFields,
328 NULL,
329 CRM_Export_Form_Select::CONTACT_EXPORT,
330 "contact_a.id IN ({$this->contactIDs[0]}, {$this->contactIDs[1]})",
331 NULL,
332 FALSE,
333 FALSE,
334 array(
335 'exportOption' => CRM_Export_Form_Select::CONTACT_EXPORT,
336 'suppress_csv_for_testing' => TRUE,
337 )
338 );
339
340 $dao = CRM_Core_DAO::executeQuery('SELECT * from ' . $tableName);
341 $dao->fetch();
342 $this->assertEquals('home@example.com', $dao->email);
343 $this->assertEquals('work@example.com', $dao->work_email);
344 $this->assertEquals('home@example.com', $dao->home_email);
345 $this->assertEquals(2, $dao->N);
346 \Civi::settings()->set('searchPrimaryDetailsOnly', FALSE);
347 }
348
349 /**
350 * Get the options for the primary search setting field.
351 * @return array
352 */
353 public function getPrimarySearchOptions() {
354 return [[TRUE], [FALSE]];
355 }
356
357 /**
358 * Test that when exporting a pseudoField it is reset for NULL entries.
359 *
360 * ie. we have a contact WITH a gender & one without - make sure the latter one
361 * does NOT retain the gender of the former.
362 */
363 public function testExportPseudoField() {
364 $this->setUpContactExportData();
365 $selectedFields = [['Individual', 'gender_id']];
366 list($tableName, $sqlColumns) = CRM_Export_BAO_Export::exportComponents(
367 TRUE,
368 $this->contactIDs[1],
369 array(),
370 NULL,
371 $selectedFields,
372 NULL,
373 CRM_Export_Form_Select::CONTACT_EXPORT,
374 "contact_a.id IN (" . implode(",", $this->contactIDs) . ")",
375 NULL,
376 FALSE,
377 FALSE,
378 array(
379 'exportOption' => CRM_Export_Form_Select::CONTACT_EXPORT,
380 'suppress_csv_for_testing' => TRUE,
381 )
382 );
383 $this->assertEquals('Female,', CRM_Core_DAO::singleValueQuery("SELECT GROUP_CONCAT(gender_id) FROM {$tableName}"));
384 }
385
386 /**
387 * Test that when exporting a pseudoField it is reset for NULL entries.
388 *
389 * This is specific to the example in CRM-14398
390 */
391 public function testExportPseudoFieldCampaign() {
392 $this->setUpContributionExportData();
393 $campaign = $this->callAPISuccess('Campaign', 'create', ['title' => 'Big campaign']);
394 $this->callAPISuccess('Contribution', 'create', ['campaign_id' => 'Big_campaign', 'id' => $this->contributionIDs[0]]);
395 $selectedFields = [['Individual', 'gender_id'], ['Contribution', 'contribution_campaign_title']];
396 list($tableName, $sqlColumns) = CRM_Export_BAO_Export::exportComponents(
397 TRUE,
398 $this->contactIDs[1],
399 array(),
400 NULL,
401 $selectedFields,
402 NULL,
403 CRM_Export_Form_Select::CONTRIBUTE_EXPORT,
404 "contact_a.id IN (" . implode(",", $this->contactIDs) . ")",
405 NULL,
406 FALSE,
407 FALSE,
408 array(
409 'exportOption' => CRM_Export_Form_Select::CONTACT_EXPORT,
410 'suppress_csv_for_testing' => TRUE,
411 )
412 );
413 $this->assertEquals('Big campaign,', CRM_Core_DAO::singleValueQuery("SELECT GROUP_CONCAT(contribution_campaign_title) FROM {$tableName}"));
414 }
415
416 /**
417 * Test exporting relationships.
418 *
419 * This is to ensure that CRM-13995 remains fixed.
420 */
421 public function testExportRelationshipsMergeToHousehold() {
422 list($householdID, $houseHoldTypeID) = $this->setUpHousehold();
423
424 $selectedFields = [
425 ['Individual', $houseHoldTypeID . '_a_b', 'state_province', ''],
426 ['Individual', $houseHoldTypeID . '_a_b', 'city', ''],
427 ['Individual', 'city', ''],
428 ['Individual', 'state_province', ''],
429 ];
430 list($tableName) = CRM_Export_BAO_Export::exportComponents(
431 FALSE,
432 $this->contactIDs,
433 [],
434 NULL,
435 $selectedFields,
436 NULL,
437 CRM_Export_Form_Select::CONTACT_EXPORT,
438 "contact_a.id IN (" . implode(",", $this->contactIDs) . ")",
439 NULL,
440 FALSE,
441 TRUE,
442 [
443 'exportOption' => CRM_Export_Form_Select::CONTACT_EXPORT,
444 'suppress_csv_for_testing' => TRUE,
445 ]
446 );
447 $dao = CRM_Core_DAO::executeQuery("SELECT * FROM {$tableName}");
448 while ($dao->fetch()) {
449 $this->assertEquals('Portland', $dao->city);
450 $this->assertEquals('ME', $dao->state_province);
451 $this->assertEquals($householdID, $dao->civicrm_primary_id);
452 $this->assertEquals($householdID, $dao->civicrm_primary_id);
453 }
454
455 }
456
457 /**
458 * Test exporting relationships.
459 */
460 public function testExportRelationshipsMergeToHouseholdAllFields() {
461 $this->markTestIncomplete('Does not yet work under CI due to mysql limitation (number of columns in table). Works on some boxes');
462 list($householdID) = $this->setUpHousehold();
463 list($tableName) = CRM_Export_BAO_Export::exportComponents(
464 FALSE,
465 $this->contactIDs,
466 [],
467 NULL,
468 NULL,
469 NULL,
470 CRM_Export_Form_Select::CONTACT_EXPORT,
471 "contact_a.id IN (" . implode(",", $this->contactIDs) . ")",
472 NULL,
473 FALSE,
474 TRUE,
475 [
476 'exportOption' => CRM_Export_Form_Select::CONTACT_EXPORT,
477 'suppress_csv_for_testing' => TRUE,
478 ]
479 );
480 $dao = CRM_Core_DAO::executeQuery("SELECT * FROM {$tableName}");
481 while ($dao->fetch()) {
482 $this->assertEquals('Portland', $dao->city);
483 $this->assertEquals('ME', $dao->state_province);
484 $this->assertEquals($householdID, $dao->civicrm_primary_id);
485 $this->assertEquals($householdID, $dao->civicrm_primary_id);
486 $this->assertEquals('Unit Test Household', $dao->addressee);
487 $this->assertEquals('Unit Test Household', $dao->display_name);
488 }
489 }
490
491 /**
492 * Test master_address_id field.
493 */
494 public function testExportCustomData() {
495 $this->setUpContactExportData();
496
497 $customData = $this->entityCustomGroupWithSingleFieldCreate(__FUNCTION__, 'ContactTest.php');
498
499 $this->callAPISuccess('Contact', 'create', [
500 'id' => $this->contactIDs[1],
501 'custom_' . $customData['custom_field_id'] => 'BlahdeBlah',
502 'api.Address.create' => ['location_type_id' => 'Billing', 'city' => 'Waipu'],
503 ]);
504 $selectedFields = [
505 ['Individual', 'city', CRM_Core_PseudoConstant::getKey('CRM_Core_BAO_Address', 'location_type_id', 'Billing')],
506 ['Individual', 'custom_1'],
507 ];
508
509 list($tableName, $sqlColumns) = $this->doExport($selectedFields, $this->contactIDs[1]);
510 $this->assertEquals([
511 'billing_city' => 'billing_city text',
512 'custom_1' => 'custom_1 varchar(255)',
513 ], $sqlColumns);
514
515 $dao = CRM_Core_DAO::executeQuery('SELECT * FROM ' . $tableName);
516 while ($dao->fetch()) {
517 $this->assertEquals('BlahdeBlah', $dao->custom_1);
518 $this->assertEquals('Waipu', $dao->billing_city);
519 }
520 }
521
522 /**
523 * Attempt to do a fairly full export of location data.
524 */
525 public function testExportIMData() {
526 // Use default providers.
527 $providers = ['AIM', 'GTalk', 'Jabber', 'MSN', 'Skype', 'Yahoo'];
528 $locationTypes = ['Billing', 'Home', 'Main', 'Other'];
529
530 $this->contactIDs[] = $this->individualCreate();
531 $this->contactIDs[] = $this->individualCreate();
532 $this->contactIDs[] = $this->householdCreate();
533 $this->contactIDs[] = $this->organizationCreate();
534 foreach ($this->contactIDs as $contactID) {
535 foreach ($providers as $provider) {
536 foreach ($locationTypes as $locationType) {
537 $this->callAPISuccess('IM', 'create', [
538 'contact_id' => $contactID,
539 'location_type_id' => $locationType,
540 'provider_id' => $provider,
541 'name' => $locationType . $provider . $contactID,
542 ]);
543 }
544 }
545 }
546
547 $relationships = [
548 $this->contactIDs[1] => ['label' => 'Spouse of'],
549 $this->contactIDs[2] => ['label' => 'Household Member of'],
550 $this->contactIDs[3] => ['label' => 'Employee of']
551 ];
552
553 foreach ($relationships as $contactID => $relationshipType) {
554 $relationshipTypeID = $this->callAPISuccess('RelationshipType', 'getvalue', ['label_a_b' => $relationshipType['label'], 'return' => 'id']);
555 $result = $this->callAPISuccess('Relationship', 'create', [
556 'contact_id_a' => $this->contactIDs[0],
557 'relationship_type_id' => $relationshipTypeID,
558 'contact_id_b' => $contactID
559 ]);
560 $relationships[$contactID]['id'] = $result['id'];
561 $relationships[$contactID]['relationship_type_id'] = $relationshipTypeID;
562 }
563
564 $fields = [['Individual', 'contact_id']];
565 // ' ' denotes primary location type.
566 foreach (array_merge($locationTypes, [' ']) as $locationType) {
567 $fields[] = [
568 'Individual',
569 'im_provider',
570 CRM_Core_PseudoConstant::getKey('CRM_Core_BAO_IM', 'location_type_id', $locationType),
571 ];
572 foreach ($relationships as $contactID => $relationship) {
573 $fields[] = [
574 'Individual',
575 $relationship['relationship_type_id'] . '_a_b',
576 'im_provider',
577 CRM_Core_PseudoConstant::getKey('CRM_Core_BAO_IM', 'location_type_id', $locationType),
578 ];
579 }
580 foreach ($providers as $provider) {
581 $fields[] = [
582 'Individual',
583 'im',
584 CRM_Core_PseudoConstant::getKey('CRM_Core_BAO_IM', 'location_type_id', $locationType),
585 CRM_Core_PseudoConstant::getKey('CRM_Core_BAO_IM', 'provider_id', $provider),
586 ];
587 foreach ($relationships as $contactID => $relationship) {
588 $fields[] = [
589 'Individual',
590 $relationship['relationship_type_id'] . '_a_b',
591 'im',
592 CRM_Core_PseudoConstant::getKey('CRM_Core_BAO_IM', 'location_type_id', $locationType),
593 CRM_Core_PseudoConstant::getKey('CRM_Core_BAO_IM', 'provider_id', $provider),
594 ];
595 }
596 }
597 }
598 list($tableName) = $this->doExport($fields, $this->contactIDs[0]);
599
600 $dao = CRM_Core_DAO::executeQuery('SELECT * FROM ' . $tableName);
601 while ($dao->fetch()) {
602 $id = $dao->contact_id;
603 $this->assertEquals('AIM', $dao->billing_im_provider);
604 $this->assertEquals('BillingJabber' . $id, $dao->billing_im_screen_name_jabber);
605 $this->assertEquals('BillingSkype' . $id, $dao->billing_im_screen_name_skype);
606 foreach ($relationships as $relatedContactID => $relationship) {
607 $relationshipString = $field = $relationship['relationship_type_id'] . '_a_b';
608 $field = $relationshipString . '_billing_im_screen_name_yahoo';
609 $this->assertEquals('BillingYahoo' . $relatedContactID, $dao->$field);
610 // @todo efforts to output 'im_provider' for related contacts seem to be giving a blank field.
611 }
612 }
613
614 // early return for now until we solve a leakage issue.
615 return;
616
617 $this->assertEquals([
618 'billing_im_provider' => 'billing_im_provider text',
619 'billing_im_screen_name' => 'billing_im_screen_name text',
620 'billing_im_screen_name_jabber' => 'billing_im_screen_name_jabber text',
621 'billing_im_screen_name_skype' => 'billing_im_screen_name_skype text',
622 'billing_im_screen_name_yahoo' => 'billing_im_screen_name_yahoo text',
623 'home_im_provider' => 'home_im_provider text',
624 'home_im_screen_name' => 'home_im_screen_name text',
625 'home_im_screen_name_jabber' => 'home_im_screen_name_jabber text',
626 'home_im_screen_name_skype' => 'home_im_screen_name_skype text',
627 'home_im_screen_name_yahoo' => 'home_im_screen_name_yahoo text',
628 'main_im_provider' => 'main_im_provider text',
629 'main_im_screen_name' => 'main_im_screen_name text',
630 'main_im_screen_name_jabber' => 'main_im_screen_name_jabber text',
631 'main_im_screen_name_skype' => 'main_im_screen_name_skype text',
632 'main_im_screen_name_yahoo' => 'main_im_screen_name_yahoo text',
633 'other_im_provider' => 'other_im_provider text',
634 'other_im_screen_name' => 'other_im_screen_name text',
635 'other_im_screen_name_jabber' => 'other_im_screen_name_jabber text',
636 'other_im_screen_name_skype' => 'other_im_screen_name_skype text',
637 'other_im_screen_name_yahoo' => 'other_im_screen_name_yahoo text',
638 'im_provider' => 'im_provider text',
639 'im' => 'im varchar(64)',
640 'contact_id' => 'contact_id varchar(255)',
641 '2_a_b_im_provider' => '2_a_b_im_provider text',
642 '2_a_b_billing_im_screen_name' => '2_a_b_billing_im_screen_name text',
643 '2_a_b_billing_im_screen_name_jabber' => '2_a_b_billing_im_screen_name_jabber text',
644 '2_a_b_billing_im_screen_name_skype' => '2_a_b_billing_im_screen_name_skype text',
645 '2_a_b_billing_im_screen_name_yahoo' => '2_a_b_billing_im_screen_name_yahoo text',
646 '2_a_b_home_im_screen_name' => '2_a_b_home_im_screen_name text',
647 '2_a_b_home_im_screen_name_jabber' => '2_a_b_home_im_screen_name_jabber text',
648 '2_a_b_home_im_screen_name_skype' => '2_a_b_home_im_screen_name_skype text',
649 '2_a_b_home_im_screen_name_yahoo' => '2_a_b_home_im_screen_name_yahoo text',
650 '2_a_b_main_im_screen_name' => '2_a_b_main_im_screen_name text',
651 '2_a_b_main_im_screen_name_jabber' => '2_a_b_main_im_screen_name_jabber text',
652 '2_a_b_main_im_screen_name_skype' => '2_a_b_main_im_screen_name_skype text',
653 '2_a_b_main_im_screen_name_yahoo' => '2_a_b_main_im_screen_name_yahoo text',
654 '2_a_b_other_im_screen_name' => '2_a_b_other_im_screen_name text',
655 '2_a_b_other_im_screen_name_jabber' => '2_a_b_other_im_screen_name_jabber text',
656 '2_a_b_other_im_screen_name_skype' => '2_a_b_other_im_screen_name_skype text',
657 '2_a_b_other_im_screen_name_yahoo' => '2_a_b_other_im_screen_name_yahoo text',
658 '2_a_b_im' => '2_a_b_im text',
659 '8_a_b_im_provider' => '8_a_b_im_provider text',
660 '8_a_b_billing_im_screen_name' => '8_a_b_billing_im_screen_name text',
661 '8_a_b_billing_im_screen_name_jabber' => '8_a_b_billing_im_screen_name_jabber text',
662 '8_a_b_billing_im_screen_name_skype' => '8_a_b_billing_im_screen_name_skype text',
663 '8_a_b_billing_im_screen_name_yahoo' => '8_a_b_billing_im_screen_name_yahoo text',
664 '8_a_b_home_im_screen_name' => '8_a_b_home_im_screen_name text',
665 '8_a_b_home_im_screen_name_jabber' => '8_a_b_home_im_screen_name_jabber text',
666 '8_a_b_home_im_screen_name_skype' => '8_a_b_home_im_screen_name_skype text',
667 '8_a_b_home_im_screen_name_yahoo' => '8_a_b_home_im_screen_name_yahoo text',
668 '8_a_b_main_im_screen_name' => '8_a_b_main_im_screen_name text',
669 '8_a_b_main_im_screen_name_jabber' => '8_a_b_main_im_screen_name_jabber text',
670 '8_a_b_main_im_screen_name_skype' => '8_a_b_main_im_screen_name_skype text',
671 '8_a_b_main_im_screen_name_yahoo' => '8_a_b_main_im_screen_name_yahoo text',
672 '8_a_b_other_im_screen_name' => '8_a_b_other_im_screen_name text',
673 '8_a_b_other_im_screen_name_jabber' => '8_a_b_other_im_screen_name_jabber text',
674 '8_a_b_other_im_screen_name_skype' => '8_a_b_other_im_screen_name_skype text',
675 '8_a_b_other_im_screen_name_yahoo' => '8_a_b_other_im_screen_name_yahoo text',
676 '8_a_b_im' => '8_a_b_im text',
677 '5_a_b_im_provider' => '5_a_b_im_provider text',
678 '5_a_b_billing_im_screen_name' => '5_a_b_billing_im_screen_name text',
679 '5_a_b_billing_im_screen_name_jabber' => '5_a_b_billing_im_screen_name_jabber text',
680 '5_a_b_billing_im_screen_name_skype' => '5_a_b_billing_im_screen_name_skype text',
681 '5_a_b_billing_im_screen_name_yahoo' => '5_a_b_billing_im_screen_name_yahoo text',
682 '5_a_b_home_im_screen_name' => '5_a_b_home_im_screen_name text',
683 '5_a_b_home_im_screen_name_jabber' => '5_a_b_home_im_screen_name_jabber text',
684 '5_a_b_home_im_screen_name_skype' => '5_a_b_home_im_screen_name_skype text',
685 '5_a_b_home_im_screen_name_yahoo' => '5_a_b_home_im_screen_name_yahoo text',
686 '5_a_b_main_im_screen_name' => '5_a_b_main_im_screen_name text',
687 '5_a_b_main_im_screen_name_jabber' => '5_a_b_main_im_screen_name_jabber text',
688 '5_a_b_main_im_screen_name_skype' => '5_a_b_main_im_screen_name_skype text',
689 '5_a_b_main_im_screen_name_yahoo' => '5_a_b_main_im_screen_name_yahoo text',
690 '5_a_b_other_im_screen_name' => '5_a_b_other_im_screen_name text',
691 '5_a_b_other_im_screen_name_jabber' => '5_a_b_other_im_screen_name_jabber text',
692 '5_a_b_other_im_screen_name_skype' => '5_a_b_other_im_screen_name_skype text',
693 '5_a_b_other_im_screen_name_yahoo' => '5_a_b_other_im_screen_name_yahoo text',
694 '5_a_b_im' => '5_a_b_im text',
695 ], $sqlColumns);
696
697 }
698
699 /**
700 * Test master_address_id field.
701 */
702 public function testExportMasterAddress() {
703 $this->setUpContactExportData();
704
705 //export the master address for contact B
706 $selectedFields = array(
707 array('Individual', 'master_id', 1),
708 );
709 list($tableName, $sqlColumns) = CRM_Export_BAO_Export::exportComponents(
710 TRUE,
711 array($this->contactIDs[1]),
712 array(),
713 NULL,
714 $selectedFields,
715 NULL,
716 CRM_Export_Form_Select::CONTACT_EXPORT,
717 "contact_a.id IN ({$this->contactIDs[1]})",
718 NULL,
719 FALSE,
720 FALSE,
721 array(
722 'exportOption' => CRM_Export_Form_Select::CONTACT_EXPORT,
723 'suppress_csv_for_testing' => TRUE,
724 )
725 );
726 $field = key($sqlColumns);
727
728 //assert the exported result
729 $masterName = CRM_Core_DAO::singleValueQuery("SELECT {$field} FROM {$tableName}");
730 $displayName = CRM_Contact_BAO_Contact::getMasterDisplayName($this->masterAddressID);
731 $this->assertEquals($displayName, $masterName);
732
733 // delete the export temp table and component table
734 $sql = "DROP TABLE IF EXISTS {$tableName}";
735 CRM_Core_DAO::executeQuery($sql);
736 }
737
738 /**
739 * Test that deceased and do not mail contacts are removed from contacts before
740 */
741 public function testExportDeceasedDoNotMail() {
742 $contactA = $this->callAPISuccess('contact', 'create', array(
743 'first_name' => 'John',
744 'last_name' => 'Doe',
745 'contact_type' => 'Individual',
746 ));
747
748 $contactB = $this->callAPISuccess('contact', 'create', array(
749 'first_name' => 'Jane',
750 'last_name' => 'Doe',
751 'contact_type' => 'Individual',
752 'is_deceased' => 1,
753 ));
754
755 //create address for contact A
756 $this->callAPISuccess('address', 'create', array(
757 'contact_id' => $contactA['id'],
758 'location_type_id' => 'Home',
759 'street_address' => 'ABC 12',
760 'postal_code' => '123 AB',
761 'country_id' => '1152',
762 'city' => 'ABC',
763 'is_primary' => 1,
764 ));
765
766 //create address for contact B
767 $this->callAPISuccess('address', 'create', array(
768 'contact_id' => $contactB['id'],
769 'location_type_id' => 'Home',
770 'street_address' => 'ABC 12',
771 'postal_code' => '123 AB',
772 'country_id' => '1152',
773 'city' => 'ABC',
774 'is_primary' => 1,
775 ));
776
777 //export and merge contacts with same address
778 list($tableName, $sqlColumns) = CRM_Export_BAO_Export::exportComponents(
779 TRUE,
780 array($contactA['id'], $contactB['id']),
781 array(),
782 NULL,
783 NULL,
784 NULL,
785 CRM_Export_Form_Select::CONTACT_EXPORT,
786 "contact_a.id IN ({$contactA['id']}, {$contactB['id']})",
787 NULL,
788 TRUE,
789 FALSE,
790 array(
791 'exportOption' => CRM_Export_Form_Select::CONTACT_EXPORT,
792 'mergeOption' => TRUE,
793 'suppress_csv_for_testing' => TRUE,
794 'postal_mailing_export' => array(
795 'postal_mailing_export' => TRUE,
796 ),
797 )
798 );
799
800 $greeting = CRM_Core_DAO::singleValueQuery("SELECT email_greeting FROM {$tableName}");
801
802 //Assert email_greeting is not merged
803 $this->assertNotContains(',', (string) $greeting);
804
805 // delete the export temp table and component table
806 $sql = "DROP TABLE IF EXISTS {$tableName}";
807 CRM_Core_DAO::executeQuery($sql);
808 }
809
810 /**
811 * @return array
812 */
813 protected function setUpHousehold() {
814 $this->setUpContactExportData();
815 $householdID = $this->householdCreate([
816 'api.Address.create' => [
817 'city' => 'Portland',
818 'state_province_id' => 'Maine',
819 'location_type_id' => 'Home'
820 ]
821 ]);
822
823 $relationshipTypes = $this->callAPISuccess('RelationshipType', 'get', [])['values'];
824 $houseHoldTypeID = NULL;
825 foreach ($relationshipTypes as $id => $relationshipType) {
826 if ($relationshipType['name_a_b'] === 'Household Member of') {
827 $houseHoldTypeID = $relationshipType['id'];
828 }
829 }
830 $this->callAPISuccess('Relationship', 'create', [
831 'contact_id_a' => $this->contactIDs[0],
832 'contact_id_b' => $householdID,
833 'relationship_type_id' => $houseHoldTypeID,
834 ]);
835 $this->callAPISuccess('Relationship', 'create', [
836 'contact_id_a' => $this->contactIDs[1],
837 'contact_id_b' => $householdID,
838 'relationship_type_id' => $houseHoldTypeID,
839 ]);
840 return array($householdID, $houseHoldTypeID);
841 }
842
843 /**
844 * @param $selectedFields
845 * @return array
846 */
847 protected function doExport($selectedFields, $id) {
848 list($tableName, $sqlColumns) = CRM_Export_BAO_Export::exportComponents(
849 TRUE,
850 array($id),
851 array(),
852 NULL,
853 $selectedFields,
854 NULL,
855 CRM_Export_Form_Select::CONTACT_EXPORT,
856 "contact_a.id IN ({$id})",
857 NULL,
858 FALSE,
859 FALSE,
860 array(
861 'exportOption' => CRM_Export_Form_Select::CONTACT_EXPORT,
862 'suppress_csv_for_testing' => TRUE,
863 )
864 );
865 return array($tableName, $sqlColumns);
866 }
867
868 /**
869 * Ensure component is enabled.
870 *
871 * @param int $exportMode
872 */
873 public function ensureComponentIsEnabled($exportMode) {
874 if ($exportMode === CRM_Export_Form_Select::CASE_EXPORT) {
875 CRM_Core_BAO_ConfigSetting::enableComponent('CiviCase');
876 }
877 }
878
879 /**
880 * Test our export all field metadata retrieval.
881 *
882 * @dataProvider additionalFieldsDataProvider
883 * @param int $exportMode
884 * @param $expected
885 */
886 public function testAdditionalReturnProperties($exportMode, $expected) {
887 $this->ensureComponentIsEnabled($exportMode);
888 $processor = new CRM_Export_BAO_ExportProcessor($exportMode, NULL, 'AND');
889 $metadata = $processor->getAdditionalReturnProperties();
890 $this->assertEquals($expected, $metadata);
891 }
892
893 /**
894 * Test our export all field metadata retrieval.
895 *
896 * @dataProvider allFieldsDataProvider
897 * @param int $exportMode
898 * @param $expected
899 */
900 public function testDefaultReturnProperties($exportMode, $expected) {
901 $this->ensureComponentIsEnabled($exportMode);
902 $processor = new CRM_Export_BAO_ExportProcessor($exportMode, NULL, 'AND');
903 $metadata = $processor->getDefaultReturnProperties();
904 $this->assertEquals($expected, $metadata);
905 }
906
907 /**
908 * Get fields returned from additionalFields function.
909 *
910 * @return array
911 */
912 public function additionalFieldsDataProvider() {
913 return [
914 [
915 'anything that will then be defaulting ton contact',
916 $this->getExtraReturnProperties(),
917 ],
918 [
919 CRM_Export_Form_Select::ACTIVITY_EXPORT,
920 array_merge($this->getExtraReturnProperties(), $this->getActivityReturnProperties()),
921 ],
922 [
923 CRM_Export_Form_Select::CASE_EXPORT,
924 array_merge($this->getExtraReturnProperties(), $this->getCaseReturnProperties()),
925 ],
926 [
927 CRM_Export_Form_Select::CONTRIBUTE_EXPORT,
928 array_merge($this->getExtraReturnProperties(), $this->getContributionReturnProperties()),
929 ],
930 [
931 CRM_Export_Form_Select::EVENT_EXPORT,
932 array_merge($this->getExtraReturnProperties(), $this->getEventReturnProperties()),
933 ],
934 [
935 CRM_Export_Form_Select::MEMBER_EXPORT,
936 array_merge($this->getExtraReturnProperties(), $this->getMembershipReturnProperties()),
937 ],
938 [
939 CRM_Export_Form_Select::PLEDGE_EXPORT,
940 array_merge($this->getExtraReturnProperties(), $this->getPledgeReturnProperties()),
941 ],
942
943 ];
944 }
945
946 /**
947 * get data for testing field metadata by query mode.
948 */
949 public function allFieldsDataProvider() {
950 return [
951 [
952 'anything that will then be defaulting ton contact',
953 $this->getBasicReturnProperties(TRUE),
954 ],
955 [
956 CRM_Export_Form_Select::ACTIVITY_EXPORT,
957 array_merge($this->getBasicReturnProperties(FALSE), $this->getActivityReturnProperties()),
958 ],
959 [
960 CRM_Export_Form_Select::CASE_EXPORT,
961 array_merge($this->getBasicReturnProperties(FALSE), $this->getCaseReturnProperties()),
962 ],
963 [
964 CRM_Export_Form_Select::CONTRIBUTE_EXPORT,
965 array_merge($this->getBasicReturnProperties(FALSE), $this->getContributionReturnProperties()),
966 ],
967 [
968 CRM_Export_Form_Select::EVENT_EXPORT,
969 array_merge($this->getBasicReturnProperties(FALSE), $this->getEventReturnProperties()),
970 ],
971 [
972 CRM_Export_Form_Select::MEMBER_EXPORT,
973 array_merge($this->getBasicReturnProperties(FALSE), $this->getMembershipReturnProperties()),
974 ],
975 [
976 CRM_Export_Form_Select::PLEDGE_EXPORT,
977 array_merge($this->getBasicReturnProperties(FALSE), $this->getPledgeReturnProperties()),
978 ],
979 ];
980 }
981
982 /**
983 * Get return properties manually added in.
984 */
985 public function getExtraReturnProperties() {
986 return [
987 'location_type' => 1,
988 'im_provider' => 1,
989 'phone_type_id' => 1,
990 'provider_id' => 1,
991 'current_employer' => 1,
992 ];
993 }
994
995 /**
996 * Get basic return properties.
997 *
998 * @bool $isContactMode
999 * Are we in contact mode or not
1000 *
1001 * @return array
1002 */
1003 protected function getBasicReturnProperties($isContactMode) {
1004 $returnProperties = [
1005 'id' => 1,
1006 'contact_type' => 1,
1007 'contact_sub_type' => 1,
1008 'do_not_email' => 1,
1009 'do_not_phone' => 1,
1010 'do_not_mail' => 1,
1011 'do_not_sms' => 1,
1012 'do_not_trade' => 1,
1013 'is_opt_out' => 1,
1014 'legal_identifier' => 1,
1015 'external_identifier' => 1,
1016 'sort_name' => 1,
1017 'display_name' => 1,
1018 'nick_name' => 1,
1019 'legal_name' => 1,
1020 'image_URL' => 1,
1021 'preferred_communication_method' => 1,
1022 'preferred_language' => 1,
1023 'preferred_mail_format' => 1,
1024 'hash' => 1,
1025 'contact_source' => 1,
1026 'first_name' => 1,
1027 'middle_name' => 1,
1028 'last_name' => 1,
1029 'prefix_id' => 1,
1030 'suffix_id' => 1,
1031 'formal_title' => 1,
1032 'communication_style_id' => 1,
1033 'email_greeting_id' => 1,
1034 'postal_greeting_id' => 1,
1035 'addressee_id' => 1,
1036 'job_title' => 1,
1037 'gender_id' => 1,
1038 'birth_date' => 1,
1039 'is_deceased' => 1,
1040 'deceased_date' => 1,
1041 'household_name' => 1,
1042 'organization_name' => 1,
1043 'sic_code' => 1,
1044 'user_unique_id' => 1,
1045 'current_employer_id' => 1,
1046 'contact_is_deleted' => 1,
1047 'created_date' => 1,
1048 'modified_date' => 1,
1049 'addressee' => 1,
1050 'email_greeting' => 1,
1051 'postal_greeting' => 1,
1052 'current_employer' => 1,
1053 'location_type' => 1,
1054 'street_address' => 1,
1055 'street_number' => 1,
1056 'street_number_suffix' => 1,
1057 'street_name' => 1,
1058 'street_unit' => 1,
1059 'supplemental_address_1' => 1,
1060 'supplemental_address_2' => 1,
1061 'supplemental_address_3' => 1,
1062 'city' => 1,
1063 'postal_code_suffix' => 1,
1064 'postal_code' => 1,
1065 'geo_code_1' => 1,
1066 'geo_code_2' => 1,
1067 'address_name' => 1,
1068 'master_id' => 1,
1069 'county' => 1,
1070 'state_province' => 1,
1071 'country' => 1,
1072 'phone' => 1,
1073 'phone_ext' => 1,
1074 'email' => 1,
1075 'on_hold' => 1,
1076 'is_bulkmail' => 1,
1077 'signature_text' => 1,
1078 'signature_html' => 1,
1079 'im_provider' => 1,
1080 'im' => 1,
1081 'openid' => 1,
1082 'world_region' => 1,
1083 'url' => 1,
1084 'groups' => 1,
1085 'tags' => 1,
1086 'notes' => 1,
1087 'phone_type_id' => 1,
1088 'provider_id' => 1,
1089 ];
1090 if (!$isContactMode) {
1091 unset($returnProperties['groups']);
1092 unset($returnProperties['tags']);
1093 unset($returnProperties['notes']);
1094 }
1095 return $returnProperties;
1096 }
1097
1098 /**
1099 * Get return properties for pledges.
1100 *
1101 * @return array
1102 */
1103 public function getPledgeReturnProperties() {
1104 return [
1105 'contact_type' => 1,
1106 'contact_sub_type' => 1,
1107 'sort_name' => 1,
1108 'display_name' => 1,
1109 'pledge_id' => 1,
1110 'pledge_amount' => 1,
1111 'pledge_total_paid' => 1,
1112 'pledge_create_date' => 1,
1113 'pledge_start_date' => 1,
1114 'pledge_next_pay_date' => 1,
1115 'pledge_next_pay_amount' => 1,
1116 'pledge_status' => 1,
1117 'pledge_is_test' => 1,
1118 'pledge_contribution_page_id' => 1,
1119 'pledge_financial_type' => 1,
1120 'pledge_frequency_interval' => 1,
1121 'pledge_frequency_unit' => 1,
1122 'pledge_currency' => 1,
1123 'pledge_campaign_id' => 1,
1124 'pledge_balance_amount' => 1,
1125 'pledge_payment_id' => 1,
1126 'pledge_payment_scheduled_amount' => 1,
1127 'pledge_payment_scheduled_date' => 1,
1128 'pledge_payment_paid_amount' => 1,
1129 'pledge_payment_paid_date' => 1,
1130 'pledge_payment_reminder_date' => 1,
1131 'pledge_payment_reminder_count' => 1,
1132 'pledge_payment_status' => 1,
1133 ];
1134 }
1135
1136 /**
1137 * Get membership return properties.
1138 *
1139 * @return array
1140 */
1141 public function getMembershipReturnProperties() {
1142 return [
1143 'location_type' => 1,
1144 'im_provider' => 1,
1145 'phone_type_id' => 1,
1146 'provider_id' => 1,
1147 'current_employer' => 1,
1148 'contact_type' => 1,
1149 'contact_sub_type' => 1,
1150 'sort_name' => 1,
1151 'display_name' => 1,
1152 'membership_type' => 1,
1153 'member_is_test' => 1,
1154 'member_is_pay_later' => 1,
1155 'join_date' => 1,
1156 'membership_start_date' => 1,
1157 'membership_end_date' => 1,
1158 'membership_source' => 1,
1159 'membership_status' => 1,
1160 'membership_id' => 1,
1161 'owner_membership_id' => 1,
1162 'max_related' => 1,
1163 'membership_recur_id' => 1,
1164 'member_campaign_id' => 1,
1165 'member_is_override' => 1,
1166 'member_auto_renew' => 1,
1167 ];
1168 }
1169
1170 /**
1171 * Get return properties for events.
1172 *
1173 * @return array
1174 */
1175 public function getEventReturnProperties() {
1176 return [
1177 'contact_type' => 1,
1178 'contact_sub_type' => 1,
1179 'sort_name' => 1,
1180 'display_name' => 1,
1181 'event_id' => 1,
1182 'event_title' => 1,
1183 'event_start_date' => 1,
1184 'event_end_date' => 1,
1185 'event_type' => 1,
1186 'participant_id' => 1,
1187 'participant_status' => 1,
1188 'participant_status_id' => 1,
1189 'participant_role' => 1,
1190 'participant_role_id' => 1,
1191 'participant_note' => 1,
1192 'participant_register_date' => 1,
1193 'participant_source' => 1,
1194 'participant_fee_level' => 1,
1195 'participant_is_test' => 1,
1196 'participant_is_pay_later' => 1,
1197 'participant_fee_amount' => 1,
1198 'participant_discount_name' => 1,
1199 'participant_fee_currency' => 1,
1200 'participant_registered_by_id' => 1,
1201 'participant_campaign_id' => 1,
1202 ];
1203 }
1204
1205 /**
1206 * Get return properties for activities.
1207 *
1208 * @return array
1209 */
1210 public function getActivityReturnProperties() {
1211 return [
1212 'activity_id' => 1,
1213 'contact_type' => 1,
1214 'contact_sub_type' => 1,
1215 'sort_name' => 1,
1216 'display_name' => 1,
1217 'activity_type' => 1,
1218 'activity_type_id' => 1,
1219 'activity_subject' => 1,
1220 'activity_date_time' => 1,
1221 'activity_duration' => 1,
1222 'activity_location' => 1,
1223 'activity_details' => 1,
1224 'activity_status' => 1,
1225 'activity_priority' => 1,
1226 'source_contact' => 1,
1227 'source_record_id' => 1,
1228 'activity_is_test' => 1,
1229 'activity_campaign_id' => 1,
1230 'result' => 1,
1231 'activity_engagement_level' => 1,
1232 'parent_id' => 1,
1233 ];
1234 }
1235
1236 /**
1237 * Get return properties for Case.
1238 *
1239 * @return array
1240 */
1241 public function getCaseReturnProperties() {
1242 return [
1243 'contact_type' => 1,
1244 'contact_sub_type' => 1,
1245 'sort_name' => 1,
1246 'display_name' => 1,
1247 'phone' => 1,
1248 'case_start_date' => 1,
1249 'case_end_date' => 1,
1250 'case_subject' => 1,
1251 'case_source_contact_id' => 1,
1252 'case_activity_status' => 1,
1253 'case_activity_duration' => 1,
1254 'case_activity_medium_id' => 1,
1255 'case_activity_details' => 1,
1256 'case_activity_is_auto' => 1,
1257 'contact_id' => 1,
1258 'case_id' => 1,
1259 'case_activity_subject' => 1,
1260 'case_status' => 1,
1261 'case_type' => 1,
1262 'case_role' => 1,
1263 'case_deleted' => 1,
1264 'case_recent_activity_date' => 1,
1265 'case_recent_activity_type' => 1,
1266 'case_scheduled_activity_date' => 1,
1267 ];
1268 }
1269
1270 /**
1271 * Get return properties for contribution.
1272 *
1273 * @return array
1274 */
1275 public function getContributionReturnProperties() {
1276 return [
1277 'contact_type' => 1,
1278 'contact_sub_type' => 1,
1279 'sort_name' => 1,
1280 'display_name' => 1,
1281 'financial_type' => 1,
1282 'contribution_source' => 1,
1283 'receive_date' => 1,
1284 'thankyou_date' => 1,
1285 'cancel_date' => 1,
1286 'total_amount' => 1,
1287 'accounting_code' => 1,
1288 'payment_instrument' => 1,
1289 'payment_instrument_id' => 1,
1290 'contribution_check_number' => 1,
1291 'non_deductible_amount' => 1,
1292 'fee_amount' => 1,
1293 'net_amount' => 1,
1294 'trxn_id' => 1,
1295 'invoice_id' => 1,
1296 'invoice_number' => 1,
1297 'currency' => 1,
1298 'cancel_reason' => 1,
1299 'receipt_date' => 1,
1300 'product_name' => 1,
1301 'sku' => 1,
1302 'product_option' => 1,
1303 'fulfilled_date' => 1,
1304 'contribution_start_date' => 1,
1305 'contribution_end_date' => 1,
1306 'is_test' => 1,
1307 'is_pay_later' => 1,
1308 'contribution_status' => 1,
1309 'contribution_recur_id' => 1,
1310 'amount_level' => 1,
1311 'contribution_note' => 1,
1312 'contribution_batch' => 1,
1313 'contribution_campaign_title' => 1,
1314 'contribution_campaign_id' => 1,
1315 'contribution_product_id' => 1,
1316 'contribution_soft_credit_name' => 1,
1317 'contribution_soft_credit_amount' => 1,
1318 'contribution_soft_credit_type' => 1,
1319 'contribution_soft_credit_contact_id' => 1,
1320 'contribution_soft_credit_contribution_id' => 1,
1321 ];
1322 }
1323
1324 /**
1325 * Test the column definition when 'all' fields defined.
1326 *
1327 * @param $exportMode
1328 * @param $expected
1329 *
1330 * @dataProvider getSqlColumnsOutput
1331 */
1332 public function testGetSQLColumns($exportMode, $expected) {
1333 $this->ensureComponentIsEnabled($exportMode);
1334 // We need some data so that we can get to the end of the export
1335 // function. Hopefully one day that won't be required to get metadata info out.
1336 // eventually aspire to call $provider->getSQLColumns straight after it
1337 // is intiated.
1338 $this->setupBaseExportData($exportMode);
1339
1340 $result = CRM_Export_BAO_Export::exportComponents(
1341 TRUE,
1342 [1],
1343 [],
1344 NULL,
1345 NULL,
1346 NULL,
1347 $exportMode,
1348 NULL,
1349 NULL,
1350 FALSE,
1351 FALSE,
1352 array(
1353 'exportOption' => CRM_Export_Form_Select::CONTRIBUTE_EXPORT,
1354 'suppress_csv_for_testing' => TRUE,
1355 )
1356 );
1357 $this->assertEquals($expected, $result[1]);
1358 }
1359
1360 /**
1361 * @param string $exportMode
1362 */
1363 public function setupBaseExportData($exportMode) {
1364 $this->createLoggedInUser();
1365 if ($exportMode === CRM_Export_Form_Select::CASE_EXPORT) {
1366 $this->setupCaseExportData();
1367 }
1368 if ($exportMode === CRM_Export_Form_Select::CONTRIBUTE_EXPORT) {
1369 $this->setUpContributionExportData();
1370 }
1371 if ($exportMode === CRM_Export_Form_Select::MEMBER_EXPORT) {
1372 $this->setUpMembershipExportData();
1373 }
1374 if ($exportMode === CRM_Export_Form_Select::ACTIVITY_EXPORT) {
1375 $this->setUpActivityExportData();
1376 }
1377 }
1378
1379 /**
1380 * Get comprehensive sql columns output.
1381 *
1382 * @return array
1383 */
1384 public function getSqlColumnsOutput() {
1385 return [
1386 [
1387 'anything that will then be defaulting ton contact',
1388 $this->getBasicSqlColumnDefinition(TRUE),
1389 ],
1390 [
1391 CRM_Export_Form_Select::ACTIVITY_EXPORT,
1392 array_merge($this->getBasicSqlColumnDefinition(FALSE), $this->getActivitySqlColumns()),
1393 ],
1394 [
1395 CRM_Export_Form_Select::CASE_EXPORT,
1396 array_merge($this->getBasicSqlColumnDefinition(FALSE), $this->getCaseSqlColumns()),
1397 ],
1398 [
1399 CRM_Export_Form_Select::CONTRIBUTE_EXPORT,
1400 array_merge($this->getBasicSqlColumnDefinition(FALSE), $this->getContributionSqlColumns()),
1401 ],
1402 [
1403 CRM_Export_Form_Select::EVENT_EXPORT,
1404 array_merge($this->getBasicSqlColumnDefinition(FALSE), $this->getParticipantSqlColumns()),
1405 ],
1406 [
1407 CRM_Export_Form_Select::MEMBER_EXPORT,
1408 array_merge($this->getBasicSqlColumnDefinition(FALSE), $this->getMembershipSqlColumns()),
1409 ],
1410 [
1411 CRM_Export_Form_Select::PLEDGE_EXPORT,
1412 array_merge($this->getBasicSqlColumnDefinition(FALSE), $this->getPledgeSqlColumns()),
1413 ],
1414
1415 ];
1416 }
1417
1418 /**
1419 * Get the column definition for exports.
1420 *
1421 * @param bool $isContactExport
1422 *
1423 * @return array
1424 */
1425 protected function getBasicSqlColumnDefinition($isContactExport) {
1426 $columns = [
1427 'civicrm_primary_id' => 'civicrm_primary_id varchar(16)',
1428 'contact_type' => 'contact_type varchar(64)',
1429 'contact_sub_type' => 'contact_sub_type varchar(255)',
1430 'do_not_email' => 'do_not_email varchar(16)',
1431 'do_not_phone' => 'do_not_phone varchar(16)',
1432 'do_not_mail' => 'do_not_mail varchar(16)',
1433 'do_not_sms' => 'do_not_sms varchar(16)',
1434 'do_not_trade' => 'do_not_trade varchar(16)',
1435 'is_opt_out' => 'is_opt_out varchar(16)',
1436 'legal_identifier' => 'legal_identifier varchar(32)',
1437 'external_identifier' => 'external_identifier varchar(64)',
1438 'sort_name' => 'sort_name varchar(128)',
1439 'display_name' => 'display_name varchar(128)',
1440 'nick_name' => 'nick_name varchar(128)',
1441 'legal_name' => 'legal_name varchar(128)',
1442 'image_url' => 'image_url longtext',
1443 'preferred_communication_method' => 'preferred_communication_method varchar(255)',
1444 'preferred_language' => 'preferred_language varchar(5)',
1445 'preferred_mail_format' => 'preferred_mail_format varchar(8)',
1446 'hash' => 'hash varchar(32)',
1447 'contact_source' => 'contact_source varchar(255)',
1448 'first_name' => 'first_name varchar(64)',
1449 'middle_name' => 'middle_name varchar(64)',
1450 'last_name' => 'last_name varchar(64)',
1451 'prefix_id' => 'prefix_id varchar(255)',
1452 'suffix_id' => 'suffix_id varchar(255)',
1453 'formal_title' => 'formal_title varchar(64)',
1454 'communication_style_id' => 'communication_style_id varchar(16)',
1455 'email_greeting_id' => 'email_greeting_id varchar(16)',
1456 'postal_greeting_id' => 'postal_greeting_id varchar(16)',
1457 'addressee_id' => 'addressee_id varchar(16)',
1458 'job_title' => 'job_title varchar(255)',
1459 'gender_id' => 'gender_id varchar(16)',
1460 'birth_date' => 'birth_date varchar(32)',
1461 'is_deceased' => 'is_deceased varchar(16)',
1462 'deceased_date' => 'deceased_date varchar(32)',
1463 'household_name' => 'household_name varchar(128)',
1464 'organization_name' => 'organization_name varchar(128)',
1465 'sic_code' => 'sic_code varchar(8)',
1466 'user_unique_id' => 'user_unique_id varchar(255)',
1467 'current_employer_id' => 'current_employer_id varchar(16)',
1468 'contact_is_deleted' => 'contact_is_deleted varchar(16)',
1469 'created_date' => 'created_date varchar(32)',
1470 'modified_date' => 'modified_date varchar(32)',
1471 'addressee' => 'addressee varchar(255)',
1472 'email_greeting' => 'email_greeting varchar(255)',
1473 'postal_greeting' => 'postal_greeting varchar(255)',
1474 'current_employer' => 'current_employer varchar(128)',
1475 'location_type' => 'location_type text',
1476 'street_address' => 'street_address varchar(96)',
1477 'street_number' => 'street_number varchar(16)',
1478 'street_number_suffix' => 'street_number_suffix varchar(8)',
1479 'street_name' => 'street_name varchar(64)',
1480 'street_unit' => 'street_unit varchar(16)',
1481 'supplemental_address_1' => 'supplemental_address_1 varchar(96)',
1482 'supplemental_address_2' => 'supplemental_address_2 varchar(96)',
1483 'supplemental_address_3' => 'supplemental_address_3 varchar(96)',
1484 'city' => 'city varchar(64)',
1485 'postal_code_suffix' => 'postal_code_suffix varchar(12)',
1486 'postal_code' => 'postal_code varchar(64)',
1487 'geo_code_1' => 'geo_code_1 varchar(32)',
1488 'geo_code_2' => 'geo_code_2 varchar(32)',
1489 'address_name' => 'address_name varchar(255)',
1490 'master_id' => 'master_id varchar(128)',
1491 'county' => 'county varchar(64)',
1492 'state_province' => 'state_province varchar(64)',
1493 'country' => 'country varchar(64)',
1494 'phone' => 'phone varchar(32)',
1495 'phone_ext' => 'phone_ext varchar(16)',
1496 'email' => 'email varchar(254)',
1497 'on_hold' => 'on_hold varchar(16)',
1498 'is_bulkmail' => 'is_bulkmail varchar(16)',
1499 'signature_text' => 'signature_text longtext',
1500 'signature_html' => 'signature_html longtext',
1501 'im_provider' => 'im_provider text',
1502 'im' => 'im varchar(64)',
1503 'openid' => 'openid varchar(255)',
1504 'world_region' => 'world_region varchar(128)',
1505 'url' => 'url varchar(128)',
1506 'groups' => 'groups text',
1507 'tags' => 'tags text',
1508 'notes' => 'notes text',
1509 'phone_type_id' => 'phone_type_id varchar(255)',
1510 'provider_id' => 'provider_id varchar(255)',
1511 ];
1512 if (!$isContactExport) {
1513 unset($columns['groups']);
1514 unset($columns['tags']);
1515 unset($columns['notes']);
1516 }
1517 return $columns;
1518 }
1519
1520 /**
1521 * Get Case SQL columns.
1522 *
1523 * @return array
1524 */
1525 protected function getCaseSqlColumns() {
1526 return [
1527 'case_start_date' => 'case_start_date varchar(32)',
1528 'case_end_date' => 'case_end_date varchar(32)',
1529 'case_subject' => 'case_subject varchar(128)',
1530 'case_source_contact_id' => 'case_source_contact_id varchar(255)',
1531 'case_activity_status' => 'case_activity_status text',
1532 'case_activity_duration' => 'case_activity_duration text',
1533 'case_activity_medium_id' => 'case_activity_medium_id varchar(255)',
1534 'case_activity_details' => 'case_activity_details text',
1535 'case_activity_is_auto' => 'case_activity_is_auto text',
1536 'contact_id' => 'contact_id varchar(255)',
1537 'case_id' => 'case_id varchar(16)',
1538 'case_activity_subject' => 'case_activity_subject text',
1539 'case_status' => 'case_status text',
1540 'case_type' => 'case_type text',
1541 'case_role' => 'case_role text',
1542 'case_deleted' => 'case_deleted varchar(16)',
1543 'case_recent_activity_date' => 'case_recent_activity_date text',
1544 'case_recent_activity_type' => 'case_recent_activity_type text',
1545 'case_scheduled_activity_date' => 'case_scheduled_activity_date text',
1546 ];
1547 }
1548
1549 /**
1550 * Get activity sql columns.
1551 *
1552 * @return array
1553 */
1554 protected function getActivitySqlColumns() {
1555 return [
1556 'activity_id' => 'activity_id varchar(16)',
1557 'activity_type' => 'activity_type varchar(255)',
1558 'activity_type_id' => 'activity_type_id varchar(16)',
1559 'activity_subject' => 'activity_subject varchar(255)',
1560 'activity_date_time' => 'activity_date_time varchar(32)',
1561 'activity_duration' => 'activity_duration varchar(16)',
1562 'activity_location' => 'activity_location varchar(255)',
1563 'activity_details' => 'activity_details longtext',
1564 'activity_status' => 'activity_status varchar(255)',
1565 'activity_priority' => 'activity_priority varchar(255)',
1566 'source_contact' => 'source_contact varchar(255)',
1567 'source_record_id' => 'source_record_id varchar(255)',
1568 'activity_is_test' => 'activity_is_test varchar(16)',
1569 'activity_campaign_id' => 'activity_campaign_id varchar(128)',
1570 'result' => 'result text',
1571 'activity_engagement_level' => 'activity_engagement_level varchar(16)',
1572 'parent_id' => 'parent_id varchar(255)',
1573 ];
1574 }
1575
1576 /**
1577 * Get participant sql columns.
1578 *
1579 * @return array
1580 */
1581 protected function getParticipantSqlColumns() {
1582 return [
1583 'event_id' => 'event_id varchar(16)',
1584 'event_title' => 'event_title varchar(255)',
1585 'event_start_date' => 'event_start_date varchar(32)',
1586 'event_end_date' => 'event_end_date varchar(32)',
1587 'event_type' => 'event_type varchar(255)',
1588 'participant_id' => 'participant_id varchar(16)',
1589 'participant_status' => 'participant_status varchar(255)',
1590 'participant_status_id' => 'participant_status_id varchar(16)',
1591 'participant_role' => 'participant_role varchar(255)',
1592 'participant_role_id' => 'participant_role_id varchar(128)',
1593 'participant_note' => 'participant_note text',
1594 'participant_register_date' => 'participant_register_date varchar(32)',
1595 'participant_source' => 'participant_source varchar(128)',
1596 'participant_fee_level' => 'participant_fee_level longtext',
1597 'participant_is_test' => 'participant_is_test varchar(16)',
1598 'participant_is_pay_later' => 'participant_is_pay_later varchar(16)',
1599 'participant_fee_amount' => 'participant_fee_amount varchar(32)',
1600 'participant_discount_name' => 'participant_discount_name varchar(16)',
1601 'participant_fee_currency' => 'participant_fee_currency varchar(3)',
1602 'participant_registered_by_id' => 'participant_registered_by_id varchar(16)',
1603 'participant_campaign_id' => 'participant_campaign_id varchar(128)',
1604 ];
1605 }
1606
1607 /**
1608 * Get contribution sql columns.
1609 *
1610 * @return array
1611 */
1612 public function getContributionSqlColumns() {
1613 return [
1614 'civicrm_primary_id' => 'civicrm_primary_id varchar(16)',
1615 'contact_type' => 'contact_type varchar(64)',
1616 'contact_sub_type' => 'contact_sub_type varchar(255)',
1617 'do_not_email' => 'do_not_email varchar(16)',
1618 'do_not_phone' => 'do_not_phone varchar(16)',
1619 'do_not_mail' => 'do_not_mail varchar(16)',
1620 'do_not_sms' => 'do_not_sms varchar(16)',
1621 'do_not_trade' => 'do_not_trade varchar(16)',
1622 'is_opt_out' => 'is_opt_out varchar(16)',
1623 'legal_identifier' => 'legal_identifier varchar(32)',
1624 'external_identifier' => 'external_identifier varchar(64)',
1625 'sort_name' => 'sort_name varchar(128)',
1626 'display_name' => 'display_name varchar(128)',
1627 'nick_name' => 'nick_name varchar(128)',
1628 'legal_name' => 'legal_name varchar(128)',
1629 'image_url' => 'image_url longtext',
1630 'preferred_communication_method' => 'preferred_communication_method varchar(255)',
1631 'preferred_language' => 'preferred_language varchar(5)',
1632 'preferred_mail_format' => 'preferred_mail_format varchar(8)',
1633 'hash' => 'hash varchar(32)',
1634 'contact_source' => 'contact_source varchar(255)',
1635 'first_name' => 'first_name varchar(64)',
1636 'middle_name' => 'middle_name varchar(64)',
1637 'last_name' => 'last_name varchar(64)',
1638 'prefix_id' => 'prefix_id varchar(255)',
1639 'suffix_id' => 'suffix_id varchar(255)',
1640 'formal_title' => 'formal_title varchar(64)',
1641 'communication_style_id' => 'communication_style_id varchar(16)',
1642 'email_greeting_id' => 'email_greeting_id varchar(16)',
1643 'postal_greeting_id' => 'postal_greeting_id varchar(16)',
1644 'addressee_id' => 'addressee_id varchar(16)',
1645 'job_title' => 'job_title varchar(255)',
1646 'gender_id' => 'gender_id varchar(16)',
1647 'birth_date' => 'birth_date varchar(32)',
1648 'is_deceased' => 'is_deceased varchar(16)',
1649 'deceased_date' => 'deceased_date varchar(32)',
1650 'household_name' => 'household_name varchar(128)',
1651 'organization_name' => 'organization_name varchar(128)',
1652 'sic_code' => 'sic_code varchar(8)',
1653 'user_unique_id' => 'user_unique_id varchar(255)',
1654 'current_employer_id' => 'current_employer_id varchar(16)',
1655 'contact_is_deleted' => 'contact_is_deleted varchar(16)',
1656 'created_date' => 'created_date varchar(32)',
1657 'modified_date' => 'modified_date varchar(32)',
1658 'addressee' => 'addressee varchar(255)',
1659 'email_greeting' => 'email_greeting varchar(255)',
1660 'postal_greeting' => 'postal_greeting varchar(255)',
1661 'current_employer' => 'current_employer varchar(128)',
1662 'location_type' => 'location_type text',
1663 'street_address' => 'street_address varchar(96)',
1664 'street_number' => 'street_number varchar(16)',
1665 'street_number_suffix' => 'street_number_suffix varchar(8)',
1666 'street_name' => 'street_name varchar(64)',
1667 'street_unit' => 'street_unit varchar(16)',
1668 'supplemental_address_1' => 'supplemental_address_1 varchar(96)',
1669 'supplemental_address_2' => 'supplemental_address_2 varchar(96)',
1670 'supplemental_address_3' => 'supplemental_address_3 varchar(96)',
1671 'city' => 'city varchar(64)',
1672 'postal_code_suffix' => 'postal_code_suffix varchar(12)',
1673 'postal_code' => 'postal_code varchar(64)',
1674 'geo_code_1' => 'geo_code_1 varchar(32)',
1675 'geo_code_2' => 'geo_code_2 varchar(32)',
1676 'address_name' => 'address_name varchar(255)',
1677 'master_id' => 'master_id varchar(128)',
1678 'county' => 'county varchar(64)',
1679 'state_province' => 'state_province varchar(64)',
1680 'country' => 'country varchar(64)',
1681 'phone' => 'phone varchar(32)',
1682 'phone_ext' => 'phone_ext varchar(16)',
1683 'email' => 'email varchar(254)',
1684 'on_hold' => 'on_hold varchar(16)',
1685 'is_bulkmail' => 'is_bulkmail varchar(16)',
1686 'signature_text' => 'signature_text longtext',
1687 'signature_html' => 'signature_html longtext',
1688 'im_provider' => 'im_provider text',
1689 'im' => 'im varchar(64)',
1690 'openid' => 'openid varchar(255)',
1691 'world_region' => 'world_region varchar(128)',
1692 'url' => 'url varchar(128)',
1693 'phone_type_id' => 'phone_type_id varchar(255)',
1694 'provider_id' => 'provider_id varchar(255)',
1695 'financial_type' => 'financial_type varchar(64)',
1696 'contribution_source' => 'contribution_source varchar(255)',
1697 'receive_date' => 'receive_date varchar(32)',
1698 'thankyou_date' => 'thankyou_date varchar(32)',
1699 'cancel_date' => 'cancel_date varchar(32)',
1700 'total_amount' => 'total_amount varchar(32)',
1701 'accounting_code' => 'accounting_code varchar(64)',
1702 'payment_instrument' => 'payment_instrument text',
1703 'payment_instrument_id' => 'payment_instrument_id varchar(16)',
1704 'contribution_check_number' => 'contribution_check_number varchar(255)',
1705 'non_deductible_amount' => 'non_deductible_amount varchar(32)',
1706 'fee_amount' => 'fee_amount varchar(32)',
1707 'net_amount' => 'net_amount varchar(32)',
1708 'trxn_id' => 'trxn_id varchar(255)',
1709 'invoice_id' => 'invoice_id varchar(255)',
1710 'invoice_number' => 'invoice_number varchar(255)',
1711 'currency' => 'currency varchar(3)',
1712 'cancel_reason' => 'cancel_reason longtext',
1713 'receipt_date' => 'receipt_date varchar(32)',
1714 'product_name' => 'product_name varchar(255)',
1715 'sku' => 'sku varchar(50)',
1716 'product_option' => 'product_option varchar(255)',
1717 'fulfilled_date' => 'fulfilled_date varchar(32)',
1718 'contribution_start_date' => 'contribution_start_date varchar(32)',
1719 'contribution_end_date' => 'contribution_end_date varchar(32)',
1720 'is_test' => 'is_test varchar(16)',
1721 'is_pay_later' => 'is_pay_later varchar(16)',
1722 'contribution_status' => 'contribution_status text',
1723 'contribution_recur_id' => 'contribution_recur_id varchar(16)',
1724 'amount_level' => 'amount_level longtext',
1725 'contribution_note' => 'contribution_note text',
1726 'contribution_batch' => 'contribution_batch text',
1727 'contribution_campaign_title' => 'contribution_campaign_title varchar(255)',
1728 'contribution_campaign_id' => 'contribution_campaign_id varchar(128)',
1729 'contribution_product_id' => 'contribution_product_id varchar(255)',
1730 'contribution_soft_credit_name' => 'contribution_soft_credit_name varchar(255)',
1731 'contribution_soft_credit_amount' => 'contribution_soft_credit_amount varchar(255)',
1732 'contribution_soft_credit_type' => 'contribution_soft_credit_type varchar(255)',
1733 'contribution_soft_credit_contact_id' => 'contribution_soft_credit_contact_id varchar(255)',
1734 'contribution_soft_credit_contribution_id' => 'contribution_soft_credit_contribution_id varchar(255)',
1735 ];
1736 }
1737
1738 /**
1739 * Get pledge sql columns.
1740 *
1741 * @return array
1742 */
1743 public function getPledgeSqlColumns() {
1744 return [
1745 'pledge_id' => 'pledge_id varchar(16)',
1746 'pledge_amount' => 'pledge_amount varchar(32)',
1747 'pledge_total_paid' => 'pledge_total_paid text',
1748 'pledge_create_date' => 'pledge_create_date varchar(32)',
1749 'pledge_start_date' => 'pledge_start_date text',
1750 'pledge_next_pay_date' => 'pledge_next_pay_date text',
1751 'pledge_next_pay_amount' => 'pledge_next_pay_amount text',
1752 'pledge_status' => 'pledge_status varchar(255)',
1753 'pledge_is_test' => 'pledge_is_test varchar(16)',
1754 'pledge_contribution_page_id' => 'pledge_contribution_page_id varchar(255)',
1755 'pledge_financial_type' => 'pledge_financial_type text',
1756 'pledge_frequency_interval' => 'pledge_frequency_interval varchar(255)',
1757 'pledge_frequency_unit' => 'pledge_frequency_unit varchar(255)',
1758 'pledge_currency' => 'pledge_currency text',
1759 'pledge_campaign_id' => 'pledge_campaign_id varchar(128)',
1760 'pledge_balance_amount' => 'pledge_balance_amount text',
1761 'pledge_payment_id' => 'pledge_payment_id varchar(16)',
1762 'pledge_payment_scheduled_amount' => 'pledge_payment_scheduled_amount varchar(32)',
1763 'pledge_payment_scheduled_date' => 'pledge_payment_scheduled_date varchar(32)',
1764 'pledge_payment_paid_amount' => 'pledge_payment_paid_amount text',
1765 'pledge_payment_paid_date' => 'pledge_payment_paid_date text',
1766 'pledge_payment_reminder_date' => 'pledge_payment_reminder_date varchar(32)',
1767 'pledge_payment_reminder_count' => 'pledge_payment_reminder_count varchar(16)',
1768 'pledge_payment_status' => 'pledge_payment_status varchar(255)',
1769 ];
1770 }
1771
1772 /**
1773 * Get membership sql columns.
1774 *
1775 * @return array
1776 */
1777 public function getMembershipSqlColumns() {
1778 return [
1779 'membership_type' => 'membership_type varchar(128)',
1780 'member_is_test' => 'member_is_test varchar(16)',
1781 'member_is_pay_later' => 'member_is_pay_later varchar(16)',
1782 'join_date' => 'join_date varchar(32)',
1783 'membership_start_date' => 'membership_start_date varchar(32)',
1784 'membership_end_date' => 'membership_end_date varchar(32)',
1785 'membership_source' => 'membership_source varchar(128)',
1786 'membership_status' => 'membership_status varchar(255)',
1787 'membership_id' => 'membership_id varchar(16)',
1788 'owner_membership_id' => 'owner_membership_id varchar(16)',
1789 'max_related' => 'max_related text',
1790 'membership_recur_id' => 'membership_recur_id varchar(255)',
1791 'member_campaign_id' => 'member_campaign_id varchar(128)',
1792 'member_is_override' => 'member_is_override text',
1793 'member_auto_renew' => 'member_auto_renew text',
1794 ];
1795 }
1796
1797 }