Merge pull request #13883 from agh1/grantdetailgroupby
[civicrm-core.git] / tests / phpunit / CRM / Export / BAO / ExportTest.php
CommitLineData
ef51caa8 1<?php
ef51caa8 2
3/**
4 * Class CRM_Core_DAOTest
acb109b7 5 * @group headless
ef51caa8 6 */
7class CRM_Export_BAO_ExportTest extends CiviUnitTestCase {
8
12a36993 9 /**
10 * Contact IDs created for testing.
11 *
12 * @var array
13 */
c7224305 14 protected $contactIDs = [];
12a36993 15
16 /**
17 * Contribution IDs created for testing.
18 *
19 * @var array
20 */
c7224305 21 protected $contributionIDs = [];
22
23 /**
24 * Contribution IDs created for testing.
25 *
26 * @var array
27 */
28 protected $activityIDs = [];
12a36993 29
0a3b035f 30
31 /**
32 * Contribution IDs created for testing.
33 *
34 * @var array
35 */
36 protected $membershipIDs = [];
37
77544f6f
SV
38 /**
39 * Master Address ID created for testing.
40 *
41 * @var int
42 */
43 protected $masterAddressID;
44
a16a432a 45 protected $locationTypes = [];
46
4d251131 47 public function tearDown() {
0a3b035f 48 $this->quickCleanup([
49 'civicrm_contact',
50 'civicrm_email',
51 'civicrm_address',
52 'civicrm_relationship',
53 'civicrm_membership',
54 'civicrm_case',
55 'civicrm_case_contact',
56 'civicrm_case_activity',
57 ]);
bab4f15e 58 $this->quickCleanUpFinancialEntities();
a16a432a 59 if (!empty($this->locationTypes)) {
60 $this->callAPISuccess('LocationType', 'delete', ['id' => $this->locationTypes['Whare Kai']['id']]);
61 $this->callAPISuccess('LocationType', 'create', ['id' => $this->locationTypes['Main']['id'], 'name' => 'Main']);
62 }
4d251131 63 parent::tearDown();
64 }
65
ef51caa8 66 /**
67 * Basic test to ensure the exportComponents function completes without error.
68 */
12a36993 69 public function testExportComponentsNull() {
71464b73 70 list($tableName) = CRM_Export_BAO_Export::exportComponents(
ef51caa8 71 TRUE,
72 array(),
73 array(),
74 NULL,
75 NULL,
76 NULL,
77 CRM_Export_Form_Select::CONTACT_EXPORT,
78 NULL,
79 NULL,
80 FALSE,
81 FALSE,
82 array(
83 'exportOption' => 1,
84 'suppress_csv_for_testing' => TRUE,
85 )
86 );
994a070c 87
88 // delete the export temp table and component table
89 $sql = "DROP TABLE IF EXISTS {$tableName}";
90 CRM_Core_DAO::executeQuery($sql);
ef51caa8 91 }
12a36993 92
93 /**
94 * Basic test to ensure the exportComponents function can export selected fields for contribution.
95 */
96 public function testExportComponentsContribution() {
97 $this->setUpContributionExportData();
98 $selectedFields = array(
99 array('Individual', 'first_name'),
100 array('Individual', 'last_name'),
101 array('Contribution', 'receive_date'),
102 array('Contribution', 'contribution_source'),
103 array('Individual', 'street_address', 1),
104 array('Individual', 'city', 1),
105 array('Individual', 'country', 1),
106 array('Individual', 'email', 1),
107 array('Contribution', 'trxn_id'),
108 );
994a070c 109
704e3e9a 110 list($tableName) = CRM_Export_BAO_Export::exportComponents(
12a36993 111 TRUE,
112 $this->contributionIDs,
113 array(),
114 'receive_date desc',
115 $selectedFields,
116 NULL,
117 CRM_Export_Form_Select::CONTRIBUTE_EXPORT,
118 'civicrm_contribution.id IN ( ' . implode(',', $this->contributionIDs) . ')',
119 NULL,
120 FALSE,
121 FALSE,
122 array(
123 'exportOption' => CRM_Export_Form_Select::CONTRIBUTE_EXPORT,
124 'suppress_csv_for_testing' => TRUE,
125 )
126 );
994a070c 127
128 // delete the export temp table and component table
129 $sql = "DROP TABLE IF EXISTS {$tableName}";
130 CRM_Core_DAO::executeQuery($sql);
12a36993 131 }
c7224305 132
18711469 133 /**
134 * Basic test to ensure the exportComponents function can export selected fields for contribution.
135 */
136 public function testExportComponentsMembership() {
137 $this->setUpMembershipExportData();
138 list($tableName) = CRM_Export_BAO_Export::exportComponents(
139 TRUE,
140 $this->membershipIDs,
141 [],
142 NULL,
143 NULL,
144 NULL,
145 CRM_Export_Form_Select::MEMBER_EXPORT,
146 'civicrm_membership.id IN ( ' . implode(',', $this->membershipIDs) . ')',
147 NULL,
148 FALSE,
149 FALSE,
150 array(
151 'exportOption' => CRM_Export_Form_Select::MEMBER_EXPORT,
152 'suppress_csv_for_testing' => TRUE,
153 )
154 );
155
156 $dao = CRM_Core_DAO::executeQuery('SELECT * from ' . $tableName);
157 $dao->fetch();
158 $this->assertEquals('100.00', $dao->componentpaymentfield_total_amount);
159 $this->assertEquals('Completed', $dao->componentpaymentfield_contribution_status);
160 $this->assertEquals('Credit Card', $dao->componentpaymentfield_payment_instrument);
161 $this->assertEquals(1, $dao->N);
162
163 // delete the export temp table and component table
164 $sql = "DROP TABLE IF EXISTS {$tableName}";
165 CRM_Core_DAO::executeQuery($sql);
166 }
167
c7224305 168 /**
169 * Basic test to ensure the exportComponents function can export selected fields for contribution.
170 */
171 public function testExportComponentsActivity() {
172 $this->setUpActivityExportData();
173 $selectedFields = array(
174 array('Individual', 'display_name'),
175 array('Individual', '5_a_b', 'display_name'),
176 );
177
178 list($tableName) = CRM_Export_BAO_Export::exportComponents(
179 FALSE,
180 $this->activityIDs,
181 array(),
182 '`activity_date_time` desc',
183 $selectedFields,
184 NULL,
185 CRM_Export_Form_Select::ACTIVITY_EXPORT,
186 'civicrm_activity.id IN ( ' . implode(',', $this->activityIDs) . ')',
187 NULL,
188 FALSE,
189 FALSE,
190 array(
191 'exportOption' => CRM_Export_Form_Select::ACTIVITY_EXPORT,
192 'suppress_csv_for_testing' => TRUE,
193 )
194 );
195
196 // delete the export temp table and component table
197 $sql = "DROP TABLE IF EXISTS {$tableName}";
198 CRM_Core_DAO::executeQuery($sql);
199 }
200
12a36993 201 /**
202 * Test the function that extracts the arrays used to structure the output.
203 *
204 * The keys in the output fields array should by matched by field aliases in the sql query (with
205 * exceptions of course - currently country is one - although maybe a future refactor can change that!).
206 *
207 * We are trying to move towards simpler processing in the per row iteration as that may be
208 * repeated 100,000 times and in general we should simply be able to match the query fields to
209 * our expected rows & do a little pseudoconstant mapping.
210 */
211 public function testGetExportStructureArrays() {
212 // This is how return properties are formatted internally within the function for passing to the BAO query.
213 $returnProperties = array(
214 'first_name' => 1,
215 'last_name' => 1,
216 'receive_date' => 1,
217 'contribution_source' => 1,
218 'location' => array(
219 'Home' => array(
220 'street_address' => 1,
221 'city' => 1,
222 'country' => 1,
223 'email' => 1,
224 'im-1' => 1,
225 'im_provider' => 1,
226 'phone-1' => 1,
227 ),
228 ),
229 'phone' => 1,
230 'trxn_id' => 1,
231 'contribution_id' => 1,
232 );
efc76c0a 233
12a36993 234 $contactRelationshipTypes = CRM_Contact_BAO_Relationship::getContactRelationshipType(
235 NULL,
236 NULL,
237 NULL,
238 NULL,
239 TRUE,
240 'name',
241 FALSE
242 );
243
244 $query = new CRM_Contact_BAO_Query(array(), $returnProperties, NULL,
245 FALSE, FALSE, CRM_Contact_BAO_Query::MODE_CONTRIBUTE,
246 FALSE, TRUE, TRUE, NULL, 'AND'
247 );
248
249 list($select) = $query->query();
250 $pattern = '/as `?([^`,]*)/';
251 $queryFieldAliases = array();
252 preg_match_all($pattern, $select, $queryFieldAliases, PREG_PATTERN_ORDER);
d41ab886 253 $processor = new CRM_Export_BAO_ExportProcessor(CRM_Contact_BAO_Query::MODE_CONTRIBUTE, NULL, 'AND');
adabfa40 254 $processor->setQueryFields($query->_fields);
12a36993 255
71464b73 256 list($outputFields) = CRM_Export_BAO_Export::getExportStructureArrays($returnProperties, $processor, $contactRelationshipTypes, '');
12a36993 257 foreach (array_keys($outputFields) as $fieldAlias) {
258 if ($fieldAlias == 'Home-country') {
259 $this->assertTrue(in_array($fieldAlias . '_id', $queryFieldAliases[1]), 'Country is subject to some funky translate so we make sure country id is present');
260 }
261 else {
262 $this->assertTrue(in_array($fieldAlias, $queryFieldAliases[1]), 'looking for field ' . $fieldAlias . ' in generaly the alias fields need to match the outputfields');
263 }
264 }
265
266 }
267
268 /**
269 * Set up some data for us to do testing on.
270 */
271 public function setUpContributionExportData() {
272 $this->setUpContactExportData();
bab4f15e 273 $this->contributionIDs[] = $this->contributionCreate(array('contact_id' => $this->contactIDs[0], 'trxn_id' => 'null', 'invoice_id' => 'null'));
274 $this->contributionIDs[] = $this->contributionCreate(array('contact_id' => $this->contactIDs[1], 'trxn_id' => 'null', 'invoice_id' => 'null'));
12a36993 275 }
276
0a3b035f 277 /**
278 * Set up some data for us to do testing on.
279 */
280 public function setUpMembershipExportData() {
281 $this->setUpContactExportData();
18711469 282 // Create an extra so we don't get false passes due to 1
283 $this->contactMembershipCreate(['contact_id' => $this->contactIDs[0]]);
0a3b035f 284 $this->membershipIDs[] = $this->contactMembershipCreate(['contact_id' => $this->contactIDs[0]]);
18711469 285 $this->setUpContributionExportData();
286 $this->callAPISuccess('membership_payment', 'create', array(
287 'contribution_id' => $this->contributionIDs[0],
288 'membership_id' => $this->membershipIDs[0],
289 ));
290 $this->callAPISuccess('LineItem', 'get', [
30eab4c1 291 'entity_table' => 'civicrm_membership',
18711469 292 'membership_id' => $this->membershipIDs[0],
293 'api.LineItem.create' => ['contribution_id' => $this->contributionIDs[0]],
294 ]);
0a3b035f 295 }
296
297 /**
298 * Set up data to test case export.
299 */
300 public function setupCaseExportData() {
301 $contactID1 = $this->individualCreate();
302 $contactID2 = $this->individualCreate(array(), 1);
303
304 $case = $this->callAPISuccess('case', 'create', array(
305 'case_type_id' => 1,
306 'subject' => 'blah',
307 'contact_id' => $contactID1,
308 ));
309 $this->callAPISuccess('CaseContact', 'create', [
310 'case_id' => $case['id'],
311 'contact_id' => $contactID2,
312 ]);
313 }
314
c7224305 315 /**
316 * Set up some data for us to do testing on.
317 */
318 public function setUpActivityExportData() {
319 $this->setUpContactExportData();
320 $this->activityIDs[] = $this->activityCreate(array('contact_id' => $this->contactIDs[0]))['id'];
321 }
322
12a36993 323 /**
324 * Set up some data for us to do testing on.
325 */
326 public function setUpContactExportData() {
bab4f15e 327 $this->contactIDs[] = $contactA = $this->individualCreate(['gender_id' => 'Female']);
4d251131 328 // Create address for contact A.
994a070c 329 $params = array(
330 'contact_id' => $contactA,
331 'location_type_id' => 'Home',
332 'street_address' => 'Ambachtstraat 23',
333 'postal_code' => '6971 BN',
334 'country_id' => '1152',
335 'city' => 'Brummen',
336 'is_primary' => 1,
337 );
338 $result = $this->callAPISuccess('address', 'create', $params);
339 $addressId = $result['id'];
340
4d251131 341 $this->callAPISuccess('email', 'create', array(
342 'id' => $this->callAPISuccessGetValue('Email', ['contact_id' => $params['contact_id'], 'return' => 'id']),
343 'location_type_id' => 'Home',
344 'email' => 'home@example.com',
345 'is_primary' => 1,
346 ));
347 $this->callAPISuccess('email', 'create', array('contact_id' => $params['contact_id'], 'location_type_id' => 'Work', 'email' => 'work@example.com', 'is_primary' => 0));
348
349 $params['is_primary'] = 0;
350 $params['location_type_id'] = 'Work';
351 $this->callAPISuccess('address', 'create', $params);
352 $this->contactIDs[] = $contactB = $this->individualCreate();
353
354 $this->callAPISuccess('address', 'create', array(
994a070c 355 'contact_id' => $contactB,
356 'location_type_id' => "Home",
357 'master_id' => $addressId,
358 ));
77544f6f 359 $this->masterAddressID = $addressId;
994a070c 360
4d251131 361 }
362
363 /**
364 * Test variants of primary address exporting.
365 *
366 * @param int $isPrimaryOnly
367 *
368 * @dataProvider getPrimarySearchOptions
369 */
370 public function testExportPrimaryAddress($isPrimaryOnly) {
371 \Civi::settings()->set('searchPrimaryDetailsOnly', $isPrimaryOnly);
372 $this->setUpContactExportData();
373
374 $selectedFields = [['Individual', 'email', ' '], ['Individual', 'email', '1'], ['Individual', 'email', '2']];
375 list($tableName) = CRM_Export_BAO_Export::exportComponents(
376 TRUE,
377 [],
378 [['email', 'LIKE', 'c', 0, 1]],
379 NULL,
380 $selectedFields,
381 NULL,
382 CRM_Export_Form_Select::CONTACT_EXPORT,
383 "contact_a.id IN ({$this->contactIDs[0]}, {$this->contactIDs[1]})",
384 NULL,
385 FALSE,
386 FALSE,
387 array(
388 'exportOption' => CRM_Export_Form_Select::CONTACT_EXPORT,
389 'suppress_csv_for_testing' => TRUE,
390 )
391 );
392
393 $dao = CRM_Core_DAO::executeQuery('SELECT * from ' . $tableName);
394 $dao->fetch();
395 $this->assertEquals('home@example.com', $dao->email);
396 $this->assertEquals('work@example.com', $dao->work_email);
397 $this->assertEquals('home@example.com', $dao->home_email);
398 $this->assertEquals(2, $dao->N);
399 \Civi::settings()->set('searchPrimaryDetailsOnly', FALSE);
400 }
401
402 /**
403 * Get the options for the primary search setting field.
404 * @return array
405 */
406 public function getPrimarySearchOptions() {
407 return [[TRUE], [FALSE]];
408 }
409
bab4f15e 410 /**
411 * Test that when exporting a pseudoField it is reset for NULL entries.
412 *
413 * ie. we have a contact WITH a gender & one without - make sure the latter one
414 * does NOT retain the gender of the former.
415 */
416 public function testExportPseudoField() {
417 $this->setUpContactExportData();
418 $selectedFields = [['Individual', 'gender_id']];
f797aeb8 419 list($tableName, $sqlColumns) = $this->doExport($selectedFields, $this->contactIDs);
bab4f15e 420 $this->assertEquals('Female,', CRM_Core_DAO::singleValueQuery("SELECT GROUP_CONCAT(gender_id) FROM {$tableName}"));
421 }
422
423 /**
424 * Test that when exporting a pseudoField it is reset for NULL entries.
425 *
426 * This is specific to the example in CRM-14398
427 */
428 public function testExportPseudoFieldCampaign() {
429 $this->setUpContributionExportData();
430 $campaign = $this->callAPISuccess('Campaign', 'create', ['title' => 'Big campaign']);
431 $this->callAPISuccess('Contribution', 'create', ['campaign_id' => 'Big_campaign', 'id' => $this->contributionIDs[0]]);
432 $selectedFields = [['Individual', 'gender_id'], ['Contribution', 'contribution_campaign_title']];
433 list($tableName, $sqlColumns) = CRM_Export_BAO_Export::exportComponents(
434 TRUE,
435 $this->contactIDs[1],
436 array(),
437 NULL,
438 $selectedFields,
439 NULL,
440 CRM_Export_Form_Select::CONTRIBUTE_EXPORT,
441 "contact_a.id IN (" . implode(",", $this->contactIDs) . ")",
442 NULL,
443 FALSE,
444 FALSE,
445 array(
446 'exportOption' => CRM_Export_Form_Select::CONTACT_EXPORT,
447 'suppress_csv_for_testing' => TRUE,
448 )
449 );
450 $this->assertEquals('Big campaign,', CRM_Core_DAO::singleValueQuery("SELECT GROUP_CONCAT(contribution_campaign_title) FROM {$tableName}"));
451 }
452
ce12a9e0 453 /**
454 * Test exporting relationships.
455 */
456 public function testExportRelationships() {
cedeaa5c 457 $organization1 = $this->organizationCreate(['organization_name' => 'Org 1', 'legal_name' => 'pretty legal', 'contact_source' => 'friend who took a law paper once']);
ce12a9e0 458 $organization2 = $this->organizationCreate(['organization_name' => 'Org 2', 'legal_name' => 'well dodgey']);
459 $contact1 = $this->individualCreate(['employer_id' => $organization1, 'first_name' => 'one']);
460 $contact2 = $this->individualCreate(['employer_id' => $organization2, 'first_name' => 'one']);
461 $employerRelationshipTypeID = $this->callAPISuccessGetValue('RelationshipType', ['return' => 'id', 'label_a_b' => 'Employee of']);
462 $selectedFields = [
463 ['Individual', 'first_name', ''],
464 ['Individual', $employerRelationshipTypeID . '_a_b', 'organization_name', ''],
465 ['Individual', $employerRelationshipTypeID . '_a_b', 'legal_name', ''],
cedeaa5c 466 ['Individual', $employerRelationshipTypeID . '_a_b', 'contact_source', ''],
ce12a9e0 467 ];
468 list($tableName, $sqlColumns, $headerRows) = CRM_Export_BAO_Export::exportComponents(
469 FALSE,
470 [$contact1, $contact2],
471 [],
472 NULL,
473 $selectedFields,
474 NULL,
475 CRM_Export_Form_Select::CONTACT_EXPORT,
476 "contact_a.id IN ( $contact1, $contact2 )",
477 NULL,
478 FALSE,
479 FALSE,
480 [
481 'exportOption' => CRM_Export_Form_Select::CONTACT_EXPORT,
482 'suppress_csv_for_testing' => TRUE,
483 ]
484 );
485
486 $dao = CRM_Core_DAO::executeQuery("SELECT * FROM {$tableName}");
487 $dao->fetch();
488 $this->assertEquals('one', $dao->first_name);
489 $this->assertEquals('Org 1', $dao->{$employerRelationshipTypeID . '_a_b_organization_name'});
490 $this->assertEquals('pretty legal', $dao->{$employerRelationshipTypeID . '_a_b_legal_name'});
cedeaa5c 491 $this->assertEquals('friend who took a law paper once', $dao->{$employerRelationshipTypeID . '_a_b_contact_source'});
ce12a9e0 492
493 $dao->fetch();
494 $this->assertEquals('Org 2', $dao->{$employerRelationshipTypeID . '_a_b_organization_name'});
495 $this->assertEquals('well dodgey', $dao->{$employerRelationshipTypeID . '_a_b_legal_name'});
5359d42b 496
497 $this->assertEquals([
498 0 => 'First Name',
499 1 => 'Employee of-Organization Name',
500 2 => 'Employee of-Legal Name',
501 3 => 'Employee of-Contact Source',
502 ], $headerRows);
ce12a9e0 503 }
504
b0eb1d74 505 /**
506 * Test exporting relationships.
507 *
508 * This is to ensure that CRM-13995 remains fixed.
509 */
510 public function testExportRelationshipsMergeToHousehold() {
2593f7dc 511 list($householdID, $houseHoldTypeID) = $this->setUpHousehold();
b0eb1d74 512
513 $selectedFields = [
514 ['Individual', $houseHoldTypeID . '_a_b', 'state_province', ''],
515 ['Individual', $houseHoldTypeID . '_a_b', 'city', ''],
516 ['Individual', 'city', ''],
517 ['Individual', 'state_province', ''],
cedeaa5c 518 ['Individual', 'contact_source', ''],
b0eb1d74 519 ];
b7db6051 520 list($tableName, $sqlColumns, $headerRows) = CRM_Export_BAO_Export::exportComponents(
b0eb1d74 521 FALSE,
522 $this->contactIDs,
523 [],
524 NULL,
525 $selectedFields,
526 NULL,
527 CRM_Export_Form_Select::CONTACT_EXPORT,
528 "contact_a.id IN (" . implode(",", $this->contactIDs) . ")",
529 NULL,
530 FALSE,
531 TRUE,
532 [
533 'exportOption' => CRM_Export_Form_Select::CONTACT_EXPORT,
534 'suppress_csv_for_testing' => TRUE,
535 ]
536 );
537 $dao = CRM_Core_DAO::executeQuery("SELECT * FROM {$tableName}");
538 while ($dao->fetch()) {
81649c48 539 $this->assertEquals('Portland', $dao->city);
540 $this->assertEquals('ME', $dao->state_province);
541 $this->assertEquals($householdID, $dao->civicrm_primary_id);
542 $this->assertEquals($householdID, $dao->civicrm_primary_id);
cedeaa5c 543 $this->assertEquals('household sauce', $dao->contact_source);
b0eb1d74 544 }
545
b7db6051 546 $this->assertEquals([
547 0 => 'City',
548 1 => 'State',
cedeaa5c 549 2 => 'Contact Source',
550 3 => 'Household ID',
b7db6051 551 ], $headerRows);
552 $this->assertEquals(
553 [
554 'city' => 'city varchar(64)',
555 'state_province' => 'state_province varchar(64)',
556 'civicrm_primary_id' => 'civicrm_primary_id varchar(16)',
cedeaa5c 557 'contact_source' => 'contact_source varchar(255)',
b7db6051 558 ], $sqlColumns);
b0eb1d74 559 }
560
2593f7dc 561 /**
562 * Test exporting relationships.
563 */
564 public function testExportRelationshipsMergeToHouseholdAllFields() {
2593f7dc 565 list($householdID) = $this->setUpHousehold();
566 list($tableName) = CRM_Export_BAO_Export::exportComponents(
567 FALSE,
568 $this->contactIDs,
569 [],
570 NULL,
571 NULL,
572 NULL,
573 CRM_Export_Form_Select::CONTACT_EXPORT,
574 "contact_a.id IN (" . implode(",", $this->contactIDs) . ")",
575 NULL,
576 FALSE,
577 TRUE,
578 [
579 'exportOption' => CRM_Export_Form_Select::CONTACT_EXPORT,
580 'suppress_csv_for_testing' => TRUE,
581 ]
582 );
583 $dao = CRM_Core_DAO::executeQuery("SELECT * FROM {$tableName}");
584 while ($dao->fetch()) {
136f69a8 585 $this->assertEquals('Unit Test household', $dao->display_name);
2593f7dc 586 $this->assertEquals('Portland', $dao->city);
587 $this->assertEquals('ME', $dao->state_province);
588 $this->assertEquals($householdID, $dao->civicrm_primary_id);
589 $this->assertEquals($householdID, $dao->civicrm_primary_id);
136f69a8 590 $this->assertEquals('Unit Test household', $dao->addressee);
591 $this->assertEquals(1, $dao->N);
2593f7dc 592 }
593 }
594
3663269c 595 /**
596 * Test master_address_id field.
597 */
598 public function testExportCustomData() {
599 $this->setUpContactExportData();
600
601 $customData = $this->entityCustomGroupWithSingleFieldCreate(__FUNCTION__, 'ContactTest.php');
602
603 $this->callAPISuccess('Contact', 'create', [
604 'id' => $this->contactIDs[1],
605 'custom_' . $customData['custom_field_id'] => 'BlahdeBlah',
606 'api.Address.create' => ['location_type_id' => 'Billing', 'city' => 'Waipu'],
607 ]);
608 $selectedFields = [
609 ['Individual', 'city', CRM_Core_PseudoConstant::getKey('CRM_Core_BAO_Address', 'location_type_id', 'Billing')],
610 ['Individual', 'custom_1'],
611 ];
612
613 list($tableName, $sqlColumns) = $this->doExport($selectedFields, $this->contactIDs[1]);
614 $this->assertEquals([
5ebd7d09 615 'billing_city' => 'billing_city varchar(64)',
3663269c 616 'custom_1' => 'custom_1 varchar(255)',
617 ], $sqlColumns);
618
619 $dao = CRM_Core_DAO::executeQuery('SELECT * FROM ' . $tableName);
620 while ($dao->fetch()) {
621 $this->assertEquals('BlahdeBlah', $dao->custom_1);
622 $this->assertEquals('Waipu', $dao->billing_city);
623 }
624 }
625
626 /**
627 * Attempt to do a fairly full export of location data.
628 */
629 public function testExportIMData() {
630 // Use default providers.
631 $providers = ['AIM', 'GTalk', 'Jabber', 'MSN', 'Skype', 'Yahoo'];
a16a432a 632 // Main sure labels are not all anglo chars.
633 $this->diversifyLocationTypes();
634
635 $locationTypes = ['Billing' => 'Billing', 'Home' => 'Home', 'Main' => 'Méin', 'Other' => 'Other', 'Whare Kai' => 'Whare Kai'];
3663269c 636
637 $this->contactIDs[] = $this->individualCreate();
638 $this->contactIDs[] = $this->individualCreate();
639 $this->contactIDs[] = $this->householdCreate();
640 $this->contactIDs[] = $this->organizationCreate();
641 foreach ($this->contactIDs as $contactID) {
642 foreach ($providers as $provider) {
a16a432a 643 foreach ($locationTypes as $locationName => $locationLabel) {
3663269c 644 $this->callAPISuccess('IM', 'create', [
645 'contact_id' => $contactID,
a16a432a 646 'location_type_id' => $locationName,
3663269c 647 'provider_id' => $provider,
a16a432a 648 'name' => $locationName . $provider . $contactID,
3663269c 649 ]);
650 }
651 }
652 }
653
654 $relationships = [
655 $this->contactIDs[1] => ['label' => 'Spouse of'],
656 $this->contactIDs[2] => ['label' => 'Household Member of'],
657 $this->contactIDs[3] => ['label' => 'Employee of']
658 ];
659
660 foreach ($relationships as $contactID => $relationshipType) {
661 $relationshipTypeID = $this->callAPISuccess('RelationshipType', 'getvalue', ['label_a_b' => $relationshipType['label'], 'return' => 'id']);
662 $result = $this->callAPISuccess('Relationship', 'create', [
663 'contact_id_a' => $this->contactIDs[0],
664 'relationship_type_id' => $relationshipTypeID,
665 'contact_id_b' => $contactID
666 ]);
667 $relationships[$contactID]['id'] = $result['id'];
668 $relationships[$contactID]['relationship_type_id'] = $relationshipTypeID;
669 }
670
671 $fields = [['Individual', 'contact_id']];
672 // ' ' denotes primary location type.
a16a432a 673 foreach (array_keys(array_merge($locationTypes, [' ' => ['Primary']])) as $locationType) {
3663269c 674 $fields[] = [
675 'Individual',
676 'im_provider',
677 CRM_Core_PseudoConstant::getKey('CRM_Core_BAO_IM', 'location_type_id', $locationType),
678 ];
679 foreach ($relationships as $contactID => $relationship) {
680 $fields[] = [
681 'Individual',
682 $relationship['relationship_type_id'] . '_a_b',
683 'im_provider',
684 CRM_Core_PseudoConstant::getKey('CRM_Core_BAO_IM', 'location_type_id', $locationType),
685 ];
686 }
687 foreach ($providers as $provider) {
688 $fields[] = [
689 'Individual',
690 'im',
691 CRM_Core_PseudoConstant::getKey('CRM_Core_BAO_IM', 'location_type_id', $locationType),
692 CRM_Core_PseudoConstant::getKey('CRM_Core_BAO_IM', 'provider_id', $provider),
693 ];
694 foreach ($relationships as $contactID => $relationship) {
695 $fields[] = [
696 'Individual',
697 $relationship['relationship_type_id'] . '_a_b',
698 'im',
699 CRM_Core_PseudoConstant::getKey('CRM_Core_BAO_IM', 'location_type_id', $locationType),
700 CRM_Core_PseudoConstant::getKey('CRM_Core_BAO_IM', 'provider_id', $provider),
701 ];
702 }
703 }
704 }
704e3e9a 705 list($tableName, $sqlColumns) = $this->doExport($fields, $this->contactIDs[0]);
3663269c 706
707 $dao = CRM_Core_DAO::executeQuery('SELECT * FROM ' . $tableName);
708 while ($dao->fetch()) {
709 $id = $dao->contact_id;
710 $this->assertEquals('AIM', $dao->billing_im_provider);
711 $this->assertEquals('BillingJabber' . $id, $dao->billing_im_screen_name_jabber);
712 $this->assertEquals('BillingSkype' . $id, $dao->billing_im_screen_name_skype);
713 foreach ($relationships as $relatedContactID => $relationship) {
714 $relationshipString = $field = $relationship['relationship_type_id'] . '_a_b';
715 $field = $relationshipString . '_billing_im_screen_name_yahoo';
716 $this->assertEquals('BillingYahoo' . $relatedContactID, $dao->$field);
717 // @todo efforts to output 'im_provider' for related contacts seem to be giving a blank field.
718 }
719 }
720
3663269c 721 $this->assertEquals([
722 'billing_im_provider' => 'billing_im_provider text',
5ebd7d09 723 'billing_im_screen_name' => 'billing_im_screen_name varchar(64)',
724 'billing_im_screen_name_jabber' => 'billing_im_screen_name_jabber varchar(64)',
725 'billing_im_screen_name_skype' => 'billing_im_screen_name_skype varchar(64)',
726 'billing_im_screen_name_yahoo' => 'billing_im_screen_name_yahoo varchar(64)',
3663269c 727 'home_im_provider' => 'home_im_provider text',
5ebd7d09 728 'home_im_screen_name' => 'home_im_screen_name varchar(64)',
729 'home_im_screen_name_jabber' => 'home_im_screen_name_jabber varchar(64)',
730 'home_im_screen_name_skype' => 'home_im_screen_name_skype varchar(64)',
731 'home_im_screen_name_yahoo' => 'home_im_screen_name_yahoo varchar(64)',
3663269c 732 'main_im_provider' => 'main_im_provider text',
5ebd7d09 733 'main_im_screen_name' => 'main_im_screen_name varchar(64)',
734 'main_im_screen_name_jabber' => 'main_im_screen_name_jabber varchar(64)',
735 'main_im_screen_name_skype' => 'main_im_screen_name_skype varchar(64)',
736 'main_im_screen_name_yahoo' => 'main_im_screen_name_yahoo varchar(64)',
3663269c 737 'other_im_provider' => 'other_im_provider text',
5ebd7d09 738 'other_im_screen_name' => 'other_im_screen_name varchar(64)',
739 'other_im_screen_name_jabber' => 'other_im_screen_name_jabber varchar(64)',
740 'other_im_screen_name_skype' => 'other_im_screen_name_skype varchar(64)',
741 'other_im_screen_name_yahoo' => 'other_im_screen_name_yahoo varchar(64)',
3663269c 742 'im_provider' => 'im_provider text',
5ebd7d09 743 'im_screen_name' => 'im_screen_name varchar(64)',
3663269c 744 'contact_id' => 'contact_id varchar(255)',
745 '2_a_b_im_provider' => '2_a_b_im_provider text',
5ebd7d09 746 '2_a_b_billing_im_screen_name' => '2_a_b_billing_im_screen_name varchar(64)',
747 '2_a_b_billing_im_screen_name_jabber' => '2_a_b_billing_im_screen_name_jabber varchar(64)',
748 '2_a_b_billing_im_screen_name_skype' => '2_a_b_billing_im_screen_name_skype varchar(64)',
749 '2_a_b_billing_im_screen_name_yahoo' => '2_a_b_billing_im_screen_name_yahoo varchar(64)',
750 '2_a_b_home_im_screen_name' => '2_a_b_home_im_screen_name varchar(64)',
751 '2_a_b_home_im_screen_name_jabber' => '2_a_b_home_im_screen_name_jabber varchar(64)',
752 '2_a_b_home_im_screen_name_skype' => '2_a_b_home_im_screen_name_skype varchar(64)',
753 '2_a_b_home_im_screen_name_yahoo' => '2_a_b_home_im_screen_name_yahoo varchar(64)',
754 '2_a_b_main_im_screen_name' => '2_a_b_main_im_screen_name varchar(64)',
755 '2_a_b_main_im_screen_name_jabber' => '2_a_b_main_im_screen_name_jabber varchar(64)',
756 '2_a_b_main_im_screen_name_skype' => '2_a_b_main_im_screen_name_skype varchar(64)',
757 '2_a_b_main_im_screen_name_yahoo' => '2_a_b_main_im_screen_name_yahoo varchar(64)',
758 '2_a_b_other_im_screen_name' => '2_a_b_other_im_screen_name varchar(64)',
759 '2_a_b_other_im_screen_name_jabber' => '2_a_b_other_im_screen_name_jabber varchar(64)',
760 '2_a_b_other_im_screen_name_skype' => '2_a_b_other_im_screen_name_skype varchar(64)',
761 '2_a_b_other_im_screen_name_yahoo' => '2_a_b_other_im_screen_name_yahoo varchar(64)',
762 '2_a_b_im_screen_name' => '2_a_b_im_screen_name varchar(64)',
3663269c 763 '8_a_b_im_provider' => '8_a_b_im_provider text',
5ebd7d09 764 '8_a_b_billing_im_screen_name' => '8_a_b_billing_im_screen_name varchar(64)',
765 '8_a_b_billing_im_screen_name_jabber' => '8_a_b_billing_im_screen_name_jabber varchar(64)',
766 '8_a_b_billing_im_screen_name_skype' => '8_a_b_billing_im_screen_name_skype varchar(64)',
767 '8_a_b_billing_im_screen_name_yahoo' => '8_a_b_billing_im_screen_name_yahoo varchar(64)',
768 '8_a_b_home_im_screen_name' => '8_a_b_home_im_screen_name varchar(64)',
769 '8_a_b_home_im_screen_name_jabber' => '8_a_b_home_im_screen_name_jabber varchar(64)',
770 '8_a_b_home_im_screen_name_skype' => '8_a_b_home_im_screen_name_skype varchar(64)',
771 '8_a_b_home_im_screen_name_yahoo' => '8_a_b_home_im_screen_name_yahoo varchar(64)',
772 '8_a_b_main_im_screen_name' => '8_a_b_main_im_screen_name varchar(64)',
773 '8_a_b_main_im_screen_name_jabber' => '8_a_b_main_im_screen_name_jabber varchar(64)',
774 '8_a_b_main_im_screen_name_skype' => '8_a_b_main_im_screen_name_skype varchar(64)',
775 '8_a_b_main_im_screen_name_yahoo' => '8_a_b_main_im_screen_name_yahoo varchar(64)',
776 '8_a_b_other_im_screen_name' => '8_a_b_other_im_screen_name varchar(64)',
777 '8_a_b_other_im_screen_name_jabber' => '8_a_b_other_im_screen_name_jabber varchar(64)',
778 '8_a_b_other_im_screen_name_skype' => '8_a_b_other_im_screen_name_skype varchar(64)',
779 '8_a_b_other_im_screen_name_yahoo' => '8_a_b_other_im_screen_name_yahoo varchar(64)',
780 '8_a_b_im_screen_name' => '8_a_b_im_screen_name varchar(64)',
3663269c 781 '5_a_b_im_provider' => '5_a_b_im_provider text',
5ebd7d09 782 '5_a_b_billing_im_screen_name' => '5_a_b_billing_im_screen_name varchar(64)',
783 '5_a_b_billing_im_screen_name_jabber' => '5_a_b_billing_im_screen_name_jabber varchar(64)',
784 '5_a_b_billing_im_screen_name_skype' => '5_a_b_billing_im_screen_name_skype varchar(64)',
785 '5_a_b_billing_im_screen_name_yahoo' => '5_a_b_billing_im_screen_name_yahoo varchar(64)',
786 '5_a_b_home_im_screen_name' => '5_a_b_home_im_screen_name varchar(64)',
787 '5_a_b_home_im_screen_name_jabber' => '5_a_b_home_im_screen_name_jabber varchar(64)',
788 '5_a_b_home_im_screen_name_skype' => '5_a_b_home_im_screen_name_skype varchar(64)',
789 '5_a_b_home_im_screen_name_yahoo' => '5_a_b_home_im_screen_name_yahoo varchar(64)',
790 '5_a_b_main_im_screen_name' => '5_a_b_main_im_screen_name varchar(64)',
791 '5_a_b_main_im_screen_name_jabber' => '5_a_b_main_im_screen_name_jabber varchar(64)',
792 '5_a_b_main_im_screen_name_skype' => '5_a_b_main_im_screen_name_skype varchar(64)',
793 '5_a_b_main_im_screen_name_yahoo' => '5_a_b_main_im_screen_name_yahoo varchar(64)',
794 '5_a_b_other_im_screen_name' => '5_a_b_other_im_screen_name varchar(64)',
795 '5_a_b_other_im_screen_name_jabber' => '5_a_b_other_im_screen_name_jabber varchar(64)',
796 '5_a_b_other_im_screen_name_skype' => '5_a_b_other_im_screen_name_skype varchar(64)',
797 '5_a_b_other_im_screen_name_yahoo' => '5_a_b_other_im_screen_name_yahoo varchar(64)',
798 '5_a_b_im_screen_name' => '5_a_b_im_screen_name varchar(64)',
a16a432a 799 'whare_kai_im_provider' => 'whare_kai_im_provider text',
5ebd7d09 800 'whare_kai_im_screen_name' => 'whare_kai_im_screen_name varchar(64)',
801 'whare_kai_im_screen_name_jabber' => 'whare_kai_im_screen_name_jabber varchar(64)',
802 'whare_kai_im_screen_name_skype' => 'whare_kai_im_screen_name_skype varchar(64)',
803 'whare_kai_im_screen_name_yahoo' => 'whare_kai_im_screen_name_yahoo varchar(64)',
804 '2_a_b_whare_kai_im_screen_name' => '2_a_b_whare_kai_im_screen_name varchar(64)',
805 '2_a_b_whare_kai_im_screen_name_jabber' => '2_a_b_whare_kai_im_screen_name_jabber varchar(64)',
806 '2_a_b_whare_kai_im_screen_name_skype' => '2_a_b_whare_kai_im_screen_name_skype varchar(64)',
807 '2_a_b_whare_kai_im_screen_name_yahoo' => '2_a_b_whare_kai_im_screen_name_yahoo varchar(64)',
808 '8_a_b_whare_kai_im_screen_name' => '8_a_b_whare_kai_im_screen_name varchar(64)',
809 '8_a_b_whare_kai_im_screen_name_jabber' => '8_a_b_whare_kai_im_screen_name_jabber varchar(64)',
810 '8_a_b_whare_kai_im_screen_name_skype' => '8_a_b_whare_kai_im_screen_name_skype varchar(64)',
811 '8_a_b_whare_kai_im_screen_name_yahoo' => '8_a_b_whare_kai_im_screen_name_yahoo varchar(64)',
812 '5_a_b_whare_kai_im_screen_name' => '5_a_b_whare_kai_im_screen_name varchar(64)',
813 '5_a_b_whare_kai_im_screen_name_jabber' => '5_a_b_whare_kai_im_screen_name_jabber varchar(64)',
814 '5_a_b_whare_kai_im_screen_name_skype' => '5_a_b_whare_kai_im_screen_name_skype varchar(64)',
815 '5_a_b_whare_kai_im_screen_name_yahoo' => '5_a_b_whare_kai_im_screen_name_yahoo varchar(64)',
3663269c 816 ], $sqlColumns);
817
818 }
819
f797aeb8 820
821 /**
822 * Test phone data export.
823 *
824 * Less over the top complete than the im test.
825 */
826 public function testExportPhoneData() {
827 $this->contactIDs[] = $this->individualCreate();
828 $this->contactIDs[] = $this->individualCreate();
829 $locationTypes = ['Billing' => 'Billing', 'Home' => 'Home'];
830 $phoneTypes = ['Mobile', 'Phone'];
831 foreach ($this->contactIDs as $contactID) {
832 $this->callAPISuccess('Phone', 'create', [
833 'contact_id' => $contactID,
834 'location_type_id' => 'Billing',
835 'phone_type_id' => 'Mobile',
001a515b 836 'phone' => 'Billing' . 'Mobile' . $contactID,
f797aeb8 837 'is_primary' => 1,
838 ]);
839 $this->callAPISuccess('Phone', 'create', [
840 'contact_id' => $contactID,
841 'location_type_id' => 'Home',
842 'phone_type_id' => 'Phone',
001a515b 843 'phone' => 'Home' . 'Phone' . $contactID,
f797aeb8 844 ]);
845 }
846
847 $relationships = [
848 $this->contactIDs[1] => ['label' => 'Spouse of']
849 ];
850
851 foreach ($relationships as $contactID => $relationshipType) {
852 $relationshipTypeID = $this->callAPISuccess('RelationshipType', 'getvalue', ['label_a_b' => $relationshipType['label'], 'return' => 'id']);
853 $result = $this->callAPISuccess('Relationship', 'create', [
854 'contact_id_a' => $this->contactIDs[0],
855 'relationship_type_id' => $relationshipTypeID,
856 'contact_id_b' => $contactID
857 ]);
858 $relationships[$contactID]['id'] = $result['id'];
859 $relationships[$contactID]['relationship_type_id'] = $relationshipTypeID;
860 }
861
862 $fields = [['Individual', 'contact_id']];
863 // ' ' denotes primary location type.
864 foreach (array_keys(array_merge($locationTypes, [' ' => ['Primary']])) as $locationType) {
865 $fields[] = [
866 'Individual',
867 'phone',
868 CRM_Core_PseudoConstant::getKey('CRM_Core_BAO_Phone', 'location_type_id', $locationType),
869 ];
870 $fields[] = [
871 'Individual',
872 'phone_type_id',
873 CRM_Core_PseudoConstant::getKey('CRM_Core_BAO_Phone', 'location_type_id', $locationType),
874 ];
875 foreach ($relationships as $contactID => $relationship) {
876 $fields[] = [
877 'Individual',
878 $relationship['relationship_type_id'] . '_a_b',
879 'phone_type_id',
880 CRM_Core_PseudoConstant::getKey('CRM_Core_BAO_Phone', 'location_type_id', $locationType),
881 ];
882 }
883 foreach ($phoneTypes as $phoneType) {
884 $fields[] = [
885 'Individual',
886 'phone',
887 CRM_Core_PseudoConstant::getKey('CRM_Core_BAO_Phone', 'location_type_id', $locationType),
888 CRM_Core_PseudoConstant::getKey('CRM_Core_BAO_Phone', 'phone_type_id', $phoneType),
889 ];
890 foreach ($relationships as $contactID => $relationship) {
891 $fields[] = [
892 'Individual',
893 $relationship['relationship_type_id'] . '_a_b',
894 'phone_type_id',
895 CRM_Core_PseudoConstant::getKey('CRM_Core_BAO_Phone', 'location_type_id', $locationType),
896 CRM_Core_PseudoConstant::getKey('CRM_Core_BAO_Phone', 'phone_type_id', $phoneType),
897 ];
898 }
899 }
900 }
901 list($tableName) = $this->doExport($fields, $this->contactIDs[0]);
902
903 $dao = CRM_Core_DAO::executeQuery('SELECT * FROM ' . $tableName);
904 while ($dao->fetch()) {
905 // note there is some chance these might be random on some mysql co
906 $this->assertEquals('BillingMobile3', $dao->billing_phone_mobile);
907 $this->assertEquals('', $dao->billing_phone_phone);
908 $relField = '2_a_b_phone_type_id';
909 $this->assertEquals('Phone', $dao->$relField);
910 $this->assertEquals('Mobile', $dao->phone_type_id);
911 $this->assertEquals('Mobile', $dao->billing_phone_type_id);
912 }
913 }
914
a16a432a 915 /**
916 * Export City against multiple location types.
917 */
918 public function testExportAddressData() {
919 $this->diversifyLocationTypes();
920
921 $locationTypes = ['Billing' => 'Billing', 'Home' => 'Home', 'Main' => 'Méin', 'Other' => 'Other', 'Whare Kai' => 'Whare Kai'];
922
923 $this->contactIDs[] = $this->individualCreate();
924 $this->contactIDs[] = $this->individualCreate();
925 $this->contactIDs[] = $this->householdCreate();
926 $this->contactIDs[] = $this->organizationCreate();
927 $fields = [['Individual', 'contact_id']];
928 foreach ($this->contactIDs as $contactID) {
929 foreach ($locationTypes as $locationName => $locationLabel) {
930 $this->callAPISuccess('Address', 'create', [
931 'contact_id' => $contactID,
932 'location_type_id' => $locationName,
933 'street_address' => $locationLabel . $contactID . 'street_address',
934 'city' => $locationLabel . $contactID . 'city',
935 'postal_code' => $locationLabel . $contactID . 'postal_code',
936 ]);
937 $fields[] = ['Individual', 'city', CRM_Core_PseudoConstant::getKey('CRM_Core_BAO_Address', 'location_type_id', $locationName)];
938 $fields[] = ['Individual', 'street_address', CRM_Core_PseudoConstant::getKey('CRM_Core_BAO_Address', 'location_type_id', $locationName)];
939 $fields[] = ['Individual', 'postal_code', CRM_Core_PseudoConstant::getKey('CRM_Core_BAO_Address', 'location_type_id', $locationName)];
940 }
941 }
942
943 $relationships = [
944 $this->contactIDs[1] => ['label' => 'Spouse of'],
945 $this->contactIDs[2] => ['label' => 'Household Member of'],
946 $this->contactIDs[3] => ['label' => 'Employee of']
947 ];
948
949 foreach ($relationships as $contactID => $relationshipType) {
950 $relationshipTypeID = $this->callAPISuccess('RelationshipType', 'getvalue', ['label_a_b' => $relationshipType['label'], 'return' => 'id']);
951 $result = $this->callAPISuccess('Relationship', 'create', [
952 'contact_id_a' => $this->contactIDs[0],
953 'relationship_type_id' => $relationshipTypeID,
954 'contact_id_b' => $contactID
955 ]);
956 $relationships[$contactID]['id'] = $result['id'];
957 $relationships[$contactID]['relationship_type_id'] = $relationshipTypeID;
958 }
959
960 // ' ' denotes primary location type.
961 foreach (array_keys(array_merge($locationTypes, [' ' => ['Primary']])) as $locationType) {
962 foreach ($relationships as $contactID => $relationship) {
963 $fields[] = [
964 'Individual',
965 $relationship['relationship_type_id'] . '_a_b',
966 'city',
967 CRM_Core_PseudoConstant::getKey('CRM_Core_BAO_IM', 'location_type_id', $locationType),
968 ];
969 }
970 }
971 list($tableName, $sqlColumns) = $this->doExport($fields, $this->contactIDs[0]);
972
973 $dao = CRM_Core_DAO::executeQuery('SELECT * FROM ' . $tableName);
974 while ($dao->fetch()) {
975 $id = $dao->contact_id;
976 $this->assertEquals('Méin' . $id . 'city', $dao->main_city);
977 $this->assertEquals('Billing' . $id . 'street_address', $dao->billing_street_address);
978 $this->assertEquals('Whare Kai' . $id . 'postal_code', $dao->whare_kai_postal_code);
979 foreach ($relationships as $relatedContactID => $relationship) {
980 $relationshipString = $field = $relationship['relationship_type_id'] . '_a_b';
981 $field = $relationshipString . '_main_city';
982 $this->assertEquals('Méin' . $relatedContactID . 'city', $dao->$field);
983 }
984 }
985
986 $this->assertEquals([
987 'contact_id' => 'contact_id varchar(255)',
5ebd7d09 988 'billing_city' => 'billing_city varchar(64)',
989 'billing_street_address' => 'billing_street_address varchar(96)',
990 'billing_postal_code' => 'billing_postal_code varchar(64)',
991 'home_city' => 'home_city varchar(64)',
992 'home_street_address' => 'home_street_address varchar(96)',
993 'home_postal_code' => 'home_postal_code varchar(64)',
994 'main_city' => 'main_city varchar(64)',
995 'main_street_address' => 'main_street_address varchar(96)',
996 'main_postal_code' => 'main_postal_code varchar(64)',
997 'other_city' => 'other_city varchar(64)',
998 'other_street_address' => 'other_street_address varchar(96)',
999 'other_postal_code' => 'other_postal_code varchar(64)',
1000 'whare_kai_city' => 'whare_kai_city varchar(64)',
1001 'whare_kai_street_address' => 'whare_kai_street_address varchar(96)',
1002 'whare_kai_postal_code' => 'whare_kai_postal_code varchar(64)',
1003 '2_a_b_billing_city' => '2_a_b_billing_city varchar(64)',
1004 '2_a_b_home_city' => '2_a_b_home_city varchar(64)',
1005 '2_a_b_main_city' => '2_a_b_main_city varchar(64)',
1006 '2_a_b_other_city' => '2_a_b_other_city varchar(64)',
1007 '2_a_b_whare_kai_city' => '2_a_b_whare_kai_city varchar(64)',
1008 '2_a_b_city' => '2_a_b_city varchar(64)',
1009 '8_a_b_billing_city' => '8_a_b_billing_city varchar(64)',
1010 '8_a_b_home_city' => '8_a_b_home_city varchar(64)',
1011 '8_a_b_main_city' => '8_a_b_main_city varchar(64)',
1012 '8_a_b_other_city' => '8_a_b_other_city varchar(64)',
1013 '8_a_b_whare_kai_city' => '8_a_b_whare_kai_city varchar(64)',
1014 '8_a_b_city' => '8_a_b_city varchar(64)',
1015 '5_a_b_billing_city' => '5_a_b_billing_city varchar(64)',
1016 '5_a_b_home_city' => '5_a_b_home_city varchar(64)',
1017 '5_a_b_main_city' => '5_a_b_main_city varchar(64)',
1018 '5_a_b_other_city' => '5_a_b_other_city varchar(64)',
1019 '5_a_b_whare_kai_city' => '5_a_b_whare_kai_city varchar(64)',
1020 '5_a_b_city' => '5_a_b_city varchar(64)',
a16a432a 1021 ], $sqlColumns);
1022 }
1023
4d251131 1024 /**
1025 * Test master_address_id field.
1026 */
1027 public function testExportMasterAddress() {
1028 $this->setUpContactExportData();
1029
994a070c 1030 //export the master address for contact B
1031 $selectedFields = array(
1032 array('Individual', 'master_id', 1),
1033 );
1034 list($tableName, $sqlColumns) = CRM_Export_BAO_Export::exportComponents(
1035 TRUE,
4d251131 1036 array($this->contactIDs[1]),
994a070c 1037 array(),
1038 NULL,
1039 $selectedFields,
1040 NULL,
1041 CRM_Export_Form_Select::CONTACT_EXPORT,
4d251131 1042 "contact_a.id IN ({$this->contactIDs[1]})",
994a070c 1043 NULL,
1044 FALSE,
1045 FALSE,
1046 array(
1047 'exportOption' => CRM_Export_Form_Select::CONTACT_EXPORT,
1048 'suppress_csv_for_testing' => TRUE,
1049 )
1050 );
1051 $field = key($sqlColumns);
1052
1053 //assert the exported result
1054 $masterName = CRM_Core_DAO::singleValueQuery("SELECT {$field} FROM {$tableName}");
77544f6f 1055 $displayName = CRM_Contact_BAO_Contact::getMasterDisplayName($this->masterAddressID);
994a070c 1056 $this->assertEquals($displayName, $masterName);
1057
1058 // delete the export temp table and component table
1059 $sql = "DROP TABLE IF EXISTS {$tableName}";
1060 CRM_Core_DAO::executeQuery($sql);
1061 }
1062
6382c24c
LCA
1063 /**
1064 * Test that deceased and do not mail contacts are removed from contacts before
6d52bfe5 1065 *
1066 * @dataProvider getReasonsNotToMail
1067 *
1068 * @param array $reason
1069 * @param array $addressReason
6382c24c 1070 */
6d52bfe5 1071 public function testExportDeceasedDoNotMail($reason, $addressReason) {
6382c24c
LCA
1072 $contactA = $this->callAPISuccess('contact', 'create', array(
1073 'first_name' => 'John',
1074 'last_name' => 'Doe',
1075 'contact_type' => 'Individual',
1076 ));
1077
6d52bfe5 1078 $contactB = $this->callAPISuccess('contact', 'create', array_merge([
6382c24c
LCA
1079 'first_name' => 'Jane',
1080 'last_name' => 'Doe',
1081 'contact_type' => 'Individual',
6d52bfe5 1082 ], $reason));
6382c24c
LCA
1083
1084 //create address for contact A
6d52bfe5 1085 $this->callAPISuccess('address', 'create', [
6382c24c
LCA
1086 'contact_id' => $contactA['id'],
1087 'location_type_id' => 'Home',
1088 'street_address' => 'ABC 12',
1089 'postal_code' => '123 AB',
1090 'country_id' => '1152',
1091 'city' => 'ABC',
1092 'is_primary' => 1,
6d52bfe5 1093 ]);
6382c24c
LCA
1094
1095 //create address for contact B
6d52bfe5 1096 $this->callAPISuccess('address', 'create', array_merge([
6382c24c
LCA
1097 'contact_id' => $contactB['id'],
1098 'location_type_id' => 'Home',
1099 'street_address' => 'ABC 12',
1100 'postal_code' => '123 AB',
1101 'country_id' => '1152',
1102 'city' => 'ABC',
1103 'is_primary' => 1,
6d52bfe5 1104 ], $addressReason));
6382c24c
LCA
1105
1106 //export and merge contacts with same address
c8925481 1107 list($tableName, $sqlColumns, $headerRows, $processor) = CRM_Export_BAO_Export::exportComponents(
6382c24c
LCA
1108 TRUE,
1109 array($contactA['id'], $contactB['id']),
1110 array(),
1111 NULL,
1112 NULL,
1113 NULL,
1114 CRM_Export_Form_Select::CONTACT_EXPORT,
1115 "contact_a.id IN ({$contactA['id']}, {$contactB['id']})",
1116 NULL,
1117 TRUE,
1118 FALSE,
1119 array(
1120 'exportOption' => CRM_Export_Form_Select::CONTACT_EXPORT,
1121 'mergeOption' => TRUE,
1122 'suppress_csv_for_testing' => TRUE,
1123 'postal_mailing_export' => array(
1124 'postal_mailing_export' => TRUE,
1125 ),
1126 )
1127 );
1128
c8925481 1129 $this->assertTrue(!in_array('state_province_id', $processor->getHeaderRows()));
6382c24c
LCA
1130 $greeting = CRM_Core_DAO::singleValueQuery("SELECT email_greeting FROM {$tableName}");
1131
1132 //Assert email_greeting is not merged
1133 $this->assertNotContains(',', (string) $greeting);
1134
1135 // delete the export temp table and component table
1136 $sql = "DROP TABLE IF EXISTS {$tableName}";
1137 CRM_Core_DAO::executeQuery($sql);
1138 }
1139
6d52bfe5 1140 /**
1141 * Get reasons that a contact is not postalable.
1142 * @return array
1143 */
1144 public function getReasonsNotToMail() {
1145 return [
1146 [['is_deceased' => 1], []],
1147 [['do_not_mail' => 1], []],
1148 [[], ['street_address' => '']],
1149 ];
1150 }
2593f7dc 1151 /**
1152 * @return array
1153 */
1154 protected function setUpHousehold() {
1155 $this->setUpContactExportData();
1156 $householdID = $this->householdCreate([
cedeaa5c 1157 'source' => 'household sauce',
2593f7dc 1158 'api.Address.create' => [
1159 'city' => 'Portland',
1160 'state_province_id' => 'Maine',
1161 'location_type_id' => 'Home'
1162 ]
1163 ]);
1164
1165 $relationshipTypes = $this->callAPISuccess('RelationshipType', 'get', [])['values'];
1166 $houseHoldTypeID = NULL;
1167 foreach ($relationshipTypes as $id => $relationshipType) {
1168 if ($relationshipType['name_a_b'] === 'Household Member of') {
1169 $houseHoldTypeID = $relationshipType['id'];
1170 }
1171 }
1172 $this->callAPISuccess('Relationship', 'create', [
1173 'contact_id_a' => $this->contactIDs[0],
1174 'contact_id_b' => $householdID,
1175 'relationship_type_id' => $houseHoldTypeID,
1176 ]);
1177 $this->callAPISuccess('Relationship', 'create', [
1178 'contact_id_a' => $this->contactIDs[1],
1179 'contact_id_b' => $householdID,
1180 'relationship_type_id' => $houseHoldTypeID,
1181 ]);
1182 return array($householdID, $houseHoldTypeID);
1183 }
1184
3663269c 1185 /**
704e3e9a 1186 * Do a CiviCRM export.
1187 *
3663269c 1188 * @param $selectedFields
704e3e9a 1189 * @param int $id
1190 *
c66a5741 1191 * @param int $exportMode
1192 *
3663269c 1193 * @return array
1194 */
c66a5741 1195 protected function doExport($selectedFields, $id, $exportMode = CRM_Export_Form_Select::CONTACT_EXPORT) {
f797aeb8 1196 $ids = (array) $id;
3663269c 1197 list($tableName, $sqlColumns) = CRM_Export_BAO_Export::exportComponents(
1198 TRUE,
f797aeb8 1199 $ids,
3663269c 1200 array(),
1201 NULL,
1202 $selectedFields,
1203 NULL,
c66a5741 1204 $exportMode,
f797aeb8 1205 "contact_a.id IN (" . implode(',', $ids) . ")",
3663269c 1206 NULL,
1207 FALSE,
1208 FALSE,
1209 array(
1210 'exportOption' => CRM_Export_Form_Select::CONTACT_EXPORT,
1211 'suppress_csv_for_testing' => TRUE,
1212 )
1213 );
1214 return array($tableName, $sqlColumns);
1215 }
1216
0a3b035f 1217 /**
1218 * Ensure component is enabled.
1219 *
1220 * @param int $exportMode
1221 */
1222 public function ensureComponentIsEnabled($exportMode) {
1223 if ($exportMode === CRM_Export_Form_Select::CASE_EXPORT) {
1224 CRM_Core_BAO_ConfigSetting::enableComponent('CiviCase');
1225 }
1226 }
1227
ce14544c 1228 /**
1229 * Test our export all field metadata retrieval.
1230 *
1231 * @dataProvider additionalFieldsDataProvider
1232 * @param int $exportMode
1233 * @param $expected
1234 */
1235 public function testAdditionalReturnProperties($exportMode, $expected) {
1236 $this->ensureComponentIsEnabled($exportMode);
1237 $processor = new CRM_Export_BAO_ExportProcessor($exportMode, NULL, 'AND');
1238 $metadata = $processor->getAdditionalReturnProperties();
1239 $this->assertEquals($expected, $metadata);
1240 }
1241
1242 /**
1243 * Test our export all field metadata retrieval.
1244 *
1245 * @dataProvider allFieldsDataProvider
1246 * @param int $exportMode
1247 * @param $expected
1248 */
1249 public function testDefaultReturnProperties($exportMode, $expected) {
1250 $this->ensureComponentIsEnabled($exportMode);
1251 $processor = new CRM_Export_BAO_ExportProcessor($exportMode, NULL, 'AND');
1252 $metadata = $processor->getDefaultReturnProperties();
1253 $this->assertEquals($expected, $metadata);
1254 }
1255
1256 /**
1257 * Get fields returned from additionalFields function.
1258 *
1259 * @return array
1260 */
1261 public function additionalFieldsDataProvider() {
1262 return [
1263 [
1264 'anything that will then be defaulting ton contact',
1265 $this->getExtraReturnProperties(),
1266 ],
1267 [
1268 CRM_Export_Form_Select::ACTIVITY_EXPORT,
1269 array_merge($this->getExtraReturnProperties(), $this->getActivityReturnProperties()),
1270 ],
1271 [
1272 CRM_Export_Form_Select::CASE_EXPORT,
1273 array_merge($this->getExtraReturnProperties(), $this->getCaseReturnProperties()),
1274 ],
1275 [
1276 CRM_Export_Form_Select::CONTRIBUTE_EXPORT,
1277 array_merge($this->getExtraReturnProperties(), $this->getContributionReturnProperties()),
1278 ],
1279 [
1280 CRM_Export_Form_Select::EVENT_EXPORT,
1281 array_merge($this->getExtraReturnProperties(), $this->getEventReturnProperties()),
1282 ],
1283 [
1284 CRM_Export_Form_Select::MEMBER_EXPORT,
1285 array_merge($this->getExtraReturnProperties(), $this->getMembershipReturnProperties()),
1286 ],
1287 [
1288 CRM_Export_Form_Select::PLEDGE_EXPORT,
1289 array_merge($this->getExtraReturnProperties(), $this->getPledgeReturnProperties()),
1290 ],
1291
1292 ];
1293 }
1294
1295 /**
1296 * get data for testing field metadata by query mode.
1297 */
1298 public function allFieldsDataProvider() {
1299 return [
1300 [
1301 'anything that will then be defaulting ton contact',
1302 $this->getBasicReturnProperties(TRUE),
1303 ],
1304 [
1305 CRM_Export_Form_Select::ACTIVITY_EXPORT,
1306 array_merge($this->getBasicReturnProperties(FALSE), $this->getActivityReturnProperties()),
1307 ],
1308 [
1309 CRM_Export_Form_Select::CASE_EXPORT,
1310 array_merge($this->getBasicReturnProperties(FALSE), $this->getCaseReturnProperties()),
1311 ],
1312 [
1313 CRM_Export_Form_Select::CONTRIBUTE_EXPORT,
1314 array_merge($this->getBasicReturnProperties(FALSE), $this->getContributionReturnProperties()),
1315 ],
1316 [
1317 CRM_Export_Form_Select::EVENT_EXPORT,
1318 array_merge($this->getBasicReturnProperties(FALSE), $this->getEventReturnProperties()),
1319 ],
1320 [
1321 CRM_Export_Form_Select::MEMBER_EXPORT,
1322 array_merge($this->getBasicReturnProperties(FALSE), $this->getMembershipReturnProperties()),
1323 ],
1324 [
1325 CRM_Export_Form_Select::PLEDGE_EXPORT,
1326 array_merge($this->getBasicReturnProperties(FALSE), $this->getPledgeReturnProperties()),
1327 ],
1328 ];
1329 }
1330
1331 /**
1332 * Get return properties manually added in.
1333 */
1334 public function getExtraReturnProperties() {
7626754f 1335 return [];
ce14544c 1336 }
1337
1338 /**
1339 * Get basic return properties.
1340 *
704e3e9a 1341 * @param bool $isContactMode
ce14544c 1342 * Are we in contact mode or not
1343 *
1344 * @return array
1345 */
1346 protected function getBasicReturnProperties($isContactMode) {
1347 $returnProperties = [
1348 'id' => 1,
1349 'contact_type' => 1,
1350 'contact_sub_type' => 1,
1351 'do_not_email' => 1,
1352 'do_not_phone' => 1,
1353 'do_not_mail' => 1,
1354 'do_not_sms' => 1,
1355 'do_not_trade' => 1,
1356 'is_opt_out' => 1,
1357 'legal_identifier' => 1,
1358 'external_identifier' => 1,
1359 'sort_name' => 1,
1360 'display_name' => 1,
1361 'nick_name' => 1,
1362 'legal_name' => 1,
1363 'image_URL' => 1,
1364 'preferred_communication_method' => 1,
1365 'preferred_language' => 1,
1366 'preferred_mail_format' => 1,
1367 'hash' => 1,
1368 'contact_source' => 1,
1369 'first_name' => 1,
1370 'middle_name' => 1,
1371 'last_name' => 1,
1372 'prefix_id' => 1,
1373 'suffix_id' => 1,
1374 'formal_title' => 1,
1375 'communication_style_id' => 1,
1376 'email_greeting_id' => 1,
1377 'postal_greeting_id' => 1,
1378 'addressee_id' => 1,
1379 'job_title' => 1,
1380 'gender_id' => 1,
1381 'birth_date' => 1,
1382 'is_deceased' => 1,
1383 'deceased_date' => 1,
1384 'household_name' => 1,
1385 'organization_name' => 1,
1386 'sic_code' => 1,
1387 'user_unique_id' => 1,
1388 'current_employer_id' => 1,
1389 'contact_is_deleted' => 1,
1390 'created_date' => 1,
1391 'modified_date' => 1,
1392 'addressee' => 1,
1393 'email_greeting' => 1,
1394 'postal_greeting' => 1,
1395 'current_employer' => 1,
1396 'location_type' => 1,
1397 'street_address' => 1,
1398 'street_number' => 1,
1399 'street_number_suffix' => 1,
1400 'street_name' => 1,
1401 'street_unit' => 1,
1402 'supplemental_address_1' => 1,
1403 'supplemental_address_2' => 1,
1404 'supplemental_address_3' => 1,
1405 'city' => 1,
1406 'postal_code_suffix' => 1,
1407 'postal_code' => 1,
1408 'geo_code_1' => 1,
1409 'geo_code_2' => 1,
1410 'address_name' => 1,
1411 'master_id' => 1,
1412 'county' => 1,
1413 'state_province' => 1,
1414 'country' => 1,
1415 'phone' => 1,
1416 'phone_ext' => 1,
1417 'email' => 1,
1418 'on_hold' => 1,
1419 'is_bulkmail' => 1,
1420 'signature_text' => 1,
1421 'signature_html' => 1,
1422 'im_provider' => 1,
1423 'im' => 1,
1424 'openid' => 1,
1425 'world_region' => 1,
1426 'url' => 1,
1427 'groups' => 1,
1428 'tags' => 1,
1429 'notes' => 1,
1430 'phone_type_id' => 1,
ce14544c 1431 ];
1432 if (!$isContactMode) {
1433 unset($returnProperties['groups']);
1434 unset($returnProperties['tags']);
1435 unset($returnProperties['notes']);
1436 }
1437 return $returnProperties;
1438 }
1439
1440 /**
1441 * Get return properties for pledges.
1442 *
1443 * @return array
1444 */
1445 public function getPledgeReturnProperties() {
1446 return [
1447 'contact_type' => 1,
1448 'contact_sub_type' => 1,
1449 'sort_name' => 1,
1450 'display_name' => 1,
1451 'pledge_id' => 1,
1452 'pledge_amount' => 1,
1453 'pledge_total_paid' => 1,
1454 'pledge_create_date' => 1,
1455 'pledge_start_date' => 1,
1456 'pledge_next_pay_date' => 1,
1457 'pledge_next_pay_amount' => 1,
1458 'pledge_status' => 1,
1459 'pledge_is_test' => 1,
1460 'pledge_contribution_page_id' => 1,
1461 'pledge_financial_type' => 1,
1462 'pledge_frequency_interval' => 1,
1463 'pledge_frequency_unit' => 1,
1464 'pledge_currency' => 1,
1465 'pledge_campaign_id' => 1,
1466 'pledge_balance_amount' => 1,
1467 'pledge_payment_id' => 1,
1468 'pledge_payment_scheduled_amount' => 1,
1469 'pledge_payment_scheduled_date' => 1,
1470 'pledge_payment_paid_amount' => 1,
1471 'pledge_payment_paid_date' => 1,
1472 'pledge_payment_reminder_date' => 1,
1473 'pledge_payment_reminder_count' => 1,
1474 'pledge_payment_status' => 1,
1475 ];
1476 }
1477
1478 /**
1479 * Get membership return properties.
1480 *
1481 * @return array
1482 */
1483 public function getMembershipReturnProperties() {
1484 return [
ce14544c 1485 'contact_type' => 1,
1486 'contact_sub_type' => 1,
1487 'sort_name' => 1,
1488 'display_name' => 1,
1489 'membership_type' => 1,
1490 'member_is_test' => 1,
1491 'member_is_pay_later' => 1,
1492 'join_date' => 1,
1493 'membership_start_date' => 1,
1494 'membership_end_date' => 1,
1495 'membership_source' => 1,
1496 'membership_status' => 1,
1497 'membership_id' => 1,
1498 'owner_membership_id' => 1,
1499 'max_related' => 1,
1500 'membership_recur_id' => 1,
1501 'member_campaign_id' => 1,
1502 'member_is_override' => 1,
1503 'member_auto_renew' => 1,
1504 ];
1505 }
1506
1507 /**
1508 * Get return properties for events.
1509 *
1510 * @return array
1511 */
1512 public function getEventReturnProperties() {
1513 return [
1514 'contact_type' => 1,
1515 'contact_sub_type' => 1,
1516 'sort_name' => 1,
1517 'display_name' => 1,
1518 'event_id' => 1,
1519 'event_title' => 1,
1520 'event_start_date' => 1,
1521 'event_end_date' => 1,
1522 'event_type' => 1,
1523 'participant_id' => 1,
1524 'participant_status' => 1,
1525 'participant_status_id' => 1,
1526 'participant_role' => 1,
1527 'participant_role_id' => 1,
1528 'participant_note' => 1,
1529 'participant_register_date' => 1,
1530 'participant_source' => 1,
1531 'participant_fee_level' => 1,
1532 'participant_is_test' => 1,
1533 'participant_is_pay_later' => 1,
1534 'participant_fee_amount' => 1,
1535 'participant_discount_name' => 1,
1536 'participant_fee_currency' => 1,
1537 'participant_registered_by_id' => 1,
1538 'participant_campaign_id' => 1,
1539 ];
1540 }
1541
1542 /**
1543 * Get return properties for activities.
1544 *
1545 * @return array
1546 */
1547 public function getActivityReturnProperties() {
1548 return [
1549 'activity_id' => 1,
1550 'contact_type' => 1,
1551 'contact_sub_type' => 1,
1552 'sort_name' => 1,
1553 'display_name' => 1,
1554 'activity_type' => 1,
1555 'activity_type_id' => 1,
1556 'activity_subject' => 1,
1557 'activity_date_time' => 1,
1558 'activity_duration' => 1,
1559 'activity_location' => 1,
1560 'activity_details' => 1,
1561 'activity_status' => 1,
1562 'activity_priority' => 1,
1563 'source_contact' => 1,
1564 'source_record_id' => 1,
1565 'activity_is_test' => 1,
1566 'activity_campaign_id' => 1,
1567 'result' => 1,
1568 'activity_engagement_level' => 1,
1569 'parent_id' => 1,
1570 ];
1571 }
1572
1573 /**
1574 * Get return properties for Case.
1575 *
1576 * @return array
1577 */
1578 public function getCaseReturnProperties() {
1579 return [
1580 'contact_type' => 1,
1581 'contact_sub_type' => 1,
1582 'sort_name' => 1,
1583 'display_name' => 1,
1584 'phone' => 1,
1585 'case_start_date' => 1,
1586 'case_end_date' => 1,
1587 'case_subject' => 1,
1588 'case_source_contact_id' => 1,
1589 'case_activity_status' => 1,
1590 'case_activity_duration' => 1,
1591 'case_activity_medium_id' => 1,
1592 'case_activity_details' => 1,
1593 'case_activity_is_auto' => 1,
1594 'contact_id' => 1,
1595 'case_id' => 1,
1596 'case_activity_subject' => 1,
1597 'case_status' => 1,
1598 'case_type' => 1,
1599 'case_role' => 1,
1600 'case_deleted' => 1,
1601 'case_recent_activity_date' => 1,
1602 'case_recent_activity_type' => 1,
1603 'case_scheduled_activity_date' => 1,
1604 ];
1605 }
1606
1607 /**
1608 * Get return properties for contribution.
1609 *
1610 * @return array
1611 */
1612 public function getContributionReturnProperties() {
1613 return [
1614 'contact_type' => 1,
1615 'contact_sub_type' => 1,
1616 'sort_name' => 1,
1617 'display_name' => 1,
1618 'financial_type' => 1,
1619 'contribution_source' => 1,
1620 'receive_date' => 1,
1621 'thankyou_date' => 1,
1622 'cancel_date' => 1,
1623 'total_amount' => 1,
1624 'accounting_code' => 1,
1625 'payment_instrument' => 1,
1626 'payment_instrument_id' => 1,
1627 'contribution_check_number' => 1,
1628 'non_deductible_amount' => 1,
1629 'fee_amount' => 1,
1630 'net_amount' => 1,
1631 'trxn_id' => 1,
1632 'invoice_id' => 1,
1633 'invoice_number' => 1,
1634 'currency' => 1,
1635 'cancel_reason' => 1,
1636 'receipt_date' => 1,
ce14544c 1637 'is_test' => 1,
1638 'is_pay_later' => 1,
1639 'contribution_status' => 1,
1640 'contribution_recur_id' => 1,
1641 'amount_level' => 1,
1642 'contribution_note' => 1,
1643 'contribution_batch' => 1,
1644 'contribution_campaign_title' => 1,
1645 'contribution_campaign_id' => 1,
ce14544c 1646 'contribution_soft_credit_name' => 1,
1647 'contribution_soft_credit_amount' => 1,
1648 'contribution_soft_credit_type' => 1,
1649 'contribution_soft_credit_contact_id' => 1,
1650 'contribution_soft_credit_contribution_id' => 1,
1651 ];
1652 }
1653
0a3b035f 1654 /**
1655 * Test the column definition when 'all' fields defined.
1656 *
6c93b9a9 1657 * @param int $exportMode
1658 * @param array $expected
1659 * @param array $expectedHeaders
0a3b035f 1660 *
1661 * @dataProvider getSqlColumnsOutput
1662 */
6c93b9a9 1663 public function testGetSQLColumnsAndHeaders($exportMode, $expected, $expectedHeaders) {
0a3b035f 1664 $this->ensureComponentIsEnabled($exportMode);
1665 // We need some data so that we can get to the end of the export
1666 // function. Hopefully one day that won't be required to get metadata info out.
1667 // eventually aspire to call $provider->getSQLColumns straight after it
1668 // is intiated.
1669 $this->setupBaseExportData($exportMode);
1670
1671 $result = CRM_Export_BAO_Export::exportComponents(
1672 TRUE,
1673 [1],
1674 [],
1675 NULL,
1676 NULL,
1677 NULL,
1678 $exportMode,
1679 NULL,
1680 NULL,
1681 FALSE,
1682 FALSE,
1683 array(
1684 'exportOption' => CRM_Export_Form_Select::CONTRIBUTE_EXPORT,
1685 'suppress_csv_for_testing' => TRUE,
1686 )
1687 );
1688 $this->assertEquals($expected, $result[1]);
6c93b9a9 1689 $this->assertEquals($expectedHeaders, $result[2]);
0a3b035f 1690 }
1691
5506290d 1692 /**
1693 * Test exported with fields to output specified.
1694 *
1695 * @dataProvider getAllSpecifiableReturnFields
1696 *
1697 * @param int $exportMode
1698 * @param array $selectedFields
1699 * @param array $expected
1700 */
1701 public function testExportSpecifyFields($exportMode, $selectedFields, $expected) {
1702 $this->ensureComponentIsEnabled($exportMode);
1703 $this->setUpContributionExportData();
c66a5741 1704 list($tableName, $sqlColumns) = $this->doExport($selectedFields, $this->contactIDs[1], $exportMode);
5506290d 1705 $this->assertEquals($expected, $sqlColumns);
1706 }
1707
c66a5741 1708 /**
1709 * Test export fields when no payment fields to be exported.
1710 */
1711 public function textExportParticipantSpecifyFieldsNoPayment() {
1712 $selectedFields = $this->getAllSpecifiableParticipantReturnFields();
1713 foreach ($selectedFields as $index => $field) {
1714 if (substr($field[1], 0, 22) === 'componentPaymentField_') {
1715 unset ($selectedFields[$index]);
1716 }
1717 }
1718
1719 $expected = $this->getAllSpecifiableParticipantReturnFields();
1720 foreach ($expected as $index => $field) {
1721 if (substr($index, 0, 22) === 'componentPaymentField_') {
1722 unset ($expected[$index]);
1723 }
1724 }
1725
1726 list($tableName, $sqlColumns) = $this->doExport($selectedFields, $this->contactIDs[1], CRM_Export_Form_Select::EVENT_EXPORT);
1727 $this->assertEquals($expected, $sqlColumns);
1728 }
5506290d 1729 /**
1730 * Get all return fields (@todo - still being built up.
1731 *
1732 * @return array
1733 */
1734 public function getAllSpecifiableReturnFields() {
1735 return [
1736 [
1737 CRM_Export_Form_Select::EVENT_EXPORT,
1738 $this->getAllSpecifiableParticipantReturnFields(),
c66a5741 1739 $this->getAllSpecifiableParticipantReturnColumns(),
5506290d 1740 ],
1741 ];
1742 }
1743
c66a5741 1744 /**
1745 * Get expected return column output for participant mode return all columns.
1746 *
1747 * @return array
1748 */
1749 public function getAllSpecifiableParticipantReturnColumns() {
1750 return [
1751 'participant_campaign_id' => 'participant_campaign_id varchar(128)',
1752 'participant_contact_id' => 'participant_contact_id varchar(16)',
1753 'componentpaymentfield_contribution_status' => 'componentpaymentfield_contribution_status text',
1754 'currency' => 'currency varchar(3)',
1755 'componentpaymentfield_received_date' => 'componentpaymentfield_received_date text',
1756 'default_role_id' => 'default_role_id varchar(16)',
1757 'participant_discount_name' => 'participant_discount_name varchar(16)',
1758 'event_id' => 'event_id varchar(16)',
1759 'event_end_date' => 'event_end_date varchar(32)',
1760 'event_start_date' => 'event_start_date varchar(32)',
1761 'template_title' => 'template_title varchar(255)',
1762 'event_title' => 'event_title varchar(255)',
1763 'participant_fee_amount' => 'participant_fee_amount varchar(32)',
1764 'participant_fee_currency' => 'participant_fee_currency varchar(3)',
1765 'fee_label' => 'fee_label varchar(255)',
1766 'participant_fee_level' => 'participant_fee_level longtext',
1767 'participant_is_pay_later' => 'participant_is_pay_later varchar(16)',
1768 'participant_id' => 'participant_id varchar(16)',
1769 'participant_note' => 'participant_note text',
1770 'participant_role_id' => 'participant_role_id varchar(128)',
1771 'participant_role' => 'participant_role varchar(255)',
1772 'participant_source' => 'participant_source varchar(128)',
1773 'participant_status_id' => 'participant_status_id varchar(16)',
1774 'participant_status' => 'participant_status varchar(255)',
1775 'participant_register_date' => 'participant_register_date varchar(32)',
1776 'participant_registered_by_id' => 'participant_registered_by_id varchar(16)',
1777 'participant_is_test' => 'participant_is_test varchar(16)',
1778 'componentpaymentfield_total_amount' => 'componentpaymentfield_total_amount text',
1779 'componentpaymentfield_transaction_id' => 'componentpaymentfield_transaction_id varchar(255)',
1780 'transferred_to_contact_id' => 'transferred_to_contact_id varchar(16)',
1781 ];
1782 }
1783
5506290d 1784 /**
1785 * @return array
1786 */
1787 public function getAllSpecifiableParticipantReturnFields() {
1788 return [
1789 0 =>
1790 [
1791 0 => 'Participant',
1792 1 => '',
1793 ],
1794 1 =>
1795 [
1796 0 => 'Participant',
1797 1 => 'participant_campaign_id',
1798 ],
1799 2 =>
1800 [
1801 0 => 'Participant',
1802 1 => 'participant_contact_id',
1803 ],
1804 3 =>
1805 [
1806 0 => 'Participant',
1807 1 => 'componentPaymentField_contribution_status',
1808 ],
1809 4 =>
1810 [
1811 0 => 'Participant',
1812 1 => 'currency',
1813 ],
1814 5 =>
1815 [
1816 0 => 'Participant',
1817 1 => 'componentPaymentField_received_date',
1818 ],
1819 6 =>
1820 [
1821 0 => 'Participant',
1822 1 => 'default_role_id',
1823 ],
1824 7 =>
1825 [
1826 0 => 'Participant',
1827 1 => 'participant_discount_name',
1828 ],
1829 8 =>
1830 [
1831 0 => 'Participant',
1832 1 => 'event_id',
1833 ],
1834 9 =>
1835 [
1836 0 => 'Participant',
1837 1 => 'event_end_date',
1838 ],
1839 10 =>
1840 [
1841 0 => 'Participant',
1842 1 => 'event_start_date',
1843 ],
1844 11 =>
1845 [
1846 0 => 'Participant',
1847 1 => 'template_title',
1848 ],
1849 12 =>
1850 [
1851 0 => 'Participant',
1852 1 => 'event_title',
1853 ],
1854 13 =>
1855 [
1856 0 => 'Participant',
1857 1 => 'participant_fee_amount',
1858 ],
1859 14 =>
1860 [
1861 0 => 'Participant',
1862 1 => 'participant_fee_currency',
1863 ],
1864 15 =>
1865 [
1866 0 => 'Participant',
1867 1 => 'fee_label',
1868 ],
1869 16 =>
1870 [
1871 0 => 'Participant',
1872 1 => 'participant_fee_level',
1873 ],
1874 17 =>
1875 [
1876 0 => 'Participant',
1877 1 => 'participant_is_pay_later',
1878 ],
1879 18 =>
1880 [
1881 0 => 'Participant',
1882 1 => 'participant_id',
1883 ],
1884 19 =>
1885 [
1886 0 => 'Participant',
1887 1 => 'participant_note',
1888 ],
1889 20 =>
1890 [
1891 0 => 'Participant',
1892 1 => 'participant_role_id',
1893 ],
1894 21 =>
1895 [
1896 0 => 'Participant',
1897 1 => 'participant_role',
1898 ],
1899 22 =>
1900 [
1901 0 => 'Participant',
1902 1 => 'participant_source',
1903 ],
1904 23 =>
1905 [
1906 0 => 'Participant',
1907 1 => 'participant_status_id',
1908 ],
1909 24 =>
1910 [
1911 0 => 'Participant',
1912 1 => 'participant_status',
1913 ],
1914 25 =>
1915 [
1916 0 => 'Participant',
1917 1 => 'participant_status',
1918 ],
1919 26 =>
1920 [
1921 0 => 'Participant',
1922 1 => 'participant_register_date',
1923 ],
1924 27 =>
1925 [
1926 0 => 'Participant',
1927 1 => 'participant_registered_by_id',
1928 ],
1929 28 =>
1930 [
1931 0 => 'Participant',
1932 1 => 'participant_is_test',
1933 ],
1934 29 =>
1935 [
1936 0 => 'Participant',
1937 1 => 'componentPaymentField_total_amount',
1938 ],
1939 30 =>
1940 [
1941 0 => 'Participant',
1942 1 => 'componentPaymentField_transaction_id',
1943 ],
1944 31 =>
1945 [
1946 0 => 'Participant',
1947 1 => 'transferred_to_contact_id',
1948 ],
1949 ];
1950 }
1951
0a3b035f 1952 /**
1953 * @param string $exportMode
1954 */
1955 public function setupBaseExportData($exportMode) {
1956 $this->createLoggedInUser();
1957 if ($exportMode === CRM_Export_Form_Select::CASE_EXPORT) {
1958 $this->setupCaseExportData();
1959 }
1960 if ($exportMode === CRM_Export_Form_Select::CONTRIBUTE_EXPORT) {
1961 $this->setUpContributionExportData();
1962 }
1963 if ($exportMode === CRM_Export_Form_Select::MEMBER_EXPORT) {
1964 $this->setUpMembershipExportData();
1965 }
1966 if ($exportMode === CRM_Export_Form_Select::ACTIVITY_EXPORT) {
1967 $this->setUpActivityExportData();
1968 }
1969 }
1970
1971 /**
1972 * Get comprehensive sql columns output.
1973 *
1974 * @return array
1975 */
1976 public function getSqlColumnsOutput() {
1977 return [
1978 [
1979 'anything that will then be defaulting ton contact',
1980 $this->getBasicSqlColumnDefinition(TRUE),
6c93b9a9 1981 $this->getBasicHeaderDefinition(TRUE),
0a3b035f 1982 ],
1983 [
1984 CRM_Export_Form_Select::ACTIVITY_EXPORT,
1985 array_merge($this->getBasicSqlColumnDefinition(FALSE), $this->getActivitySqlColumns()),
6c93b9a9 1986 array_merge($this->getBasicHeaderDefinition(FALSE), $this->getActivityHeaderDefinition()),
0a3b035f 1987 ],
1988 [
1989 CRM_Export_Form_Select::CASE_EXPORT,
1990 array_merge($this->getBasicSqlColumnDefinition(FALSE), $this->getCaseSqlColumns()),
6c93b9a9 1991 array_merge($this->getBasicHeaderDefinition(FALSE), $this->getCaseHeaderDefinition()),
0a3b035f 1992 ],
1993 [
1994 CRM_Export_Form_Select::CONTRIBUTE_EXPORT,
1995 array_merge($this->getBasicSqlColumnDefinition(FALSE), $this->getContributionSqlColumns()),
6c93b9a9 1996 array_merge($this->getBasicHeaderDefinition(FALSE), $this->getContributeHeaderDefinition()),
0a3b035f 1997 ],
1998 [
1999 CRM_Export_Form_Select::EVENT_EXPORT,
2000 array_merge($this->getBasicSqlColumnDefinition(FALSE), $this->getParticipantSqlColumns()),
6c93b9a9 2001 array_merge($this->getBasicHeaderDefinition(FALSE), $this->getParticipantHeaderDefinition()),
0a3b035f 2002 ],
2003 [
2004 CRM_Export_Form_Select::MEMBER_EXPORT,
2005 array_merge($this->getBasicSqlColumnDefinition(FALSE), $this->getMembershipSqlColumns()),
6c93b9a9 2006 array_merge($this->getBasicHeaderDefinition(FALSE), $this->getMemberHeaderDefinition()),
0a3b035f 2007 ],
2008 [
2009 CRM_Export_Form_Select::PLEDGE_EXPORT,
2010 array_merge($this->getBasicSqlColumnDefinition(FALSE), $this->getPledgeSqlColumns()),
6c93b9a9 2011 array_merge($this->getBasicHeaderDefinition(FALSE), $this->getPledgeHeaderDefinition()),
0a3b035f 2012 ],
2013
2014 ];
2015 }
2016
6c93b9a9 2017 /**
2018 * Get the header definition for exports.
2019 *
2020 * @param bool $isContactExport
2021 *
2022 * @return array
2023 */
2024 protected function getBasicHeaderDefinition($isContactExport) {
2025 $headers = [
2026 0 => 'Contact ID',
2027 1 => 'Contact Type',
2028 2 => 'Contact Subtype',
2029 3 => 'Do Not Email',
2030 4 => 'Do Not Phone',
2031 5 => 'Do Not Mail',
2032 6 => 'Do Not Sms',
2033 7 => 'Do Not Trade',
2034 8 => 'No Bulk Emails (User Opt Out)',
2035 9 => 'Legal Identifier',
2036 10 => 'External Identifier',
2037 11 => 'Sort Name',
2038 12 => 'Display Name',
2039 13 => 'Nickname',
2040 14 => 'Legal Name',
2041 15 => 'Image Url',
2042 16 => 'Preferred Communication Method',
2043 17 => 'Preferred Language',
2044 18 => 'Preferred Mail Format',
2045 19 => 'Contact Hash',
2046 20 => 'Contact Source',
2047 21 => 'First Name',
2048 22 => 'Middle Name',
2049 23 => 'Last Name',
2050 24 => 'Individual Prefix',
2051 25 => 'Individual Suffix',
2052 26 => 'Formal Title',
2053 27 => 'Communication Style',
2054 28 => 'Email Greeting ID',
2055 29 => 'Postal Greeting ID',
2056 30 => 'Addressee ID',
2057 31 => 'Job Title',
2058 32 => 'Gender',
2059 33 => 'Birth Date',
2060 34 => 'Deceased',
2061 35 => 'Deceased Date',
2062 36 => 'Household Name',
2063 37 => 'Organization Name',
2064 38 => 'Sic Code',
2065 39 => 'Unique ID (OpenID)',
2066 40 => 'Current Employer ID',
2067 41 => 'Contact is in Trash',
2068 42 => 'Created Date',
2069 43 => 'Modified Date',
2070 44 => 'Addressee',
2071 45 => 'Email Greeting',
2072 46 => 'Postal Greeting',
2073 47 => 'Current Employer',
2074 48 => 'Location Type',
2075 49 => 'Street Address',
2076 50 => 'Street Number',
2077 51 => 'Street Number Suffix',
2078 52 => 'Street Name',
2079 53 => 'Street Unit',
2080 54 => 'Supplemental Address 1',
2081 55 => 'Supplemental Address 2',
2082 56 => 'Supplemental Address 3',
2083 57 => 'City',
2084 58 => 'Postal Code Suffix',
2085 59 => 'Postal Code',
2086 60 => 'Latitude',
2087 61 => 'Longitude',
2088 62 => 'Address Name',
2089 63 => 'Master Address Belongs To',
2090 64 => 'County',
2091 65 => 'State',
2092 66 => 'Country',
2093 67 => 'Phone',
2094 68 => 'Phone Extension',
219c47d6 2095 69 => 'Phone Type',
2096 70 => 'Email',
2097 71 => 'On Hold',
2098 72 => 'Use for Bulk Mail',
2099 73 => 'Signature Text',
2100 74 => 'Signature Html',
2101 75 => 'IM Provider',
2102 76 => 'IM Screen Name',
2103 77 => 'OpenID',
2104 78 => 'World Region',
2105 79 => 'Website',
2106 80 => 'Group(s)',
2107 81 => 'Tag(s)',
2108 82 => 'Note(s)',
6c93b9a9 2109 ];
2110 if (!$isContactExport) {
6c93b9a9 2111 unset($headers[80]);
2112 unset($headers[81]);
219c47d6 2113 unset($headers[82]);
6c93b9a9 2114 }
2115 return $headers;
2116 }
2117
2118 /**
2119 * Get the definition for activity headers.
2120 *
2121 * @return array
2122 */
2123 protected function getActivityHeaderDefinition() {
2124 return [
2125 81 => 'Activity ID',
2126 82 => 'Activity Type',
2127 83 => 'Activity Type ID',
2128 84 => 'Subject',
2129 85 => 'Activity Date',
2130 86 => 'Duration',
2131 87 => 'Location',
2132 88 => 'Details',
2133 89 => 'Activity Status',
2134 90 => 'Activity Priority',
2135 91 => 'Source Contact',
2136 92 => 'source_record_id',
2137 93 => 'Test',
2138 94 => 'Campaign ID',
2139 95 => 'result',
2140 96 => 'Engagement Index',
2141 97 => 'parent_id',
2142 ];
2143 }
2144
2145 /**
2146 * Get the definition for case headers.
2147 *
2148 * @return array
2149 */
2150 protected function getCaseHeaderDefinition() {
2151 return [
2152 81 => 'contact_id',
2153 82 => 'Case ID',
2154 83 => 'case_activity_subject',
2155 84 => 'Case Subject',
2156 85 => 'Case Status',
2157 86 => 'Case Type',
2158 87 => 'Role in Case',
2159 88 => 'Case is in the Trash',
2160 89 => 'case_recent_activity_date',
2161 90 => 'case_recent_activity_type',
2162 91 => 'case_scheduled_activity_date',
2163 92 => 'Case Start Date',
2164 93 => 'Case End Date',
2165 94 => 'case_source_contact_id',
2166 95 => 'case_activity_status',
2167 96 => 'case_activity_duration',
2168 97 => 'case_activity_medium_id',
2169 98 => 'case_activity_details',
2170 99 => 'case_activity_is_auto',
2171 ];
2172 }
2173
2174 /**
2175 * Get the definition for contribute headers.
2176 *
2177 * @return array
2178 */
2179 protected function getContributeHeaderDefinition() {
2180 return [
2181 81 => 'Financial Type',
2182 82 => 'Contribution Source',
2183 83 => 'Date Received',
2184 84 => 'Thank-you Date',
2185 85 => 'Cancel Date',
2186 86 => 'Total Amount',
2187 87 => 'Accounting Code',
a0090e6b 2188 88 => 'Payment Methods',
6c93b9a9 2189 89 => 'Payment Method ID',
2190 90 => 'Check Number',
2191 91 => 'Non-deductible Amount',
2192 92 => 'Fee Amount',
2193 93 => 'Net Amount',
2194 94 => 'Transaction ID',
2195 95 => 'Invoice Reference',
2196 96 => 'Invoice Number',
2197 97 => 'Currency',
927898c5 2198 98 => 'Cancellation / Refund Reason',
6c93b9a9 2199 99 => 'Receipt Date',
6c93b9a9 2200 106 => 'Test',
2201 107 => 'Is Pay Later',
a0090e6b 2202 108 => 'Contribution Status',
6c93b9a9 2203 109 => 'Recurring Contribution ID',
2204 110 => 'Amount Label',
2205 111 => 'Contribution Note',
2206 112 => 'Batch Name',
2207 113 => 'Campaign Title',
2208 114 => 'Campaign ID',
6c93b9a9 2209 116 => 'Soft Credit For',
2210 117 => 'Soft Credit Amount',
2211 118 => 'Soft Credit Type',
2212 119 => 'Soft Credit For Contact ID',
2213 120 => 'Soft Credit For Contribution ID',
2214 ];
2215 }
2216
2217 /**
2218 * Get the definition for event headers.
2219 *
2220 * @return array
2221 */
2222 protected function getParticipantHeaderDefinition() {
2223 return [
2224 81 => 'Event',
2225 82 => 'Event Title',
2226 83 => 'Event Start Date',
2227 84 => 'Event End Date',
2228 85 => 'Event Type',
2229 86 => 'Participant ID',
2230 87 => 'Participant Status',
2231 88 => 'Participant Status Id',
2232 89 => 'Participant Role',
2233 90 => 'Participant Role Id',
2234 91 => 'Participant Note',
2235 92 => 'Register date',
2236 93 => 'Participant Source',
2237 94 => 'Fee level',
2238 95 => 'Test',
2239 96 => 'Is Pay Later',
2240 97 => 'Fee Amount',
2241 98 => 'Discount Name',
2242 99 => 'Fee Currency',
2243 100 => 'Registered By ID',
2244 101 => 'Campaign ID',
2245 ];
2246 }
2247
2248 /**
2249 * Get the definition for member headers.
2250 *
2251 * @return array
2252 */
2253 protected function getMemberHeaderDefinition() {
2254 return [
2255 81 => 'Membership Type',
2256 82 => 'Test',
2257 83 => 'Is Pay Later',
2258 84 => 'Member Since',
2259 85 => 'Membership Start Date',
2260 86 => 'Membership Expiration Date',
2261 87 => 'Source',
2262 88 => 'Membership Status',
2263 89 => 'Membership ID',
2264 90 => 'Primary Member ID',
2265 91 => 'max_related',
2266 92 => 'membership_recur_id',
2267 93 => 'Campaign ID',
2268 94 => 'member_is_override',
2269 95 => 'member_auto_renew',
2270 ];
2271 }
2272
2273 /**
2274 * Get the definition for pledge headers.
2275 *
2276 * @return array
2277 */
2278 protected function getPledgeHeaderDefinition() {
2279 return [
2280 81 => 'Pledge ID',
2281 82 => 'Total Pledged',
2282 83 => 'Total Paid',
2283 84 => 'Pledge Made',
2284 85 => 'pledge_start_date',
2285 86 => 'Next Payment Date',
2286 87 => 'Next Payment Amount',
2287 88 => 'Pledge Status',
2288 89 => 'Test',
2289 90 => 'Pledge Contribution Page Id',
2290 91 => 'pledge_financial_type',
2291 92 => 'Pledge Frequency Interval',
2292 93 => 'Pledge Frequency Unit',
2293 94 => 'pledge_currency',
2294 95 => 'Campaign ID',
2295 96 => 'Balance Amount',
2296 97 => 'Payment ID',
2297 98 => 'Scheduled Amount',
2298 99 => 'Scheduled Date',
2299 100 => 'Paid Amount',
2300 101 => 'Paid Date',
2301 102 => 'Last Reminder',
2302 103 => 'Reminders Sent',
2303 104 => 'Pledge Payment Status',
2304 ];
2305 }
2306
0a3b035f 2307 /**
2308 * Get the column definition for exports.
2309 *
2310 * @param bool $isContactExport
2311 *
2312 * @return array
2313 */
2314 protected function getBasicSqlColumnDefinition($isContactExport) {
2315 $columns = [
2316 'civicrm_primary_id' => 'civicrm_primary_id varchar(16)',
2317 'contact_type' => 'contact_type varchar(64)',
2318 'contact_sub_type' => 'contact_sub_type varchar(255)',
2319 'do_not_email' => 'do_not_email varchar(16)',
2320 'do_not_phone' => 'do_not_phone varchar(16)',
2321 'do_not_mail' => 'do_not_mail varchar(16)',
2322 'do_not_sms' => 'do_not_sms varchar(16)',
2323 'do_not_trade' => 'do_not_trade varchar(16)',
2324 'is_opt_out' => 'is_opt_out varchar(16)',
2325 'legal_identifier' => 'legal_identifier varchar(32)',
2326 'external_identifier' => 'external_identifier varchar(64)',
2327 'sort_name' => 'sort_name varchar(128)',
2328 'display_name' => 'display_name varchar(128)',
2329 'nick_name' => 'nick_name varchar(128)',
2330 'legal_name' => 'legal_name varchar(128)',
2331 'image_url' => 'image_url longtext',
2332 'preferred_communication_method' => 'preferred_communication_method varchar(255)',
2333 'preferred_language' => 'preferred_language varchar(5)',
2334 'preferred_mail_format' => 'preferred_mail_format varchar(8)',
2335 'hash' => 'hash varchar(32)',
2336 'contact_source' => 'contact_source varchar(255)',
2337 'first_name' => 'first_name varchar(64)',
2338 'middle_name' => 'middle_name varchar(64)',
2339 'last_name' => 'last_name varchar(64)',
2340 'prefix_id' => 'prefix_id varchar(255)',
2341 'suffix_id' => 'suffix_id varchar(255)',
2342 'formal_title' => 'formal_title varchar(64)',
2343 'communication_style_id' => 'communication_style_id varchar(16)',
2344 'email_greeting_id' => 'email_greeting_id varchar(16)',
2345 'postal_greeting_id' => 'postal_greeting_id varchar(16)',
2346 'addressee_id' => 'addressee_id varchar(16)',
2347 'job_title' => 'job_title varchar(255)',
2348 'gender_id' => 'gender_id varchar(16)',
2349 'birth_date' => 'birth_date varchar(32)',
2350 'is_deceased' => 'is_deceased varchar(16)',
2351 'deceased_date' => 'deceased_date varchar(32)',
2352 'household_name' => 'household_name varchar(128)',
2353 'organization_name' => 'organization_name varchar(128)',
2354 'sic_code' => 'sic_code varchar(8)',
2355 'user_unique_id' => 'user_unique_id varchar(255)',
2356 'current_employer_id' => 'current_employer_id varchar(16)',
2357 'contact_is_deleted' => 'contact_is_deleted varchar(16)',
2358 'created_date' => 'created_date varchar(32)',
2359 'modified_date' => 'modified_date varchar(32)',
2360 'addressee' => 'addressee varchar(255)',
2361 'email_greeting' => 'email_greeting varchar(255)',
2362 'postal_greeting' => 'postal_greeting varchar(255)',
2363 'current_employer' => 'current_employer varchar(128)',
2364 'location_type' => 'location_type text',
2365 'street_address' => 'street_address varchar(96)',
2366 'street_number' => 'street_number varchar(16)',
2367 'street_number_suffix' => 'street_number_suffix varchar(8)',
2368 'street_name' => 'street_name varchar(64)',
2369 'street_unit' => 'street_unit varchar(16)',
2370 'supplemental_address_1' => 'supplemental_address_1 varchar(96)',
2371 'supplemental_address_2' => 'supplemental_address_2 varchar(96)',
2372 'supplemental_address_3' => 'supplemental_address_3 varchar(96)',
2373 'city' => 'city varchar(64)',
2374 'postal_code_suffix' => 'postal_code_suffix varchar(12)',
2375 'postal_code' => 'postal_code varchar(64)',
2376 'geo_code_1' => 'geo_code_1 varchar(32)',
2377 'geo_code_2' => 'geo_code_2 varchar(32)',
2378 'address_name' => 'address_name varchar(255)',
2379 'master_id' => 'master_id varchar(128)',
2380 'county' => 'county varchar(64)',
2381 'state_province' => 'state_province varchar(64)',
2382 'country' => 'country varchar(64)',
2383 'phone' => 'phone varchar(32)',
2384 'phone_ext' => 'phone_ext varchar(16)',
219c47d6 2385 'phone_type_id' => 'phone_type_id varchar(16)',
0a3b035f 2386 'email' => 'email varchar(254)',
2387 'on_hold' => 'on_hold varchar(16)',
2388 'is_bulkmail' => 'is_bulkmail varchar(16)',
2389 'signature_text' => 'signature_text longtext',
2390 'signature_html' => 'signature_html longtext',
2391 'im_provider' => 'im_provider text',
5ebd7d09 2392 'im_screen_name' => 'im_screen_name varchar(64)',
0a3b035f 2393 'openid' => 'openid varchar(255)',
2394 'world_region' => 'world_region varchar(128)',
2395 'url' => 'url varchar(128)',
2396 'groups' => 'groups text',
2397 'tags' => 'tags text',
2398 'notes' => 'notes text',
0a3b035f 2399 ];
2400 if (!$isContactExport) {
2401 unset($columns['groups']);
2402 unset($columns['tags']);
2403 unset($columns['notes']);
2404 }
2405 return $columns;
2406 }
2407
2408 /**
2409 * Get Case SQL columns.
2410 *
2411 * @return array
2412 */
2413 protected function getCaseSqlColumns() {
2414 return [
2415 'case_start_date' => 'case_start_date varchar(32)',
2416 'case_end_date' => 'case_end_date varchar(32)',
2417 'case_subject' => 'case_subject varchar(128)',
2418 'case_source_contact_id' => 'case_source_contact_id varchar(255)',
2419 'case_activity_status' => 'case_activity_status text',
2420 'case_activity_duration' => 'case_activity_duration text',
2421 'case_activity_medium_id' => 'case_activity_medium_id varchar(255)',
2422 'case_activity_details' => 'case_activity_details text',
2423 'case_activity_is_auto' => 'case_activity_is_auto text',
2424 'contact_id' => 'contact_id varchar(255)',
2425 'case_id' => 'case_id varchar(16)',
2426 'case_activity_subject' => 'case_activity_subject text',
2427 'case_status' => 'case_status text',
2428 'case_type' => 'case_type text',
2429 'case_role' => 'case_role text',
2430 'case_deleted' => 'case_deleted varchar(16)',
2431 'case_recent_activity_date' => 'case_recent_activity_date text',
2432 'case_recent_activity_type' => 'case_recent_activity_type text',
2433 'case_scheduled_activity_date' => 'case_scheduled_activity_date text',
2434 ];
2435 }
2436
2437 /**
2438 * Get activity sql columns.
2439 *
2440 * @return array
2441 */
2442 protected function getActivitySqlColumns() {
2443 return [
2444 'activity_id' => 'activity_id varchar(16)',
2445 'activity_type' => 'activity_type varchar(255)',
2446 'activity_type_id' => 'activity_type_id varchar(16)',
2447 'activity_subject' => 'activity_subject varchar(255)',
2448 'activity_date_time' => 'activity_date_time varchar(32)',
2449 'activity_duration' => 'activity_duration varchar(16)',
2450 'activity_location' => 'activity_location varchar(255)',
2451 'activity_details' => 'activity_details longtext',
2452 'activity_status' => 'activity_status varchar(255)',
2453 'activity_priority' => 'activity_priority varchar(255)',
2454 'source_contact' => 'source_contact varchar(255)',
2455 'source_record_id' => 'source_record_id varchar(255)',
2456 'activity_is_test' => 'activity_is_test varchar(16)',
2457 'activity_campaign_id' => 'activity_campaign_id varchar(128)',
2458 'result' => 'result text',
2459 'activity_engagement_level' => 'activity_engagement_level varchar(16)',
2460 'parent_id' => 'parent_id varchar(255)',
2461 ];
2462 }
2463
2464 /**
2465 * Get participant sql columns.
2466 *
2467 * @return array
2468 */
2469 protected function getParticipantSqlColumns() {
2470 return [
2471 'event_id' => 'event_id varchar(16)',
2472 'event_title' => 'event_title varchar(255)',
2473 'event_start_date' => 'event_start_date varchar(32)',
2474 'event_end_date' => 'event_end_date varchar(32)',
2475 'event_type' => 'event_type varchar(255)',
2476 'participant_id' => 'participant_id varchar(16)',
2477 'participant_status' => 'participant_status varchar(255)',
2478 'participant_status_id' => 'participant_status_id varchar(16)',
2479 'participant_role' => 'participant_role varchar(255)',
2480 'participant_role_id' => 'participant_role_id varchar(128)',
2481 'participant_note' => 'participant_note text',
2482 'participant_register_date' => 'participant_register_date varchar(32)',
2483 'participant_source' => 'participant_source varchar(128)',
2484 'participant_fee_level' => 'participant_fee_level longtext',
2485 'participant_is_test' => 'participant_is_test varchar(16)',
2486 'participant_is_pay_later' => 'participant_is_pay_later varchar(16)',
2487 'participant_fee_amount' => 'participant_fee_amount varchar(32)',
2488 'participant_discount_name' => 'participant_discount_name varchar(16)',
2489 'participant_fee_currency' => 'participant_fee_currency varchar(3)',
2490 'participant_registered_by_id' => 'participant_registered_by_id varchar(16)',
2491 'participant_campaign_id' => 'participant_campaign_id varchar(128)',
2492 ];
2493 }
2494
2495 /**
2496 * Get contribution sql columns.
2497 *
2498 * @return array
2499 */
2500 public function getContributionSqlColumns() {
2501 return [
2502 'civicrm_primary_id' => 'civicrm_primary_id varchar(16)',
2503 'contact_type' => 'contact_type varchar(64)',
2504 'contact_sub_type' => 'contact_sub_type varchar(255)',
2505 'do_not_email' => 'do_not_email varchar(16)',
2506 'do_not_phone' => 'do_not_phone varchar(16)',
2507 'do_not_mail' => 'do_not_mail varchar(16)',
2508 'do_not_sms' => 'do_not_sms varchar(16)',
2509 'do_not_trade' => 'do_not_trade varchar(16)',
2510 'is_opt_out' => 'is_opt_out varchar(16)',
2511 'legal_identifier' => 'legal_identifier varchar(32)',
2512 'external_identifier' => 'external_identifier varchar(64)',
2513 'sort_name' => 'sort_name varchar(128)',
2514 'display_name' => 'display_name varchar(128)',
2515 'nick_name' => 'nick_name varchar(128)',
2516 'legal_name' => 'legal_name varchar(128)',
2517 'image_url' => 'image_url longtext',
2518 'preferred_communication_method' => 'preferred_communication_method varchar(255)',
2519 'preferred_language' => 'preferred_language varchar(5)',
2520 'preferred_mail_format' => 'preferred_mail_format varchar(8)',
2521 'hash' => 'hash varchar(32)',
2522 'contact_source' => 'contact_source varchar(255)',
2523 'first_name' => 'first_name varchar(64)',
2524 'middle_name' => 'middle_name varchar(64)',
2525 'last_name' => 'last_name varchar(64)',
2526 'prefix_id' => 'prefix_id varchar(255)',
2527 'suffix_id' => 'suffix_id varchar(255)',
2528 'formal_title' => 'formal_title varchar(64)',
2529 'communication_style_id' => 'communication_style_id varchar(16)',
2530 'email_greeting_id' => 'email_greeting_id varchar(16)',
2531 'postal_greeting_id' => 'postal_greeting_id varchar(16)',
2532 'addressee_id' => 'addressee_id varchar(16)',
2533 'job_title' => 'job_title varchar(255)',
2534 'gender_id' => 'gender_id varchar(16)',
2535 'birth_date' => 'birth_date varchar(32)',
2536 'is_deceased' => 'is_deceased varchar(16)',
2537 'deceased_date' => 'deceased_date varchar(32)',
2538 'household_name' => 'household_name varchar(128)',
2539 'organization_name' => 'organization_name varchar(128)',
2540 'sic_code' => 'sic_code varchar(8)',
2541 'user_unique_id' => 'user_unique_id varchar(255)',
2542 'current_employer_id' => 'current_employer_id varchar(16)',
2543 'contact_is_deleted' => 'contact_is_deleted varchar(16)',
2544 'created_date' => 'created_date varchar(32)',
2545 'modified_date' => 'modified_date varchar(32)',
2546 'addressee' => 'addressee varchar(255)',
2547 'email_greeting' => 'email_greeting varchar(255)',
2548 'postal_greeting' => 'postal_greeting varchar(255)',
2549 'current_employer' => 'current_employer varchar(128)',
2550 'location_type' => 'location_type text',
2551 'street_address' => 'street_address varchar(96)',
2552 'street_number' => 'street_number varchar(16)',
2553 'street_number_suffix' => 'street_number_suffix varchar(8)',
2554 'street_name' => 'street_name varchar(64)',
2555 'street_unit' => 'street_unit varchar(16)',
2556 'supplemental_address_1' => 'supplemental_address_1 varchar(96)',
2557 'supplemental_address_2' => 'supplemental_address_2 varchar(96)',
2558 'supplemental_address_3' => 'supplemental_address_3 varchar(96)',
2559 'city' => 'city varchar(64)',
2560 'postal_code_suffix' => 'postal_code_suffix varchar(12)',
2561 'postal_code' => 'postal_code varchar(64)',
2562 'geo_code_1' => 'geo_code_1 varchar(32)',
2563 'geo_code_2' => 'geo_code_2 varchar(32)',
2564 'address_name' => 'address_name varchar(255)',
2565 'master_id' => 'master_id varchar(128)',
2566 'county' => 'county varchar(64)',
2567 'state_province' => 'state_province varchar(64)',
2568 'country' => 'country varchar(64)',
2569 'phone' => 'phone varchar(32)',
2570 'phone_ext' => 'phone_ext varchar(16)',
2571 'email' => 'email varchar(254)',
2572 'on_hold' => 'on_hold varchar(16)',
2573 'is_bulkmail' => 'is_bulkmail varchar(16)',
2574 'signature_text' => 'signature_text longtext',
2575 'signature_html' => 'signature_html longtext',
2576 'im_provider' => 'im_provider text',
5ebd7d09 2577 'im_screen_name' => 'im_screen_name varchar(64)',
0a3b035f 2578 'openid' => 'openid varchar(255)',
2579 'world_region' => 'world_region varchar(128)',
2580 'url' => 'url varchar(128)',
219c47d6 2581 'phone_type_id' => 'phone_type_id varchar(16)',
124f3c1b 2582 'financial_type' => 'financial_type varchar(255)',
0a3b035f 2583 'contribution_source' => 'contribution_source varchar(255)',
2584 'receive_date' => 'receive_date varchar(32)',
2585 'thankyou_date' => 'thankyou_date varchar(32)',
2586 'cancel_date' => 'cancel_date varchar(32)',
2587 'total_amount' => 'total_amount varchar(32)',
2588 'accounting_code' => 'accounting_code varchar(64)',
a0090e6b 2589 'payment_instrument' => 'payment_instrument varchar(255)',
0a3b035f 2590 'payment_instrument_id' => 'payment_instrument_id varchar(16)',
2591 'contribution_check_number' => 'contribution_check_number varchar(255)',
2592 'non_deductible_amount' => 'non_deductible_amount varchar(32)',
2593 'fee_amount' => 'fee_amount varchar(32)',
2594 'net_amount' => 'net_amount varchar(32)',
2595 'trxn_id' => 'trxn_id varchar(255)',
2596 'invoice_id' => 'invoice_id varchar(255)',
2597 'invoice_number' => 'invoice_number varchar(255)',
2598 'currency' => 'currency varchar(3)',
2599 'cancel_reason' => 'cancel_reason longtext',
2600 'receipt_date' => 'receipt_date varchar(32)',
0a3b035f 2601 'is_test' => 'is_test varchar(16)',
2602 'is_pay_later' => 'is_pay_later varchar(16)',
a0090e6b 2603 'contribution_status' => 'contribution_status varchar(255)',
0a3b035f 2604 'contribution_recur_id' => 'contribution_recur_id varchar(16)',
2605 'amount_level' => 'amount_level longtext',
2606 'contribution_note' => 'contribution_note text',
2607 'contribution_batch' => 'contribution_batch text',
2608 'contribution_campaign_title' => 'contribution_campaign_title varchar(255)',
2609 'contribution_campaign_id' => 'contribution_campaign_id varchar(128)',
0a3b035f 2610 'contribution_soft_credit_name' => 'contribution_soft_credit_name varchar(255)',
2611 'contribution_soft_credit_amount' => 'contribution_soft_credit_amount varchar(255)',
2612 'contribution_soft_credit_type' => 'contribution_soft_credit_type varchar(255)',
2613 'contribution_soft_credit_contact_id' => 'contribution_soft_credit_contact_id varchar(255)',
2614 'contribution_soft_credit_contribution_id' => 'contribution_soft_credit_contribution_id varchar(255)',
2615 ];
2616 }
2617
2618 /**
2619 * Get pledge sql columns.
2620 *
2621 * @return array
2622 */
2623 public function getPledgeSqlColumns() {
2624 return [
2625 'pledge_id' => 'pledge_id varchar(16)',
2626 'pledge_amount' => 'pledge_amount varchar(32)',
2627 'pledge_total_paid' => 'pledge_total_paid text',
2628 'pledge_create_date' => 'pledge_create_date varchar(32)',
2629 'pledge_start_date' => 'pledge_start_date text',
2630 'pledge_next_pay_date' => 'pledge_next_pay_date text',
2631 'pledge_next_pay_amount' => 'pledge_next_pay_amount text',
2632 'pledge_status' => 'pledge_status varchar(255)',
2633 'pledge_is_test' => 'pledge_is_test varchar(16)',
2634 'pledge_contribution_page_id' => 'pledge_contribution_page_id varchar(255)',
2635 'pledge_financial_type' => 'pledge_financial_type text',
2636 'pledge_frequency_interval' => 'pledge_frequency_interval varchar(255)',
2637 'pledge_frequency_unit' => 'pledge_frequency_unit varchar(255)',
2638 'pledge_currency' => 'pledge_currency text',
2639 'pledge_campaign_id' => 'pledge_campaign_id varchar(128)',
2640 'pledge_balance_amount' => 'pledge_balance_amount text',
2641 'pledge_payment_id' => 'pledge_payment_id varchar(16)',
2642 'pledge_payment_scheduled_amount' => 'pledge_payment_scheduled_amount varchar(32)',
2643 'pledge_payment_scheduled_date' => 'pledge_payment_scheduled_date varchar(32)',
2644 'pledge_payment_paid_amount' => 'pledge_payment_paid_amount text',
2645 'pledge_payment_paid_date' => 'pledge_payment_paid_date text',
2646 'pledge_payment_reminder_date' => 'pledge_payment_reminder_date varchar(32)',
2647 'pledge_payment_reminder_count' => 'pledge_payment_reminder_count varchar(16)',
2648 'pledge_payment_status' => 'pledge_payment_status varchar(255)',
2649 ];
2650 }
2651
2652 /**
2653 * Get membership sql columns.
2654 *
2655 * @return array
2656 */
2657 public function getMembershipSqlColumns() {
2658 return [
2659 'membership_type' => 'membership_type varchar(128)',
2660 'member_is_test' => 'member_is_test varchar(16)',
2661 'member_is_pay_later' => 'member_is_pay_later varchar(16)',
2662 'join_date' => 'join_date varchar(32)',
2663 'membership_start_date' => 'membership_start_date varchar(32)',
2664 'membership_end_date' => 'membership_end_date varchar(32)',
2665 'membership_source' => 'membership_source varchar(128)',
2666 'membership_status' => 'membership_status varchar(255)',
2667 'membership_id' => 'membership_id varchar(16)',
2668 'owner_membership_id' => 'owner_membership_id varchar(16)',
2669 'max_related' => 'max_related text',
2670 'membership_recur_id' => 'membership_recur_id varchar(255)',
2671 'member_campaign_id' => 'member_campaign_id varchar(128)',
2672 'member_is_override' => 'member_is_override text',
2673 'member_auto_renew' => 'member_auto_renew text',
2674 ];
2675 }
2676
a16a432a 2677 /**
2678 * Change our location types so we have some edge cases in the mix.
2679 *
2680 * - a space in the name
2681 * - name differs from label
2682 * - non-anglo char in the label (not valid in the name).
2683 */
2684 protected function diversifyLocationTypes() {
2685 $this->locationTypes['Main'] = $this->callAPISuccess('Location_type', 'get', [
2686 'name' => 'Main',
2687 'return' => 'id',
2688 'api.LocationType.Create' => ['display_name' => 'Méin'],
2689 ]);
2690 $this->locationTypes['Whare Kai'] = $this->callAPISuccess('Location_type', 'create', [
2691 'name' => 'Whare Kai',
2692 'display_name' => 'Whare Kai',
2693 ]);
2694 }
2695
ef51caa8 2696}