From 799c09613ad22c40d9a9dfe37fbde8af642f76c1 Mon Sep 17 00:00:00 2001 From: shahrukh-moby Date: Mon, 6 Nov 2023 11:51:52 +0500 Subject: [PATCH] MMB-272: Add validity dates check for certificate download --- .../Service/CertificateAccessChecker.php | 35 ++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/CRM/Certificate/Service/CertificateAccessChecker.php b/CRM/Certificate/Service/CertificateAccessChecker.php index b73c99c..e2d0596 100644 --- a/CRM/Certificate/Service/CertificateAccessChecker.php +++ b/CRM/Certificate/Service/CertificateAccessChecker.php @@ -1,6 +1,7 @@ hasViewPermission() || $this->hasViewPermissionByRelationship(); + return $this->checkMembershipDates() && ($this->hasViewPermission() || $this->hasViewPermissionByRelationship()); } /** @@ -80,4 +81,36 @@ private function hasViewPermissionByRelationship() { return FALSE; } + private function checkMembershipDates(): bool { + $membershipDates = $this->getMembershipDates(); + $membershipStartDate = $membershipDates['start_date']; + $membershipEndDate = $membershipDates['end_date']; + $certificateStartDate = $this->certificate->min_valid_from_date ?? $membershipEndDate; + $certificateEndDate = $this->certificate->max_valid_through_date ?? $membershipStartDate; + + return !empty($membershipStartDate) && !empty($membershipEndDate) && strtotime($membershipStartDate) <= strtotime($certificateEndDate) && + strtotime($membershipEndDate) >= strtotime($certificateStartDate); + } + + private function getMembershipDates(): array { + $startDate = NULL; + $endDate = NULL; + + $memberships = Membership::get(FALSE) + ->addSelect('start_date', 'end_date') + ->addWhere('contact_id', '=', $this->contactId) + ->addWhere('status_id', '=', 2) + ->execute() + ->getArrayCopy(); + + foreach ($memberships as $membership) { + $startDate = $startDate === NULL || strtotime($membership['start_date']) < strtotime($startDate) ? + $membership['start_date'] : $startDate; + $endDate = $endDate === NULL || strtotime($membership['end_date']) > strtotime($endDate) ? + $membership['end_date'] : $endDate; + } + + return ['start_date' => $startDate, 'end_date' => $endDate]; + } + }