diff --git a/dhis-2/dhis-services/dhis-service-program-rule/src/main/java/org/hisp/dhis/programrule/engine/DefaultProgramRuleEntityMapperService.java b/dhis-2/dhis-services/dhis-service-program-rule/src/main/java/org/hisp/dhis/programrule/engine/DefaultProgramRuleEntityMapperService.java index e0a37449ee7d..89f6f10f080f 100644 --- a/dhis-2/dhis-services/dhis-service-program-rule/src/main/java/org/hisp/dhis/programrule/engine/DefaultProgramRuleEntityMapperService.java +++ b/dhis-2/dhis-services/dhis-service-program-rule/src/main/java/org/hisp/dhis/programrule/engine/DefaultProgramRuleEntityMapperService.java @@ -440,6 +440,7 @@ public RuleEvent toMappedRuleEvent(ProgramStageInstance psi) { psi.getProgramStage().getUid(), RuleEvent.Status.valueOf(psi.getStatus().toString()), ObjectUtils.defaultIfNull(psi.getExecutionDate(), psi.getDueDate()), + psi.getCreated(), psi.getDueDate(), orgUnit, orgUnitCode, diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/converter/EventTrackerConverterService.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/converter/EventTrackerConverterService.java index 49a78751ebca..27a4d097e010 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/converter/EventTrackerConverterService.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/converter/EventTrackerConverterService.java @@ -162,6 +162,10 @@ public ProgramStageInstance fromForRuleEngine(TrackerPreheat preheat, Event even ProgramStageInstance psi = from(preheat, event, null); // merge data values from DB psi.getEventDataValues().addAll(getProgramStageInstanceDataValues(preheat, event)); + ProgramStageInstance savedEvent = preheat.getEvent(event.getUid()); + if (savedEvent != null) { + psi.setCreated(savedEvent.getCreated()); + } return psi; } diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/programrule/DefaultProgramRuleService.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/programrule/DefaultProgramRuleService.java index 51b44f26c22a..d401ae7013ae 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/programrule/DefaultProgramRuleService.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/programrule/DefaultProgramRuleService.java @@ -37,9 +37,12 @@ import java.util.stream.Stream; import lombok.RequiredArgsConstructor; import org.apache.commons.collections4.ListUtils; +import org.hisp.dhis.dxf2.events.event.EventQueryParams; +import org.hisp.dhis.dxf2.events.event.EventService; import org.hisp.dhis.program.Program; import org.hisp.dhis.program.ProgramInstance; import org.hisp.dhis.program.ProgramStageInstance; +import org.hisp.dhis.program.ProgramStageInstanceService; import org.hisp.dhis.programrule.engine.ProgramRuleEngine; import org.hisp.dhis.rules.models.RuleEffects; import org.hisp.dhis.trackedentity.TrackedEntityInstance; @@ -77,6 +80,10 @@ class DefaultProgramRuleService implements ProgramRuleService { private final RuleActionEventMapper ruleActionEventMapper; + private final EventService eventService; + + private final ProgramStageInstanceService programStageInstanceService; + @Override @Transactional(readOnly = true) public void calculateRuleEffects(TrackerBundle bundle, TrackerPreheat preheat) { @@ -200,10 +207,13 @@ private List getAttributes( // if they are present in both places private Set getEventsFromEnrollment( String enrollmentUid, TrackerBundle bundle, TrackerPreheat preheat) { + EventQueryParams eventQueryParams = new EventQueryParams(); + eventQueryParams.setProgramInstances(Set.of(enrollmentUid)); + List events = + eventService.getEvents(eventQueryParams).getEvents(); + Stream programStageInstances = - preheat.getEvents().values().stream() - .filter(e -> e.getProgramInstance().getUid().equals(enrollmentUid)) - .filter(e -> bundle.findEventByUid(e.getUid()).isEmpty()); + events.stream().map(e -> programStageInstanceService.getProgramStageInstance(e.getUid())); Stream bundleEvents = bundle.getEvents().stream() diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/bundle/TrackerSideEffectHandlerServiceTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/bundle/TrackerSideEffectHandlerServiceTest.java index 6301ff2d492f..03571da8bd22 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/bundle/TrackerSideEffectHandlerServiceTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/bundle/TrackerSideEffectHandlerServiceTest.java @@ -123,6 +123,8 @@ protected void setUpTest() throws IOException { user.getGroups().add(userGroup); manager.update(user); + injectSecurityContext(user); + templateForEnrollment = createProgramNotification( "enrollment", diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/programrule/ProgramRuleAssignActionTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/programrule/ProgramRuleAssignActionTest.java index 06225a1f6d19..c118700aaf3d 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/programrule/ProgramRuleAssignActionTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/programrule/ProgramRuleAssignActionTest.java @@ -33,13 +33,20 @@ import static org.hisp.dhis.tracker.validation.ValidationCode.E1307; import static org.hisp.dhis.tracker.validation.ValidationCode.E1308; import static org.hisp.dhis.tracker.validation.ValidationCode.E1310; +import static org.hisp.dhis.utils.Assertions.assertContainsOnly; +import static org.hisp.dhis.utils.Assertions.assertIsEmpty; import java.io.IOException; +import java.util.List; +import java.util.stream.Collectors; +import org.hisp.dhis.common.CodeGenerator; import org.hisp.dhis.dataelement.DataElement; import org.hisp.dhis.dxf2.metadata.objectbundle.ObjectBundle; +import org.hisp.dhis.eventdatavalue.EventDataValue; import org.hisp.dhis.preheat.PreheatIdentifier; import org.hisp.dhis.program.Program; import org.hisp.dhis.program.ProgramStage; +import org.hisp.dhis.program.ProgramStageInstance; import org.hisp.dhis.programrule.ProgramRule; import org.hisp.dhis.programrule.ProgramRuleAction; import org.hisp.dhis.programrule.ProgramRuleActionService; @@ -47,6 +54,7 @@ import org.hisp.dhis.programrule.ProgramRuleService; import org.hisp.dhis.programrule.ProgramRuleVariable; import org.hisp.dhis.programrule.ProgramRuleVariableService; +import org.hisp.dhis.programrule.ProgramRuleVariableSourceType; import org.hisp.dhis.setting.SettingKey; import org.hisp.dhis.setting.SystemSettingManager; import org.hisp.dhis.trackedentity.TrackedEntityAttribute; @@ -55,7 +63,11 @@ import org.hisp.dhis.tracker.TrackerImportStrategy; import org.hisp.dhis.tracker.TrackerTest; import org.hisp.dhis.tracker.report.ImportReport; +import org.hisp.dhis.util.DateUtils; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; import org.springframework.beans.factory.annotation.Autowired; class ProgramRuleAssignActionTest extends TrackerTest { @@ -73,6 +85,8 @@ class ProgramRuleAssignActionTest extends TrackerTest { private DataElement dataElement1; + private DataElement dataElement2; + private TrackedEntityAttribute attribute1; @Override @@ -80,8 +94,7 @@ public void initTest() throws IOException { ObjectBundle bundle = setUpMetadata("tracker/simple_metadata.json"); program = bundle.getPreheat().get(PreheatIdentifier.UID, Program.class, "BFcipDERJnf"); dataElement1 = bundle.getPreheat().get(PreheatIdentifier.UID, DataElement.class, "DATAEL00001"); - DataElement dataElement2 = - bundle.getPreheat().get(PreheatIdentifier.UID, DataElement.class, "DATAEL00002"); + dataElement2 = bundle.getPreheat().get(PreheatIdentifier.UID, DataElement.class, "DATAEL00002"); attribute1 = bundle.getPreheat().get(PreheatIdentifier.UID, TrackedEntityAttribute.class, "dIVt4l5vIOa"); TrackedEntityAttribute attribute2 = @@ -93,9 +106,14 @@ public void initTest() throws IOException { programRuleVariableService.addProgramRuleVariable(programRuleVariable); programRuleVariableService.addProgramRuleVariable(programRuleVariableAttribute); + ProgramRuleVariable programRuleVariablePreviousEvent = + createProgramRuleVariableWithDataElement('C', program, dataElement1); + programRuleVariablePreviousEvent.setSourceType( + ProgramRuleVariableSourceType.DATAELEMENT_PREVIOUS_EVENT); + programRuleVariableService.addProgramRuleVariable(programRuleVariablePreviousEvent); + injectAdminUser(); - assignProgramRule(); trackerImportService.importTracker( fromJson("tracker/programrule/tei_enrollment_completed_event.json")); } @@ -103,7 +121,7 @@ public void initTest() throws IOException { @Test void shouldNotImportWithWarningWhenAttributeWithSameValueIsAssignedByAssignRule() throws IOException { - + assignProgramRule(); TrackerImportParams params = fromJson("tracker/programrule/te_enrollment_update_attribute_same_value.json"); params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); @@ -113,9 +131,96 @@ void shouldNotImportWithWarningWhenAttributeWithSameValueIsAssignedByAssignRule( assertHasOnlyWarnings(importReport, E1310); } + @ParameterizedTest + @CsvSource({"2024-02-10,THIRD", "2024-01-28,SECOND", "2024-01-19,FIRST"}) + void shouldImportEventAndCorrectlyAssignPreviousEventDataValue( + String eventOccurredDate, String previousEventDataValue) throws IOException { + TrackerImportParams params = + fromJson("tracker/programrule/three_events_with_different_dates.json"); + params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); + + trackerImportService.importTracker(params); + + assignPreviousEventProgramRule(); + + dbmsManager.clearSession(); + dbmsManager.flushSession(); + + params = fromJson("tracker/programrule/event_with_data_value.json"); + + params.getEvents().get(0).setOccurredAt(DateUtils.instantFromDateAsString(eventOccurredDate)); + + ImportReport importReport = trackerImportService.importTracker(params); + assertHasOnlyWarnings(importReport, E1308); + + ProgramStageInstance event = manager.get(ProgramStageInstance.class, "D9PbzJY8bZZ"); + + List eventDataValues = + event.getEventDataValues().stream() + .filter(dv -> dv.getDataElement().equals("DATAEL00002")) + .map(EventDataValue::getValue) + .collect(Collectors.toList()); + assertContainsOnly(List.of(previousEventDataValue), eventDataValues); + } + + @Test + void + shouldImportEventAndCorrectlyAssignPreviousEventDataValueConsideringCreateAtWhenOccurredAtIsSame() + throws IOException { + String firstEventUid = CodeGenerator.generateUid(); + String secondEventUid = CodeGenerator.generateUid(); + String thirdEventUid = CodeGenerator.generateUid(); + String fourthEventUid = CodeGenerator.generateUid(); + + // Events are imported separately to have different createdAt + TrackerImportParams firstEvent = getEvent(firstEventUid, "2024-01-11", "FIRST"); + trackerImportService.importTracker(firstEvent); + + TrackerImportParams fourthEvent = getEvent(fourthEventUid, "2024-01-26", "FOURTH"); + trackerImportService.importTracker(fourthEvent); + + TrackerImportParams secondEvent = getEvent(secondEventUid, "2024-01-25", "SECOND"); + trackerImportService.importTracker(secondEvent); + + TrackerImportParams thirdEvent = getEvent(thirdEventUid, "2024-01-25", "THIRD"); + trackerImportService.importTracker(thirdEvent); + + assignPreviousEventProgramRule(); + + dbmsManager.clearSession(); + dbmsManager.flushSession(); + + TrackerImportParams trackerImportParams = + TrackerImportParams.builder() + .events( + List.of( + firstEvent.getEvents().get(0), + secondEvent.getEvents().get(0), + thirdEvent.getEvents().get(0), + fourthEvent.getEvents().get(0))) + .build(); + + ImportReport importReport = trackerImportService.importTracker(trackerImportParams); + + List firstEventDataValues = getValueForAssignedDataElement(firstEventUid); + List secondEventDataValues = getValueForAssignedDataElement(secondEventUid); + List thirdEventDataValues = getValueForAssignedDataElement(thirdEventUid); + List fourthEventDataValues = getValueForAssignedDataElement(fourthEventUid); + + Assertions.assertAll( + () -> assertHasOnlyWarnings(importReport, E1308, E1308, E1308, E1308), + () -> assertIsEmpty(firstEventDataValues), + () -> assertContainsOnly(List.of("FIRST"), secondEventDataValues), + () -> assertContainsOnly(List.of("SECOND"), thirdEventDataValues), + () -> assertContainsOnly(List.of("THIRD"), fourthEventDataValues)); + } + @Test void shouldImportWithWarningWhenDataElementWithSameValueIsAssignedByAssignRule() throws IOException { + assignProgramRule(); + dbmsManager.clearSession(); + dbmsManager.flushSession(); TrackerImportParams params = fromJson("tracker/programrule/event_update_datavalue_same_value.json"); params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); @@ -127,6 +232,7 @@ void shouldImportWithWarningWhenDataElementWithSameValueIsAssignedByAssignRule() @Test void shouldNotImportWhenDataElementWithDifferentValueIsAssignedByAssignRule() throws IOException { + assignProgramRule(); TrackerImportParams params = fromJson("tracker/programrule/event_update_datavalue_different_value.json"); params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); @@ -140,6 +246,7 @@ void shouldNotImportWhenDataElementWithDifferentValueIsAssignedByAssignRule() th void shouldImportWithWarningWhenDataElementWithDifferentValueIsAssignedByAssignRuleAndOverwriteKeyIsTrue() throws IOException { + assignProgramRule(); systemSettingManager.saveSystemSetting(SettingKey.RULE_ENGINE_ASSIGN_OVERWRITE, true); TrackerImportParams params = fromJson("tracker/programrule/event_update_datavalue_different_value.json"); @@ -154,7 +261,10 @@ void shouldNotImportWhenDataElementWithDifferentValueIsAssignedByAssignRule() th void shouldImportWithWarningWhenDataElementWithDifferentAndEmptyValueIsAssignedByAssignRuleAndOverwriteKeyIsTrue() throws IOException { + assignProgramRule(); systemSettingManager.saveSystemSetting(SettingKey.RULE_ENGINE_ASSIGN_OVERWRITE, true); + dbmsManager.clearSession(); + dbmsManager.flushSession(); TrackerImportParams params = fromJson("tracker/programrule/event_update_datavalue_empty_value.json"); params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); @@ -164,6 +274,27 @@ void shouldNotImportWhenDataElementWithDifferentValueIsAssignedByAssignRule() th assertHasOnlyWarnings(importReport, E1308); } + private TrackerImportParams getEvent(String eventUid, String occurredDate, String value) + throws IOException { + TrackerImportParams trackerImportParams = + fromJson("tracker/programrule/event_without_date.json"); + trackerImportParams + .getEvents() + .get(0) + .setOccurredAt(DateUtils.instantFromDateAsString(occurredDate)); + trackerImportParams.getEvents().get(0).setEvent(eventUid); + trackerImportParams.getEvents().get(0).getDataValues().iterator().next().setValue(value); + + return trackerImportParams; + } + + private List getValueForAssignedDataElement(String eventUid) { + return manager.get(ProgramStageInstance.class, eventUid).getEventDataValues().stream() + .filter(dv -> dv.getDataElement().equals("DATAEL00002")) + .map(EventDataValue::getValue) + .collect(Collectors.toList()); + } + private void assignProgramRule() { ProgramRule programRule = createProgramRule('F', program, null, "true"); programRuleService.addProgramRule(programRule); @@ -178,6 +309,16 @@ private void assignProgramRule() { programRuleService.updateProgramRule(programRule); } + private void assignPreviousEventProgramRule() { + ProgramRule programRule = createProgramRule('G', program, null, "true"); + programRuleService.addProgramRule(programRule); + ProgramRuleAction programRuleAction = + createProgramRuleAction(programRule, ASSIGN, dataElement2, "#{ProgramRuleVariableC}"); + programRuleActionService.addProgramRuleAction(programRuleAction); + programRule.getProgramRuleActions().add(programRuleAction); + programRuleService.updateProgramRule(programRule); + } + private ProgramRule createProgramRule( char uniqueCharacter, Program program, ProgramStage programStage, String condition) { ProgramRule programRule = createProgramRule(uniqueCharacter, program); diff --git a/dhis-2/dhis-test-integration/src/test/resources/tracker/programrule/event_update_datavalue_same_value.json b/dhis-2/dhis-test-integration/src/test/resources/tracker/programrule/event_update_datavalue_same_value.json index 05e4b4822ea2..7d18f6552254 100644 --- a/dhis-2/dhis-test-integration/src/test/resources/tracker/programrule/event_update_datavalue_same_value.json +++ b/dhis-2/dhis-test-integration/src/test/resources/tracker/programrule/event_update_datavalue_same_value.json @@ -34,7 +34,7 @@ "enrollments": [], "events": [ { - "event": "D9PbzJY8bJO", + "event": "D9PbzJY8bJX", "status": "COMPLETED", "program": { "idScheme": "UID", diff --git a/dhis-2/dhis-test-integration/src/test/resources/tracker/programrule/event_with_data_value.json b/dhis-2/dhis-test-integration/src/test/resources/tracker/programrule/event_with_data_value.json new file mode 100644 index 000000000000..3c41ce0ed0c4 --- /dev/null +++ b/dhis-2/dhis-test-integration/src/test/resources/tracker/programrule/event_with_data_value.json @@ -0,0 +1,45 @@ +{ + "trackedEntities": [], + "enrollments": [], + "events": [ + { + "event": "D9PbzJY8bZZ", + "status": "COMPLETED", + "program": { + "idScheme": "UID", + "identifier": "BFcipDERJnf" + }, + "programStage": { + "idScheme": "UID", + "identifier": "NpsdDv6kKSO" + }, + "enrollment": "TvctPPhpD8u", + "orgUnit": { + "idScheme": "UID", + "identifier": "h4w96yEMlzO" + }, + "relationships": [], + "scheduledAt": "2019-01-25T12:10:38.100", + "storedBy": "admin", + "deleted": false, + "attributeOptionCombo": { + "idScheme": "UID" + }, + "attributeCategoryOptions": [], + + "dataValues": [ + { + "storedBy": "admin", + "providedElsewhere": false, + "dataElement": { + "idScheme": "UID", + "identifier": "DATAEL00001" + }, + "value": "LAST" + } + ], + "notes": [] + } + ], + "relationships": [] +} \ No newline at end of file diff --git a/dhis-2/dhis-test-integration/src/test/resources/tracker/programrule/event_without_date.json b/dhis-2/dhis-test-integration/src/test/resources/tracker/programrule/event_without_date.json new file mode 100644 index 000000000000..72ef4ca0d72e --- /dev/null +++ b/dhis-2/dhis-test-integration/src/test/resources/tracker/programrule/event_without_date.json @@ -0,0 +1,43 @@ +{ + "trackedEntities": [], + "enrollments": [], + "events": [ + { + "status": "COMPLETED", + "program": { + "idScheme": "UID", + "identifier": "BFcipDERJnf" + }, + "programStage": { + "idScheme": "UID", + "identifier": "NpsdDv6kKSO" + }, + "enrollment": "TvctPPhpD8u", + "orgUnit": { + "idScheme": "UID", + "identifier": "h4w96yEMlzO" + }, + "relationships": [], + "scheduledAt": "2019-01-25T12:10:38.100", + "storedBy": "admin", + "deleted": false, + "attributeOptionCombo": { + "idScheme": "UID" + }, + "attributeCategoryOptions": [], + + "dataValues": [ + { + "storedBy": "admin", + "providedElsewhere": false, + "dataElement": { + "idScheme": "UID", + "identifier": "DATAEL00001" + } + } + ], + "notes": [] + } + ], + "relationships": [] +} \ No newline at end of file diff --git a/dhis-2/dhis-test-integration/src/test/resources/tracker/programrule/three_events_with_different_dates.json b/dhis-2/dhis-test-integration/src/test/resources/tracker/programrule/three_events_with_different_dates.json new file mode 100644 index 000000000000..a889a716896d --- /dev/null +++ b/dhis-2/dhis-test-integration/src/test/resources/tracker/programrule/three_events_with_different_dates.json @@ -0,0 +1,124 @@ +{ + "trackedEntities": [], + "enrollments": [], + "events": [ + { + "event": "D9PbzJY8bJO", + "status": "COMPLETED", + "program": { + "idScheme": "UID", + "identifier": "BFcipDERJnf" + }, + "programStage": { + "idScheme": "UID", + "identifier": "NpsdDv6kKSO" + }, + "enrollment": "TvctPPhpD8u", + "orgUnit": { + "idScheme": "UID", + "identifier": "h4w96yEMlzO" + }, + "relationships": [], + "occurredAt": "2024-01-11T00:00:00.000", + "scheduledAt": "2019-01-28T12:10:38.100", + "storedBy": "admin", + "deleted": false, + "attributeOptionCombo": { + "idScheme": "UID" + }, + "attributeCategoryOptions": [], + + "dataValues": [ + { + "storedBy": "admin", + "providedElsewhere": false, + "dataElement": { + "idScheme": "UID", + "identifier": "DATAEL00001" + }, + "value": "FIRST" + } + ], + "notes": [] + }, + { + "event": "D9PbzJY8bFF", + "status": "COMPLETED", + "program": { + "idScheme": "UID", + "identifier": "BFcipDERJnf" + }, + "programStage": { + "idScheme": "UID", + "identifier": "NpsdDv6kKSO" + }, + "enrollment": "TvctPPhpD8u", + "orgUnit": { + "idScheme": "UID", + "identifier": "h4w96yEMlzO" + }, + "relationships": [], + "occurredAt": "2024-01-25T00:00:00.000", + "scheduledAt": "2019-01-28T12:10:38.100", + "storedBy": "admin", + "deleted": false, + "attributeOptionCombo": { + "idScheme": "UID" + }, + "attributeCategoryOptions": [], + + "dataValues": [ + { + "storedBy": "admin", + "providedElsewhere": false, + "dataElement": { + "idScheme": "UID", + "identifier": "DATAEL00001" + }, + "value": "SECOND" + } + ], + "notes": [] + }, + { + "event": "D9PbzJY8bXX", + "status": "COMPLETED", + "program": { + "idScheme": "UID", + "identifier": "BFcipDERJnf" + }, + "programStage": { + "idScheme": "UID", + "identifier": "NpsdDv6kKSO" + }, + "enrollment": "TvctPPhpD8u", + "orgUnit": { + "idScheme": "UID", + "identifier": "h4w96yEMlzO" + }, + "relationships": [], + "occurredAt": "2024-01-30T00:00:00.000", + "scheduledAt": "2019-01-28T12:10:38.100", + "storedBy": "admin", + "deleted": false, + "attributeOptionCombo": { + "idScheme": "UID" + }, + "attributeCategoryOptions": [], + + "dataValues": [ + { + "storedBy": "admin", + "providedElsewhere": false, + "dataElement": { + "idScheme": "UID", + "identifier": "DATAEL00001" + }, + "value": "THIRD" + } + ], + "notes": [] + } + ], + "relationships": [] +} \ No newline at end of file diff --git a/dhis-2/pom.xml b/dhis-2/pom.xml index ea9b1514f793..92029c1dfde8 100644 --- a/dhis-2/pom.xml +++ b/dhis-2/pom.xml @@ -64,7 +64,7 @@ - ${project.basedir}/src/main/java @@ -79,14 +79,14 @@ https://sonarcloud.io -Xmx2024m --illegal-access=permit - false - 2.1.8.0 + 2.1.8.2 1.4.4 @@ -1652,8 +1652,8 @@ ${mockito.version} test - org.mockito @@ -1789,9 +1789,20 @@ false daily - central + central-mirror https://maven-central.storage-download.googleapis.com/maven2/ + + + true + + + false + daily + + central + https://repo1.maven.org/maven2 + never