From 922905de91c158aa9a1c315b709e4bbea124e326 Mon Sep 17 00:00:00 2001 From: Katy Ekey Date: Thu, 9 Jul 2026 20:38:18 -0400 Subject: [PATCH] fix!: Correctly calculate whether grouped stds are uptodate [#OCD-5361] --- .../CertificationResultUpToDateService.java | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/chpl/chpl-service/src/main/java/gov/healthit/chpl/certifiedproduct/service/CertificationResultUpToDateService.java b/chpl/chpl-service/src/main/java/gov/healthit/chpl/certifiedproduct/service/CertificationResultUpToDateService.java index 265ca6daf7..e9d7b438e1 100644 --- a/chpl/chpl-service/src/main/java/gov/healthit/chpl/certifiedproduct/service/CertificationResultUpToDateService.java +++ b/chpl/chpl-service/src/main/java/gov/healthit/chpl/certifiedproduct/service/CertificationResultUpToDateService.java @@ -62,7 +62,7 @@ public boolean isUpToDate(CertificationResult certResult) { private boolean areNonGroupedStandardsUpToDate(List standardsForCriterion, CertificationResult certResult, LocalDate asOfDate) { List baselineStandardsUpToDate = standardsForCriterion.stream() .filter(std -> StringUtils.isEmpty(std.getGroupName())) - .map(std -> areStandardsRequiredAndPresent(Stream.of(std).toList(), certResult, asOfDate)) + .map(std -> areAllStandardsRequiredAndPresent(Stream.of(std).toList(), certResult, asOfDate)) .map(bool -> Boolean.valueOf(bool)) .collect(Collectors.toList()); @@ -82,7 +82,7 @@ private boolean areGroupedStandardsUpToDate(List standardsForCriterion List groupsUpToDate = standardGroupsForCriterion.keySet().stream() .map(groupName -> standardGroupsForCriterion.get(groupName)) - .map(stdList -> areStandardsRequiredAndPresent(stdList, certResult, asOfDate)) + .map(stdList -> isAnyStandardRequiredAndPresent(stdList, certResult, asOfDate)) .map(bool -> Boolean.valueOf(bool)) .collect(Collectors.toList()); @@ -95,7 +95,7 @@ private boolean areGroupedStandardsUpToDate(List standardsForCriterion return true; } - private boolean areStandardsRequiredAndPresent(List standards, CertificationResult certResult, LocalDate asOfDate) { + private boolean areAllStandardsRequiredAndPresent(List standards, CertificationResult certResult, LocalDate asOfDate) { List requiredStandards = standards.stream() .filter(std -> DateUtil.isOnOrBefore(std.getStartDay(), asOfDate) && (std.getRequiredDay() != null && std.getRequiredDay().isBefore(asOfDate)) @@ -111,6 +111,21 @@ private boolean areStandardsRequiredAndPresent(List standards, Certifi return true; } + private boolean isAnyStandardRequiredAndPresent(List standards, CertificationResult certResult, LocalDate asOfDate) { + List requiredStandards = standards.stream() + .filter(std -> DateUtil.isOnOrBefore(std.getStartDay(), asOfDate) + && (std.getRequiredDay() != null && std.getRequiredDay().isBefore(asOfDate)) + && (std.getEndDay() == null || std.getEndDay().isAfter(asOfDate))) + .collect(Collectors.toList()); + if (!CollectionUtils.isEmpty(requiredStandards)) { + return requiredStandards.stream() + .filter(requiredStandard -> isStandardOnCertResult(requiredStandard, certResult)) + .findAny() + .isPresent(); + } + return true; + } + private boolean isStandardOnCertResult(Standard standard, CertificationResult certResult) { return certResult.getStandards().stream() .filter(certResultStd -> standard.getId().equals(certResultStd.getStandard().getId()))