Merge pull request #13154 from civicrm/5.8
[civicrm-core.git] / tests / phpunit / CRM / Member / BAO / MembershipTest.php
CommitLineData
6a488035
TO
1<?php
2/*
3 +--------------------------------------------------------------------+
2fe49090 4 | CiviCRM version 5 |
6a488035 5 +--------------------------------------------------------------------+
8c9251b3 6 | Copyright CiviCRM LLC (c) 2004-2018 |
6a488035
TO
7 +--------------------------------------------------------------------+
8 | This file is a part of CiviCRM. |
9 | |
10 | CiviCRM is free software; you can copy, modify, and distribute it |
11 | under the terms of the GNU Affero General Public License |
12 | Version 3, 19 November 2007 and the CiviCRM Licensing Exception. |
13 | |
14 | CiviCRM is distributed in the hope that it will be useful, but |
15 | WITHOUT ANY WARRANTY; without even the implied warranty of |
16 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
17 | See the GNU Affero General Public License for more details. |
18 | |
19 | You should have received a copy of the GNU Affero General Public |
20 | License and the CiviCRM Licensing Exception along |
21 | with this program; if not, contact CiviCRM LLC |
22 | at info[AT]civicrm[DOT]org. If you have questions about the |
23 | GNU Affero General Public License or the licensing of CiviCRM, |
24 | see the CiviCRM license FAQ at http://civicrm.org/licensing |
25 +--------------------------------------------------------------------+
d25dd0ee 26 */
6a488035 27
4cbe18b8
EM
28/**
29 * Class CRM_Member_BAO_MembershipTest
acb109b7 30 * @group headless
4cbe18b8 31 */
6a488035 32class CRM_Member_BAO_MembershipTest extends CiviUnitTestCase {
6a488035 33
00be9182 34 public function setUp() {
6a488035
TO
35 parent::setUp();
36 // FIXME: something NULLs $GLOBALS['_HTML_QuickForm_registered_rules'] when the tests are ran all together
37 $GLOBALS['_HTML_QuickForm_registered_rules'] = array(
38 'required' => array('html_quickform_rule_required', 'HTML/QuickForm/Rule/Required.php'),
39 'maxlength' => array('html_quickform_rule_range', 'HTML/QuickForm/Rule/Range.php'),
40 'minlength' => array('html_quickform_rule_range', 'HTML/QuickForm/Rule/Range.php'),
41 'rangelength' => array('html_quickform_rule_range', 'HTML/QuickForm/Rule/Range.php'),
42 'email' => array('html_quickform_rule_email', 'HTML/QuickForm/Rule/Email.php'),
43 'regex' => array('html_quickform_rule_regex', 'HTML/QuickForm/Rule/Regex.php'),
44 'lettersonly' => array('html_quickform_rule_regex', 'HTML/QuickForm/Rule/Regex.php'),
45 'alphanumeric' => array('html_quickform_rule_regex', 'HTML/QuickForm/Rule/Regex.php'),
46 'numeric' => array('html_quickform_rule_regex', 'HTML/QuickForm/Rule/Regex.php'),
47 'nopunctuation' => array('html_quickform_rule_regex', 'HTML/QuickForm/Rule/Regex.php'),
48 'nonzero' => array('html_quickform_rule_regex', 'HTML/QuickForm/Rule/Regex.php'),
49 'callback' => array('html_quickform_rule_callback', 'HTML/QuickForm/Rule/Callback.php'),
50 'compare' => array('html_quickform_rule_compare', 'HTML/QuickForm/Rule/Compare.php'),
51 );
52
53 $this->_contactID = $this->organizationCreate();
75638074 54 $this->_membershipTypeID = $this->membershipTypeCreate(array('member_of_contact_id' => $this->_contactID));
6a488035
TO
55 // add a random number to avoid silly conflicts with old data
56 $this->_membershipStatusID = $this->membershipStatusCreate('test status' . rand(1, 1000));
57 }
58
59 /**
60 * Tears down the fixture, for example, closes a network connection.
61 * This method is called after a test is executed.
6a488035 62 */
00be9182 63 public function tearDown() {
481a74f4
TO
64 $this->membershipTypeDelete(array('id' => $this->_membershipTypeID));
65 $this->membershipStatusDelete($this->_membershipStatusID);
93ac19cd 66 $this->contactDelete($this->_contactID);
6a488035 67
6c6e6187 68 $this->_contactID = $this->_membershipStatusID = $this->_membershipTypeID = NULL;
6a488035
TO
69 }
70
5c3a7abf
AP
71 /**
72 * Create membership type using given organization id.
73 * @param $organizationId
74 * @return array|int
75 */
76 private function createMembershipType($organizationId, $withRelationship = FALSE) {
77 $membershipType = $this->callAPISuccess('MembershipType', 'create', array(
78 'domain_id' => 1, //Default domain ID
79 'member_of_contact_id' => $organizationId,
80 'financial_type_id' => "Member Dues",
81 'duration_unit' => "year",
82 'duration_interval' => 1,
83 'period_type' => "rolling",
84 'name' => "Organiation Membership Type",
85 'relationship_type_id' => ($withRelationship) ? 5 : NULL,
86 'relationship_direction' => ($withRelationship) ? 'b_a' : NULL,
87 ));
88 return $membershipType["values"][$membershipType["id"]];
89 }
90
91 /**
92 * Get count of related memberships by parent membership id.
93 * @param $membershipId
94 * @return array|int
95 */
96 private function getRelatedMembershipsCount($membershipId) {
97 return $this->callAPISuccess("Membership", "getcount", array(
98 'owner_membership_id' => $membershipId,
99 ));
100 }
101
102 /**
103 * Test to delete related membership when type of parent memebrship is changed which does not have relation type associated.
104 * @throws CRM_Core_Exception
105 */
106 public function testDeleteRelatedMembershipsOnParentTypeChanged() {
107
108 $contactId = $this->individualCreate();
109 $membershipOrganizationId = $this->organizationCreate();
110 $organizationId = $this->organizationCreate();
111
112 // Create relationship between organization and individual contact
113 $this->callAPISuccess('Relationship', 'create', array(
114 'relationship_type_id' => 5, // Employer of relationship
115 'contact_id_a' => $contactId,
116 'contact_id_b' => $organizationId,
117 'is_active' => 1,
118 ));
119
120 // Create two membership types one with relationship and one without.
121 $membershipTypeWithRelationship = $this->createMembershipType($membershipOrganizationId, TRUE);
122 $membershipTypeWithoutRelationship = $this->createMembershipType($membershipOrganizationId);
123
124 // Creating membership of organisation
125 $membership = $this->callAPISuccess("Membership", "create", array(
126 'membership_type_id' => $membershipTypeWithRelationship["id"],
127 'contact_id' => $organizationId,
128 'status_id' => $this->_membershipStatusID,
129 ));
130
131 $membership = $membership["values"][$membership["id"]];
132
133 // Check count of related memberships. It should be one for individual contact.
134 $relatedMembershipsCount = $this->getRelatedMembershipsCount($membership["id"]);
135 $this->assertEquals(1, $relatedMembershipsCount, 'Related membership count should be 1.');
136
137 // Update membership by changing it's type. New membership type is without relationship.
138 $membership["membership_type_id"] = $membershipTypeWithoutRelationship["id"];
139 $updatedMembership = $this->callAPISuccess("Membership", "create", $membership);
140
141 // Check count of related memberships again. It should be zero as we changed the membership type.
142 $relatedMembershipsCount = $this->getRelatedMembershipsCount($membership["id"]);
143 $this->assertEquals(0, $relatedMembershipsCount, 'Related membership count should be 0.');
144
145 // Clean up: Delete membership
146 $this->membershipDelete($membership["id"]);
147 }
148
00be9182 149 public function testCreate() {
6a488035 150
6ae19242 151 $contactId = $this->individualCreate();
6a488035
TO
152
153 $params = array(
154 'contact_id' => $contactId,
155 'membership_type_id' => $this->_membershipTypeID,
6c6e6187
TO
156 'join_date' => date('Ymd', strtotime('2006-01-21')),
157 'start_date' => date('Ymd', strtotime('2006-01-21')),
158 'end_date' => date('Ymd', strtotime('2006-12-21')),
6a488035
TO
159 'source' => 'Payment',
160 'is_override' => 1,
161 'status_id' => $this->_membershipStatusID,
162 );
163 $ids = array();
164 CRM_Member_BAO_Membership::create($params, $ids);
165
166 $membershipId = $this->assertDBNotNull('CRM_Member_BAO_Membership', $contactId, 'id',
167 'contact_id', 'Database check for created membership.'
168 );
169
170 // Now call create() to modify an existing Membership
171
172 $params = array();
173 $params = array(
174 'contact_id' => $contactId,
175 'membership_type_id' => $this->_membershipTypeID,
6c6e6187
TO
176 'join_date' => date('Ymd', strtotime('2006-01-21')),
177 'start_date' => date('Ymd', strtotime('2006-01-21')),
178 'end_date' => date('Ymd', strtotime('2006-12-21')),
6a488035
TO
179 'source' => 'Payment',
180 'is_override' => 1,
181 'status_id' => $this->_membershipStatusID,
182 );
183 $ids = array(
184 'membership' => $membershipId,
185 );
186 CRM_Member_BAO_Membership::create($params, $ids);
187
188 $membershipTypeId = $this->assertDBNotNull('CRM_Member_BAO_Membership', $contactId,
189 'membership_type_id', 'contact_id',
190 'Database check on updated membership record.'
191 );
192 $this->assertEquals($membershipTypeId, $this->_membershipTypeID, 'Verify membership type id is fetched.');
193
194 $this->membershipDelete($membershipId);
93ac19cd 195 $this->contactDelete($contactId);
6a488035
TO
196 }
197
00be9182 198 public function testGetValues() {
6a488035
TO
199 // $this->markTestSkipped( 'causes mysterious exit, needs fixing!' );
200 // Calculate membership dates based on the current date
201 $now = time();
202 $year_from_now = $now + (365 * 24 * 60 * 60);
203 $last_month = $now - (30 * 24 * 60 * 60);
204 $year_from_last_month = $last_month + (365 * 24 * 60 * 60);
205
6ae19242 206 $contactId = $this->individualCreate();
6a488035
TO
207
208 $params = array(
209 'contact_id' => $contactId,
210 'membership_type_id' => $this->_membershipTypeID,
211 'join_date' => date('Ymd'),
212 'start_date' => date('Ymd'),
213 'end_date' => date('Ymd', $year_from_now),
214 'source' => 'Payment',
215 'is_override' => 1,
216 'status_id' => $this->_membershipStatusID,
217 );
218
219 $ids = array();
220 CRM_Member_BAO_Membership::create($params, $ids);
221
222 $membershipId1 = $this->assertDBNotNull('CRM_Member_BAO_Membership', $contactId, 'id',
223 'contact_id', 'Database check for created membership.'
224 );
225
226 $params = array(
227 'contact_id' => $contactId,
228 'membership_type_id' => $this->_membershipTypeID,
229 'join_date' => date('Ymd', $last_month),
230 'start_date' => date('Ymd', $last_month),
231 'end_date' => date('Ymd', $year_from_last_month),
232 'source' => 'Source123',
233 'is_override' => 0,
234 'status_id' => $this->_membershipStatusID,
235 );
236 $ids = array();
237 CRM_Member_BAO_Membership::create($params, $ids);
238
239 $membershipId2 = $this->assertDBNotNull('CRM_Member_BAO_Membership', 'source123', 'id',
240 'source', 'Database check for created membership.'
241 );
242
243 $membership = array('contact_id' => $contactId);
244 $membershipValues = array();
245 CRM_Member_BAO_Membership::getValues($membership, $membershipValues, TRUE);
246
247 $this->assertEquals($membershipValues[$membershipId1]['membership_id'], $membershipId1, 'Verify membership record 1 is fetched.');
248
249 $this->assertEquals($membershipValues[$membershipId2]['membership_id'], $membershipId2, 'Verify membership record 2 is fetched.');
250
251 $this->membershipDelete($membershipId1);
252 $this->membershipDelete($membershipId2);
93ac19cd 253 $this->contactDelete($contactId);
6a488035
TO
254 }
255
00be9182 256 public function testRetrieve() {
6ae19242 257 $contactId = $this->individualCreate();
6a488035
TO
258
259 $params = array(
260 'contact_id' => $contactId,
261 'membership_type_id' => $this->_membershipTypeID,
6c6e6187
TO
262 'join_date' => date('Ymd', strtotime('2006-01-21')),
263 'start_date' => date('Ymd', strtotime('2006-01-21')),
264 'end_date' => date('Ymd', strtotime('2006-12-21')),
6a488035
TO
265 'source' => 'Payment',
266 'is_override' => 1,
267 'status_id' => $this->_membershipStatusID,
268 );
269 $ids = array();
270 CRM_Member_BAO_Membership::create($params, $ids);
271
272 $membershipId = $this->assertDBNotNull('CRM_Member_BAO_Membership', $contactId, 'id',
273 'contact_id', 'Database check for created membership.'
274 );
275 $params = array('id' => $membershipId);
3e8ef36b 276 $values = array();
6a488035
TO
277 CRM_Member_BAO_Membership::retrieve($params, $values);
278 $this->assertEquals($values['id'], $membershipId, 'Verify membership record is retrieved.');
279
280 $this->membershipDelete($membershipId);
281 $this->contactDelete($contactId);
282 }
283
00be9182 284 public function testActiveMembers() {
6ae19242 285 $contactId = $this->individualCreate();
6a488035
TO
286
287 $params = array(
288 'contact_id' => $contactId,
289 'membership_type_id' => $this->_membershipTypeID,
6c6e6187
TO
290 'join_date' => date('Ymd', strtotime('2006-01-21')),
291 'start_date' => date('Ymd', strtotime('2006-01-21')),
292 'end_date' => date('Ymd', strtotime('2006-12-21')),
6a488035
TO
293 'source' => 'Payment',
294 'is_override' => 1,
295 'status_id' => $this->_membershipStatusID,
296 );
297 $ids = array();
298 CRM_Member_BAO_Membership::create($params, $ids);
299
300 $membershipId1 = $this->assertDBNotNull('CRM_Member_BAO_Membership', $contactId, 'id',
301 'contact_id', 'Database check for created membership.'
302 );
303
304 $params = array('id' => $membershipId1);
3e8ef36b 305 $values1 = array();
6a488035
TO
306 CRM_Member_BAO_Membership::retrieve($params, $values1);
307 $membership = array($membershipId1 => $values1);
308
309 $params = array(
310 'contact_id' => $contactId,
311 'membership_type_id' => $this->_membershipTypeID,
6c6e6187
TO
312 'join_date' => date('Ymd', strtotime('2006-01-21')),
313 'start_date' => date('Ymd', strtotime('2006-01-21')),
314 'end_date' => date('Ymd', strtotime('2006-12-21')),
6a488035
TO
315 'source' => 'PaySource',
316 'is_override' => 1,
317 'status_id' => $this->_membershipStatusID,
318 );
319 $ids = array();
320 CRM_Member_BAO_Membership::create($params, $ids);
321
322 $membershipId2 = $this->assertDBNotNull('CRM_Member_BAO_Membership', 'PaySource', 'id',
323 'source', 'Database check for created membership.'
324 );
325
326 $params = array('id' => $membershipId2);
3e8ef36b 327 $values2 = array();
6a488035
TO
328 CRM_Member_BAO_Membership::retrieve($params, $values2);
329 $membership[$membershipId2] = $values2;
330
331 $activeMembers = CRM_Member_BAO_Membership::activeMembers($membership);
332 $inActiveMembers = CRM_Member_BAO_Membership::activeMembers($membership, 'inactive');
333
334 $this->assertEquals($activeMembers[$membershipId1]['id'], $membership[$membershipId1]['id'], 'Verify active membership record is retrieved.');
335 $this->assertEquals($activeMembers[$membershipId2]['id'], $membership[$membershipId2]['id'], 'Verify active membership record is retrieved.');
336
337 $this->assertEquals(0, count($inActiveMembers), 'Verify No inactive membership record is retrieved.');
338
339 $this->membershipDelete($membershipId1);
340 $this->membershipDelete($membershipId2);
93ac19cd 341 $this->contactDelete($contactId);
6a488035
TO
342 }
343
00be9182 344 public function testDeleteMembership() {
6ae19242 345 $contactId = $this->individualCreate();
6a488035
TO
346
347 $params = array(
348 'contact_id' => $contactId,
349 'membership_type_id' => $this->_membershipTypeID,
6c6e6187
TO
350 'join_date' => date('Ymd', strtotime('2006-01-21')),
351 'start_date' => date('Ymd', strtotime('2006-01-21')),
352 'end_date' => date('Ymd', strtotime('2006-12-21')),
6a488035
TO
353 'source' => 'Payment',
354 'is_override' => 1,
355 'status_id' => $this->_membershipStatusID,
356 );
357 $ids = array();
358 CRM_Member_BAO_Membership::create($params, $ids);
359
360 $membershipId = $this->assertDBNotNull('CRM_Member_BAO_Membership', $contactId, 'id',
361 'contact_id', 'Database check for created membership.'
362 );
3506b6cd 363 CRM_Member_BAO_Membership::del($membershipId);
6a488035 364
93ac19cd 365 $this->assertDBNull('CRM_Member_BAO_Membership', $contactId, 'id',
6a488035
TO
366 'contact_id', 'Database check for deleted membership.'
367 );
93ac19cd 368 $this->contactDelete($contactId);
6a488035
TO
369 }
370
00be9182 371 public function testGetContactMembership() {
6ae19242 372 $contactId = $this->individualCreate();
6a488035
TO
373
374 $params = array(
375 'contact_id' => $contactId,
376 'membership_type_id' => $this->_membershipTypeID,
6c6e6187
TO
377 'join_date' => date('Ymd', strtotime('2006-01-21')),
378 'start_date' => date('Ymd', strtotime('2006-01-21')),
379 'end_date' => date('Ymd', strtotime('2006-12-21')),
6a488035
TO
380 'source' => 'Payment',
381 'is_override' => 1,
382 'status_id' => $this->_membershipStatusID,
383 );
384 $ids = array();
385 CRM_Member_BAO_Membership::create($params, $ids);
386
387 $membershipId = $this->assertDBNotNull('CRM_Member_BAO_Membership', $contactId, 'id',
388 'contact_id', 'Database check for created membership.'
389 );
390
391 $membership = CRM_Member_BAO_Membership::getContactMembership($contactId, $this->_membershipTypeID, FALSE);
392
393 $this->assertEquals($membership['id'], $membershipId, 'Verify membership record is retrieved.');
394
395 $this->membershipDelete($membershipId);
93ac19cd 396 $this->contactDelete($contactId);
6a488035
TO
397 }
398
399
c490a46a 400 /**
eceb18cc 401 * Get the contribution.
c490a46a
CW
402 * page id from the membership record
403 */
00be9182 404 public function testgetContributionPageId() {
6ae19242 405 $contactId = $this->individualCreate();
6a488035
TO
406
407 $params = array(
408 'contact_id' => $contactId,
409 'membership_type_id' => $this->_membershipTypeID,
6c6e6187
TO
410 'join_date' => date('Ymd', strtotime('2006-01-21')),
411 'start_date' => date('Ymd', strtotime('2006-01-21')),
412 'end_date' => date('Ymd', strtotime('2006-12-21')),
6a488035
TO
413 'source' => 'Payment',
414 'is_override' => 1,
415 'status_id' => $this->_membershipStatusID,
416 );
417 $ids = array();
418 CRM_Member_BAO_Membership::create($params, $ids);
419
6a488035
TO
420 $membershipId = $this->assertDBNotNull('CRM_Member_BAO_Membership', $contactId, 'id',
421 'contact_id', 'Database check for created membership.'
422 );
423 $membership[$membershipId]['renewPageId'] = CRM_Member_BAO_Membership::getContributionPageId($membershipId);
424
425 $this->membershipDelete($membershipId);
93ac19cd 426 $this->contactDelete($contactId);
6a488035 427 }
92915c55 428
c490a46a
CW
429 /**
430 * Get membership joins/renewals
431 * for a specified membership
432 * type.
c490a46a 433 */
00be9182 434 public function testgetMembershipStarts() {
6ae19242 435 $contactId = $this->individualCreate();
6a488035
TO
436
437 $params = array(
438 'contact_id' => $contactId,
439 'membership_type_id' => $this->_membershipTypeID,
6c6e6187
TO
440 'join_date' => date('Ymd', strtotime('2006-01-21')),
441 'start_date' => date('Ymd', strtotime('2006-01-21')),
442 'end_date' => date('Ymd', strtotime('2006-12-21')),
6a488035
TO
443 'source' => 'Payment',
444 'is_override' => 1,
445 'status_id' => $this->_membershipStatusID,
446 );
447 $ids = array();
448 CRM_Member_BAO_Membership::create($params, $ids);
449
450 $membershipId = $this->assertDBNotNull('CRM_Member_BAO_Membership', $contactId, 'id',
451 'contact_id', 'Database check for created membership.'
452 );
453 $yearStart = date('Y') . '0101';
454 $currentDate = date('Ymd');
455 CRM_Member_BAO_Membership::getMembershipStarts($this->_membershipTypeID, $yearStart, $currentDate);
456
457 $this->membershipDelete($membershipId);
93ac19cd 458 $this->contactDelete($contactId);
6a488035
TO
459 }
460
c490a46a
CW
461 /**
462 * Get a count of membership for a specified membership type,
463 * optionally for a specified date.
c490a46a 464 */
00be9182 465 public function testGetMembershipCount() {
6ae19242 466 $contactId = $this->individualCreate();
6a488035
TO
467
468 $params = array(
469 'contact_id' => $contactId,
470 'membership_type_id' => $this->_membershipTypeID,
6c6e6187
TO
471 'join_date' => date('Ymd', strtotime('2006-01-21')),
472 'start_date' => date('Ymd', strtotime('2006-01-21')),
473 'end_date' => date('Ymd', strtotime('2006-12-21')),
6a488035
TO
474 'source' => 'Payment',
475 'is_override' => 1,
476 'status_id' => $this->_membershipStatusID,
477 );
478 $ids = array();
479 CRM_Member_BAO_Membership::create($params, $ids);
480
481 $membershipId = $this->assertDBNotNull('CRM_Member_BAO_Membership', $contactId, 'id',
482 'contact_id', 'Database check for created membership.'
483 );
484 $currentDate = date('Ymd');
485 $test = 0;
486 CRM_Member_BAO_Membership::getMembershipCount($this->_membershipTypeID, $currentDate, $test);
487
488 $this->membershipDelete($membershipId);
93ac19cd 489 $this->contactDelete($contactId);
6a488035
TO
490 }
491
492
c490a46a 493 /**
e4649817 494 * Checkup sort name function.
c490a46a 495 */
e4649817 496 public function testSortName() {
497 $contactId = $this->individualCreate();
6a488035
TO
498
499 $params = array(
500 'contact_id' => $contactId,
501 'membership_type_id' => $this->_membershipTypeID,
e4649817 502 'join_date' => '2006-01-21',
503 'start_date' => '2006-01-21',
504 'end_date' => '2006-12-21',
6a488035
TO
505 'source' => 'Payment',
506 'is_override' => 1,
507 'status_id' => $this->_membershipStatusID,
508 );
6a488035 509
e4649817 510 $membership = $this->callAPISuccess('Membership', 'create', $params);
6a488035 511
e4649817 512 $this->assertEquals('Anderson, Anthony', CRM_Member_BAO_Membership::sortName($membership['id']));
6a488035 513
e4649817 514 $this->membershipDelete($membership['id']);
93ac19cd 515 $this->contactDelete($contactId);
6a488035
TO
516 }
517
c490a46a 518 /**
eceb18cc 519 * Delete related memberships.
c490a46a 520 */
00be9182 521 public function testdeleteRelatedMemberships() {
e4649817 522 $contactId = $this->individualCreate();
6a488035
TO
523
524 $params = array(
525 'contact_id' => $contactId,
526 'membership_type_id' => $this->_membershipTypeID,
6c6e6187
TO
527 'join_date' => date('Ymd', strtotime('2006-01-21')),
528 'start_date' => date('Ymd', strtotime('2006-01-21')),
529 'end_date' => date('Ymd', strtotime('2006-12-21')),
6a488035
TO
530 'source' => 'Payment',
531 'is_override' => 1,
532 'status_id' => $this->_membershipStatusID,
533 );
534 $ids = array();
535
536 CRM_Member_BAO_Membership::create($params, $ids);
537
538 $membershipId = $this->assertDBNotNull('CRM_Member_BAO_Membership', $contactId, 'id',
539 'contact_id', 'Database check for created membership.'
540 );
541
542 CRM_Member_BAO_Membership::deleteRelatedMemberships($membershipId);
543
544 $this->membershipDelete($membershipId);
93ac19cd 545 $this->contactDelete($contactId);
6a488035
TO
546 }
547
c490a46a 548 /**
eceb18cc 549 * Renew membership with change in membership type.
c490a46a 550 */
00be9182 551 public function testRenewMembership() {
e4649817 552 $contactId = $this->individualCreate();
92915c55
TO
553 $joinDate = $startDate = date("Ymd", strtotime(date("Ymd") . " -6 month"));
554 $endDate = date("Ymd", strtotime($joinDate . " +1 year -1 day"));
6a488035
TO
555 $params = array(
556 'contact_id' => $contactId,
557 'membership_type_id' => $this->_membershipTypeID,
558 'join_date' => $joinDate,
559 'start_date' => $startDate,
560 'end_date' => $endDate,
561 'source' => 'Payment',
562 'is_override' => 1,
563 'status_id' => $this->_membershipStatusID,
564 );
92915c55
TO
565 $ids = array();
566 $membership = CRM_Member_BAO_Membership::create($params, $ids);
6a488035
TO
567 $membershipId = $this->assertDBNotNull('CRM_Member_BAO_Membership', $contactId, 'id',
568 'contact_id', 'Database check for created membership.'
569 );
570
571 $this->assertDBNotNull('CRM_Member_BAO_MembershipLog',
572 $membership->id,
573 'id',
574 'membership_id',
575 'Database checked on membershiplog record.'
576 );
577
578 // this is a test and we dont want qfKey generation / validation
579 // easier to suppress it, than change core code
580 $config = CRM_Core_Config::singleton();
581 $config->keyDisable = TRUE;
582
6a488035 583 $isTestMembership = 0;
356bfcaf 584 list($MembershipRenew) = CRM_Member_BAO_Membership::processMembership(
ae5ffbb7
TO
585 $contactId,
586 $this->_membershipTypeID,
587 $isTestMembership,
ae5ffbb7 588 NULL,
595f9e7c
EM
589 NULL,
590 NULL,
591 1,
66e83bf5 592 FALSE,
593 NULL,
594 NULL,
595 FALSE,
595f9e7c 596 NULL,
66e83bf5 597 NULL
ae5ffbb7 598 );
6a488035
TO
599 $endDate = date("Y-m-d", strtotime($membership->end_date . " +1 year"));
600
601 $this->assertDBNotNull('CRM_Member_BAO_MembershipLog',
602 $MembershipRenew->id,
603 'id',
604 'membership_id',
605 'Database checked on membershiplog record.'
606 );
1038ea01
EM
607 $this->assertEquals($this->_membershipTypeID, $MembershipRenew->membership_type_id, 'Verify membership type is changed during renewal.');
608 $this->assertEquals($endDate, $MembershipRenew->end_date, 'Verify correct end date is calculated after membership renewal');
6a488035
TO
609
610 $this->membershipDelete($membershipId);
93ac19cd 611 $this->contactDelete($contactId);
6a488035
TO
612 }
613
c490a46a 614 /**
eceb18cc 615 * Renew stale membership.
c490a46a 616 */
00be9182 617 public function testStaleMembership() {
92915c55 618 $statusId = 3;
e4649817 619 $contactId = $this->individualCreate();
92915c55
TO
620 $joinDate = $startDate = date("Ymd", strtotime(date("Ymd") . " -1 year -15 days"));
621 $endDate = date("Ymd", strtotime($joinDate . " +1 year -1 day"));
622 $params = array(
6a488035
TO
623 'contact_id' => $contactId,
624 'membership_type_id' => $this->_membershipTypeID,
625 'join_date' => $joinDate,
626 'start_date' => $startDate,
627 'end_date' => $endDate,
628 'source' => 'Payment',
629 'status_id' => $statusId,
630 );
631
632 $ids = array();
633 $membership = CRM_Member_BAO_Membership::create($params, $ids);
634
635 $membershipId = $this->assertDBNotNull('CRM_Member_BAO_Membership', $contactId, 'id',
636 'contact_id', 'Database check for created membership.'
637 );
638
639 $this->assertEquals($membership->status_id, $statusId, 'Verify correct status id is calculated.');
640 $this->assertEquals($membership->membership_type_id, $this->_membershipTypeID,
641 'Verify correct membership type id.'
642 );
643
644 //verify all dates.
645 $dates = array(
646 'startDate' => 'start_date',
647 'joinDate' => 'join_date',
648 'endDate' => 'end_date',
649 );
650
651 foreach ($dates as $date => $dbDate) {
652 $this->assertEquals($membership->$dbDate, $$date,
653 "Verify correct {$date} is present."
654 );
655 }
656
657 $this->assertDBNotNull('CRM_Member_BAO_MembershipLog',
658 $membership->id,
659 'id',
660 'membership_id',
661 'Database checked on membershiplog record.'
662 );
663
664 // this is a test and we dont want qfKey generation / validation
665 // easier to suppress it, than change core code
666 $config = CRM_Core_Config::singleton();
667 $config->keyDisable = TRUE;
668
ae5ffbb7
TO
669 $membershipRenewal = new CRM_Core_Form();
670 $membershipRenewal->controller = new CRM_Core_Controller();
356bfcaf 671 list($MembershipRenew) = CRM_Member_BAO_Membership::processMembership(
595f9e7c
EM
672 $contactId,
673 $this->_membershipTypeID,
61767a1d 674 FALSE,
595f9e7c
EM
675 $membershipRenewal,
676 NULL,
677 NULL,
678 NULL,
679 1,
680 NULL,
66e83bf5 681 NULL,
682 NULL,
683 FALSE,
684 NULL
685 );
6a488035
TO
686
687 $this->assertDBNotNull('CRM_Member_BAO_MembershipLog',
688 $MembershipRenew->id,
689 'id',
690 'membership_id',
691 'Database checked on membershiplog record.'
692 );
693
694 $this->membershipDelete($membershipId);
93ac19cd 695 $this->contactDelete($contactId);
6a488035 696 }
96025800 697
e136f704
O
698 public function testUpdateAllMembershipStatusConvertExpiredOverriddenStatusToNormal() {
699 $params = array(
700 'contact_id' => $this->individualCreate(),
701 'membership_type_id' => $this->_membershipTypeID,
702 'join_date' => date('Ymd', time()),
703 'start_date' => date('Ymd', time()),
704 'end_date' => date('Ymd', strtotime('+1 year')),
705 'source' => 'Payment',
706 'is_override' => 1,
707 'status_override_end_date' => date('Ymd', strtotime('-1 day')),
708 'status_id' => $this->_membershipStatusID,
709 );
710 $ids = array();
711 $createdMembership = CRM_Member_BAO_Membership::create($params, $ids);
712
713 CRM_Member_BAO_Membership::updateAllMembershipStatus();
714
715 $membershipAfterProcess = civicrm_api3('Membership', 'get', array(
716 'sequential' => 1,
717 'id' => $createdMembership->id,
718 'return' => array('id', 'is_override', 'status_override_end_date'),
719 ))['values'][0];
720
721 $this->assertEquals($createdMembership->id, $membershipAfterProcess['id']);
722 $this->assertArrayNotHasKey('is_override', $membershipAfterProcess);
723 $this->assertArrayNotHasKey('status_override_end_date', $membershipAfterProcess);
724 }
725
726 public function testUpdateAllMembershipStatusHandleOverriddenWithEndOverrideDateEqualTodayAsExpired() {
727 $params = array(
728 'contact_id' => $this->individualCreate(),
729 'membership_type_id' => $this->_membershipTypeID,
730 'join_date' => date('Ymd', time()),
731 'start_date' => date('Ymd', time()),
732 'end_date' => date('Ymd', strtotime('+1 year')),
733 'source' => 'Payment',
734 'is_override' => 1,
735 'status_override_end_date' => date('Ymd', time()),
736 'status_id' => $this->_membershipStatusID,
737 );
738 $ids = array();
739 $createdMembership = CRM_Member_BAO_Membership::create($params, $ids);
740
741 CRM_Member_BAO_Membership::updateAllMembershipStatus();
742
743 $membershipAfterProcess = civicrm_api3('Membership', 'get', array(
744 'sequential' => 1,
745 'id' => $createdMembership->id,
746 'return' => array('id', 'is_override', 'status_override_end_date'),
747 ))['values'][0];
748
749 $this->assertEquals($createdMembership->id, $membershipAfterProcess['id']);
750 $this->assertArrayNotHasKey('is_override', $membershipAfterProcess);
751 $this->assertArrayNotHasKey('status_override_end_date', $membershipAfterProcess);
752 }
753
754 public function testUpdateAllMembershipStatusDoesNotConvertOverridenMembershipWithoutEndOverrideDateToNormal() {
755 $params = array(
756 'contact_id' => $this->individualCreate(),
757 'membership_type_id' => $this->_membershipTypeID,
758 'join_date' => date('Ymd', time()),
759 'start_date' => date('Ymd', time()),
760 'end_date' => date('Ymd', strtotime('+1 year')),
761 'source' => 'Payment',
762 'is_override' => 1,
763 'status_id' => $this->_membershipStatusID,
764 );
765 $ids = array();
766 $createdMembership = CRM_Member_BAO_Membership::create($params, $ids);
767
768 CRM_Member_BAO_Membership::updateAllMembershipStatus();
769
770 $membershipAfterProcess = civicrm_api3('Membership', 'get', array(
771 'sequential' => 1,
772 'id' => $createdMembership->id,
773 'return' => array('id', 'is_override', 'status_override_end_date'),
774 ))['values'][0];
775
776 $this->assertEquals($createdMembership->id, $membershipAfterProcess['id']);
777 $this->assertEquals(1, $membershipAfterProcess['is_override']);
778 }
779
6a488035 780}