From 04bc93fa4b36bb86b235eb0c4c0964f4b6dab197 Mon Sep 17 00:00:00 2001 From: demeritcowboy Date: Mon, 3 Aug 2020 13:51:40 -0400 Subject: [PATCH] simplification and add more test --- CRM/Member/BAO/MembershipStatus.php | 38 +-- .../CRM/Member/BAO/MembershipStatusTest.php | 247 ++++++++++++++++++ 2 files changed, 267 insertions(+), 18 deletions(-) diff --git a/CRM/Member/BAO/MembershipStatus.php b/CRM/Member/BAO/MembershipStatus.php index fdd17ff082..ce772ea08c 100644 --- a/CRM/Member/BAO/MembershipStatus.php +++ b/CRM/Member/BAO/MembershipStatus.php @@ -197,38 +197,40 @@ class CRM_Member_BAO_MembershipStatus extends CRM_Member_DAO_MembershipStatus { /** * Find the membership status based on start date, end date, join date & status date. * + * Loop through all the membership status definitions, ordered by their + * weight. For each, we loop through all possible variations of the given + * start, end, and join dates and adjust the starts and ends based on that + * membership status's rules, where the last computed set of adjusted start + * and end becomes a candidate. Then we compare that candidate to either + * "today" or some other given date, and if it falls between the adjusted + * start and end we have a match and we stop looping through status + * definitions. Then we call a hook in case that wasn't enough loops. + * * @param string $startDate * Start date of the member whose membership status is to be calculated. * @param string $endDate * End date of the member whose membership status is to be calculated. * @param string $joinDate * Join date of the member whose membership status is to be calculated. - * @param \date|string $statusDate status date of the member whose membership status is to be calculated. - * @param bool $excludeIsAdmin the statuses those having is_admin = 1. - * Exclude the statuses those having is_admin = 1. + * @param string $statusDate + * Either the string "today" or a date against which we compare the adjusted start and end based on the status rules. + * @param bool $excludeIsAdmin + * Exclude the statuses having is_admin = 1. * @param int $membershipTypeID + * Not used directly but gets passed to the hook. * @param array $membership - * Membership params as available to calling function - passed to the hook. + * Membership params as available to calling function - not used directly but passed to the hook. * * @return array */ public static function getMembershipStatusByDate( $startDate, $endDate, $joinDate, - $statusDate = 'today', $excludeIsAdmin = FALSE, $membershipTypeID, $membership = [] + $statusDate = 'today', $excludeIsAdmin = FALSE, $membershipTypeID = NULL, $membership = [] ) { $membershipDetails = []; if (!$statusDate || $statusDate == 'today') { - $statusDate = getdate(); - $statusDate = date('Ymd', - mktime($statusDate['hours'], - $statusDate['minutes'], - $statusDate['seconds'], - $statusDate['mon'], - $statusDate['mday'], - $statusDate['year'] - ) - ); + $statusDate = date('Ymd'); } else { $statusDate = CRM_Utils_Date::customFormat($statusDate, '%Y%m%d'); @@ -266,9 +268,6 @@ class CRM_Member_BAO_MembershipStatus extends CRM_Member_DAO_MembershipStatus { $endEvent = NULL; foreach ($events as $eve) { foreach ($dates as $dat) { - $month = date('m', strtotime(${$dat . 'Date'})); - $day = date('d', strtotime(${$dat . 'Date'})); - $year = date('Y', strtotime(${$dat . 'Date'})); // calculate start-event/date and end-event/date if (($membershipStatus->{$eve . '_event'} == $dat . '_date') && ${$dat . 'Date'} @@ -276,6 +275,9 @@ class CRM_Member_BAO_MembershipStatus extends CRM_Member_DAO_MembershipStatus { if ($membershipStatus->{$eve . '_event_adjust_unit'} && $membershipStatus->{$eve . '_event_adjust_interval'} ) { + $month = date('m', strtotime(${$dat . 'Date'})); + $day = date('d', strtotime(${$dat . 'Date'})); + $year = date('Y', strtotime(${$dat . 'Date'})); // add in months if ($membershipStatus->{$eve . '_event_adjust_unit'} === 'month') { ${$eve . 'Event'} = date('Ymd', mktime(0, 0, 0, diff --git a/tests/phpunit/CRM/Member/BAO/MembershipStatusTest.php b/tests/phpunit/CRM/Member/BAO/MembershipStatusTest.php index e7c4ef15bf..09bf5353f5 100644 --- a/tests/phpunit/CRM/Member/BAO/MembershipStatusTest.php +++ b/tests/phpunit/CRM/Member/BAO/MembershipStatusTest.php @@ -35,6 +35,8 @@ class CRM_Member_BAO_MembershipStatusTest extends CiviUnitTestCase { 'Database check on updated membership status record.' ); $this->assertEquals($result, 'pending', 'Verify membership status is_active.'); + + $this->callAPISuccess('MembershipStatus', 'Delete', ['id' => $membershipStatus->id]); } public function testRetrieve() { @@ -88,6 +90,8 @@ class CRM_Member_BAO_MembershipStatusTest extends CiviUnitTestCase { 'Database check on updated membership status record.' ); $this->assertEquals($isActive, 0, 'Verify membership status is_active.'); + + $this->callAPISuccess('MembershipStatus', 'Delete', ['id' => $membershipStatus->id]); } public function testGetMembershipStatus() { @@ -99,6 +103,8 @@ class CRM_Member_BAO_MembershipStatusTest extends CiviUnitTestCase { $membershipStatus = CRM_Member_BAO_MembershipStatus::add($params); $result = CRM_Member_BAO_MembershipStatus::getMembershipStatus($membershipStatus->id); $this->assertEquals($result['name'], 'pending', 'Verify membership status name.'); + + $this->callAPISuccess('MembershipStatus', 'Delete', ['id' => $membershipStatus->id]); } public function testDel() { @@ -157,6 +163,7 @@ class CRM_Member_BAO_MembershipStatusTest extends CiviUnitTestCase { 'is_active' => 1, 'is_reserved' => 0, ]); + CRM_Core_DAO::executeQuery("UPDATE civicrm_membership_status SET id=4 WHERE name='Expired'"); } @@ -173,6 +180,244 @@ class CRM_Member_BAO_MembershipStatusTest extends CiviUnitTestCase { $result = CRM_Member_BAO_MembershipStatus::getMembershipStatusByDate($toDate, $toDate, $toDate, 'today', TRUE, NULL, $params); $this->assertEquals($result['name'], 'Current', 'Verify membership status record.'); + + $this->callAPISuccess('MembershipStatus', 'Delete', ['id' => $membershipStatus->id]); + } + + /** + * Test getMembershipStatusByDate more + * + * @dataProvider statusByDateProvider + * + * @param array $input + * @param array $expected + */ + public function testGetMembershipStatusByDateMore($input, $expected) { + // Sanity check we have something close to the stock install. + $this->assertEquals(7, $this->callAPISuccess('MembershipStatus', 'getcount')); + + $this->assertEquals( + $expected, + CRM_Member_BAO_MembershipStatus::getMembershipStatusByDate( + $input['startDate'], + $input['endDate'], + $input['joinDate'], + $input['statusDate'] + ) + ); + } + + /** + * Data provider for testGetMembershipStatusByDateMore + * @return array + */ + public function statusByDateProvider():array { + return [ + [ + [ + 'startDate' => '2020-02-01', + 'endDate' => '2020-04-30', + 'joinDate' => '2020-01-01', + 'statusDate' => '2020-03-01', + ], + [ + 'id' => '1', + 'name' => 'New', + ], + ], + [ + [ + 'startDate' => '2020-02-01', + 'endDate' => '2020-04-30', + 'joinDate' => '2020-01-01', + 'statusDate' => '2020-04-29', + ], + [ + 'id' => '2', + 'name' => 'Current', + ], + ], + [ + [ + 'startDate' => '2020-02-01', + 'endDate' => '2020-04-30', + 'joinDate' => '2020-01-01', + 'statusDate' => '2020-05-01', + ], + [ + 'id' => '3', + 'name' => 'Grace', + ], + ], + [ + [ + 'startDate' => '2020-02-01', + 'endDate' => '2020-04-30', + 'joinDate' => '2020-01-01', + 'statusDate' => '2020-06-01', + ], + [ + 'id' => '4', + 'name' => 'Expired', + ], + ], + [ + [ + 'startDate' => '2020-02-01', + 'endDate' => '2020-04-30', + 'joinDate' => '2019-01-01', + 'statusDate' => '2020-03-01', + ], + [ + 'id' => '2', + 'name' => 'Current', + ], + ], + [ + [ + 'startDate' => '2020-02-01', + 'endDate' => '2020-04-30', + 'joinDate' => '2019-01-01', + 'statusDate' => '2020-04-29', + ], + [ + 'id' => '2', + 'name' => 'Current', + ], + ], + [ + [ + 'startDate' => '2020-02-01', + 'endDate' => '2020-04-30', + 'joinDate' => '2019-01-01', + 'statusDate' => '2020-05-01', + ], + [ + 'id' => '3', + 'name' => 'Grace', + ], + ], + [ + [ + 'startDate' => '2020-02-01', + 'endDate' => '2020-04-30', + 'joinDate' => '2019-01-01', + 'statusDate' => '2020-06-01', + ], + [ + 'id' => '4', + 'name' => 'Expired', + ], + ], + [ + [ + 'startDate' => '2020-02-01', + 'endDate' => '2021-01-31', + 'joinDate' => '2020-01-01', + 'statusDate' => '2020-03-01', + ], + [ + 'id' => '1', + 'name' => 'New', + ], + ], + [ + [ + 'startDate' => '2020-02-01', + 'endDate' => '2021-01-31', + 'joinDate' => '2020-01-01', + 'statusDate' => '2020-04-29', + ], + [ + 'id' => '2', + 'name' => 'Current', + ], + ], + [ + [ + 'startDate' => '2020-02-01', + 'endDate' => '2021-01-31', + 'joinDate' => '2020-01-01', + 'statusDate' => '2020-12-30', + ], + [ + 'id' => '2', + 'name' => 'Current', + ], + ], + [ + [ + 'startDate' => '2020-02-01', + 'endDate' => '2021-01-31', + 'joinDate' => '2020-01-01', + 'statusDate' => '2021-01-01', + ], + [ + 'id' => '2', + 'name' => 'Current', + ], + ], + [ + [ + 'startDate' => '2020-02-01', + 'endDate' => '2021-01-31', + 'joinDate' => '2020-01-01', + 'statusDate' => '2021-01-31', + ], + [ + 'id' => '2', + 'name' => 'Current', + ], + ], + [ + [ + 'startDate' => '2020-02-01', + 'endDate' => '2021-01-31', + 'joinDate' => '2020-01-01', + 'statusDate' => '2021-02-21', + ], + [ + 'id' => '3', + 'name' => 'Grace', + ], + ], + [ + [ + 'startDate' => '2020-02-01', + 'endDate' => '2021-01-31', + 'joinDate' => '2020-01-01', + 'statusDate' => '2021-03-21', + ], + [ + 'id' => '4', + 'name' => 'Expired', + ], + ], + [ + [ + 'startDate' => '2020-02-01', + 'endDate' => '', + 'joinDate' => '2020-01-01', + 'statusDate' => '2020-03-01', + ], + [ + 'id' => '1', + 'name' => 'New', + ], + ], + [ + [ + 'startDate' => '2020-02-01', + 'endDate' => '', + 'joinDate' => '2020-01-01', + 'statusDate' => '2020-06-01', + ], + [ + 'id' => '2', + 'name' => 'Current', + ], + ], + ]; } public function testgetMembershipStatusCurrent() { @@ -186,6 +431,8 @@ class CRM_Member_BAO_MembershipStatusTest extends CiviUnitTestCase { $result = CRM_Member_BAO_MembershipStatus::getMembershipStatusCurrent(); $this->assertEquals(empty($result), FALSE, 'Verify membership status records is_current_member.'); + + $this->callAPISuccess('MembershipStatus', 'Delete', ['id' => $membershipStatus->id]); } } -- 2.25.1