Merge pull request #13578 from mattwire/entityform_view_towards
[civicrm-core.git] / tests / phpunit / CRM / Member / BAO / MembershipTest.php
1 <?php
2 /*
3 +--------------------------------------------------------------------+
4 | CiviCRM version 5 |
5 +--------------------------------------------------------------------+
6 | Copyright CiviCRM LLC (c) 2004-2019 |
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 +--------------------------------------------------------------------+
26 */
27
28 /**
29 * Class CRM_Member_BAO_MembershipTest
30 * @group headless
31 */
32 class CRM_Member_BAO_MembershipTest extends CiviUnitTestCase {
33
34 public function setUp() {
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();
54 $this->_membershipTypeID = $this->membershipTypeCreate(array('member_of_contact_id' => $this->_contactID));
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.
62 */
63 public function tearDown() {
64 $this->membershipTypeDelete(array('id' => $this->_membershipTypeID));
65 $this->membershipStatusDelete($this->_membershipStatusID);
66 $this->contactDelete($this->_contactID);
67
68 $this->_contactID = $this->_membershipStatusID = $this->_membershipTypeID = NULL;
69 }
70
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
149 public function testCreate() {
150
151 $contactId = $this->individualCreate();
152
153 $params = array(
154 'contact_id' => $contactId,
155 'membership_type_id' => $this->_membershipTypeID,
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')),
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,
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')),
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);
195 $this->contactDelete($contactId);
196 }
197
198 public function testGetValues() {
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
206 $contactId = $this->individualCreate();
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);
253 $this->contactDelete($contactId);
254 }
255
256 public function testRetrieve() {
257 $contactId = $this->individualCreate();
258
259 $params = array(
260 'contact_id' => $contactId,
261 'membership_type_id' => $this->_membershipTypeID,
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')),
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);
276 $values = array();
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
284 public function testActiveMembers() {
285 $contactId = $this->individualCreate();
286
287 $params = array(
288 'contact_id' => $contactId,
289 'membership_type_id' => $this->_membershipTypeID,
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')),
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);
305 $values1 = array();
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,
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')),
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);
327 $values2 = array();
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);
341 $this->contactDelete($contactId);
342 }
343
344 public function testDeleteMembership() {
345 $contactId = $this->individualCreate();
346
347 $params = array(
348 'contact_id' => $contactId,
349 'membership_type_id' => $this->_membershipTypeID,
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')),
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 );
363 CRM_Member_BAO_Membership::del($membershipId);
364
365 $this->assertDBNull('CRM_Member_BAO_Membership', $contactId, 'id',
366 'contact_id', 'Database check for deleted membership.'
367 );
368 $this->contactDelete($contactId);
369 }
370
371 public function testGetContactMembership() {
372 $contactId = $this->individualCreate();
373
374 $params = array(
375 'contact_id' => $contactId,
376 'membership_type_id' => $this->_membershipTypeID,
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')),
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);
396 $this->contactDelete($contactId);
397 }
398
399
400 /**
401 * Get the contribution.
402 * page id from the membership record
403 */
404 public function testgetContributionPageId() {
405 $contactId = $this->individualCreate();
406
407 $params = array(
408 'contact_id' => $contactId,
409 'membership_type_id' => $this->_membershipTypeID,
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')),
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
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);
426 $this->contactDelete($contactId);
427 }
428
429 /**
430 * Get membership joins/renewals
431 * for a specified membership
432 * type.
433 */
434 public function testgetMembershipStarts() {
435 $contactId = $this->individualCreate();
436
437 $params = array(
438 'contact_id' => $contactId,
439 'membership_type_id' => $this->_membershipTypeID,
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')),
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);
458 $this->contactDelete($contactId);
459 }
460
461 /**
462 * Get a count of membership for a specified membership type,
463 * optionally for a specified date.
464 */
465 public function testGetMembershipCount() {
466 $contactId = $this->individualCreate();
467
468 $params = array(
469 'contact_id' => $contactId,
470 'membership_type_id' => $this->_membershipTypeID,
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')),
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);
489 $this->contactDelete($contactId);
490 }
491
492
493 /**
494 * Checkup sort name function.
495 */
496 public function testSortName() {
497 $contactId = $this->individualCreate();
498
499 $params = array(
500 'contact_id' => $contactId,
501 'membership_type_id' => $this->_membershipTypeID,
502 'join_date' => '2006-01-21',
503 'start_date' => '2006-01-21',
504 'end_date' => '2006-12-21',
505 'source' => 'Payment',
506 'is_override' => 1,
507 'status_id' => $this->_membershipStatusID,
508 );
509
510 $membership = $this->callAPISuccess('Membership', 'create', $params);
511
512 $this->assertEquals('Anderson, Anthony', CRM_Member_BAO_Membership::sortName($membership['id']));
513
514 $this->membershipDelete($membership['id']);
515 $this->contactDelete($contactId);
516 }
517
518 /**
519 * Delete related memberships.
520 */
521 public function testdeleteRelatedMemberships() {
522 $contactId = $this->individualCreate();
523
524 $params = array(
525 'contact_id' => $contactId,
526 'membership_type_id' => $this->_membershipTypeID,
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')),
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);
545 $this->contactDelete($contactId);
546 }
547
548 /**
549 * Renew membership with change in membership type.
550 */
551 public function testRenewMembership() {
552 $contactId = $this->individualCreate();
553 $joinDate = $startDate = date("Ymd", strtotime(date("Ymd") . " -6 month"));
554 $endDate = date("Ymd", strtotime($joinDate . " +1 year -1 day"));
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 );
565 $ids = array();
566 $membership = CRM_Member_BAO_Membership::create($params, $ids);
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
583 $isTestMembership = 0;
584 list($MembershipRenew) = CRM_Member_BAO_Membership::processMembership(
585 $contactId,
586 $this->_membershipTypeID,
587 $isTestMembership,
588 NULL,
589 NULL,
590 NULL,
591 1,
592 FALSE,
593 NULL,
594 NULL,
595 FALSE,
596 NULL,
597 NULL
598 );
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 );
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');
609
610 $this->membershipDelete($membershipId);
611 $this->contactDelete($contactId);
612 }
613
614 /**
615 * Renew stale membership.
616 */
617 public function testStaleMembership() {
618 $statusId = 3;
619 $contactId = $this->individualCreate();
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(
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
669 $membershipRenewal = new CRM_Core_Form();
670 $membershipRenewal->controller = new CRM_Core_Controller();
671 list($MembershipRenew) = CRM_Member_BAO_Membership::processMembership(
672 $contactId,
673 $this->_membershipTypeID,
674 FALSE,
675 $membershipRenewal,
676 NULL,
677 NULL,
678 NULL,
679 1,
680 NULL,
681 NULL,
682 NULL,
683 FALSE,
684 NULL
685 );
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);
695 $this->contactDelete($contactId);
696 }
697
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
780 }