Created
May 8, 2013 21:13
-
-
Save jord98716/5543713 to your computer and use it in GitHub Desktop.
ecb wip
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.bloomhealthco.radiant.enrollment.core.coverage | |
import com.bloomhealthco.radiant.enrollment.core.builders.EventContext | |
/** | |
* Builds an event context from a set of coverage events. EventContext is used to drive what coverage events appear | |
* on an enrollment file. | |
*/ | |
class EventContextBuilder { | |
CoverageSegmentRepository coverageSegmentRepository | |
EventContextBuilder(CoverageSegmentRepository coverageSegmentRepository) { | |
this.coverageSegmentRepository = coverageSegmentRepository | |
} | |
/** | |
* * Builds an event context from a set of coverage events. | |
* | |
* IMPORTANT: This logic is NOT 100% correct but it is duplicating the existing logic that I refactored | |
* into this class. There are cases that we miss using this logic. | |
* | |
* Long term what I think needs to happen is we need to build up a list of exactly what needs to be sent. Right now | |
* we assume that there are exactly 2 purchases with changes but that isn't correct. There could be multiple. | |
* Some of them might not need to be sent at all. | |
* | |
* @param coverageEvents | |
* @return | |
*/ | |
EventContext buildEventContext(List<CoverageEvent> coverageEvents) { | |
List<CoverageEvent> coverageEventsForTransmission = | |
findMostRecentCoverageEventsByPurchaseBloomId(coverageEvents) | |
CoverageEvent currentEvent = coverageEventsForTransmission.find { | |
it.changeType != ChangeType.TERMINATE | |
} | |
currentEvent = currentEvent ?: coverageEventsForTransmission.first() | |
CoverageEvent previousEvent = coverageEventsForTransmission.find { | |
it != currentEvent | |
} | |
return new EventContext( | |
currentCoverageSegment: currentEvent.currentCoverageSegment, | |
previousCoverageSegment: previousEvent?.currentCoverageSegment, | |
currentEvent: currentEvent, | |
previousEvent: previousEvent, | |
lastCoverageSegmentProcessedByFamilyMember: lastCoverageSegmentProcessedByFamilyMember( | |
currentEvent.currentCoverageSegment, previousEvent?.currentCoverageSegment) | |
) | |
} | |
private static List<CoverageEvent> findMostRecentCoverageEventsByPurchaseBloomId( | |
List<CoverageEvent> coverageEvents) { | |
Map<String, List<CoverageEvent>> coverageEventsByPurchase = coverageEvents.groupBy { it.purchaseBloomId } | |
coverageEventsByPurchase.values()*.sort(byTimeOfEventDescending) | |
return coverageEventsByPurchase.values()*.first().sort(byTimeOfEventDescending) | |
} | |
private Map<String, CoverageSegment> lastCoverageSegmentProcessedByFamilyMember(CoverageSegment segment1, | |
CoverageSegment segment2) { | |
return getAllFamilyMemberBloomIdsFromCoverageSegments(segment1, segment2).collectEntries { | |
String familyMemberBloomId -> | |
[familyMemberBloomId, findLatestProcessedOrInitialSegment(familyMemberBloomId)] | |
} | |
} | |
/** | |
* | |
* @param String familyMemberBloomId | |
* @return CoverageSegment | |
* First, find enrollee's latest coverage segment that was on a PROCESSED enrollment file. | |
* If none found, then find their latest coverage segment that is part of a coverage event | |
* with an 'INITIAL' status. These events were imported from bloomhealth to service_etl_enrollment. | |
* They were never sent on an enrollment file in the new system, but we assume they were in old system. | |
*/ | |
private CoverageSegment findLatestProcessedOrInitialSegment(String familyMemberBloomId) { | |
return coverageSegmentRepository.findLatestProcessedCoverageSegmentByFamilyMember(familyMemberBloomId) ?: | |
coverageSegmentRepository.findLatestInitialCoverageSegmentByFamilyMember(familyMemberBloomId) | |
} | |
private static getAllFamilyMemberBloomIdsFromCoverageSegments(CoverageSegment segment1, CoverageSegment segment2) { | |
List<String> previousBloomIds = segment1?.enrollees?.familyMemberBloomId ?: [] | |
List<String> currentBloomIds = segment2?.enrollees?.familyMemberBloomId ?: [] | |
return (previousBloomIds + currentBloomIds).unique() | |
} | |
private static Closure byTimeOfEventDescending = { CoverageEvent a, CoverageEvent b -> | |
b.timeOfEvent <=> a.timeOfEvent | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment