@@ -9,12 +9,15 @@ import org.dhis2.mobile.aggregates.data.mappers.toInputType
9
9
import org.dhis2.mobile.aggregates.model.CellElement
10
10
import org.dhis2.mobile.aggregates.model.DataElementInfo
11
11
import org.dhis2.mobile.aggregates.model.DataSetDetails
12
+ import org.dhis2.mobile.aggregates.model.DataSetEdition
12
13
import org.dhis2.mobile.aggregates.model.DataSetInstanceConfiguration
13
14
import org.dhis2.mobile.aggregates.model.DataSetInstanceSectionConfiguration
14
15
import org.dhis2.mobile.aggregates.model.DataSetRenderingConfig
15
16
import org.dhis2.mobile.aggregates.model.DataToReview
17
+ import org.dhis2.mobile.aggregates.model.GreyedOutField
16
18
import org.dhis2.mobile.aggregates.model.InputType
17
19
import org.dhis2.mobile.aggregates.model.MandatoryCellElements
20
+ import org.dhis2.mobile.aggregates.model.NonEditableReason
18
21
import org.dhis2.mobile.aggregates.model.PivoteMode
19
22
import org.dhis2.mobile.aggregates.model.TableGroup
20
23
import org.dhis2.mobile.aggregates.model.ValidationResultStatus
@@ -35,6 +38,7 @@ import org.hisp.dhis.android.core.common.ValueType
35
38
import org.hisp.dhis.android.core.dataelement.DataElement
36
39
import org.hisp.dhis.android.core.dataelement.DataElementOperand
37
40
import org.hisp.dhis.android.core.dataset.DataSetEditableStatus
41
+ import org.hisp.dhis.android.core.dataset.DataSetNonEditableReason
38
42
import org.hisp.dhis.android.core.dataset.Section
39
43
import org.hisp.dhis.android.core.dataset.SectionPivotMode
40
44
import org.hisp.dhis.android.core.dataset.TabsDirection
@@ -67,31 +71,96 @@ internal class DataSetInstanceRepositoryImpl(
67
71
68
72
val dataSetDTOCustomTitle = dataSet?.displayOptions()?.customText()
69
73
74
+ val period = d2.periodModule().periods().byPeriodId().eq(periodId)
75
+ .one().blockingGet()
76
+
77
+ val periodLabel = period?.let {
78
+ periodLabelProvider(
79
+ periodType = period.periodType(),
80
+ periodId = period.periodId()!! ,
81
+ periodStartDate = period.startDate()!! ,
82
+ periodEndDate = period.endDate()!! ,
83
+ locale = Locale .getDefault(),
84
+ )
85
+ } ? : periodId
86
+
87
+ val edition = d2.dataSetModule().dataSetInstanceService().blockingGetEditableStatus(
88
+ dataSetUid,
89
+ periodId,
90
+ orgUnitUid,
91
+ attrOptionComboUid,
92
+ ).let {
93
+ DataSetEdition (
94
+ editable = it == DataSetEditableStatus .Editable ,
95
+ nonEditableReason = (it as ? DataSetEditableStatus .NonEditable )?.reason?.let { reason ->
96
+ when (reason) {
97
+ DataSetNonEditableReason .NO_DATASET_DATA_WRITE_ACCESS ->
98
+ NonEditableReason .NoDataWriteAccess
99
+
100
+ DataSetNonEditableReason .NO_ATTRIBUTE_OPTION_COMBO_ACCESS ->
101
+ NonEditableReason .NoAttributeOptionComboAccess (
102
+ d2.categoryModule().categoryOptionCombos()
103
+ .uid(attrOptionComboUid)
104
+ .blockingGet()?.displayName() ? : attrOptionComboUid,
105
+ )
106
+
107
+ DataSetNonEditableReason .ORGUNIT_IS_NOT_IN_CAPTURE_SCOPE ->
108
+ NonEditableReason .OrgUnitNotInCaptureScope (
109
+ d2.organisationUnitModule().organisationUnits()
110
+ .uid(orgUnitUid)
111
+ .blockingGet()?.displayName() ? : orgUnitUid,
112
+ )
113
+
114
+ DataSetNonEditableReason .ATTRIBUTE_OPTION_COMBO_NO_ASSIGN_TO_ORGUNIT ->
115
+ NonEditableReason .AttributeOptionComboNotAssignedToOrgUnit (
116
+ d2.categoryModule().categoryOptionCombos()
117
+ .uid(attrOptionComboUid)
118
+ .blockingGet()?.displayName() ? : attrOptionComboUid,
119
+ d2.organisationUnitModule().organisationUnits()
120
+ .uid(orgUnitUid)
121
+ .blockingGet()?.displayName() ? : orgUnitUid,
122
+ )
123
+
124
+ DataSetNonEditableReason .PERIOD_IS_NOT_IN_ORGUNIT_RANGE ->
125
+ NonEditableReason .PeriodIsNotInOrgUnitRange (
126
+ periodLabel,
127
+ d2.organisationUnitModule().organisationUnits()
128
+ .uid(orgUnitUid)
129
+ .blockingGet()?.displayName() ? : orgUnitUid,
130
+ )
131
+
132
+ DataSetNonEditableReason .PERIOD_IS_NOT_IN_ATTRIBUTE_OPTION_RANGE ->
133
+ NonEditableReason .PeriodIsNotInAttributeOptionComboRange (
134
+ periodLabel,
135
+ d2.categoryModule().categoryOptionCombos()
136
+ .uid(attrOptionComboUid)
137
+ .blockingGet()?.displayName() ? : attrOptionComboUid,
138
+ )
139
+
140
+ DataSetNonEditableReason .CLOSED ->
141
+ NonEditableReason .Closed
142
+
143
+ DataSetNonEditableReason .EXPIRED ->
144
+ NonEditableReason .Expired
145
+ }
146
+ } ? : NonEditableReason .None ,
147
+ )
148
+ }
149
+
70
150
return d2.dataSetModule().dataSetInstances()
71
- .byDataSetUid().eq(dataSetUid)
72
- .byPeriod().eq(periodId)
73
- .byOrganisationUnitUid().eq(orgUnitUid)
74
- .byAttributeOptionComboUid().eq(attrOptionComboUid)
75
- .blockingGet()
76
- .map { dataSetInstance ->
77
- val period = d2.periodModule().periods().byPeriodId().eq(dataSetInstance.period())
78
- .one().blockingGet()
79
-
80
- dataSetInstance.toDataSetDetails(
81
- periodLabel = period?.let {
82
- periodLabelProvider(
83
- periodType = period.periodType(),
84
- periodId = period.periodId()!! ,
85
- periodStartDate = period.startDate()!! ,
86
- periodEndDate = period.endDate()!! ,
87
- locale = Locale .getDefault(),
88
- )
89
- } ? : dataSetInstance.period(),
90
- isDefaultCatCombo = isDefaultCatCombo == true ,
91
- customText = dataSetDTOCustomTitle,
92
- )
93
- }
94
- .firstOrNull() ? : DataSetDetails (
151
+ .dataSetInstance(
152
+ dataSet = dataSetUid,
153
+ period = periodId,
154
+ organisationUnit = orgUnitUid,
155
+ attributeOptionCombo = attrOptionComboUid,
156
+ )
157
+ .blockingGet()?.toDataSetDetails(
158
+ periodLabel = periodLabel,
159
+ isDefaultCatCombo = isDefaultCatCombo == true ,
160
+ customText = dataSetDTOCustomTitle,
161
+ isCompleted = isComplete(dataSetUid, periodId, orgUnitUid, attrOptionComboUid),
162
+ edition = edition,
163
+ ) ? : DataSetDetails (
95
164
customTitle = dataSetDTOCustomTitle.toCustomTitle(),
96
165
dataSetTitle = dataSet?.displayName()!! ,
97
166
dateLabel = periodId,
@@ -103,6 +172,8 @@ internal class DataSetInstanceRepositoryImpl(
103
172
.uid(attrOptionComboUid)
104
173
.blockingGet()
105
174
?.displayName(),
175
+ isCompleted = isComplete(dataSetUid, periodId, orgUnitUid, attrOptionComboUid),
176
+ edition = edition,
106
177
)
107
178
}
108
179
@@ -154,6 +225,7 @@ internal class DataSetInstanceRepositoryImpl(
154
225
)
155
226
156
227
private suspend fun categoryOptionCombinations (
228
+ categoryCombinationUid : String ,
157
229
categoryUids : List <String >,
158
230
pivotedCategoryUid : String? ,
159
231
): List <String > {
@@ -174,6 +246,7 @@ internal class DataSetInstanceRepositoryImpl(
174
246
}.mapNotNull { categoryOptions ->
175
247
if (pivotedCategoryUid == null ) {
176
248
d2.categoryModule().categoryOptionCombos()
249
+ .byCategoryComboUid().eq(categoryCombinationUid)
177
250
.byCategoryOptions(categoryOptions)
178
251
.one()
179
252
.blockingGet()?.uid()
@@ -262,7 +335,22 @@ internal class DataSetInstanceRepositoryImpl(
262
335
.uid(sectionUid)
263
336
.blockingGet()
264
337
?.greyedFields()
265
- ?.mapNotNull { it.dataElement()?.uid() }
338
+ ?.mapNotNull {
339
+ val dataElementUid = it.dataElement()?.uid() ? : return @mapNotNull null
340
+ val categoryOptionComboUid =
341
+ it.categoryOptionCombo()?.uid() ? : return @mapNotNull null
342
+ val categoryOptionUids = d2.categoryModule().categoryOptionCombos()
343
+ .withCategoryOptions()
344
+ .uid(categoryOptionComboUid)
345
+ .blockingGet()
346
+ ?.categoryOptions()?.map { it.uid() } ? : emptyList()
347
+
348
+ GreyedOutField (
349
+ dataElementUid,
350
+ categoryOptionComboUid,
351
+ categoryOptionUids,
352
+ )
353
+ }
266
354
267
355
val isEditable = d2.dataSetModule().dataSetInstanceService()
268
356
.getEditableStatus(dataSetUid, periodId, orgUnitUid, attrOptionComboUid)
@@ -371,7 +459,11 @@ internal class DataSetInstanceRepositoryImpl(
371
459
subgroups = subGroups,
372
460
cellElements = noGroupingDataSetElements,
373
461
headerRows = getTableGroupHeaders(catComboUid!! , subGroups, pivotedCategory),
374
- headerCombinations = categoryOptionCombinations(subGroups, pivotedCategory),
462
+ headerCombinations = categoryOptionCombinations(
463
+ categoryCombinationUid = catCombo.uid(),
464
+ categoryUids = subGroups,
465
+ pivotedCategoryUid = pivotedCategory,
466
+ ),
375
467
pivotMode = when {
376
468
pivoted ->
377
469
PivoteMode .Transpose
@@ -423,8 +515,9 @@ internal class DataSetInstanceRepositoryImpl(
423
515
pivotedCategory,
424
516
),
425
517
headerCombinations = categoryOptionCombinations(
426
- subGroups,
427
- pivotedCategory,
518
+ categoryCombinationUid = catCombo.uid(),
519
+ categoryUids = subGroups,
520
+ pivotedCategoryUid = pivotedCategory,
428
521
),
429
522
pivotMode = when {
430
523
pivoted ->
@@ -473,13 +566,13 @@ internal class DataSetInstanceRepositoryImpl(
473
566
.byPeriod().eq(periodId)
474
567
.byOrganisationUnitUid().eq(orgUnitUid)
475
568
.byAttributeOptionCombo().eq(catOptCombo)
476
- .blockingGet()? .mapNotNull { dataValueConflict ->
569
+ .blockingGet().mapNotNull { dataValueConflict ->
477
570
dataValueConflict.dataElement()?.let { dataElementUid ->
478
571
sections.filter { it.value?.contains(dataElementUid) == true }.keys
479
572
}
480
- }? .flatten()
573
+ }.flatten()
481
574
482
- return sectionWithError? .firstOrNull()?.let {
575
+ return sectionWithError.firstOrNull()?.let {
483
576
sections.keys.indexOf(it)
484
577
} ? : 0
485
578
} else {
@@ -831,6 +924,17 @@ internal class DataSetInstanceRepositoryImpl(
831
924
}
832
925
}
833
926
927
+ override suspend fun reopenDataSet (
928
+ dataSetUid : String ,
929
+ periodId : String ,
930
+ orgUnitUid : String ,
931
+ attributeOptionComboUid : String ,
932
+ ) {
933
+ d2.dataSetModule().dataSetCompleteRegistrations()
934
+ .value(periodId, orgUnitUid, dataSetUid, attributeOptionComboUid)
935
+ .blockingDeleteIfExist()
936
+ }
937
+
834
938
override suspend fun runValidationRules (
835
939
dataSetUid : String ,
836
940
periodId : String ,
0 commit comments