CHT Outbound Push - DHIS2 Data Format

Hello @jkuester , @derick and team,
Thanks a lot for the support offered here, Outbound Push Configs
Now that we are able to see the responses from the DHIS2 Instance, it’s easier to tell why our CHT data is not being reflected on the DHIS2 Testing Instance.

Both the CHT and the DHIS2 return success messages. See attached logs…
From CHT,

[**2023-05-30** 11:36:23] **2023-05-30** 11:36:23 INFO: Pushed 92920a43ff60439c583546f5a0190de5 to khis_config

From DHIS,

[**2023-05-30** 11:36:23] **2023-05-30** 11:36:23 DEBUG: {

[**2023-05-30** 11:36:23] "responseType": "ImportSummary",

[**2023-05-30** 11:36:23] "status": "SUCCESS",

[**2023-05-30** 11:36:23] "importOptions": {

[**2023-05-30** 11:36:23] "idSchemes": {},

[**2023-05-30** 11:36:23] "dryRun": false,

[**2023-05-30** 11:36:23] "async": false,

[**2023-05-30** 11:36:23] "importStrategy": "CREATE_AND_UPDATE",

[**2023-05-30** 11:36:23] "mergeMode": "REPLACE",

[**2023-05-30** 11:36:23] "reportMode": "FULL",

[**2023-05-30** 11:36:23] "skipExistingCheck": false,

[**2023-05-30** 11:36:23] "sharing": false,

[**2023-05-30** 11:36:23] "skipNotifications": false,

[**2023-05-30** 11:36:23] "skipAudit": false,

[**2023-05-30** 11:36:23] "datasetAllowsPeriods": false,

[**2023-05-30** 11:36:23] "strictPeriods": false,

[**2023-05-30** 11:36:23] "strictDataElements": false,

[**2023-05-30** 11:36:23] "strictCategoryOptionCombos": false,

[**2023-05-30** 11:36:23] "strictAttributeOptionCombos": false,

[**2023-05-30** 11:36:23] "strictOrganisationUnits": false,

[**2023-05-30** 11:36:23] "requireCategoryOptionCombo": false,

[**2023-05-30** 11:36:23] "requireAttributeOptionCombo": false,

[**2023-05-30** 11:36:23] "skipPatternValidation": false,

[**2023-05-30** 11:36:23] "ignoreEmptyCollection": false,

[**2023-05-30** 11:36:23] "force": false,

[**2023-05-30** 11:36:23] "firstRowIsHeader": true,

[**2023-05-30** 11:36:23] "skipLastUpdated": false,

[**2023-05-30** 11:36:23] "mergeDataValues": false,

[**2023-05-30** 11:36:23] "skipCache": false

[**2023-05-30** 11:36:23] },

[**2023-05-30** 11:36:23] "description": "Import process completed successfully",

[**2023-05-30** 11:36:23] "importCount": {

[**2023-05-30** 11:36:23] "imported": 0,

[**2023-05-30** 11:36:23] "updated": 0,

[**2023-05-30** 11:36:23] "ignored": 0,

[**2023-05-30** 11:36:23] "deleted": 0

[**2023-05-30** 11:36:23] },

[**2023-05-30** 11:36:23] "conflicts": [],

[**2023-05-30** 11:36:23] "dataSetComplete": "**2023-05-30**"

[**2023-05-30** 11:36:23] }

However, the cht data DOES NOT reflect on DHIS. This is because nothing was imported though the dhis2 server returned a success msg. See this part of the DHIS2 response logs shared above,

[**2023-05-30** 11:36:23] "importCount": {

[**2023-05-30** 11:36:23] "imported": 0,

[**2023-05-30** 11:36:23] "updated": 0,

[**2023-05-30** 11:36:23] "ignored": 0,

[**2023-05-30** 11:36:23] "deleted": 0

[**2023-05-30** 11:36:23] },

After further troubleshooting, I noticed even with a correct mapping on app settings - the format of the payload from CHT does not match the required payload by DHIS2.
I assume the data mapping configs are correct because I got NO errors from CHT. However, the CHT DOES NOT transform the mapping to the format I expected.

I expected the payload to look like this,

{
  "dataValues" : [ {
    "value" : "34",
    "dataElement" : "V9SqzZHKoP7",
    "categoryOptionCombo" : "NhSoXUMPK2K "
  }, {
    "value" : "1250",
    "dataElement" : "rdcZ1ni3jrD",
    "categoryOptionCombo" : "NhSoXUMPK2K "
  }, {
    "value" : "7",
    "dataElement" : "ZAsCMIJLkvj",
    "categoryOptionCombo" : "NhSoXUMPK2K "
  }, {
    "value" : "67",
    "dataElement" : "RXgNfdYSJPh",
    "categoryOptionCombo" : "NhSoXUMPK2K "
  }, {
    "value" : "1",
    "dataElement" : "NjcDm9nopWu",
    "categoryOptionCombo" : "NhSoXUMPK2K "
  }, {
    "value" : "0",
    "dataElement" : "ylvw7Y1OB1H",
    "categoryOptionCombo" : "NhSoXUMPK2K "
  }, {
    "value" : "2",
    "dataElement" : "aod6Gz2QUg2",
    "categoryOptionCombo" : "NhSoXUMPK2K "
  }, {
    "value" : "34",
    "dataElement" : "eUakxWsxkcq",
    "categoryOptionCombo" : "NhSoXUMPK2K "
  }, {
    "value" : "0",
    "dataElement" : "ybfaTwL9yBA",
    "categoryOptionCombo" : "NhSoXUMPK2K "
  }, {
    "value" : "0",
    "dataElement" : "X9d8oaBHDqx",
    "categoryOptionCombo" : "NhSoXUMPK2K "
  }, {
    "value" : "0",
    "dataElement" : "iJpuwr4Hqj1",
    "categoryOptionCombo" : "NhSoXUMPK2K "
  }
],
  "orgUnit" : "600253",
  "month" : "April",
  "year" : "2023",
  "dataSet" : "ovtKPo15xAg",
  "period" : "202304",
  "completeDate" : "2023-05-30"
}

BUT got this,

{
  "dataValues[0]": {
    "value": "34",
    "dataElement": "V9SqzZHKoP7",
    "categoryOptionCombo": "NhSoXUMPK2K "
  },
  "dataValues[1]": {
    "value": "1251",
    "dataElement": "rdcZ1ni3jrD",
    "categoryOptionCombo": "NhSoXUMPK2K "
  },
  "dataValues[2]": {
    "value": "7",
    "dataElement": "ZAsCMIJLkvj",
    "categoryOptionCombo": "NhSoXUMPK2K "
  },
  "dataValues[3]": {
    "value": "67",
    "dataElement": "RXgNfdYSJPh",
    "categoryOptionCombo": "NhSoXUMPK2K "
  },
  "dataValues[4]": {
    "value": "1",
    "dataElement": "NjcDm9nopWu",
    "categoryOptionCombo": "NhSoXUMPK2K "
  },
  "dataValues[5]": {
    "value": "0",
    "dataElement": "ylvw7Y1OB1H",
    "categoryOptionCombo": "NhSoXUMPK2K "
  },
  "dataValues[6]": {
    "value": "2",
    "dataElement": "aod6Gz2QUg2",
    "categoryOptionCombo": "NhSoXUMPK2K "
  },
  "dataValues[7]": {
    "value": "34",
    "dataElement": "eUakxWsxkcq",
    "categoryOptionCombo": "NhSoXUMPK2K "
  },
  "dataValues[8]": {
    "value": "0",
    "dataElement": "ybfaTwL9yBA",
    "categoryOptionCombo": "NhSoXUMPK2K "
  },
  "dataValues[9]": {
    "value": "0",
    "dataElement": "X9d8oaBHDqx",
    "categoryOptionCombo": "NhSoXUMPK2K "
  },
  "dataValues[10]": {
    "value": "0",
    "dataElement": "iJpuwr4Hqj1",
    "categoryOptionCombo": "NhSoXUMPK2K "
  },
  "orgUnit": "600253",
  "dataSet": "ovtKPo15xAg",
  "completeDate": "2023-05-30",
  "period": "202304"
}

I needed to have all the above objects in an array named dataValues.
Could I be missing something?

Kindly also see the data mapping as configured on the app settings file.

 "mapping": {
        "dataValues[0].value": "doc.fields.new_count_u5_malaria_rdt_positive_treated_act",
        "dataValues[0].dataElement": "doc.fields.new_count_u5_malaria_rdt_positive_treated_act_id",
        "dataValues[0].categoryOptionCombo": "doc.fields.categoryOptionCombo_id",
        "dataValues[1].value": "doc.fields.new_count_total_households",
        "dataValues[1].dataElement": "doc.fields.new_count_total_households_id",
        "dataValues[1].categoryOptionCombo": "doc.fields.categoryOptionCombo_id",
        "dataValues[2].value": "doc.fields.new_count_over_5yrs_fever_7days_less_rdt_done",
        "dataValues[2].dataElement": "doc.fields.new_count_over_5yrs_fever_7days_less_rdt_done_id",
        "dataValues[2].categoryOptionCombo": "doc.fields.categoryOptionCombo_id",
        "dataValues[3].value": "doc.fields.new_count_u5_fever_7days_less_rdt_done",
        "dataValues[3].dataElement": "doc.fields.new_count_u5_fever_7days_less_rdt_done_id",
        "dataValues[3].categoryOptionCombo": "doc.fields.categoryOptionCombo_id",
        "dataValues[4].value": "doc.fields.new_count_new_born_visited_48hrs_after_birth",
        "dataValues[4].dataElement": "doc.fields.new_count_new_born_visited_48hrs_after_birth_id",
        "dataValues[4].categoryOptionCombo": "doc.fields.categoryOptionCombo_id",
        "dataValues[5].value": "doc.fields.new_count_elderly_checkups_reaching_facility",
        "dataValues[5].dataElement": "doc.fields.new_count_elderly_checkups_reaching_facility_id",
        "dataValues[5].categoryOptionCombo": "doc.fields.categoryOptionCombo_id",
        "dataValues[6].value": "doc.fields.new_count_community_events_monthly_meetings",
        "dataValues[6].dataElement": "doc.fields.new_count_community_events_monthly_meetings_id",
        "dataValues[6].categoryOptionCombo": "doc.fields.categoryOptionCombo_id",
        "dataValues[7].value": "doc.fields.new_count_u5_fever_7days_less_rdt_positive",
        "dataValues[7].dataElement": "doc.fields.new_count_u5_fever_7days_less_rdt_positive_id",
        "dataValues[7].categoryOptionCombo": "doc.fields.categoryOptionCombo_id",
        "dataValues[8].value": "doc.fields.new_count_community_events_action_days",
        "dataValues[8].dataElement": "doc.fields.new_count_community_events_action_days_id",
        "dataValues[8].categoryOptionCombo": "doc.fields.categoryOptionCombo_id",
        "dataValues[9].value": "doc.fields.new_count_new_deliveries_at_home",
        "dataValues[9].dataElement": "doc.fields.new_count_new_deliveries_at_home_id",
        "dataValues[9].categoryOptionCombo": "doc.fields.categoryOptionCombo_id",
        "dataValues[10].value": "doc.fields.new_count_defaulter_art",
        "dataValues[10].dataElement": "doc.fields.new_count_defaulter_art_id",
        "dataValues[10].categoryOptionCombo": "doc.fields.categoryOptionCombo_id",
        "orgUnit": "doc.fields.mculcode",
        "dataSet": "doc.fields.dataSet_id",
        "completeDate": {
          "expr": "new Date().toISOString().slice(0,10)",
          "optional": false
        },
        "period": {
          "expr": "doc.fields.year + doc.fields.month_iso",
          "optional": false
        }
      }

Your suggestions will be highly appreciated.

To reference array entries with object-path, I think you should just dot-reference the index (dataValues.0.value) instead of doing dataValues[0].value in your app_settings config. I was able to get it to map the objects into an array with config like:

      "mapping": {
        "dataValues.0.value": "doc.fields.new_count_u5_malaria_rdt_positive_treated_act",
        "dataValues.0.dataElement": "doc.fields.new_count_u5_malaria_rdt_positive_treated_act_id",
        "dataValues.0.categoryOptionCombo": "doc.fields.categoryOptionCombo_id",
        "dataValues.1.value": "doc.fields.new_count_total_households",
        "dataValues.1.dataElement": "doc.fields.new_count_total_households_id",
        "dataValues.1.categoryOptionCombo": "doc.fields.categoryOptionCombo_id"
...
      }
1 Like

Brilliant! @jkuester,
This works perfectly! Yeey!!!
Finally, the data is reflected on DHIS2.

Many Thanks!

3 Likes