(NFC) (dev/core#878) Simplify copyright header (tests/*)
[civicrm-core.git] / tests / phpunit / CRM / Member / BAO / MembershipTest.php
CommitLineData
6a488035
TO
1<?php
2/*
3 +--------------------------------------------------------------------+
7d61e75f 4 | Copyright CiviCRM LLC. All rights reserved. |
6a488035 5 | |
7d61e75f
TO
6 | This work is published under the GNU AGPLv3 license with some |
7 | permitted exceptions and without any warranty. For full license |
8 | and copyright information, see https://civicrm.org/licensing |
6a488035 9 +--------------------------------------------------------------------+
d25dd0ee 10 */
6a488035 11
4cbe18b8
EM
12/**
13 * Class CRM_Member_BAO_MembershipTest
acb109b7 14 * @group headless
4cbe18b8 15 */
6a488035 16class CRM_Member_BAO_MembershipTest extends CiviUnitTestCase {
6a488035 17
00be9182 18 public function setUp() {
6a488035
TO
19 parent::setUp();
20 // FIXME: something NULLs $GLOBALS['_HTML_QuickForm_registered_rules'] when the tests are ran all together
9099cab3
CW
21 $GLOBALS['_HTML_QuickForm_registered_rules'] = [
22 'required' => ['html_quickform_rule_required', 'HTML/QuickForm/Rule/Required.php'],
23 'maxlength' => ['html_quickform_rule_range', 'HTML/QuickForm/Rule/Range.php'],
24 'minlength' => ['html_quickform_rule_range', 'HTML/QuickForm/Rule/Range.php'],
25 'rangelength' => ['html_quickform_rule_range', 'HTML/QuickForm/Rule/Range.php'],
26 'email' => ['html_quickform_rule_email', 'HTML/QuickForm/Rule/Email.php'],
27 'regex' => ['html_quickform_rule_regex', 'HTML/QuickForm/Rule/Regex.php'],
28 'lettersonly' => ['html_quickform_rule_regex', 'HTML/QuickForm/Rule/Regex.php'],
29 'alphanumeric' => ['html_quickform_rule_regex', 'HTML/QuickForm/Rule/Regex.php'],
30 'numeric' => ['html_quickform_rule_regex', 'HTML/QuickForm/Rule/Regex.php'],
31 'nopunctuation' => ['html_quickform_rule_regex', 'HTML/QuickForm/Rule/Regex.php'],
32 'nonzero' => ['html_quickform_rule_regex', 'HTML/QuickForm/Rule/Regex.php'],
33 'callback' => ['html_quickform_rule_callback', 'HTML/QuickForm/Rule/Callback.php'],
34 'compare' => ['html_quickform_rule_compare', 'HTML/QuickForm/Rule/Compare.php'],
35 ];
6a488035
TO
36
37 $this->_contactID = $this->organizationCreate();
9099cab3 38 $this->_membershipTypeID = $this->membershipTypeCreate(['member_of_contact_id' => $this->_contactID]);
6a488035
TO
39 // add a random number to avoid silly conflicts with old data
40 $this->_membershipStatusID = $this->membershipStatusCreate('test status' . rand(1, 1000));
41 }
42
43 /**
44 * Tears down the fixture, for example, closes a network connection.
45 * This method is called after a test is executed.
6a488035 46 */
00be9182 47 public function tearDown() {
9099cab3 48 $this->membershipTypeDelete(['id' => $this->_membershipTypeID]);
481a74f4 49 $this->membershipStatusDelete($this->_membershipStatusID);
93ac19cd 50 $this->contactDelete($this->_contactID);
6a488035 51
6c6e6187 52 $this->_contactID = $this->_membershipStatusID = $this->_membershipTypeID = NULL;
6a488035
TO
53 }
54
5c3a7abf
AP
55 /**
56 * Create membership type using given organization id.
57 * @param $organizationId
39b959db 58 * @param bool $withRelationship
5c3a7abf
AP
59 * @return array|int
60 */
61 private function createMembershipType($organizationId, $withRelationship = FALSE) {
9099cab3 62 $membershipType = $this->callAPISuccess('MembershipType', 'create', [
39b959db
SL
63 //Default domain ID
64 'domain_id' => 1,
5c3a7abf
AP
65 'member_of_contact_id' => $organizationId,
66 'financial_type_id' => "Member Dues",
67 'duration_unit' => "year",
68 'duration_interval' => 1,
69 'period_type' => "rolling",
70 'name' => "Organiation Membership Type",
71 'relationship_type_id' => ($withRelationship) ? 5 : NULL,
72 'relationship_direction' => ($withRelationship) ? 'b_a' : NULL,
9099cab3 73 ]);
5c3a7abf
AP
74 return $membershipType["values"][$membershipType["id"]];
75 }
76
77 /**
78 * Get count of related memberships by parent membership id.
79 * @param $membershipId
80 * @return array|int
81 */
82 private function getRelatedMembershipsCount($membershipId) {
9099cab3 83 return $this->callAPISuccess("Membership", "getcount", [
5c3a7abf 84 'owner_membership_id' => $membershipId,
9099cab3 85 ]);
5c3a7abf
AP
86 }
87
88 /**
89 * Test to delete related membership when type of parent memebrship is changed which does not have relation type associated.
90 * @throws CRM_Core_Exception
91 */
92 public function testDeleteRelatedMembershipsOnParentTypeChanged() {
93
94 $contactId = $this->individualCreate();
95 $membershipOrganizationId = $this->organizationCreate();
96 $organizationId = $this->organizationCreate();
97
98 // Create relationship between organization and individual contact
9099cab3 99 $this->callAPISuccess('Relationship', 'create', [
39b959db
SL
100 // Employer of relationship
101 'relationship_type_id' => 5,
5c3a7abf
AP
102 'contact_id_a' => $contactId,
103 'contact_id_b' => $organizationId,
104 'is_active' => 1,
9099cab3 105 ]);
5c3a7abf
AP
106
107 // Create two membership types one with relationship and one without.
108 $membershipTypeWithRelationship = $this->createMembershipType($membershipOrganizationId, TRUE);
109 $membershipTypeWithoutRelationship = $this->createMembershipType($membershipOrganizationId);
110
111 // Creating membership of organisation
9099cab3 112 $membership = $this->callAPISuccess("Membership", "create", [
5c3a7abf
AP
113 'membership_type_id' => $membershipTypeWithRelationship["id"],
114 'contact_id' => $organizationId,
115 'status_id' => $this->_membershipStatusID,
9099cab3 116 ]);
5c3a7abf
AP
117
118 $membership = $membership["values"][$membership["id"]];
119
120 // Check count of related memberships. It should be one for individual contact.
121 $relatedMembershipsCount = $this->getRelatedMembershipsCount($membership["id"]);
122 $this->assertEquals(1, $relatedMembershipsCount, 'Related membership count should be 1.');
123
124 // Update membership by changing it's type. New membership type is without relationship.
125 $membership["membership_type_id"] = $membershipTypeWithoutRelationship["id"];
126 $updatedMembership = $this->callAPISuccess("Membership", "create", $membership);
127
128 // Check count of related memberships again. It should be zero as we changed the membership type.
129 $relatedMembershipsCount = $this->getRelatedMembershipsCount($membership["id"]);
130 $this->assertEquals(0, $relatedMembershipsCount, 'Related membership count should be 0.');
131
132 // Clean up: Delete membership
133 $this->membershipDelete($membership["id"]);
134 }
135
00be9182 136 public function testCreate() {
6a488035 137
6ae19242 138 $contactId = $this->individualCreate();
6a488035 139
9099cab3 140 $params = [
6a488035
TO
141 'contact_id' => $contactId,
142 'membership_type_id' => $this->_membershipTypeID,
6c6e6187
TO
143 'join_date' => date('Ymd', strtotime('2006-01-21')),
144 'start_date' => date('Ymd', strtotime('2006-01-21')),
145 'end_date' => date('Ymd', strtotime('2006-12-21')),
6a488035
TO
146 'source' => 'Payment',
147 'is_override' => 1,
148 'status_id' => $this->_membershipStatusID,
9099cab3
CW
149 ];
150 $ids = [];
6a488035
TO
151 CRM_Member_BAO_Membership::create($params, $ids);
152
153 $membershipId = $this->assertDBNotNull('CRM_Member_BAO_Membership', $contactId, 'id',
154 'contact_id', 'Database check for created membership.'
155 );
156
157 // Now call create() to modify an existing Membership
158
9099cab3
CW
159 $params = [];
160 $params = [
6a488035
TO
161 'contact_id' => $contactId,
162 'membership_type_id' => $this->_membershipTypeID,
6c6e6187
TO
163 'join_date' => date('Ymd', strtotime('2006-01-21')),
164 'start_date' => date('Ymd', strtotime('2006-01-21')),
165 'end_date' => date('Ymd', strtotime('2006-12-21')),
6a488035
TO
166 'source' => 'Payment',
167 'is_override' => 1,
168 'status_id' => $this->_membershipStatusID,
9099cab3
CW
169 ];
170 $ids = [
6a488035 171 'membership' => $membershipId,
9099cab3 172 ];
6a488035
TO
173 CRM_Member_BAO_Membership::create($params, $ids);
174
175 $membershipTypeId = $this->assertDBNotNull('CRM_Member_BAO_Membership', $contactId,
176 'membership_type_id', 'contact_id',
177 'Database check on updated membership record.'
178 );
179 $this->assertEquals($membershipTypeId, $this->_membershipTypeID, 'Verify membership type id is fetched.');
180
181 $this->membershipDelete($membershipId);
93ac19cd 182 $this->contactDelete($contactId);
6a488035
TO
183 }
184
00be9182 185 public function testGetValues() {
6a488035
TO
186 // $this->markTestSkipped( 'causes mysterious exit, needs fixing!' );
187 // Calculate membership dates based on the current date
188 $now = time();
189 $year_from_now = $now + (365 * 24 * 60 * 60);
190 $last_month = $now - (30 * 24 * 60 * 60);
191 $year_from_last_month = $last_month + (365 * 24 * 60 * 60);
192
6ae19242 193 $contactId = $this->individualCreate();
6a488035 194
9099cab3 195 $params = [
6a488035
TO
196 'contact_id' => $contactId,
197 'membership_type_id' => $this->_membershipTypeID,
198 'join_date' => date('Ymd'),
199 'start_date' => date('Ymd'),
200 'end_date' => date('Ymd', $year_from_now),
201 'source' => 'Payment',
202 'is_override' => 1,
203 'status_id' => $this->_membershipStatusID,
9099cab3 204 ];
6a488035 205
9099cab3 206 $ids = [];
6a488035
TO
207 CRM_Member_BAO_Membership::create($params, $ids);
208
209 $membershipId1 = $this->assertDBNotNull('CRM_Member_BAO_Membership', $contactId, 'id',
210 'contact_id', 'Database check for created membership.'
211 );
212
9099cab3 213 $params = [
6a488035
TO
214 'contact_id' => $contactId,
215 'membership_type_id' => $this->_membershipTypeID,
216 'join_date' => date('Ymd', $last_month),
217 'start_date' => date('Ymd', $last_month),
218 'end_date' => date('Ymd', $year_from_last_month),
219 'source' => 'Source123',
220 'is_override' => 0,
221 'status_id' => $this->_membershipStatusID,
9099cab3
CW
222 ];
223 $ids = [];
6a488035
TO
224 CRM_Member_BAO_Membership::create($params, $ids);
225
226 $membershipId2 = $this->assertDBNotNull('CRM_Member_BAO_Membership', 'source123', 'id',
227 'source', 'Database check for created membership.'
228 );
229
9099cab3
CW
230 $membership = ['contact_id' => $contactId];
231 $membershipValues = [];
6a488035
TO
232 CRM_Member_BAO_Membership::getValues($membership, $membershipValues, TRUE);
233
234 $this->assertEquals($membershipValues[$membershipId1]['membership_id'], $membershipId1, 'Verify membership record 1 is fetched.');
235
236 $this->assertEquals($membershipValues[$membershipId2]['membership_id'], $membershipId2, 'Verify membership record 2 is fetched.');
237
238 $this->membershipDelete($membershipId1);
239 $this->membershipDelete($membershipId2);
93ac19cd 240 $this->contactDelete($contactId);
6a488035
TO
241 }
242
00be9182 243 public function testRetrieve() {
6ae19242 244 $contactId = $this->individualCreate();
6a488035 245
9099cab3 246 $params = [
6a488035
TO
247 'contact_id' => $contactId,
248 'membership_type_id' => $this->_membershipTypeID,
6c6e6187
TO
249 'join_date' => date('Ymd', strtotime('2006-01-21')),
250 'start_date' => date('Ymd', strtotime('2006-01-21')),
251 'end_date' => date('Ymd', strtotime('2006-12-21')),
6a488035
TO
252 'source' => 'Payment',
253 'is_override' => 1,
254 'status_id' => $this->_membershipStatusID,
9099cab3
CW
255 ];
256 $ids = [];
6a488035
TO
257 CRM_Member_BAO_Membership::create($params, $ids);
258
259 $membershipId = $this->assertDBNotNull('CRM_Member_BAO_Membership', $contactId, 'id',
260 'contact_id', 'Database check for created membership.'
261 );
9099cab3
CW
262 $params = ['id' => $membershipId];
263 $values = [];
6a488035
TO
264 CRM_Member_BAO_Membership::retrieve($params, $values);
265 $this->assertEquals($values['id'], $membershipId, 'Verify membership record is retrieved.');
266
267 $this->membershipDelete($membershipId);
268 $this->contactDelete($contactId);
269 }
270
00be9182 271 public function testActiveMembers() {
6ae19242 272 $contactId = $this->individualCreate();
6a488035 273
9099cab3 274 $params = [
6a488035
TO
275 'contact_id' => $contactId,
276 'membership_type_id' => $this->_membershipTypeID,
6c6e6187
TO
277 'join_date' => date('Ymd', strtotime('2006-01-21')),
278 'start_date' => date('Ymd', strtotime('2006-01-21')),
279 'end_date' => date('Ymd', strtotime('2006-12-21')),
6a488035
TO
280 'source' => 'Payment',
281 'is_override' => 1,
282 'status_id' => $this->_membershipStatusID,
9099cab3
CW
283 ];
284 $ids = [];
6a488035
TO
285 CRM_Member_BAO_Membership::create($params, $ids);
286
287 $membershipId1 = $this->assertDBNotNull('CRM_Member_BAO_Membership', $contactId, 'id',
288 'contact_id', 'Database check for created membership.'
289 );
290
9099cab3
CW
291 $params = ['id' => $membershipId1];
292 $values1 = [];
6a488035 293 CRM_Member_BAO_Membership::retrieve($params, $values1);
9099cab3 294 $membership = [$membershipId1 => $values1];
6a488035 295
9099cab3 296 $params = [
6a488035
TO
297 'contact_id' => $contactId,
298 'membership_type_id' => $this->_membershipTypeID,
6c6e6187
TO
299 'join_date' => date('Ymd', strtotime('2006-01-21')),
300 'start_date' => date('Ymd', strtotime('2006-01-21')),
301 'end_date' => date('Ymd', strtotime('2006-12-21')),
6a488035
TO
302 'source' => 'PaySource',
303 'is_override' => 1,
304 'status_id' => $this->_membershipStatusID,
9099cab3
CW
305 ];
306 $ids = [];
6a488035
TO
307 CRM_Member_BAO_Membership::create($params, $ids);
308
309 $membershipId2 = $this->assertDBNotNull('CRM_Member_BAO_Membership', 'PaySource', 'id',
310 'source', 'Database check for created membership.'
311 );
312
9099cab3
CW
313 $params = ['id' => $membershipId2];
314 $values2 = [];
6a488035
TO
315 CRM_Member_BAO_Membership::retrieve($params, $values2);
316 $membership[$membershipId2] = $values2;
317
318 $activeMembers = CRM_Member_BAO_Membership::activeMembers($membership);
319 $inActiveMembers = CRM_Member_BAO_Membership::activeMembers($membership, 'inactive');
320
321 $this->assertEquals($activeMembers[$membershipId1]['id'], $membership[$membershipId1]['id'], 'Verify active membership record is retrieved.');
322 $this->assertEquals($activeMembers[$membershipId2]['id'], $membership[$membershipId2]['id'], 'Verify active membership record is retrieved.');
323
324 $this->assertEquals(0, count($inActiveMembers), 'Verify No inactive membership record is retrieved.');
325
326 $this->membershipDelete($membershipId1);
327 $this->membershipDelete($membershipId2);
93ac19cd 328 $this->contactDelete($contactId);
6a488035
TO
329 }
330
00be9182 331 public function testDeleteMembership() {
6ae19242 332 $contactId = $this->individualCreate();
6a488035 333
9099cab3 334 $params = [
6a488035
TO
335 'contact_id' => $contactId,
336 'membership_type_id' => $this->_membershipTypeID,
6c6e6187
TO
337 'join_date' => date('Ymd', strtotime('2006-01-21')),
338 'start_date' => date('Ymd', strtotime('2006-01-21')),
339 'end_date' => date('Ymd', strtotime('2006-12-21')),
6a488035
TO
340 'source' => 'Payment',
341 'is_override' => 1,
342 'status_id' => $this->_membershipStatusID,
9099cab3
CW
343 ];
344 $ids = [];
6a488035
TO
345 CRM_Member_BAO_Membership::create($params, $ids);
346
347 $membershipId = $this->assertDBNotNull('CRM_Member_BAO_Membership', $contactId, 'id',
348 'contact_id', 'Database check for created membership.'
349 );
3506b6cd 350 CRM_Member_BAO_Membership::del($membershipId);
6a488035 351
93ac19cd 352 $this->assertDBNull('CRM_Member_BAO_Membership', $contactId, 'id',
6a488035
TO
353 'contact_id', 'Database check for deleted membership.'
354 );
93ac19cd 355 $this->contactDelete($contactId);
6a488035
TO
356 }
357
00be9182 358 public function testGetContactMembership() {
6ae19242 359 $contactId = $this->individualCreate();
6a488035 360
9099cab3 361 $params = [
6a488035
TO
362 'contact_id' => $contactId,
363 'membership_type_id' => $this->_membershipTypeID,
6c6e6187
TO
364 'join_date' => date('Ymd', strtotime('2006-01-21')),
365 'start_date' => date('Ymd', strtotime('2006-01-21')),
366 'end_date' => date('Ymd', strtotime('2006-12-21')),
6a488035
TO
367 'source' => 'Payment',
368 'is_override' => 1,
369 'status_id' => $this->_membershipStatusID,
9099cab3
CW
370 ];
371 $ids = [];
6a488035
TO
372 CRM_Member_BAO_Membership::create($params, $ids);
373
374 $membershipId = $this->assertDBNotNull('CRM_Member_BAO_Membership', $contactId, 'id',
375 'contact_id', 'Database check for created membership.'
376 );
377
378 $membership = CRM_Member_BAO_Membership::getContactMembership($contactId, $this->_membershipTypeID, FALSE);
379
380 $this->assertEquals($membership['id'], $membershipId, 'Verify membership record is retrieved.');
381
382 $this->membershipDelete($membershipId);
93ac19cd 383 $this->contactDelete($contactId);
6a488035
TO
384 }
385
c490a46a 386 /**
eceb18cc 387 * Get the contribution.
c490a46a
CW
388 * page id from the membership record
389 */
00be9182 390 public function testgetContributionPageId() {
6ae19242 391 $contactId = $this->individualCreate();
6a488035 392
9099cab3 393 $params = [
6a488035
TO
394 'contact_id' => $contactId,
395 'membership_type_id' => $this->_membershipTypeID,
6c6e6187
TO
396 'join_date' => date('Ymd', strtotime('2006-01-21')),
397 'start_date' => date('Ymd', strtotime('2006-01-21')),
398 'end_date' => date('Ymd', strtotime('2006-12-21')),
6a488035
TO
399 'source' => 'Payment',
400 'is_override' => 1,
401 'status_id' => $this->_membershipStatusID,
9099cab3
CW
402 ];
403 $ids = [];
6a488035
TO
404 CRM_Member_BAO_Membership::create($params, $ids);
405
6a488035
TO
406 $membershipId = $this->assertDBNotNull('CRM_Member_BAO_Membership', $contactId, 'id',
407 'contact_id', 'Database check for created membership.'
408 );
409 $membership[$membershipId]['renewPageId'] = CRM_Member_BAO_Membership::getContributionPageId($membershipId);
410
411 $this->membershipDelete($membershipId);
93ac19cd 412 $this->contactDelete($contactId);
6a488035 413 }
92915c55 414
c490a46a
CW
415 /**
416 * Get membership joins/renewals
417 * for a specified membership
418 * type.
c490a46a 419 */
00be9182 420 public function testgetMembershipStarts() {
6ae19242 421 $contactId = $this->individualCreate();
6a488035 422
9099cab3 423 $params = [
6a488035
TO
424 'contact_id' => $contactId,
425 'membership_type_id' => $this->_membershipTypeID,
6c6e6187
TO
426 'join_date' => date('Ymd', strtotime('2006-01-21')),
427 'start_date' => date('Ymd', strtotime('2006-01-21')),
428 'end_date' => date('Ymd', strtotime('2006-12-21')),
6a488035
TO
429 'source' => 'Payment',
430 'is_override' => 1,
431 'status_id' => $this->_membershipStatusID,
9099cab3
CW
432 ];
433 $ids = [];
6a488035
TO
434 CRM_Member_BAO_Membership::create($params, $ids);
435
436 $membershipId = $this->assertDBNotNull('CRM_Member_BAO_Membership', $contactId, 'id',
437 'contact_id', 'Database check for created membership.'
438 );
439 $yearStart = date('Y') . '0101';
440 $currentDate = date('Ymd');
441 CRM_Member_BAO_Membership::getMembershipStarts($this->_membershipTypeID, $yearStart, $currentDate);
442
443 $this->membershipDelete($membershipId);
93ac19cd 444 $this->contactDelete($contactId);
6a488035
TO
445 }
446
c490a46a
CW
447 /**
448 * Get a count of membership for a specified membership type,
449 * optionally for a specified date.
c490a46a 450 */
00be9182 451 public function testGetMembershipCount() {
6ae19242 452 $contactId = $this->individualCreate();
6a488035 453
9099cab3 454 $params = [
6a488035
TO
455 'contact_id' => $contactId,
456 'membership_type_id' => $this->_membershipTypeID,
6c6e6187
TO
457 'join_date' => date('Ymd', strtotime('2006-01-21')),
458 'start_date' => date('Ymd', strtotime('2006-01-21')),
459 'end_date' => date('Ymd', strtotime('2006-12-21')),
6a488035
TO
460 'source' => 'Payment',
461 'is_override' => 1,
462 'status_id' => $this->_membershipStatusID,
9099cab3
CW
463 ];
464 $ids = [];
6a488035
TO
465 CRM_Member_BAO_Membership::create($params, $ids);
466
467 $membershipId = $this->assertDBNotNull('CRM_Member_BAO_Membership', $contactId, 'id',
468 'contact_id', 'Database check for created membership.'
469 );
470 $currentDate = date('Ymd');
471 $test = 0;
472 CRM_Member_BAO_Membership::getMembershipCount($this->_membershipTypeID, $currentDate, $test);
473
474 $this->membershipDelete($membershipId);
93ac19cd 475 $this->contactDelete($contactId);
6a488035
TO
476 }
477
c490a46a 478 /**
e4649817 479 * Checkup sort name function.
c490a46a 480 */
e4649817 481 public function testSortName() {
482 $contactId = $this->individualCreate();
6a488035 483
9099cab3 484 $params = [
6a488035
TO
485 'contact_id' => $contactId,
486 'membership_type_id' => $this->_membershipTypeID,
e4649817 487 'join_date' => '2006-01-21',
488 'start_date' => '2006-01-21',
489 'end_date' => '2006-12-21',
6a488035
TO
490 'source' => 'Payment',
491 'is_override' => 1,
492 'status_id' => $this->_membershipStatusID,
9099cab3 493 ];
6a488035 494
e4649817 495 $membership = $this->callAPISuccess('Membership', 'create', $params);
6a488035 496
e4649817 497 $this->assertEquals('Anderson, Anthony', CRM_Member_BAO_Membership::sortName($membership['id']));
6a488035 498
e4649817 499 $this->membershipDelete($membership['id']);
93ac19cd 500 $this->contactDelete($contactId);
6a488035
TO
501 }
502
c490a46a 503 /**
eceb18cc 504 * Delete related memberships.
c490a46a 505 */
00be9182 506 public function testdeleteRelatedMemberships() {
e4649817 507 $contactId = $this->individualCreate();
6a488035 508
9099cab3 509 $params = [
6a488035
TO
510 'contact_id' => $contactId,
511 'membership_type_id' => $this->_membershipTypeID,
6c6e6187
TO
512 'join_date' => date('Ymd', strtotime('2006-01-21')),
513 'start_date' => date('Ymd', strtotime('2006-01-21')),
514 'end_date' => date('Ymd', strtotime('2006-12-21')),
6a488035
TO
515 'source' => 'Payment',
516 'is_override' => 1,
517 'status_id' => $this->_membershipStatusID,
9099cab3
CW
518 ];
519 $ids = [];
6a488035
TO
520
521 CRM_Member_BAO_Membership::create($params, $ids);
522
523 $membershipId = $this->assertDBNotNull('CRM_Member_BAO_Membership', $contactId, 'id',
524 'contact_id', 'Database check for created membership.'
525 );
526
527 CRM_Member_BAO_Membership::deleteRelatedMemberships($membershipId);
528
529 $this->membershipDelete($membershipId);
93ac19cd 530 $this->contactDelete($contactId);
6a488035
TO
531 }
532
c490a46a 533 /**
eceb18cc 534 * Renew membership with change in membership type.
e51c5154
MWMC
535 *
536 * @fixme Note that this test fails when today is August 29 2019 (and maybe other years?):
537 * Verify correct end date is calculated after membership renewal
538 * Failed asserting that two strings are equal.
539 * Expected-'2021-03-01'
540 * Actual+'2021-02-28'
541 * /home/jenkins/bknix-dfl/build/core-15165-73etc/web/sites/all/modules/civicrm/tests/phpunit/CRM/Member/BAO/MembershipTest.php:609
c490a46a 542 */
00be9182 543 public function testRenewMembership() {
e4649817 544 $contactId = $this->individualCreate();
92915c55
TO
545 $joinDate = $startDate = date("Ymd", strtotime(date("Ymd") . " -6 month"));
546 $endDate = date("Ymd", strtotime($joinDate . " +1 year -1 day"));
9099cab3 547 $params = [
6a488035
TO
548 'contact_id' => $contactId,
549 'membership_type_id' => $this->_membershipTypeID,
550 'join_date' => $joinDate,
551 'start_date' => $startDate,
552 'end_date' => $endDate,
553 'source' => 'Payment',
554 'is_override' => 1,
555 'status_id' => $this->_membershipStatusID,
9099cab3
CW
556 ];
557 $ids = [];
92915c55 558 $membership = CRM_Member_BAO_Membership::create($params, $ids);
6a488035
TO
559 $membershipId = $this->assertDBNotNull('CRM_Member_BAO_Membership', $contactId, 'id',
560 'contact_id', 'Database check for created membership.'
561 );
562
563 $this->assertDBNotNull('CRM_Member_BAO_MembershipLog',
564 $membership->id,
565 'id',
566 'membership_id',
567 'Database checked on membershiplog record.'
568 );
569
570 // this is a test and we dont want qfKey generation / validation
571 // easier to suppress it, than change core code
572 $config = CRM_Core_Config::singleton();
573 $config->keyDisable = TRUE;
574
6a488035 575 $isTestMembership = 0;
356bfcaf 576 list($MembershipRenew) = CRM_Member_BAO_Membership::processMembership(
ae5ffbb7
TO
577 $contactId,
578 $this->_membershipTypeID,
579 $isTestMembership,
ae5ffbb7 580 NULL,
595f9e7c
EM
581 NULL,
582 NULL,
583 1,
66e83bf5 584 FALSE,
585 NULL,
586 NULL,
587 FALSE,
595f9e7c 588 NULL,
66e83bf5 589 NULL
ae5ffbb7 590 );
6a488035
TO
591 $endDate = date("Y-m-d", strtotime($membership->end_date . " +1 year"));
592
593 $this->assertDBNotNull('CRM_Member_BAO_MembershipLog',
594 $MembershipRenew->id,
595 'id',
596 'membership_id',
597 'Database checked on membershiplog record.'
598 );
1038ea01
EM
599 $this->assertEquals($this->_membershipTypeID, $MembershipRenew->membership_type_id, 'Verify membership type is changed during renewal.');
600 $this->assertEquals($endDate, $MembershipRenew->end_date, 'Verify correct end date is calculated after membership renewal');
6a488035
TO
601
602 $this->membershipDelete($membershipId);
93ac19cd 603 $this->contactDelete($contactId);
6a488035
TO
604 }
605
c490a46a 606 /**
eceb18cc 607 * Renew stale membership.
c490a46a 608 */
00be9182 609 public function testStaleMembership() {
92915c55 610 $statusId = 3;
e4649817 611 $contactId = $this->individualCreate();
92915c55
TO
612 $joinDate = $startDate = date("Ymd", strtotime(date("Ymd") . " -1 year -15 days"));
613 $endDate = date("Ymd", strtotime($joinDate . " +1 year -1 day"));
9099cab3 614 $params = [
6a488035
TO
615 'contact_id' => $contactId,
616 'membership_type_id' => $this->_membershipTypeID,
617 'join_date' => $joinDate,
618 'start_date' => $startDate,
619 'end_date' => $endDate,
620 'source' => 'Payment',
621 'status_id' => $statusId,
9099cab3 622 ];
6a488035 623
9099cab3 624 $ids = [];
6a488035
TO
625 $membership = CRM_Member_BAO_Membership::create($params, $ids);
626
627 $membershipId = $this->assertDBNotNull('CRM_Member_BAO_Membership', $contactId, 'id',
628 'contact_id', 'Database check for created membership.'
629 );
630
631 $this->assertEquals($membership->status_id, $statusId, 'Verify correct status id is calculated.');
632 $this->assertEquals($membership->membership_type_id, $this->_membershipTypeID,
633 'Verify correct membership type id.'
634 );
635
636 //verify all dates.
9099cab3 637 $dates = [
6a488035
TO
638 'startDate' => 'start_date',
639 'joinDate' => 'join_date',
640 'endDate' => 'end_date',
9099cab3 641 ];
6a488035
TO
642
643 foreach ($dates as $date => $dbDate) {
644 $this->assertEquals($membership->$dbDate, $$date,
645 "Verify correct {$date} is present."
646 );
647 }
648
649 $this->assertDBNotNull('CRM_Member_BAO_MembershipLog',
650 $membership->id,
651 'id',
652 'membership_id',
653 'Database checked on membershiplog record.'
654 );
655
656 // this is a test and we dont want qfKey generation / validation
657 // easier to suppress it, than change core code
658 $config = CRM_Core_Config::singleton();
659 $config->keyDisable = TRUE;
660
ae5ffbb7
TO
661 $membershipRenewal = new CRM_Core_Form();
662 $membershipRenewal->controller = new CRM_Core_Controller();
356bfcaf 663 list($MembershipRenew) = CRM_Member_BAO_Membership::processMembership(
595f9e7c
EM
664 $contactId,
665 $this->_membershipTypeID,
61767a1d 666 FALSE,
595f9e7c
EM
667 $membershipRenewal,
668 NULL,
669 NULL,
670 NULL,
671 1,
672 NULL,
66e83bf5 673 NULL,
674 NULL,
675 FALSE,
676 NULL
677 );
6a488035
TO
678
679 $this->assertDBNotNull('CRM_Member_BAO_MembershipLog',
680 $MembershipRenew->id,
681 'id',
682 'membership_id',
683 'Database checked on membershiplog record.'
684 );
685
686 $this->membershipDelete($membershipId);
93ac19cd 687 $this->contactDelete($contactId);
6a488035 688 }
96025800 689
e136f704 690 public function testUpdateAllMembershipStatusConvertExpiredOverriddenStatusToNormal() {
9099cab3 691 $params = [
e136f704
O
692 'contact_id' => $this->individualCreate(),
693 'membership_type_id' => $this->_membershipTypeID,
694 'join_date' => date('Ymd', time()),
695 'start_date' => date('Ymd', time()),
696 'end_date' => date('Ymd', strtotime('+1 year')),
697 'source' => 'Payment',
698 'is_override' => 1,
699 'status_override_end_date' => date('Ymd', strtotime('-1 day')),
700 'status_id' => $this->_membershipStatusID,
9099cab3
CW
701 ];
702 $ids = [];
e136f704
O
703 $createdMembership = CRM_Member_BAO_Membership::create($params, $ids);
704
705 CRM_Member_BAO_Membership::updateAllMembershipStatus();
706
9099cab3 707 $membershipAfterProcess = civicrm_api3('Membership', 'get', [
e136f704
O
708 'sequential' => 1,
709 'id' => $createdMembership->id,
9099cab3
CW
710 'return' => ['id', 'is_override', 'status_override_end_date'],
711 ])['values'][0];
e136f704
O
712
713 $this->assertEquals($createdMembership->id, $membershipAfterProcess['id']);
714 $this->assertArrayNotHasKey('is_override', $membershipAfterProcess);
715 $this->assertArrayNotHasKey('status_override_end_date', $membershipAfterProcess);
716 }
717
718 public function testUpdateAllMembershipStatusHandleOverriddenWithEndOverrideDateEqualTodayAsExpired() {
9099cab3 719 $params = [
e136f704
O
720 'contact_id' => $this->individualCreate(),
721 'membership_type_id' => $this->_membershipTypeID,
722 'join_date' => date('Ymd', time()),
723 'start_date' => date('Ymd', time()),
724 'end_date' => date('Ymd', strtotime('+1 year')),
725 'source' => 'Payment',
726 'is_override' => 1,
727 'status_override_end_date' => date('Ymd', time()),
728 'status_id' => $this->_membershipStatusID,
9099cab3
CW
729 ];
730 $ids = [];
e136f704
O
731 $createdMembership = CRM_Member_BAO_Membership::create($params, $ids);
732
733 CRM_Member_BAO_Membership::updateAllMembershipStatus();
734
9099cab3 735 $membershipAfterProcess = civicrm_api3('Membership', 'get', [
e136f704
O
736 'sequential' => 1,
737 'id' => $createdMembership->id,
9099cab3
CW
738 'return' => ['id', 'is_override', 'status_override_end_date'],
739 ])['values'][0];
e136f704
O
740
741 $this->assertEquals($createdMembership->id, $membershipAfterProcess['id']);
742 $this->assertArrayNotHasKey('is_override', $membershipAfterProcess);
743 $this->assertArrayNotHasKey('status_override_end_date', $membershipAfterProcess);
744 }
745
746 public function testUpdateAllMembershipStatusDoesNotConvertOverridenMembershipWithoutEndOverrideDateToNormal() {
9099cab3 747 $params = [
e136f704
O
748 'contact_id' => $this->individualCreate(),
749 'membership_type_id' => $this->_membershipTypeID,
750 'join_date' => date('Ymd', time()),
751 'start_date' => date('Ymd', time()),
752 'end_date' => date('Ymd', strtotime('+1 year')),
753 'source' => 'Payment',
754 'is_override' => 1,
755 'status_id' => $this->_membershipStatusID,
9099cab3
CW
756 ];
757 $ids = [];
e136f704
O
758 $createdMembership = CRM_Member_BAO_Membership::create($params, $ids);
759
760 CRM_Member_BAO_Membership::updateAllMembershipStatus();
761
9099cab3 762 $membershipAfterProcess = civicrm_api3('Membership', 'get', [
e136f704
O
763 'sequential' => 1,
764 'id' => $createdMembership->id,
9099cab3
CW
765 'return' => ['id', 'is_override', 'status_override_end_date'],
766 ])['values'][0];
e136f704
O
767
768 $this->assertEquals($createdMembership->id, $membershipAfterProcess['id']);
769 $this->assertEquals(1, $membershipAfterProcess['is_override']);
770 }
771
a9f44ffb 772 /**
773 * @throws \CRM_Core_Exception
774 */
775 public function testMembershipPaymentForSingleContributionMultipleMembership() {
776 $membershipTypeID1 = $this->membershipTypeCreate(['name' => 'Parent']);
777 $membershipTypeID2 = $this->membershipTypeCreate(['name' => 'Child']);
778 $financialTypeId = $this->getFinancialTypeId('Member Dues');
779 $priceSet = $this->callAPISuccess('price_set', 'create', [
780 'is_quick_config' => 0,
781 'extends' => 'CiviMember',
782 'financial_type_id' => $financialTypeId,
783 'title' => 'Family Membership',
784 ]);
785 $priceSetID = $priceSet['id'];
786 $priceField = $this->callAPISuccess('price_field', 'create', [
787 'price_set_id' => $priceSetID,
788 'label' => 'Memberships',
789 'html_type' => 'Radio',
790 ]);
791 $priceFieldValue = $this->callAPISuccess('price_field_value', 'create', [
792 'price_set_id' => $priceSetID,
793 'price_field_id' => $priceField['id'],
794 'label' => 'Parent',
795 'amount' => 100,
796 'financial_type_id' => $financialTypeId,
797 'membership_type_id' => $membershipTypeID1,
798 'membership_num_terms' => 1,
799 ]);
800 $priceFieldValueId = [1 => $priceFieldValue['id']];
801 $priceFieldValue = $this->callAPISuccess('price_field_value', 'create', [
802 'price_set_id' => $priceSetID,
803 'price_field_id' => $priceField['id'],
804 'label' => 'Child',
805 'amount' => 50,
806 'financial_type_id' => $financialTypeId,
807 'membership_type_id' => $membershipTypeID2,
808 'membership_num_terms' => 1,
809 ]);
810 $priceFieldValueId[2] = $priceFieldValue['id'];
811 $parentContactId = $this->individualCreate();
812 $contributionRecur = $this->callAPISuccess('contribution_recur', 'create', [
813 'contact_id' => $parentContactId,
814 'amount' => 200,
815 'frequency_unit' => 'day',
816 'frequency_interval' => 1,
817 'installments' => 2,
818 'start_date' => 'yesterday',
819 'create_date' => 'yesterday',
820 'modified_date' => 'yesterday',
821 'cancel_date' => NULL,
822 'end_date' => '+ 2 weeks',
823 'processor_id' => '643411460836',
824 'trxn_id' => 'e0d0808e26f3e661c6c18eb7c039d363',
825 'invoice_id' => 'e0d0808e26f3e661c6c18eb7c039d363',
826 'contribution_status_id' => 'In Progress',
827 'cycle_day' => 1,
828 'next_sched_contribution_date' => '+ 1 week',
829 'auto_renew' => 0,
830 'currency' => 'USD',
831 'payment_processor_id' => $this->paymentProcessorCreate(),
832 'financial_type_id' => $financialTypeId,
833 'payment_instrument_id' => 'Credit Card',
834 ]);
835 $contribution = $this->callAPISuccess('contribution', 'create', [
836 'total_amount' => 200,
837 'contribution_recur_id' => $contributionRecur['id'],
838 'currency' => 'USD',
839 'contact_id' => $parentContactId,
840 'financial_type_id' => $financialTypeId,
841 'contribution_status_id' => 'Completed',
842 'skipLineItem' => TRUE,
843 'is_recur' => TRUE,
844 ]);
845 $params[] = [
846 'contact_id' => $parentContactId,
847 'membership_type_id' => $membershipTypeID1,
848 'contribution_recur_id' => $contributionRecur['id'],
849 'join_date' => date('Ymd', time()),
850 'start_date' => date('Ymd', time()),
851 'end_date' => date('Ymd', strtotime('+1 year')),
852 'skipLineItem' => TRUE,
853 'source' => 'Payment',
854 'line_items' => [
855 'price_field_id' => $priceField['id'],
856 'price_field_value_id' => $priceFieldValueId[1],
857 'label' => 'Parent',
858 'contribution_id' => $contribution['id'],
859 'membership_type_id' => $membershipTypeID1,
860 'qty' => 1,
861 'unit_price' => 100,
862 'line_total' => 100,
863 'financial_type_id' => $financialTypeId,
864 'entity_table' => 'civicrm_membership',
865 ],
866 ];
867 $params[] = [
868 'contact_id' => $this->individualCreate(),
869 'membership_type_id' => $membershipTypeID2,
870 'contribution_recur_id' => $contributionRecur['id'],
871 'join_date' => date('Ymd', time()),
872 'start_date' => date('Ymd', time()),
873 'end_date' => date('Ymd', strtotime('+1 year')),
874 'skipLineItem' => TRUE,
875 'source' => 'Payment',
876 'line_items' => [
877 'price_field_id' => $priceField['id'],
878 'price_field_value_id' => $priceFieldValueId[2],
879 'label' => 'Child',
880 'contribution_id' => $contribution['id'],
881 'qty' => 1,
882 'unit_price' => 50,
883 'line_total' => 50,
884 'membership_type_id' => $membershipTypeID2,
885 'financial_type_id' => $financialTypeId,
886 'entity_table' => 'civicrm_membership',
887 ],
888 ];
889 $params[] = [
890 'contact_id' => $this->individualCreate(),
891 'membership_type_id' => $membershipTypeID2,
892 'contribution_recur_id' => $contributionRecur['id'],
893 'join_date' => date('Ymd', time()),
894 'start_date' => date('Ymd', time()),
895 'skipLineItem' => TRUE,
896 'end_date' => date('Ymd', strtotime('+1 year')),
897 'source' => 'Payment',
898 'line_items' => [
899 'price_field_id' => $priceField['id'],
900 'price_field_value_id' => $priceFieldValueId[2],
901 'label' => 'Child',
902 'contribution_id' => $contribution['id'],
903 'qty' => 1,
904 'membership_type_id' => $membershipTypeID2,
905 'unit_price' => 50,
906 'line_total' => 50,
907 'financial_type_id' => $financialTypeId,
908 'entity_table' => 'civicrm_membership',
909 ],
910 ];
911
912 foreach ($params as $key => $param) {
913 $membership = $this->callAPISuccess('membership', 'create', $param);
914 $param['line_items']['entity_id'] = $membership['id'];
915 $memPayments = new CRM_Member_BAO_MembershipPayment();
916 $paymentParams = [
917 'membership_id' => $membership['id'],
918 'contribution_id' => $contribution['id'],
919 ];
920 $memPayments->copyValues($paymentParams);
921 $memPayments->save();
922 $lineItemBAO = new CRM_Price_BAO_LineItem();
923 $lineItemBAO->copyValues($param['line_items']);
924 $lineItemBAO->save();
925 }
926 $this->callAPISuccess('contribution', 'repeattransaction', [
927 'original_contribution_id' => $contribution['id'],
928 'contribution_status_id' => 'Completed',
929 'trxn_id' => uniqid(),
930 ]);
931 $this->callAPISuccessGetCount('Contribution', [], 2);
932 $this->callAPISuccessGetCount('LineItem', [], 6);
933 $this->membershipTypeDelete(['id' => $membershipTypeID1]);
934 $this->membershipTypeDelete(['id' => $membershipTypeID2]);
935 }
936
6a488035 937}