DefaultMedicationsBo implements MedicationsBo, MedicationFromEhrConverter.MedicationDataProvider { boolean areTherapiesSimilar( final Pair<MedicationOrderComposition, MedicationInstructionInstruction> instructionPair, final Pair<MedicationOrderComposition, MedicationInstructionInstruction> compareInstructionPair, final Map<Long, MedicationDataForTherapyDto> medicationsMap, final boolean canOverlap) { final OrderActivity orderActivity = MedicationsEhrUtils.getRepresentingOrderActivity(instructionPair.getSecond()); final OrderActivity compareOrderActivity = MedicationsEhrUtils.getRepresentingOrderActivity(compareInstructionPair.getSecond()); final boolean simpleTherapy = MedicationsEhrUtils.isSimpleTherapy(orderActivity); final Interval therapyInterval = MedicationsEhrUtils.getInstructionInterval(orderActivity.getMedicationTiming()); final Interval therapyOrderInterval = MedicationsEhrUtils.getInstructionInterval(compareOrderActivity.getMedicationTiming()); if (canOverlap || !therapyInterval.overlaps(therapyOrderInterval)) { final boolean compareTherapyIsSimple = MedicationsEhrUtils.isSimpleTherapy(compareOrderActivity); if (simpleTherapy && compareTherapyIsSimple) { final boolean similarSimpleTherapy = isSimilarSimpleTherapy(orderActivity, compareOrderActivity, medicationsMap); if (similarSimpleTherapy) { return true; } } if (!simpleTherapy && !compareTherapyIsSimple) { final boolean similarComplexTherapy = isSimilarComplexTherapy(orderActivity, compareOrderActivity, medicationsMap); if (similarComplexTherapy) { return true; } } } return false; }  @Autowired void setMedicationsOpenEhrDao(final MedicationsOpenEhrDao medicationsOpenEhrDao); @Autowired void setMedicationsDao(final MedicationsDao medicationsDao); @Autowired void setTaggingOpenEhrDao(final TaggingOpenEhrDao taggingOpenEhrDao); @Autowired void setTherapyDisplayProvider(final TherapyDisplayProvider therapyDisplayProvider); @Autowired void setMedicationsValueHolder(final ValueHolder<Map<Long, MedicationHolderDto>> medicationsValueHolder); @Autowired void setMedicationRoutesValueHolder(final ValueHolder<Map<Long, MedicationRouteDto>> medicationRoutesValueHolder); @Autowired void setMedicationHolderDtoMapper(final MedicationHolderDtoMapper medicationHolderDtoMapper); @Autowired void setMedicationsTasksProvider(final MedicationsTasksProvider medicationsTasksProvider); @Autowired void setMedicationOnAdmissionHandler(final MedicationOnAdmissionHandler medicationOnAdmissionHandler); @Autowired void setAdministrationProvider(final AdministrationProvider administrationProvider); @Override Map<Long, MedicationDataForTherapyDto> getMedicationDataForTherapies(
      final List<Pair<MedicationOrderComposition, MedicationInstructionInstruction>> instructionsList,
      @Nullable final String careProviderId); @Override boolean isTherapyModifiedFromLastReview(
      @Nonnull final MedicationInstructionInstruction instruction,
      @Nonnull final List<MedicationActionAction> actionsList,
      @Nonnull final DateTime compositionCreatedTime); @Override int getTherapyConsecutiveDay(
      final DateTime therapyStart,
      final DateTime therapyDay,
      final DateTime currentTime,
      final Integer pastDaysOfTherapy); @Override DateTime getOriginalTherapyStart(
      @Nonnull final String patientId,
      @Nonnull final MedicationOrderComposition composition); @Override Pair<MedicationOrderComposition, MedicationInstructionInstruction> getInstructionFromLink(
      @Nonnull final String patientId,
      @Nonnull final MedicationInstructionInstruction instruction,
      @Nonnull final EhrLinkType linkType,
      final boolean getLatestVersion); @Override Pair<MedicationOrderComposition, MedicationInstructionInstruction> getInstructionFromLink(
      final String patientId,
      final Link link,
      final boolean getLatestVersion); @Override boolean isTherapySuspended(final List<MedicationActionAction> actionsList); @Override void sortTherapyTemplates(final TherapyTemplatesDto templates); @Override int compareTherapiesForSort(final TherapyDto firstTherapy, final TherapyDto secondTherapy, final Collator collator); @Override boolean areInstructionsLinkedByUpdate(
      final Pair<MedicationOrderComposition, MedicationInstructionInstruction> instructionPair,
      final Pair<MedicationOrderComposition, MedicationInstructionInstruction> compareInstructionPair); @Override boolean doesInstructionHaveLinkToCompareInstruction(
      final MedicationInstructionInstruction instruction,
      final Pair<MedicationOrderComposition, MedicationInstructionInstruction> compareInstructionPair,
      final EhrLinkType linkType); @Override List<Long> getMedicationIds(final OrderActivity orderActivity); @Override List<Long> getMedicationIds(final MedicationActionAction medicationAction); @Override Long getMainMedicationId(final OrderActivity orderActivity); @Override boolean isMentalHealthMedication(final long medicationId); @Override boolean isTherapyActive(
      final List<String> daysOfWeek,
      final Integer dosingDaysFrequency,
      final Interval therapyInterval,
      final DateTime when); @Override boolean isTherapySuspended(final MedicationOrderComposition composition, final MedicationInstructionInstruction instruction); @Override TherapyChangeReasonDto getTherapySuspendReason(
      @Nonnull final MedicationOrderComposition composition,
      @Nonnull final MedicationInstructionInstruction instruction); @Override boolean isTherapyCancelledOrAborted(
      final MedicationOrderComposition composition, final MedicationInstructionInstruction instruction); @Override boolean isMedicationTherapyCompleted(
      final MedicationOrderComposition composition,
      final MedicationInstructionInstruction instruction); @Override MedicationActionAction getInstructionAction(
      final MedicationOrderComposition composition,
      final MedicationInstructionInstruction instruction,
      final MedicationActionEnum searchActionEnum,
      @Nullable final Interval searchInterval); @Override String getTherapyFormattedDisplay(
      final String patientId, final String therapyId, final DateTime when, final Locale locale); @Override TherapyDto getTherapy(
      final String patientId, final String compositionId, final String ehrOrderName, final DateTime when, final Locale locale); @Override TherapyDto convertInstructionToTherapyDto(
      @Nonnull final IspekComposition composition,
      @Nonnull final MedicationInstructionInstruction instruction,
      final DateTime currentTime); @Override TherapyDto convertInstructionToTherapyDtoWithDisplayValues(
      @Nonnull final IspekComposition composition,
      @Nonnull final MedicationInstructionInstruction instruction,
      final Double referenceWeight,
      final Double patientHeight,
      final DateTime currentTime,
      final boolean isToday,
      final Locale locale); @Override void fillDisplayValues(
      @Nonnull final TherapyDto therapy,
      final Double referenceWeight,
      final Double patientHeight,
      final boolean isToday,
      final Locale locale); @Override void fillInfusionFormulaFromRate(
      final ComplexTherapyDto therapy,
      final Double referenceWeight,
      final Double patientHeight); @Override void fillInfusionRateFromFormula(
      final ComplexTherapyDto therapy, final Double referenceWeight, final Double patientHeight); @Override double calculateBodySurfaceArea(final double heightInCm, final double weightInKg); @Override List<MedicationForWarningsSearchDto> getTherapiesForWarningsSearch(final String patientId, final DateTime when); @Override List<TherapyDto> getTherapies(
      final String patientId,
      final String centralCaseId,
      final Double referenceWeight,
      @Nullable final Locale locale,
      final DateTime when); @Override List<TherapyDto> getTherapies(
      final String patientId,
      final Interval searchInterval,
      final Double referenceWeight,
      final Double patientHeight,
      @Nullable final Locale locale,
      final DateTime when); @Override List<MedicationOnDischargeGroupDto> getMedicationOnDischargeGroups(
      final String patientId,
      final DateTime lastHospitalizationStart,
      @Nullable final Interval searchInterval,
      final Double referenceWeight,
      final Double patientHeight, // is this @Nullable ?
      @Nullable final Locale locale,
      final DateTime when); @Override List<MentalHealthTherapyDto> getMentalHealthTherapies(
      final String patientId,
      final Interval searchInterval,
      final DateTime when,
      final Locale locale); @Override List<TherapyDto> getLinkTherapyCandidates(
      @Nonnull final String patientId,
      @Nonnull final Double referenceWeight,
      final Double patientHeight,
      @Nonnull final DateTime when,
      @Nonnull final Locale locale); @Override List<TherapySurgeryReportElementDto> getTherapySurgeryReportElements(
      @Nonnull final String patientId,
      final Double patientHeight,
      @Nonnull final DateTime searchStart,
      @Nonnull final RoundsIntervalDto roundsIntervalDto,
      @Nonnull final Locale locale,
      @Nonnull final DateTime when); @Override List<MedicationForWarningsSearchDto> extractWarningsSearchDtos(
      @Nonnull final List<MedicationOrderComposition> compositions); @Override MedicationDto getMedication(final Long medicationId); @Override DoseFormDto getDoseForm(final String doseFormCode, final DateTime when); @Override DoseFormDto getMedicationDoseForm(final long medicationId); @Override MedicationRouteDto getMedicationRoute(final long routeId); @Override String getOriginalTherapyId(final String patientId, final String compositionUid); @Override String getOriginalTherapyId(@Nonnull final MedicationOrderComposition composition); @Override MedicationReferenceWeightComposition buildReferenceWeightComposition(
      final double weight,
      final DateTime when); @Override void sortTherapiesByMedicationTimingStart(
      final List<Pair<MedicationOrderComposition, MedicationInstructionInstruction>> therapies, final boolean descending); @Override void deleteAdministration(final String patientId, final String compositionId, final String comment); @Override DocumentationTherapiesDto findTherapyGroupsForDocumentation(
      final String patientId,
      final String centralCaseId,
      final Interval centralCaseEffective,
      final List<Pair<MedicationOrderComposition, MedicationInstructionInstruction>> instructionPairs,
      final boolean isOutpatient,
      final DateTime when,
      final Locale locale); @Override @Transactional @ServiceMethod(auditing = @Auditing(level = Level.FULL)) DateTime findPreviousTaskForTherapy(
      final String patientId,
      final String compositionUid,
      final String ehrOrderName,
      final DateTime when);  }
@Test public void testAreInstructionsSimilarSimple() { final MedicationOrderComposition composition = MedicationsTestUtils.buildTestMedicationOrderComposition("uid1::1", new DateTime(2013, 11, 11, 0, 0, 0), null); final MedicationInstructionInstruction instruction = MedicationsTestUtils.buildTestMedicationInstruction("MedicationInstructionInstruction 1"); composition.getMedicationDetail().getMedicationInstruction().add(instruction); final OrderActivity orderActivity = MedicationsTestUtils.buildTestOrderActivity( "Lekadol", 1L, 500.0, "mg", null, null, null, null, 1L, "ORAL", "1", "TBL"); instruction.getOrder().add(orderActivity); final MedicationTimingCluster medicationTiming = MedicationsTestUtils.buildMedicationTimingCluster( 2L, null, null, null, new DateTime(2013, 11, 11, 0, 0, 0), null, null); orderActivity.setMedicationTiming(medicationTiming); final MedicationOrderComposition compareComposition = MedicationsTestUtils.buildTestMedicationOrderComposition("uid2::1", new DateTime(2013, 10, 10, 0, 0, 0), null); final MedicationInstructionInstruction compareInstruction = MedicationsTestUtils.buildTestMedicationInstruction("MedicationInstructionInstruction 1"); compareComposition.getMedicationDetail().getMedicationInstruction().add(compareInstruction); final OrderActivity compareOrderActivity = MedicationsTestUtils.buildTestOrderActivity( "Daleron", 2L, 500.0, "mg", null, null, null, null, 1L, "ORAL", "1", "TBL"); compareInstruction.getOrder().add(compareOrderActivity); final MedicationTimingCluster compareMedicationTiming = MedicationsTestUtils.buildMedicationTimingCluster( 2L, null, null, null, new DateTime(2013, 10, 10, 0, 0, 0), new DateTime(2013, 11, 11, 0, 0, 0), null); compareOrderActivity.setMedicationTiming(compareMedicationTiming); final Map<Long, MedicationDataForTherapyDto> medicationsMap = new HashMap<>(); final MedicationDataForTherapyDto medicationData1 = new MedicationDataForTherapyDto(); medicationData1.setGenericName("Paracetamol"); medicationData1.setCustomGroupName("Group 1"); medicationData1.setAtcGroupCode("ATC 1"); medicationsMap.put(1L, medicationData1); final MedicationDataForTherapyDto medicationData2 = new MedicationDataForTherapyDto(); medicationData2.setGenericName("Paracetamol"); medicationData2.setCustomGroupName("Group 1"); medicationData2.setAtcGroupCode("ATC 1"); medicationsMap.put(2L, medicationData2); assertTrue( medicationsBo.areTherapiesSimilar( Pair.of(composition, instruction), Pair.of(compareComposition, compareInstruction), medicationsMap, false) ); }
@Test public void testAreInstructionsSimilarComplex() { final MedicationOrderComposition composition = MedicationsTestUtils.buildTestMedicationOrderComposition("uid1::1", new DateTime(2013, 11, 11, 0, 0, 0), null); final MedicationInstructionInstruction instruction = MedicationsTestUtils.buildTestMedicationInstruction("MedicationInstructionInstruction 1"); composition.getMedicationDetail().getMedicationInstruction().add(instruction); final OrderActivity orderActivity = MedicationsTestUtils.buildTestOrderActivity( null, null, 500.0, "mL", null, null, null, null, 2L, "IV", null, null); instruction.getOrder().add(orderActivity); final MedicationTimingCluster medicationTiming = MedicationsTestUtils.buildMedicationTimingCluster( 2L, null, null, null, new DateTime(2013, 11, 11, 0, 0, 0), null, null); orderActivity.setMedicationTiming(medicationTiming); final IngredientsAndFormCluster ingredientsAndForm = new IngredientsAndFormCluster(); orderActivity.setIngredientsAndForm(ingredientsAndForm); final IngredientCluster ingredient1 = MedicationsTestUtils.buildTestActiveIngredient("Dopamin1", "1", null, null, 10.0, "mg", 500.0, "mL"); ingredientsAndForm.getIngredient().add(ingredient1); final MedicationOrderComposition compareComposition = MedicationsTestUtils.buildTestMedicationOrderComposition("uid2::1", new DateTime(2013, 10, 10, 0, 0, 0), null); final MedicationInstructionInstruction compareInstruction = MedicationsTestUtils.buildTestMedicationInstruction("MedicationInstructionInstruction 1"); compareComposition.getMedicationDetail().getMedicationInstruction().add(compareInstruction); final OrderActivity compareOrderActivity = MedicationsTestUtils.buildTestOrderActivity( null, null, 1000.0, "mL", null, null, null, null, 2L, "IV", null, null); compareInstruction.getOrder().add(compareOrderActivity); final MedicationTimingCluster compareMedicationTiming = MedicationsTestUtils.buildMedicationTimingCluster( 2L, null, null, null, new DateTime(2013, 10, 10, 0, 0, 0), new DateTime(2013, 11, 11, 0, 0, 0), null); compareOrderActivity.setMedicationTiming(compareMedicationTiming); final IngredientsAndFormCluster compareIngredientsAndForm = new IngredientsAndFormCluster(); compareOrderActivity.setIngredientsAndForm(compareIngredientsAndForm); final IngredientCluster compareIngredient1 = MedicationsTestUtils.buildTestActiveIngredient("Dopamin2", "1", null, null, 10.0, "mg", 1000.0, "mL"); compareIngredientsAndForm.getIngredient().add(compareIngredient1); final Map<Long, MedicationDataForTherapyDto> medicationsMap = new HashMap<>(); final MedicationDataForTherapyDto medicationData1 = new MedicationDataForTherapyDto(); medicationData1.setGenericName("Dopamin"); medicationData1.setCustomGroupName("Group 1"); medicationData1.setAtcGroupCode("ATC 1"); medicationsMap.put(1L, medicationData1); final MedicationDataForTherapyDto medicationData2 = new MedicationDataForTherapyDto(); medicationData2.setGenericName("Dopamin"); medicationData2.setCustomGroupName("Group 1"); medicationData2.setAtcGroupCode("ATC 1"); medicationsMap.put(2L, medicationData2); assertTrue( medicationsBo.areTherapiesSimilar( Pair.of(composition, instruction), Pair.of(compareComposition, compareInstruction), medicationsMap, false) ); }