diff --git a/src/main/java/org/hisp/dhis/Dhis2.java b/src/main/java/org/hisp/dhis/Dhis2.java index 6bb9db8a..4c57f570 100644 --- a/src/main/java/org/hisp/dhis/Dhis2.java +++ b/src/main/java/org/hisp/dhis/Dhis2.java @@ -83,6 +83,7 @@ import org.hisp.dhis.model.CategoryOptionGroup; import org.hisp.dhis.model.CategoryOptionGroupSet; import org.hisp.dhis.model.Constant; +import org.hisp.dhis.model.DataApprovalLevel; import org.hisp.dhis.model.DataApprovalWorkflow; import org.hisp.dhis.model.DataElement; import org.hisp.dhis.model.DataElementGroup; @@ -1659,6 +1660,30 @@ public ObjectResponse removeDataElementGroupSet(String id) { return removeMetadataObject(MetadataEntity.DATA_ELEMENT_GROUP_SET, id); } + // ------------------------------------------------------------------------- + // DataApprovalLevel + // ------------------------------------------------------------------------- + + /** + * Retrieves a list of {@link DataApprovalLevel}. + * + * @param query the {@link Query}. + * @return list of {@link DataApprovalLevel}. + */ + public List getDataApprovalLevels(Query query) { + return getMetadataList(MetadataEntity.DATA_APPROVAL_LEVEL, query); + } + + /** + * Retrieves a {@link Metadata} of type {@link DataApprovalLevel}. + * + * @param query the {@link Query}. + * @return a {@link Metadata}. + */ + public Metadata getDataApprovalLevelsPaged(Query query) { + return getMetadata(MetadataEntity.DATA_APPROVAL_LEVEL, query); + } + // ------------------------------------------------------------------------- // DataApprovalWorkflow // ------------------------------------------------------------------------- diff --git a/src/main/java/org/hisp/dhis/api/ApiFields.java b/src/main/java/org/hisp/dhis/api/ApiFields.java index 9f0a6bec..757ccaef 100644 --- a/src/main/java/org/hisp/dhis/api/ApiFields.java +++ b/src/main/java/org/hisp/dhis/api/ApiFields.java @@ -239,6 +239,10 @@ public class ApiFields { "%1$s,organisationUnits[%2$s],workflow[%2$s],indicators[%2$s],sections[%2$s],legendSets[%2$s]", DATA_SET_FIELDS, NAME_FIELDS); + /** Data approval level fields. */ + public static final String DATA_APPROVAL_LEVEL_FIELDS = + String.format("%s,orgUnitLevel", NAME_EXT_FIELDS); + /** Data approval workflow fields. */ public static final String DATA_APPROVAL_WORKFLOW_FIELDS = String.format("%s,periodType,dataSets[%s]", NAME_EXT_FIELDS, NAME_FIELDS); diff --git a/src/main/java/org/hisp/dhis/model/DataApprovalLevel.java b/src/main/java/org/hisp/dhis/model/DataApprovalLevel.java new file mode 100644 index 00000000..30a43c56 --- /dev/null +++ b/src/main/java/org/hisp/dhis/model/DataApprovalLevel.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2004-2025, University of Oslo + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * Neither the name of the HISP project nor the names of its contributors may + * be used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.hisp.dhis.model; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +public class DataApprovalLevel extends NameableObject { + @JsonProperty private int orgUnitLevel; +} diff --git a/src/main/java/org/hisp/dhis/model/Dhis2Objects.java b/src/main/java/org/hisp/dhis/model/Dhis2Objects.java index 5784ed5d..4e52496a 100644 --- a/src/main/java/org/hisp/dhis/model/Dhis2Objects.java +++ b/src/main/java/org/hisp/dhis/model/Dhis2Objects.java @@ -88,6 +88,8 @@ public class Dhis2Objects implements Serializable { @JsonProperty private List dataEntryForms = new ArrayList<>(); + @JsonProperty private List dataApprovalLevels = new ArrayList<>(); + @JsonProperty private List dataApprovalWorkflows = new ArrayList<>(); @JsonProperty private List dataSets = new ArrayList<>(); diff --git a/src/main/java/org/hisp/dhis/model/metadata/MetadataEntity.java b/src/main/java/org/hisp/dhis/model/metadata/MetadataEntity.java index 6fa96a34..762ba2f1 100644 --- a/src/main/java/org/hisp/dhis/model/metadata/MetadataEntity.java +++ b/src/main/java/org/hisp/dhis/model/metadata/MetadataEntity.java @@ -39,6 +39,7 @@ import static org.hisp.dhis.api.ApiFields.CATEGORY_OPTION_GROUP_SET_FIELDS; import static org.hisp.dhis.api.ApiFields.CONSTANT_FIELDS; import static org.hisp.dhis.api.ApiFields.DASHBOARD_FIELDS; +import static org.hisp.dhis.api.ApiFields.DATA_APPROVAL_LEVEL_FIELDS; import static org.hisp.dhis.api.ApiFields.DATA_APPROVAL_WORKFLOW_FIELDS; import static org.hisp.dhis.api.ApiFields.DATA_ELEMENT_EXT_FIELDS; import static org.hisp.dhis.api.ApiFields.DATA_ELEMENT_GROUP_EXT_FIELDS; @@ -96,6 +97,7 @@ import org.hisp.dhis.model.CategoryOptionGroup; import org.hisp.dhis.model.CategoryOptionGroupSet; import org.hisp.dhis.model.Constant; +import org.hisp.dhis.model.DataApprovalLevel; import org.hisp.dhis.model.DataApprovalWorkflow; import org.hisp.dhis.model.DataElement; import org.hisp.dhis.model.DataElementGroup; @@ -201,6 +203,12 @@ public enum MetadataEntity { DASHBOARD_FIELDS, "dashboards", Dhis2Objects::getDashboards), + DATA_APPROVAL_LEVEL( + DataApprovalLevel.class, + DATA_APPROVAL_LEVEL_FIELDS, + DATA_APPROVAL_LEVEL_FIELDS, + "dataApprovalLevels", + Dhis2Objects::getDataApprovalLevels), DATA_APPROVAL_WORKFLOW( DataApprovalWorkflow.class, DATA_APPROVAL_WORKFLOW_FIELDS, @@ -455,6 +463,8 @@ public static MetadataEntity from(T object) { return CATEGORY_OPTION_GROUP_SET; } else if (object instanceof Dashboard) { return DASHBOARD; + } else if (object instanceof DataApprovalLevel) { + return DATA_APPROVAL_LEVEL; } else if (object instanceof DataApprovalWorkflow) { return DATA_APPROVAL_WORKFLOW; } else if (object instanceof DataElement) { diff --git a/src/test/java/org/hisp/dhis/model/DataApprovalLevelTest.java b/src/test/java/org/hisp/dhis/model/DataApprovalLevelTest.java new file mode 100644 index 00000000..cce8a3ec --- /dev/null +++ b/src/test/java/org/hisp/dhis/model/DataApprovalLevelTest.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2004-2025, University of Oslo + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * Neither the name of the HISP project nor the names of its contributors may + * be used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.hisp.dhis.model; + +import static org.hisp.dhis.support.Assertions.assertSize; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +import java.util.List; +import org.hisp.dhis.support.JsonClassPathFile; +import org.hisp.dhis.support.TestTags; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; + +@Tag(TestTags.UNIT) +class DataApprovalLevelTest { + @Test + void testDeserialize() { + List levels = + JsonClassPathFile.fromJson("metadata/data-approval-level.json", Dhis2Objects.class) + .getDataApprovalLevels(); + + assertNotNull(levels); + assertSize(3, levels); + + DataApprovalLevel national = levels.get(0); + assertEquals("b2uHwX9YLhu", national.getId()); + assertEquals("NATIONAL_LEVEL", national.getCode()); + assertEquals("National", national.getName()); + assertEquals(1, national.getOrgUnitLevel()); + + DataApprovalLevel district = levels.get(1); + assertEquals("K7PvhCEjUmY", district.getId()); + assertEquals("DISTRICT_LEVEL", district.getCode()); + assertEquals("District", district.getName()); + assertEquals(2, district.getOrgUnitLevel()); + + DataApprovalLevel facility = levels.get(2); + assertEquals("M3nqHpZwRtL", facility.getId()); + assertEquals("FACILITY_LEVEL", facility.getCode()); + assertEquals("Facility", facility.getName()); + assertEquals(3, facility.getOrgUnitLevel()); + } +} diff --git a/src/test/resources/metadata/data-approval-level.json b/src/test/resources/metadata/data-approval-level.json new file mode 100644 index 00000000..5130c660 --- /dev/null +++ b/src/test/resources/metadata/data-approval-level.json @@ -0,0 +1,22 @@ +{ + "dataApprovalLevels": [ + { + "id": "b2uHwX9YLhu", + "code": "NATIONAL_LEVEL", + "name": "National", + "orgUnitLevel": 1 + }, + { + "id": "K7PvhCEjUmY", + "code": "DISTRICT_LEVEL", + "name": "District", + "orgUnitLevel": 2 + }, + { + "id": "M3nqHpZwRtL", + "code": "FACILITY_LEVEL", + "name": "Facility", + "orgUnitLevel": 3 + } + ] +}