@@ -19,12 +19,14 @@ package org.smartregister.fhircore.engine.task
19
19
import androidx.annotation.VisibleForTesting
20
20
import ca.uhn.fhir.context.FhirContext
21
21
import ca.uhn.fhir.util.TerserUtil
22
+ import ca.uhn.fhir.validation.FhirValidator
22
23
import com.google.android.fhir.FhirEngine
23
24
import com.google.android.fhir.get
24
25
import com.google.android.fhir.logicalId
25
26
import com.google.android.fhir.search.search
26
27
import java.util.Date
27
28
import javax.inject.Inject
29
+ import javax.inject.Provider
28
30
import javax.inject.Singleton
29
31
import org.hl7.fhir.r4.model.ActivityDefinition
30
32
import org.hl7.fhir.r4.model.Base
@@ -56,7 +58,9 @@ import org.smartregister.fhircore.engine.configuration.event.EventType
56
58
import org.smartregister.fhircore.engine.data.local.DefaultRepository
57
59
import org.smartregister.fhircore.engine.util.extension.addResourceParameter
58
60
import org.smartregister.fhircore.engine.util.extension.asReference
61
+ import org.smartregister.fhircore.engine.util.extension.checkResourceValid
59
62
import org.smartregister.fhircore.engine.util.extension.encodeResourceToString
63
+ import org.smartregister.fhircore.engine.util.extension.errorMessages
60
64
import org.smartregister.fhircore.engine.util.extension.extractFhirpathDuration
61
65
import org.smartregister.fhircore.engine.util.extension.extractFhirpathPeriod
62
66
import org.smartregister.fhircore.engine.util.extension.extractId
@@ -75,6 +79,7 @@ constructor(
75
79
val transformSupportServices: TransformSupportServices ,
76
80
val defaultRepository: DefaultRepository ,
77
81
val fhirResourceUtil: FhirResourceUtil ,
82
+ val fhirValidatorProvider: Provider <FhirValidator >,
78
83
val workflowCarePlanGenerator: WorkflowCarePlanGenerator ,
79
84
) {
80
85
private val structureMapUtilities by lazy {
@@ -186,7 +191,22 @@ constructor(
186
191
187
192
val carePlanTasks = output.contained.filterIsInstance<Task >()
188
193
189
- if (carePlanModified) saveCarePlan(output)
194
+ if (carePlanModified) {
195
+ fhirValidatorProvider
196
+ .get()
197
+ .checkResourceValid(output)
198
+ .filterNot { it.isSuccessful }
199
+ .takeIf { it.isNotEmpty() }
200
+ ?.let {
201
+ val errors = buildString {
202
+ it.forEach { validationResult -> appendLine(validationResult.errorMessages) }
203
+ }
204
+
205
+ throw IllegalStateException (errors)
206
+ }
207
+
208
+ saveCarePlan(output)
209
+ }
190
210
191
211
if (carePlanTasks.isNotEmpty()) {
192
212
fhirResourceUtil.updateUpcomingTasksToDue(
@@ -208,7 +228,9 @@ constructor(
208
228
carePlan.contained.clear()
209
229
210
230
// Save CarePlan only if it has activity, otherwise just save contained/dependent resources
211
- if (output.hasActivity()) defaultRepository.create(true , carePlan)
231
+ if (output.hasActivity()) {
232
+ defaultRepository.create(true , carePlan)
233
+ }
212
234
213
235
dependents.forEach { defaultRepository.create(true , it) }
214
236
0 commit comments