Manuel du développeur

Develop DHIS core version master

DHIS2 Documentation Team

Copyright © 2008-2023 DHIS2 Team

source.revision.date: 2026-06-16

Warranty: THIS DOCUMENT IS PROVIDED BY THE AUTHORS ‘’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 AUTHORS 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 MANUAL AND PRODUCTS MENTIONED HEREIN, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

License: Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the source of this documentation, and is available here online: http://www.gnu.org/licenses/fdl.html

toc.title

Aperçu

L'API Web est un composant qui permet aux systèmes externes d'accéder aux données stockées dans une instance DHIS2 et de les manipuler. Plus précisément, elle fournit une interface programmatique à un large éventail de données exposées et de méthodes de service pour des applications telles que des clients logiciels tiers, des portails web et des modules DHIS2 internes.

Introduction

L'API Web adhère à de nombreux principes du style architectural REST. Pour n'en citer que certains, importants :

  1. Les éléments fondamentaux sont appelés ressources. Une ressource peut être tout ce qui est exposé sur le web, d'un document à un processus d'entreprise - tout ce avec quoi un client peut vouloir interagir. Les aspects informatifs d'une ressource peuvent être récupérés ou échangés par le biais de représentations de la ressource. Une représentation est une vue de l'état d'une ressource à un moment donné. Par exemple, la ressource visualisations dans DHIS2 représente des visualisations de données agrégées pour un certain ensemble de paramètres. Cette ressource peut être récupérée dans divers formats de représentation, notamment JSON et CSV.
  2. Toutes les ressources peuvent être identifiées de manière unique par un URI (également appelé URL). Toutes les ressources ont une représentation par défaut. Vous pouvez indiquer que vous êtes intéressé par une représentation spécifique en fournissant un en-tête HTTP Accept, une extension de fichier ou un paramètre de requête format. Ainsi, pour récupérer une représentation CSV d'une réponse de données analytiques, vous pouvez fournir un en-tête Accept : application/csv ou ajouter .csv ou ?format=csv à l'URL de votre requête.
  3. Les interactions avec l'API nécessitent l'utilisation correcte des méthodes ou verbes HTTP. Cela implique que pour une ressource, vous devez émettre une requête GET lorsque vous souhaitez la récupérer, une requête POST lorsque vous souhaitez en créer une, une requête PUT lorsque vous souhaitez la mettre à jour et une requête DELETE lorsque vous souhaitez la supprimer.

Authentification

L'API Web DHIS2 prend en charge trois protocoles d'authentification :

Verify and get information about the currently authenticated user by making a GET request to the following endpoint.

GET /api/me

Get the list of authorities for the currently authenticatd user.

GET /api/me/authorization

Check whether the currently authenticated user has the given authority.

GET /api/me/authorization/{authority}

For example, to check whether the user has the F_CONSTANT_ADD authority.

GET /api/me/authorization/F_CONSTANT_ADD

The response will be either true or false in JSON format.

Authentification de base

L'API Web DHIS2 prend en charge l'authentification de base. L'authentification de base est une technique qui permet aux clients d'envoyer des informations d'identification par HTTP à un serveur web. Techniquement parlant, le nom d'utilisateur est suivi de deux points et le mot de passe, encodé en Base64, est préfixé par Basic et fourni en tant que valeur de l'en-tête HTTP Authorization (autorisation). De manière plus formelle, il s'agit de :

Authorization: Basic base64encode(nom d'utilisateur:mot de passe)

La plupart des environnements de développement compatibles avec les réseaux prennent en charge l'authentification de base, comme Apache HttpClient et Spring RestTemplate. Il est important de noter que ce schéma d'authentification n'offre aucune sécurité puisque le nom d'utilisateur et le mot de passe sont envoyés en texte clair et peuvent être facilement observés par un pirate. L'utilisation de Basic n'est recommandée que si le serveur utilise SSL/TLS (HTTPS) pour crypter la communication avec les clients. Ceci est un impératif, afin de garantir des interactions sécurisées avec l'API Web.

Authentification à deux facteurs

DHIS2 prend en charge l'authentification à deux facteurs. Cette fonction peut être activée pour chaque utilisateur. Lorsque cette option est activée, les utilisateurs sont invités à saisir un code 2FA lorsqu'ils se connectent. Pour en savoir plus sur l'authentification à deux facteurs, cliquez [ici] (https://www.google.com/landing/2step/).

Jeton d'accès personnel

Les jetons d'accès personnels (PAT) sont une alternative à l'utilisation de mots de passe lors de l'authentification au système DHIS2 lorsque l'on utilise l'API.

Les jetons d'accès personnel peuvent être une alternative plus sécurisée à l'authentification de base HTTP et devraient être votre choix privilégié lorsque vous créez une nouvelle application, un script, etc.

L'authentification de base HTTP est considérée comme non sécurisée car, entre autres, elle envoie votre nom d'utilisateur et votre mot de passe de façon indiscrète. Il est possible qu'elle soit abandonnée dans les versions futures de DHIS2 ou qu'elle devienne facultative, ce qui signifie que l'authentification de base devra être explicitement activée dans la configuration.

Problèmes de sécurité majeurs !

Vos jetons d'accès personnel hériteront automatiquement de toutes les permissions et autorisations dont dispose votre utilisateur. Il est donc extrêmement important de limiter l'accès que vous accordez à votre jeton en fonction de l'utilisation que vous comptez en faire, voir Configurer votre jeton.

Si vous souhaitez que le jeton n'ait accès qu'à une partie restreinte et spécifique du serveur, il est plutôt recommandé de créer un nouvel utilisateur spécial auquel vous n'attribuerez que les rôles et autorisations auxquels vous souhaitez qu'il ait accès.

Création d'un jeton

Pour créer un nouveau PAT, vous avez deux possibilités : * A. Créez un jeton dans l'interface utilisateur de la page de profil de votre compte. * B. Créer un jeton via l'API.

A. Creating a token on the account page

Connectez-vous avec votre nom d'utilisateur et votre mot de passe, allez sur votre page de profil (cliquez en haut à droite, et choisissez « Modifier le profil » dans le menu déroulant). Sur votre page de profil, choisissez « Jetons d'accès personnels » dans le menu à gauche. Vous devriez maintenant être sur la page « Gérer les jetons d'accès personnels » et voir le texte : « Vous n'avez pas de jetons d'accès personnels actifs ». Cliquez sur « Générer un nouveau jeton » pour créer un nouveau jeton. Une fenêtre contextuelle « Générer un nouveau jeton » s'affiche et vous propose deux choix :

1. Server/script context

"Ce type est utilisé pour les intégrations et les scripts qui ne seront pas accessibles par un navigateur".

Si vous prévoyez d'utiliser le jeton dans une application, un script ou autre, ce type de jeton devrait être votre choix.

2. Browser context

"Ce type d'application est utilisé pour les applications, telles que les portails publics, auxquelles on accède à l'aide d'un navigateur web".

Si vous devez créer un lien vers DHIS2 sur une page web, ou par exemple l'intégrer dans une iframe, c'est probablement le type de jeton qu'il vous faut.

Configuration de votre jeton

Après avoir choisi le type de jeton que vous désirez, vous pouvez configurer différentes contraintes d'accès à votre jeton. Par contrainte, nous entendons la manière de limiter et de restreindre l'utilisation de votre jeton. Cela peut être d'une importance cruciale si vous envisagez d'utiliser le jeton dans un environnement public, par exemple sur un tableau de bord public d'un autre site, intégré dans une iframe. Étant donné que les jetons ont toujours les mêmes accès/autorisations que ceux dont dispose actuellement votre utilisateur, il convient d'être particulièrement vigilant si vous avez l'intention de les utiliser dans un environnement que vous ne contrôlez pas à 100 %.

NB : Si quelqu'un d'autre met la main sur votre jeton, il peut faire tout ce que votre utilisateur est capable de faire. Il n'est pas possible de faire la distinction entre les actions effectuées à l'aide du jeton et les autres actions effectuées par votre utilisateur.

Important : Il est fortement conseillé de créer un utilisateur distinct et unique ayant uniquement les rôles/autorisations si vous envisagez d'utiliser les jetons PAT dans un environnement non sécurisé et/ou public, par exemple, sur un PC ou un serveur que vous ne contrôlez pas à 100 %, ou « intégré » dans une page web sur un autre serveur.

Constraint types

  • Temps d'expiration
  • Adresses UP autorisées
  • Méthodes HTTP autorisées
  • Référents HTTP autorisés
Temps d'expiration

La durée d'expiration définit simplement la durée pendant laquelle vous souhaitez que votre jeton soit utilisable, le délai par défaut étant de 30 jours. Passé ce délai, le jeton renverra simplement un message 401 (non autorisé). Vous pouvez définir le délai d'expiration que vous souhaitez, mais il est fortement conseillé de définir un délai d'expiration raisonnable pour votre cas d'utilisation.

IP addresses

Il s'agit d'une liste d'adresses IP séparées par des virgules, à partir desquelles vous souhaitez limiter la provenance des requêtes de jetons.

Important: La validation de l'adresse IP repose sur l'en-tête X-Transféré-À, qui peut être usurpé. Pour des raisons de sécurité, assurez-vous qu'un équilibreur de charge ou un proxy inverse écrase cet en-tête.

HTTP methods

Une liste de méthodes HTTP séparées par des virgules que vous souhaitez que votre jeton puisse utiliser. Si vous n'avez besoin de votre jeton que pour consulter des données, et non pour les modifier ou les supprimer, la sélection de la méthode GET HTTP est judicieuse.

HTTP referrers

Le référent HTTP est un en-tête ajouté à la requête lorsque vous cliquez sur un lien, il indique le site/la page sur lequel/laquelle vous étiez lorsque vous avez cliqué sur le lien. Pour en savoir plus sur l'en-tête du référent HTTP, cliquez sur le lien suivant : https://en.wikipedia.org/wiki/HTTP_referer

Cela peut servir à limiter l'utilisation d'un jeton « public » intégré à une autre page sur un autre site. S'assurer que l'en-tête du référent correspond au nom d'hôte du site d'où le jeton doit provenir peut éviter l'utilisation abusive du jeton, par exemple si quelqu'un le publie sur un forum public.

Important Ceci n'est pas une fonctionnalité de sécurité. L'en-tête référence peut être facilement usurpé. Ce paramètre est destiné à dissuader les développeurs tiers non autorisés à se connecter aux instances d'accès public.

Saving a token

Lorsque vous avez fini de configurer votre jeton, vous pouvez l'enregistrer en cliquant sur le bouton « Générer un nouveau jeton » en bas à droite de la fenêtre contextuelle. Le jeton sera alors sauvegardé et une clé secrète sera générée sur le serveur. La nouvelle clé secrète sera affichée en bas de la liste des jetons PAT sur fond vert, et le texte « Jeton nouvellement créé ». La clé du jeton secret ressemble à ceci :

d2pat_5xVA12xyUbWNedQxy4ohH77WlxRGVvZZ1151814092
Important: Cette clé de jeton secrète générée ne sera affichée qu'une seule fois. Il est donc important que vous la copiez maintenant et que vous la sauvegardiez en lieu sûr pour une utilisation ultérieure. La clé de jeton secrète sera hachée de manière sécurisée sur le serveur, et seul le hachage de cette clé sera enregistré dans la base de données ; ceci pour minimiser les risques relatifs à la sécurité s'il arrivait qu'une personne obtienne un accès non autorisé à la base de données, de la même manière que les mots de passe sont gérés.

Creating a token with the API

Example of how to create a new Personal Access Token using the API:

POST /api/apiToken
Content-Type: application/json
Authorization: Basic admin district

{}
NB: N'oubliez pas le corps JSON vide ({}) dans la charge utile !

Il renverra une réponse contenant un jeton similaire à celui-ci :

{
  "httpStatus": "Created",
  "httpStatusCode": 201,
  "status": "OK",
  "response": {
     "responseType": "ApiTokenCreationResponse",
     "key": "d2pat_5xVA12xyUbWNedQxy4ohH77WlxRGVvZZ1151814092",
     "uid": "jJYrtIVP7qU",
     "klass": "org.hisp.dhis.security.apikey.ApiToken",
     "errorReports": []
  }
}

Note: The token key will only be shown once here in this response. You need to copy and save this is in a secure place for use later!

Le jeton lui-même se compose de trois parties : 1. Préfixe : (d2pat_) indique de quel type de jeton il s'agit. 2. Octets aléatoires codés en Base64: (5xVA12xyUbWNedQxy4ohH77WlxRGVvZZ) 3. Somme de contrôle CRC32 : (1151814092) la partie de la somme de contrôle est complétée par 0 de sorte qu'elle conserve toujours une longueur de dix caractères.

Configure token with the API

Pour modifier l'une des contraintes de votre jeton, vous pouvez envoyer la requête API HTTP suivante.

Note: Only the constraints are possible to modify after the token has been created.

PUT /api/apiToken/jJYrtIVP7qU
Content-Type: application/json
Authorization: Basic admin district
{
  "version": 1,
  "type": "PERSONAL_ACCESS_TOKEN",
  "expire": 163465349603200,
  "attributes": [
      {
        "type": "IpAllowedList",
        "allowedIps": ["192.168.0.1"]
      },
      {
        "type": "MethodAllowedList",
        "allowedMethods": ["GET"]
      }
  ]
}

Using a Personal Access Token

To issue a request with your newly created token, use the Authorization header accordingly. The authorization header format is:

Autorisation : ApiToken [YOUR_SECRET_API_TOKEN_KEY]

Par exemple :

GET /api/apiToken/jJYrtIVP7qU
Content-Type: application/json
Authorization: ApiToken d2pat_5xVA12xyUbWNedQxy4ohH77WlxRGVvZZ1151814092

Deleting a Personal Access Token

Vous pouvez supprimer vos PAT soit dans l'interface utilisateur de votre page de profil où vous les avez créés, soit via l'API comme ceci :

DELETE /api/apiToken/jJYrtIVP7qU
Content-Type: application/json
Authorization: ApiToken d2pat_5xVA12xyUbWNedQxy4ohH77WlxRGVvZZ1151814092

OAuth2

DHIS2 prend en charge le protocole d'authentification OAuth2. OAuth2 est une norme ouverte d'autorisation qui permet aux clients tiers de se connecter au nom d'un utilisateur DHIS2 et d'obtenir un bearer token (jeton porteur) réutilisable pour les requêtes ultérieures à l'API Web. DHIS2 ne prend pas en charge les rôles OAuth2 à granularité fine, mais fournit aux applications un accès basé sur les rôles d'utilisateur de DHIS2.

Chaque client pour lequel vous voulez autoriser l'authentification OAuth 2 doit être enregistré dans DHIS2. Pour ajouter un nouveau client OAuth2, allez dans Applications > Paramètres > Clients OAuth2 dans l'interface utilisateur, cliquez sur Ajouter nouveau et entrez le nom du client souhaité et les types d'autorisations.

Create a Client

Un client OAuth2 peut être ajouté via l'API Web. Par exemple, nous pouvons envoyer une charge comme celle-ci :

{
  "name": "OAuth2 Demo Client",
  "cid": "demo",
  "secret": "1e6db50c-0fee-11e5-98d0-3c15c2c6caf6",
  "grantTypes": [
    "password",
    "refresh_token",
    "authorization_code"
  ],
  "redirectUris": [
    "http://www.example.org"
  ]
}

La charge utile peut être envoyée avec la commande suivante :

SERVER="https://play.dhis2.org/dev"
curl -X POST -H "Content-Type: application/json" -d @client.json
  -u admin:district "$SERVER/api/oAuth2Clients"

This client will be used as the basis for the next grant type examples.

Type d'autorisation "Mot de passe"

Le type d'autorisation le plus simple est le type mot de passe. Ce type d'autorisation est similaire à l'authentification de base en ce sens qu'il exige du client qu'il recueille le nom d'utilisateur et le mot de passe de l'utilisateur. Prenons l'exemple de notre serveur de démonstration :

SERVER="https://play.dhis2.org/dev"
SECRET="1e6db50c-0fee-11e5-98d0-3c15c2c6caf6"

curl -X POST -H "Accept: application/json" -u demo:$SECRET "$SERVER/uaa/oauth/token"
  -d grant_type=password -d username=admin -d password=district

Vous obtiendrez une réponse similaire à ceci :

{
  "expires_in": 43175,
  "scope": "ALL",
  "access_token": "07fc551c-806c-41a4-9a8c-10658bd15435",
  "refresh_token": "a4e4de45-4743-481d-9345-2cfe34732fcc",
  "token_type": "bearer"
}

Pour l'instant, nous allons nous concentrer sur le access_token, qui sera utilisé comme jeton d'authentification (porteur). À titre d'exemple, nous allons obtenir tous les éléments de données en utilisant notre jeton :

SERVER="https://play.dhis2.org/dev"
curl -H "Authorization: Bearer 07fc551c-806c-41a4-9a8c-10658bd15435" "$SERVER/api/33/dataElements.json"

Type d'autorisation "rafraîchir_jeton"{ #webapi_refresh_token }

En général, les jetons d'accès ont une validité limitée. Vous pouvez jeter un coup d'œil à la propriété expires_in (expire dans) de la réponse dans l'exemple précédent pour comprendre quand un jeton expire. Pour obtenir un nouveau access_token (jeton d'accès), vous pouvez visiter le serveur et utiliser refresh_token (rafraîchir le jeton) qui vous permet d'obtenir un jeton mis à jour sans avoir besoin de demander les informations d'identification de l'utilisateur une fois de plus.

SERVER="https://play.dhis2.org/dev"
SECRET="1e6db50c-0fee-11e5-98d0-3c15c2c6caf6"
REFRESH_TOKEN="a4e4de45-4743-481d-9345-2cfe34732fcc"

curl -X POST -H "Accept: application/json" -u demo:$SECRET "$SERVER/uaa/oauth/token"
  -d "grant_type=refresh_token" -d "refresh_token=$REFRESH_TOKEN"

La réponse sera exactement la même que lorsque vous obtenez un jeton au départ.

Type d'autorisation "code_d'autorisation"

Le type "code autorisé" est l'approche recommandée si vous ne voulez pas stocker les informations d'identification de l'utilisateur en externe. Elle permet à DHIS2 de collecter le nom d'utilisateur et le mot de passe directement auprès de l'utilisateur au lieu que le client les collecte et s'authentifie ensuite au nom de l'utilisateur. Notez que cette approche utilise la partie redirectUris de la charge du client.

Étape 1 : Visitez l'URL suivante à l'aide d'un navigateur web. Si vous avez plus d'un URI de redirection, vous pouvez ajouter &redirect_uri=http://www.example.org à l'URL :

SERVER="https://play.dhis2.org/dev"
$SERVER/uaa/oauth/authorize?client_id=demo&response_type=code

Étape 2 : Une fois que l'utilisateur s'est connecté avec succès et a accepté votre accès client, il sera redirigé vers votre uri de redirection comme suit :

http://www.example.org/?code=XYZ

Étape 3 : Cette étape est similaire à celle du type d'autorisation "mot de passe". En utilisant le code fourni, nous allons maintenant demander un jeton d'accès :

SERVER="https://play.dhis2.org/dev"
SECRET="1e6db50c-0fee-11e5-98d0-3c15c2c6caf6"

curl -X POST -u demo:$SECRET -H "Accept: application/json" $SERVER/uaa/oauth/token
-d "grant_type=authorization_code" -d "code=XYZ"

Messages d'erreur et d'information

L'API Web utilise un format cohérent pour tous les messages d'erreur, d'avertissement et d'information :

{
  "httpStatus": "Forbidden",
  "message": "Vous n'avez pas la permission de lire ce type d'objet.",
  "httpStatusCode": 403,
  "status": "ERROR"
}

Le message indique que l'utilisateur a essayé d'accéder à une ressource à laquelle je n'ai pas accès. Il utilise le code de statut http 403, le message de statut http interdit et un message descriptif.

Tableau : Propriétés de WebMessage

Nom Description
Statut http Message de statut HTTP pour cette réponse, voir RFC 2616 (Section 10) pour plus d'informations.
Code de statut http Code de statut HTTP pour cette réponse, voir RFC 2616 (Section 10) pour plus d'informations.
status Les valeurs possibles du statut DHIS2 sont OK | ; AVERTISSEMENT | ; ERREUR, où OK signifie que tout a réussi, ERREUR signifie que l'opération ne s'est pas terminée et AVERTISSEMENT signifie que l'opération a partiellement réussi, si le message contient une propriété réponse, veuillez y jeter un coup d'oeil pour obtenir plus d'informations.
message Un message convivial indiquant si l'opération a réussi ou non.
Message dev Un message plus technique, adapté aux développeurs (non utilisé actuellement).
réponse Point d'extension pour les futures extensions du format MessageWeb.

Format de la date et de la période

Dans l'API Web, nous faisons référence à des dates et à des périodes. Le format de la date est le suivant :

yyyy-MM-dd

For example, if you want to express March 20, 2014, you must use 2014-03-20.

Le format de la période est décrit dans le tableau suivant (également disponible dans le endpoint de l'API /api/periodTypes)

Tableau : Format de la période

Intervale Format Exemple Description
Jour aaaaMMjj 20040315 15 Mars, 2004
Semaine aaaaWn 2004W10 Semaine 10 2004
Semaine Mercredi aaaaMerWn 2015MerS5 Semaine 5 avec début le mercredi
Semaine Jeudi aaaaJeuSn 2015JeuS6 Semaine 6 avec début le Jeudi
Semaine Samedi aaaaSamSn 2015SamS7 Semaine 7 avec début le Samedi
Semaine Dimanche aaaaDimSn 2015DimS8 Semaine 8 avec début le Dimanche
Bi-hebdomadaire aaaaBiSn 2015BiS1 Semaine 1-2 20015
Mois aaaaMM 200403 Mars 2004
Bi-mensuel aaaaMMB 200401B Janvier-février 2004
Trimestre aaaaTn 2004Q1 Janvier-Mars 2004
Semestre aaaaSn 2004S1 Janvier-juin 2004
Semestre Avril aaaaAvrilSn 2004AvrilS1 Avril-Septembre 2004
Année aaaa 2004 2004
Année financière Avril aaaaAvril 2004Avril Avril 2004 - mars 2005
Année financière Juillet aaaaJuillet 2004Juillet juillet 2004-juin 2005
Année financière Octobre aaaaOctobre 2004Octobre Octobre 2004-septembre 2005

Périodes relatives

In some parts of the API, like for the analytics resource, you can utilize relative periods in addition to fixed periods (defined above). The relative periods are relative to the current date and allow e.g. for creating dynamic reports. The available relative period values are described in the table below.

Nom Keyword
Aujourd'hui TODAY
Hier YESTERDAY
Last 3 days LAST_3_DAYS
Last 7 days LAST_7_DAYS
Last 14 days LAST_14_DAYS
Last 30 days LAST_30_DAYS
Last 60 days LAST_60_DAYS
Last 90 days LAST_90_DAYS
Last 180 days LAST_180_DAYS
Ce mois THIS_MONTH
This bi-month THIS_BIMONTH
Last bi-month LAST_BIMONTH
Ce trimestre THIS_QUARTER
Last quarter LAST_QUARTER
This six-month THIS_SIX_MONTH
Last six-month LAST_SIX_MONTH
Weeks this year WEEKS_THIS_YEAR
Months this year MONTHS_THIS_YEAR
Bi-months this year BIMONTHS_THIS_YEAR
Quarters this year QUARTERS_THIS_YEAR
This year THIS_YEAR
Months last year MONTHS_LAST_YEAR
Quarters last year QUARTERS_LAST_YEAR
L'année dernière LAST_YEAR
Last 5 years LAST_5_YEARS
Last 10 years LAST_10_YEARS
Les 12 derniers mois LAST_12_MONTHS
Last 6 months LAST_6_MONTHS
Last 3 months LAST_3_MONTHS
Last 6 bi-months LAST_6_BIMONTHS
Last 4 quarters LAST_4_QUARTERS
Last 2 six-months LAST_2_SIXMONTHS
This financial year THIS_FINANCIAL_YEAR
Last financial year LAST_FINANCIAL_YEAR
Last 5 financial years LAST_5_FINANCIAL_YEARS
Last 10 financial years LAST_10_FINANCIAL_YEARS
Cette semaine THIS_WEEK
Semaine dernière LAST_WEEK
This bi-week THIS_BIWEEK
Last bi-week LAST_BIWEEK
Last 4 weeks LAST_4_WEEKS
Last 4 bi-weeks LAST_4_BIWEEKS
Last 12 weeks LAST_12_WEEKS
Last 52 weeks LAST_52_WEEKS

It is possible retrieve the ISO representations of these relative periods by making a GET request to the /api/relativePeriods/{RELATIVE_PERIOD_KEYWORD}

The endpoint supports the following parameters: - startDate: Represents the start date to calculate the relative period from. Format: yyyy-MM-dd. Default is today if not provided. - financialYearStart: Should be one of FINANCIAL_YEAR_FEBRUARY, FINANCIAL_YEAR_APRIL, FINANCIAL_YEAR_JULY, FINANCIAL_YEAR_AUGUST, FINANCIAL_YEAR_SEPTEMBER, FINANCIAL_YEAR_OCTOBER. Default is FINANCIAL_YEAR_OCTOBER if not provided.

As an example, to get the ISO representation of the relative period LAST_3_MONTHS from the date 2021-08-15, you can issue the following request: GET /api/relativePeriods/LAST_3_MONTHS?startDate=2021-08-15

The response in this case would be:

{
[
"202105",
"202106",
"202107"
]
}

Périodes de dates personnalisées

Les ressources analytiques query supportent des paramètres supplémentaires pour exprimer des périodes.

La dimension pe par défaut sera utilisée :

  • eventDate pour /analytics/events/query
  • enrollmentDate pour /analytics/enrollments/query

Il est possible d'ajouter des conditions sur un ou plusieurs champs de date et de les combiner.

Utilisation de périodes de dates personnalisées

Dans les ressources prenant en charge des périodes de dates personnalisées, il existe des paramètres de requête supplémentaires qui seront combinés pour exprimer des conditions sur la dimension temporelle.

période de date personnalisée ressources de requête d'événements ressource de requête d'inscription
date d'événement [x] [ ]
date d'inscription [x] [x]
date programmée [x] [ ]
date d'incident [x] [x]
lastUpdated [x] [x]

Conditions can be expressed in the following format:

/api/analytics/events/query/...?...&eventDate=2021&...

Il est possible de combiner plusieurs champs temporels dans la même requête :

/api/analytics/events/query/...?...&eventDate=2021&incidentDate=202102&...

Toutes ces conditions peuvent être combinées avec la dimension pe :

/api/analytics/events/query/...?...&dimension=pe:TODAY&enrollmentDate=2021&incidentDate=202102&...

Les formats pris en charge sont décrits dans la section « Format de date et de période » ci-dessus. Un format supplémentaire est fourni pour exprimer un intervalle de dates : aaaaMMjj_aaaaMMjj et aaaa-MM-jj_aaaa-MM-jj.

Dans l'exemple ci-dessous, le point d'extrémité renvoie les événements prévus entre 20210101 et 20210104 :

/api/analytics/events/query/...?...&dimension=pe:TODAY&enrollmentDate=2021&incidentDate=202102&scheduledDate=20210101_20210104&...

Autorités

All available system authorities can be listed with identifiers and names using the following endpoint.

GET /api/authorities

Il renvoie le format suivant :

{
  "systemAuthorities": [
    {
      "id": "ALL",
      "name": "ALL"
    },
    {
      "id": "F_ACCEPT_DATA_LOWER_LEVELS",
      "name": "Accept data at lower levels"
    }
  ]
}

Metadata

Schémas d'identification

Cette section explique le concept de schéma d'identification. Les schémas d'identification sont utilisés pour relier des objets de métadonnées à d'autres métadonnées lors des importations et également pour envoyer les métadonnées lors des exportations. Tous les schémas ne fonctionnent pas avec tous les appels d'API, et tous les schémas ne peuvent pas être utilisés à la fois pour les entrées et les sorties. Cet aspect est abordé dans les sections où sont expliqués les différents points d'extrémité d'API.

Tous les types d'objets disponibles pour le schéma d'identification sont énumérés ci-dessous. Sont fournis les noms des propriétés à utiliser dans les requêtes :

  • idScheme
  • dataElementIdScheme
  • categoryOptionComboIdScheme
  • orgUnitIdScheme
  • programIdScheme
  • programStageIdScheme
  • trackedEntityIdScheme
  • trackedEntityAttributeIdScheme

Le schéma d'identification général (idScheme) s'applique à tous les types d'objets. Il peut être remplacé par des types d'objets spécifiques.

Le schéma par défaut pour tous les paramètres est UID (identifiants DHIS2 permanents). Les schémas d'identification pris en charge sont décrits dans le tableau ci-dessous.

Tableau : Valeurs du schéma

Schéma Description
ID, UID Correspondre avec l'identifiant permanent DHIS2. il s'agit du schéma d'identification par défaut.
CODE Correspondre avec le code DHIS2, principalement utilisé pour échanger des données avec un système externe.
NOM Correspondre avec le nom DHIS2. Notez que c'est l'élément disponible en tant que object.name (nom de l'objet) qui est utilisé, et non le nom traduit. Notez également que les noms ne sont pas toujours uniques et que, par conséquent, ils ne peuvent pas être utilisés.
ATTRIBUT:ID Correspondre avec l'attribut de métadonnées. Cet attribut doit être assigné au type avec lequel vous établissez la correspondance, d'autant plus que la propriété unique est définie sur vrai. Cette fonctionnalité permet principalement d'échanger des données avec des systèmes externes. Il présente certains avantages par rapport à CODE puisque plusieurs attributs peuvent être ajoutés. Il peut donc se synchroniser avec plus d'un système.

Notez que les schémas d'identification ne constituent pas une fonctionnalité indépendante, mais ils doivent être utilisés en combinaison avec des ressources telles que l'importation de valeurs de données, l'importation de métadonnées et l'importation GeoJson.

Par exemple, pour spécifier CODE comme schéma d'identification général et le remplacer par UID pour le schéma d'identification de l'unité d'organisation, vous pouvez utiliser les requêtes suivantes :

?idScheme=CODE&orgUnitIdScheme=UID

Autre exemple, pour spécifier un attribut pour le schéma d'identification de l'unité d'organisation, un code pour le schéma d'identification de l'élément de données et utiliser le schéma d'identification par défaut UID pour tous les autres objets, vous pouvez utiliser les paramètres suivants :

?orgUnitIdScheme=ATTRIBUTE:j38fk2dKFsG&dataElementIdScheme=CODE

Navigation dans l'API Web

Le point d'entrée pour naviguer dans l'API Web est /api. Cette ressource fournit des liens vers toutes les ressources disponibles. Quatre formats de représentation sont systématiquement disponibles pour toutes les ressources : HTML, XML, JSON et JSONP. D'autres formats sont disponibles pour des ressources comme MS Excel, PDF, CSV et PNG. Pour explorer l'API à partir d'un navigateur web, accédez au point d'entrée /api et suivez les liens vers la ressource que vous recherchez, par exemple /api/dataElements. Pour toutes les ressources qui renvoient une liste d'éléments, certains paramètres de requête peuvent être utilisés pour modifier la réponse :

Tableau : Paramètres de requête

Paramètre Valeurs des options Option par défaut Description
pagination vrai faux true
page numéro 1 Définit le numéro de page à renvoyer.
pageSize numéro 50 Définit le nombre d'éléments à renvoyer pour chaque page.
order property:asc/iasc/desc/idesc Ordonne la sortie dans un ordre spécifique. Seules les propriétés qui sont à la fois persistantes et simples (pas de collections, d'identifiants d'objets, etc.) sont prises en charge. iasc et idesc sont des tris insensibles à la casse. Si vous souhaitez trier plusieurs propriétés, séparez-les par une virgule.

Voici un exemple de comment ces paramètres peuvent être utilisés pour obtenir une liste complète de groupes d'éléments de données dans un format de réponse XML :

/api/dataElementGroups.xml?links=false&paging=false

Vous pouvez rechercher des éléments à partir de la propriété "nom" au lieu de renvoyer toute une liste d'éléments à l'aide de la variable de requête query. Dans cet exemple, nous recherchons tous les éléments de données dont le nom contient le mot "anémie" :

/api/dataElements?query=anaemia

Vous pouvez obtenir des pages spécifiques et des tailles de page pour des objets en utilisant la requête suivante :

/api/dataElements.json?page=2&pageSize=20

Vous pouvez désactiver complètement la pagination à l'aide de cette requête :

/api/indicatorGroups.json?paging=false

Pour que le résultat soit ordonné selon une propriété spécifique :

/api/indicators.json?order=shortName:desc

Pour que le résultat soit d'abord ordonné selon la propriété créée "date et heure" (ordre décroissant), puis selon la propriété "nom" (ordre croissant) :

/api/indicators.json?order=created:desc,name:asc

La ressource identifiableObjects vous permet de rechercher tout objet à partir de son identifiant, quel que soit son type :

/api/identifiableObjects/<id>

Traduction

DHIS2 propose des traductions pour le contenu de la base de données, notamment les éléments de données, les indicateurs et les programmes. Tous les objets de métadonnées qui figurent dans l'API Web ont des propriétés destinées à être utilisées pour l'affichage et l'interface utilisateur. Il s'agit entre autres de displayName (nom d'affichage), displayShortName (nom d'affichage court), displayDescription (description de l'affichage) et displayFormName (nom du formulaire d'affichage). Ces propriétés sont utilisées pour les éléments de données et les attributs d'entités suivies.

Tableau : Options de traduction

Paramètre Valeurs Description
traduction vrai faux
langue Emplacement à utiliser Traduire les métadonnées dans une langue donnée (nécessite que la traduction soit définie sur 'vrai').

API de traduction

Les traductions d'un objet sont rendues comme faisant partie de l'objet lui-même dans le tableau traductions. Le tableau traductions qui figure dans les charges JSON/XML est normalement préfiltré pour vous, ce qui signifie qu'il ne peut pas être utilisé directement pour importer/exporter des traductions (car cela aurait pour effet de remplacer les langues autres que celles des utilisateurs actuellement connectés).

Exemple d'élément de données dont le tableau de traduction est filtré sur la langue de l'utilisateur :

{
  "id": "FTRrcoaog83",
  "displayName": "Accute French",
  "translations": [
    {
      "property": "SHORT_NAME",
      "locale": "fr",
      "value": "Accute French"
    },
    {
      "property": "NAME",
      "locale": "fr",
      "value": "Accute French"
    }
  ]
}

Exemple d'élément de données dont les traductions sont désactivées :

{
  "id": "FTRrcoaog83",
  "displayName": "Accute Flaccid Paralysis (Deaths < 5 yrs)",
  "translations": [
    {
      "property": "FORM_NAME",
      "locale": "en_FK",
      "value": "aa"
    },
    {
      "property": "SHORT_NAME",
      "locale": "en_GB",
      "value": "Accute Flaccid Paral"
    },
    {
      "property": "SHORT_NAME",
      "locale": "fr",
      "value": "Accute French"
    },
    {
      "property": "NAME",
      "locale": "fr",
      "value": "Accute French"
    },
    {
      "property": "NAME",
      "locale": "en_FK",
      "value": "aa"
    },
    {
      "property": "DESCRIPTION",
      "locale": "en_FK",
      "value": "aa"
    }
  ]
}

Notez que même si vous obtenez un résultat non filtré, et que vous utilisez le type de endpoint approprié, c'est-à-dire /api/dataElements, nous n'autorisons pas les mises à jour, car cela pourrait facilement entraîner des erreurs et remplacer les autres langues disponibles.

Pour lire et mettre à jour les traductions, vous pouvez utiliser le endpoint spécial des traductions pour chaque ressource d'objet. Vous pouvez y accéder en utilisant GET ou PUT sur le endpoint /api/<object-type>/<object-id>/translations approprié.

Par exemple, pour un élément de données dont l'identifiant est FTRrcoaog83, vous pouvez utiliser /api/dataElements/FTRrcoaog83/translations pour obtenir les traductions et les mettre à jour. Les champs disponibles sont property avec les options NOM, NOM_COURT, NOM DU_FORMULAIRE, DESCRIPTION, locale qui prend en charge tout ID de langue valide et la propriété traduite value.

Exemple de propriété NOM pour la langue française :

{
  "property": "NAME",
  "locale": "fr",
  "value": "Paralysie Flasque Aiguë (Décès <5 ans)"
}

Cette charge est ensuite ajoutée à un tableau de traduction et renvoyée au endpoint approprié :

{
  "translations": [
    {
      "property": "NAME",
      "locale": "fr",
      "value": "Paralysie Flasque Aiguë (Décès <5 ans)"
    }
  ]
}

Pour un élément de données dont l'ID est FTRrcoaog83, vous pouvez effectuer une requête PUT comme suit : /api/dataElements/FTRrcoaog83/translations. Assurez-vous d'envoyer toutes les traductions disponibles pour cet objet et pas seulement pour une langue (sinon vous risquez de remplacer les langues existantes par d'autres langues).

Le code de statut sera 204 No Content si la valeur de données a été sauvegardée ou mise à jour avec succès, ou 404 Not Found si une erreur de validation s'est produite (par exemple, plus d'un NOM_COURT pour la même langue).

Versions de l'API Web

The Web API /api can be used with a DHIS2 version number, example:

/api/42/dataElements

Versions 28-43 are supported. Calling an endpoint with or without a version does not change the behaviour of the API. The behaviour is the same no matter which approach is used. We aim to remove supporting API calls with versions, so please use API calls without the use of a version number.
The support for using versions is due to legacy design, which didn't evolve as originally envisioned.

Filtre sur les objets de métadonnées

Pour filtrer les métadonnées, plusieurs opérations de filtrage peuvent être appliquées à la liste de métadonnées renvoyée. Le format du filtre lui-même est simple et suit le modèle propriété:opérateur:valeur, où propriété est la propriété des métadonnées sur lesquelles vous voulez effectuer le filtrage, opérateur est l'opérateur de comparaison que vous voulez utiliser et valeur est la valeur à vérifier (tous les opérateurs ne requièrent pas de valeur).

Veuillez consulter la section schéma pour savoir quelles propriétés sont disponibles. En plus des propriétés listées, les filtres peuvent s'appliquer à des valeurs d'attributs personnalisés où l'ID de l'attribut est utilisé comme nom de propriété.

Le filtrage récursif, c'est-à-dire le filtrage sur des objets associés ou une collection d'objets, est également possible.

Tableau : Opérateurs disponibles

Opérateur Types Valeur requise Description
eq chaîne booléen entier
!eq chaîne booléen entier
ieq chaîne true Case insensitive string, match exact
ne chaîne booléen entier
like chaîne true Chaîne sensible à la casse ; peut correspondre avec tout élément
!like chaîne true Chaîne sensible à la casse ; ne peut pas correspondre avec tous les éléments
$like chaîne true Chaîne sensible à la casse ; début de la correspondance
!$like chaîne true Chaîne sensible à la casse, pas de début de correspondance
like$ chaîne true Chaîne sensible à la casse ; fin de la correspondance
!like$ chaîne true Case sensitive string, not match end
ilike chaîne true Chaîne insensible à la casse ; peut correspondre avec tout élément
!ilike chaîne true Chaîne insensible à la casse ; ne peut pas correspondre avec tous les éléments
$ilike chaîne true Chaîne insensible à la casse ; début de la correspondance
!$ilike chaîne true Chaîne insensible à la casse, pas de début de correspondance
ilike$ chaîne true Case insensitive string, match end
!ilike$ chaîne true Case insensitive string, not match end
gt chaîne booléen entier
ge chaîne booléen entier
lt chaîne booléen entier
le chaîne booléen entier
null tous false La propriété est nulle
!null tous false La propriété n'est pas nulle
vide collection false La collection est vide
token chaîne true Match on multiple tokens in search property
!token chaîne true Not match on multiple tokens in search property
dans chaîne booléen entier
!in chaîne booléen entier

Les opérateurs sont appliqués sous la forme d'une requête logique et. Si vous avez besoin d'une requête ou, vous pouvez consulter le filtre dans et la section ci-dessous. Le mécanisme de filtrage permet la récursivité. Des exemples sont donnés ci-dessous.

Obtenir des éléments de données avec la propriété ID1 ou ID2 :

/api/dataElements?filter=id:eq:ID1&filter=id:eq:ID2

Get data elements, ignoring case, with name property MyDataElement:

/api/dataElements?filter=name:ieq:mydataelement

Obtenir tous les éléments de données qui ont un ensemble de données avec l'identifiant ID1 :

/api/dataElements?filter=dataSetElements.dataSet.id:eq:ID1

Obtenir tous les éléments de données avec l'opérateur d'agrégation somme et le type de valeur int :

/api/dataElements.json?filter=aggregationOperator:eq:sum&filter=type:eq:int

Vous pouvez effectuer un filtrage à l'intérieur des collections. Par exemple, pour obtenir les éléments de données qui font partie du groupe d'éléments de données * CPN*, vous pouvez utiliser la requête suivante en utilisant la propriété d'identification (id) des groupes d'éléments de données qui lui sont associés :

/api/dataElements.json?filter=dataElementGroups.id:eq:qfxEYY9xAl6

Pour obtenir des éléments de données ayant une valeur d'attribut particulière pour un attribut de métadonnées, un filtre peut être spécifié pour l'ID de l'attribut et la valeur de l'attribut en utilisant la même syntaxe que celle de la requête de collection :

/api/dataElements.json?filter=attributeValues.attribute.id:eq:n2xYlNbsfko&filter=attributeValues.value:eq:AFP

Obtenir les éléments de données pour lesquels une option a été définie :

/api/dataElements?filter=optionSet:!null

Étant donné que tous les opérateurs sont and par défaut, vous ne pouvez pas trouver un élément de données correspondant à plus d'un identifiant. Pour ce faire, vous pouvez utiliser l'opérateur in.

/api/dataElements.json?filter=id:in:[fbfJHSPpUQD,cYeuwXTCPkU]

Opérateurs logiques

Comme indiqué dans la section précédente, l'opérateur logique par défaut appliqué aux filtres est AND, ce qui signifie que tous les filtres d'objets doivent trouver une correspondance. Cependant, dans certains cas, l'utilisateur peut vouloir utiliser un seul filtre parmi plusieurs (par exemple le champ de l'identifiant et du code). Dans ce cas, il est possible de changer l'opérateur logique racine de AND à OR à l'aide du paramètre rootJunction.

Exemple : Filtrage normal où l'identifiant et le code doivent trouver une correspondance pour que le résultat soit renvoyé.

/api/dataElements.json?filter=id:in:[id1,id2]&filter=code:eq:code1

Exemple : Filtrage où l'opérateur logique a été remplacé par "OR", ce qui fait qu'un seul des filtres doit trouver une correspondance pour que le résultat soit renvoyé.

/api/dataElements.json?filter=id:in:[id1,id2]&filter=code:eq:code1&rootJunction=OR

Filtre à jeton identifiable

Outre le filtrage spécifique basé sur les propriétés mentionné ci-dessus, nous disposons également d'un filtrage AND basé sur les jetons à travers un ensemble de propriétés : identifiant, code et nom (ainsi que 'nom court' s'il est disponible). Ces propriétés sont généralement appelées identifiables. L'idée est de filtrer les métadonnées dont l'identifiant, le nom, le code ou le nom court contiennent des informations.

Exemple : Filtrage de tous les éléments de données contenant 2nd dans l'un des éléments suivants : identifiant, nom, code et nom court.

/api/dataElements.json?filter=identifiable:token:2nd

Il est également possible de spécifier plusieurs valeurs de filtrage.

Exemple : Obtenir tous les éléments de données où ANC visit (visite de CPN) se trouve dans l'une des propriétés identifiables. Le système renvoie tous les éléments de données dans lesquels les deux unités lexicales (ANC et visit) se trouvent quelque part dans les propriétés identifiables.

/api/dataElements.json?filter=identifiable:token:ANC visit

Il est également possible de combiner le filtre identifiable avec le filtre basé sur les propriétés et de s'attendre à ce que le paramètre rootJunction soit appliqué.

/api/dataElements.json?filter=identifiable:token:ANC visit&filter=displayName:ilike:tt1

/api/dataElements.json?filter=identifiable:token:ANC visit
  &filter=displayName:ilike:tt1&rootJunction=OR

Filtre de champ de métadonnées

Dans de nombreuses situations, les visualisations par défaut des métadonnées peuvent être trop détaillées. Un client peut juste avoir besoin de quelques champs de chaque objet et vouloir supprimer les champs inutiles de la réponse. Pour connaître les champs disponibles pour chaque objet, veuillez consulter la section schéma. En plus des propriétés énumérées, il est possible d'inclure des attributs personnalisés pour les objets de premier niveau en utilisant l'identifiant de l'attribut comme nom de propriété.

Le format inclure/exclure permet une récursivité illimitée. Pour effectuer un filtrage au niveau de la "racine", vous pouvez simplement utiliser le nom du champ, c'est-à-dire ?fields=id,name qui n'affichera que les champs idendifiant et nom pour chaque objet. Pour les objets qui sont soit des collections, soit des objets complexes avec des propriétés indépendantes, vous pouvez utiliser le format ?fields=id,name,dataSets[id,name] qui renverra l'identifiant, le nom de la racine, ainsi que l'identifiant et le nom de chaque ensemble de données sur cet objet. Vous pouvez effectuer une négation à l'aide de l'opérateur d'exclamation, et nous disposons de paramètres prédéfinis pour la sélection des champs. Les formats XML et JSON sont acceptés.

Exemple : Obtenir l'id et le nom à partir de la ressource d'indicateurs :

/api/indicators?fields=id,name

Exemple : Obtenir l'id et le nom des éléments de données, et l'id et le nom des ensembles de données associés :

/api/dataElements?fields=id,name,dataSets[id,name]

Exemple : Obtenir l'id, le nom et la valeur d'un attribut défini par l'utilisateur avec l'ID DnrLSdo4hMl, pour les unités d'organisation :

/api/organisationUnits?fields=id,name,DnrLSdo4hMl

L'attribut est alors inclus en tant que propriété DnrLSdo4hMl de chaque objet correspondant dans la réponse. Il peut être renommé à l'aide du transformateur rename (renommer) tel que présenté dans la section suivante.

Pour exclure un champ de la sortie, vous pouvez utiliser l'opérateur d'exclamation !. Ceci est autorisé à n'importe quel emplacement dans la requête et cette propriété ne sera pas incluse tout simplement car elle pourrait avoir été insérée dans des paramètres prédéfinis.

Quelques paramètres prédéfinis (groupes de champs sélectionnés) sont disponibles et peuvent être appliqués à l'aide de l'opérateur :.

Tableau : Opérateurs de propriété

Opérateur Description
<field-name> Inclut la propriété avec le nom, si possible.
<object>[<field-name>, ...] Inclut un champ dans une collection (qui s'appliquera à tous les objets de cette collection) ou dans un seul objet.
!<field-name>, <object>[!<field-name> Le nom du champ est exclu. Cet opérateur fonctionne également à l'intérieur des objets/collections. Il peut vous être utile lorsque vous utilisez un paramètre prédéfini pour inclure des champs.
*, <object>[*] Inclut tous les champs d'un objet spécifique. S'il est appliqué à une collection, tous les champs de tous les objets de cette collection seront inclus.
:<preset> Alias pour sélectionner plusieurs champs. Trois paramètres prédéfinis sont actuellement disponibles ; le tableau ci-dessous en fournit les descriptions.

Tableau : Paramètres prédéfinies des champs

Paramètre prédéfini Description
tous Tous les champs de l'objet
* Alias pour tous
identifiable Includes id, name, code, created, lastUpdated and lastUpdatedBy fields
nommable Inclut les champs pour l'identifiant, le nom, le nom court, le code, la description, la date de création et la dernière mise à jour.
conservé Renvoie toutes les propriétés conservées pour un objet ; ne tient pas compte du fait que l'objet soit le propriétaire de la relation ou non.
propriétaire Renvoie toutes les propriétés conservées pour un objet, dans un contexte où cet objet possède toutes les propriétés. Cette charge peut être utilisée pour effectuer une mise à jour via l'API.

Exemple : Inclure tous les champs des ensembles de données à l'exception des unités d'organisation :

/api/dataSets?fields=:all,!organisationUnits

Exemple : Inclure uniquement l'identifiant, le nom et la collection d'unités d'organisation d'un ensemble de données, mais exclure l'identifiant des unités d'organisation :

/api/dataSets/BfMAe6Itzgt?fields=id,name,organisationUnits[:all,!id]

Exemple : Inclure les propriétés nommables de tous les indicateurs :

/api/indicators.json?fields=:nameable

Transformateurs de champ

Les transformations de champs peuvent être utilisées pour transformer des propriétés. La syntaxe est décrite ci-dessous.

/api/dataElements/ID?fields=id~rename(i),name~rename(n)

La propriété id sera renommée i et la propriété name sera renommée n.

Plusieurs transformateurs peuvent être appliqués à une même propriété. Pour ce faire, il suffit de répéter l'opérateur de transformation :

/api/dataElementGroups.json?fields=id,displayName,dataElements~isNotEmpty~rename(haveDataElements)

Les opérateurs de transformation pris en charge sont décrits dans le tableau ci-dessous.

Tableau : Transformateurs disponibles

Nom Arguments Description
taille Donne la taille des chaînes (longueur) et des collections
isEmpty (est vide) La chaîne ou la collection est vide
isNotEmpty (n'est pas vide) La chaîne ou la collection n'est pas vide
renommer Arg1 : nom Renomme la propriété
pagination Arg1 : page,Arg2 : taille de la page Pages a collection, default pageSize is 50.
pluck Arg1 facultatif : fieldName (nom du champ) Convertit un tableau d'objets en un tableau comprenant un champ sélectionné de cet objet. Par défaut, le premier champ renvoyé par la collection est utilisé (normalement l'ID).
keyBy Arg1 facultatif : fieldName (nom du champ) Convertit un tableau d'objets en un objet où le nom du champ (id par défaut) est utilisé comme clé. Cette fonction peut être utilisée pour faire des recherches rapides en JavaScript, par exemple

Exemples

Des exemples d'utilisation de transformateurs sont présentés ci-dessous.

Obtenir la taille d'une collection :

/api/dataElements?fields=dataSets~size

Teste si une collection est vide :

/api/dataElements?fields=dataSets~isEmpty

Teste si une collection n'est pas vide :

/api/dataElements?fields=dataSets~isNotEmpty

Renommer les propriétés :

/api/dataElements/ID?fields=id~rename(i),name~rename(n)

Appliquer la pagination à une collection :

/api/dataElementGroups?fields=id,displayName,dataElements~paging(1;20)

Obtenir un tableau contenant les identifiants des unités d'organisation :

/api/categoryOptions.json?fields=id,organisationUnits~pluck

Obtenir un tableau contenant les noms des unités d'organisation :

/api/categoryOptions.json?fields=id,organisationUnits~pluck[name]

Key the dataElements array by the id field:

/api/dataElementGroups.json?fields=id,name,dataElements~keyBy[id,name,valueType]

Key the dataElements array by the valueType field, since multiple hits this will results in arrays (of data elements):

/api/dataElementGroups.json?fields=id,name,dataElements~keyBy(valueType)[id,name,valueType]

Création, lecture, mise à jour, suppression et validation de métadonnées

Toutes les entités de métadonnées dans DHIS2 ont leur propre endpoint API qui prend en charge les opérations CRUD (création, lecture, mise à jour et suppression). Les URL des endpoints suivent le format suivant :

/api/<entityName>

Le nom de l'entité utilise la notation camel case. Par exemple, le endpoint pour les éléments de données est :

/api/dataElements

NOTE: Lors de la mise à jour des objets, toutes les valeurs des propriétés existantes seront écrasées, même si la nouvelle valeur est nulle. Veuillez utiliser l'API de patch JSON si vous souhaitez effectuer une mise à jour partielle d'un objet.

Création et mise à jour des paramètres

Les paramètres de requête suivants sont disponibles pour tous les endpoints de métadonnées.

Tableau : Filtres de requête disponibles

Param Type Obligatoire Options (par défaut en premier) Description
preheatCache booléen false vrai faux
importStrategy (stratégie d'importation) énumération false CRÉER_ET_METTRE À JOUR CRÉER

Création et mise à jour d'objets

Pour créer de nouveaux objets, vous devrez connaître le endpoint, le format du type d'objet et vous assurer que vous disposez des autorisations nécessaires. À titre d'exemple, nous allons créer et mettre à jour une constante. Pour connaître le format, nous pouvons utiliser le nouveau endpoint schema pour obtenir la description du format. Nous allons donc commencer par l'obtention de cette information :

http://<server>/api/schemas/constant.json

À partir de la sortie, vous pouvez voir que les autorités requises pour la création sont F_CONSTANT_ADD, et que les propriétés importantes sont : name et value. En nous basant sur ces informations, nous pouvons créer une charge JSON et la sauvegarder dans un fichier appelé constant.json :

{
  "name": "PI",
  "value": "3.14159265359"
}

Pour avoir le même contenu qu'une charge XML :

<constant name="PI" xmlns="http://dhis2.org/schema/dxf/2.0">
  <value>3.14159265359</value>
</constant>

Nous sommes maintenant prêts à créer la nouvelle constante en envoyant une requête POST au point d'extrémité constantes avec la charge JSON, en utilisant le curl :

curl -d @constant.json "http://server/api/constants" -X POST
  -H "Content-Type: application/json" -u user:password

Exemple concret d'envoi de la constante au serveur de démonstration :

curl -d @constant.json "https://play.dhis2.org/api/constants" -X POST
  -H "Content-Type: application/json" -u admin:district

Si tout s'est bien passé, vous devriez obtenir le résultat suivant :

{
  "status": "SUCCESS",
  "importCount": {
    "imported": 1,
    "updated": 0,
    "ignored": 0,
    "deleted": 0
  },
  "type": "Constant"
}

Le processus sera exactement le même pour la mise à jour, vous apportez vos modifications à la charge JSON/XML, vous trouvez l'ID de la constante, puis vous envoyez une requête PUT au endpoint en incluant l'ID :

curl -X PUT -d @pi.json -H "Content-Type: application/json"
  -u user:password "http://server/api/constants/ID"

Suppression d'objets

La suppression d'objets est très simple. Vous devez connaître l'ID et le endpoint du type d'objet que vous voulez supprimer. Reprenons l'exemple de la dernière section et utilisons une constante. Supposons que l'identifiant soit abc123, tout ce que vous avez à faire est d'envoyer la requête DELETE au endpoint + id :

curl -X DELETE -u user:password "http://server/api/constants/ID"

Une suppression réussie doit renvoyer le statut HTTP 204 (pas de contenu).

Ajout et suppression d'objets dans les collections

La ressource des collections vous permet de modifier des collections d'objets.

Ajout ou suppression d'objets uniques{ #webapi_collections_adding_removing_single_objects }

Pour ajouter ou supprimer des objets dans une collection d'objets, vous pouvez utiliser le modèle suivant :

/api/{collection-object}/{collection-object-id}/{collection-name}/{object-id}

Vous devez utiliser la méthode POST pour ajouter un objet et la méthode DELETE pour le supprimer. Lorsqu'il existe une relation entre plusieurs objets, vous devez d'abord déterminer quel objet est propriétaire de la relation. Si cet objet n'est pas clairement identifiable, essayez les deux méthodes d'appel pour voir laquelle fonctionne.

Les éléments du modèle sont les suivants :

  • objet de collection : Le type d'objets qui possède la collection que vous voulez modifier.

  • id de l'objet de collection : L'identifiant de l'objet qui possède la collection que vous voulez modifier.

  • nom de la collection : le nom de la collection que vous voulez modifier.

  • Identifiant d'objet : L'identifiant de l'objet que vous voulez ajouter ou supprimer de la collection.

Par exemple, pour supprimer un élément de données avec pour identifiant IDB d'un groupe d'éléments de données dont l'identifiant est IDA, vous pouvez effectuer une requête DELETE :

DELETE /api/dataElementGroups/IDA/dataElements/IDB

Pour ajouter une option de catégorie avec pour identifiant IDB à une catégorie dont l'identifiant est IDA, vous pouvez effectuer une requête POST :

POST /api/categories/IDA/categoryOptions/IDB

Ajout ou suppression de plusieurs objets

Vous pouvez ajouter ou supprimer plusieurs objets d'une collection dans une même requête, en utilisant la charge suivante :

{
  "identifiableObjects": [{
      "id": "IDA"
    }, {
      "id": "IDB"
    }, {
      "id": "IDC"
    }
  ]
}

Cette charge permet d'ajouter, de remplacer ou de supprimer des éléments :

Ajouter des éléments :

POST /api/categories/IDA/categoryOptions

Remplacer des éléments :

PUT /api/categories/IDA/categoryOptions

Supprimer des éléments :

DELETE /api/categories/IDA/categoryOptions

Ajout et suppression d'objets dans une même requête

Vous pouvez ajouter et supprimer des objets d'une collection dans une même requête POST, en utilisant l'URL suivante :

POST /api/categories/IDA/categoryOptions

Le format de la charge est le suivant :

{
  "additions": [{
      "id": "IDA"
    }, {
      "id": "IDB"
    }, {
      "id": "IDC"
    }
  ],
  "deletions": [{
      "id": "IDD"
    }, {
      "id": "IDE"
    }, {
      "id": "IDF"
    }
  ]
}

Validation des charges

DHIS 2 permet de valider des métadonnées à l'échelle du système, ce qui signifie que les opérations de création et de mise à jour sur les points d'extrémité d'API devront être valides avant que les modifications ne soient autorisées. Pour connaître les validations disponibles pour un point d'extrémité spécifique, consultez ce point d'extrémité : /api/schemas. C'est-à-dire que pour connaître les contraintes d'un élément de données, vous devez vous rendre dans /api/schemas/dataElement.

Vous pouvez également valider votre charge manuellement en l'envoyant au endpoint du schéma approprié. Si vous vouliez valider la constante dans la section de création précédente, vous devriez l'envoyer comme ceci :

POST /api/schemas/constant

Voici un exemple simple (sans validation) :

curl -X POST -d "{\"name\": \"some name\"}" -H "Content-Type: application/json"
  -u admin:district "https://play.dhis2.org/dev/api/schemas/dataElement"

Ce qui donnera le résultat suivant :

[
   {
      "message" : "Required property missing.",
      "property" : "type"
   },
   {
      "property" : "aggregationOperator",
      "message" : "Required property missing."
   },
   {
      "property" : "domainType",
      "message" : "Required property missing."
   },
   {
      "property" : "shortName",
      "message" : "Required property missing."
   }
]

Mises à jour partielles

Nos points d'extrémité d'API qui traitent les métadonnées permettent des mises à jour partielles (PATCH) à l'aide du patch JSON [standard] (https://tools.ietf.org/html/rfc6902). La charge décrit essentiellement un ensemble d'opérations que vous voulez appliquer à un objet de métadonnées existant. Pour plus de détails et d'exemples sur le patch JSON, voir jsonpatch.com. Trois opérateurs sont pris en charge : add, remove et replace (ajouter, supprimer et remplacer).

Vous trouverez ci-dessous quelques exemples concernant DHIS2. Notez que toute mise à jour d'une charge doit être considérée comme une opération HTTP PUT, c'est-à-dire que toute modification doit aboutir à une charge de métadonnées PUT valide.

Le importReportMode (mode de rapport d'importation) par défaut pour le patch JSON est ERRORS_NOT_OWNER, ce qui signifie que si vous essayez de mettre à jour une propriété qui n'appartient pas à l'objet traité (par exemple si vous essayez d'ajouter un groupe d'indicateurs directement à un indicateur), vous obtiendrez une erreur.

Conformément à la spécification des patchs JSON, vous devez toujours utiliser le type MIME application/json-patch+json lorsque vous envoyez des patchs.

Exemples

Mise à jour du nom et du type de valeur d'un élément de données
PATCH /api/dataElements/{id}
[
  {"op": "add", "path": "/name", "value": "New Name"},
  {"op": "add", "path": "/valueType", "value": "INTEGER"}
] 
Ajout d'un nouvel élément de données à un groupe d'éléments de données
PATCH /api/dataElementGroups/{id}
[
  {"op": "add", "path": "/dataElements/-", "value": {"id": "data-element-id"}}
]
Suppression de toutes les associations d'éléments de données d'un groupe d'éléments de données
PATCH /api/dataElementGroups/{id}
[
  {"op": "remove", "path": "/dataElements"}
]
Modification du domaine et du type de valeur d'un élément de données
PATCH /api/dataElements/{id}
[
    {"op": "add", "path": "/domainType", "value": "TRACKER"},
    {"op": "add", "path": "/valueType", "value": "INTEGER"}
]
Suppression d'une unité d'organisation spécifique d'un groupe d'unité d'organisation
PATCH /api/organisationUnitGroups/{id}
[
  {"op": "remove", "path": "/organisationUnits/1"}
]

Blocage de l'ajout d'un groupe d'éléments de données à élément de données

PATCH /api/dataElements/{id}?importReportMode=ERRORS_NOT_OWNER
[
    {"op": "add", "path": "/dataElementGroups/-", "value": {"id": "data-element-group-id"}}
]

Blocage de la mise à jour du nom du groupe d'élément =s de données dans l'élément de données

PATCH /api/dataElements/{id}?importReportMode=ERRORS_NOT_OWNER
[
    {"op": "add", "path": "/dataElementGroups/0", "value": {"name": "new-name"}}
]

Remove collection item by id

PATCH /api/dataSets/{id}?importReportMode=ERRORS_NOT_OWNER
[
    {"op": "remove-by-id", "path": "/organisationUnits", "id": "u6CvKyF0Db5"}
]

Demande de patch avec avec un chemin d'accès invalide

Si la propriété path (chemin d'accès) est invalide ou n'existe pas, le service de patchs renvoie une erreur comme dans l'exemple suivant

PATCH /api/dataSets/{id}?importReportMode=ERRORS_NOT_OWNER

[
    {"op": "remove-by-id", "path": "/test", "id": "u6CvKyF0Db5"}
]
Réponse
{
    "httpStatus": "Bad Request",
    "httpStatusCode": 400,
    "status": "ERROR",
    "message": "Invalid path /test"
}

Exportation des métadonnées par CSV{ #webapi_metadata_csv_export }

Le filtrage des champs fonctionne presque de la même manière pour le CSV (notez que l'utilisation du CSV sur le point d'extrémité /api/metadata n'est pas possible), mais la transformation des champs n'est pas encore prise en charge.

Pour les points d'extrémité qui acceptent le CSV (par exemple nos points d'extrémité de métadonnées /api/dataElements et /api/organisationUnits), vous pouvez soit utiliser l'en-tête Accept avec la valeur text/csv ou utiliser l'extension .csv. Sachez que nous ne prenons pas en charge les objets complexes, seulement les collections d'objets avec identifiant (une liste d'UID sera donc renvoyée).

Nom Options Description
champs Identique au filtre de champ de métadonnées (avec les restrictions mentionnées ci-dessus) Le filtre par défaut est id,displayName.
skipHeader (ignorer l'en-tête) faux/vrai Détermine si l'en-tête (avec les noms des colonnes) doit être inclus ou non
séparateur Valeur par défaut : . Séparateur de colonnes
arraySeparator Valeur par défaut : ; Si l'un des champs est une collection d'objets d'identification, ce séparateur va se placer entre tous les UID.

Exemples

Obtenir tous les éléments de données, y compris leurs groupes

/api/dataElements.csv?fields=id,displayName,dataElementGroups

Obtenir toutes les unités d'organisation, y compris la géométrie (qui sera ignorée)

/api/organisationUnits.csv?fields=id,displayName,organisationUnitGroups,geometry

Exportation de métadonnées

Cette section décrit l'API de métadonnées qui est disponible ici : /api/metadata. Les représentations des ressources XML et JSON sont prises en charge.

/api/metadata

Les paramètres les plus courants sont décrits dans le tableau "Paramètres d'exportation" ci-dessous. Vous pouvez également appliquer ceci à tous les types disponibles en utilisant type:fields=<filter> et type:filter=<filter>. Vous pouvez également activer/désactiver l'exportation de certains types à travers ceci : type=true|false.

Export parameters
Nom Options Description
champs Identique au filtre du champ de métadonnées Filtre de champ par défaut à appliquer pour tous les types. La valeur par défaut est :owner (propriétaire).
filter Identique au filtre des objets de métadonnées Filtre d'objets par défaut à appliquer pour tous les types. La valeur par défaut est :none (aucun).
order Identique à l'ordre des métadonnées Ordre par défaut à appliquer à tous les types. La valeur par défaut est name si un nom est disponible, ou created sinon.
traduction faux/vrai Permet les traductions. Cette fonction est désactivée par défaut (dans d'autres points d'extrémité, elle est activée par défaut).
langue <locale> Permet de passer de la langue de l'utilisateur à la langue que vous définissez.
defaults INCLURE/EXCLURE Permet de déterminer si l'objet de catégorie généré automatiquement doit être inclus ou non dans la charge. Si vous déplacez des métadonnées entre deux instances non synchronisées, vous pouvez définir ce paramètre sur EXCLURE afin de faciliter la gestion de ces objets générés.
skipSharing (ignorer le partage) faux/vrai L'activation de ce paramètre supprime les propriétés de partage des objets exportés. Il s'agit de utilisateur, accès publique, accès des groupes d'utilisateurs, accès des utilisateurs, et accès externe.
inclusionStrategy (stratégie d'inclusion) NON_NULL, ALWAYS, NON_EMPTY NON_NULL includes properties which are not null, ALWAYS includes all properties, NON_EMPTY includes non empty properties (will not include strings of 0 length or empty collections)
download faux/vrai L'activation de ce paramètre ajoutera l'en-tête HTTP Contenu-Disposition qui spécifie que les données doivent être traitées comme une pièce jointe et seront proposées par les navigateurs web sous forme de téléchargement.

Exemples d'exportation de métadonnées

Exporter toutes les métadonnées. Attention, la réponse peut être très volumineuse en fonction de la configuration des métadonnées :

/api/metadata

Exporter toutes les métadonnées classées par ordre décroissant en prenant en compte la dernière mise à jour :

/api/metadata?defaultOrder=lastUpdated:desc

Exporter uniquement les métadonnées qui contiennent des indicateurs et des groupes d'indicateurs :

/api/metadata?indicators=true&indicatorGroups=true

Exporter l'identifiant et le nom d'affichage de tous les éléments de données, classés par nom d'affichage :

/api/metadata?dataElements:fields=id,name&dataElements:order=displayName:desc

Exporter les éléments de données et les indicateurs dont le nom commence par "ANC" (CPN en français):

/api/metadata?filter=name:^like:ANC&dataElements=true&indicators=true

Exportation de métadonnées avec des dépendances

Lorsque vous voulez échanger des métadonnées avec un ensemble de données, un programme, une combinaison de catégories, un tableau de bord, un ensemble d'options ou un groupe d'éléments de données, d'une instance DHIS2 à une autre, six points d'extrémité sont disponibles à cet effet :

/api/dataSets/{id}/metadata.json

/api/programs/{id}/metadata.json

/api/categoryCombos/{id}/metadata.json

/api/dashboards/{id}/metadata.json

/api/optionSets/{id}/metadata.json

/api/dataElementGroups/{id}/metadata.json

Ces éléments exportés peuvent ensuite être importés en utilisant ceci /api/metadata.

Ces endpoints prennent également en charge les paramètres suivants :

Export parameters
Nom Options Description
skipSharing (ignorer le partage) faux/vrai L'activation de ce paramètre supprime les propriétés de partage des objets exportés. Il s'agit de utilisateur, accès publique, accès des groupes d'utilisateurs, accès des utilisateurs, et accès externe.
download faux/vrai L'activation de ce paramètre ajoutera l'en-tête HTTP Contenu-Disposition qui spécifie que les données doivent être traitées comme une pièce jointe et seront proposées par les navigateurs web sous forme de téléchargement.

Importation de métadonnées

Cette section décrit l'API d'importation des métadonnées. Les représentations des ressources XML et JSON sont prises en charge. Les métadonnées peuvent être importées à l'aide d'une requête POST.

/api/metadata

L'importateur vous permet d'importer des charges de métadonnées qui peuvent inclure plusieurs entités et un nombre quelconque d'objets par entité. Les éléments de métadonnées exportés via l'API d'exportation de métadonnées peuvent être importés directement.

Le endpoint de l'importation des métadonnées prend en charge une variété de paramètres, énumérés ci-dessous.

Tableau : Paramètres d'importation

Nom Options (la première est la valeur par défaut) Description
Mode d'importation COMMIT, VALIDATE (commiter, valider) Définit le mode d'importation général ; décide s'il faut VALIDER ou COMMITER les métadonnées. Cet paramètre fonctionne de la même manière que la fonction dryRun (essai).
identifiant UID, CODE, AUTO Définit le schéma d'identification à utiliser pour la mise en correspondance des références. Il faut d'abord essayer UID, puis CODE avant de passer à AUTO.
importReportMode ERRORS, FULL, DEBUG (erreurs, plein, débogage) Définit le mode de rapport d'importation ; contrôle ce qui est rapporté après l'importation. ERRORS n'inclut que les rapports d'objets pour les objets qui contiennent des erreurs. FULL renvoie un rapport d'objet pour tous les objets importés, et DEBUG renvoie la même chose en plus d'un nom pour l'objet (si disponible).
preheatMode (mode préchauffage) REFERENCE, ALL, NONE (référence, tous, aucun) Définit le mode de préchauffage ; il est utilisé pour signaler si le préchauffage doit être fait pour TOUS (comme c'était le cas auparavant avec preheatCache=true) ou faire un scan plus intelligent des objets pour voir ce qu'il faut préchauffer (actuellement le paramètre par défaut). Il n'est pas recommandé de le définir sur AUCUN.
importStrategy (stratégie d'importation) CREATE_AND_UPDATE, CREATE, UPDATE, DELETE (créer et mettre à jour, créer, mettre à jour, supprimer) Définit la stratégie d'importation ; CREATE_AND_UPDATE essaiera de trouver une correspondance avec l'identifiant. Si aucune correspondance n'est trouvée, l'objet sera créé.
Mode atomique ALL, NONE (tous, aucun) Définit le mode atomique. Dans l'ancien importateur, nous faisions toujours une importation best effort (mode au mieux), ce qui signifie que même si certaines références n'existaient pas, l'importation se faisait quand même (par exemple, des éléments de données manquants dans un groupe d'éléments de données). Par défaut, le nouvel importateur ne permet pas cela et rejette les erreurs de validation. Définir le mode NONE (aucun) émulait l'ancien fonctionnement.
flushMode (mode de vidage) AUTO, OBJET Définit le mode de vidage, qui contrôle quand vider le cache interne. Il est fortement recommandé de maintenir ce mode sur AUTO (qui est le mode par défaut). N'utilisez OBJECT qu'à des fins de débogage, lorsque vous voyez des exceptions liées à l'hibernation et que vous voulez localiser l'emplacement exact où l'empilement se produit (l'hibernation ne se déclenche qu'au moment du vidage, il peut donc être difficile de savoir quel objet a eu des problèmes).
skipSharing (ignorer le partage) faux, vrai Permet d'ignorer les propriétés de partage, d'éviter la fusion des éléments partagées lors des mises à jour et l'ajout d'un accès à un groupe d'utilisateurs lors de la création de nouveaux objets.
skipValidation (ignorer la validation) faux, vrai Permet d'ignorer la validation lors de l'importation. Ce paramètre n'est pas recommandé : NOT RECOMMENDED.
async faux, vrai Importation asynchrone ; la réponse est renvoyée immédiatement avec un en-tête Emplacement qui pointe vers l'emplacement du rapport d'importation. La charge contient également un objet json de la tâche créée.
userOverrideMode (utiliser le mode de remplacement) NONE, CURRENT, SELECTED (aucun, actuel, sélectionné) Ceci vous permet de remplacer la propriété utilisateur de chaque objet que vous importez. Les options sont NONE (ne rien faire), CURRENT (utiliser l'utilisateur d'importation), SELECTED (sélectionner un utilisateur spécifique en utilisant overrideUser=X).
overrideUser (remplacer l'utilisateur) ID de l'utilisateur Si le mode de remplacement de l'utilisateur (userOverrideMode) est défini sur "SELECTED", utilisez ce paramètre pour sélectionner l'utilisateur avec lequel vous voulez effectuer le remplacement.

REMARQUE Lors de la mise à jour des objets, toutes les valeurs des propriétés seront écrasées même si les nouvelles valeurs sont null. Veuillez utiliser JSON Patch API si vous voulez effectuer une mise à jour partielle d'un objet.

Voici un exemple de charge d'importation de métadonnées. Vous remarquerez que chaque type d'entité possède sa propre propriété avec un tableau d'objets :

{
  "dataElements": [
    {
      "name": "EPI - IPV 3 doses given",
      "shortName": "EPI - IPV 3 doses given",
      "aggregationType": "SUM",
      "domainType": "AGGREGATE",
      "valueType": "INTEGER_ZERO_OR_POSITIVE"
    },
    {
      "name": "EPI - IPV 4 doses given",
      "shortName": "EPI - IPV 4 doses given",
      "aggregationType": "SUM",
      "domainType": "AGGREGATE",
      "valueType": "INTEGER_ZERO_OR_POSITIVE"
    }
  ],
  "indicators": [
    {
      "name": "EPI - ADS stock used",
      "shortName": "ADS stock used",
      "numerator": "#{LTb8XeeqeqI}+#{Fs28ZQJET6V}-#{A3mHIZd2tPg}",
      "numeratorDescription": "ADS 0.05 ml used",
      "denominator": "1",
      "denominatorDescription": "1",
      "annualized": false,
      "indicatorType": {
        "id": "kHy61PbChXr"
      }
    }
  ]
}

Lors de l'envoi de cette charge au endpoint des métadonnées, la réponse contiendra des informations sur les paramètres utilisés lors de l'importation et un récapitulatif par type d'entité, lequel contiendra le nombre d'objets créés, mis à jour, supprimés et ignorés :

{
  "importParams": {
    "userOverrideMode": "NONE",
    "importMode": "COMMIT",
    "identifier": "UID",
    "preheatMode": "REFERENCE",
    "importStrategy": "CREATE_AND_UPDATE",
    "atomicMode": "ALL",
    "flushMode": "AUTO",
    "skipSharing": false,
    "skipTranslation": false,
    "skipValidation": false,
    "metadataSyncImport": false,
    "firstRowIsHeader": true,
    "username": "UNICEF_admin"
  },
  "status": "OK",
  "typeReports": [
    {
      "klass": "org.hisp.dhis.dataelement.DataElement",
      "stats": {
        "created": 2,
        "updated": 0,
        "deleted": 0,
        "ignored": 0,
        "total": 2
      }
    },
    {
      "klass": "org.hisp.dhis.indicator.Indicator",
      "stats": {
        "created": 1,
        "updated": 0,
        "deleted": 0,
        "ignored": 0,
        "total": 1
      }
    }
  ],
  "stats": {
    "created": 3,
    "updated": 0,
    "deleted": 0,
    "ignored": 0,
    "total": 3
  }
}

GeoJSON import

L'importation GeoJSON est utilisée pour relier les données géométriques aux unités d'organisation.

Pour une importation en masse, il faut un fichier GeoJSON avec une collection d'éléments. Chaque élément de la collection a besoin d'une référence à l'unité d'organisation à laquelle il doit être relié.

Par défaut, la géométrie du fichier est stockée en tant que propriété geometry d'une unité d'organisation. Pour stocker des géométries supplémentaires, des attributs de type GEOJSON peuvent être créés. Lorsque des attributs sont utilisés, toutes les géométries d'un fichier sont stockées pour le même attribut qui est fourni avec un paramètre supplémentaire attributeId.

Importation de données en masse avec GeoJSON

Tableau : Paramètres d'importation

Nom Type Par défaut Description
geoJsonId boolean true Si le paramètre est défini sur true, la propriété id des éléments GeoJSON est censée contenir l'identifiant de l'unité d'organisation.
geoJsonProperty String non défini Si geoJsonId est défini sur false, ce paramètre nomme la propriété dans les properties de l'élément GeoJSON qui contient l'identifiant de l'unité d'organisation.
orgUnitProperty enum: [id, code, name] id La propriété de l'unité d'organisation à laquelle se réfèrent les identifiants utilisés dans le fichier GeoJSON.
attributeId String non défini Lorsqu'elle est définie, la géométrie est stockée en tant que valeur de l'attribut référencé par l'ID.
dryRun boolean faux Si le paramètre est défini sur true, l'importation est traitée sans que les unités d'organisation ne soient mis à jour.
async boolean faux Lorsque le paramètre est défini sur true, l'importation est traitée de manière asynchrone.

Uasge:

POST /api/organisationUnits/geometry

Le corps du message est le fichier GeoJSON. Le type de contenu doit être application/json ou application/geo+json. Le fichier peut être compressé en .zip ou .gzip.

Par exemple, un fichier par défaut dans lequel id est utilisé pour faire référence à l'identifiant d'une unité d'organisation a la structure suivante :

{ 
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "id": "O6uvpzGd5pu",
      "geometry": { ... }
    },
    ...
  ]
}

Un fichier dans lequel une propriété d'élément est utilisée pour faire référence au code de l'unité d'organisation devrait avoir la structure suivante :

{ 
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "properties": { "code": "OU1_CODE" },
      "geometry": { ... }
    },
    ...
  ]
}
Les coordonnées d'une géométrie peuvent être des paires ou des triplets. Si une troisième dimension est présente, elle est supprimée lors de l'importation.

Une geometry peut également être null pour effacer ou supprimer efficacement la géométrie pour des unités d'organisation spécifiques. Il existe une API spéciale de suppression en masse ; elle est décrite dans la section suivante.

Lorsqu'elle est exécutée de manière synchrone, un rapport d'importation est renvoyé directement. Le code de statut HTTP est toujours OK, le status dans le message indique si toutes les lignes ont été importées avec succès. Les statistiques sur le nombre de lignes importées, contenues dans le rapport donnent des informations supplémentaires :

  • imported : nombre d'unités d'organisation qui ont été mises à jour avec succès avec une géométrie qui n'en avait pas pour la propriété mise à jour.
  • updated : nombre d'unités d'organisation qui ont été mises à jour avec succès avec une géométrie qui avait déjà une valeur pour la propriété mise à jour.
  • ignored : nombre d'unités d'organisation qui n'ont pas été mises à jour
  • deleted : nombre d'unités d'organisation qui ont été mises à jour avec succès avec une géométrie vide.

Lorsque l'importation est exécutée de manière asynchrone, la requête renvoie immédiatement le statut OK de même que la réponse de configuration de la tâche qui contient une référence relative au point d'extrémité de la tâche qui permet de suivre le statut de l'importation asynchrone. Voici un exemple :

/api/system/tasks/GEOJSON_IMPORT/{job-id}

Le récapitulatif renvoyé directement pour une exécution synchrone est disponible à l'adresse suivante

/api/system/taskSummaries/GEOJSON_IMPORT/{job-id}

dès que l'importation est terminée.

Suppression de données en masse avec GeoJSON

Pour effacer ou désactiver les données geometry pour toutes les unités d'organisation, utilisez :

DELETE /api/organisationUnits/geometry

Pour effacer ou désactiver les données géométriques d'un attribut GEOJSON spécifique pour toutes les unités d'organisation :

DELETE /api/organisationUnits/geometry?attributeId={attr-id}

Le nettoyage se fait toujours de façon synchrone et renvoie un rapport similaire à celui de l'importation en masse. Il ne prend en charge aucun autre paramètre. Aucun essai ne peut être effectué. Pour effectuer un nettoyage en masse, l'utilisateur doit disposer de l'autorité F_PERFORM_MAINTENANCE.

Importation de données uniques avec GeoJSON

L'importation unique permet de mettre à jour la géométrie d'une seule unité d'organisation.

POST /api/organisationUnits/{id}/geometry

Le corps du message ne contient que la valeur GeoJSON geometry, par exemple :

{
  "type": "Polygon",
  "coordinates": [...]
}
L'importation unique ne prend en charge que les paramètres attributeId et dryRun.

Suppression de données uniques avec GeoJSON

Pour effacer les données GeoJSON de la géométrie d'une seule unité d'organisation, utilisez ceci :

DELETE /api/organisationUnits/{id}/geometry

De même, pour effacer une valeur d'attribut GEOJSON pour une seule unité d'organisation, utilisez ceci :

DELETE /api/organisationUnits/{id}/geometry?attributeId={attr-id}

Le nettoyage se fait toujours de manière synchrone et renvoie un rapport similaire à celui d'une importation simple. Le paramètre dry-run est également pris en charge. L'utilisateur qui effectue l'opération doit disposer de l'autorité qui lui permet de modifier l'unité d'organisation cible.

Schéma

Pour effectuer une introspection sur tous les objets DXF 2 disponibles, vous pouvez utiliser une ressource disponible à l'adresse /api/schemas. Pour obtenir des ressources spécifiques, vous pouvez consulter /api/schemas/<type>.

Pour obtenir tous les schémas disponibles au format XML :

GET /api/schemas.xml

Pour obtenir tous les schémas disponibles au format JSON :

GET /api/schemas.json

Pour obtenir le schéma JSON d'une classe spécifique :

GET /api/schemas/dataElement.json

Icônes

DHIS2 dispose d'une collection d'icônes qui peuvent être utilisées pour donner un contexte visuel aux métadonnées. Il existe deux types d'icônes : - Icônes par défaut : elles sont préinstallées dans l'application et ne peuvent ni être modifiées, ni être supprimées. - Icônes personnalisées : elles peuvent être créées, mises à jour et supprimées à volonté.

Ces deux types sont accessibles via la ressource "icônes".

GET /api/icons

Ce point d'extrémité renvoie une liste d'informations sur les icônes par défaut et les icônes personnalisées disponibles. Par défaut, la clé, la description, les mots-clés et la href sont inclus dans la réponse. Mais le paramètre "champs" peut être utilisé pour modifier ce comportement.

{
  key: "mosquito_outline",
  description: "Mosquito outline",
  keywords: [
    "malaria",
    "mosquito",
    "dengue"
  ],
  "created": "2024-02-12T09:50:11.794",
  "lastUpdated": "2024-02-12T09:50:11.794",
  href: "<dhis server>/api/icons/mosquito_outline/icon.svg"
}

Il est également possible d'obtenir directement une icône spécifique en la filtrant par sa clé. Dans l'exemple ci-dessous, la clé est mosquito_outline.

GET /api/icons/mosquito_outline

Opérations sur les icônes personnalisées

Une liste d'icônes personnalisées peut être récupérée sur la base de quelques paramètres de requête.

GET /api/icons?type=CUSTOM
Paramètre de requête Type Valeurs autorisées Description
type Text DEFAULT,CUSTOM,ALL (par défaut, personnalisés, tous) Type d'icônes à récupérer. La valeur par défaut est TOUS
keys Text Liste des clés pour lesquelles des icônes personnalisées doivent être récupérées
keywords Text Liste des mots clés pour lesquelles des icônes personnalisées doivent être récupérées
search Text Recherche d'un texte donné dans les clés et les mots-clés des icônes, et récupération de toutes les icônes qui contiennent ce texte dans leur clé ou leurs mots-clés.
createdStartDate Date Point de départ de la date de création
createdEndDate Date Point final de la date de création
lastUpdatedStartDate Date Point de départ de la dernière date de mise à jour
lastUpdatedEndDate Date Point final de la dernière date de mise à jour

Paramètres de requête pour la pagination

Paramètre de requête Type Valeurs autorisées Description
page Integer Tout entier positif Numéro de page à renvoyer. La valeur par défaut est 1 si rien n'est fourni.
pageSize Integer Tout entier positif Taille de la page. La valeur par défaut est 50.
paging Boolean true|false Indique si la pagination doit être ignorée et si toutes les lignes doivent être renvoyées. La valeur par défaut est true, ce qui signifie que par défaut toutes les requêtes sont paginées, sauf si paging=false (c'est-à-dire si le paramètre "pagination" est défini sur "faux")

Paramètres de requête pour la mise en ordre{ #request-parameters-for-ordering }

Paramètre de requête Type Valeurs autorisées Description
order Text created:desc Liste de paires de noms de propriétés et de directions de tri séparées par des virgules, au format propName:sortDirection. Par défaut, les icônes sont ordonnées comme suit : key:asc

Paramètre de requête pour filtrer les réponses

Les points d'extrémité acceptent un paramètre fields qui contrôle les champs qui seront renvoyés dans la réponse JSON. Le paramètre fields accepte une liste de noms de champs séparés par des virgules. Si rien n'est spécifié, les champs par défaut seront utilisés. Il s'agit de

key,keywords,description,fileResourceUid,createdByUserUid,href (clé, mots-clés, description, uid de la ressource du fichier, uid de la création par l'utilisateur, href)

Vous pouvez télécharger une ressource d'icône personnalisée en fournissant la clé d'icône suivante :

GET /api/icons/{key}/icon

Des icônes personnalisées peuvent être créées, modifiées et supprimées. Pour créer une icône personnalisée, utilisez la ressource ci-dessous.

POST /api/icons

Elle attend une charge contenant la clé de l'icône, la description, la liste des mots-clés et l'identifiant de la ressource du fichier à relier aux données.

{
    "key": "iconKey",
    "description": "description",
    "keywords": ["keyword 1","keyword 2"],
    "fileResourceUid": "ARsqBjfB2cf"
}

Seules les icônes personnalisées peuvent être mises à jour à l'aide de la ressource ci-dessous.

PUT /api/icons

La charge suivante permet de mettre à jour la description et les mots-clés de l'icône.

{
    "key": "iconKey",
    "description": "new description",
    "keywords": ["new keyword 1", "new keyword 2"] 
}

Il est également possible de ne mettre à jour qu'un seul des deux éléments. Cela signifie que si nous voulons mettre à jour la description tout en gardant les mots-clés tels qu'ils sont, nous n'aurons qu'à fournir la clé de l'icône et le champ json de la description. Le même procédé s'applique dans l'autre sens, si nous voulons mettre à jour les mots-clés et laisser la description initiale intacte.

Seules les icônes personnalisées peuvent être supprimées à l'aide de la ressource ci-dessous.

DELETE /api/icons/{icon_key}

Type de rendu

Certains types de métadonnées ont une propriété appelée renderType (type de rendu). Cette propriété établit une correspondance entre un appareil et un renderingType. Les applications peuvent utiliser ces informations pour savoir comment l'objet doit être rendu sur un appareil spécifique. Par exemple, le rendu d'un élément de données sur un appareil mobile peut être différent de celui d'un ordinateur de bureau.

Il existe actuellement deux types de rendu :

  1. Rendu de type "valeur"

  2. Rendu des sections d'étape de programme

Il existe également deux types d'appareils :

  1. MOBILE

  2. DESKTOP

Le tableau suivant énumère les métadonnées et les types de rendu disponibles. Le rendu de type valeur a des contraintes supplémentaires basées sur la configuration des métadonnées. Elles seront présentées dans un second tableau.

Tableau : Aperçu des métadonnées et des types de restitution

Type de métadonnées Types de restitution disponibles
Section des étapes de programme * LISTING (ou liste, par défaut)
* SEQUENTIAL (séquentiel)
* MATRIX (matrice)
Élément de données * DEFAULT
* DROPDOWN
* VERTICAL_RADIOBUTTONS
* HORIZONTAL_RADIOBUTTONS
* VERTICAL_CHECKBOXES
* HORIZONTAL_CHECKBOXES
* SHARED_HEADER_RADIOBUTTONS
* ICONS_AS_BUTTONS
* SPINNER
* ICON
* TOGGLE
* VALUE
* SLIDER
* LINEAR_SCALE
* AUTOCOMPLETE
* QR_CODE
* BAR_CODE
* GS1_DATAMATRIX

Étant donné que la gestion du rendu par défaut des éléments de données et des attributs d'entités suivies dépend du type de valeur de l'objet, il existe également un type DEFAULT qui permet d'indiquer au client qu'il doit être géré normalement. La section des étapes de programme est définie sur LISTING par défaut.

Tableau : Types de restitution autorisés en fonction des types de valeurs

Type de valeur L'objet est-il un ensemble d'options ? Types de restitution autorisés
TRUE_ONLY (vrai uniquement) Non DEFAULT, VERTICAL_RADIOBUTTONS, HORIZONTAL_RADIOBUTTONS, VERTICAL_CHECKBOXES, HORIZONTAL_CHECKBOXES, TOGGLE
BOOLEAN Non
- Oui DEFAULT, DROPDOWN, VERTICAL_RADIOBUTTONS, HORIZONTAL_RADIOBUTTONS, VERTICAL_CHECKBOXES, HORIZONTAL_CHECKBOXES, SHARED_HEADER_RADIOBUTTONS, ICONS_AS_BUTTONS, SPINNER, ICON
INTEGER Non DEFAULT, VALUE, SLIDER, LINEAR_SCALE, SPINNER
TEXT Non DEFAULT, VALUE, AUTOCOMPLETE, QR_CODE, BAR_CODE, GS1_DATAMATRIX
INTEGER_POSITIVE Non
INTEGER_NEGATIVE Non
INTEGER_ZERO_OR_POSITIVE Non
NUMBER Non
UNIT_INTERVAL Non
PERCENTAGE Non

Vous pouvez également récupérer une référence complète du tableau précédent en utilisant le point d'extrémité suivant :

GET /api/staticConfiguration/renderingOptions

Quelques propriétés supplémentaires peuvent être définies pour le rendu du type de valeur, ce qui est souvent nécessaire lors du rendu de certains types spécifiques :

Tableau : propriétés de l'objet renderType

Propriété Description Type
type Le type de restitution de l'objet, tel qu'indiqué dans le premier tableau. Cette propriété est la même pour le type de valeur et la section des étapes de programme, mais c'est la seule propriété disponible pour la section des étapes de programme. Énumération (voir la liste dans le tableau des métadonnées et des types de restitution)
min Uniquement pour la restitution du type de valeur ; elle représente la valeur minimale que ce champ peut avoir. Entier
max Uniquement pour la restitution du type de valeur ; elle représente la valeur maximale que ce champ peut avoir. Entier
étape Uniquement pour la restitution de type valeur ; elle représente la taille des étapes que la valeur doit augmenter, par exemple pour SLIDER ou LINEAR_SCALE. Entier
points décimaux Uniquement pour la restitution du type de valeur ; elle représente le nombre de points décimaux que la valeur doit utiliser. Entier

Le type de rendu peut être défini lors de la création ou de la mise à jour des métadonnées énumérées dans le premier tableau. Voici un exemple de charge pour le type de rendu de la section des étapes de programme :

{
  "renderingType": {
    "type": "MATRIX"
  }
}

Pour les éléments de données et les attributs d'entités suivies :

{
  "renderingType": {
    "type": "SLIDER",
    "min": 0,
    "max": 1000,
    "step": 50,
    "decimalPoints": 0
  }
}

Style d'objet

La plupart des métadonnées ont une propriété "style". Cette propriété peut être utilisée par les clients pour représenter l'objet d'une certaine manière. Les propriétés actuellement prises en charge par le style sont les suivantes :

Tableau : Propriétés du style

Propriété Description Type
couleur Une couleur, représentée par une valeur hexadécimale. Chaîne (#000000)
icône Une icône, représentée par un nom d'icône. Chaîne

Actuellement, il n'existe pas de liste officielle ni de bibliothèques d'icônes. Il revient donc au client de les fournir. La liste suivante présente tous les objets qui prennent en charge le style :

  • Élément de données

  • Option de catégorie d'éléments de données

  • Ensemble de données

  • Indicateur

  • Option

  • Programme

  • Indicateur du programme

  • Section du programme

  • Étape du programme

  • Section des étapes de programme

  • Relation (Tracker)

  • Attribut d’entité suivie

  • Type d'entité suivie

Lors de la création ou de la mise à jour de l'un de ces objets, vous pouvez inclure la charge suivante pour modifier le style :

{
  "style": {
    "color": "#ffffff",
    "icon": "my-beautiful-icon"
  }
}

Category

Merge categories

The category merge endpoint allows you to merge a number of categories (sources) into a target category.

Note

Categories can only be merged when:

  1. they have identical category options
  2. source and target categories do not share category combos
  3. source categories do not share category combos with each other

These constraints ensure only duplicate Categories can be merged, and it helps to keep system integrity.

Autorisation

The main authority required to perform a category merge is F_CATEGORY_MERGE.

Requête

Merge categories with a POST request:

POST /api/categories/merge

La charge au format JSON ressemble à ceci :

{
  "sources": [
    "FbLZS3ueWbQ",
    "dPSWsKeAZNw"
  ],
  "target": "rEq3Hkd3XXH",
  "deleteSources": true
}

Les propriétés JSON sont décrites dans le tableau suivant.

Tableau : Fusion des champs de la charge

Champ Obligatoire Valeur
sources Oui Array of identifiers of the categories to merge (the source categories)
cible Oui Identifier of the category to merge the sources into (the target category)
deleteSources Non Whether to delete the source categories after the operation. Default is false.

The merge operation will merge the source categories into the target category. One or many source categories can be specified. Only one target should be specified.

The merge operation will transfer all source category metadata associations to the target category. The following metadata get updated:

Métadonnées Propriété Mesure prise
CategoryOption categories remove sources
CategoryCombo categories remove sources, add target
CategoryDimension dimension replace source with target
Utilisateur catDimensionConstraints - User has one or more sources and target -> delete all source constraints
- User has one or more sources, no target -> update one source to target, delete other source constraints

Validation

Les contraintes et les codes d'erreur suivants s'appliquent.

Tableau : Contraintes et codes d'erreur

Code d'erreur Description
E1530 At least one source Category must be specified
E1531 Target Category must be specified
E1532 Target Category cannot be a source category
E1533 Source/Target Category does not exist: {uid}
E1535 Source CategoryOptions do not match target CategoryOptions
E1536 Source and target Categories cannot share a CategoryCombo
E1537 Source Categories cannot share a CategoryCombo

Réponse

Succès

Voici un exemple de réponse après une opération réussie :

{
    "httpStatus": "OK",
    "httpStatusCode": 200,
    "status": "OK",
    "response": {
        "mergeReport": {
            "mergeErrors": [],
            "mergeType": "Category",
            "sourcesDeleted": [
                "FbLZS3ueWbQ", "dPSWsKeAZNw"
            ],
            "message": "Category merge complete"
        }
    }
}
Failure

Voici un exemple de réponse après une opération erronée :

{
    "httpStatus": "Conflict",
    "httpStatusCode": 409,
    "status": "WARNING",
    "message": "One or more errors occurred, please see full details in merge report.",
    "response": {
        "mergeReport": {
            "mergeErrors": [
                {
                    "message": "At least one source Category must be specified",
                    "errorCode": "E1530",
                    "args": []
                },
                {
                    "message": "Target Category does not exist: `abcdefg1221`",
                    "errorCode": "E1533",
                    "args": [
                        "Target",
                        "abcdefg1221"
                    ]
                }
            ],
            "mergeType": "Category",
            "sourcesDeleted": [],
            "message": "Category merge has errors"
        }
    }
}

Category Option

Merge category options

The category option merge endpoint allows you to merge a number of category options (sources) into a target category option.

Autorisation

The main authority required to perform a category option merge is F_CATEGORY_OPTION_MERGE.
Other authorities required relate to the general sharing and access of category options, F_CATEGORY_OPTION_PUBLIC_ADD and F_CATEGORY_OPTION_DELETE.

Requête

Merge category options with a POST request:

POST /api/categoryOptions/merge

La charge au format JSON ressemble à ceci :

{
  "sources": [
    "FbLZS3ueWbQ",
    "dPSWsKeAZNw"
  ],
  "target": "rEq3Hkd3XXH",
  "deleteSources": true
}

Les propriétés JSON sont décrites dans le tableau suivant.

Tableau : Fusion des champs de la charge

Champ Obligatoire Valeur
sources Oui Array of identifiers of the category options to merge (the source category options)
cible Oui Identifier of the category option to merge the sources into (the target category option)
deleteSources Non Whether to delete the source category options after the operation. Default is false.

The merge operation will merge the source category options into the target category option. One or many source category options can be specified. Only one target should be specified.

The merge operation will transfer all source category option metadata associations to the target category option. The following metadata get updated:

Métadonnées Propriété Mesure prise
Catégorie categoryOptions remove sources, add target
CategoryDimension items remove sources, add target
CategoryOptionCombo categoryOptions remove sources, add target
CategoryOptionGroup membres remove sources, add target
Unité d'organisation categoryOptions remove sources, add target

Validation

Les contraintes et les codes d'erreur suivants s'appliquent.

Tableau : Contraintes et codes d'erreur

Code d'erreur Description
E1530 At least one source CategoryOption must be specified
E1531 Target CategoryOption must be specified
E1532 Target CategoryOption cannot be a source category option
E1533 Source/Target CategoryOption does not exist: {uid}

Réponse

Succès

Voici un exemple de réponse après une opération réussie :

{
    "httpStatus": "OK",
    "httpStatusCode": 200,
    "status": "OK",
    "response": {
        "mergeReport": {
            "mergeErrors": [],
            "mergeType": "CategoryOption",
            "sourcesDeleted": [
                "FbLZS3ueWbQ", "dPSWsKeAZNw"
            ],
            "message": "CategoryOption merge complete"
        }
    }
}
Failure

Voici un exemple de réponse après une opération erronée :

{
    "httpStatus": "Conflict",
    "httpStatusCode": 409,
    "status": "WARNING",
    "message": "One or more errors occurred, please see full details in merge report.",
    "response": {
        "mergeReport": {
            "mergeErrors": [
                {
                    "message": "At least one source CategoryOption must be specified",
                    "errorCode": "E1530",
                    "args": []
                },
                {
                    "message": "Target CategoryOption does not exist: `abcdefg1221`",
                    "errorCode": "E1533",
                    "args": [
                        "Target",
                        "abcdefg1221"
                    ]
                }
            ],
            "mergeType": "CategoryOption",
            "sourcesDeleted": [],
            "message": "CategoryOption merge has errors"
        }
    }
}

Category Option Combo

Import Validation

CategoryOptionCombos are unique in that they are auto-generated by the system, most of the time (imports are allowed with specific expectations, mentioned below). They are generated based on their category model:
- CategoryOption - Category (has category options) - CategoryCombo (has categories)

There will be a CategoryOptionCombo created for each combination of Category CategoryOption.

Generated CategoryOptionCombo Example

  • There is 1 CategoryCombo [CC1]
  • CC1 has 2 Categories CC1=[C1, C2]
  • Each Category has 2 CategoryOptions C1=[CO1, CO2], C2=[CO3, CO4]
  • The Generated CategoryOptionCombos from this category model would produce 4 CategoryOptionCombos:
  • COC1=[CO1, CO3]
  • COC2=[CO1, CO4]
  • COC3=[CO2, CO3]
  • COC4=[CO2, CO4]

This is important to understand when trying to import CategoryOptionCombos. Validation is performed when importing CategoryOptionCombos to ensure that the provided set of CategoryOptionCombos matches the expected generated set of CategoryOptionCombos. This is to ensure no invalid state/relationships can enter the system, which prevent all sorts of issues (orphaned data, hidden relationships in the DB not exposed in the API etc.).

Note

This validation is performed using the UIDs of the CategoryOptionCombos. No other idScheme is supported.

Merge category option combos

The category option combo merge endpoint allows you to merge a number of category options (sources) into a target category option. This can be used to clean up the system, removing duplicates for instance.

Note

Only duplicate category option combos can be merged. There's more info about this in the validation section below.

Autorisation

The main authority required to perform a category option combo merge is F_CATEGORY_OPTION_COMBO_MERGE.

Requête

Merge category option combos with a POST request:

POST /api/categoryOptionCombos/merge

La charge au format JSON ressemble à ceci :

{
  "sources": [
    "FbLZS3ueWbQ",
    "dPSWsKeAZNw"
  ],
  "target": "rEq3Hkd3XXH",
  "dataMergeStrategy": "DISCARD"
}

Les propriétés JSON sont décrites dans le tableau suivant.

Tableau : Fusion des champs de la charge

Champ Obligatoire Valeur
sources Oui Array of identifiers of the category option combos to merge (the source category option combos)
cible Oui Identifier of the category option combo to merge the sources into (the target category option combo)
dataMergeStrategy Oui How to handle merging of data values. Options are 'DISCARD' or 'LAST_UPDATED'. DISCARD will delete all source data values. LAST_UPDATED will merge all data values and use the last updated value where duplicates are met.

The merge operation will merge the source category option combos into the target category option combo. One or many source category option combos can be specified. Only one target should be specified.

The merge operation will transfer all source category option combo metadata associations to the target category option combo.

Note

All source category option combos will always be deleted during a merge. The is because after all source references have been handled, empty category option combos are left. These are not seen as valid by the system.

The following metadata get updated:

Métadonnées Propriété Mesure prise
CategoryOption categoryOptionCombos remove sources
CategoryCombo optionCombos remove sources
DataElementOperand categoryOptionCombo set as target
DataDimensionItem dataelementoperand_categoryoptioncomboid set as target
Expression expression replace source with target
Indicateur numérateur replace source with target
Indicateur dénominateur replace source with target
MinMaxDataElement Combinaison d'options set as target
Prédicteur outputCombo set as target
SMSCode optionId set as target
Données Propriété Mesure prise
DataValue categoryOptionCombo merge strategy (DISCARD or LAST_UPDATED)
DataValue attributeOptionCombo (combinaison d'options d'attribut) merge strategy (DISCARD or LAST_UPDATED)
DataApproval attributeOptionCombo (combinaison d'options d'attribut) merge strategy (DISCARD or LAST_UPDATED)
DataApprovalAudit attributeOptionCombo (combinaison d'options d'attribut) DISCARD or leave depending if sources are deleted or not
Événement attributeOptionCombo (combinaison d'options d'attribut) merge strategy (DISCARD or LAST_UPDATED)
DataValueAudit categoryOptionCombo DISCARD or leave depending if sources are deleted or not
DataValueAudit attributeOptionCombo (combinaison d'options d'attribut) DISCARD or leave depending if sources are deleted or not
CompleteDataSetRegistration attributeOptionCombo (combinaison d'options d'attribut) merge strategy (DISCARD or LAST_UPDATED)

Note

The following properties haven been purposely excluded from the merge as these may use references for external systems. If you encounter issues with these fields, they may need to be updated.

Indicator: aggregateExportCategoryOptionCombo & aggregateExportAttributeOptionCombo

ProgramIndicator: aggregateExportCategoryOptionCombo & aggregateExportAttributeOptionCombo

Validation

The following constraints and error codes apply. One of the main validation points is regarding duplicate CategoryOptionCombos. A duplicate CategoryOptionCombo is one which satisfies the criteria: - has the same CategoryCombo - has the same CategoryOptions - has a different UID

Tableau : Contraintes et codes d'erreur

Code d'erreur Description
E1530 At least one source CategoryOptionCombo must be specified
E1531 Target CategoryOptionCombo must be specified
E1532 Target CategoryOptionCombo cannot be a source CategoryOptionCombo
E1533 Source/Target CategoryOptionCombo does not exist: {uid}
E1534 dataMergeStrategy field must be specified. With value DISCARD or LAST_UPDATED
E1540 CategoryOptionCombos must be duplicates (same cat combo, same cat options, different UID) in order to merge

Database constraints

There are unique constraints in place that can prevent a successful merge. These constraints are set by DHIS2 in order to maintain a logical domain model.
Below are a list of the known database unique key constraints at the time of writing. For example, you can only have 1 min max data element with the same org unit, data element and category option combo.

Database table unique key constraints
Tableau Unique key constraint
minmaxdataelement orgunit, dataelement, categoryoptioncombo

Réponse

Succès

Voici un exemple de réponse après une opération réussie :

{
    "httpStatus": "OK",
    "httpStatusCode": 200,
    "status": "OK",
    "response": {
        "mergeReport": {
            "mergeErrors": [],
            "mergeType": "CategoryOptionCombo",
            "sourcesDeleted": [
                "FbLZS3ueWbQ", "dPSWsKeAZNw"
            ],
            "message": "CategoryOptionCombo merge complete"
        }
    }
}
Failure

Voici un exemple de réponse après une opération erronée :

{
    "httpStatus": "Conflict",
    "httpStatusCode": 409,
    "status": "WARNING",
    "message": "One or more errors occurred, please see full details in merge report.",
    "response": {
        "mergeReport": {
            "mergeErrors": [
                {
                    "message": "At least one source CategoryOptionCombo must be specified",
                    "errorCode": "E1530",
                    "args": []
                },
                {
                    "message": "Target CategoryOptionCombo does not exist: `abcdefg1221`",
                    "errorCode": "E1533",
                    "args": [
                        "Target",
                        "abcdefg1221"
                    ]
                }
            ],
            "mergeType": "CategoryOptionCombo",
            "sourcesDeleted": [],
            "message": "CategoryOptionCombo merge has errors"
        }
    }
}

A database constraint sample error response:

{
  "httpStatus": "Conflict",
  "httpStatusCode": 409,
  "status": "ERROR",
  "message": "ERROR: duplicate key value violates unique constraint \"minmaxdataelement_unique_key\"\n  Detail: Key (sourceid, dataelementid, categoryoptioncomboid)=(193236, 1148617, 167661) already exists."
}

Category Combo

Merge category combos

The category combo merge endpoint allows you to merge a number of category combos (sources) into a target category combo.

Note

Category combos can only be merged when:

  1. source and target category combos have identical categories
  2. all category option combos belonging to the involved category combos are valid (correct number of options, valid option membership)
  3. no pre-existing duplicate category option combos exist within the involved category combos

These constraints ensure only equivalent category combos can be merged and help maintain system integrity.

Warning

A category combo merge will result in duplicate category option combos. These should be merged immediately after the category combo merge to maintain system integrity. Duplicates can be found using the data integrity check category_option_combos_have_duplicates.

Autorisation

The main authority required to perform a category combo merge is F_CATEGORY_COMBO_MERGE.

Requête

Merge category combos with a POST request:

POST /api/categoryCombos/merge

La charge au format JSON ressemble à ceci :

{
  "sources": [
    "FbLZS3ueWbQ",
    "dPSWsKeAZNw"
  ],
  "target": "rEq3Hkd3XXH",
  "deleteSources": true
}

Les propriétés JSON sont décrites dans le tableau suivant.

Tableau : Fusion des champs de la charge

Champ Obligatoire Valeur
sources Oui Array of identifiers of the category combos to merge (the source category combos)
cible Oui Identifier of the category combo to merge the sources into (the target category combo)
deleteSources Non Whether to delete the source category combos after the operation. Default is false.

The merge operation will merge the source category combos into the target category combo. One or many source category combos can be specified. Only one target should be specified.

The merge operation will transfer all source category combo metadata associations to the target category combo. The following metadata get updated:

Métadonnées Propriété Mesure prise
Catégorie categoryCombos remove sources
CategoryOptionCombo categoryCombo set as target
DataElement categoryCombo set as target
DataSetElement categoryCombo set as target
Ensemble de données categoryCombo set as target
Programme categoryCombo set as target
Programme enrollmentCategoryCombo set as target
ProgramIndicator categoryCombo set as target
ProgramIndicator attributeCategoryCombo set as target
DataApprovalWorkflow categoryCombo set as target

Validation

Les contraintes et les codes d'erreur suivants s'appliquent.

Tableau : Contraintes et codes d'erreur

Code d'erreur Description
E1530 At least one source CategoryCombo must be specified
E1531 Target CategoryCombo must be specified
E1532 Target CategoryCombo cannot be a source CategoryCombo
E1533 Source/Target CategoryCombo does not exist: {uid}
E1545 Source and target CategoryCombos must have identical Categories: source {uid} has {categories}
E1546 CategoryOptionCombo has incorrect number of CategoryOptions. Expected {n} but found {m} for COC: {uid}
E1547 CategoryOptionCombo has CategoryOptions that are not valid for the CategoryCombo categories: {uid}
E1548 Duplicate CategoryOptionCombo {uid} found for CategoryCombo {uid}. Fix this before attempting the merge.

Réponse

Succès

Voici un exemple de réponse après une opération réussie :

{
    "httpStatus": "OK",
    "httpStatusCode": 200,
    "status": "OK",
    "response": {
        "mergeReport": {
            "mergeErrors": [],
            "mergeType": "CategoryCombo",
            "sourcesDeleted": [
                "FbLZS3ueWbQ", "dPSWsKeAZNw"
            ],
            "message": "CategoryCombo merge complete. There will be duplicate CategoryOptionCombos as a result of the merge. These should be merged immediately to help keep system integrity. Duplicates can be found using the data integrity check `category_option_combos_have_duplicates`"
        }
    }
}
Failure

Voici un exemple de réponse après une opération erronée :

{
    "httpStatus": "Conflict",
    "httpStatusCode": 409,
    "status": "WARNING",
    "message": "One or more errors occurred, please see full details in merge report.",
    "response": {
        "mergeReport": {
            "mergeErrors": [
                {
                    "message": "At least one source CategoryCombo must be specified",
                    "errorCode": "E1530",
                    "args": []
                },
                {
                    "message": "Target CategoryCombo does not exist: `abcdefg1221`",
                    "errorCode": "E1533",
                    "args": [
                        "Target",
                        "abcdefg1221"
                    ]
                }
            ],
            "mergeType": "CategoryCombo",
            "sourcesDeleted": [],
            "message": "CategoryCombo merge has errors"
        }
    }
}

Éléments de données

Merge data elements

Caution

Merging DataElements should be carried out with the utmost care. Particular attention should be given to the merging of data values that have data element references involved in the merge. Knowing the potential side effects of a merge should be fully understood before performing the merge. The merging of DataElements has far-reaching effects. The information below will try to help show what's involved in a DataElement merge. A DataElement merge touches all the major parts of the system (metadata, data, tracker, analytics and audit).

System performance may be impacted if the source DataElements are linked to large amounts of Data/Audit records particularly.

The data element merge endpoint allows you to merge a number of data elements (sources) into a target data element.

Autorisation

The main authority required to perform a data element merge is F_DATA_ELEMENT_MERGE.
Other authorities required relate to the general sharing and access of data elements, F_DATAELEMENT_PUBLIC_ADD and F_DATAELEMENT_DELETE.

Requête

Merge data elements with a POST request:

POST /api/dataElements/merge

La charge au format JSON ressemble à ceci :

{
  "sources": [
    "jNb63DIHuwU",
    "WAjjFMDJKcx"
  ],
  "target": "V9rfpjwHbYg",
  "deleteSources": true,
  "dataMergeStrategy": "DISCARD"
}

Les propriétés JSON sont décrites dans le tableau suivant.

Tableau : Fusion des champs de la charge

Champ Obligatoire Valeur
sources Oui Array of identifiers of the data elements to merge (the source data elements)
cible Oui Identifier of the data element to merge the sources into (the target data element)
deleteSources Non Whether to delete the source data elements after the operation. Default is false. If true is chosen, then all source audit records will also be deleted.
dataMergeStrategy Oui How to handle merging of data values. Options are 'DISCARD' or 'LAST_UPDATED'. DISCARD will delete all source data values. LAST_UPDATED will merge all data values and use the last updated value where duplicates are met.

The merge operation will merge the source data elements into the target data element. One or many source data elements can be specified. Only one target should be specified.

The merge operation will transfer all source data element metadata associations to the target data element. The following metadata get updated:

Métadonnées Propriété Mesure prise
DataDimensionItem dataElement set to target
EventVisualization dataElementValueDimension set to target
ProgramStageDataElement dataElement set to target
Modèle de notification de programme recipientDataElement set to target
Variable de règle de programme dataElement set to target
Action de règle de programme dataElement set to target
TrackedEntityDataElementDimension dataElement set to target
MinMaxDataElement dataElement set to target
SMSCode dataElement set to target
SMSCode dataElement set to target
Prédicteur output set to target
DataSetElement dataElement set to target
DataElementOperand dataElement set to target
ProgramStageDataElement dataElements remove sources, add target
Section dataElements remove sources, add target
Groupe d'Eléments de Données membres remove sources, add target
Événement eventDataValues remove sources, add target
Indicateur numérateur replace source with target
Indicateur dénominateur replace source with target
Prédicteur generator replace source with target
Prédicteur sampleSkipTest replace source with target
Formulaire de saisie de données code html replace source with target
ProgramIndicator expression replace source with target
ProgramIndicator filter replace source with target
DataValue dataElement
Données Propriété Mesure prise
Événement eventDataValues action based on merge strategy (DISCARD / LAST_UPDATED). DISCARD will delete all source event data values. LAST_UPDATED will use the event data value which was last updated, when more than one exists.
DataValue dataElement action based on merge strategy (DISCARD / LAST_UPDATED). DISCARD will delete all source data values. LAST_UPDATED will use the data value which was last updated, when more than one exists.
TrackedEntityDataValueChangeLog deleted if sources are being deleted, otherwise no action.
DataValueAudit deleted if sources are being deleted, otherwise no action.

Validation

Les contraintes et les codes d'erreur suivants s'appliquent.

Tableau : Contraintes et codes d'erreur

Code d'erreur Description
E1530 At least one source DataElement must be specified
E1531 Target DataElement must be specified
E1532 Target DataElement cannot be a source indicator
E1533 Source/Target DataElement does not exist: {uid}
E1550 All source ValueTypes must match target ValueType: ValueType. Other ValueTypes found: ValueType
E1551 All source DataElementDomains must match target DataElementDomain: DataElementDomain. Other DataElementDomains found: DataElementDomain
E1534 dataMergeStrategy field must be specified. With value DISCARD or LAST_UPDATED

Database constraints

There are unique constraints in place that can prevent a successful merge. These constraints are set by DHIS2 in order to maintain a logical domain model.
Below are a list of the known database unique key constraints at the time of writing. For example, you can only have 1 data set element with the same dataset and data element.

Database table unique key constraints
Tableau Unique key constraint
minmaxdataelement orgunit, dataelement, categoryoptioncombo
programstagedataelement programstage, dataelement
datasetelement dataset, dataelement

Réponse

Succès

Voici un exemple de réponse après une opération réussie :

{
    "httpStatus": "OK",
    "httpStatusCode": 200,
    "status": "OK",
    "response": {
        "mergeReport": {
            "mergeErrors": [],
            "mergeType": "DataElement",
            "sourcesDeleted": [
                "vQ0dGV9EDrw"
            ],
            "message": "DataElement merge complete"
        }
    }
}
Failure

Voici un exemple de réponse après une opération erronée :

{
    "httpStatus": "Conflict",
    "httpStatusCode": 409,
    "status": "WARNING",
    "message": "One or more errors occurred, please see full details in merge report.",
    "response": {
        "mergeReport": {
            "mergeErrors": [
                {
                    "message": "At least one source DataElement must be specified",
                    "errorCode": "E1530",
                    "args": []
                },
                {
                    "message": "Target DataElement does not exist: `abcdefg1221`",
                    "errorCode": "E1533",
                    "args": [
                        "Target",
                        "abcdefg1221"
                    ]
                }
            ],
            "mergeType": "DataElement",
            "sourcesDeleted": [],
            "message": "DataElement merge has errors"
        }
    }
}

Another sample validation error response:

{
    "httpStatus": "Conflict",
    "httpStatusCode": 409,
    "status": "WARNING",
    "message": "One or more errors occurred, please see full details in merge report.",
    "response": {
        "mergeReport": {
            "mergeErrors": [
                {
                    "message": "All source ValueTypes must match target ValueType: `TEXT`. Other ValueTypes found: `NUMBER`",
                    "errorCode": "E1550",
                    "args": []
                }
            ],
            "mergeType": "DataElement",
            "sourcesDeleted": [],
            "message": "DataElement merge has errors"
        }
    }
}

A database constraint sample error response:

{
  "httpStatus": "Conflict",
  "httpStatusCode": 409,
  "status": "ERROR",
  "message": "ERROR: duplicate key value violates unique constraint \"minmaxdataelement_unique_key\"\n  Detail: Key (sourceid, dataelementid, categoryoptioncomboid)=(193236, 1148617, 167661) already exists."
}

Indicateurs

Cette section décrit les indicateurs et les expressions d'indicateurs.

Indicateurs agrégés

Pour récupérer les indicateurs, vous pouvez lancer une requête GET à la ressource des indicateurs comme suit :

/api/indicators

Les indicateurs représentent des expressions qui peuvent être calculées et présentées sous forme de résultat. Les expressions des indicateurs sont divisées en un numérateur et un dénominateur. Les numérateurs et les dénominateurs sont des expressions mathématiques qui peuvent contenir des références à des éléments de données, à d'autres indicateurs, à des constantes et à des groupes d'unités d'organisation. Les variables seront remplacées par des valeurs de données lorsqu'elles seront utilisées, par exemple dans des rapports. Les variables autorisées dans les expressions sont décrites dans le tableau suivant.

Tableau : Variables d'indicateurs

Variable Objet Description
#{<data-element-id>.<category-option-combo-id>.<attribute-option-combo-id>} Opérande de l'élément de données Fait référence à la combinaison d'un élément de données agrégé et d'une combinaison d'options de catégorie. Les identifiants des combinaisons d'options de catégorie et d'attribut sont facultatifs et le symbole "*" peut être utilisé pour indiquer n'importe quelle valeur.
#{<dataelement-id>.<category-option-group-id>.<attribute-option-combo-id>} Groupe d'options de catégorie Fait référence à un élément de données agrégé et à un groupe d'options de catégorie, qui contient plusieurs combinaisons d'options de catégorie.
#{<data-element-id>} Élément de données agrégé Fait référence à la valeur totale d'un élément de données agrégé pour toutes les combinaisons d'options de catégorie.
D{<program-id>.<data-element-id>} Élément de données de programme Fait référence à la valeur d'un élément de données Tracker au sein d'un programme.
A{<program-id>.<attribute-id>} Attribut d'entité suivie d'un programme Fait référence à la valeur d'un attribut d'entité suivie au sein d'un programme.
I{<program-indicator-id>} Indicateur de programme Fait référence à la valeur d'un indicateur de programme.
R{<dataset-id>.<metric>} Taux de déclaration Fait référence à une mesure de taux de déclaration. La mesure peut être REPORTING_RATE (taux de déclaration), REPORTING_RATE_ON_TIME (taux de déclarations à temps), ACTUAL_REPORTS (rapports effectifs), ACTUAL_REPORTS_ON_TIME (rapports envoyés à temps), EXPECTED_REPORTS (rapports attendus).
C{<constant-id>} Constant Fait référence à une valeur constante.
N{<indicator-id>} Indicateur Fait référence à un indicateur existant.
OUG{<orgunitgroup-id>} Groupe d'unités d'organisation Fait référence au nombre d'unités d'organisation présentes dans un groupe d'unités d'organisation.

Dans un opérande d'élément de données ou dans un élément de données agrégé, les substitutions suivantes peuvent être effectuées :

Élément Valeur Description
data-element-id data-element-id Un élément de données agrégé
data-element-id deGroup:data-element-group-id Tous les éléments de données agrégés d'un groupe d'éléments de données
category-option-combo-id category-option-combo-id Une combinaison d'options de catégorie
category-option-combo-id co:category-option-id Toutes les combinaisons d'options de catégorie dans une option de catégorie
category-option-combo-id coGroup:category-option-group-id Toutes les combinaisons d'options de catégorie dans un groupe d'options de catégorie
category-option-combo-id coGroup:co-group-id1&co-group-id2... Toutes les combinaisons d'options de catégorie qui font partie de plusieurs groupes d'options de catégorie

La syntaxe ressemble à ceci :

#{<dataelement-id>.<catoptcombo-id>} + C{<constant-id>} + OUG{<orgunitgroup-id>}

Voici un exemple correspondant :

#{P3jJH5Tu5VC.S34ULMcHMca} + C{Gfd3ppDfq8E} + OUG{CXw2yu5fodb}

Pour les variables d'éléments de données, l'identifiant de la combinaison d'options de catégorie peut être omis. La variable va alors représenter le total pour l'élément de données, par exemple pour toutes les combinaisons d'options de catégorie. Exemple :

#{P3jJH5Tu5VC} + 2

Les opérandes des éléments de données peuvent inclure toute combinaison d'options de catégorie et toute combinaison d'options d'attributs. Elles peuvent également utiliser des caractères génériques pour indiquer n'importe quelle valeur :

#{P3jJH5Tu5VC.S34ULMcHMca} + #{P3jJH5Tu5VC.*.j8vBiBqGf6O} + #{P3jJH5Tu5VC.S34ULMcHMca.*}

Exemple utilisant un groupe d'éléments de données :

#{deGroup:oDkJh5Ddh7d} + #{deGroup:GBHN1a1Jddh.j8vBiBqGf6O}

Exemple utilisant une option de catégorie, un groupe d'éléments de données et un groupe d'options de catégorie :

#{P3jJH5Tu5VC.co:FbLZS3ueWbQ} + #{deGroup:GBHN1a1Jddh.coGroup:OK2Nr4wdfrZ.j8vBiBqGf6O}

Exemple utilisant plusieurs groupes d'options de catégories :

#{P3jJH5Tu5VC.coGroup:OK2Nr4wdfrZ&j3C417uW6J7&ddAo6zmIHOk}

Exemple utilisant un élément de données de programme et un attribut de programme :

( D{eBAyeGv0exc.vV9UWAZohSf} * A{IpHINAT79UW.cejWyOfXge6} ) / D{eBAyeGv0exc.GieVkTxp4HH}

Exemple combinant des indicateurs de programme et des indicateurs agrégés :

I{EMOt6Fwhs1n} * 1000 / #{WUg3MYWQ7pt}

Exemple utilisant un taux de déclaration :

R{BfMAe6Itzgt.REPORTING_RATE} * #{P3jJH5Tu5VC.S34ULMcHMca}

Un autre exemple de taux de déclaration qui utilise des rapports sur des ensembles de données et des rapports attendus :

R{BfMAe6Itzgt.ACTUAL_REPORTS} / R{BfMAe6Itzgt.EXPECTED_REPORTS}

Exemple utilisant un indicateur existant :

N{Rigf2d2Zbjp} * #{P3jJH5Tu5VC.S34ULMcHMca}

Les expressions peuvent être constituées de tout type d'expression mathématique valide, à titre d'exemple :

( 2 * #{P3jJH5Tu5VC.S34ULMcHMca} ) / ( #{FQ2o8UBlcrS.S34ULMcHMca} - 200 ) * 25

Indicateurs de programme

Pour récupérer les indicateurs de programme, vous pouvez effectuer une requête GET à la ressource des indicateurs de programme, comme suit :

/api/programIndicators

Les indicateurs de programme peuvent contenir des informations collectées dans le cadre d'un programme. Les indicateurs ont une expression qui peut contenir des références à des éléments de données, des attributs, des constantes et des variables de programme. Les variables autorisées dans les expressions sont décrites dans le tableau suivant.

Tableau : Variables des indicateurs de programme

Variable Description
#{<programstage-id>.<dataelement-id>} Fait référence à une combinaison entre l'étape de programme et l'identifiant de l'élément de données.
A{<attribute-id>} Fait référence à un attribut d'entité suivie.
V{<variable-id>} Fait référence à une variable de programme.
C{<constant-id>} Fait référence à une constante.

La syntaxe ressemble à ceci :

#{<programstage-id>.<dataelement-id>} + #{<attribute-id>} + V{<varible-id>} + C{<constant-id>}

Voici un exemple correspondant :

#{A03MvHHogjR.a3kGcGDCuk6} + A{OvY4VVhSDeJ} + V{incident_date} + C{bCqvfPR02Im}

Expressions

Les expressions sont des formules mathématiques qui peuvent contenir des références à des éléments de données, des constantes et des groupes d'unités d'organisation. Pour valider une expression et en obtenir la description sous forme de texte, vous pouvez adresser une requête GET à la ressource des expressions :

/api/expressions/description?expression=<expression-string>

La réponse suit le format standard des messages web JSON. La propriété statut indique le résultat de la validation et sera "OK" en cas de succès et "ERROR" en cas d'échec. La propriété message sera "Valid" (valide) si la validation réussit, et en cas d'échec, elle fournira une description textuelle de la raison de cet échec. La propriété description fournit une description textuelle de l'expression.

{
  "httpStatus": "OK",
  "httpStatusCode": 200,
  "status": "OK",
  "message": "Valid",
  "description": "Acute Flaccid Paralysis"
}

Fusionner les indicateurs

Le point d'extrémité de la fusion des indicateurs vous permet de fusionner des indicateurs (sources) en un seul indicateur cible.

Autorisation

Vous devez disposer de l'autorité F_INDICATOR_MERGE pour pouvoir fusionner des indicateurs.

Requête

Fusionner des indicateurs à l'aide d'une requête POST :

POST /api/indicators/merge

La charge au format JSON ressemble à ceci :

{
  "sources": [
    "jNb63DIHuwU",
    "WAjjFMDJKcx"
  ],
  "target": "V9rfpjwHbYg",
  "deleteSources": true
}

Les propriétés JSON sont décrites dans le tableau suivant.

Tableau : Fusion des champs de la charge

Champ Obligatoire Valeur
sources Oui Tableau des identifiants des indicateurs à fusionner (les indicateurs sources)
cible Oui Identifiant de l'indicateur dans lequel les sources doivent être fusionnées (l'indicateur cible)
deleteSources Non Détermine si les indicateurs source doivent être supprimés après l'opération. La valeur par défaut est "false"

L'opération de fusion permet de fusionner les indicateurs sources dans l'indicateur cible. Un ou plusieurs indicateurs sources peuvent être spécifiés. Un seul indicateur cible doit être spécifiée.

L'opération de fusion transfère toutes les associations de métadonnées de l'indicateur source vers l'indicateur cible. Les métadonnées suivantes sont mises à jour :

Métadonnées Propriété Mesure prise
Groupe d'indicateurs membres Indicateur source supprimé, indicateur cible ajouté
Ensemble de données indicateurs Indicateur source supprimé, indicateur cible ajouté
Élément dimensionnel de données n/a Tous les éléments de données associés à des sources seront reliés à la cible.
Section indicateurs Indicateur source supprimé, indicateur cible ajouté
Configuration Indicateurs infrastructurels (Groupe d'indicateurs) Indicateur source supprimé, indicateur cible ajouté
Indicateur numérateur / dénominateur Remplace toute référence source par la référence cible
Formulaire de saisie de données code html Remplace toute référence source par la référence cible
Visualisation triage Remplace toute référence source par la référence cible en tant que dimension de tri

Validation

Les contraintes et les codes d'erreur suivants s'appliquent.

Tableau : Contraintes et codes d'erreur

Code d'erreur Description
E1530 Au moins un indicateur source doit être spécifié
E1531 L'indicateur cible doit être spécifié
E1532 L'indicateur cible ne peut pas être un indicateur source
E1533 L'indicateur source/cible n'existe pas : {uid}

Réponse

Succès

Voici un exemple de réponse après une opération réussie :

{
    "httpStatus": "OK",
    "httpStatusCode": 200,
    "status": "OK",
    "response": {
        "mergeReport": {
            "mergeErrors": [],
            "mergeType": "Indicator",
            "sourcesDeleted": [
                "vQ0dGV9EDrw"
            ],
            "message": "Indicator merge complete"
        }
    }
}

Voici un exemple de réponse après une opération erronée :

{
    "httpStatus": "Conflict",
    "httpStatusCode": 409,
    "status": "WARNING",
    "message": "One or more errors occurred, please see full details in merge report.",
    "response": {
        "mergeReport": {
            "mergeErrors": [
                {
                    "message": "At least one source Indicator must be specified",
                    "errorCode": "E1530",
                    "args": []
                },
                {
                    "message": "Target Indicator does not exist: `abcdefg1221`",
                    "errorCode": "E1533",
                    "args": [
                        "Target",
                        "abcdefg1221"
                    ]
                }
            ],
            "mergeType": "Indicator",
            "sourcesDeleted": [],
            "message": "Indicator merge has errors"
        }
    }
}

Types d'indicateurs

Fusionner les types d'indicateurs

Le point d'extrémité de la fusion des types d'indicateur vous permet de fusionner des types d'indicateurs en un seul type d'indicateur cible.

Autorisation

Vous devez disposer de l'autorité F_INDICATOR_TYPE_MERGE pour pouvoir fusionner des types d'indicateur.

Requête

Fusionner des types d'indicateur à l'aide d'une requête POST :

POST /api/indicatorTypes/merge

La charge au format JSON ressemble à ceci :

{
  "sources": [
    "jNb63DIHuwU",
    "WAjjFMDJKcx"
  ],
  "target": "V9rfpjwHbYg",
  "deleteSources": true
}

Les propriétés JSON sont décrites dans le tableau suivant.

Tableau : Fusion des champs de la charge

Champ Obligatoire Valeur
sources Oui Tableau des identifiants des types d'indicateurs à fusionner (les types d'indicateurs source).
cible Oui Identifiant du type d'indicateur dans lequel les sources doivent être fusionnées (le type d'indicateur cible).
deleteSources Non Détermine si les types d'indicateurs source doivent être supprimés après l'opération. La valeur par défaut est "false"

L'opération de fusion permet de fusionner les types d'indicateur source dans le type d'indicateur cible. Un ou plusieurs types d'indicateur source peuvent être spécifiés. Un seul type d'indicateur cible doit être spécifiée.

L'opération de fusion combine toutes les associations de métadonnées de l'indicateur et les types d'indicateur source, et le tout est transféré vers le type d'indicateur cible.

Validation

Les contraintes et les codes d'erreur suivants s'appliquent.

Tableau : Contraintes et codes d'erreur

Code d'erreur Description
E1530 At least one source IndicatorType must be specified
E1531 Target IndicatorType must be specified
E1532 Target IndicatorType cannot be a source indicator type
E1533 Source/Target IndicatorType does not exist: {uid}

Réponse

Succès

Voici un exemple de réponse après une opération réussie :

{
    "httpStatus": "OK",
    "httpStatusCode": 200,
    "status": "OK",
    "response": {
        "mergeReport": {
            "mergeErrors": [],
            "mergeType": "IndicatorType",
            "sourcesDeleted": [
                "vQ0dGV9EDrw"
            ],
            "message": "IndicatorType merge complete"
        }
    }
}

Voici un exemple de réponse après une opération erronée :

{
    "httpStatus": "Conflict",
    "httpStatusCode": 409,
    "status": "WARNING",
    "message": "One or more errors occurred, please see full details in merge report.",
    "response": {
        "mergeReport": {
            "mergeErrors": [
                {
                    "message": "At least one source IndicatorType must be specified",
                    "errorCode": "E1530",
                    "args": []
                },
                {
                    "message": "Target IndicatorType does not exist: `abcdefg1221`",
                    "errorCode": "E1533",
                    "args": [
                        "Target",
                        "abcdefg1221"
                    ]
                }
            ],
            "mergeType": "IndicatorType",
            "sourcesDeleted": [],
            "message": "IndicatorType merge has errors"
        }
    }
}

Les unités d’organisation

La ressource organisationUnits suit les conventions standard des autres ressources de métadonnées présents dans DHIS2. Cette ressource prend en charge des paramètres de requête supplémentaires.

Obtenir la liste des unités d'organisation

Pour obtenir une liste des unités d'organisation, vous pouvez utiliser la ressource suivante :

/api/33/organisationUnits

Tableau : Paramètres de requête des unités d'organisation

Paramètre de requête Options Description
userOnly false true
userDataViewOnly false true
userDataViewFallback false true
query chaîne Requête sur les propriétés de nom, code et ID.
niveau entier Unités d'organisation au niveau spécifié de la hiérarchie.
maxLevel entier Unités d'organisation au niveau maximal ou à des niveaux plus élevés dans la hiérarchie.
withinUserHierarchy false true
withinUserSearchHierarchy false true
memberCollection chaîne Permet d'afficher le nombre de membres dans une collection ; renvoie au nom de la collection associée aux unités d'organisation.
memberObject UID Permet d'afficher le nombre de membres dans une collection ; renvoie à l'identifiant de l'objet qui fait partie de la collection.

Obtenir une unité d'organisation avec une sous-hiérarchie

Pour obtenir une unité d'organisation ainsi que les unités d'organisation présentes dans sa sous-hiérarchie, vous pouvez utiliser la ressource suivante.

/api/33/organisationUnits/{id}

Tableau : Paramètres de l'unité d'organisation

Paramètre de requête Options Description
includeChildren false true
includeDescendants false true
includeAncestors false true
niveau entier Inclut les descendants de l'unité d'organisation spécifiée à un niveau précis de la sous-hiérarchie. Ce paramètre dépend de l'unité d'organisation, et commence par le premier niveau qui est directement inférieur à l'unité d'organisation.

Obtenir des unités d'organisation par option de catégorie{ #webapi_organisation_units_by_category_options }

Point d'extrémité conçu pour récupérer les associations entre les options de catégorie et les unités d'organisation. Ce point d'extrémité est le moyen idéal pour récupérer les associations entre les programmes et les unités d'organisation.

/api/33/categoryOptions/orgUnits?categoryOptions={categoryOptionIdA},{categoryOptionIdB}

Les réponses auront le format suivant :

{
  "<categoryOptionIdA>": [
    "<orgUnitUid>",
    "<orgUnitUid>"
  ],
  "<categoryOptionIdB>": [
    "<orgUnitUid>",
    "<orgUnitUid>"
  ],
  "<categoryOptionIdC>": []
}

Les options de catégorie accessibles à toutes les unités d'organisation sont renvoyées avec un tableau d'unités d'organisation vide ([]).

Obtenir les unités d'organisation par programme

Point d'extrémité conçu pour récupérer les associations entre les programmes et les unités d'organisation. Ce point d'extrémité est le moyen idéal pour récupérer les associations entre les programmes et les unités d'organisation.

/api/33/programs/orgUnits?programs={programIdA},{programIdB}

Les réponses auront le format suivant :

{
  "<programIdA>": [
    "<orgUnitUid>",
    "<orgUnitUid>"
  ],
  "<programIdB>": [
    "<orgUnitUid>",
    "<orgUnitUid>"
  ],
  "<programIdC>": []
}

Les programmes accessibles à toutes les unités d'organisation sont renvoyées avec un tableau d'unités d'organisation vide ([]).

Fractionner des unités d'organisation

Le point d'extrémité de fractionnement des unités d'organisation vous permet de fractionner des unités d'organisation en un certain nombre d'unités d'organisation cibles.

Requête

Fractionner des unités d'organisation à l'aide d'une requête POST :

POST /api/organisationUnits/split

La charge au format JSON ressemble à ceci :

{
  "source": "rspjJHg4WY1",
  "targets": [
    "HT0w9YLMLyn",
    "rEpnzuNpRKM"
  ],
  "primaryTarget": "HT0w9YLMLyn",
  "deleteSource": true
}

Les propriétés JSON sont décrites dans le tableau suivant.

Tableau : Fractionnement des champs de la charge

Champ Obligatoire Valeur
source Oui Identifiant de l'unité d'organisation à fractionner (l'unité d'organisation source).
cibles Oui Tableau des identifiants des unités d'organisation qui seront le résultat du fractionnement de l'unité source (les unités d'organisation cibles).
primaryTarget Non Identifiant de l'unité d'organisation vers laquelle transférer les données agrégées, les événements et les entités suivies associés à l'unité source. S'il n'est pas spécifié, la première cible sera utilisée.
deleteSource Non Détermine si l'unité d'organisation source doit être supprimée après l'opération. La valeur par défaut est true

L'opération de fractionnement consiste à scinder l'unité d'organisation source en unités d'organisation cibles. Il est recommandé de créer de nouvelles unités d'organisation cibles avant de procéder au fractionnement, et de s'assurer au préalable les unités cibles ne contiennent pas de données agrégées. Vous pouvez spécifier un nombre quelconque d'unités d'organisation cibles.

L'opération de fractionnement transfère toutes les associations de métadonnées de l'unité d'organisation source vers les unités d'organisation cibles. Cela inclut les ensembles de données, les programmes, les groupes d'unités d'organisation, les options de catégorie, les utilisateurs, les visualisations, les cartes et les rapports d'événements.

L'opération transfère tous les enregistrements de données de l'unité d'organisation source vers l'unité d'organisation spécifiée comme cible principale ou, si elle n'est pas spécifiée, vers la première unité d'organisation cible spécifiée. Cela inclut les valeurs de données agrégées, les enregistrements relatifs à l'approbation des données, les événements, les entités suivies, etc.

Validation

Les contraintes et les codes d'erreur suivants s'appliquent.

Tableau : Contraintes et codes d'erreur

Code d'erreur Description
E1510 L'unité d'organisation source doit être spécifiée
E1511 Au moins deux unités d'organisation cibles doivent être spécifiées
E1512 L'unité d'organisation source ne peut pas être une unité d'organisation cible
E1513 La cible principale doit être spécifiée
E1514 La cible principale doit être une unité d'organisation cible
E1515 L'unité d'organisation cible n'existe pas

Merge organisation units

Le point d'extrémité de fusion des unités d'organisation vous permet de fusionner des unités d'organisation en une seule unité d'organisation cible.

Autorisation

The main authority required to perform an organisation unit merge is F_ORGANISATION_UNIT_MERGE.

Requête

Fusionner des unités d'organisation à l'aide d'une requête POST :

POST /api/organisationUnits/merge

La charge au format JSON ressemble à ceci :

{
  "sources": [
    "jNb63DIHuwU",
    "WAjjFMDJKcx"
  ],
  "target": "V9rfpjwHbYg",
  "dataValueMergeStrategy": "LAST_UPDATED",
  "dataApprovalMergeStrategy": "LAST_UPDATED",
  "deleteSources": true
}

Les propriétés JSON sont décrites dans le tableau suivant.

Tableau : Fusion des champs de la charge

Champ Obligatoire Valeur
sources Oui Tableau des identifiants des unités d'organisation à fusionner (unités d'organisation source).
cible Oui Identifiant de l'unité d'organisation qui sera le résultat de la fusion des unités source (l'unité d'organisation cible).
dataValueMergeStrategy Non Stratégie de fusion des valeurs de données. Options : LAST_UPDATED (par défaut), DISCARD.
dataApprovalMergeStrategy Non Stratégie de fusion des enregistrements relatifs à l'approbation des données. Options : LAST_UPDATED (par défaut), DISCARD.
deleteSources Non Détermine si les unités d'organisation source doivent être supprimées après l'opération. La valeur par défaut est true

L'opération de fusion consiste à combiner des unités d'organisation source pour former une seule unité cible. Il est recommandé de créer une nouvelle unité d'organisation cible avant de procéder à la fusion, et de s'assurer au préalable l'unité cible ne contient pas de données agrégées. Vous pouvez spécifier un nombre quelconque d'unités d'organisation source.

L'opération de fusion transfère toutes les associations de métadonnées des unités d'organisation sources vers l'unité d'organisation cible. Cela inclut les ensembles de données, les programmes, les groupes d'unités d'organisation, les options de catégorie, les utilisateurs, les visualisations, les cartes et les rapports d'événements. L'opération transfère également toutes les données d'événements et de tracker, telles que les événements, les inscriptions, l'historique de la propriété, la propriété des programmes et les entités suivies, vers l'unité d'organisation cible.

La stratégie de fusion des valeurs de données spécifiée définit la manière dont les valeurs de données sont traitées. Pour la stratégie LAST_UPDATED, les valeurs de données de toutes les unités d'organisation sources sont transférées vers l'unité d'organisation cible, et lorsque des valeurs existent pour les mêmes paramètres, c'est la dernière valeur mise à jour ou créée qui sera utilisée. Ceci permet d'éviter la répétition des données. Pour la stratégie DISCARD, les valeurs ne sont pas transférées vers l'unité d'organisation cible, mais elles sont simplement supprimées. La stratégie de fusion de l'approbation des données spécifiée définit la manière dont les enregistrements relatifs à l'approbation des données sont traités, et suit la même logique que les valeurs de données.

Validation

Les contraintes et les codes d'erreur suivants s'appliquent.

Tableau : Contraintes et codes d'erreur

Code d'erreur Description
E1500 Au moins deux unités d'organisation sources doivent être spécifiées
E1501 L'unité d'organisation cible doit être spécifiée
E1502 L'unité d'organisation cible ne peut pas être une unité d'organisation source
E1503 L'unité d'organisation source n'existe pas

Ensembles de données

La ressource dataSets suit les conventions standard des autres ressources de métadonnées présents dans DHIS2. Cette ressource prend en charge des paramètres de requête supplémentaires.

/api/33/dataSets

Pour récupérer la version d'un ensemble de données, vous pouvez effectuer une requête GET :

GET /api/33/dataSets/<uid>/version

Pour augmenter (d'une unité) la version d'un ensemble de données, vous pouvez effectuer une requête POST :

POST /api/33/dataSets/<uid>/version

Modèle de notification des ensembles de données

La ressource modèles de notification des ensembles de données suit les conventions standard des autres ressources de métadonnées présentes dans DHIS2.

GET /api/33/dataSetNotficationTemplates

Pour récupérer un modèle de notification d'ensemble de données, vous pouvez effectuer une requête GET :

GET /api/33/dataSetNotficationTemplates/<uid>

Pour ajouter un modèle de notification d'ensemble de données, vous pouvez effectuer une requête POST :

POST /api/33/dataSetNotficationTemplates

Pour supprimer un modèle de notification d'ensemble de données, vous pouvez effectuer une requête DELETE :

DELETE /api/33/dataSetNotficationTemplates/<uid>

Ci-dessous, un exemple de charge JSON :

{
  "name": "dataSetNotificationTemplate1",
  "dataSetNotificationTrigger": "DATA_SET_COMPLETION",
  "relativeScheduledDays": 0,
  "notificationRecipient": "ORGANISATION_UNIT_CONTACT",
  "dataSets": [{
    "id": "eZDhcZi6FLP"
  }],
  "deliveryChannels": ["SMS","EMAIL"],
  "subjectTemplate": "V{data_set_name}",
  "messageTemplate": "V{data_set_name}V{registration_period}",
  "sendStrategy": "SINGLE_NOTIFICATION"
}

notificationRecipient peut être l'un des éléments suivants : - USER_GROUP pour les messages internes - ORGANISATION_UNIT_CONTACT pour les messages externes

Niveaux d'unités d'organisation remplis{ #webapi_filled_organisation_unit_levels }

La ressource filledOrganisationUnitLevels fournit une liste ordonnée de niveaux d'unités d'organisation, où les niveaux générés sont introduits dans la liste pour remplir les positions pour lesquelles il n'existe pas de niveau.

GET /api/33/filledOrganisationUnitLevels

Pour définir des niveaux d'unité d'organisation, vous pouvez envoyer une requête POST avec une charge JSON et un type de contenu application/json comme ceci :

{
  "organisationUnitLevels": [{
    "name": "National",
    "level": 1,
    "offlineLevels": 3
  }, {
    "name": "District",
    "level": 2
  }, {
    "name": "Chiefdom",
    "level": 3
  }, {
    "name": "Facility",
    "level": 4
  }]
}

Prédicteurs

Un prédicteur permet de générer des valeurs de données sur la base d'une expression. Il peut être utilisé, par exemple, pour générer des cibles, des seuils ou des estimations de valeurs.

Pour récupérer les prédicteurs, vous pouvez effectuer une requête GET à la ressource des prédicteurs comme suit :

/api/predictors

Création d'un prédicteur

Vous pouvez créer un prédicteur à l'aide d'une requête POST à la ressource des prédicteurs :

POST /api/predictors

Voici un exemple de charge :

{
  "id": "AG10KUJCrRk",
  "name": "Malaria Outbreak Threshold Predictor",
  "shortName": "Malaria Outbreak Predictor",
  "description": "Computes the threshold for potential malaria outbreaks based on the mean plus 1.5x the std dev",
  "output": {
    "id": "nXJJZNVAy0Y"
  },
  "generator": {
    "expression": "AVG(#{r6nrJANOqMw})+1.5*STDDEV(#{r6nrJANOqMw})",
    "description": "Maximum normal malaria case count",
    "missingValueStrategy": "NEVER_SKIP",
    "slidingWindow": false
  },
  "periodType": "Monthly",
  "sequentialSampleCount": 4,
  "sequentialSkipCount": 1,
  "annualSampleCount": 3,
  "organisationUnitLevels": [4]
}

L'élément de sortie fait référence à l'identifiant de l'élément de données pour lequel des valeurs de données prédites doivent être sauvegardées. L'élément générateur fait référence à l'expression qui sera utilisée pour calculer les valeurs prédites.

Expressions du prédicteur

Un prédicteur possède toujours une expression génératrice qui décrit le mode de calcul de la valeur prédite. Le prédicteur peut également avoir une expression permettant de tester la fonction de saut, laquelle expression renvoie une valeur booléenne. Lorsque l'expression de test de saut est présente, elle est évaluée dans chacune des périodes échantillonnées afin de déterminer si les valeurs de cette période doivent être ignorées.

Les variables suivantes peuvent être utilisées dans une expression génératrice ou dans une expression de test de saut :

Variable Objet Description
#{} Élément de données agrégé Fait référence à la valeur totale d'un élément de données agrégé pour toutes les combinaisons d'options de catégorie.
#{. Opérande de l'élément de données Fait référence à une combinaison entre un élément de données agrégé et une combinaison d'options de catégorie.
D{.} Élément de données de programme Fait référence à la valeur d'un élément de données Tracker au sein d'un programme.
A{.} Attribut d'entité suivie d'un programme Fait référence à la valeur d'un attribut d'entité suivie au sein d'un programme.
I{} Indicateur de programme Fait référence à la valeur d'un indicateur de programme.
R{.} Taux de déclaration Fait référence à une mesure de taux de déclaration. La mesure peut être REPORTING_RATE (taux de déclaration), REPORTING_RATE_ON_TIME (taux de déclarations à temps), ACTUAL_REPORTS (rapports effectifs), ACTUAL_REPORTS_ON_TIME (rapports envoyés à temps), EXPECTED_REPORTS (rapports attendus).
C{} Constant Fait référence à une valeur constante.
OUG{} Groupe d'unités d'organisation Fait référence au nombre d'unités d'organisation présentes dans un groupe d'unités d'organisation.
[days] Nombre de jours Le nombre de jours dans la période actuelle.

Génération de valeurs prédites

Pour exécuter tous les prédicteurs (générer des valeurs prédites), vous pouvez envoyer une requête POST à la ressource d'exécution :

POST /api/predictors/run

Pour exécuter un seul prédicteur, vous pouvez envoyer une requête POST à la ressource d'exécution et préciser le prédicteur :

POST /api/predictors/AG10KUJCrRk/run

Programs

To retrieve programs you can make a GET request to the programs resource like this:

/api/programs

Program category mappings

Starting in version 2.42, a program may optionally define one of more category mappings. These mappings can be used to add disaggregations to program indicators for the program. A program indicator for this program can choose which mappings to use for the categories in its category combination and/or attribute combination.

This allows program indicator data to be viewed by category and category option such as in the Data Visualizer. It also allows an Aggregate data exchange to generate values from the program indicator that contain a category option combination and/or an attribute option combination.

These category mappings can be generated by the Maintenance (Preview) App or they can be added using the Web API. This section describes the format of the category mappings if you are using the Web API.

A new program has no category mappings. In the Web API this looks like:

"categoryMappings": []

To add category mappings to the program, you can edit this part of the program definition and then import the result back into DHIS2. Here is an example of how the edited field could look:

"categoryMappings": [
  {
    "id": "goor7Li4See",
    "categoryId": "cX5k9anHEHd",
    "mappingName": "standard Gender mapping",
    "optionMappings": [
      {
        "optionId": "apsOixVZlf1",
        "filter": "#{Zj7UnCAulEk.oZg33kd9taw} == 'Female'"
      },
      {
        "optionId": "jRbMi0aBjYn",
        "filter": "#{Zj7UnCAulEk.oZg33kd9taw} == 'Male'"
      }
    ]
  },
  {
    "id": "ESesheeva1i",
    "categoryId": "VPqYge5RB93",
    "mappingName": "standard Outcome mapping",
    "optionMappings": [
      {
        "optionId": "e3oqm527jBS",
        "filter": "#{Zj7UnCAulEk.sAg4Niej9bo} == 'Managed at PHU'"
      },
      {
        "optionId": "rSdQZYDmHJm",
        "filter": "#{Zj7UnCAulEk.sAg4Niej9bo} == 'Referred'"
      }
    ]
  },
  {
    "id": "laiHaid9eit",
    "categoryId": "fkAkrdC7eJF",
    "mappingName": "Referrals Age at event",
    "optionMappings": [
      {
        "optionId": "K4gwuiVvW3z",
        "filter": "d2:yearsBetween(#{wYTF0YCHMWr.AZLp9Shoab9},V{event_date})<5"
      },
      {
        "optionId": "oaFqxkefkPs",
        "filter": "d2:yearsBetween(#{wYTF0YCHMWr.AZLp9Shoab9},V{event_date})>=5"
      }
    ]
  },
  {
    "id": "SeNg0bohFah",
    "categoryId": "fkAkrdC7eJF",
    "mappingName": "Referrals Age at analyitcs period start",
    "optionMappings": [
      {
        "optionId": "K4gwuiVvW3z",
        "filter": "d2:yearsBetween(#{wYTF0YCHMWr.AZLp9Shoab9},V{analytics_period_start})<5"
      },
      {
        "optionId": "oaFqxkefkPs",
        "filter": "d2:yearsBetween(#{wYTF0YCHMWr.AZLp9Shoab9},V{analytics_period_start})>=5"
      }
    ]
  }
]

In this example, the program defines four category mappings that can be used by the program indicators assigned to the program: - A mapping for the Gender category - A mapping for the Outcome category - Two mappings for the Referrals Age category. A program indicator can choose which mapping it wants to use depending on whether it wants to show the age at the event date or the age at the analytics period start.

The categoryMappings fields are:

name description
id An 11 character UID that uniquely identifies the mapping. The first character must be an upper or lower case letter, followed by 10 characters each being an upper or lower case letter or a digit. The id should be chosen so that it is unique. This UID is used by program indicators for the mappings they choose.
categoryId The UID of the category to be mapped. In this example they are the UIDs for Gender, Outcome, and Referrals Age.
mappingName A name you assign to the mapping. If you define more than one mapping for a category, the name must be unique within the mappings for that category in that program.
optionMappings These specify a filter for each category option within the category.
optionId The UID of the category option to which this filter applies.
filter The filter to use for this category option. The filter must have the same syntax as the filter expression for a program indicator in the program. Tip: You can use the Maintenance App to generate and validate the filter: construct it as a filter expression for a new or existing program indicator for the program, make sure it's valid, and then copy-and-paste it into the metadata. (You don't have to save the program indicator with this filter.)

A program indicator may select which program mappings to use in its categoryMappingIds field. A new program indicator has no category mapping ids. In the Web API this looks like:

"categoryMappingIds": [],

You can replace this with the category mappings that you want the program indicator to use. For example, if the program indicator has selected a category combination that combines Gender and Outcome, this field could be edited to contain the mapping ids for these categories such as defined in the above categoryMappings example:

"categoryMappingIds": [
    "goor7Li4See",
    "ESesheeva1i"
],

Règles de programme

Cette section traite de l'envoi et de la lecture des règles de programme et explique leur modèle de données. Les règles de programme permettent de configurer un fonctionnement dynamique au sein des programmes de DHIS2.

Modèle de règles de programme

Le modèle de données des règles de programme se compose de variables de règles de programme (programRuleVariables), de règles de programme (programRules) et d'actions de règles de programme (programRuleActions). La règle de programme contient une expression - lorsque cette expression est définie sur "true" (vrai), les actions de règle de programme sous cette expression sont déclenchées. Les variables de règle de programme sont utilisées pour traiter les éléments de données, les valeurs de données des entités suivies et d'autres valeurs de données nécessaires à l'exécution des expressions. Toutes les règles d'un programme partagent la même bibliothèque de variables de règles, et une variable peut être utilisée dans les expressions de plusieurs règles.

Détails sur le modèle de règles de programme

Le tableau suivant donne un aperçu détaillé du modèle de règle de programme.

Tableau : Règle de programme

name description Obligatoire
program Le programme dans lequel la règle est exécutée. Obligatoire
name Le nom sous lequel la règle de programme sera affichée aux configurateurs de dhis2. Il n'est pas visible pour l'utilisateur final du programme. Obligatoire
description La fonction de description de la règle de programme peut être utilisée par les configurateurs pour décrire la règle. Cette description n'est pas visible pour l'utilisateur final du programme. Obligatoire
programStage Si une étape de programme est définie pour une règle de programme, la règle ne sera évaluée qu'à l'intérieur de l'étape de programme spécifiée. facultatif
condition L'expression dont l'évaluation doit être définie sur "true" pour que la règle de programme déclenche les actions qu'elle contient. L'expression est écrite à l'aide d'opérateurs, d'appels de fonctions, de valeurs codées en dur, de constantes et de variables de règles de programme. d2:hasValue('hemoglobin') && #{hemoglobin} <= 7 Obligatoire
priorité La priorité d'exécution de la règle lorsque l'ordre des règles est important.
Dans la plupart des cas, les règles ne dépendent pas de leur exécution avant ou après d'autres règles, et dans ces cas, la priorité d'exécution peut être omise. Si aucune priorité n'est définie pour une règle, celle-ci sera exécutée après toutes les règles pour lesquelles une priorité d'exécution a été définie. Si une priorité (integer) est définie, la règle la moins prioritaire sera exécutée avant les règles plus prioritaires. facultatif

Détails sur le modèle d'actions des règles de programme

Le tableau suivant donne un aperçu détaillé du modèle d'actions des règles de programme.

Tableau : Action de règle de programme

name description Obligatoire
Règle de programme La règle de programme qui est à l'origine de cette action. Obligatoire
programRule- ActionType (règle de programme - type d'action) The type of action that is to be performed.
* DISPLAYTEXT - Displays a text in a given widget.
* DISPLAYKEYVALUEPAIR - Displays a key and value pair(like a program indicator) in a given widget.
* HIDEFIELD - Hide a specified dataElement or trackedEntityAttribute.
- content - if defined, the text in content will be displayed to the end user in the instance where a value is previously entered into a field that is now about to be hidden (and therefore blanked). If content is not defined, a standard message will be shown to the user in this instance.
- dataElement - if defined, the HIDEFIELD action will hide this dataElement when the rule is effective.
- trackedEntityDataValue - if defined, the HIDEFIELD action will hide this trackedEntityDataValue when the rule is effective.
* HIDESECTION - Hide a specified section.
- programStageSection - must be defined. This is the programStageSection that will be hidden in case the parent rule is effective.
* ASSIGN - Assign a value to either a dataElement or trackedEntityAttribute or a ProgramRuleVariable. Intended to help the user calculate something or fill in an obvious value somewhere.
- content - if defined, the value in data is assigned to this variable. If content id defined, and thus a variable is assigned for use in other rules, it is important to also assign a programRule.priority to make sure the rule with an ASSIGN action runs before the rule that will in turn evaluate the assigned variable.
- data - must be defined, data forms an expression that is evaluated and assigned to either a variable(#{myVariable}), a dataElement, or both.
- dataElement - if defined, the value in data is assigned to this data element.
Either the content or dataElement must be defined for the ASSIGN action to be effective.
* SHOWWARNING - Show a warning to the user, not blocking the user from completing the event or registration.
- content - if defined, content is a static part that is displayed at the end of the error message.
- data - if defined, data forms an expression that is evaluated and added to the end of the warning message.
- dataElement - if defined, the warning message is displayed next to this data element.
- trackedEntityAttribute - if defined, the warning message is displayed next to this tracked entity attribute.
Either dataElement or trackedEntityAttribute must be specified.
* SHOWERROR - Show an error to the user, blocking the user from completing the event or registration.
- content - if defined, content is a static part that is displayed in the start of the error message.
- data - if defined, data forms an expression that is evaluated and added to the end of the error message.
- dataElement - if defined, the error message is linked to this data element.
- trackedEntityAttribute - if defined, the error message is linked to this tracked entity attribute.
Either dataElement or trackedEntityAttribute must be specified.
* WARNINGONCOMPLETE - Show a warning to the user on the "Complete form" dialog, but allowing the user to complete the event.
- content - if defined, content is a static part that is displayed at the end of the error message.
- data - if defined, data forms an expression that is evaluated and added to the end of the warning message.
- dataElement - if defined, the warning message prefixed with the name/formName of the data element.
* ERRORONCOMPLETE - Show an error to the user on in a modal window when the user tries to complete the event. The user is prevented from completing the event.
- content - if defined, content is a static part that is displayed in the start of the error message.
- data - if defined, data forms an expression that is evaluated and added to the end of the error message.
- dataElement - if defined, the error message is linked to this data element.
* CREATEEVENT - Create an event within the same enrollment.
- content
- data - if defined, contains data values to assign the created event. The format is <uid>:<data value>. Where several values is specified, these are separated with comma.
AcMrnleqHqc:100,AqK1IHqCkEE:'Polyhydramnios'
- programStage - must be defined, and designates the program stage that the rule shall create an event of.
* SETMANDATORYFIELD - Set a field to be mandatory.
- dataElement - if defined, this data element will be set to be mandatory in the data entry form.
- trackedEntityAttribute - if defined, this tracked entity attribute will be set to mandatory in the registration form or profile.
* SENDMESSAGE - To send message at completion of event/enrollment or at data value update.
- messageTemplate - if defined, this template will be delivered either as SMS or EMAIL depending upon DeliveryChannel value in message template.
* SCHEDULEMESSAGE - To schedule message at completion of event/enrollment or at data value update.
- messageTemplate - if defined, this template will be delivered either as SMS or EMAIL depending upon DeliveryChannel value in message template.
- Date to send message - Expression which is going to be used for evaluation of scheduled date. This expression should result in Date, any other resultant will be discarded and notification will not get scheduled.
* HIDEPROGRAMSTAGE - Prevent adding new events to stage.
* HIDEOPTION - Hide option (from an optionSet).
* HIDEOPTIONGROUP - Hide option group (hide the options that belong to that option group).
* SHOWOPTIONGROUP - Show option group (show the options that belong to that option group).
Obligatoire
emplacement Utilisée pour les types d'action DISPLAYKEYVALUEPAIR et DISPLAYTEXT afin de désigner le widget dans lequel le texte ou la paire de valeurs clés seront affichés. Elle est obligatoire pour DISPLAYKEYVALUEPAIR et DISPLAYTEXT. Voir la description
contenu Utilisée pour les messages de l'utilisateur dans les différentes actions. Consultez l'aperçu des types d'action pour obtenir une explication détaillée de son utilisation dans chacun des types d'action. Elle est obligatoire pour SHOWWARNING, SHOWERROR, WARNINGONCOMPLETE, ERRORONCOMPLETE, DISPLAYTEXT et DISPLAYKEYVALUEPAIR ; et facultative pour HIDEFIELD et ASSIGN. Voir la description
données Utilisée pour les expressions dans les différentes actions. Consultez l'aperçu des types d'action pour obtenir une explication détaillée de son utilisation dans chacun des types d'action. Elle est obligatoire pour ASSIGN ; et facultative pour SHOWWARNING, SHOWERROR, WARNINGONCOMPLETE, ERRORONCOMPLETE, DISPLAYTEXT, CREATEEVENT et DISPLAYKEYVALUEPAIR. Voir la description
dataElement Utilisée pour relier les actions des règles aux éléments de données. Consultez l'aperçu des types d'action pour obtenir une explication détaillée de son utilisation dans chacun des types d'action. Elle est facultative pour SHOWWARNING, SHOWERROR, WARNINGONCOMPLETE, ERRORONCOMPLETE, ASSIGN et HIDEFIELD. Voir la description
Entité suivie - Attribut Utilisée pour relier les actions des règles aux attributs d'entités suivies. Consultez l'aperçu des types d'action pour obtenir une explication détaillée de son utilisation dans chacun des types d'action. Elle est facultative pour SHOWWARNING, SHOWERROR et HIDEFIELD. Voir la description
option Utilisée pour relier les actions des règles aux options. Consultez l'aperçu des types d'action pour obtenir une explication détaillée de leur utilisation dans chacun des types d'action. Elle est facultative pour HIDEOPTION Voir la description
optionGroup (groupes d'options) Utilisée pour relier les actions des règles aux groupes d'options. Consultez l'aperçu des type d'action pour obtenir une explication détaillée de son utilisation dans chacun des types d'action. Elle est obligatoire pour SHOWOPTIONGROUP, HIDEOPTIONGROUP. Voir la description
programStage Utilisée uniquement pour les actions de la règle CREATEEVENT. Elle est obligatoire pour CREATEEEVENT. Voir la description
programStage- Section (étape de programme - section) Utilisée uniquement pour les actions de la règle HIDESECTION. Elle est obligatoire pour HIDESECTION Voir la description
Validation des actions des règles de programme

Certaines validations ont été ajoutées au modèle des actions des règles de programme dans la version 2.37. L'objectif principal était d'empêcher l'utilisateur de créer des règles de programme erronées afin de maintenir la cohérence de la base de données. Ces validations dépendent du type d'action de la règle de programme. Chaque type d'action a sa propre validation.

Tableau : Validations des actions des règles de programme

name contrôle de validation de l'existence de l'identifiant
SENDMESSAGE Identifiant du modèle de notification
SCHEDULEMESSAGE Identifiant du modèle de notification
HIDESECTION Identifiant de la section de l'étape de programme
HIDEPROGRAMSTAGE Identifiant de l'étape de programme
HIDEFIELD Élément de données ou Attribut d'entité suivie
HIDEOPTION Identifiant de l'option
HIDEOPTIONGROUP Identifiant du groupe d'options
SHOWOPTIONGROUP Identifiant du groupe d'options
SETMANDATORYFIELD Élément de données ou Attribut d'entité suivie
SHOWERROR Toujours valide
SHOWWARNING Toujours valide
DISPLAYTEXT Élément de données ou Attribut d'entité suivie
DISPLAYKEYVALUEPAIR
ASSIGN Élément de données ou Attribut d'entité suivie
WARNINGONCOMPLETE Élément de données ou Attribut d'entité suivie
ERRORONCOMPLETE Élément de données ou Attribut d'entité suivie

En plus des validations ci-dessus, le champ données dans l'action de la règle de programme qui contient normalement une expression peut également être évalué en utilisant le point d'extrémité de l'api ci-dessous.

POST /api/programRuleActions/data/expression/description?programId=<uid>
{
  "condition": "1 + 1"
}

Détails sur le modèle de variables des règles de programme

Le tableau suivant donne un aperçu détaillé du modèle de variables des règles de programme.

Tableau : Variable de règles de programme

name description Obligatoire
name le nom de la variable de la règle de programme - ce nom est utilisé dans les expressions. #{myVariable} > 5 Obligatoire
sourceType (type de source) Defines how this variable is populated with data from the enrollment and events.
DATAELEMENT_NEWEST_EVENT_PROGRAM_STAGE - This source type works the same way as DATAELEMENT_NEWEST_EVENT_PROGRAM, except that it only evaluates values from one program stage. This source type can be useful in program rules where the same data element is used in several program stages, and a rule needs to evaluate the newest data value from within one specific stage. In order to know what event is the newest, the report date (event date) is used. If you have many events with the same report date, the system choose the one with the latest createdAt property of the event.
DATAELEMENT_NEWEST_EVENT_PROGRAM - This source type is used when a program rule variable needs to reflect the newest known value of a data element, regardless of what event the user currently has open.
**NB
Future dates are "newer" than current or past dates.
In order to know what event is the newest, the report date (event date) is used. If you have many events with the same report date, the system choose the one with the latest createdAt property of the event.
DATAELEMENT_CURRENT_EVENT - Program rule variables with this source type will contain the data value from the same event that the user currently has open. This is the most commonly used source type, especially for skip logic (hide actions) and warning/error rules.
*DATAELEMENT_PREVIOUS_EVENT - Program rule variables with this source type will contain the value from a specified data element from a previous event. Only older events is evaluated, not including the event that the user currently has open. This source type is commonly used when a data element only should be collected once during an enrollment, and should be hidden in subsequent events. Another use case is making rules for validating input where there is an expected progression from one event to the next - a rule can evaluate whether the previous value is higher/lower and give a warning if an unexpected value is entered.
*CALCULATED_VALUE - Program rule variable with this source type is not connected directly to any form data - but will be populated as a result of some other program rules **ASSIGN*
action. This variable will be used for making preliminary calculations, having a ASSIGN program rule action and assigning a value, this value can be used by other program rules - potentially making the expressions simpler and more maintainable. These variables will not be persisted and will stay in memory only during the execution of the set of program rules. Any program rule that assigns a data value to a preliminary calculated value would normally also have a priority assigned - to make sure that the preliminary caculation is done before the rule that consumes the calculated value.
*TEI_ATTRIBUTE - Populates the program rule variable with a specified tracked entity attribute for the current enrollment. Use this is the source type to create program rules that evaluate data values entered during registration. This source type is also useful when you create program rules that compare data in events to data entered during registration. This source type is only used for tracker programs (programs with registration).
Obligatoire
Type de valeur Le paramètre valueType (type de valeur) définit le type de valeur que cette variable de règle de programme peut contenir. Sa valeur dépend du paramètre sourceType (type de la source). Si la source est un élément de données ou un attribut d'entité suivie
, le type de valeur sera dérivé du type de valeur de la source. Lorsque le type de la source est CALCULATED_VALUE, alors le type de valeur doit être fourni par l'utilisateur, sinon il sera par défaut
ValueType.TEXT.
Obligatoire
dataElement Utilisé pour relier la variable de la règle de programme à un élément de données. Il est obligatoire pour tous les types de sources commençant par DATAELEMENT_. Voir la description
Entité suivie - Attribut Utilisé pour relier la variable de la règle de programme à un attribut d'entité suivie. Il est obligatoire pour le type de source TEI_ATTRIBUTE. Voir la description
useCodeFor- OptionSet (utiliser le code pour - Ensemble d'options) Si ce paramètre est coché, la variable sera remplie avec le code - et non le nom - de tout ensemble d'options qui lui relié. Par défaut, le paramètre n'est pas coché, ce qui signifie que c'est le nom de l'option qui est utilisé.
programStage Utilisé pour spécifier une étape de programme précise à partir de laquelle la valeur de la variable de la règle de programme doit être récupérée. Il est obligatoire pour DATAELEMENT_NEWEST_EVENT_PROGRAM_STAGE. Voir la description

Création de règles de programme

  • Pour effectuer des opérations CRUD, vous pouvez utiliser la ressource programRules, disponible dans l'API.

Pour récupérer la liste des règles de programmes, vous pouvez effectuer une requête GET comme suit :

/api/programRules

Pour récupérer une seule règle de programme, vous pouvez effectuer une requête GET comme suit :

/api/programRules/<program_rule_uid>

Pour sauvegarder ou ajouter une seule règle de programme, vous pouvez effectuer une requête POST comme suit :

/api/programRules/<program_rule_uid>

Pour mettre à jour une seule règle de programme, vous pouvez effectuer une requête PUT comme suit :

/api/programRules/<program_rule_uid>

Pour supprimer une seule règle de programme, vous pouvez effectuer une requête DELETE comme suit :

/api/programRules/<program_rule_uid>

Pour récupérer la description de la condition de la règle de programme, vous pouvez effectuer une requête POST en fournissant la chaîne de la condition dans le corps de la requête.

/api/programRules/condition/description?<program_rule_uid>

Formulaires

Pour récupérer des informations sur un formulaire (qui correspond à un ensemble de données et à ses sections), vous pouvez interagir avec la ressource form. La réponse du formulaire est accessible en XML et JSON et fournira des informations sur chaque section (groupe) du formulaire ainsi que sur chaque champ de ces sections, y compris les étiquettes et les identifiants. En fournissant des identifiants de période et d'unité d'organisation, la réponse du formulaire sera constituée de valeurs de données.

Tableau : Paramètres de requête du formulaire

Paramètre Option Description
pe Période ISO Période pour laquelle les valeurs de données du formulaire doivent être renseignées.
ou UID Unité d'organisation pour laquelle les valeurs de données du formulaire doivent être renseignées.
Métadonnées false true

Pour récupérer le formulaire d'un ensemble de données, vous pouvez effectuer une requête GET comme suit :

/api/dataSets/<dataset-id>/form.json

Pour récupérer le formulaire pour l'ensemble de données ayant l'identifiant "BfMAe6Itzgt" au format XML :

/api/dataSets/BfMAe6Itzgt/form

Pour récupérer le formulaire en incluant les métadonnées, au format JSON :

/api/dataSets/BfMAe6Itzgt/form.json?metaData=true

Pour récupérer le formulaire rempli avec les valeurs de données d'une période et d'une unité d'organisation spécifiques au format XML :

/api/dataSets/BfMAe6Itzgt/form.xml?ou=DiszpKrYNg8&pe=201401

Cette ressource permet également de créer des formulaires de saisie de données personnalisés, directement pour un ensemble de données. Cela peut se faire à l'aide d'une requête POST ou PUT avec un contenu de type text/html où la charge est le balisage du formulaire personnalisé. En voici l'illustration :

curl -d @form.html "localhost/api/dataSets/BfMAe6Itzgt/form"
  -H "Content-Type:text/html" -u admin:district -X PUT

Documents

Les références aux fichiers peuvent être stockées avec la ressource "document".

Tableau : Champs du document

Nom du champ Description
name nom unique du document
externe drapeau identifiant l'emplacement du document. TRUE pour les fichiers externes, FALSE pour les fichiers internes.
url l'emplacement du fichier. URL pour les fichiers externes. Identifiant de la ressource "fichier" pour les fichiers internes (voir Ressources fichier)

Une requête GET au point d'extrémité des documents renverra tous les documents :

/api/documents

Une requête POST au point d'extrémité des documents créera un nouveau document :

curl -X POST -d @document.json -H "Content-type: application/json"
  "http://dhis.domain/api/documents"
{
  "name": "dhis home",
  "external": true,
  "url": "https://www.dhis2.org"
}

Une requête GET à laquelle est ajouté l'identifiant d'un document renverra des informations sur ce document. Une requête PUT au même point d'extrémité mettra à jour les champs du document :

/api/documents/<documentId>

Ajouter /data à la requête GET renverra le contenu réel du document :

/api/documents/<documentId>/data

Importation de métadonnées en CSV

DHIS2 prend en charge l'importation de métadonnées au format CSV, telles que les éléments de données, les unités d'organisation et les règles de validation. Les propriétés des différents objets de métadonnées sont identifiées en fonction de l'ordre ou de l'index des colonnes (voir ci-dessous pour plus de détails). Vous pouvez omettre les propriétés d'objets ou les colonnes non nécessaires, mais puisque l'ordre des colonnes est important, une colonne vide doit être incluse. En d'autres termes, si vous voulez spécifier des propriétés ou des colonnes qui apparaissent tard dans l'ordre des colonnes, mais ne pas spécifier certaines colonnes qui apparaissent tôt dans l'ordre, vous pouvez inclure des colonnes vides pour elles.

La première ligne du fichier CSV est considérée comme un en-tête et est ignorée lors de l'importation. Le caractère virgule doit être utilisé comme séparateur de texte. Le texte qui contient des virgules doit être placé entre guillemets.

Pour télécharger des métadonnées au format CSV, vous pouvez envoyer une requête POST au point d'extrémité des métadonnées :

POST /api/metadata?classKey=CLASS-KEY

Les types d'objets suivants sont pris en charge. Le paramètre de requête classKey (clé class) est obligatoire et se trouve à côté de chaque type d'objet dans le tableau ci-dessous.

Tableau : Types d'objets et clés

Type d'objet Clé class
Éléments de données DATA_ELEMENT
Groupes d'éléments de données DATA_ELEMENT_GROUP
Options de catégorie CATEGORY_OPTION
Groupes d'options de catégorie CATEGORY_OPTION_GROUP
Unités d’organisation ORGANISATION_UNIT
Groupes d'unités d'organisation ORGANISATION_UNIT_GROUP
Règles de validation VALIDATION_RULE
Ensembles d'options OPTION_SET
Traductions TRANSLATION

Astuce

Si vous utilisez curl, l'option --data-binary doit être utilisée car elle préserve les sauts de ligne et les nouvelles lignes, ce qui est essentiel pour les données CSV.

Par exemple, pour télécharger un fichier d'éléments de données au format CSV avec curl, vous pouvez utiliser la commande suivante :

curl --data-binary @data_elements.csv "http://localhost/api/metadata?classKey=DATA_ELEMENT"
  -H "Content-Type:application/csv" -u admin:district

Les formats des types d'objets actuellement pris en charge pour l'importation en CSV sont répertoriés dans les sections suivantes.

Eléments de données

Tableau : Format CSV des éléments de données

Index Colonne Obligatoire Valeur (par défaut en premier) Description
1 Nom Oui Nom. Maximum 230 caractères. Unique.
2 UID Non UID Identifiant stable. Exactement 11 caractères alphanumériques, commençant par une lettre. Il est généré par le système s'il n'est pas spécifié.
3 Code Non Code stable. Maximum 50 caractères.
4 Nom court Non 50 premiers caractères du nom S'il n'est pas spécifié, il est remplacé par les 50 premiers caractères du nom. Maximum 50 caractères. Unique.
5 Description Non Description en texte libre.
6 Nom du formulaire Non Maximum 230 caractères.
7 Type de domaine Non AGRÉGÉ TRACKER
8 Type de valeur Non ENTIER NOMBRE
9 Type d'agrégation Non SOMME MOYENNE
10 Combinaison de catégories Non UID UID de la combinaison de catégories. La combinaison de catégories par défaut sera utilisée si aucune n'est spécifiée.
11 Url Non URL de la ressource de l'élément de données. Maximum 255 caractères.
12 Le zéro est significatif Non false true
13 Ensemble d'options Non UID UID de l'ensemble d'options à utiliser pour les données.
14 Ensemble d'options pour les commentaires Non UID UID de l'ensemble d'options à utiliser pour les commentaires.

Vous trouverez ci-dessous un exemple de fichier CSV pour les éléments de données. La première ligne sera toujours ignorée. Vous pouvez ignorer des colonnes et compter sur les valeurs par défaut utilisées par le système. Vous pouvez également ignorer les colonnes que vous n'utilisez pas

name,uid,code,shortname,description
"Women participated skill development training",,"D0001","Women participated in training"
"Women participated community organizations",,"D0002","Women participated in organizations"

Les unités d’organisation

Tableau : Format CSV de l'unité d'organisation

Index Colonne Obligatoire Valeur (par défaut en premier) Description
1 Nom Oui Nom. Maximum 230 caractères. Unique.
2 UID Non UID Identifiant stable. Maximum 11 caractères. Il est généré par le système si aucun n'est spécifié.
3 Code Non Code stable. Maximum 50 caractères.
4 Parent Non UID UID de l'unité d'organisation mère.
5 Nom court Non 50 premiers caractères du nom S'il n'est pas spécifié, il est remplacé par les 50 premiers caractères du nom. Maximum 50 caractères. Unique.
6 Description Non Description en texte libre.
7 Date d'ouverture Non 1970-01-01 Date d'ouverture de l'unité d'organisation au format AAAA-MM-JJ.
8 Date de fermeture Non Date de fermeture de l'unité d'organisation au format AAAA-MM-JJ, ignorer si l'unité est actuellement ouverte.
9 Commentaire Non Commentaire en texte libre pour l'unité d'organisation.
10 Type d'élément Non AUCUN MULTI_POLYGONE
11 Coordonnées Non Coordonnées utilisées pour l'analyse géospatiale au format Geo JSON.
12 URL Non URL de la ressource de l'unité d'organisation. Maximum 255 caractères.
13 Personne de contact Non Personne de contact pour l'unité d'organisation. Maximum 255 caractères.
14 Addresse Non Adresse de l'unité d'organisation. Maximum 255 caractères.
15 Adresses électronique Non Courriel de l'unité d'organisation. Maximum 150 caractères.
16 Numéro de téléphone Non Numéro de téléphone de l'unité d'organisation. Maximum 150 caractères.

Voici un exemple d'importation d'unités d'organisation avec une unité mère, en utilisant des informations minimales :

name,uid,code,parent
"West province",,"WESTP","ImspTQPwCqd"
"East province",,"EASTP","ImspTQPwCqd"

Règles de validation

Tableau : Format CSV de la règle de validation

Index Colonne Obligatoire Valeur (par défaut en premier) Description
1 Nom Oui Nom. Maximum 230 caractères. Unique.
2 UID Non UID Identifiant stable. Maximum 11 caractères. Il est généré par le système si aucun n'est spécifié.
3 Code Non Code stable. Maximum 50 caractères
4 Description Non Description en texte libre.
5 Instruction Non Instruction en texte libre.
6 Importance Non MOYENNE ÉLEVÉE
7 Type de règle (ignoré) Non VALIDATION SURVEILLANCE
8 Opérateur Non égal_à non_égal_à
9 Type de période Non Mensuel Quotidien
10 Expression du côté gauche Oui Formule mathématique basée sur les UID des éléments de données et des combinaisons d'options.
11 Description de l'expression du côté gauche Oui Texte libre
12 Stratégie de valeur manquante du côté gauche Non IGNORER_SI_UNE_VALEUR_EST MANQUANTE IGNORER_SI_TOUTES_LES VALEURS_SONT MANQUANTES
13 Expression du côté droit Oui Formule mathématique basée sur les UID des éléments de données et des combinaisons d'options.
14 Description de l'expression du côté droit Oui Texte libre
15 Stratégie de valeur manquante du côté droit Non IGNORER_SI_UNE_VALEUR_EST MANQUANTE IGNORER_SI_TOUTES_LES VALEURS_SONT MANQUANTES

Ensembles d'options

Tableau : Format CSV de l'ensemble d'options

Index Colonne Obligatoire Valeur (par défaut en premier) Description
1 Nom de l'ensemble d'options Oui Nom. Maximum 230 caractères. Unique. Doit être répété pour chaque option.
2 UID de l'ensemble d'options Non UID Identifiant stable. Maximum 11 caractères. Il est généré par le système si aucun n'est spécifié. Il doit être répété pour chaque option.
3 Code de l'ensemble d'options Non Code stable. Maximum 50 caractères. Il doit être répété pour chaque option.
4 Nom de l'option Oui Nom de l'option. Maximum 230 caractères.
5 UID de l'option Non UID Identifiant stable. Maximum 11 caractères. Il est généré par le système si aucun n'est spécifié.
6 Code de l'option Oui Code stable. Maximum 50 caractères.

Le format des ensembles d'options est particulier. Les trois premières valeurs représentent un ensemble d'options. Les trois dernières valeurs représentent une option. Les trois premières valeurs représentant l'ensemble d'options doivent être répétées pour chaque option.

optionsetname,optionsetuid,optionsetcode,optionname,optionuid,optioncode
"Color",,"COLOR","Blue",,"BLUE"
"Color",,"COLOR","Green",,"GREEN"
"Color",,"COLOR","Yellow",,"YELLOW"
"Sex",,,"Male",,"MALE"
"Sex",,,"Female",,"FEMALE"
"Sex",,,"Unknown",,"UNKNOWN"
"Result",,,"High",,"HIGH"
"Result",,,"Medium",,"MEDIUM"
"Result",,,"Low",,"LOW"
"Impact","cJ82jd8sd32","IMPACT","Great",,"GREAT"
"Impact","cJ82jd8sd32","IMPACT","Medium",,"MEDIUM"
"Impact","cJ82jd8sd32","IMPACT","Poor",,"POOR"

Groupe d'options

Tableau : Format CSV du groupe d'options

Index Colonne Obligatoire Valeur (par défaut en premier) Description
1 Nom du groupe d'options Oui Nom. Maximum 230 caractères. Unique. Doit être répété pour chaque option.
2 Uid du groupe d'options Non Identifiant stable. Maximum 11 caractères. Il est généré par le système si aucun n'est spécifié. Il doit être répété pour chaque option.
3 Code du groupe d'options Non Code stable. Maximum 50 caractères. Il doit être répété pour chaque option.
4 Nom court du groupe d'options Oui Nom court. Maximum 50 caractères. Unique. Doit être répété pour chaque option.
5 Uid de l'ensemble d'options Oui Identifiant stable. Maximum 11 caractères. Doit être répété pour chaque option.
6 Uid de l'option Non Identifiant stable. Maximum 11 caractères.
7 Code de l'option Non Code stable. Maximum 50 caractères.

Exemple de charge CSV d'un groupe d'options

optionGroupName,optionGroupUid,optionGroupCode,optionGroupShortName,optionSetUid,optionUid,optionCode
optionGroupA,,,groupA,xmRubJIhmaK,,OptionA
optionGroupA,,,groupA,xmRubJIhmaK,,OptionB
optionGroupB,,,groupB,QYDAByFgTr1,,OptionC

Ensemble de groupes d'options

Tableau : Format CSV de l'ensemble de groupes d'options

Index Colonne Obligatoire Valeur (par défaut en premier) Description
1 Nom de l'ensemble de groupes d'options Oui Nom. Maximum 230 caractères. Unique. Doit être répété pour chaque option.
2 Uid de l'ensemble de groupes d'options Non Identifiant stable. Maximum 11 caractères. Il est généré par le système si aucun n'est spécifié. Il doit être répété pour chaque option.
3 Code de l'ensemble de groupes d'options Non Code stable. Maximum 50 caractères. Il doit être répété pour chaque option.
4 Description de l'ensemble de groupes d'options Non Description. Doit être répétée pour chaque option.
5 Dimension de données Non VRAI, FAUX
6 Uid de l'ensemble d'options Non UID de l'ensemble d'options. Identifiant stable. Maximum 11 caractères.

Exemple de charge CSV d'un ensemble de groupes d'options

name,uid,code,description,datadimension,optionsetuid
optiongroupsetA,,,,,xmRubJIhmaK
optiongroupsetB,,,,false,QYDAByFgTr1
Pour ajouter des groupes d'options à un ensemble de groupes d'options importé, suivez les mêmes étapes que pour l'importation de l'appartenance à une collection.

Indicateurs

Tableau : Format CSV de l'indicateur

Index Colonne Obligatoire Valeur (par défaut en premier) Description
1 Nom Oui Nom. Maximum 230 caractères. Unique.
2 UID Non UID Identifiant stable. Exactement 11 caractères alphanumériques, commençant par une lettre. Il est généré par le système s'il n'est pas spécifié.
3 Code Non Code stable. Maximum 50 caractères.
4 Nom court Oui 50 premiers caractères du nom S'il n'est pas spécifié, il est remplacé par les 50 premiers caractères du nom. Maximum 50 caractères. Unique.
5 dénominateur Oui Expression de l'indicateur.
6 Description du dénominateur Non Maximum 230 caractères.
5 numérateur Oui Expression de l'indicateur.
6 Description du numérateur Non Maximum 230 caractères.
6 annualisé Oui VRAI, FAUX
6 décimales Non Nombre de décimales à utiliser pour la valeur de l'indicateur. Si ce paramètre est "null", la valeur par défaut sera utilisée.
6 Type d'indicateur Oui UID

Vous trouverez ci-dessous un exemple de fichier CSV pour les indicateurs. La première ligne sera toujours ignorée. Vous pouvez ignorer des colonnes et compter sur les valeurs par défaut utilisées par le système. Vous pouvez également ignorer les colonnes que vous n'utilisez pas

Name,UID,Code,Description,shortName,denominator,denominatorDescription,numerator,numeratorDescription,annualized,decimals,indicatorType
Indicator A,yiAKjiZVoOU,CodeA,Indicator A description,Indicator A shortname,#{fbfJHSPpUQD},denominatorDescription,#{h0xKKjijTdI},numeratorDescription,false,2,sqGRzCziswD
Indicator B,Uvn6LCg7dVU,CodeB,Indicator B description,Indicator B shortname,#{fbfJHSPpUQD},denominatorDescription,#{h0xKKjijTdI},numeratorDescription,false,2,sqGRzCziswD

Appartenance à une collection

Outre l'importation d'objets, vous pouvez également choisir de n'importer que la relation groupe-membre entre un objet et un groupe. Actuellement, les paires de groupes et d'objets suivantes sont prises en charge

  • Groupe d'unités d'organisation - Unité d'organisation

  • Groupe d'éléments de données - Élément de données

  • Groupe d'indicateurs - Indicateur

  • Ensemble de groupes d'options - Groupe d'options

Le format CSV pour ces importations est le même

Tableau : Format CSV des membres d'une collection

Index Colonne Obligatoire Valeur (par défaut en premier) Description
1 UID Oui UID L'UID de la collection à laquelle ajouter un objet
2 UID Oui UID L'UID de l'objet à ajouter à la collection

Groupe d'options de catégorie

Index Colonne Obligatoire Valeur (par défaut en premier) Description
1 Nom Oui Nom. Maximum 230 caractères. Unique.
2 UID Non UID Identifiant stable. Maximum 11 caractères. Il est généré par le système si aucun n'est spécifié.
3 Code Non Code stable. Maximum 50 caractères.
4 Nom court Non Nom court. 50 caractères maximum.
5 Type de dimension des données Oui Type de dimension des données. Il peut être une DÉSAGRÉGATION ou un ATTRIBUT

Autres objets

Tableau : Groupe d'éléments de données, option de catégorie, groupe d'unités d'organisation, Format CSV

Index Colonne Obligatoire Valeur (par défaut en premier) Description
1 Nom Oui Nom. Maximum 230 caractères. Unique.
2 UID Non UID Identifiant stable. Maximum 11 caractères. Il est généré par le système si aucun n'est spécifié.
3 Code Non Code stable. Maximum 50 caractères.
4 Nom court Non Nom court. 50 caractères maximum.

Voici un exemple d'options de catégorie :

name,uid,code,shortname
"Male",,"MALE"
"Female",,"FEMALE"

Objets supprimés

La ressource des objets supprimés fournit un journal des objets de métadonnées qui ont été supprimés.

/api/deletedObjects

Chaque fois qu'un objet de métadonnées est supprimé, un journal est conservé avec l'identifiant, le code, le type et l'heure de la suppression. Cette API est disponible à l'adresse /api/deletedObjects. Le filtrage des champs et des objets fonctionne de la même manière que pour les autres ressources de métadonnées.

Obtenir des objets supprimés de type éléments de données :

GET /api/deletedObjects.json?klass=DataElement

Obtenir un objet de type indicateur qui a été supprimé dans la période de 2015 et plus :

GET /api/deletedObjects.json?klass=Indicator&deletedAt=2015-01-01

Favoris

Certains types d'objets de métadonnées peuvent être marqués comme favoris pour l'utilisateur actuellement connecté. Cela s'applique actuellement aux tableaux de bord.

/api/dashboards/<uid>/favorite

Pour faire d'un tableau de bord un favori, vous pouvez envoyer une requête POST (aucun type de contenu n'est requis) à une URL comme suit :

/api/dashboards/iMnYyBfSxmM/favorite

Pour supprimer un tableau de bord en tant que favori, vous pouvez effectuer une requête DELETE en utilisant l'URL ci-dessus.

Le statut de favori apparaîtra comme un champ booléen favori sur l'objet (par exemple, le tableau de bord) dans la réponse de métadonnées.

Abonnements

Un utilisateur connecté peut s'abonner à certains types d'objets. Actuellement, les objets auxquels il est possible de s'abonner sont ceux de type EventChart (graphique d'événement), EventReport (rapport d'événement), Map (carte), Visualization (visualisation) et EventVisualization (visualisation d'événement).

Note

Les objets EventChart et EventReport sont obsolètes. Utilisez plutôt EventVisualization.

Pour connaître les abonnés d'un objet (obtenir un tableau contenant leurs identifiants d'utilisateurs), vous pouvez effectuer une requête GET comme suit :

/api/<object-type>/<object-id>/subscribers

Voir l'exemple suivant :

/api/visualizations/DkPKc1EUmC2/subscribers

Pour vérifier si l'utilisateur actuel est abonné à un objet (obtenir une valeur booléenne), vous pouvez effectuer un appel GET :

/api/<object-type>/<object-id>/subscribed

Voir l'exemple suivant :

/api/visualizations/DkPKc1EUmC2/subscribed

Pour s'abonner ou se désabonner d'un objet, effectuez une requête POST/DELETE (aucun type de contenu n'est requis) :

/api/<object-type>/<object-id>/subscriber

Ressources de fichiers

Les Ressources de fichiers sont des objets utilisés pour représenter et stocker du contenu binaire. L'objet FileResource (ressource de fichier) contient les métadonnées du fichier (nom, type de contenu, taille, etc.) ainsi qu'une clé permettant d'extraire le contenu à partir d'un magasin de fichiers externe à la base de données. L'objet FileResource est stocké dans la base de données comme n'importe quel autre objet, mais le contenu (fichier) est stocké ailleurs et peut être récupéré à l'aide de la référence du contenu (storageKey) ou clé de stockage.

/api/fileResources

Le contenu des ressources de fichiers n'est pas directement accessible, mais il est référencé à partir d'autres objets (tels que les valeurs de données) pour stocker des données binaires d'une taille pratiquement illimitée.

Pour créer une ressource de fichier qui ne nécessite pas de valeur de données correspondante, envoyez une requête POST au point d'extrémité /api/fileResources avec un téléchargement en plusieurs parties :

curl "https://server/api/fileResources" -X POST
  -F "file=@/path/to/file/name-of-file.png"
L'uid d'une ressource de fichier peut être fourni lors de sa création, par exemple :
curl "https://server/api/fileResources?uid=0123456789x" -X POST
  -F "file=@/path/to/file/name-of-file.png"

Pour créer à la fois une ressource de fichier et une valeur de données qui fait référence au fichier, envoyez une requête POST au point d'extrémité /api/dataValues/file avec DHIS version 2.36 ou une version plus récente :

curl "https://server/api/dataValues/file?de=xPTAT98T2Jd
  &pe=201301&ou=DiszpKrYNg8&co=Prlt0C1RF0s" -X POST
  -F "file=@/path/to/file/name-of-file.png"

Pour le point d'extrémité api/fileResources, le seul paramètre de formulaire requis est file, qui correspond au fichier à télécharger. Pour le point d'extrémité api/dataValues/file, les paramètres requis sont les mêmes que pour une requête POST à api/dataValues, avec l'ajout de file.

Le nom de fichier et le type de contenu doivent également être inclus dans la requête, mais ils seront remplacés par des valeurs par défaut s'ils ne sont pas fournis.

Lorsque la création d'une ressource fichier est réussie, les données renvoyées contiennent un champ response qui contient à son tour fileResource comme suit :

{
  "httpStatus": "Accepted",
  "httpStatusCode": 202,
  "status": "OK",
  "response": {
    "responseType": "FileResource",
    "fileResource": {
      "name": "name-of-file.png",
      "created": "2015-10-16T16:34:20.654+0000",
      "lastUpdated": "2015-10-16T16:34:20.667+0000",
      "externalAccess": false,
      "publicAccess": "--------",
      "user": { ... },
      "displayName": "name-of-file.png",
      "contentType": "image/png",
      "contentLength": 512571,
      "contentMd5": "4e1fc1c3f999e5aa3228d531e4adde58",
      "storageStatus": "PENDING",
      "id": "xm4JwRwke0i"
    }
  }
}

Notez la réponse 202 Accepted, qui indique que la ressource renvoyée a été soumise à un traitement en arrière-plan (persistance vers le magasin de fichiers externe dans ce cas). Notez également le champ storageStatus qui indique si le contenu a été stocké ou non. À ce stade, la persistance vers le magasin externe n'est pas encore terminée (elle est probablement en train d'être téléchargée vers un magasin basé sur le cloud) comme le montre le statut PENDING.

Même si le contenu n'a pas encore été entièrement stocké, la ressource de fichier peut maintenant être utilisée, par exemple comme contenu référencé dans une valeur de données (voir Travailler avec des valeurs de données de fichier). Si nous avons besoin de vérifier le storageStatus mis à jour ou de récupérer les métadonnées du fichier, une requête peut être envoyée au point d'extrémité fileResources.

curl "https://server/api/fileResources/xm4JwRwke0i" -H "Accept: application/json"

Cette requête renverra l'objet FileResource comme le montre la réponse de l'exemple ci-dessus.

Contraintes liées aux ressources de fichiers

  • Les ressources de fichiers doivent être référencées (attribuées) à partir d'un autre objet. afin d'être conservées à long terme. Une ressource de fichier qui est créée mais non référencée par un autre objet, par exemple une valeur de données, est est considérée comme étant en staging. Toutes les ressources de fichiers dans ce état et datant de plus de deux heures seront marqués pour suppression et seront retirées du système.

  • L'ID renvoyé par la création initiale de la ressource de fichier n'est pas récupérable à partir d'un autre emplacement, sauf si la ressource de fichier a été référencée (auquel cas l'ID sera stocké en tant que référence), de sorte que sa perte nécessitera que la requête POST soit répétée et qu'un nouvel objet soit créé. La ressource de fichier orpheline sera effacée automatiquement.

  • Les objets de ressources de fichiers sont immuables, ce qui signifie qu'ils ne peuvent pas être modifiés et nécessitent plutôt la création d'une ressource entièrement nouvelle.

Liste noire des ressources de fichiers

Pour des raisons de sécurité, certains types de fichiers ne peuvent pas être téléchargés.

Les types de contenu suivants sont bloqués.

Type de contenu Type de contenu
text/html application/x-ms-dos-executable
text/css application/vnd.microsoft.portable-executable
text/javascript application/vnd.apple.installer+xml
font/otf application/vnd.mozilla.xul+xml
application/x-shockwave-flash application/x-httpd-php
application/vnd.debian.binary-package application/x-sh
application/x-rpm application/x-csh
application/java-archive

Les extensions de fichiers suivantes sont bloquées.

Extension de fichier Extension de fichier Extension de fichier
html deb xul
htm rpm php
css jar bin
js jsp sh
mjs exe csh
otf msi bat
swf mpkg

Versionnage des métadonnées

Cette section explique les API de versionnage des métadonnées.

  • /api/metadata/version : Cet endpoint renvoie la version actuelle des métadonnées du système sur lequel il est appelé.

Tableau : Paramètres de requête

Nom Obligatoire Description
versionName false Si ce paramètre n'est pas spécifié, il renvoie la version actuelle du système ou, dans le cas contraire, les détails du nom de version utilisé comme paramètre. (le nom de la version utilise la syntaxe "Version_<id>").

Obtenir des exemples de versions de métadonnées

Exemple: Obtenir la version actuelle des métadonnées de ce système

Requête :

/api/metadata/version

Réponse :

{
  "name": "Version_4",
  "created": "2016-06-30T06:01:28.684+0000",
  "lastUpdated": "2016-06-30T06:01:28.685+0000",
  "externalAccess": false,
  "displayName": "Version_4",
  "type": "BEST_EFFORT",
  "hashCode": "848bf6edbaf4faeb7d1a1169445357b0",
  "id": "Ayz2AEMB6ry"
}

Exemple: Obtenir les détails de la version portant le nom "Version_2".

Requête :

/api/metadata/version?versionName=Version_2

Réponse :

{
  "name": "Version_2",
  "created": "2016-06-30T05:59:33.238+0000",
  "lastUpdated": "2016-06-30T05:59:33.239+0000",
  "externalAccess": false,
  "displayName": "Version_2",
  "type": "BEST_EFFORT",
  "hashCode": "8050fb1a604e29d5566675c86d02d10b",
  "id": "SaNyhusVxBG"
}
  • /api/metadata/version/history : Ce endpoint renvoie la liste de toutes les versions des métadonnées du système sur lequel il est appelé.

Tableau : Paramètres de requête

Nom Obligatoire Description
baseline false Si ce paramètre n'est pas spécifié, la liste de toutes les versions de métadonnées sera renvoyée. Dans le cas contraire, nous devons fournir un paramètre versionName de la forme "Version_<id>". Il renverra alors la liste des versions présentes dans le système, qui ont été créées après que le nom de la version ait été fourni en tant que paramètre de la requête.

Obtenir la liste de toutes les versions de métadonnées

Exemple: Obtenir la liste de toutes les versions de ce système

Requête :

/api/metadata/version/history

Réponse :

{
  "metadataversions": [{
    "name": "Version_1",
    "type": "BEST_EFFORT",
    "created": "2016-06-30T05:54:41.139+0000",
    "id": "SjnhUp6r4hG",
    "hashCode": "fd1398ff7ec9fcfd5b59d523c8680798"
  }, {
    "name": "Version_2",
    "type": "BEST_EFFORT",
    "created": "2016-06-30T05:59:33.238+0000",
    "id": "SaNyhusVxBG",
    "hashCode": "8050fb1a604e29d5566675c86d02d10b"
  }, {
    "name": "Version_3",
    "type": "BEST_EFFORT",
    "created": "2016-06-30T06:01:23.680+0000",
    "id": "FVkGzSjAAYg",
    "hashCode": "70b779ea448b0da23d8ae0bd59af6333"
  }]
}

Exemple : Obtenir la liste de toutes les versions de ce système créées après "Version_2".

Requête :

/api/metadata/version/history?baseline=Version_2

Réponse :

{
  "metadataversions": [{
    "name": "Version_3",
    "type": "BEST_EFFORT",
    "created": "2016-06-30T06:01:23.680+0000",
    "id": "FVkGzSjAAYg",
    "hashCode": "70b779ea448b0da23d8ae0bd59af6333"
  }, {
    "name": "Version_4",
    "type": "BEST_EFFORT",
    "created": "2016-06-30T06:01:28.684+0000",
    "id": "Ayz2AEMB6ry",
    "hashCode": "848bf6edbaf4faeb7d1a1169445357b0"
  }]
 }
  • /api/metadata/version/create : Ce endpoint va créer une version de métadonnées pour le type de version spécifié dans le paramètre.

Tableau : Paramètres de requête

Nom Obligatoire Description
type true Le type de version de métadonnées à créer.
* BEST_EFFORT
* ATOMIQUE

Les utilisateurs peuvent sélectionner le type de métadonnées à créer. Le type de version des métadonnées régit la manière dont l'importateur traite la version en question. Ce type sera utilisé lors de l'importation des métadonnées. Il existe deux types de métadonnées.

  • BEST_EFFORT : Ce type suggère que les références manquantes peuvent être ignorées et l'importateur peut continuer à importer les métadonnées (par exemple, les éléments de données manquants lors de l'importation d'un groupe d'éléments de données).

  • ATOMIQUE : Ce type garantit une vérification stricte des références de métadonnées et l'importation des métadonnées échouera si l'une des références n'existe pas.

Remarque

Il est recommandé d'avoir un type de versions ATOMIQUE pour s'assurer que tous les systèmes (centraux et locaux) aient les mêmes métadonnées. Les références manquantes sont prises en compte dans la phase de validation elle-même. Veuillez consulter les détails de l'importateur pour obtenir une explication complète.

Création d'une version de métadonnées

Exemple: Créer une version de métadonnées du type BEST_EFFORT.

Requête :

curl -X POST -u admin:district "https://play.dhis2.org/dev/api/metadata/version/create?type=BEST_EFFORT"

Réponse :

{
  "name": "Version_1",
  "created": "2016-06-30T05:54:41.139+0000",
  "lastUpdated": "2016-06-30T05:54:41.333+0000",
  "externalAccess": false,
  "publicAccess": "--------",
  "user": {
    "name": "John Traore",
    "created": "2013-04-18T17:15:08.407+0000",
    "lastUpdated": "2016-04-06T00:06:06.571+0000",
    "externalAccess": false,
    "displayName": "John Traore",
    "id": "xE7jOejl9FI"
  },
  "displayName": "Version_1",
  "type": "BEST_EFFORT",
  "hashCode": "fd1398ff7ec9fcfd5b59d523c8680798",
  "id": "SjnhUp6r4hG"
}
  • /api/metadata/version/{versionName}/data : Ce endpoint va télécharger les métadonnées spécifiques au nom de version utilisé comme paramètre du chemin d'accès

  • /api/metadata/version/{versionName}/data.gz: Ce point d'extrémité va télécharger les métadonnées spécifiques au nom de version utilisé comme paramètre du chemin d'accès dans un format compressé (gzippé).

Tableau : Paramètres du chemin d'accès

Nom Obligatoire Description
versionName true Paramètre de chemin d'accès de la forme "Version_<id>" pour que l'API télécharge la version spécifique.

Téléchargement des métadonnées de la version

Exemple: Obtenir les métadonnées pour la "Version 5"

Requête :

curl -u admin:district "https://play.dhis2.org/dev/api/metadata/version/Version_5/data"

Réponse :

{
  "date": "2016-06-30T06:10:23.120+0000",
  "dataElements": [
    {
      "code": "ANC 5th Visit",
      "created": "2016-06-30T06:10:09.870+0000",
      "lastUpdated": "2016-06-30T06:10:09.870+0000",
      "name": "ANC 5th Visit",
      "id": "sCuZKDsix7Y",
      "shortName": "ANC 5th Visit ",
      "aggregationType": "SUM",
      "domainType": "AGGREGATE",
      "zeroIsSignificant": false,
      "valueType": "NUMBER",
      "categoryCombo": {
        "id": "p0KPaWEg3cf"
      },
      "user": {
        "id": "xE7jOejl9FI"
      }
    }
  ]
}

Synchronisation des métadonnées

Cette section explique l'API de synchronisation des métadonnées disponible à partir de la version 2.24

  • /api/metadata/sync : Ce endpoint effectue la synchronisation des métadonnées du nom de version utilisé dans le paramètre de requête. Cela se fait par le téléchargement et l'importation de la version spécifiée à partir du serveur distant, tel que défini dans l'application de Paramètres.

Tableau : Paramètres de requête

Nom Obligatoire Description
versionName true Le paramètre de requête VersionName est de la forme "Version_<id>" . L'api télécharge cette version depuis le serveur distant et l'importe dans le système local.
  • Cette API doit être utilisée avec la plus grande prudence. Sachez qu'il existe une autre façon d'effectuer la synchronisation de manière complètement automatisée en s'appuyant sur la tâche de synchronisation des métadonnées à partir de l'application "Administration des données". Voir le chapitre 22, section 22.17 du manuel de l'utilisateur pour plus de détails concernant la tâche de synchronisation des métadonnées.

  • Cette API de synchronisation peut également être utilisée pour synchroniser les métadonnées pour les versions qui ont échoué dans le planificateur de synchronisation des métadonnées. En raison de sa dépendance à un numéro de version de métadonnées spécifique, il convient de faire attention à l'ordre dans lequel cette API est appelée. Par exemple, si cette API est utilisée pour synchroniser une version supérieure à partir de l'instance centrale, la synchronisation peut échouer car les dépendances des métadonnées ne sont pas présentes dans l'instance locale.

  • Supposons que l'instance locale soit à la Version_12 et que ce point d'extrémité soit utilisé pour synchroniser la Version_15 (de type BEST_EFFORT) depuis l'instance centrale, le planificateur commencera à synchroniser les métadonnées à partir de la Version_16. Donc l'instance locale n'aura pas les versions de métadonnées entre la Version_12 et la Version_15. Vous devez synchroniser manuellement les versions manquantes en utilisant uniquement ces points d'extrémité.

Synchronisation d'une version de métadonnées

Exemple: Synchroniser la Version_6 du système central vers ce système

Requête :

curl -u admin:district "https://play.dhis2.org/dev/api/metadata/sync?versionName=Version_6"

Référentiel de métadonnées

DHIS2 fournit un référentiel de métadonnées qui contient des packages de métadonnées avec différents contenus. Un package de métadonnées est un document JSON compatible avec DHIS2 qui décrit un ensemble d'objets de métadonnées.

Pour récupérer un index des packages de métadonnées disponibles, vous pouvez envoyer une requête GET à la ressource metadataRepo :

GET /api/synchronization/metadataRepo

L'entrée d'un package de métadonnées contient des informations sur le package et une URL vers le package concerné. Un index pourrait ressembler à ceci :

{
  "packages": [
    {
      "id": "sierre-leone-demo",
      "name": "Sierra Leone demo",
      "description": "Sierra Leone demo database",
      "version": "0.1",
      "href": "https://dhis2.org/metadata-repo/221/sierra-leone-demo/metadata.json"
    },
    {
      "id": "trainingland-org-units",
      "name": "Trainingland organisation units",
      "description": "Trainingland organisation units with four levels",
      "version": "0.1",
      "href": "https://dhis2.org/metadata-repo/221/trainingland-org-units/metadata.json"
    }
  ]
}

Un client peut suivre les URL et installer un package de métadonnées via une requête POST de type de contenu text/plain et avec le package de métadonnées utilisé comme charge de la ressource metadataPull :

POST /api/synchronization/metadataPull

Voici un exemple de commande curl :

curl "localhost:8080/api/synchronization/metadataPull" -X POST
  -d "https://dhis2.org/metadata-repo/221/trainingland-org-units/metadata.json"
  -H "Content-Type:text/plain" -u admin:district

Note

The supplied URL will be checked against the config property metadata.sync.remote_servers_allowed in the dhis.conf file. If the base URL is not one of the configured servers allowed then the operation will not be allowed. See failure example below.
Some examples where the config set is metadata.sync.remote_servers_allowed=https://server1.org/,https://server2.org/ - supply https://server1.org/path/to/resource -> this will be accepted - supply https://server2.org/resource/path -> this will be accepted - supply https://oldserver.org/resource/path -> this will be rejected

Sample failure response in JSON format.

 {
  "httpStatus": "Conflict",
  "httpStatusCode": 409,
  "status": "ERROR",
  "message": "Provided URL is not in the remote servers allowed list",
  "errorCode": "E1004"
}

Référence à la création par l'utilisateur

Chaque objet créé dans DHIS2 aura une propriété user qui est liée à l'utilisateur qui a créé l'objet.

Depuis la version 2.36, nous avons changé le nom de cette propriété en createdBy pour éviter toute confusion.

Cependant, afin de conserver la compatibilité rétroactive, l'ancienne propriété user est toujours incluse dans la charge et fonctionne normalement comme auparavant.

{
  "createdBy": {
      "displayName": "John Kamara",
      "name": "John Kamara",
      "id": "N3PZBUlN8vq",
      "username": "district"
  },
  "user": {
      "displayName": "John Kamara",
      "name": "John Kamara",
      "id": "N3PZBUlN8vq",
      "username": "district"
  }
}

Propositions pour les métadonnées

Le point d'extrémité des propositions pour les métadonnées permet de proposer et d'accepter des modifications sur les métadonnées.

/api/metadata/proposals

Proposition d'une modification sur des métadonnées

Une proposition vise toujours un seul objet de métadonnées. La requête suivante peut être utilisée :

POST /api/metadata/proposals

En fonction de la charge, la proposition peut :

  • Ajouter un nouvel objet de métadonnées.
  • Mettre à jour les références d'un objet de métadonnées existant par le biais de l'ID.
  • Supprimer un objet de métadonnées existant référencé par un ID.

Pour proposer l'ajout d'un nouvel objet de métadonnées, envoyez une charge JSON comme celle-ci :

{
  "type": "ADD",
  "target": "ORGANISATION_UNIT",
  "change": {"name":"My Unit", "shortName":"MyOU", "openingDate": "2020-01-01"}
}
La propriété change contient le même objet JSON qui peut être directement envoyé au point d'extrémité de création de l'objet.

Pour proposer la mise à jour d'un objet de métadonnées existant, envoyez une charge JSON comme dans l'exemple ci-dessous :

{
  "type": "UPDATE",
  "target": "ORGANISATION_UNIT",
  "targetId": "<id>",
  "change": [
    {"op": "replace", "path": "/name", "value": "New name"}
  ]
}
La propriété targetId fait référence à l'ID de l'objet qui doit être mis à jour. La propriété change contient ici une charge de patch JSON. Il s'agit de la même charge de patch qui peut être envoyée au point d'extrémité correspondant pour appliquer directement la mise à jour.

Pour proposer la suppression d'un objet existant, envoyez une charge comme dans le dernier exemple :

{
  "type": "REMOVE",
  "target": "ORGANISATION_UNIT",
  "targetId": "<id>"
}
La propriété targetId fait référence à l'ID de l'objet qui doit être supprimé. Un commentaire en texte libre peut être ajouté à n'importe quel type de commentaire.

Seul le type de cible ORGANISATION_UNIT est actuellement pris en charge.

Acceptation d'une proposition de modification de métadonnées

Pour accepter une proposition ouverte, envoyez une requête POST à la ressource des propositions.

POST /api/metadata/proposals/<uid>

En cas de succès, le statut de la proposition passe à ACCEPTED (acceptée). Une fois acceptée, la proposition ne peut plus être rejetée.

Si une proposition ne s'applique pas, le statut passe à NEEDS_UPDATE (besoin de mise à jour). Le champ reason contient un résumé des échecs lorsque cette information est disponible.

Refus d'une proposition de modification de métadonnées

Si une proposition n'est pas tout à fait correcte et doit être ajustée, vous pouvez effectuer une requête PATCH sur la ressource des propositions.

PATCH /api/metadata/proposals/<uid>

En option, un texte simple peut être ajouté pour fournir une raison au refus de la proposition.

Une proposition refusée doit avoir au préalable le statut PROPOSED (proposée) avant de passer à NEEDS_UPDATE.

Ajustement d'une proposition de modification de métadonnées

Une proposition au statut NEEDS_UPDATE doit être ajustée avant d'être acceptée. Pour ajuster la proposition, une requête PUT est faite pour la ressource.

PUT /api/metadata/proposals/<uid>

Un tel ajustement peut être effectué soit sans corps, soit avec un corps JSON contenant un objet dont les propriétés change et targetId sont mises à jour pour l'ajustement :

{
  "targetId": "<id>",
  "change": ...
}
Le type JSON de la valeur change dépend du type de la proposition, de la même manière que lorsqu'une proposition est initialement faite.

Rejet d'une proposition de modification de métadonnées

Pour rejeter une proposition ouverte, envoyez une requête DELETE à la ressource des propositions.

DELETE /api/metadata/proposals/<uid>

Le statut de la proposition devient alors REJECTED (rejetée). Aucune autre modification ne peut être apportée à cette proposition. Elle est conservée comme documentation des événements.

Listage des propositions de modification de métadonnées

Toutes les propositions peuvent être listées :

GET /api/metadata/proposals/

La liste des résultats peut être filtrée à l'aide du paramètre filter. Par exemple, pour ne lister que les propositions acceptées, faites la requête suivante :

GET /api/metadata/proposals?filter=status:eq:ACCEPTED

De même, pour ne montrer que les propositions ouvertes, utilisez ceci :

GET /api/metadata/proposals?filter=status:eq:PROPOSED

Les filtres peuvent également être appliqués à n'importe quel champ, à l'exception du champ change. Les opérateurs de filtre pris en charge sont ceux décrits dans l'API Gist Metadata. Cela inclut également les transformateurs de propriétés décrits dans l'API Gist.

Voici une liste des champs disponibles :

Champ Description
id identifiant unique de la proposition
type ADD (ajouter un nouvel objet, UPDATE (mettre à jour) un objet existant, REMOVE (supprimer) un objet existant
status PROPOSED (proposition ouverte), ACCEPTED (succès), NEEDS_UPDATE (l'acceptation à causé une erreur ou a été refusée), REJECTED (rejet)
cible type d'objet de métadonnées à ajouter/mettre à jour/supprimer. Actuellement, seul ORGANISATION_UNIT peut être utilisé.
targetId (id de la cible) UID de l'objet mis à jour ou supprimé. Il n'est pas défini pour la fonction ADD
createdBy (créé par) l'utilisateur qui a créé la proposition
created la date et l'heure de création de la proposition
finalisedBy l'utilisateur qui a accepté ou rejeté la proposition
finalisé la date et l'heure auxquelles la proposition a été acceptée ou rejetée.
commentaire commentaire en texte simple facultatif donné pour la proposition initiale
raison texte simple facultatif fourni lorsque la proposition a été refusée ou que des erreurs sont survenues lors de l'acceptation d'une proposition
change Objet JSON pour la proposition ADD, tableau JSON pour la proposition UPDATE, rien pour la proposition REMOVE.

Visualisation des propositions de modification de métadonnées

Les propositions de modification d'objets individuels peuvent être consultées à l'aide de

GET /api/metadata/proposals/<uid>

Le paramètre fields peut être utilisé pour restreindre les champs inclus dans l'objet affiché. Par exemple :

GET /api/metadata/proposals/<uid>?fields=id,type,status,change

Metadata Attribute Value Type and validations

Type Validation
TEXT Aucun
LONG_TEXT (texte long) Aucun
LETTRE Longueur de la valeur = 1 ET il s'agit d'une lettre
NUMÉRO_DE TÉLÉPHONE La validation est basée sur cette expression rationnelle ^[0-9+\\N-(\N-)#\N.\Ns\N/ext-]{6,50}$. La longueur maximale est de 50.
Exemples : +4733987937, (+47) 3398 7937, (47) 3398 7937.123
EMAIL Format général des email : abc@email.com
BOOLEAN vrai or faux
TRUE_ONLY (vrai uniquement) N'accepte que true
DATE Utiliser le format yyyy-MM-dd
DATETIME (date et heure) Utiliser le format yyyy-MM-dd HH:mm:ssZ ou yyyy-MM-dd 'T'HH:mm:ss
TEMPS Utiliser le format HH:mm
NUMBER La valeur doit être numérique avec une longueur maximale = 250
UNIT_INTERVAL La valeur est numérique et comprise entre 0 et 1.
PERCENTAGE La valeur est un nombre compris entre 0 et 100.
INTEGER La valeur est un nombre entier
INTEGER_POSITIVE La valeur est un nombre entier positif
INTEGER_NEGATIVE La valeur est un nombre entier négatif
INTEGER_ZERO_OR_POSITIVE La valeur est un entier positif ou nul
NOM D'UTILISATEUR La valeur est un nom d'utilisateur pour un utilisateur existant
COORDONNÉE Aucun
ORGANISATION_UNIT La valeur est un UID valide d'une unité d'organisation existante
RÉFÉRENCE Aucun
ÂGE La valeur est une date de naissance. Utiliser le même format que pour le type DATE.
URL La valeur est une URL valide
FILE_RESOURCE La valeur est un UID valide d'une ressource de fichier existante
IMAGE La valeur est un UID valide d'une ressource de fichier existante
GEOJSON Suivre [Spécification GeoJson] (https://geojson.org)
MULTI_TEXT Aucun

Copie de programmes

Introduction

Souvent, les utilisateurs veulent créer de nombreux Programmes qui partagent les mêmes caractéristiques. Au lieu de créer un nouveau Programme de A à Z, ils peuvent copier un Programme existant et lui apporter des modifications. En théorie, un Programme modèle peut être créé et être utilisé pour effectuer ces copies, ce qui peut également aider à rendre les Programmes cohérents.

Informations sur l'API

Point d'extrémité{ #endpoint }

POST /api/programs/{uid}/copy

Exemple avec un Programme dont l'UID est Program123a

POST /api/programs/Program123a/copy

En cas de succès, la réponse contiendra un nouveau UID de Programme et ressemblera à ceci :

{
    "httpStatus": "Created",
    "httpStatusCode": 201,
    "status": "OK",
    "message": "Program created: 'Program456b'"
}

La réponse contiendra également un en-tête Location (emplacement) avec un lien vers le Programme nouvellement créé. Par exemple, si le programme est exécuté localement, la valeur de Location sera http://localhost:9090/api/programs/Program456b.

Options de copie

L'API permet d'utiliser un préfixe personnalisé à titre facultatif, lequel sera ajouté aux propriétés suivantes.

Objet Propriété Information
Programme name Aider à identifier le nouveau programme
ProgramIndicator name Contrainte de base de données - doit être unique
ProgramIndicator Nom court Contrainte de base de données - doit être unique

Dans cet exemple, lorsqu'un préfixe personnalisé est fourni, un Programme original portant le nom Mon Programme Simple sera copié dans un nouveau Programme portant le nom mon préfixe Mon Programme Simple

Si aucune option de copie n'est envoyée dans l'appel API, alors le préfixe par défaut Copy of (copie de) sera utilisé pour les propriétés ci-dessus. Pour envoyer un préfixe personnalisé, il suffit d'ajouter un paramètre de requête HTTP prefix comme suit :

 POST /api/programs/{uid}/copy?prefix=my prefix

Note

La base de données fixe des limites au nombre de caractères autorisés pour les propriétés. Au moment de la rédaction de ces propriétés, les limites seront indiquées dans le tableau ci-dessous. Gardez-les à l'esprit.

Propriété limite de caractères
name 230
Nom court 50

Si une propriété a dépassé sa limite de caractères, une message d'erreur sera renvoyée comme suit :

{
    "httpStatus": "Conflict",
    "httpStatusCode": 409,
    "status": "ERROR",
    "message": "ERROR: value too long for type character varying(230)",
    "errorCode": "E1004"
}

Si l'utilisateur essaie de copier un programme qui n'est pas trouvé, une réponse de ce type sera renvoyée :

{
    "httpStatus": "Not Found",
    "httpStatusCode": 404,
    "status": "ERROR",
    "message": "Program with id {uid} could not be found.",
    "errorCode": "E1005"
}

Autorisation

Autorités

Un Utilisateur aura besoin des autorisations suivantes pour pouvoir copier un Programme :

  • F_PROGRAM_PUBLIC_ADD
  • F_PROGRAM_INDICATOR_PUBLIC_ADD

Accès

Un Programme doit avoir un des statuts suivants pour pouvoir être copié :

  • Accès public en lecture et en écriture
  • Un Utilisateur spécifique autorisé à partager les accès en lecture et en écriture.
  • Un utilisateur faisant partie d'un groupe d'utilisateurs et qui est autorisé à partager les accès en lecture et en écriture.

Si un utilisateur n'a pas les bonnes autorisations, une réponse Forbidden (d'interdiction) est renvoyée comme suit :

{
    "httpStatus": "Forbidden",
    "httpStatusCode": 403,
    "status": "ERROR",
    "message": "You don't have write permissions for Program Program123a",
    "errorCode": "E1006"
}

Points à noter

Copie profonde et copie superficielle

Lorsqu'un Programme est copié, certaines propriétés du Programme nécessitent des types de copie différents. Il est important de savoir ce qui a été copié en profondeur et ce qui a été copié superficiellement.
Tout d'abord, expliquons la différence entre la copie profonde et la copie superficielle dans ce contexte.

Copie profonde

Dans ce contexte, une copie profonde signifie qu'une instance entièrement nouvelle d'un Programme ou d'une propriété de Programme a été créée avec ses propres identifiants uniques. Il s'agit entre autres de :

  • id
  • uid

Les copies profondes des propriétés de programme feront toutes partie de la copie du programme nouvellement créée.

Copie superficielle

Dans ce contexte, une copie superficielle signifie qu'une propriété de programme existante sera réutilisée par le programme ou la propriété de programme nouvellement créé(e).

Propriétés qui ont été copiées en profondeur

Toutes les propriétés ci-dessous ont été copiées en profondeur. Si une propriété ne figure pas dans ce tableau, cela signifie qu'elle a été copié superficiellement.

Objet Propriété de
Programme
Section de programme Programme
ProgramIndicator Programme
Variable de règle de programme Programme
Étape de programme Programme
Section d'une étape de programme Étape de programme
Élément de données d'une section d'étape de programme Étape de programme
Inscription

Remarque

Les propriétés suivantes ont été définies comme vides dans une première approche. Cette approche devrait permettre de simplifier les choses pour commencer.

Objet Propriété
ProgramIndicator groupes
Section d'une étape de programme Indicateurs de programme
Inscription events

Métadonnées Gist API

L'API Gist des métadonnées est une API JSON RESTful en lecture uniquement qui permet de récupérer et de parcourir des métadonnées. Les éléments de cette API contiennent la gist du même élément dans l'API Métadonnées.

L'API est spécifiquement conçue pour éviter :

  • des réponses volumineuses en raison de l'inclusion de graphes d'objets partiels imbriqués.
  • Traitement des demandes en mémoire, à forte intensité de ressources (par exemple, le filtrage en mémoire ou la navigation dans le graphe d'objets).
  • n + 1 requêtes de base de données à la suite de la navigation dans le graphe d'objets lors de la restitution de la réponse.

Comparaison avec l'API des métadonnées

L'API standard des métadonnées est une API flexible et puissante, conçue pour répondre à tous les cas d'utilisation. L'inconvénient est que toutes les fonctionnalités et combinaisons ne peuvent pas être mises à l'échelle tout en conservant de bonnes performances en présence d'un grand nombre d'éléments. En particulier, les listes d'éléments où chaque élément possède une propriété qui est une grande collection d'objets complexes se sont avérées problématiques car elles font rapidement référence à une grande partie du graphe d'objets entier.

L'API /gist a été ajoutée pour fournir une API de métadonnées où la mise à l'échelle est notre première priorité. L'inconvénient est qu'il y a des limites plus distinctes à ce qui est techniquement raisonnable, ce qui signifie que toutes les fonctionnalités de l'API standard de métadonnées n'existent pas pour l'API Gist.

L'API Gist utilise une stratégie de division et de conquête pour éviter les réponses avec de grands graphes d'objets partiels. Au lieu d'inclure des objets ou des listes imbriqués, elle fournit un URI de point de terminaison /gist où cet objet ou cette liste peut être visualisé de manière isolée.

L'API /gist se réfère aux données imbriquées en utilisant les URI plutôt que de les inclure. Cela signifie que si un client est intéressé par ces informations imbriquées, il faudra plus de requêtes, mais chacune d'entre elles reste raisonnablement petite et s'adaptera bien dans le contexte d'un grand nombre d'éléments potentiels.

Les différences connues :

  • les éléments n'incluent que les champs des objets identifiables référencés si ceux-ci n'ont pas de point de terminaison propre
  • ils n'incluent jamais directement les collections d'objets identifiables
  • les éléments par défaut n'incluent pas tous les champs disponibles, mais un sous-ensemble qui dépend du contexte et des paramètres
  • les listes ne peuvent pas être utilisées sans pagination (il n'y a donc pas de paramètre pagination)
  • les champs avec les collections ne sont pas paginés en utilisant le transformateur pagination mais à travers un point de terminaison API paginé pour la propriété particulière de la collection
  • les éléments d'une liste, la taille d'une propriété de collection ou le résultat d'un transformateur booléen prennent toujours en compte le partage d'objets (l'ensemble des éléments pris en compte est toujours l'ensemble visible par l'utilisateur)
  • Gist propose les transformateurs de champs de collection membre(<id>) et non-membre(<id>)
  • Gist propose un filtre de vérification d'accès de type peutLire et peuModifier au lieu de filtrer selon la propriété accès
  • La Gist propose d'utiliser les UID des attributs comme noms de champs et de propriétés de filtrage pour permettre l'établissement de listes ou le filtrage en fonction de valeurs d'attributs personnalisées
  • Gist propose le regroupement de filtres
  • Gist offers renaming the enrty list in a paged response using pageListName
  • Gist offers to pluck multiple simple properties

Les limites connues :

  • par défaut, seuls les champs persistants sont inclus ; une poignée de champs spéciaux non persistants (champs synthétiques) peuvent être ajoutés explicitement ; d'autres les champs non persistants peuvent être extraits à l'aide de la transformation de
  • les filtres ne peuvent être appliqués qu'aux champs persistants
  • les commandes ne peuvent être appliquées qu'aux champs persistants
  • les filtres de jeton ne sont pas disponibles
  • l'ordre est toujours sensible à la casse
  • pluck transformer limited to text properties (or simple properties for multi-pluck)
  • Les champs contenant des collections d'éléments simples (non identifiables) ne peuvent pas toujours être inclus en fonction de la manière dont ils sont stockés

Lorsque cela est possible, l'utilisation de l'API /gist doit être considérée comme la meilleure façon d'obtenir des informations sur les métadonnées.

Points de terminaison

L'API /gist a 3 types de points de terminaison :

  • /api/<object-type>/gist : liste paginée de tous les objets connus et visibles du type (implicite auto=S)
  • /api/<object-type>/<object-id>/gist : affichage d'un seul objet par identifiant (implicite auto=L)
  • /api/<object-type>/<object-id>/<field-name>/gist : liste paginée de tous les éléments connus et visibles dans la collection du champ de l'objet propriétaire (implicite auto=M ; dans le cas d'un champ simple, juste la valeur du champ).

Ces points de terminaison correspondent aux points de terminaison de l'API standard de métadonnées sans le suffixe /gist et partagent la majorité des paramètres et de leurs options avec cette API.

Données de navigation

Puisque l'API /gist évite les structures de données profondément intégrées dans la réponse, les détails des objets complexes ou des listes d'objets référencés sont plutôt fournis sous la forme d'un URI vers le point de terminaison gist qui renvoie uniquement l'objet complexe ou la liste d'objets. Ces URI sont fournies par le champ pointsdeterminaisonsdel'api d'un élément qui est automatiquement ajouté à un élément lorsque de telles références existent. La propriété item elle-même peut contenir un résultat de transformation sur l'objet ou la collection tel que sa taille, sa contenance, sa non contenance, son (ses) identifiant(s) ou une propriété extraite telle que son nom.

Pour parcourir manuellement les données, il peut être pratique d'utiliser le paramètre absoluteUrls=true. Les liens entre les parties de la liste peuvent maintenant être suivis directement dans les navigateurs qui affichent les réponses JSON.

Paramètres

Tous les points de terminaison de l'API /gist acceptent le même ensemble de paramètres. Les paramètres et leurs options qui n'ont pas de sens dans le contexte du point de terminaison sont ignorés.

Présentation

Les paramètres par ordre alphabétique :

Paramètre Options Par défaut Description
Urls absolus vrai or faux faux vrai utilise les chemins relatifs dans les liens, faux utilise les URL absolues dans les liens
automatique XS, S, M, L, XL (en fonction du contexte) étendue des champs sélectionnés par * le sélecteur de champ
champs (en fonction du point de terminaison) * liste de champs ou de préréglages séparés par des virgules à inclure
filtre <field>:<operator> ou <field>:<operator>:<value> liste de filtres de champs de requête séparés par des virgules (peut être utilisée plus d'une fois)
sans titre vrai or faux faux true skip wrapping result in a pager (ignores total), false use a pager wrapper object around the result list
inversé vrai or faux faux La valeur vrai renvoie les éléments pas dans la liste, la valeur faux renvoie les éléments dans la liste.
locale (langue configurée du compte utilisateur) remplacement de la langue de traduction
order <field> or <field>:asc or <field>:desc :asc comma separated list of query order fields (can be used more than once)
page 1-n 1 numéro de page
pageSize 1-1000 50 nombre d'éléments sur une page
pageListName <text> (object type plural) overrides the property name of the result entry list
jonction de racines ET or OU ET combinaison logique de filtres, ET= tous doivent correspondre, OU= au moins un doit correspondre
total/totalPages vrai or faux faux vrai ajoute le nombre total de correspondances à la pagination, faux ne compte pas le nombre total de correspondances
traduire vrai or faux true vrai traduit toutes les propriétés traduisibles, faux saute la traduction des propriétés traduisibles (pas d'effet sur les noms d'affichage synthétiques)

Le paramètre absoluteUrls

Par défaut, les URIs dans les points de terminaison api, href et les membres précedent et suivant de lapagination sont relatifs, et commencent par le chemin /<object-type>/.

Les URI peuvent être changés en URL absolues en utilisant le paramètre absoluteUrls.

Par exemple, /api/users/rWLrZL8rP3K/gist?fields=id,href renvoie :

{
  "id": "rWLrZL8rP3K",
  "href": "/users/rWLrZL8rP3K/gist"
}

tandis que /api/users/rWLrZL8rP3K/gist?fields=id,href&absoluteUrls=true renvoie :

{
  "id": "rWLrZL8rP3K",
  "href": "http://localhost:8080/api/users/rWLrZL8rP3K/gist?absoluteUrls=true"
}

Comme le montre l'exemple, le paramètre absoluteUrls est également transmis ou reporté dans les URLs incluses, ce qui permet de parcourir les réponses en suivant les URLs fournies.

Le Paramètre auto

Chaque point d'accès définit implicitement une valeur par défaut pour l'étendue des champs correspondant au sélecteur de champs* / :tout :

  • /api/<object-type>/gist : implique que auto=S
  • /api/<object-type>/<object-id>/gist: implique que auto=L
  • /api/<object-type>/<object-id>/<field-name>/gist: implique que auto=M

Le paramètre auto est utilisé pour surcharger manuellement la valeur par défaut afin que les éléments de la liste incluent plus ou moins de champs. Ce paramètre agit à nouveau comme une valeur par défaut qui peut être modifiée pour chaque champ à l'aide d'une transformation explicite.

Les options possibles pour auto sont (" les tailles de t-shirt ") :

  • XS : inclut uniquement les identifiants et les propriétés textuelles
  • S : exclut les propriétés complexes (objets), les collections sont uniquement liées (non comptabilisées)
  • M : complexe inclus en tant qu'URL de référence, les références et les collections en tant qu'URL de comptage et de référence
  • L : comme M mais les références et les collections sont incluses en tant qu'identifiants (OBS ! non consolidé en taille)
  • XL : comme L mais les références et les collections sont incluses en tant qu'objets de l'identifiant : { "id" : <id>}

Par exemple, /api/users/gist listerait les éléments avec les champs identifiant, nom, prénom, numéro de téléphone, email, dernière mise à jour alors que /api/users/gist?auto=XS ne liste que l' identifiant, le nom, le prénom, le numéro de téléphone, l'email. L'utilisation de /api/users/gist?auto=L inclurait également unités d'organisation, unités d'organisation de visualisation des données, Unités d'organisation de recherche d'instances d'entités suivis et groupes d'utilisateurs, chacun avec la liste des identifiants des membres des listes/ensembles.

Le paramètre champs

Spécifie la liste des champs à inclure pour chaque élément de la liste.

Les champs sont inclus dans les résultats des objets JSON pour un élément dans l'ordre indiqué. Un preset dans la liste des champs est étendu aux champs qu'il contient en fonction de la position qu'il occupe dans la liste fields. Les champs de la présélection sont classés de simple à complexe.

Si aucun paramètre fields n'est fourni, fields=* est pris en compte. Notez que les champs du *preset dépendent également du paramètre auto.

Pour supprimer un champ, utilisez !<name> ou -<name> dans la liste des champs. Par exemple, pour supprimer les groupes d'utilisateurs d'un utilisateur, utilisez :

/api/users/gist?fields=*,!groupes d'utilisateurs

Le même principe peut être utilisé pour spécifier le transformateur à utiliser pour un champ. Par exemple, pour inclure les identifiants des groupes d'utilisateurs de l'utilisateur, utilisez :

/api/users/gist?fields=*,groupes d'utilisateurs:identifiants

Le paramètre champs permet de lister les champs des objets imbriqués. Par exemple, pour ajouter références de l'utilisateur avec identifiant et nom d'un utilisateur, utilisez :

/api/users/gist?fields=*,références de l'utilisateur[identifiant,Nom d'utilisateur]

Cela crée des éléments du genre :

{
  ...
  "références de l'utilisateur": {
    "identifiant": "Z9oOHPi3FHB",
    "Nom d'utilisateur": "invité"
  }
}

Lors de l'inclusion de champs imbriqués de collections, le champ imbriqué doit être une propriété textuelle.

Par exemple pour inclure tous les noms des groupes d'utilisateurs d'un utilisateur par :

/api/users/gist?fields=*,groupes d'utilisateurs[nom]

La liste des groupes d'utilisateurs est la suivante:

{
  "groupes d'utilisateurs ": {
    "nom": [
      "_PROGRAMME_Programme pour les patients hospitalisés",
      "_PROGRAMME_Programme TB",
      "_ENSEMBLE DE DONNÉES_Superutilisateur",
      "_PROGRAMME_Superutilisateur",
      "_ENSEMBLE DE DONNÉES_Agent de saisie des données",
      "_ENSEMBLE DE DONNÉES_Agent M et E"
    ]
  }
}
Ce qui précède est fonctionnellement identique à :
/api/users/gist?fields=*,groupe d'utilisateurs::pluck( nom)~renommer(groupe d'utilisateurs.nom)

Lorsque l'on demande un seul champ, comme /api/users/gist?fields=nom, la réponse est une liste (toujours paginée) de valeurs simples :

{
  "pager": {
    "page": 1,
    "taille de la page": 50
  },
  "utilisateurs": [
    "Kamara",
    "Wakiki",
    "Nana",
    "Malai",
    ...
  ]
}

Lorsque l'on demande un champ unique de l'objet d'un propriétaire spécifique qui a une valeur simple (sans collection), comme par exemple /api/users/rWLrZL8rP3K/gist fields=surname, la réponse comprend uniquement la valeur JSON simple:

"Wakiki"

Pour plus de détails sur les préréglages de champs, voir la section Champs.

Le paramètre filtre

Pour filtrer la liste des éléments renvoyés, ajoutez un ou plusieurs paramètres filtre.

Plusieurs filtres peuvent être spécifiés sous la forme d'une liste séparée par des virgules d'un seul paramètre ou comme de multiples paramètres filtre, chacun avec un seul filtre.

Il existe deux types de filtres :

  • unitaire: <field>:<operator>
  • binaire: <field>:<operator>:<value>

Un champ peut être :

  • un champ persistant du type d'élément énuméré
  • un champ maintenu d'un objet directement référencé (relation 1:1)
  • l'UID d'un attribut

Les opérateurs unitaires disponibles sont les suivants :

Opérateur unitaire Description
nul le champ est nul (non défini)
!nul le champ est non nul (défini)
vide Le champ est une collection ou une chaîne vide
!vide le champ est une collection ou une chaîne de caractères non vide

Les opérateurs binaires disponibles sont les suivants :

Opérateur binaire Description
eq champ égal valeur
ieq champ égal valeur (insensible à la casse)
!eq, neq, ne champ non égal valeur
lt champ inférieur à valeur
le, lte champ inférieur ou égal à valeur
gt champ supérieur à valeur
ge, gte champ supérieur ou égal à valeur
in le champ est une collection et la valeur est un élément contenu dans la collection
!in le champ est une collection et la valeur est un élément non contenu dans la collection

Si la <value> d'un filtre in ou !in est une liste, il est donné sous la forme suivante [valeur1,valeur2,...], par exemple: groupes d'utilisateurs:dans:[fbfJHSPpUQD,cYeuwXTCPkU].

Toute comparaison >, >=, < <=, == ou != appliquée à un champ de collection avec une valeur numérique comparera la taille de la collection à la valeur, par exemple : groupes d'utilisateurs:gt:0.

Toute comparaison >, >=, < <=, == ou != appliquée à un champ de texte avec une valeur numérique entière comparera la longueur du texte à la valeur, par exemple : nom:eq:4 (nom a une longueur de 4).

Les opérateurs de recherche de motifs binaires disponibles sont les suivants :

Opérateur binaire Description
like, ilike le champ contient <value> ou le champ correspond au motif <value> (lorsque les caractères génériques * ou ? sont présents dans la valeur)
!like, !ilike le champ ne contient pas <value> ou le champ ne correspond pas au motif <value> (lorsque les caractères génériques * ou ? sont présents dans la valeur)
$like, $ilike, commence avec le champ commence avec <value>
!$like, !$ilike, !commence avec le champ ne_commence pas avec_ <value>
like$, ilike$, se termine par le champ se termine par <value>
!like$, !ilike$, !se termine avec le champ ne_se termine pas par_ <value>

Les opérateurs like et !like peuvent être utilisés soit en fournissant un terme de recherche, et dans ce cas la correspondance est toute valeur où le terme apparaît à tout endroit, soit en fournissant le motif de recherche en utilisant * comme nombre quelconque de caractères et ? comme caractère unique.

Tous les opérateurs de recherche de motifs nommés like sont sensibles à la casse. Tous les autres sont insensibles à la casse.

Notez que les filtres sur les valeurs d'attributs utilisent une comparaison basée sur le texte, ce qui signifie que tous les filtres textuels sont pris en charge.

Par exemple, pour ne répertorier que les organisations de deuxième niveau, utilisez

/api/organisationUnits/gist?filter=level:eq:2

De même, lorsqu'il s'agit de lister les enfants d'une unité d'organisation particulière, la collection peut être filtrée. Pour ne lister que les enfants qui sont connectés à à un programme, on peut utiliser:

/api/organisationUnits/rZxk3S0qN63/children/gist?filter=programs:gt:0

Opérateurs binaires pour le filtrage basé sur l'accès (le partage) :

Opérateur binaire Description
peutLire L'utilisateur <value> de métadonnées a t'il le droit de consulter l'objet
peutModifier L'utilisateur <value> de métadonnées a t-il le droit de modifier l'objet ?
peut Lire les données L'utilisateur <value> des données a t'il le droit de consulter l'objet
peutModifier les données L'utilisateur <value> des données a t-il le droit de modifier l'objet ?
peutAccéder L'utilisateur a t'il la <value0> permission <value1> d'accéder à l'objet

Lorsque l'identifiant de l'utilisateur <value> est omis, la vérification est effectuée pour l'utilisateur actuellement connecté. De même, si <value0> est omis pour le filtre peutAccéder, la vérification est effectuée pour l'utilisateur actuellement connecté.

Lorsqu'il est appliqué à une propriété de valeur simple, ici code, le filtre limite la réponse à ces éléments de données (propriétaire de l'objet) que l'utilisateur peut lire/modifier :

/api/dataElements/gist?filter=code:canWrite:OYLGMiazHtW

Lorsqu'il est appliqué à une propriété de référence, ici combinaison de catégories, le filtre limite la réponse à ces éléments de données ayant une combinaison de catégories que l'utilisateur peut lire/modifier:

/api/dataElements/gist?filter=categoryCombo:canWrite:OYLGMiazHtW

Lorsqu'il est appliqué à une propriété de collection de référence, ici groupe d'éléments de données, le filtre limite la réponse à ces éléments de données pour lesquels un groupe d'éléments de données existe dans la propriété de collection et que l'utilisateur peut lire/modifier :

/api/dataElements/gist?filter=dataElementGroups:canWrite:OYLGMiazHtW

La fonction peutAccéder demande deux arguments, le premier est l'identifiant de l'utilisateur, le second le modèle d'accès, par exemple, pour vérifier l'accès en lecture et en modification des métadonnées, le motif est rw% :

/api/dataElements/gist?filter=code:canAccess:[OYLGMiazHtW,rw%]

En outre, les filtres peuvent être regroupés pour permettre de combiner les filtres sélectionnés avec un OU logique lorsque le combinateur de filtre général est un ET logique, ou inversement avec un ET logique lorsque le combinateur général est un OU logique.

Pour les groupes, le modèle de filtre est élargi comme suit :

  • unitaire: <group>:<field>:<operator>
  • binaire: <group>:<field>:<operator>:<value>

Le groupe est un nombre arbitraire compris entre 0 et 9 (en cas d'omission, 0 est pris en compte).

La meilleure façon d'expliquer ce comportement est de donner un petit exemple pour un type d'objet imaginaire avec une propriété age et nom.

?filter=1:age:eq:50&filter=2:name:eq:foo&filter=2:name:eq:bar

Le filtre ci-dessus a deux groupes 1 et 2, et le groupe 2 a 2 membres. Ceci est équivalent au SQL (notez les et et ou ainsi que les accolades de regroupement) :

e.age = 50 and (e.name = 'foo' or e.name = 'bar')

Maintenant, si le même filtre est utilisé en combinaison avec rootJunction=OR

?filter=1:age:eq:50&filter=2:name:eq:foo&filter=2:name:eq:bar&rootJunction=OR

l'effet serait équivalent plutôt au code SQL suivant :

e.age = 50 or (e.name = 'foo' and e.name = 'bar')

Le paramètre sans titre

Les points d'extrémité qui renvoient une liste enveloppent par défaut les éléments dans une enveloppe contenant le pager et la liste, qui est nommée en fonction du type d'objet listé.

Par exemple, l'option /api/organisationUnits/gist renvoie :

{
  "pager": {
    "page": 1,
    "taille de la page": 50,
    "page suivante": "/organisationUnits/gist?page=2"
  },
  "unités d'organisation": [
    ...
  ]
}

Avec headless=true, la réponse à /api/organisationUnits/gist?headless=true est juste la partie de la liste [...] de l'exemple ci-dessus.

Le Paramètre inverse

Le inverse peut être utilisé dans le contexte d'un champ de collection gist de la forme /api/<object-type>/<object-id>/<field-name>/gist pour ne pas lister tous les éléments qui sont contenus dans la collection membre mais tous les éléments qui ne sont pas contenus dans la collection membre.

Par exemple, alors que

/api/organisationUnits/rZxk3S0qN63/children/gist

listerait toutes les unités d'organisation qui sont des enfants de rZxk3S0qN63 l'inverse

/api/organisationUnits/rZxk3S0qN63/children/gist?inverse=true

listerait toutes les unités d'organisation qui ne sont pas des enfants de rZxk3S0qN63. Cela pourrait par exemple être utilisé pour composer une liste de toutes les unités qui peuvent devenir des enfants d'une unité particulière.

Les filtres et les commandes s'appliquent normalement, c'est-à-dire qu'ils filtrent ou commandent les éléments non contenus dans la collection de membres.

Le paramètre local

Le paramètre locale est généralement utilisé à des fins de test pour changer de manière ad-hoc la langue de traduction des noms d'affichage.

Si elle n'est pas spécifiée, la langue de traduction est celle configurée dans les paramètres du compte de l'utilisateur.

Exemples:

/api/organisationUnits/gist?locale=en
/api/organisationUnits/gist?locale=en_GB

Le paramètre ordre

Pour trier la liste des éléments, une ou plusieurs expressions d'ordre peuvent être données.

Une expression d'ordre est soit un simple nom de champ persistant, soit un nom de champ suivi de :asc (ordre croissant - par défaut) ou de :desc (ordre décroissant).

Par exemple, pour trier les unités d'organisation par ordre alphabétique de nom, utilisez :

/api/organisationUnits/gist?order=name

L'ordre alphabétique inverse serait utilisé :

/api/organisationUnits/gist?order=name:desc

Pour trier les unités d'organisation en premier lieu par niveau, puis par nom, utilisez :

/api/organisationUnits/gist?order=level,name

On commencera par la (les) racine(s) au niveau 1. Pour commencer avec les unités foliaires, utilisez :

/api/organisationUnits/gist?order=level:desc,name

Si aucun ordre n'est spécifié, la liste des résultats aura un ordre stable basé sur l'organisation interne des données.

Le paramètre page

Fait référence à la page consultée dans la liste des pages, en commençant par 1 pour la première page.

Si le paramètre page n'est pas présent, il est égal à page=1.

La page est toujours en relation avec la taille de la page. Si une page est indiquée au-delà du nombre de correspondances existantes, une liste d'éléments vide est renvoyée.

Le paramètre taille de la page

Indique le nombre d'éléments d'une page. Le maximum est de 1000 éléments.

Si le paramètre taille de la page n'est pas présent, il est égal à taille de la page=50.

Le paramètre jonction de racines

Le paramètre jonction de racines peut être utilisé pour définir explicitement la jonction logique utilisée entre les filtres. Les possibilités sont les suivantes :

  • ET : tous les filtres doivent correspondre à une donnée pour qu'elle soit incluse dans les résultats
  • OU : l'un des filtres correspond à une donnée pour qu'elle soit incluse dans les résultats

La valeur par défaut est ET

The pageListName Parameter

The array property in a paged response that contains the matching entry list is named after the object type contained in the list. For /api/organisationUnits/gist it would be named organisationUnits.

This default naming can be customized using the pageListName parameter. For example, /api/organisationUnits/gist?pageListName=matches returns a response root object with the format:

{
  "pager": {},
  "matches": []
}
(details of the pager and matches are omitted here)

The total or totalPages Parameter

Par défaut, une requête gist ne comptera pas le nombre total de correspondances si celles- ci dépassent la limite taille de la page. Au lieu de cela, nous acceptons les coûts supplémentaires que le comptage total implique.

Si l'on ne compte pas le nombre total de correspondances (Total=faux), la réponse pager suppose qu'il y a une page suivante dans le cas où des éléments taille de la page ont été trouvés. Ceci pourrait cependant s'avérer faux lorsque l'on navigue sur la page. De plus, le champ total indiquant le nombre de correspondances totales n'est pas inclus dans le pager.

Par exemple, /api/organisationUnits/gist renvoie un pager :

{
  "pager": {
    "page": 1,
    "taille de la page": 50,
    "page suivante": "/organisationUnits/gist?page=2"
  }
}

Lorsque l'on compte le nombre total de correspondances (Total=vrai), la réponse pager contiendra le champ total avec le nombre réel de correspondances totales au prix d'une opération supplémentaire sur la base de données.

La réponse à /api/organisationUnits/gist?total=true renvoie maintenant ce pager :

{
  "pager": {
    "page": 1,
    "taille de la page": 50,
    "total": 1332,
    "page suivante": "/organisationUnits/gist?total=true&page=2",
    "nombre de pages": 27
  }
}

Le paramètre traduire

Les champs tels que nom ou Nomcourt peuvent être traduits (internationalisés).

Par défaut, tout champ traduisible ayant une traduction est renvoyé traduit à condition que la langue de l'interface soit configurée par l'utilisateur qui demande la gist.

Pour retourner le champ non traduit, utilisez traduit=faux.

Par exemple, /api/organisationUnits/gist renvoie des éléments comme suit :

{
  "nom": "Un nom traduit",
  ...
}

Alors que /api/organisationUnits/gist?translate=false renverrait des éléments comme :

{
  "nom"
  "Nom du champ brut",
  ...
}

Notez que les champs synthétiques Afficher le nom et Afficher le nom court renvoient toujours la valeur traduite, indépendamment du paramètre traduire.

Champs

Les champs inclus par défaut (sans le paramètre champs) correspondent à champs=*. Cela signifie que la liste des champs affichés dépend du type d'objet, du contexte du point d'extrémité ainsi que du paramètre auto.

Notez que l'API /gist exclut toujours certains champs qui ne sont généralement pas importants pour les clients, comme par exemple les champs traductions ou partage. Ceux-ci peuvent être ajoutés explicitement.

Lorsqu'elle n'est pas explicitement fournie par un nom dans les paramètres champs, la liste des champs est calculée à partir d'un préréglage. Un préréglage peut être utilisé dans la liste des champs comme un nom de champ. Il se développe en zéro, un ou plusieurs champs en fonction du type d'objet, du point d'extrémité utilisé et du sélecteur.

Préréglages des champs

  • * / :tous: les champs par défaut dépendent du contexte et du paramètre auto
  • :identifiable : tous les champs maintenus de l'interface Objet identifiable
  • :propriétaire : tous les champs maintenus pour lesquels le type listé est le propriétaire
  • :nommable : tous les champs maintenus de l'interface ObjetNommable
  • :maintenus : littéralement tous les champs maintenus

Transformateurs de champ

Un transformateur ou une transformation peut être appliqué à un champ en ajoutant l'un des indicateurs ::, ~ ou @ suivi de l'expression du transformateur.

Les expressions de transformateur disponibles sont les suivantes :

Transformateur Type de résultat JSON Description
renommer(<name>) - renomme le champ dans la réponse en <name>
taille nombre nombre d'éléments dans le champ de collecte
estVide boolean vide d'un champ de collecte
n'estPasvide boolean non-emptiness of a collection field
identifiants chaîne ou [chaîne] Identifiant d'un objet ou identifiant d'éléments d'une collecte
Identifiant - Objets [{ "identifiant": <id> }] Identifiants des éléments de la collecte en tant qu'objet
membre(<id>) boolean a un membre avec <id> pour le champ de collecte
pas-membre(<id>) boolean n'a pas de membre avec <id> pour le champ de collecte
pluck(<field>,...) chaîne ou [chaîne] extract single text property or multiple simple properties from the object or of each collection item
de(<field>,...) dépend du type de grain extrait un champ non pérenne d'un ou plusieurs champs pérennes

Un champ peut recevoir à la fois le transformateur renommer et l'un des autres transformateurs, par exemple :

/api/organisationUnits/gist?fields=*,children::size~rename(child-count)

Les éléments renvoyés n'ont plus de membre enfants mais un membre nombre-d'enfants à la place. Notez que renommer affecte aussi le nom du membre de la référence de l'URI donnée dans l'apidespointsd'Extrémités.

La transformation from peut être utilisée avec un ou plusieurs champs pérennes en paramètre. Ceux-ci seront chargés à partir de la base de données, définis dans une instance de l'objet élément listé avant que la propriété non pérenne transformée avec from ne soit extraite de cette instance en appelant le getter. Cela permet d'extraire des champs dérivés tout en utilisant la même logique que celle utilisée dans l'API de métadonnées habituelle.

Par exemple, le nom d'un utilisateur (propriété non pérenne) nom est composé des propriétés pérennes Prénom et nom. Il peut être obtenu de cette manière :

/api/users/gist?fields=id,name~from(firstName,surname)

Puisque le nom d'un utilisateur est un cas si commun, une auto-détection a été ajoutée pour que dans ce cas spécial, la transformation from soit ajoutée automatiquement à nom. Nous sommes autorisés à utiliser ce qui suit, qui ajoute en interne la transformation from :

/api/users/gist?fields=id,name

Bien que cela rende les propriétés non-perrennes accessibles en général, elles doivent toujours être incluses dans les champs de manière explicite. Pour un utilisateur, cela peut se faire de la manière suivante :

/api/users/gist?fields=*,name

Champs synthétiques

L'API /gist est étroitement liée aux propriétés qui existent dans la base de données. Cela signifie que les propriétés qui ne sont pas stockées dans la base de données ne sont généralement pas disponibles. L'exception à cette règle sont les propriétés "synthétiques" qui sont dynamiquement calculées sur la base d'une ou plusieurs propriétés stockées dans la base de données.

Les propriétés synthétiques sont disponibles pour tous les points d'extrémité où existent les propriétés maintenues nécessaires au calcul de la propriété synthétique.

A l'exception de la propriété points d'extrémité de l'api qui est automatiquement ajoutée si nécessaire toutes les autres propriétés synthétiques ne sont pas incluses par défaut et doivent faire l'objet d'une demande explicite dans la liste des champs.

Présentation

Champs synthétiques par ordre alphabétique :

Champ Description
points d'extrémité de l'api contient des liens permettant de parcourir des objets ou des collections complexes imbriqués
href lien vers l'élément de la liste elle-même ( affichage d'un seul élément)
Nom d'affichage nom traduit (toujours traduit)
afficherNomCourt NomCourt traduit (toujours traduit)
accès résumé sur la capacité de l'utilisateur actuel à lire/saisir/modifier les données

Le Champ href

Chaque élément d'une réponse /gist peut avoir un lien vers lui-même. Ce lien est donné dans la propriété href.

Pour ajouter le champ href, utilisez (par exemple) :

/api/<object-type>/gist?fields=*,href

Le champ afficherNom et afficherNomCourt

Par définition, le afficherNom est le nom traduit et le afficherNomCourt est le nom court traduit.

Pour ajouter afficherNom ou afficherNomCourt à la liste, utilisez (par exemple) :

/api/<object-type>/gist?fields=*,afficherNom
/api/<object-type>/gist?fields=*,afficherNomCourt

Notez que par défaut, toutes les propriétés traduisibles comme nom et nomCourt seront également traduites. Lorsque traduire=faux est utilisé pour désactiver cela, afficherNom et afficherNomCourt restent traduits.

Le Champ points d'extrémité de l'api

Cette propriété permet de parcourir des objets complexes ou des listes d'éléments qui sont inclus dans la réponse /gist sous la forme d'une valeur simple transformée comme un nombre d'éléments.

L'objet points d'extrémité de l'api aura un membre du même nom pour chaque membre de l'élément qui a été transformé en valeur simple.

Par exemple,

/api/users/gist?fields=id,userGroups::size,organisationUnits::size

renvoie les éléments du formulaire :

{
  "identifiant": "rWLrZL8rP3K",
  "groupes d'utilisateurs": 0,
  "unités d'organisation": 1,
  "points d'extrémité de l'api": {
    "unités d'organisation": "/utilisateurs/rWLrZL8rP3K/unités d'organisation/gist",
    "groupes d'utilisateurs": "/utilisateurs/rWLrZL8rP3K/groupes d'utilisateurs/gist"
  }
}

La liste des groupes d'utilisateurs et des unités d'organisation est incluse dans leur taille. Chacun a un membre correspondant dans points d'extrémité de l'api avec un chemin pour parcourir la liste.

Les chemins peuvent être transformés en URL en utilisant le paramètre Urls absolus.

/api/users/gist?fields=id,userGroups::size,organisationUnits::size&absoluteUrls=true

renvoie les éléments du formulaire :

{
  "identifiant": "rWLrZL8rP3K",
  "groupes d'utilisateurs": 0,
  "unités d'organisation": 1,
  "points d'extrémité de l'api": {
    "unités d'organisation":"http://{host}/api/users/rWLrZL8rP3K/organisationUnits/gist?absoluteUrls=true",
    "groupes d'utilisateurs": http://{host}/api/users/rWLrZL8rP3K/userGroups/gist?absoluteUrls=true"
  }
}

Le Champ accès

Le résumé accès est basé sur le partage et l'utilisateur actuel. Cela signifie qu'il n'est applicable qu'aux objets ayant une propriété partage.

Par exemple, lors de l'établissement d'une liste d'éléments de données avec le champ accès

/api/dataElements/gist?fields=*,access

les éléments de données renvoyés contiennent un membre "accès" comme ci-dessous :

"accès": {
  "gérer": faux,
  "externaliser": faux,
  "modifier": faux,
  "lire": vrai,
  "mettre à jour": faux,
  "supprimer": faux
}

Attributs comme Champs

DHIS2 permet de créer et d'ajouter des attributs personnalisés aux objets de métadonnées. Leurs valeurs sont contenues dans la propriété valeurs d'attributs d'un objet de métadonnées sous la forme d'une carte dont la clé est l'UID de l'attribut.

Pour lister directement une ou plusieurs valeurs d'attributs spécifiques de cette carte comme s'il s'agissait de champs habituels de l'objet de métadonnées, l'UID de l'attribut peut être utilisé comme s'il s'agissait du nom d'un champ habituel.

Par exemple, pour inclure la valeur de l'attribut avec l'UID Y1LUDU8sWBR en tant que la propriété unité de mesure dans la liste, utilisez :

/api/dataElements/gist?fields=id,name,Y1LUDU8sWBR::rename(unit-of-measure)

Il en résulte des éléments de liste du type:

{
  "identifiant": "qrur9Dvnyt5",
  "nom": "Âge en années",
  "unité de mesure" : "années"
}

Par défaut, les valeurs sont récupérées au format JSON et extraites de la carte des valeurs d'attributs. Cela signifie que la liste contiendra le type JSON approprié pour le type de valeur d'attribut. Cela implique un surcoût lié à la récupération de toutes les valeurs d'attributs. Pour isoler la valeur dans la base de données, la transformation PLUCK peut être utilisée.

/api/dataElements/gist?fields=id,name,Y1LUDU8sWBR::rename(unit-of-measure)~pluck

Le résultat sera le même, mais la valeur est désormais extraite sous forme de texte dans la base de données, ce qui transforme toute valeur JSON en une chaîne de caractères dans le résultat de la propriété.

Exemples

Quelques exemples partant de simples listes et allant jusqu'à des cas d'utilisation très spécifiques.

Il est préférable de toujours fournir une liste explicite de champs pour que cette section le fasse.

Liste des unités d'organisation avec leur identifiant et leur nom :

/api/organisationUnits/gist?fields=id,name

Liste des unités d'organisation avec leur identifiant, leur nom et leur nombre total :

/api/organisationUnits/gist?fields=id,name&total=true

Liste des utilisateurs avec l'identifiant et le nom d'utilisateur :

/api/users/gist?fields=id,userCredentials.username

Liste des utilisateurs avec l'identifiant, le nom d'utilisateur et la date de la dernière connexion :

/api/users/gist?fields=id,userCredentials[username,lastLogin]

Ne listez que les unités d'organisation au deuxième niveau avec l'identifiant, le nom et le niveau :

/api/organisationUnits/gist?fields=id,name,level&filter=level:eq:2

Listez uniquement les unités d'organisation qui ont plus d'1 enfant avec l'identifiant, le nom et le nombre d'enfants :

/api/organisationUnits/gist?fields=id,name,children::size&filter=children:gt:1

Listez uniquement les unités d'organisation qui ne sont pas encore enfants d'une autre unité zFDYIgyGmXG :

/api/organisationUnits/zFDYIgyGmXG/children/gist?fields=id,name&inverse=true

Listez les utilisateurs et indiquez s'ils sont membres d'un groupe d'utilisateurs spécifique. NTC8Gj7p8P et nommer ce champ est-membre dans la réponse :

/api/users/gist?fields=id,userCredentials.username,userGroups::member(NTC8GjJ7p8P)~rename(is-member)

Listez les liens vers tous les utilisateurs dans des pages de 10 éléments :

/api/users/gist?fields=href&absoluteUrls&pageSize=10

Données

Valeurs de données

Cette section traite de l'envoi et de la lecture des valeurs de données.

/api/dataValueSets

Envoi de valeurs de données

Pour envoyer des valeurs de données, vous pouvez lancer une requête POST à la ressource suivante.

POST /api/dataValueSets

Un cas d'utilisation courant pour l'intégration des systèmes est la nécessité d'envoyer un ensemble de valeurs de données d'un système tiers vers DHIS. Dans cet exemple, nous utiliserons la démonstration DHIS2 sur http://play.dhis2.org/demo. Supposons que nous avons collecté des données basées sur les cas à l'aide d'un simple logiciel client installé sur des téléphones portables pour l'ensemble de données Mortalité <5 ans dans la communauté du Ngelehun CHC (dans la chefferie Badjia, district Bo) pour le mois de janvier 2014. Nous avons maintenant agrégé nos données dans un rapport statistique et nous voulons envoyer ces données à l'instance DHIS2. L'URL de base de l'API de démonstration est http://play.dhis2.org/demo/api. Les liens suivants sont associés à l'URL de base.

La ressource la plus appropriée pour notre objectif d'envoi de valeurs de données est /api/dataValueSets. Un ensemble de valeurs de données représente des données qui ont une relation, généralement parce qu'elles ont été saisies dans le même formulaire. Le format ressemble à ceci :

<dataValueSet xmlns="http://dhis2.org/schema/dxf/2.0" dataSet="dataSetID"
  completeDate="date" period="period" orgUnit="orgUnitID" attributeOptionCombo="aocID">
  <dataValue dataElement="dataElementID"
    categoryOptionCombo="cocID" value="1" comment="comment1"/>
  <dataValue dataElement="dataElementID"
    categoryOptionCombo="cocID" value="2" comment="comment2"/>
  <dataValue dataElement="dataElementID"
    categoryOptionCombo="cocID" value="3" comment="comment3"/>
</dataValueSet>

JSON est pris en charge dans ce format :

{
  "dataSet": "dataSetID",
  "completeDate": "date",
  "period": "period",
  "orgUnit": "orgUnitID",
  "attributeOptionCombo": "aocID",
  "dataValues": [
    {
      "dataElement": "dataElementID",
      "categoryOptionCombo": "cocID",
      "valeur": "1",
      "commentaire": "comment1"
    },
    {
      "dataElement": "dataElementID",
      "categoryOptionCombo": "cocID",
      "valeur": "2",
      "commentaire": "comment2"
    },
    {
      "dataElement": "dataElementID",
      "categoryOptionCombo": "cocID",
      "valeur": "3",
      "commentaire": "comment3"
    }
  ]
}

CSV est pris en charge dans ce format :

"dataelement","period","orgunit","catoptcombo","attroptcombo","value","strby","lstupd","cmt"
"dataElementID","period","orgUnitID","cocID","aocID","1","username","2015-04-01","comment1"
"dataElementID","period","orgUnitID","cocID","aocID","2","username","2015-04-01","comment2"
"dataElementID","period","orgUnitID","cocID","aocID","3","username","2015-04-01","comment3"

Note

Please refer to the date and period section above for time formats.

Note

Any imported data value which is seen as unchanged will be ignored and the import summary will reflect this. An unchanged data value is classed as one which has the same value for all 3 of these properties: - value - comment - followUp

À partir de l'exemple, nous l'importance d'identifier la période, l'ensemble de données, l'unité d'organisation (établissement) et les éléments de données qui nécessite des rapports.

Pour obtenir l'identifiant de l'ensemble de données, nous adressons une requête à la ressource /api/dataSets. De là, nous trouverons le lien vers l'ensemble de données Mortalité < 5 ans qui nous conduit à /api/dataSets/pBOMPrpg1QX. La ressource de l'ensemble de données Mortalité < 5 ans fournit des liens vers les éléments de données qu'elle abrite. D'ici nous pouvons suivre ces liens et obtenir les identifiants des données éléments. Par souci de concision, nous allons déclarer des données pour seulement trois éléments de données : Rougeole avec l'identifiant f7n9E0hX8qk, Dysenterie avec l'identifiant Ix2HsbDMLea et Choléra avec l'identifiant eY5ehpbEsB7.

Il ne nous reste que l'identifiant de l'organisation unité. L'ensemble de données fournit un lien vers les unités d'organisation qui produisent des rapports dessus. Nous recherchons donc Ngelehun CHC et suivons le lien vers la représentation HTML dans /api/organisationUnits/DiszpKrYNg8, qui nous indique que l'identifiant de cette unité d'organisation est DiszpKrYNg8.

À partir de nos données basées sur les cas, nous supposons que nous avons 12 cas de rougeole, 14 cas de dysenterie et 16 cas de choléra. Nous avons maintenant assez d'informations pour pouvoir composer le message XML de l'ensemble de valeurs des données :

<dataValueSet xmlns="http://dhis2.org/schema/dxf/2.0" dataSet="pBOMPrpg1QX"
  completeDate="2014-02-03" period="201401" orgUnit="DiszpKrYNg8">
  <dataValue dataElement="f7n9E0hX8qk" value="12"/>
  <dataValue dataElement="Ix2HsbDMLea" value="14"/>
  <dataValue dataElement="eY5ehpbEsB7" value="16"/>
</dataValueSet>

Au format JSON :

{
  "dataSet": "pBOMPrpg1QX",
  "completeDate": "03/02/2014",
  "période": "201401",
  "orgUnit": "DiszpKrYNg8",
  "dataValues": [
    {
      "dataElement": "f7n9E0hX8qk",
      "valeur": "1"
    },
    {
      "dataElement": "Ix2HsbDMLea",
      "valeur": "2"
    },
    {
      "dataElement": "eY5ehpbEsB7",
      "valeur": "3"
    }
  ]
}

Pour effectuer des tests fonctionnels, nous utiliserons l'outil curl qui permet de transférer facilement des données à l'aide du protocole HTTP. Tout d'abord, nous sauvegardons le contenu XML de l'ensemble de données dans un fichier appelé datavalueset.xml. Dans le répertoire où se trouve ce fichier, nous invoquons ce qui suit à partir de la ligne de commande :

curl -d @datavalueset.xml "https://play.dhis2.org/demo/api/dataValueSets"
  -H "Content-Type:application/xml" -u admin:district

Pour envoyer du contenu JSON, vous devez définir l'en-tête "type de contenu" comme suit :

curl -d @datavalueset.json "https://play.dhis2.org/demo/api/dataValueSets"
  -H "Content-Type:application/json" -u admin:district

La commande enverra une requête à l'API Web de démonstration, définissez application/xml comme type de contenu et authentifiez-vous en utilisant admin/district comme nom d'utilisateur/mot de passe. Si tout se passe bien, le code d'état HTTP 200 OK sera renvoyé. Vous pouvez vérifier la réception des données en ouvrant le module de saisie de données dans DHIS2 et en sélectionnant l'unité d'organisation, l'ensemble de données et la période utilisés dans cet exemple.

L'API suit la sémantique normale pour la gestion des erreurs et les codes d'état HTTP. Si vous fournissez un nom d'utilisateur ou un mot de passe invalide, 401 Non autorisé est renvoyé. Si vous fournissez un type de contenu autre que application/xml, 415 Type de média non pris en charge est renvoyé. Si le contenu XML n'est pas valide selon l'espace de noms DXF, 400 Mauvaise requête est renvoyé. Si vous fournissez un identifiant invalide dans le contenu XML, 409 Conflit est renvoyé avec un message descriptif.

Envoi de données en masse

L'exemple précédent nous a montré comment envoyer un ensemble de données associées qui partagent la même période et la même unité d’organisation. L'exemple suivant nous montrera comment envoyer de grandes quantités de données qui ne sont pas nécessairement associés.

Encore une fois, nous interagirons avec la ressource /api/dataValueSets. Cette fois nous n'allons pas spécifier les attributs dataSet et completeDate. De plus, nous allons spécifiez les attributs period et orgUnit comme éléments de données individuelles et non élément d’ensemble de données externes. Cela nous permettra d'envoyer des données pour différentes périodes et unités d'organisation :

<dataValueSet xmlns="http://dhis2.org/schema/dxf/2.0">
  <dataValue dataElement="f7n9E0hX8qk"
    period="201401" orgUnit="DiszpKrYNg8" value="12"/>
  <dataValue dataElement="f7n9E0hX8qk"
    period="201401" orgUnit="FNnj3jKGS7i" value="14"/>
  <dataValue dataElement="f7n9E0hX8qk"
    period="201402" orgUnit="DiszpKrYNg8" value="16"/>
  <dataValue dataElement="f7n9E0hX8qk"
    period="201402" orgUnit="Jkhdsf8sdf4" value="18"/>
</dataValueSet>

Au format JSON :

{
  "dataValues": [
    {
      "dataElement": "f7n9E0hX8qk",
      "période": "201401",
      "orgUnit": "DiszpKrYNg8",
      "valeur": "12"
    },
    {
      "dataElement": "f7n9E0hX8qk",
      "période": "201401",
      "orgUnit": "FNnj3jKGS7i",
      "valeur": "14"
    },
    {
      "dataElement": "f7n9E0hX8qk",
      "période": "201402",
      "orgUnit": "DiszpKrYNg8",
      "valeur": "16"
    },
    {
      "dataElement": "f7n9E0hX8qk",
      "période": "201402",
      "orgUnit": "Jkhdsf8sdf4",
      "valeur": "18"
    }
  ]
}

Au format CSV :

"dataelement","period","orgunit","categoryoptioncombo","attributeoptioncombo","value"
"f7n9E0hX8qk","201401","DiszpKrYNg8","bRowv6yZOF2","bRowv6yZOF2","1"
"Ix2HsbDMLea","201401","DiszpKrYNg8","bRowv6yZOF2","bRowv6yZOF2","2"
"eY5ehpbEsB7","201401","DiszpKrYNg8","bRowv6yZOF2","bRowv6yZOF2","3"

Nous effectuons les tests en utilisant "curl" pour envoyer les données au format XML :

curl -d @datavalueset.xml "https://play.dhis2.org/demo/api/dataValueSets"
  -H "Content-Type:application/xml" -u admin:district

Notez que lorsque vous utilisez le format CSV, vous devez utiliser l'option de données binaires pour conserver le retour-à-la-ligne dans le fichier CSV :

curl --data-binary @datavalueset.csv "https://play.dhis2.org/demo/24/api/dataValueSets"
  -H "Content-Type:application/csv" -u admin:district

La ressource ensemble de valeurs de données fournit une réponse XML qui est utile lorsque vous voulez vérifier l'impact de votre requête. La première fois que nous envoyons la requête " ensemble de données " ci-dessus, le serveur répondra avec le résumé d'importation suivant :

<importSummary>
  <dataValueCount imported="2" updated="1" ignored="1"/>
  <dataSetComplete>faux</dataSetComplete>
</importSummary>

Ce message nous indique que 3 données ont été importées, 1 donnée a été mise à jour et 0 donnée a été ignorée. La seule mise à jour résulte de l'envoi de cette donnée dans l'exemple précédent. Une donnée sera ignorée si elle fait référence à un élément de données, une période, une unité d'organisation ou un ensemble de données qui n'existent pas. Dans notre cas, cette valeur unique ignorée est due au fait que la dernière donnée faisait référence à une unité d'organisation non valide. L'élément complet de l'ensemble de données affichera la date à laquelle l'ensemble de données a été achevé, ou " faux " si aucun attribut d'élément de données n'a été fourni.

Paramètres d'importation

The import process can be customized using a set of import parameters.

Tableau : Paramètres d'importation

Paramètre Valeurs (par défaut en premier) Description
dataElementIdScheme uide | nom | code | attribut:ID Propriété de l'objet d'élément de données à utiliser pour mapper les données.
orgUnitIdScheme uide | nom | code | attribut:ID Propriété de l'objet d'unité d'organisation à utiliser pour mapper les données.
attributOptionComboIdScheme (Schéma de l'identifiant de la combinaison d'options d'attribut) uide | nom | code| attribut:ID Propriété de l'objet de combinaison d'options d'attribut à utiliser pour faire correspondre les données.
categoryOptionComboIdScheme uide | nom | code | attribut:ID Propriété de l'objet de combinaison d'options de catégorie à utiliser pour faire correspondre les données.
dataSetIdScheme (Schéma de l'identifiant de l'ensemble de données) uide | nom | code| attribut:ID Propriété de l'objet d'ensemble de données à utiliser pour faire correspondre les données.
categoryIdScheme (Schéma de l'identifiant de catégorie) uide | nom | code| attribut:ID Propriété de l'objet de catégorie à utiliser pour faire correspondre les données (ADX uniquement).
categoryOptionIdScheme (Schéma d'identification des options de catégorie) uide | nom | code| attribut:ID Propriété de l'objet d'option catégorie à utiliser pour faire correspondre les données (ADX uniquement).
idScheme uide | nom | code| attribut:ID Propriété de l'un des objets ci-dessus, s'ils ne sont pas spécifiés, à utiliser pour faire correspondre les données.
preheatCache false true
dryRun false true
importStrategy (stratégie d'importation) CREATE (créer) UPDATE (mettre à jour)
skipExistingCheck (ignorer les contrôles) false true
skipAudit (ignorer l'audit) false true
async false true
force false true
dataSet (ensemble de données) uid Fournissez l'ID de l'ensemble de données pour l'importation CSV lorsque l'ID ne peut pas être fourni dans le fichier lui-même

Tous les paramètres sont facultatifs et peuvent être fournis en tant que paramètres de requête dans l'URL de la requête comme suit :

/api/dataValueSets?dataElementIdScheme=code&orgUnitIdScheme=name
  &dryRun=true&importStrategy=CREER

Ils peuvent également être fournis en tant qu'attributs XML sur l'élément " ensemble de valeurs de données ", tel qu'indiqué ci-dessous. Les attributs XML remplacent les paramètres de la chaîne de requête.

<dataValueSet xmlns="http://dhis2.org/schema/dxf/2.0" dataElementIdScheme="code"
  orgUnitIdScheme="name" dryRun="true" importStrategy="CREATE">
</dataValueSet>

Notez que le paramètre preheatCache peut avoir un impact considérable sur les performances. Pour les petits fichiers d'importation, maintenir "faux" permettra de gagner en rapidité. Pour les gros fichiers d'importation qui contiennent un grand nombre d'éléments de données et d'unités d'organisation distincts, le définir sur "vrai" permettra de gagner en rapidité en termes d'ordre de grandeur.

Exigences en matière de valeur des données

L’importation de valeurs de données prend en charge un ensemble de types de valeurs. Chaque type de valeur a une exigence particulière. Le tableau suivant répertorie les cas extrêmes pour les types valeur.

Tableau : Exigences relatives au type de valeur

Type de valeur Conditions requises Commentaire
BOOLEAN vrai | C'est vrai | VRAI | faux | Faux | FAUX | 1 | 0 | t | f | Utilisé lorsque la valeur est booléenne, vraie ou fausse. Le service d'importation ne prête pas attention au fait que l'entrée commence par une lettre majuscule ou minuscule, ou qu'elle soit entièrement en lettres majuscules.

Schémas d'identification

En ce qui concerne les schémas d'identification, les identifiants utilisés dans les messages XML utilisent par défaut les identifiants d'objets stables de DHIS2 appelés UID. Dans certaines situations d'interopérabilité, il se peut qu'un système externe détermine les identifiants des objets. Dans ce cas, nous pouvons utiliser la propriété code des unités d'organisation et d'autres objets pour définir des identifiants fixes. Lors de l'importation des valeurs de données, nous devons donc référencer la propriété "code" et non la propriété "identifiant" de ces objets de métadonnées. Les schémas d'identification peuvent être spécifiés dans le message XML ainsi que dans la requête en tant que paramètres de requête. Pour les spécifier dans la charge utile XML, vous pouvez procéder comme suit :

<dataValueSet xmlns="http://dhis2.org/schema/dxf/2.0"
  dataElementIdScheme="CODE" orgUnitIdScheme="UID" idScheme="CODE">
</dataValueSet>

Le tableau des paramètres ci-dessus explique comment les schémas d'identification peuvent être spécifiés comme paramètres de requête. Les règles suivantes déterminent l'ordre de priorité :

  • Les schémas d'identification définis dans la charge utile XML ou JSON ont priorité sur les schémas d'identification définis comme paramètres de requête URL.

  • Les schémas d'identification spécifiques tels que dataElementIdScheme ou orgUnitIdScheme ont priorité sur le schéma d'identification général.

  • Si aucun schéma d'identification explicite n'est défini, le schéma d'identification par défaut est code pour le format ADX et uid pour tous les autres formats.

Les schémas d'identification suivants sont disponibles.

  • uid

  • code

  • name

  • attribut (suivi de l'UID de l'attribut)

L'option d'attribut est spéciale et fait référence aux attributs de métadonnées qui ont été marqués comme uniques. En utilisant cette option, l'attribut doit être immédiatement suivi de l'identifiant de l'attribut, par exemple "attribut : DnrLSdo4hMl".

Importation de valeurs de données asynchrones

Les valeurs de données peuvent être envoyées et importées de manière asynchrone à travers un paramètre de requête async défini sur vrai :

/api/dataValueSets?async=vrai

Cela lancera une tâche d'importation asynchrone dont vous pourrez surveiller l'état grâce à l'API de résumés des tâches. La réponse de l'API indique l'identifiant unique de la tâche, du type de tâche et de l'URL que vous pouvez utiliser pour surveiller l’état de l'importation. La réponse ressemblera à ceci :

{
  "httpStatus": "OK",
  "httpStatusCode": 200,
  "status": "OK",
  "message": "Initiated dataValueImport",
  "response": {
    "name": "dataValueImport",
    "id": "YR1UxOUXmzT",
    "created": "2018-08-20T14:17:28.429",
    "jobType": "DATAVALUE_IMPORT",
    "relativeNotifierEndpoint": "/api/system/tasks/DATAVALUE_IMPORT/YR1UxOUXmzT"
  }
}

Veuillez lire la section sur l'état des tâches asynchrones pour en savoir plus.

Format des valeurs de données CSV

La section suivante décrit le format CSV utilisé dans DHIS2. La première ligne est supposée être une ligne d'en-tête et sera ignorée lors de l'importation.

Tableau : format CSV de DHIS2

Colonne Obligatoire Description
Élément de données Oui Fait référence à l'ID par défaut, peut également être un nom et un code basés sur le schéma d'identification sélectionné
Période Oui Au format ISO
Unité d'organisation Oui Fait référence à l'ID par défaut, peut également être un nom et un code basés sur le schéma d'identification sélectionné
Combinaison d'options de catégorie Non Fait référence à l'ID
Combinaison d'options d'attribut Non Fait référence à l'ID (à partir de la version 2.16)
Valeur Non Valeur de données
Stocké par Non Fait référence au nom d'utilisateur de l'utilisateur qui a saisi la valeur
Dernière mise à jour Non Date au format ISO
Commentaire Non Commentaire en texte libre
Suivi Non vrai ou faux

Ci-dessous un exemple de fichier CSV pouvant être importé dans DHIS2 :

"dataelement","period","orgunit","catoptcombo","attroptcombo","value","storedby","timestamp"
"DUSpd8Jq3M7","201202","gP6hn503KUX","Prlt0C1RF0s",,"7","bombali","2010-04-17"
"DUSpd8Jq3M7","201202","gP6hn503KUX","V6L425pT3A0",,"10","bombali","2010-04-17"
"DUSpd8Jq3M7","201202","OjTS752GbZE","V6L425pT3A0",,"9","bombali","2010-04-06"

Génération d'un modèle d'ensemble de valeurs de données

Pour générer un modèle d'ensemble de valeurs de données pour un ensemble de données spécifique, vous pouvez utiliser la ressource /api/dataSets/<id>/dataValueSet. les formats de réponse XML et JSON sont pris en charge. Exemple:

/api/dataSets/BfMAe6Itzgt/dataValueSet

Ci-dessous les paramètres que vous pouvez utiliser pour ajuster davantage la sortie :

Tableau : Paramètres de requête de valeurs de données

Paramètre de requête Obligatoire Description
period Non La période d'utilisation ; elle sera incluse sans aucun contrôle.
orgUnit Non L'unité d'organisation à utiliser ; prend en charge plusieurs unités d'organisation ; l'identifiant et le code peuvent être utilisés.
commentaire Non Sur la prise en compte des commentaires, par défaut : Oui.
orgUnitIdScheme Non Schéma d'unité d'organisation à utiliser ; prend en charge l'identifiant | code.
dataElementIdScheme Non Schéma d'élément de données à utiliser ; prend en charge l'identifiant | code.

Lecture des valeurs de données

Pour lire les valeurs de données, vous pouvez effectuer une requête GET à la ressource suivante.

GET /api/dataValueSets

Data values can be retrieved in XML, JSON, CSV, and ADX format. Since we want to read data we will use the GET HTTP verb. We will also specify that we are interested in the XML resource representation by including an Accept HTTP header with our request. The following query parameters are available.

Tableau : Paramètres de requête d'ensemble de valeurs de données

Paramètre Description
dataSet (ensemble de données) Identifiant de l'ensemble de données. Peut être répété plusieurs fois.
dataElementGroup (groupe d'éléments de données) Identifiant du groupe d'éléments de données. Peut être répété autant de fois que vous le voulez (pas pris en charge pour le format ADX).
dataElement Identifiant de l'élément de données. Peut être répété plusieurs fois.
period Identifiant de période au format ISO. Peut être répété plusieurs fois.
startDate Date de début pour la période des valeurs à exporter.
endDate Date de fin pour la période des valeurs à exporter.
orgUnit Identifiant de l’unité d’organisation. Peut être répété plusieurs fois.
subordonnées Whether to include the children in the hierarchy of the organisation units. Boolean value (default false)
orgUnitGroup (groupe d'unités d'organisation) Identifiant du groupe d’unités d’organisation. Peut être répété plusieurs fois.
attributeOptionCombo (combinaison d'options d'attribut) Identifiant de la combinaison d’options d’attribut. Peut être répété plusieurs fois.
includeDeleted Permet de spécifier s'il faut inclure les valeurs de données supprimées.
lastUpdated (dernière mise à jour) Inclut uniquement les valeurs de données mises à jour depuis l'horodatage donné.
lastUpdatedDuration Inclut uniquement les valeurs de données mises à jour pendant la durée spécifique. Le format est <value><time-unit>, où les unités de temps prises en charge sont "j" (jours), "h" (heures), "m" (minutes) et "s" (secondes).
limite Le nombre maximum de résultats dans la réponse.
dataElementIdScheme Propriété de l'objet d'élément de données à utiliser pour les valeurs de données dans la réponse.
orgUnitIdScheme Propriété de l'objet d'unité d'organisation à utiliser pour les valeurs de données dans la réponse.
categoryOptionComboIdScheme Propriété de la combinaison d'options de catégorie à utiliser pour les valeurs de données dans la réponse.
attributOptionComboIdScheme (Schéma de l'identifiant de la combinaison d'options d'attribut) Propriété des objets de combinaison d'options d'attribut à utiliser pour les valeurs de données dans la réponse.
dataSetIdScheme (Schéma de l'identifiant de l'ensemble de données) Propriété de l'objet d'ensemble de données à utiliser dans la réponse.
categoryIdScheme (Schéma de l'identifiant de catégorie) Propriété de l'objet catégorie à utiliser dans la réponse (ADX uniquement).
categoryOptionIdScheme (Schéma d'identification des options de catégorie) Propriété de l'objet d'options de catégorie à utiliser dans la réponse (ADX uniquement).
idScheme Propriété de l'un des objets ci-dessus, s'ils ne sont pas spécifiés, à utiliser dans la réponse. S’il n’est pas spécifié, l’idScheme par défaut pour le format ADX est "code" et pour tous les autres formats, c'est "uid".
inputOrgUnitIdScheme Identifier property used for the provided orgUnit parameter values; id or code
inputDataSetIdScheme Identifier property used for the provided dataSet parameter values; id or code
inputDataElementGroupIdScheme Identifier property used for the provided dataElementGroup parameter values; id or code
inputDataElementIdScheme Identifier property used for the provided dataElement parameter values; id or code
inputIdScheme General identifier property used for all object types, specific identifier schemes will override the general scheme; id or code
compression Whether to compress the response payload; none, gzip or zip
attachment File name to use for the response, a non-blank value indicates rendering the response as an attachment.

Les paramètres suivants provenant de la liste ci-dessus sont requis : - dataSet ou dataElementGroup (pour le format ADX, cela doit être dataSet) - period, (startDate et endDate), lastUpdated, ou lastUpdatedDuration - orgUnit ou orgUnitGroup

Les formats de réponse suivants sont pris en charge :

  • xml (application/xml)

  • json (application/json)

  • csv (application/csv)

  • adx (application/adx+xml)

En supposant que nous avons publié les valeurs de données dans DHIS2 conformément à la section précédente intitulée Envoi de valeurs de données, nous pouvons maintenant constituer notre requête pour un ensemble de valeurs de données unique et l'exécuter en utilisant cURL :

curl "https://play.dhis2.org/demo/api/dataValueSets?dataSet=pBOMPrpg1QX&period=201401&orgUnit=DiszpKrYNg8"
  -H "Accept:application/xml" -u admin:district

Nous pouvons également utiliser les paramètres de requête "date de début" et "date de fin" pour demander un plus grand nombre de valeurs de données. En d'autres termes, vous pouvez également solliciter des valeurs de données pour plusieurs ensembles de données, unités d'organisation et périodes afin d'exporter de plus grandes quantités de données. Notez que le paramètre de requête "période" est prioritaire sur les paramètres "date de début" et "date de fin". Voici un exemple :

curl "https://play.dhis2.org/demo/api/dataValueSets?dataSet=pBOMPrpg1QX&dataSet=BfMAe6Itzgt
  &startDate=2013-01-01&endDate=2013-01-31&orgUnit=YuQRtpLP10I&orgUnit=vWbkYPRmKyS&children=true"
  -H "Accept:application/xml" -u admin:district

Pour récupérer les valeurs de données qui ont été créées ou mises à jour au cours des 10 derniers jours, vous pouvez effectuer la requête suivante :

/api/dataValueSets?dataSet=pBOMPrpg1QX&orgUnit=DiszpKrYNg8&lastUpdatedDuration=10d

La réponse ressemblera à ceci :

<?xml version='1.0' encoding='UTF-8'?>
<dataValueSet xmlns="http://dhis2.org/schema/dxf/2.0" dataSet="pBOMPrpg1QX"
  completeDate="2014-01-02" period="201401" orgUnit="DiszpKrYNg8">
<dataValue dataElement="eY5ehpbEsB7" period="201401" orgUnit="DiszpKrYNg8"
  categoryOptionCombo="bRowv6yZOF2" value="10003"/>
<dataValue dataElement="Ix2HsbDMLea" period="201401" orgUnit="DiszpKrYNg8"
  categoryOptionCombo="bRowv6yZOF2" value="10002"/>
<dataValue dataElement="f7n9E0hX8qk" period="201401" orgUnit="DiszpKrYNg8"
  categoryOptionCombo="bRowv6yZOF2" value="10001"/>
</dataValueSet>

Vous pouvez demander à ce que les données soient rendues au format JSON de la manière suivante :

/api/dataValueSets.json?dataSet=pBOMPrpg1QX&period=201401&orgUnit=DiszpKrYNg8

La réponse ressemblera à ceci :

{
  "dataSet": "pBOMPrpg1QX",
  "completeDate": "2014-02-03",
  "period": "201401",
  "orgUnit": "DiszpKrYNg8",
  "dataValues": [
    {
      "dataElement": "eY5ehpbEsB7",
      "categoryOptionCombo": "bRowv6yZOF2",
      "period": "201401",
      "orgUnit": "DiszpKrYNg8",
      "value": "10003"
    },
    {
      "dataElement": "Ix2HsbDMLea",
      "categoryOptionCombo": "bRowv6yZOF2",
      "period": "201401",
      "orgUnit": "DiszpKrYNg8",
      "value": "10002"
    },
    {
      "dataElement": "f7n9E0hX8qk",
      "categoryOptionCombo": "bRowv6yZOF2",
      "period": "201401",
      "orgUnit": "DiszpKrYNg8",
      "value": "10001"
    }
  ]
}

Notez que les valeurs de données sont supprimées de manière réversive (soft delete), c'est-à-dire qu'une valeur supprimée a la propriété deleted définie sur "true" et n'est pas supprimée de façon permanente. Ceci est utile lors de l'intégration de plusieurs systèmes afin de signaler les suppressions. Vous pouvez inclure les valeurs supprimées dans la réponse comme suit :

/api/dataValueSets.json?dataSet=pBOMPrpg1QX&period=201401
  &orgUnit=DiszpKrYNg8&includeDeleted=true

Vous pouvez également demander à ce que les données soient rendues au format CSV de la manière suivante :

/api/dataValueSets.csv?dataSet=pBOMPrpg1QX&period=201401&orgUnit=DiszpKrYNg8

La réponse ressemblera à ceci :

dataelement,period,orgunit,catoptcombo,attroptcombo,value,storedby,lastupdated,comment,flwup
f7n9E0hX8qk,201401,DiszpKrYNg8,bRowv6yZOF2,bRowv6yZOF2,12,system,2015-04-05T19:58:12.000,comment1,false
Ix2HsbDMLea,201401,DiszpKrYNg8,bRowv6yZOF2,bRowv6yZOF2,14,system,2015-04-05T19:58:12.000,comment2,false
eY5ehpbEsB7,201401,DiszpKrYNg8,bRowv6yZOF2,bRowv6yZOF2,16,system,2015-04-05T19:58:12.000,comment3,false
FTRrcoaog83,201401,DiszpKrYNg8,bRowv6yZOF2,bRowv6yZOF2,12,system,2014-03-02T21:45:05.519,comment4,false

Request data values in CSV format compressed with gzip:

/api/dataValueSets.csv?dataSet=pBOMPrpg1QX&period=202401&orgUnit=DiszpKrYNg8&compression=gzip

The response will be in compressed CSV format. The content can be uncompressed with the gunzip tool.

Les contraintes suivantes s'appliquent à la ressource Ensembles de valeurs de données :

  • Au moins un ensemble de données doit être spécifié.

  • Soit au moins une période, soit une date de début et une date de fin doivent être spécifié.

  • Au moins une unité d'organisation doit être spécifiée.

  • Les unités d'organisation doivent faire partie de la hiérarchie des unités d'organisation de l’utilisateur authentifié.

  • La limite ne peut pas être inférieure à zéro.

Envoi, lecture et suppression de valeurs de données individuelles

Cet exemple montrera comment envoyer des valeurs de données individuelles à enregistrer dans une requête. Ceci peut être réalisé par l'envoi d'une requête POST à la ressource dataValues :

POST /api/dataValues

Les paramètres de requête suivants sont pris en charge pour cette ressource :

Tableau : Paramètres de requête de valeurs de données

Paramètre de requête Obligatoire Description
de Oui Identifiant de l'élément de données
pe Oui Identifiant de période
ou Oui Identifiant de l'unité d'organisation
co Non Identifiant de la combinaison d'options de catégorie, la valeur par défaut sera utilisée en cas d'omission
cc Non (doit être combiné avec cp) Identifiant de la combinaison de catégories d'attribut
cp Non (doit être combiné avec cc) Identifiants d'options de catégories d'attribut, séparés par ; pour plusieurs valeurs
ds Non Ensemble de données permettant de vérifier si la fonction POST or DELETE (publier ou supprimer) est autorisée pour la période et l'unité d'organisation. S'il est spécifié, l'élément de données doit être affecté à cet ensemble de données. Dans le cas contraire, un ensemble de données contenant l'élément de données sera sélectionné pour vérifier si l'opération est autorisée.
value Non Valeur de données. Pour les valeurs booléennes, les éléments suivants seront acceptés : vrai | Vrai | VRAI | faux | Faux | FAUX | 1 | 0 | t | f |
commentaire Non Commentaire sur les données
followUp Non Le suivi de la valeur de données permet de faire basculer la valeur booléenne actuelle

Si l'un des identifiants fournis n'est pas valide, si la valeur de données ou le commentaire n'est pas valide ou si les données sont verrouillées, la réponse contiendra le code d'état 409 Conflict et un message texte descriptif. Si l'opération conduit à une valeur enregistrée ou mise à jour, 200 OK sera renvoyé. Ci-après, un exemple de requête :

curl "https://play.dhis2.org/demo/api/dataValues?de=s46m5MS0hxu
  &pe=201301&ou=DiszpKrYNg8&co=Prlt0C1RF0s&value=12"
  -X POST -u admin:district

Cette ressource permet également une syntaxe spéciale pour associer la valeur à une combinaison d'options d'attribut. Pour ce faire, il suffit d'envoyer l'identifiant de la combinaison de catégories d'attribut, ainsi que les identifiants des options de catégories d'attribut que la valeur représente au sein de la combinaison. La combinaison de catégories est spécifiée avec le paramètre cc, tandis que les options de catégorie sont spécifiées sous la forme d'une chaîne de caractères séparés par des points-virgules avec le paramètre cp. Il faut s'assurer que les options de catégorie font toutes partie de la combinaison de catégories. Voici un exemple :

curl "https://play.dhis2.org/demo/api/dataValues?de=s46m5MS0hxu&ou=DiszpKrYNg8
  &pe=201308&cc=dzjKKQq0cSO&cp=wbrDrL2aYEc;btOyqprQ9e8&value=26"
  -X POST -u admin:district

Vous pouvez récupérer une valeur de données avec une requête en utilisant la méthode GET. Les paramètres de valeur, de commentaire et de suivi ne sont pas applicables ici :

curl "https://play.dhis2.org/demo/api/dataValues?de=s46m5MS0hxu
  &pe=201301&ou=DiszpKrYNg8&co=Prlt0C1RF0s"
  -u admin:district

Vous pouvez supprimer une valeur de données avec une requête en utilisant la méthode DELETE.

Envoi de valeurs de données individuelles sous forme de charge utile

Vous pouvez envoyer des valeurs de données individuelles sous forme de charge utile JSON en utilisant la ressource suivante avec Content-Type : application/json.

POST /api/dataValues

La ressource créera une nouvelle valeur de données ou mettra à jour une valeur de données si elle existe déjà. Le format de charge utile JSON est défini ci-dessous.

{
  "dataElement": "fbfJHSPpUQD",
  "categoryOptionCombo": "PT59n8BQbqM",
  "period": "202201",
  "orgUnit": "DiszpKrYNg8",
  "value": "10",
  "comment": "OK"
}

Le point d'extrémité prend en charge la spécification de combinaisons d’options d’attribut dans une structure imbriquée.

{
  "dataElement": "BOSZApCrBni",
  "categoryOptionCombo": "TkDhg29x18A",
  "attribute": {
    "combo": "O4VaNks6tta",
    "options": [
      "C6nZpLKjEJr", "i4Nbp8S2G6A"
    ]
  },
  "dataSet": "lyLU2wR22tC",
  "period": "202201",
  "orgUnit": "DiszpKrYNg8",
  "value": "15",
  "comment": "Good"
}

Le code d'état sera 201 Créé si la valeur de données a été enregistrée ou mise à jour avec succès, ou 409 Conflit en cas d'erreur de validation.

Utilisation des valeurs de données de fichiers

Lorsqu'il s'agit de valeurs de données dont l'élément de données est de type fichier, la méthode décrite ci-dessus ne s'applique plus. Ces valeurs de données sont spéciales dans la mesure où le contenu de la valeur est une référence UID à un objet FileResource et non une constante autonome. Ces valeurs de données se comportent comme les autres valeurs de données qui stockent du contenu textuel, mais elles doivent être traitées différemment afin de produire des entrées et des sorties pertinentes.

Il existe deux méthodes pour stocker les valeurs de données des ressources de fichiers.

  • Téléchargez le fichier sur le point d'extrémité /api/dataValues/file tel que décrit dans la section des ressources de fichiers. Cela fonctionne avec les versions 2.36 et supérieures.

  • Si vous écrivez un code qui doit être compatible avec les versions DHIS2 inférieures à la 2.36, alors le processus est le suivant :

  • Télécharger le fichier sur le endpoint /api/fileResources tel que décrit dans la section des ressources de fichiers.

  • Récupérez la propriété id de la ressource de fichier renvoyée.

  • Stockez l'identifiant récupéré avec la propriété valeur de la valeur de données et en utilisant l'une des méthodes décrites ci-dessus.

Seules les relations un à un entre les valeurs de données et les ressources de fichiers sont autorisées. Cette règle est appliquée en interne, de sorte que l'enregistrement de l'identifiant d'une ressource de fichier dans plusieurs valeurs de données ne soit pas possible et entraîne une erreur. La suppression de la valeur de données entraîne la suppression de la ressource de fichier référencée. La suppression directe des ressources de fichiers n'est pas possible.

La valeur de données peut maintenant être récupérée normalement, mais c'est l'UID de la ressource du fichier qui sera renvoyé. Afin de récupérer le vrai contenu (c'est-à-dire le fichier stocké dans la ressource associée à la valeur de données), vous devez effectuer une requête GET à /api/dataValues/files en reproduisant les paramètres de la requête comme pour la valeur de données elle-même. Le endpoint /api/dataValues/files ne prend en charge que les requêtes GET.

Il convient de noter qu'en raison du fonctionnement asynchrone du mécanisme de stockage sous-jacent, le contenu du fichier peut ne pas être immédiatement téléchargeable à partir du endpoint /api/dataValues/files. Ceci est particulièrement valable pour les fichiers volumineux qui peuvent nécessiter des téléchargements en arrière-plan vers un entrepôt de fichiers externe (en fonction de la configuration du système). Récupérer les métadonnées de la ressource du fichier à partir du endpoint /api/fileResources/<id> permet de vérifier le storageStatus (état du stockage) du contenu avant d'essayer de le télécharger.

Format de données ADX

Depuis la version 2.20, nous prenons en charge une norme internationale d'échange de données agrégées appelée ADX. ADX est développé et maintenu par le comité Quality, Research and Public Health (Qualité, Recherche et Santé Publique) de l'IHE (Integrating the HealthCare Enterprise). La page wiki décrivant les activités du comité QRPH se trouve à l'adresse wiki.ihe.net. ADX fait toujours l'objet d'un développement actif et a maintenant été publié pour une implémentation à titre expérimental. Notez qu'actuellement, c'est la fonctionnalité de lecture et d'écriture des données formatées ADX qui est implémentée dans DHIS2, c'est-à-dire ce qui est décrit comme acteurs Consommateur de Contenu et Producteur de Contenu dans le profil ADX.

La structure d'un message de données ADX est assez similaire à celle des données DXF 2 décrites précédemment et que vous connaissez probablement. Il existe quelques différences importantes. Nous les décrirons à l'aide d'un petit exemple :

<adx xmlns="urn:ihe:qrph:adx:2015" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="urn:ihe:qrph:adx:2015 ../schema/adx_loose.xsd"
  exported="2015-02-08T19:30:00Z">
  <group orgUnit="OU_559" period="2015-06-01/P1M"
    completeDate="2015-07-01" dataSet="(TB/HIV)VCCT">
    <dataValue dataElement="VCCT_0" GENDER="FMLE" HIV_AGE="AGE0-14" value="32"/>
    <dataValue dataElement="VCCT_1" GENDER="FMLE" HIV_AGE="AGE0-14" value="20"/>
    <dataValue dataElement="VCCT_2" GENDER="FMLE" HIV_AGE="AGE0-14" value="10"/>
    <dataValue dataElement="PLHIV_TB_0" GENDER="FMLE" HIV_AGE="AGE0-14" value="10"/>
    <dataValue dataElement="PLHIV_TB_1" GENDER="FMLE" HIV_AGE="AGE0-14" value="10"/>

    <dataValue dataElement="VCCT_0" GENDER="MLE" HIV_AGE="AGE0-14" value="32"/>
    <dataValue dataElement="VCCT_1" GENDER="MLE" HIV_AGE="AGE0-14" value="20"/>
    <dataValue dataElement="VCCT_2" GENDER="MLE" HIV_AGE="AGE0-14" value="10"/>
    <dataValue dataElement="PLHIV_TB_0" GENDER="MLE" HIV_AGE="AGE0-14" value="10"/>
    <dataValue dataElement="PLHIV_TB_1" GENDER="MLE" HIV_AGE="AGE0-14" value="10"/>

    <dataValue dataElement="VCCT_0" GENDER="FMLE" HIV_AGE="AGE15-24" value="32"/>
    <dataValue dataElement="VCCT_1" GENDER="FMLE" HIV_AGE="AGE15-24" value="20"/>
    <dataValue dataElement="VCCT_2" GENDER="FMLE" HIV_AGE="AGE15-24" value="10"/>
    <dataValue dataElement="PLHIV_TB_0" GENDER="FMLE" HIV_AGE="AGE15-24" value="10"/>
    <dataValue dataElement="PLHIV_TB_1" GENDER="FMLE" HIV_AGE="AGE15-24" value="10"/>

    <dataValue dataElement="VCCT_0" GENDER="MLE" HIV_AGE="AGE15-24" value="32"/>
    <dataValue dataElement="VCCT_1" GENDER="MLE" HIV_AGE="AGE15-24" value="20"/>
    <dataValue dataElement="VCCT_2" GENDER="MLE" HIV_AGE="AGE15-24" value="10"/>
    <dataValue dataElement="PLHIV_TB_0" GENDER="MLE" HIV_AGE="AGE15-24" value="10"/>
    <dataValue dataElement="PLHIV_TB_1" GENDER="MLE" HIV_AGE="AGE15-24" value="10"/>
  </group>
</adx>

L'élément racine ADX

L'élément racine ADX n'a qu'un seul attribut obligatoire, qui est l'horodatage exporté. Comme d'autres éléments ADX, le schéma est extensible dans le sens où il ne restreint pas les attributs spécifiques d'applications supplémentaires.

L'élément de groupe ADX

Contrairement à dxf2, ADX exige que les valeurs de données soient regroupées par unité d'organisation, période et ensemble de données. L'exemple ci-dessus montre un rapport de données pour l'ensemble de données "( TB/VIH) VCCT" de la base de données de démonstration en ligne. Cet exemple utilise des codes comme identifiants et non des uids dhis2. Le code est la forme d'identifiant recommandée lors de l'utilisation d'ADX.

Les attributs d'unité d'organisation, de période et d'ensemble de données sont obligatoires dans ADX. L'élément de groupe peut contenir des attributs supplémentaires. Dans notre implémentation de DHIS2, tout attribut supplémentaire est simplement transmis à l'importateur sous-jacent. Cela signifie que tous les attributs qui ont actuellement une signification dans dxf2 (comme completeDate dans l'exemple ci-dessus) peuvent continuer à être utilisés dans ADX et seront traités de la même manière.

Une différence importante entre ADX et dxf2 réside dans la manière dont les périodes sont encodées. ADX utilise strictement la norme ISO8601 et encode la période de déclaration sous la forme (date|heure) / (durée). Dans l'exemple ci-dessus, la période est donc une période d'un mois (P1M) qui commence le 01-06-2015. Il s'agit donc des données de juin 2015. La notation est un peu plus longue, mais elle est très souple et nous permet de prendre en charge tous les types de période existants dans DHIS2.

Définitions des périodes ADX

Les périodes commencent par la date à laquelle la durée commence, suivie d'un "/" et de la notation de la durée, comme indiqué dans le tableau. Le tableau suivant détaille tous les types de période dans DHIS2 et la manière dont ils sont représentés en ADX, ainsi que des exemples.

Tableau : Périodes ADX

Type de période Notation de durée Exemple(s) Durée(s)
Quotidien  P1D 01-10-2017/P1M 01 octobre 2017
Hebdomadaire P7D 02-10-2017/P7D 02 octobre 2017-08 octobre 2017
Hebdomadaire Mercredi P7D 04-10-2017/P7D 04 octobre 2017-10 octobre 2017
Hebdomadaire Jeudi P7D 05-10-2017/P7D 05 octobre 2017-11 octobre 2017
Hebdomadaire Samedi P7D 07-10-2017/P7D 07 octobre 2017-13 octobre 2017
Hebdomadaire Dimanche P7D 01-10-2017/P7D 01 octobre 2017-07 octobre 2017
Bihebdomadaire P14D 02-10-2017/P14D 02 octobre 2017-15 octobre 2017
Mensuelle P1M 01-10-2017/P1M 01 octobre 2017-31 octobre 2017
Bimensuel P2M 01-11-2017/P2M 01 novembre 2017-31 décembre 2017
Trimestriel P3M 01-09-2017/P3M 01 septembre 2017-31 décembre 2017
Semestriel P6M 01-01-2017/P6M
01-07-2017/P6M
1er janvier 2017-30 juin 2017
1er juillet 2017-31 décembre 2017
Semestriel Avril P6M 01-04-2017/P6M
01-10-2017/P6M
1er avril 2017-30 septembre 2017
1er octobre 2017-31 mars 2018
Semestriel Novembre P6M 01-10-2017/P6M
01-05-2018/P6M
1er novembre 2017-30 avril 2018
1er mai 2018-31 octobre 2018
Annuel P1Y 01-01-2017/P1Y 01 janvier 2017-31 décembre 2017
Financière Avril P1Y 01-04-2017/P1Y 1er avril 2017-31 mars 2018
Financière Juillet P1Y 01-07-2017/P1Y 1er juillet 2017-30 juin 2018
Financière Octobre P1Y 01-10-2017/P1Y 01 octobre 2017-30 septembre 2018
Financière Novembre P1Y 01-11-2017/P1Y 01 novembre 2017-31 octobre 2018

Valeurs de données ADX

L'élément "valeur de données" dans ADX est très similaire à son équivalent dans DXF. Les attributs obligatoires sont élément de données et valeur. Les attributs unité d'organisation et période n'apparaissent pas dans l'élément "valeur de données" car ils sont requis au niveau groupe.

La différence la plus significative est la manière dont la désagrégation est représentée. DXF utilise la combinaison d'options de catégorie pour représenter la désagrégation des données. Dans ADX, les désagrégations (par exemple GROUPE_D'ÂGE et SEXE) sont exprimées explicitement en tant qu'attributs. Si vous utilisez code comme schéma d'identification pour catégorie, vous devez attribuer un code à toutes les catégories utilisées pour les éléments de données de l'ensemble de données et, de plus, ce code doit pouvoir être utilisé en tant qu'attribut XML. La contrainte concernant un nom d'attribut XML est décrite dans la norme XML du W3C. En pratique, cela signifie qu'il n'y a pas d'espaces, pas de caractères non alphanumériques autres que "_" et que le nom ne peut pas commencer par une lettre. L'exemple ci-dessus montre des exemples de "bons" codes de catégorie ("GENRE" et "ÂGE_VIH"). Les mêmes restrictions s'appliquent si vous utilisez nom ou attribut comme schémas d'identification.

Dans ADX, seuls les identifiants de catégorie sont utilisés comme attributs XML ; les identifiants d'autres types de métadonnées ne doivent pas être utilisés comme attributs XML. Notez que cette syntaxe n'est pas appliquée par DHIS2 lorsque vous attribuez des noms, des codes ou des attributs DHIS2, mais vous obtiendrez un message d'erreur avec une explication si vous essayez d'importer des données ADX et que les identifiants de catégorie ne sont pas attribués ou ne conviennent pas.

Les principaux avantages de l’utilisation de dimensions explicites de données désagrégées sont les suivants :

  • Le système qui produit les données n'a pas besoin d'être synchronisé avec la combinaison d'options de catégorie dans DHIS2.

  • Le producteur et le consommateur peuvent faire correspondre leurs codes à une source tierce qui fait autorité, telle qu'un service de terminologie. Notez que dans l'exemple ci-dessus, les codes de genre et de groupe d'âge utilisent des listes de codes de l'Observatoire mondial de la santé de l'OMS.

Cette fonction peut être très utile, par exemple pour produire des données désagrégées à partir d'un système de DME, mais il peut arriver qu'un mapping de combinaison d'options de catégorie soit plus facile ou plus souhaitable. L'implémentation d'ADX dans DHIS2 permettra de vérifier l'existence d'un attribut de combinaison d'options de catégorie et, s'il existe, de l'utiliser au lieu des attributs de dimension ventilés. De même, un attribut de combinaison d'options d'attributs sur l'élément groupe sera traité de la même manière que les attributs existants. Sinon, la combinaison d'options d'attributs peut être utilisée comme catégories ventilées, comme pour la valeur de données.

Dans l'exemple simple ci-dessus, tous les éléments de données de l'ensemble de données ont la même dimensionnalité (combinaison de catégories), ce qui rend les données parfaitement rectangulaires. Les ensembles de données peuvent contenir des éléments de données ayant des combinaisons de catégories différentes, ce qui donne un message de données ADX décalé vers la droite (c'est-à-dire que les valeurs des différents éléments de données peuvent avoir des nombres de catégories différents).

Importation de données ADX

DHIS2 expose un point d'extrémité pour les données POST ADX à /api/dataValueSets en utilisant application/xml+adx comme type de contenu. Ainsi, par exemple, la commande curl suivante peut être utilisée pour POST (envoyer) les données de l'exemple ci-dessus au serveur de démonstration DHIS2 :

curl -u admin:district -X POST -H "Content-Type: application/adx+xml"
  -d @data.xml "https://play.dhis2.org/demo/api/dataValueSets?dataElementIdScheme=code&orgUnitIdScheme=code"

Notez que les paramètres de requête sont les mêmes que ceux utilisés avec les données DXF. Le point d'extrémité ADX doit interpréter tous les paramètres DXF existants avec la même sémantique que DXF.

Exportation de données ADX

DHIS2 expose un point d'extrémité pour les ensembles de données GET ADX dans /api/dataValueSets en utilisant application/xml+adx comme type de contenu. Ainsi, par exemple, la commande curl suivante peut être utilisée pour récupérer les données ADX :

curl -u admin:district -H "Accept: application/adx+xml"
 "https://play.dhis2.org/demo/api/dataValueSets?dataValueSets?orgUnit=M_CLINIC&dataSet=MALARIA&period=201501"

Notez que les paramètres de requête sont les mêmes que ceux utilisés avec les données DXF. Une différence importante est que les identifiants d'ensemble de données et d'unité d'organisation peuvent être soit des uids, soit des codes.

Suivi

Cette section traite du marquage des données pour le suivi.

Suivi des valeurs de données

Le endpoint de suivi des valeurs de données permet de marquer les valeurs de données pour le suivi.

PUT /api/36/dataValues/followup

La charge au format JSON ressemble à ceci :

{
  "dataElement": "s46m5MS0hxu",
  "period": "202005",
  "orgUnit": "DiszpKrYNg8",
  "categoryOptionCombo": "psbwp3CQEhs",
  "attributeOptionCombo": "HllvX50cXC0",
  "followup": true
}

Les champs categoryOptionCombo et attributeOptionCombo sont facultatifs. Une charge JSON minimale ressemble à ceci :

{
  "dataElement": "s46m5MS0hxu",
  "period": "202005",
  "orgUnit": "DiszpKrYNg8",
  "followup": false
}

Le champ followup doit être défini sur true pour marquer une valeur de données pour le suivi, et sur false pour retirer le marquage.

Le code d'état de la réponse sera 200 OK si l'opération réussit, et 409 Conflict en cas d'erreur avec la requête.

Pour mettre à jour plusieurs valeurs de données à la fois pour le suivi :

PUT /api/dataValues/followups

avec la charge utile JSON :

{
  "values": [
    {
      "dataElement": "s46m5MS0hxu",
      "period": "202005",
      "orgUnit": "DiszpKrYNg8",
      "categoryOptionCombo": "psbwp3CQEhs",
      "attributeOptionCombo": "HllvX50cXC0",
      "followup": true
    }
  ]
}

Chaque élément de cette mise à jour comporte les mêmes champs et exigences que le point d'extrémité de la mise à jour unique.

La mise à jour groupée renvoie également 200 OK en cas de succès ou 409 Conflit en cas d'erreurs dans la requête.

Validation de données

Validation

Pour générer un résumé de validation des données, vous pouvez interagir avec la ressource de validation. La ressource "ensemble de données" est optimisée pour les clients chargés de la saisie des données et de la validation d'un ensemble de données ou d'un formulaire. Elle est accessible de la manière suivante :

GET /api/33/validation/dataSet/QX4ZTUbOt3a.json?pe=201501&ou=DiszpKrYNg8

En plus de la validation des règles basées sur un ensemble de données, il existe deux méthodes supplémentaires de validation : validation personnalisée et validation programmée.

La première variable de chemin d'accès est un identifiant qui fait référence à l'ensemble de données à valider. Les représentations XML et JSON des ressources sont prises en charge. La réponse contient les violations des règles de validation. Cette fonction sera étendue à d'autres types de validation dans les versions à venir.

Pour récupérer les règles de validation relatives à un ensemble de données spécifique, c'est-à-dire les règles de validation avec des formules où tous les éléments de données font partie de l'ensemble de données en question, vous pouvez effectuer une requête GET à la ressource validationRules de la manière suivante :

GET /api/validationRules?dataSet=<dataset-id>

Les règles de validation ont un côté gauche et un côté droit, dont la validité est comparée en fonction d'un opérateur. Les valeurs valides de l'opérateur sont indiquées dans le tableau ci-dessous.

Tableau : Opérateurs

Valeur Description
égale_à Egal à
pas_égale_à Pas égal à
supérieure_à Supérieur à
supérieure_ou_égale_à_ Supérieur ou égal à
inférieure_à Inférieur à
inférieur_ou_égal_à_ inférieur ou égal à
paire_obligatoire Si l’un des côtés est présent, l’autre doit également l’être.
paire_exclusive Si l’un des côtés est présent, l’autre ne doit pas être

Les expressions du côté gauche et du côté droit sont des expressions mathématiques qui peuvent contenir des références à des éléments de données et à des combinaisons d'options de catégorie au format suivant :

${<dataelement-id>.<catoptcombo-id>}

Les expressions du côté gauche et du côté droit ont une stratégie de valeur manquante. Cette stratégie indique comment le système doit traiter les valeurs de données manquantes pour les références d'éléments de données ou de combinaisons d'options de catégorie dans la formule, en déterminant si la règle de validation doit être vérifiée ou ignorée. Les stratégies de valeurs manquantes valides sont présentées dans le tableau ci-dessous.

Tableau : Stratégies de valeur manquante

Valeur Description
IGNORER_SI_UNE_VALEUR_MANQUE Ignore la règle de validation si une valeur de données est manquante
IGNORER_SI_TOUTES-LES_VALEURS_MANQUENT Ignore la règle de validation si toutes les valeurs de données sont manquantes
NE-JAMAIS_IGNORER N'ignore jamais la règle de validation, quelles que soient les valeurs de données manquantes

Résultats de la validation

Les résultats de validation sont les résultats des violations constatées lors d'une analyse de validation. Si vous choisissez "conserver les résultats" lorsque vous lancez ou programmez une analyse de validation, toutes les violations constatées seront stockées dans la base de données. Lorsqu'un résultat est stocké dans la base de données, il est utilisé à trois fins :

  1. Générer des analyses basées sur les résultats stockés.

  2. Les résultats qui n'ont pas généré de notification le feront, une fois.

  3. Garder la trace des résultats qui ont généré ou non une notification.

  4. Ignorer les règles déjà vérifiées lors de l'analyse de validation.

Cela signifie que si vous ne conservez pas vos résultats, vous ne pourrez pas générer d'analyses pour les résultats de validation. Si cette option est sélectionnée, les résultats généreront des notifications à chaque fois qu'il y en aura et l'analyse de validation pourrait être plus lente.

Résultats de la validation de la requête

Les résultats de validation conservés peuvent être consultés au point d'extrémité suivant :

GET /api/33/validationResults

Vous pouvez également inspecter un résultat individuel à l'aide de l'identifiant du résultat de validation dans ce endpoint :

GET /api/33/validationResults/<id>

Les résultats de validation peuvent également être filtrés par les propriétés suivantes :

  • Unité d'organisation : ou=<UID>
  • Règle de validation : vr=<UID>
  • Période : pe=<ISO-expression>

Chacune des propriétés de filtre ci-dessus peut apparaître plusieurs fois, par exemple :

GET /api/36/validationResults?ou=jNb63DIHuwU&ou=RzgSFJ9E46G

Si plusieurs valeurs pour le même filtre sont combinées avec OR, les résultats devront correspondre à l'une des valeurs données.

Si plusieurs propriétés de filtre sont utilisées et qu'elles sont combinées avec AND, les résultats devront correspondre à l'une des valeurs de chacune des propriétés.

Pour le filtre de période, les résultats doivent se superposer à l'une des périodes spécifiées.

De plus, les résultats de validation peuvent également être filtrés en fonction de leur date de création :

GET /api/36/validationResults?createdDate=<date>

Ce filtre peut être combiné avec n’importe quel autre filtre.

Déclencher des notifications de résultats de validation

Les résultats de la validation sont envoyés aux utilisateurs concernés une fois par jour. Ils peuvent également être déclenchés manuellement pour être exécutés sur demande, via le point d'extrémité de l'API suivant :

POST /api/33/validation/sendNotifications

Seuls les résultats non envoyés sont envoyés via ce endpoint.

Supprimer les résultats de validation

Les résultats de validation peuvent être supprimés manuellement en utilisant l'ID,

DELETE /api/36/validationResults/<id>

ou les filtres

DELETE /api/36/validationResults?<filters>

Les paramètres de filtre pris en charge sont :

  • ou=<UID> pour faire correspondre tous les résultats de validation d'une unité d'organisation. Plusieurs unités utilisent 'OU' lorsque le paramètre est fourni plus d'une fois
  • vr=<UID> pour faire correspondre tous les résultats de validation d'une règle de validation. Plusieurs règles utilisent 'OU' lorsque le paramètre est fourni plus d'une fois
  • pe=<ISO-expression> pour faire correspondre tous les résultats de validation liés à une période qui se superpose à la période spécifiée
  • created=<ISO-expression> pour faire correspondre tous les résultats de validation créés au cours de la période fournie
  • notificationSent=<boolean> pour faire correspondre uniquement les résultats de validation pour lesquels une notification a été ou n'a pas été envoyée

If filters are combined, all conditions have to be true (AND logic).

Quelques exemples:

Pour supprimer tous les résultats de validation liés à l'unité d'organisation avec l'UID NqwvaQC1ni4 pour le premier trimestre (Q1) 2020, utilisez :

DELETE /api/36/validationResults?ou=NqwvaQC1ni4&pe=2020Q1

Pour supprimer tous les résultats de validation créés au cours de la semaine 1 de 2019 et pour lesquels une notification a été envoyée, utilisez :

DELETE /api/36/validationResults?created=2019W1&notificationSent=true

Toute opération de suppression nécessitera l'autorité Effectuer des tâches de maintenance.

Détection des valeurs atypiques

Le point d'extrémité de détection des valeurs atypiques permet de détecter les valeurs atypiques parmi les valeurs de données agrégées.

GET /api/36/outlierDetection

Ce endpoint prend en charge deux algorithmes pour détecter les valeurs atypiques :

  • Z-score : Le z-score est défini comme l'écart absolu entre le score et la moyenne divisé par l'écart type. Un paramètre de seuil faisant référence au nombre d'écarts types par rapport à la moyenne doit être spécifié avec l'algorithme z-score pour définir les limites supérieure et inférieure de ce qui est considéré comme une valeur atypique.
  • Z-score modifié : Identique au z-score, à la différence qu'il utilise la médiane au lieu de la moyenne comme mesure de la tendance centrale. Les paramètres sont les mêmes que pour le Z-score.
  • Min-max: Min-max data element values refers to custom boundaries which can be inserted in DHIS2 based on data element, org unit and category option combination.
  • Invalid numeric values: This algorithm detects data values which cannot be cast to numeric values. This usually occurs when data values have been entered with a very large number of digits.

Les valeurs atypiques seront classées selon leur importance, par défaut selon l'écart absolu par rapport à la moyenne, avec la valeur la plus importante en premier. Ceci permet d'identifier rapidement les valeurs atypiques qui ont le plus grand impact sur la qualité et l’analyse des données.

Paramètres de requête{ #request-query-parameters }

Les paramètres de requête suivants sont pris en charge.

Paramètre de requête Description Obligatoire Options (par défaut en premier)
ds Ensemble de données, peut être spécifié plusieurs fois. Non [*] Identifiant de l'ensemble de données.
de Élément de données, peut être spécifié plusieurs fois. Non [*] Identifiant de l'élément de données.
startDate Date en début de l'intervalle pour contrôler les valeurs atypiques. Oui Date (aaaa-MM-jj).
endDate Date en fin de l'intervalle pour vérifier les valeurs atypiques. Oui Date (aaaa-MM-jj).
ou Unité d'organisation, peut être spécifiée plusieurs fois. Oui Identifiant de l’unité d’organisation.
algorithm Algorithme à utiliser pour la détection des valeurs atypiques. Non Z_SCORE, MIN_MAX, MOD_Z_SCORE, INVALID_NUMERIC
threshold Seuil pour les valeurs atypiques. Algorithmes Z_SCORE et MOD_Z_SCORE uniquement. Non Numérique, supérieur à zéro. Par défaut : 3,0.
dataStartDate Date en début de l'intervalle pour le calcul de la moyenne et de l'écart type. Algorithmes Z_SCORE et MOD_Z_SCORE uniquement. Non Date (aaaa-MM-jj).
dataEndDate Date en fin de l'intervalle pour le calcul de la moyenne et de l'écart type. Algorithmes Z_SCORE et MOD_Z_SCORE uniquement. Non Date (aaaa-MM-jj).
orderBy Field to order by. Z_SCORE and MOD_Z_SCOREalgorithm only. Non MEAN_ABS_DEV, Z_SCORE
maxResults Limite maximale pour la sortie. Non Integer, greater than zero and less than system setting keyDataQualityMaxLimit Default: 500.

[*] Vous devez spécifier soit des ensembles de données avec le paramètre ds, qui intégrera tous les éléments de données dans les ensembles de données, ou spécifier des éléments de données avec le paramètre de.

Au moins un ensemble de données ou élément de données, une date de début et une date de fin, et au moins une unité d'organisation doivent être définis.

Les paramètres startDate et endDate sont obligatoires et font référence à l'intervalle de temps dans lequel vous voulez détecter les valeurs atypiques. Les paramètres dataStartDate et dataEndDate sont facultatifs et font référence à l'intervalle de temps à utiliser pour les données lors du calcul de la moyenne et de l'écart type. Ils sont utilisés pour calculer éventuellement le z-score.

Utilisation et exemples

Obtenez les valeurs atypiques à l'aide de l'algorithme z-score par défaut :

GET /api/36/outlierDetection?ds=BfMAe6Itzgt&ds=QX4ZTUbOt3a
  &ou=O6uvpzGd5pu&ou=fdc6uOvgoji&startDate=2020-01-01&endDate=2020-12-31

Pour obtenir des valeurs atypiques à l'aide d'un algorithme et d'un seuil spécifiques :

GET /api/36/outlierDetection?ds=BfMAe6Itzgt&ds=QX4ZTUbOt3a
  &ou=O6uvpzGd5pu&startDate=2020-01-01&endDate=2020-12-31
  &algorithm=Z_SCORE&threshold=2.5

Pour obtenir les valeurs atypiques classées par z-score :

GET /api/36/outlierDetection?ds=BfMAe6Itzgt
  &ou=O6uvpzGd5pu&startDate=2020-01-01&endDate=2020-12-31
  &orderBy=Z_SCORE

Pour obtenir les 10 principales valeurs atypiques :

GET /api/36/outlierDetection?ds=BfMAe6Itzgt
  &ou=O6uvpzGd5pu&startDate=2020-01-01&endDate=2020-12-31
  &maxResults=10

Obtenez des valeurs atypiques avec un intervalle défini pour les données à utiliser lors du calcul de la moyenne et de l'écart type :

GET /api/36/outlierDetection?ds=BfMAe6Itzgt
  &ou=O6uvpzGd5pu&startDate=2020-01-01&endDate=2020-12-31
  &dataStartDate=2018-01-01&dataEndDate=2020-12-31

Pour obtenir les valeurs atypiques à l'aide de l'algorithme min-max :

GET /api/36/outlierDetection?ds=BfMAe6Itzgt&ds=QX4ZTUbOt3a
  &ou=O6uvpzGd5pu&ou=fdc6uOvgoji&startDate=2020-01-01&endDate=2020-12-31
  &algorithm=MIN_MAX

Format de réponse

Les formats de réponse suivants sont pris en charge.

Format Format API
JSON /api/36/outlierDetection.json or Accept: application/json (default format)
CSV /api/36/outlierDetection.csv or Accept: application/csv

La réponse contient les champs suivants :

Champ Description
de Identifiant de l'élément de données.
deName Nom de l'élément de données.
pe Identifiant ISO de la période.
ou Identifiant de l’unité d’organisation.
ouName Nom de l'unité d'organisation.
coc Identifiant de la combinaison d’options de catégorie.
cocName Nom de la combinaison d’options de catégorie.
aoc Identifiant de la combinaison d’options d’attribut.
aocName Nom de la combinaison d’options d’attribut.
value Valeur de données.
moyenne Moyenne des valeurs de données dans la dimension temporelle.
stdDev Écart type.
absDev Pour le z-score, il s'agit de l'écart absolu par rapport à la moyenne. Pour min-max, il s'agit de l'écart absolu par rapport à la limite minimale ou maximale.
zScore Le z-score. Algorithme du z-score uniquement.
lowerBound La limite inférieure.
upperBound La limite supérieure.
followUp Si la valeur de données est marquée pour le suivi.

Les champs mean, stdDev et z-score ne sont présents que lorsque algorithm est Z_SCORE.

La réponse ressemblera à ceci. La section metadata contient des métadonnées de requête et de réponse. La section outlierValues contient les valeurs atypiques.

{
  "metadata": {
    "algorithm": "Z_SCORE",
    "threshold": 2.5,
    "orderBy": "MEAN_ABS_DEV",
    "maxResults": 10,
    "count": 10
  },
  "outlierValues": [
    {
      "de": "rbkr8PL0rwM",
      "deName": "Iron Folate given at ANC 3rd",
      "pe": "202011",
      "ou": "Pae8DR7VmcL",
      "ouName": "MCH (Kakua) Static",
      "coc": "pq2XI5kz2BY",
      "cocName": "Fixed",
      "aoc": "HllvX50cXC0",
      "aocName": "default",
      "value": 9000.0,
      "mean": 1524.5555,
      "stdDev": 2654.4661,
      "absDev": 7475.4444,
      "zScore": 2.8161,
      "lowerBound": -5111.6097,
      "upperBound": 8160.7208,
      "followUp": false
    },
    {
      "de": "rbkr8PL0rwM",
      "deName": "Iron Folate given at ANC 3rd",
      "pe": "202010",
      "ou": "vELbGdEphPd",
      "ouName": "Jimmi CHC",
      "coc": "pq2XI5kz2BY",
      "cocName": "Fixed",
      "aoc": "HllvX50cXC0",
      "aocName": "default",
      "value": 8764.0,
      "mean": 1448.0833,
      "stdDev": 2502.3031,
      "absDev": 7315.9166,
      "zScore": 2.9236,
      "lowerBound": -4807.6745,
      "upperBound": 7703.8412,
      "followUp": false
    }
  ]
}

Contraintes et validation

Les contraintes suivantes s'appliquent lors de la validation de la requête. Chaque erreur de validation a un code d'erreur correspondant.

Code d'erreur Message
E2200 Au moins un élément de données doit être spécifié
E2201 La date de début et la date de fin doivent être précisées
E2202 La date de début doit être antérieure à la date de fin
E2203 Au moins une unité d'organisation doit être spécifiée
E2204 Le seuil doit être un nombre positif
E2205 Les résultats maximum doivent être exprimés en nombres positifs
E2206 Le nombre de résultats maximum dépasse la limite autorisée : {d}
E2207 La date de début des données doit être antérieure à la date de fin des données
E2208 Valeurs de données non numériques rencontrées lors de la détection des valeurs atypiques

Analyse des données

Plusieurs ressources permettant d'effectuer des analyses de données et de détecter les problèmes de qualité et de validation des données sont fournies.

Remarque : Ce endpoint est obsolète et sera supprimé dans la version 2.38. Utilisez plutôt le endpoint outlierAnalysis.

Analyse des règles de validation

Pour exécuter des règles de validation et extraire les violations :

GET /api/dataAnalysis/validationRules

Les paramètres de requête suivants sont pris en charge :

Tableau : Paramètres de requête d'analyse des règles de validation

| Paramètre de requête | Description | Option | Obligatoire | Par défaut | |---|---|---|---| | vrg | Groupe de règles de validation | Identifiant | false | If omitted, all validation rule groups will be used | | ou | Unité d’organisation | Identifiant |true | | | startDate | Start date for the time span | Date (aaaa-MM-jj) | false | Aujourd'hui | | endDate | End date for the time span | Date (aaaa-MM-jj) | false | Aujourd'hui | | conserver | S'il faut conserver les violations dans le système | false | true | false | false | | notification | S'il faut envoyer des notifications sur les violations | false | true | false | false | | maxResults | Max limit for the output | Integer, greater than zero. Maximum as specified by system setting keyDataQualityMaxLimit| false | 500 |

Sample POST body request:

{
    "startDate":"2024-01-01",
    "endDate":"2025-04-10",
    "ou":"ImspTQPwCqd",
    "notification":false,
    "persist":false,
    "vrg":"UP1lctvalPn",
    "maxResults": 500
}

Sample output:
```json
[{
    "validationRuleId": "kgh54Xb9LSE",
    "validationRuleDescription": "Malaria outbreak",
    "organisationUnitId": "DiszpKrYNg8",
    "organisationUnitDisplayName": "Ngelehun CHC",
    "organisationUnitPath": "/ImspTQPwCqd/O6uvpzGd5pu/YuQRtpLP10I/DiszpKrYNg8",
    "organisationUnitAncestorNames": "Sierra Leone / Bo / Badjia / ",
    "periodId": "201901",
    "periodDisplayName": "January 2019",
    "attributeOptionComboId": "HllvX50cXC0",
    "attributeOptionComboDisplayName": "default",
    "importance": "MEDIUM",
    "leftSideValue": 10.0,
    "operator": ">",
    "rightSideValue": 14.0
}, {
    "validationRuleId": "ZoG4yXZi3c3",
    "validationRuleDescription": "ANC 2 cannot be higher than ANC 1",
    "organisationUnitId": "DiszpKrYNg8",
    "organisationUnitDisplayName": "Ngelehun CHC",
    "organisationUnitPath": "/ImspTQPwCqd/O6uvpzGd5pu/YuQRtpLP10I/DiszpKrYNg8",
    "organisationUnitAncestorNames": "Sierra Leone / Bo / Badjia / ",
    "periodId": "201901",
    "periodDisplayName": "January 2019",
    "attributeOptionComboId": "HllvX50cXC0",
    "attributeOptionComboDisplayName": "default",
    "importance": "MEDIUM",
    "leftSideValue": 22.0,
    "operator": "<=",
    "rightSideValue": 19.0
}]

Analyse des valeurs atypiques sur la base de l'écart type

Pour identifier les valeurs atypiques parmi les données en fonction des écarts types de la valeur moyenne :

GET /api/dataAnalysis/stdDevOutlier

Les paramètres de requête suivants sont pris en charge :

Tableau : Paramètres de requête d'analyse des valeurs atypiques de l'écart type

Paramètre de requête Description Option
ou Unité d’organisation Identifiant
startDate Date de début de la période Date
endDate Date de fin de la période Date
ds Ensembles de données, le paramètre peut être répété Identifiant
écart type Nombre d'écarts types par rapport à la moyenne Valeur numérique

Analyse des valeurs atypique sur la base des valeurs minimales/maximales

Pour identifier les valeurs atypiques sur la base des valeurs minimales et maximales :

GET /api/dataAnalysis/minMaxOutlier

Les paramètres de requête pris en charge équivalent à la ressource analyse des valeurs atypiques en fonction de l'écart type décrite ci-dessus.

Follow-up data analysis

Pour identifier les données marquées pour le suivi :

GET /api/dataAnalysis/followup

Au moins un ensemble de données ou élément de données, une date ou période de début et de fin, et au moins une unité d'organisation doivent être définis.

Les paramètres de requête suivants sont pris en charge.

Paramètre Description Obligatoire Options (par défaut en premier)
ou Unité d'organisation, peut être spécifiée plusieurs fois. Oui Identifiant de l’unité d’organisation.
ds Ensemble de données, peut être spécifié plusieurs fois. Non [*] Identifiant de l'ensemble de données.
de Élément de données, peut être spécifié plusieurs fois. Non [*] Identifiant de l'élément de données.
startDate Date en début de l'intervalle pour contrôler les valeurs atypiques. Non [*] Date (aaaa-MM-jj).
endDate Date en fin de l'intervalle pour vérifier les valeurs atypiques. Non [*] Date (aaaa-MM-jj).
pe ID de la période ISO. Non [*] Identifiant ISO de la période.
Type de période Période ISO. Non [*] Chaîne ISO de la période.
coc Les combinaisons d’options de catégorie peuvent être spécifiées plusieurs fois. Non Identifiant de la combinaison d’options de catégorie.
maxResults Limite maximale pour la sortie. Non Entier, supérieur à zéro. Par défaut : 50.

[*] Vous devez spécifier soit des ensembles de données avec le paramètre ds, qui intégrera tous les éléments de données dans les ensembles de données, ou spécifier des éléments de données avec le paramètre de. De même, Date de début et date de fin ou période doivent être spécifiés.

Les paramètres Date de début et Date de fin font référence à l'intervalle de temps au cours duquel vous voulez détecter les valeurs atypiques. Si une période pe est fournie à la place, le début et la fin de l'intervalle sont également ceux de la période.

Si aucune combinaison d'options coc n'est fournie, tous les éléments de données de type valeur numérique seront pris en compte.

Intégrité des données

Les fonctionnalités d'intégrité des données du module d'administration des données sont disponibles via l'API web. Cette section décrit comment exécuter le processus d'intégrité des données et récupérer les résultats. Les informations spécifiques concernant chaque contrôle sont décrites dans le manuel de l'utilisateur.

Liste des contrôles d'intégrité des données disponibles

Une description des contrôles disponibles est renvoyée après qu'une requête soit envoyé à :

GET /api/dataIntegrity
[
    {
        "name": "data_elements_without_groups",
        "displayName": "Data elements lacking groups",
        "section": "Data Elements",
        "severity": "WARNING",
        "description": "Lists all data elements that have no data element groups",
        "issuesIdType": "dataElements",
        "isSlow": false
    }
]

L'élément name (nom) parmi les éléments de contrôle renvoyés est l'identifiant utilisé par le paramètre contrôles pour déclarer les contrôles à exécuter.

Remarque

Chaque contrôle indiquera si la saisie dans le champ isSlow (est lent) peut nécessiter beaucoup de temps et de ressources. Les utilisateurs doivent être prudents lorsqu'ils exécutent ces contrôles sur les systèmes de production car cela pourrait entraîner une baisse de performance du système. Ces contrôles peuvent être exécutés individuellement, mais seulement sur requête expresse.

Les contrôles sont regroupés sémantiquement par l'élément section et classés dans l'un des quatre niveaux de sévérité :

Sévérité Description
INFO Indique qu'il s'agit uniquement d'une information.
AVERTISSEMENT Un avertissement indique qu'il peut s'agir d'un problème, mais pas nécessairement d'une erreur. Il est cependant recommandé de trier ces problèmes.
SEVERE Une erreur qui devrait être corrigée mais qui ne provoque pas nécessairement un dysfonctionnement du système.
CRITIQUE Une erreur qui doit être corrigée et qui peut induire l'utilisateur final en erreur ou provoquer des pannes de système.

Les contrôles disponibles peuvent être filtrés à l'aide du paramètre contrôles.

GET /api/dataIntegrity?checks=<pattern1>,<pattern2>

Un ou plusieurs noms ou modèles exacts utilisant * comme caractère générique peuvent être fournis.

Des résultats supplémentaires peuvent être filtrés à l'aide d'un paramètre section.

GET /api/dataIntegrity?section=Categories

Le filtre section renverra toutes les correspondances exactes qui ont la section spécifiée.

Furthermore, to filter (select) only checks marked as isSlow use slow=true,

GET /api/dataIntegrity?slow=true

or to filter (select) only checks that are not performed via database query (programmed checks) use programmatic=true:

GET /api/dataIntegrity?programmatic=true

The slow, programmatic and section filters can be combined in which case all conditions must be met.

Production de résumés sur l'intégrité des données

Depuis la version 2.38, les contrôles d'intégrité des données ont deux niveaux de spécificité :

  • un niveau résumé qui donne un aperçu du nombre de problèmes
  • un niveau détails qui fournit une liste de problèmes indiquant des violations individuelles de l'intégrité des données.

Pour lancer une analyse qui résume les contrôles exécutés :

POST /api/dataIntegrity/summary?checks=<name1>,<name2>

Cela déclenche l'exécution du ou des contrôle(s) de manière asynchrone. Les résultats des contrôles individuels seront renvoyés dans le cache de l'application dès que le contrôle sera terminé.

Alternativement, la liste des contrôles peut également être fournie comme le CORPS de la requête POST. Cela peut être utile si la liste devient trop longue pour être utilisée dans l'URL.

Pour récupérer le résumé sur l'intégrité des données du ou des contrôle(s) déclenchés, utilisez :

GET /api/dataIntegrity/summary?checks=<name1>,<name2>

Lorsque le paramètre contrôles est omis, tous les contrôles seront récupérées depuis le cache du serveur.

La réponse est une "carte" des résultats de contrôle, un pour chaque contrôle déjà terminé. Ces informations sont mises en cache pendant une heure ou jusqu'à ce que le contrôle soit exécuté à nouveau.

Pour attendre que le résumé soit disponible dans le cache, un timeout (délai d'attente) en millisecondes peut être ajouté :

GET /api/dataIntegrity/summary?checks=<name1>,<name2>&timeout=500

Une réponse de résumé pourrait ressembler à ceci :

{
  "<name1>": {
    "name": "<name1>",
    "displayName": "<displayName1>",
    "startTime": "2023-01-11T06:12:56.436",
    "finishedTime": "2023-01-11T06:12:57.021",
    "section": "...",
    "severity": "WARNING",
    "description": "...",
    "count": 12,
    "percentage": 2.3
  },
  "<name2>": {
    "name": "<name2>",
    "displayName": "<displayName2>",
    "startTime": "2023-01-11T06:12:57.345",
    "finishedTime": "2023-01-11T06:12:58.007",
    "section": "...",
    "severity": "WARNING",
    "description": "...",
    "count": 4,
    "percentage": 5.1
  }
}

Chaque réponse de résumé contient le nom, la section, la sévérité, la description et éventuellement une introduction et une recommandation. Chaque résumé contient le nombre de problèmes trouvés dans le champ nombre. Si possible, un champ optionnel pourcentage fournit le pourcentage d'objets présentant des problèmes d'intégrité des données par rapport à l'ensemble des objets du même type. Le champ Heure de début indique le moment où le contrôle a été initié. Le champ Heure de fin permet de calculer la durée nécessaire à l'exécution du contrôle.

Si une analyse de contrôle échoue en raison d'une erreur de programmation ou d'une incohérence imprévue des données, le résumé et les détails comporteront un champ erreur qui décrit l'erreur qui s'est produite. Le nombre de contrôles qui ont échoué sera fixé à -1. Aucun pourcentage ne sera renvoyé dans ce cas.

{
  "<name1>": {
    "name": "<name1>",
    "displayName": "<displayName1>",
    "finishedTime": "2022-02-15 14:55",
    "section": "...",
    "severity": "WARNING",
    "description": "...",
    "error": "what has happened",
    "issues": []
  }
}

Remarque

Chaque contrôle de métadonnée est exécuté de manière asynchrone sur le serveur. Les résultats seront restitués dès que chaque contrôle sera terminé. Le moyen le plus sûr de vous assurer que vous avez récupéré le dernier ensemble de résultats demandé est de comparer l'horodatage de la requête avec finishedTime (heure de fin) dans la réponse.

Pour obtenir une liste des noms des contrôles actuellement effectués par l'utilisation du serveur :

GET /api/dataIntegrity/summary/running

Pour obtenir une liste des noms des contrôles pour lesquels les résultats sont disponibles, utilisez :

GET /api/dataIntegrity/summary/completed

Retrieving completed checks as Prometheus metrics

Metadata integrity checks which are present in the cache, can be retrieved in the Prometheus metrics format by making a request to : GET /api/dataIntegrity/metrics

The response should return a plain text format in the Prometheus plain text exposition format. Several metrics are available for each data integrity check. - Count: A count of the number of issues identified by the metadata check. - Percentage: When available, provides a percentage of the objects which have been identified by the check relative to a baseline. For instance, if check "Organisation units with trailing spaces" has a percent of 2.13, the percentage is calculated by dividing the number of organisation units with trailing spaces by the total number of organisation units. Note that this percentage may not be available for all metadata integrity checks. - Duration: Number of milliseconds that the check took to execute the last time it was run.

An example of the output of this endpoint is provided below:

# HELP dhis_data_integrity_check_count Data integrity check counts { #help-dhis_data_integrity_check_count-data-integrity-check-counts } 
# TYPE dhis_data_integrity_check_count gauge { #type-dhis_data_integrity_check_count-gauge } 
dhis_data_integrity_check_count{check="orgunits_invalid_geometry"} 1
dhis_data_integrity_check_count{check="user_groups_scarce"} 0
dhis_data_integrity_check_count{check="indicator_no_analysis"} 13
# HELP dhis_data_integrity_check_percentage Data integrity check percentages { #help-dhis_data_integrity_check_percentage-data-integrity-check-percentages } 
# TYPE dhis_data_integrity_check_percentage gauge { #type-dhis_data_integrity_check_percentage-gauge } 
dhis_data_integrity_check_percentage{check="orgunits_invalid_geometry"} 0.13054830287206268
dhis_data_integrity_check_percentage{check="user_groups_scarce"} 0.0
dhis_data_integrity_check_percentage{check="indicator_no_analysis"} 16.0
# HELP dhis_data_integrity_check_duration Data integrity check durations { #help-dhis_data_integrity_check_duration-data-integrity-check-durations } 
# TYPE dhis_data_integrity_check_duration gauge { #type-dhis_data_integrity_check_duration-gauge } 
dhis_data_integrity_check_duration{check="orgunits_invalid_geometry"} 11
dhis_data_integrity_check_duration{check="user_groups_scarce"} 1
dhis_data_integrity_check_duration{check="indicator_no_analysis"} 0

Data integrity checks which are not currently in the cache will not be returned by this endpoint. A request would need to be made to the /summary endpoint to trigger the checks to be run or alternatively through a scheduled job.

Production de détails sur l'intégrité des données

Pour lancer une sélection de contrôles de détails, déclenchez-les d'abord à l'aide d'une requête POST :

POST /api/dataIntegrity/details?checks=<name1>,<name2>

Tout comme avec le résumé, la liste des contrôles peut également être fournie en tant que corps de la requête POST.

Récupérez ensuite les résultats du cache en utilisant :

GET /api/dataIntegrity/details?checks=<name1>,<name2>&timeout=500

Lorsque le paramètre contrôles n'est pas fourni, tous les contrôles qui n'ont pas été marqués isSlow (est lent) seront programmés pour être exécutés sur le serveur.

Si vous omettez l'élément timeout (délai d'attente), la requête n'attendra que les résultats soient trouvés dans le cache, au contraire vous ne recevrez pas le résultat du contrôle demandé.

La réponse /détails renvoie une carte similaire à celle du résumé, mais ne contient pas de nombre ou de pourcentage. En lieu et place, une liste de problèmes est renvoyée.

{
  "<name1>": {
    "name": "<name1>",
    "displayName": "<displayName1>",
    "startTime": "2023-01-11T06:12:56.436",
    "finishedTime": "2023-01-11T06:12:57.021",
    "section": "...",
    "severity": "WARNING",
    "description": "...",
    "issuesIdType": "<object-type-plural>",
    "isSlow": false,
    "issues": [{
      "id": "<id-or-other-identifier>",
      "name": "<name-of-the-id-obj>",
      "comment": "optional plain text description or hint of the issue",
      "refs": ["<id1>", "<id2>"]
    }]
  },
  "<name2>": {
    "name": "<name2>",
    "displayName": "<displayName2>",
    "startTime": "2023-01-11T06:12:57.345",
    "finishedTime": "2023-01-11T06:12:58.007",
    "section": "...",
    "severity": "WARNING",
    "description": "...",
    "issuesIdType": "<object-type-plural>",
    "isSlow": false,
    "issues": []
  }
}
Chaque problème aura toujours des éléments id et nom. Souvent, l'élément issuesIdType (type d'identifiant des problèmes) est disponible pour indiquer le type d'objet auquel l'élément id se réfère. Si issuesIdType n'est pas disponible, l'id ne l'est souvent pas non plus et le nom est utilisé comme clé agrégée pour un problème qui n'a pas d'équivalent objet.

Les champs commentaire et références sont optionnels pour chaque problème. Un commentaire peut donner plus de précisions sur le contexte ou la raison pour laquelle ce problème est considéré comme un problème d'intégrité des données. La liste références peut également fournir les identifiants d'autres objets qui ont contribué à la violation. Le champ Heure de fin indique le moment où le contrôle a fini d'être traité sur le serveur. Le cache stocke le résultat de chaque contrôle terminé pendant une heure.

Tip

Un ensemble de contrôles peut également être spécifié à l'aide de wild-cards (caractères génériques). Pour inclure tous les contrôles avec élément dans le nom, utilisez contrôles=*élément*. Tout comme avec les noms complets, ces motifs peuvent être utilisés dans une liste de caractères séparés par des virgules et être combinés avec les noms complets. Les doublons seront éliminés. Un contrôle peut également être spécifié par son code. Un code est constitué des premières lettres de chaque mot du nom en majuscules. Par exemple, orgunits_invalid_geometry a le code OIG.

Tout comme avec le résumé, il est possible d'obtenir les noms des contrôles de détails en cours d'exécution et de ceux déjà effectués avec la requête suivante :

GET /api/dataIntegrity/details/running
GET /api/dataIntegrity/details/completed

Custom Data Integrity Checks

Users of DHIS2 can now create and supply their own Data Integrity Checks. This can be useful if users want to avail of this functionality and extend upon the supplied set of core data integrity checks.

Tip

Users are also encouraged to share their custom checks with others by opening a pull request in the dhis2-core repository containing their .yaml file(s). Please select platform-backend as reviewer to put the PR on our radar early on. The team will take care of checking and linking the check correctly, so it becomes part of the provided suite of checks with the next release.

An example of a custom check could be for determining if certain users are members of specific user groups. This type of check would be very specific to an implementation, and not generally applicable across all installs. These types of metadata checks can be used to extend the default checks which are included with DHIS2.

Custom checks can be implemented by satisfying the following requirements, each of which we will go into detail: - Supplying your own list of custom data integrity checks in a list file named custom-data-integrity-checks.yaml in your DHIS2_HOME directory - Having a directory named custom-data-integrity-checks in your DHIS2_HOME directory - Supplying your valid custom data integrity check yaml files

Custom Data Integrity Check List File

DHIS2 will only try to load data integrity files when they are needed. e.g. when making a call to view all data integrity checks:

GET /api/dataIntegrity

DHIS2 will look for a file named custom-data-integrity-checks.yaml in your DHIS2_HOME directory when loading data integrity files. If you are not using custom checks and the file is not present, a warning log like this will be present:

08:29:57.729  WARN o.h.d.d.DataIntegrityYamlReader: Failed to load data integrity check from YAML. Error message `{DHIS2_HOME}/custom-data-integrity-checks.yaml (No such file or directory)

If you are implementing custom data integrity checks then this file must be present. To see what the core data integrity checks file looks like as an example, check out this file.

The custom-data-integrity-checks.yaml file should list all of your custom data integrity checks. As an example, it could look something like this:

checks:
  - categories/my_custom_check.yaml
  - users/my_user_group_check.yaml
  - base_check.yaml

Check names in this file can be preceded with a directory name for logical grouping. From the 3 example checks listed above, the directory structure should look like this:

├── DHIS2_HOME
│   ├── dhis.conf
│   ├── custom-data-integrity-checks.yaml
│   ├── custom-data-integrity-checks
│   │   ├── categories
│   │   │   ├── my_custom_check.yaml
│   │   ├── users
│   │   │   ├── my_user_group_check.yaml
│   │   ├── base_check.yaml

Name and Code constraints

Each data integrity check name and code must be unique. If there are any clashes then the violating custom check will not be loaded.

Note

System data integrity checks are always loaded first. Any name or code clashes resulting from custom checks will not affect these core system checks.

An example data integrity check yaml file is located here for reference. Note the name property.

The data integrity code is calculated dynamically by using the first letter of each word in the name. Some examples:

Nom Code
my_custom_check MCC
my_second_custom_check MSCC
another_custom_check ACC

If there is a name clash, a warning log like this will be present:

09:48:43.138  WARN o.h.d.d.DefaultDataIntegrityService: Data Integrity Check `my_custom_check` not added as a check with that name already exists

If there is a code clash, a warning log like this will be present:

09:48:43.138  WARN o.h.d.d.DefaultDataIntegrityService: Data Integrity Check `my_custom_check` not added as a check with the code `MCC` already exists

Data Integrity Check Schema

A data integrity check file must comply with this JSON schema. If a check does not comply with the schema then a warning like this will be present:

09:48:43.136  WARN o.h.d.d.DataIntegrityYamlReader: JsonSchema validation errors found for Data Integrity Check `categories/my_custom_check.yaml`. Errors: [$.name: is missing but it is required]

Any schema violations must be fixed before that check can be loaded and used.

If a data integrity check file contains invalid yaml then a warning log like this could be present:

10:30:37.858  WARN o.h.d.d.DataIntegrityYamlReader: JsonSchema validation errors found for Data Integrity Check `my_custom_check.yaml`. Errors: [$: string found, object expected]

To view and use the custom checks please refer to the main Data Integrity section

Note

It is recommended to follow any naming and format conventions seen in the provided examples above when implementing your own custom checks to help avoid any issues

Data Integrity File

Details of the data integrity check yaml file, taken from the JSON schema file

propriété requis info
name yes unique name of the check
description yes description
section yes used for logical grouping of checks e.g. categories, users
section_order yes the order of the check when displayed in the UI
summary_sql yes an SQL query which should return a single result which represents the total count of issues
details_sql yes an SQL query which should return a list of identified objects from this particular issue. Should return at least uid and name
details_id_type yes a short string which identifies the section of the details SQL
severity yes level of severity of the issue. One of [INFO, WARNING, SEVERE, CRITICAL]
introduction yes outlining the objective of the check
recommendation yes outlining how to resolve identified issues

Example custom data integrity check

An example of a custom check could be for determining if users have an email. Emails are useful to be able to communicate with users and sent them notifications, as well as password recovery. So, in some instllations of DHIS2, it could be a policy that all users should have emails. An example of this type of custom check is shown below.

---
name: users_should_have_emails
description: Users should have emails.
section: Users
section_order: 6
summary_sql: >-
  WITH users_no_email as (
  SELECT uid,username from
  userinfo where email IS NULL)
  SELECT COUNT(*) as value,
  100*COUNT(*) / NULLIF( ( select COUNT(*) from userinfo), 0) as percent
  from users_no_email;
details_sql: >-
  WITH users_no_email as (
  SELECT uid,username from
  userinfo where email IS NULL)
  SELECT uid,username as from users_no_email;
severity: WARNING
introduction: >
  Users should have defined emails. This is important for password recovery and to be able
  to send notifications to users.
recommendation: >
  Make sure that all users have defined emails.
details_id_type: users

More examples of different types of metadata integrity checks can be found in the DHIS2 source code here.

Complete data set registrations

Cette section traite de l'enregistrement d'ensembles de données complétés en tant qu'ensembles de données. Un enregistrement marque un ensemble de données comme étant complètement capturé.

Completing data sets

Cette section explique comment enregistrer des ensembles de données comme étant complets. Cela s'obtient en interagissant avec la ressource completeDataSetRegistrations (Enregistrements d'ensembles de données complets):

GET /api/33/completeDataSetRegistrations

Le point d'extrémité utilise la méthode POST pour enregistrer les ensembles de données complets. De façon pratique, ce point d'extrémité est très similaire à celui de dataValueSets (ensembles de valeurs de données), avec la possibilité d'importer des enregistrements complets en bloc.

L'importation de charges utiles au format XML et JSON est prise en charge. Le format de base de cette charge utile, donné en XML dans cet exemple, ressemble à ceci :

<completeDataSetRegistrations xmlns="http://dhis2.org/schema/dxf/2.0">
  <completeDataSetRegistration period="200810" dataSet="eZDhcZi6FLP"
    organisationUnit="qhqAxPSTUXp" attributeOptionCombo="bRowv6yZOF2" storedBy="imported"/>
  <completeDataSetRegistration period="200811" dataSet="eZDhcZi6FLP"
    organisationUnit="qhqAxPSTUXp" attributeOptionCombo="bRowv6yZOF2" storedBy="imported"/>
</completeDataSetRegistrations>

L'attribut storedBy (stocké par) est facultatif (car il peut être retiré de l'objet d'enregistrement complet). Vous pouvez également définir la propriété date (heure de l'enregistrement) en tant qu'attribut. Si l'heure n'est pas définie, l'heure actuelle sera utilisée.

Le processus d'importation prend en charge les paramètres de requête suivants :

Tableau : Paramètres de requête d'enregistrement d'ensembles de données complets

Paramètre Valeurs Description
dataSetIdScheme (Schéma de l'identifiant de l'ensemble de données) id name
orgUnitIdScheme id name
attributOptionComboIdScheme (Schéma de l'identifiant de la combinaison d'options d'attribut) id name
idScheme id name
preheatCache false true
dryRun false true
importStrategy (stratégie d'importation) CREATE (créer) UPDATE (mettre à jour)
skipExistingCheck (ignorer les contrôles) false true
async false true

Les éléments idScheme (schéma de l'identifiant), dataSetIdScheme (schéma de l'identifiant de l'ensemble de données), orgUnitIdScheme (schéma de l'identifiant de l'unité d'organisation), attributeOptionComboIdScheme (schéma de l'identifiant de la combinaison d'options d'attribut), dryRun (essai) et strategy (stratégie) (notez la dénomination différente du paramètre importStrategy (stratégie d'importation)) peuvent également être définis dans le cadre de la charge utile. Avec XML, ce sont des attributs ; avec JSON, ce sont des éléments du nœud completeDataSetRegistrations (enregistrements des ensembles de données complets).

Par exemple :

<completeDataSetRegistrations xmlns="http://dhis2.org/schema/dxf/2.0"
      orgUnitIdScheme="CODE">
    <completeDataSetRegistration period="200810" dataSet="eZDhcZi6FLP"
    organisationUnit="OU_559" attributeOptionCombo="bRowv6yZOF2" storedBy="imported"/>
</completeDataSetRegistrations>

Si le paramètre URL et la charge utile définissent un schéma, la charge utile est prioritaire.

Lecture des enregistrements d'ensembles de données terminés

Cette section explique comment récupérer les enregistrements d'ensembles de données terminés. Nous utiliserons la ressource completeDataSetRegistrations. Les paramètres de requête à utiliser sont les suivants :

Tableau : Paramètres de requête d'ensemble de valeurs de données

Paramètre Description
dataSet (ensemble de données) Identifiant de l'ensemble de données, plusieurs ensembles de données sont autorisés
period Identifiant de période au format ISO. Plusieurs périodes sont autorisées.
startDate Date de début de la période des valeurs à exporter
endDate Date de fin de la période des valeurs à exporter
created Inclut uniquement les enregistrements créés depuis l'horodatage donné
Durée de la création Inclut uniquement les enregistrements créés pendant la durée indiquée. Le format est <value><unité-de-temps>, où les unités de temps prises en charge sont "d", "h", "m", "s " (jours, heures, minutes, secondes). L'unité de temps est liée à l'heure actuelle.
orgUnit Identifiant de l'unité d'organisation ; peut être spécifié plusieurs fois. Non applicable si un groupe d'unités d'organisation est fourni.
orgUnitGroup (groupe d'unités d'organisation) Identifiant du groupe d’unités d’organisation ; peut être spécifié plusieurs fois. Non applicable si une unité d'organisation est fournie.
subordonnées Permet de spécifier s'il faut inclure les unités d’organisation subordonnées dans la hiérarchie des unités d'organisation
limite Le nombre maximum d'enregistrements à inclure dans la réponse.
idScheme Propriété d'identifiant utilisée pour les objets de métadonnées dans la réponse.
dataSetIdScheme (Schéma de l'identifiant de l'ensemble de données) Propriété d'identifiant utilisée pour les ensembles de données dans la réponse. Elle remplace le schéma de l'identifiant.
orgUnitIdScheme Propriété d'identifiant utilisée pour les unités d'organisation dans la réponse. Elle remplace le schéma de l'identifiant.
attributOptionComboIdScheme (Schéma de l'identifiant de la combinaison d'options d'attribut) Propriété d'identifiant utilisée pour les combinaisons d'options d'attribut dans la réponse. Elle remplace le schéma de l'identifiant.
Les paramètres ensemble de données et unité d'organisation peuvent être répétés afin d'inclure plusieurs ensembles de données et unités d'organisation.

Les paramètres période, date de début, date de fin, créé et durée de création fournissent plusieurs façons de définir la dimension temporelle de la requête, donc un seul peut être utilisé. Par exemple, cela n'a pas de sens de définir à la fois la date de début/fin et les périodes.

Voici donc un exemple de requête :

GET /api/33/completeDataSetRegistrations?dataSet=pBOMPrpg1QX
  &startDate=2014-01-01&endDate=2014-01-31&orgUnit=YuQRtpLP10I
  &orgUnit=vWbkYPRmKyS&children=true

Vous pouvez obtenir la réponse au format xml et json. Vous pouvez indiquer le format de réponse que vous préférez via l'en-tête HTTP Accepter comme dans l'exemple ci-dessus. Pour xml, utilisez application/xml ; pour json, utilisez application/json.

Annuler la finalisation des ensembles de données

Cette section explique comment annuler l'enregistrement de la complétude d'un ensemble de données. Pour annuler la finalisation d'un ensemble de données, vous interagirez avec la ressource completeDataSetRegistrations :

GET /api/33/completeDataSetRegistrations

Cette ressource prend en charge la fonction DELETE pour annuler l'inscription. Les paramètres de requête suivants sont pris en charge :

Tableau : Paramètres de requête d'enregistrement d'ensembles de données complets

Paramètre de requête Obligatoire Description
ds Oui Identifiant de l'ensemble de données
pe Oui Identifiant de période
ou Oui Identifiant de l'unité d'organisation
cc Non (doit combiner avec cp) Identifiant de la combinaison d'attributs (pour le contrôle du verrouillage)
cp Non (doit combiner avec cp) Identifiants d'options d'attribut, séparés par ; pour plusieurs valeurs (pour le contrôle du verrouillage)
multiOu (unités d'organisation multiples) Non (faux par défaut) Si l'enregistrement s'applique aux sous-unités

Approbation des données

Approbation des données

Cette section explique comment approuver, désapprouver et vérifier le statut d'approbation en utilisant la ressource dataApprovals. L'approbation se fait par flux d'approbation des données, par période, par unité d'organisation et par combinaison d'options d'attribut.

/api/33/dataApprovals

Un processus d'approbation des données est associé à plusieurs entités :

  • Un type de période qui définit la fréquence d'approbation
  • Une combinaison de catégories facultative
  • Un ou plusieurs niveaux d'approbation des données qui font partie du flux de travail
  • Un ou plusieurs ensembles de données utilisés pour la collecte de données

Obtenir le statut d'approbation

Pour obtenir des informations sur l'approbation d'un ensemble de données, vous pouvez envoyer une requête GET :

/api/dataApprovals?wf=rIUL3hYOjJc&pe=201801&ou=YuQRtpLP10I

Tableau : Paramètres de requête pour l'approbation des données

Paramètre de requête Obligatoire Description
wf Oui Identifiant du flux d'approbation des données
pe Oui Identifiant de période
ou Oui Identifiant de l'unité d'organisation
aoc Non Identifiant de combinaison d'options d'attributs

Remarque

Pour des raisons de compatibilité en amont, le paramètre ds pour l'ensemble de données peut être donné à la place de wf pour le flux de travail dans cette requête d'approbation de données et dans d'autres, comme décrit ci-dessous. Si l'ensemble de données est donné, le flux de travail associé à cet ensemble de données sera utilisé.

Vous obtiendrez une réponse similaire à celle-ci :

{
" peutApprouver " : faux,
" peutDésapprouver " : faux,
" peutAccepter " : faux,
" peutRefuser " : faux,
" status " : " APPROUVÉ_ICI ",
" approuvéPar " : "Utilisateur A",
" approuvéÀ " : "2022-01-13T12:56:07.005",
" acceptéPar " : "Utilisateur A",
" AcceptéÀ " : "2022-01-13T12:56:07.005"
}

Les paramètres renvoyés sont les suivants :

Tableau : Paramètres obtenus pour l'approbation des données

Paramètre de retour Description
peutApprouver Si l'utilisateur actuel peut approuver cette sélection de données.
peutDésapprouver Si l'utilisateur actuel peut désapprouver cette sélection de données.
peutAccepter Si l'utilisateur actuel peut accepter cette sélection de données.
peutRefuser Si l'utilisateur actuel peut refuser cette sélection de données.
state L'un des états d'approbation des données est indiqué dans le tableau ci-dessous.
approuvéPar Si la sélection est approuvée, et si disponible (pas toujours nécessaire), le nom de l'utilisateur qui a approuvé la sélection.
approuvéÀ Si la sélection est approuvée, et si disponible (pas toujours nécessaire), la date et l'heure à laquelle le niveau d'approbation le plus élevé a été créé.
acceptéPar Si la sélection est approuvée, et si disponible (pas toujours nécessaire), le nom de l'utilisateur qui a effectué la dernière mise à jour.
acceptéÀ Si la sélection est approuvée, et si disponible (pas toujours nécessaire), la date et l'heure de la dernière mise à jour du niveau d'approbation le plus élevé.

Tableau : États d'approbation des données

État Description
NON APPROUVÉ L'approbation des données ne s'applique pas à cette sélection. (Les données ne sont ni approuvées ni non approuvées).
NON APPROUVÉ_EN ATTENTE Les données pourraient être approuvées pour cette sélection, mais elles attendent une approbation de niveau inférieur avant d'être prêtes à être approuvées.
NON APPROUVÉ_AUTRE PART Les données ne sont pas approuvées et attendent d'être approuvées à un autre endroit (elles ne peuvent pas être approuvées ici).
NON APPROUVÉ_ PRÊT Les données ne sont pas approuvées et sont prêtes à être approuvées pour cette sélection.
APPROUVÉ_ICI Les données sont approuvées et ont été approuvées ici (elles pourraient donc être non approuvées ici).
APPROUVÉ_AUTRE PART Les données sont approuvées, mais n'ont pas été approuvées ici (et ne peuvent donc pas être non approuvées ici) :
* Les données sont approuvées à un niveau supérieur.
* Les données sont approuvées pour un plus grand nombre d'options de catégories.
* Les données sont approuvées pour toutes les sous-périodes de la période sélectionnée.
Dans les deux premiers cas, il existe un seul objet d'approbation des données qui couvre la sélection. Dans le troisième cas, il n'y en a pas.
ACCEPTÉ_ICI Les données sont approuvées et acceptées ici (elles pourraient donc être non approuvées ici).
ACCEPTÉ_AUTRE PART Les données sont approuvées et acceptées, mais à un autre endroit.

Notez que lorsque vous demandez l'état de l'approbation des données, vous pouvez spécifier toute combinaison de paramètres de requête. La combinaison que vous spécifiez ne doit pas nécessairement décrire l'emplacement où les données doivent être approuvées à l'un des niveaux d'approbation. Par exemple :

  • L'unité d'organisation peut ne pas être à un niveau d'approbation. Le statut d'approbation est déterminé par le fait que les données sont approuvées à un niveau d'approbation pour un ascendant de l'unité d'organisation.

  • Vous pouvez spécifier des options de catégories d'attribut individuelles. Le statut d'approbation est déterminé par le fait que les données sont approuvées pour une combinaison d'options de catégorie d'attributs qui comprend une ou plusieurs de ces options.

  • Vous pouvez spécifier une période plus longue que celle de l'ensemble de données, au cours de laquelle les données sont saisies et approuvées. Le statut d'approbation est déterminé par l'approbation des données pour toutes les périodes de l'ensemble de données au cours de la période spécifiée.

Pour les ensembles de données associés à une combinaison de catégories, il est possible de récupérer les enregistrements d'approbation des données pour les combinaisons d'options d'attributs individuels à partir de la ressource suivante, au moyen d'une requête GET :

/api/dataApprovals/categoryOptionCombos?wf=rIUL3hYOjJc&pe=201801&ou=YuQRtpLP10I

Bulk get approval status

Pour obtenir une liste de plusieurs statuts d'approbation, vous pouvez envoyer une requête GET similaire à celle-ci :

/api/dataApprovals/approvals?wf=rIUL3hYOjJc&pe=201801,201802&ou=YuQRtpLP10I

Les paramètres wf, pe, ou, et aoc sont les mêmes que pour obtenir un statut d'approbation unique, sauf que vous pouvez fournir une liste séparée par des virgules d'une ou plusieurs valeurs pour chaque paramètre.

Vous obtiendrez une réponse contenant une liste de paramètres d'approbation et de statuts, comme suit :

[
  {
    "aoc": "HllvX50cXC0",
    "pe": "201801",
    "niveau": "KaTJLhGmU95",
    "ou": "YuQRtpLP10I",
    "permissions": {
      "peutApprouver": faux,
      "peutDésapprouver": vrai,
      "peutAccepter": vrai,
      "peutRefuser": faux,
      "peutLirelesdonnées": vrai,
      "approuvéPar": "Utilisateur A",
      "approuvéÀ": "2022-01-13T12:56:07.005",
      "acceptéPar": "Utilisateur A",
      "acceptéPar": "2022-01-13T12:56:07.005"      
    },
    "statut": "APPROUVÉ_ICI",
    "wf": "rIUL3hYOjJc"
  },
  {
    "aoc": "HllvX50cXC0",
    "pe": "201802",
    "ou": "YuQRtpLP10I",
    "permissions": {
      "peutApprouver": vrai,
      "peutDésapprouver": faux,
      "peutAccepter": faux,
      "peutRefuser": faux,
      "peutLirelesdonnées":  vrai
    },
    "statut": "DÉSAPPROUVÉ_PRÊT",
    "wf": "rIUL3hYOjJc"
  }
]

Les champs obtenus sont décrits dans le tableau ci-dessous.

Champ Description
aoc Identifiant de combinaison d'options d'attributs
pe Identifiant de période
ou Identifiant d'unité d'organisation
autorisations Les autorisations : mêmes définitions que pour l'obtention d'un statut d'approbation unique (voir le tableau Paramètres d'approbation des données renvoyés).
state Un des états d'approbation des données (comme pour obtenir un statut d'approbation unique.)
wf Identifiant du flux d'approbation des données

Approuver les données

Pour approuver des données, vous pouvez envoyer une requête POST à la ressource dataApprovals. Pour annuler l'approbation des données, vous pouvez envoyer une requête DELETE à la ressource dataApprovals.

POST DELETE /api/33/dataApprovals

Pour accepter des données déjà approuvées, vous pouvez envoyer une requête POST à la ressource Acceptationdesdonnées. Pour annuler l'acceptation de données, vous pouvez envoyer une requête DELETE à la ressource Acceptationdesdonnées.

POST DELETE /api/33/dataAcceptances

Ces requête contiennent les paramètres suivants :

Tableau : Paramètres d'action pour l'approbation des données

Paramètres d'action Obligatoire Description
wf Oui Identifiant du flux d'approbation des données
pe Oui Identifiant de période
ou Oui Identifiant de l'unité d'organisation
aoc Non Identifiant de combinaison d'options d'attributs

Notez que, contrairement à la requête sur le statut d'approbation des données, vous devez spécifier des paramètres qui correspondent à une sélection de données susceptibles d'être approuvées. Plus précisément, les deux éléments suivants doivent être définis sur "true" :

  • Le niveau de l'unité d'organisation doit être spécifié par un niveau d'approbation dans le flux de travail.

  • La période spécifiée doit correspondre au type de période du flux de travail.

Approuver les données en bloc

Vous pouvez approuver un ensemble d'enregistrements de données en envoyant une requête POST à la ressource /api/dataApprovals/approvals.

POST /api/33/dataApprovals/approvals

Vous pouvez approuver un ensemble d'enregistrements de données en envoyant une requête POST à la ressource /api/dataApprovals/approvals.

POST /api/33/dataApprovals/unapprovals

Vous pouvez accepter un grand nombre d'enregistrements en envoyant une requête POST à la ressource /api/dataAcceptances/acceptances.

POST /api/33/dataAcceptances/acceptances

Vous pouvez refuser un ensemble d'enregistrements en envoyant une requête POST à la ressource /api/dataAcceptances/acceptances.

POST /api/33/dataAcceptances/unacceptances

La charge d'approbation est utilisée au format JSON et ressemble à ceci :

{
  "wf": [
    "pBOMPrpg1QX", "lyLU2wR22tC"
  ],
  "pe": [
    "201601", "201602"
  ],
  "approvals": [
    {
      "ou": "cDw53Ej8rju",
      "aoc": "ranftQIH5M9"
    },
    {
      "ou": "cDw53Ej8rju",
      "aoc": "fC3z1lcAW5x"
    }
  ]
}

Get data approval levels

Pour récupérer les flux de travail d'approbation des données et leurs niveaux d'approbation, vous pouvez effectuer une requête GET similaire à celle-ci :

/api/dataApprovalWorkflows ?
  fields=id,name,periodType,dataApprovalLevels[id,name,level,orgUnitLevel]

Authorities for data approval

  • F_FLUX DE TRAVAIL_ DE L' APPROBATION_DES DONNÉES : permet à l'utilisateur d'ajouter/mettre à jour le flux de travail relatif à l'approbation des données.
  • F_NIVEAU_D'APPROBATION DES_DONNÉES : permet à l'utilisateur d'ajouter/mettre à jour le niveau d'approbation des données.

Partage

Partage

La solution de partage vous permet de partager la plupart des objets du système avec des groupes d'utilisateurs spécifiques et de définir si les objets doivent être accessibles au public ou privés. Pour obtenir et définir le statut de partage des objets, vous pouvez interagir avec la ressource de partage.

/api/33/sharing

Obtenir le statut de partage

Pour demander le statut de partage d'un objet, faites une requête GET à :

/api/33/sharing?type=dataElement&id=fbfJHSPpUQD

La réponse se présente comme suit.

{
  "meta": {
    "autoriserl'accèspublic": vrai,
    "autoriserl'accèsexterne": faux
  },
  "objet": {
    "id": "fbfJHSPpUQD",
    "nom": "CPN 1ère visite",
    "accèspublic": "rw------",
    "accèsexterne": faux,
    "utilisateur": {},
    "accès au groupe d'utilisateurs": [
      {
        "id": "hj0nnsVsPLU",
        "accès": "rw------"
      },
      {
        "id": "qMjBflJMOfB",
        "accès": "r-------"
      }
    ]
  }
}

Définir le statut de partage

Vous pouvez définir le statut de partage d'un objet en utilisant la même URL avec une requête POST, où la charge utile au format JSON ressemble à ceci :

{
  "objet": {
    "accèspublic": "rw------",
    "accèsexterne": faux,
    "utilisateur": {},
    "accès au groupe d'utilisateurs": [
      {
        "id": "hj0nnsVsPLU",
        "accès": "rw------"
      },
      {
        "id": "qMjBflJMOfB",
        "accès": "r-------"
      }
    ]
  }
}

Dans cet exemple, la charge utile définit l'objet comme ayant un accès public en lecture et en modification, aucun accès externe (sans connexion), un accès en lecture et en modification à un groupe d'utilisateurs et un accès en lecture uniquement à un autre groupe d'utilisateurs. Vous pouvez soumettre ceci à la ressource de partage en utilisant curl :

curl -d @sharing.json "localhost/api/33/sharing?type=dataElement&id=fbfJHSPpUQD"
  -H "Content-Type:application/json" -u admin:district
Remarque

Il est possible de créer des combinaisons de partage surprenantes. Par exemple, si accèsexterne est défini à vrai mais que accèspublic est défini à --------, les utilisateurs n'auront accès à l'objet que lorsqu'ils seront déconnectés.

New Sharing object

Depuis la version 2.36, une nouvelle propriété partage a été introduite afin de remplacer les anciennes propriétés de partage accès utilisateur, accès groupe utilisateur, accès public, accès externe dans toutes les classes de métadonnées pour lesquelles le partage est activé. Cet objet Partage est sauvegardé en tant que colonne JSONB dans la base de données. Cependant, afin de rendre le système compatible avec les anciennes versions, les anciens objets de partage continuent de fonctionner normalement, à la fois pour l'importation et l'exportation. Dans le backend, les données de partage seront sauvegardées dans la nouvelle colonne JSONb Partage au lieu des anciennes tables *Accès.

Le format est le suivant :

{
  "nom": "CPN 1ère visite",
  "accès public": "rw------",
  "accès externe": faux,
  "accès aux groupes d'utilisateurs": [
      {
          "accès": "r-r-----",
          "groupe d'utilisateur Uid": "Rg8wusV7QYi",
          "nom d'affichage": "Coordinateurs du programme VIH",
          "id": "Rg8wusV7QYi"
      }
  ],
  "accès utilisateur": [],
  "utilisateur": {
      "nom d'affichage": "Tom Wakiki",
      "nom": "Tom Wakiki",
      "id": "GOLswS44mh8",
      "Nom d'utilisateur": "système"
  },
  "partage": {
      "propriétaire": "GOLswS44mh8",
      "externe": faux,
      "utilisateurs": {},
      "groupes d'utilisateurs": {
          "Rg8wusV7QYi": {
              "accès": "r-r-----",
              "id": "Rg8wusV7QYi"
          }
      },
      "public": "rw------"
  }
}

Définir le statut de partage en utilisant la nouvelle Api JSON Patch

Vous pouvez utiliser JSON Patch API pour mettre à jour le partage d'un objet en envoyant une requête PATCH à ce point de terminaison avec l'en-tête Type de contenu : application/json-patch+json

api/dataElements/fbfJHSPpUQD
Veuillez noter que cette fonction supporte uniquement le nouveau format partage. La charge utile au format JSON ressemble à ceci :
[
  {
    "op": "remplacer",
    "chemin d'accès": "/partage/utilisateurs",
    "valeur": {
      "NOOF56dveaZ": {
        "accès": "rw------",
        "id": "NOOF56dveaZ"
      },
      "Kh68cDMwZsg": {
        "accès": "rw------",
        "id": "Kh68cDMwZsg"
      }
    }
  }
]
Vous pouvez ajouter des utilisateurs à la propriété partage d'un objet comme suit
[
  {
    "op": "ajouter",
    "chemin d'accès": "/partage/utilisateurs",
    "valeur": {
      "NOOF56dveaZ": {
        "accès": "rw------",
        "id": "NOOF56dveaZ"
      },
      "Kh68cDMwZsg": {
        "accès": "rw------",
        "id": "Kh68cDMwZsg"
      }
    }
  }
]
Vous pouvez ajouter un utilisateur à partage comme ceci
[
  {
    "op": "ajouter",
    "chemin d'accès": "/partage/utilisateurs/NOOF56dveaZ",
    "valeur": {
      "accès": "rw------",
      "id": "NOOF56dveaZ"
    }
  }
]
Vous pouvez supprimer un utilisateur de partage comme suit
[
  { 
    "op": "supprimer", 
    "chemin d'accès": "/partage/utilisateurs/N3PZBUlN8vq"
  }
]

Cascade Sharing for Dashboard

Aperçu

  • La fonction partage en cascade est disponible pour les tableaux de bord. Cette fonction copie les Accès utilisateur et Accès groupe d'utilisateurs d'un tableau de bord vers tous les objets de ses Éléments de tableau de bord, y compris une Carte, un Rapport d'événement, un Graphique d'événement, une Visualisation.
  • Cette fonction ne copie pas l'accès MODIFIER_LES METADONNEES. Les accès d'utilisateur et accès de groupe d'utilisateur copiés recevront uniquement la permission LECTURE_DES METADONNEES.
  • Le paramètre Accèspublic du tableau de bord n'est pas copié.
  • Si un objet cible a l'option Accès public activée, alors il sera ignoré et ne recevra pas les Accès utilisateur ou les Accès groupe d'utilisateurs du tableau de bord.
  • L'utilisateur actuel doit avoir la permission de partage LECTURE_DE METADONNEES sur tous les objets cibles. Si ce n'est pas le cas, l'erreur E5001 est déclenchée.
  • L'utilisateur actuel doit avoir la permission de partage MODIFIER_LES METADONNEES pour mettre à jour n'importe quel objet cible. Si un objet cible doit être mis à jour et que l'utilisateur n'a pas cette permission, l'erreur E3001 est déclenchée.

Sample use case

  • Le tableau de bord A est partagé avec l'utilisateur A avec la permission METADONNEES_LECTURE_MODIFIER.
  • Le tableau de bord A a une visualisation A qui a un élément de données A.
  • La Visualisation A, l'Elément de données A ont un accès public désactivé et ne sont pas partagés avec l'utilisateur A.
  • Après avoir exécuté le partage en cascade pour le tableau de Bord A, l'utilisateur A aura un accès LECTURE_DE METADONNEES à la Visualisation A et à l'Élément de Données A.

API endpoint

  • Envoyer une requête POST au point de terminaison
    api/dashboards/cascadeSharing/{dashboardUID}
    

API Parameters

Nom Par défaut Description
dryRun false Si ce paramètre est fixé à vrai, la fonction de partage en cascade sera exécutée sans mettre à jour aucun objet. La réponse comprendra les erreurs éventuelles et tous les objets qui seront mis à jour. Cela permet à l'utilisateur de connaître le résultat avant d'exécuter la fonction de partage en cascade.
atomic false Si ce paramètre est fixé à vrai, alors la fonction de partage en cascade s'arrêtera et ne mettra à jour aucun objet s'il y a une erreur. Sinon, si cette valeur est fausse, la fonction essaiera de procéder avec le mode du best effort (meilleur effort).

Exemple de réponse :

{
  "rapports d'erreur": [
    {
      "message": "Pas d'objet correspondant à la référence. L'identificateur était s46m5MS0hxu, et l'objet était l'élément de données .",
      "mainKlass": "org.hisp.dhis.dataelement.DataElement",
      "code d'erreur": "E5001",
      "Propriétés de l'erreur": [
        "s46m5MS0hxu",
        "élément de données "
      ]
    }
  ],
  "countUpdatedDashBoardItems": 1,
  "mettre à jour les objets": {
    "élément de données ": [
      {
        "id": "YtbsuPPo010",
        "nom": "Dose de rougeole administrée"
      },
      {
        "id": "l6byfWFUGaP",
        "nom": "Doses de fièvre jaune administrées"
      }
    ]
  }
}

Response properties:

  • Rapports d'erreurs : inclut toutes les erreurs survenues au cours du processus de partage en cascade.
  • countUpdatedDashBoardItems : Nombre d'éléments du tableau de bord qui seront ou ont été mis à jour, en fonction du mode dryRun.
  • updateObjects (Mise à jour des objets): Liste de tous les objets qui seront ou ont été mis à jour en fonction du mode dryRun.

Patch API du partage en vrac

  • L'API de partage en vrac vous permet d'appliquer des paramètres de partage à plusieurs objets de métadonnées. Cela signifie qu'il est possible d'ajouter ou de supprimer de nombreux utilisateurs et groupes d'utilisateurs à de nombreux objets en une seule opération API.
  • Cette API ne doit pas prendre en charge la synchronisation des objets de métadonnées au fil du temps, mais la traiter comme une opération ponctuelle.
  • L'API doit respecter le contrôle d'accès au partage, de sorte que l'utilisateur actuel ait accès à la modification du partage des objets en cours de mise à jour.
  • Deux nouveaux points de terminaison api ont été introduits à partir de la version 2.38 pour permettre le partage en masse des mises à jour de correctifs, comme décrit ci-dessous.
  • Veuillez noter que ces requêtes PATCH doivent utiliser l'en-tête Content-type:application/json-patch+json

Utilisation de /api/{object-type}/sharing avec une requête PATCH

  • Ce point d'accès permet à l'utilisateur d'appliquer un ensemble de paramètres de partage à plusieurs objets de métadonnées d'un type d'objet.
  • Notez que nous supportons toujours les requêtes JsonPatch pour un objet avec le point de terminaison api/{object-type}/{uid}. Par exemple, vous pouvez toujours mettre à jour le partage d'un Élément de Données en envoyant une requête PATCH à api/dataElements/cYeuwXTCPkU/sharing

Exemple:

curl -X PATCH -d @payload.json -H "Content-Type: application/json-patch+json" "https://play.dhis2.org/dev/api/dataElements/sharing"

Using /api/metadata/sharing with PATCH request

  • Ce point de terminaison permet à l'utilisateur d'appliquer des paramètres de partage pour plusieurs types d'objets en une seule charge utile.

Exemple:

curl -X PATCH -d @payload.json -H "Content-Type: application/json-patch+json" "https://play.dhis2.org/dev/api/metadata/sharing"

Paramètres

  • Les deux points de terminaison de l'api du patch ont le même paramètre :
Nom Par défaut Description
atomic false Si ce paramètre est fixé sur vrai, la fonction de traitement par lots s'arrête et ne met à jour aucun objet en cas d'erreur.
Sinon, si ce paramètre est fixé sur faux, la fonction essaye de procéder en mode " best effort " (meilleur effort).

Validation

  • L'existence de tous les identifiants d'objets sera validée.
  • L'utilisateur actuel doit avoir l'autorisation de lire/modifier les métadonnées pour mettre à jour les objets.
  • Toutes les validations existantes du service d'importation de métadonnées seront également appliquées.

Réponse

  • Le format de la réponse doit être le même que celui de l'api /api/metadata.

Payload formats

  • La charge utile pour un seul type d'objet utilisant /api/{type objet}/partage se présente comme suit

    {
      "dataSets":[
        "cYeuwXTCPkU",
        "aYeuwXTCPkU"
      ],
      "patch":[
        {
          "op":"add",
          "path":"/sharing/users/DXyJmlo9rge",
          "value":{
            "access":"rw------",
            "id":"DXyJmlo9rge"
          }
        },
        {
          "op":"remove",
          "path":"/sharing/users/N3PZBUlN8vq"
        }
      ]
    }
    
  • La charge utile pour plusieurs types d'objets en une seule charge utile en utilisant api/métadonnée/partage

    {
      "dataElements": {
        "fbfJHSPpUQD": [
          {
            "op": "replace",
            "path": "/sharing/users",
            "value": {
              "NOOF56dveaZ": {
                "access": "rw------",
                "id": "CotVI2NX0rI"
              },
              "Kh68cDMwZsg": {
                "access": "rw------",
                "id": "DLjZWMsVsq2"
              }
            }
          }
        ]
      },
      "dataSets": {
        "cYeuwXTCPkA": [
          {
            "op": "remove",
            "path": "/sharing/users/N3PZBUlN8vq"
          }
        ],
        "cYeuwXTCPkU": [
          {
            "op": "add",
            "path": "/sharing/users/DXyJmlo9rge",
            "value": {
              "access": "rw------",
              "id": "DXyJmlo9rge"
            }
          }
        ]
      },
      "programs": {
        "GOLswS44mh8": [
          {
            "op": "add",
            "path": "/sharing/userGroups",
            "value": {
              "NOOF56dveaZ": {
                "access": "rw------",
                "id": "NOOF56dveaZ"
              },
              "Kh68cDMwZsg": {
                "access": "rw------",
                "id": "Kh68cDMwZsg"
              }
            }
          }
        ]
      }
    }
    

Programmation

Obtenir les types de tâches disponibles

Pour obtenir une liste de tous les types de tâches disponibles, vous pouvez utiliser le endpoint suivant :

GET /api/jobConfigurations/jobTypes

La réponse contient des informations sur chaque type de tâche, notamment le nom, le type de tâche, la clé, le type de planification et les paramètres disponibles. Le type de planification peut être soit CRON, ce qui signifie que les tâches peuvent être planifiées à l'aide d'une expression cron avec le champ cronExpression, soit FIXED_DELAY, ce qui signifie que les tâches peuvent être planifiées pour s'exécuter avec un délai fixe entre les deux avec le champ delay. Le champ delay est exprimé en secondes.

Une réponse ressemblera à ceci :

{
  "jobTypes": [
    {
      "name": "Data integrity",
      "jobType": "DATA_INTEGRITY",
      "key": "dataIntegrityJob",
      "schedulingType": "CRON"
    }, {
      "name": "Resource table",
      "jobType": "RESOURCE_TABLE",
      "key": "resourceTableJob",
      "schedulingType": "CRON"
    }, {
      "name": "Continuous analytics table",
      "jobType": "CONTINUOUS_ANALYTICS_TABLE",
      "key": "continuousAnalyticsTableJob",
      "schedulingType": "FIXED_DELAY"
    }
  ]
}

Job Configurations

DHIS2 permet de planifier des tâches de différents types. Chaque type de tâche possède des propriétés de configuration différentes, ce qui vous permet de contrôler plus finement la façon dont les tâches sont exécutées. En outre, vous pouvez configurer une même tâche de manière à ce qu'elle s'exécute avec différentes configurations et à différents intervalles, si nécessaire.

Tableau : Principales propriétés

Propriété Description Type
name Nom de la tâche. Chaîne
expression cron L'expression cron qui définit l'intervalle d'exécution de la tâche. Chaîne (expression Cron)
type de tâches Le type de tâche représente la tâche qui est exécutée. Le tableau suivant donne un aperçu des types de tâches existants. Chaque type de tâche peut avoir un ensemble spécifique de paramètres pour la configuration de la tâche. Chaîne (Enum)
paramètres de tâches Paramètres de tâches, le cas échéant pour le type de tâche. (Voir la liste des types de tâches)
activé Une tâche peut être ajoutée au système sans être programmée en mettant enabled à false dans la charge utile JSON. Utilisez ceci si vous voulez arrêter temporairement la programmation d'une tâche, ou si la configuration d'une tâche n'est pas encore terminée. Booléen

Paramètres de tâches

Tableau : Paramètres des tâches de DATA_INTEGRITY.

Nom Type Par défaut Description
contrôles tableau de chaînes [] = tous noms des contrôles à effectuer dans l'ordre d'exécution
type énumération RAPPORT RAPPORT, RÉSUMÉ ou DÉTAILS

Tableau : Paramètres des tâches de ANALYTICS_TABLE.

Nom Type Par défaut Description
années précédentes int vide Number of years back to include. No value means all years.
Ignorer les types de tableau tableau de enum [] Omettre la génération de tableaux ; Valeurs possibles : VALEUR_DONNÉE, COMPLÉTUDE, COMPLÉTUDE_CIBLE, UNITÉ_D'ORGANISATION_CIBLE, ÉVÉNEMENT, INSCRIPTION, RÉSULTAT DE_VALIDATION
Ignorer les tableaux ressources booléen faux Ignorer la génération des tableaux de ressources
Ignorer les Programmes tableau de chaînes [] Liste facultative de programmes (d'identifiants) à ignorer

Tableau : Paramètres des tâches de CONTINUOUS_ANALYTICS_TABLE.

Nom Type Par défaut Description
années précédentes int vide Number of years back to include. No value means all years.
Ignorer les types de tableau tableau de enum [] Omettre la génération de tableaux ; Valeurs possibles : VALEUR_DONNÉE, COMPLÉTUDE, COMPLÉTUDE_CIBLE, UNITÉ_D'ORGANISATION_CIBLE, ÉVÉNEMENT, INSCRIPTION, RÉSULTAT DE_VALIDATION
Mise à jour complète de l'heure de la journée int 0 Heure de la journée pour la mise à jour complète des tableaux d'analyse (0-23)

Tableau : Paramètres des tâches de DATA_SYNC.

Nom Type Par défaut Description
pageSize int 10000 nombre de valeurs de données traitées en tant qu'unité
SINGLE_EVENT_DATA_SYNC job parameters
Nom Type Par défaut Description
pageSize int 60 number of events processed as a unit. Minimum 5, maximum 200.
TRACKED_ENTITY_DATA_SYNC job parameters
Nom Type Par défaut Description
pageSize int 60 number of tracked entities processed as a unit. Minimum 5, maximum 200.

Tableau : Paramètres des tâches de META_DATA_SYNC.

Nom Type Par défaut Description
Taille de la page des données int 10000 nombre de valeurs de données traitées en tant qu'unité

Tableau : Paramètres des tâches MONITORING (Analyse des règles de validation)

Nom Type Par défaut Description
début relatif int 0 Un nombre lié à la date d'exécution qui correspond au début de la période à suivre.
fin relative int 0 Un nombre lié à la date d'exécution qui correspond à la fin de la période à suivre.
groupes de règles de validation tableau de chaînes [] Groupes de règles de validation (UID) à inclure dans la tâche
envoyer une notification booléen faux Définir sur true si la tâche doit envoyer des notifications basées sur les groupes de règles de validation
persiste les résultats booléen faux Définir sur true si la tâche doit persister les résultats de la validation.

Tableau : Paramètres des tâches de PUSH_ANALYSIS.

Nom Type Par défaut Description
analyse push tableau de chaînes [] Les UID des analyses push que vous souhaitez exécuter

Tableau : Paramètres des tâches de PREDICTOR.

Nom Type Par défaut Description
début relatif int 0 Un nombre lié à la date d'exécution qui correspond au début de la période à suivre.
fin relative int 0 Un nombre lié à la date d'exécution qui correspond au début de la période à suivre.
Les prédicteurs tableau de chaînes [] Prédicteurs (UID) à inclure dans la tâche
groupes de prédicteurs tableau de chaînes [] Groupes de prédicteurs (UID) à inclure dans la tâche

Tableau : Paramètres des tâches de MATERIALIZED_SQL_VIEW_UPDATE.

Nom Type Par défaut Description
vues sql tableau de chaînes [] Les UID des vues SQL mises à jour par la tâche.

Create a Job Configuration

Pour configurer les tâches, vous pouvez envoyer une requête POST à la ressource suivante :

/api/jobConfigurations

Une tâche sans paramètres au format JSON ressemble à ceci :

{
  "name": "",
  "jobType": "JOBTYPE",
  "cronExpression": "0 * * ? * *",
}

Exemple d'un tableau d'analyse de tâches avec des paramètres au format JSON :

{
  "name": "Analytics tables last two years",
  "jobType": "ANALYTICS_TABLE",
  "cronExpression": "0 * * ? * *",
  "jobParameters": {
    "lastYears": "2",
    "skipTableTypes": [],
    "skipResourceTables": false
  }
}

Exemple d'une tâche d'analyse push avec des paramètres au format JSON :

{
   "name": "Push anlysis charts",
   "jobType": "PUSH_ANALYSIS",
   "cronExpression": "0 * * ? * *",
   "jobParameters": {
     "pushAnalysis": [
       "jtcMAKhWwnc"
     ]
    }
 }

Exemple de tâche avec le type de planification FIXED_DELAY et un délai de 120 secondes :

{
  "name": "Continuous analytics table",
  "jobType": "CONTINUOUS_ANALYTICS_TABLE",
  "delay": "120",
  "jobParameters": {
    "fullUpdateHourOfDay": 4
  }
}

Get Job Configurations

Liste de toutes les configurations de tâches :

GET /api/jobConfigurations

Récupérer une tâche :

GET /api/jobConfigurations/{id}

Le contenu de la réponse se présente comme suit :

{
  "lastUpdated": "2018-02-22T15:15:34.067",
  "id": "KBcP6Qw37gT",
  "href": "http://localhost:8080/api/jobConfigurations/KBcP6Qw37gT",
  "created": "2018-02-22T15:15:34.067",
  "name": "analytics last two years",
  "jobStatus": "SCHEDULED",
  "displayName": "analytics last two years",
  "enabled": true,
  "externalAccess": false,
  "jobType": "ANALYTICS_TABLE",
  "nextExecutionTime": "2018-02-26T03:00:00.000",
  "cronExpression": "0 0 3 ? * MON",
  "jobParameters": {
    "lastYears": 2,
    "skipTableTypes": [],
    "skipResourceTables": false
  },
  "favorite": false,
  "configurable": true,
  "access": {
    "read": true,
    "update": true,
    "externalize": true,
    "delete": true,
    "write": true,
    "manage": true
  },
  "lastUpdatedBy": {
    "id": "GOLswS44mh8"
  },
  "favorites": [],
  "translations": [],
  "userGroupAccesses": [],
  "attributeValues": [],
  "userAccesses": []
}

Update a Job Configuration

Mettre à jour une tâche avec des paramètres en utilisant le endpoint et le format de charge JSON suivants :

PUT /api/jobConfigurations/{id}
{
  "name": "analytics last two years",
  "enabled": true,
  "cronExpression": "0 0 3 ? * MON",
  "jobType": "ANALYTICS_TABLE",
  "jobParameters": {
    "lastYears": "3",
    "skipTableTypes": [],
    "skipResourceTables": false
  }
}

Delete a Job Configuration

Supprimer une tâche en utilisant :

DELETE /api/jobConfigurations/{id}

Notez que certaines tâches avec des paramètres de configuration personnalisés peuvent ne pas être ajoutées si les paramètres système requis ne sont pas configurés. C'est le cas par exemple de la synchronisation des données, qui nécessite la configuration d'un serveur distant.

Exécuter des tâches manuellement

Les tâches peuvent être exécutées manuellement à l'aide de :

POST /api/jobConfigurations/{id}/execute

Searching for jobs with execution errors

Since version 2.41 jobs can store errors of the job run to allow inspection at a later point in time.

Note This feature is only accessible for administrator with the F_JOB_LOG_READ authority and superusers.

To view the errors associated with a specific job use:

GET /api/jobConfigurations/{id}/errors

To search for jobs that match user specified search criteria use:

GET /api/jobConfigurations/errors

with one or more of the following search parameters

  • user: include jobs ran by this user
  • from: include jobs that started after this point in time
  • to: include jobs that did not start later than this point in time
  • code: include jobs that have errors with one of the given error codes
  • object: include jobs that have errors linked to one of the given object IDs
  • type: include job with errors of the specified type(s)

When multiple criteria are used all have to be met (AND logic). If multiple code, object or type parameters are given just one has to match (OR logic).

For example, to find tracker import errors for the 1. of January 2024 with error code E1002 (tracked entity already exists) the following search is made:

GET /api/jobConfigurations/errors?type=TRACKER_IMPORT_JOB&code=E1002&from=2024-01-01&to=2024-01-02

The results show the job run error details. By default, the input (the payload of the impport) is excluded from the results. To include it add includeInput=true:

GET /api/jobConfigurations/errors?includeInput=true

Note Not all job types do store their errors. Currently, this feature is mostly supported by import jobs.

Scheduler API

Alors que /api/jobConfigurations est centré sur les objets de configuration des tâches l'API /api/scheduler reflète l'état du programmateur et l'API /api/scheduling fournit des informations sur la progression des tâches.

Observer les tâches en cours d'exécution

Les étapes et l'état d'exécution peuvent être observés pendant que la tâche est en cours. Une liste de tous les types de tâches en cours d'exécution est fournie par :

GET /api/scheduling/running/types

Pour obtenir un aperçu de toutes les tâches en cours d'exécution par type de tâche, utilisez :

GET /api/scheduling/running

Comme il ne peut y avoir qu'une seule tâche en cours pour chaque type à la fois, l'état d'une tâche en cours peut être visualisé en détail à l'aide de la commande suivante:

GET /api/scheduling/running/{type}

Par exemple, pour voir l'état d'une tâche ANALYTICS_TABLE en cours d'exécution, utilisez

GET /api/scheduling/running/ANALYTICS_TABLE

Une tâche est une séquence de processus. Chaque processus comporte une séquence d'étapes Dans chaque étape, il peut y avoir zéro, un ou plusieurs éléments. Les éléments peuvent être traités de manière strictement séquentielle ou parallèle, n éléments à la fois. Souvent, le nombre d'éléments total est souvent connu à l'avance.

En général, les étapes d'un processus et les éléments d'une étape sont « découverts » en tant qu'« effet secondaire » du traitement des données. Alors que la plupart des processus ont une séquence fixe d'étapes, certains processus peuvent avoir des étapes variables en fonction des données traitées. Les éléments dépendent généralement des données. La plupart des travaux ne comprennent qu'un seul processus.

Chacun des nœuds de l'arbre processus-étape-élément a un statut qui est soit * RUNNING (en cours de traitement) : le traitement est en cours (pas encore terminé) * SUCCESS (succès) : lorsque le traitement est terminé avec succès * ERROR (erreur) : lorsque le traitement est terminé avec des erreurs ou lorsqu'une exception s'est produite * CANCELLED (annulé) : lorsque l'annulation a été demandée et que l'élément ne sera pas terminé.

Voir les tâches terminées

Une fois qu'une tâche s'est achevée avec succès ou avec un échec à la suite d'une exception ou d'une annulation, l'état passe de l'ensemble des états d'exécution aux états des tâches achevées. Cet ensemble ne conserve que l'état d'exécution le plus récent pour chaque type de tâche. L'aperçu est disponible à l'adresse suivante :

GET /api/scheduling/completed

Des détails sur un type de tâche particulier sont donc fournis à l'adresse suivante :

GET /api/scheduling/completed/{type}

Dans le cas de la tâche ANALYTICS_TABLE, ce serait :

GET /api/scheduling/completed/ANALYTICS_TABLE

Demande d'annulation d'une tâche en cours

Une fois qu'une tâche est lancée, elle se déroule selon une séquence d'étapes. Chaque étape peut à son tour comporter des collections d'éléments à traiter. Bien que les tâches ne puissent généralement pas être arrêtées à tout moment, nous pouvons demander une annulation et le processus s'arrête de manière coopérative une fois qu'il a terminé un élément ou une étape et qu'il reconnaît qu'une annulation a été demandée. Cela signifie que les tâches ne s'arrêtent pas immédiatement et ne partent pas à un moment inconnu en plein milieu d'un traitement. Au contraire, elles s'arrêtent lorsqu'il est possible de passer à la fin. Cela signifie toujours que le processus global est inachevé et qu'il n'est pas annulé. Il se peut qu'il ait simplement effectué un certain nombre d'étapes et en ait sauté d'autres à la fin.

Pour annuler une tâche en cours, utilisez :

POST /api/scheduling/cancel/{type}

Par exemple, pour annuler l'exécution de la tâche ANALYTICS_TABLE :

POST /api/scheduling/cancel/ANALYTICS_TABLE

En fonction de l'étape en cours et de l'élément exécuté, l'annulation peut prendre de quelques millisecondes à quelques minutes avant d'être effective. Cependant, le statut de l'ensemble du processus sera affiché comme ANNULÉ immédiatement après avoir été vérifié à l'aide de

GET /api/scheduling/running/ANALYTICS_TABLE

Seuls les tâches qui ont été scindées en processus, étapes et éléments peuvent être annulées de manière efficace. Toutes les tâches n'ont pas encore été scindées. Celles-ci seront exécutées jusqu'à leur terme, même si l'annulation a été demandée.

Reset a Job stuck in RUNNING state

When a server shuts down while a job is in RUNNING state the job needs to be reverted back to its initial state manually.

To revert a job that has RUNNING state but is not running use:

POST /api/jobConfigurations/{uid}/revert

Les files d'attente

Des séquences de tâches (configurations) peuvent être créées à l'aide de files d'attente. La file d'attente utilise toujours un nom unique et un déclencheur d'expression CRON. Une fois qu'une file d'attente est lancée, toutes les tâches qu'elle contient sont exécutées dans l'ordre indiqué. La deuxième file d'attente démarre lorsque la première est terminée, et ainsi de suite.

Liste des noms des files d'attente

Pour répertorier les noms uniques des files d'attente existantes, utilisez :

GET /api/scheduler/queues

La réponse est un tableau de noms :

["queue_a", "queue_b"]

Obtenir une file d'attente de tâches

Pour obtenir tous les détails d'une file d'attente spécifique, utilisez :

GET /api/scheduler/queues/{name}

Les détails comprennent son nom, l'expression CRON et la séquence de la tâche :

{
  "name": "myQ",
  "cronExpression": "0 0 1 ? * *",
  "sequence": ["FgAxa6eRSzQ", "BeclVERfWbg" ]
}

Créer une nouvelle file d'attente

Pour créer une nouvelle file d'attente, envoyez une requête POST avec un objet de charge utile portant le nom, l'expression CRON et la séquence de tâches :

POST /api/scheduler/queues/{name}

Pour créer une file d'attente avec le nom myQ, utilisez un POST vers /api/scheduler/queues/myQ :

{
  "cronExpression": "0 0 1 ? * *",
  "sequence": ["FgAxa6eRSzQ", "BeclVERfWbg" ]
}
Un nom peut également être présent dans la charge utile, mais le nom spécifié dans le chemin d'accès à l'URL est prioritaire.

REMARQUE

L'expression cron de toutes les configurations de tâches, sauf la première dans une file d'attente, est effacée car elles n'ont plus de déclencheur propre. Elle doit être restaurée manuellement lorsqu'une tâche est supprimée d'une file d'attente.

Mise à jour d'une file d'attente de tâches

Pour mettre à jour une expression ou une séquence CRON existante, utilisez une requête PUT.

PUT /api/scheduler/queues/{name}

La charge utile doit contenir à la fois une nouvelle expression CRON et une séquence de tâches, comme dans l'exemple ci-dessus pour créer une nouvelle file d'attente.

To rename a queue the new name can be stated in the payload, while the old name is used in the URL path.

Supprimer une file d'attente

Pour supprimer une file d'attente, envoyez une demande de suppression (DELETE) à l'URL de sa ressource :

DELETE /api/scheduler/queues/{name}

REMARQUE

La suppression d'une file d'attente n'entraîne pas la suppression des configurations de tâches référencées. Toute configuration de tâches supprimée d'une file d'attente, soit en modifiant la séquence, soit en supprimant la file d'attente, est désactivée. Pour l'utiliser individuellement, il faut fournir une expression CRON et réactiver la configuration.

Programmateur de tâches

La planification au sein du programmateur est une liste basée sur les configurations et les files d'attente de tâches. Une saisie dans le calendrier est soit une simple configuration de tâches, soit une file d'attente de tâches. Les deux sont représentés par le même format de saisie.

Pour obtenir la liste du programmateur, utilisez :

GET /api/scheduler

Une configuration de tâche dans cette liste se présente comme suit :

  {
    "name": "User account expiry alert",
    "type": "ACCOUNT_EXPIRY_ALERT",
    "cronExpression": "0 0 2 ? * *",
    "nextExecutionTime": "2023-03-15T02:00:00.000",
    "status": "SCHEDULED",
    "enabled": true,
    "configurable": false,
    "sequence": [
      {
        "id": "fUWM1At1TUx",
        "name": "User account expiry alert",
        "type": "ACCOUNT_EXPIRY_ALERT",
        "cronExpression": "0 0 2 ? * *",
        "nextExecutionTime": "2023-03-15T02:00:00.000",
        "status": "SCHEDULED"
      }
    ]
  }
En particulier, la séquence ne comporte qu'un seul élément. Les informations sur l'objet de premier niveau et l'objet de la séquence proviennent toutes deux de la configuration de la tâche.

Une file d'attente dans la liste se présente comme suit :

  {
    "name": "myQ",
    "type": "Sequence",
    "cronExpression": "0 0 1 ? * *",
    "nextExecutionTime": "2023-03-15T01:00:00.000",
    "status": "SCHEDULED",
    "enabled": true,
    "configurable": true,
    "sequence": [
      {
        "id": "FgAxa6eRSzQ",
        "name": "test Q1",
        "type": "ANALYTICS_TABLE",
        "cronExpression": "0 0 1 ? * *",
        "nextExecutionTime": "2023-03-15T01:00:00.000",
        "status": "SCHEDULED"
      },
      {
        "id": "BeclVERfWbg",
        "name": "est Q2",
        "type": "DATA_INTEGRITY",
        "status": "SCHEDULED"
      }
    ]
  }
L'objet de niveau supérieur est issu de la file d'attente et des informations sur les agrégats. Les objets de la séquence proviennent des configurations de tâches qui font partie de la séquence.

Liste des tâches Saisies pouvant être ajoutées à une file d'attente de tâches

Toutes les configurations de tâches ne peuvent pas être ajoutées à une file d'attente. Les tâches système et les tâches qui font déjà partie d'une file d'attente ne peuvent pas être utilisées dans une autre file d'attente. Pour répertorier les configurations de tâches qui peuvent faire partie de n'importe quelle file d'attente, utilisez :

GET /api/scheduler/queueable

Pour dresser la liste des configurations de tâches qui peuvent faire partie d'une file d'attente particulière, utilisez :

GET /api/scheduler/queueable?name={queue}

Cela exclura également toutes les tâches qui font déjà partie de la file d'attente nommée.

Synchronization

Cette section traite des opérations 'pull' et 'push' sur les données et les métadonnées.

Data value push

Pour lancer une opération push (envoi) d'une valeur de données vers un serveur distant, il faut d'abord configurer l'URL et les informations d'identification du serveur concerné dans Paramètres du système > Synchronisation, puis envoyer une requête POST à la ressource suivante :

/api/33/synchronization/dataPush

Metadata pull

Pour lancer une opération pull (extraction) de métadonnées à partir d'un document JSON distant, vous pouvez effectuer une requête POST avec un url comme charge à la ressource suivante :

/api/33/synchronization/metadataPull

Note

The supplied URL will be checked against the config property metadata.sync.remote_servers_allowed in the dhis.conf file. If the base URL is not one of the configured servers allowed then the operation will not be allowed. See failure example below.
Some examples where the config set is metadata.sync.remote_servers_allowed=https://server1.org/,https://server2.org/ - supply https://server1.org/path/to/resource -> this will be accepted - supply https://server2.org/resource/path -> this will be accepted - supply https://oldserver.org/resource/path -> this will be rejected

Sample failure response

 {
  "httpStatus": "Conflict",
  "httpStatusCode": 409,
  "status": "ERROR",
  "message": "Provided URL is not in the remote servers allowed list",
  "errorCode": "E1004"
}

Availability check

Pour vérifier la disponibilité du serveur de données distant et les informations d'identification de l'utilisateur, vous pouvez envoyer une requête GET à la ressource suivante :

/api/33/synchronization/availability

Audit

Audit

DHIS2 audite les mises à jour et les suppressions de valeurs de données agrégées, de valeurs de données d'entités suivies, de valeurs d'attributs d'entités suivies et d'enregistrements d'approbation de données. Cette section explique comment récupérer les enregistrements d'audit pour les entités mentionnées. Plusieurs paramètres de requête peuvent être répétés autant de fois que nécessaire.

Audits des valeurs de données agrégées

Le point d'extrémité des audits de valeurs de données agrégées se trouve ici :

/api/audits/dataValue

Tableau : Paramètres de requête pour les valeurs de données agrégées

Paramètre Option Description
ds ID de l'ensemble de données Un ou plusieurs identifiants d'ensembles de données pour obtenir des éléments de données
de ID de l'élément de données Un ou plusieurs identifiants d'éléments de données
pe Période ISO Un ou plusieurs identifiants ISO de période
ou Identifiant de l'unité d'organisation Un ou plusieurs identifiants d'unité d'organisation
auditType UPDATE DELETE
skipPaging false true
pagination false | true Activer ou désactiver la pagination
page Numéro Numéro de page (par défaut 1)
pageSize Numéro Taille de la page (par défaut 50)

Exemple : Obtenir les audits pour un ensemble de données lyLU2wR22tC et un type d'audit CREATE ou UPDATE :

/api/33/audits/dataValue?ds=lyLU2wR22tC&auditType=CREATE,UPDATE

Exemple : Obtenir les audits pour l'élément de données BOSZApCrBni, l'unité d'organisation DiszpKrYNg8 et la combinaison d'options de catégorie TkDhg29x18A :

/api/33/audits/dataValue?de=BOSZApCrBni&ou=DiszpKrYNg8&co=TkDhg29x18A

Tracked entity audits

Une fois que l'audit est activé pour les entités suivies (en réglant allowAuditLog des types d'entités suivies sur true), toutes les opérations de lecture et de recherche sont enregistrées. Le point d'extrémité pour accéder aux journaux d'audit se trouve ici :

/api/audits/trackedEntity

Tableau : Paramètres de requête pour les audits d'entités suivies

Paramètre Option Description
trackedEntities Uid d'entités suivies Un ou plusieurs identifiants d'entités suivies (séparés par des virgules)
user Utilisateur Un ou plusieurs identifiants d'utilisateur
auditType SEARCH READ
startDate Date de début Date de début des audits au format aaaa-mm-jj.
endDate Date de fin Date de fin des audits au format aaaa-mm-jj.
skipPaging false true
pagination false | true Détermine s'il faut activer ou désactiver la pagination
page Numéro Numéro de page (par défaut 1)
pageSize Numéro Taille de la page (par défaut 50)

Exemple : Obtenir les audits de type READ avec startDate 2018-03-01 et endDate 2018-04-24 avec une taille de page de 5 :

/api/33/audits/trackedEntity.json?startDate=2021-03-01&endDate=2022-04-24&auditType=READ&pageSize=5

Exemple : Obtenir les audits de l'entité suivie wNiQ2coVZ39 :

/api/33/audits/trackedEntity.json?trackedEntities=wNiQ2coVZ39

Audits d'instances d'entités suivies OBSOLÈTES

Une fois que l'audit est activé pour les instances d'entités suivies (en réglant allowAuditLog des types d'entités suivies sur true), toutes les opérations de lecture et de recherche sont enregistrées. Le point d'extrémité pour accéder aux journaux d'audit se trouve ici :

/api/audits/trackedEntityInstance

Tableau : Paramètres de requête pour les instances d'audit d'entités suivies

Paramètre Option Description
trackedEntities Uid d'entités suivies Un ou plusieurs identifiants d'entités suivies (séparés par des virgules)
user Utilisateur Un ou plusieurs identifiants d'utilisateur
auditType SEARCH READ
startDate Date de début Date de début des audits au format aaaa-mm-jj.
endDate Date de fin Date de fin des audits au format aaaa-mm-jj.
skipPaging false true
pagination false | true Détermine s'il faut activer ou désactiver la pagination
page Numéro Numéro de page (par défaut 1)
pageSize Numéro Taille de la page (par défaut 50)

Exemple : Obtenir les audits de type READ avec startDate 2018-03-01 et endDate 2018-04-24 avec une taille de page de 5 :

/api/33/audits/trackedEntityInstance.json?startDate=2021-03-01&endDate=2022-04-24&auditType=READ&pageSize=5

Exemple : Obtenir les audits de l'entité suivie wNiQ2coVZ39 :

/api/33/audits/trackedEntityInstance.json?trackedEntities=wNiQ2coVZ39

Data approval audits

Le point d'extrémité des audits d'approbation de données se trouve ici :

/api/audits/dataApproval

Tableau : Paramètres de requête pour l'approbation des données

Paramètre Option Description
dal ID du niveau d'approbation des données Un ou plusieurs identifiants de niveau d'approbation des données
wf ID du flux d'approbation des données Un ou plusieurs identifiants de flux d'approbation des données
ou Identifiant de l'unité d'organisation Un ou plusieurs identifiants d'unité d'organisation
aoc ID de la combinaison d'options d'attribut Un ou plusieurs identifiants de combinaison d'options d'attribut
startDate Date de début Date de début des approbations au format aaaa-mm-jj.
endDate Date de fin Date de fin des approbations au format aaaa-mm-jj.
skipPaging false true
page Numéro Numéro de page (par défaut 1)
pageSize Numéro Taille de la page (par défaut 50)

Exemple : Obtenir les audits pour le flux d'approbation des données i5m0JPw4DQi :

/api/33/audits/dataApproval?wf=i5m0JPw4DQi

Exemple : Obtenir les audits entre 2021-01-01 et 2022-01-01 pour l'unité d'organisation DiszpKrYNg8 :

/api/33/audits/dataApproval?ou=DiszpKrYNg8&startDate=2021-01-01&endDate=2022-01-01

Messagerie

Conversations par messages

DHIS2 dispose d'un mécanisme permettant d'envoyer des messages à des fins tels que le retour d'information des utilisateurs, les notifications et les informations générales à l'intention des utilisateurs. Les messages sont regroupés en conversations. Pour interagir avec les conversations de messages, vous pouvez envoyer des requêtes POST et GET à la ressource messageConversations.

/api/33/messageConversations

Les messages sont transmis à la boîte de réception DHIS2, mais ils peuvent également être envoyés aux adresses électroniques et aux téléphones portables de l'utilisateur sous forme de SMS. Dans cet exemple, nous verrons comment utiliser l'API Web pour envoyer, lire et gérer des messages. Nous allons nous faire passer pour l'utilisateur Administrateur DHIS2 et envoyer un message à l'utilisateur Mobile. Nous allons ensuite nous faire passer pour l'utilisateur mobile et lire notre nouveau message. Ensuite, nous allons gérer la boîte de réception de l'utilisateur administrateur en marquant et en supprimant des messages.

Écrire et lire des messages

La ressource avec laquelle nous devons interagir pour envoyer et lire des messages est la ressource messageConversations. Nous commençons par visiter le point d'entrée de l'API Web à l'adresse http://play.dhis2.org/demo/api, où nous trouvons et suivons le lien vers la ressource messageConversations à l'adresse http://play.dhis2.org/demo/api messageConversations. La description nous indique que nous pouvons utiliser une requête POST pour créer un nouveau message en utilisant le format XML suivant pour l'envoyer à plusieurs utilisateurs :

<message xmlns="http://dhis2.org/schema/dxf/2.0">
  <subject>Voici le sujet</subject>
  <text>Voici le texte</text>
  <users>
    <user id="user1ID" />
    <user id="user2ID" />
    <user id="user3ID" />
  </users>
</message>

Pour l'envoi à tous les utilisateurs appartenant à un ou plusieurs groupes d'utilisateurs, nous pouvons utiliser :

<message xmlns="http://dhis2.org/schema/dxf/2.0">
  <subject>Voici le sujet</subject>
  <text>Voici le texte</text>
  <userGroups>
    <userGroup id="userGroup1ID" />
    <userGroup id="userGroup2ID" />
    <userGroup id="userGroup3ID" />
  </userGroups>
</message>

Pour l'envoi à tous les utilisateurs connectés à une ou plusieurs unités d'organisation, nous pouvons utiliser :

<message xmlns="http://dhis2.org/schema/dxf/2.0">
  <subject>Voici le sujet</subject>
  <text>Voici le texte</text>
  <organisationUnits>
    <organisationUnit id="ou1ID" />
    <organisationUnit id="ou2ID" />
    <organisationUnit id="ou3ID" />
  </organisationUnits>
</message>

Puisque nous voulons envoyer un message à notre ami l'utilisateur mobile, nous devons rechercher son identifiant. Nous le faisons en allant au point d'entrée de l'API Web et en suivant le lien vers la ressource utilisateurs à /api/users. Nous continuons en suivant le lien vers l'utilisateur mobile à /api/users/PhzytPW3g2J où nous apprenons que son identifiant est PhzytPW3g2J. Nous sommes maintenant prêts à rassembler nos messages XML pour former un message dans lequel nous voulons demander à l'utilisateur mobile s'il a déclaré des données pour janvier 2014 :

<message xmlns="http://dhis2.org/schema/dxf/2.0">
  <subject>Rapport sur les données de mortalité</subject>
  <text>Avez-vous déclaré des données pour l'ensemble de données sur la mortalité pour janvier 2014 ?</text>
  <users>
    <user id="PhzytPW3g2J" />
  </users>
</message>

Pour le tester, nous enregistrons le contenu XML dans un fichier appelé message.xml. Nous utilisons cURL pour envoyer le message à l'instance de démonstration DHIS2 où nous indiquons que le type de contenu est XML et où nous nous authentifions en tant qu'utilisateur admin :

curl -d @message.xml "https://play.dhis2.org/demo/api/messageConversations"
  -H "Content-Type:application/xml" -u admin:district -X POST

La charge correspondante en JSON et la commande POST ressemblent à ceci :

{
  "subject": "Hey",
  "text": "How are you?",
  "users": [
    {
      "id": "OYLGMiazHtW"
    },
    {
      "id": "N3PZBUlN8vq"
    }
  ],
  "userGroups": [
    {
      "id": "ZoHNWQajIoe"
    }
  ],
  "organisationUnits": [
    {
      "id": "DiszpKrYNg8"
    }
  ]
}
curl -d @message.json "https://play.dhis2.org/demo/api/33/messageConversations"
  -H "Content-Type:application/json" -u admin:district -X POST

Si tout se passe bien, nous recevons un code de statut HTTP 201 Créé. Notez également que nous recevons un en-tête HTTP Localisation qui nous informe de l'URL de la ressource de conversation de messages nouvellement créée - celle-ci peut être utilisée par un utilisateur pour effectuer d'autres actions.

Nous allons maintenant nous faire passer pour l'utilisateur mobile et lire le message qui vient d'être envoyé en envoyant une requête GET à la ressource messageConversations. Nous fournissons un en-tête Accepter avec l'application/xml comme valeur pour indiquer que nous sommes intéressés par la représentation de la ressource XML et nous nous authentifions en tant qu'utilisateur mobile :

curl "https://play.dhis2.org/demo/api/33/messageConversations"
  -H "Accept:application/xml" -u mobile:district

En réponse, nous obtenons le fichier XML suivant :

<messageConversations xmlns="http://dhis2.org/schema/dxf/2.0"
  link="https://play.dhis2.org/demo/api/messageConversations">
  <messageConversation name="Mortality data reporting" id="ZjHHSjyyeJ2"
    link="https://play.dhis2.org/demo/api/messageConversations/ZjHHSjyyeJ2"/>
  <messageConversation name="DHIS2 version 2.7 is deployed" id="GDBqVfkmnp2"
    link="https://play.dhis2.org/demo/api/messageConversations/GDBqVfkmnp2"/>
</messageConversations>

Dans la réponse, nous pouvons lire l'identifiant du nouveau message envoyé, qui est ZjHHSjyyeJ2. Notez que le lien vers la ressource spécifique est intégré et peut être suivi pour lire le message complet. Une fois que nous connaissons l'URL, nous pouvons répondre directement à une conversation sur un message existant en incluant le texte du message dans la charge de la requête. Nous sommes maintenant en mesure de créer une URL pour envoyer notre réponse :

curl -d "Oui, l'ensemble des données sur la mortalité a été déclaré"
  "https://play.dhis2.org/demo/api/messageConversations/ZjHHSjyyeJ2"
  -H "Content-Type:text/plain" -u mobile:district -X POST

Si tout s'est déroulé comme prévu, vous recevrez un code de statut 200 OK.

Dans la version 2.30, nous avons ajouté un paramètre de recherche d'URL :

queryString=?&queryOperator=?

Le filtre recherche des correspondances dans l'objet, le texte et les expéditeurs pour les conversations de messages. L'opérateur de requête par défaut est token (jeton), mais d'autres opérateurs peuvent être définis dans la requête.

Gérer les messages

Au fur et à mesure que les utilisateurs reçoivent et envoient des messages, les conversations commencent à s'empiler dans leur boîte de réception, ce qui devient éventuellement difficile à suivre. Nous allons maintenant voir comment gérer la boîte de réception des messages d'un utilisateur en supprimant et en marquant des conversations par l'intermédiaire de la Web-API. Pour ce faire, nous allons effectuer quelques opérations de maintenance dans la boîte de réception de l'utilisateur « Administrateur DHIS ».

Commençons par supprimer quelques messages de la boîte de réception. Notez bien que toutes les opérations de suppression décrites ici ne suppriment que la relation entre un utilisateur et une conversation de messages. En termes pratiques, cela signifie que nous ne supprimons pas les messages eux-mêmes (ni aucun contenu d'ailleurs) mais que nous supprimons simplement le fil de messages de l'utilisateur de sorte qu'il ne soit plus listé dans la ressource /api/messageConversations.

Pour supprimer une conversation de messages de la boîte de réception d'un utilisateur, nous devons envoyer une requête DELETE à la ressource identifiée par l'identifiant de la conversation de messages et l'utilisateur participant. Par exemple, pour supprimer l'utilisateur avec l'identifiant xE7jOejl9FI de la conversation avec l'identifiant jMe43trzrdi :

curl "https://play.dhis2.org/demo/api/33/messageConversations/jMe43trzrdi

Si la demande a abouti, le serveur répondra par un 200 OK. Le corps de la réponse contient un objet XML ou JSON (selon l'en-tête "accepter" de la demande) contenant l'identifiant de l'utilisateur supprimé.

{
  "removed" : ["xE7jOejl9FI"]
}

En cas d'échec, l'objet renvoyé contiendra un message qui décrit l'erreur.

{
  "message" : "No user with uid: dMV6G0tPAEa"
}

Le lecteur observateur aura déjà remarqué que l'objet renvoyé en cas de succès dans notre exemple est en fait une liste d'identifiants (contenant une seule entrée). Ceci est dû au fait que le endpoint prend également en charge les suppressions par lots. La requête est faite à la même ressource messageConversations mais suit une sémantique légèrement différente. Pour les opérations par lots, les identifiants de conversation sont donnés en tant que paramètres de la chaîne de requête. L'exemple suivant supprime deux conversations de messages distinctes pour l'utilisateur actuel :

curl "https://play.dhis2.org/demo/api/messageConversations?mc=WzMRrCosqc0&mc=lxCjiigqrJm"
  -X DELETE -u admin:district

Si vous disposez d'autorisations suffisantes, vous pouvez supprimer des conversations au nom d'un autre utilisateur en indiquant un paramètre facultatif, l'identifiant de l'utilisateur.

curl "https://play.dhis2.org/demo/api/messageConversations?mc=WzMRrCosqc0&mc=lxCjiigqrJm&user=PhzytPW3g2J"
  -X DELETE -u admin:district

Comme indiqué, les suppressions par lots renvoient le même format de message que pour les opérations individuelles. La liste des objets supprimés reflétera les suppressions effectuées avec succès. Les demandes partiellement erronées (c'est-à-dire les identifiants inexistants) n'annuleront donc pas l'ensemble de l'opération par lots.

Les messages comportent une propriété booléenne read (lire). Cette propriété permet de savoir si un utilisateur a vu (ouvert) un message ou non. Dans un scénario d'application typique (par exemple, le portail web DHIS2), un message est marqué comme lu dès que l'utilisateur l'ouvre pour la première fois. Cependant, les utilisateurs peuvent vouloir gérer le statut « lu » ou « non lu » de leurs messages afin de garder une trace de certaines conversations.

Le marquage des messages comme lus ou non lus suit une sémantique similaire à celle des suppressions de lots, et supporte également les opérations par lots. Pour marquer des messages comme lus, nous envoyons un POST à la ressource messageConversations/read avec un corps de requête contenant un ou plusieurs identifiants de message. Pour marquer des messages comme non lus, nous envoyons une requête identique à la ressource messageConversations/unread. Comme pour les suppressions, un paramètre de requête optionnel utilisateur peut être fourni.

Marquons quelques messages comme lus par l'utilisateur actuel :

curl "https://play.dhis2.org/dev/api/messageConversations/read"
  -d '["ZrKML5WiyFm","Gc03smoTm6q"]' -X POST
  -H "Content-Type: application/json" -u admin:district

La réponse est un 200 OK avec le contenu JSON suivant :

{
  "markedRead": ["ZrKML5WiyFm", "Gc03smoTm6q"]
}

Vous pouvez ajouter des destinataires à une conversation de messages existante. La ressource est située à l'adresse suivante :

/api/33/messageConversations/id/recipients

Les options de cette ressource sont une liste d'utilisateurs, de groupes d'utilisateurs et d'unités d'organisation. La requête doit ressembler à ceci :

{
  "users": [
    {
      "id": "OYLGMiazHtW"
    },
    {
      "id": "N3PZBUlN8vq"
    }
  ],
  "userGroups": [
    {
      "id": "DiszpKrYNg8"
    }
  ],
  "organisationUnits": [
    {
      "id": "DiszpKrYNg8"
    }
  ]
}

Pièces jointes aux messages

La création de messages avec des pièces jointes se fait en deux étapes : le téléchargement du fichier dans la ressource attachments (pièces jointes), puis inclure un ou plusieurs pièces jointes lors de la création d'un nouveau message.

Une requête POST à la ressource attachments téléchargera le fichier sur le serveur.

curl -F file=@attachment.png "https://play.dhis2.org/demo/api/messageConversations/attachments"
  -u admin:district

La demande renvoie un objet qui représente la pièce jointe. L'identifiant de cet objet doit être utilisé lors de la création d'un message afin de lier la pièce jointe au message.

{
  "created": "2018-07-20T16:54:18.210",
  "lastUpdated": "2018-07-20T16:54:18.212",
  "externalAccess": false,
  "publicAccess": "--------",
  "user": {
    "name": "John Traore",
    "created": "2013-04-18T17:15:08.407",
    "lastUpdated": "2018-03-09T23:06:54.512",
    "externalAccess": false,
    "displayName": "John Traore",
    "favorite": false,
    "id": "xE7jOejl9FI"
  },
  "lastUpdatedBy": {
    "id": "xE7jOejl9FI",
    "name": "John Traore"
  },
  "favorite": false,
  "id": "fTpI4GOmujz"
}

Lors de la création d'un nouveau message, les identifiants peuvent être transmis dans le contenu de la requête pour lier les fichiers téléchargés au message en cours de création.

{
  "subject": "Hey",
  "text": "How are you?",
  "users": [
    {
      "id": "OYLGMiazHtW"
    },
    {
      "id": "N3PZBUlN8vq"
    }
  ],
  "userGroups": [
    {
      "id": "ZoHNWQajIoe"
    }
  ],
  "organisationUnits": [
    {
      "id": "DiszpKrYNg8"
    }
  ],
  "attachments": [
    "fTpI4GOmujz",
    "h2ZsOxMFMfq"
  ]
}

Lorsque vous répondez à un message, les identifiants peuvent être transmis en tant que paramètre de la requête.

curl -d "Oui, l'ensemble des données sur la mortalité a été déclaré"
  "https://play.dhis2.org/demo/api/33/messageConversations/ZjHHSjyyeJ2?attachments=fTpI4GOmujz,h2ZsOxMFMfq"
  -H "Content-Type:text/plain" -u mobile:district -X POST

Une fois qu'un message avec une pièce jointe a été créé, il est possible d'accéder à la pièce jointe à l'aide d'une requête GET à l'URL suivante :

/api/messageConversations/<mcv-id>/<msg-id>/attachments/<attachment-id>

Où est l'ID de la conversation du message, est l'ID du message qui contient la pièce jointe et est l'ID de la pièce jointe spécifique du message.

Notifications des tickets et des résultats de validation

Vous pouvez utiliser l'outil « écrire un feedback » pour créer des tickets et des messages. La seule différence entre un ticket et un message est que vous pouvez donner un statut et une priorité à un ticket. Pour définir le statut :

POST /api/messageConversations/<uid>/status

Pour définir la priorité :

POST /api/messageConversations/<uid>/priority

Dans la version 2.29, les messages générés par l'analyse de validation peuvent désormais être utilisés dans les propriétés de statut et de priorité. Par défaut, les messages générés par l'analyse de validation héritent de la priorité de la règle de validation en question, ou de la plus grande importance si le message contient plusieurs règles.

Dans la version 2.30, les règles de validation peuvent être affectées à n'importe quel utilisateur, alors que les tickets doivent toujours être affectés à un utilisateur appartenant au groupe des destinataires du retour d'information du système.

Tableau : Liste des valeurs de statut et de priorité valides

Statut Priorité
OUVRIR BAS
EN ATTENTE MOYEN
INVALIDE ÉLEVÉ
RÉSOLU

Vous pouvez également ajouter un message interne à un ticket, qui ne peut être vu que par les utilisateurs ayant les permissions « Gérer les tickets ». Pour créer une réponse interne, vous devez inclure le paramètre « interne » et le définir sur:

curl -d "Ceci est un message interne"
  "https://play.dhis2.org/demo/api/33/messageConversations/ZjHHSjyyeJ2?internal=true"
  -H "Content-Type:text/plain" -u admin:district -X POST

Visualisations

Tableaux de bord

Le tableau de bord est conçu pour vous donner un aperçu de plusieurs éléments analytiques tels que des cartes, des graphiques, des tableaux croisés dynamiques et des rapports qui, ensemble, peuvent fournir un aperçu complet de vos données. Les tableaux de bord sont disponibles dans l'API Web via la ressource tableaux de bord. Un tableau de bord contient une liste d'éléments de tableau de bord. Un élément peut représenter une ressource unique, comme un graphique, une carte ou un tableau de rapport, ou représenter une liste de liens vers des ressources analytiques, comme des rapports, des ressources, des rapports tabulaires et des utilisateurs. Un élément de tableau de bord peut contenir jusqu'à huit liens. En règle générale, un client de tableau de bord peut choisir de visualiser les éléments à objet unique directement dans une interface utilisateur, tout en rendant les éléments à objets multiples sous forme de liens cliquables.

/api/tableau de bord

Parcourir les tableaux de bord

Pour obtenir une liste de vos tableaux de bord avec des informations de base telles que l'identifiant, le nom et le lien au format JSON, vous pouvez envoyer une requête GET à l'URL suivante :

/api/dashboards.json

La ressource Tableaux de bord fournit une liste de tableaux de bord. N'oubliez pas que l'objet tableau de bord est partagé et que la liste sera donc affectée par l'utilisateur actuellement authentifié. Vous pouvez obtenir plus d'informations sur un tableau de bord spécifique en suivant son lien, comme suit :

/api/dashboards/vQFhmLJU5sK.json

Un tableau de bord contient des informations telles que le nom et la date de création, ainsi qu'un tableau d'éléments du tableau de bord. La réponse au format JSON ressemblera à cette réponse (certaines informations ont été supprimées par souci de concision).

{
  "lastUpdated" : "2013-10-15T18:17:34.084+0000",
  "id": "vQFhmLJU5sK",
  "created": "2013-09-08T20:55:58.060+0000",
  "name": "Mother and Child Health",
  "href": "https://play.dhis2.org/demo/api/dashboards/vQFhmLJU5sK",
  "publicAccess": "--------",
  "restrictFilters": false,
  "externalAccess": false,
  "itemCount": 17,
  "displayName": "Mother and Child Health",
  "access": {
    "update": true,
    "externalize": true,
    "delete": true,
    "write": true,
    "read": true,
    "manage": true
  },
  "user": {
    "id": "xE7jOejl9FI",
    "name": "John Traore",
    "created": "2013-04-18T15:15:08.407+0000",
    "lastUpdated": "2014-12-05T03:50:04.148+0000",
    "href": "https://play.dhis2.org/demo/api/users/xE7jOejl9FI"
  },
  "dashboardItems": [{
    "id": "bu1IAnPFa9H",
    "created": "2013-09-09T12:12:58.095+0000",
    "lastUpdated": "2013-09-09T12:12:58.095+0000"
    }, {
    "id": "ppFEJmWWDa1",
    "created": "2013-09-10T13:57:02.480+0000",
    "lastUpdated": "2013-09-10T13:57:02.480+0000"
  }],
  "layout": {
    "spacing": {
      "column": 5,
      "row": 5
    },
    "columns": [{
      "index": 0,
      "span": 2
    }, {
      "index": 1,
      "span": 1
    }]
  },
  "userGroupAccesses": []
}

Il est possible d'obtenir une réponse plus personnalisée en spécifiant des champs particuliers dans la demande. Un exemple est fourni ci-dessous, qui renverrait des informations plus détaillées sur chaque objet du tableau de bord d'un utilisateur.

/api/dashboards/vQFhmLJU5sK/?fields=:all,dashboardItems[:all]

Rechercher des tableaux de bord

Lorsqu'un utilisateur crée un tableau de bord, il est pratique de pouvoir rechercher diverses ressources analytiques à l'aide des ressources /dashboards/q ou /dashboards/search. Ces ressources vous permettent de rechercher des correspondances sur la propriété de nom des objets suivants : visualisations, cartes de visualisations d'événements, utilisateurs, rapports et ressources. Vous pouvez effectuer une recherche en effectuant une requête GET sur le modèle d'URL de ressource suivant, où « my-query » doit être remplacé par la requête de recherche préférée :

/api/dashboards/q/my-query.json
/api/dashboards/search?q=my-query

Par exemple, cette requête :

/api/dashboards/q/ma?count=6&maxCount=20&max=REPORT&max=MAP
/api/dashboards/search?q=ma?count=6&maxCount=20&max=REPORT&max=MAP

La recherche portera sur les éléments suivants :

  • Le nom de l'objet analytique contient la chaîne « ma »
  • Renvoi jusqu'à 6 exemplaires de chaque type
  • Pour les types RAPPORT et CARTE, il est possible de renvoyer jusqu'à 20 éléments.

Tableau : tableaux de bord/q et tableaux de bord/paramètres de requête de recherche

Paramètre de requête Description Type Par défaut
count Le nombre d'éléments de chaque type à renvoyer Entier positif 6
Nombre max. Le nombre d'éléments de type max à renvoyer Entier positif 25
max Le type pour lequel il faut renvoyer le nombre maximal Chaîne [CARTE|UTILISATEUR|RAPPORT|RESSOURCE|VISUALISATION#124;VISUALISATION_D'ÉVÉNEMENT,GRAPHIQUE_D'ÉVÉNEMENT,RAPPORT_D'ÉVÉNEMENT] N/A

Les formats de réponse JSON et XML sont pris en charge. La réponse au format JSON contiendra les références aux ressources correspondantes et le nombre de correspondances trouvées au total et pour chaque type de ressource. Elle ressemblera à ceci :

{
  "visualizations": [{
    "name": "ANC: ANC 3 Visits Cumulative Numbers",
    "id": "arf9OiyV7df",
    "type": "LINE"
  }, {
    "name": "ANC: 1st and 2rd trends Monthly",
    "id": "jkf6OiyV7el",
    "type": "PIVOT_TABLE"
  }],
  "eventVisualizations": [{
    "name": "Inpatient: Cases 5 to 15 years this year (case)",
    "id": "TIuOzZ0ID0V",
    "type": "LINE_LIST"
  }, {
    "name": "Inpatient: Cases last quarter (case)",
    "id": "R4wAb2yMLik",
    "type": "LINE_LIST"
  }],
  "maps": [{
    "name": "ANC: 1st visit at facility (fixed) 2013",
    "id": "YOEGBvxjAY0"
  }, {
    "name": "ANC: 3rd visit coverage 2014 by district",
    "id": "ytkZY3ChM6J"
  }],
  "reports": [{
    "name": "ANC: 1st Visit Cumulative Chart",
    "id": "Kvg1AhYHM8Q"
  }, {
    "name": "ANC: Coverages This Year",
    "id": "qYVNH1wkZR0"
  }],
  "searchCount": 8,
  "visualizationCount": 2,
  "eventVisualizationCount": 2,
  "mapCount": 2,
  "reportCount": 2,
  "userCount": 0,
  "eventReports": 0,
  "eventCharts" :0,
  "resourceCount": 0
}

Créer, mettre à jour et supprimer des tableaux de bords{ #webapi_creating_updating_removing_dashboards }

La création, la mise à jour et la suppression des tableaux de bord suivent la sémantique REST standard. Pour créer un nouveau tableau de bord, vous pouvez faire une requête POST à la ressource /api/dashboards. Du point de vue du consommateur, il peut être pratique de créer d'abord un tableau de bord et d'y ajouter ensuite des éléments. Les formats JSON et XML sont supportés pour la charge de la requête. Pour créer un tableau de bord avec le nom « Mon tableau de bord », vous pouvez utiliser une charge JSON comme celle-ci :

{
  "nom": "Mon tableau de bord"
}

Pour mettre à jour, par exemple renommer, un tableau de bord, vous pouvez faire une demande PUT avec une charge similaire à la même ressource api/dashboards.

To remove a dashboard, you can make a DELETE (supprimer) request to the specific dashboard resource similar to this:

/api/dashboards/vQFhmLJU5sK

Ajouter, déplacer et supprimer des éléments et du contenu du tableau de bord

As DashboardItem is an embedded object of Dashboard, all operations must be performed through the /api/dashboards/{uid} endpoint.

Add a Visualization

To add a visualization to a specific dashboard, send a PUT request to:

 /api/dashboards/ChZ236jPgXs

The request payload must include the full Dashboard object, including all existing and new DashboardItems.

{
    "name": "test",
    "layout": {
        "columns": []
    },
    "itemConfig": {
        "insertPosition": "END"
    },
    "restrictFilters": false,
    "allowedFilters": [],
    "favorites": [],
    "displayName": "test",
    "user": {
        "id": "xE7jOejl9FI",
        "code": null,
        "name": "John Traore",
        "username": "admin"
    },
    "id": "ChZ236jPgXs",
    "dashboardItems": [
        {
            "x": 0,
            "y": 0,
            "w": 20,
            "h": 29,
            "id": "cKd9PKBuHv6",
            "type": "VISUALIZATION",
            "position": null,
            "visualization": {
                "id": "LW0O27b7TdD",
                "name": "ANC: 1-3 dropout rate Yearly"
            },
            "i": "cKd9PKBuHv6",
            "minH": 4,
            "firstOfType": true,
            "width": 20,
            "height": 29
        }
    ],
    "starred": false
}

Update an Item

To update properties of any item inside a dashboard, send a PUT request to:

 /api/dashboards/ChZ236jPgXs

The payload must be the latest Dashboard object, including all its items with the updated property value.

Remove an Item

To remove an item from a dashboard, remove it from the Dashboard payload and send a PUT request to:

 /api/dashboards/ChZ236jPgXs

Définir la présentation d'un tableau de bord

Vous pouvez définir et enregistrer une présentation pour chaque tableau de bord. L'objet suivant est chargé de gérer ce paramètre.

{
  "layout": {
    "spacing": {
      "column": 5,
      "row": 5
    },
    "columns": [{
      "index": 0,
      "span": 2
    }, {
      "index": 1,
      "span": 1
    }]
  }
}

La définition de la présentation sera appliquée à tous les éléments du tableau de bord liés au tableau de bord donné, en respectant les attributs de présentation tels que l'espacement, les colonnes, la portée, etc. Vous trouverez ci-dessous une brève description de chaque attribut.

Tableau : Attributs de la présentation

Attribut Description Type
présentation Ceci est l'objet racine Objet
l'espacement Il définit l'espacement de certains composants de la présentation. Pour l'instant, il prend en charge les colonnes et les lignes. Objet
colonnes Il stocke des paramètres spécifiques liés aux colonnes ( pour l'instant, l'index et la portée) Tableau d'objets

Visualisation

L'API de visualisation est conçue pour aider les clients à interagir avec les graphiques et les tableaux croisés dynamiques/rapports. Les endpoints de cette API sont utilisés par l'application de visualisation des données qui permet la création, la configuration et la gestion des graphiques et des tableaux croisés dynamiques sur la base des définitions du client. L'idée principale est de permettre aux clients et aux utilisateurs de disposer d'une API unique et centralisée fournissant tous les types de graphiques et de tableaux croisés dynamiques ainsi que des paramètres et une configuration spécifiques pour chaque type de visualisation.

Cette API a été introduite pour unifier les API charts (graphiques) et reportTables (tableaux de rapports) et les remplacer entièrement par l'API visualizations (visualisations).

Un objet de visualisation est composé de nombreux attributs (certains sont liés aux graphiques et d'autres aux tableaux croisés dynamiques), mais les plus importants d'entre eux, qui reflètent les informations essentielles de l'objet, sont les suivants :* "id" (identifiant) , "name" (nom) , "type" (type) , "dataDimensionItems" (éléments de données de dimensions) , "columns" (colonnes) , "rows" (lignes) et "filters" (filtres) .*

Le endpoint racine de l'API est /api/visualizations, et la liste des attributs et éléments actuels est décrite dans le tableau ci-dessous.

Tableau : Attributs de visualisation

Champ Description
id L'identifiant unique.
code Un code personnalisé pour identifier la visualisation.
name Le nom de la visualisation
type Le type de visualisation. Les types valides sont les suivants COLONNE, COLONNE_EMPILÉE, BARRE, BARRE_EMPILÉE, LIGNE, ZONE, CIRCULAIRE, RADAR, JAUGE, LIGNE_ANNÉE_SUR_ANNÉE, COLONNE_ANNÉE_SUR_ANNÉE, VALEUR_UNIQUE, TABLEAU_CROISÉ DYNAMIQUE.
titre Un titre personnalisé.
sous-titre Un sous-titre personnalisé.
description Définit une description personnalisée pour la visualisation.
created La date/heure de création de la visualisation.
startDate La date de début utilisée lors du filtrage.
endDate La date de fin utilisée lors du filtrage.
sortOrder L'ordre de tri de cette visualisation. Valeur entière.
user Un objet représentant le créateur de la visualisation.
publicAccess (accès public) Définit les autorisations pour l'accès public.
displayDensity (afficher la densité) La densité du texte affiché.
fontSize (taille de la police) La taille de la police du texte.
fontStyle (style de police) Styles de police personnalisés pour : visualizationTitle (titre de la visualisation), visualizationSubtitle (sous-titre de la visualisation), horizontalAxisTitle (titre de l'axe horizontal), verticalAxisTitle (titre de l'axe vertical), targetLineLabel (étiquette de la ligne cible), baseLineLabel (étiquette de la ligne de base), seriesAxisLabel (étiquette de l'axe de la série), categoryAxisLabel (étiquette de l'axe de la catégorie), légende.
périodes relatives Un objet représentant les périodes relatives utilisées dans la requête analytique.
legendSet (ensemble de légende) Un objet représentant les définitions de la légende.
legendDisplayStyle (style d'affichage de légende) Le style d'affichage de la légende. Il peut être : FILL ( remplit) ou TEXT ( texte).
legendDisplayStrategy (stratégie d'affichage de la légende) Le style d'affichage de la légende. Il peut être : FIXE ou BY_DATA_ITEM (par élément de données).
Type d'agrégation Détermine la manière dont les valeurs du tableau croisé dynamique sont agrégées. Options valides : SUM (somme), AVERAGE (moyenne), AVERAGE_SUM_ORG_UNIT ( somme moyenne des unités d'organisation), LAST (dernier), LAST_AVERAGE_ORG_UNIT (dernière moyenne des unités d'organisation), FIRST (premier), FIRST_AVERAGE_ORG_UNIT (première moyenne des unités d'organisation), COUNT (nombre), STDDEV (écart type), VARIANCE (écart), MIN (minimum), MAX (maximum), NONE (aucun), CUSTOM (personnalisé) ou DEFAULT (par défaut).
regressionType (type de régression) Un type de régression valide : NONE (aucun), LINEAR (linéaire), POLYNOMIAL (polynomial) ou LOESS.
targetLineValue (valeur de la ligne cible) La ligne cible du graphique. Accepte un type Double.
targetLineLabel (étiquette de la ligne cible) L'étiquette de la ligne cible du graphique.
rangeAxisLabel (Étiquette de l'axe de la plage ) L'étiquette/titre de l'axe vertical (y) du graphique.
domainAxisLabel (étiquette de l'axe du domaine) L'étiquette/titre de l'axe horizontal (x) du graphique.
rangeAxisMaxValue (Plage de l'axe de la valeur maximale) La valeur maximale de l'axe du graphique. Les valeurs en dehors de la plage ne seront pas affichées.
rangeAxisMinValue (Plage de l'axe de la Valeur minimale) La valeur minimale de l'axe du graphique. Les valeurs en dehors de la plage ne seront pas affichées.
rangeAxisSteps (Étapes de l'axe de la plage) Le nombre de pas d'axe entre les valeurs minimale et maximale.
rangeAxisDecimals (Décimales de l'axe de la plage) Le nombre de décimales pour les valeurs des axes.
baseLineValue (Valeur de la ligne de base) Une valeur de référence du graphique.
baseLineLabel (étiquette de la ligne de base) Une étiquette de ligne de base du graphique.
digitGroupSeparator (Séparateur de groupes de chiffres) Séparateur de groupes de chiffres. Valeurs valides : VIRGULE, ESPACE ou AUCUN.
topLimit (Limite maximale) La limite maximale fixée pour le tableau croisé dynamique.
Critères de mesure Décrit les critères appliqués à cette mesure.
percentStackedValues (Pourcentage des valeurs empilées) Utilise ou non des valeurs empilées. Plus susceptible d'être utilisé pour les graphiques. Valeur booléenne.
noSpaceBetweenColumns (Aucun espace entre les colonnes) Afficher/masquer l'espace entre les colonnes. Valeur booléenne.
régression Indique si la visualisation contient des colonnes de régression. Plus susceptible de s'appliquer aux rapports/croisés dynamiques. Valeur booléenne.
externalAccess (accès externe) Indique si la visualisation est disponible en lecture seule externe. Ne s'applique que si aucun utilisateur n'est connecté. Valeur booléenne.
userOrganisationUnit (Unité d'organisation de l'utilisateur) Indique si l'utilisateur dispose d'une unité d'organisation. Valeur booléenne.
userOrganisationUnitChildren (Unité d'organisation subordonnées de l'utilisateur ) Indique si l'utilisateur a des unités d'organisation subordonnées. Valeur booléenne.
userOrganisationUnitGrandChildren (Unité d'organisation subordonnées de l'utilisateur ) Indique si l'utilisateur a une unité d'organisation subordonnées. Valeur booléenne.
reportingParams (Paramètres de déclaration) Objet utilisé pour définir des attributs booléens liés à la déclaration.
rowTotals (totaux des lignes) Affiche (ou non) les totaux des lignes. Valeur booléenne.
colTotals (totaux des colonnes) Affiche (ou non) les totaux des colonnes. Valeur booléenne.
rowSubTotals (Sous-totaux des lignes) Affiche (ou non) les sous-totaux des lignes. Valeur booléenne.
colSubTotals (Sous-totaux des colonnes) Affiche (ou non) les sous-totaux des colonnes. Valeur booléenne.
cumulativeValues (Valeurs cumulées) Indique si la visualisation utilise des valeurs cumulées. Valeur booléenne.
hideEmptyColumns (cacher les colonnes vides) Indique s'il faut masquer les colonnes sans données. Valeur booléenne.
hideEmptyRows (cacher les lignes vides) Indique s'il faut masquer les lignes qui ne contiennent pas de données. Valeur booléenne.
fixColumnHeaders (fixer les en-têtes de colonne) Maintient les en-têtes des colonnes fixes (ou non) dans un tableau croisé dynamique. Valeur booléenne.
fixRowHeaders (En-tête de ligne fixe) Conserve les en-têtes des lignes fixes (ou non) dans un tableau croisé dynamique. Valeur booléenne.
completedOnly (Terminé uniquement) Indicateur utilisé dans les requêtes d'analyse. S'il est vrai, seuls les événements/inscriptions terminés seront considérés. Valeur booléenne.
skipRounding (ignorer l'arrondissement des valeurs) Appliquer ou non l'arrondi. Valeur booléenne.
showDimensionLabels (afficher les étiquettes de dimension) Affiche ou non les étiquettes des dimensions. Valeur booléenne.
hideTitle (masquer le titre) Masque ou non le titre. Valeur booléenne.
hideSubtitle (masquer le sous-titre) Masque ou non les sous-titres. Valeur booléenne.
hideLegend (masquer la légende) Affiche/masque la légende. Très probablement utilisé pour les graphiques. Valeur booléenne.
showHierarchy (afficher la hiérarchie) Affiche (ou non) les noms de la hiérarchie des unités d'organisation. Valeur booléenne.
showData (afficher les données) Utilisé par les graphiques pour masquer ou non les données/valeurs dans le modèle présenté. Valeur booléenne.
lastUpdatedBy (Dernière mise à jour par) L'objet qui représente l'utilisateur qui a appliqué les dernières modifications à la visualisation.
lastUpdated (dernière mise à jour) Date/heure de la dernière modification de la visualisation.
favoris Liste des utilisateurs qui ont marqué cet objet comme favori.
abonnés Liste des utilisateurs ayant souscrit à cette visualisation.
traductions Ensemble des traductions d'objets disponibles, normalement filtrées par le paramètre locale.
outlierAnalysis (Analyse des valeurs atypiques) Objet chargé de conserver les paramètres relatifs à l'analyse des valeurs atypiques. L'attribut interne 'outlierMethod' (méthode des valeurs atypiques) prend en charge : IQR, STANDARD_Z_SCORE (SCORE Z STANDARD), MODIFIED_Z_SCORE (SCORE Z MODIFIÉ). L'attribut 'normalizationMethod' (méthode de normalisation) n'accepte pour l'instant que Y_RESIDUALS_LINEAR (RESIDUS LINEAIRE Y).
seriesKey (Clé de série) Options de style pour l'affichage ou non de la clé de série.
légende Options permettant d'appliquer ou non des couleurs de légende à la série de graphiques.

Récupération des visualisations

Pour récupérer une liste de toutes les visualisations existantes, au format JSON, avec quelques informations de base (y compris l'identifiant, le nom et la pagination), vous pouvez faire une requête GET à l'URL ci-dessous. Vous devriez voir une liste de toutes les visualisations publiques/partagées ainsi que vos visualisations privées.

GET /api/visualizations.json

Si vous souhaitez extraire la définition JSON d'une visualisation spécifique, vous pouvez ajouter son identifiant respectif à l'URL :

GET /api/visualizations/hQxZGXqnLS9.json

La représentation suivante est un exemple de réponse au format JSON (par souci de concision, certaines informations ont été supprimées). Pour obtenir le schéma complet, veuillez utiliser GET /api/schemas/visualization.

{
  "lastUpdated": "2020-02-06T11:57:09.678",
  "href": "http://my-domain/dhis/api/visualizations/hQxZGXqnLS9",
  "id": "hQxZGXqnLS9",
  "created": "2017-05-19T17:22:00.785",
  "name": "ANC: ANC 1st visits last 12 months cumulative values",
  "publicAccess": "rw------",
  "userOrganisationUnitChildren": false,
  "type": "LINE",
  "access": {},
  "reportingParams": {
    "parentOrganisationUnit": false,
    "reportingPeriod": false,
    "organisationUnit": false,
    "grandParentOrganisationUnit": false
  },
  "dataElementGroupSetDimensions": [],
  "attributeDimensions": [],
  "yearlySeries": [],
  "axes": [
    {
      "index": 0,
      "type": "RANGE",
      "title": {
        "textMode": "CUSTOM",
        "text": "Any Title"
      }
    }
  ],
  "filterDimensions": [
    "dx"
  ],
  "columns": [
    {
      "id": "ou"
    }
  ],
  "dataElementDimensions": [],
  "categoryDimensions": [],
  "rowDimensions": [
    "pe"
  ],
  "columnDimensions": [
    "ou"
  ],
  "dataDimensionItems": [
    {
      "dataDimensionItemType": "DATA_ELEMENT",
      "dataElement": {
        "id": "fbfJHSPpUQD"
      }
    }
  ],
  "filters": [
    {
      "id": "dx"
    }
  ],
  "rows": [
    {
      "id": "pe"
    }
  ]
}
Une réponse plus personnalisée peut être obtenue en spécifiant, dans l'URL, les champs que vous souhaitez extraire. Par exemple:
GET /api/visualizations/hQxZGXqnLS9.json?fields=interpretations

renvoie

{
  "interpretations": [
    {
      "id": "Lfr8I2RPU0C"
    },
    {
      "id": "JuwgdJlJPGb"
    },
    {
      "id": "WAoU2rSpyZp"
    }
  ]
}

Comme on peut le voir, le GET ci-dessus ne renverra que les interprétations liées à l'identifiant donné (dans ce cas hQxZGXqnLS9).

Créer, mettre à jour et supprimer des visualisations

Ces opérations suivent la sémantique standard REST. Une nouvelle visualisation peut être créée par une requête POST à la ressource /api/visualisations avec une charge JSON valide. Un exemple de charge pourrait être :

{
  "columns": [
    {
      "dimension": "J5jldMd8OHv",
      "items": [
        {
          "name": "CHP",
          "id": "uYxK4wmcPqA",
          "displayName": "CHP",
          "displayShortName": "CHP",
          "dimensionItemType": "ORGANISATION_UNIT_GROUP"
        },
        {
          "name": "Hospital",
          "id": "tDZVQ1WtwpA",
          "displayName": "Hospital",
          "displayShortName": "Hospital",
          "dimensionItemType": "ORGANISATION_UNIT_GROUP"
        }
      ]
    }
  ],
  "rows": [
    {
      "dimension": "SooXFOUnciJ",
      "items": [
        {
          "name": "DOD",
          "id": "B0bjKC0szQX",
          "displayName": "DOD",
          "displayShortName": "DOD",
          "dimensionItemType": "CATEGORY_OPTION_GROUP"
        },
        {
          "name": "CDC",
          "id": "OK2Nr4wdfrZ",
          "displayName": "CDC",
          "displayShortName": "CDC",
          "dimensionItemType": "CATEGORY_OPTION_GROUP"
        }
      ]
    }
  ],
  "filters": [
    {
      "dimension": "ou",
      "items": [
        {
          "name": "Sierra Leone",
          "id": "ImspTQPwCqd",
          "displayName": "Sierra Leone",
          "displayShortName": "Sierra Leone",
          "dimensionItemType": "ORGANISATION_UNIT"
        },
        {
          "name": "LEVEL-1",
          "id": "LEVEL-H1KlN4QIauv",
          "displayName": "LEVEL-1"
        }
      ]
    }
  ],
  "name": "HIV Cases Monthly",
  "description": "Cases of HIV across the months",
  "category": "XY1vwCQskjX",
  "showDimensionLabels": true,
  "hideEmptyRows": true,
  "hideEmptyColumns": true,
  "skipRounding": true,
  "aggregationType": "SUM",
  "regressionType": "LINEAR",
  "type": "PIVOT_TABLE",
  "numberType": "VALUE",
  "measureCriteria": "Some criteria",
  "showHierarchy": true,
  "completedOnly": true,
  "displayDensity": "NORMAL",
  "fontSize": "NORMAL",
  "digitGroupSeparator": "SPACE",
  "legendDisplayStyle": "FILL",
  "legendDisplayStrategy": "FIXED",
  "hideEmptyRowItems": "BEFORE_FIRST_AFTER_LAST",
  "fixColumnHeaders": true,
  "fixRowHeaders": false,
  "regression": false,
  "cumulative": true,
  "sortOrder": 1,
  "topLimit": 2,
  "rowTotals": true,
  "colTotals": true,
  "hideTitle": true,
  "hideSubtitle": true,
  "hideLegend": true,
  "showData": true,
  "percentStackedValues": true,
  "noSpaceBetweenColumns": true,
  "rowSubTotals": true,
  "colSubTotals": true,
  "userOrgUnitType": "TEI_SEARCH",
  "externalAccess": false,
  "publicAccess": "--------",
  "reportingParams": {
    "reportingPeriod": true,
    "organisationUnit": true,
    "parentOrganisationUnit": true,
    "grandParentOrganisationUnit": true
  },
  "parentGraphMap": {
    "ImspTQPwCqd": ""
  },
  "access": {
    "read": true,
    "update": true,
    "externalize": true,
    "delete": false,
    "write": true,
    "manage": false
  },
  "optionalAxes": [
    {
      "dimensionalItem": "fbfJHSPpUQD",
      "axis": 1
    },
    {
      "dimensionalItem": "cYeuwXTCPkU",
      "axis": 2
    }
  ],
  "relativePeriods": {
    "thisYear": false,
    "quartersLastYear": true,
    "last52Weeks": false,
    "thisWeek": false,
    "lastMonth": false,
    "last14Days": false,
    "biMonthsThisYear": false,
    "monthsThisYear": false,
    "last2SixMonths": false,
    "yesterday": false,
    "thisQuarter": false,
    "last12Months": false,
    "last5FinancialYears": false,
    "thisSixMonth": false,
    "lastQuarter": false,
    "thisFinancialYear": false,
    "last4Weeks": false,
    "last3Months": false,
    "thisDay": false,
    "thisMonth": false,
    "last5Years": false,
    "last6BiMonths": false,
    "last4BiWeeks": false,
    "lastFinancialYear": false,
    "lastBiWeek": false,
    "weeksThisYear": false,
    "last6Months": false,
    "last3Days": false,
    "quartersThisYear": false,
    "monthsLastYear": false,
    "lastWeek": false,
    "last7Days": false,
    "thisBimonth": false,
    "lastBimonth": false,
    "lastSixMonth": false,
    "thisBiWeek": false,
    "lastYear": false,
    "last12Weeks": false,
    "last4Quarters": false
  },
  "user": {},
  "yearlySeries": [
    "THIS_YEAR"
  ],
  "userGroupAccesses": [
    {
      "access": "rwx-----",
      "userGroupUid": "ZoHNWQajIoe",
      "displayName": "Bo District M&E officers",
      "id": "ZoHNWQajIoe"
    }
  ],
  "userAccesses": [
    {
      "access": "--------",
      "displayName": "John Barnes",
      "id": "DXyJmlo9rge",
      "userUid": "DXyJmlo9rge"
    }
  ],
  "legendSet": {
    "name": "Death rate up",
    "id": "ham2eIDJ9k6",
    "legends": [
      {
        "startValue": 1,
        "endValue": 2,
        "color": "red",
        "image": "some-image"
      },
      {
        "startValue": 2,
        "endValue": 3,
        "color": "blue",
        "image": "other-image"
      }
    ]
  },
  "outlierAnalysis": {
    "enabled": true,
    "outlierMethod": "IQR",
    "thresholdFactor": 1.5,
    "normalizationMethod": "Y_RESIDUALS_LINEAR",
    "extremeLines": {
      "enabled": true,
      "value": 3.5
    }
  },
  "legend": {
    "strategy": "FIXED",
    "style": "FILL",
    "set": {
      "id": "fqs276KXCXi",
      "displayName": "ANC Coverage"
    },
    "showKey": false
  },
  "seriesKey": {
    "hidden": true,
    "label": {
      "fontStyle": {
        "textColor": "#cccddd"
      }
    }
  },
  "axes": [
    {
      "index": 0,
      "type": "RANGE",
      "label": {
        "fontStyle": {
          "textColor": "#cccddd"
        }
      },
      "title": {
        "text": "Range axis title",
        "textMode": "CUSTOM",
        "fontStyle": {
          "textColor": "#000000"
        }
      },
      "decimals": 1,
      "maxValue": 100,
      "minValue": 20,
      "steps": 5,
      "baseLine": {
        "value": 50,
        "title": {
          "text": "My baseline",
          "fontStyle": {
            "textColor": "#000000"
          }
        }
      },
      "targetLine": {
        "value": 80,
        "title": {
          "text": "My targetline",
          "fontStyle": {
            "textColor": "#cccddd"
          }
        }
      }
    },
    {
      "index": 1,
      "type": "DOMAIN",
      "label": {
        "fontStyle": {
          "textColor": "#000000"
        }
      },
      "title": {
        "text": "Domain axis title",
        "textMode": "CUSTOM",
        "fontStyle": {
          "textColor": "#cccddd"
        }
      }
    }
  ],
  "axes": [
    {
      "index": 0,
      "type": "RANGE",
      "label": {
        "fontStyle": {
          "textColor": "#cccddd"
        }
      },
      "title": {
        "text": "Range axis title",
        "fontStyle": {
          "textColor": "#000000"
        }
      },
      "decimals": 1,
      "maxValue": 100,
      "minValue": 20,
      "steps": 5,
      "baseLine": {
        "value": 50,
        "title": {
          "text": "My baseline",
          "fontStyle": {
            "textColor": "#000000"
          }
        }
      },
      "targetLine": {
        "value": 80,
        "title": {
          "text": "My targetline",
          "fontStyle": {
            "textColor": "#cccddd"
          }
        }
      }
    },
    {
      "index": 1,
      "type": "DOMAIN",
      "label": {
        "fontStyle": {
          "textColor": "#000000"
        }
      },
      "title": {
        "text": "Domain axis title",
        "fontStyle": {
          "textColor": "#cccddd"
        }
      }
    }
  ]
}

Pour mettre à jour une visualisation spécifique, vous pouvez envoyer une requête PUT à la même ressource /api/visualisations avec une charge similaire PLUS l'identifiant de la visualisation respective, par exemple :

PUT /api/visualizations/hQxZGXqnLS9

Enfin, pour supprimer une visualisation existante, vous pouvez faire une requête DELETE en spécifiant l'identifiant de la visualisation à supprimer, comme indiqué :

DELETE /api/visualizations/hQxZGXqnLS9

Visualisation des événements

L'API EventVisualization (visualisation d'événements) est conçue pour aider les clients à interagir avec les graphiques et les rapports d'événements. Les endpoints de cette API sont utilisés par l'application Event Visualization qui permet la création, la configuration et la gestion de graphiques et de rapports basés sur les paramètres définis par le client. L'idée principale est de permettre aux clients et aux utilisateurs de disposer d'une API unique et centralisée fournissant tous les types de graphiques et de rapports d'événements ainsi que des paramètres et une configuration spécifiques pour chaque type de visualisation d'événement. Cette API a été introduite dans le but d'unifier les API eventCharts (graphiques d'événements) et eventReports (rapports d'événements) et de les remplacer entièrement en faveur de l'API eventVisualizations (ce qui signifie que l'utilisation des API eventCharts (graphiques d'événements) et eventReports (rapports d'événements) devrait être évitée). En résumé, les ressources/API suivantes : /api/eventCharts, /api/eventReports sont remplacées par /api/eventVisualizations

Remarque

Les nouvelles applications et les nouveaux clients doivent éviter d'utiliser les API eventCharts (graphiques d'événements) et eventReports (rapports d'événements) car elles sont obsolètes. Utilisez plutôt l'API eventVisualizations (visualisations d'événements).

Un objet EventVisualization (visualisation d'événements) est composé de nombreux attributs (certains liés à la création de graphiques et d'autres à la création de rapports), mais les plus importants, qui reflètent les informations essentielles de l'objet, sont les suivants : * "identifiant", "nom", "type", "éléments de données de dimension ", " colonnes ", " lignes " et " filtres ".* Le endpoint racine de l'API est /api/eventVisualizations, et la liste des attributs et éléments actuels est décrite dans le tableau ci-dessous.

Tableau : Attributs de la visualisation d'événements

Champ Description
id L'identifiant unique.
code Un code personnalisé pour identifier la visualisation d'événement.
name Le nom de la visualisation d'événement
type Le type de visualisation d'événement. Les types valides sont les suivants COLONNE, COLONNE_EMPILÉE, BARRE, BARRE_EMPILÉE, LIGNE, LISTE_DE LIGNES, ZONE, ZONE_EMPILÉE, CIRCULAIRE, RADAR, JAUGE, LIGNE_ANNÉE_SUR_ANNÉE, COLONNE_ANNÉE_SUR_ANNÉE, VALEUR_UNIQUE, TABLEAU_CROISÉ DYNAMIQUE, NUAGE DE POINTS, BULLE.
titre Un titre personnalisé.
sous-titre Un sous-titre personnalisé.
description Définit une description personnalisée pour la visualisation d'événement.
created Date/heure de création de la visualisation d'événement.
startDate La date de début utilisée lors du filtrage.
endDate La date de fin utilisée lors du filtrage.
sortOrder Ordre de tri de cette visualisation d'événement. Valeur entière.
user Un objet représentant le créateur de la visualisation.
publicAccess (accès public) Définit les autorisations pour l'accès public.
displayDensity (afficher la densité) La densité du texte affiché.
fontSize (taille de la police) La taille de la police du texte.
périodes relatives Un objet représentant les périodes relatives utilisées dans la requête analytique.
légende Objet représentant les définitions de la légende et de l'ensemble de légendes, du style d'affichage (FILL (Remplir) ou TEXT (Texte)) et de la stratégie d'affichage (FIXED (Fixé) ou BY_DATA_ITEM (Par élément de données)).
Type d'agrégation Détermine la manière dont les valeurs sont agrégées (le cas échéant). Options valides : SUM (somme), AVERAGE (moyenne), AVERAGE_SUM_ORG_UNIT ( somme moyenne des unités d'organisation ), LAST (dernier), LAST_AVERAGE_ORG_UNIT ( dernière moyenne des unités d'organisation ), FIRST (premier), FIRST_AVERAGE_ORG_UNIT ( première moyenne des unités d'organisation ), COUNT (nombre), STDDEV (valeur de référence), VARIANCE (écart type), MIN (minimum), MAX (maximum), NONE (aucun), CUSTOM (personnalisé) ou DEFAULT ( par défaut).
regressionType (type de régression) Un type de régression valide : NONE (aucun), LINEAR (linéaire), POLYNOMIAL (polynomial) ou LOESS.
targetLineValue (valeur de la ligne cible) La ligne cible du graphique. Accepte un type Double.
targetLineLabel (étiquette de la ligne cible) L'étiquette de la ligne cible du graphique.
rangeAxisLabel (Étiquette de l'axe de la plage ) L'étiquette/titre de l'axe vertical (y) du graphique.
domainAxisLabel (étiquette de l'axe du domaine) L'étiquette/titre de l'axe horizontal (x) du graphique.
rangeAxisMaxValue (Plage de l'axe de la valeur maximale) La valeur maximale de l'axe du graphique. Les valeurs en dehors de la plage ne seront pas affichées.
rangeAxisMinValue (Plage de l'axe de la Valeur minimale) La valeur minimale de l'axe du graphique. Les valeurs en dehors de la plage ne seront pas affichées.
rangeAxisSteps (Étapes de l'axe de la plage) Le nombre de pas d'axe entre les valeurs minimale et maximale.
rangeAxisDecimals (Décimales de l'axe de la plage) Le nombre de décimales pour les valeurs des axes.
baseLineValue (Valeur de la ligne de base) Une valeur de référence du graphique.
baseLineLabel (étiquette de la ligne de base) Une étiquette de ligne de base du graphique.
digitGroupSeparator (Séparateur de groupes de chiffres) Séparateur de groupes de chiffres. Valeurs valides : VIRGULE, ESPACE ou AUCUN.
topLimit (Limite maximale) La limite maximale fixée pour le tableau croisé dynamique.
Critères de mesure Décrit les critères appliqués à cette mesure.
percentStackedValues (Pourcentage des valeurs empilées) Utilise ou non des valeurs empilées. Plus susceptible d'être utilisé pour les graphiques. Valeur booléenne.
noSpaceBetweenColumns (Aucun espace entre les colonnes) Afficher/masquer l'espace entre les colonnes. Valeur booléenne.
externalAccess (accès externe) Indique si la visualisation d'événement est disponible en lecture externe uniquement. Valeur booléenne.
userOrganisationUnit (Unité d'organisation de l'utilisateur) Indique si l'utilisateur dispose d'une unité d'organisation. Valeur booléenne.
userOrganisationUnitChildren (Unité d'organisation subordonnées de l'utilisateur ) Indique si l'utilisateur a des unités d'organisation subordonnées. Valeur booléenne.
userOrganisationUnitGrandChildren (Unité d'organisation subordonnées de l'utilisateur ) Indique si l'utilisateur a une unité d'organisation subordonnées. Valeur booléenne.
rowTotals (totaux des lignes) Affiche (ou non) les totaux des lignes. Valeur booléenne.
colTotals (totaux des colonnes) Affiche (ou non) les totaux des colonnes. Valeur booléenne.
rowSubTotals (Sous-totaux des lignes) Affiche (ou non) les sous-totaux des lignes. Valeur booléenne.
colSubTotals (Sous-totaux des colonnes) Affiche (ou non) les sous-totaux des colonnes. Valeur booléenne.
cumulativeValues (Valeurs cumulées) Indique si la visualisation d'événements utilise des valeurs cumulées. Valeur booléenne.
hideEmptyRows (cacher les lignes vides) Indique s'il faut masquer les lignes qui ne contiennent pas de données. Valeur booléenne.
completedOnly (Terminé uniquement) Indicateur utilisé dans les requêtes d'analyse. S'il est vrai, seuls les événements/inscriptions terminés seront considérés. Valeur booléenne.
showDimensionLabels (afficher les étiquettes de dimension) Affiche ou non les étiquettes des dimensions. Valeur booléenne.
hideTitle (masquer le titre) Masque ou non le titre. Valeur booléenne.
hideSubtitle (masquer le sous-titre) Masque ou non les sous-titres. Valeur booléenne.
showHierarchy (afficher la hiérarchie) Affiche (ou non) les noms de la hiérarchie des unités d'organisation. Valeur booléenne.
showData (afficher les données) Utilisé par les graphiques pour masquer ou non les données/valeurs dans le modèle présenté. Valeur booléenne.
lastUpdatedBy (Dernière mise à jour par) L'objet qui représente l'utilisateur qui a appliqué les dernières modifications à la visualisation d'événements.
lastUpdated (dernière mise à jour) Date/heure de la dernière modification de la visualisation d'événements.
favoris Liste des utilisateurs qui ont marqué cet objet comme favori.
abonnés Liste des utilisateurs ayant souscrit à cette visualisation d'événements.
traductions Ensemble des traductions d'objets disponibles, normalement filtrées par le paramètre locale.
program Le programme associé.
programStage L'étape du programme associée.
programStatus Le statut du programme. Il peut être ACTIF, TERMINÉ, ANNULÉ.
eventStatus Le statut de l'événement. Il peut s'agir de ACTIF, TERMINÉ, VISITÉ, PROGRAMMÉ, EN RETARD, SAUTÉ.
dataType (type de données) Le type de données d'événement. Il peut s'agir de VALEURS_AGRÉGÉES ou d'ÉVÉNEMENTS.
columnDimensions (dimensions de la colonne) Les dimensions définies pour les colonnes.
rowDimensions (dimensions de la ligne) Les dimensions définies pour les lignes.
filterDimensions (dimensions du filtre) Les dimensions définies pour les filtres.
outputType (type de sortie) Indique le type de sortie de la visualisation d'événement. Il peut s'agir d'ÉVÉNEMENT, d'ENROLLEMENT ou d'INSTANCE_D'ENTITÉ_SUIVIE.
collapseDataDimensions (Dimensions des données regroupées) Indique si toutes les dimensions des données doivent être regroupées en une seule dimension. Valeur booléenne.
hideNaData (masquer les données Na) Indique s'il faut masquer les données N/A. Valeur booléenne.
hideEmptyColumns (cacher les colonnes vides) Indique s'il faut masquer les colonnes sans données. Valeur booléenne.
fixColumnHeaders (fixer les en-têtes de colonne) Fixes (or not) the pivot table column headers. Boolean value.
fixRowHeaders (En-tête de ligne fixe) Fixes (or not) the pivot table row headers. Boolean value.

Récupération de visualisations d'événements

Pour récupérer une liste de toutes les visualisations d'événements existantes, au format JSON, avec quelques informations de base (y compris l'identifiant, le nom et la pagination), vous pouvez faire une requête GET à l'URL ci-dessous. Vous devriez voir une liste de toutes les visualisations d'événements publiques/partagées ainsi que vos visualisations privées. GET /api/eventVisualizations.json Si vous souhaitez extraire la définition JSON d'une visualisation d'événement spécifique, vous pouvez ajouter son identifiant respectif à l'URL : GET /api/eventVisualizations/hQxZGXqnLS9.json La représentation suivante est un exemple de réponse au format JSON (par souci de concision, certaines informations ont été supprimées). Pour obtenir le schéma complet, veuillez utiliser GET /api/schemas/eventVisualization.

{
    "lastUpdated": "2021-11-25T17:18:03.834",
    "href": "http://localhost:8080/dhis/api/eventVisualizations/EZ5jbRTxRGh",
    "id": "EZ5jbRTxRGh",
    "created": "2021-11-25T17:18:03.834",
    "name": "Inpatient: Mode of discharge by facility type this year",
    "publicAccess": "rw------",
    "userOrganisationUnitChildren": false,
    "type": "STACKED_COLUMN",
    "subscribed": false,
    "userOrganisationUnit": false,
    "rowSubTotals": false,
    "cumulativeValues": false,
    "showDimensionLabels": false,
    "sortOrder": 0,
    "favorite": false,
    "topLimit": 0,
    "collapseDataDimensions": false,
    "userOrganisationUnitGrandChildren": false,
    "displayName": "Inpatient: Mode of discharge by facility type this year",
    "percentStackedValues": false,
    "noSpaceBetweenColumns": false,
    "showHierarchy": false,
    "hideTitle": false,
    "showData": true,
    "hideEmptyRows": false,
    "hideNaData": false,
    "regressionType": "NONE",
    "completedOnly": false,
    "colTotals": false,
    "sharing": {
      "owner": "GOLswS44mh8",
      "external": false,
      "users": {},
      "userGroups": {},
      "public": "rw------"
    },
    "programStatus": "CANCELLED",
    "hideEmptyRowItems": "NONE",
    "hideSubtitle": false,
    "outputType": "EVENT",
    "hideLegend": false,
    "externalAccess": false,
    "colSubTotals": false,
    "rowTotals": false,
    "digitGroupSeparator": "SPACE",
    "program": {
      "id": "IpHINAT79UW"
    },
    "access": {
      "read": true,
      "update": true,
      "externalize": true,
      "delete": true,
      "write": true,
      "manage": true
    },
    "lastUpdatedBy": {
      "displayName": "John Traore",
      "name": "John Traore",
      "id": "xE7jOejl9FI",
      "username": "admin"
    },
    "relativePeriods": {
      "thisYear": false,
      ...
    },
    "programStage": {
      "id": "A03MvHHogjR"
    },
    "createdBy": {
      "displayName": "Tom Wakiki",
      "name": "Tom Wakiki",
      "id": "GOLswS44mh8",
      "username": "system"
    },
    "user": {
      "displayName": "Tom Wakiki",
      "name": "Tom Wakiki",
      "id": "GOLswS44mh8",
      "username": "system"
    },
    "attributeDimensions": [],
    "translations": [],
    "legend": {
      "set": {
        "id": "gFJUXah1uRH"
      },
      "showKey": false,
      "style": "FILL",
      "strategy": "FIXED"
    },
    "filterDimensions": [
      "ou",
      "H6uSAMO5WLD"
    ],
    "interpretations": [],
    "userGroupAccesses": [],
    "subscribers": [],
    "columns": [
      {
        "id": "X8zyunlgUfM"
      }
    ]
    "periods": [],
    "categoryDimensions": [],
    "rowDimensions": [
      "pe"
    ],
    "itemOrganisationUnitGroups": [],
    "programIndicatorDimensions": [],
    "attributeValues": [],
    "columnDimensions": [
      "X8zyunlgUfM"
    ],
    "userAccesses": [],
    "favorites": [],
    "dataDimensionItems": [],
    "categoryOptionGroupSetDimensions": [],
    "organisationUnitGroupSetDimensions": [],
    "organisationUnitLevels": [],
    "organisationUnits": [
      {
        "id": "ImspTQPwCqd"
      }
    ],
    "filters": [
      {
        "id": "ou"
      },
      {
        "id": "H6uSAMO5WLD"
      }
    ],
    "rows": [
      {
        "id": "pe"
      }
    ]
}

Une réponse plus personnalisée peut être obtenue en spécifiant, dans l'URL, les champs que vous souhaitez extraire. Par exemple: GET /api/eventVisualizations/hQxZGXqnLS9.json?fields=interpretations renverra

{
  "interpretations": [
    {
      "id": "Lfr8I2RPU0C"
    },
    {
      "id": "JuwgdJlJPGb"
    },
    {
      "id": "WAoU2rSpyZp"
    }
  ]
}

Comme on peut le voir, le GET ci-dessus ne renverra que les interprétations liées à l'identifiant donné (dans ce cas hQxZGXqnLS9).

Créer, mettre à jour et supprimer des visualisations d'événements

Ces opérations suivent la sémantique REST standard. Une nouvelle visualisation d'événement peut être créée par une requête POST à la ressource /api/eventVisualizations avec une charge JSON valide. Un exemple de charge pourrait être :

{
    "name": "Inpatient: Cases under 10 years last 4 quarters",
    "publicAccess": "rw------",
    "userOrganisationUnitChildren": false,
    "type": "STACKED_COLUMN",
    "subscribed": false,
    "userOrganisationUnit": false,
    "rowSubTotals": false,
    "cumulativeValues": false,
    "showDimensionLabels": false,
    "sortOrder": 0,
    "favorite": false,
    "topLimit": 0,
    "collapseDataDimensions": false,
    "userOrganisationUnitGrandChildren": false,
    "displayName": "Inpatient: Cases under 10 years last 4 quarters",
    "percentStackedValues": false,
    "noSpaceBetweenColumns": false,
    "showHierarchy": false,
    "hideTitle": false,
    "showData": true,
    "hideEmptyRows": false,
    "userAccesses": [],
    "userGroupAccesses": [],
    "hideNaData": false,
    "regressionType": "NONE",
    "completedOnly": false,
    "colTotals": false,
    "programStatus": "CANCELLED",
    "sharing": {
      "owner": "GOLswS44mh8",
      "external": false,
      "users": {},
      "userGroups": {},
      "public": "rw------"
    },
    "displayFormName": "Inpatient: Cases under 10 years last 4 quarters",
    "hideEmptyRowItems": "NONE",
    "hideSubtitle": false,
    "outputType": "EVENT",
    "hideLegend": false,
    "externalAccess": false,
    "colSubTotals": false,
    "rowTotals": false,
    "digitGroupSeparator": "SPACE",
    "access": {
      "read": true,
      "update": true,
      "externalize": false,
      "delete": true,
      "write": true,
      "manage": true
    },
    "lastUpdatedBy": {
      "displayName": "Tom Wakiki",
      "name": "Tom Wakiki",
      "id": "GOLswS44mh8",
      "username": "system"
    },
    "legend": {
      "set": {
        "id": "gFJUXah1uRH"
      },
      "showKey": false,
      "style": "FILL",
      "strategy": "FIXED"
    },
    "relativePeriods": {
      "thisYear": false,
    ...
    },
    "program": {
      "id": "IpHINAT79UW",
      "enrollmentDateLabel": "Date of enrollment",
      "incidentDateLabel": "Date of birth",
      "name": "Child Programme"
    },
    "programStage": {
      "id": "A03MvHHogjR",
      "executionDateLabel": "Report date",
      "name": "Birth"
    },
    "createdBy": {
      "displayName": "Tom Wakiki",
      "name": "Tom Wakiki",
      "id": "GOLswS44mh8",
      "username": "system"
    },
    "user": {
      "displayName": "Tom Wakiki",
      "name": "Tom Wakiki",
      "id": "GOLswS44mh8",
      "username": "system"
    },
    "translations": [],
    "filterDimensions": [
      "ou"
    ],
    "interpretations": [],
    "dataElementDimensions": [
      {
        "filter": "LE:10",
        "dataElement": {
          "id": "qrur9Dvnyt5"
        }
      }
    ],
    "periods": [],
    "categoryDimensions": [],
    "rowDimensions": [
      "pe"
    ],
    "columnDimensions": [
      "qrur9Dvnyt5"
    ],
    "organisationUnits": [
      {
        "id": "ImspTQPwCqd"
      }
    ],
    "filters": [
      {
        "dimension": "ou",
        "items": [
          {
            "id": "ImspTQPwCqd"
          }
        ]
      },
      {
        "dimension": "H6uSAMO5WLD",
        "items": []
      }
    ],
    "columns": [
      {
        "dimension": "X8zyunlgUfM",
        "items": [],
        "repetition": {
          "indexes": [1, 2, 3, -2, -1, 0]
        }
      },
      {
        "dimension": "eventDate",
        "items": [
          {
            "id": "2021-07-21_2021-08-01"
          },
          {
            "id": "2021-01-21_2021-02-01"
          }
        ]
      },
      {
        "dimension": "incidentDate",
        "items": [
          {
            "id": "2021-10-01_2021-10-30"
          }
        ]
      },
      {
        "dimension": "eventStatus",
        "items": [
          {
            "id": "ACTIVE"
          },
          {
            "id": "COMPLETED"
          }
        ]
      },
      {
        "dimension": "createdBy",
        "items": [
          {
            "id": "userA"
          }
        ]
      },
      {
        "dimension": "lastUpdatedBy",
        "items": [
          {
            "id": "userB"
          }
        ]
      }
    ],
    "rows": [
      {
        "dimension": "pe",
        "items": [
          {
            "id": "LAST_12_MONTHS"
          }
        ]
      }
    ]
}

Pour le maintien du multi-programme, la racine programme ne doit pas être spécifiée. Cela transformera la visualisation d'événement en un multi-programme. Par conséquent, nous devons spécifier le programme et l' étape du programme (le cas échéant) pour chaque dimension dans les lignes, les colonnes et les filtres.

Exemple:

"program": null,
"columns": [
  {
    "dimension": "ou",
    "items": [
        {
            "id": "O6uvpzGd5pu"
        }
    ],
    "program": {
        "id": "IpHINAT79UW"
    }
  },
  {
    "dimensionType": "CATEGORY_OPTION_GROUP_SET",
    "items": [
      {
          "id": "JLGV7lRQRAg"
      },
      {
          "id": "p916ZCVGNyq"
      }
    ],
    "dimension": "C31vHZqu0qU",
    "program": {
        "id": "kla3mAPgvCH"
    },
    "programStage": {
        "id": "aNLq9ZYoy9W"
    }
  }
]

Remarque

L'attribut répétition (dans lignes, colonnes ou filtres) indique les index d'événements à récupérer. En reprenant l'exemple ci-dessus (dans la charge json précédente), on peut le lire comme suit:

1 = Premier événement
2 = Deuxième événement
3 = Troisième événement
...
-2 = Troisième événement le plus récent
-1 = Deuxième événement le plus récent
0 = Dernier événement (par défaut)

Pour mettre à jour une visualisation d'événement spécifique, vous pouvez envoyer une requête PUT à la même ressource /api/eventVisualizations avec une charge similaire PLUS l'identifiant de la visualisation d'événement respective, par exemple : PUT /api/eventVisualizations/hQxZGXqnLS9 Enfin, pour supprimer une visualisation d'événement existante, vous pouvez effectuer une requête DELETE en spécifiant l'identifiant de la visualisation d'événement à supprimer, comme indiqué ci-dessous : DELETE /api/eventVisualizations/hQxZGXqnLS9

Interprétations

Pour les ressources liées à l'analyse des données dans DHIS2, telles que les visualisations, les cartes, les rapports d'événements, les graphiques d'événements et même les visualisations, vous pouvez écrire et partager des interprétations de données. Une interprétation peut être un commentaire, une question, une observation ou une interprétation concernant un rapport de données ou une visualisation.

/api/interpretations

Lire les interprétations

Pour lire les interprétations, nous allons interagir avec la ressource /api/interpretations. Une requête GET typique utilisant le filtrage des champs peut ressembler à ceci :

GET /api/interpretations?fields=*,comments[id,text,user,mentions]

La réponse au format JSON pourrait ressembler à ce qui suit (les champs supplémentaires ont été omis par souci de concision) :

{
  "interpretations": [
    {
      "id": "XSHiFlHAhhh",
      "created": "2013-05-30T10:24:06.181+0000",
      "text": "Data looks suspicious, could be a data entry mistake.",
      "type": "MAP",
      "likes": 2,
      "user": {
        "id": "uk7diLujYif"
      },
      "reportTable": {
        "id": "LcSxnfeBxyi"
      },
      "visualization": {
        "id": "LcSxnfeBxyi"
      }
    }, {
      "id": "kr4AnZmYL43",
      "created": "2013-05-29T14:47:13.081+0000",
      "text": "Delivery rates in Bo looks high.",
      "type": "VISUALIZATION",
      "likes": 3,
      "user": {
        "id": "uk7diLujYif"
      },
      "visualization": {
        "id": "HDEDqV3yv3H"
      },
      "mentions": [
        {
          "created": "2018-06-25T10:25:54.498",
          "username": "boateng"
        }
      ],
      "comments": [
        {
          "id": "iB4Etq8yTE6",
          "text": "This report indicates a surge.",
          "user": {
            "id": "B4XIfwOcGyI"
          }
        },
        {
          "id": "iB4Etq8yTE6",
          "text": "Likely caused by heavy rainfall.",
          "user": {
            "id": "B4XIfwOcGyI"
          }
        },
        {
          "id": "SIjkdENan8p",
          "text": "Have a look at this @boateng.",
          "user": {
            "id": "xE7jOejl9FI"
          },
          "mentions": [
            {
              "created": "2018-06-25T10:03:52.316",
              "username": "boateng"
            }
          ]
        }
      ]
    }
  ]
}

Tableau : Champs d'interprétation

Champ Description
id L'identifiant de l'interprétation.
created L'heure de création de l'interprétation.
type Le type d'objet analytique interprété. Options valides : VISUALISATION, CARTE, RAPPORT_D'ÉVÉNEMENT, GRAPHIQUE_D'ÉVÉNEMENT, VISUALISATION_D'ÉVÉNEMENT, RAPPORT_D'ENSEMBLE DE DONNÉES.
user Associer à l'utilisateur qui a créé l'interprétation.
visualisation Associer à la visualisation si le type est VISUALISATION
visualisation d'événements Associer à la visualisation d'événements si le type est VISUALISATION_D'ÉVÉNEMENT
carte Associer à la carte si le type est CARTE.
eventReport (rapport d'événement) Associer au rapport d'événement le type RAPPORT_D'ÉVÉNEMENT.
eventChart (graphique d'événements) Associer au graphique de l'événement si le type est GRAPHIQUE_D'ÉVÉNEMENT.
dataSet (ensemble de données) Associer à l'ensemble de données si le type est RAPPORT_D'ENSEMBLE DE DONNÉES.
commentaires Tableau de commentaires pour l'interprétation. Le champ texte contient le commentaire proprement dit.
mentions Tableau des mentions pour l'interprétation. Une liste d'identifiants d'utilisateurs.

Pour tous les objets analytiques, vous pouvez ajouter / données à l'URL pour récupérer les données associées à la ressource (par opposition aux métadonnées). Par exemple, en suivant le lien de la carte et en ajoutant / données, on peut récupérer une représentation PNG (image) de la carte thématique par l'intermédiaire de l'URL suivante :

https://play.dhis2.org/demo/api/maps/bhmHJ4ZCdCd/data

Pour tous les objets analytiques, vous pouvez filtrer par mentions. Pour récupérer toutes les interprétations/commentaires où un utilisateur a été mentionné, vous avez trois options. Vous pouvez filtrer par les mentions d'interprétation (mentions dans la description de l'interprétation) :

GET /api/interpretations?fields=*,comments[*]&filter=mentions.username:in:[boateng]

Vous pouvez filtrer les commentaires d'interprétation en fonction des mentions (mentions dans n'importe quel commentaire) :

GET /api/interpretations?fields=*,comments[*]
  &filter=comments.mentions.username:in:[boateng]

Vous pouvez filtrer les interprétations qui contiennent les mentions soit dans l'interprétation ou dans un commentaire ( OU jonction) :

GET /api/interpretations?fields=*,comments[*]&filter=mentions:in:[boateng]

Écrire les interprétations

Lorsque vous écrivez des interprétations, vous fournissez le texte de l'interprétation dans le corps de la requête en utilisant une requête POST avec un contenu de type « text/plain ». Le modèle d'URL ressemble à ce qui suit, où {object-type} fait référence au type de l'objet interprété et {object-id} fait référence à l'identifiant de l'objet interprété.

/api/interpretations/{object-type}/{object-id}

Les options valides pour le type d'objet sont visualisation, carte, rapport d'événement, graphique d'événement, visualisation d'événement et rapport d'ensemble de données.

Quelques exemples pertinents d'interprétations sont énumérés ci-dessous.

Remarque

Les API eventCharts (graphiques d'événements) et eventReports (rapports d'événements) sont obsolètes. Nous recommandons d'utiliser l'API eventVisualizations (visualisations d'événements) à la place.

/api/interpretations/visualization/hQxZGXqnLS9
/api/interpretations/map/FwLHSMCejFu
/api/interpretations/eventReport/xJmPLGP3Cde
/api/interpretations/eventChart/nEzXB2M9YBz
/api/interpretations/eventVisualization/nEzXB2M9YBz
/api/interpretations/dataSetReport/tL7eCjmDIgM

A titre d'exemple, nous commencerons par écrire une interprétation pour la visualisation avec l'identifiant EbRN2VIbPdV. Pour écrire des interprétations de visualisation, nous allons interagir avec la ressource /api/interpretations/visualization/{visualizationId}. L'interprétation sera le corps de la requête. Sur cette base, nous pouvons formuler la requête suivante en utilisant cURL :

curl -d "Cette visualisation montre un abandon important de la CPN 1-3" -X POST
  "https://play.dhis2.org/demo/api/interpretations/visualization/EbRN2VIbPdV" -H "Content-Type:text/plain" -u admin:district

Notez que la réponse fournit un en-tête de Localisation avec une valeur indiquant l'emplacement de l'interprétation créée. Ceci est utile du point de vue du client lorsque vous souhaitez ajouter un commentaire à interprétation.

Mise à jour et suppression d'interprétations

Pour mettre à jour une interprétation existante, vous pouvez utiliser une requête PUT dont le texte de l'interprétation est le corps de la requête, qui utilise le modèle d'URL suivant, dans lequel {id} fait référence à l'identifiant de l'interprétation :

/api/interpretations/{id}

Sur cette base, nous pouvons utiliser curl pour mettre à jour l'interprétation :

curl -d "Cette visualisation montre un taux d'abandon élevé" -X PUT
  "https://play.dhis2.org/demo/api/interpretations/visualization/EV08iI1cJRA" -H "Content-Type:text/plain" -u admin:district

Vous pouvez utiliser le même modèle d'URL que ci-dessus en utilisant une requête DELETE pour supprimer l'interprétation.

Création des commentaires d'interprétation

Lorsque vous écrivez des commentaires sur les interprétations, vous fournissez le texte du commentaire dans le corps de la requête en utilisant une requête POST avec le type de contenu « text/plain ». Le modèle d'URL ressemble à ce qui suit, où {interpretation-id} fait référence à l'identifiant de l'interprétation.

/api/interpretations/{interpretation-id}/comments

Deuxièmement, nous allons rédiger un commentaire à l'interprétation que nous avons écrite dans l'exemple ci-dessus. En regardant la réponse de l'interprétation, vous verrez qu'un en-tête Localisation est renvoyé. Cet en-tête nous indique l'URL de l'interprétation nouvellement créée et, à partir de là, nous pouvons lire son identifiant. Cet identifiant est généré de manière aléatoire, vous devrez donc remplacer celui de la commande ci-dessous par le vôtre. Pour écrire un commentaire, nous pouvons interagir avec la ressource /api/interpretations/{id}/comments comme ceci :

curl -d "Une intervention est nécessaire" -X POST
  "https://play.dhis2.org/demo/api/interpretations/j8sjHLkK8uY/comments"
  -H "Content-Type:text/plain" -u admin:district

Mise à jour et suppression des commentaires d'interprétation

Pour mettre à jour un commentaire d'interprétation, vous pouvez utiliser une requête PUT où le texte du commentaire est le corps de la requête en utilisant le modèle d'URL suivant :

/api/interpretations/{interpretation-id}/comments/{comment-id}

Sur cette base, nous pouvons utiliser curl pour mettre à jour le commentaire :

curl "https://play.dhis2.org/demo/api/interpretations/j8sjHLkK8uY/comments/idAzzhVWvh2"
  -d "Je suis d'accord." -X PUT -H "Content-Type:text/plain" -u admin:district

Vous pouvez utiliser le même modèle d'URL que ci-dessus en utilisant une requête DELETE pour supprimer le commentaire d'interprétation.

Comment aimer les interprétations

Pour aimer une interprétation, vous pouvez utiliser une requête POST vide vers la ressource like :

POST /api/interpretations/{id}/like

Un like sera ajouté pour l'utilisateur actuellement authentifié. Un utilisateur ne peut aimer une interprétation qu'une seule fois.

Pour supprimer un « like » pour une interprétation, vous pouvez utiliser une requête DELETE à la même ressource que pour l'opération « like ».

Le statut d'une interprétation peut être visualisé en regardant la représentation ordinaire de l'API Web :

GET /api/interpretations/{id}

Les informations relatives aux appréciations se trouvent dans le champ likes (aimé), qui représente le nombre d'appréciations, et dans le tableau likedBy (aimé par), qui énumère les utilisateurs qui ont aimé l'interprétation.

{
  "id": "XSHiFlHAhhh",
  "text": "Data looks suspicious, could be a data entry mistake.",
  "type": "VISUALIZATION",
  "likes": 2,
  "likedBy": [
    {
      "id": "k7Hg12fJ2f1"
    },
    {
      "id": "gYhf26fFkjFS"
    }
  ]
}

Les vues SQL

La ressource des vues SQL vous permet de créer et d'extraire l'ensemble des résultats de vues SQL. Les vues SQL peuvent être exécutées directement dans la base de données et restituer l'ensemble des résultats par l'intermédiaire de la ressource Web API.

/api/sqlViews

Les vues SQL sont utiles dans la création de vues de données qui peuvent être plus facilement construites avec SQL qu'en combinant les multiples objets de l'API Web. Par exemple, supposons qu'il nous a été demandé de fournir une vue de toutes les unités d'organisation avec leur noms, les noms des parents, le niveau et le nom de l'unité d'organisation, ainsi que les coordonnées répertoriées dans la base de données. La vue pourrait ressembler à ceci :

select ou.name as orgunit, par.name as parent, ou.coordinates, ous.level, oul.name 
from organisationunit ou
inner join _orgunitstructure ous on ou.organisationunitid = ous.organisationunitid
inner join organisationunit par on ou.parentid = par.organisationunitid
inner join orgunitlevel oul on ous.level = oul.level
where ou.coordinates is not null
order by oul.level, par.name, ou.name;

Nous allons utiliser curl pour exécuter d'abord la vue sur le serveur de DHIS2. Il s'agit essentiellement d'un processus de matérialisation, qui garantit que les données les plus récentes sont disponibles dans la vue SQL lorsqu'elles sont récupérées sur le serveur. Vous pouvez d'abord rechercher la vue SQL dans la ressource api/sqlViews, puis faire un POST à l'aide de la commande suivante :

curl "https://play.dhis2.org/demo/api/sqlViews/dI68mLkP1wN/execute" -X POST -u admin:district

L'étape suivante du processus est la récupération des données. Le endpoint est disponible à l'adresse suivante:

/api/sqlViews/{id}/data(.csv)

Le chemin id représente l'identifiant de la vue SQL. L'extension du chemin fait référence au format de téléchargement des données. Ajoutez soit data pour les données JSON, soit data.csv pour les valeurs séparées par des virgules. Les formats de réponse supportés sont json, xml, csv, xls, html et html+css.

Par exemple, la commande suivante permet de récupérer des données CSV pour la vue SQL définie ci-dessus.

curl "https://play.dhis2.org/demo/api/sqlViews/dI68mLkP1wN/data.csv" -u admin:district

Il existe trois types de vues SQL :

  • Vues SQL: Vues SQL standard.

  • Vue SQL matérialisée: Les vues SQL matérialisées, c'est-à-dire écrites sur le disque, doivent être mises à jour pour refléter les modifications apportées aux tables sous-jacentes. Elles prennent en charge les critères permettant de filtrer l'ensemble des résultats.

  • Requêtes SQL: Les requêtes SQL simples. Elles prennent en charge les variables en ligne pour les requêtes personnalisées.

Critère

Vous pouvez effectuer un filtrage simple sur les colonnes de l'ensemble de résultats en ajoutant des paramètres de requête critère à l'URL, en utilisant les noms de colonnes et les valeurs de filtrage séparées par les colonnes en tant que valeurs de paramètre, au format suivant :

/api/sqlViews/{id}/data?criteria=col1:value1&criteria=col2:value2

Par exemple, pour filtrer les résultats de la vue SQL ci-dessus afin de ne renvoyer que les unités d'organisation de niveau 4, vous pouvez utiliser l'URL suivante :

https://play.dhis2.org/demo/api/sqlViews/dI68mLkP1wN/data.csv?criteria=level:4

Variables

Les vues SQL prennent en charge la substitution de variables. La substitution de variables n'est disponible que pour les vues SQL de type requête, c'est-à-dire les vues SQL qui ne sont pas créées dans la base de données mais simplement exécutées comme des requêtes SQL normales. Les variables peuvent être insérées directement dans la requête SQL et doivent être dans ce format :

${variable-key}

Par exemple, une requête SQL qui récupère tous les éléments de données d'un type de valeur donné, où le type de valeur est défini par une variable, peut ressembler à ceci :

select * from dataelement where valuetype = '${valueType}';

Ces variables peuvent ensuite être fournies dans l'URL lorsqu'elles sont demandées par l'intermédiaire de la ressource API Web sqlViews. Les variables peuvent être fournies dans le format suivant :

/api/sqlViews/{id}/data?var=key1:value1&var=key2:value2

Un exemple de requête correspondant à l'exemple ci-dessus peut se présenter comme suit :

/api/sqlViews/dI68mLkP1wN/data.json?var=valueType:int

La variable valueType sera remplacée par la valeur int et la requête renverra des éléments de données de type int.

Le paramètre variable ne doit contenir que des caractères alphanumériques. Les variables doivent contenir uniquement des caractères alphanumériques, des tirets, des traits de soulignement et des espaces.

Les vues SQL de type query prennent également en charge deux variables définies par le système qui permettent à la requête d'accéder à des informations sur l'utilisateur qui exécute la vue :

variable signifie
${_current_user_id} l'identifiant de l'utilisateur dans la base de données
${_current_username} le nom d'utilisateur de l'utilisateur

Les valeurs de ces variables ne peuvent pas être fournies dans le cadre de l'URL. Elles sont toujours remplies d'informations sur l'utilisateur.

Par exemple, la vue SQL suivante de type requête affiche toutes les unités d'organisation affectées à l'utilisateur :

select ou.path, ou.name
from organisationunit ou_user
join organisationunit ou on ou.path like ou_user.path || '%'
join usermembership um on um.organisationunitid = ou_user.organisationunitid
where um.userinfoid = ${_current_user_id}
order by ou.path;

Filtrage

L'API de vue SQL prend en charge le filtrage des données, au même titre que filtre_d'objet de métadonnées. Pour une liste complète des opérateurs de filtrage, vous pouvez consulter la documentation de filtre_d'objet de métadonnées.

Pour utiliser les filtres, il suffit de les ajouter en tant que paramètres à la fin de l'URL de demande de votre vue SQL, comme ceci. Cette requête renverra un résultat comprenant les unités d'organisation dont le nom contient « bo » au niveau 2 de la hiérarchie des unités d'organisation :

/api/sqlViews/w3UxFykyHFy/data.json?filter=orgunit_level:eq:2&filter=orgunit_name:ilike:bo

L'exemple suivant renverra toutes les unités d'org avec niveau_de l'unité d'organisation 2 ou 4 :

/api/sqlViews/w3UxFykyHFy/data.json?filter=orgunit_level:in:[2,4]

Et enfin, un exemple pour retourner toutes les unités d'organisation qui ne commencent pas par "Bo" :

/api/sqlViews/w3UxFykyHFy/data.json?filter=orgunit_name:!like:Bo

Éléments de données

This endpoint allows the user to query data related to a few different dimensional items. These items are: INDICATOR, DATA_ELEMENT, DATA_SET, PROGRAM_INDICATOR, PROGRAM_DATA_ELEMENT, PROGRAM_ATTRIBUTE, OPTION_SET. The endpoint supports only GET requests and, as other endpoints, can return responses in JSON or XML format.

L'URL est /api/dataItems et comme vous pouvez l'imaginer, il est possible de récupérer différents objets à travers le même endpoint dans la même requête GET. Pour cette raison, certains attributs disponibles pour les requêtes seront différents en fonction du ou des éléments dimensionnels interrogés.

Pour comprendre la déclaration ci-dessus, examinons les exemples de requête suivants :

1) GET /api/dataItems?filter=dimensionItemType:eq:DATA_ELEMENT&filter=valueType:eq:TEXT Dans cet exemple, le type d'élément ELEMENT_DE DONNÉES possède un attribut Type de valeur qui peut être utilisé dans la requête.

2) GET /api/dataItems?pageSize=50&order=displayName:asc&filter=dimensionItemType:eq:PROGRAM_INDICATOR&filter=displayName:ilike:someName&filter=programId:eq:WSGAb5XwJ3Y

Ici, le L'INDICATEUR DE_PROGRAMME permet de filtrer par identifiant de programme.

Ainsi, en se basant sur les exemples 1) et 2), si vous essayez de filtrer un ELEMENT DE_DONNEES par identifiant de programme ou de filtrer un INDICATEUR_DE PROGRAMME par type de valeur, vous n'obtiendrez aucun résultat. En d'autres termes, le filtre ne sera appliqué que si l'attribut existe réellement pour l'élément de données concerné.

Un autre aspect important à souligner est que ce endpoint ne suit PAS les mêmes normes de requête que d'autres endpoints existants, comme Filtre d'objet de métadonnées par exemple. En conséquence, il supporte un ensemble plus restreint de fonctionnalités et de requêtes. La raison principale en est la nécessité d'interroger plusieurs éléments différents ayant des relations différentes, ce qui n'est pas possible en utilisant les composants de filtrage existants (utilisés par les autres endpoints).

Réponses des endpoints

En fonction de la requête GET, les codes d'état et les réponses suivants peuvent être renvoyés.

Results found (status code 200)

{
  "pager": {
    "page": 1,
    "pageCount": 27,
    "total": 1339,
    "pageSize": 50
  },
  "dataItems": [
    {
      "simplifiedValueType": "TEXT",
      "displayName": "TB program Gender",
      "displayShortName": "TB prog. Gen.",
      "valueType": "TEXT",
      "name": "TB program Gender",
      "shortName": "TB prog Gen",
      "id": "ur1Edk5Oe2n.cejWyOfXge6",
      "programId": "ur1Edk5Oe2n",
      "dimensionItemType": "PROGRAM_ATTRIBUTE"
    }
  ]
}

Results not found (status code 200)

{
  "pager": {
    "page": 1,
    "pageCount": 1,
    "total": 0,
    "pageSize": 50
  },
  "dataItems": [
  ]
}

Invalid query (status code 409)

{
  "httpStatus": "Conflict",
  "httpStatusCode": 409,
  "status": "ERROR",
  "message": "Unable to parse element `INVALID_TYPE` on filter dimensionItemType`. The values available are: [INDICATOR, DATA_ELEMENT, DATA_ELEMENT_OPERAND, DATA_SET, PROGRAM_INDICATOR, PROGRAM_DATA_ELEMENT, PROGRAM_ATTRIBUTE]",
  "errorCode": "E2016"
}

Pagination

Ce endpoint supporte également la pagination en tant qu'option par défaut. Si nécessaire, vous pouvez désactiver la pagination en ajoutant paging=false à la requête GET, c'est-à-dire : /api/dataItems?filter=dimensionItemType:in :[INDICATOR]&paging=false.

Voici un exemple de charge lorsque la pagination est activée. N'oubliez pas que la pagination est l'option par défaut et qu'il n'est pas nécessaire de la définir explicitement.

{
  "pager": {
    "page": 1,
    "pageCount": 20,
    "total": 969,
    "pageSize": 50
  },
  "dataItems": [...]
}

Remarque

Pour les éléments auxquels un programme est associé, le nom du programme doit également être renvoyé en tant que partie du nom de l'élément (en tant que préfixe). La seule exception concerne les Indicateurs de programme. Nous ne préfixerons pas le nom de l'élément dans ce cas, afin de conserver le même comportement que les endpoints existants.

Le endpoint /dataItems n'apportera que des éléments de données qui sont définis comme étant de type agrégable. La liste actuelle des types agrégeables valides est la suivante : TEXTE, TEXTE_LONG, LETTRE, BOLÉEN, VRAI_UNIQUEMENT, NOMBRE, INTERVALLE_UNITAIRE, POURCENTAGE, ENTIER, ENTIER_POSITIF, ENTIER_NÉGATIF, ENTIER_ZÉRO_OU_POSITIF, COORDONNÉE.

Même si la réponse renvoie plusieurs attributs différents, le filtrage ne peut être appliqué qu'à certains d'entre eux : afficher le nom, le nom, le type de valeur, l'id, le type d'élément de dimension, l'id de programme.

L' ordre sera considéré comme invalide s'il est placé au-dessus de nom (ie. : ordre=nom:asc) et qu'un filtre est placé sur afficher le nom (ie. : filter=afficher le nom:ilike:aNom), et vice-versa.

Attributs de la réponse

Maintenant que nous avons une bonne idée des principales caractéristiques et de l'utilisation de ce endpoint , examinons la liste des attributs renvoyés dans la réponse.

Tableau : Attributs des éléments de données

Champ Description
id L'identifiant unique.
code Un code personnalisé pour identifier l'élément dimensionnel.
name Le nom donné à l'élément.
Nom d'affichage Le nom d'affichage défini.
Nom court Le nom court donné à l'élément.
displayShortName (afficher le Nom Court) Le nom court d'affichage défini.
dimensionItemType (type de dimension de l'élément) Type de dimension. Les types possibles sont les suivants : INDICATEUR, ÉLÉMENT DE_DONNÉES, TAUX DE_DÉCLARATION, INDICATEUR DE_PROGRAMME, ÉLÉMENT DE_DONNÉES_DU PROGRAMME, ATTRIBUT DE_PROGRAMME.
Type de valeur Le type de valeur de l'élément (définition plus précise). Types possibles : TEXTE, TEXTE_LONG, LETTRE, BOOLÉEN, VRAI_UNIQUEMENT, UNITÉ_INTERVALLE, POURCENTAGE, ENTIER, ENTIER_POSITIF, ENTIER_NÉGATIF, ENTIER_ZÉRO_OU_POSITIF, COORDONNÉES.
simplifiedValueType (type de valeur simplifiée) Représentation générique d'un type de valeur. Valeurs valides : NOMBRE, BOOLÉEN, DATE, RESSOURCE DE_FICHIER, COORDONNÉES, TEXTE
programId (Id du programme) L'identifiant de programme associé.

Visualisation des représentations des ressources analytiques

DHIS2 dispose de plusieurs ressources pour l'analyse des données. Ces ressources comprennent les cartes, les visualisations, les visualisations d'événements, les rapports et les documents. En visitant ces ressources, vous obtiendrez des informations à leur sujet. Par exemple, en naviguant vers /api/visualisations/R0DVGvXDUNP, la réponse contiendra le nom, la dernière date de modification et ainsi de suite pour le graphique. Pour récupérer la représentation analytique, par exemple une représentation PNG de la visualisation, vous pouvez ajouter / données à toutes ces ressources. Par exemple, en visitant /api/visualisations/R0DVGvXDUNP/data, le système renverra une image PNG de la visualisation.

Tableau : Ressources analytiques

Ressource Description URL des données Représentations des ressources
graphiques d'événements Graphiques d'évènements /api/eventCharts/<identifier>/data png
cartes Cartes /api/maps/<identifier>/data png
visualisations Tableaux croisés dynamiques et graphiques /api/visualizations/<identifier>/data json | jsonp | html | xml | pdf | xls | csv
visualisations d'événements Graphiques d'évènements /api/eventVisualizations/<identifier>/data png
png
rapports **SIG:**Le SIG intégré à DHIS 2 permet de présenter et d'analyser vos
données à l'aide de cartes géographiques à thèmes. Vous pouvez y
visualiser aussi bien les éléments de données que les indicateurs ; et
en supposant que vous disposiez des coordonnées de toutes vos unités
d’organisation, vous pouvez parcourir votre hiérarchie
organisationnelle et faire apparaitre des cartes pour tous les niveaux à
l’aide de polygones ou de points. Toutes les informations affichées sur
les cartes sont générées par DHIS 2 ; tout ce que vous devez faire est
de procéder à l’enregistrement des coordonnées de vos unités
d'organisation pour que les cartes deviennent disponibles. Voir le
chapitre spécifique qui traite du SIG pour obtenir plus de détails. /api/reports/<identifier>/data pdf | xls | html
documents Ressources /api/documents/<identifier>/data <follows document>

Le contenu des données des représentations analytiques peut être modifié en fournissant un paramètre de requête date. Pour cela, il faut que la ressource analytique soit configurée en périodes relatives pour la dimension période.

Tableau : Paramètres de requête de données

Paramètre de requête Valeur Description
date Les dates doivent être au format aaaa-MM-jj Base pour les périodes relatives dans le rapport (exige des périodes relatives)

Tableau : Paramètres de requête pour les pngs / types d'images (visualisations, cartes)

Paramètre de requête Description
largeur Largeur de l'image en pixels
taille Taille de l'image en pixels

Quelques exemples d'URL valides pour la récupération de diverses représentations analytiques sont énumérés ci-dessous.

/api/visualizations/R0DVGvXDUNP/data
/api/visualizations/R0DVGvXDUNP/data?date=2013-06-01

/api/visualizations/jIISuEWxmoI/data.html
/api/visualizations/jIISuEWxmoI/data.html?date=2013-01-01
/api/visualizations/FPmvWs7bn2P/data.xls
/api/visualizations/FPmvWs7bn2P/data.pdf

/api/eventVisualizations/x5FVFVt5CDI/data
/api/eventVisualizations/x5FVFVt5CDI/data.png

/api/maps/DHE98Gsynpr/data
/api/maps/DHE98Gsynpr/data?date=2013-07-01

/api/reports/OeJsA6K1Otx/data.pdf
/api/reports/OeJsA6K1Otx/data.pdf?date=2014-01-01

Analyses

Analyse

Pour accéder aux données analytiques et agrégées dans DHIS2, vous pouvez utiliser la ressource analyse. L'importance de la ressource "analyse" réside dans le fait qu'elle vous permet d'interroger et d'extraire des données agrégées pour toutes les dimensions de données disponibles. Par exemple, vous pouvez demander à la ressource "analyse" de vous fournir des valeurs agrégées pour un ensemble d'éléments de données, de périodes et d'unités d'organisation. Vous pouvez également récupérer les données agrégées d'une combinaison de dimensions en vous basant sur des éléments de données et des groupes d'unités d'organisation.

/api/analytics

Paramètres de requête

La ressource "analyse" vous permet de définir un ensemble de paramètres de requête :

Tableau : Paramètres de requête

Paramètre de requête Obligatoire Description Options (par défaut en premier)
dimension Oui Dimensions et éléments de dimension à extraire. Ils sont répétés pour chaque paramètre. N'importe quelle dimension
filter Non Filtres et éléments de filtre à appliquer à la requête. Ils sont répétés pour chaque paramètre. N'importe quelle dimension
Type d'agrégation Non Type d'agrégation à utiliser dans le processus d'agrégation. SUM | AVERAGE | AVERAGE_SUM_ORG_UNIT | LAST | LAST_AVERAGE_ORG_UNIT | COUNT | STDDEV | VARIANCE | MIN | MAX
Critères de mesure Non Filtres pour les données/mesures. EQ | GT | GE | LT | LE
preAggregationMeasureCriteria Non Filtres pour les données/mesures, appliqués avant l'agrégation. EQ | GT | GE | LT | LE
startDate Non Date de début d’une plage de dates. Elle sera appliquée comme filtre, mais ne peut pas être utilisée avec une dimension ou un filtre de période. Date
endDate Non Date de fin d’une plage de dates. Elle sera appliquée comme filtre, mais ne peut pas être utilisée avec une dimension ou un filtre de période. Date
skipMeta Non Exclut la partie métadonnées de la réponse (améliore les performances) false
skipData (ignorer les données) Non Excluez la partie données de la réponse. false
skipRounding (ignorer l'arrondissement des valeurs) Non Évite l'arrondissement des valeurs de données, c'est-à-dire que les valeurs fournies sont très précise. false
hierarchyMeta (métadonnées de la hiérarchie) Non Inclut les noms des unités d'organisation racines et le parcours hiérarchique des unités d'organisation dans les métadonnées. false
ignoreLimit (Ignorer la limite) Non Ignore limit on max 50 000 records in response, use with care. false
tableLayout (présentation du tableau) Non Utilise une source de données simples ou une présentation de tableau pour générer la réponse. false
hideEmptyRows (cacher les lignes vides) Non Masque les lignes vides dans la réponse ; applicable lorsque la présentation du tableau est définie sur "vrai". false
hideEmptyColumns (cacher les colonnes vides) Non Masque les colonnes vides dans la réponse ; applicable lorsque la présentation du tableau est définie sur "vrai". false
showHierarchy (afficher la hiérarchie) Non Affiche le parcours hiérarchique complet de l'unité d'organisation ainsi que le nom de l'unité d'organisation. false
includeNumDen (inclure le numérateur et le dénominateur) Non Inclut dans la réponse, le numérateur et le dénominateur utilisés pour calculer la valeur. false
includeMetadataDetails (inclure les détails des métadonnées) Non Inclut les détails des métadonnées dans la réponse générée pour les données brutes. false
displayProperty (afficher la propriété) Non Affiche la propriété des métadonnées. NAME | SHORTNAME
outputIdScheme (schéma d'identification de la sortie) Non Schéma d'identification utilisé pour les éléments de métadonnées dans la réponse à la requête. Il accepte des identifiants, des codes ou des attributs. UID | UUID | CODE | NAME | ATTRIBUTE:<ID>
outputOrgUnitIdScheme (schéma d'identification de l'unité d'organisation de sortie) Non Identifier scheme used for metadata items in the query response. Overrides "outputIdScheme" specifically for for Org Units. It accepts identifier, code or attributes. UUID | CODE | NAME | ATTRIBUTE:<ID>
outputDataElementIdScheme (schéma d'identification de l'élément de données de sortie) Non Identifier scheme used for metadata items in the query response. Overrides "outputIdScheme" specifically for Data Elements. It accepts identifier, code or attributes. UUID | CODE | NAME | ATTRIBUTE:<ID>
inputIdScheme Non Schéma d'identification à utiliser pour les éléments de métadonnées dans la requête. Il peut être un identifiant, un code ou constitué d'attributs. UID | CODE | ATTRIBUTE:<ID>
approvalLevel (niveau d'approbation) Non Inclut les données qui ont été approuvées au moins jusqu'au niveau d'approbation spécifié. Il fait référence à l'identifiant du niveau d'approbation. Identifiant du niveau d'approbation
relativePeriodDate (Date de la période relative) Non Date utilisée comme base pour les périodes relatives. Date
userOrgUnit (unité d'organisation d'utilisateur) Non Définit explicitement les unités d'organisation d'utilisateur à utiliser. Elle remplace les unités d'organisation associées à l'utilisateur actuel. Plusieurs identifiants peuvent être séparés par un point-virgule. Organisation unit identifiers
colonnes Non Dimensions to use as columns for table layout, separated by semi-colon. N'importe quelle dimension (doit être une dimension de requête)
lignes Non Dimensions to use as rows for table layout, separated by semi-colon. N'importe quelle dimension (doit être une dimension de requête)
order Non Spécifie l'ordre des lignes en fonction de la valeur. ASC | DESC
timeField (champ de temps) Non Le champ de temps sur lequel baser l'agrégation des événements. Ceci s'applique uniquement aux éléments de données d'événements. Il peut s'agir d'une option prédéfinie ou de l'ID d'un attribut ou d'un élément de données ayant une valeur temporelle. EVENT_DATE | ENROLLMENT_DATE | INCIDENT_DATE | DUE_DATE | COMPLETED_DATE | CREATED | LAST_UPDATED | <Attribute ID> | <Data element ID>
orgUnitField Non Le champ d’unité d’organisation sur lequel baser l’agrégation des événements. ceci s'applique uniquement aux éléments de données d'événements. Il peut s'agir de l’ID d’un attribut ou d’un élément de données avec le type de valeur "Unité d’organisation". L'option par défaut consiste à omettre le paramètre de requête. <Attribute ID> | <Data element ID> | REGISTRATION | ENROLLMENT | OWNER_AT_START | OWNER_AT_END
enhancedConditions (conditions améliorées) Non Enable enhanced conditions for dimensions and filters. false

Le paramètre de requête dimension définit les dimensions à inclure dans la requête d'analyse. Un nombre quelconque de dimensions peut être spécifié. Le paramètre "dimension" doit être répété pour chaque dimension à inclure dans la réponse à la requête. La réponse à la requête peut éventuellement contenir des valeurs agrégées pour toutes les combinaisons des éléments de dimension spécifiés.

Le paramètre filtre définit les dimensions à utiliser comme filtres pour les données extraites de la requête d'analyse. Un nombre quelconque de filtres peut être spécifié. Le paramètre "filtre" doit être répété pour chaque filtre à utiliser dans la requête. La différence entre un filtre et une dimension réside dans le fait que les dimensions du filtre ne font pas partie du contenu de la réponse à la requête et que les valeurs agrégées dans la réponse sont regroupées en fonction des dimensions du filtre. En d'autres termes, les données de la réponse seront agrégées selon les dimensions du filtre, mais les filtres ne seront pas inclus en tant que dimensions dans la réponse proprement dite. Par exemple, pour lancer une requête pour certains éléments de données filtrés par les périodes et les unités d'organisation, vous pouvez utiliser l'URL suivante :

/api/analytics?dimension=dx:fbfJHSPpUQD;cYeuwXTCPkU&filter=pe:2014Q1;2014Q2
  &filter=ou:O6uvpzGd5pu;lc3eMKXaEfw

Le paramètre de requête aggregationType (type d'agrégation) vous permet de définir l'opérateur d'agrégation à utiliser pour la requête. Par défaut, l'opérateur d'agrégation défini pour les éléments de données inclus dans la requête sera utilisé. Si votre requête ne contient aucun élément de données mais des groupes d'éléments de données, l'opérateur d'agrégation du premier élément de données du premier groupe sera utilisé. L'ordre des groupes et des éléments de données n'est pas défini. Ce paramètre de requête vous permet de remplacer l'opérateur d'agrégation par défaut et de définir un opérateur spécifique. Par exemple, vous pouvez le définir sur "count" (compter) avec l'URL suivante :

/api/analytics?dimension=dx:fbfJHSPpUQD&dimension=pe:2014Q1&dimension=ou:O6uvpzGd5pu
  &aggregationType=COUNT

Le paramètre de requête measureCriteria (critères de mesure) vous permet de filtrer les plages d'enregistrements de données à renvoyer. Vous pouvez demander au système de ne renvoyer que les enregistrements dont les valeurs agrégées sont égales, supérieures, supérieures ou égales, inférieures ou inférieures ou égales à certaines valeurs. Vous pouvez spécifier un nombre quelconque de critères dans le format suivant, où criteria et value doivent être remplacés par des valeurs réelles :

/api/analytics?measureCriteria=criteria:value;criteria:value

À titre d'exemple, la requête suivante renverra uniquement les enregistrements pour lesquels la valeur est supérieure ou égale à 6 500 et inférieure à 33 000 :

/api/analytics?dimension=dx:fbfJHSPpUQD;cYeuwXTCPkU&dimension=pe:2014
  &dimension=ou:O6uvpzGd5pu;lc3eMKXaEfw&measureCriteria=GE:6500;LT:33000

Comme pour measureCriteria, le paramètre de requête preAggregationMeasureCriteria vous permet de filtrer les données avant que l'agrégation ne soit effectuée. Par exemple, la requête suivante n'agrège que les données dont la valeur initiale correspond aux critères définis :

/api/analytics?dimension=dx:fbfJHSPpUQD;cYeuwXTCPkU&dimension=pe:2014
  &dimension=ou:O6uvpzGd5pu;lc3eMKXaEfw&preAggregationMeasureCriteria=GE:10;LT:100

Les paramètres startDate (date de début) et endDate (date de fin) peuvent être utilisés pour définir une plage de dates personnalisée pour l'agrégation. Lorsque vous définissez une plage de dates, vous ne pouvez pas définir de périodes relatives ou fixes en tant que dimension ou filtre. La plage de dates va filtrer la réponse de l'outil d'analyse. Vous pouvez l'utiliser comme ceci :

/api/analytics.json?dimension=dx:fbfJHSPpUQD;cYeuwXTCPkU
  &dimension=ou:ImspTQPwCqd&startDate=2018-01-01&endDate=2018-06-01

Pour que la ressource analytique génère les données sous forme d'un tableau tout fait, vous pouvez définir le paramètre tableLayout (présentation du tableau) en lui attribuant la valeur "true" (vrai). Au lieu de générer une source de données normalisée, la ressource analytique va maintenant générer les données dans un tableau. Vous pouvez utiliser les paramètres columns (colonnes) et rows (lignes) avec des identifiants de dimension séparés par des points-virgules en guise de valeurs pour indiquer ceux qui doivent apparaître dans les colonnes et ceux qui doivent apparaître dans les lignes du tableau. Les dimensions des colonnes et des lignes doivent être utilisées comme dimension de données dans la requête (et non comme filtre). Une telle requête peut ressembler à ceci :

/api/analytics.html?dimension=dx:fbfJHSPpUQD;cYeuwXTCPkU&dimension=pe:2014Q1;2014Q2
  &dimension=ou:O6uvpzGd5pu&tableLayout=true&columns=dx;ou&rows=pe

Le paramètre order peut être utilisé pour les ressources analytiques afin de générer des données ordonnées. Les données seront classées dans l'ordre croissant (ou décroissant) des valeurs. Voici un exemple de requête permettant de classer les valeurs par ordre décroissant :

/api/analytics?dimension=dx:fbfJHSPpUQD&dimension=pe:LAST_12_MONTHS
  &dimension=ou:O6uvpzGd5pu&order=DESC

Dimensions et éléments

DHIS2 dispose d'un modèle de données multidimensionnel avec plusieurs dimensions de données fixes et dynamiques. Les dimensions fixes sont l'élément de données, la période (temps) et l'unité d'organisation. Vous pouvez ajouter des dimensions de manière dynamique à travers des catégories, des groupes d'options de catégories, des groupes d'unités d'organisation, des groupes d'éléments de données et des groupes d'unités d'organisation. Le tableau ci-dessous présente les dimensions de données disponibles dans DHIS2. Chaque dimension de données a un identifiant de dimension correspondant, et chaque dimension peut avoir un ensemble d'éléments de dimension :

Tableau : Dimensions et éléments de dimension

Dimension Identifiant de la dimension Éléments de la dimension
Éléments de données, indicateurs, mesures du taux de déclaration des ensembles de données, opérandes d'éléments de données, indicateurs de programme, éléments de données de programme, attributs de programme, règles de validation dx Élément de données, indicateur, mesures du taux de déclaration de l'ensemble de données, opérande d'élément de données, indicateur de programme, identifiants d'attribut de programme, mot clé DE_GROUP-<group-id>, IN_GROUP-<group-id> , utilisez <dataelement-id>.<optioncombo-id> pour les opérandes d'éléments de données, <program-id>.<dataelement-id> pour les éléments de données du programme, <program-id>.<attribute-id> pour les attributs du programme, <validationrule-id> pour les résultats de validation.
Périodes (temps) pe Périodes ISO et périodes relatives, voir "format de date et de période"
la hiérarchie d'unités d'organisation ; ou Identifiants d'unité d'organisation et mots-clés USER_ORGUNIT, USER_ORGUNIT_CHILDREN, USER_ORGUNIT_GRANDCHILDREN, LEVEL-<level> et OU_GROUP-<group-id>
Combinaisons d'options de catégories co Identifiants des combinaisons d'options de catégorie (omettre pour obtenir tous les éléments)
Combinaisons d'options d'attribut ao Identifiants des combinaisons d'options de catégorie (omettre pour obtenir tous les éléments)
Catégories <category id> Identifiants des options de catégorie (omettre pour obtenir tous les éléments)
Des ensembles de groupes d'éléments de données <group set id> Identifiants des groupes d'éléments de données (omettre pour obtenir tous les éléments)
les ensembles de groupes d'unités d'organisation. <group set id> Identifiants des groupes d'unités d'organisation (omettre pour obtenir tous les éléments)
Ensembles de groupes d'options de catégorie <group set id> Identifiants des combinaisons d'options de catégorie (ignorer pour obtenir tous les éléments)

Il n'est pas nécessaire de savoir quels objets sont utilisés pour les différentes dimensions dynamiques lors de la conception des requêtes analytiques. Vous pouvez obtenir une liste complète des dimensions dynamiques en visitant cette URL dans l'API Web :

/api/dimensions

Si vous souhaitez extraire uniquement les éléments dimensionnels d'une dimension dynamique donnée, vous pouvez utiliser l'exemple ci-dessous. La pagination est désactivée par défaut. Elle peut être activée si le paramètre de pagination paging=true est ajouté à l'URL.

/api/dimensions/J5jldMd8OHv/items?paging=true

L'API /dimensions fournit également un point d'extrémité où les clients peuvent obtenir les recommandations pour un ensemble de dimensions spécifique. Par exemple :

/api/33/dimensions/recommendations?fields=id&dimension=dx:fbfJHSPpUQD

In the example above, the response will contain the categories which are configured as data dimensions and associated, through data sets and category combos, with the data element fbfJHSPpUQD. In addition, all org unit group sets which are configured as data dimensions will be returned.

Le point d'extrémité peut accepter plusieurs éléments de données. Si l'on souhaite envoyer plusieurs éléments de données, ils doivent être séparés par un point virgule;. Par exemple :

/api/33/dimensions/recommendations?fields=id&dimension=dx:fbfJHSPpUQD;JuTpJ2Ywq5b

Remarque

Ce point d'extrémité renvoie uniquement les dimensions qui peuvent être lues par l'utilisateur actuellement connecté. Il vérifiera si cet utilisateur peut lire les données ou les métadonnées de la dimension recommandée. Les dimensions non autorisées ne sont pas incluses dans la liste.

L'URL de base de la ressource analytique est /api/analytics. Pour demander des dimensions et des éléments de dimension spécifiques, vous pouvez utiliser une chaîne de requête au format suivant, où dim-id (identifiant de la dimension) et dim-item (élément de dimension) doivent être remplacés par des valeurs réelles :

/api/analytics?dimension=dim-id:dim-item;dim-item&dimension=dim-id:dim-item;dim-item

Comme illustré ci-dessus, l'identifiant de la dimension est suivi de deux points, tandis que les éléments de la dimension sont séparés par des points-virgules. Par exemple, une requête portant sur deux éléments de données, deux périodes et deux unités d'organisation peut être effectuée à l'aide de l'URL suivante :

/api/analytics?dimension=dx:fbfJHSPpUQD;cYeuwXTCPkU
  &dimension=pe:2016Q1;2016Q2&dimension=ou:O6uvpzGd5pu;lc3eMKXaEfw

Pour obtenir des données ventilées par combinaisons d'options de catégorie au lieu des totaux des éléments de données, vous pouvez inclure la dimension de catégorie dans la chaîne de requête. Voici une exemple :

/api/analytics?dimension=dx:fbfJHSPpUQD;cYeuwXTCPkU
  &dimension=co&dimension=pe:201601&dimension=ou:O6uvpzGd5pu;lc3eMKXaEfw

Au moment de sélectionner des éléments de données, vous pouvez également sélectionner tous les éléments de données d'un groupe en tant qu'éléments en utilisant la syntaxe DE_GROUP-<id> :

/api/analytics?dimension=dx:DE_GROUP-h9cuJOkOwY2
  &dimension=pe:201601&dimension=ou:O6uvpzGd5pu

Au moment de sélectionner les taux de déclaration des ensembles de données, la syntaxe contient un identifiant d'ensemble de données suivi d'une mesure de taux de déclaration :

/api/analytics?dimension=dx:BfMAe6Itzgt.REPORTING_RATE;BfMAe6Itzgt.ACTUAL_REPORTS
  &dimension=pe:201601&dimension=ou:O6uvpzGd5pu

Pour obtenir des éléments de données de programme (de type Tracker), vous pouvez spécifier le programme pour chaque élément de données à l'aide de la syntaxe <program-id>.<dataelement-id> :

/api/analytics.json?dimension=dx:eBAyeGv0exc.qrur9Dvnyt5;eBAyeGv0exc.GieVkTxp4HH
  &dimension=pe:LAST_12_MONTHS&filter=ou:ImspTQPwCqd

Pour obtenir des attributs de programme (attributs d'entités suivies), vous pouvez spécifier le programme pour chaque attribut à l'aide de la syntaxe <program.id>.<attribute-id> :

/api/analytics.json?dimension=dx:IpHINAT79UW.a3kGcGDCuk6;IpHINAT79UW.UXz7xuGCEhU
  &dimension=pe:LAST_4_QUARTERS&dimension=ou:ImspTQPwCqd

Pour obtenir des ensembles de groupes d'unités d'organisation et des éléments de données, vous pouvez utiliser l'URL ci-dessous. Remarquez que l'identifiant de l'ensemble de groupes est utilisé comme identifiant de dimension et les groupes comme éléments de dimension :

/api/analytics?dimension=Bpx0589u8y0:oRVt7g429ZO;MAs88nJc9nL
  &dimension=pe:2016&dimension=ou:ImspTQPwCqd

Pour obtenir des éléments de données et des catégories, vous pouvez utiliser l'URL suivante. Utilisez l'identifiant de la catégorie comme identifiant de dimension et les options de la catégorie comme éléments de dimension :

/api/analytics?dimension=dx:s46m5MS0hxu;fClA2Erf6IO&dimension=pe:2016
  &dimension=YNZyaJHiHYq:btOyqprQ9e8;GEqzEKCHoGA&filter=ou:ImspTQPwCqd

Pour effectuer une requête en utilisant des périodes relatives et des unités d'organisation associées à l'utilisateur actuellement connecté, vous pouvez utiliser l'URL suivante :

/api/analytics?dimension=dx:fbfJHSPpUQD;cYeuwXTCPkU
  &dimension=pe:LAST_12_MONTHS&dimension=ou:USER_ORGUNIT

Lorsque vous sélectionnez des unités d'organisation pour une dimension, vous pouvez utiliser la syntaxe LEVEL-<level> pour sélectionner un niveau entier, éventuellement limité par un nombre quelconque d'unités d'organisation limites. La limite renvoie à un nœud supérieur dans une sous-hiérarchie, ce qui signifie que toutes les unités d'organisation au niveau indiqué sous l'unité d'organisation limite indiquée dans la hiérarchie seront incluses dans la réponse et sont fournies en tant qu'éléments de dimension d'unité d'organisation ordinaires. La valeur du niveau peut être un niveau numérique ou faire référence à l'identifiant de l'entité du niveau de l'unité d'organisation. Voici une requête simple pour toutes les unités d'organisation de niveau trois :

/api/analytics?dimension=dx:fbfJHSPpUQD&dimension=pe:2016&dimension=ou:LEVEL-3

Une requête pour les niveaux trois et quatre avec deux unités d'organisation limites peut se présenté comme suit :

/api/analytics?dimension=dx:fbfJHSPpUQD&dimension=pe:2016
  &dimension=ou:LEVEL-3;LEVEL-4;O6uvpzGd5pu;lc3eMKXaEf

Lors de la sélection des unités d'organisation, vous pouvez également sélectionner toutes les unités d'organisation d'un groupe d'unités d'organisation, lesquelles seront incluses en tant qu'éléments de dimension. Vous pouvez le faire en utilisant la syntaxe OU_GROUP-<id>. Les unités d'organisation qui se trouvent dans les groupes peuvent éventuellement être limitées par un nombre quelconque d'unités d'organisation limites. Les éléments de niveau et de groupe peuvent être répétés autant de fois que nécessaire :

/api/analytics?dimension=dx:fbfJHSPpUQD&dimension=pe:2016
  &dimension=ou:OU_GROUP-w0gFTTmsUcF;OU_GROUP-EYbopBOJWsW;O6uvpzGd5pu;lc3eMKXaEf

Vous pouvez utiliser des schémas d'identification pour la partie métadonnées de la réponse analytique avec la propriété outputIdScheme (schéma d'identification de la sortie). Vous pouvez utiliser l'identifiant, le code ou les attributs comme schéma d'identification. Voici un exemple :

/api/analytics?dimension=dx:fbfJHSPpUQD;cYeuwXTCPkU
  &dimension=pe:2017Q1;2017Q2&dimension=ou:O6uvpzGd5pu&outputIdScheme=CODE

Quelques éléments à prendre en compte lors de l'utilisation de la ressource analytique sont répertoriés ci-dessous.

  • Les éléments de données, les indicateurs, les taux de déclaration des ensembles de données, les éléments de données de programme et les indicateurs de programme font partie d’une dimension de données commune, identifié comme "dx". Cela signifie que vous pouvez utiliser n'importe quelle élément de données, indicateur et identifiant d'ensemble de données avec l'identifiant de dimension "dx" dans la requête.

  • Pour les dimensions "catégorie", "ensemble de groupes d'éléments de données" et "ensemble de groupes d'unités d'organisation", tous les éléments de dimension seront utilisés dans la requête si des éléments de dimension ne sont pas spécifiés.

  • Pour la dimension de période, les éléments de dimension sont des identifiants de période ISO et/ou des périodes relatives. Consultez la section "Format de date et de période" plus haut, pour mieux comprendre le format des périodes et les périodes relatives disponibles.

  • For the organization unit dimension, you can specify items as either the organization unit or its sub-units associated with the currently authenticated user. Use the keys USER_ORGUNIT for the organization unit itself or USER_ORGUNIT_CHILDREN for its sub-units. You may also specify organization unit identifiers directly or use a combination of both. The authenticated user must have permission to export and analyze data for the designated organization units.

  • Pour la dimension d'unité d'organisation, vous pouvez spécifier le niveau hiérarchique et l'unité d'organisation limite à utiliser pour la requête en utilisant le format LEVEL-<level>-<boundary-id>. Par exemple, LEVEL-3-ImspTQPwCqd prend en compte toutes les unités d'organisation inférieures à l'unité d'organisation limite au niveau 3 de la hiérarchie.

  • Pour la dimension d'unité d'organisation, les éléments de dimension sont les unités d'organisation et leur sous-hiérarchie - les données seront agrégées pour toutes les unités d'organisation situées en dessous de l'unité d'organisation spécifiée dans la hiérarchie.

  • Vous ne pouvez pas spécifier d'éléments de dimension pour la dimension de combinaison d'options de catégorie. En lieu et place de cela, la réponse contiendra les éléments associés aux valeurs de données.

La dimension dx

La dimension dx est une dimension spéciale qui peut contenir tous les types de données suivants.

Tableau : Types de dimensions de données dx

Type Syntaxe Description Source des données
Indicateur <indicator-id> Identifiant d'indicateur. Données agrégées
Groupe indicateur IN_GROUP-<indicatorgroup-id> Mot clé suivi d'un identifiant de groupe d'indicateurs. Inclura tous les indicateurs du groupe dans la réponse. Données agrégées
Élément de données <dataelement-id> Identifiant de l'élément de données. Données agrégées
Groupe d'éléments de données DE_GROUP-<dataelementgroup-id> Mot clé suivi d'un identifiant de groupe d'éléments de données. Inclura tous les éléments de données du groupe dans la réponse. Données agrégées
Opérande de l'élément de données <dataelement-id>.<categoryoptcombo-id>.<attributeoptcombo-id> Identifiant de l'élément de données suivi d'une combinaison d'options de catégorie et d'un identifiant de combinaison d'options d'attributs, ou des deux. Le caractère générique « * » peut être utilisé pour indiquer n'importe quelle valeur de combinaison d'options. L'identifiant de la combinaison d'options d'attributs peut être ignoré complètement. Données agrégées
Ensemble de données <dataset-id>.<reporting-rate-metric> Identifiant de l’ensemble de données suivi de la mesure du taux de déclaration. Peut être REPORTING_RATE | REPORTING_RATE_ON_TIME | ACTUAL_REPORTS | ACTUAL_REPORTS_ON_TIME | EXPECTED_REPORTS. Enregistrements de la complétude des ensembles de données
Élément de données de programme <program-id>.<dataelement-id> Identifiant du programme suivi de l'identifiant de l'élément de données. Lit les événements du programme spécifié. Événements du programme en question
Indicateur de programme <programindicator-id> Identifiant de l’indicateur du programme. Lit les événements du programme associés à l'identifiant du programme. Événements du programme de l'indicateur
Résultat de validation <validationrule-id> Identifiant de la règle de validation. Inclura les violations à la règle de validation et requiert que les résultats de la validation soient générés et conservés. Résultats de validation

Les éléments de tous les différents types dx peuvent être combinés dans une requête d'analyse. Voici un exemple :

/api/analytics.json
  ?dimension=dx:Uvn6LCg7dVU;BfMAe6Itzgt.REPORTING_RATE;IpHINAT79UW.a3kGcGDCuk6
  &dimension=pe:LAST_12_MONTHS&filter=ou:ImspTQPwCqd

La syntaxe de groupe peut également être utilisée avec n’importe quel autre élément. Voici un exemple :

/api/analytics.json
  ?dimension=dx:DE_GROUP-qfxEYY9xAl6;IN_GROUP-oehv9EO3vP7;BfMAe6Itzgt.REPORTING_RATE
  &dimension=pe:LAST_12_MONTHS&filter=ou:ImspTQPwCqd

Les opérandes d'élément de données peuvent éventuellement spécifier des combinaisons d'options d'attribut et utiliser des caractères génériques, par exemple pour spécifier toutes les valeurs des combinaisons d'options de catégorie :

/api/analytics.json
  ?dimension=dx:Uvn6LCg7dVU.*.j8vBiBqGf6O;Uvn6LCg7dVU.Z4oQs46iTeR
  &dimension=pe:LAST_12_MONTHS&filter=ou:ImspTQPwCqd

Conseil

Pour apprendre à utiliser l'API d'analyse, vous pouvez utiliser l'application web DHIS2 Visualiseur de Données et créer un tableau croisé dynamique. Vous pouvez vous amuser avec des tableaux croisés dynamiques en utilisant les différentes dimensions et éléments et cliquer sur Télécharger > Source de données simples > JSON pour voir les appels de l'API analytique qui en résultent dans la barre d'adresse de votre navigateur web. >>>>

Formats de réponse

La réponse analytique contenant les données agrégées peut être renvoyée sous différents formats. Comme toujours, vous pouvez définir un format spécifique en ajoutant une extension de fichier à l'URL, via l'en-tête HTTP Accept ou via le paramètre de requête format. Le format par défaut est JSON. Les formats et types de contenu disponibles sont listés ci-dessous.

  • json (application/json)

  • jsonp (application/javascript)

  • xml (application/xml)

  • csv (application/csv)

  • html (texte/html)

  • html+css (texte/html)

  • xls (application/vnd.ms-excel)

À titre d'exemple, vous pouvez demander une réponse analytique au format XML, en utilisant l'URL suivante :

/api/analytics.xml?dimension=dx:fbfJHSPpUQD
  &dimension=pe:2016&dimension=ou:O6uvpzGd5pu;lc3eMKXaEfw

La réponse JSON ressemblera à ceci :

{
  "headers": [
    {
      "name": "dx",
      "column": "Data",
      "valueType": "TEXT",
      "meta": true
    },
    {
      "name": "pe",
      "column": "Period",
      "valueType": "TEXT",
      "meta": true
    },
    {
      "name": "value",
      "column": "Value",
      "valueType": "NUMBER",
      "meta": false
    }
  ],
  "height": 4,
  "metaData": {
    "pe": [
      "2016Q1",
      "2016Q2"
    ],
    "ou": [
      "ImspTQPwCqd"
    ],
    "names": {
      "2016Q1": "Jan to Mar 2016",
      "2016Q2": "Apr to Jun 2016",
      "FbKK4ofIv5R": "Measles Coverage <1 y",
      "ImspTQPwCqd": "Sierra Leone",
      "eTDtyyaSA7f": "Fully Immunized Coverage"
    }
  },
  "rows": [
    [
      "eTDtyyaSA7f",
      "2016Q2",
      "81.1"
    ],
    [
      "eTDtyyaSA7f",
      "2016Q1",
      "74.7"
    ],
    [
      "FbKK4ofIv5R",
      "2016Q2",
      "88.9"
    ],
    [
      "FbKK4ofIv5R",
      "2016Q1",
      "84.0"
    ]
  ],
  "width": 3
}

La réponse représente un tableau de données dimensionnelles. L'en-tête donne un aperçu des colonnes du tableau et de leur contenu. La propriété colonne indique l'identifiant de la dimension de la colonne ou, si la colonne contient des mesures, le mot "Value". La propriété métadonnées est définie sur vrai si la colonne contient des éléments de dimension ou faux si la colonne contient une mesure (valeurs de données agrégées). La propriété nom est similaire à la propriété "colonne", à la différence qu'elle affiche "valeur" lorsque la colonne contient une mesure. La propriété type indique le type de classe Java des valeurs de la colonne.

Les propriétés hauteur et largeur indiquent respectivement le nombre de colonnes et de lignes de données contenues dans la réponse.

La propriété périodes de métadonnées contient un tableau unique et ordonné des périodes contenues dans la réponse. La propriété unité d'organisation de métadonnées contient un tableau d'identifiants d'unités d'organisation contenues dans la réponse. La propriété noms de métadonnées permet d'obtenir une correspondance entre les identifiants utilisés dans la réponse et les noms des objets qu'ils représentent. Les clients peuvent utiliser cette propriété pour remplacer les identifiants de la réponse par des noms afin d'obtenir une représentation plus claire du tableau de données.

La rubrique lignes contient le tableau des données dimensionnelles. Ce dernier est fait de colonnes dans lesquelles figurent des éléments de dimension (identifiants d'objets ou de périodes) et une colonne dans laquelle figurent des valeurs de données agrégées. L'exemple de réponse ci-dessus comporte une colonne pour les données et les indicateurs, une colonne pour les périodes et une colonne pour les valeurs. La première colonne contient les identifiants d'indicateur, la deuxième contient les identifiants de période ISO et la troisième contient les valeurs de données agrégées.

Contraintes et validation

Les paramètres d'entrée que vous pouvez fournir à la ressource analytique sont soumis à plusieurs contraintes. Si l'une de ces contraintes n'est pas respectée, l'API renvoie une réponse 409 Conflict avec un message semblable à celui-ci :

{
  "httpStatus": "Conflict",
  "httpStatusCode": 409,
  "status": "ERROR",
  "message": "Only a single indicator can be specified as filter",
  "errorCode": "E7108"
}

Les champs httpStatus et httpStatusCode indiquent le statut HTTP et le code de statut conformément à la spécification HTTP. Le champ message fournit une description de l'erreur de validation lisible par l'homme. Le champ errorCode fournit un code lisible par une machine que les clients peuvent utiliser pour gérer les erreurs de validation. Les erreurs de validation potentielles pour l'API d'analyse des données agrégées sont décrites dans le tableau ci-dessous.

Code d'erreur Message
E7100 Les paramètres de requête ne peuvent pas être nuls
E7101 Au moins une dimension doit être spécifiée
E7102 Au moins un élément de dimension de données ou un élément de dimension d'ensemble de groupes d'éléments de données doit être spécifié.
E7103 Les dimensions ne peuvent pas être spécifiées à la fois comme dimension et comme filtre
E7104 Au moins une période doit être spécifiée comme dimension ou filtre, ou dates de début et de fin
E7105 Les périodes et les dates de début et de fin ne peuvent pas être spécifiées simultanément
E7106 La date de début ne peut pas être postérieure à la date de fin
E7107 Des dates de début et de fin ne peuvent pas être spécifiées pour les taux de déclaration
E7108 Un seul indicateur peut être spécifié comme filtre
E7109 Un seul taux de déclaration peut être spécifié comme filtre
E7110 Les combinaisons d'options de catégorie ne peuvent pas être spécifiées comme filtre
E7111 Les dimensions ne peuvent pas être spécifiées plus d'une fois
E7112 Les taux de déclaration ne peuvent être spécifiés qu'avec les dimensions de type
E7113 Les catégories attribuées ne peuvent pas être spécifiées si les éléments de données ne sont pas spécifiés
E7114 Les catégories attribuées ne peuvent être spécifiées qu'avec des éléments de données, et non avec des indicateurs ou des taux de déclaration.
E7115 Les éléments de données doivent être d'un type de valeur et d'agrégation qui permette l'agrégation
E7116 Les expressions d'indicateur ne peuvent pas contenir de références cycliques
E7117 Une dimension de données 'dx' doit être spécifiée lorsque le format de sortie est DATA_VALUE_SET (ensemble de valeurs de données).
E7118 Une dimension de période 'pe' doit être spécifiée lorsque le format de sortie est DATA_VALUE_SET.
E7119 Une dimension d'unité d'organisation 'ou' doit être spécifiée lorsque le format de sortie est DATA_VALUE_SET.
E7120 L'utilisateur n'est pas autorisé à visualiser l'unité d'organisation
E7121 L'utilisateur n'est pas autorisé à lire les données de l'objet
E7122 Le niveau d'approbation des données n'existe pas
E7123 L'utilisateur actuel est limité par une dimension mais n'a accès à aucun élément de dimension
E7124 La dimension est présente dans la requête sans aucune option de dimension valide
E7125 L'identifiant de dimension ne fait référence à aucune dimension
E7126 La colonne doit être présente dans la requête en tant que dimension
E7127 La ligne doit être présente dans la requête en tant que dimension
E7128 Les résultats de la requête ont dépassé la limite maximale
E7129 Le programme est spécifié mais n'existe pas
E7130 L'étape de programme est spécifiée mais n'existe pas
E7131 La requête a échoué, probablement parce que la requête a expiré

Format d'ensemble de valeurs de données

La ressource analytique dataValueSet permet de renvoyer des données agrégées dans le format "ensemble de valeurs de données". Ce format représente des valeurs de données brutes, par opposition aux données qui ont été agrégées en fonction des différentes dimensions. L'exportation de données agrégées sous la forme de valeurs de données régulières permet d'échanger des données entre systèmes lorsque le système cible contient des données d'une granularité plus fine que celles stockées par le système de destination.

Par exemple, il est possible de spécifier un indicateur dans le système cible qui va récapituler les données de plusieurs éléments de données, et d'importer ces données pour le compte d'un seul élément de données dans le système de destination. Autre exemple, l'on peut agréger les données collectées au niveau 4 de l'unité d'organisation dans le système cible au niveau 2 et importer ces données dans le système de destination.

Vous pouvez récupérer des données au format d'ensemble de valeurs de données brutes à partir de la ressource dataValueSet :

/api/analytics/dataValueSet

Les représentations de ressources suivantes sont prises en charge :

  • json (application/json)

  • xml (application/xml)

Lorsque vous utilisez le format d'ensemble de valeurs de données, exactement trois dimensions doivent être spécifiées en tant que dimensions analytiques avec au moins un élément de dimension pour chacune d'entre elles :

  • Données (dx)

  • Période (pe)

  • Unité d'organisation (ou)

Toute autre dimension sera ignorée. Les filtres seront appliqués de la même manière que pour les demandes d'analyse ordinaires. Notez que tout type de dimension de données peut être spécifié, notamment les indicateurs, les éléments de données, les opérandes d'éléments de données, les ensembles de données et les indicateurs de programme.

Voici un exemple de requête qui agrège des données pour des indicateurs, des périodes et des unités d'organisation spécifiques et les renvoie sous forme de valeurs de données régulières au format XML :

api/analytics/dataValueSet.xml?dimension=dx:Uvn6LCg7dVU;OdiHJayrsKo
  &dimension=pe:LAST_4_QUARTERS&dimension=ou:lc3eMKXaEfw;PMa2VCrupOd

A request which aggregates data for data element operands and uses CODE as output identifier scheme looks like the below. When defining the output identifier scheme, all metadata objects part of the response are affected:

api/analytics/dataValueSet.json?dimension=dx:fbfJHSPpUQD.pq2XI5kz2BY;fbfJHSPpUQD.PT59n8BQbqM
  &dimension=pe:LAST_12_MONTHS&dimension=ou:ImspTQPwCqd&outputIdScheme=CODE

When using attribute-based identifier schemes for export there is a risk of producing duplicate data values. The boolean query parameter duplicatesOnly can be used for debugging purposes to return only duplicates data values. This response can be used to clean up the duplicates:

api/analytics/dataValueSet.xml?dimension=dx:Uvn6LCg7dVU;OdiHJayrsKo
  &dimension=pe:LAST_4_QUARTERS&dimension=ou:lc3eMKXaEfw&duplicatesOnly=true

Format de données brutes

La ressource analytique rawData permet de renvoyer les données stockées dans les tableaux de données analytiques sans qu'aucune agrégation ne soit effectuée. Cette ressource permet aux clients qui le souhaitent d'effectuer eux-mêmes des agrégations et des filtrages sans avoir à dénormaliser eux-mêmes les données existant dans les dimensions disponibles.

/api/analytics/rawData

Les représentations de ressources suivantes sont prises en charge :

  • json (application/json)

  • csv (application/csv)

Cette ressource respecte la syntaxe d'une ressource analytique ordinaire. Seul un sous-ensemble de paramètres de requête est pris en charge. En outre, les paramètres startDate et endDate sont disponibles. Les paramètres pris en charge sont énumérés dans le tableau ci-dessous.

Tableau : Paramètres de requête

Paramètre de requête Obligatoire / Remarques
dimension Oui
startDate No / aaaa-MM-jj
endDate No / aaaa-MM-jj
skipMeta Non
skipData (ignorer les données) Non
hierarchyMeta (métadonnées de la hiérarchie) Non
showHierarchy (afficher la hiérarchie) Non
displayProperty (afficher la propriété) Non
outputIdScheme (schéma d'identification de la sortie) Non
outputOrgUnitIdScheme (schéma d'identification de l'unité d'organisation de sortie) Non
outputDataElementIdScheme (schéma d'identification de l'élément de données de sortie) Non
inputIdScheme Non
userOrgUnit (unité d'organisation d'utilisateur) Non

Le paramètre de requête dimension définit les dimensions (colonnes du tableau) à inclure dans la réponse. Il peut éventuellement être limité par des éléments. Le paramètre de requête filter (filtre) définit les éléments et les dimensions (colonnes du tableau) qui doivent être utilisés pour filtrer la réponse.

Pour la dimension "unité d'organisation", la réponse contiendra les données associées à l'unité d'organisation et à toutes les unités d'organisation qui lui sont inférieures dans la hiérarchie (c'est-à-dire ses subordonnées). Ceci est différent de la ressource analytique ordinaire, où seules les unités d'organisation explicitement sélectionnées sont incluses dans la réponse.

Pour obtenir une réponse contenant des éléments de données, périodes et unités d'organisation spécifiques, ainsi que toutes les données relatives à deux dimensions personnalisées, vous pouvez lancer une requête de ce type :

/api/analytics/rawData.json?dimension=dx:fbfJHSPpUQD;cYeuwXTCPkU;Jtf34kNZhzP
  &dimension=J5jldMd8OHv&dimension=Bpx0589u8y0
  &dimension=pe:LAST_12_MONTHS
  &dimension=ou:O6uvpzGd5pu;fdc6uOvgoji

Les paramètres startDate et endDate permettent de récupérer des données associées à toute période comprise entre ces dates. Avec cette méthode, nul besoin de définir explicitement toutes les périodes dans la requête :

/api/analytics/rawData.json?dimension=dx:fbfJHSPpUQD;cYeuwXTCPkU;Jtf34kNZhzP
  &dimension=J5jldMd8OHv&dimension=Bpx0589u8y0
  &startDate=2015-01-01&endDate=2015-12-31
  &dimension=ou:O6uvpzGd5pu;fdc6uOvgoji

Le paramètre filter peut être utilisé pour filtrer une réponse sans inclure cette dimension dans la réponse, cette fois au format CSV :

/api/analytics/rawData.csv?dimension=dx:fbfJHSPpUQD;cYeuwXTCPkU;Jtf34kNZhzP
  &filter=J5jldMd8OHv:uYxK4wmcPqA;tDZVQ1WtwpA
  &startDate=2015-01-01&endDate=2015-12-31
  &dimension=ou:O6uvpzGd5pu

Vous pouvez utiliser le paramètre outputIdScheme (schéma d'identification de la sortie) pour obtenir des données lisibles par l'homme, car il peut être défini sur NOM comme dans l'exemple suivant :

/api/analytics/rawData.csv?dimension=dx:fbfJHSPpUQD;cYeuwXTCPkU
  &filter=J5jldMd8OHv:uYxK4wmcPqA;tDZVQ1WtwpA
  &startDate=2017-01-01&endDate=2017-12-31
  &dimension=ou:O6uvpzGd5pu
  &outputIdScheme=NAME

La réponse de la ressource rawData est identique à celle de la ressource analytique ordinaire, à la différence qu'elle contient des données brutes et non agrégées qui peuvent être agrégées ultérieurement par des systèmes tiers.

Débogage

Lors du débogage des requêtes analytiques, il peut être utile d'examiner la source des valeurs de données de la réponse analytique agrégée. La ressource analytics/debug/sql fournira une instruction SQL qui renvoie le contenu recherché du tableau des valeurs de données. Vous pouvez produire cette instruction SQL en effectuant une requête GET avec le type de contenu "text/html" ou "text/plain" comme ci-dessous. La syntaxe des dimensions et des filtres est identique à celle des requêtes analytiques ordinaires :

/api/analytics/debug/sql?dimension=dx:fbfJHSPpUQD;cYeuwXTCPkU
  &filter=pe:2016Q1;2016Q2&filter=ou:O6uvpzGd5pu

Analyse d'événements

L'API d'analyse d'événements vous permet d'accéder à des données d'événements agrégées et d'interroger des événements capturés dans DHIS2. Cette ressource vous permet d'extraire des événements à partir d'un programme et éventuellement d'une étape de programme. Elle vous permet également d'extraire et de filtrer des événements en fonction des différentes dimensions d'événements.

/api/analytics/events

Dimensions et éléments

Les dimensions d'événements comprennent les éléments de données, les attributs, les unités d'organisation et les périodes. La ressource analytique des événements agrégés renvoie des informations agrégées telles que des chiffres issus de comptages ou des moyennes. La ressource analytique de requête renvoie simplement les événements correspondant à un ensemble de critères et n'effectue aucune agrégation. Vous pouvez spécifier des éléments de dimension sous la forme d'options à partir d'ensembles d'options et de légendes à partir d'ensembles de légendes, pour les éléments de données et les attributs qui y sont associés. Les dimensions des événements sont répertoriées dans le tableau ci-dessous.

Tableau : Dimensions d'événement

Dimension Identifiant de la dimension Description
Éléments de données <id> Identifiants d'élément de données
Attributs <id> Identifiants d'attribut
Périodes pe Périodes ISO et périodes relatives, voir "format de date et de période"
Unités d’organisation ou Organisation unit identifiers and keywords USER_ORGUNIT, USER_ORGUNIT_CHILDREN, USER_ORGUNIT_GRANDCHILDREN, LEVEL-<level> and OU_GROUP-<group-id>. It can be staged, ie: A03MvHHogjR.ou
les ensembles de groupes d'unités d'organisation. <org unit group set id> Identifiants d'ensemble de groupes d'unités d'organisation
Catégories <category id> Identifiants de catégorie (catégories d'attributs de programme uniquement)

Paramètres de requête{ #webapi_event_analytics_request_query_parameters }

L'API d'événement analytique vous permet de définir un ensemble de paramètres de requête.

Tableau : Paramètres de requête pour la requête d'événement et l'analyse d'agrégation

Paramètre de requête Obligatoire Description Options (par défaut en premier)
program Oui Identifiant du programme. Tout identifiant de programme
étape Non Identifiant de l'étape de programme. Tout identifiant d'étape de programme
startDate Oui Date de début des événements. Les dates doivent être au format aaaa-MM-jj
endDate Oui Date de fin des événements. Les dates doivent être au format aaaa-MM-jj
dimension Oui L'identifiant de dimension comprend les éléments de données, les attributs, les indicateurs de programme, les périodes, les unités d'organisation et les ensembles de groupes d'unités d'organisation. Le paramètre peut être répété autant de fois que nécessaire. Des filtres d'éléments peuvent être appliqués à une dimension selon le format <item-id>:<operator>:<filter>. Les valeurs des filtres ne sont pas sensibles à la casse. Les opérateurs peuvent être EQ | GT| GE| LT| LE| NE | COMME | DANS
filter Non L'identifiant de dimension comprend les éléments de données, les attributs, les périodes, les unités d'organisation et les ensembles de groupes d'unités d'organisation. Le paramètre peut être répété autant de fois que nécessaire. Des filtres d'éléments peuvent être appliqués à une dimension selon le format <item-id>:<operator>:<filter>. Les valeurs des filtres ne sont pas sensibles à la casse.
hierarchyMeta (métadonnées de la hiérarchie) Non Inclut les noms des unités d'organisation racines et le parcours hiérarchique des unités d'organisation dans les métadonnées. false
eventStatus Non Spécifie le statut des événements à inclure. ACTIVE | COMPLETED | SCHEDULE | OVERDUE | SKIPPED. La séparation peut se faire par des virgules (pour la requête uniquement).
programStatus Non Spécifie le statut d’inscription des événements à inclure. ACTIVE | COMPLETED | CANCELLED. La séparation peut se faire par des virgules (pour la requête uniquement).
relativePeriodDate (Date de la période relative) chaîne Non Identifiant de date, par exemple : "2016-01-01". Il remplace la date de début de la période relative
colonnes Non Dimensions à utiliser comme colonnes dans la présentation du tableau. N'importe quelle dimension (doit être une dimension de requête)
lignes Non Dimensions à utiliser comme lignes dans la présentation du tableau. N'importe quelle dimension (doit être une dimension de requête)
timeField (champ de temps) Non Il s'agit du champ de temps utilisé dans le cadre des agrégations/requêtes sur les événements. Il s'applique uniquement aux éléments de données d'événements. Il peut s'agir d'une option prédéfinie ou de l'identifiant d'un attribut ou d'un élément de données dont le type de valeur est temporel. Pour les points d'extrémité "/analytics/events/", le champ de temps par défaut est EVENT_DATE. EVENT_DATE | SCHEDULED_DATE | <Attribute ID> | <Data element ID>

** There are some cases where it's possible to request specific fields through the dimension param. They are not true dimensions, but gives a better level of flexibility. They are:

Event Date (EVENT_DATE)

Filters by the date an event occurred. Can be used as a root-level dimension or scoped to a specific stage.

Value form Exemple Signification
{stageUid}.EVENT_DATE:{period} dimension=A03MvHHogjR.EVENT_DATE:202205 Events in stage A03MvHHogjR with an event date in May 2022.
{stageUid}.EVENT_DATE:{start}_{end} dimension=A03MvHHogjR.EVENT_DATE:2022-05-01_2022-05-10 Events in that stage with an event date in the given inclusive date range.
EVENT_DATE:{period} dimension=EVENT_DATE:2022Sep Root-level event date filter using a financial year period.

Scheduled Date (SCHEDULED_DATE)

Filters by the date an event was scheduled (as opposed to when it actually occurred). Also, it can be scoped to a specific stage (as EVENT_DATE).

Value form Exemple Signification
SCHEDULED_DATE:{period} dimension=SCHEDULED_DATE:202107 Events in the given stage with a scheduled date in July 2021.

Created Date (CREATED)

Filters by when the enrollment record was created in the system. Also, it can be scoped to a specific stage (as EVENT_DATE).

Value form Exemple Signification
CREATED:{period} dimension=CREATED:2016Sep Enrollments created during the financial year starting September 2016.

Completed Date (COMPLETED)

Filters by when the enrollment was marked as completed. Also, it can be scoped to a specific stage (as EVENT_DATE).

Value form Exemple Signification
COMPLETED:{period} dimension=COMPLETED:2022Sep Enrollments completed during the financial year starting September 2022.

Event Status (EVENT_STATUS)

Filters by the status of an event within a stage.

Value form Exemple Signification
{stageUid}.EVENT_STATUS:{status} dimension=A03MvHHogjR.EVENT_STATUS:ACTIVE Events in the stage with status ACTIVE.
{stageUid}.EVENT_STATUS:{s1};{s2} dimension=edqlbukwRfQ.EVENT_STATUS:COMPLETED;ACTIVE Events with status COMPLETED or ACTIVE (OR logic).

Valid status values: ACTIVE, COMPLETED, SCHEDULED, OVERDUE, SKIPPED.

Program Status (PROGRAM_STATUS)

Filters by the status of the enrollment itself (as opposed to individual events).

Value form Exemple Signification
PROGRAM_STATUS:{status} dimension=PROGRAM_STATUS:ACTIVE Only enrollments with the specified program status.

Valid status values: ACTIVE, COMPLETED, CANCELLED.

Tableau : Paramètres de requête pour l'analyse des requêtes d'événement uniquement

Paramètre de requête Obligatoire Description Options
ouMode Non The mode of selecting organisation units. Default is DESCENDANTS, meaning all sub units in the hierarchy. CHILDREN refers to immediate children in the hierarchy; SELECTED refers to the selected organisation units only. More details here DESCENDANTS, SUBORDONNÉES, SÉLECTIONNÉES
asc Non Permet de trier les dimensions dans l'ordre croissant; peut concerner la date de l'événement, le nom et le code de l'unité d'organisation et tout identifiant d'élément. ouname | programstatus | eventstatus | createdbydisplayname | lastupdatedbydisplayname | eventdate | enrollmentdate | incidentdate | lastupdated | item identifier
desc Non Permet de trier les dimensions dans l'ordre décroissant ; peut concerner la date de l'événement, le nom et le code de l'unité d'organisation et tout identifiant d'élément. ouname | programstatus | eventstatus | createdbydisplayname | lastupdatedbydisplayname | eventdate | enrollmentdate | incidentdate | lastupdated | item identifier
coordinatesOnly (coordonnées uniquement) Non Indique s'il faut uniquement renvoyer les événements qui ont des coordonnées. false
coordinateOuFallback (Coordonner le repli de l'uo) Non La géométrie de l'instance de programme est appliquée chaque fois que la géométrie de l'unité d'organisation est manquante. false
dataIdScheme (schéma d'identification des données) Non Schéma d'identification à utiliser pour les données, plus spécifiquement pour les éléments de données et les attributs qui disposent d'un ensemble d'options ou de légendes. Ceci permet par exemple de renvoyer le nom de l'option au lieu du code, ou le nom de la légende au lieu de son ID, dans la réponse. NAME | CODE | UID
en-têtes Non Le nom des en-têtes à renvoyer dans la réponse. Un ou plusieurs noms d'en-têtes séparés par une virgule
page Non Le numéro de page. La page par défaut est 1. Valeur numérique positive
pageSize Non La taille de la page. La taille par défaut est de 50 éléments par page. Zéro ou valeur positive
eventDate no Events resource only. Custom period on eventDate. See "custom date periods" section. See "date and period format" section
enrollmentDate (date d'inscription) no Custom period on enrollmentDate. See "custom date periods" section. See "date and period format" section
scheduledDate (date de programmation) no Events resource only. Custom period on scheduledDate. See "custom date periods" section. See "date and period format" section
incidentDate (date d'incident) no Custom period on incidentDate. See "custom date periods" section. See "date and period format" section
lastUpdated (dernière mise à jour) no Custom period on lastUpdated. See "custom date periods" section. See "date and period format" section

Tableau : Paramètres de requête pour l'analyse agrégée des événements uniquement

Paramètre de requête Obligatoire Description Options
value Non Il s'agit de l'identifiant de la dimension de valeur ; peut être un élément de données ou un attribut qui doit être de type numérique. Data element or attribute identifier. It can stage scoped, ie: value=stageId.dimensionid
Type d'agrégation Non Type d'agrégation pour la dimension de valeur. Par défaut, il est définit sur AVERAGE (moyenne). SUM | AVERAGE | AVERAGE_SUM_ORG_UNIT | LAST | LAST_AVERAGE_ORG_UNIT | COUNT | STDDEV | VARIANCE | MIN | MAX
showHierarchy (afficher la hiérarchie) Non Affiche le parcours hiérarchique complet de l'unité d'organisation ainsi que le nom de l'unité d'organisation. false
displayProperty (afficher la propriété) Non Affiche la propriété des métadonnées. NAME | SHORTNAME
sortOrder Non Trie les enregistrements de la colonne de valeurs par ordre croissant ou décroissant. ASC | DESC
limite Non Le nombre maximum d'enregistrements à renvoyer. Ne peut pas dépasser 10 000. Valeur numérique positive
outputType (type de sortie) Non Spécifie le type de sortie pour les données d'analyse. Il peut s'agir d'événements, d'inscriptions ou d'instances d'entité suivie. Les deux dernières options s'appliquent aux programmes avec inscription uniquement. EVENT | ENROLLMENT | TRACKED_ENTITY_INSTANCE
collapseDataDimensions (Dimensions des données regroupées) Non Réduit toutes les dimensions de données (éléments de données et attributs) en une seule dimension dans la réponse. false
skipMeta Non Exclut la partie métadonnées de la réponse (améliore les performances). false
skipData (ignorer les données) Non Excluez la partie données de la réponse. false
skipRounding (ignorer l'arrondissement des valeurs) Non Évite d'arrondir les valeurs de données agrégées. false
aggregateData (données agrégées) Non Produit des valeurs agrégées pour les dimensions de données (par opposition aux éléments de dimension). false
orgUnitField Non Le champ d’unité d’organisation sur lequel baser l’agrégation des événements. ceci s'applique uniquement aux éléments de données d'événements. Il peut s'agir de l’ID d’un attribut ou d’un élément de données avec le type de valeur "Unité d’organisation". L'option par défaut consiste à omettre le paramètre de requête. <Attribute ID> | <Data element ID> | REGISTRATION | ENROLLMENT | OWNER_AT_START | OWNER_AT_END

Tableau : Paramètres de requête pour les analyses d'événements en grappes uniquement

Paramètre de requête Obligatoire Description Options
clusterSize (taille des grappes) Oui Taille des grappes en mètres. Valeur numérique positive
coordinateField (champs de coordonnées) Non Champ à partir duquel les analyses d'événements géospatiaux sont effectuées. La valeur par défaut est " événement ". Il peut être défini comme identifiant d'attributs et d'éléments de données de type coordonnées. EVENT | <attribute-id> | <dataelement-id>
bbox Oui Zone de délimitation des événements à inclure dans la réponse au format "longitude minimale, latitude minimale, longitude maximale, latitude maximale". Chaîne
includeClusterPoints (Inclure les points d'assemblage) Non Inclut des informations sur les points sous-jacents pour chaque grappe. Faites attention si la grappe représente un très grand nombre de points. false

Analyse des requêtes d'événements

La ressource analytics/events/query vous permet d'effectuer des requêtes sur des événements capturés. Cette ressource n'effectue pas d'agrégation ; elle vous permet plutôt de lancer des requêtes et de filtrer les informations sur les événements.

/api/analytics/events/query

Vous pouvez spécifier un nombre quelconque de dimensions et de filtres dans une requête. Les identifiants d'éléments de dimension peuvent faire référence à des éléments de données, des attributs de personnes, des identifiants de personnes, des périodes fixes et relatives et des unités d'organisation. Les dimensions peuvent éventuellement être accompagnées d'un opérateur de requête et d'un filtre. Les requêtes d'événements doivent respecter le format décrit ci-dessous.

/api/analytics/events/query/<program-id>?startDate=yyyy-MM-dd&endDate=yyyy-MM-dd
  &dimension=ou:<ou-id>;<ou-id>&dimension=<item-id>&dimension=<item-id>:<operator>:<filter>

Par exemple, pour extraire des événements du programme "Morbidité et mortalité chez les patients hospitalisés" entre janvier et octobre 2016, où les éléments de données "Sexe" et "Âge" sont inclus et où la dimension "Âge" est filtrée sur "18 ans", vous pouvez utiliser la requête suivante :

/api/analytics/events/query/eBAyeGv0exc?startDate=2016-01-01&endDate=2016-10-31
  &dimension=ou:O6uvpzGd5pu;fdc6uOvgoji&dimension=oZg33kd9taw&dimension=qrur9Dvnyt5:EQ:18

Pour extraire les événements de l'étape "Naissance" du "Programme pour les enfants" entre mars et décembre 2016, où l'élément de données "Poids" est filtré pour les valeurs supérieures à 2000, vous pouvez utiliser ce qui suit :

/api/analytics/events/query/IpHINAT79UW?stage=A03MvHHogjR&startDate=2016-03-01
  &endDate=2016-12-31&dimension=ou:O6uvpzGd5pu&dimension=UXz7xuGCEhU:GT:2000

Le tri peut être appliqué à la requête pour la date de l'événement et toutes les dimensions. Pour effectuer un tri par ordre décroissant sur la date de l'événement et par ordre croissant sur la dimension de l'élément de données "Âge", vous pouvez utiliser ceci :

/api/analytics/events/query/eBAyeGv0exc?startDate=2016-01-01&endDate=2016-10-31
  &dimension=ou:O6uvpzGd5pu&dimension=qrur9Dvnyt5&desc=EVENTDATE&asc=qrur9Dvnyt5

Vous pouvez appliquer la pagination à la requête à travers les paramètres de numéro de page et de taille de page. Si le numéro de page est spécifié mais que la taille de la page ne l'est pas, la taille de page "50" sera utilisée. Si la taille de la page est spécifiée mais que le numéro de page ne l'est pas, le numéro de page "1" sera utilisé. Pour obtenir la troisième page de la réponse avec une taille de page de 20, vous pouvez utiliser la requête suivante :

/api/analytics/events/query/eBAyeGv0exc?startDate=2016-01-01&endDate=2016-10-31
  &dimension=ou:O6uvpzGd5pu&dimension=qrur9Dvnyt5&page=3&pageSize=20

Filtering

Des filtres peuvent être appliqués aux éléments de données, aux attributs de personnes et aux identifiants de personnes. Le filtrage est effectué par le biais de la valeur du paramètre de la requête dans le format suivant :

&dimension=<item-id>:<operator>:<filter-value>

À titre d'exemple, vous pouvez filtrer l'élément de données "Poids" pour les valeurs supérieures à 2000 et inférieures à 4000 comme suit :

&dimension=UXz7xuGCEhU:GT:2000&dimension=UXz7xuGCEhU:LT:4000

Vous pouvez filtrer l'élément de données "Âge" pour plusieurs âges spécifiques à l'aide de l'opérateur IN comme dans l'exemple suivant :

&dimension=qrur9Dvnyt5:IN:18;19;20

Vous pouvez spécifier plusieurs filtres pour un élément donné en répétant les composants de l'opérateur et du filtre, tous séparés par des points-virgules :

&dimension=qrur9Dvnyt5:GT:5:LT:15

Les opérateurs disponibles sont répertoriés ci-dessous.

Tableau : Opérateurs de filtre

Opérateur Description
EQ Egal à
!EQ Pas égal à
IEQ Égal à, en ignorant la casse
!IEQ Différent de, ignorant la casse
GT Supérieur à
GE Supérieur ou égal à
LT Inférieur à
LE inférieur ou égal à
NE Pas égal à
LIKE Pareil (correspondance textuelle)
!LIKE Pas pareil (correspondance textuelle)
ILIKE Pareil ; ignore la casse (correspondance textuelle)
!ILIKE Pas pareil ; ignore la casse (correspondance textuelle)
IN Égal à l'une des multiples valeurs séparées par ";"

Time Field Filtering

Par défaut, les points d'extrémité query (requête) filtrent les périodes sur la base de eventDate (date de l'événement). Il est également possible de filtrer les entrées en fonction de lastUpdated (dernière mise à jour) ou de schedule (programmation), en utilisant le paramètre de requête timeField (champ de temps). Par exemple :

&timeField=LAST_UPDATED
&timeField=SCHEDULED_DATE

Enhanced conditions

Par défaut, enhancedConditions (conditions améliorées) est défini sur false. Cela signifie que toutes les conditions exprimées dans dimension et filtre sont considérées comme des conditions AND (et). Par exemple :

dimension=a:GT:20:LT:40&dimension=b:GT:1:LT:5

se traduit par la condition logique suivante :

a>20 and a<40 and b>1 and b<5

Cependant, dans certains cas, il peut être nécessaire d'avoir plus de contrôle sur les conditions. Vous pouvez activer ce contrôle en définissant le paramètre de requête enhancedConditions sur true. En procédant ainsi, un client peut utiliser un séparateur spécial _OR_ pour joindre des conditions en utilisant l'opérateur logique OR (ou).

Exemple:

dimension=a:GT:20:LT:40_OR_b:GT:1:LT:5&dimension=c:EQ:test

se traduit par la condition logique suivante :

((a>20 and a<40) or (b>1 and b<5)) and c = "test"

Response formats

Le format de représentation de réponse par défaut est JSON. Les requêtes doivent utiliser la méthode HTTP GET. Les formats de réponse suivants sont pris en charge.

  • json (application/json)

  • jsonp (application/javascript)

  • xls (application/vnd.ms-excel)

À titre d'exemple, pour obtenir une réponse au format Excel, vous pouvez utiliser une extension de fichier dans l'URL de la requête comme ceci :

/api/analytics/events/query/eBAyeGv0exc.xls?startDate=2016-01-01&endDate=2016-10-31
  &dimension=ou:O6uvpzGd5pu&dimension=oZg33kd9taw&dimension=qrur9Dvnyt5

Vous pouvez définir le paramètre de requête hierarchyMeta (hiérarchie de métadonnées) sur "true" pour inclure les noms de toutes les unités d'organisation ascendantes dans la section métadonnées de la réponse :

/api/analytics/events/query/eBAyeGv0exc?startDate=2016-01-01&endDate=2016-10-31
  &dimension=ou:YuQRtpLP10I&dimension=qrur9Dvnyt5:EQ:50&hierarchyMeta=true

Le format JSON de réponse par défaut ressemblera à ceci :

{
  "headers": [
    {
      "name": "psi",
      "column": "Event",
      "valueType": "TEXT",
      "hidden": false,
      "meta": false
    },
    {
      "name": "ps",
      "column": "Program stage",
      "valueType": "TEXT",
      "hidden": false,
      "meta": false
    },
    {
      "name": "eventdate",
      "column": "Event date",
      "valueType": "TEXT",
      "hidden": false,
      "meta": false
    },
    {
      "name": "storedby",
      "column": "Stored by",
      "valueType": "TEXT",
      "hidden": false,
      "meta": true
    },
    {
      "name": "lastupdated",
      "column": "Last Updated",
      "valueType": "DATE",
      "hidden": false,
      "meta": true
    },
    {
      "name": "createdbydisplayname",
      "column": "Created by (display name)",
      "valueType": "TEXT",
      "hidden": false,
      "meta": true
    },
    {
      "name": "lastupdatedbydisplayname",
      "column": "Last updated by (display name)",
      "valueType": "TEXT",
      "hidden": false,
      "meta": true
    },
    {
      "name": "coordinates",
      "column": "Coordinates",
      "valueType": "COORDINATE",
      "hidden": false,
      "meta": false
    },
    {
      "name": "ouname",
      "column": "Organisation unit name",
      "valueType": "TEXT",
      "hidden": false,
      "meta": false
    },
    {
      "name": "oucode",
      "column": "Organisation unit code",
      "valueType": "TEXT",
      "hidden": false,
      "meta": false
    },
    {
      "name": "ou",
      "column": "Organisation unit",
      "valueType": "TEXT",
      "hidden": false,
      "meta": false
    },
    {
      "name": "oZg33kd9taw",
      "column": "Gender",
      "valueType": "TEXT",
      "hidden": false,
      "meta": false
    },
    {
      "name": "qrur9Dvnyt5",
      "column": "Age",
      "valueType": "TEXT",
      "hidden": false,
      "meta": false
    }
  ],
  "metaData": {
    "names": {
      "qrur9Dvnyt5": "Age",
      "eBAyeGv0exc": "Inpatient morbidity and mortality",
      "ImspTQPwCqd": "Sierra Leone",
      "O6uvpzGd5pu": "Bo",
      "YuQRtpLP10I": "Badjia",
      "oZg33kd9taw": "Gender"
    },
    "ouHierarchy": {
      "YuQRtpLP10I": "/ImspTQPwCqd/O6uvpzGd5pu"
    }
  },
  "width": 8,
  "height": 4,
  "rows": [
    [
      "yx9IDINf82o",
      "Zj7UnCAulEk",
      "2016-08-05",
      "system",
      "2018-08-07",
      "[5.12, 1.23]",
      "Ngelehun",
      "OU_559",
      "YuQRtpLP10I",
      "Female",
      "50"
    ],
    [
      "IPNa7AsCyFt",
      "Zj7UnCAulEk",
      "2016-06-12",
      "system",
      "2018-08-07",
      "[5.22, 1.43]",
      "Ngelehun",
      "OU_559",
      "YuQRtpLP10I",
      "Female",
      "50"
    ],
    [
      "ZY9JL9dkhD2",
      "Zj7UnCAulEk",
      "2016-06-15",
      "system",
      "2018-08-07",
      "[5.42, 1.33]",
      "Ngelehun",
      "OU_559",
      "YuQRtpLP10I",
      "Female",
      "50"
    ],
    [
      "MYvh4WAUdWt",
      "Zj7UnCAulEk",
      "2016-06-16",
      "system",
      "2018-08-07",
      "[5.32, 1.53]",
      "Ngelehun",
      "OU_559",
      "YuQRtpLP10I",
      "Female",
      "50"
    ]
  ]
}

La section en-têtes de la réponse décrit le contenu du résultat de la requête. L'identifiant unique de l'événement, l'identifiant de l'étape de programme, la date de l'événement, le nom de l'unité d'organisation, le code de l'unité d'organisation et l'identifiant de l'unité d'organisation apparaissent en tant que six premières dimensions dans la réponse et seront toujours présents. Viennent ensuite les éléments de données, les attributs et identifiants de personnes qui ont été définis comme dimensions dans la demande ; il s'agit dans ce cas précis des dimensions d'éléments de données "Sexe" et "Âge". L'identifiant de l'élément de dimension se trouve dans la propriété "nom" et une description lisible de la dimension dans la propriété "colonne" de la section d'en-têtes.

La section metaData, objet ou (unité d'organisation), contient les identifiants de toutes les unités d'organisation présentes dans la réponse, mis en correspondance avec une chaîne qui représente la hiérarchie. Cette chaîne hiérarchique énumère les identifiants des ascendants de l'unité d'organisation en commençant par la racine. L'objet noms contient les identifiants de tous les éléments de la réponse mis en correspondance avec leurs noms.

La section lignes contient les événements produits par la requête. Chaque ligne représente exactement un événement.

Pour que la ressource analytique des événements génère les données dans un tableau tout fait, vous pouvez renseigner les paramètres lignes et colonnes avec les identifiants des dimensions requises. Ces identifiants doivent être séparés par des points-virgules ; elles serviront de valeurs pour indiquer quelles dimensions doivent être utilisées comme colonnes ou lignes du tableau. Au lieu de générer une source de données simples et normalisées, la ressource analytique d'événements va maintenant générer les données dans un tableau. Dans la requête, les dimensions de colonnes et de lignes doivent figurer en tant que dimensions de données (et non en tant que filtre). Une telle requête peut ressembler à ceci :

/api/analytics.html+css?dimension=dx:cYeuwXTCPkU;fbfJHSPpUQD&dimension=pe:WEEKS_THIS_YEAR
  &filter=ou:ImspTQPwCqd&displayProperty=SHORTNAME&columns=dx&rows=pe

Analyse agrégée des événements

La ressource /analytics/events/aggregate vous permet d'extraire des nombres agrégés d'événements capturés dans DHIS2. Cette ressource vous permet d'extraire des données agrégées liés à un programme spécifique ou éventuellement à une étape de programme. Elle vous permet également d'effectuer des filtrages en fonction de toute dimension d'événement.

/api/analytics/events/aggregate

La ressource d'agrégation des événements ne renvoie pas les informations relatives à l'événement lui-même, mais plutôt les nombres agrégés d'événements correspondant à la requête. Les dimensions d'événements comprennent les éléments de données, les attributs de personnes, les identifiants de personnes, les périodes et les unités d'organisation. Les requêtes d'agrégation des événements doivent respecter le format décrit ci-dessous.

/api/analytics/events/aggregate/<program-id>?startDate=yyyy-MM-dd&endDate=yyyy-MM-dd
  &dimension=ou:<ou-id>;<ou-id>&dimension=<item-id>&dimension=<item-id>:<operator>:<filter>

Par exemple, pour extraire des nombres agrégés des événements du programme "Morbidité et mortalité chez les patients hospitalisés" entre janvier et octobre 2016, où les éléments de données "Sexe" et "Âge" sont inclus, avec l'élément de dimension "Âge" filtré sur "18 ans" et l'élément de dimension "Sexe" filtré sur "Femme", vous pouvez utiliser la requête suivante :

/api/analytics/events/aggregate/eBAyeGv0exc?startDate=2016-01-01&endDate=2016-10-31
  &dimension=ou:O6uvpzGd5pu&dimension=oZg33kd9taw:EQ:Female&dimension=qrur9Dvnyt5:GT:50

Pour extraire des données relatives à des périodes fixes et relatives au lieu des dates de début et de fin, dans ce cas, mai 2016 et les 12 derniers mois, et l'unité d'organisation associée à l'utilisateur actuel, vous pouvez utiliser la requête suivante :

/api/analytics/events/aggregate/eBAyeGv0exc?dimension=pe:201605;LAST_12_MONTHS
  &dimension=ou:USER_ORGUNIT;fdc6uOvgo7ji&dimension=oZg33kd9taw

Afin de spécifier "Femme" comme filtre pour le "Sexe" dans la réponse, ce qui signifie que "Sexe" ne fera pas partie de la réponse mais filtrera les nombres agrégés qu'il contient, vous pouvez utiliser la syntaxe suivante :

/api/analytics/events/aggregate/eBAyeGv0exc?dimension=pe:2016;
  &dimension=ou:O6uvpzGd5pu&filter=oZg33kd9taw:EQ:Female

Pour spécifier l'unité d'organisation "Bo" et la période "2016" comme filtres, et le "Mode de sortie" et le "Sexe" comme dimensions, où le "Sexe" est filtré en fonction de l'élément "Masculin", vous pouvez utiliser la requête suivante :

/api/analytics/events/aggregate/eBAyeGv0exc?filter=pe:2016&filter=ou:O6uvpzGd5pu
  &dimension=fWIAEtYVEGk&dimension=oZg33kd9taw:EQ:Male

Pour créer un "rapport de Top 3" pour le Mode de sortie, vous pouvez utiliser les paramètres de requête "limit" (limite) et sortOrder (ordre de tri) de la manière suivante :

/api/analytics/events/aggregate/eBAyeGv0exc?filter=pe:2016&filter=ou:O6uvpzGd5pu
  &dimension=fWIAEtYVEGk&limit=3&sortOrder=DESC

Pour spécifier une dimension de valeur avec un type d'agrégation correspondant, vous pouvez utiliser les paramètres de requête "value" (valeur) et "aggregationType" (type d'aggrégation). En spécifiant une dimension de valeur, le moteur d'analyse renverra des valeurs agrégées pour les valeurs de cette dimension dans la réponse, plutôt que des nombres d'événements.

/api/analytics/events/aggregate/eBAyeGv0exc.json?stage=Zj7UnCAulEk
  &dimension=ou:ImspTQPwCqd&dimension=pe:LAST_12_MONTHS&dimension=fWIAEtYVEGk
  &value=qrur9Dvnyt5&aggregationType=AVERAGE

Pour que l'agrégation des analyses d'événements se fasse en fonction d'un élément de données ou d'un attribut spécifique de type 'date' ou 'date et heure', vous pouvez utiliser le paramètre timeField (champ de temps) :

/api/analytics/events/aggregate/IpHINAT79UW.json?dimension=ou:ImspTQPwCqd
  &dimension=pe:LAST_12_MONTHS&dimension=cejWyOfXge6&stage=A03MvHHogjR
  &timeField=ENROLLMENT_DATE

Pour que l'agrégation des analyses d'événements se fasse en fonction d'un élément de données ou d'un attribut spécifique de type 'unité d'organisation', vous pouvez utiliser le paramètre orgUnitField (champ d'unité d'organisation) :

/api/analytics/events/aggregate/eBAyeGv0exc.json?dimension=ou:ImspTQPwCqd
  &dimension=pe:THIS_YEAR&dimension=oZg33kd9taw&stage=Zj7UnCAulEk
  &orgUnitField=S33cRBsnXPo

Voici quelques valeurs possibles pour le paramètre orgUnitField :

orgUnitField Description
<Attribute ID> ID d'un attribut de type de valeur 'unité d'organisation'
<Data element ID> ID d'un élément de données de type de valeur 'unité d'organisation'
ENREGISTREMENT L'unité d'organisation dans laquelle l'instance d'entité suivie a été enregistrée (créée)
ENROLLMENT L'unité d'organisation dans laquelle l'instance d'entité suivie a été inscrite au programme
OWNER_AT_START (propriétaire au début) L'unité d'organisation propriétaire de l'instance d'entité suivie au début de la période de déclaration.
OWNER_AT_END (propriétaire à la fin) L'unité d'organisation propriétaire de l'instance d'entité suivie à la fin de la période de déclaration.

Ranges / legend sets

Pour les requêtes d'agrégation, vous pouvez spécifier une plage ou un ensemble de légendes pour les éléments de données numériques et les dimensions d'attributs. L'objectif est de regrouper les valeurs numériques dans des plages. Par exemple, au lieu de générer des données pour un élément de données "Âge" pour des années différentes, vous pouvez regrouper les informations par tranche d'âge. Pour ce faire, l'élément de données ou l'attribut doit être associé à l'ensemble de légendes. Le format est décrit ci-dessous :

?dimension=<item-id>-<legend-set-id>

Voici donc un exemple :

/api/analytics/events/aggregate/eBAyeGv0exc.json?stage=Zj7UnCAulEk
  &dimension=qrur9Dvnyt5-Yf6UHoPkdS6&dimension=ou:ImspTQPwCqd&dimension=pe:LAST_MONTH

Response formats

Le format de représentation de réponse par défaut est JSON. Les requêtes doivent utiliser la méthode HTTP GET. La réponse va ressembler à ceci :

{
  "headers": [
    {
      "name": "oZg33kd9taw",
      "column": "Gender",
      "valueType": "TEXT",
      "meta": false
    },
    {
      "name": "qrur9Dvnyt5",
      "column": "Age",
      "valueType": "TEXT",
      "meta": false
    },
    {
      "name": "pe",
      "column": "Period",
      "valueType": "TEXT",
      "meta": false
    },
    {
      "name": "ou",
      "column": "Organisation unit",
      "valueType": "TEXT",
      "meta": false
    },
    {
      "name": "value",
      "column": "Value",
      "valueType": "TEXT",
      "meta": false
    }
  ],
  "metaData": {
    "names": {
      "eBAyeGv0exc": "Inpatient morbidity and mortality"
    }
  },
  "width": 5,
  "height": 39,
  "rows": [
    [
      "Female",
      "95",
      "201605",
      "O6uvpzGd5pu",
      "2"
    ],
    [
      "Female",
      "63",
      "201605",
      "O6uvpzGd5pu",
      "2"
    ],
    [
      "Female",
      "67",
      "201605",
      "O6uvpzGd5pu",
      "1"
    ],
    [
      "Female",
      "71",
      "201605",
      "O6uvpzGd5pu",
      "1"
    ],
    [
      "Female",
      "75",
      "201605",
      "O6uvpzGd5pu",
      "14"
    ],
    [
      "Female",
      "73",
      "201605",
      "O6uvpzGd5pu",
      "5"
    ]
  ]
}

La limite maximale de lignes que peut comporter une réponse est de 10 000. Si la requête produit plus que la limite maximale, un code de statut 409 Conflict sera renvoyé.

Analyse des événements en grappes{ #webapi_event_clustering_analytics }

La ressource analytics/events/cluster fournit des données géospatiales en grappes. Une requête se présente comme suit :

/api/analytics/events/cluster/eBAyeGv0exc?startDate=2016-01-01&endDate=2016-10-31
  &dimension=ou:LEVEL-2&clusterSize=100000
  &bbox=-13.2682125,7.3721619,-10.4261178,9.904012&includeClusterPoints=false

La réponse fournit le nombre de points sous-jacents, le point central et l'étendue de chaque grappe. Si le paramètre de requête includeClusterPoints (inclure des points en grappe) est défini sur 'true' (vrai), une chaîne contenant les identifiants des événements sous-jacents, séparés par des virgules, sera incluse dans la réponse. Voici un exemple de réponse :

{
  "headers": [
    {
      "name": "count",
      "column": "Count",
      "valueType": "INTEGER",
      "meta": false
    },
    {
      "name": "center",
      "column": "Center",
      "valueType": "TEXT",
      "meta": false
    },
    {
      "name": "extent",
      "column": "Extent",
      "valueType": "TEXT",
      "meta": false
    },
    {
      "name": "points",
      "column": "Points",
      "valueType": "TEXT",
      "meta": false
    }
  ],
  "width": 3,
  "height": 4,
  "rows": [
    [
      "3",
      "POINT(-13.15818 8.47567)",
      "BOX(-13.26821 8.4St7215,-13.08711 8.47807)",
      ""
    ],
    [
      "9",
      "POINT(-13.11184 8.66424)",
      "BOX(-13.24982 8.51961,-13.05816 8.87696)",
      ""
    ],
    [
      "1",
      "POINT(-12.46144 7.50597)",
      "BOX(-12.46144 7.50597,-12.46144 7.50597)",
      ""
    ],
    [
      "7",
      "POINT(-12.47964 8.21533)",
      "BOX(-12.91769 7.66775,-12.21011 8.49713)",
      ""
    ]
  ]
}

Analyse du nombre d'événements et de la portée

La ressource analytics/events/count est utilisée pour les requêtes de géométrie afin d'obtenir le nombre et l'étendue (zone de délimitation) des événements pour une requête spécifique. La syntaxe de la requête est identique à celle de la ressource events/query. Voici l'exemple d'une requête :

/api/analytics/events/count/eBAyeGv0exc?startDate=2016-01-01
  &endDate=2016-10-31&dimension=ou:O6uvpzGd5pu

La réponse va fournir le nombre et l'étendue dans le format JSON :

{
  "extent": "BOX(-13.2682125910096 7.38679562779441,-10.4261178860988 9.90401290212795)",
  "count": 59
}

Contraintes et validation

Les paramètres d'entrée que vous pouvez fournir à la ressource d'analyse des événements sont soumis à plusieurs contraintes. Si l'une de ces contraintes n'est pas respectée, l'API renvoie une réponse 409 Conflict avec un message semblable à celui-ci :

{
  "httpStatus": "Conflict",
  "httpStatusCode": 409,
  "status": "ERROR",
  "message": "At least one organisation unit must be specified",
  "errorCode": "E7200"
}

Les erreurs de validation possibles pour l'API d'analyse d'événements sont décrites dans le tableau ci-dessous.

Code d'erreur Message
E7200 Au moins une unité d'organisation doit être spécifiée
E7201 Les dimensions ne peuvent pas être spécifiées plus d'une fois
E7202 Les éléments de la requête ne peuvent pas être spécifiés plus d'une fois
E7203 Une dimension de valeur ne peut pas être spécifiée en tant qu'élément ou filtre d'élément.
E7204 La dimension de valeur ou les données agrégées doivent être spécifiées lorsque le type d'agrégation est spécifié.
E7205 Les dates de début et de fin ou au moins une période doivent être spécifiées.
E7206 La date de début est postérieure à la date de fin
E7207 Le numéro de page doit être un nombre positif
E7208 La taille de la page doit être zéro ou un nombre positif
E7209 La limite est supérieure à la limite maximale
E7210 Le champ de l'heure n'est pas valide
E7211 Le champ de l'unité d'organisation n'est pas valide
E7212 La taille de la grappe doit être un nombre positif
E7213 La zone de délimitation n'est pas valide ; elle doit être au format : 'min-lng,min-lat,max-lng,max-lat'
E7214 Le champ de la grappe doit être renseigné lorsque la zone de délimitation ou la taille de la grappe sont spécifiées.
E7215 L'élément de requête ne peut pas spécifier à la fois un ensemble de légendes et un ensemble d'options.
E7216 L'élément de requête doit pouvoir être agrégé lorsqu'il est utilisé dans une requête agrégée.
E7217 L'utilisateur n'est pas autorisé à consulter les données d'analyse des événements
E7218 Les bases de données spatiales ne sont pas activées
E7219 L'élément de données doit être de type "coordonnée" pour pouvoir être utilisé comme champ de coordonnées.
E7220 L'attribut doit être de type "coordonnée" pour pouvoir être utilisé comme champ de coordonnées.
E7221 Le champ de coordonnées n'est pas valide
E7222 L'élément de requête ou le filtre n'est pas valide
E7223 La valeur ne fait pas référence à un élément de données ou à un attribut qui sont numériques et font partie du programme.
E7224 L'identifiant d'élément ne fait référence à aucun élément de données, attribut ou indicateur qui fait partie du programme.
E7225 L'étape de programme est obligatoire pour les dimensions de l'élément de données, dans les requêtes d'analyse d'inscriptions.
E7226 La dimension n'est pas un élément de requête valide
E7227 Le type d'entité 'relation' n'est pas pris en charge
E7228 Le champ de coordonnées de repli n'est pas valide
E7229 L'opérateur n'autorise pas les valeurs manquantes
E7230 Header param does not exist
E7231 Legacy can be updated only through event visualizations
E7232 Le champ de coordonnées de repli n'est pas valide
E7234 Query filter is not valid for query item value type
E7235 Either programId or programStageId must be specified
E7236 Program stage is not associated to program
E7237 Sorting must have a valid dimension and a direction
E7238 Sorting dimension is not a column
E7239 Invalid operator for 'null' value
E7240 Event query with org unit ownership does not support time fields
E7241 Stage parameter cannot be used with stage-specific dimension identifiers
E7242 Period dimension cannot be used with stage-specific date dimensions (ie: EVENT_DATE, SCHEDULED_DATE)
E7243 Duplicate stage dimension identifier
E7244 Multiple stages in stage-specific dimensions are not allowed
E7245 Program stage does not belong to program

Analyse des inscriptions

L'API d'analyse des inscriptions vous permet d'accéder aux données agrégées des événements et d'interroger les inscriptions avec leurs données d'événements capturées dans DHIS2. Cette ressource vous permet d'extraire des données d'un programme à partir des étapes du programme et des éléments de données, en plus des attributs d'entités suivies. Lorsque vous effectuez une requête sur des données d'événements pour des étapes spécifiques d'un programme au sein de chaque inscription, les valeurs des éléments de données pour chaque étape du programme seront renvoyées dans une même ligne dans la réponse de l'API. Si vous effectuez une requête sur un élément de données dans une étape répétable du programme, la valeur la plus récente de l'élément de données sera utilisée pour cet élément de données dans la réponse de l'API.

Dimensions et éléments

Les dimensions d'inscription comprennent les éléments de données, les attributs, les unités d'organisation et les périodes. La ressource d'analyse des requêtes renvoie simplement les inscriptions correspondant à un ensemble de critères et n'effectue aucune agrégation.

Tableau : Dimensions dl'inscription

Dimension Identifiant de la dimension Description
Éléments de données dans les étapes du programme <program stage id>.<data element id> Les identifiants des éléments de données doivent inclure l'étape de programme lors de la requête de données pour les inscriptions.
dimension=edqlbukwRfQ.vANAXwtLwcT
Attributs <id> Identifiants d'attribut
Périodes pe Périodes ISO et périodes relatives, voir "format de date et de période"
Unités d’organisation ou Identifiants d'unité d'organisation et mots-clés USER_ORGUNIT, USER_ORGUNIT_CHILDREN, USER_ORGUNIT_GRANDCHILDREN, LEVEL-<level> et OU_GROUP-<group-id>

Repeatable stages

L'identifiant de l'élément de données doit inclure l'étape de programme. L'étape de programme peut être répétée. Par exemple, la dimension edqlbukwRfQ.vANAXwtLwcT peut faire référence à une étape de programme répétable. L'élément de données de cette étape est accessible via les paramètres d'index (entourés de [ ]).

Tableau : Possibilités d'indexation des étapes répétables

Dimension Paramètres d'index La valeur de l'élément de données est
edqlbukwRfQ.vANAXwtLwcT N/A date de la dernière exécution
edqlbukwRfQ[0].vANAXwtLwcT 0 date de la dernière exécution
dqlbukwRfQ[-2].vANAXwtLwcT -2 deuxième à partir de la dernière date d'exécution
dqlbukwRfQ[1].vANAXwtLwcT 1 date de la première exécution
dqlbukwRfQ[3].vANAXwtLwcT 3 date de la troisième exécution

Avertissement : L'indexation d'une étape de programme non répétable entraîne une erreur de validation des paramètres.

Analyse des requêtes d'inscription

La ressource analytics/enrollments/query vous permet d'effectuer des requêtes sur des inscriptions capturés. Cette ressource n'effectue pas d'agrégation ; elle vous permet plutôt de lancer des requêtes et de filtrer les informations sur les inscriptions.

/api/analytics/enrollments/query

Vous pouvez spécifier un nombre quelconque de dimensions et de filtres dans une requête. Les identifiants d'éléments de dimension peuvent faire référence à tout élément de données dans des étapes de programme, des attributs de personnes, des périodes fixes et relatives et des unités d'organisation. Les dimensions peuvent éventuellement être accompagnées d'un opérateur de requête et d'un filtre. Les requêtes d'inscription doivent respecter le format décrit ci-dessous.

/api/analytics/enrollments/query/<program-id>?startDate=yyyy-MM-dd&endDate=yyyy-MM-dd
  &dimension=ou:<ou-id>;<ou-id>&dimension=<item-id>&dimension=<item-id>:<operator>:<filter>

Par exemple, pour extraire des inscriptions au programme "Soins prénatals" à partir de janvier 2019, où le "Prénom" est tiré des attributs, les éléments de données "Maladies chroniques" et "Tabagisme" sont inclus à partir de la première étape du programme, la "Valeur de l'hémoglobine" à partir de l'étape suivante du programme, et où seules les femmes atteintes de "Maladies chroniques" sont incluses, vous pouvez utiliser la requête suivante :

/api/analytics/enrollments/query/WSGAb5XwJ3Y.json
  ?dimension=ou:ImspTQPwCqd
  &dimension=w75KJ2mc4zz
  &dimension=WZbXY0S00lP.de0FEHSIoxh:eq:1
  &dimension=w75KJ2mc4zz
  &dimension=WZbXY0S00lP.sWoqcoByYmD
  &dimension=edqlbukwRfQ.vANAXwtLwcT
  &startDate=2019-01-01&endDate=2019-01-31

Pour extraire des inscriptions au programme "Soins prénatals" à partir du mois dernier (par rapport au moment où la requête est effectuée), où les éléments de données "Maladies chroniques" et "Tabagisme" sont inclus à partir de la première étape du programme, et "Valeur de l'hémoglobine" à partir de l'étape de suivi du programme, et où seules les femmes fumeuses avec un taux d'hémoglobine inférieur à 20 sont prises en compte :

/api/analytics/enrollments/query/WSGAb5XwJ3Y.json
  ?dimension=ou:ImspTQPwCqd
  &dimension=WZbXY0S00lP.de0FEHSIoxh&dimension=w75KJ2mc4zz
  &dimension=WZbXY0S00lP.sWoqcoByYmD:eq:1
  &dimension=edqlbukwRfQ.vANAXwtLwcT:lt:20
  &dimension=pe:LAST_MONTH

Un tri peut être appliqué à la requête pour les dates d'inscription et d'incident :

/api/analytics/enrollments/query/WSGAb5XwJ3Y.xls
  ?dimension=ou:ImspTQPwCqd
  &columns=w75KJ2mc4zz&dimension=WZbXY0S00lP.sWoqcoByYmD
  &dimension=pe:LAST_MONTH
  &stage=WZbXY0S00lP&pageSize=10
  &page=1
  &asc=ENROLLMENTDATE
  &ouMode=DESCENDANTS

Vous pouvez appliquer la pagination à la requête à travers les paramètres de numéro de page et de taille de page. Si le numéro de page est spécifié mais que la taille de la page ne l'est pas, la taille de page "50" sera utilisée. Si la taille de la page est spécifiée mais que le numéro de page ne l'est pas, le numéro de page "1" sera utilisé. Pour obtenir la deuxième page de la réponse avec une taille de page de 10, vous pouvez utiliser la requête suivante :

/api/analytics/enrollments/query/WSGAb5XwJ3Y.json
  ?dimension=ou:ImspTQPwCqd
  &dimension=WZbXY0S00lP.de0FEHSIoxh
  &dimension=w75KJ2mc4zz
  &dimension=pe:LAST_MONTH
  &dimension=WZbXY0S00lP.sWoqcoByYmD&pageSize=10
  &page=2

Filtering

Des filtres peuvent être appliqués aux éléments de données, aux attributs de personnes et aux identifiants de personnes. Le filtrage est effectué par le biais de la valeur du paramètre de la requête dans le format suivant :

&dimension=<item-id>:<operator>:<filter-value>

À titre d'exemple, vous pouvez filtrer l'élément de données "Poids" pour les valeurs supérieures à 2000 et inférieures à 4000 comme suit :

&dimension=WZbXY0S00lP.UXz7xuGCEhU:GT:2000&dimension=WZbXY0S00lP.UXz7xuGCEhU:LT:4000

Vous pouvez filtrer l'attribut "Âge" pour plusieurs âges spécifiques à l'aide de l'opérateur IN comme dans l'exemple suivant :

&dimension=qrur9Dvnyt5:IN:18;19;20

Vous pouvez spécifier plusieurs filtres pour un élément donné en répétant les composants de l'opérateur et du filtre, tous séparés par des points-virgules :

&dimension=qrur9Dvnyt5:GT:5:LT:15

Time Field Filtering

Par défaut, les points d'extrémité query (requête) filtrent les périodes sur la base de enrollmentDate (date d'inscription). Il est également possible de filtrer les entrées en fonction de lastUpdated (dernière mise à jour) en utilisant le paramètre de requête timeField (champ de temps). Par exemple :

&timeField=LAST_UPDATED
NV keyword

Un mot-clé spécial NV peut être utilisé pour filtrer les valeurs null (nulles).

Le filtrage par l'ÂGE est nul

&dimension=qrur9Dvnyt5:EQ:NV

Le filtrage par l'ÂGE est non nul

&dimension=qrur9Dvnyt5:NE:NV

Le filtrage par l'ÂGE est 18, 19 ou est nul

&dimension=qrur9Dvnyt5:IN:18;19;NV

NV peut être utilisé avec les opérateurs EQ, NE et IN.

Operators

Les opérateurs disponibles sont répertoriés ci-dessous.

Tableau : Opérateurs de filtre

Opérateur Description
EQ Egal à
GT Supérieur à
GE Supérieur ou égal à
LT Inférieur à
LE inférieur ou égal à
NE Pas égal à
LIKE Pareil (correspondance textuelle)
IN Égal à l'une des multiples valeurs séparées par ";"

Paramètres de requête

L'API de requête d'inscription analytique vous permet de spécifier un ensemble de paramètres de requête.

Tableau : Paramètres de requête pour le point d'extrémité de la requête d'inscription

Paramètre de requête Obligatoire Description Options (par défaut en premier)
program Oui Identifiant du programme. Tout identifiant de programme
startDate Non Date de début des inscriptions. Les dates doivent être au format aaaa-MM-jj
endDate Non Date de fin des inscriptions. Les dates doivent être au format aaaa-MM-jj
dimension Oui L'identifiant de dimension comprend les éléments de données, les attributs, les indicateurs de programme, les périodes, les unités d'organisation et les ensembles de groupes d'unités d'organisation. Le paramètre peut être répété autant de fois que nécessaire. Des filtres d'éléments peuvent être appliqués à une dimension selon le format <item-id>:<operator>:<filter>. Les valeurs des filtres ne sont pas sensibles à la casse. Les opérateurs peuvent être EQ | GT| GE| LT| LE| NE | COMME | DANS
filter Non L'identifiant de dimension comprend les éléments de données, les attributs, les périodes, les unités d'organisation et les ensembles de groupes d'unités d'organisation. Le paramètre peut être répété autant de fois que nécessaire. Des filtres d'éléments peuvent être appliqués à une dimension selon le format <item-id>:<operator>:<filter>. Les valeurs des filtres ne sont pas sensibles à la casse.
programStatus Non Spécifie le statut d’inscription des inscriptions à inclure. ACTIF | TERMINÉ | ANNULÉ
relativePeriodDate (Date de la période relative) chaîne Non Identifiant de date, par exemple : "2016-01-01". Il remplace la date de début de la période relative
ouMode Non The mode of selecting organisation units. Default is DESCENDANTS, meaning all sub units in the hierarchy. CHILDREN refers to immediate children in the hierarchy; SELECTED refers to the selected organisation units only. More details here DESCENDANTS, SUBORDONNÉES, SÉLECTIONNÉES
asc Non Permet de trier les dimensions dans l'ordre croissant ; peut concerner la date d'inscription, la date d'incident, le nom et le code de l'unité d'organisation. ouname | programstatus | createdbydisplayname | lastupdatedbydisplayname | enrollmentdate | incidentdate | lastupdated | item identifier
desc Non Permet de trier les dimensions dans l'ordre décroissant ; peut concerner la date d'inscription, la date d'incident, le nom et le code de l'unité d'organisation. ouname | programstatus | createdbydisplayname | lastupdatedbydisplayname | enrollmentdate | incidentdate | lastupdated | item identifier
coordinatesOnly (coordonnées uniquement) Non Indique s'il faut uniquement renvoyer les inscriptions qui ont des coordonnées. false
en-têtes Non Le nom des en-têtes à renvoyer dans la réponse. Un ou plusieurs noms d'en-têtes séparés par une virgule
page Non Le numéro de page. La page par défaut est 1. Valeur numérique positive
pageSize Non La taille de la page. La taille par défaut est de 50 éléments par page. Zéro ou valeur positive
timeField (champ de temps) Non Il s'agit du champ de temps utilisé dans le cadre des agrégations/requêtes sur les inscriptions. Il s'applique uniquement aux éléments de données d'inscription. Il peut s'agir d'une option prédéfinie ou de l'identifiant d'un attribut ou d'un élément de données dont le type de valeur est temporel. Pour les points d'extrémité "/analytics/enrollments/", le champ de temps par défaut est ENROLLMENT_DATE. ENROLLMENT_DATE | LAST_UPDATED | <Attribute ID> | <Data element ID>

** There are some cases where it's possible to request specific fields through the dimension param. They are not true dimensions, but gives a better level of flexibility. They are:

Event Date (EVENT_DATE)

Filters by the date an event occurred. Can be used as a root-level dimension or scoped to a specific stage.

Value form Exemple Signification
{stageUid}.EVENT_DATE:{period} dimension=A03MvHHogjR.EVENT_DATE:202205 Events in stage A03MvHHogjR with an event date in May 2022.
{stageUid}.EVENT_DATE:{start}_{end} dimension=A03MvHHogjR.EVENT_DATE:2022-05-01_2022-05-10 Events in that stage with an event date in the given inclusive date range.
EVENT_DATE:{period} dimension=EVENT_DATE:2022Sep Root-level event date filter using a financial year period.

Scheduled Date (SCHEDULED_DATE)

Filters by the date an event was scheduled (as opposed to when it actually occurred). Also, it can be scoped to a specific stage (as EVENT_DATE).

Value form Exemple Signification
SCHEDULED_DATE:{period} dimension=SCHEDULED_DATE:202107 Events in the given stage with a scheduled date in July 2021.

Created Date (CREATED)

Filters by when the enrollment record was created in the system. Also, it can be scoped to a specific stage (as EVENT_DATE).

Value form Exemple Signification
CREATED:{period} dimension=CREATED:2016Sep Enrollments created during the financial year starting September 2016.

Completed Date (COMPLETED)

Filters by when the enrollment was marked as completed. Also, it can be scoped to a specific stage (as EVENT_DATE).

Value form Exemple Signification
COMPLETED:{period} dimension=COMPLETED:2022Sep Enrollments completed during the financial year starting September 2022.

Event Status (EVENT_STATUS)

Filters by the status of an event within a stage.

Value form Exemple Signification
{stageUid}.EVENT_STATUS:{status} dimension=A03MvHHogjR.EVENT_STATUS:ACTIVE Events in the stage with status ACTIVE.
{stageUid}.EVENT_STATUS:{s1};{s2} dimension=edqlbukwRfQ.EVENT_STATUS:COMPLETED;ACTIVE Events with status COMPLETED or ACTIVE (OR logic).

Valid status values: ACTIVE, COMPLETED, SCHEDULED, OVERDUE, SKIPPED.

Program Status (PROGRAM_STATUS)

Filters by the status of the enrollment itself (as opposed to individual events).

Value form Exemple Signification
PROGRAM_STATUS:{status} dimension=PROGRAM_STATUS:ACTIVE Only enrollments with the specified program status.

Valid status values: ACTIVE, COMPLETED, CANCELLED.

Response formats

Le format de représentation de réponse par défaut est JSON. Les requêtes doivent utiliser la méthode HTTP GET. Les formats de réponse suivants sont pris en charge.

  • json (application/json)
  • xml (application/xml)
  • xls (application/vnd.ms-excel)
  • csv (application/csv)
  • html (texte/html)
  • html+css (texte/html)

À titre d'exemple, pour obtenir une réponse au format Excel, vous pouvez utiliser une extension de fichier dans l'URL de la requête comme ceci :

/api/analytics/enrollments/query/WSGAb5XwJ3Y.xls
  ?dimension=ou:ImspTQPwCqd
  &dimension=WZbXY0S00lP.de0FEHSIoxh
  &columns=w75KJ2mc4zz
  &dimension=WZbXY0S00lP.sWoqcoByYmD
  &dimension=pe:LAST_MONTH
  &stage=WZbXY0S00lP
  &pageSize=10&page=1
  &asc=ENROLLMENTDATE
  &ouMode=DESCENDANTS

Le format JSON de réponse par défaut ressemblera à ceci :

{
  "headers": [
    {
      "name": "pi",
      "column": "Enrollment",
      "valueType": "TEXT",
      "hidden": false,
      "meta": true
    },
    {
      "name": "tei",
      "column": "Tracked entity instance",
      "valueType": "TEXT",
      "hidden": false,
      "meta": true
    },
    {
      "name": "enrollmentdate",
      "column": "Enrollment date",
      "valueType": "DATE",
      "hidden": false,
      "meta": true
    },
    {
      "name": "incidentdate",
      "column": "Incident date",
      "valueType": "DATE",
      "hidden": false,
      "meta": true
    },
    {
      "name": "storedby",
      "column": "Stored by",
      "valueType": "TEXT",
      "hidden": false,
      "meta": true
    },
    {
      "name": "lastupdated",
      "column": "Last Updated",
      "valueType": "DATE",
      "hidden": false,
      "meta": true
    },
    {
      "name": "storedby",
      "column": "Stored by",
      "valueType": "TEXT",
      "hidden": false,
      "meta": true
    },
    {
      "name": "createdbydisplayname",
      "column": "Created by (display name)",
      "valueType": "TEXT",
      "hidden": false,
      "meta": true
    },
    {
      "name": "lastupdatedbydisplayname",
      "column": "Last updated by (display name)",
      "valueType": "TEXT",
      "hidden": false,
      "meta": true
    },
    {
      "name": "geometry",
      "column": "Geometry",
      "valueType": "TEXT",
      "hidden": false,
      "meta": true
    },
    {
      "name": "longitude",
      "column": "Longitude",
      "valueType": "NUMBER",
      "hidden": false,
      "meta": true
    },
    {
      "name": "latitude",
      "column": "Latitude",
      "valueType": "NUMBER",
      "hidden": false,
      "meta": true
    },
    {
      "name": "ouname",
      "column": "Organisation unit name",
      "valueType": "TEXT",
      "hidden": false,
      "meta": true
    },
    {
      "name": "oucode",
      "column": "Organisation unit code",
      "valueType": "TEXT",
      "hidden": false,
      "meta": true
    },
    {
      "name": "ou",
      "column": "Organisation unit",
      "valueType": "TEXT",
      "hidden": false,
      "meta": true
    },
    {
      "name": "de0FEHSIoxh",
      "column": "WHOMCH Chronic conditions",
      "valueType": "BOOLEAN",
      "hidden": false,
      "meta": true
    },
    {
      "name": "sWoqcoByYmD",
      "column": "WHOMCH Smoking",
      "valueType": "BOOLEAN",
      "hidden": false,
      "meta": true
    }
  ],
  "metaData": {
    "pager": {
      "page": 2,
      "total": 163,
      "pageSize": 4,
      "pageCount": 41
    },
    "items": {
      "ImspTQPwCqd": {
        "name": "Sierra Leone"
      },
      "PFDfvmGpsR3": {
        "name": "Care at birth"
      },
      "bbKtnxRZKEP": {
        "name": "Postpartum care visit"
      },
      "ou": {
        "name": "Organisation unit"
      },
      "PUZaKR0Jh2k": {
        "name": "Previous deliveries"
      },
      "edqlbukwRfQ": {
        "name": "Antenatal care visit"
      },
      "WZbXY0S00lP": {
        "name": "First antenatal care visit"
      },
      "sWoqcoByYmD": {
        "name": "WHOMCH Smoking"
      },
      "WSGAb5XwJ3Y": {
        "name": "WHO RMNCH Tracker"
      },
      "de0FEHSIoxh": {
        "name": "WHOMCH Chronic conditions"
      }
    },
    "dimensions": {
      "pe": [],
      "ou": [
        "ImspTQPwCqd"
      ],
      "sWoqcoByYmD": [],
      "de0FEHSIoxh": []
    }
  },
  "width": 12,
  "rows": [
    [
      "A0cP533hIQv",
      "to8G9jAprnx",
      "2019-02-02 12:05:00.0",
      "2019-02-02 12:05:00.0",
      "system",
      "2020-08-06 21:20:52.0",
      "",
      "0.0",
      "0.0",
      "Tonkomba MCHP",
      "OU_193264",
      "xIMxph4NMP1",
      "0",
      "1"
    ],
    [
      "ZqiUn2uXmBi",
      "SJtv0WzoYki",
      "2019-02-02 12:05:00.0",
      "2019-02-02 12:05:00.0",
      "system",
      "2020-08-06 21:20:52.0",
      "",
      "0.0",
      "0.0",
      "Mawoma MCHP",
      "OU_254973",
      "Srnpwq8jKbp",
      "0",
      "0"
    ],
    [
      "lE747mUAtbz",
      "PGzTv2A1xzn",
      "2019-02-02 12:05:00.0",
      "2019-02-02 12:05:00.0",
      "system",
      "2020-08-06 21:20:52.0",
      "",
      "0.0",
      "0.0",
      "Kunsho CHP",
      "OU_193254",
      "tdhB1JXYBx2",
      "",
      "0"
    ],
    [
      "nmcqu9QF8ow",
      "pav3tGLjYuq",
      "2019-02-03 12:05:00.0",
      "2019-02-03 12:05:00.0",
      "system",
      "2020-08-06 21:20:52.0",
      "",
      "0.0",
      "0.0",
      "Korbu MCHP",
      "OU_678893",
      "m73lWmo5BDG",
      "",
      "1"
    ]
  ],
  "height": 4
}

La section en-têtes de la réponse décrit le contenu du résultat de la requête. L'identifiant unique de l'inscription, l'identifiant de l'instance d'entité suivie, la date de l'inscription, le nom de l'incident, la géométrie, la latitude, la longitude, le nom et le code de l'unité d'organisation apparaissent en tant que premières dimensions dans la réponse et seront toujours présents. Viennent ensuite les éléments de données, les attributs d'entité suivie qui ont été définis comme dimensions dans la demande ; il s'agit dans ce cas précis des dimensions d'éléments de données "WHOMCH maladies chroniques" et "WHOMCH fumeuses". L'identifiant de l'élément de dimension se trouve dans la propriété "nom" et une description lisible de la dimension dans la propriété "colonne" de la section d'en-têtes.

La section metaData, objet ou (unité d'organisation), contient les identifiants de toutes les unités d'organisation présentes dans la réponse, mis en correspondance avec une chaîne qui représente la hiérarchie. Cette chaîne hiérarchique énumère les identifiants des ascendants de l'unité d'organisation en commençant par la racine. L'objet noms contient les identifiants de tous les éléments de la réponse mis en correspondance avec leurs noms.

La section lignes contient les inscriptions produites par la requête. Chaque ligne représente exactement un inscription.

Analytics across TEI relationships with program indicators

L'API d'analyse des inscriptions sans agrégation permet également de relier les indicateurs de programme aux types de relations, afin d'afficher le résultat du calcul d'un indicateur de programme spécifique, appliqué aux entités liées à l'instance d'entité suivie répertoriée.

Pour que la relation Indicateur de programme & Type de relation fonctionne, il faudra ajouter à l'API /api/analytics/enrollments/query, une nouvelle dimension qui contient les UID du type de relation et l'Indicateur de programme choisis :

/api/analytics/enrollments/query/<program-id>
  ?dimension=<relationshiptype-id>.<programindicator-id>

Par exemple, pour extraire une liste d'inscriptions du programme "WHO RMNCH Tracker" pour janvier 2019 et afficher le nombre de cas de paludisme liés à cette inscription par le type de relation "Cas de paludisme lié à une personne", vous pouvez utiliser la requête suivante :

/api/analytics/enrollments/query/WSGAb5XwJ3Y.json?dimension=mxZDvSZYxlw.nFICjJluo74
  &startDate=2019-01-01&endDate=2019-01-31

L'API permet d'utiliser des indicateurs de programme qui ne sont pas associés au programme "principal" (c'est-à-dire le programme dont l'ID est spécifié après /query/).

Tracked entity analytics

L'API d'analyse des entités suivies (ES) permet d'interroger les ES avec leurs données d'inscription et d'événement saisies dans DHIS2. Cette ressource permet d'extraire des données sur les ES, les inscriptions, les événements et les éléments de données dans plusieurs programmes, pour un type d'entité suivie donné.

Dimensions and items

Les dimensions des instances d'entités suivies comprennent les attributs de programme (attributs ES), les éléments de données, les unités d'organisation et différents types de périodes. La requête analytique renvoie simplement les ES correspondant à un ensemble de critères. Elle n'effectue aucune agrégation.

Tableau : Dimensions de l'ES

Dimension Identifiant de la dimension Description
Attributs du programme (attributs de l'ES) <attribute id> L'identifiant de l'attribut du programme.
Éléments de données dans les étapes du programme <program id>.<program stage id>[offset].<data element id> Les identifiants des éléments de données doivent inclure le programme et la phase du programme. Par exemple : dimension=IpHINAT79UW.ZzYYXq4fJie.GQY2lXrypjO.
Périodes N.A. Il n'y a pas de support direct pour la dimension période. Les périodes sont prises en charge par plusieurs paramètres spécifiques. Voir la section Périodes ci-dessous.
Unités d'organisation de l'IES ou Les identifiants des unités d'organisation, ainsi que les mots clés USER_ORGUNIT, USER_ORGUNIT_CHILDREN, USER_ORGUNIT_GRANDCHILDREN, LEVEL-<level> et OU_GROUP-<group-id>.
Unités d'organisation chargées de l'inscription <program id>.ou Les identifiants des unités d'organisation, ainsi que les mots clés USER_ORGUNIT, USER_ORGUNIT_CHILDREN, USER_ORGUNIT_GRANDCHILDREN, LEVEL-<level> et OU_GROUP-<group-id>.
Unités d'organisation des événements <program id><program stage id>.ou Les identifiants des unités d'organisation, ainsi que les mots clés USER_ORGUNIT, USER_ORGUNIT_CHILDREN, USER_ORGUNIT_GRANDCHILDREN, LEVEL-<level> et OU_GROUP-<group-id>.

Offset

Les dimensions qui font référence à des éléments dans des événements répétables peuvent inclure un décalage facultatif. Le décalage est utilisé pour spécifier la répétition de l'événement à utiliser. L'ordre des répétitions est basé sur la date de l'événement, l'événement le plus récent étant la dernière répétition. Le décalage est une valeur entière, où 0 correspond à la dernière répétition, -1 à l'avant-dernière, et ainsi de suite. Les valeurs positives font référence à la première (plus ancienne) répétition, à la deuxième répétition, et ainsi de suite. Le décalage est placé entre crochets [ ].

Exemple:

IpHINAT79UW.ZzYYXq4fJie.GQY2lXrypjO -- renvoie à la dernière répétition
IpHINAT79UW.ZzYYXq4fJie[-1].GQY2lXrypjO -- renvoie à l'avant-dernière répétition
IpHINAT79UW.ZzYYXq4fJie[2].GQY2lXrypjO -- renvoie à la deuxième répétition

Analyse des requêtes d'entités suivies (ES)

Le endpoint analytics/trackedEntities/query fournit des requêtes pour les ES saisies, permettant ainsi d'interroger et de filtrer les informations relatives aux ES, ainsi qu'à leurs inscriptions et événements respectifs. Il n'effectue aucune agrégation.

/api/41/analytics/trackedEntities/query

Vous pouvez spécifier un nombre quelconque de dimensions et de filtres dans une requête. Les identifiants des éléments de dimension peuvent faire référence à tout élément de données dans les étapes du programme, les attributs du programme, les attributs des entités suivies, les périodes fixes et relatives et les unités d'organisation. Les dimensions peuvent éventuellement être associées à un opérateur de requête et à un filtre. Les requêtes d'ES doivent être présentées dans le format décrit ci-dessous.

/api/41/analytics/trackedEntities/query/<tracked-entity-type-id>?dimension=ou:<ou-id>;<ou-id>&
    dimension=<item-id>&dimension=<item-id>:<operator>:<filter>

Par exemple, pour extraire les ES de type Personne des programmes "Enfant" et "Soins prénatals", où le "Prénom" est "Jacques" :

/api/41/analytics/trackedEntities/query/nEenWmSyUEp?program=IpHINAT79UW,WSGAb5XwJ3Y&dimension=IpHINAT79UW.w75KJ2mc4zz:eq:James

La pagination peut être appliquée à la requête en spécifiant les paramètres de numéro de page et de taille de page. Si le numéro de page est spécifié mais que la taille de la page ne l'est pas, la taille de page 50 sera utilisée. Si la taille de la page est spécifiée mais que le numéro de page ne l'est pas, le numéro de page 1 sera utilisé. Pour obtenir la deuxième page de la réponse avec une taille de page de 10, vous pouvez utiliser une requête comme celle-ci :

/api/41/analytics/trackedEntities/query/nEenWmSyUEp?program=IpHINAT79UW,WSGAb5XwJ3Y&dimension=IpHINAT79UW.w75KJ2mc4zz:eq:James
    &pageSize=10&page=2

Filtering

Les filtres peuvent être appliqués aux éléments de données, aux attributs des entités suivies et aux identifiants des entités suivies. Le filtrage est effectué au moyen d'un paramètre de requête au format suivant :

&dimension=<item-id>:<operator>:<filter-value>

Par exemple, vous pouvez filtrer l'élément de données "Poids du nourrisson (g)" du programme "Programme pour l'enfant" et de l'étape du programme "Bébé postnatal" en recherchant des valeurs supérieures à 2000 et inférieures à 4000. Le filtre est défini comme suit :

&dimension=IpHINAT79UW.ZzYYXq4fJie.GQY2lXrypjO:GT:2000&dimension=IpHINAT79UW.ZzYYXq4fJie.GQY2lXrypjO:LT:4000

Périodes

Contrairement aux endpoints d'inscription et de requête d'événement, l'endpoint de l'ES prend en charge plusieurs méthodes de spécification de la période à laquelle les données appartiennent. Elles sont basées sur différents paramètres date, comme indiqué ci-dessous :

Paramètre Description
eventDate Les ES seront filtrés en fonction de la date à laquelle l'événement s'est produit.
enrollmentDate (date d'inscription) Les ES seront filtrés en fonction de la date d'inscription.
scheduledDate (date de programmation) Les ES seront filtrés en fonction de la date à laquelle l'événement a été programmé.
incidentDate (date d'incident) Les ES seront filtrés en fonction de la date d'incident de l'inscription.
lastUpdated (dernière mise à jour) Les ES seront filtrés en fonction de la date de la dernière mise à jour de l'ES, de l'inscription ou de l'événement.
created Les ES seront filtrés en fonction de la date de création de l'ES, de l'inscription ou de l'événement.

Certaines périodes, mentionnées ci-dessus, peuvent être appliquées aux entités suivies, aux inscriptions ou aux événements, selon la manière dont elles sont exprimées.

Exemples :

  • filtrer les ES qui ont été mis à jour au cours de l'année dernière :

lastUpdated=LAST_YEAR

  • filtrer les ES dont la dernière inscription au programme "Programme pour enfants" a été mise à jour au cours de l'année dernière :

lastUpdated=IpHINAT79UW.LAST_YEAR

  • filtrer les ES dont le dernier événement dans l'étape du programme " Bébé Postnatal ", dans la dernière inscription dans le programme " Programme Enfant " a été mis à jour au cours de l'année dernière :

lastUpdated=IpHINAT79UW.ZzYYXq4fJie.LAST_YEAR

  • filtrer les ES dont la dernière inscription au "Programme pour enfants" a eu lieu au cours de l'année dernière :

enrollmentDate=IpHINAT79UW.LAST_YEAR

Request query parameters

L'API de requête analytique de l'ES prend en charge une série de paramètres de requête.

Tableau : Paramètres de requête pour le endpoint de l'ES

Paramètre de requête Obligatoire Description Options (par défaut en premier)
TrackedEntityType Oui Identifiant du type d'entité suivie. Tout identifiant de type d'entité suivie.
program Non Identifiants du programme. Tout identifiant de programme. Il accepte plusieurs identifiants séparés par des virgules.
dimension Non Dimension identifier including data elements, attributes, program indicators, periods, organization units and organization unit group sets. Can be specified multiple times. Dimension filters can be applied to a dimension in the format <dimension-id>:<operator>:<filter-value>. Filter values can be case-insensitive (depending on the operator). Opérateurs : EQ | IEQ | GT | GE | LT | LE | NE | LIKE | ILIKE | IN
filter Non Dimension identifier including data elements, attributes, periods, organization units and organization unit group sets. Can be specified multiple times. Dimension filters can be applied to a dimension in the format <dimension-id>:<operator>:<filter-value>. Filter values can be case-insensitive (depending on the operator). Opérateurs : EQ | IEQ | GT | GE | LT | LE | NE | LIKE | ILIKE | IN
en-têtes Non Le nom des en-têtes à renvoyer dans la réponse. Un ou plusieurs noms d'en-têtes (séparés par une virgule).
relativePeriodDate (Date de la période relative) Non Ce paramètre remplace la date de début, par conséquent les périodes relatives utiliseront cette date comme date de début. Exemple: "2016-01-01"
ouMode Non The mode for the selection of organization units. The default is DESCENDANTS, meaning all subunits in the hierarchy. CHILDREN refers to immediate children in the hierarchy; SELECTED refers to the selected organization units only. DESCENDANTS, CHILDREN, SELECTED
asc Non Permet de trier les dimensions dans l'ordre croissant ; peut concerner la date d'inscription, la date d'incident, le nom et le code de l'unité d'organisation. ouname | programstatus | createdbydisplayname | lastupdatedbydisplayname | enrollmentdate | incidentdate | lastupdated | <dimension identifier>
desc Non Permet de trier les dimensions dans l'ordre décroissant ; peut concerner la date d'inscription, la date d'incident, le nom et le code de l'unité d'organisation. ouname | programstatus | createdbydisplayname | lastupdatedbydisplayname | enrollmentdate | incidentdate | lastupdated | <dimension identifier>
page Non Le numéro de page. La valeur par défaut est 1. Valeur numérique positive.
pageSize Non La taille de la page. La valeur par défaut est 50 (ce qui signifie 50 éléments par page). Zéro ou valeur positive.
displayProperty (afficher la propriété) Non Affiche la propriété des métadonnées. NAME | SHORTNAME
includeMetadataDetails (inclure les détails des métadonnées) Non Inclut les détails des métadonnées dans la réponse générée pour les données brutes. false
outputIdScheme (schéma d'identification de la sortie) Non Schéma d'identification utilisé pour les éléments de métadonnées dans la réponse à la requête. Il accepte des identifiants, des codes ou des attributs. UID | UUID | CODE | NAME | ATTRIBUTE:<ID>
dataIdScheme (schéma d'identification des données) Non Schéma d'identification à utiliser pour les données, plus spécifiquement pour les éléments de données et les attributs qui disposent d'un ensemble d'options ou de légendes. Ceci permet par exemple de renvoyer le nom de l'option au lieu du code, ou le nom de la légende au lieu de son ID, dans la réponse. NAME | CODE | UID
programStatus Non Specify enrollment status of events to include. Deprecated, prefer enrollmentStatus ACTIVE | COMPLETED | CANCELLED. La séparation peut se faire par des virgules (pour la requête uniquement).
enrollmentStatus Non Spécifie le statut d’inscription des événements à inclure. ACTIVE | COMPLETED | CANCELLED. La séparation peut se faire par des virgules (pour la requête uniquement).
eventStatus Non Spécifier le statut des événements à inclure. ACTIVE | COMPLETED | SCHEDULE | OVERDUE | SKIPPED. La séparation peut se faire par des virgules (pour la requête uniquement).
coordinatesOnly (coordonnées uniquement) Non Indique s'il faut uniquement renvoyer les événements qui ont des coordonnées. false
geometryOnly (géométrie Uniquement) Non Indique s'il faut uniquement renvoyer les événements qui ont des géométries. false
userOrgUnit (unité d'organisation d'utilisateur) Non Identifiant de l’unité d’organisation de l'utilisateur. Tout identifiant de l’unité d’organisation.
skipMeta Non Ignorer les métadonnées dans la réponse. false
skipData (ignorer les données) Non Ignorer les données dans la réponse. false
skipRounding (ignorer l'arrondissement des valeurs) Non Évite d'arrondir les données. false
skipHeaders (ignorer les en-têtes) Non Ignorer les en-têtes dans la réponse. false
totalPages Non Indiquez le nombre total de pages dans la réponse. false
displayProperty (afficher la propriété) Non Affiche la propriété des métadonnées. NAME | SHORTNAME

Dimensions

Vous pouvez extraire facilement les dimensions de données à partir de cinq ressources :

Les ressources mentionnées ci-dessus utilisent tous le paramètre de requête suivant :

Paramètre de requête requis Description Options
filter no Permet de filtrer les valeurs des champs selon le format :
filter=champ:OP:valeur&filter=champ:OP:valeur&...
Voir la [section des filtres de dimension].(#webapi_analytics_dimension_filters)
champs no Permet de filtrer les champs
page no Numéro de page La valeur par défaut est 1 (première page)
pageSize no Taille de la page La valeur par défaut est de 50 éléments par page
pagination no Désactive la pagination s'il est définit sur false. true ou false : la valeur par défaut est true
order no Permet d'effectuer le tri selon le format : order=field:direction Voici les champs qui peuvent être triés : created (par défaut), lastUpdated, code, uid, id, name, displayName, dimensionType

Le tri peut se faire dans l'ordre ASC (par défaut) ou DESC

Filtres de dimension

Les points d'extrémité des dimensions permettent de filtrer la sortie afin que la réponse ne porte que sur les éléments recherchés. Les filtres sont au format filter=field:op:value&filter=field:op:value&...&filter=field:op:value.

Les valeurs de champ prises en charge sont les suivantes :

  • id/uid - identifiant de la dimension
  • code - code de la dimension
  • valueType - type de valeur de la dimension
  • name - le nom de la dimension
  • dimensionType - le type de dimension
    • DATA_ELEMENT
    • PROGRAM_INDICATOR
    • PROGRAM_ATTRIBUTE
    • CATEGORY
    • CATEGORY_OPTION_GROUP_SET (ensemble de groupes d'options de catégorie)
  • displayName - nom d'affichage de la dimension
  • displayShortName - nom d'affichage court pour la dimension

Les valeurs op prises en charge sont :

  • startsWith - le champ commence par
  • !startsWith - le champ ne commence pas par
  • endsWith - le champ se termine par
  • !endsWith - le champ ne se termine pas par-
  • eq - égal
  • ieq - équivaut à ignorer le cas
  • ne - pas égal
  • like - contient
  • !like - ne contient pas
  • ilike - contient des cas ignorés
  • !ilike - ne contient pas des cas ignorés

Event analytics dimensions

Dimensions analytiques des requêtes d'événement

La ressource /analytics/events/query/dimensions?programId={programId}&programStageId={programStageId} accepte :

  • un programme tracker
  • une étape de programme tracker
  • le proramme et l'étape du programme

La combinaison du programme et de l'étape du programme est soumise à des contraintes :

  • Si seul le programme est spécifié, la ressource renvoie les dimensions des données pour chaque étape de programme fourni.
  • Si seul l'étape de programme est spécifié, la ressource renvoie les dimensions des données pour l'étape de programme fournie
  • Si les deux éléments programme et étape de programme sont spécifiés, la ressource renvoie les dimensions des données pour létape de programme fournie si elle appartient au programme fourni. Sinon, elle renvoie une erreur.

les dimensions des données renvoyées sont les suivantes :

  • Indicateurs de programme associés au programme (dérivés de l'ID de l'étape de programme)
  • Éléments de données des types pris en charge dans l'étape de programme
  • attributs d'entités suivies des types pris en charge associés au programme (dérivés de l'ID de l'étape de programme)
  • Catégories dans la combinaison de catégories associée au programme (dérivés de l'ID de l'étape de programme)
  • Ensembles de groupes d'options de catégorie de type ATTRIBUT

All value types for data elements and tracked entity attributes are considered supported types, except IMAGE and FILE_RESOURCE.

Dimensions agrégées d'événement

La ressource /analytics/events/aggregate/dimensions?programStageId=... accepte un paramètre obligatoire programStageId et renvoie les dimensions de données suivantes :

  • Éléments de données des types pris en charge dans l'étape de programme
  • attributs d'entités suivies des types pris en charge associés au programme (dérivés de l'ID de l'étape de programme)
  • Catégories dans la combinaison de catégories associée au programme (dérivés de l'ID de l'étape de programme)
  • Ensembles de groupes d'options de catégorie de type ATTRIBUT associés au programme (dérivés de l'ID de l'étape de programme)

Les éléments de données et les attributs d'entité suivie sont considérés comme des types pris en charge si leur type de valeur est l'un des suivants :

  • NOMBRE
  • INTERVALLE_UNITAIRE
  • POURCENTAGE
  • ENTIER
  • ENTIER_POSITIF
  • ENTIER_NÉGATIF
  • ENTIER_ZÉRO_OU_POSITIF
  • BOOLÉEN
  • TRUE_ONLY (vrai uniquement)

Enrollment analytics dimensions

Dimensions analytiques des requêtes d'inscription

La ressource /analytics/enrollments/query/dimensions?programId=... accepte un identifiant obligatoire d'un programme Tracker et renvoie les dimensions de données suivantes :

  • Indicateurs de programme associés au programme
  • Éléments de données des types pris en charge dans le programme, avec une étape de programme pour chaque élément de données
  • Tracked entity attributes of supported types in the program that are not marked to be skipped from Analytics.

All value types for data elements and tracked entity attributes are considered supported types, except IMAGE and FILE_RESOURCE.

Dimensions agrégées d'inscription

La ressource /analytics/enrollments/aggregate/dimensions?programId=... accepte un identifiant obligatoire d'un programme Tracker, qui fait référence à un programme avec inscription, et renvoie les dimensions de données suivantes :

  • Éléments de données des types pris en charge dans le programme, avec une étape de programme pour chaque élément de données
  • Tracked entity attributes of supported types in the program that are not marked to be skipped from Analytics.

Les éléments de données et les attributs d'entité suivie sont considérés comme des types pris en charge si leur type de valeur est l'un des suivants :

  • NOMBRE
  • INTERVALLE_UNITAIRE
  • POURCENTAGE
  • ENTIER
  • ENTIER_POSITIF
  • ENTIER_NÉGATIF
  • ENTIER_ZÉRO_OU_POSITIF
  • BOOLÉEN
  • TRUE_ONLY (vrai uniquement)

Tracked Entities analytics dimensions

dimensions analytiques des requêtes d'entité suivie{ #webapi_teis_query_analytics_dimensions }

La ressource /analytics/teis/query/dimensions?trackedEntityType=TET accepte un identifiant obligatoire d'un type d'entité suivie TET et renvoie les dimensions de données suivantes :

pour chaque programme P associé à une instance d'entité suivie de type TET : - Indicateurs de programme associés au P - Éléments de données des types pris en charge dans le P, avec une étape de programme pour chaque élément de données - Tracked entity attributes of supported types in P that are not marked to be skipped from Analytics. - attributs de programme du P

All value types for data elements and tracked entity attributes are considered supported types, except IMAGE and FILE_RESOURCE.

Sample request and response

GET /api/analytics/teis/query/dimensions?programStageId=A03MvHHogjR&order=code&filter=name:ilike:weight
{
  "page":1,
  "total":5,
  "pageSize":50,
  "dimensions":[
    {
      "dimensionType":"PROGRAM_INDICATOR",
      "created":"2015-08-06T22:49:20.128",
      "lastUpdated":"2015-08-06T22:51:19.787",
      "name":"Measles + Yellow fever doses low infant weight",
      "displayName":"Measles + Yellow fever doses low infant weight",
      "id":"tt54DiKuQ9c",
      "uid":"tt54DiKuQ9c",
      "displayShortName":"Measles + Yellow fever doses low infant weight"
    },
    {
      "dimensionType":"PROGRAM_INDICATOR",
      "created":"2017-01-20T10:32:26.388",
      "lastUpdated":"2017-01-20T10:32:26.388",
      "name":"Weight gain(in g) between birth and last postnatal",
      "displayName":"Weight gain(in g) between birth and last postnatal",
      "id":"qhTkqwAJLMv",
      "uid":"qhTkqwAJLMv",
      "displayShortName":"Weight gain(g)"
    },
    {
      "dimensionType":"PROGRAM_INDICATOR",
      "created":"2015-09-14T20:25:55.543",
      "lastUpdated":"2018-08-28T12:22:47.857",
      "name":"Average weight (g)",
      "displayName":"Average weight (g)",
      "id":"GxdhnY5wmHq",
      "uid":"GxdhnY5wmHq",
      "displayShortName":"Average weight (g)"
    },
    {
      "dimensionType":"PROGRAM_INDICATOR",
      "created":"2015-08-06T22:35:40.391",
      "lastUpdated":"2015-08-06T22:35:40.391",
      "name":"BCG doses low birth weight",
      "displayName":"BCG doses low birth weight",
      "id":"hCYU0G5Ti2T",
      "uid":"hCYU0G5Ti2T",
      "displayShortName":"BCG doses low birth weight"
    },
    {
      "valueType":"NUMBER",
      "dimensionType":"DATA_ELEMENT",
      "created":"2012-09-20T17:37:45.474",
      "lastUpdated":"2014-11-11T21:56:05.418",
      "name":"MCH Weight (g)",
      "displayName":"MCH Weight (g)",
      "id":"A03MvHHogjR.UXz7xuGCEhU",
      "uid":"UXz7xuGCEhU",
      "code":"DE_2005736",
      "displayShortName":"Weight (g)"
    }
  ]
}

Analyse des unités d'organisation

L'API d'analyse des unités d'organisation fournit des statistiques sur les unités d'organisation classées par ensembles de groupes d'unités d'organisation, c'est-à-dire le nombre d'unités d'organisation dans chaque groupe au sein des ensembles de groupes d'unités d'organisation.

GET /api/orgUnitAnalytics?ou=<org-unit-id>&ougs=<org-unit-group-set-id>

L'API requiert au moins une unité d'organisation et au moins un ensemble de groupes d'unités d'organisation. Plusieurs unités d'organisation et ensembles de groupes peuvent être fournis, séparés par un point-virgule.

Request query parameters

La ressource analytique des unités d'organisation vous permet de spécifier un ensemble de paramètres de requête :

Tableau : Paramètres de requête analytique pour les unités d'organisation

Propriété Description Obligatoire
ou Identifiants d'unités d'organisation, éventuellement séparés par un point-virgule. Oui
ougs Identifiants des ensembles de groupes d'unités d'organisation, éventuellement séparés par un point-virgule. Oui
colonnes Identifiants des ensembles de groupes d'unités d'organisation, éventuellement séparés par un point-virgule. Ils déterminent les ensembles de groupes qui apparaissent sous forme de colonnes dans un tableau. Non

La réponse contiendra une colonne pour l'unité d'organisation mère, des colonnes pour chaque groupe d'unités d'organisation faisant partie de la requête et une colonne pour le nombre d'unités d'organisation. Les statistiques comprennent le nombre d'unités d'organisation qui se trouvent en dessous des unités d'organisation spécifiées dans la requête. La réponse contient une section 'métadonnées' qui spécifie le nom de chaque unité d'organisation et de chaque groupe d'unités d'organisation qui font partie de la réponse. Elles sont référencées par leurs identifiants.

La réponse par défaut comporte une seule colonne count. Elle peut être présentée dans un tableau dans lequel au moins un groupe d'unités d'organisation est spécifié à l'aide du paramètre de requête columns.

Response formats

Le point d'extrémité analytique des unités d'organisation rend en charge les formats de représentation suivants :

  • json (application/json)
  • csv (application/csv)
  • xls (application/vnd.ms-excel)
  • pdf (application/pdf)

Exemples

Pour obtenir des analyses d'unité d'organisation pour une unité d'organisation et un ensemble de groupes d'unités d'organisation, utilisez ce qui suit :

GET /api/orgUnitAnalytics?ou=lc3eMKXaEfw&ougs=J5jldMd8OHv

Pour obtenir des données analytiques d'unité d'organisation pour deux unités d'organisation et deux ensembles de groupes d'unités d'organisation, utilisez ce qui suit :

GET /api/orgUnitAnalytics?ou=lc3eMKXaEfw;PMa2VCrupOd&ougs=J5jldMd8OHv;Bpx0589u8y0

Pour obtenir des données analytiques d'unité d'organisation dans un tableau avec un ensemble de groupes présenté dans des colonnes, utilisez ceci :

GET /api/orgUnitAnalytics?ou=fdc6uOvgoji;jUb8gELQApl;lc3eMKXaEfw;PMa2VCrupOd
  &ougs=J5jldMd8OHv&columns=J5jldMd8OHv

Constraints and validation

Les éventuelles erreurs de validation spécifiques à l'API d'analyse des unités d'organisation sont décrites dans le tableau ci-dessous. Certaines erreurs spécifiées pour l'API d'analyse agrégée sont également concernées.

Code d'erreur Message
E7300 Au moins une unité d'organisation doit être spécifiée
E7301 Au moins un ensemble de groupes d'unités d'organisation doit être spécifié.

Rapport sur l'ensemble de données

Les rapports sur les ensembles de données peuvent être générés avec l'API Web, à l'aide de la ressource /dataSetReport. Cette ressource génère des rapports sur les ensembles de données et renvoie le résultat dans un un tableau HTML.

/api/dataSetReport

Request query parameters

La requête prend en charge les paramètres suivants :

Tableau : Paramètres de la requête du rapport d'ensemble de données

Paramètre Description Type Obligatoire
ds L'ensemble de données à partir duquel le rapport est créé. UID de l'ensemble de données Oui
pe La ou les période(s) à partir de laquelle/desquelles le rapport doit être créé. Il peut s'agir d'une liste dont les éléments sont séparés par des virgules. Chaîne ISO Oui
ou L'unité d'organisation à partir de laquelle le rapport doit être créé. L'UID de l'unité d'organisation Oui
filter Les filtres à utiliser pour le rapport ; ils peuvent être répétés autant de fois que nécessaire. Ils viennent juste après la syntaxe de l'API analytique. Un ou plusieurs UID Non
selectedUnitOnly (unité sélectionnée uniquement) Détermine s'il faut utiliser les données saisies uniquement ou les données agrégées. Booléen Non

La ressource du rapport sur les ensembles de données accepte uniquement les requêtes GET. Le contenu de la réponse est de type application/json et les données sont renvoyées dans une grille. Ce point d'extrémité fonctionne pour tous les types d'ensemble de données, notamment les formulaires par défaut, les formulaires à sections et les formulaires personnalisés.

Voici un exemple de requête d'extraction d'un rapport pour un ensemble de données mensuel et une unité d'organisation pour le mois d'octobre 2018 :

GET /api/dataSetReport?ds=BfMAe6Itzgt&pe=201810&ou=ImspTQPwCqd&selectedUnitOnly=false

Voici un exemple de requête d'extraction d'un rapport pour un ensemble de données mensuel et une unité d'organisation pour octobre, novembre et décembre 2018 :

GET /api/dataSetReport?ds=BfMAe6Itzgt&pe=201810,201811,201812&ou=ImspTQPwCqd&selectedUnitOnly=false

Pour obtenir un rapport sur un ensemble de données avec un filtre, vous pouvez utiliser le paramètre filter. Dans ce cas, le filtre se base sur un ensemble de groupes d'unités d'organisation et deux groupes d'unités d'organisation :

GET /api/dataSetReport?ds=BfMAe6Itzgt&pe=201810&ou=ImspTQPwCqd
  &filter=J5jldMd8OHv:RXL3lPSK8oG;tDZVQ1WtwpA

Response formats

Le point d'extrémité du rapport sur l'ensemble de données prend en charge les formats de sortie suivants. Vous pouvez récupérer un point d'extrémité spécifique en utilisant l'extension du fichier ou l'en-tête HTTP Accept.

  • json (application/json)
  • pdf (application/pdf)
  • xls (application/vnd.ms-excel)

Formulaires personnalisés

Un point d'extrémité spécifique est disponible pour les ensembles de données avec des formulaires HTML personnalisés. Ce point d'extrémité renvoie le contenu du formulaire HTML avec le type de contenu text/html et les données y sont insérées. Vous pouvez également utiliser le point d'extrémité du rapport général sur les ensembles de données pour les ensembles de données avec des formulaires personnalisés. Cependant, ce point d'extrémité renverra le rapport au format JSON dans une grille. Ce point d'extrémité ne fonctionne que pour les ensembles de données avec des formulaires HTML personnalisés.

GET /api/dataSetReport/custom

La syntaxe de ce point d'extrémité est par ailleurs la même que celle du point d'extrémité du rapport général sur les ensembles de données. Pour récupérer un rapport HTML personnalisé sur un ensemble de données, vous pouvez effectuer la requête suivante :

GET /api/dataSetReport/custom?ds=lyLU2wR22tC&pe=201810&ou=ImspTQPwCqd

Analyse push

L'API d'analyse push comprend des points d'extrémité qui permettent la prévisualisation d'un rapport d'analyse push par l'utilisateur connecté et le déclenchement manuel de la génération et de l'envoi de rapports d'analyse push par le système, en plus des opérations CRUD normales. Lorsque vous utilisez les points d'extrémité de création et de mise à jour pour l'analyse push, celle-ci est programmée pour s'exécuter selon les propriétés de l'analyse push. De même, lorsque vous supprimez ou mettez à jour une analyse push pour la désactiver, la tâche ne pourra plus être exécutée à l'avenir.

Pour obtenir l'aperçu d'une analyse push existante en HTML, vous pouvez effectuer une requête GET au point d'extrémité suivant :

/api/pushAnalysis/<id>/render

Pour déclencher manuellement une tâche d'analyse push, vous pouvez envoyer une requête POST au point d'extrémité suivant :

/api/pushAnalysis/<id>/run

Une analyse push comprend les propriétés suivantes, dont certaines sont nécessaires pour l'exécution automatique des tâches d'analyse push :

Tableau : Propriétés de l'analyse push

Propriété Description Type Obligatoire
tableau de bord Tableau de bord sur lequel repose les rapports UID du tableau de bord Oui
message Apparaît après le titre dans les rapports Chaîne Non
recipientUserGroups (groupes d'utilisateurs destinataires) Un ensemble de groupes d'utilisateurs qui doivent recevoir les rapports Un ou plusieurs UID de groupes d'utilisateurs Non. Les tâches programmées sans destinataire seront ignorés.
activé Indique si cette analyse push doit être programmée ou non. La valeur par défaut est 'Faux'. Booléen Oui. Doit être défini sur "true" pour être programmée.
schedulingFrequency (fréquence de planification) La fréquence à laquelle les rapports doivent être programmés. "QUOTIDIENNE", "HEBDOMADAIRE", "MENSUELLE" Non. Les analyses push sans fréquence ne seront pas programmées.
schedulingDayOfFrequency (Programmation du jour de la fréquence) Le jour dans la fréquence où la tâche doit être programmée. Entier. Toute valeur est valide lorsque la fréquence est "QUOTIDIENNE". 0-7 lorsque la fréquence est "HEBDOMADAIRE". 1-31 lorsque la fréquence est "MENSUELLE" Non. Les analyses push qui n'ont pas de jour de fréquence valide pour l'ensemble de fréquences ne seront pas programmées.

Analyse de l'utilisation des données

L'API d'analyse de l'utilisation vous permet d'accéder à des informations sur la manière dont les gens utilisent DHIS2 sur la base d'une analyse de données. Lorsque les utilisateurs accèdent aux favoris, un événement est enregistré. L'événement se compose du nom de l'utilisateur, de l'UID du favori, de la date de l'événement et du type d'événement. Les différents types d'événements sont répertoriés dans le tableau.

/api/dataStatistics

L'API d'analyse de l'utilisation vous permet de récupérer des instantanés agrégés sur l'analyse de l'utilisation, en fonction d'intervalles de temps donnés. L'API capture les visualisations des utilisateurs (par exemple le nombre de fois qu'un graphique ou un tableau croisé dynamique a été visualisé par un utilisateur) et les favoris d'analyse enregistrés (par exemple les graphiques et les tableaux croisés dynamiques favoris). DHIS2 capture des instantanés nocturnes qui sont ensuite agrégés à la demande.

Paramètres de requête{ #webapi_usage_analytics_request_query_parameters }

L'API d'analyse de l'utilisation (statistiques de données) prend en charge deux opérations :

  • POST: crée un événement de visualisation

  • GET: récupère les statistiques agrégées

Création des événements de visualisation (POST)

L'API d'analyse de l'utilisation vous permet de créer des visualisations d'événement. Le paramètre dataStatisticsEventType (type d'événement des statistiques de données) décrit le type de l'élément visualisé. Le paramètre de favori indique l'identifiant du favori concerné.

L'URL qui crée une nouvelle visualisation d'événement des graphiques :

POST /api/dataStatistics?eventType=CHART_VIEW&favorite=LW0O27b7TdD

Une opération de sauvegarde réussie renvoie un code de statut HTTP "201". Le tableau ci-dessous présente les types d'événements pris en charge.

Tableau : Types d'événements pris en charge

Clé Description
VISUALIZATION_VIEW (APERÇU DE LA VISUALISATION) Aperçu de la visualisation
MAP_VIEW Aperçu de la carte (GIS)
EVENT_REPORT_VIEW Aperçu du rapport d'événement
EVENT_CHART_VIEW Aperçu du graphique d'événement
EVENT_VISUALIZATION_VIEW Aperçu de la visualisation d'événement
DASHBOARD_VIEW Aperçu du tableau de bord
PASSIVE_DASHBOARD_VIEW Aperçu du tableau de bord (lorsque le tableau de bord n'est pas explicitement sélectionné)
DATA_SET_REPORT_VIEW Aperçu du rapport sur l'ensemble des données

Récupération des rapports agrégés d'analyse de l'utilisation (GET)

L'API d'analyse de l'utilisation (statistiques de données) vous permet de spécifier certains paramètres de requête lorsque vous demandez un rapport agrégé.

Tableau : Paramètres de requête pour l'analyse agrégée de l'utilisation (statistiques de données)

Paramètre de requête Obligatoire Description Options
startDate Oui Date de début de la période Les dates doivent être au format aaaa-MM-jj
endDate Oui Date de fin de la période Les dates doivent être au format aaaa-MM-jj
intervalle Oui Type d'intervalle pour l'agrégation JOUR, SEMAINE, MOIS, ANNÉE

Les paramètres 'date de début' et 'date de fin' spécifient la période pour laquelle les instantanés doivent être utilisés dans l'agrégation. Vous devez mettre les dates au format indiqué ci-dessus. Si aucun instantané n'est sauvegardé au cours de la période spécifiée, une liste vide est renvoyée. Le paramètre appelé 'intervalle' spécifie le type d'agrégation qui sera effectué.

Requête API qui crée une agrégation mensuelle :

GET /api/dataStatistics?startDate=2014-01-02&endDate=2016-01-01&interval=MONTH

Récupération des favoris

L'API d'analyse de l'utilisation vous permet de récupérer les principaux favoris utilisés dans DHIS2, et par utilisateur.

Tableau : Paramètres requête pour les principaux favoris

Paramètre de requête Obligatoire Description Options
eventType (type d'événement) Oui Le type d'événement des statistiques de données Voir le tableau ci-dessus
pageSize Non Taille de la liste renvoyée Par exemple 5, 10, 25. La valeur par défaut est 25
sortOrder Non Décroissant ou croissant ASC ou DESC. La valeur par défaut est DESC.
Nom d'utilisateur Non Si ce paramètre est spécifié, la réponse ne contiendra que les favoris de cet utilisateur. Par exemple, "admin".

La requête API peut être utilisée sans nom d'utilisateur. Dans ce cas, elle trouvera les principaux favoris de tout le système.

/api/dataStatistics/favorites?eventType=CHART_VIEW&pageSize=25&sortOrder=ASC

Si le nom d'utilisateur est spécifié, la réponse ne contiendra que les principaux favoris de cet utilisateur.

/api/dataStatistics/favorites?eventType=CHART_VIEW&pageSize=25
  &sortOrder=ASC&username=admin

Format de la réponse

Vous pouvez renvoyer les données agrégées dans une réponse d'analyse d'utilisation dans différents formats de représentation. Le format par défaut est JSON. Les formats et types de contenu disponibles sont les suivants :

  • json (application/json)

  • xml (application/xml)

  • html (texte/html)

Requête API qui demande une réponse d'analyse d'utilisation au format XML :

/api/dataStatistics.xml?startDate=2014-01-01&endDate=2016-01-01&interval=WEEK

Pour obtenir une réponse d'analyse d'utilisation au format JSON :

/api/dataStatistics?startDate=2016-02-01&endDate=2016-02-14&interval=WEEK

La réponse JSON ressemble à ceci :

[
  {
    "year": 2016,
    "week": 5,
    "mapViews": 2181,
    "chartViews": 2227,
    "reportTableViews": 5633,
    "eventReportViews": 6757,
    "eventChartViews": 9860,
    "eventVisualizationViews": 2387,
    "dashboardViews": 10082,
    "passiveDashboardViews": 0,
    "totalViews": 46346,
    "averageViews": 468,
    "averageMapViews": 22,
    "averageChartViews": 22,
    "averageReportTableViews": 56,
    "averageEventReportViews": 68,
    "averageEventChartViews": 99,
    "averageEventVisualizationViews": 10,
    "averageDashboardViews": 101,
    "averagePassiveDashboardViews": 0,
    "savedMaps": 1805,
    "savedCharts": 2205,
    "savedReportTables": 1995,
    "savedEventReports": 1679,
    "savedEventCharts": 1613,
    "savedEventVisualizations": 1231,
    "savedDashboards": 0,
    "savedIndicators": 1831,
    "activeUsers": 99,
    "users": 969
  },
  {
    "year": 2016,
    "week": 6,
    "mapViews": 2018,
    "chartViews": 2267,
    "reportTableViews": 4714,
    "eventReportViews": 6697,
    "eventChartViews": 9511,
    "dashboardViews": 12181,
    "passiveDashboardViews": 0,
    "totalViews": 47746,
    "averageViews": 497,
    "averageMapViews": 21,
    "averageChartViews": 23,
    "averageReportTableViews": 49,
    "averageEventReportViews": 69,
    "averageEventChartViews": 99,
    "averageDashboardViews": 126,
    "averagePassiveDashboardViews": 0,
    "savedMaps": 1643,
    "savedCharts": 1935,
    "savedReportTables": 1867,
    "savedEventReports": 1977,
    "savedEventCharts": 1714,
    "savedDashboards": 0,
    "savedIndicators": 1646,
    "activeUsers": 96,
    "users": 953
  }
]

Notez que le nombre de activeUsers (utilisateurs actifs) indique le nombre d'utilisateurs distincts qui ont eu des événements au cours de la période de temps demandée. Le nombre de users (utilisateurs) représente le nombre total d'utilisateurs dans le système (à la fois activés et désactivés).

Récupération des statistiques pour un favori

Vous pouvez obtenir le nombre de visualisations pour un favori spécifique en utilisant la ressource favoris, où {favorite-id} (Id du favori) doit être remplacé par l'identifiant du favori en question :

/api/dataStatistics/favorites/{favorite-id}.json

La réponse contiendra le nombre de visualisations pour le favori en question et ressemblera à ceci :

{
  "views": 3
}

Éléments géospatiaux

La ressource geoFeatures vous permet d'extraire des informations géospatiales de DHIS2. Les éléments géospatiaux sont stockées avec les unités d'organisation. La syntaxe utilisée pour extraire ces éléments est identique à la celle utilisée pour la dimension d'unité d'organisation de la ressource analytique. Nous vous recommandons de vous renseigner sur la ressource de l'API analytique avant de poursuivre la lecture de cette section. Vous devez utiliser le type de requête GET et seul le format de réponse JSON est pris en charge.

Par exemple, pour récupérer les éléments géospatiaux de toutes les unités d'organisation situées au niveau 3 de la hiérarchie des unités d'organisation, vous pouvez utiliser une requête GET avec l'URL suivante :

/api/geoFeatures.json?ou=ou:LEVEL-3

Pour récupérer les éléments géospatiaux des unités d'organisation à un niveau situé à l'intérieur d'une unité d'organisation (par exemple au niveau 2), vous pouvez utiliser l'URL suivante :

/api/geoFeatures.json?ou=ou:LEVEL-4;O6uvpzGd5pu

La valeur des coordonnées de la réponse peut être lue à partir de deux propriétés déterminées par le paramètre coordinateField (champ de coordonnées). - La propriété geometry de l'unité d'organisation : c'est le fonctionnement par défaut qui est appliqué lorsque le paramètre coordinateField n'est pas fourni. - L'attribut de l'unité d'organisation de type de valeur GeoJSON : l'API va utiliser le champ coordinateField={attributeId} fourni pour obtenir les coordonnées GeoJSON à partir de la valeur de cet attribut.

Par exemple, si vous voulez récupérer des éléments géospatiaux pour toutes les unités d'organisation au niveau 3 tel que mentionné plus haut, mais en obtenant les coordonnées à partir de l'attribut d'unité d'organisation tJqtSV4quLb, utilisez ceci :

/api/geoFeatures.json?ou=ou:LEVEL-3&coordinateField=tJqtSV4quLb

La sémantique des propriétés de la réponse est décrite dans le tableau suivant :

Tableau : Réponse pour les éléments géospatiaux

Propriété Description
id Unité d'organisation / identifiant de l'élément géospatiale
na Unité d'organisation / nom de l'élément géospatiale
hcd Les coordonnées se trouvent vers le bas ; elles indiquent s'il existe une ou plusieurs unités d'organisation subordonnées avec des coordonnées (c'est-à-dire qu'elle(s) se trouvent à un niveau inférieur dans la hiérarchie).
hcu Les coordonnées se trouvent vers le haut ; elles indiquent si l'unité d'organisation mère a des coordonnées (c'est-à-dire qu'elle se trouve à un niveau supérieur dans la hiérarchie).
le Niveau de cette unité d'organisation / élément géospatial
pg Graphique mère : il s'agit du graphique contenant les identifiants des unités d'organisation mères jusqu'à la racine de la hiérarchie.
pi Identifiant mère : il s'agit de l'identifiant de l'ascendant direct de cette unité d'organisation
pn Nom de l'ascendant direct : il s'agit du nom de l'ascendant direct de cette unité d'organisation
ty Type d'élément géospatial, 1 = point et 2 = polygone ou multi-polygone
co Coordonnées de cet élément géospatial

GeoJSON

Pour exporter du GeoJSON, vous pouvez simplement ajouter .geosjon en tant qu'extension au point d'extrémité /api/organisationUnits, ou vous pouvez utiliser l'en-tête Accept avec application/json+geojson.

Deux paramètres sont pris en charge : level (1 par défaut) et parent (unités d'organisation racine par défaut). Les deux paramètres peuvent être ajoutés à plusieurs reprise. Quelques exemples :

Pour obtenir tous les éléments aux niveaux 2 et 4 :

/api/organisationUnits.geojson?level=2&level=4

Pour obtenir tous les éléments au niveau 3 avec une unité d'organisation limite :

/api/organisationUnits.geojson?parent=fdc6uOvgoji&level=3

Crochets pour tableaux analytiques

Les crochets de tableaux analytiques fournissent un mécanisme permettant d'appeler des scripts SQL au cours des différentes phases du processus de génération des tableaux analytiques. Ceci permet de personnaliser les données dans les tableaux de ressources et d'analyse, par exemple pour obtenir une logique spécifique pour les calculs et l'agrégation. Vous pouvez manipuler les crochets de tables analytiques à l'aide du point d'extrémité d'API suivant :

/api/analyticsTableHooks

L'API des crochets de tableaux analytiques prend en charge les opérations CRUD HTTP standard pour créer (POST), mettre à jour (PUT), récupérer (GET) et supprimer (DELETE) des entités.

Champs de crochets

Les crochets de tableaux analytiques comportent les champs suivants :

Tableau : Champs des crochets de tableaux analytiques

Champ Options Description
name Texte Nom du crochet.
phase RESOURCE_TABLE_POPULATED, ANALYTICS_TABLE_POPULATED (tableau de ressources et tableau analytique renseignés) Phase au cours de laquelle le script SQL doit être appelé.
resourceTableType (type de tableau de ressources) Voir la colonne "Type de tableau" dans le tableau "Phases, types de tableaux et tableaux temporaires" ci-dessous. Le type de tableau de ressources pour lequel le script SQL doit être appelé. Ceci ne s'applique qu'aux crochets définis avec la phase RESOURCE_TABLE_POPULATED.
analyticsTableType (type de tableau analytique) Voir la colonne "Type de tableau" dans le tableau "Phases, types de tableaux et tableaux temporaires" ci-dessous. Le type de tableau analytique pour lequel le script SQL doit être appelé. Ceci ne s'applique qu'aux crochets définis avec la phase ANALYTICS_TABLE_POPULATED.
sql Texte Le script SQL à appeler.

La phase ANALYTICS_TABLE_POPULATED a lieu après le remplissage du tableau analytique, mais avant la création des index et le remplacement du tableau temporaire par le tableau principale. Le script SQL va désormais faire référence au tableau analytique temporaire, par exemple analytics_temp, analytics_completeness_temp, analytics_event_temp_ebayegv0exc.

Ceci s'applique également à la phase RESOURCE_TABLE_POPULATED, qui a lieu après le remplissage du tableau de ressources, mais avant la création des index et le remplacement du tableau temporaire par le tableau principal. Le script SQL va désormais faire référence au tableau de ressources temporaire, par exemple _orgunitstructure_temp, _categorystructure_temp.

Vous ne devez définir qu'un seul champ entre resourceTableType et analyticsTableType. Vous le ferez en fonction de la phase définie.

Vous pouvez faire référence au tableau temporaire de la base de données qui correspond uniquement au type du tableau de crochets spécifié (les autres tableaux temporaires ne seront pas disponibles). Par exemple, si vous spécifiez ORG_UNIT_STRUCTURE comme type de tableau de ressources, vous ne pourrez faire référence qu'au tableau temporaire de la base de données _orgunitstructure_temp.

Le tableau suivant présente les combinaisons valables de phases, de types de tableaux et de tableaux temporaire.

Tableau : Phases, types de tableaux et tableaux temporaires

Phase Type de tableau Table temporaire
RESOURCE_TABLE_POPULATED ORG_UNIT_STRUCTURE (structure de l'unité d'organisation) _orgunitstructure_temp
DATA_SET_ORG_UNIT_CATEGORY _datasetorgunitcategory_temp
CATEGORY_OPTION_COMBO_NAME (nom de la combinaison d'options de catégorie) _categoryoptioncomboname_temp
DATA_ELEMENT_GROUP_SET_STRUCTURE (structure de l'ensemble de groupes d'éléments de données) _dataelementgroupsetstructure_temp
INDICATOR_GROUP_SET_STRUCTURE (structure de l'ensemble de groupes d'indicateurs) _indicatorgroupsetstructure_temp
ORG_UNIT_GROUP_SET_STRUCTURE (structure de l'ensemble de groupes d'unités d'organisation) _organisationunitgroupsetstructure_temp
CATEGORY_STRUCTURE (structure de la catégorie) _categorystructure_temp
DATA_ELEMENT_STRUCTURE (structure de l'élément de données) _dataelementstructure_temp
PERIOD_STRUCTURE (structure de la période) _periodstructure_temp
DATE_PERIOD_STRUCTURE (structure de la période + la date) _dateperiodstructure_temp
DATA_ELEMENT_CATEGORY_OPTION_COMBO (combinaison d'option de catégorie de l'élément de donnée) _dataelementcategoryoptioncombo_temp
DATA_APPROVAL_MIN_LEVEL (niveau minimal d'approbation des données) _dataapprovalminlevel_temp
ANALYTICS_TABLE_POPULATED DATA_VALUE analytics_temp
COMPLETENESS (complétude) analytics_completeness_temp
COMPLETENESS_TARGET (cible de complétude) analytics_completenesstarget_temp
ORG_UNIT_TARGET (cible de l'unité d'organisation) analytics_orgunittarget_temp
ÉVÉNEMENT analytics_event_temp_{program-uid}
ENROLLMENT analytics_enrollment_temp_{program-uid}
VALIDATION_RESULT (résultat de validation) analytics_validationresult_temp

Création de crochets

You can create hooks with the Maintenance app or with the API.

Pour créer un crochet qui doit être exécuté après le remplissage des tableaux de ressources, vous pouvez effectuer la requête POST suivante en utilisant JSON comme type de contenu :

POST /api/analyticsTableHooks
{
  "name": "Update 'Area' in org unit group set resource table",
  "phase": "RESOURCE_TABLE_POPULATED",
  "resourceTableType": "ORG_UNIT_GROUP_SET_STRUCTURE",
  "sql": "update _organisationunitgroupsetstructure_temp set \"uIuxlbV1vRT\" = 'b0EsAxm8Nge'"
}

Pour créer un crochet qui doit être exécuté après le remplissage du tableau d'analyse des valeurs de données, vous pouvez effectuer la requête POST suivante en utilisant le format JSON :

{
  "name": "Update 'Currently on treatment' data in analytics table",
  "phase": "ANALYTICS_TABLE_POPULATED",
  "analyticsTableType": "DATA_VALUE",
  "sql": "update analytics_temp set monthly = '200212' where monthly in ('200210', '200211')"
}

Pour créer un crochet qui doit être exécuté après le remplissage des tableaux d'analyse d'événements, vous pouvez effectuer la requête POST suivante en utilisant le format JSON :

{
  "name": "Delete data for a data element",
  "phase": "ANALYTICS_TABLE_POPULATED",
  "analyticsTableType": "EVENT",
  "sql": "delete from analytics_event_temp_lxaq7zs9vyr where dx = 'uDX9LKGRwaH'"
}

Conversion SVG

L'API Web fournit une ressource qui peut être utilisée pour convertir le contenu SVG dans des formats plus utilisés tels que PNG et PDF. Idéalement, cette conversion devrait avoir lieu côté client, mais toutes les technologies côté client ne sont pas en mesure d'effectuer cette tâche. Actuellement, les formats de sortie PNG et PDF sont pris en charge. Le contenu SVG lui-même doit être transmis avec un paramètre de requête svg, et un paramètre de requête facultatif filename peut être utilisé pour spécifier le nom de fichier de la pièce jointe à la réponse. Notez que l'extension du fichier doit être omise. Pour obtenir une réponse dans le format PNG, vous pouvez envoyer une requête POST à l'URL suivante avec pour type de contenu application/x-www-form-urlencoded. Ce processus est identique à la soumission d'un formulaire HTML classique.

api/svg.png

Pour obtenir la réponse dans le format PDF, vous pouvez envoyer une requête POST à l'URL suivante avec pour type de contenu application/x-www-form-urlencoded.

api/svg.pdf

Tableau : Paramètres de requête

Paramètre de requête Obligatoire Description
svg Oui Le contenu SVG
nom du fichier Non Le nom de fichier de la pièce jointe renvoyée sans extension de fichier

Détection analytique des valeurs atypiques

L'API analytique de valeurs atypiques fournit des endpoints pour l'investigation de la qualité des données sur la base du score Z et du score Z modifié. Ces deux scores sont des mesures statistiques qui permettent d'analyser et d'interpréter les données dans le contexte des écarts par rapport à la valeur moyenne. Ils sont particulièrement utiles pour identifier les valeurs atypiques ou extrêmes dans un ensemble de données. L'API est mise en œuvre sous la forme d'un endpoint analytique unique :

  • /api/analytics/outlierDetection

Requête

Paramètre de requête

Paramètre de requête Description Obligatoire Options (par défaut en premier)
ds Ensemble de données Oui Identifiant de l'ensemble de données
startDate Date en début de l'intervalle pour contrôler les valeurs atypiques. Non (la période de date relative est obligatoire dans ce cas) Date (aaaa-MM-jj)
endDate Date en fin de l'intervalle pour vérifier les valeurs atypiques Non (la période de date relative est obligatoire dans ce cas) Date (aaaa-MM-jj)
pe Les périodes ISO et les périodes relatives Non (les dates de début et de fin sont obligatoires dans ce cas) voir le "format de date et de période"
relativePeriodDate (Date de la période relative) Date utilisée comme base pour les périodes relatives. Non Date (aaaa-MM-jj)
ou L'unité d'organisation, le niveau de l'unité d'organisation ou les groupes (peuvent être combinés) Non Identifiant de l'unité d'organisation (niveau, groupe)
en-têtes Le nom des en-têtes à renvoyer dans la réponse. Un ou plusieurs noms d'en-têtes séparés par des virgules Non (NULL), dx, dxname, pename, pe ...
orderBy Trier les enregistrements sur la colonne des valeurs Non absdev, zscore, modifiedzscore, median, mean, stddev, medianabsdeviation, lowerbound, upperbound
sortOrder Trier les enregistrements sur la colonne des valeurs par ordre croissant ou décroissant Non ASC, DESC
algorithm Algorithme à utiliser pour la détection des valeurs atypiques Non Z_SCORE, Z_SCORE_MODIFIÉ
threshold Seuil pour les valeurs atypiques Z_SCORE ou Z_SCORE_MODIFIÉ Non Numérique, supérieur à zéro. Par défaut: 3.0
inputIdScheme Schéma d'identification à utiliser pour les éléments de métadonnées dans la requête. Il peut être un identifiant, un code ou constitué d'attributs. Non UID, ID, CODE, NOM
maxResults Nombre maximum de lignes (réponses) Non 500
skipRounding (ignorer l'arrondissement des valeurs) Évite l'arrondissement des valeurs de données, c'est-à-dire que les valeurs fournies ont une précision exacte (échelle 10). Non faux, vrai

Exemple de requête

GET api/analytics/outlierDetection?ds=BfMAe6Itzgt&ou=ImspTQPwCqd&startDate=2022-07-26&endDate=2022-10-26&algorithm=Z_SCORE&maxResults=30&orderBy=value&threshold=3.0&sortOrder=asc&outputIdScheme=code

Réponse

La réponse est fournie dans plusieurs formats de représentation. Le format par défaut est JSON. Les formats et types de contenu disponibles sont les suivants :

  • json (application/json)
  • xml (application/xml)
  • xsl (application/vnd.ms-excel)
  • csv (application/csv)
  • html (texte/html)
  • html+css (texte/html)

Exemple de réponse

{
  "headers":[
    {
      "name":"dx",
      "column":"Data",
      "valueType":"TEXT",
      "hidden":false,
      "meta":false
    },
    {
      "name":"dxname",
      "column":"Data name",
      "valueType":"TEXT",
      "hidden":false,
      "meta":false
    },
    {
      "name":"pe",
      "column":"Period",
      "valueType":"TEXT",
      "hidden":false,
      "meta":false
    },
    {
      "name":"pename",
      "column":"Period name",
      "valueType":"TEXT",
      "hidden":false,
      "meta":false
    },
    {
      "name":"ou",
      "column":"Organisation unit",
      "valueType":"TEXT",
      "hidden":false,
      "meta":false
    },
    {
      "name":"ouname",
      "column":"Organisation unit name",
      "valueType":"TEXT",
      "hidden":false,
      "meta":false
    },
    {
      "name":"ounamehierarchy",
      "column":"Organisation unit name hierarchy",
      "valueType":"TEXT",
      "hidden":false,
      "meta":false
    },
    {
      "name":"coc",
      "column":"Category option combo",
      "valueType":"TEXT",
      "hidden":false,
      "meta":false
    },
    {
      "name":"cocname",
      "column":"Category option combo name",
      "valueType":"TEXT",
      "hidden":false,
      "meta":false
    },
    {
      "name":"aoc",
      "column":"Attribute option combo",
      "valueType":"TEXT",
      "hidden":false,
      "meta":false
    },
    {
      "name":"aocname",
      "column":"Attribute option combo name",
      "valueType":"TEXT",
      "hidden":false,
      "meta":false
    },
    {
      "name":"value",
      "column":"Value",
      "valueType":"NUMBER",
      "hidden":false,
      "meta":false
    },
    {
      "name":"mean",
      "column":"Mean",
      "valueType":"NUMBER",
      "hidden":false,
      "meta":false
    },
    {
      "name":"stddev",
      "column":"Standard deviation",
      "valueType":"NUMBER",
      "hidden":false,
      "meta":false
    },
    {
      "name":"absdev",
      "column":"Absolute deviation",
      "valueType":"NUMBER",
      "hidden":false,
      "meta":false
    },
    {
      "name":"zscore",
      "column":"zScore",
      "valueType":"NUMBER",
      "hidden":false,
      "meta":false
    },
    {
      "name":"lowerbound",
      "column":"Lower boundary",
      "valueType":"NUMBER",
      "hidden":false,
      "meta":false
    },
    {
      "name":"upperbound",
      "column":"Upper boundary",
      "valueType":"NUMBER",
      "hidden":false,
      "meta":false
    }
  ],
  "metaData":{
    "maxResults":30,
    "count":3,
    "orderBy":"VALUE",
    "threshold":3.0,
    "algorithm":"Z_SCORE"
  },
  "rowContext":{

  },
  "width":18,
  "rows":[
    [
      "DE_22",
      "Q_Early breastfeeding (within 1 hr after delivery) at BCG",
      "202209",
      "September 2022",
      "OU_204860",
      "Sandaru CHC",
      "/Sierra Leone/Kailahun/Penguia/Sandaru CHC",
      "COC_292",
      "Fixed, <1y",
      "default",
      "default",
      "105.0",
      "18.3",
      "28.7",
      "86.7",
      "3.0",
      "-67.9",
      "104.4"
    ],
    [
      "DE_359706",
      "BCG doses given",
      "202208",
      "August 2022",
      "OU_595",
      "Ngalu CHC",
      "/Sierra Leone/Bo/Bargbe/Ngalu CHC",
      "COC_292",
      "Fixed, <1y",
      "default",
      "default",
      "220.0",
      "41.6",
      "57.4",
      "178.3",
      "3.1",
      "-130.7",
      "213.9"
    ],
    [
      "DE_35",
      "Yellow Fever doses given",
      "202209",
      "September 2022",
      "OU_1027",
      "Yemoh Town CHC",
      "/Sierra Leone/Bo/Kakua/Yemoh Town CHC",
      "COC_292",
      "Fixed, <1y",
      "default",
      "default",
      "466.0",
      "48.1",
      "114.2",
      "417.8",
      "3.6",
      "-294.6",
      "391.0"
    ]
  ],
  "headerWidth":18,
  "height":3
}

Les statistiques dans la réponse

Mesure statistique Nom de l'en-tête Description Lien
Valeur value La valeur numérique de l'ensemble ou de l'élément de données (doses de Penta1 administrées, doses de rougeole administrées, etc.)
Signification moyenne La valeur moyenne d'un ensemble de nombres. Calculée en additionnant toutes les valeurs et en les divisant par le nombre. https://www.khanacademy.org/math/statistics-probability/summarizing-quantitative-data
Écart type stddev Mesure de variation ou de dispersion d'un ensemble de valeurs. https://www.statisticshowto.com/probability-and-statistics/standard-deviation/
Écart absolu absdev La différence absolue entre chaque valeur de données et la valeur moyenne. https://www.mathsisfun.com/data/mean-absolute-deviation.html
Z Score zscore Un score standardisé qui représente le nombre d'écarts types d'une valeur de données par rapport à la moyenne. https://www.statisticshowto.com/probability-and-statistics/z-score/
Z score modifié Z score modifié Similaire au score Z mais résistant aux valeurs atypiques. Il utilise la médiane et l'écart absolu médian. https://www.statisticshowto.com/modified-z-scores/
Écart absolu médian Écart absolu médian Mesure solide de la dispersion des valeurs des données, calculée comme la médiane des écarts absolus par rapport à la médiane. https://math.stackexchange.com/questions/2232309/median-absolute-deviation-mad-formula
Minimum lowerbound Le minimum est la plus petite valeur d'un ensemble de données. Il représente la plus petite valeur observée parmi toutes les valeurs de données.
Maximum upperbound Le maximum est la plus grande valeur d'un ensemble de données. Il représente la valeur observée la plus élevée parmi toutes les valeurs de données.

Messages d'erreurs

All error messages are delivered with http status code 409.

Code Message
E2200 Au moins un élément de données doit être spécifié.
E2201 La date de début et la date de fin ou la période relative doivent être spécifiées.
E2202 La date de début doit être antérieure à la date de fin.
E2203 Au moins une unité d'organisation doit être spécifiée.
E2204 Le seuil doit être un nombre positif.
E2205 Les résultats maximum doivent être exprimés en nombres positifs.
E2206 Le nombre maximum de résultats est supérieur à la limite maximale autorisée : 500.
E2207 La date de début des données doit être antérieure à la date de fin des données.
E2208 Valeurs de données non numériques rencontrées lors de la détection des valeurs atypiques.
E2209 La date de début des données n'est pas autorisée.
E2210 La date de fin des données n'est pas autorisée.
E2211 Les valeurs min-max de l'algorithme ne sont pas autorisées.
E2212 Il n'est pas possible de spécifier à la fois une date de début/fin et une période relative.
E2213 La valeur du paramètre orderBy n'est pas compatible avec l'algorithme Z_SCORE.
E7180 Les données analytiques des valeurs atypiques n'existent pas. Veuillez vous assurer que la tâche d'analyse a été exécutée et qu'elle n'a pas ignoré les valeurs atypiques.
E7181 La colonne dxname spécifiée dans orderBy n'est pas éligible pour orderBy ou n'existe pas.

The values in error messages are examples only.

Exemple de message d'erreur

{
  "httpStatus": "Conflict",
  "httpStatusCode": 409,
  "status": "ERROR",
  "message": "Start date and end date or relative period must be specified",
  "errorCode": "E2201"
}

Analytics query execution plan and costs including execution time estimation

L'API analytique fournit des points d'extrémité permettant d'examiner les problèmes liés à la performance des requêtes. Il est implémenté dans tous les points d'extrémité d'analyse :

  • analytics/explain
  • analytics/event/explain
  • analytics/enrollment/explain

Exemple

GET /api/analytics/explain?displayProperty=NAME
  &dimension=dx:Uvn6LCg7dVU;sB79w2hiLp8,ou:USER_ORGUNIT
  &filter=pe:THIS_YEAR&includeNumDen=false&skipMeta=false
  &skipData=true&includeMetadataDetails=true

The response will show the execution plan that the PostgreSQL planner generates for the supplied statement.

Le plan d'exécution indique comment le ou les tableau(x) référencé(s) dans l'instruction seront explorés : par un simple scan séquentiel, par un scan d'index, et si plusieurs tableaux sont référencés, quelles jointures seront utilisées pour rassembler les lignes requises à partir de chaque tableau d'entrée.

The most critical part of the display is the estimated statement execution cost, which is the query planner's estimate of how long it will take to run the statement.

Tous les points d'entrée sont sécurisés par une autorisation. Le rôle F_PERFORM_ANALYTICS_EXPLAIN est requis.

Présentation de l'analyse

/api/analytics/explain

Présentation de l'analyse d'événements

/api/analytics/event/aggregate/{program}/explain

/api/analytics/event/query/{program}/explain

Présentation de l'analyse d'inscriptions

/api/analytics/enrollment/query/{program}/explain

Présentation de l'analyse des valeurs atypiques

/api/analytics/outlierDetection/explain

Maintenance

Tableaux de ressources et d'analyse

DHIS2 comporte un ensemble de tableaux de base de données générés qui sont utilisés comme base pour diverses fonctionnalités du système. Ces tableaux peuvent être exécutés immédiatement ou programmés à intervalles réguliers via l'interface utilisateur. Ils peuvent également être générés via l'API Web, comme expliqué dans cette section. Cette tâche incombe généralement à un administrateur système et non aux clients consommateurs.

Les tables de ressources sont utilisées en interne par l'application DHIS2 pour diverses fonctions d'analyse. Ces tables sont également utiles aux utilisateurs qui rédigent des rapports SQL avancés. Elles peuvent être générées par une requête POST ou PUT à l'URL suivante :

/api/33/resourceTables

Les tableaux analytiques sont optimisés pour l'agrégation des données et sont actuellement utilisés dans DHIS2 pour le module de tableau croisé dynamique. Les tableaux d'analyse peuvent être générés à l'aide d'une requête POST ou PUT à :

/api/33/resourceTables/analytics

Tableau : Paramètres de requête facultatifs des tableaux d'analyse

Paramètre de requête Options Description
Ignorer les tableaux de ressources false true
Ignorer l'agrégat false true
Ignorer les événements false true
ignorer l'inscription false true
Ignorer la propriété de l'unité d'Organisation false true
années précédentes entier Nombre de dernières années de données à inclure

Note

lastYears=0 means latest or continuous analytics, as defined in Continuous analytics table.

Les tâches « Qualité des données “ et ” Surveillance des données » peuvent être exécutées via la tâche de surveillance, déclenchée avec le endpoint

/api/33/resourceTables/monitoring

Cette tâche analyse vos règles de validation, détecte les violations et les conserve en tant que résultats de validation.

Ces demandes sont renvoyées immédiatement et déclenchent un processus côté serveur.

Maintenance

Pour effectuer la maintenance, vous pouvez interagir avec la ressource maintenance. Vous devez utiliser POST ou PUT comme méthode pour les requêtes. Les méthodes suivantes sont disponibles.

La suppression des tables d'analyse entraîne la disparition de toutes les tables d'analyse.

POST PUT /api/maintenance/analyticsTablesClear

L'analyse des tables d'analyse permet de collecter des statistiques sur le contenu des tables d'analyse de la base de données.

POST PUT /api/maintenance/analyticsTablesAnalyze

La suppression des invitations expirées permet de supprimer toutes les invitations de comptes d'utilisateurs qui ont expiré.

POST PUT /api/maintenance/expiredInvitationsClear

L'élagage des périodes permet de supprimer les périodes qui ne sont liées à aucune valeur de données.

POST PUT /api/maintenance/periodPruning

La suppression des valeurs de données nulles permet de supprimer les valeurs de données nulles liées à des éléments de données où les données nulles sont définies comme non significatives :

POST PUT /api/maintenance/zeroDataValueRemoval

La suppression des valeurs de données supprimées de façon réversible supprime définitivement les valeurs de données supprimées de façon réversible.

POST PUT /api/maintenance/softDeletedDataValueRemoval

La suppression de l'instance de l'étape du programme supprimé de façon réversible supprime de façon permanente les événements supprimés de façon réversible.

POST PUT /api/maintenance/softDeletedProgramStageInstanceRemoval

La suppression de l'instance de programme supprimée de façon réversible supprime définitivement les inscriptions supprimées de façon réversible.

POST PUT /api/maintenance/softDeletedProgramInstanceRemoval

La suppression des instances d'entités suivies supprimées de façon réversible supprime définitivement les instances d'entités suivies supprimées de façon réversible.

POST PUT /api/maintenance/softDeletedTrackedEntityInstanceRemoval

Supprimer les vues SQL supprime toutes les vues SQL de la base de données. Notez qu'il ne supprime pas les entités de la vue SQL de DHIS2.

POST PUT /api/maintenance/sqlViewsDrop

Créer des vues SQL va recréer toutes les vues SQL dans la base de données.

POST PUT /api/maintenance/sqlViewsCreate

La mise à jour des combinaisons d'options de catégories supprimera les combinaisons d'options de catégories obsolètes et générera les combinaisons d'options de catégories manquantes pour toutes les combinaisons de catégories.

POST PUT /api/maintenance/categoryOptionComboUpdate

Il est également possible de mettre à jour les combinaisons d'options de catégorie pour une seule combinaison de catégorie en utilisant le point d'extrémité suivant.

POST PUT /api/maintenance/categoryOptionComboUpdate/categoryCombo/<category-combo-uid>

Le nettoyage du cache efface le cache d'hibernation de l'application et les caches de la partition analytique.

POST PUT /api/maintenance/cacheClear

La mise à jour des chemins des unités d'organisation va regénérer la propriété du chemin de l'unité d'organisation. Cela peut être utile, par exemple, si vous avez importé des unités d'organisation avec SQL.

POST PUT /api/maintenance/ouPathsUpdate

L'élagage des données permet de supprimer des enregistrements complets d'ensembles de données, des approbations de données, des audits de valeurs de données et des valeurs de données, dans ce cas pour une unité d'organisation.

POST PUT /api/maintenance/dataPruning/organisationUnits/<org-unit-id>

L'élagage des données pour les éléments de données, qui supprime les audits de valeurs de données et les valeurs de données.

POST PUT /api/maintenance/dataPruning/dataElements/<data-element-uid>

La validation des métadonnées appliquera toutes les règles de validation des métadonnées et renverra le résultat de l'opération.

POST PUT /api/metadataValidation

Le rechargement d'applications actualise le cache des applications installées géré par DHIS2 en lisant le système de fichiers.

POST PUT /api/appReload

Les opérations de maintenance sont prises en charge par lots au moyen d'une requête POST à la ressource api/maintenance, où les opérations sont fournies en tant que paramètres de requête :

POST PUT /api/maintenance?analyticsTablesClear=true&expiredInvitationsClear=true
  &periodPruning=true&zeroDataValueRemoval=true&sqlViewsDrop=true&sqlViewsCreate=true
  &categoryOptionComboUpdate=true&cacheClear=true&ouPathsUpdate=true

Informations sur le système

La ressource système vous fournit des informations et des fonctions pratiques. La ressource système se trouve à l'adresse /api/system.

Générer des identifiants

Pour générer des identifiants DHIS2 valides et aléatoires, vous pouvez effectuer une requête GET à cette ressource :

/api/33/system/id?limit=3

Le paramètre de requête limite est facultatif et indique le nombre d'identifiants à renvoyer avec la réponse. La valeur par défaut est de renvoyer un seul identifiant. La réponse contiendra un objet JSON avec un tableau nommé codes, similaire à ceci :

{
  "codes": [
    "Y0moqFplrX4",
    "WI0VHXuWQuV",
    "BRJNBBpu4ki"
  ]
}

Le format DHIS2 UID répond à ces critères :

  • Long de 11 caractères.

  • Caractères alphanumériques uniquement, c'est-à-dire caractères alphabétiques ou numériques (A-Za-z0-9).

  • Commencez par un caractère alphabétique (A-Za-z).

Visualiser les informations du système

Pour obtenir des informations sur le système actuel, vous pouvez envoyer une requête GET à cette URL :

/api/33/system/info

Les formats de réponse JSON et JSONP sont pris en charge. La réponse info système comprend actuellement les propriétés suivantes.

{
  "contextPath": "http://yourdomain.com",
  "userAgent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 Chrome/29.0.1547.62",
  "calendar": "iso8601",
  "dateFormat": "yyyy-mm-dd",
  "serverDate": "2021-01-05T09:16:03.548",
  "serverTimeZoneId": "Etc/UTC",
  "serverTimeZoneDisplayName": "Coordinated Universal Time",
  "version": "2.13-SNAPSHOT",
  "revision": "11852",
  "buildTime": "2013-09-01T21:36:21.000+0000",
  "serverDate": "2013-09-02T12:35:54.311+0000",
  "environmentVariable": "DHIS2_HOME",
  "javaVersion": "1.7.0_06",
  "javaVendor": "Oracle Corporation",
  "javaIoTmpDir": "/tmp",
  "javaOpts": "-Xms600m -Xmx1500m -XX:PermSize=400m -XX:MaxPermSize=500m",
  "osName": "Linux",
  "osArchitecture": "amd64",
  "osVersion": "3.2.0-52-generic",
  "externalDirectory": "/home/dhis/config/dhis2",
  "databaseInfo": {
    "type": "PostgreSQL",
    "name": "dhis2",
    "user": "dhis",
    "spatialSupport": false
  },
  "memoryInfo": "Mem Total in JVM: 848 Free in JVM: 581 Max Limit: 1333",
  "cpuCores": 8
}

Remarque

Si l'utilisateur qui demande cette ressource n'a pas toute l'autorité nécessaire, seules les propriétés qui ne sont pas considérées comme sensibles seront incluses.

Pour obtenir des informations sur le contexte du système uniquement, c'est-à-dire contextPath et userAgent, vous pouvez faire une requête GET à l'URL ci-dessous. Les formats de réponse JSON et JSONP sont supportés :

/api/33/system/context

Vérifier si la combinaison du nom d'utilisateur et du mot de passe est correcte

Pour vérifier si les informations d'identification d'un utilisateur (combinaison d'un nom d'utilisateur et d'un mot de passe) est correcte, vous pouvez envoyer une requête GET à la ressource suivante en utilisant l'option authentification de base :

/api/33/system/ping

Vous pouvez détecter le résultat de l'authentification en inspectant le code du statut HTTP de l'en-tête de la réponse. La signification des codes de statut possibles sont énumérés ci-dessous. Notez que cela s'applique aux demandes d'API Web en général.

Tableau : Codes de statut HTTP

Code de statut HTTP Description Résultat
200 OK L'authentification a réussi
302 Trouvé Aucune information d'identification n'a été fournie avec la requête - aucune authentification n'a eu lieu.
401 Non autorisé La combinaison du nom d'utilisateur et du mot de passe est incorrecte - l'authentification a échoué.

Consulter le statut d'une tâche asynchrone

Les tâches qui prennent souvent beaucoup de temps peuvent être exécutées de manière asynchrone. Après avoir initié une tâche asynchrone, vous pouvez interroger son statut via la ressource system/tasks en fournissant la catégorie de tâche et l'identifiant de la tâche qui vous intéresse.

Lorsque vous demandez le statut d'une tâche, vous devez vous authentifier en tant qu'utilisateur ayant initié la tâche. Les catégories de tâches suivantes sont prises en charge :

Tableau : Catégories de tâches

Identificateur Description
TABLE_ANALYTIQUE Génération des tableaux analytiques.
TABLE_DE RESSOURCES Génération des tableaux de ressources.
SURVEILLANCE Traitement des règles de validation des données de surveillance/contrôle.
IMPORTATION_DE DONNÉES Importation de données.
IMPORTATION_D'ÉVÉNEMENTS Importation d'événements.
IMPORTATION_D'INSCRIPTION Importation des inscriptions.
IMPORTATION_D'IES Importation d'instances d'entités suivies.
IMPORTATION_DE MÉTADONNÉES Importation de métadonnées.
INTÉGRITÉ_DES DONNÉES Traitement des contrôles d'intégrité des données.

Chaque tâche asynchrone se voit automatiquement attribuer un identifiant qui peut être utilisé pour contrôler le statut de la tâche. Cet identifiant de tâche est renvoyé par l'API lorsque vous lancez une tâche asynchrone via les différents endpoints activés asynchrones.

Monitoring a task

Vous pouvez consulter l'état des tâches par le biais d'une requête GET à la ressource des tâches du système, comme suit :

/api/33/system/tasks/{task-category-id}/{task-id}

Un exemple de requête peut ressembler à ceci :

/api/33/system/tasks/DATAVALUE_IMPORT/j8Ki6TgreFw

La réponse fournira des informations sur le statut, telles que le niveau de notification, la catégorie, l'heure et le statut. La propriété terminé indique si le processus est considéré comme terminé.

[{
  "uid": "hpiaeMy7wFX",
  "level": "INFO",
  "category": "DATAVALUE_IMPORT",
  "time": "2015-09-02T07:43:14.595+0000",
  "message": "Import done",
  "completed": true
}]

Monitoring all tasks for a category

Vous pouvez consulter toutes les tâches d'une catégorie spécifique par le biais d'une requête GET vers la ressource des tâches du système :

/api/33/system/tasks/{task-category-id}

Un exemple de requête pour consulter le statut des tâches d'importation de données ressemble à ceci :

/api/33/system/tasks/DATAVALUE_IMPORT

Monitor all tasks

Vous pouvez demander une liste de toutes les tâches en cours d'exécution dans le système avec une requête GET à la ressource tâches du système :

/api/33/system/tasks

La réponse ressemblera à ceci :

[{
  "EVENT_IMPORT": {},
  "DATA_STATISTICS": {},
  "RESOURCE_TABLE": {},
  "FILE_RESOURCE_CLEANUP": {},
  "METADATA_IMPORT": {},
  "CREDENTIALS_EXPIRY_ALERT": {},
  "SMS_SEND": {},
  "MOCK": {},
  "ANALYTICSTABLE_UPDATE": {},
  "COMPLETE_DATA_SET_REGISTRATION_IMPORT": {},
  "DATAVALUE_IMPORT": {},
  "DATA_SET_NOTIFICATION": {},
  "DATA_INTEGRITY": {
    "OB1qGRlCzap": [{
      "uid": "LdHQK0PXZyF",
      "level": "INFO",
      "category": "DATA_INTEGRITY",
      "time": "2018-03-26T15:02:32.171",
      "message": "Data integrity checks completed in 38.31 seconds.",
      "completed": true
    }]
  },
  "PUSH_ANALYSIS": {},
  "MONITORING": {},
  "VALIDATION_RESULTS_NOTIFICATION": {},
  "REMOVE_EXPIRED_RESERVED_VALUES": {},
  "DATA_SYNC": {},
  "SEND_SCHEDULED_MESSAGE": {},
  "DATAVALUE_IMPORT_INTERNAL": {},
  "PROGRAM_NOTIFICATIONS": {},
  "META_DATA_SYNC": {},
  "ANALYTICS_TABLE": {},
  "PREDICTOR": {}
}]

View asynchronous task summaries

La ressource résumés de tâches vous permet de récupérer un résumé d'une invocation d'une tâche asynchrone. Vous devez spécifier la catégorie et, éventuellement l'identifiant de la tâche. L'identifiant de la tâche peut être récupéré à partir de la réponse de la requête API qui a initié la tâche asynchrone.

Pour récupérer le résumé d'une tâche spécifique, vous pouvez envoyer une requête à :

/api/33/system/taskSummaries/{task-category-id}/{task-id}

Un exemple de requête pourrait ressembler à ceci :

/api/33/system/taskSummaries/DATAVALUE_IMPORT/k72jHfF13J1

La réponse ressemblera à ceci :

{
  "responseType": "ImportSummary",
  "status": "SUCCESS",
  "importOptions": {
    "idSchemes": {},
    "dryRun": false,
    "async": true,
    "importStrategy": "CREATE_AND_UPDATE",
    "reportMode": "FULL",
    "skipExistingCheck": false,
    "sharing": false,
    "skipNotifications": false,
    "datasetAllowsPeriods": false,
    "strictPeriods": false,
    "strictCategoryOptionCombos": false,
    "strictAttributeOptionCombos": false,
    "strictOrganisationUnits": false,
    "requireCategoryOptionCombo": false,
    "requireAttributeOptionCombo": false,
    "skipPatternValidation": false
  },
  "description": "Import process completed successfully",
  "importCount": {
    "imported": 0,
    "updated": 431,
    "ignored": 0,
    "deleted": 0
  },
  "dataSetComplete": "false"
}

Vous pouvez également récupérer des résumés d'importation pour plusieurs tâches d'une catégorie spécifique avec une requête comme celle-ci :

/api/33/system/taskSummaries/{task-category-id}

Obtenir des informations sur la présentation

Vous pouvez récupérer les icônes de drapeaux disponibles au format JSON à l'aide d'une requête GET :

/api/33/system/flags

Vous pouvez récupérer les styles d'interface utilisateur disponibles au format JSON à l'aide d'une requête GET :

/api/33/system/styles

Cluster info

Lorsque DHIS 2 est configuré en cluster, il est utile de savoir quel nœud du cluster agit en tant que principal nœud du cluster. L'API suivante peut être utilisée pour obtenir les détails de l'instance du nœud principal. L'API prend en charge les formats JSON et XML.

GET /api/36/cluster/leader

Un exemple de réponse JSON ressemble à ceci :

{
  "leaderNodeId": "play-dhis2-org-dev",
  "leaderNodeUuid": "d386e46b-26d4-4937-915c-025eb99c8cad",
  "currentNodeId": "play-dhis2-org-dev",
  "currentNodeUuid": "d386e46b-26d4-4937-915c-025eb99c8cad",
  "leader": true
}

Min-max data elements

La ressource éléments de données min-max vous permet de définir des plages de valeurs minimales et maximales pour les éléments de données. Elle est unique en raison de la combinaison de l'unité d'organisation, de l'élément de données et de l'option de catégorie.

/api/minMaxDataElements

Tableau : Structure des données de l'élément Min-max

Élément Description Type de données
source Identifiant de l'unité d'organisation Chaîne
dataElement Identifiant de l'élément de données Chaîne
Combinaison d'options Identifiant de la combinaison d'options de catégorie de l'élément de données Chaîne
min Valeur minimale Entier
max Valeur maximale Entier
généré Indique si cet objet est généré par le système (et non défini manuellement). Booléen

Vous pouvez obtenir une liste de tous les éléments de données min-max à partir de la ressource suivante :

GET /api/minMaxDataElements.json

Vous pouvez filtrer la réponse comme suit :

GET /api/minMaxDataElements.json?filter=dataElement.id:eq:UOlfIjgN8X6

GET /api/minMaxDataElements.json?filter=dataElement.id:in:[UOlfIjgN8X6,xc8gmAKfO95]

Le paramètre de filtrage des éléments de données min-max prend en charge deux opérateurs : eq et in. Vous pouvez également utiliser le paramètre de requête fields.

GET /api/minMaxDataElements.json?fields=:all,dataElement[id,name]

Add/update single min-max data element

Pour ajouter un nouvel élément de données min-max, utilisez la requête POST à :

POST /api/minMaxDataElements.json

Le format de contenu JSON se présente comme suit :

{
  "min": 1,
  "generated": false,
  "max": 100,
  "dataElement": {
    "id": "UOlfIjgN8X6"
   },
  "source": {
    "id": "DiszpKrYNg8"
  },
  "optionCombo": {
    "id": "psbwp3CQEhs"
  }
}

Si la combinaison de l'élément de données, de l'unité d'organisation et de la catégorie existe, la valeur min-max sera mise à jour.

Delete single min-max data element

Pour supprimer un élément de données min-max, envoyez une requête avec la méthode DELETE :

DELETE /api/minMaxDataElements.json

Le contenu JSON est dans le même format que ci-dessus :

{
  "min": 1,
  "generated": false,
  "max": 100,
  "dataElement": {
    "id": "UOlfIjgN8X6"
   },
  "source": {
    "id": "DiszpKrYNg8"
  },
  "optionCombo": {
    "id": "psbwp3CQEhs"
  }
}

Add/update multiple min-max data elements

To add or update multiple min-max data elements, you can use a POST request to the following resource:

POST /api/minMaxDataElements/upsert

The JSON content format for multiple min-max data elements looks like this:

[
{
  "dataSet": "BfMAe6Itzgt",
  "values": [
    {
      "dataElement": "s46m5MS0hxu",
      "orgUnit": "Qc9lf4VM9bD",
      "optionCombo": "Prlt0C1RF0s",
      "minValue": 27,
      "maxValue": 564
    },
    {
      "dataElement": "s46m5MS0hxu",
      "orgUnit": "Qc9lf4VM9bD",
      "optionCombo": "V6L425pT3A0",
      "minValue": 0,
      "maxValue": 100
    }
]

Note that the dataSet property is required in the request body when using JSON. Each min-max value should contain UID references to dataElement, orgUnit, optionCombo. The minValue and maxValue properties represent the minimum and maximum values for the data element, respectively and will be parsed as integers.

You can also specify the generated property if you want to indicate whether the min-max data element is generated by the system or set manually. If not specified, it defaults to true.

Gzipped JSON payloads are also supported for this endpoint, which can be useful for large datasets. The server will automatically decompress the gzipped content. If you send a gzipped payload, make sure to set the Content-Encoding header to gzip and include the Content-Type header with the value application/json. The payload itself should be part of the request body.

CSV payloads are also supported for this endpoint. The CSV file should be delimited with commas. You should set the Content-Type header to text/csv and the Accept header to application/json. You will also need to specify the dataSet query parameter in the request URL. The CSV payload should contain the following columns:

Column Name Description
dataElement The UID of the data element
orgUnit The UID of the organisation unit
Combinaison d'options The UID of the category option combo
minValue The minimum value for the data element
maxValue The maximum value for the data element
généré (optional) Indicates whether the min-max data element is generated by the system or set manually. Defaults to true if not specified.

An example CSV payload might look like this:

dataElement,orgUnit,optionCombo,minValue,maxValue,generated
s46m5MS0hxu,Qc9lf4VM9bD,Prlt0C1RF0s,27,564,false
s46m5MS0hxu,Qc9lf4VM9bD,V6L425pT3A0,0,100,true

Delete multiple min-max data elements

To delete multiple min-max data elements, you can use a DELETE request to the following resource:

DELETE /api/minMaxDataElements/delete

The JSON content for the request body should be in the same format as for adding or updating multiple min-max data elements, but you only need to specify the dataElement, orgUnit, and optionCombo properties for each min-max data element you want to delete. The minValue, maxValue, and generated properties are not required for deletion. Gzipped JSON payloads and CSV payloads are also supported for this endpoint, similar to the add/update multiple min-max data elements endpoint. Be sure to set the appropriate headers (Content-Encoding as gzip and Content-Type as application/csv or application/json) when sending the request. If using CSV, you will also need to specify the dataSet query parameter in the request URL.

Exceptions de verrouillage

La ressource exceptions de blocage vous permet d'ouvrir des ensembles de données verrouillés pour la saisie de données pour un ensemble de données, une période et une unité d'organisation spécifiques. Vous pouvez lire les exceptions de verrouillage à partir de la ressource suivante :

/api/lockExceptions

Pour créer une nouvelle exception de verrouillage, vous pouvez utiliser une requête POST et spécifier l'ensemble de données, la période et l'unité d'organisation :

POST /api/lockExceptions?ds=BfMAe6Itzgt&pe=201709&ou=DiszpKrYNg8

Pour supprimer une exception de verrouillage, vous pouvez utiliser une syntaxe de demande similaire avec une requête DELETE :

DELETE /api/lockExceptions?ds=BfMAe6Itzgt&pe=201709&ou=DiszpKrYNg8

Data summary

The data summary resource provides some metrics about the database and level of system usage. The metrics include: Data statistics can be accessed with a GET request to :

GET /api/dataSummary

A JSON response similar to the one below is provided. We will explain the various parts of the response in the following sections.

Object counts represent the number of different metadata objects in the system. These counts can be useful for monitoring the size and complexity of a DHIS2 instance. An example of the objectCounts part of the response is shown below: Note that these values represent the number of objects at a specific point in time and will change as data is added or removed from the system.

"objectCounts": {
"indicator": 77,
"trackerevent": 55781,
"trackedEntity": 73125,
"visualization": 292,
"period": 384,
"organisationUnit": 1332,
"validationRule": 37,
"dataValue": 4935894,
"dataElement": 1037,
"program": 14,
"organisationUnitGroup": 18,
"singleevent": 317816,
"enrollment": 73126,
"indicatorType": 5,
"eventVisualization": 50,
"event": 373597,
"indicatorGroup": 17,
"dataSet": 26,
"userGroup": 34,
"user": 131,
"dataElementGroup": 84,
"map": 91,
"dashboard": 27
}

In addition to object counts, the data summary response also includes various usage statistics related to users and data in the form of histograms. activeUsers represents the number of users who have performed an action which results in a data statistics event (opened a dashboard, viewed a report, etc.) over the past hour (0), today (1), last 2 days (2), last 7 days (7) and last 30 days (30). Note that the "today" value represents the number of unique users who have been active since midnight server time, while the "last 2 days", "last 7 days" and "last 30 days" values represent the number of unique users who have been active in the respective time periods calculated backwards from the current time. logins represents the number of successful user logins over the same time periods. userInvitations provides the number of user invitations currently in the system, both total and expired. An example of these parts of the response is shown below:

"activeUsers": {
"0": 1,
"1": 1,
"2": 1,
"7": 2,
"30": 2
},
"logins": {
"0": 1,
"1": 1,
"2": 131,
"7": 131,
"30": 131
},
"userInvitations": {
"all": 0,
"expired": 0
}

In addition, the data summary response includes information about different types of data stored in the system. dataValueCount represents the number of data values entered into the system over the past hour (0), today (1), last 7 days (7) and last 30 days (30). singleEventCount and trackerEventCount represents the number of single events and tracker events entered into the system over the same time periods.

"dataValueCount": {
"0": 0,
"1": 0,
"7": 0,
"30": 0
},
"eventCount": {
"0": 0,
"1": 0,
"7": 1,
"30": 2
}
....

Finally, the data summary response includes information about the system itself, such as the version, revision, build time, system ID and current server date. An example of the system part of the response is shown below:

"system": {
"version": "2.43-SNAPSHOT",
"revision": "db516b5",
"buildTime": "2025-11-18T10:53:50.000",
"systemId": "eed3d451-4ff5-4193-b951-ffcc68954299",
"serverDate": "2025-11-18T10:55:15.048"
}

Data summary Prometheus metrics

In order to support the long-term monitoring of DHIS2 instances, a special endpoint is available which outputs the data summary information in the Prometheus text exposition format. This can be fetched from the server by making a GET request to : GET api/dataSummary/metrics

An example of the output is provided below

# HELP data_summary_object_counts Count of metadata objects { #help-data_summary_object_counts-count-of-metadata-objects } 
# TYPE data_summary_object_counts gauge { #type-data_summary_object_counts-gauge } 
data_summary_object_counts{type="indicator"} 77
data_summary_object_counts{type="trackedEntity"} 73125
data_summary_object_counts{type="visualization"} 292
data_summary_object_counts{type="period"} 384
data_summary_object_counts{type="programStageInstance"} 373597

This endpoint provides essentially the same information as the api/dataSummary endpoint, but in a format which Prometheus is capable of scraping and importing. Most of the metrics represent object counts, such as the current number of data elements, organization units, etc.

The build information metric is explained in more detail below.

# HELP data_summary_build_info Build information { #help-data_summary_build_info-build-information } 
# TYPE data_summary_build_info gauge { #type-data_summary_build_info-gauge } 
data_summary_build_info{version="2.42-SNAPSHOT", commit="932e552"} 1737621197

This metric represents the current version and commit hash of the server. The metric itself is an integer and represents the build time as seconds since the epoch. This metric can be easily converted or to an actual date when needed.

Note On systems with large amounts of data, the dataValueCount and eventCount metrics may take a long time to compute due to the large number of records in the database. Users should thus use caution if scraping metrics from this endpoint as it may impact the performance of the server. It should generally be sufficient to scrape this endpoint once per day, since this will provide a good overview of the system usage and performance.

Data exchange

Aggregate data exchange

Cette section décrit le service d'échange de données agrégées et l'API.

Introduction

Le service d'échange de données agrégées permet d'échanger des données entre des instances de DHIS 2, et éventuellement d'autres logiciels qui prennent en charge le format JSON de l'ensemble des valeurs de données de DHIS 2. Il permet également l'échange de données au sein d'une seule instance de DHIS 2, par exemple pour l'agrégation de données de suivi et l'enregistrement du résultat en tant que données agrégées.

Le service d'échange de données agrégées est adapté à des cas d'utilisation tels que :

  • L'échange de données entre une instance HMIS et un portail de données ou une instance d'entrepôt de données de DHIS 2.
  • L'échange de données entre une instance de suivi DHIS 2 contenant des données individuelles et une instance HMIS agrégée.
  • Le calcul préalable des données de suivi avec les indicateurs de programme sauvegardés en tant que valeurs de données agrégées.
  • La déclaration des données d'un HMIS national à un bailleur de fonds mondial.

Aperçu

Le service d'échange de données agrégées permet l'échange de données entre une instance source du DHIS 2 et une instance cible du DHIS 2. Un échange de données peut être externe, c'est-à-dire que l'instance cible est différente/externe à l'instance source. Un échange de données peut également être interne, l'instance cible étant la même que l'instance source. La source d'échange de données agrégées peut contenir plusieurs requêtes de source, une requête de source correspondant à peu près à une requête d'API analytique.

La valeur des données sera récupérée et transformée dans le format ensemble de valeurs de données, puis transmise à l'instance cible de DHIS 2. Le service d'échange de données agrégées prend en charge les systèmes d'identification pour permettre une certaine souplesse dans le mapping des métadonnées entre les instances.

Les données seront récupérées et agrégées à partir de l'instance source à l'aide du moteur d'analyse. Cela implique que les éléments de données, les indicateurs agrégés, les taux de déclaration des ensembles de données et les indicateurs de programme peuvent être référencés dans la requête adressée à l'instance source. Une demande de source contient également des périodes, où les périodes fixes et relatives sont prises en charge, et des unités d'organisation. Un nombre quelconque de filtres peut être appliqué à une requête source.

Un échange de données peut être exécuté en tant que tâche planifiée, c'est-à-dire que l'échange de données peut être programmé pour être exécuté à un intervalle spécifique. Un échange de données peut également être exécuté sur demande via l'API.

Pour créer et manipuler des échanges de données agrégées, les autorités F_AGGREGATE_DATA_EXCHANGE_PUBLIC_ADD / F_AGGREGATE_DATA_EXCHANGE_PRIVATE_ADD et F_AGGREGATE_DATA_EXCHANGE_DELETE sont nécessaires.

Les définitions d'échange de données agrégées sont des métadonnées normales dans DHIS 2, ce qui signifie que les définitions peuvent être importées et exportées entre les instances de DHIS 2, à l'exception des informations d'identification (noms d'utilisateur et jetons d'accès) qui ne seront pas exposées dans les exportations de métadonnées. Les informations d'identification sont cryptées lors du stockage afin de fournir une couche de sécurité supplémentaire.

Le service d'échange de données agrégées a été introduit dans la version 2.39, ce qui signifie que l'instance source de DHIS 2 doit être la version 2.39 ou ultérieure. L'instance cible du DHIS 2 doit être la version 2.38 ou ultérieure.

Authentication

Pour les échanges de données de type externe, l'URL de base et les informations d'authentification de l'instance DHIS 2 cible doivent être spécifiées. Pour l'authentification, l'authentification de base et les jetons d'accès personnels (PAT) sont pris en charge.

Il est recommandé de spécifier soit l'authentification de base, soit l'authentification PAT. Si les deux sont spécifiées, l'authentification PAT est prioritaire.

Notez que la prise en charge de PAT a été introduite dans la version 2.38.1, ce qui signifie que pour utiliser l'authentification PAT, l'instance DHIS 2 cible doit être la version 2.38.1 ou une version ultérieure.

Partage

Like other metadata objects, fine-grained security can be associated with aggregate data exchanges. Each exchange can be shared with individual users and/or user groups to control which users have access to the specific exchange. External data exchanges contain authentication details of users on the target system, thus great care should be taken to ensure that only authorized users have access to actually submit data which results from the exchange.

The following table summarizes how sharing can be used with aggregate data exchanges.

Partage Effective permissions
"r-------" Can view metadata of the data exchange.
"-w------" Can edit metadata of the data exchange.
"--r-----" Can view data which is part of the exchange.
"---w----" Can submit data which is part of the exchange.

API

L'API d'échange de données agrégées est abordée dans la section qui suit.

Create aggregate data exchange

POST /api/aggregateDataExchanges
Type de contenu : application/json

Exemple de charge utile d'échange de données internes, où les données d'événement sont calculées avec les indicateurs de programme et sauvegardées en tant que valeurs de données agrégées :

{
  "name": "Internal data exchange",
  "source": {
    "params": {
      "periodTypes": [
        "MONTHLY",
        "QUARTERLY"
      ]
    },
    "requests": [
      {
        "name": "ANC",
        "visualization": null,
        "dx": [
          "fbfJHSPpUQD",
          "cYeuwXTCPkU",
          "Jtf34kNZhzP"
        ],
        "pe": [
          "LAST_12_MONTHS",
          "202201"
        ],
        "ou": [
          "ImspTQPwCqd"
        ],
        "filters": [
          {
            "dimension": "Bpx0589u8y0",
            "items": [
              "oRVt7g429ZO",
              "MAs88nJc9nL"
            ]
          }
        ],
        "inputIdScheme": "UID",
        "outputDataElementIdScheme": "UID",
        "outputOrgUnitIdScheme": "UID",
        "outputIdScheme": "UID"
      }
    ]
  },
  "target": {
    "type": "INTERNAL",
    "request": {
      "dataElementIdScheme": "UID",
      "orgUnitIdScheme": "UID",
      "categoryOptionComboIdScheme": "UID",
      "idScheme": "UID"
    }
  }
}

Exemple de charge utile d'échange de données externes avec authentification de base et schéma d'identification code, où les données sont transmises à une instance DHIS 2 externe :

{
  "name": "External data exchange with basic authentication",
  "source": {
    "requests": [
      {
        "name": "ANC",
        "visualization": null,
        "dx": [
          "fbfJHSPpUQD",
          "cYeuwXTCPkU",
          "Jtf34kNZhzP"
        ],
        "pe": [
          "LAST_12_MONTHS",
          "202201"
        ],
        "ou": [
          "ImspTQPwCqd"
        ],
        "inputIdScheme": "UID",
        "outputIdScheme": "CODE"
      }
    ]
  },
  "target": {
    "type": "EXTERNAL",
    "api": {
        "url": "https://play.dhis2.org/2.38.2.1",
        "username": "admin",
        "password": "district"
    },
    "request": {
      "idScheme": "CODE"
    }
  }
}

Exemple de charge utile d'échange de données externes avec authentification PAT et schéma d'identification code, où les données sont transmises à une instance DHIS 2 externe :

{
  "name": "External data exchange with PAT authentication",
  "source": {
    "requests": [
      {
        "name": "ANC",
        "dx": [
          "fbfJHSPpUQD",
          "cYeuwXTCPkU",
          "Jtf34kNZhzP"
        ],
        "pe": [
          "LAST_12_MONTHS",
          "202201"
        ],
        "ou": [
          "ImspTQPwCqd"
        ],
        "inputIdScheme": "UID",
        "outputIdScheme": "CODE"
      }
    ]
  },
  "target": {
    "type": "EXTERNAL",
    "api": {
        "url": "https://play.dhis2.org/2.38.2.1",
        "accessToken": "d2pat_XIrqgAGjW935LLPuSP2hXSZwpTxTW2pg3580716988"
    },
    "request": {
      "idScheme": "CODE"
    }
  }
}

La syntaxe des demandes de source suit la syntaxe de l'API du point d'extrémité de l'analyse. Cela signifie que pour la partie dx, les éléments de données, les indicateurs, les taux de déclaration des ensembles de données, les éléments de données de programme et les indicateurs de programme sont pris en charge. Notez que pour les éléments de données de programme, l'élément de données doit être préfixé avec l'identifiant du programme. Pour la partie pe, les périodes relatives ainsi que les périodes fixes sont prises en charge. Pour la partie ou, les unités d'organisation d'utilisateurs, les niveaux d'unités d'organisation et les groupes d'unités d'organisation ainsi que les unités d'organisation individuelles sont pris en charge. Pour une explication complète, veuillez consulter le chapitre Analytiques > les sections Dimensions et éléments et La dimension dx.

Réponse
201 Créés
{
  "httpStatus": "Created",
  "httpStatusCode": 201,
  "status": "OK",
  "response": {
    "responseType": "ObjectReport",
    "uid": "pG4bBTMiCqO",
    "klass": "org.hisp.dhis.dataexchange.aggregate.AggregateDataExchange",
    "errorReports": []
  }
}

Update aggregate data exchange

PUT /api/aggregateDataExchanges/{id}
Type de contenu : application/json

Le contenu de la requête est identique à celui de l'opération de création.

Réponse
200 OK
{
  "httpStatus": "OK",
  "httpStatusCode": 200,
  "status": "OK",
  "response": {
    "responseType": "ObjectReport",
    "uid": "pG4bBTMiCqO",
    "klass": "org.hisp.dhis.dataexchange.aggregate.AggregateDataExchange",
    "errorReports": []
  }
}

Get aggregate data exchange

GET /api/aggregateDataExchanges/{id}
Accepter: application/json

Les points d'extrémité de récupération suivent la sémantique habituelle de filtrage des champs et des objets des points d'extrémité de métadonnées. JSON est le seul format de réponse pris en charge.

Réponse
200 OK

Delete aggregate data exchange

DELETE /api/aggregateDataExchanges/{id}
Réponse
204 No Content
{
  "httpStatus": "OK",
  "httpStatusCode": 200,
  "status": "OK",
  "response": {
    "responseType": "ObjectReport",
    "uid": "pG4bBTMiCqO",
    "klass": "org.hisp.dhis.dataexchange.aggregate.AggregateDataExchange",
    "errorReports": []
  }
}

Run aggregate data exchange

Un échange de données agrégées peut être exécuté directement à l'aide d'une requête POST au point d'extrémité suivant :

POST /api/aggregateDataExchanges/{id}/exchange
Réponse
200 OK
{
  "responseType": "ImportSummaries",
  "status": "SUCCESS",
  "imported": 36,
  "updated": 0,
  "deleted": 0,
  "ignored": 0,
  "importSummaries": ["<import summaries here>"]
}

Un résumé d'importation décrivant le résultat de l'échange de données sera renvoyé, y compris le nombre de valeurs de données qui ont été importées, mises à jour, supprimées et ignorées.

Get source data

Les données agrégées pour la requête source d'un échange de données agrégées peuvent être récupérées dans le format de données analytiques avec une requête GET au point d'extrémité suivant :

GET /api/aggregateDataExchanges/{id}/sourceData
Accept: application/json
Réponse
200 OK
Query parameters
Paramètre de requête Obligatoire Description Options
outputIdScheme (schéma d'identification de la sortie) Non Remplacer le schéma d'identification de la sortie pour la réponse aux données. UID | CODE | ATTRIBUT:{ID}

Le format de la charge utile de la réponse est identique à celui du point d'extrémité de l'API d'analyse. Ce point final est utile à des fins de débogage. Veuillez consulter le guide de l'API d'analyse pour plus de détails.

Get source data value sets

Les données agrégées pour la requête source d'un échange de données agrégées peuvent être récupérées dans le format de l'ensemble de valeurs de données avec une requête GET au point d'extrémité suivant :

GET /api/aggregateDataExchanges/{id}/sourceDataValueSets
Accept: application/json
Réponse
200 OK
Query parameters
Paramètre de requête Obligatoire Description Options
outputIdScheme (schéma d'identification de la sortie) Non Remplacer le schéma d'identification de la sortie pour la réponse aux données. UID | CODE | ATTRIBUT:{ID}

Le format de la charge utile de la réponse est identique à celui du point d'extrémité de l'API relatif aux ensembles de valeurs de données. Ce point d'extrémité est utile à des fins de débogage. Veuillez consulter le guide de l'API sur les ensembles de valeurs de données pour plus d'informations.

Data model

Le modèle de données d'échange de données agrégées / charge utile est décrit dans la section qui suit.

Champ Type de données Obligatoire Description
name Chaîne Oui Nom de l'échange de données agrégées. Unique.
source Objet Oui Source d'échange de données agrégées.
source.params (paramètres source) Objet Non Paramètres pour la requête source.
source.params.periodTypes (Types de période des paramètres.source) Tableau/Chaîne Non Types de période autorisés pour remplacer les périodes dans la requête source.
source.requests (requêtes source) Tableau/Objet Oui Requêtes de la source.
requêtes source (nom des requêtes source) Chaîne Oui Nom de la requête source.
source.requests.visualization (visualisations des requêtes source) Chaîne Non Identifiant de l'objet de visualisation associé.
source.requests.dx (requêtes source.dx) Tableau/Chaîne Oui Identifiants des éléments de données, des indicateurs, des ensembles de données et des indicateurs de programme pour la requête source.
source.requests.pe (requêtes source.pe) Tableau/Chaîne Oui Identifiants des périodes fixes et relatives pour la requête source.
source.requests.ou (requêtes source ou) Tableau/Chaîne Oui Identifiants des unités d'organisation pour la requête source.
source.requests.filters (filtres de requêtes source) Tableau (Objet) Non Filtres pour la requête source.
source.requests.filters.dimension (dimensions des filtres de requêtes source) Chaîne Non Identifiant de dimension pour le filtre.
source.requests.filters.items (éléments des filtres de requêtes source) Tableau/Chaîne Non Identifiants des éléments du filtre.
source.requests.inputIdScheme ( Schéma d'identification d'entrée des requêtes source ) Chaîne Non Le schéma de l'Identifiant d'entrée peut être UID, CODE, ATTRIBUTE:{ID}.
source.requests.outputDataElementIdScheme ( Schéma d'identification de l'élément de données de sortie des requêtes source) Chaîne Non Le schéma de l'identifiant de l'élément de données de sortie peut être UID, CODE, ATTRIBUTE:{ID}.
source.requests.outputDataItemIdScheme Chaîne Non Output data item ID scheme applies to data elements, indicators and program indicators, can be UID, CODE, ATTRIBUTE:{ID}.
source.requests.outputOrgUnitIdScheme ( Schéma d'identification de l'unité d'organisation de sortie des requêtes source) Chaîne Non Le schéma d'identification de l'unité d'organisation de sortie, peut être UID, CODE, ATTRIBUTE:{ID}.
source.requests.outputIdScheme (Schéma d'identification de sortie des requêtes source) Chaîne Non Le schéma d'identification général de sortie peut être UID, CODE, ATTRIBUTE:{ID}.
source.cible Objet Oui Cible pour l'échange de données agrégées.
source.target.type (type de source cible) Chaîne Oui Le type de cible peut être EXTERNE, INTERNE.
source.target.api (api de la source cible) Objet Conditionnel Informations sur l'API cible, obligatoires uniquement pour le type EXTERNAL.
source.target.api.url (url de l'api de la source cible) Chaîne Conditionnel URL de base de l'instance DHIS 2 ciblée, ne pas inclure la partie /api.
source.target.api.accessToken (jeton d'accès de l'api de la source cible) Chaîne Conditionnel Jeton d'accès (PAT) pour l'instance DHIS 2 ciblée, utilisé pour l'authentification PAT.
source.target.api.username ( nom d'utilisateur de l'api de la source cible) Chaîne Conditionnel Nom d'utilisateur de l'instance DHIS 2 ciblée, utilisé pour l'authentification de base.
source.target.api.password (mot de passe de l'api de la source cible) Chaîne Conditionnel Mot de passe de l'instance DHIS 2 ciblée, utilisé pour l'authentification de base.
source.target.request (requête de la source cible) Objet Non Informations sur la requête cible.
source.target.request.dataElementIdScheme ( Schéma de la requête d'identification de l'élément de données de la source cible) Chaîne Non Le schéma d'identification de l'élément de données d'entrée peut être UID, CODE, ATTRIBUTE:{ID}.
source.target.request.orgUnitIdScheme ( Schéma de la requête d'identification de l'unité d'organisation de la source cible) Chaîne Non Le schéma d'identification de l'unité d'organisation d'entrée, peut être UID, CODE, ATTRIBUTE:{ID}.
source.target.request.categoryOptionComboIdScheme ( Schéma de la requête d'identification de la combinaison d'option de catégorie de la source cible) Chaîne Non Le schéma d'identification de la combinaison d'options de catégorie d'entrée peut être UID, CODE, ATTRIBUTE:{ID}.
source.target.request.idScheme ( Schéma de la requête d'identificationn de la source cible ) Chaîne Non Le schéma d'identification général de l'entrée peut être UID, CODE, ATTRIBUTE:{ID}.
source.target.request.importStrategy Chaîne Non Import strategy, can be CREATE_AND_UPDATE, CREATE, UPDATE, DELETE.
source.target.request.skipAudit Booléen Non "Ignorer l'audit" signifie que les valeurs d'audit ne seront pas générées. Améliore les performances au détriment de la capacité à auditer les modifications. Nécessite l'autorité "F_SKIP_DATA_IMPORT_AUDIT".
source.target.request.dryRun Booléen Non Détermine s'il faut sauvegarder les modifications sur le serveur ou renvoyer le récapitulatif de l'importation.

Error handling

Lors de l'exécution d'un échange de données par identifiant, des informations sur le résultat de l'opération seront disponibles dans la charge utile de la réponse. La réponse contiendra une liste de résumés d'importation, c'est-à-dire un résumé d'importation par requête source. Le résumé d'importation indiquera tout conflit potentiel résultant de l'extraction des données de l'instance source et de l'importation des données dans l'instance cible.

Exemples

External data exchange with identifier scheme code

Cet exemple montre comment échanger des données basées sur des indicateurs de programme dans l'instance source de DHIS 2 et des éléments de données dans l'instance cible. Le schéma d'identification code signifie que l'échange de données utilisera la propriété code des métadonnées pour référencer les données. L'utilisation de codes est utile lorsque les propriétés de l'identifiant ne correspondent pas d'une instance DHIS 2 à l'autre. L'exemple montre comment les données peuvent être agrégées dans l'instance source, y compris l'agrégation dans le temps et la hiérarchie des unités, avant d'être échangées avec l'instance cible.

L'exemple échangera des données en utilisant l'environnement de jeu DHIS 2, et se référera à la version 2.39 à https://play.dhis2.org/2.39 comme instance source, et à la version 2.38 à https://play.dhis2.org/2.38.2.1 comme instance cible. Notez que les URL changeront au fil du temps, à mesure que de nouvelles versions de correctifs seront publiées, donc assurez-vous de mettre à jour les URL cibles.

  • Connectez-vous à l'instance source, naviguez jusqu'à l'application Maintenance et vérifiez l'existence de trois indicateurs de programme.

  • doses de BCG avec le code BCG_DOSE

  • _Doses de rougeole_avec le code MEASLES_DOSE
  • doses de fièvre jaune avec le code YELLOW_FEVER_DOSE

  • Observez que l'unité d'org racine est Sierra Leone avec le code OU_525.

  • Connectez-vous à l'instance cible et accédez à l'application Maintenance. Créez trois éléments de données, dont les codes correspondent aux indicateurs de programme mentionnés précédemment :

  • Nom doses de BCG et le code BCG_DOSE

  • Nom_doses de rougeole_ et le code MEASLES_DOSE
  • Nom doses de fièvre jaune avec le code YELLOW_FEVER_DOSE

  • Dans l'instance cible, créez un nouvel ensemble de données avec un nom quelconque, par exemple Échange de données, sélectionnez les trois éléments de données nouvellement créés et affectez l'ensemble de données à l'unité d'organisation principale Sierra Leone.

  • Notons que l'unité d'organisation racine Sierra Leone a le code OU_525, qui est égal à l'instance source.

  • Ouvrez un outil HTTP tel que Postman et créez la charge utile d'échange de données agrégées suivante en JSON.

    POST /api/aggregateDataExchanges
    
Content-Type: application/json
{
  "name": "Immunization doses program indicators to data elements",
  "source": {
    "requests": [
      {
        "name": "Immunization doses",
        "dx": [
          "BCG_DOSE",
          "MEASLES_DOSE",
          "YELLOW_FEVER_DOSE"
        ],
        "pe": [
          "202201"
        ],
        "ou": [
          "OU_525"
        ],
        "inputIdScheme": "code",
        "outputIdScheme": "code"
      }
    ]
  },
  "target": {
    "type": "EXTERNAL",
    "api": {
      "url": "https://play.dhis2.org/2.38.2.1",
      "username": "admin",
      "password": "district"
    },
    "request": {
      "idScheme": "code"
    }
  }
}
  • Dans cette charge utile, on remarque que pour la requête source, les indicateurs de programme sont référencés à l'aide de codes. Le paramètre inputIdScheme est fixé à code, ce qui signifie que le moteur d'analyse de DHIS 2 utilisera la propriété code pour référencer les métadonnées, telles que les indicateurs de programme. Le paramètre outputIdScheme est fixé à code, ce qui signifie que la propriété code sera utilisée pour référencer les métadonnées dans la sortie. Pour la requête cible, le idScheme est également fixé à code, ce qui signifie que la propriété code sera utilisée pour référencer les métadonnées lors de l'importation de la valeur des données. Notez que les schémas d'identification peuvent être spécifiés par type d'entité, comme dataElementIdScheme et orgUnitIdScheme.

  • Notez que la période est 202201 ou janvier 2022. Il se peut que la période soit mise à jour au fil du temps.

  • Exécutez la requête POST pour créer la définition d'échange de données agrégées. Confirmez que le code d'état de la réponse de l'API est 201. Notez que le nom de l'échange de données est unique. Notez l'ID de l'objet nouvellement créé en regardant response > uid dans le corps de la réponse.

  • Exécutez l'échange de données nouvellement créé avec une requête POST (remplacez {id} par l'ID de l'échange de données) :

    POST /api/aggregateDataExchanges/{id}/exchange
    
  • Confirmez que la réponse de l'API indique que trois valeurs de données ont été importées avec succès.

    {
      "responseType": "ImportSummaries",
      "status": "SUCCESS",
      "imported": 3,
      "updated": 0,
      "deleted": 0,
      "ignored": 0
    }
    
  • Dans l'instance cible, naviguez jusqu'à l'application Saisie de données, sélectionnez l'unité d'organisation Sierra Leone, l'ensemble de données Échange de données et la période Janvier 2022. On observe que les valeurs des données échangées sont visibles dans le formulaire.

En résumé, dans cet exemple, les enregistrements de données d'événements ont été agrégés du niveau de l'établissement au niveau national, dans la hiérarchie des unités d'organisation, et des données d'événements aux données mensuelles à l'aide d'indicateurs de programme. Les données ont été échangées avec une instance DHIS 2 cible en utilisant la propriété code pour référencer les métadonnées.

I18n

Langues

DHIS2 prend en charge les traductions à la fois pour l'interface utilisateur et pour le contenu de la base de données.

UI locales

Vous pouvez récupérer les langues disponibles pour l'interface utilisateur par le biais de la ressource suivante avec une requête GET. Les représentations XML et JSON sont prises en charge.

/api/33/locales/ui

An example of the response in JSON format:

[
{
"locale": "ar",
"languageTag": "ar",
"name": "العربية",
"displayName": "Arabic"
},
{
"locale": "ar_EG",
"languageTag": "ar-EG",
"name": "العربية (مصر)",
"displayName": "Arabic (Egypt)"
},
{
"locale": "uz_UZ_Cyrl",
"languageTag": "uz-Cyrl-UZ",
"name": "ўзбекча (Кирил, Ўзбекистон)",
"displayName": "Uzbek (Cyrillic, Uzbekistan)"
}
]

The locale property is an internal DHIS2 representation of the locale, and consists of the language code, country code and script code (if applicable) separated by underscores. It should not be confused with the languageTag property, which is the standard IETF BCP 47 language tag representation of the locale, with components separated by hyphens. The name property is the name of the locale in its own language, while the displayName property is the name of the locale in the users's preferred language.

Database content locales

You can retrieve and create locales for the database content with GET and POST requests through the dbLocales resource. XML and JSON resource representations are supported. To POST data, there is one required parameter: country. This should correspond to a valid ISO 3166-1 alpha-2 country code. An optional parameter is language, which should correspond to a valid ISO 639-1 language code. A third option paramater script can also be provided, corresponding to a valid ISO 15924 script code. Do take note that if the script parameter is provided, the language parameter must also be provided.

Example request to get database locales for US English:

/api/locales/dbLocales?country=US&language=en

Example request to create a new database locale for Canadian French: POST /api/locales/dbLocales?country=CA&language=fr

Les traductions

DHIS2 permet de traduire le contenu de la base de données. Si une métadonnée est traduisible, elle aura une propriété traductions.

Cela signifie que vous pouvez récupérer et mettre à jour les traductions en utilisant les ressources des classes de métadonnées telles que api/dataElements, api/organisationUnits, api/dataSets, etc.

Get translations

Vous pouvez obtenir des traductions pour un objet de métadonnées tel que l'élément de données en envoyant une requête GET à api/dataElements/{dataElementUID}

La réponse contient tous les détails de l'élément de données qui comprend également la propriété traductions comme suit

{
  "id": "fbfJHSPpUQD",
  "href": "https://play.dhis2.org/dev/api/29/dataElements/fbfJHSPpUQD",
  "created": "2010-02-05T10:58:43.646",
  "name": "ANC 1st visit",
  "shortName": "ANC 1st visit",
  "translations": 
  [
    {
      "property": "SHORT_NAME",
      "locale": "en_GB",
      "value": "ANC 1st visit"
    },
    {
      "property": "NAME",
      "locale": "fr",
      "value": "Soin prénatal 1"
    },
    {
      "property": "NAME",
      "locale": "en_GB",
      "value": "ANC 1st visit"
    }
  ]
}
Vous pouvez également obtenir uniquement la propriété traductions d'un objet en envoyant une requête GET à api/dataElements/{dataElementUID}/translations
{
  "translations": 
  [
    {
      "property": "SHORT_NAME",
      "locale": "en_GB",
      "value": "ANC 1st visit"
    },
    {
      "property": "NAME",
      "locale": "fr",
      "value": "Soin prénatal 1"
    },
    {
      "property": "NAME",
      "locale": "en_GB",
      "value": "ANC 1st visit"
    }
  ]
}

Create/Update translations

Vous pouvez faire des traductions en envoyant une requête PUT avec le même format JSON à api/dataElements/{dataElementUID}/translations

{
  "translations": 
  [
    {
      "property": "SHORT_NAME",
      "locale": "en_GB",
      "value": "ANC 1st visit"
    },
    {
      "property": "NAME",
      "locale": "fr",
      "value": "Soin prénatal 1"
    },
    {
      "property": "DESCRIPTION",
      "locale": "fr",
      "value": "description in french"
    },
    {
      "property": "FORM_NAME",
      "locale": "fr",
      "value": "name in french"
    }
  ]
}

Il est également possible de mettre à jour l'objet avec la charge, y compris la propriété traductions.

Envoyez une requête PUT à api/dataElements/{dataElementUID} avec l'objet complet comme ci-dessous :

{
  "id": "fbfJHSPpUQD",
  "created": "2010-02-05T10:58:43.646",
  "name": "ANC 1st visit",
  "shortName": "ANC 1st visit",
  "translations":
  [
    {
      "property": "SHORT_NAME",
      "locale": "en_GB",
      "value": "ANC 1st visit"
    },
    {
      "property": "NAME",
      "locale": "fr",
      "value": "Soin prénatal 1"
    },
    {
      "property": "NAME",
      "locale": "en_GB",
      "value": "ANC 1st visit"
    }
  ]
}

Le code de statut sera 204 No Content si la valeur de données a été sauvegardée ou mise à jour avec succès, ou 409 Conflit si une erreur de validation s'est produite (par exemple, plus d'un NOM_COURT pour la même langue).

Les propriétés communes qui prennent en charge les traductions sont listées dans le tableau ci-dessous.

Tableau : Noms des propriétés

Nom de la propriété Description
name Nom de l'objet
Nom court Nom court de l'objet
description Description de l'objet

Les classes qui prennent en charge les traductions sont listées dans le tableau ci-dessous.

Tableau : Noms des classes

Nom de la classe Description Autres propriétés traduisibles
Option de Catégorie d'Élément de Données Option de catégorie
Categorie d'Eléments de Données Catégorie
Combinaison de Catégorie d'Eléments de Données Combinaison de catégories
DataElement Élément de données
Groupe d'Eléments de Données Groupe d'éléments de données
Ensemble de Groupe d'Eléménts de Données Ensemble de groupes d'éléments de donnée
Indicateur Indicateur description du numérateur, description du dénominateur
Type d'indicateur Type d'indicateur
Groupe d'indicateurs Groupe d’indicateurs
Ensemble de Groupe d'Indicateur Ensemble de groupes d'indicateurs
Unité d'organisation Unité d’organisation
Groupe d'Unité d'Organisation Groupe d'unités d'organisation
Ensemble de Groupe d'Unité d'Organisation Ensemble de groupes d'unités d'organisation
Ensemble de données Ensemble de données
Section Section de l'ensemble des données
Règle de validation Règle de validation instruction
Groupes de règles de validation Groupe de règles de validation
Programme Programme étiquette de date d'inscription, étiquette de date d'incident
Étape de programme Étape du programme étiquette de la date d'exécution, étiquette de la date d'échéance
Attribut d'entité suivie Attribut d’entité suivie
Entité suivie Entité suivie
Type de relation Type de relation pour les instances d'entités suivies fromToName, toFromName
Ensemble d'options Ensemble d'options
Option Option
Attribut Attribut des métadonnées
Modèle de notification de programme Modèle de notification de programme modèle de sujet, modèle de message
Modèle de notification de validation Modèle de notification de validation modèle de sujet, modèle de message
Modèle de notification de l'ensemble de données Modèle de notification de l'ensemble de données modèle de sujet, modèle de message
Visualisation Visualisation titre, sous-titre, étiquette d'axe de plage, étiquette de ligne de base, étiquette de ligne cible, étiquette d'axe de domaine
Action de règle de programme Action de règle de programme contenu
Prédicteur Prédicteur Nom, nom court, description, description du générateur
Règle de validation Règle de validation Nom, Description, Instruction, Expression du côté gauche, Expression du côté droit

Internationalisation

Pour récupérer les paires clé-valeur des chaînes traduites, vous pouvez utiliser la ressource i18n.

/api/33/i18n

Le point d'accès est situé à /api/i18n et le format de la requête est un simple tableau de paires de valeurs clés :

[
  "access_denied",
  "uploading_data_notification"
]

La requête doit être de type POST et utiliser l' application/json comme type de contenu. Un exemple utilisant curl, en supposant que les données de la requête sont sauvegardées dans le fichier keys.json :

curl -d @keys.json "play.dhis2.org/demo/api/33/i18n" -X POST
  -H "Content-Type: application/json" -u admin:district

Le résultat ressemblera à ceci :

{
  "access_denied":"Access denied",
  "uploading_data_notification":"Uploading locally stored data to the server"
}

SMS

Service de messages courts (SMS)

Cette section porte sur l'API Web SMS, qui permet d'envoyer et de recevoir des messages texte courts.

Outbound SMS service

L'API Web prend en charge l'envoi de SMS sortants à l'aide de la méthode POST. Les SMS peuvent être envoyés à un ou plusieurs destinataires. Une ou plusieurs passerelles doivent être configurées avant d'utiliser le service. Un SMS ne sera pas envoyé si aucune passerelle n'est configurée. Il nécessite un ensemble de destinataires et un texte de message au format JSON, comme indiqué ci-dessous.

/api/sms/sortant
{
  "message":"Texte du Sms",
  "destinataires": [
    "004712341234",
    "004712341235"
  ]
}

Remarque

La liste des destinataires sera divisée si la taille dépasse la limite DESTINATAIRES_MAXIMUM_AUTORISÉS de 200.

L'API Web prend également en charge une version de paramètre de requête, mais l'API paramétrée ne peut être utilisée que pour envoyer des SMS à un seul destinataire.

/api/sms/outbound?message=text&recipient=004712341234

Les messages sortants peuvent être récupérés à l'aide de la ressource GET.

GET /api/sms/outbound
GET /api/sms/outbound?filter=status:eq:SENT
GET /api/sms/outbound?filter=status:eq:SENT&fields=*

Les messages sortants peuvent être supprimés à l'aide de la ressource SUPPRIMER.

SUPPRIMER/api/sms/outbound/{uid}
SUPPRIMER /api/sms/outbound?ids=uid1,uid2

Gateway response codes

La passerelle peut répondre avec les codes de réponse suivants.

Tableau : Codes de réponse de la passerelle

Code de la réponse Message de réponse Description détaillée
CODE DU_RÉSULTAT_0 succès Le message a été envoyé avec succès
CODE DU_RÉSULTAT_1 programmé Le message a été programmé avec succès
CODE DU_RÉSULTAT_22 erreur fatale interne erreur fatale interne
CODE DU_RÉSULTAT_23 échec de l'authentification Les données de l'authentification sont incorrectes
CODE DU_RÉSULTAT_24 échec de la validation des données Les paramètres fournis dans la demande sont incorrects
CODE DU_RÉSULTAT_25 crédits insuffisants Le crédit est insuffisant pour envoyer un message
CODE DU_RÉSULTAT_26 montant du crédit non disponible Montant du crédit non disponible
CODE DU_RÉSULTAT_27 vous avez dépassé votre quota journalier vous avez dépassé votre quota journalier
CODE DU_RÉSULTAT_40 temporairement indisponible Le service est temporairement interrompu
CODE DU_RÉSULTAT_201 taille maximale du lot dépassée Taille maximale du lot dépassée
CODE DU_RÉSULTAT_200 succès La requête a été traitée avec succès
CODE DU_RÉSULTAT_202 accepté Le(s) message(s) sera(ont) traité(s)
CODE DU_RÉSULTAT_207 multi-statut Plus d'un message a été soumis à l'API ; cependant, tous les messages n'ont pas le même statut.
CODE DU_RÉSULTAT_400 mauvaise requête Échec de validation (paramètres ou en-têtes manquants/invalides)
CODE DU_RÉSULTAT_401 Non-autorisé Échec de l'authentification. Ce problème peut également être causé par des paramètres de verrouillage de l'IP.
CODE DU_RÉSULTAT_402 paiement requis Crédit insuffisant pour envoyer un message
CODE DU_RÉSULTAT_404 pas trouvé La ressource n'existe pas
CODE DU_RÉSULTAT_405 méthode non autorisée La méthode Http n'est pas supportée par la ressource
CODE DU_RÉSULTAT_410 parti Le numéro du téléphone portable est bloqué
CODE DU_RÉSULTAT_429 trop de requêtes Erreur générique de limitation du taux
CODE DU_RÉSULTAT_503 Service indisponible Une erreur temporaire s'est produite sur notre plateforme - veuillez réessayer

Inbound SMS service

L'API Web prend en charge la collecte des messages SMS entrants à l'aide de la méthode POST. Les messages entrants acheminés vers l'API Web DHIS2 peuvent être reçus à l'aide de cette API. L'API collecte les messages SMS entrants et les fournit aux auditeurs pour qu'ils les analysent, en fonction du contenu du SMS (commande SMS). Un exemple de charge utile au format JSON est donné ci-dessous. Le texte, l'expéditeur, la date de réception et la date d'envoi sont des paramètres obligatoires. Les autres sont facultatifs, mais le système utilisera la valeur par défaut pour ces paramètres.

/api/sms/entrant
{
  "texte" : "texte de l'échantillon",
  "auteur": "004712341234",
  "iddelapasserelle " : " inconnu",
  "date de réception": "2016-05-01",
  "date d'envoi":"2016-05-01",
  "codage sms": "1",
  "statut sms":"1"
}

Les messages entrants peuvent être récupérés à l'aide de la ressource GET.

GET /api/sms/inbound
GET /api/sms/inbound?fields=*&filter=smsstatus=INCOMING

Les messages entrants peuvent être supprimés à l'aide de la ressource SUPPRIMER.

SUPPRIMER /api/sms/inbound/{uid}
SUPPRIMER /api/sms/inbound?ids=uid1,uid2

Pour importer tous les messages non traités

POST /api/sms/entrant/importer

Tableau : Paramètres de requête de l'utilisateur

Paramètre Type Description
message Chaîne Il s'agit d'un paramètre obligatoire qui contient le message textuel proprement dit.
auteur Chaîne Il s'agit d'un paramètre obligatoire qui indique de qui provient le message.
passerelle Chaîne Il s'agit d'un paramètre facultatif qui indique l'identifiant de la passerelle. S'il n'est pas présent, le texte par défaut " INCONNU " sera stocké
heure de réception Date Ce paramètre est facultatif. Il indique l'heure à laquelle le message a été reçu par la passerelle.

Gateway service administration

L'API Web expose des ressources qui permettent de configurer et de mettre à jour les configurations de la passerelle SMS.

La liste des différentes passerelles configurées peut être obtenue à l'aide de la méthode GET

GET /api/33/gateways

Les configurations peuvent également être récupérées pour un type de passerelle spécifique à l'aide de la méthode GET.

GET /api/33/gateways/{uid}

De nouvelles configurations de passerelles peuvent être ajoutées à l'aide de POST. L'api POST nécessite un paramètre de requête de type et actuellement sa valeur peut être http,bulksms,clickatell,smpp. La première passerelle ajoutée sera définie par défaut. Une seule passerelle peut être définie par défaut à la fois. La passerelle par défaut ne peut être modifiée que par l'intermédiaire de son interface utilisateur. Si la passerelle par défaut est supprimée, la suivante dans la liste deviendra automatiquement la passerelle par défaut.

POST /api/33/gateways

La configuration peut être mise à jour en fournissant l'uid et la configuration de la passerelle comme indiqué ci-dessous

PUT /api/33/gateways/{uids}

Les configurations peuvent être supprimées pour un type de passerelle spécifique à l'aide de la méthode SUPPRIMER

DELETE /api/33/gateways/{uid}

La passerelle par défaut peut être récupérée et mise à jour.

GET /api/33/gateways/default

Default gateway can be set using the PUT method.

PUT /api/33/gateways/default/{uid}

Gateway configuration

L'API Web vous permet de créer et de mettre à jour les configurations de la passerelle. Pour chaque type de passerelle, les paramètres de la charge utile JSON sont différents. Des exemples de charges utiles JSON pour chaque passerelle sont donnés ci-dessous. POST est utilisé pour créer et PUT pour mettre à jour les configurations. Le paramètre En-tête peut être utilisé dans le cas de "GenericHttpGateway" pour envoyer un ou plusieurs paramètres en tant qu'en-tête http.

Clickatell

{
  "type" : "clickatell",
  "nom" : "clickatell",
  "nom d'utilisateur": "utilisateur de clickatell",
  "authToken": "XXXXXXXXXXXXXXXXXXXX",
  "modèle d'url": "https://platform.clickatell.com/messages"
}

Bulksms

{
  "type": "bulksms",
  "nom": "bulkSMS",
  "nom d'utilisateur": "utilisateur bulk",
  "mot de passe": "abc123"
}

Passerelle SMPP

{
  "type": "smpp",
  "nom": "smpp gateway2",
  "systemId": "smppclient1",
  "hôte" : " hôte local",
  "type de système": "cp",
  "Indicateur de plan de numérotation": "INCONNU",
  "typeDeNombre": "INCONNU",
  "type de lien": "BIND_TX",
  "port": 2775,
  "mot de passe" : "mot de passe",
  "compressé" : faux
}

Generic HTTP

{
  "type": "http",
  "nom": "Générique",
  "modèle de configuration": "nom d'utilisateur=${nom d'utilisateur}&mot de passe=${mot de passe}&to=${destinataires}&code pays=880&message=${text$}&identifiant du message=0",
  "useGet": faux,
  "paramètres d'envoi d'URL":faux,
  "type de contenu": "APPLICATION_JSON",
  "modèle d'url":"https://samplegateway.com/messages",
  "paramètres": [
    {
      "en-tête": vrai,
      "code": faux,
      "clé": "nom d'utilisateur",
      "valeur": "utilisateur_uio",
      "confidentiel": vrai
    },
    {
      "en-tête": vrai,
      "code": faux,
      "clé": "mot de passe",
      "valeur": "123abcxyz",
      "confidentiel": vrai
    },
    {
      "en-tête": faux,
      "code": faux,
      "clé": "rapport de diffusion",
      "valeur": "oui",
      "confidentiel": faux
    }
  ],
  "estParDéfaut": faux
}

Dans une passerelle générique http, il est possible d'ajouter un nombre illimité de paramètres.

Tableau : Paramètres génériques de la passerelle SMS

Paramètre Type Description
name Chaîne nom de la passerelle
modèle de configuration Chaîne Le modèle de configuration qui est rempli avec les valeurs des paramètres. Par exemple, le modèle de configuration donné ci-dessus sera rempli comme suit : { "to" : "+27001234567", "body" : "Hello World !"}
useGet Booléen La méthode Http POST est utilisée par défaut. Pour la remplacer par Http GET, l'utilisateur peut attribuer la valeur "true" au paramètre "useGet".
type de contenu Chaîne Le type de contenu spécifie le type de données envoyées. Les types pris en charge sont l'APPLICATION_JSON, l'APPLICATION_XML, le FORMULAIRE_URL_CODE, TEXTE_CLAIR
modèle d'url Chaîne modèle d'url
En-tête Booléen Si le paramètre doit être envoyé dans les en-têtes Http
coder Booléen Si le paramètre doit être codé
key Chaîne clé de paramètre
value Chaîne valeur du paramètre
confidentiel Booléen Si le paramètre est confidentiel. Ce paramètre ne sera pas exposé à travers l'API
Paramètres d'envoi d'Url Booléen Si cette option est cochée, le modèle d'url peut être ajouté aux paramètres de la requête. Ceci est utile si l'API de la passerelle ne prend en charge que le HTTP GET. Un exemple de modèle d'url ressemble à ceci "urlTemplate" : "https://samplegateway.com/messages?apiKey={apiKey}&to={recipients},content={text},deliveryreport={dp}".

HTTP.OK sera renvoyé si les configurations sont sauvegardées avec succès, sinon Erreur s'affiche

Les commandes SMS

Les commandes SMS sont utilisées pour collecter des données par SMS. Ces commandes appartiennent à un type d'analyseur spécifique. Chaque analyseur a des fonctionnalités différentes.

La liste des commandes peut être récupérée à l'aide de la fonction GET.

GET /api/smsCommands

Une commande particulière peut être récupérée à l'aide de GET.

GET /api/smsCommands/uid

Une commande particulière peut être mise à jour à l'aide de PUT.

PUT /api/smsCommands/uid

La commande peut être créée en utilisant POST.

POST /api/smsCommands

Une commande particulière peut être supprimée à l'aide de la commande SUPPRIMER.

DELETE /api/smsCommands/uid

SMS command types

Type Utilisation
ANALYSEUR_CLÉ_DE VALEUR Pour la collecte de données agrégées.
ANALYSEUR_D'ALERTES Pour envoyer des messages d'alerte.
ANALYSEUR_NON ENREGISTRÉ Pour la surveillance des maladies et la notification des cas.
ANALYSEUR_D'ENREGISTREMENT_D'ENTITÉS_SUIVIES Pour l'enregistrement de l'entité du tracker.
ANALYSEUR_DE SAISIE DE DONNÉES_DE L'ÉTAPE_DU PROGRAMME Collecte de données pour l'étape du programme. ( L'IES est identifié sur la base du numéro de téléphone )
ANALYSEUR_D'ENREGISTREMENT_D'ÉVÉNEMENTS Enregistrement d'un événement unique. Elle est utilisée pour les programmes d'événements.

SMS command types for Android

Ces types de commandes peuvent être utilisés par l'application Android pour l'envoi de données par SMS lorsque la connexion internet n'est pas disponible. Le SMS est composé par l'application Android.

Type Utilisation
ENSEMBLE DE DONNÉES_AGRÉGÉ Pour la collecte de données agrégées.
ENROLLMENT Pour l'enregistrement de l'entité du tracker.
ÉVÉNEMENT_TRACKER Inscription à un événement pour les programmes tracker.
ÉVÉNEMENT_SIMPLE Inscription aux programmes d'événements.
RELATION Créer des relations.
SUPPRIMER Supprimer un événement.

Utilisateurs

Utilisateurs

Cette section couvre les méthodes de ressources de l'utilisateur.

/api/users

Requête de l'utilisateur

La ressource utilisateurs offre des paramètres de requête supplémentaires en plus des paramètres standard (par exemple, la pagination). Pour rechercher des utilisateurs dans la ressource vous pouvez utiliser les paramètres suivants.

Tableau : Paramètres de requête de l'utilisateur

Paramètre Type Description
query Texte Valeur de la requête pour le prénom, le nom de famille, le nom d'utilisateur et l'adresse électronique, sensible à la casse.
Numéro de Téléphone Texte Requête pour un numéro de téléphone.
canManage false true
autorisation de sous-ensemble false true
dernière connexion Date Filtre les utilisateurs qui se sont connectés après la date indiquée.
mois inactifs Numéro Filtre les utilisateurs qui ne se sont pas connectés pendant le nombre de mois indiqué.
inactif Depuis Date Filtre les utilisateurs qui ne se sont pas connectés après la date indiquée.
auto-inscrit false true
statut de l'invitation aucun | all | expiré Filtre les invitations des utilisateurs, notamment toutes les invitations ou les invitations expirées.
ou Identificateur Filtre les utilisateurs associés à l'unité d'organisation dont l'identifiant est indiqué.
unités d'organisation des utilisateurs false true
includeChildren false true
page Numéro Le nombre de la page.
pageSize Numéro La taille de la page
limite de l'unité d'organisation saisie de_données | ; sortie de_données | ; recherche_d'ies Restreint la recherche aux utilisateurs ayant une unité d'organisation commune avec l'utilisateur actuel pour la limite indiquée

Une requête pour un maximum de 10 utilisateurs avec "konan" comme prénom ou nom de famille (sensible à la casse) qui ont un sous-ensemble d'autorisations par rapport à l'utilisateur actuel :

/api/users?query=konan&authSubset=true&pageSize=10

Récupérer tous les comptes d'utilisateurs qui ont été initialement auto-inscrits :

/api/users?selfRegistered=true

User query by identifier

La syntaxe suivante permet d'obtenir des informations complètes sur un utilisateur ayant un identifiant particulier.

/api/users/{id}

Voici un exemple d'identifiant particulier :

/api/users/OYLGMiazHtW

Recherche d'utilisateurs

L'API de recherche d'utilisateurs propose un système de récupération des utilisateurs lorsque la réponse comporte un minimum d'informations. Aucune autorité spécifique n'est requise et elle permet aux clients de rechercher des informations telles que le prénom et le nom de famille de l'utilisateur, sans pour autant révéler des informations potentiellement sensibles.

/api/userLookup

Le système de recherche de l'utilisateur comporte deux méthodes.

Recherche des utilisateurs par identifiant

Vous pouvez effectuer une recherche d'utilisateur par identifiant en utilisant la requête API suivante :

GET /api/userLookup/{id}

L'ID de l'utilisateur sera recherché par rapport aux propriétés d'utilisateur suivantes dans l'ordre indiqué :

  • UID
  • UUID
  • Nom d'utilisateur

Voici donc un exemple de requête :

/api/userLookup/QqvaU7JjkUV

La réponse comportera un minimum d'informations relatives à l'utilisateur.

{
  "id": "QqvaU7JjkUV",
  "username": "nkono",
  "firstName": "Thomas",
  "surname": "Nkono",
  "displayName": "Thomas Nkono"
}

Requête de recherche d'utilisateurs

Vous pouvez réaliser une requête des utilisateurs à partir de la requête API suivante :

GET /api/userLookup?query={string}

Le paramètre de requête query est obligatoire. La chaîne de requête query sera comparée aux propriétés utilisateur suivantes :

  • Prénom
  • Nom
  • Adresses électronique
  • Nom d'utilisateur

En plus du paramètre query, la recherche peut être restreinte par le paramètre orgUnitBoundary comme décrit dans le tableau des paramètres pour les utilisateurs ci-dessus.

Voici donc un exemple de requête :

/api/userLookup?query=John

La réponse comportera des informations relatives aux utilisateurs et correspondants à la requête.

{
  "users": [
    {
      "id": "DXyJmlo9rge",
      "username": "jbarnes",
      "firstName": "John",
      "surname": "Barnes",
      "displayName": "John Barnes"
    },
    {
      "id": "N3PZBUlN8vq",
      "username": "jkamara",
      "firstName": "John",
      "surname": "Kamara",
      "displayName": "John Kamara"
    }
  ]
}

Créer et mettre à jour un compte utilisateur

La création et la mise à jour des utilisateurs sont prises en charge par l'API. Une charge utile de base pour créer un utilisateur ressemble à l'exemple ci-dessous. Notez que le mot de passe sera envoyé en texte clair, n'oubliez donc pas d'activer SSL/HTTPS pour le transport réseau.

{
  "id": "Mj8balLULKp",
  "firstName": "John",
  "surname": "Doe",
  "email": "johndoe@mail.com",
  "userCredentials": {
    "id": "lWCkJ4etppc",
    "userInfo": {
    "id": "Mj8balLULKp"
  },
  "username": "johndoe123",
  "password": "Your-password-123",
  "skype": "john.doe",
  "telegram": "joh.doe",
  "whatsApp": "+1-541-754-3010",
  "facebookMessenger": "john.doe",
  "avatar": {
    "id": "<fileResource id>"
  },
  "userRoles": [
    {
      "id": "Ufph3mGRmMo"
    }
  ]
  },
  "organisationUnits": [
    {
      "id": "Rp268JB6Ne4"
    }
  ],
  "userGroups": [
    {
      "id": "wl5cDMuUhmF"
    }
  ]
}
curl -X POST -d @u.json "http://server/api/33/users" -u user:pass
  -H "Content-Type: application/json"

Dans la charge utile de création d'utilisateurs, les groupes d'utilisateurs ne sont pris en charge que lors de l'importation ou du POSTing d'un seul utilisateur à la fois. Si vous tentez de créer plus d'un utilisateur tout en spécifiant des groupes d'utilisateurs, vous ne recevrez pas d'erreur et les utilisateurs seront créés, mais aucun groupe d'utilisateurs ne sera affecté. Ceci est prévu et limité en raison de la relation de plusieurs à plusieurs entre les utilisateurs et les groupes d'utilisateurs, les groupes d'utilisateurs étant propriétaires de la relation. Pour mettre à jour ou créer plusieurs utilisateurs et leurs groupes d'utilisateurs, envisagez un programme pour POSTER un à la fois, ou POSTER tous les utilisateurs suivi d'une autre action pour mettre à jour leurs groupes d'utilisateurs tout en spécifiant les identifiants du nouvel utilisateur.

Lors de la création d'un utilisateur, la charge utile peut également contenir les paramètres de l'utilisateur. Ceux-ci sont ajoutés en tant qu'objet settings à l'objet racine. Chaque paire clé-valeur devient un membre de l'objet settings, par exemple :

{
    "id": "Mj8balLULKp",
    "firstName": "John",
    "surname": "Doe",
    "settings": {
        "keyUiLocale": "de"
    },
    //...
}

Après la création de l'utilisateur, une entête Location est renvoyée avec l'identifiant nouvellement généré (vous pouvez également fournir le vôtre en utilisant le point d'extrémité /api/system/id). La même charge utile peut alors être utilisée pour faire des mises à jour, mais n'oubliez pas d'utiliser PUT au lieu de POST et le point d'extrémité est désormais /api/users/ID.

curl -X PUT -d @u.json "http://server/api/33/users/ID" -u user:pass
  -H "Content-Type: application/json"

Pour plus d'informations sur l'ensemble des données disponibles, voir /api/schemas/user.

Pour plus d'informations sur le téléchargement et la récupération des avatars des utilisateurs, veuillez consulter le point d'extrémité /fileResources.

Invitations pour les comptes d'utilisateurs

L'API Web permet d'inviter des personnes à créer des comptes d'utilisateur par le biais de la ressource invite. Pour créer une invitation, vous devez POSTER un utilisateur au format XML ou JSON à la ressource "invite". Un nom d'utilisateur spécifique peut être imposé en définissant le nom d'utilisateur dans l'entité postée. En omettant le nom d'utilisateur, la personne pourra le spécifier elle-même. Le système enverra une invitation par courrier électronique. Il faut pour cela que les paramètres de messagerie soient correctement configurés.

La ressource "invite" est utile pour permettre en toute sécurité à des personnes de créer des comptes sans que personne d'autre ne connaisse le mot de passe ou en transférant le mot de passe en texte clair. La charge utile à utiliser pour l'invitation est la même que pour la création d'utilisateurs. Un exemple de charge utile en JSON ressemble à ceci :

{
  "firstName": "John",
  "surname": "Doe",
  "email": "johndoe@mail.com",
  "userCredentials": {
    "username": "johndoe",
    "userRoles": [{
      "id": "Euq3XfEIEbx"
    }]
  },
  "organisationUnits": [ {
    "id": "ImspTQPwCqd"
  } ],
  "userGroups": [ {
    "id": "vAvEltyXGbD"
  }]
}

L'entité d'invitation de l'utilisateur peut être affichée comme suit :

curl -d @invite.json "localhost/api/33/users/invite" -u admin:district
  -H "Content-Type:application/json"

Pour envoyer des invitations à plusieurs utilisateurs en même temps, vous devez utiliser un format légèrement différent. Pour JSON :

{
  "users": [ {
    "firstName": "John",
    "surname": "Doe",
    "email": "johndoe@mail.com",
    "userCredentials": {
      "username": "johndoe",
      "userRoles": [ {
        "id": "Euq3XfEIEbx"
      } ]
    },
    "organisationUnits": [ {
      "id": "ImspTQPwCqd"
      } ]
    }, {
    "firstName": "Tom",
    "surname": "Johnson",
    "email": "tomj@mail.com",
    "userCredentials": {
      "userRoles": [ {
        "id": "Euq3XfEIEbx"
      } ]
    },
    "organisationUnits": [ {
      "id": "ImspTQPwCqd"
      } ]
    }
  ]
}

Pour créer plusieurs invitations, vous pouvez envoyer la charge utile à la ressource api/users/invites comme ceci :

curl -d @invites.json "localhost/api/33/users/invites" -u admin:district
  -H "Content-Type:application/json"

Certaines conditions doivent être remplies pour que les invitations à ouvrir un compte d'utilisateur soient envoyées :

  • Le serveur SMTP doit être configuré correctement sur le serveur.

  • L'utilisateur à inviter doit avoir indiqué un e-mail valide.

  • Si le nom d'utilisateur est spécifié, il ne doit pas être déjà pris par un autre utilisateur existant.

Si l'une de ces conditions n'est pas remplie, la ressource invitée renvoie un code d'état 409 Conflict accompagné d'un message descriptif.

User login (Experimental)

This endpoint is not meant for external use, unless you are implementing a custom login app, which you probably should not do, unless you have a very good reason.

A user can log in and get a session cookie with the following example:
POST /api/auth/login
with JSON body:

{
    "username": "username",
    "password": "password",
    "twoFactorCode": "two_factor_code"
}
Voici un exemple de réponse après une opération réussie :
{
    "loginStatus": "SUCCESS",
    "redirectUrl": "/dhis-web-dashboard/"
}

Invitation à confirmer le compte utilisateur (expérimental)

Important
Avant de confirmer une invitation, il faut qu'un utilisateur administrateur configure l'utilisateur et lui envoie un lien d'invitation. Cette condition préalable ajoute également quelques données nécessaires dans la table de la base de données userinfo ou informations d'utilisateur (idToken, restoreToken, restoreExpiry) pour cet utilisateur, afin de terminer l'invitation.

Un utilisateur peut confirmer une invitation via le point d'extrémité suivant : POST /api/auth/invite ; avec un corps JSON :

{
    "username": "TestUser",
    "firstName": "Test",
    "surname": "User",
    "password": "Test123!",
    "email": "test@test.com",
    "phoneNumber": "123456789",
    "g-recaptcha-response": "recaptchaResponse",
    "token": "aWRUb2tlbjpJRHJlc3RvcmVUb2tlbg=="
}

Note La valeur g-recaptcha-response serait remplie par l'utilisation de l'interface utilisateur principale de l'application de connexion. Le champ token attend une valeur encodée en Base64. Dans cet exemple, décodé, c'est idToken:IDrestoreToken. Celui-ci sera envoyé par email à l'utilisateur invité (il est en fait créé en interne (et rempli dans la base de données) durant l'opération /api/users/invite).

Voici un exemple de réponse après une opération réussie :

{
    "httpStatus": "OK",
    "httpStatusCode": 200,
    "status": "OK",
    "message": "Account updated"
}

Enregistrement d'un compte d'utilisateur (expérimental)

Un utilisateur peut s'enregistrer directement via le point d'extrémité suivant : POST /api/auth/registration avec un corps JSON :

{
    "username": "testSelfReg",
    "firstName": "test",
    "surname": "selfReg",
    "password": "P@ssword123",
    "email": "test@test.com",
    "phoneNumber": "12345oooo",
    "g-recaptcha-response": "recap response"
}

Voici un exemple de réponse après une opération réussie :

{
    "httpStatus": "Created",
    "httpStatusCode": 201,
    "status": "OK",
    "message": "Account created"
}

L'utilisateur a oublié son mot de passe (expérimental)

Ce point d'extrémité est utilisé pour déclencher le flux de mots de passe oubliés. Il peut être déclenché après que soient fournis le nom d'utilisateur ou l'adresse électronique de l'utilisateur dont le mot de passe doit être réinitialisé. Cela se fait via une requête POST /api/auth/forgotPassword avec un corps JSON comme suit :

{
    "emailOrUsername": "testUsername1"
}

Une réponse après une opération réussie renvoie un 200 OK vide. Cela devrait déclencher l'envoi d'un email à l'utilisateur pour lui permettre de réinitialiser son mot de passe.

Réinitialisation du mot de passe de l'utilisateur (expérimental)

Lorsqu'un utilisateur reçoit un email contenant un lien pour réinitialiser son mot de passe, celui-ci contient un token qui peut être utilisé pour l'opération. POST /api/auth/passwordReset avec un corps JSON :

{
    "newPassword": "ChangeMe123!",
    "resetToken": "token-value-from-email-link"
}

Une réponse après une opération réussie renvoie un 200 OK vide. L'utilisateur devrait maintenant pouvoir se connecter en utilisant son nouveau mot de passe.

Réplication de l'utilisateur

Pour reproduire un utilisateur, vous pouvez utiliser la ressource replica. Reproduire un utilisateur peut être utile pour déboguer ou reproduire des problèmes signalés par un particulier. Vous devez fournir un nouveau nom d'utilisateur et un nouveau mot de passe à l'utilisateur reproduit, que vous allez utiliser pour vous authentifier ultérieurement. Notez que vous avez besoin de l'autorisation ALL pour effectuer cette action. Pour reproduire un utilisateur, vous vous pouvez envoyer une charge utile JSON comme ci-dessous :

{
  "username": "user_replica",
  "password": "SecretPassword"
}

Cette charge utile peut être envoyée à la ressource réplica, où vous fournissez l'identifiant de l'utilisateur à répliquer dans l'URL :

/api/33/users/<uid>/replica

Voici un exemple de reproduction d'un utilisateur à l'aide de curl :

curl -d @replica.json "localhost/api/33/users/N3PZBUlN8vq/replica"
  -H "Content-Type:application/json" -u admin:district

Réinitialiser le mot de passe de l'utilisateur

Les administrateurs utilisateurs (disposant des droits appropriés) peuvent réinitialiser le compte d'un autre utilisateur en déclenchant la récupération du mot de passe. Une fois l'opération déclenchée, un e-mail contenant un lien de récupération est envoyé à l'utilisateur. Les utilisateurs qui suivent le lien accèdent à un formulaire qui leur permet de définir un nouveau mot de passe.

Pour déclencher ce flux de travail pour l'utilisateur tH7WIiIJ0O3, utilisez :

POST /api/37/users/tH7WIiIJ0O3/reset

Désactiver et activer des comptes d'utilisateurs

Les comptes d'utilisateurs peuvent être marqués comme désactivés. Un utilisateur désactivé ne peut plus se connecter.

Pour marquer un utilisateur avec l'UID tH7WIiIJ0O3 comme désactivé (nécessite un utilisateur avec les droits appropriés) :

POST /api/36/users/tH7WIiIJ0O3/disabled

Pour permettre à un utilisateur désactivé d'utiliser à nouveau l'outil en question (l'utilisateur doit disposer des droits appropriés) :

POST /api/36/users/tH7WIiIJ0O3/enabled

Expiration de l'utilisateur

Une date d'expiration peut être définie pour un compte d'utilisateur. Elle marque le moment à partir duquel le compte d'utilisateur a expiré et ne peut plus être utilisé. L'utilisateur dont le compte a expiré ne peut plus se connecter.

Pour mettre à jour la date d'expiration de l'utilisateur avec l'UID tH7WIiIJ0O3 et la mettre à la date 2021-01-01 (nécessite un utilisateur avec les droits appropriés) :

POST /api/36/users/tH7WIiIJ0O3/expired?date=2021-01-01

Pour désactiver la date d'expiration afin que le compte n'expire jamais utiliser en conséquence (nécessite un utilisateur disposant des droits appropriés) :

POST /api/36/users/tH7WIiIJ0O3/unexpired

User data approval workflows

Pour connaître les flux de travail et les niveaux d'approbation des données auxquels un utilisateur peut accéder, vous pouvez utiliser la ressource dataApprovalWorkflows comme suit :

GET /api/users/{id}/dataApprovalWorkflows

Switching between user accounts connected to the same identity provider account

If linked accounts are enabled in dhis.conf and a user has logged in via OIDC, then it is possible for the user to switch between DHIS2 accounts that are linked to the same identity provider account using this API call:

GET /dhis-web-commons-security/logout.action?current={current_username}&switch={username_to_switch_to}

Cette opération a pour effet de déconnecter l'utilisateur actuel et de connecter le nouvel utilisateur. L'opération semble transparente, sauf que le nouvel utilisateur se retrouve sur la page par défaut de l'instance DHIS2.

Notez que cet appel API sera probablement modifié à l'avenir, mais que sa fonction générale restera la même.

Pour consulter la liste des utilisateurs vers lesquels il est possible de basculer, utilisez cet appel API :

GET /api/account/linkedAccounts

Informations sur l'utilisateur actuel

Pour obtenir des informations sur l'utilisateur actuellement authentifié et ses associations avec d'autres ressources, vous pouvez utiliser la ressource me (vous pouvez également l'appeler par son ancien nom currentUser). Les ressources liées à l'utilisateur actuel fournissent des informations utiles lors de la création de clients, par exemple pour la saisie de données et la gestion des utilisateurs. Les paragraphes suivants décrivent ces ressources et leur objectif.

Fournit des informations de base sur l'utilisateur sous lequel vous êtes actuellement connecté. en tant qu'utilisateur, y compris le nom d'utilisateur, les informations d'identification de l'utilisateur, les unités d'organisation affectées:

/api/me

Donne des informations sur les messages non lus et les interprétations :

/api/me/tableau de bord

Pour modifier le mot de passe, ce point d'extrémité peut être utilisé pour valider le mot de passe nouvellement saisi. le nouveau mot de passe. La validation du mot de passe sera effectuée sur la base des PasswordValidationRules configurées dans le système. Ce point d'extrémité prend en charge POST et la chaîne du mot de passe doit être envoyée dans le corps de POST.

/api/me/valider le mot de passe

Lors d'un changement de mot de passe, ce point final (support POST) peut être utilisé pour vérifier l'ancien mot de passe. La chaîne du mot de passe doit être envoyée dans le corps du POST.

/api/me/verifier le mot de passe

Renvoie l'ensemble des autorisations accordées à l'utilisateur actuel :

/api/me/authorisation

Renvoie vrai ou faux, indiquant si l'utilisateur actuel a reçu l'autorisation <auth> donnée:

/api/me/authorisation/<auth>

Indique les niveaux d'approbation des données correspondant à l'utilisateur actuel :

/api/me/Niveaux d'approbation des données

Indique les flux de travail d'approbation des données accessibles à l'utilisateur actuel. Pour chaque flux de travail, indique les niveaux d'approbation des données que l'utilisateur peut voir, et les autorisations dont il dispose à chaque niveau :

/api/me/dataApprovalWorkflows

Paramètres et configuration

Paramètres du système

Vous pouvez manipuler les paramètres du système en interagissant avec la ressource systemSettings. Un paramètre système est une simple paire clé-valeur, où la clé et la valeur sont des chaînes de texte en clair. Pour enregistrer ou mettre à jour un paramètre système, vous pouvez envoyer une requête POST à l'URL suivante :

/api/33/systemSettings/my-key?value=my-val

Vous pouvez également soumettre la valeur du paramètre dans le corps de la requête, où le type de contenu est défini sur "texte/clair". Par exemple, vous pouvez utiliser curl comme suit :

curl "play.dhis2.org/demo/api/33/systemSettings/my-key" -d "My long value"
  -H "Content-Type: text/plain" -u admin:district

Pour définir les paramètres du système en bloc, vous pouvez envoyer un objet JSON avec une propriété et une valeur pour chaque paire clé-valeur de paramètre du système à l'aide d'une requête POST :

{
  "notification de l'application clé" : "Bienvenue",
  "intro de l'application clé": "DHIS2",
  "pied de page de l'application clé" : "En savoir plus sur dhis2.org"
}

Les traductions pour les clés de paramétrage traduisibles peuvent être définies en spécifiant le paramètre local comme paramètre de requête et la valeur traduite qui peut être spécifiée soit comme paramètre de requête, soit dans la charge utile du corps. Voir un exemple d'URL :

/api/33/systemSettings/<my-key>?locale=<my-locale>&value=<my-translated-value>

Vous devez remplacer my-key par votre clé réelle et my-val par votre valeur réelle. Pour récupérer la valeur d'une clé donnée (en JSON ou en texte brut) vous pouvez envoyer une requête GET à l'URL suivante :

/api/33/systemSettings/my-key

Alternativement, vous pouvez spécifier la clé en tant que paramètre de requête :

/api/33/systemSettings?key=my-key

Si une clé n'est pas retrouvée ou marquée comme confidentielle, une réponse 404 sera renvoyée comme suit :

{
    "httpStatus": "Not Found",
    "httpStatusCode": 404,
    "status": "ERROR",
    "message": "Setting does not exist or is marked as confidential",
    "errorCode": "E1005"
}

Vous pouvez récupérer des paramètres système spécifiques sous forme de JSON en répétant la clé paramètre de la requête :

curl "play.dhis2.org/demo/api/33/systemSettings?key=keyApplicationNotification&key=keyApplicationIntro"
  -u admin:district

Vous pouvez récupérer tous les paramètres du système à l'aide d'une requête GET :

/api/33/systemSettings

Pour récupérer une traduction spécifique pour une clé traduisible donnée, vous pouvez spécifier un paramètre local comme paramètre de requête :

/api/33/systemSettings/<my-key>?locale=<my-locale>

Si elle est présente, la traduction pour le paramètre local donné est renvoyée. Sinon, une valeur est renvoyée. Si aucun paramètre local n'est spécifié pour la clé traduisible, le paramètre local par défaut de l'interface utilisateur est utilisé pour obtenir la traduction correcte. Si la traduction donnée n'est pas présente, la valeur par défaut est renvoyée.

La priorité pour les clés traduisibles est la suivante :

locale spécifiée > UI local par défaut de l'utilisateur > valeur par défaut

Pour supprimer un paramètre du système, vous pouvez envoyer une requête DELETE à l'URL similaire à celle utilisée ci-dessus pour la récupération. Si une clé traduisible est utilisée, toutes les traductions présentes seront également supprimées.

Pour supprimer uniquement une traduction spécifique d'une clé traduisible, il convient d'utiliser la même URL que pour l'ajout d'une traduction et la valeur vide doit être fournie :

/api/33/systemSettings/<my-key>?locale=<my-locale>&value=

Les paramètres système disponibles sont énumérés ci-dessous.

Tableau : Paramètres du système

Clé Description Traduisible
cléUiLocale Paramètre local pour l'interface utilisateur Non
cléDbLocale Paramètre local de la base de données Non
Propriété d'affichage de l'analyse clé La propriété à afficher dans l'analyse. Par défaut : " nom " Non
Séparateur de groupes de chiffres de l'analyse clé Le séparateur utilisé pour séparer les groupes de chiffres Non
type clé du domaine actuel Pas encore en service Non
présentation du tableau de bord clé du tracker Utilisé par la saisie tracker Non
titre de l'application Titre de l'application. Par défaut : « DHIS2 » Oui
clé Introduction de l'application La présentation de l'application Oui
Notification clé de l'application Notification de l'application Oui
clé Pied de page de l'application Pied de page gauche de l'application Oui
clé pied de page droit de l'application pied de page droit de l'application Oui
clé Drapeau Drapeau de l'application Non
clé Image du drapeau Drapeau utilisé dans le menu tableau de bord Non
module démarrer La page de démarrage de l'application. Par défaut : " Intégration du-tableau de bord-de dhis-web " Non
Module Démarrer Activer Faible poids L'application de la page de départ pour le rendu d'une page de destination légère. Par défaut : " faux " Non
facteur Écart Facteur d'écart-type de l'analyse des données. Par défaut :"2d" Non
clé Nom de l'hôte de l'email Nom d'hôte du serveur e-mail Non
clé Port Email Port du serveur email Non
clé Tls de l'email Utiliser TLS. Par défaut : « vrai » Non
clé Expéditeur de l'e-mail Expéditeur de l'e-mail Non
clé Nom d'utilisateur de l'e-mail Nom d'utilisateur du serveur de l'email Non
clé Mot de passe de l'e-mail Mot de passe du serveur de l'email Non
Longueur minimale du mot de passe Longueur minimale du mot de passe Non
Longueur maximale du mot de passe Longueur maximale du mot de passe Non
clé Paramètre des Sms Configuration de SMS Non
clé Stratégie de mise en cache Stratégie de mise en cache. Par défaut : " MIS EN CACHE_6H_DEMAIN " Non
clé Mise en cache PUBLIC ou PRIVÉ. Détermine si les serveurs proxy sont autorisés à mettre des données en cache ou non. Non
Code régional du numéro de téléphone Code régional du numéro de téléphone Non
Clé Récupération de compte Active la récupération des comptes d'utilisateurs. Par défaut : " faux " Non
Clé Verrouillage des touches en cas d'échecs multiples de connexion Active le verrouillage de l'accès après plusieurs échecs de connexion Non
Analyse de Google UA Clé d'analyse Google UA pour le suivi de l'utilisation du site Non
Informations d'identification Expirés Demande de modification du mot de passe du compte utilisateur. Par défaut : « 0 » (jamais) Non
Alerte d'expiration des informations d'identification Activer l'alerte lorsque les informations d'identification sont proches de la date d'expiration Non
Rappel de l'expiration des informations d'identification en jours Nombre de jours pendant lesquels l'alerte relative à l'expiration des informations d'identification doit être envoyée avant l'expiration effective. Par défaut : 28 Non
alerte d'expiration du compte Envoi un e-mail d'alerte aux utilisateurs dont le compte est sur le point d'expirer en raison d'une date d'expiration définie. Par défaut : " faux " Non
expiration du compte en jours Nombre de jours pendant lesquels l'alerte d'expiration du compte doit être envoyée avant l'expiration réelle. Par défaut : 7 Non
clé Auto inscription, pas de recaptcha Ne pas exiger de recaptcha pour l'auto-inscription. Par défaut : " faux " Non
secret de recaptcha Secret de recaptcha de l'API Google. Par défaut : l'API secret de l'instance de jeu dhis2, mais cela ne fonctionnera que sur votre instance locale et pas en production. Non
site de recaptcha Site de recaptcha de l'API Google. Par défaut : l'API du site de l'instance de jeu dhis2, mais cela ne fonctionnera que sur votre instance locale et pas en production. Non
clé Peut accorder des groupes d'autorisation à ses propres utilisateurs Permet aux utilisateurs d'attribuer leurs propres rôles. Par défaut : " faux " Non
clé limite maximale de vue Sql Limite maximale pour la vue SQL Non
keyDataQualityMaxLimit Max limit for data quality results. Must be between zero and 50,000. Non
clé Respecter les dates de début et de fin des métadonnées dans l'exportation des tableaux analytiques Lorsque cette option est " vraie ", l'outil d'analyse ignore les données qui ne sont pas comprises dans les dates de début et de fin de l'option de catégorie. Par défaut : " faux " Non
clé Sauter la validation du type de données dans l'exportation de tableaux analytiques Ne pas valider le type de données dans l'exportation de tableaux analytiques Non
clé Logo personnalisé de la page de connexion Logo pour la page de connexion personnalisée Non
clé Logo du menu supérieur personnalisé Logo pour le menu supérieur personnalisé Non
globalShellEnabled When this property is enabled (set to true), apps will be displayed as iframes within a global shell. This global shell provides a consistent header bar across the system which has expanded functionalities compared to the original header bar. Default: true. Non
clé Seuil de l'année des données du Cache analytique Les données analytiques plus anciennes que cette valeur (en années) seront toujours mises en cache. La valeur « 0 » désactive ce paramètre. Par défaut : 0 Non
Analyse du début de l'exercice financier Set financial year start. Options: FINANCIAL_YEAR_FEBRUARY, FINANCIAL_YEAR_APRIL, FINANCIAL_YEAR_JULY, INANCIAL_YEAR_AUGUST, FINANCIAL_YEAR_SEPTEMBER, FINANCIAL_YEAR_OCTOBER. Default: FINANCIAL_YEAR_OCTOBER Non
analyticsWeeklyStart Set weekly relative period start day. Options: WEEKLY (Monday), WEEKLY_WEDNESDAY, WEEKLY_THURSDAY, WEEKLY_FRIDAY, WEEKLY_SATURDAY, WEEKLY_SUNDAY. Default: WEEKLY (Monday) Non
clé Ignorer le seuil de l'année d'approbation de l'analyse « 0 » vérifie l'approbation de toutes les données. « -1 » désactive le contrôle de l'approbation. « 1 » ou plus vérifie l'approbation de toutes les données qui sont plus récentes que « 1 » année. Non
clé Limite Maximale Analytique Nombre maximal d'enregistrements analytiques. Par défaut : « 50000 » Non
KeyTrackedEntityMaxLimit (Clé Limite maximale de l'entité suivie) Maximum number of tracked entities that are returned by /tracker/trackedEntities. More info here. Default: "50000" Non
keyAnalyticsMaintenanceMode (Clé Mode de maintenance analytique) Mettre l'analyse en mode maintenance. Par défaut : "false" Non
clé Période d'analyse des Années de compensation Définit le décalage des années à utiliser dans le processus d'exportation des données analytiques. Si l'année d'une date donnée est en dehors du décalage, le système renvoie un message d'avertissement au cours du processus. À ce stade, l'étape de génération de la période est ignorée. Par exemple : supposons que l'utilisateur du système définisse la valeur du décalage à 5, et que nous soyons en l'an 2023. Cela signifie que l'analyse acceptera d'exporter des dates allant de 2018 (inclus) à 2028 (inclus). Ce qui se traduit par : [2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025, 2026, 2027, 2028]. REMARQUE : Le décalage aura une influence significative sur l'utilisation des ressources. Des valeurs plus élevées entraîneront une utilisation plus importante de la mémoire RAM/HEAP et de l'unité centrale. La définition de nombres négatifs pour cette clé désactivera tout type de validation (ce qui signifie qu'il n'y aura pas d'avertissement) et la plage interne d'années sera utilisée (1970 à l'année en cours plus 10) Par défaut : 22 Non
clé Unités centrales du serveur de la base de données Nombre d'unités centrales du serveur de base de données. Par défaut : « 0 » (Automatique) Non
clé Dernière exécution réussie des tableaux d'analyse Conserve l'horodatage de la dernière exécution réussie des tables d'analyse. Non
keyLastSuccessfulLatestAnalyticsPartitionRuntime (clé Temps d'exécution de la dernière analyse de la dernière Partition) Conserve l'horodatage de la dernière exécution réussie de la partition analytique Non
clé Dernière Exécution de la Surveillance Conserve l'horodatage de la dernière exécution de la surveillance Non
clé Dernière Syncronisation de Données Réussie Conserve l'horodatage de la dernière synchronisation réussie des valeurs de données Non
clé Dernière synchronisation réussie d'événements de données Conserve l'horodatage de la dernière synchronisation réussie des données des programmes d'événements. Non
keyLastCompleteDataSetRegistrationSyncSuccess (clé Succès de la synchronisation de l'enregistrement du dernier ensemble de données complet ) Conserve l'horodatage de la dernière synchronisation réussie de l'exhaustivité Non
sync Sauter la synchronisation pour les données modifiées avant Spécifie l'horodatage utilisé pour ignorer la synchronisation de toutes les données modifiées avant ce point dans le temps Non
Dernière mise à jour réussie des tableaux d'analyse Conserve l'horodatage de la dernière mise à jour réussie des tableaux d'analyse Non
clé Dernière mise à jour réussie de la partition analytique Conserve l'horodatage de la dernière mise à jour réussie de la partition analytique Non
clé Dernière mise à jour réussie des tableaux de ressources Conserve l'horodatage de la dernière mise à jour réussie des tableaux de ressources Non
keyLastSuccessfulSystemMonitoringPush (Clé Dernier push réussi de la surveillance du système ) Conserve l'horodatage de du dernier push réussi de la surveillance du système Non
keyLastSuccessfulMonitoring (clé Dernière surveillance réussie) Conserve l'horodatage de la dernière surveillance réussie Non
keyNextAnalyticsTableUpdate (clé Mise à jour du tableau analytique suivant) Conserve l'horodatage de la prochaine mise à jour du tableau d'analyse Non
Lien de la page d'aide Lien vers la page d'aide. Par défaut : "https://dhis2.github.io/dhis2-docs/master/en/user/html/dhis2_user_manual_en.html Non
keyAcceptanceRequiredForApproval (clé Acceptation requise pour l'approbation) L'acceptation est requise avant la validation. Par défaut "faux" Non
clé Notifications Email du Système Où envoyer les notifications du système par e-mail Non
clé Analyse de la Période Relative Période relative par défaut pour l'analyse. Par défaut : « 12_DERNIERS_MOIS ». Non
keyRequireAddToView (clé Nécessite Ajouter à l'affichage) Autorisation requise pour l'ajout de listes d'objets à visualiser. Par défaut : « faux » Non
keyAllowObjectAssignment (clé Autoriser l'affectation d'objets) Autoriser l'affectation d'un objet à des objets apparentés lors d'un ajout ou d'une mise à jour. Par défaut "faux" Non
keyUseCustomLogoFront (Clé Utilisation du logo personnalisé sur la face avant) Permet l'utilisation d'un logo personnalisé sur la page d'accueil. Par défaut : « faux » Non
keyUseCustomLogoBanner (clé Utiliser une bannière du logo personnalisé) Permet l'utilisation d'une bannière personnalisée sur le site web. Par défaut : « faux » Non
keyDataImportStrictPeriods (clé Importation de données de Périodes strictes) Non
keyDataImportStrictPeriods (clé Importation de données de Périodes strictes) Exige que les périodes correspondent au type de période de l'ensemble de données. Par défaut : « faux » Non
keyDataImportStrictDataElements (Clé Importation de données Éléments de données stricts) Exiger que les éléments de données fassent partie de l'ensemble de données. Par défaut : « faux » Non
keyDataImportStrictCategoryOptionCombos (clé Importation de données Strict Combinaisons d'options de catégories) Nécessite que les combinaisons d'options de catégorie correspondent à la combinaison de catégories de l'élément de données. Par défaut : « faux » Non
keyDataImportStrictOrganisationUnits (clé Importation de données Unités d'organisation strictes) Nécessite que les unités d'organisation correspondent à l'affectation de l'ensemble de données. Par défaut : « faux » Non
keyDataImportStrictAttributeOptionsCombos Nécessite que l'option d'attribut combis corresponde à la catégorie combo de l'ensemble de données. Par défaut : « faux » Non
keyDataImportStrictDataSetApproval vrai : si un ensemble de données déjà approuvé existe pour une saisie de valeur de données quelconque, il n'est pas autorisé ; faux : Si un ensemble de données non encore approuvé existe pour une saisie de valeur de données quelconque, l'autorisation est accordée. Par défaut : « vrai » Non
keyDataImportStrictDataSetLocking vrai : s'il existe un ensemble de données pour lequel la saisie a expiré sans exception de verrouillage pour une valeur de données quelconque, la saisie n'est pas autorisée ; faux : S'il existe un ensemble de données pour lequel la saisie n'a pas expiré ou pour lequel une exception de verrouillage s'applique pour une valeur de données quelconque, la saisie est autorisée. Par défaut : « vrai » Non
keyDataImportStrictDataSetInputPeriods true : S'il existe un ensemble de données pour lequel la période de saisie est clôturée pour une saisie de valeur de données quelconque, cela n'est pas autorisé ; faux : S'il existe un ensemble de données pour lequel la période de saisie est ouverte pour une saisie de valeur de données quelconque, cela n'est pas autorisé : Par défaut : « vrai » Non
keyDataImportRequireCategoryOptionCombo Exige que la combinaison d'options de catégorie soit spécifiée. Par défaut : « faux » Non
keyDataImportRequireAttributeOptionCombo Exige que la combinaison d'options d'attributs soit spécifiée. Par défaut : « faux » Non
keyCustomJs JavaScript personnalisé à utiliser sur le site web Non
keyCustomCss CSS personnalisé à utiliser sur le site web Non
clé calendrier Le type de calendrier. Par défaut : « iso8601 ». Non
keyDateFormat Format dans lequel les dates doivent être affichées. Par défaut : « aaaa-MM-jj ». Non
cléStyle The style used by the DHIS2 Android app. Default: "light_blue/light_blue.css". Non
keyRemoteInstanceUrl Url utilisée pour se connecter à l'instance distante Non
keyRemoteInstanceUsername Nom d'utilisateur utilisé pour se connecter à l'instance DHIS2 distante Non
keyRemoteInstancePassword Mot de passe utilisé pour se connecter à l'instance DHIS2 distante Non
keyGoogleMapsApiKey Clé API Google Maps Non
keyGoogleCloudApiKey Clé de l'API Google Cloud Non
keyLastMetaDataSyncSuccess Conserve l'horodatage de la dernière synchronisation réussie des métadonnées. Non
keyVersionEnabled Permet le versionnage des métadonnées Non
keyMetadataFailedVersion Conserve les détails de l'échec de la version de synchronisation des métadonnées Non
keyMetadataLastFailedTime Conserve l'horodatage du dernier échec de synchronisation des métadonnées Non
keyLastSuccessfulScheduledProgramNotifications Non
keyLastSuccessfulScheduledDataSetNotifications Non
keyRemoteMetadataVersion Détails sur la version des métadonnées de l'instance distante Non
keySystemMetadataVersion Détails sur la version des métadonnées du système Non
keyStopMetadataSync Drapeau pour arrêter la synchronisation des métadonnées Non
keyFileResourceRetentionStrategy Détermine la durée de conservation des ressources du fichier associées aux valeurs supprimées ou mises à jour. AUCUNE, TROIS_MOIS, UNE_ANNÉE ou INDÉFINIMENT. Non
syncMaxRemoteServerAvailabilityCheckAttempts Indique combien de fois la disponibilité du serveur distant sera vérifiée avant que les tâches de synchronisation n'échouent. Non
syncMaxAttempts Spécifie le nombre maximum de tentatives pour les tâches de synchronisation Non
syncDelayBetweenRemoteServerAvailabilityCheckAttempts Délai entre les contrôles de disponibilité du serveur distant Non
lastSuccessfulDataStatistics Conserve l'horodatage de la dernière analyse de données réussie Non
keyHideDailyPeriods Pas en cours d'utilisation Non
keyHideWeeklyPeriods Non
keyHideBiWeeklyPeriods Indicateur booléen utilisé pour masquer/afficher les périodes bihebdomadaires Non
keyHideMonthlyPeriods Non
keyHideBiMonthlyPeriods Non
keyGatherAnalyticalObjectStatisticsInDashboardViews Si l'on souhaite recueillir des statistiques analytiques sur les objets lorsqu'ils sont visualisés dans un tableau de bord. Non
keyCountPassiveDashboardViewsInUsageAnalytics Comptabilise les consultations « passives » des tableaux de bord (sans sélection d'un tableau de bord particulier) dans l'analyse de l'utilisation. Non
keyDashboardContextMenuItemSwitchViewType Permet aux utilisateurs de changer le type d'affichage des favoris du tableau de bord Oui
keyDashboardContextMenuItemOpenInRelevantApp Permet aux utilisateurs d'ouvrir les favoris du tableau de bord dans les applications pertinentes. Oui
keyDashboardContextMenuItemShowInterpretationsAndDetails Permet aux utilisateurs d'afficher les interprétations et les détails des favoris du tableau de bord Oui
keyDashboardContextMenuItemViewFullscreen Permet aux utilisateurs d'afficher les favoris du tableau de bord en plein écran Oui
jobsRescheduleAfterMinutes (tâches reprogrammées après des minutes) Si une tâche est dans le statut RUNNING (en cours d'exécution) pendant ce nombre de minutes ou plus sans faire de progrès sous la forme d'une mise à jour de son chronogramme lastAlive (dernière vue), la tâche est considérée comme périmée et réinitialisée dans le statut SCHEDULED (planifié). Non
jobsCleanupAfterMinutes (Nettoyage des tâches après quelques minutes) Une tâche "exécutée une fois" est supprimée lorsque ce nombre de minutes s'est écoulé après l'exécution réussie ou non de la tâche. Non
jobsMaxCronDelayHours (tâches Heures maximales de délai Cron) Une tâche déclenchée par une expression CRON ne se déclenchera que dans la fenêtre comprise entre l'heure cible de la journée et ce nombre d'heures plus tard. S'il n'a pas pu s'exécuter dans cette fenêtre, l'exécution est ignorée et la prochaine exécution selon l'expression CRON est la prochaine exécution cible Non
jobsLogDebugBelowSeconds (tâches Journal de débogage en dessous de secondes) Une tâche dont l'intervalle d'exécution est inférieur à ce nombre de secondes enregistre ses informations sur le débogage plutôt que sur l'information Non
clé Tâches parallèles dans l'exportation de tableaux analytiques Renvoie le nombre de tâches parallèles à utiliser pour traiter les tableaux analytiques. Il est prioritaire sur « keyDatabaseServerCpus ». Par défaut : -1 Non
orgUnitCentroidsInEventsAnalytics If true, the analytics event tables are created with a centroid value for each Data Element or TEA of type OU or OU Geometry. Default: false Non

Paramètres de l'utilisateur

Vous pouvez manipuler les paramètres de l'utilisateur en interagissant avec la ressource userSettings. Un paramètre utilisateur est une simple paire clé-valeur, où la clé et la valeur sont des chaînes de texte en clair. Le paramètre utilisateur sera lié à l'utilisateur authentifié pour la requête de l'API Web. Pour obtenir une liste de tous les paramètres utilisateur, vous pouvez envoyer une requête GET à l'URL suivante :

/api/33/userSettings

Les paramètres non définis par l'utilisateur seront remplacés par les paramètres équivalents du système. Pour ne renvoyer que les valeurs définies explicitement par l'utilisateur, vous pouvez ajouter ?useFallback=false à l'URL ci-dessus, comme ceci :

/api/33/userSettings?useFallback=false

Pour enregistrer ou mettre à jour un paramètre pour l'utilisateur actuellement authentifié, vous pouvez envoyer une requête POST à l'URL suivante :

/api/33/userSettings/my-key?value=my-val

Vous pouvez spécifier explicitement l'utilisateur pour lequel le paramètre doit être sauvegardé en utilisant cette syntaxe :

/api/33/userSettings/my-key?user=username&value=my-val

Vous pouvez également soumettre la valeur du paramètre dans le corps de la requête, où le type de contenu est défini sur "texte/clair". Par exemple, vous pouvez utiliser curl comme suit :

curl "https://play.dhis2.org/demo/api/33/userSettings/my-key" -d "My long value"
  -H "Content-Type: text/plain" -u admin:district

Par exemple, pour définir les paramètres linguistiques de l'interface utilisateur de l'utilisateur actuel en français, vous pouvez utiliser la commande suivante.

curl "https://play.dhis2.org/demo/api/33/userSettings/keyUiLocale?value=fr"
  -X POST -u admin:district

Vous devez remplacer my-key par votre véritable clé et my-val par votre valeur réelle. Pour récupérer la valeur d'une clé donnée en texte brut, vous pouvez envoyer une requête GET à l'URL suivante :

/api/33/userSettings/my-key

Pour supprimer un paramètre utilisateur, vous pouvez envoyer une requête DELETE à l'URL similaire à celle utilisée ci-dessus pour la récupération.

Les paramètres système disponibles sont énumérés ci-dessous.

Tableau : Paramètres de l'utilisateur

Clé Options Description
cléStyle light_blue/light_blue.css | green/green.css | vietnam/vietnam.css Feuille de style de l'interface utilisateur.
Clé Message de notification par Email false true
clé Notification par message Sms false true
cléUiLocale Valeur locale Locale de l'interface utilisateur.
cléDbLocale Valeur locale Locale du contenu de la base de données.
Propriété d'affichage de l'analyse clé nom | Nom court Propriété à afficher pour les métadonnées dans les applications d'analyse.
type clé du domaine actuel tous | ; agrégat | ; tracker Type de domaine de l'élément de données à afficher dans les listes.
clé Sauvegarde automatique du formulaire de saisie de cas false true
clé Formulaire d'enregistrement automatique des entités suivies false true
clé Sauvegarde automatique du formulaire de saisie des données false true
présentation du tableau de bord clé du tracker false true

Configuration

Pour accéder à la configuration, vous pouvez interagir avec la ressource configuration. Vous pouvez obtenir des réponses XML et JSON via l'en-tête Accepter ou en utilisant les extensions .json ou .xml. Vous pouvez OBTENIR toutes les propriétés de la configuration depuis :

/api/33/configuration

Vous pouvez envoyer des requêtes GET et POST aux ressources spécifiques suivantes :

GET /api/33/configuration/systemId

GET POST DELETE /api/configuration/feedbackRecipients

GET POST DELETE /api/configuration/offlineOrganisationUnitLevel

GET POST /api/configuration/infrastructuralDataElements

GET POST /api/configuration/infrastructuralIndicators

GET POST /api/configuration/infrastructuralPeriodType

GET POST /api/configuration/dataOutputPeriodTypes

GET POST DELETE /api/configuration/selfRegistrationRole

GET POST DELETE /api/configuration/selfRegistrationOrgUnit

GET POST /api/facilityOrgUnitGroupSet

GET POST /api/facilityOrgUnitLevel

Pour la configuration de la liste d'autorisations CORS, vous pouvez effectuer une requête POST avec un tableau d'URLs vers la liste d'autorisations comme charge utile en utilisant "application/json" comme type de contenu, par exemple :

["www.google.com", "www.dhis2.org", "www.who.int"]
GET POST /api/33/configuration/corsAllowlist

Pour les requêtes POST, la valeur de configuration doit être envoyée sous forme de texte dans la charge utile de la requête. Le tableau suivant indique les valeurs de configuration appropriées pour chaque propriété.

Tableau : Valeurs de configuration

Propriété de la configuration Valeur
Bénéficiaires du retour d'information Identifiant du Groupe d’utilisateurs
niveau de l'unité d'organisation hors ligne Identifiant du niveau de l'unité d'organisation
éléments de données infrastructurelles Identifiant du groupe d'éléments de données
Indicateurs infrastructurels Identifiant du groupe d'indicateurs
Type de période infrastructurelle Nom du type de période (par exemple « Mensuel »)
dataOutputPeriodTypes JSON list of period type name (e.g. "Monthly", "Quarterly", "Yearly", etc.)
rôle d'auto-inscription Identifiant du rôle d'utilisateur
Unité d'organisation d'auto-inscription Identifiant de l'unité d'organisation
Mot de passe smtp Mot de passe du serveur email SMTP
Url du serveur distant Url au serveur distant
Nom d'utilisateur du serveur distant Nom d'utilisateur pour l'authentification du serveur distant
mot de passe du serveur distant Mot de passe pour l'authentification du serveur distant
corsAllowlist (Liste de permis Cors) Liste JSON des URL

Par exemple, pour définir le groupe d'utilisateurs des destinataires du retour d'information, vous pouvez invoquer la commande curl suivante :

curl "localhost/api/33/configuration/feedbackRecipients" -d "wl5cDMuUhmF"
  -H "Content-Type:text/plain"-u admin:district

Jetons

La ressource tokens fournit des jetons d'accès à différents services.

Compte Google Service

Vous pouvez récupérer un jeton d'accès OAuth 2.0 du compte de service Google à l'aide d'une requête GET vers la ressource suivante.

GET /api/tokens/google

Le jeton est valable pendant un certain temps, après quoi un autre jeton doit être demandé à cette ressource. La réponse contient un en-tête de contrôle de cache qui correspond à l'expiration du jeton. La réponse contiendra les propriétés suivantes au format JSON.

Tableau : Réponse du jeton

Propriété Description
jeton_d'accès Jeton d'accès OAuth 2.0 à utiliser lors de l'authentification auprès des services Google.
expire_dans Nombre de secondes avant l'expiration du jeton d'accès, généralement 3600 secondes (1 heure).
identifiant_du client L'identifiant du client du compte du service Google.

Cela suppose qu'un compte de service Google a été créé et configuré pour DHIS2. Veuillez consulter le guide d'installation pour plus d'informations.

Contenu statique

La ressource staticContent vous permet de télécharger et d'extraire des logos personnalisés utilisés dans DHIS2. La ressource permet à l'utilisateur de télécharger un fichier avec une clé associée, qui peut ensuite être extraite à l'aide de la clé. Seuls les fichiers PNG sont pris en charge et ne peuvent être téléchargés que vers les clés logo_banner et logo_front.

/api/33/staticContent

Tableau : Clés de contenu statique

Clé Description
logo_bannière Logo dans le menu supérieur de l'application sur le côté gauche.
logo_façade Logo sur la page de connexion au-dessus du formulaire de connexion.

Pour télécharger un fichier, envoyez-le avec une requête POST à :

POST /api/33/staticContent/<key>

Exemple de requête pour télécharger logo.png dans la clé logo_front :

curl -F "file=@logo.png;type=image/png" "https://play.dhis2.org/demo/api/33/staticContent/logo_front"
  -X POST -H "Content-Type: multipart/form-data" -u admin:district

Le téléchargement de plusieurs fichiers avec la même clé écrasera le fichier existant. Ainsi, la recherche d'un fichier pour une clé donnée ne renverra que le dernier fichier téléchargé.

Pour récupérer un logo, vous pouvez OBTENIR ce qui suit :

GET /api/33/staticContent/<key>

Exemple de requêtes pour récupérer le fichier stocké pour logo_front :

  • Ajout de « Accepter : text/html » à l'en-tête HTTP.*__ Dans ce cas, le point d'extrémité renverra une image par défaut si rien n'est défini. Il renvoie un flux d'images lorsqu'une image personnalisée ou par défaut est trouvée.
curl "https://play.dhis2.org/demo/api/33/staticContent/logo_front"
  -H "Accept: text/html" -L -u admin:district
  • Ajout de « Accepter : application/json » à l'en-tête HTTP.*__ Avec ce paramètre, le point d'extrémité ne renverra jamais d'image par défaut si le logo personnalisé n'est pas trouvé. Au lieu de cela, un message d'erreur sera renvoyé. Lorsque l'image personnalisée est trouvée, ce point d'extrémité renvoie une réponse JSON contenant le chemin/URL de l'image correspondante.
curl "https://play.dhis2.org/demo/api/33/staticContent/logo_front"
  -H "Accept: application/json" -L -u admin:district

Les messages de succès et d'erreur se présentent comme suit :

{
  "images": {
    "png": "http://localhost:8080/dhis/api/staticContent/logo_front"
  }
}
{
  "httpStatus": "Non trouvé",
  "httpStatusCode": 404,
  "statut": "ERREUR",
  "message": "Aucun fichier personnalisé n'a été trouvé."
}

Pour utiliser des logos personnalisés, vous devez activer les paramètres système correspondants en leur attribuant la valeur vrai. Si le paramètre correspondant est faux, le logo par défaut sera utilisé.

Paramétrage de l'IU

Pour parametrer l'interface utilisateur de l'application DHIS2, vous pouvez insérer des styles JavaScript et CSS personnalisés via la ressource files.

POST GET DELETE /api/33/files/script
POST GET DELETE /api/33/files/style

Le contenu JavaScript et CSS inséré par le biais de cette ressource sera chargé par l'application web DHIS2. Cela peut être particulièrement utile dans certaines situations :

  • Remplacer les styles CSS de l'application DHIS2, tels que la page de connexion ou la page principale.

  • Définir des fonctions JavaScript communes à plusieurs formulaires de saisie de données personnalisés et à des rapports basés sur HTML.

  • Y compris les styles CSS utilisés dans les formulaires de saisie de données personnalisés et les rapports basés sur HTML.

Paramétrage de l'application de connexion

L'application Paramètres permet aux utilisateurs de définir une variété d'éléments (texte, logo, drapeau) qui peuvent être utilisés pour paramétrer la page de connexion de DHIS2. En outre, il est possible de choisir entre deux présentations préconfigurées (la présentation par défaut et une présentation avec barre latérale).

Au besoin, le style et la présentation de l'application de connexion peuvent être personnalisés en téléchargeant un modèle HTML (également définissable dans l'application de configuration). Ce modèle HTML remplace certains éléments (basés sur l'ID) ; les ID en réserve sont listés dans le tableau ci-dessous. Il est donc possible de combiner un style personnalisé (à l'aide de css) et une mise en page personnalisée (à l'aide de HTML) pour modifier l'apparence de l'application de connexion. Le modèle personnalisé ne prend pas en charge les scripts personnalisés, et les balises de script seront supprimées de tout modèle téléchargé.

Pour créer un modèle personnalisé, il est recommandé de commencer par l'un des modèles existants (ceux-ci peuvent être téléchargés à partir de l'application de connexion à l'extension dhis-web-login/#download).

ID Remplacé par
boîte de connexion La boîte de dialogue principale de connexion, qui invite l'utilisateur à saisir son nom d'utilisateur et son mot de passe. Cette boîte doit être incluse pour que l'application de connexion fonctionne comme prévu.
Titre de l'application Texte pour le titre de l'application.
Introduction de l'application Texte pour l'introduction de l'application.
drapeau Le drapeau sélectionné.
logo Le logo (le logo de DHIS2 est utilisé si le logo personnalisé n'est pas défini).
alimenté par Un lien vers DHIS2.org.
application-pieds de page gauche Texte pour le pied de page gauche.
application-pied de page droit Texte pour le pied de page droite.
langue-selectionnée La sélection permet de contrôler la langue de l'application de connexion.

L'apparence de la boîte de dialogue de connexion peut également être modifiée en définissant des variables css dans le modèle HTML. Les variables css suivantes sont disponibles pour le paramétrage :

--form-container-margin-block-start
--form-container-margin-block-end
--form-container-margin-inline-start, auto
--form-container-margin-inline-end
--form-container-default-width
--form-container-padding
--form-container-background-color
--form-container-box-border-radius
--form-container-box-shadow
--form-container-font-color
--form-title-font-size
--form-title-font-weight
--form-container-title-color

You can reset the login page theme using the API by making a POST request to /api/41/systemSettings/loginPageLayout including the loginPageLayout DEFAULT or SIDEBAR value in the request body, where content type is set to "text/plain". As an example, you can use curl like this:

curl "play.im.dhis2.org/stable-2-41-0/api/41/systemSettings/loginPageLayout" -d "DEFAULT" -H "Content-Type: text/plain" -u admin:district

Tracker

Note

Tracker has been re-implemented in DHIS2 2.36. This document describes the new tracker endpoints

  • POST /api/tracker
  • GET /api/tracker/trackedEntities
  • GET /api/tracker/enrollments
  • GET /api/tracker/events
  • GET /api/tracker/relationships

The deprecated tracker endpoints

  • GET/POST/PUT/DELETE /api/trackedEntityInstance
  • GET/POST/PUT/DELETE /api/enrollments
  • GET/POST/PUT/DELETE /api/events
  • GET/POST/PUT/DELETE /api/relationships

have been removed in version 42!

Migrating to new tracker endpoints should help you get started with your migration. Reach out on the community of practice if you need further assistance.

Tracker objects

Le Tracker est constitué de différents types d'objets interconnectés destinés à représenter les données. Dans cette section, nous montrerons et décrirons chacun des objets utilisés dans l'API du Tracker.

Entités suivies

Les entités suivies constituent la base du modèle Tracker.

Propriété Description Obligatoire Immuable Type Exemple
trackedEntity L’identifiant de l’entité suivie. Il est généré au cas où il n'est pas fourni Non Oui Chaîne : Uid ABCDEF12345
TrackedEntityType Le type d’entité suivie. Oui Oui Chaîne : Uid ABCDEF12345
créé à Date et heure à laquelle l'utilisateur a créé l'entité suivie. Elle est définie sur le serveur. Non Non Date : ISO 8601 AAAA-MM-JJThh:mm:ss
crééAtClient (Création au niveau du client) Date et heure à laquelle l'utilisateur a créé l'entité suivie au niveau du client. Non Oui Date : ISO 8601 AAAA-MM-JJThh:mm:ss
updatedAt (mis à jour à) Timestamp when the object or any enrollment, event, attribute or originating relationship, was last updated. Set on the server. Non Non Date : ISO 8601 AAAA-MM-JJThh:mm:ss
updatedAtClient (mise à jour au niveau du client) Date et heure de la dernière mise à jour de l'objet au niveau du client. Non Oui Date : ISO 8601 AAAA-MM-JJThh:mm:ss
orgUnit L'unité d'organisation dans laquelle l'utilisateur a créé l'entité suivie. Oui Oui Chaîne : Uid ABCDEF12345
inactif Indique si l'entité suivie est inactive ou non. Non Oui Booléen Par défaut: faux, vrai
supprimé Indique si l'entité suivie a été supprimée. Ne peut être modifié qu'au moment de la suppression. Non Non Booléen Faux jusqu'à suppression
potentialDuplicate Indique si l'entité suivie est un doublon potentiel Non Non Booléen Par défaut: faux
géométrie Il s'agit d'une représentation géographique de l'entité suivie. Elle se base sur le « type de fonctionnalité » du type d'entité suivie. Non Oui GeoJson {
"type": "POINT",
"coordonnées": [123.0, 123.0]
}
createdBy (créé par) Only for reading data. User that created the object. Set on the server. Non Oui Utilisateur {
"uid": "ABCDEF12345",
"Nom d'utilisateur": "Nom d'utilisateur",
"Prénom": "John",
"Nom de famille": "Doe"
}
updatedBy (mis à jour par) Only for reading data. User that last updated the object. Set on the server. Non Oui Utilisateur {
"uid": "ABCDEF12345",
"Nom d'utilisateur": "Nom d'utilisateur",
"Prénom": "John",
"Nom de famille": "Doe"
}
attributs Liste des valeurs d'attributs d'entité suivie appartenant à l'entité suivie. Non Oui Liste des valeurs d'attributs d'entité suivie Voir les attributs
inscriptions Liste des inscriptions appartenant à l’entité suivie. Non Oui Liste des inscriptions Voir les inscriptions
relations Liste de relations connectées à l'entité suivie. Non Oui Liste des relations Voir les relations
Propriétaires du programme A list of organisation units with access through specific programs to this tracked entity. See "Program Ownership". Non Oui Liste des propriétaires du programme Voir la section « Propriété du programme »

Remarque

Les entités suivies "possèdent" toutes les Valeurs d'attribut d'entités suivies (ou les "attributs" décrits dans le tableau précédent). Cependant, les attributs d'entités suivies sont soit connectés à une entité suivie via son type d'entité suivie soit à un programme. Nous désignons souvent cette séparation par Attributs de type d'entité suivi et Attributs de programme d'entité suivi. L'importance de cette distinction est liée au contrôle d'accès et à la limitation des informations que l'utilisateur peut voir.

Les "attributs" mentionnés dans Entité suivie sont des Attributs de type d'entité suivie.

Enrollments

Tracked Entities can enroll into TRACKER PROGRAM for which they are eligible. Tracked entities are eligible as long as the program is configured with the same Tracked Entity Type as the tracked entity. We represent the enrollment with the Enrollment object, which we describe in this section.

Propriété Description Obligatoire Immuable Type Exemple
enrollment The identifier of the enrollment. Generated if not supplied. Non Oui Chaîne : Uid ABCDEF12345
program The tracker program the enrollment is enrolled into. Oui Non Chaîne : Uid ABCDEF12345
trackedEntity Une référence à l’entité suivie inscrite. Oui Oui Chaîne : Uid ABCDEF12345
status Statut de l'inscription. Il est ACTIF au cas où n'est pas fourni. Non Non Énumération ACTIF, EFFECTUÉ, ANNULÉ
orgUnit L'unité d'organisation dans laquelle l'utilisateur a inscrit l'entité suivie. Oui Non Chaîne : Uid ABCDEF12345
créé à Date et heure à laquelle l'utilisateur a créé l'objet. Elle est définie sur le serveur. Non Oui Date : ISO 8601 AAAA-MM-JJThh:mm:ss
crééAtClient (Création au niveau du client) Timestamp when the user created the object on client. Non Non Date : ISO 8601 AAAA-MM-JJThh:mm:ss
updatedAt (mis à jour à) Date et heure de la dernière mise à jour de l'objet. Elle est définie sur le serveur. Non Oui Date : ISO 8601 AAAA-MM-JJThh:mm:ss
updatedAtClient (mise à jour au niveau du client) Timestamp when the object was last updated on client. Non Non Date : ISO 8601 AAAA-MM-JJThh:mm:ss
inscrit à Date et heure à laquelle l'utilisateur a inscrit l'entité suivie. Oui Oui Date : ISO 8601 AAAA-MM-JJThh:mm:ss
occurredAt (s'est produit à) Date et heure à laquelle l'inscription a eu lieu. Non Oui Date : ISO 8601 AAAA-MM-JJThh:mm:ss
completedAt (effectué à) Timestamp when the user completed the enrollment. Set on the server if not set by the client. Non Oui Date : ISO 8601 AAAA-MM-JJThh:mm:ss
completedBy Only for reading data. User that completed the enrollment. Set on the server. Non Non Chaîne : Toute John Doe
followUp Indicates whether the enrollment requires follow-up. False if not supplied. Non Non Booléen Par défaut : Faux, Vrai
supprimé Indique si l'inscription a été supprimée. Ne peut être modifié qu'au moment de la suppression. Non Oui Booléen Faux jusqu'à suppression
géométrie A geographical representation of the enrollment. Based on the "featureType" of the program. Non Non GeoJson {
"type": "POINT",
"coordonnées": [123.0, 123.0]
}
createdBy (créé par) Only for reading data. User that created the object. Set on the server. Non Oui Utilisateur {
"uid": "ABCDEF12345",
"Nom d'utilisateur": "Nom d'utilisateur",
"Prénom": "John",
"Nom de famille": "Doe"
}
updatedBy (mis à jour par) Only for reading data. User that last updated the object. Set on the server. Non Oui Utilisateur {
"uid": "ABCDEF12345",
"Nom d'utilisateur": "Nom d'utilisateur",
"Prénom": "John",
"Nom de famille": "Doe"
}
attributs Liste des valeurs d'attributs d'entité suivie associées à l'inscription. Non Non Liste des valeurs d'attributs d'entité suivie Voir les attributs
events Liste des événements appartenant à l'inscription. Non Non Liste des événements Voir les évènements
relations Liste des relations liées à l'inscription. Non Non Liste des relations Voir les relations
notes Notes liées à l'inscription. Elles ne peuvent qu'être créées. Non Oui Liste des notes Voir les notes
attributeOptionCombo (combinaison d'options d'attribut) Attribute option combo for the enrollment. If not supplied, the default value defined by the program’s category combo is used. Non Non Chaîne : Uid ABCDEF12345

Remarque

Les entités suivies "possèdent" toutes les Valeurs d'attribut d'entités suivies (ou les "attributs" décrits dans le tableau précédent). Cependant, les attributs d'entités suivies sont soit connectés à une entité suivie via son type d'entité suivie soit à un programme. Nous désignons souvent cette séparation par Attributs de type d'entité suivi et Attributs de programme d'entité suivi. L'importance de cette distinction est liée au contrôle d'accès et à la limitation des informations que l'utilisateur peut voir.

Les "attributs" mentionnés dans Inscription sont des Attributs de programmes d'entités suivies.

Events

Les Événements font partie d'un PROGRAMME D'ÉVÉNEMENT ou d'un PROGRAMME TRACKER. Pour le PROGRAMME TRACKER, les événements appartiennent à une Inscription, laquelle appartient à une Entité suivie. D'un autre côté, PROGRAMME D'ÉVÉNEMENT concerne les Événements non rattachées à une Inscription ou à une Entité suivie spécifique. La différence réside dans le fait que nous effectuons ou non un suivi pour une Entité suivie spécifique. Nous désignons parfois les événements PROGRAMME D'ÉVÉNEMENT "événements anonymes "ou "événements uniques" puisqu'ils ne se représentent qu'eux-mêmes et non une autre Entité suivie.

In the API, the significant difference is that events are either not linked to any enrollment (EVENT PROGRAM) or are linked to different enrollments (TRACKER PROGRAM). The table below will point out any exceptional cases between these two.

Propriété Description Obligatoire Immuable Type Exemple
event The identifier of the event. Generated if not supplied. Non Oui Chaîne : Uid ABCDEF12345
programStage L'étape du programme que représente l'événement. Oui Non Chaîne : Uid ABCDEF12345
enrollment A reference to the enrollment which owns the event. Not applicable for EVENT PROGRAM. Oui Oui Chaîne : Uid ABCDEF12345
program Uniquement pour lire les données. Il s'agit du type de programme de l'inscription qui possède l'événement. Non Oui Chaîne : Uid ABCDEF12345
trackedEntity Only for reading data. The tracked entity which owns the event. Not applicable for EVENT PROGRAM. Non Non Chaîne : Uid ABCDEF12345
status Status of the event. Default is ACTIVE. For EVENT PROGRAM only ACTIVE and COMPLETED statuses are allowed. Non Non Énumération ACTIF, EFFECTUÉ, VISITÉ, HORAIRE, EN RETARD, SAUTÉ
orgUnit Il s'agit de l'unité d'organisation dans laquelle l'utilisateur a enregistré l'événement. Oui Non Chaîne : Uid ABCDEF12345
créé à Uniquement pour lire des données. Date et heure à laquelle l'utilisateur a créé l'évènement. Elle est définie sur le serveur. Non Oui Date : ISO 8601 AAAA-MM-JJThh:mm:ss
crééAtClient (Création au niveau du client) Timestamp when the user created the event on client. Non Non Date : ISO 8601 AAAA-MM-JJThh:mm:ss
updatedAt (mis à jour à) Uniquement pour lire des données. Date et heure de la dernière mise à jour de l'évènement. Elle est définie sur le serveur. Non Oui Date : ISO 8601 AAAA-MM-JJThh:mm:ss
updatedAtClient (mise à jour au niveau du client) Timestamp when the event was last updated on client. Non Non Date : ISO 8601 AAAA-MM-JJThh:mm:ss
scheduledAt (programmé à) Timestamp when the event was scheduled for. Not applicable for EVENT PROGRAM. Non Oui Date : ISO 8601 AAAA-MM-JJThh:mm:ss
occurredAt (s'est produit à) Date et heure à laquelle quelque chose se passe. Oui Oui Date : ISO 8601 AAAA-MM-JJThh:mm:ss
completedAt (effectué à) Timestamp when the user completed the event. Set on the server if not set by the client. Non Oui Date : ISO 8601 AAAA-MM-JJThh:mm:ss
completedBy Only for reading data. User that completed the event. Set on the server. Non Non Chaîne : Toute John Doe
followUp Uniquement pour lire les données. Indique si l'événement a été marqué pour un suivi. Non Non Booléen Faux, Vrai
supprimé Uniquement pour lire les données. Indique si l'évènement a été supprimée. Ne peut être modifié qu'au moment de la suppression. Non Oui Booléen Faux jusqu'à suppression
géométrie A geographical representation of the event. Based on the "featureType" of the program stage. Non Non GeoJson {
"type": "POINT",
"coordonnées": [123.0, 123.0]
}
createdBy (créé par) Only for reading data. User that created the object. Set on the server. Non Oui Utilisateur {
"uid": "ABCDEF12345",
"Nom d'utilisateur": "Nom d'utilisateur",
"Prénom": "John",
"Nom de famille": "Doe"
}
updatedBy (mis à jour par) Only for reading data. User that last updated the object. Set on the server. Non Oui Utilisateur {
"uid": "ABCDEF12345",
"Nom d'utilisateur": "Nom d'utilisateur",
"Prénom": "John",
"Nom de famille": "Doe"
}
attributeOptionCombo (combinaison d'options d'attribut) Attribute option combo for the event. If not supplied, the default value defined by the program’s category combo is used. Non Non Chaîne : Uid ABCDEF12345
attributeCategoryOptions (options de catégorie d'attribut) Attribute category option for the event. If not supplied, the default value defined by the program’s category combo is used Non Non Chaîne : Uid ABCDEF12345
assignedUser Fait référence à un utilisateur qui a été assigné à l'événement. Non Non Utilisateur {
"uid": "ABCDEF12345",
"Nom d'utilisateur": "Nom d'utilisateur",
"Prénom": "John",
"Nom de famille": "Doe"
}
dataValues (Valeurs de données) Liste des valeurs de données liées à l'événement. Non Non Liste des valeurs d'attributs d'entité suivie Voir les attributs
relations Liste des relations liées à l'évènement. Non Non Liste des relations Voir les relations
notes Notes liées à l'évènement. Elles ne peuvent qu'être créées. Non Oui Liste des notes Voir les notes

Relations

Les Relations sont des objets qui relient deux autres objets Tracker. Les contraintes auxquelles chaque côté de la relation doit se conformer sont basées sur le Type de relation de la Relation.

Propriété Description Obligatoire Immuable Type Exemple
relation L'identifiant de la relation. Il est généré au cas où il n'est pas fourni Non Oui Chaîne : Uid ABCDEF12345
Type de relation Il s'agit du type de relation. Il détermine quels objets peuvent être reliés dans une relation. Oui Oui Chaîne : Uid ABCDEF12345
Nom de la relation Only for reading data. The name of the relationship type of this relationship. Non Non Chaîne : Toute Sibling
créé à Date et heure à laquelle l'utilisateur a créé la relation. Elle est définie sur le serveur. Non Oui Date : ISO 8601 AAAA-MM-JJThh:mm:ss
updatedAt (mis à jour à) Date et heure de la dernière mise à jour de la relation. Elle est définie sur le serveur. Non Oui Date : ISO 8601 AAAA-MM-JJThh:mm:ss
crééAtClient (Création au niveau du client) Date et heure à laquelle l'utilisateur a créé la relation au niveau du client. Non Oui Date : ISO 8601 AAAA-MM-JJThh:mm:ss
bidirectionnel Uniquement pour lire les données. Indique si le type de relation est bidirectionnel ou non. Non Non Booléen Vrai ou faux
de, à A reference to each side of the relationship. Must conform to the constraints set in the relationship type. Oui Oui Élément de la relation {"trackedEntity": {"trackedEntity": "ABCEF12345"}}, {"enrollment": {"enrollment": "ABCDEF12345"}} or {"event": {"event": "ABCDEF12345" }}

Note

Relationship item represents a link to an object. Since a relationship can be between any tracker object like tracked entity, enrollment, and event, the value depends on the relationship type. For example, if a relationship type connects from an event to a tracked entity, the format is strict:

{
  "from": {
    "event": { "event": "ABCDEF12345" }
  },
  "to": {
    "trackedEntity": { "trackedEntity": "FEDCBA12345" }
  }
}

Attributs

Attributes are the values describing the tracked entities. Attributes can be associated either through a tracked entity type or a program. This implies that attributes can be part of both a tracked entity and an enrollment. Importantly, an attribute can only have one value, even if a tracked entity has multiple enrollments that define that attribute. This is because the tracked entity ultimately owns the attribute value.

Propriété Description Obligatoire Immuable Type Exemple
attribute Fait référence à l’attribut d’entité suivi représenté. Oui Oui Chaîne : Uid ABCDEF12345
code Uniquement pour lire les données. Il s'agit du code de l'attribut de l'entité suivie. Non Non Chaîne : Toute ABC
Nom d'affichage Uniquement pour lire les données. Il s'agit du nom d'affichage de l'attribut de l'entité suivie. Non Non Chaîne : Toute Nom
créé à Date et heure à laquelle la valeur a été ajoutée. Elle est définie sur le serveur. Non Oui Date : ISO 8601 AAAA-MM-JJThh:mm:ss
updatedAt (mis à jour à) Date et heure de la dernière mise à jour de la valeur. Elle est définie sur le serveur. Non Oui Date : ISO 8601 AAAA-MM-JJThh:mm:ss
storedBy Client reference for who stored/created the value. Set on the server Non Oui Chaîne : Toute John Doe
Type de valeur Uniquement pour lire les données. Il s'agit du type de valeur que l'attribut représente. Non Non Énumération TEXTE, ENTIER et plus
value La valeur de l'attribut d'entité suivi. Non Non Chaîne : Toute John Doe

Note

When adding or updating an attribute, only the attribute and value properties are required. To remove an attribute from a tracked entity or enrollment, set the value to null example.

In the context of tracker, we refer to Tracked Entity Attributes and Tracked Entity Attribute Values simply as attributes. However, it's important to note that attributes and attribute values are also concepts within metadata. Therefore, distinguishing between tracker attributes and metadata attributes is essential. In the tracker API, you can reference metadata attributes by specifying the idScheme on import (see request parameters) and event export.

Data values

While attributes describe a tracked entity, data values describe an event.

Propriété Description Obligatoire Immuable Type Exemple
dataElement L'élément de données que cette valeur représente. Oui Oui Chaîne : Uid ABCDEF12345
value La valeur de données. Non Non Chaîne : Toute 123
providedElsewhere Indique si l'utilisateur a fourni la valeur ailleurs ou non. Faux si la valeur n'a pas été fournie. Non Non Booléen Faux ou vrai
créé à Date et heure à laquelle l'utilisateur a ajouté la valeur. Elle est définie sur le serveur. Non Oui Date : ISO 8601 AAAA-MM-JJThh:mm:ss
updatedAt (mis à jour à) Date et heure de la dernière mise à jour de la valeur. Elle est définie sur le serveur. Non Oui Date : ISO 8601 AAAA-MM-JJThh:mm:ss
createdBy (créé par) Only for reading data. User that created the object. Set on the server. Non Oui Utilisateur {
"uid": "ABCDEF12345",
"Nom d'utilisateur": "Nom d'utilisateur",
"Prénom": "John",
"Nom de famille": "Doe"
}
updatedBy (mis à jour par) Only for reading data. User that last updated the object. Set on the server. Non Oui Utilisateur {
"uid": "ABCDEF12345",
"Nom d'utilisateur": "Nom d'utilisateur",
"Prénom": "John",
"Nom de famille": "Doe"
}

Note

When adding or updating a data value, only the dataElement and value properties are required. To remove a data value from an event, set the value to null see example.

Notes

In situations where additional information or notes about specific issues need to be recorded, these can be captured using notes.

There are two types of notes: enrollment-level notes and event-level notes. An enrollment can consist of one or more events, and notes can be recorded for each event to document reasons such as why an event was missed, rescheduled, or partially completed. Each event within an enrollment can have its own notes. Additionally, overall observations of these events can be recorded using a parent enrollment note. Enrollment notes are useful for documenting reasons such as why an enrollment was canceled. The use of notes is flexible and can be tailored to the user's needs and specific use cases.

Both enrollment and event notes can have an unlimited number of entries; there is no limit to the number of notes that can be added. However, it is not possible to delete or update these notes once they are created. They function like a logbook. To amend a note, a new note can be created. The only way to delete a note is by deleting the parent object, either the event or the enrollment.

Notes do not have a dedicated endpoint; they are exchanged as part of the parent event and/or enrollment payload. A sample payload is found below.

{
  "trackedEntity": "oi3PMIGYJH8",
  "enrollments": [
    {
      "enrollment": "EbRsJr8LSSO",
      "notes": [
        {
          "note": "vxmCvYcPdaW",
          "value": "Enrollment note 1"
        },
        {
          "value": "Enrollment note 2."
        }
      ],
      "events": [
        {
          "event": "zfzS9WeO0uM",
          "notes": [
            {
              "note": "MAQFb7fAggS",
              "value": "Event Note 1."
            },
            {
              "value": "Event Note 2."
            }
          ]
        }
      ]
    }
  ]
}
Propriété Description Obligatoire Immuable Type Exemple
note La référence de la note. Elle est générée si rien n'est fourni Non Oui Chaîne : Uid ABCDEF12345
value Le contenu de la note. Oui Oui Chaîne : Toute Ceci est une note
Stocké à Date et heure à laquelle l'utilisateur a ajouté la note. Elle est définie sur le serveur. Non Oui Date : ISO 8601 AAAA-MM-JJThh:mm:ss
createdBy (créé par) Only for reading data. User that created the object. Set on the server. Non Oui Utilisateur {
"uid": "ABCDEF12345",
"Nom d'utilisateur": "Nom d'utilisateur",
"Prénom": "John",
"Nom de famille": "Doe"
}

Utilisateurs

Propriété Description Obligatoire Immuable Type Exemple
uid L'identifiant de l'utilisateur. Oui* Oui Chaîne : Uid ABCDEF12345
Nom d'utilisateur Le nom d'utilisateur utilisé par l'utilisateur. Oui* Oui Chaîne : Toute 123
Prénom Uniquement pour lire les données. Il s'agit du prénom de l'utilisateur. Non Oui Chaîne : Toute John
Nom de famille Uniquement pour lire les données. Il s'agit du nom de famille de l'utilisateur. Non Oui Chaîne : Toute Doe

Note

Either uid or username must be provided. If both are provided, only username is considered.

ID schemes

Tracker supports different identifier schemes, referred to as ID schemes. The default ID scheme for import and export is UID.

ID schemes are supported in the following endpoints.

See each section for request parameters.

Only metadata fields directly on the entity are exported using the chosen idScheme. Metadata in collections are always exported using UIDs, except for:

  • TrackedEntity.attributes[].attribute
  • Event.dataValues[].dataElement

For example, metadata references in TrackedEntity.relationships or enrollments will always use UIDs for import/export.

The import expects metadata identifiers to only use the chosen idScheme. Similarly, metadata is exported only using the chosen idScheme. If metadata lacks identifiers for the chosen idScheme, you'll receive an error like the below.

{
  "httpStatus": "Unprocessable Entity",
  "httpStatusCode": 422,
  "status": "ERROR",
  "message": "Not all metadata has an identifier for the requested idScheme. Either change the requested idScheme or add the missing identifiers to the metadata.",
  "devMessage": "Following metadata listed using their UIDs is missing identifiers for the requested idScheme: ProgramStage[ATTRIBUTE:Y1LUDU8sWBR]=A03MvHHogjR .."
}

To resolve this, either:

  • Add the missing identifiers.
  • Change the idScheme parameters to use a scheme with complete information.

Tracker import

POST /api/tracker

The endpoint POST /api/tracker is also called the tracker importer. This endpoint allows clients to import i.e. create, update and delete

  • Entités suivies
  • Enrollments
  • Événements
  • Relations
  • Objects embedded in other tracker objects

Request parameters

The tracker importer supports the following parameters:

Paramètre de requête Description Type Valeurs autorisées Valeur par défaut
async Indique si l’importation doit avoir lieu de manière asynchrone ou synchrone. Booléen true, false true
Mode de rapport Uniquement lors d'une importation synchrone. Voir le "Récapitulatif de l'importation" pour plus d’informations. Énumération COMPLET, ERREURS, AVERTISSEMENTS ERRORS
Mode d'importation Peut être soit VALIDATE qui rapportera les erreurs dans la charge sans faire de changements dans la base de données, soit COMMIT (par défaut) qui validera la charge et fera des changements dans la base de données. Énumération VALIDER, COMMITER COMMIT
idScheme IdScheme used for all metadata references unless overridden by a metadata specific parameter. Default is UID. Énumération UID, CODE, NAME, ATTRIBUTE:{uid} UID
dataElementIdScheme IdScheme used for data element references. Defaults to the idScheme parameter. Énumération UID, CODE, NAME, ATTRIBUTE:{uid} idScheme parameter
orgUnitIdScheme IdScheme used for organisation unit references. Defaults to the idScheme parameter. Énumération UID, CODE, NAME, ATTRIBUTE:{uid} idScheme parameter
programIdScheme IdScheme used for program references. Defaults to the idScheme parameter. Énumération UID, CODE, NAME, ATTRIBUTE:{uid} idScheme parameter
programStageIdScheme IdScheme used for program stage references. Defaults to the idScheme parameter. Énumération UID, CODE, NAME, ATTRIBUTE:{uid} idScheme parameter
categoryOptionComboIdScheme IdScheme used for category option combo references. Defaults to the idScheme parameter. Énumération UID, CODE, NAME, ATTRIBUTE:{uid} idScheme parameter
categoryOptionIdScheme (Schéma d'identification des options de catégorie) IdScheme used for category option references. Defaults to the idScheme parameter. Énumération UID, CODE, NAME, ATTRIBUTE:{uid} idScheme parameter
importStrategy (stratégie d'importation) Indique l'effet que l'importation doit avoir. Les différentes possibilités sont CRÉER, METTRE À JOUR, CRÉER_ET_METTRE À JOUR et SUPPRIMER. Respectivement, elles permettent d'importer de nouvelles données, d'importer des modifications à des données existantes, d'importer de nouvelles données ou des mises à jour à des données existantes et, enfin, de supprimer des données. Énumération CRÉER, METTRE À JOUR, CRÉER_ET_METTRE À JOUR et SUPPRIMER CRÉER
Mode atomique Indique comment l'importation répond aux erreurs de validation. S'il est défini sur TOUS, toutes les données importées doivent être valides avant que chaque donnée ne soit commitée. Par contre s'il est défini sur OBJET, seules les données commitées doivent être valides, tandis que d'autres données peuvent être invalides. Énumération TOUS, OBJET TOUS
flushMode (mode de vidage) Indique la fréquence de vidange. Il s'agit de la fréquence à laquelle les données sont introduites dans la base de données au cours de l'importation. Il est principalement utilisé à des fins de débogage et ne doit pas être modifié dans un environnement de production. Énumération AUTO, OBJET AUTO
Mode de validation Indicates the completeness of the validation step. It can be skipped, set to fail fast (Return on the first error), or full (default), which will return any errors found Énumération COMPLET, ÉCHOUER_RAPIDEMENT, SAUTER COMPLET
Validation du modèle de saut S'il est défini sur 'vrai', la validation du modèle des attributs générés sera sautée. Booléen true, false faux
Sauter les effets secondaires Si défini sur 'vrai', les effets secondaires de l'importation seront ignorés. Booléen true, false faux
Sauter les règles Si défini sur 'vrai', l'exécution des règles de programme pour l'importation sera ignorée. Booléen true, false faux

Sync and async

The main difference for the user between synchronous and asynchronous imports is the timing of the API response. Synchronous imports provide an immediate import summary once the import is finished. In contrast, asynchronous imports return a reference to the import job right away. The progress of the import job can be tracked using this response.location. An example of an asynchronous import response is found below.

{
  "httpStatus": "OK",
  "httpStatusCode": 200,
  "status": "OK",
  "message": "Tracker job added",
  "response": {
    "id": "cHh2OCTJvRw",
    "location": "https://play.im.dhis2.org/dev/api/tracker/jobs/cHh2OCTJvRw"
  }
}

For large imports, opting for asynchronous import can be advantageous, as it prevents long waiting times for a response.

Payload

The importer supports both flat and nested payloads.

Flat payload

The flat payload can include collections for each of the core tracker objects: tracked entities, enrollments, events, and relationships. This format integrates well with existing data that already has UIDs assigned. However, for new data, the client must provide new UIDs for any references between objects. For instance, if you import a new tracked entity with a new enrollment, the client must provide a UID for the tracked entity so that the enrollment can be linked to it.

{
  "trackedEntities": [
    {
      "orgUnit": "y77LiPqLMoq",
      "trackedEntity": "Kj6vYde4LHh",
      "trackedEntityType": "nEenWmSyUEp"
    },
    {
      "orgUnit": "y77LiPqLMoq",
      "trackedEntity": "Gjaiu3ea38E",
      "trackedEntityType": "nEenWmSyUEp"
    }
  ],
  "enrollments": [
    {
      "enrolledAt": "2019-08-19T00:00:00.000",
      "enrollment": "MNWZ6hnuhSw",
      "occurredAt": "2019-08-19T00:00:00.000",
      "orgUnit": "y77LiPqLMoq",
      "program": "IpHINAT79UW",
      "status": "ACTIVE",
      "trackedEntity": "Kj6vYde4LHh",
      "trackedEntityType": "nEenWmSyUEp",
      "attributeOptionCombo": "HllvX50cXC0",
    }
  ],
  "events": [
    {
      "attributeCategoryOptions": "xYerKDKCefk",
      "attributeOptionCombo": "HllvX50cXC0",
      "dataValues": [
        {
          "dataElement": "bx6fsa0t90x",
          "value": "true"
        },
        {
          "dataElement": "UXz7xuGCEhU",
          "value": "5.7"
        }
      ],
      "enrollment": "MNWZ6hnuhSw",
      "enrollmentStatus": "ACTIVE",
      "event": "ZwwuwNp6gVd",
      "occurredAt": "2019-08-01T00:00:00.000",
      "orgUnit": "y77LiPqLMoq",
      "program": "IpHINAT79UW",
      "programStage": "A03MvHHogjR",
      "scheduledAt": "2019-08-19T13:59:13.688",
      "status": "ACTIVE",
      "trackedEntity": "Kj6vYde4LHh"
    },
    {
      "attributeCategoryOptions": "xYerKDKCefk",
      "attributeOptionCombo": "HllvX50cXC0",
      "enrollment": "MNWZ6hnuhSw",
      "enrollmentStatus": "ACTIVE",
      "event": "XwwuwNp6gVE",
      "occurredAt": "2019-08-01T00:00:00.000",
      "orgUnit": "y77LiPqLMoq",
      "program": "IpHINAT79UW",
      "programStage": "ZzYYXq4fJie",
      "scheduledAt": "2019-08-19T13:59:13.688",
      "status": "ACTIVE",
      "trackedEntity": "Kj6vYde4LHh"
    }
  ],
  "relationships": [
    {
      "from": {
        "trackedEntity": {
          "trackedEntity": "Kj6vYde4LHh"
        }
      },
      "relationshipType": "dDrh5UyCyvQ",
      "to": {
        "trackedEntity": {
          "trackedEntity": "Gjaiu3ea38E"
        }
      }
    }
  ]
}

Nested payload

Nested payloads are the most commonly used structure, where tracker objects are embedded within their parent objects, such as an enrollment within a tracked entity. The advantage of this structure is that the client does not need to provide UIDs for these references, as this is handled automatically.

Note

Although nested payloads can be easier for clients to manage, the payload will always be flattened before the import. For large imports, using a flat structured payload offers more control and reduces overhead during the import process. However, you cannot nest new tracked entities, enrollments or events within a relationship.

{
  "trackedEntities": [
    {
      "enrollments": [
        {
          "attributes": [
            {
              "attribute": "zDhUuAYrxNC",
              "displayName": "Last name",
              "value": "Kelly"
            },
            {
              "attribute": "w75KJ2mc4zz",
              "displayName": "First name",
              "value": "John"
            }
          ],
          "enrolledAt": "2019-08-19T00:00:00.000",
          "events": [
            {
              "attributeCategoryOptions": "xYerKDKCefk",
              "attributeOptionCombo": "HllvX50cXC0",
              "dataValues": [
                {
                  "dataElement": "bx6fsa0t90x",
                  "value": "true"
                },
                {
                  "dataElement": "UXz7xuGCEhU",
                  "value": "5.7"
                }
              ],
              "enrollmentStatus": "ACTIVE",
              "notes": [
                {
                  "value": "need to follow up"
                }
              ],
              "occurredAt": "2019-08-01T00:00:00.000",
              "orgUnit": "y77LiPqLMoq",
              "program": "IpHINAT79UW",
              "programStage": "A03MvHHogjR",
              "scheduledAt": "2019-08-19T13:59:13.688",
              "status": "ACTIVE"
            }
          ],
          "occurredAt": "2019-08-19T00:00:00.000",
          "orgUnit": "y77LiPqLMoq",
          "program": "IpHINAT79UW",
          "status": "ACTIVE",
          "trackedEntityType": "nEenWmSyUEp"
        }
      ],
      "orgUnit": "y77LiPqLMoq",
      "trackedEntityType": "nEenWmSyUEp"
    }
  ]
}

Créer

Make a POST request to /api/tracker with the importStrategy set to CREATE or CREATE_AND_UPDATE and a payload as described here.

Mettre à jour

Make a POST request to /api/tracker with the importStrategy set to UPDATE or CREATE_AND_UPDATE and a payload as described here.

The payload must include all fields of the object you are updating, even if they have not been modified. The only exception is collections. Items in a collection that should not be changed can be omitted, as demonstrated in update attribute values and update data values.

Note

Deleted tracker objects and relationships cannot be updated.

Update attribute values

The following updates one of the attribute values of a tracked entity.

POST /api/tracker?async=false
{
  "trackedEntities": [
    {
      "trackedEntity": "PQfMcpmXeFE",
      "trackedEntityType": "nEenWmSyUEp",
      "orgUnit": "DiszpKrYNg8",
      "attributes": [
        {
          "attribute": "w75KJ2mc4zz",
          "code": "MMD_PER_NAM",
          "displayName": "First name",
          "createdAt": "2016-08-03T23:49:43.308",
          "updatedAt": "2016-08-03T23:49:43.308",
          "valueType": "TEXT",
          "value": "Johnny"
        }
      ]
    }
  ]
}

Note that it is not necessary to specify the tracked entity's enrollments. However, you must specify the non-collection fields of the tracked entity, even if you are not changing them.

Delete attribute values

The following deletes one of the attribute values of a tracked entity:

POST /api/tracker?async=false
{
  "trackedEntities": [
    {
      "trackedEntity": "PQfMcpmXeFE",
      "trackedEntityType": "nEenWmSyUEp",
      "orgUnit": "DiszpKrYNg8",
      "attributes": [
        {
          "attribute": "w75KJ2mc4zz",
          "value": null
        }
      ]
    }
  ]
}

Update data values

The following updates one of the data values of an event:

POST /api/tracker?async=false
{
  "events": [
    {
      "event": "ZwwuwNp6gVd",
      "dataValues": [
        {
          "dataElement": "bx6fsa0t90x",
          "value": "true"
        }
      ],
      "attributeOptionCombo": "HllvX50cXC0",
      "attributeCategoryOptions": "xYerKDKCefk",
      "enrollment": "MNWZ6hnuhSw",
      "enrollmentStatus": "ACTIVE",
      "occurredAt": "2019-08-01T00:00:00.000",
      "orgUnit": "y77LiPqLMoq",
      "program": "IpHINAT79UW",
      "programStage": "A03MvHHogjR",
      "scheduledAt": "2019-08-19T13:59:13.688",
      "status": "ACTIVE",
      "trackedEntity": "Kj6vYde4LHh"
    }
  ]
}

Delete data values

The following deletes one of the data values of an event:

POST /api/tracker?async=false
{
  "events": [
    {
      "event": "ZwwuwNp6gVd",
      "dataValues": [
        {
          "dataElement": "bx6fsa0t90x",
          "value": null
        }
      ],
      "attributeOptionCombo": "HllvX50cXC0",
      "attributeCategoryOptions": "xYerKDKCefk",
      "enrollment": "MNWZ6hnuhSw",
      "enrollmentStatus": "ACTIVE",
      "occurredAt": "2019-08-01T00:00:00.000",
      "orgUnit": "y77LiPqLMoq",
      "program": "IpHINAT79UW",
      "programStage": "A03MvHHogjR",
      "scheduledAt": "2019-08-19T13:59:13.688",
      "status": "ACTIVE",
      "trackedEntity": "Kj6vYde4LHh"
    }
  ]
}

Supprimer

Make a POST to /api/tracker with importStrategy set to DELETE. The payload should include only the UIDs of the trackedEntities, enrollments, events or relationships you wish to delete.

The following deletes the events created with this payload:

POST /api/tracker?async=false&importStrategy=DELETE
{
  "events": [
    {
      "event": "ZwwuwNp6gVd",
    },
    {
      "event": "XwwuwNp6gVE",
    }
  ]
}

The following deletes the tracked entities and all its child tracker objects which are enrollments, events and relationships:

POST /api/tracker?async=false&importStrategy=DELETE
{
  "trackedEntities": [
    {
      "trackedEntity": "Kj6vYde4LHh",
    },
    {
      "trackedEntity": "Gjaiu3ea38E",
    }
  ]
}

All the children of a tracker object will be deleted if the user making the request has the authorities F_TEI_CASCADE_DELETE and F_ENROLLMENT_CASCADE_DELETE. Relationships linked to an entity are always deleted, without the need of any authority.

CSV import

To import events using CSV make a POST request with CSV body file and the Content-Type set to application/csv or text/csv.

Événements

Every row of the CSV payload represents an event and a data value. So, for events with multiple data values, the CSV file will have x rows per event, where x is the number of data values in that event.

CSV payload example

Votre fichier CSV peut se présenter comme suit :

event,status,program,programStage,enrollment,orgUnit,occurredAt,scheduledAt,geometry,latitude,longitude,followUp,deleted,createdAt,createdAtClient,updatedAt,updatedAtClient,completedBy,completedAt,updatedBy,attributeOptionCombo,attributeCategoryOptions,assignedUser,dataElement,value,providedElsewhere,storedByDataValue,updatedAtDataValue,createdAtDataValue
A7rzcnZTe2T,ACTIVE,eBAyeGv0exc,Zj7UnCAulEk,RiLEKhWHlxZ,DwpbWkiqjMy,2023-02-12T23:00:00Z,2023-02-12T23:00:00Z,"POINT (-11.468912037323042 7.515913998868316)",7.515913998868316,-11.468912037323042,false,false,2017-09-08T19:40:22Z,,2017-09-08T19:40:22Z,,,,,HllvX50cXC0,xYerKDKCefk,,F3ogKBuviRA,"[-11.4880220438585,7.50978830548003]",false,,2016-12-06T17:22:34.438Z,2016-12-06T17:22:34.438Z

Voir Événements CSV dans la section relative à l'exportation pour une définition plus détaillée des champs CSV.

Import summary

L'API du Tracker dispose de deux endpoints de base qui permettent aux consommateurs d'obtenir des commentaires sur leurs importations. Ces endpoints concernent plus les tâches d'importation asynchrone, mais ils sont également disponibles pour les importations synchrones. Ces endpoints renverront soit le journal de l'importation, soit le récapitulatif de l'importation lui-même.

Remarque

Ces endpoints s'appuient sur des informations stockées dans la mémoire de l'application. Cela signifie que les informations seront indisponibles après certaines situations, telle qu'un redémarrage de l'application ou après un grand nombre de requêtes d'importation qui commencent après celle-ci.

Après avoir soumis une requête d'importation Tracker, nous pouvons accéder aux endpoints suivants afin de surveiller la progression de la tâche en fonction des journaux:

GET /tracker/jobs/{uid}
Paramètre de requête Description Exemple
uid The UID of a tracker import job eAjkbUGBcZ5

Request example

GET /tracker/jobs/PQK63sMwjQp

Response example

[
  {
    "uid": "PQK63sMwjQp",
    "level": "INFO",
    "category": "TRACKER_IMPORT_JOB",
    "time": "2024-03-19T13:18:16.370",
    "message": "Import complete with status OK, 0 created, 0 updated, 0 deleted, 0 ignored",
    "completed": true,
    "id": "PQK63sMwjQp"
  },
  {
    "uid": "XIfTJ1UUNcd",
    "level": "INFO",
    "category": "TRACKER_IMPORT_JOB",
    "time": "2024-03-19T13:18:16.369",
    "message": "PostCommit",
    "completed": false,
    "id": "XIfTJ1UUNcd"
  },
  {
    "uid": "uCG4FNJLLBJ",
    "level": "INFO",
    "category": "TRACKER_IMPORT_JOB",
    "time": "2024-03-19T13:18:16.364",
    "message": "Commit Transaction",
    "completed": false,
    "id": "uCG4FNJLLBJ"
  },
  {
    "uid": "xfOUv2Lk2MC",
    "level": "INFO",
    "category": "TRACKER_IMPORT_JOB",
    "time": "2024-03-19T13:18:16.361",
    "message": "Running Rule Engine Validation",
    "completed": false,
    "id": "xfOUv2Lk2MC"
  },
  {
    "uid": "cSPfA776obb",
    "level": "INFO",
    "category": "TRACKER_IMPORT_JOB",
    "time": "2024-03-19T13:18:16.325",
    "message": "Running Rule Engine",
    "completed": false,
    "id": "cSPfA776obb"
  },
  {
    "uid": "t9gOjotekQt",
    "level": "INFO",
    "category": "TRACKER_IMPORT_JOB",
    "time": "2024-03-19T13:18:15.837",
    "message": "Tracker import started",
    "completed": false,
    "dataType": "PARAMETERS",
    "data": {
      "userId": "xE7jOejl9FI",
      "importMode": "VALIDATE",
      "idSchemes": {
        "dataElementIdScheme": {
          "idScheme": "UID",
          "attributeUid": null
        },
        "orgUnitIdScheme": {
          "idScheme": "UID",
          "attributeUid": null
        },
        "programIdScheme": {
          "idScheme": "UID",
          "attributeUid": null
        },
        "programStageIdScheme": {
          "idScheme": "UID",
          "attributeUid": null
        },
        "idScheme": {
          "idScheme": "UID",
          "attributeUid": null
        },
        "categoryOptionComboIdScheme": {
          "idScheme": "UID",
          "attributeUid": null
        },
        "categoryOptionIdScheme": {
          "idScheme": "UID",
          "attributeUid": null
        }
      },
      "importStrategy": "CREATE_AND_UPDATE",
      "atomicMode": "ALL",
      "flushMode": "AUTO",
      "validationMode": "FULL",
      "skipPatternValidation": false,
      "skipSideEffects": false,
      "skipRuleEngine": false,
      "filename": null,
      "reportMode": "ERRORS"
    },
    "id": "t9gOjotekQt"
  }
]

De plus, le endpoint suivant renverra le récapitulatif de la tâche d’importation. Ce récapitulatif ne sera disponible qu'une fois l'importation terminée:

GET /tracker/jobs/{uid}/report
Paramètre de requête Description Exemple
path /{uid} ID of an existing tracker import job. ABCDEF12345
Mode de rapport Level of detail for the report. COMPLET, ERREURS, AVERTISSEMENTS

Request example

GET /tracker/jobs/mEfEaFSCKCC/report

Response example

La charge de la réponse est la même que celle renvoyée après une requête d'importation synchrone.

Remarque

Les deux endpoints sont principalement utilisés pour l'importation asynchrone. Cependant, GET /tracker/jobs/{uid} devrait également fonctionner pour les requêtes synchrones car au final il utilise le même processus d'importation et la même journalisation que les requêtes asynchrones.

Import summary response

La structure globale des récapitulatifs d'importation se présente comme suit, en fonction du mode de rapport faisant l'objet de la requête :

{
  "status": "OK",
  "validationReport": {
    "errorReports": [],
    "warningReports": []
  },
  "stats": {
    "created": 3,
    "updated": 0,
    "deleted": 0,
    "ignored": 0,
    "total": 3
  },
  "bundleReport": {
    "typeReportMap": {
      "EVENT": {
        "trackerType": "EVENT",
        "stats": {
          "created": 1,
          "updated": 0,
          "deleted": 0,
          "ignored": 0,
          "total": 1
        },
        "objectReports": [
          {
            "trackerType": "EVENT",
            "uid": "gTZBPT3Jq39",
            "errorReports": []
          }
        ]
      },
      "ENROLLMENT": {
        "trackerType": "ENROLLMENT",
        "stats": {
          "created": 1,
          "updated": 0,
          "deleted": 0,
          "ignored": 0,
          "total": 1
        },
        "objectReports": [
          {
            "trackerType": "ENROLLMENT",
            "uid": "ffcvJvWjiNZ",
            "errorReports": []
          }
        ]
      },
      "RELATIONSHIP": {
        "trackerType": "RELATIONSHIP",
        "stats": {
          "created": 0,
          "updated": 0,
          "deleted": 0,
          "ignored": 0,
          "total": 0
        },
        "objectReports": []
      },
      "TRACKED_ENTITY": {
        "trackerType": "TRACKED_ENTITY",
        "stats": {
          "created": 1,
          "updated": 0,
          "deleted": 0,
          "ignored": 0,
          "total": 1
        },
        "objectReports": [
          {
            "trackerType": "TRACKED_ENTITY",
            "uid": "aVcGf9iO8Xp",
            "errorReports": []
          }
        ]
      }
    }
  }
}

Statut

La propriété statut du récapitulatif d'importation indique l'état global de l'importation. Si aucune erreur ou avertissement n'est signalé(e) lors de l'importation, le statut est OK. Par contre, si une erreur ou un avertissement est signalé(e) lors de l'importation, le statut devient ERREUR ou AVERTISSEMENT.

Le statut dépend de la présence du Rapport de validation le plus important. ERREUR est le plus important, suivi de AVERTISSEMENT et enfin OK. Cela signifie que le statut est ERREUR si une seule erreur est détectée lors de l'importation, quel que soit le nombre d'avertissements.

Remarque

Si l'importation est faite selon le mode atomique "OBJET", où les données sont importées sans erreurs de validation, le statut sera toujours ERREUR si des erreurs sont détectées.

Validation report

Le Rapport de validation peut inclure des Rapports d'erreur et des Rapports d'avertissement si des erreurs ou des avertissements étaient présents lors de l'importation. Lorsqu'ils sont présents, ils fournissent une liste détaillée des erreurs ou avertissements rencontrés.

Prenons l'exemple d'une erreur de validation lors de l'importation d'une ENTIÉE_SUIVIE :

{
  "validationReport": {
    "errorReports": [
      {
        "message": "Could not find TrackedEntityType: `Q9GufDoplCL`.",
        "errorCode": "E1005",
        "trackerType": "TRACKED_ENTITY",
        "uid": "Kj6vYde4LHh"
      }
    ],
    "warningReports": [
    ]
  }
}

The report contains a message and a code describing the actual error (See the error codes section for more information about errors). Additionally, the report includes the trackerType and uid, which aims to describe where in the data the error was found. In this case, there was a TRACKED_ENTITY with the uid Kj6vYde4LHh, which had a reference to a tracked entity type that was not found.

Remarque

Les uid des objets trackers servent de noms à ces objets dans la charge. Par exemple, l'uid d'une entité suivie dans la charge serait "trackedEntity". La même chose s'applique aux inscriptions, aux événements et aux relations qui portent respectivement les noms "enrollment", "event" et "relationship".

Si aucun uid n'est fourni dans la charge, le processus d'importation générera de nouveaux uids. Cela signifie que le rapport d'erreur peut faire référence à un uid qui n'existe pas dans votre charge.

Les erreurs signalent des problèmes avec la charge que l'importateur ne peut pas contourner. Toute erreur empêchera l'importation de ces données. Les avertissements, en revanche, sont des problèmes qui peuvent être contournés en toute sécurité, mais dont l'utilisateur doit être informé. Les avertissements ne bloquent pas l'importation des données.

Statistics

The stats object provides an overview of the import operation. After an import is completed, these will be the actual counts displaying how many objects were created, updated, deleted and ignored.

Exemple de réponse :

{
  "stats": {
    "created": 2,
    "updated": 2,
    "deleted": 1,
    "ignored": 5,
    "total": 10
  }
}

The created field refers to how many new objects were created. In general, objects without an existing uid in the payload will be treated as new objects.

The updated field refers to the number of objects updated. If an object has a uid set in the payload, it will be treated as an update as long as that same uid exists in the database.

The deleted field refers to the number of objects deleted during the import. Deletion only happens when the import is configured to delete data and only then when the objects in the payload have existing uids set.

The ignored field refers to objects that were not persisted. Objects can be ignored for several reasons, for example trying to create something that already exists. Ignores should always be safe, so if something was ignored, it was not necessary, or it was due to the configuration of the import.

Bundle report

Une fois l'importation terminée, le bundleReport contient tous les objets tracker importés.

An example for TRACKED_ENTITY:

{
  "bundleReport": {
    "typeReportMap": {
      "TRACKED_ENTITY": {
        "trackerType": "TRACKED_ENTITY",
        "stats": {
          "created": 1,
          "updated": 0,
          "deleted": 0,
          "ignored": 0,
          "total": 1
        },
        "objectReports": [
          {
            "trackerType": "TRACKED_ENTITY",
            "uid": "aVcGf9iO8Xp",
            "errorReports": []
          }
        ]
      }
    }
  }
}

Each type of tracker object will be reported, and each has its own stats and objectReports. These objectReports will provide details about each imported object, like their type, their uid, and any error or warning reports if applicable.

Message

Si l'importation se termine brusquement, le message va contenir des informations supplémentaires sur ce qui s'est passé.

Import summary report level

A import summary report can be retrieved using a specific reportMode parameter in a GET /tracker/jobs/{uid}/report request. By default the endpoint will return an importSummary with reportMode ERROR.

Valeur Description
FULL Renvoie tout à partir de AVERTISSEMENTS, en plus des timingsStats
WARNINGS Renvoie tout à partir de ERREURS, en plus de warningReports (rapports d'avertissements) dans validationReports (rapports de validation)
ERRORS (default) Renvoie uniquement errorReports (rapports d'erreurs) dans validationReports

De plus, tous les reportModes (modes de rapports) renverront statut, statistiques, bundleReport et message le cas échéant.

Error codes

There are various error codes for different error scenarios. The following table has the list of error codes thrown from the Tracker API, along with the error messages and some additional descriptions. The placeholders in the error messages ({0},{1},{2}..) are usually uids unless otherwise specified.

Code d'erreur Message d'erreur Description
E1000 User: {0}, has no capture scope access to OrganisationUnit: {1}.
E1001 L'utilisateur : {0} n'a pas d'accès en écriture de données sur le Type d'entité suivie : {1}. The error occurs when the user is not authorized to create or modify data of the TrackedEntityType {1}
E1002 L'entité suivie {0} existe déjà. Cette erreur se produit lorsque l'on essaie de créer une nouvelle entité suivie avec un uid déjà existant. Veillez à utiliser un nouvel uid lors de l'ajout d'une nouvelle entité suivie.
E1005 Impossible de trouver le Type d'entité suivie : {0}. L'erreur se produit lorsque l'on essaie de récupérer un Type d'entité suivie qui n'existe pas avec l'uid {0}. Cela peut également signifier que l'utilisateur n'a pas d'accès en lecture à ce Type d'entité suivie.
E1006 L'attribut : {0} n'existe pas. L'erreur se produit lorsque le système n'a pas pu trouver un attribut d'entité suivie correspondant avec l'uid {0}. Cela peut également signifier que l'utilisateur n'a pas accès à l'attribut d'entité suivie.
E1007 Erreur de validation du type de valeur d'attribut : {0} ; Erreur : {1}. Incompatibilité entre le type de valeur d'un attribut d'entité suivie et la valeur d'attribut qui lui est fournie. L'erreur de validation réelle sera affichée dans {1}.
E1008 L'étape de programme {0} n'a pas de référence à un programme. Vérifiez la configuration de l'étape du programme
E1009 La ressource de fichier : {0} a déjà été attribuée à un autre objet. L'uid de ressource de fichier {0} est déjà attribué à un autre objet du système.
E1010 Impossible de trouver le programme : {0} lié à l'événement. Le système n'a pas pu trouver un programme avec l'uid {0} spécifié dans la charge utile de l'événement. Cela peut également signifier que l'utilisateur connecté n'a pas accès à ce programme.
E1011 Impossible de trouver l'unité d'organisation : {0} lié à l'événement. Le système n'a pas pu trouver une unité d'organisation avec l'uid {0} spécifié dans la charge utile de l'événement.
E1012 La géométrie n'est pas conforme au FeatureType (type de fonctionnalité) : {0}. Le type de fonctionnalité fourni est soit NONE (aucun), soit incompatible avec la valeur géométrique fournie.
E1013 Impossible de trouver le ProgramStage (étape de programme) : {0} lié à l'événement. Le système n'a pas pu trouver une étape de programme avec l'uid {0} spécifié dans la charge utile de l'événement. Cela peut également signifier que l'utilisateur connecté n'a pas accès à l'étape de programme.
E1014 Un programme identifié {0} est un programme sans enregistrement. Aucune inscription ne peut être créée dans un programme sans enregistrement. Les inscriptions ne peuvent être créées que pour les programmes avec des enregistrements.
E1015 L'entité suivie : {0} a déjà une inscription active dans le programme {1}. Il est impossible de s'inscrire à un programme si une autre inscription active existe déjà pour le programme. L’inscription active devra au moins être terminée au préalable.
E1016 L'entité suivie : {0} a déjà une inscription active dans le programme: {1}, et ce programme n'autorise qu'une seule inscription . Conformément à la configuration du programme {1}, une entité suivie ne peut être inscrite qu'une seule fois à ce programme. Il semble que l'entité suivie {0} ait déjà une inscription ACTIVE ou TERMINÉE dans ce programme. Une autre inscription ne peut donc pas être ajoutée.
E1018 L'attribut : {0} est obligatoire dans le programme {1} mais il n'est pas déclaré dans l'inscription {2}. La valeur de l'attribut est manquante dans la charge utile, pour un attribut défini comme obligatoire pour un programme. Assurez-vous que les valeurs des attributs obligatoires sont fournies dans la charge utile.
E1019 Only Program attributes are allowed for enrollment; invalid attribute: {0}. L'uid d'attribut {0} spécifié dans la charge utile d'inscription n'est pas associé au programme.
E1020 Enrollment date: {0}, cannot be a future date. Il est impossible de créer une inscription à une date ultérieure à moins que le Programme ne le permette dans sa configuration.
E1021 Incident date: {0}, cannot be a future date. La date d'incidence ne peut pas être une date ultérieure à moins que le Programme ne le permette dans sa configuration.
E1022 L'entité suivie {0} doit avoir le même type d'entité suivie que le programme {1}. Le programme est configuré pour accepter un UID de type d'entité suivie différent de celui fourni dans la charge utile d’inscription.
E1023 DisplayIncidentDate is true but property occurredAt is null. Program is configured with DisplayIncidentDate but it is null in the payload.
E1025 Property enrolledAt is null. EnrolledAt Date is mandatory for an Enrollment. Make sure it is not null.
E1029 L'unité d'organisation Évènement identifiée {0} et le Programme {1} ne correspondent pas. La charge utile de l'événement utilise un programme {1} qui n'est pas configuré pour être accessible par l'unité d'organisation {0}.
E1030 L'Événement {0} existe déjà. Cette erreur se produit lorsque l'on essaie d'ajouter un nouvel événement avec un uid déjà existant. Veillez à utiliser un nouvel uid lors de l'ajout d'un nouvel événement.
E1031 Event occurredAt date is missing. OccurredAt property is either null or has an invalid date format in the payload.
E1032 Event: {0} does not exist.
E1033 La valeur d'inscription de l'Événement {0} est NULLE.
E1039 L'Étape de programme {0} n'est pas répétable et un événement existe déjà. Un événement existe déjà pour l'étape de programme de l’inscription. Étant donné que l'étape de programme est configuré pour être non répétable, un autre événement ne peut pas être ajouté pour la même étape de programme.
E1041 L'unité d'organisation Inscription {0} et le Programme {1} ne correspondent pas. La charge utile de l'inscription contient un programme {1} qui n'est pas configuré pour être accessible par l'unité d'organisation {0}.
E1043 La date de fin de l'événement : {0}, a expiré ; il n'est donc plus possible d'apporter des modifications à cet événement. Un utilisateur qui ne dispose pas de l'autorité 'F_EDIT_EXPIRED' ne peut pas mettre à jour un événement dont les jours d'expiration, tels que configurés dans son programme, sont dépassés.
E1046 L'Événement : {0}, doit avoir au moins une date (d'événement ou de programmation). Either of occurredAt or scheduledAt property should be present in the Event payload.
E1047 La date de l'événement : {0}, appartient à une période expirée. Un tel événement ne peut être créé. Event occurredAt or scheduledAt has a value that is earlier than the PeriodType start date.
E1049 Impossible de trouver l'unité d'organisation : {0} lié à l'entité suivie. Le système n'a pas trouvé une Unité d'Organisation avec l'uid {0}.
E1050 La date à laquelle l'événement est programmé (ScheduledAt) est manquante. La propriété "ScheduledAt" dans la charge utile de l'événement est soit manquante, soit son format de date est invalide.
E1051 Event: {0}, completedAt must be null when status is {1}. Event completedAt can only be passed in the payload if status is COMPLETED
E1052 Enrollment: {0}, completedAt must be null when status is {1}. Enrollment completedAt can only be passed in the payload if status is COMPLETED
E1054 La combinaison d'options d'attributs {0} n'est pas dans la combinaison de catégories de programmes d'événements {1}.
E1055 La combinaison d'options d'attribut (AttributeOptionCombo) par défaut n'est pas autorisée car le programme ne dispose pas d'une combinaison de catégories (CategoryCombo) par défaut. Le programme est configuré pour contenir une combinaison de catégories différente de celle par défaut, mais la requête utilise la combinaison d'options d'attribut par défaut.
E1056 La date d'événement : {0}, est antérieure à la date de début : {1}, pour l'option d'attribut (AttributeOption) : {2}. L'option de catégorie a une date de début configurée ; la date de l'événement dans la charge utile ne peut pas être antérieure à cette date de début.
E1057 La date d'événement : {0}, est postérieure à la date de fin : {1}, pour l'option d'attribut (AttributeOption) : {2}. L'option de catégorie a une date de fin configurée ; la date de l'événement dans la charge utile ne peut pas être postérieure à cette date de fin.
E1063 L'entité suivie {0} n'existe pas. L'erreur se produit lorsque l'on essaie de récupérer une Entité suivie qui n'existe pas avec l'uid {0}. Cela peut également signifier que l'utilisateur n'a pas d'accès en lecture à cette Entité suivie.
E1064 Valeur d'attribut non unique {0} pour l'attribut {1} La valeur de l'attribut doit être unique dans le champ d'application défini. L'erreur indique que la valeur de l'attribut existe déjà pour une autre Entité suivie.
E1068 Impossible de trouver l'entité suivie : {0}, lié à l'inscription. Le système n'a pas pu trouver l'entité suivie spécifiée dans la charge utile d'inscription. Cela peut également signifier que l'utilisateur n'a pas d'accès en lecture à cette entité suivie.
E1069 Impossible de trouver le programme : {0} lié à l'inscription. Le système n'a pas pu trouver le programme spécifié dans la charge utile d'inscription. Cela peut également signifier que l'utilisateur n'a pas d'accès en lecture à ce programme.
E1070 Impossible de trouver l'unité d'organisation : {0} lié à l'inscription. Le système n'a pas pu trouver l'unité d'organisation spécifiée dans la charge utile d'inscription.
E1074 FeatureType (Type de fonctionnalité) est manquant.
E1075 L'attribut : {0}, n'a pas d'uid.
E1076 {0} {1} est obligatoire et ne peut pas être nul
E1077 La valeur du texte de l'attribut : {0}, dépasse la longueur maximale autorisée : {0}.
E1079 Événement : {0}, le programme : {1} est différent du programme défini dans l'inscription {2}.
E1080 L'Inscription {0} existe déjà. This error is thrown when trying to create a new Enrollment with an already existing uid. Make sure a new uid is used when adding a new Enrollment.
E1081 L'Inscription {0} n'existe pas. L'erreur se produit lorsque l'on essaie de récupérer une Inscription qui n'existe pas avec l'uid {0}. Cela peut également signifier que l'utilisateur n'a pas d'accès en lecture à cette Inscription.
E1082 L'Événement : {0}, est déjà supprimé et ne peut donc plus être modifié. Si l’événement est supprimé de façon réversible (soft delete), aucune modification n’est autorisée sur cet événement.
E1083 L'Utilisateur : {0}, n'est pas autorisé à modifier les événements terminés. Seul un super utilisateur ou un utilisateur disposant de l'autorité "F_UNCOMPLETE_EVENT" peut modifier les événements terminés. Les événements terminés sont les événements dont le statut est "TERMINÉ".
E1089 L'Événement : {0}, fait référence à une Étape de programme {1} qui n'appartient pas au Programme {2}. L’uid de l'Étape de programme et l’uid de Programme présent dans la charge utile de l’Événement sont incompatibles.
E1090 L'attribut : {0} est obligatoire dans le type d'entité suivie {1} mais il n'est pas déclaré dans l'entité suivie {2}. Des valeurs manquent dans la charge utile pour les attributs de type d'entité suivie obligatoires.
E1091 L'utilisateur : {0} n'a pas d'accès en écriture de données sur le Programme : {1}. La configuration du partage du Programme est telle que l'utilisateur n'a pas d'accès en écriture pour ce programme.
E1095 L'utilisateur : {0} n'a pas d'accès en écriture de données sur l'Étape de programme : {1}. La configuration du partage de l'Étape de programme est telle que l'utilisateur n'a pas d'accès en écriture pour cette Étape de programme.
E1096 L'utilisateur : {0} n'a pas d'accès en lecture de données sur le Programme : {1}. La configuration du partage du Programme est telle que l'utilisateur n'a pas d'accès en lecture pour ce programme.
E1097 User: {0}, has no data read access to ProgramStage: {1}. The ProgramStage sharing configuration is such that, the user does not have read access for this ProgramStage.
E1098 User: {0}, has no read access to CategoryOption: {1}. The CategoryOption sharing configuration is such that, the user does not have read access for this CategoryOption.
E1099 L'utilisateur : {0} n'a pas d'accès en écriture sur l'Option de catégorie : {1}. La configuration du partage de l'Option de catégorie est telle que l'utilisateur n'a pas d'accès en écriture pour cette Option de catégorie.
E1100 L'Utilisateur: {0}, ne dispose pas de l'autorité 'F_TEI_CASCADE_DELETE' pour supprimer l'entité suivie : {1}. Certaines Inscriptions n'ont pas été supprimées pour cette Entité suivie. Si l'utilisateur ne dispose pas de l'autorité "F_TEI_CASCADE_DELETE", ces inscriptions devront d'abord être supprimées explicitement avant qu'il puisse supprimer l'Entité suivie.
E1102 L'Utilisateur : {0}, n'a pas accès à la combinaison de l'Entité suivie : {1} et du Programme : {2}. Cette erreur se produit lorsque l'unité d'organisation de l'utilisateur ne possède pas cette entité suivie, pour ce programme spécifique. L'unité d'organisation propriétaire de la combinaison Entité Suivie-Programme (TrackedEntity-Program) doit se trouver dans le champ de saisie (dans certains cas, dans le champ de recherche) de l'utilisateur.
E1103 L'Utilisateur : {0}, ne dispose pas de l'autorité 'F_ENROLLMENT_CASCADE_DELETE' pour supprimer l'Inscription : {1}. Certains Événements n'ont pas été supprimées pour cette Inscription. Si l'utilisateur ne dispose pas de l'autorité 'F_ENROLLMENT_CASCADE_DELETE', ces Événements devront d'abord être supprimées explicitement avant qu'il puisse supprimer l'Inscription.
E1104 L'utilisateur : {0} n'a pas d'accès en lecture de données sur le programme : {1} et le type d'entité suivie : {2}. La configuration du partage du Type d'entité suivie associé au Programme est telle que l'utilisateur n'a pas d'accès en lecture de données pour ce type d'entité suivie.
E1105 User: {0}, has no search scope access to OrganisationUnit: {1}.
E1113 L'Inscription : {0}, est déjà supprimée et ne peut donc plus être modifiée. Si l'inscription est supprimée de façon réversible, aucune modification n’est autorisée sur cette inscription.
E1114 L'Entité suivie : {0}, est déjà supprimée et ne peut donc plus être modifiée. Si l'entité suivie est supprimée de façon réversible, aucune modification n’est autorisée sur cette entité suivie.
E1115 Impossible de trouver la Combinaison d'options de catégorie : {0}.
E1116 Impossible de trouver la l'Option de catégorie : {0}. Cela peut également signifier que l'utilisateur n'a pas accès à cette option de catégorie.
E1117 La Combinaison d'options de catégorie n'existe pas pour la combinaison de catégories et les options de catégorie fournies : {0}.
E1118 L'utilisateur assigné {0} n'est pas un uid valide.
E1119 A Note with uid {0} already exists.
E1120 L'Étape de programme {0} n'autorise pas l'assignation d'utilisateurs La charge utile d'événement a attribué un identifiant d'utilisateur (uid) mais l'étape de programme n’est pas configurée pour autoriser l'assignation d’utilisateurs.
E1121 La propriété d'entité suivie requise est manquante : {0}.
E1122 La propriété d'inscription requise est manquante : {0}.
E1123 La propriété d'événement requise est manquante : {0}.
E1124 La propriété de relation requise est manquante : {0}.
E1125 La valeur {0} n'est pas un code d'option valide dans l'ensemble d'options {1}
E1126 Not allowed to update Tracked Entity property: {0}.
E1127 Not allowed to update Enrollment property: {0}.
E1128 Not allowed to update Event property: {0}.
E1129 CategoryOptionCombo not found for CategoryCombo {0}.
E1130 AttributeOptionCombo {0} is not in the program enrollment CategoryCombo {1}.
E1131 User: {0} has no data read access to TrackedEntityType: {1}.
E1300 Généré par la règle de programme ({0}) - {1}
E1301 Généré par la règle de programme ({0}) - L'élément de données obligatoire {1} n'est pas présent
E1302 DataElement {0} is not valid: {1}
E1303 Mandatory DataElement {0} is not present
E1304 DataElement {0} is not a valid data element
E1305 DataElement {0} is not part of {1} program stage
E1306 Généré par la règle de programme ({0}) - L'attribut obligatoire {1} n'est pas présent
E1307 Généré par la règle de programme ({0}) - Impossible d'attribuer une valeur à l'élément de données {1}. La valeur fournie doit être vide ou correspondre à la valeur calculée {2}
E1308 Généré par la règle de programme ({0}) - L'élément de données {1} est remplacé dans l'événement {2}
E1309 Généré par la règle de programme ({0}) - Impossible d'attribuer une valeur à l'attribut {1}. La valeur fournie doit être vide ou correspondre à la valeur calculée {2}
E1310 Generated by program rule ({0}) - Attribute {1} is being replaced in te {2}
E1313 Event {0} of an enrollment does not reference a TrackedEntity. The data in your system might be corrupted Il s'agit d'une anomalie dans les données existantes, où les inscriptions peuvent ne pas faire référence à une entité suivie.
E1314 Generated by program rule ({0}) - DataElement {1} is mandatory and cannot be deleted.
E1315 Status {0} does not allow defining data values. Statuses that do allow defining data values are: {1}
E1316 No event can transition from status {0} to status {1}.
E1317 Generated by program rule ({0}) - Attribute {1} is mandatory and cannot be deleted.
E1318 Status {0} is not applicable for single events. The status used in the Event payload is not valid for a single event.
E1320 Generated by program rule ({0}) - Event ({1}) was automatically scheduled at {2}.
E1321 Generated by program rule ({0}) - User ({1}) does not have write access to ProgramStage {2}, where an event was auto-scheduled using SCHEDULEEVENT rule action.
E1322 Generated by program rule ({0}) - Event for programStage ({1}) and enrollment ({2}) already exists.
E1323 User: {0} has no write access to any program.
E1324 User {0} has no ownership access to any program for the provided TrackedEntity: {1}.
E1325 User: {0} has no read access to any program.
E4000 La relation : {0} ne peut pas être reliée à elle-même
E4001 Relationship Item {0} for Relationship {1} is invalid: an Item can link only one Tracker entity, Enrollment or Event.
E4006 Impossible de trouver le Type de relation : {0}.
E4010 La contrainte du type de relation {0} nécessite un {1} mais un {2} a été trouvé .
E4012 Impossible de trouver {0} : {1}, liés à la relation.
E4014 La contrainte du type de relation {0} nécessite une entité suivie de type {1} mais c'est un type {2} qui a été trouvé.
E4015 La relation {0} existe déjà.
E4016 Relationship: {0}, does not exist.
E4017 La relation: {0}, est déjà supprimé et ne peut donc plus être modifié.
E4018 La relation : {0}, liant {1} : {2} à {3} : {4} existe déjà.
E4019 User: {0} has no data read access to RelationshipType: {1}.
E4020 User: {0} has no data write access to RelationshipType: {1}.
E5000 "{0}" {1} ne peut pas être maintenu car "{2}" {3} référencé par lui ne peut pas être maintenu. L'importateur ne peut pas maintenir un objet tracker car une référence ne peut pas être maintenue.
E9999 N/A Message d'erreur non défini.

Validation

Lors de l'importation de données à l'aide de l'importateur du Tracker, une série de validations est effectuée pour garantir la validité des données. Cette section décrit certains types de validation effectués afin que vous puissiez mieux comprendre un échec de validation lors de votre importation.

Required properties

Each of the tracker objects has a few required properties that need to be present when importing data. For an exhaustive list of required properties, have a look at the tracker objects section.

Lors de la validation des propriétés requises, nous parlons généralement de références à d'autres données ou métadonnées. Dans ces cas, on note trois critères principaux :

  1. La référence est présente dans la charge utile et est non nulle.
  2. La référence indique le bon type de données et existe dans la base de données
  3. L'utilisateur est autorisé à voir la référence

Si la première condition n'est pas remplie, l'importation échouera et un message indiquant une référence manquante sera généré. Cependant, si la référence indique un objet qui n'existe pas ou auquel l'utilisateur n'a pas accès, le message généré indiquera que la référence n'a pas été trouvée.

Formats

Certaines propriétés des objets Tracker requièrent un format spécifique. Lors de l'importation des données, chacune de ces propriétés est validée au regard du format attendu et renvoie des erreurs en fonction de la propriété dont le format est incorrect. Voici quelques exemples de propriétés validées de cette manière :

  • Les identifiants d'utilisateur ou UID (Ils couvrent toutes les références à d’autres données ou métadonnées dans DHIS2.)
  • Dates
  • Géométrie (Les coordonnées doivent correspondre au format spécifié par son type)

User access

All data imported will be validated based on the metadata (sharing) and the organisation units (scopes) referenced in the data. You can find more information about sharing and organisation unit scopes in the following sections.

Sharing is validated at the same time as references are looked up in the database. Metadata outside of the user access scope will be treated as if it does not exist. The import will validate any metadata referenced in the data.

Organisation units, on the other hand, serve a dual purpose. It will primarily make sure that data can only be imported when imported for an organisation unit the user has within their capture scope. Secondly, organisation units are also used to restrict what programs are available. That means if you are trying to import data for an organisation unit that does not have access to the Program you are importing, the import will be invalid.

Les utilisateurs disposant de l'autorité TOUS ne sont pas affectés par les limites des champs d'application de partage et d'unité d'organisation lorsqu'ils importent des données. Cependant, ils ne peuvent pas importer d'inscriptions dans des unités d'organisation qui n'ont pas accès au programme d'inscription.

Attributes and data values

Les attributs et les valeurs de données font partie respectivement d'une entité suivie et d'un événement. Cependant, les attributs peuvent être liés à une entité suivie soit par son type (TrackedEntityType), soit par son programme (Program). Les attributs peuvent également être uniques.

La première validation effectuée lors de l'importation consiste à s'assurer que la valeur fournie pour un attribut ou un élément de données est conforme au type de valeur attendu. Par exemple, supposons que vous importiez une valeur pour un élément de données de type numérique. Dans ce cas, la valeur doit être numérique. Toute erreur liée à une non-concordance entre un type et une valeur se traduira par le même code d'erreur, mais avec un message spécifique lié au type de violation.

Mandatory attributes and data values are also checked on creation, on update mandatory attributes and data values are not required in the payload. Currently, removing mandatory attributes and data values is never allowed. Some use-cases require values to be sent separately, while others require all values to be sent as one. Programs can be configured to either validate mandatory attributes ON_COMPLETE or ON_UPDATE_AND_INSERT to accommodate these use-cases.

The import will validate unique attributes at the time of import. That means as long as the provided value is unique for the attribute in the whole system, it will pass. However, if the unique value is found to be used by any other tracked entity other than the one being imported, it will fail.

Configuration

Les dernières validations dans l'importateur sont des validations basées sur la configuration des métadonnées pertinentes par l'utilisateur. Pour plus d'informations sur chaque configuration, consultez les sections correspondantes. Trouvez ci-après quelques exemples de validations configurables :

  • Feature type (geometry)
  • Événements attribuables à l'utilisateur
  • Autoriser les dates futures
  • Inscrire une fois

Ces configurations apporteront des modifications supplémentaires à la manière dont la validation est effectuée lors de l'importation.

Generated tracked entity attributes

Tracked entity attributes that use automatic generation of unique values have three endpoints utilized by apps for generating and reserving these values.

Required values

A TextPattern may include variables that change based on different factors. Some of these factors are unknown to the server; thus, the values for these variables must be supplied when generating and reserving values.

This endpoint returns a map of required and optional values that the server will inject into the TextPattern when generating new values. Required variables must be supplied for generation, whereas optional variables should only be provided if necessary.

GET /api/trackedEntityAttributes/Gs1ICEQTPlG/requiredValues
{
  "REQUIRED": [
    "ORG_UNIT_CODE"
  ],
  "OPTIONAL": [
    "RANDOM"
  ]
}

Point d'extrémité de de génération de valeur

Online web apps and other clients can use this endpoint to generate a unique value for immediate use. The generated value is guaranteed to be unique at the time of generation and is reserved for 3 days. If your TextPattern includes required values, they can be passed as parameters.

To override the expiration time, add ?expiration=<number-of-days> to the request.

GET /api/trackedEntityAttributes/Gs1ICEQTPlG/generate?ORG_UNIT_CODE=OSLO
{
  "ownerObject": "TRACKEDENTITYATTRIBUTE",
  "ownerUid": "Gs1ICEQTPlG",
  "key": "RANDOM(X)-OSL",
  "value": "C-OSL",
  "created": "2018-03-02T12:01:36.680",
  "expiryDate": "2018-03-05T12:01:36.678"
}

Point d'extrémité de génération et de réservation de valeur

Offline clients can use this endpoint to reserve a number of unique IDs for later use when registering new tracked entities. The number of IDs to generate can be specified with the numberToReserve parameter (default is 1).

To override the default expiration time of 60 days, add ?expiration=<number-of-days> to the request.

GET /api/trackedEntityAttributes/Gs1ICEQTPlG/generateAndReserve?numberToReserve=3&ORG_UNIT_CODE=OSLO
[
  {
    "ownerObject": "TRACKEDENTITYATTRIBUTE",
    "ownerUid": "Gs1ICEQTPlG",
    "key": "RANDOM(X)-OSL",
    "value": "B-OSL",
    "created": "2018-03-02T13:22:35.175",
    "expiryDate": "2018-05-01T13:22:35.174"
  },
  {
    "ownerObject": "TRACKEDENTITYATTRIBUTE",
    "ownerUid": "Gs1ICEQTPlG",
    "key": "RANDOM(X)-OSL",
    "value": "Q-OSL",
    "created": "2018-03-02T13:22:35.175",
    "expiryDate": "2018-05-01T13:22:35.174"
  },
  {
    "ownerObject": "TRACKEDENTITYATTRIBUTE",
    "ownerUid": "Gs1ICEQTPlG",
    "key": "RANDOM(X)-OSL",
    "value": "S-OSL",
    "created": "2018-03-02T13:22:35.175",
    "expiryDate": "2018-05-01T13:22:35.174"
  }
]

Reserved values

Les valeurs réservées ne sont actuellement pas accessibles via l'API, mais elles sont renvoyées par les points d'extrémité generate (génération) et generate And Reserve (génération et réservation). Le tableau suivant explique les propriétés de l'objet de valeur réservée :

Tableau : Valeurs réservées

Propriété Description
ownerObject Le type de métadonnées référencé lors de la génération et de la réservation de la valeur. Actuellement, seul TRACKEDENTITYATTRIBUTE (attribut d'entité suivie) est pris en charge.
ownerUid L'uid de l'objet de métadonnées référencé lors de la génération et de la réservation de la valeur.
key Une valeur partiellement générée où les segments générés ne sont pas encore ajoutés.
value La valeur réservée. C'est la valeur que vous envoyez au serveur lorsque vous stockez des données.
created Date et heure à laquelle la réservation a été effectuée
expiryDate Date et heure à partir de laquelle la réservation ne sera plus valable.

Les réservations expirées sont supprimées quotidiennement. Si un modèle change, les valeurs déjà réservées seront acceptées lors du stockage des données, même si elles ne correspondent pas au nouveau modèle, tant que la réservation n'a pas expiré.

Program rules

Users can configure program rules, which adds conditional behavior to tracker forms. In addition to running these rules in the tracker apps, the tracker importer will also run a selection of these rules. Since the importer is also running these rules, we can ensure an additional level of validation.

Toutes les actions de règles de programme ne sont pas prises en charge, car elles ne sont adaptées qu'à une présentation de type « frontend ». Une liste complète des actions de règles de programme prises en charge est présentée ci-dessous.

Action de la règle du programme Pris en charge
DISPLAYTEXT
DISPLAYKEYVALUEPAIR
HIDEFIELD
HIDESECTION
ASSIGN X
SHOWWARNING X
SHOWERROR X
WARNINGONCOMPLETION X
ERRORONCOMPLETION X
CREATEEVENT
SETMANDATORYFIELD X
SENDMESSAGE X
SCHEDULEMESSAGE X

Program rules are evaluated in the importer in the same way they are evaluated in the tracker apps. To summarize, the following conditions are considered when enforcing the program rules:

  • La règle de programme doit être liée aux données importées ; par exemple, une étape de programme ou un élément de données.
  • The program rule condition must be evaluated to true.

Les résultats des règles de programme dépendent des actions définies dans ces règles :

  • Program rule actions may end in 2 different results: warnings or errors.
  • Les erreurs feront échouer la validation, tandis que les avertissements seront rapportés sous forme de message dans le récapitulatif de l'importation.
    • SHOWWARNING and WARNINGONCOMPLETION actions can generate only warnings.
    • SHOWERROR, ERRORONCOMPLETION, and SETMANDATORYFIELD actions can generate only errors.
    • ASSIGN action can generate both Warnings and Errors.
    • Lorsque l'action attribue une valeur à un attribut/élément de données vide, un avertissement est généré.
    • Lorsque l'action attribue une valeur à un attribut/élément de données qui a déjà la même valeur à attribuer, un avertissement est généré.
    • When the action is assigning a value to an attribute/data element that already has a value and the value to be assigned is different, an error is generated unless the RULE_ENGINE_ASSIGN_OVERWRITE system setting is true.

Les règles de programme peuvent également entraîner des effets secondaires, telles que l'envoi et la planification de messages. Pour plus d’informations sur les actions non voulues, veuillez consulter la section suivante.

Note

Program rules can be skipped during import using the skipProgramRules parameter.

Side effects

Une fois qu'une importation est terminée, des tâches spécifiques peuvent être déclenchées du fait de cette importation. Ces tâches sont ce que nous appelons des « effets secondaires ». Ces tâches exécutent des opérations qui n'affectent pas l'importation elle-même.

Les effets secondaires sont des tâches qui s'exécutent séparément de l'importation, mais qui sont toujours déclenchées par une importation. Étant donné que les effets secondaires sont dissociés de l'importation, ils peuvent échouer même si l'importation réussit. De plus, les effets secondaires ne sont exécutés que lorsque l'importation réussit ; ils ne peuvent donc pas échouer dans l'autre sens.

Voici donc les effets secondaires actuellement pris en charge :

Effets secondaires Pris en charge Description
Tracker Notification X Updates can trigger notifications. Updates which trigger notifications are enrollment, event update, event or enrollment completion.
ProgramRule Notification X Les règles de programme peuvent déclencher des notifications. Notez que ces notifications font partie des effets des règles de programme qui sont générés via le moteur de règles de DHIS2.

Note

Certain configurations can control the execution of side effects. skipSideEffects flag can be set during the import to skip side effects entirely. This parameter can be useful if you import something you don't want to trigger notifications for, as an example.

Assign user to events

Certains processus bénéficient du fait que des événements soient traités comme des tâches, et pour cette raison, vous pouvez assigner un utilisateur à un événement.

L'assignation d'un utilisateur à un événement ne modifie pas l'accès ou les autorisations des utilisateurs, mais crée un lien entre l'événement et l'utilisateur. Lorsqu'un utilisateur est assigné à un événement, vous pouvez lancer des requêtes sur les événements à partir de l'API en utilisant le champ assignedUser (utilisateur attribué) en tant que paramètre.

Lorsque vous voulez assigner un utilisateur à un événement, fournissez simplement l'UID de cet utilisateur dans le champ assignedUser. Voir l'exemple suivant:

{
  "events": [
    {
      "event": "ZwwuwNp6gVd",
      "programStage": "nlXNK4b7LVr",
      "orgUnit": "O6uvpzGd5pu",
      "enrollment": "MNWZ6hnuhSw",
      "assignedUser" : "M0fCOxtkURr"
    }
  ]
}

In this example, the user with uid M0fCOxtkURr will be assigned to the event with uid ZwwuwNp6gVd. Only one user can be assigned to a single event.

Pour utiliser cette fonctionnalité, l'assignation d'utilisateurs doit être activée pour l'étape de programme concernée et l'uid fourni pour l'utilisateur doit renvoyer à un utilisateur existant et valide.

Tracker export

Les points d'extrémité de l'exportation Tracker vous permettent de récupérer les objets précédemment importés, à savoir :

  • Entités suivies
  • Événements
  • Enrollments
  • Relations

Note

  • All tracker export endpoints default to a JSON response content. CSV is only supported by tracked entities and events.
  • You can export a CSV file by adding the Accept header text/csv or application/csv to the request.
  • You can download in zip and gzip formats:
  • CSV for Tracked entities
  • JSON and CSV for Events
  • You can export a Gzip file by adding the Accept header application/csv+gzip for CSV or application/json+gzip for JSON.
  • You can export a Zip file by adding the Accept header application/csv+zip for CSV or application/json+zip for JSON.

Common request parameters

The following endpoints support standard pagination parameters.

  • Tracked entities: GET /api/tracker/trackedEntities
  • Events: GET /api/tracker/events
  • Enrollments: GET /api/tracker/enrollments
  • Relationships: GET /api/tracker/relationships

Request parameters for pagination

Paramètre de requête Type Valeurs autorisées Description
page Entier Tout entier positif Numéro de page à renvoyer. La valeur par défaut est 1 .
pageSize Entier Tout entier positif Taille de la page. La valeur par défaut est 50.
totalPages Booléen true, false Indique s'il faut renvoyer le nombre total d'éléments et de pages. La valeur par défaut est false car l'obtention des totaux est une opération coûteuse.
pagination Booléen true, false Indique si la pagination doit être ignorée et si toutes les lignes doivent être renvoyées. La valeur par défaut est true, ce qui signifie que par défaut toutes les requêtes sont paginées, sauf si paging=false (c'est-à-dire si le paramètre "pagination" est défini sur "faux")
order Chaîne Comma-separated list of field and sort direction pairs in format field:sortDirection. Example: createdAt:desc

Entities are ordered by newest (internal ID descending) by default. Note: field is case sensitive. Valid sortDirections are asc and desc, where sortDirection is case insensitive, and sortDirection defaults to asc for fields or UIDs without explicit sortDirection.

Note

Be aware that performance is directly related to the amount of data requested. Greater page sizes will take more time to return.

Organisation unit selection modes

The available organisation unit selection modes are SELECTED, CHILDREN, DESCENDANTS, ACCESSIBLE, CAPTURE and ALL. Each mode is explained in detail in this section.

Field filter responses

Tous les points d'extrémité d'exportation acceptent un paramètre fields (champs) qui contrôle les champs qui seront renvoyés dans la réponse JSON. Le paramètre fields accepte une liste de noms de champs ou de modèles séparés par des virgules. Quelques filtres fields possibles sont présentés ci-dessous. Consultez la section [filtre de champ de métadonnées (#webapi_metadata_field_filter)] pour obtenir un guide plus complet sur l'utilisation du paramètre fields.

Exemples
Query parameter example Description
fields=* Returns all fields
fields=createdAt,uid Returns fields createdAt and uid
fields=enrollments[*,!uid] Returns all fields of enrollments except uid
fields=enrollments[uid] Returns enrollments field uid
fields=enrollments[uid,enrolledAt] Returns enrollments fields uid and enrolledAt

Tracked entities

GET /api/tracker/trackedEntities

Deux points d'extrémité sont dédiés aux entités suivies :

  • GET /api/tracker/trackedEntities
  • récupère les entités suivies correspondant aux critères donnés
  • GET /api/tracker/trackedEntities/{id}
  • retrieves a tracked entity given the provided ID

If not otherwise specified, JSON is the default response for the GET method. The API also supports CSV export for single and collection endpoints. Furthermore, compressed CSV types is an option for the collection endpoint.

CSV

In the case of CSV, the fields request parameter has no effect, and the response will always contain the following fields:

  • Entité suivie (UID)
  • trackedEntityType (identifier in requested idScheme)
  • createdAt (Date et heure)
  • createdAtClient (Date et heure)
  • updatedAt (Date et heure)
  • updatedAtClient (Date et heure)
  • orgUnit (identifier in requested idScheme)
  • inactif (booléen)
  • supprimé (booléen)
  • potentialDuplicate (booléen)
  • geometry (WKT) Vous pouvez l'omettre dans le cas d'un type de Point et si la latitude et la longitude sont fournies)
  • latitude (Latitude d'un type de géométrie Point)
  • longitude (Longitude d'un type de géométrie Point)
  • attribute (identifier in requested idScheme)
  • Afficher le nom (Chaîne)
  • attrCreatedAt (Date de création de l'attribut)
  • attrUpdatedAt (Date de la dernière mise à jour de l'attribut)
  • type de valeur (Chaîne)
  • valeur (Chaîne)
  • createdBy (Nom d'utilisateur de l'utilisateur)
  • updatedBy (Nom d'utilisateur de l'utilisateur)

Voir Entités suivies et Attributs pour plus de descriptions de champs.

GZIP

La réponse est le fichier trackedEntities.csv.gz contenant le fichier trackedEntities.csv.

ZIP

La réponse est le fichier trackedEntities.csv.zip contenant le fichier trackedEntities.csv.

Tracked entity collections

GET /api/tracker/trackedEntities

Le but de ce point d'extrémité est de récupérer les entités suivies correspondant aux critères fournis par le client.

Le point d'extrémité renvoie une liste d'entités suivies qui correspondent aux paramètres de la requête.

Paramètre de requête Type Valeurs autorisées Description
filter Chaîne Comma separated values of attribute filters. Narrows response to tracked entities matching given filters. More on filters here
orgUnits Chaîne Liste des unités d'organisation UID séparées par des virgules. Renvoie uniquement les d'entités suivies appartenant aux unités d'organisation fournies
orgUnitMode Chaîne SELECTED, CHILDREN, DESCENDANTS, ACCESSIBLE, CAPTURE, ALL Get tracked entities owned by given orgUnits relative to the orgUnitMode and program parameters. Defaults to ACCESSIBLE if no organisation unit(s) are set via orgUnits. Defaults to SELECTED if organisation unit(s) are set via orgUnits. See org unit modes.
program Chaîne UID de programme A tracker program UID for which tracked entities in the response must be enrolled into.
programStatus deprecated for removal in version 43 use enrollmentStatus String ACTIVE, COMPLETED, CANCELLED The status of the tracked entities enrollment in the given program.
programStage Chaîne UID un UID d'étape de programme pour lequel les entités suivies présentes dans la réponse doivent avoir des événements.
followUp Booléen true, false Indique si l'entité suivie est marquée pour le suivi du programme spécifié.
updatedAfter DateTime ISO-8601 Date et heure de début de la dernière mise à jour
updatedBefore DateTime ISO-8601 Date et heure de fin de la dernière mise à jour
updatedWithin Duration ISO-8601 Returns tracked entities not older than specified Duration
enrollmentStatus Chaîne ACTIVE, COMPLETED, CANCELLED The status of the tracked entities enrollment in the given program.
enrollmentEnrolledAfter DateTime ISO-8601 Date et heure de début de l’inscription au programme donné
enrollmentEnrolledBefore DateTime ISO-8601 Date et heure de fin de l’inscription au programme donné
enrollmentOccurredAfter DateTime ISO-8601 Start date for when the enrollment occurred in the given program
enrollmentOccurredBefore DateTime ISO-8601 End date for when the enrollment occurred in the given program
TrackedEntityType Chaîne UID du type d'entité suivi Renvoie uniquement les entités suivies d'un type donné
trackedEntities Chaîne Liste des UID des entités suivies, séparée par des virgules. Il est possible de filtrer le résultat de manière à obtenir un ensemble limité d'entités suivies qui utilisent les uids explicites des entités suivies. Vous pouvez le en utilisant le paramètre trackedEntity=id1;id2. Ce paramètre créera, au minimum, la limite externe des résultats, en constituant la liste de toutes les entités suivies à l'aide des uids fournis. Si d'autres paramètres/filtres de ce tableau sont utilisés, ils limiteront davantage les résultats à partir de la limite externe explicite.
assignedUserMode Chaîne CURRENT, PROVIDED, NONE, ANY, ALL Restricts result to tracked entities with events assigned based on the assigned user selection mode. See table below "Assigned user modes" for explanations. Default is ALL.
assignedUser Chaîne Liste des UID d'utilisateurs séparés par des virgules, à filtrer sur la base des événements affectés aux utilisateurs. Il est possible de filtrer le résultat pour obtenir un ensemble limité d'entités suivies avec des événements attribués aux UID donnés, à l'aide du paramètre assignedUser=id1;id2. Ce paramètre ne sera pris en compte que si le mode d'utilisateur assigné est FOURNI ou nul. L'API va générer une erreur si, par exemple, assignedUserMode=CURRENT et assignedUser=someId
order Chaîne Liste séparée par des virgules de paires de noms de propriétés, d'attributs ou d'UID et de directions de tri au format propName:sortDirection. Les valeurs prises en charge sont: createdAt (créé à) createdAtClient (créé au niveau du client), enrolledAt (inscrit à), inactive (inactif), trackedEntity (entité suivie), updatedAt (mis à jour à), updatedAtClient (mis à jour au niveau du client), .
eventStatus Chaîne ACTIVE, COMPLETED, VISITED, SCHEDULE, OVERDUE, SKIPPED Il s'agit du statut de tous les événements présents dans le programme spécifié
eventOccurredAfter DateTime ISO-8601 Date et heure de début de l'événement pour le programme donné
eventOccurredBefore DateTime ISO-8601 Date et heure de fin de l'événement pour le programme donné
includeDeleted Booléen true, false Indique s’il faut inclure les éléments supprimés de façon réversible
potentialDuplicate Booléen true, false Filter the result based on the fact that a tracked entities is a potential duplicate. true: returns tracked entities flagged as potential duplicates. false: returns tracked entities NOT flagged as potential duplicates.
idScheme Énumération UID, CODE, NAME, ATTRIBUTE:{uid} IdScheme used for all metadata references unless overridden by a metadata specific parameter. Default is UID. Note: only metadata in fields trackedEntity.trackedEntityType, orgUnit and attributes is exported in this idScheme. All other fields will always be exported using UIDs.
orgUnitIdScheme Énumération UID, CODE, NAME, ATTRIBUTE:{uid} IdScheme used for organisation unit references. Defaults to the idScheme parameter.

Les modes d'utilisateur assigné disponibles sont expliqués dans le tableau suivant.

Tableau : Modes d'utilisateur assigné

Mode Description
CURRENT Inclut les événements attribués à l’utilisateur actuellement connecté.
PROVIDED Inclut les événements attribués à l’utilisateur indiqué dans la requête.
NONE Inclut uniquement les événements non attribués.
ANY Includes all assigned events, regardless of who they are assigned to, as long as they are assigned to someone.
ALL Includes all events irrespective of whether a user is assigned. This is the default mode.

La requête n'est pas sensible à la casse. Les règles suivantes s'appliquent aux paramètres de requête.

  • Au moins une unité d'organisation doit être spécifiée avec le paramètre orgUnit (un ou plusieurs), ou orgUnitMode=ALL doit être spécifié.
  • Un seul des paramètres program et trackedEntity peut être spécifié (zéro ou un).
  • If programStatus is specified, then program must also be specified.
  • If enrollmentStatus is specified, then program must also be specified.
  • Si followUp est spécifié, alors program doit également être spécifié.
  • Si enrollmentEnrolledAfter ou enrollmentEnrolledBefore est spécifié, alors program doit également être spécifié.

  • Les éléments du filtre ne peuvent être spécifiés qu'une seule fois.

Example requests

A query for all tracked entities associated with a specific organisation unit and tracker program can look like this:

GET /api/tracker/trackedEntities?program=IpHINAT79UW&orgUnits=DiszpKrYNg8

Pour lancer une requête sur les entités suivies en utilisant un attribut avec un filtre et un attribut sans filtre, avec une unité d'organisation en utilisant le mode de requête par unité d'organisation descendante :

GET /api/tracker/trackedEntities?program=IpHINAT79UW&orgUnits=DiszpKrYNg8&filter=w75KJ2mc4zz:EQ:John

Une requête dans laquelle plusieurs opérandes et filtres sont spécifiés pour un élément de filtre :

GET /api/tracker/trackedEntities?orgUnits=DiszpKrYNg8&program=ur1Edk5Oe2n&filter=lw1SqmMlnfh:GT:150&filter=lw1SqmMlnfh:LT:190

Un filtre de requête avec une valeur qui doit être échappée et qui sera interprétée comme :,/ :

GET /api/tracker/trackedEntities?orgUnits=DiszpKrYNg8&program=ur1Edk5Oe2n&filter=lw1SqmMlnfh:EQ:/:/,//

Pour spécifier les dates d'inscription au programme dans la requête :

GET /api/tracker/trackedEntities?orgUnits=DiszpKrYNg8&program=IpHINAT79UW&fields=trackedEntity,enrollments[enrolledAt]&enrollmentEnrolledAfter=2024-01-01

To query on an attribute using multiple values with an IN filter and semicolon-separated values:

GET /api/tracker/trackedEntities?trackedEntityType=nEenWmSyUEp&orgUnits=DiszpKrYNg8&filter=w75KJ2mc4zz:IN:Scott;Jimmy;Santiago

All of the following operators are supported regardless of the value type. Values are compared using text comparison unless stated otherwise. Integer and decimal value types are treated as PostgreSQL integer and numeric data types for the specified operators.

Supported binary operators:

Opérateur Description
eq equal to, uses integer/numeric semantics for integer/decimal value types
ieq equal to, ignoring case (use eq instead)*
ge greater than or equal to (uses integer/number semantics for integer/decimal value types)
gt greater than, uses integer/number semantics for integer/decimal value types
le less than or equal to, uses integer/number semantics for integer/decimal value types
lt less than (uses integer/number semantics for integer/decimal value types)
ne not equal to (uses integer/number semantics for integer/decimal value types)
neq not equal to (uses integer/number semantics for integer/decimal value types), use ne instead*
nieq not equal to, ignoring case (use ne instead)*
dans one of multiple values separated by semicolon ";", uses integer/number semantics for integer/decimal value types
like like text match
ilike like text match, ignoring case (use like instead)*
nlike not like
nilike not like, ignoring case (use nlike instead)*
sw starts with
ew ends with

*These operators are currently supported but may be removed in the future. We recommend using the operator mentioned in the description, as it provides the same functionality.

Matches are case-insensitive, for example eq and ieq (i for insensitive) behave in the same way. To ensure future compatibility, always use the non-i form (eq, like, etc.).

For instance, filter=w75KJ2mc4zz:eq:Scott would return values of the given attribute that match any variation of "Scott" regardless of case, such as SCOTT, scott, Scott...

Supported unary operators:

Opérateur Description
null has no value
!null has a value
Tracked entity attribute filtering

Filtering by a tracked entity attribute narrows the response to tracked entities matching given filters. A filter is a colon separated property or attribute UID with optional operator and value pairs.

Example: filter=H9IlTX2X6SL:sw:A with operator starts with sw followed by a value.

A filter like filter=H9IlTX2X6SL:!null returns all entries where the given attribute has a value.

Special characters like + need to be percent-encoded, so %2B instead of +. Characters such as : or ,, as part of the filter value, need to be escaped by /. Likewise, / needs to be escaped.

Multiple operators for the same attribute like filter=AuPLng5hLbE:gt:438901703:lt:448901704 are allowed.

Each tracked entity attribute can be configured with: - A minimum number of characters required to perform a search (0 means no minimum) - Blocked operators. Only sw, ew, and like can be blocked. All other operators cannot be blocked.

The following request:

GET /api/tracker/trackedEntities?program=IpHINAT79UW&orgUnits=DiszpKrYNg8&filter=w75KJ2mc4zz:EQ:John
would fail if the minimum character limit was set to 5 (since "John" has only 4 characters), or if the EQ operator was blocked for the specified tracked entity attribute.
Tracked entities response

The API supports CSV and JSON response for GET /api/tracker/trackedEntities.

JSON

Responses can be filtered on desired fields, see field filter for more information.

A JSON response looks like the following:

{
  "pager": {
    "page": 1,
    "pageSize": 1
  },
  "trackedEntities": [
    {
      "trackedEntity": "F8yKM85NbxW",
      "trackedEntityType": "Zy2SEgA61ys",
      "createdAt": "2019-08-21T13:25:38.022",
      "createdAtClient": "2019-03-19T01:12:16.624",
      "updatedAt": "2019-08-21T13:31:33.410",
      "updatedAtClient": "2019-03-19T01:12:16.624",
      "orgUnit": "DiszpKrYNg8",
      "inactive": false,
      "deleted": false,
      "potentialDuplicate": false,
      "geometry": {
        "type": "Point",
        "coordinates": [
          -11.7896,
          8.2593
        ]
      },
      "attributes": [
        {
          "attribute": "B6TnnFMgmCk",
          "displayName": "Age (years)",
          "createdAt": "2019-08-21T13:25:38.477",
          "updatedAt": "2019-08-21T13:25:38.477",
          "storedBy": "braimbault",
          "valueType": "INTEGER_ZERO_OR_POSITIVE",
          "value": "30"
        },
        {
          "attribute": "TfdH5KvFmMy",
          "displayName": "First Name",
          "createdAt": "2019-08-21T13:25:38.066",
          "updatedAt": "2019-08-21T13:25:38.067",
          "storedBy": "josemp10",
          "valueType": "TEXT",
          "value": "Sarah"
        },
        {
          "attribute": "aW66s2QSosT",
          "displayName": "Last Name",
          "createdAt": "2019-08-21T13:25:38.388",
          "updatedAt": "2019-08-21T13:25:38.388",
          "storedBy": "karoline",
          "valueType": "TEXT",
          "value": "Johnson"
        }
      ]
    }
  ]
}
CSV

A CSV response looks like the following:

trackedEntity,trackedEntityType,createdAt,createdAtClient,updatedAt,updatedAtClient,orgUnit,inactive,deleted,potentialDuplicate,geometry,latitude,longitude,createdBy,updatedBy,attrCreatedAt,attrUpdatedAt,attribute,displayName,value,valueType
F8yKM85NbxW,Zy2SEgA61ys,2019-08-21T11:25:38.022Z,2019-03-19T00:12:16.624Z,2019-08-21T11:31:33.410Z,2019-03-19T00:12:16.624Z,DiszpKrYNg8,false,false,false,"POINT (-11.7896 8.2593)",8.2593,-11.7896,,,2019-08-21T11:25:38.477Z,2019-08-21T11:25:38.477Z,B6TnnFMgmCk,"Age (years)",30,INTEGER_ZERO_OR_POSITIVE
F8yKM85NbxW,Zy2SEgA61ys,2019-08-21T11:25:38.022Z,2019-03-19T00:12:16.624Z,2019-08-21T11:31:33.410Z,2019-03-19T00:12:16.624Z,DiszpKrYNg8,false,false,false,"POINT (-11.7896 8.2593)",8.2593,-11.7896,,,2019-08-21T11:25:38.066Z,2019-08-21T11:25:38.067Z,TfdH5KvFmMy,"First Name",Sarah,TEXT
F8yKM85NbxW,Zy2SEgA61ys,2019-08-21T11:25:38.022Z,2019-03-19T00:12:16.624Z,2019-08-21T11:31:33.410Z,2019-03-19T00:12:16.624Z,DiszpKrYNg8,false,false,false,"POINT (-11.7896 8.2593)",8.2593,-11.7896,,,2019-08-21T11:25:38.388Z,2019-08-21T11:25:38.388Z,aW66s2QSosT,"Last Name",Johnson,TEXT
Tracked entities collection limits

The collection endpoint limits results in three ways:

  • KeyTrackedEntityMaxLimit in System settings: KeyTrackedEntityMaxLimit defines the maximum tracked entities in an API response, protecting database and server resources. No limit applies when set to 0. Configure it via /api/systemSettings as described in the documentation.

  • Max number of TEs to return in Program or tracked entity type: it limits results when searching outside the capture scope with a specified program or tracked entity type. The API returns an error if matches exceed this limit. No limit applies when searching within the capture scope or when set to 0. This limit is configurable in the maintenance app.

  • Pagination: As explained here.

For paginated requests with non-zero KeyTrackedEntityMaxLimit:

  • If pageSize ≤ KeyTrackedEntityMaxLimit: pageSize is enforced

  • If pageSize > KeyTrackedEntityMaxLimit: The API returns an error

Tracked entities single object endpoint

GET /api/tracker/trackedEntities/{uid}

This endpoint retrieves a tracked entity given by ID.

Request syntax
GET /api/tracker/trackedEntities/{uid}?program={programUid}&fields={fields}
Paramètre de requête Type Valeurs autorisées Description
uid Chaîne uid Renvoie l'entité suivie disposant de l'uid spécifié
program Chaîne uid Inclut les attributs du programme dans la réponse (seuls ceux auxquels l'utilisateur a accès)
champs Chaîne Tout filtre de champ valide (par défaut *,!relationships,!enrollments,!events,!programOwners) Inclut les sous-objets spécifiés dans la réponse
Example requests

Une requête pour une entité suivie:

GET /api/tracker/trackedEntities/PQfMcpmXeFE
Tracked Entity response

The API supports CSV and JSON response for GET /api/tracker/trackedEntities/{uid}

JSON

An example JSON response.

{
  "trackedEntity": "PQfMcpmXeFE",
  "trackedEntityType": "nEenWmSyUEp",
  "createdAt": "2014-03-06T05:49:28.256",
  "createdAtClient": "2014-03-06T05:49:28.256",
  "updatedAt": "2016-08-03T23:49:43.309",
  "orgUnit": "DiszpKrYNg8",
  "inactive": false,
  "deleted": false,
  "potentialDuplicate": false,
  "attributes": [
    {
      "attribute": "w75KJ2mc4zz",
      "code": "MMD_PER_NAM",
      "displayName": "First name",
      "createdAt": "2016-08-03T23:49:43.308",
      "updatedAt": "2016-08-03T23:49:43.308",
      "valueType": "TEXT",
      "value": "John"
    },
    {
      "attribute": "zDhUuAYrxNC",
      "displayName": "Last name",
      "createdAt": "2016-08-03T23:49:43.309",
      "updatedAt": "2016-08-03T23:49:43.309",
      "valueType": "TEXT",
      "value": "Kelly"
    }
  ],
  "enrollments": [
    {
      "enrollment": "JMgRZyeLWOo",
      "createdAt": "2017-03-06T05:49:28.340",
      "createdAtClient": "2016-03-06T05:49:28.340",
      "updatedAt": "2017-03-06T05:49:28.357",
      "trackedEntity": "PQfMcpmXeFE",
      "program": "IpHINAT79UW",
      "status": "ACTIVE",
      "orgUnit": "DiszpKrYNg8",
      "enrolledAt": "2024-03-06T00:00:00.000",
      "occurredAt": "2024-03-04T00:00:00.000",
      "attributeOptionCombo": "HllvX50cXC0",
      "followUp": false,
      "deleted": false,
      "events": [
        {
          "event": "Zq2dg6pTNoj",
          "status": "ACTIVE",
          "program": "IpHINAT79UW",
          "programStage": "ZzYYXq4fJie",
          "enrollment": "JMgRZyeLWOo",
          "trackedEntity": "PQfMcpmXeFE",
          "relationships": [],
          "scheduledAt": "2023-03-10T00:00:00.000",
          "followUp": false,
          "deleted": false,
          "createdAt": "2017-03-06T05:49:28.353",
          "createdAtClient": "2016-03-06T05:49:28.353",
          "updatedAt": "2017-03-06T05:49:28.353",
          "attributeOptionCombo": "HllvX50cXC0",
          "attributeCategoryOptions": "xYerKDKCefk",
          "dataValues": [],
          "notes": []
        }
      ],
      "relationships": [],
      "attributes": [
        {
          "attribute": "w75KJ2mc4zz",
          "code": "MMD_PER_NAM",
          "displayName": "First name",
          "createdAt": "2016-08-03T23:49:43.308",
          "updatedAt": "2016-08-03T23:49:43.308",
          "valueType": "TEXT",
          "value": "John"
        },
        {
          "attribute": "zDhUuAYrxNC",
          "displayName": "Last name",
          "createdAt": "2016-08-03T23:49:43.309",
          "updatedAt": "2016-08-03T23:49:43.309",
          "valueType": "TEXT",
          "value": "Kelly"
        },
        {
          "attribute": "AuPLng5hLbE",
          "code": "National identifier",
          "displayName": "National identifier",
          "createdAt": "2016-08-03T23:49:43.301",
          "updatedAt": "2016-08-03T23:49:43.301",
          "valueType": "TEXT",
          "value": "245435245"
        },
        {
          "attribute": "ruQQnf6rswq",
          "displayName": "TB number",
          "createdAt": "2016-08-03T23:49:43.308",
          "updatedAt": "2016-08-03T23:49:43.308",
          "valueType": "TEXT",
          "value": "1Z 1F2 A84 59 4464 173 6"
        },
        {
          "attribute": "cejWyOfXge6",
          "displayName": "Gender",
          "createdAt": "2016-08-03T23:49:43.307",
          "updatedAt": "2016-08-03T23:49:43.307",
          "valueType": "TEXT",
          "value": "Male"
        },
        {
          "attribute": "VqEFza8wbwA",
          "code": "MMD_PER_ADR1",
          "displayName": "Address",
          "createdAt": "2016-08-03T23:49:43.307",
          "updatedAt": "2016-08-03T23:49:43.307",
          "valueType": "TEXT",
          "value": "Main street 2"
        }
      ],
      "notes": []
    }
  ],
  "programOwners": [
    {
      "orgUnit": "DiszpKrYNg8",
      "trackedEntity": "PQfMcpmXeFE",
      "program": "ur1Edk5Oe2n"
    },
    {
      "orgUnit": "DiszpKrYNg8",
      "trackedEntity": "PQfMcpmXeFE",
      "program": "IpHINAT79UW"
    }
  ]
}
CSV

The response will be the same as the collection endpoint but referring to a single tracked entity, although it might have multiple rows for each attribute.

Tracked entity attribute value change logs

GET /api/tracker/trackedEntities/{uid}/changeLogs

This endpoint retrieves change logs for the attributes of a specific tracked entity. It returns a list of all tracked entity attributes that have changed over time for that entity.

Paramètre de requête Type Valeurs autorisées
path /{uid} Chaîne Tracked entity UID.
program String Program UID (optional).
order String Field and sort direction pair in the format field:sortDirection.

Change logs are ordered by newest (creation date in descending order) by default, when no order parameter is provided.

Example: createdAt:desc

field is case-sensitive. Valid sortDirection values are asc and desc. sortDirection is case-insensitive and defaults to asc for fields without explicit sortDirection. Supported fields are attribute, createdAt, and username.
filter Chaîne Colon-separated field name with the eq operator and value in the format field:eq:value.

Example: attribute:eq:w75KJ2mc4zz

Filtering is supported for attribute and username fields, one at a time. Only the eq (equals) operator is supported.
Tracked entity attribute value change logs

An example JSON response.

{
  "pager": {
    "page": 1,
    "pageSize": 10
  },
  "changeLogs": [
    {
      "createdBy": {
        "uid": "AIK2aQOJIbj",
        "username": "tracker",
        "firstName": "Tracker demo",
        "surname": "User"
      },
      "createdAt": "2024-06-20T14:51:16.433",
      "type": "UPDATE",
      "change": {
        "attributeValue": {
          "attribute": "w75KJ2mc4zz",
          "previousValue": "John",
          "currentValue": "Johnny"
        }
      }
    },
    {
      "createdBy": {
        "uid": "AIK2aQOJIbj",
        "username": "tracker",
        "firstName": "Tracker demo",
        "surname": "User"
      },
      "createdAt": "2024-06-20T14:50:32.966",
      "type": "CREATE",
      "change": {
        "attributeValue": {
          "attribute": "w75KJ2mc4zz",
          "currentValue": "John"
        }
      }
    }
  ]
}

The change log type can be CREATE, UPDATE, or DELETE. CREATE and DELETE will always hold a single value: the former shows the current value, and the latter shows the value that was deleted. UPDATE will hold two values: the previous and the current.

More on change log configuration here

Enrollments

GET /api/tracker/enrollments

Two endpoints are dedicated to enrollments.

  • GET /api/tracker/enrollments
    • récupère les inscriptions correspondant aux critères donnés
  • GET /api/tracker/enrollments/{id}
    • retrieves an enrollment given the provided ID

Enrollment Collection endpoint GET /api/tracker/enrollments

Returns a list of enrollments based on filters.

Paramètre de requête Type Valeurs autorisées Description
orgUnits Chaîne Liste des unités d'organisation UID séparées par des virgules. Renvoie uniquement les inscriptions appartenant aux unités d'organisation fournies.
orgUnitMode (see orgUnitModes) Chaîne SELECTED, CHILDREN, DESCENDANTS, ACCESSIBLE, CAPTURE, ALL The mode of selecting organisation units. Default is SELECTED.
program Chaîne uid Identifier of a tracker program the enrollment is enrolled into. This parameter is mandatory.
programStatus deprecated for removal in version 43 use status Chaîne ACTIVE, COMPLETED, CANCELLED The status of the enrollment.
status Chaîne ACTIVE, COMPLETED, CANCELLED The status of the enrollment.
followUp booléen true, false Follow up status of the tracked entity for the given program. Can be true, false or omitted.
updatedAfter DateTime ISO-8601 Seules les inscriptions mises à jour après cette date
updatedWithin Duration ISO-8601 Seules les inscriptions mises à jour depuis une durée donnée
enrolledAfter DateTime ISO-8601 Seules les inscriptions plus récentes que cette date
enrolledBefore DateTime ISO-8601 Seules les inscriptions antérieures à cette date
trackedEntity Chaîne uid Identifiant d'une entité suivie
order Chaîne Liste séparée par des virgules de paires de noms de propriétés, d'attributs ou d'UID et de directions de tri au format propName:sortDirection. Champs pris en charge : completedAt,(terminé à), createdAt (créé à), createdAtClient (créé au niveau du client), enrolledAt (inscrit à), updatedAt (mis à jour à), updatedAtClient (mis à jour au niveau du client).
inscriptions Chaîne Liste des UID des inscriptions, séparée par des virgules. Filtre le résultat pour obtenir un ensemble limité d’identifiants en utilisant enrollments=id1,id2.
attributeOptionCombo (combinaison d'options d'attribut) Chaîne uid Filters enrollments by the given attribute option combo. Only matching enrollments are returned.
includeDeleted Booléen S'il est défini sur "vrai", les événements supprimés de façon réversible seront inclus dans le résultat de votre requête.

The query is case-insensitive. The only requirement is that the program parameter must be provided.

Example requests

Une requête pour toutes les inscriptions associées à une unité d'organisation spécifique peut ressembler à ceci :

GET /api/tracker/enrollments?orgUnits=DiszpKrYNg8

To constrain the response to enrollments which are part of a specific tracker program you can include a program query parameter:

GET /api/tracker/enrollments?orgUnits=O6uvpzGd5pu&orgUnitMode=DESCENDANTS&program=ur1Edk5Oe2n

Pour spécifier les dates d'inscription au programme dans la requête :

GET /api/tracker/enrollments?orgUnits=DiszpKrYNg8&program=M3xtLkYBlKI&enrolledAfter=2023-11-14&enrolledBefore=2024-02-07

Pour limiter la réponse aux inscriptions d'une entité suivie spécifique, vous pouvez inclure un paramètre de requête d'entité suivie:

GET /api/tracker/enrollments?trackedEntity=ClJ3fn47c4s

Pour limiter la réponse aux inscriptions d'une entité suivie spécifique, vous pouvez inclure un paramètre de requête d'entité suivie. Dans ce cas, nous avons limité la réponse aux inscriptions disponibles pour l'utilisateur actuel :

GET /api/tracker/enrollments?orgUnitMode=ACCESSIBLE&trackedEntity=tphfdyIiVL6
Response format

The JSON response can look like the following.

{
  "pager": {
    "page": 1,
    "pageSize": 1
  },
  "enrollments": [
    {
      "enrollment": "TRE0GT7eh7Q",
      "createdAt": "2019-08-21T13:28:00.056",
      "createdAtClient": "2018-11-13T15:06:49.009",
      "updatedAt": "2019-08-21T13:29:44.942",
      "updatedAtClient": "2019-08-21T13:29:44.942",
      "trackedEntity": "s4NfKOuayqG",
      "program": "M3xtLkYBlKI",
      "status": "COMPLETED",
      "orgUnit": "DiszpKrYNg8",
      "enrolledAt": "2023-11-13T00:00:00.000",
      "occurredAt": "2023-11-13T00:00:00.000",
      "followUp": false,
      "deleted": false,
      "notes": []
    }
  ]
}

Enrollments single object endpoint

GET /api/tracker/enrollments/{uid}

The purpose of this endpoint is to retrieve an enrollment given its ID.

Request syntax
GET /api/tracker/enrollment/{uid}
Paramètre de requête Type Valeurs autorisées Description
uid Chaîne uid Renvoie l'inscription disposant de l'uid spécifié
champs Chaîne Tout filtre de champ valide (par défaut *,!relationships,!events,!attributes) Inclut les sous-objets spécifiés dans la réponse
Example requests

A query for an enrollment.

GET /api/tracker/enrollments/JMgRZyeLWOo
Response format
{
  "enrollment": "JMgRZyeLWOo",
  "createdAt": "2017-03-06T05:49:28.340",
  "createdAtClient": "2016-03-06T05:49:28.340",
  "updatedAt": "2017-03-06T05:49:28.357",
  "trackedEntity": "PQfMcpmXeFE",
  "program": "IpHINAT79UW",
  "status": "ACTIVE",
  "orgUnit": "DiszpKrYNg8",
  "enrolledAt": "2024-03-06T00:00:00.000",
  "occurredAt": "2024-03-04T00:00:00.000",
  "followUp": false,
  "deleted": false,
  "notes": []
}

Events (GET /api/tracker/events)

Two endpoints are dedicated to events. To retrieve events matching specific criteria:

GET /api/tracker/events

To retrieve an event with a specific ID:

GET /api/tracker/events/{id}

If not otherwise specified, JSON is the default response for the GET method. The API also supports CSV export for single and collection endpoints. Furthermore, it supports compressed JSON and CSV for the collection endpoint.

Events CSV

In the case of CSV, the fields request parameter has no effect, and the response will always contain the following fields:

Propriété Type
event UID
status Chaîne
program Identifiant
programStage Identifiant
enrollment Identifiant
orgUnit Identifiant
occurredAt (s'est produit à) DateTime
scheduledAt (programmé à) DateTime
géométrie WKT, can be omitted it in case of a Point type and with latitude and longitude provided
latitude Latitude of a Point type of Geometry
longitude Longitude of a Point type of Geometry
followUp booléen
supprimé booléen
créé à DateTime
crééAtClient (Création au niveau du client) DateTime
updatedAt (mis à jour à) DateTime
updatedAtClient (mise à jour au niveau du client) DateTime
completedBy Nom d'utilisateur
completedAt (effectué à) DateTime
updatedBy (mis à jour par) Nom d'utilisateur
attributeOptionCombo (combinaison d'options d'attribut) Identifiant
attributeCategoryOptions (options de catégorie d'attribut) Identifiant
assignedUser Nom d'utilisateur
dataElement Identifiant
value Chaîne
providedElsewhere booléen
storedByDataValue Chaîne
createdAtDataValue DateTime
updatedAtDataValue DateTime

See Events and Data Values for more field descriptions.

Events GZIP

The response is file events.json.gz or events.csv.gz containing the events.json or events.csv file.

Events ZIP

The response is file events.json.zip or events.csv.zip containing the events.json or events.csv file.

Events Collection endpoint GET /api/tracker/events

Renvoie une liste d'événements en fonction des filtres fournis.

Paramètre de requête Type Valeurs autorisées Description
program Chaîne uid Identifier of a tracker or event program. This parameter is mandatory.
programStage Chaîne uid Identifiant de l'étape de programme
programStatus deprecated for removal in version 43 use enrollmentStatus Chaîne ACTIVE, COMPLETED, CANCELLED The status of the events enrollment.
filter Chaîne Valeurs des filtres d'éléments de données, séparées par des virgules  Narrows response to events matching given filters. A filter is a colon separated property or data element UID with optional operator and value pairs. Example: filter=fazCI2ygYkq:eq:PASSIVE with operator starts with eq followed by a value. A filter like filter=fazCI2ygYkq:!null returns all events where the given data element has a value. Characters such as : or ,, as part of the filter value, need to be escaped by /. Likewise, / needs to be escaped. Multiple operators for the same data element like filter=qrur9Dvnyt5:gt:70:lt:80 are allowed. User needs access to the data element to filter on it.
filterAttributes Chaîne Valeurs des filtres d'attribut séparées par des virgules Narrows response to tracked entities matching given filters. Example: filterAttributes=H9IlTX2X6SL:eq:John. More on filters here
followUp booléen true, false Détermine si l'événement est pris en compte pour un suivi dans le programme. La valeur par défaut est vrai
trackedEntity Chaîne uid Identifiant d'une entité suivie
orgUnit Chaîne uid Identifiant de l'unité d'organisation
orgUnitMode see orgUnitModes Chaîne SELECTED, CHILDREN, DESCENDANTS, ACCESSIBLE, CAPTURE, ALL Le mode de sélection des unités d'organisation peut l'être. La valeur par défaut est SÉLECTIONNÉ, qui fait uniquement référence aux unités d'organisation sélectionnées.
status Chaîne ACTIVE, COMPLETED, VISITED, SCHEDULE, OVERDUE, SKIPPED Statut de l'événement
occurredAfter DateTime ISO-8601 Filtre pour les événements survenus après cette date.
occurredBefore DateTime ISO-8601 Filtre pour les événements survenus jusqu'à cette date.
scheduledAfter DateTime ISO-8601 Filtre pour les événements programmés après cette date.
scheduledBefore DateTime ISO-8601 Filtre pour les événements programmés avant cette date.
updatedAfter DateTime ISO-8601 Filtre pour les événements qui ont été mis à jour après cette date. Ne peut pas être utilisé avec updatedWithin (mis à jour pendant).
updatedBefore DateTime ISO-8601 Filtre pour les événements qui ont été mis à jour jusqu'à cette date. Ne peut pas être utilisé avec updatedWithin.
updatedWithin Duration ISO-8601 Incluez uniquement les éléments mis à jour pendant la durée indiquée.

Le format est ISO-8601#Duration
enrollmentStatus Chaîne ACTIVE, COMPLETED, CANCELLED The status of the events enrollment.
enrollmentEnrolledAfter DateTime ISO-8601 Date et heure de début de l’inscription au programme donné
enrollmentEnrolledBefore DateTime ISO-8601 Date et heure de fin de l’inscription au programme donné
enrollmentOccurredAfter DateTime ISO-8601 Start date for when the enrollment occurred in the given program
enrollmentOccurredBefore DateTime ISO-8601 End date for when the enrollment occurred in the given program
idScheme Énumération UID, CODE, NAME, ATTRIBUTE:{uid} IdScheme used for all metadata references unless overridden by a metadata specific parameter. Default is UID. Note: metadata in event.relationships will always be exported using UIDs.
dataElementIdScheme Énumération UID, CODE, NAME, ATTRIBUTE:{uid} IdScheme used for data element references. Defaults to the idScheme parameter.
orgUnitIdScheme Énumération UID, CODE, NAME, ATTRIBUTE:{uid} IdScheme used for organisation unit references. Defaults to the idScheme parameter.
programIdScheme Énumération UID, CODE, NAME, ATTRIBUTE:{uid} IdScheme used for program references. Defaults to the idScheme parameter.
programStageIdScheme Énumération UID, CODE, NAME, ATTRIBUTE:{uid} IdScheme used for program stage references. Defaults to the idScheme parameter.
categoryOptionComboIdScheme Énumération UID, CODE, NAME, ATTRIBUTE:{uid} IdScheme used for category option combo references. Defaults to the idScheme parameter.
categoryOptionIdScheme (Schéma d'identification des options de catégorie) Énumération UID, CODE, NAME, ATTRIBUTE:{uid} IdScheme used for category option references. Defaults to the idScheme parameter.
order Chaîne Liste de paires de noms de propriétés, d'attributs ou d'éléments de données UID et de directions de tri, séparées par des virgules, au format propName:sortDirection. Les champs pris en charge sont : assignedUser, assignedUserDisplayName, attributeOptionCombo, completedAt, completedBy, createdAt, createdAtClient, createdBy, deleted, enrolledAt, enrollment, enrollmentStatus, event, followUp, occurredAt, orgUnit, program, programStage, scheduledAt, status, storedBy, trackedEntity, updatedAt, updatedAtClient, updatedBy.
events Chaîne Liste des UID des événements, séparée par des virgules. Filtre le résultat pour obtenir un ensemble limité d’identifiants en utilisant event=id1,id2.
attributeCategoryCombo (see note) Chaîne Identifiant de la combinaison de catégories d'attributs. Doit être combiné avec attributeCategoryOptions.
attributeCategoryOptions (see note) Chaîne Identifiants d'options de catégories d'attributs séparés par des virgules. Doit être combiné avec attributeCategoryCombo.
includeDeleted Booléen S'il est défini sur "vrai", les événements supprimés de façon réversible seront inclus dans le résultat de votre requête.
assignedUserMode Chaîne CURRENT, PROVIDED, NONE, ANY Mode de sélection de l'utilisateur assigné
assignedUser Chaîne Liste des UID d'utilisateurs séparés par des virgules, à filtrer sur la base des événements affectés aux utilisateurs. Il est possible de filtrer le résultat pour obtenir un ensemble limité d'entités suivies avec des événements attribués aux UID donnés, à l'aide du paramètre assignedUser=id1;id2. Ce paramètre ne sera pris en compte que si le mode d'utilisateur assigné est FOURNI ou nul. L'API va générer une erreur si, par exemple, assignedUserMode=CURRENT et assignedUser=someId

Note

If the query contains neither attributeCategoryCombo nor attributeCategoryOptions, the server returns events for all attribute option combos where the user has read access.

Example requests

La requête pour tous les événements associés aux subordonnées d'une unité d'organisation donnée :

GET /api/tracker/events?orgUnit=YuQRtpLP10I&orgUnitMode=CHILDREN

La requête pour tous les événements associés à tous les descendants d'une unité d'organisation donnée, c'est-à-dire toutes les unités d'organisation qui lui sont inférieurs dans la hiérarchie :

GET /api/tracker/events?orgUnit=O6uvpzGd5pu&orgUnitMode=DESCENDANTS

Requête pour tous les événements associés à un programme et à une unité d'organisation :

GET /api/tracker/events?orgUnit=DiszpKrYNg8&program=eBAyeGv0exc

La requête pour tous les événements disposant d'un programme et d'une unité d'organisation, ordonnés par date programmée en ordre croissant :

GET /api/tracker/events?orgUnit=DiszpKrYNg8&program=eBAyeGv0exc&order=scheduledAt

La requête pour les 10 événements dont la date de déroulement est la plus récente dans un programme et une unité d'organisation donné - par pagination et ordonnés par date de déroulement en ordre décroissant :

GET /api/tracker/events?orgUnit=DiszpKrYNg8&program=eBAyeGv0exc&order=occurredAt:desc&pageSize=10&page=1

La requête pour tous les événements avec un programme et une unité d'organisation pour une entité suivie donnée :

GET /api/tracker/events?orgUnit=DiszpKrYNg8&program=M3xtLkYBlKI&trackedEntity=dNpxRu1mWG5

Query for all events before or equal to 2024-02-03 and associated with a program and organisation unit:

GET /api/tracker/events?orgUnit=DiszpKrYNg8&program=eBAyeGv0exc&occurredBefore=2024-02-03

Une requête dans laquelle plusieurs opérandes et filtres sont spécifiés pour un UID d'élément de données :

GET /api/tracker/events?orgUnit=g8upMTyEZGZ&program=M3xtLkYBlKI&filter=rFQNCGMYud2:GT:35&filter=rFQNCGMYud2:LT:50

Un filtre de requête avec une valeur qui doit être échappée et qui sera interprétée comme :,/ :

GET /api/tracker/events?orgUnit=DiszpKrYNg8&program=lxAQ7Zs9VYR&filter=DanTR5x0WDK:EQ:/:/,//
Events response example

L'API prend en charge les réponses CSV et JSON pour GET /api/tracker/events.

JSON

La réponse JSON peut ressembler à ce qui suit:

{
  "pager": {
    "page": 1,
    "pageSize": 1
  },
  "events": [
    {
      "event": "A7rzcnZTe2T",
      "status": "ACTIVE",
      "program": "eBAyeGv0exc",
      "programStage": "Zj7UnCAulEk",
      "enrollment": "RiLEKhWHlxZ",
      "orgUnit": "DwpbWkiqjMy",
      "occurredAt": "2023-02-13T00:00:00.000",
      "scheduledAt": "2023-02-13T00:00:00.000",
      "followUp": false,
      "deleted": false,
      "createdAt": "2017-09-08T21:40:22.000",
      "createdAtClient": "2016-09-08T21:40:22.000",
      "updatedAt": "2017-09-08T21:40:22.000",
      "attributeOptionCombo": "HllvX50cXC0",
      "attributeCategoryOptions": "xYerKDKCefk",
      "geometry": {
        "type": "Point",
        "coordinates": [-11.468912037323042, 7.515913998868316]
      },
      "dataValues": [
        {
          "createdAt": "2016-12-06T18:22:34.438",
          "updatedAt": "2016-12-06T18:22:34.438",
          "providedElsewhere": false,
          "dataElement": "F3ogKBuviRA",
          "value": "[-11.4880220438585,7.50978830548003]"
        },
        {
          "createdAt": "2013-12-30T14:23:57.423",
          "updatedAt": "2013-12-30T14:23:57.423",
          "providedElsewhere": false,
          "dataElement": "eMyVanycQSC",
          "value": "2018-02-07"
        },
        {
          "createdAt": "2013-12-30T14:23:57.382",
          "updatedAt": "2013-12-30T14:23:57.382",
          "providedElsewhere": false,
          "dataElement": "oZg33kd9taw",
          "value": "Male"
        }
      ],
      "notes": [],
      "followup": false
    }
  ]
}
CSV

La réponse CSV peut ressembler à ce qui suit:

event,status,program,programStage,enrollment,orgUnit,occurredAt,scheduledAt,geometry,latitude,longitude,followUp,deleted,createdAt,createdAtClient,updatedAt,updatedAtClient,completedBy,completedAt,updatedBy,attributeOptionCombo,attributeCategoryOptions,assignedUser,dataElement,value,providedElsewhere,storedByDataValue,updatedAtDataValue,createdAtDataValue
A7rzcnZTe2T,ACTIVE,eBAyeGv0exc,Zj7UnCAulEk,RiLEKhWHlxZ,DwpbWkiqjMy,2023-02-12T23:00:00Z,2023-02-12T23:00:00Z,"POINT (-11.468912037323042 7.515913998868316)",7.515913998868316,-11.468912037323042,false,false,2017-09-08T19:40:22Z,,2017-09-08T19:40:22Z,,,,,HllvX50cXC0,xYerKDKCefk,,F3ogKBuviRA,"[-11.4880220438585,7.50978830548003]",false,,2016-12-06T17:22:34.438Z,2016-12-06T17:22:34.438Z
A7rzcnZTe2T,ACTIVE,eBAyeGv0exc,Zj7UnCAulEk,RiLEKhWHlxZ,DwpbWkiqjMy,2023-02-12T23:00:00Z,2023-02-12T23:00:00Z,"POINT (-11.468912037323042 7.515913998868316)",7.515913998868316,-11.468912037323042,false,false,2017-09-08T19:40:22Z,,2017-09-08T19:40:22Z,,,,,HllvX50cXC0,xYerKDKCefk,,eMyVanycQSC,2018-02-07,false,,2013-12-30T13:23:57.423Z,2013-12-30T13:23:57.423Z
A7rzcnZTe2T,ACTIVE,eBAyeGv0exc,Zj7UnCAulEk,RiLEKhWHlxZ,DwpbWkiqjMy,2023-02-12T23:00:00Z,2023-02-12T23:00:00Z,"POINT (-11.468912037323042 7.515913998868316)",7.515913998868316,-11.468912037323042,false,false,2017-09-08T19:40:22Z,,2017-09-08T19:40:22Z,,,,,HllvX50cXC0,xYerKDKCefk,,msodh3rEMJa,2018-02-13,false,,2013-12-30T13:23:57.467Z,2013-12-30T13:23:57.467Z

Point d'extrémité d'objet unique d'événements GET /api/tracker/events/{uid}

Le but de ce point d'extrémité est de récupérer un événement en se basant sur son UID.

Request syntax

GET /api/tracker/events/{uid}?fields={fields}

Paramètre de requête Type Valeurs autorisées Description
uid String uid Renvoie l'événement disposant de l'uid spécifié
champs String Tout filtre de champ valide (par défaut *,!relationships) Inclut les sous-objets spécifiés dans la réponse
Example requests

Une requête pour un événement :

GET /api/tracker/events/rgWr86qs0sI
Event response example

The API supports CSV and JSON response for GET /api/tracker/events/{uid}

JSON
{
  "event": "rgWr86qs0sI",
  "status": "ACTIVE",
  "program": "kla3mAPgvCH",
  "programStage": "aNLq9ZYoy9W",
  "enrollment": "Lo3SHzCnMSm",
  "orgUnit": "DiszpKrYNg8",
  "occurredAt": "2024-10-12T00:00:00.000",
  "followUp": false,
  "deleted": false,
  "createdAt": "2018-10-20T12:09:19.492",
  "createdAtClient": "2017-10-20T12:09:19.492",
  "updatedAt": "2018-10-20T12:09:19.492",
  "attributeOptionCombo": "amw2rQP6r6M",
  "attributeCategoryOptions": "RkbOhHwiOgW",
  "dataValues": [
    {
      "createdAt": "2015-10-20T12:09:19.640",
      "updatedAt": "2015-10-20T12:09:19.640",
      "providedElsewhere": false,
      "dataElement": "HyJL2Lt37jN",
      "value": "12"
    }
  ],
  "notes": [],
  "followup": false
}
CSV

The response will be the same as the collection endpoint but referring to a single event, although it might have multiple rows for each data element value.

Event data value change logs

GET /api/tracker/events/{uid}/changeLogs

This endpoint retrieves change logs for the data values of a specific event. It returns a list of all event data values and event fields (occurredAt, scheduledAt, and geometry) that have changed over time for the specified event.

Paramètre de requête Type Valeurs autorisées
path /{uid} Chaîne Event UID.
order Chaîne Field and sort direction pair in the format field:sortDirection.

Change logs are ordered by newest (creation date in descending order) by default, when no order parameter is provided.

Example: createdAt:desc

field is case-sensitive. Valid sortDirection values are asc and desc. sortDirection is case-insensitive and defaults to asc for fields without explicit sortDirection. Supported fields are createdAt, change and username, only one at a time.
filter Chaîne Colon-separated field name with the eq operator and value in the format field:eq:value.

Example: dataElement:eq:w75KJ2mc4zz

Filtering is supported for field, dataElement and username fields, one at a time. Only the eq (equals) operator is supported.
Event data value change logs response example

An example of a JSON response:

{
   "pager":{
      "page":1,
      "pageSize":10
   },
   "changeLogs":[
      {
         "createdBy":{
            "uid":"AIK2aQOJIbj",
            "username":"tracker",
            "firstName":"Tracker demo",
            "surname":"User"
         },
         "createdAt":"2024-06-20T15:43:36.342",
         "type":"DELETE",
         "change":{
            "dataValue":{
               "dataElement":"UXz7xuGCEhU",
               "previousValue":"12"
            }
         }
      },
      {
         "createdBy":{
            "uid":"AIK2aQOJIbj",
            "username":"tracker",
            "firstName":"Tracker demo",
            "surname":"User"
         },
         "createdAt":"2024-06-20T15:43:27.175",
         "type":"CREATE",
         "change":{
            "dataValue":{
               "dataElement":"UXz7xuGCEhU",
               "currentValue":"12"
            }
         }
      },
      {
         "createdBy":{
            "uid":"AIK2aQOJIbj",
            "username":"tracker",
            "firstName":"Tracker demo",
            "surname":"User"
         },
         "createdAt":"2024-06-20T14:51:16.433",
         "type":"UPDATE",
         "change":{
            "dataValue":{
               "dataElement":"bx6fsa0t90x",
               "previousValue":"true",
               "currentValue":"false"
            }
         }
      }
   ]
}

The change log type can be CREATE, UPDATE, or DELETE. CREATE and DELETE will always hold a single value: the former shows the current value, and the latter shows the value that was deleted. UPDATE will hold two values: the previous and the current.

More on change log configuration here

Relations

GET /api/tracker/relationships

Les relations sont des liens entre deux entités dans le Tracker. Ces entités peuvent être des entités suivies, des inscriptions et des événements.

Le but de ce point d'extrémité est de récupérer les relations entre les objets.

Contrairement aux autres points d'extrémité d'objets suivis, les relations n'exposent qu'un seul point d'extrémité :

GET /api/tracker/relationships?[trackedEntity={trackedEntityUid}|enrollment={enrollmentUid}|event={eventUid}]&fields=[fields]

Request parameters

Paramètre de requête Type Valeurs autorisées Description
trackedEntity Chaîne uid Identifiant d'une entité suivie
enrollment Chaîne uid Identifiant d'une inscription
event Chaîne uid Identifiant d'un événement
champs Chaîne Tout filtre de champ valide (par défaut relationship,relationshipType,createdAtClient,from[trackedEntity[trackedEntity],enrollment[enrollment],event[event]],to[trackedEntity[trackedEntity],enrollment[enrollment],event[event]]) Inclut les sous-objets spécifiés dans la réponse
order Chaîne Liste séparée par des virgules de paires de noms de propriétés, d'attributs ou d'UID et de directions de tri au format propName:sortDirection. Champs pris en charge : createdAt, createdAtClient.
includeDeleted Booléen true, false détermine s'il faut inclure dans le résultat de votre requête, des éléments supprimés mais pas définitivement

Les règles suivantes s'appliquent aux paramètres de requête.

Only one parameter among trackedEntity, enrollment, event can be passed.

Note

Using trackedEntity, enrollment or event params, will return any relationship where the trackedEntity, enrollment or event is part of the relationship (either from or to). As long as the user has access to it.

Example response

{
  "pager": {
    "page": 1,
    "pageSize": 2
  },
  "relationships": [
    {
      "relationship": "oGtgtJpp6fG",
      "relationshipType": "Mv8R4MPcNcX",
      "from": {
        "trackedEntity": {
          "trackedEntity": "neR4cmMY22o"
        }
      },
      "to": {
        "trackedEntity": {
          "trackedEntity": "DsSlC54GNXy"
        }
      }
    },
    {
      "relationship": "SSfIicJKbh5",
      "relationshipType": "Mv8R4MPcNcX",
      "from": {
        "trackedEntity": {
          "trackedEntity": "neR4cmMY22o"
        }
      },
      "to": {
        "trackedEntity": {
          "trackedEntity": "rEYUGH97Ssd"
        }
      }
    }
  ]
}

Tracker access control

Le Tracker dispose de quelques concepts en ce qui concerne le contrôle d'accès, tels que le partage, les champs d'application des unités d'organisation, la propriété et les niveaux d'accès. Les sections suivantes fournissent une brève introduction aux différents sujets.

Metadata sharing

Le paramètre de partage est une fonctionnalité standard de DHIS2 qui s'applique aux métadonnées/données du Tracker et de l'Agrégé, ainsi qu'aux tableaux de bord et aux éléments de visualisation. Au cœur du partage se trouve la possibilité de définir qui peut voir/faire quoi. En général, il existe cinq configurations de partage possibles : aucun accès, lecture des métadonnées, écriture des métadonnées, lecture des données et écriture des données. Ces configurations d'accès peuvent être accordées au niveau de l'utilisateur et/ou du groupe d'utilisateurs (pour plus de flexibilité). En ce qui concerne le Tracker, les métadonnées suivantes et leur configuration de partage sont d'une importance particulière : Élément de données, option de catégorie, programme, étape de programme, type d'entité suivie, attribut d'entité suivie, ainsi que les tableaux de bord et les éléments de tableau de bord liés au Tracker.

Sharing settings are enforced during Tracker data import/export. Data read/write access is needed to read and write respectively. Similarly, if a user is expected to modify metadata, it is essential to grant metadata write access.

One critical point with Tracker data is the need to have a holistic approach. For example, a user won’t be able to see the Data Element value by having read access to just the Data Element. The user needs to have data read to access the parent Program Stage and Program where this Data Element belongs. This works the same way as for category option combinations. In Tracker, events and enrollments are associated with an AttributeOptionCombo, which is composed of multiple Category Options. To read an event or enrollment, a user must have data read access to all Category Options and their corresponding Categories that make up the AttributeOptionCombo of that object. If the user lacks access to even one of the required Category Options or Categories, they will not have access to the entire event or enrollment..

Lorsqu'il s'agit d'accéder aux données d'inscription, il est essentiel d'avoir d'abord accès à l'entité suivie. L'accès à une entité suivie est contrôlé par le partage des paramètres du programme, du type d'entité suivie et de l'attribut d'entité suivie. Une fois que l'on a accédé à l'inscription, il est possible d'accéder aux données d'événement, là encore en fonction de l'étape du programme et des paramètres de partage des éléments de données.

Un autre point essentiel à prendre en considération est la manière de définir l'accès aux différentes étapes d'un programme. Il peut arriver que nous devions accorder l'accès à une étape spécifique - par exemple, « Résultat de laboratoire » - à un groupe d'utilisateurs spécifique (techniciens de laboratoire). Dans ce cas, nous pouvons accorder un accès en écriture aux données de l'étape « Résultat du laboratoire », probablement un accès en lecture à une ou plusieurs étapes au cas où nous voudrions que les techniciens de laboratoire lisent d'autres résultats médicaux, ou aucun accès si nous pensons qu'il n'est pas nécessaire qu'ils consultent des données autres que celles relatives au laboratoire.

En résumé, DHIS2 dispose d'un paramètre de partage très précis que nous pouvons utiliser pour implémenter les mécanismes de contrôle d'accès au niveau des données et des métadonnées. Ces paramètres de partage peuvent être appliqués directement au niveau de l'utilisateur ou du groupe d'utilisateurs. Le paramètre de partage à appliquer dépend du cas d'utilisation.

Organisation unit scopes

Organisation units are one of the most fundamental objects in DHIS2. They define a universe under which a user is allowed to record and/or read data. There are three types of organisation units that can be assigned to a user. These are data capture, data view (not used in tracker), and tracker search. As the name implies, these organisation units define a scope under which a user is allowed to conduct the respective operations. A user can search for data in their search scope and capture scope organisation units.

Cependant, pour mieux affiner le champ d'application, DHIS2 Tracker introduit un concept que nous appelons OrganisationUnitSelectionMode (mode de sélection de l'unité d'organisation). Ce mode est souvent utilisé lors de l'exportation d'objets Tracker. Par exemple, si un utilisateur dispose d'un champ de recherche particulier, cela signifie-t-il que nous devons utiliser ce champ chaque fois que l'utilisateur tente de rechercher un objet Tracker, d'inscription ou d'événement ? Ou bien l'utilisateur souhaite-t-il limiter la recherche à l'unité d'organisation sélectionnée, ou à l'ensemble de l'unité d'organisation de saisie, etc.

Les utilisateurs peuvent affiner un champ d'application en transmettant une valeur spécifique de orgUnitMode (mode d'unité d'organisation) dans leur requête API:

/api/tracker/trackedEntities?orgUnit=UID&orgUnitMode=specific_organisation_unit_selection_mode

Actuellement, six modes de sélection sont disponibles: SÉLECTIONNÉ, SUBORDONNÉES, DESCENDANTS, SAISIE, ACCESSIBLE et TOUS.

Mode Description
SELECTED Specified organisation units.
CHILDREN Specified organisation unit including immediate children, i.e. organisation units at the immediate level below.
DESCENDANTS Specified organisation unit and all organisation units in the sub-hierarchy, i.e. at all organisation unit levels in the sub-hierarchy below the specified organisation units.
CAPTURE The data capture organisation units associated with the current user and all organisation units in the sub-hierarchy.
ACCESSIBLE The tracker search organisation units associated with the current user and all organisation units in the sub-hierarchy. This includes everything visible to the user, including open and audited programs within its search scope, as well as data in protected and closed programs within the user's capture scope. If a user lacks search organisation units, the system defaults to capture scope, ensuring that the user always has access to at least one universe. The capture scope, being mandatory, serves as a foundational element in guaranteeing a data environment for the user.
ALL All organisation units in the system. This mode is reserved for authorized users, specifically those with the authority ALL (super users). Users with the authority F_TRACKED_ENTITY_INSTANCE_SEARCH_IN_ALL_ORGUNITS can also search system-wide but need sharing access to the returned program, program stage, and/or tracked entity type. Non-authorized users are not permitted to search using this scope.

The first three modes, SELECTED, CHILDREN and DESCENDANTS, expect an organisation unit to be supplied in the request, while the last three, CAPTURE, ACCESSIBLE and ALL do not.

The organisation unit mode will be one of the ones listed above when it is explicitly provided in the API request. Since it is not a mandatory paramter, when not specified, the default value will be SELECTED if an organisation unit is present, and ACCESSIBLE if not.

Il n'est pas judicieux de transmettre ces modes lors des opérations d'importation du Tracker. En effet, lors de l'écriture des données Tracker, chaque objet doit être rattaché à une unité d'organisation spécifique. Le système vérifiera alors si chacune des unités d'organisation mentionnées relève du champ d'application de la SAISIE. Si ce n'est pas le cas, le système rejettera simplement l'opération d'écriture.

Note that there are four type of organisation unit associations relevant for tracker objects. A Tracked Entity has an organisation unit, commonly referred to as the Registration Organisation unit. Enrollments have an organisation unit associated with them. Events also have an organisation unit associated with them. There is also an Owner organisation unit for a tracker program combination.

Lors de la récupération des objets Tracker, selon le contexte, le champ d'application de l'unité d'organisation est appliquée à l'une des quatre associations d'unités d'organisation ci-dessus.

For example, when retrieving Tracked Entities without the context of a program, the organisation unit scope is applied to the registration organisation unit of the Tracked Entity. Whereas, when retrieving Tracked Entities, including specific program data, the organisation unit scope is applied to the owner organisation unit.

Tracker Program Ownership

Tracker Ownership, introduced in DHIS2 2.30, defines an organisation unit association for a TrackedEntity - Program combination. We call this the Owner (or Owning) Organisation unit of a TrackedEntity in the context of a Program. The Owner organisation unit is used to decide access privileges when reading and writing tracker data related to a program. This, along with the Program's Access Level configuration, decides the access behavior for Program-related data (Enrollments and Events). A user can access a TrackedEntity's Program data if the corresponding Owner OrganisationUnit for that TrackedEntity-Program combination falls under the user's organisation unit scope (Search/Capture). For Programs that are configured with access level OPEN or AUDITED , the Owner OrganisationUnit has to be in the user's search scope. For Programs that are configured with access level PROTECTED or CLOSED , the Owner OrganisationUnit has to be in the user's capture scope to be able to access the corresponding program data for the specific tracked entity. Irrespective of the program access level, to access Tracker objects, the requested organisation unit must always be within either the user's search scope or capture scope. A user cannot request objects outside these two scopes unless they are using the organisation unit mode ALL and have sufficient privileges to use that mode.

When requesting tracked entities without specifying a program, the response will include only tracked entities that satisfy metadata sharing settings and one of the following criteria:

  • The tracked entity is enrolled in at least one program the user has data access to, and the user has access to the owner organisation unit.
  • The tracked entity is not enrolled in any program the user has data access to, but the user has access to the tracked entity registering organisation unit.

Tracker Ownership Override: Break the Glass

It is possible to temporarily override the ownership privilege for a program that is configured with an access level of PROTECTED. Any user with the org unit owner within their search scope, can temporarily access the program-related data by providing a reason for accessing it.

This act of temporarily gaining access is termed breaking the glass. Currently, temporary access is granted for 3 hours. DHIS2 audit breaking the glass along with the reason specified by the user. This information is also stored in the database, but only if the tracked entity type is configured to allow auditing, which is disabled by default.

It is not possible to gain temporary access to a program that has been configured with an access level of CLOSED.

To break the glass for a TrackedEntity-Program combination, the following POST request can be used:

/api/tracker/ownership/override?trackedEntity=DiszpKrYNg8&program=eBAyeGv0exc&reason=patient+showed+up+for+emergency+care

Tracker Ownership Transfer

Il est possible de transférer la propriété d'une combinaison Entité suivie - Programme d'une unité d'organisation à une autre. Cela peut s'avérer utile en cas de transfert de patients ou de migration. Seul un utilisateur disposant d'un accès à la propriété (ou d'un accès temporaire en brisant la glace) peut transférer la propriété. Pour transférer la propriété d'une combinaison Entité suivie - Programme à une autre unité d'organisation, la requête "PUT" suivante peut être utilisée :

/api/tracker/ownership/transfer?trackedEntity=DiszpKrYNg8&program=eBAyeGv0exc&ou=EJNxP3WreNP

Access levels

Tracker data is handled with an extra level of protection. In addition to the standard feature of metadata and data protection through sharing settings, Tracker data are shielded with additional access level protection mechanisms. Currently, there are four access levels that can be configured for a Program: Open, Audited, Protected, and Closed.

Ces niveaux d'accès ne sont déclenchés que lorsque les utilisateurs tentent d'interagir avec les données du programme, c'est-à-dire les données relatives aux inscriptions et aux événements. La configuration des différents niveaux d'accès du programme correspond à un degré d'ouverture (ou de fermeture) des données du programme. Notez que tous les autres paramètres de partage sont toujours respectés et que le niveau d'accès n'est qu'une couche supplémentaire de contrôle d'accès. Voici une brève description des quatre niveaux d'accès qui peuvent être configurés pour un programme.

Ouvrir

Ce niveau d'accès est le moins restrictif des niveaux d'accès. Les utilisateurs peuvent accéder aux données d'un programme OUVERT et les modifier si l'unité d'organisation propriétaire fait partie du champ de recherche de l'utilisateur. Avec ce niveau d'accès, il est possible d'accéder à des données qui se trouvent hors du champ de saisie et de les modifier sans justification ni conséquence.

Audited

Il s'agit du même niveau d'accès que le niveau Ouvert. La différence est que le système ajoutera automatiquement une entrée dans le journal d'audit sur les données auxquelles l'utilisateur accède.

Protected

This access level is slightly more restricted. Data inside a PROTECTED program can only be accessed by users if the Owner organisation unit falls under the user's capture scope. However, a user who only has the Owner organisation unit in the search scope can gain temporary ownership by breaking the glass. The user has to provide a justification of why they are accessing the data at hand. The system will then put a log of both the justification and access audit and provide temporary access for 3 hours to the user. Note that when breaking the glass, the Owner Organisation Unit remains unchanged, and only the user who has broken the glass gains temporary access.

Closed

This is the most restricted access level. Data recorded under programs configured with access level CLOSED will not be accessible if the Owner Organisation Unit does not fall within the user's capture scope. It is also not possible to break the glass or gain temporary ownership in this configuration. Note that it is still possible to transfer the ownership to another organisation unit. Only a user who has access to the data can transfer the ownership of a TrackedEntity-Program combination to another Organisation Unit. If ownership is transferred, the Owner Organisation Unit is updated. trackedEntities

Listes de travail

Working lists allow users to efficiently organize their workflow by saving filters and sorting preferences for tracked entities, enrollments, and events. Each type of working list—tracked entities, enrollments, and events—has a dedicated API for management.

Working lists are metadata, making them shareable and subject to the same sharing patterns as other metadata. When using the /api/sharing endpoint, the type parameter should be set to the name of the working list API. For example, use trackedEntityInstanceFilter for tracked entity working lists.

Since working lists are metadata refer to metadata on how to create, update and delete metadata. The following sections describe the payloads of each of the working lists endpoints.

Tracked entity working lists

Create, update and delete tracked entity working lists using

/api/trackedEntityInstanceFilters

Payload

Tableau : Charge

Propriété Description Exemple
name Nom de la liste de tâches. Obligatoire.
description Il s'agit d'une description de la liste de tâches.
sortOrder The sort order of the working list.
style Objet contenant un style css. {"color": "blue", "icon": "fa fa-calendar"}
program Objet contenant l'identifiant du programme. Obligatoire. { "id" : "uy2gU8kTjF"}
entityQueryCriteria An object representing various possible filtering values. See Entity Query Criteria definition table below.
eventFilters Une liste de filtres d'événements. Voir le tableau de définition des filtres d'événements ci-dessous. [{"programStage": "eaDH9089uMp", "eventStatus": "OVERDUE", "eventCreatedPeriod": {"periodFrom": -15, "periodTo": 15}}]
Entity query criteria definition
Propriété Description Exemple
attributeValueFilters A list of attributeValueFilters. This is used to specify filters for attribute values when listing tracked entities "attributeValueFilters":[{"attribute": "abcAttributeUid","le": "20","ge": "10","lt": "20","gt": "10","in": ["India", "Norway"],"like": "abc","sw": "abc","ew": "abc","dateFilter": {"startDate": "2014-05-01","endDate": "2019-03-20","startBuffer": -5,"endBuffer": 5,"period": "LAST_WEEK","type": "RELATIVE"}}]
enrollmentStatus The tracked entities enrollment status. Can be none(any enrollmentstatus) or ACTIVE, COMPLETED, CANCELLED
followUp When this parameter is true, the working list only returns tracked entities that have an enrollment with followUp=true.
organisationUnit Permet de spécifier l'identifiant de l'unité d'organisation {"organisationUnit": "a3kGcGDCuk7"}
ouMode To specify the organisation unit selection mode. Options are SELECTED, CHILDREN, DESCENDANTS, ACCESSIBLE, CAPTURE, ALL "ouMode": "SELECTED"
assignedUserMode To specify the assigned user selection mode for events. Options are CURRENT, PROVIDED, NONE, ANY. See table below to understand what each value indicates. If PROVIDED (or null), non-empty assignedUsers in the payload will be considered. "assignedUserMode": "PROVIDED"
assignedUser To specify a list of assigned users for events. To be used along with PROVIDED assignedUserMode above. "assignedUsers": ["a3kGcGDCuk7", "a3kGcGDCuk8"]
displayColumnOrder Permet de spécifier l'ordre de sortie des colonnes "displayOrderColumns": ["enrollmentDate", "program"]
order To specify ordering/sorting of fields and its directions in comma separated values. A single item in order is of the form "orderDimension:direction". Note: Supported orderDimensions are trackedEntity, created, createdAt, createdAtClient, updatedAt, updatedAtClient, enrolledAt, inactive and the tracked entity attributes "order":"a3kGcGDCuk6:desc"
programStage To specify a programStage uid to filter on. tracked entities will be filtered based on presence of enrollment in the specified program stage. "programStage":"a3kGcGDCuk6"
TrackedEntityType To specify a trackedEntityType filter tracked entities on. {"trackedEntityType":"a3kGcGDCuk6"}
trackedEntities To specify a list of tracked entities to use when querying tracked entities. "trackedEntities":["a3kGcGDCuk6","b4jGcGDCuk7"]
enrollmentCreatedDate DateFilterPeriod object date filtering based on enrollment created date. "enrollmentCreatedDate": { "period": "LAST_WEEK", "type": "RELATIVE" }
enrollmentIncidentDate DateFilterPeriod object date filtering based on enrollment incident date. "enrollmentIncidentDate": { "startDate": "2014-05-01", "endDate": "2019-03-20", "startBuffer": -5, "endBuffer": 5, "period": "LAST_WEEK", "type": "RELATIVE" }
eventStatus The event status. Options are ACTIVE, COMPLETED, VISITED, SCHEDULE, OVERDUE, SKIPPED and VISITED "status":"VISITED"
eventDate DateFilterPeriod object date filtering based on event date. "eventDate": {"startBuffer": -5,"endBuffer": 5, "type": "RELATIVE" }
lastUpdatedDate DateFilterPeriod object date filtering based on last updated date. "lastUpdatedDate": {"startDate": "2014-05-01", "endDate": "2019-03-20", "type": "ABSOLUTE" }

Tableau : Définition des filtres d'événements

Propriété Description Exemple
programStage Which programStage the tracked entity needs an event in to be returned. "eaDH9089uMp"
eventStatus The events status. Can be none(any event status) or ACTIVE, COMPLETED, SCHEDULE, OVERDUE ACTIVE
eventCreatedPeriod FilterPeriod object containing a period in which the event must be created. See Period definition below. { "periodFrom": -15, "periodTo": 15}
assignedUserMode To specify the assigned user selection mode for events. Options are CURRENT (events assigned to current user), PROVIDED (events assigned to users provided in "assignedUsers" list), NONE (events assigned to no one) , ANY (events assigned to anyone). If PROVIDED (or null), non-empty assignedUsers in the payload will be considered. "assignedUserMode": "PROVIDED"
assignedUser To specify a list of assigned users for events. To be used along with PROVIDED assignedUserMode above. "assignedUsers": ["a3kGcGDCuk7", "a3kGcGDCuk8"]
Period filter definition
Propriété Description Exemple
periodFrom Nombre de jours à partir du jour actuel. Il peut s'agir d'un nombre entier positif ou négatif. -15
periodTo Nombre de jours à partir du jour actuel. Doit être supérieur à periodFrom. Peut être un nombre entier positif ou négatif. 15

Query request parameters

Tableau : Paramètres de requête pour les filtres d'instances d'entités suivies

Paramètre de requête Description
program Identifiant du programme. Il limite le filtrage au programme donné.

Program stage working lists

Create, update and delete program stage working lists using

/api/programStageWorkingLists

Payload

Tableau : Charge

Valeurs de la charge Description Exemple
name Nom de la liste de tâches. Obligatoire.
description Il s'agit d'une description de la liste de tâches.
program Objet contenant l'identifiant du programme. Obligatoire. {"id" : "uy2gU8kTjF"}
programStage Objet contenant l'identifiant de l'étape de programme. Obligatoire. {"id" : "oRySG82BKE6"}
programStageQueryCriteria (Critères de requête de l'étape de programme) An object representing various possible filtering values. See Program Stage Query Criteria definition table below.

Tableau : Critères de requête de l'étape de programme

Valeurs des critères Description Exemple
eventStatus The event status. Options are ACTIVE, COMPLETED, VISITED, SCHEDULE, OVERDUE, SKIPPED and VISITED "status":"VISITED"
Évènement créé à DateFilterPeriod object filtering based on the event creation date. {"type":"ABSOLUTE","startDate":"2020-03-01","endDate":"2022-12-30"}
eventOccurredAt DateFilterPeriod object filtering based on the event occurred date. {"type":"RELATIVE","period":"TODAY"}
eventScheduledAt DateFilterPeriod object filtering based on the event scheduled date. {"type":"RELATIVE","period":"TODAY"}
enrollmentStatus Any valid EnrollmentStatus. Options are ACTIVE, COMPLETED and CANCELLED. "enrollmentStatus": "COMPLETED"
followUp Indique s'il faut filtrer ou non les inscriptions marquées pour le suivi "followUp":true
inscrit à DateFilterPeriod object filtering based on the event enrollment date. "enrolledAt": {"type":"RELATIVE","period":"THIS_MONTH"}
Inscription effectué à DateFilterPeriod object filtering based on the event occurred date. {"type":"RELATIVE","period":"THIS_MONTH"}
orgUnit Un UID d'unité d'organisation valide "orgUnit": "Rp268JB6Ne4"
ouMode Un mode de sélection d'unités d'organisation valide "ouMode": "SELECTED"
assignedUserMode A valid user selection mode for events. Options are CURRENT, PROVIDED, NONE, ANY and ALL. If PROVIDED (or null), non-empty assignedUsers in the payload will be expected. "Mode d'utilisateur assigné" : "FOURNI"
assignedUser A list of assigned users for events. To be used along with PROVIDED assignedUserMode above. "Utilisateurs assignés":["DXyJmlo9rge"]
order Liste des champs et de leurs directions en valeurs séparées par des virgules, les résultats seront triés en fonction de cette liste. Un seul élément dans l'ordre est de la forme « orderDimension:direction ». "ordre": "w75KJ2mc4zz:asc"
displayColumnOrder Ordre de sortie des colonnes "Ordre de sortie des colonnes":["w75KJ2mc4zz","zDhUuAYrxNC"]
dataFilters Une liste d'éléments contenant les filtres à utiliser lors de requêtes d'événements "Filtres de données":[{"dataItem": "GXNUsigphqK","ge": "10","le": "20"}]
attributeValueFilters Une liste de filtres de valeurs d'attribut. Elle est utilisée pour définir des filtres pour les valeurs d'attributs lors de l'établissement de la liste des entités suivies. "Filtres de valeurs d'attribut":[{"attribute": "ruQQnf6rswq","eq": "15"}]

See an example payload below.

{
  "name": "Test WL",
  "description": "Test WL definition",
  "program": {
    "id": "uy2gU8kT1jF"
  },
  "programStage": {
    "id": "oRySG82BKE6"
  },
  "programStageQueryCriteria": {
    "eventStatus": "VISITED",
    "eventCreatedAt": {
      "type": "ABSOLUTE",
      "startDate": "2020-03-01",
      "endDate": "2022-12-30"
    },
    "eventScheduledAt": {
      "type": "RELATIVE",
      "period": "TODAY"
    },
    "enrollmentStatus": "COMPLETED",
    "followUp": true,
    "enrolledAt": {
      "type": "RELATIVE",
      "period": "THIS_MONTH"
    },
    "enrollmentOccurredAt": {
      "type": "RELATIVE",
      "period": "THIS_MONTH"
    },
    "orgUnit": "Rp268JB6Ne4",
    "ouMode": "SELECTED",
    "assignedUserMode": "PROVIDED",
    "assignedUsers": [
      "DXyJmlo9rge"
    ],
    "order": "w75KJ2mc4zz:asc",
    "displayColumnOrder": [
      "w75KJ2mc4zz",
      "zDhUuAYrxNC"
    ],
    "dataFilters": [
      {
        "dataItem": "GXNUsigphqK",
        "ge": "10",
        "le": "20"
      }
    ],
    "attributeValueFilters": [
      {
        "attribute": "ruQQnf6rswq",
        "eq": "15"
      }
    ]
  }
}

Event working lists

Create, update and delete event working lists using the following endpoint.

/api/eventFilters

Payload

Tableau : Charge

Propriété Description Exemple
name Name of the working list. "name":"My working list"
description Il s'agit d'une description de la liste de tâches. "description":"for listing all events assigned to me".
program L'uid du programme. "program" : "a3kGcGDCuk6"
programStage L'uid de l'étape de programme. "programStage" : "a3kGcGDCuk6"
eventQueryCriteria Objet contenant des paramètres pour les requêtes, le tri et le filtrage des événements. "eventQueryCriteria": { "organisationUnit":"a3kGcGDCuk6", "status": "COMPLETED", "createdDate": { "from": "2014-05-01", "to": "2019-03-20" }, "dataElements": ["a3kGcGDCuk6:EQ:1", "a3kGcGDCuk6"], "filters": ["a3kGcGDCuk6:EQ:1"], "programStatus": "ACTIVE", "ouMode": "SELECTED", "assignedUserMode": "PROVIDED", "assignedUsers" : ["a3kGcGDCuk7", "a3kGcGDCuk8"], "followUp": false, "events": ["a3kGcGDCuk7", "a3kGcGDCuk8"], "fields": "eventDate,dueDate", "order": "dueDate:asc,createdDate:desc" }
Event query criteria definition
Propriété Description Exemple
followUp Used to filter events based on enrollment followUp flag. Options are true, false. "followUp": true
organisationUnit Permet de spécifier l'identifiant de l'unité d'organisation "organisationUnit": "a3kGcGDCuk7"
ouMode To specify the OU selection mode. Options are SELECTED, CHILDREN, DESCENDANTS, ACCESSIBLE, CAPTURE, ALL "ouMode": "SELECTED"
assignedUserMode To specify the assigned user selection mode for events. Options are CURRENT, PROVIDED, NONE, ANY. See table below to understand what each value indicates. If PROVIDED (or null), non-empty assignedUsers in the payload will be considered. "assignedUserMode": PROVIDED
assignedUser Permet de spécifier une liste d'utilisateurs assignés à des événements. À utiliser avec le mode d'utilisateur assigné PROVIDED ci-dessus. "assignedUsers": ["a3kGcGDCuk7", "a3kGcGDCuk8"]
displayColumnOrder Permet de spécifier l'ordre de sortie des colonnes "displayOrderColumns": ["eventDate", "dueDate", "program"]
order To specify ordering/sorting of fields and its directions in comma separated values. A single item in order is of the form "dataItem:direction". "order"="a3kGcGDCuk6:desc,eventDate:asc"
dataFilters Permet de spécifier les filtres à appliquer lors de l'établissement de la liste des événements "dataFilters"=[{ "dataItem": "abcDataElementUid", "le": "20", "ge": "10", "lt": "20", "gt": "10", "in": ["India", "Norway"], "like": "abc", "dateFilter": { "startDate": "2014-05-01", "endDate": "2019-03-20", "startBuffer": -5, "endBuffer": 5, "period": "LAST_WEEK", "type": "RELATIVE" } }]
status Tout statut d'événement valide "eventStatus": "COMPLETED"
events permet de spécifier une liste d'événements "events"=["a3kGcGDCuk6"]
completedDate DateFilterPeriod object date filtering based on completed date. "completedDate": { "startDate": "2014-05-01", "endDate": "2019-03-20", "startBuffer": -5, "endBuffer": 5, "period": "LAST_WEEK", "type": "RELATIVE" }
eventDate DateFilterPeriod object date filtering based on event date. "eventDate": { "startBuffer": -5, "endBuffer": 5, "type": "RELATIVE" }
dueDate DateFilterPeriod object date filtering based on due date. "dueDate": { "period": "LAST_WEEK", "type": "RELATIVE" }
lastUpdatedDate DateFilterPeriod object date filtering based on last updated date. "lastUpdatedDate": { "startDate": "2014-05-01", "endDate": "2019-03-20", "type": "ABSOLUTE" }

See an example payload below.

{
  "name": "event working list",
  "program": "VBqh0ynB2wv",
  "eventQueryCriteria": {
    "eventDate": {
      "period": "LAST_WEEK",
      "type": "RELATIVE"
    },
    "dataFilters": [
      {
        "ge": "35",
        "le": "70",
        "dataItem": "qrur9Dvnyt5"
      }
    ],
    "assignedUserMode": "PROVIDED",
    "assignedUsers": [
      "CotVI2NX0rI",
      "xE7jOejl9FI"
    ],
    "status": "ACTIVE",
    "order": "occurredAt:desc",
    "displayColumnOrder": [
      "occurredAt",
      "status",
      "assignedUser",
      "qrur9Dvnyt5",
      "oZg33kd9taw"
    ]
  }
}

Common objects

Tableau : Définition de l'objet DateFilterPeriod

Propriété Description Exemple
type Specify whether the date period type is ABSOLUTE, RELATIVE "type" : "RELATIVE"
period Specify if a relative system defined period is to be used. Applicable only when type is RELATIVE. (see Relative Periods for supported relative periods) "period" : "THIS_WEEK"
startDate Absolute start date. Applicable only when type is ABSOLUTE "startDate":"2014-05-01"
endDate Absolute end date. Applicable only when type is ABSOLUTE "startDate":"2014-05-01"
startBuffer Relative custom start date. Applicable only when type is RELATIVE "startBuffer":-10
endBuffer Relative custom end date. Applicable only when type is RELATIVE "startDate":+10

Potential duplicates

Potential duplicates are records identified by the data deduplication feature as possibly being duplicates. Due to the nature of this feature, the API endpoint has certain restrictions. A potential duplicate represents a pair of records suspected to be duplicates.

To retrieve a list of potential duplicates, use the following endpoint:

GET /api/potentialDuplicates

The response payload for a potential duplicate looks like this.

{
  "created": "2024-06-04T10:11:29.110",
  "lastUpdated": "2024-06-04T10:11:29.110",
  "original": "<UID>",
  "duplicate": "<UID>",
  "status": "OPEN|INVALID|MERGED",
  "id": "<id>"
}

These are the parameters this endpoint accepts:

Paramètre de requête Description Type Valeurs autorisées
trackedEntities List of tracked entities Liste de chaînes (séparées par une virgule) existing tracked entity UIDs
status Statut de doublon potentiel chaîne OPEN, INVALID, MERGED, ALL

To inspect individual potential duplicate records, use the following endpoint:

GET /api/potentialDuplicates/<{id}

To create a new potential duplicate, use this endpoint:

POST /api/potentialDuplicates

The payload you provide must include the UIDs of the original and duplicate tracked entities. New potential duplicates are open by default.

{
  "original": "<UID>",
  "duplicate": "<UID>"
}
Code de statut Description
400 Input original or duplicate is null or has invalid uid
403 User do not have access to read original or duplicate TEs
404 TE not found
409 Pair of original and duplicate TEs already existing

To update the status of a potential duplicate, use the following endpoint:

PUT /api/potentialDuplicates/<id>
Paramètre de requête Description Type Valeurs autorisées
status Statut de doublon potentiel chaîne OPEN, INVALID
Code de statut Description
400 Vous ne pouvez pas mettre à jour un doublon potentiel en le faisant passer à MERGED. Pour ce faire, vous devez effectuer une requête de fusion.
400 Vous ne pouvez pas mettre à jour un doublon potentiel qui a déjà le statut MERGED.

Merging tracked entities

Tracked entities can be merged together if they are deemed viable. To initiate a merge, the first step is to define two tracked entities as a Potential Duplicate. The merge endpoint moves data from the duplicate tracked entity to the original tracked entity and deletes the remaining data of the duplicate.

To merge a Potential Duplicate, i.e. the two tracked entities the Potential Duplicate represents, use the following endpoint:

POST /api/potentialDuplicates/<id>/merge
Paramètre de requête Description Type Valeurs autorisées
mergeStrategy Stratégie à utiliser pour fusionner le doublon potentiel chaîne AUTO (par défaut) ou MANUAL

The endpoint accepts a single parameter, mergeStrategy, which determines the strategy used when merging. For the AUTO strategy, the server will attempt to merge the two tracked entities automatically without user input. This strategy only allows merging tracked entities without conflicting data (see examples below). The MANUAL strategy requires the user to send in a payload describing how the merge should be done. For examples and rules for each strategy, see their respective sections below.

Merge strategy AUTO

The automatic merge evaluates the mergability of the two tracked entities and merges them if they are deemed mergeable. The mergability is based on whether the two tracked entities have any conflicts. Conflicts refer to data that cannot be merged automatically. Examples of possible conflicts include:

  • The same attribute has different values in each tracked entity.
  • Both tracked entities are enrolled in the same program.
  • Tracked entities have different types.

If any conflict is encountered, an error message is returned to the user.

When no conflicts are found, all data in the duplicate that is not already in the original will be moved to the original. This includes attribute values, enrollments (including events), and relationships. After the merge completes, the duplicate is deleted and the Potential Duplicate is marked as MERGED. When requesting an automatic merge, a payload is not required and will be ignored.

Merge strategy MANUAL

The manual merge is suitable when there are resolvable conflicts or when not all the data needs to be moved during the merge. For example, if an attribute has different values in both tracked entities , the user can specify whether to keep the original value or move over the duplicate's value. Since the manual merge involves the user explicitly requesting to move data, there are some additional checks:

  • Relationship cannot be between the original and the duplicate (This results in an invalid self-referencing relationship)
  • Relationship cannot be of the same type and to the same object in both tracked entities (IE. between original and other, and duplicate and other; This would result in a duplicate relationship)

Il existe deux façons d'effectuer une fusion manuelle : Avec et sans charge.

When a manual merge is requested without a payload, we are telling the API to merge the two tracked entities without moving any data. In other words, we are just removing the duplicate and marking the potentialDuplicate MERGED. This might be valid in a lot of cases where the tracked entity was just created, but not enrolled for example.

Otherwise, if a manual merge is requested with a payload, the payload refers to what data should be moved from the duplicate to the original. The payload looks like this:

{
  "trackedEntityAttributes": ["B58KFJ45L9D"],
  "enrollments": ["F61SJ2DhINO"],
  "relationships": ["ETkkZVSNSVw"]
}

This payload contains three lists, one for each of the types of data that can be moved. trackedEntityAttributes is a list of uids for tracked entity attributes, enrollments is a list of uids for enrollments and relationships a list of uids for relationships. The uids in this payload have to refer to data that actually exists on the duplicate. There is no way to add new data or change data using the merge endpoint - Only moving data.

Additional information about merging

Currently it is not possible to merge tracked entities that are enrolled in the same program, due to the added complexity. A workaround is to manually remove the enrollments from one of the tracked entities before starting the merge.

All merging is based on data already persisted in the database, which means the current merging service is not validating that data again. This means if data was already invalid, it will not be reported during the merge. The only validation done in the service relates to relationships, as mentioned in the previous section.

Program notification template

The Program Notification Template allows you to create message templates that can be sent based on different types of events. The message and subject templates are translated into actual values and sent to the configured destination. Each program notification template is transformed into either a MessageConversation object or a ProgramMessage object, depending on whether the recipient is external or internal. These intermediate objects will contain only the translated message and subject text.

There are several configuration parameters in the Program Notification Template that are essential for the proper functioning of notifications. These parameters are explained in the table below.

POST /api/programNotificationTemplates
{
    "name": "Case notification",
    "notificationTrigger": "ENROLLMENT",
    "subjectTemplate": "Case notification V{org_unit_name}",
    "displaySubjectTemplate": "Case notification V{org_unit_name}",
    "notifyUsersInHierarchyOnly": false,
    "sendRepeatable": false,
    "notificationRecipient": "ORGANISATION_UNIT_CONTACT",
    "notifyParentOrganisationUnitOnly": false,
    "displayMessageTemplate": "Case notification A{h5FuguPFF2j}",
    "messageTemplate": "Case notification A{h5FuguPFF2j}",
    "deliveryChannels": [
        "EMAIL"
    ]
}

Tableau : Charge du Modèle de notification de programme

Champ Obligatoire Description Valeurs
name Oui Name of the Program Notification Template case-notification-alert
notificationTrigger Oui When notification should be triggered. Options are ENROLLMENT, COMPLETION, PROGRAM_RULE, SCHEDULED_DAYS_DUE_DATE ENROLLMENT
subjectTemplate Non Subject template string Case notification V{org_unit_name}
messageTemplate Oui Chaîne du modèle de message Case notification A{h5FuguPFF2j}
notificationRecipient Oui Who is going to receive notification. Options are USER_GROUP, ORGANISATION_UNIT_CONTACT, TRACKED_ENTITY_INSTANCE, USERS_AT_ORGANISATION_UNIT, DATA_ELEMENT, PROGRAM_ATTRIBUTE, WEB_HOOK USER_GROUP
deliveryChannels Non Which channel should be used for this notification. It can be either SMS, EMAIL, or HTTP SMS
sendRepeatable Non Détermine si la notification doit être envoyée plusieurs fois false

The WEB_HOOK notificationRecipient is used exclusively for sending HTTP POST requests to external systems. Ensure that the HTTP delivery channel is selected when using this option.

Retrieving and Deleting Program Notification Template

As program notification template is a type of metadata, you can create, update, and delete it just like other metadata.

Program Messages

The program message feature enables you to send messages to tracked entities, contact addresses associated with organisation units, phone numbers, and email addresses. Messages can be sent using the messages resource.

POST /api/messages

Sending program messages

Les messages de programme peuvent être envoyés à l'aide de deux canaux :

  • SMS (SMS)
  • Adresse électronique (EMAIL)

Recipients

Les messages de programme peuvent être envoyés à différents destinataires :

  • Tracked entity: The system will look up attributes of value type PHONE_NUMBER or EMAIL (depending on the specified delivery channels) and use the corresponding attribute values.
  • Organisation unit: The system will use the phone number or email information registered for the organisation unit.
  • List of phone numbers: The system will use the explicitly defined phone numbers.
  • List of email addresses: The system will use the explicitly defined email addresses.

Below is a sample JSON payload for sending messages using POST requests.

{
  "programMessages": [{
    "recipients": {
      "trackedEntity": {
        "id": "UN810PwyVYO"
      },
      "organisationUnit": {
        "id": "Rp268JB6Ne4"
      },
      "phoneNumbers": [
        "55512345",
        "55545678"
      ],
      "emailAddresses": [
        "johndoe@mail.com",
        "markdoe@mail.com"
      ]
    },
    "enrollment": {
      "id": "f3rg8gFag8j"
    },
    "event": {
      "id": "pSllsjpfLH2"
    },
    "deliveryChannels": [
      "SMS", "EMAIL"
    ],
    "notificationTemplate": "Zp268JB6Ne5",
    "subject": "Outbreak alert",
    "text": "An outbreak has been detected",
    "storeCopy": false
  }]
}

Tableau : Charge du message de programme

Champ Obligatoire Description Valeurs
recipients² Oui Recipients of the program message. At least one recipient must be specified. Can be trackedEntity, organisationUnit, an array of phoneNumbers or an array of emailAddresses.
enrollment Non Enrollment which ProgramMessage is attached to. ID de l'inscription.
event Non Event which ProgramMessage is attached to. ID de l'événement.
deliveryChannels Oui Tableau des canaux d'envoi de messages. SMS, EMAIL
notificationTemplate Non ProgramNotificationTemplate UID is used to cross-check which program message belongs to which notification template. Text.
subject Non L'objet du message. Ne s'applique pas au canal SMS. Text.
text Oui Le texte du message. Text.
storeCopy Non Indique si une copie du message doit être stockée dans DHIS2. false, true

Querying program messages

The program message API supports querying messages using specific request parameters.

GET /api/messages

To retrieve a specific message.

GET /api/messages/scheduled/sent?enrollment={uid}
GET /api/messages/scheduled/sent?event={uid}

To retrieve a specific message.

GET /api/messages/{uid}

To delete a message.

DELETE /api/messages/{uid}

The program message API supports querying messages using specific request parameters. You can filter messages based on the parameters listed below. All requests should use the GET HTTP verb to retrieve information.

Query program messages API
Paramètre URL
enrollment /api/messages?enrollment=6yWDMa0LP7
event /api/messages?event=SllsjpfLH2
trackedEntity /api/messages?trackedEntity=xdfejpfLH2
organisationUnit /api/messages?ou=Sllsjdhoe3
processedDate /api/messages?processedDate=2016-02-01

Program Notification Instance

/api/programNotificationInstances exposes program notification instances, i.e. concrete scheduled or sent notifications created from program notification templates.

Returns program notification instances, optionally filtered and paginated.

GET /api/programNotificationInstances
Query program notification instance API
Nom Type Obligatoire Description
scheduledAt date (ISO-8601) no Returns notification instances scheduled to be sent on the given date. Example: scheduledAt=2025-01-01.
paging boolean no Enables or disables pagination. Default is true. Use paging=false to return all matching instances without pagination.
page integer no Page number to return when pagination is enabled.
pageSize integer no Number of items per page when pagination is enabled.
event UID no Program notification instances attached to this event.
enrollment UID no Program notification instances attached to this enrollment.

Performance

This section covers general performance principles followed by endpoint-specific guidance for the tracker export endpoints. Further performance optimizations require knowledge of real-world access patterns and data distribution. If your implementation can share this information, it will help prioritize improvements.

For tracker performance improvements relative to previous releases, see the corresponding release note, e.g. 2.43.

Import

Notifications

Notifications are dispatched asynchronously after import but compete with concurrent requests for database connections, CPU, and memory. With many entities and notification templates this can increase latency. For bulk imports where notifications are not needed, skip them:

POST /api/tracker?skipSideEffects=true

Règles de programme

The rule engine runs synchronously during import for every enrollment and event in the bundle, which can increase latency significantly for bulk imports. Skip it only if the programs have no rules with validations or assignments that must be enforced on import:

POST /api/tracker?skipRuleEngine=true

Export

General Principles

Export endpoint response times are typically dominated by database query execution. The recommendations below focus on reducing the amount of work the database has to do.

Query at the Right Level

The tracker data model has three levels: tracked entities, enrollments, and events. Always query at the lowest level that satisfies your need. Use GET /api/tracker/events instead of GET /api/tracker/trackedEntities?fields=enrollments[events]. Querying via a parent endpoint increases query complexity or the number of queries.

Use Explicit fields

By default, all endpoints exclude nested collections such as enrollments, events, and relationships. Each additional collection increases resource utilization and response times. Only request the fields you need and avoid fields=*.

Selectivity

Query performance depends on how many records the database must process before returning results. The fewer records to scan, sort, and deduplicate, the faster the response. This is selectivity: the fraction of total records that match the query conditions.

Selectivity comes from several sources, all of which compound: request parameters (such as program, filter, date ranges), user scope, and orgUnitMode.

Filters

Filters narrow the result set before sorting and pagination. They are most effective when backed by a database index. Broad filters (e.g., filter=w75KJ2mc4zz:like:J) may match a large portion of the dataset and provide little selectivity. Narrow filters (e.g., filter=w75KJ2mc4zz:eq:Jerald or a tight date range) reduce the working set significantly. like filters on tracked entity attributes can benefit from trigram indexing.

The "Minimum number of attributes required to search" setting on programs and tracked entity types requires a minimum number of attribute filters when searching outside the user's capture scope.

Programme

Specifying program enables ownership-based access control. Without program, the system must evaluate access rules dynamically across all programs a tracked entity is enrolled in. Always include program when querying program-specific data.

Note that even with program specified, selectivity depends on how much data exists for that program. A program enrolling most tracked entities will not be very selective.

Organisation Unit Mode

orgUnitMode and the user's organisation unit scope directly affect how many records the database processes. Performance depends on how much data the included org units own. A user scoped to a single facility queries a small subset of records; a user with root-level access may scan the entire program. SELECTED is the most efficient as the database can seek directly to records owned by the specified org units.

CHILDREN is slow when the children do not own data. Data is typically captured at facilities (the lowest level). Using CHILDREN at a higher level (e.g. district) returns administrative org units that have no events, forcing the database to scan all events in the program to confirm this. CHILDREN is fast when the children are org units that actually capture data.

ALL includes no geographic restriction. ACCESSIBLE depends on the user's search scope, which for users with broad access can cover most of the program's data. Combine with selective filters to keep the working set manageable.

Ordering

The order parameter can significantly impact query performance. Order fields fall into performance tiers:

  • Fast (indexed): The database walks an index in order and stops after filling the requested page. Cost scales with page size and offset, not dataset size. This assumes the query conditions allow the database to use the index, which depends on filters and orgUnitMode.
  • Slow (no index): The database must scan and sort all matching records before returning the page. Cost is dominated by the total number of matching records.
  • Very slow (cross-resource): The sort value comes from a related resource (e.g., sorting tracked entities by enrolledAt or an attribute value). The database must look up these values for every matching record before sorting.

Selectivity matters more than order field choice. With selective filters or narrow user scope, even slow order fields are fast because the database only sorts a small set. Note that filters without a backing index still reduce the sort cost but not the scan cost.

See the endpoint-specific sections below for which order fields fall into which tier.

Pagination

DHIS2 uses offset-based pagination. High page numbers are inherently slower because the database must compute and discard all preceding rows. This is a fundamental property of offset-based pagination, not specific to DHIS2.

Recommandations : * Keep page sizes reasonable (default is 50) * Avoid navigating to very high page numbers * Avoid totalPages=true unless necessary as it runs an additional count query that must process all matching records regardless of page size * Avoid paging=false as it returns all matching records in a single response

Configure collection limits to cap the result set size and protect database and server resources.

/api/tracker/trackedEntities

Filters

Either program or trackedEntityType is required. Prefer program as it enables direct ownership-based access control.

Ordering
Tier Order fields Coût
Fast trackedEntity, createdAt Proportional to page (offset) + pageSize
Slow updatedAt, createdAtClient, updatedAtClient, inactive Proportional to total matching tracked entities
Very slow enrolledAt, tracked entity attribute UIDs Proportional to total matching tracked entities + per-record lookup in related tables

enrolledAt additionally requires deduplication when a tracked entity has multiple enrollments in the same program. Programs configured with "Only enroll once" avoid this deduplication cost.

/api/tracker/enrollments

Ordering
Tier Order fields Coût
Slow enrolledAt, createdAt, completedAt, updatedAt, createdAtClient, updatedAtClient Proportional to total matching enrollments

All enrollment order fields currently lack a composite index. The database must scan and sort all matching enrollments before returning the requested page.

/api/tracker/events (Tracker Programs)

Filters

program is mandatory and can be combined with programStage to narrow to a single stage.

Gestion

Every tracker event query must traverse enrollment and ownership records to enforce access control. On a program with hundreds of thousands of enrollments, broad queries (e.g., orgUnitMode=ALL without filters) must process all ownership records before any event-level work can begin. An index on the event table alone cannot help because the ownership check happens on a different table.

The most effective way to reduce cost is to provide a narrow org unit scope. A user scoped to a single facility produces a small ownership set, making the rest of the query fast regardless of other parameters.

Enrollment-level filters (enrollmentStatus, followUp, enrollment date ranges) are not backed by indexes. They can still reduce the result set but do not reduce the number of records the database scans.

Ordering
Tier Order fields Coût
Slow occurredAt, scheduledAt, createdAt, updatedAt, completedAt, createdAtClient, updatedAtClient, enrolledAt, data element UIDs Proportional to total matching events (after ownership join)
Very slow tracked entity attribute UIDs Proportional to total matching events + per-event cross-resource lookup

All tracker event order fields lack a composite index at the program level. The database must traverse enrollment and ownership records, collect all matching events, sort them, and return the requested page. Cost scales with total matching events, not page size.

Specifying programStage does not improve ordering performance because the bottleneck is the ownership join, not the event-level scan.

enrolledAt comes from the enrollment table which is already part of the ownership join, so it does not require an additional lookup. Attribute UIDs require a cross-resource lookup to the tracked entity for every matching event.

/api/tracker/events (Event Programs)

Event programs (programs without registration) have no enrollment or ownership overhead. The database goes directly from the event to its org unit, making these queries structurally faster than tracker program queries.

Filters

program is mandatory.

Organisation Unit Mode

With the default occurredAt order, the database walks the sorted index and filters each event by org unit. This is fast when matching events appear early in the index. For SELECTED, DESCENDANTS, and ACCESSIBLE, performance depends on how the matching org units' events are distributed across the sort order. If matching events are rare or concentrated at the end of the index, the database must scan many non-matching events first. On program stages with millions of events where the user's org units cover only a small fraction, this can result in scanning large portions of the index before filling a single page. Adding occurredAfter and/or occurredBefore limits the scan to a bounded window and is recommended for high-volume program stages.

ALL avoids org unit filtering entirely and is fast with the default order. CHILDREN is slow for the same reasons described in the general principles.

Without the default occurredAt order, all modes require scanning and sorting all matching events.

Ordering

The default order is occurredAt desc. This is the most efficient order for event programs.

Tier Order fields Coût
Fast (indexed) occurredAt Proportional to page (offset) + pageSize. Degrades when org unit filtering is active but matches are sparse — see Organisation Unit Mode above.
Slow (no index) createdAt, updatedAt, completedAt, createdAtClient, updatedAtClient Proportional to total events for the program stage
Slow (JSON extraction) Data element UIDs Requires extracting and sorting JSON values for every matching event

Adresses électronique

Adresses électronique

L'API Web propose une ressource pour l'envoi de courriers électroniques. Pour que des courriels puissent être envoyés, il faut que la configuration SMTP soit correctement établie et qu'une adresse électronique de notification du système soit définie pour l'instance DHIS2. Vous pouvez définir les paramètres SMTP à partir de l'écran des paramètres de messagerie et l'adresse électronique de notification du système à partir de l'écran des paramètres généraux de DHIS2.

/api/33/email

Notification du système

La ressource notification vous permet d'envoyer des notifications par courriel au système avec un sujet et un texte donnés en JSON ou XML. Le courriel sera envoyé à l'adresse électronique de notification définie dans les paramètres généraux du système DHIS2 :

{
  "subject": "Integrity check summary",
  "text": "All checks ran successfully"
}

Vous pouvez envoyer une notification par courrier électronique au système en envoyant un message à la ressource notification comme suit :

curl -d @email.json "localhost/api/33/email/notification" -X POST
  -H "Content-Type:application/json" -u admin:district

Outbound emails

Vous pouvez également envoyer une notification générale par courrier électronique en postant dans la ressource de notification comme indiqué ci-dessous. F_SEND_EMAIL ou ALL doit être présente dans le système pour pouvoir utiliser cette API. Le paramètre est facultatif. La chaîne "DHIS 2" sera envoyée comme sujet par défaut s'il n'est pas fourni dans l'url. L'url doit être encodée pour pouvoir utiliser cette API.

curl "localhost/api/33/email/notification?recipients=xyz%40abc.com&message=sample%20email&subject=Test%20Email"
  -X POST -u admin:district

The previous example is convenient for short messages. However, since the message is passed as a query string, it can quickly hit the URL length limit of the server. For longer messages, it is better to send the data in the POST request body. The following example shows how to send an email with a longer message in the request body:

curl -u admin:district -X POST 'localhost/api/33/email/notification' \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  --data-urlencode 'recipients=recipient1@example.com,recipient2@example.com' \
  --data-urlencode 'subject=Important System Update' \
  --data-urlencode 'message=Dear user, we are writing to inform you about an important system update that will take place this weekend. The system will be unavailable for a few hours. We apologize for any inconvenience this may cause. Please plan your work accordingly. Best regards, The DHIS2 Team.'

To send an email with an HTML body, you can simply provide the HTML content in the message parameter. The email client should interpret the HTML and render it accordingly. Note that the Content-Type header in the curl command should be application/x-www-form-urlencoded, as the data is sent as URL-encoded form data. The following example shows how to send an email with a simple HTML table:

curl -u admin:district -X POST 'localhost/api/33/email/notification' \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  --data-urlencode 'recipients=recipient1@example.com,recipient2@example.com' \
  --data-urlencode 'subject=System Maintenance Schedule' \
  --data-urlencode 'message=<html><body><h2>System Maintenance</h2><p>Dear user,</p><p>We are writing to inform you about scheduled system maintenance. The following table shows the maintenance schedule for the upcoming week:</p><table border="1"><tr><th>Day</th><th>Time</th></tr><tr><td>Monday</td><td>10 PM - 11 PM</td></tr><tr><td>Wednesday</td><td>10 PM - 11 PM</td></tr></table><p>We apologize for any inconvenience this may cause. Please plan your work accordingly.</p><p>Best regards,<br>The DHIS2 Team</p></body></html>'

Message de test

Pour tester si la configuration SMTP est correcte en vous envoyant à vous-même un e-mail de test, vous pouvez interagir avec la ressource test. Pour envoyer des courriels de test, il faut que votre compte utilisateur DHIS2 soit associé à une adresse électronique valide. Vous pouvez envoyer un courriel de test comme suit :

curl "localhost/api/33/email/test" -X POST -H "Content-Type:application/json" -u admin:district

Data store

Magasin de données

En utilisant la ressource dataStore ("magasin de données"), les développeurs peuvent stocker des données arbitraires pour leurs applications. L'accès à la clé d'un magasin de données est basé sur ses paramètres de partage. Par défaut, toutes les clés créées sont accessibles au public (lecture et écriture). En outre, l'accès à l'espace de noms d'un datastore est limité à l'accès de l'utilisateur à l'application correspondante, si l'application a réservé l'espace de noms. Par exemple, un utilisateur ayant accès à l'application « sampleApp » pourra également utiliser l'espace de noms sampleApp dans le magasin de données. Si un espace de noms n'est pas réservé, aucun accès spécifique n'est requis pour l'utiliser.

/api/33/dataStore

Notez qu'il existe des espaces de noms réservés utilisés par le système qui requièrent une autorité spéciale pour pouvoir lire ou écrire des données. Par exemple, l'espace de noms pour l'application de réglages android ANDROID_SETTINGS_APP nécessitera l'autorité M_androidsettingsapp.

Structure du magasin de données

Les données du magasin de données se composent d'un espace de noms, d'une clé et d'une valeur. La combinaison de l'espace de noms et de la clé est unique. Le type de données de la valeur est JSON.

Tableau : Structure du magasin de données

Élément Description Type de données
Espace de noms Espace-noms pour l'organisation des données Chaîne
Clé Clé d'identification des valeurs. Chaîne
Valeur Valeur contenant les informations à saisir JSON
Chiffré Indique si la valeur de la clé donnée doit être chiffrée Booléen

Obtenir des clés et des espaces de noms

Pour obtenir une liste de tous les espaces de noms existants :

GET /api/33/dataStore

Exemple de requête curl pour le listing :

curl "play.dhis2.org/demo/api/33/dataStore" -u admin:district

Exemple de réponse :

[
  "foo",
  "bar"
]

Pour obtenir la liste de toutes les clés d'un espace de noms :

GET /api/33/dataStore/<namespace>

Exemple de requête curl pour le listing :

curl "play.dhis2.org/demo/api/33/dataStore/foo" -u admin:district

Exemple de réponse :

[
  "key_1",
  "key_2"
]

Pour récupérer une valeur pour une clé existante dans un espace de noms :

GET /api/33/dataStore/<namespace>/<key>

Exemple de requête curl pour l'extraction :

curl "play.dhis2.org/demo/api/33/dataStore/foo/key_1"-u admin:district

Exemple de réponse :

{
  "foo":"bar"
}

Pour récupérer les métadonnées d'une clé existante dans un espace de noms :

GET /api/33/dataStore/<namespace>/<key>/metaData

Exemple de requête curl pour l'extraction :

curl "play.dhis2.org/demo/api/33/dataStore/foo/key_1/metaData" -u admin:district

Exemple de réponse :

{
  "id": "dsKeyUid001", 
  "created": "...",
  "user": {...},
  "namespace": "foo",
  "key": "key_1"
}

Query API

L'API de requête permet d'interroger et de filtrer les valeurs de toutes les clés d'un espace de noms. Le paramètre fields (champs) est utilisé pour spécifier la requête. Ceci est utile pour récupérer des valeurs spécifiques de clés dans un espace de noms en une seule requête.

GET /api/dataStore/<namespace>?fields=

La liste des champs peut être :

  • empty (vide) : renvoie uniquement les clés d'entrée
  • .: renvoie la valeur de la racine telle qu'elle est stockée
  • liste de chemins séparés par des virgules : <path>[,<path>] ; chacun <path> peut être un simple nom de propriété (comme age) ou un chemin imbriqué (comme person.age)

En outre, les entrées peuvent être filtrées à l'aide d'un ou plusieurs paramètres filter (filtre) et triées à l'aide du paramètre order (ordre).

Plusieurs filtres peuvent être combinés en utilisant rootJunction=OR (par défaut) ou rootJunction=AND.

Tous les détails sur les paramètres fields(champs), filter(filtre) et order(ordre) sont donnés dans les sections suivantes.

Paging

Par défaut, les résultats utilisent la pagination. Utilisez pageSize ("taille de page") et page ("page") pour ajuster la taille et le décalage. Le paramètre paging=false peut être utilisé pour ne pas utiliser la pagination et toujours retourner toutes les correspondances. Ceci doit être utilisé avec précaution car il peut y avoir beaucoup d'entrées dans un espace de noms. La taille de page par défaut est de 50.

GET /api/dataStore/<namespace>?fields=.&page=2&pageSize=10

Lorsque la pagination est désactivée, les entrées sont renvoyées sous la forme d'un tableau de résultats simple en tant que structure JSON racine. Le même effet peut être obtenu avec des résultats paginés en utilisant headless=true(sans en-tête).

{
  "pager": { ... },
  "entries": [...]
}
vs.
[...]

Value extraction

Le magasin de données permet d'extraire des valeurs simples ou complexes entières ainsi que l'extraction de parties de valeurs JSON complexes.

Remarque

Pour plus de clarté dans les exemples, les réponses présentées omettent pour la plupart l'objet le plus externe avec les informations de pagination et le tableau d'entrées présenté dans les exemples.

Pour filtrer un certain ensemble de champs, ajoutez un paramètre fields à l’espace de noms requête:

GET /api/dataStore/<namespace>?fields=name,description

Cela renvoie une liste de toutes les entrées ayant un nom non nul et/ou un description comme dans l’exemple suivant :

[
  {"key": "key1", "name": "name1", "description": "description1"},
  {"key": "key2", "name": "name2", "description": "description2"}
]

Si, pour une raison quelconque, nous souhaitons que la liste de résultats contienne des entrées pour lesquelles aucun des champs extraits n'est non nul, le paramètre includeAll (inclure tous) peut être ajouté :

GET /api/dataStore/<namespace>?fields=name,description&includeAll=true

La réponse pourrait ressembler à ceci maintenant:

[
  {"key": "key1", "name": "name1", "description": "description1"},
  {"key": "key2", "name": "name2", "description": "description2"},
  {"key": "key3", "name": null, "description": null},
  {"key": "key4", "name": null, "description": null}
]

L'extraction n'est pas limitée aux simples membres de niveau racine, mais peut également prendre des membres imbriqués en utilisant des crochets ou des parenthèses rondes après le nom d'un membre :

GET /api/dataStore/<namespace>?fields=name,root[child1,child2]
GET /api/dataStore/<namespace>?fields=name,root(child1,child2)

L'exemple de réponse pourrait ressembler à ceci :

[
  { "key": "key1", "name": "name1", "root": {"child1": 1, "child2": []}},
  { "key": "key2", "name": "name2", "root": {"child1": 2, "child2": []}}
]

La même syntaxe s'applique aux membres imbriqués :

GET /api/dataStore/<namespace>?fields=root[level1[level2[level3]]]
GET /api/dataStore/<namespace>?fields=root(level1(level2(level3)))

L'exemple de réponse ici:

[
  { "key": "key1", "root": {"level1": {"level2": {"level3": 42}}}},
  { "key": "key1", "root": {"level1": {"level2": {"level3": 13}}}}
]

Lorsque de telles valeurs profondément imbriquées sont extraites, il se peut que nous ne voulions pas conserver la structure mais extraire le membre de la feuille vers un membre de niveau supérieur dans la réponse. Les alias peuvent être utilisés à cette fin. Un alias peut être placé n'importe où après le nom d'un membre en utilisant ~hoist suivi de l'alias entre crochets comme suit :

GET /api/dataStore/<namespace>?fields=root[level1[level2[level3~hoist(my-prop)]]]

La réponse ressemblerait à ceci maintenant:

[
  { "key": "key1", "my-prop": 42},
  { "key": "key2", "my-prop": 13}
]

Si le chemin complet doit être conservé tout en donnant un alias à un membre imbriqué, le chemin parent doit être répété en utilisant la syntaxe des points pour indiquer l'imbrication. Cette méthode peut également être utilisée pour restructurer une réponse dans une nouvelle structure différente comme suit :

GET /api/dataStore/<namespace>?fields=root[level1[level2[level3~hoist(my-root.my-prop)]]]

La réponse nouvellement structurée se présente désormais comme suit :

[
  { "key": "key1", "my-root": {"my-prop": 42}},
  { "key": "key2", "my-root": {"my-prop": 13}}
]

OBS! Un alias ne peut pas être utilisé pour renommer un niveau intermédiaire. Cependant, un alias peut être utilisé pour résoudre une collision de noms avec le membre key (clé).

GET /api/dataStore/<namespace>?fields=id,key~hoist(value-key)
[
  { "key": "key1", "id": 1, "value-key": "my-key1"},
  { "key": "key2", "id": 2, "value-key": "my-key2"}
]

Sorting results

Les résultats peuvent être classés en fonction d'une seule propriété en utilisant le paramètre order=<path>[:direction]. Il peut s'agir de toute valeur valide <path> ou de la clé d'entrée (utiliser _ comme chemin).

Par défaut, le tri est alphanumérique si la valeur du chemin d'accès est une chaîne de caractères de type mixte.

Par exemple, pour extraire la propriété nom et trier le résultat en fonction de celle-ci, utilisez :

GET /api/dataStore/<namespace>?fields=name&order=name

Pour passer à l'ordre décroissant, utilisez :desc :

GET /api/dataStore/<namespace>?fields=name&order=name:desc

Parfois, la propriété triée est numérique, de sorte que l'interprétation alphanumérique prêterait à confusion. Dans ce cas, les types de classement spéciaux :nasc et :ndesc peuvent être utilisés.

En résumé, l'ordre peut être l'un des éléments suivants :

  • asc: ordre alphanumérique croissant
  • desc:: ordre alphanumérique décroissant
  • nasc: ordre numérique croissant
  • ndesc: ordre numérique décroissant

OBS!

Lors de l'utilisation de l'ordre numérique, toutes les correspondances doivent avoir une valeur numérique pour la propriété à l'emplacement fourni <path>.

Filtering entries

Pour filtrer les entrées dans le contexte API de la requête, ajoutez un ou plusieurs paramètres filter (filtre). tout en utilisant le paramètre fields (champs).

Chaque paramètre filtre a la forme suivante :

  • les opérateurs unitaires: <path>:<operator>
  • les opérateurs binaires: <path>:<operator>:<value>
  • les opérateurs d'ensemble: <path>:<operator>:[<value>,<value>,...]

Les opérateurs unitaires sont:

Opérateur Description
nul La valeur est JSON null
!nul La valeur est définie mais différente de la valeur JSON null
vide la valeur est un objet vide, un tableau vide ou une chaîne JSON de longueur zéro
!vide la valeur est différente d'un objet vide, d'un tableau vide ou d'une chaîne de longueur zéro

Les opérateurs binaires sont:

Opérateur Description
eq la valeur est égale au booléen, au nombre ou à la chaîne de caractères donné(e)
!eq, ne, neq la valeur n'est pas égale au booléen, au nombre ou à la chaîne de caractères donné(e)
lt la valeur est numériquement ou alphabétiquement inférieure au nombre ou à la chaîne de caractères donné(e)
le la valeur est numériquement ou alphabétiquement inférieure ou égale au nombre ou à la chaîne de caractères donné(e)
gt la valeur est numériquement ou alphabétiquement supérieure au nombre ou à la chaîne de caractères donné(e)
ge la valeur est numériquement ou alphabétiquement supérieure ou égale au nombre ou à la chaîne de caractères donné(e)

Les opérateurs binaires de correspondance de motifs de texte sont les suivants :

Opérateur Insensible à la casse Description
like ilike La valeur correspond au modèle de texte indiqué
!like !ilike La valeur ne correspond pas au modèle de texte indiqué
$like $ilike, startswith (commence avec) La valeur commence par le modèle de texte indiqué
!$like !$ilike, !startswith (commence avec) La valeur ne commence pas par le modèle de texte indiqué
like$ ilike$, endswith (se termine par) La valeur se termine par le modèle de texte indiqué
!like$ !ilike$, !endswith (se termine par) La valeur ne se termine pas par le modèle de texte indiqué

Pour les opérateurs qui fonctionnent pour plusieurs types de noeuds JSON, la sémantique est déterminée à partir de la valeur fournie. Si la valeur est true ou false, le filtre correspond aux valeurs JSON booléennes. Si la valeur est un nombre, le filtre correspond aux valeurs JSON de type nombre. Sinon, la valeur correspond à des valeurs JSON de type chaîne ou à des types de valeurs mixtes.

Conseil

Pour forcer la comparaison de texte pour une valeur numérique, mettez la valeur entre guillemets simples. Par exemple, la valeur '13' est le texte 13 alors que 13 est le nombre 13.

Les opérateurs de l'ensemble sont :

Opérateur Description
in la valeur d'entrée est textuellement égale à l'une des valeurs données (est dans l'ensemble)
!in la valeur d'entrée n'est pas textuellement égale à l'une des valeurs données (n'est pas dans l'ensemble)

Ils <path> peuvent être :

  • _: la clé d'entrée est
  • .: la valeur de la racine d'entrée est
  • <member>: le membre de la valeur racine est
  • <member>.<member>: le membre du chemin est (jusqu'à 5 niveaux de profondeur)

L'expression <member> path peut être un nom de membre ou, dans le cas d'un tableau, un index de tableau. Dans le cas d'un tableau, l'index peut également être donné sous la forme : [<index>]. Par exemple, le chemin adresses[0].street serait identique à adresses.0.street.

Vous trouverez ci-dessous quelques exemples de requêtes.

Le nom (de l'objet racine) est "Luke" :

GET /api/dataStore/<namespace>?fields=.&filter=name:eq:Luke

L'âge (de l'objet racine) est supérieur à 42 (numérique) :

GET /api/dataStore/<namespace>?fields=.&filter=age:gt:42

La valeur racine est un nombre supérieur à 42 (correspondance numérique déduite de la valeur) :

GET /api/dataStore/<namespace>?fields=.&filter=.:gt:42

L'option Activé (de l'objet racine) est vraie (correspondance booléenne déduite de la valeur) :

GET /api/dataStore/<namespace>?fields=.&filter=enabled:eq:true

L'objet racine a un nom contenant « Pet » et a un âge supérieur à 20 ans :

GET /api/dataStore/<namespace>?fields=.&filter=name:like:Pet&filter=age:gt:20

L'objet racine est signalé comme mineur ou a un âge inférieur à 18 ans :

GET /api/dataStore/<namespace>?fields=.&filter=minor:eq:true&filter=age:lt:18&rootJunction=or

Créer des valeurs

Pour créer une nouvelle clé et une nouvelle valeur pour un espace de noms :

POST /api/33/dataStore/<namespace>/<key>

Exemple de requête curl pour créer, en présumant que la charge JSON est valide :

curl "https://play.dhis2.org/demo/api/33/dataStore/foo/key_1" -X POST
  -H "Content-Type: application/json" -d "{\"foo\":\"bar\"}" -u admin:district

Exemple de réponse :

{
  "httpStatus": "OK",
  "httpStatusCode": 201,
  "status": "OK",
  "message": "Key 'key_1' created."
}

Si vous souhaitez que les données que vous stockez soient cryptées (par exemple les informations d'identification de l'utilisateur ou autres), vous pouvez ajouter une requête à l'URL comme suit :

GET /api/33/dataStore/<namespace>/<key>?encrypt=true

Mettre à jour les valeurs

Pour mettre à jour une clé qui existe dans un espace de noms :

PUT /api/33/dataStore/<namespace>/<key>

Exemple de requête curl pour mettre à jour, en présumant que la charge JSON est valide :

curl "https://play.dhis2.org/demo/api/33/dataStore/foo/key_1" -X PUT -d "[1, 2, 3]"
  -H "Content-Type: application/json" -u admin:district

Exemple de réponse :

{
  "httpStatus": "OK",
  "httpStatusCode": 200,
  "status": "OK",
  "message": "Key 'key_1' updated."
}

Clés de suppression

Pour supprimer une clé existante d'un espace de noms :

DELETE /api/33/dataStore/<namespace>/<key>

Exemple de requête curl pour la suppression :

curl "play.dhis2.org/demo/api/33/dataStore/foo/key_1" -X DELETE -u admin:district

Exemple de réponse :

{
  "httpStatus": "OK",
  "httpStatusCode": 200,
  "status": "OK",
  "message": "Key 'key_1' deleted from namespace 'foo'."
}

Pour supprimer toutes les clés d'un espace de noms :

DELETE /api/33/dataStore/<namespace>

Exemple de requête curl pour la suppression :

curl "play.dhis2.org/demo/api/33/dataStore/foo" -X DELETE -u admin:district

Exemple de réponse :

{
  "httpStatus": "OK",
  "httpStatusCode": 200,
  "status": "OK",
  "message": "Namespace 'foo' deleted."
}

Partage des clés du magasin de données

Le partage des clés des magasins de données suit le même principe que le partage d'autres métadonnées (voir Partage).

Pour obtenir les paramètres de partage d'une clé de magasin de données spécifique :

GET /api/33/sharing?type=dataStore&id=<uid>

L'identifiant de la clé du magasin de données provient du point d'extrémité /metaData de cette clé :

GET /api/33/dataStore/<namespace>/<key>/metaData

Comme d'habitude, la propriété access dans la réponse reflète les capacités de l'utilisateur actuel pour l'entrée cible. La protection de l'espace de nommage peut toujours s'appliquer et rendre un utilisateur incapable d'effectuer certaines modifications.

Pour modifier les paramètres de partage d'une clé de stockage de données spécifique :

POST /api/33/sharing?type=dataStore&id=<uid>

avec la requête suivante:

{
  "object": {
    "publicAccess": "rw------",
    "externalAccess": false,
    "user": {},
    "userAccesses": [],
    "userGroupAccesses": [
      {
        "id": "hj0nnsVsPLU",
        "access": "rw------"
      },
      {
        "id": "qMjBflJMOfB",
        "access": "r-------"
      }
    ]
  }
}

Magasin de données de l'utilisateur

Outre le magasin de données qui est partagé par tous les utilisateurs du système, un magasin de données basé sur l'utilisateur est également disponible. Les données stockées dans le magasin de données de l'utilisateur sont associées à des utilisateurs individuels, afin que chaque utilisateur puisse avoir des données différentes dans le même espace de noms et la même combinaison de touches. Tous les appels au magasin de données de l'utilisateur seront associés à l'utilisateur connecté. Cela signifie que l'on ne peut voir, modifier, supprimer et ajouter que les valeurs associées à l'utilisateur connecté.

/api/33/userDataStore

Structure du magasin de données de l'utilisateur

Le magasin de données de l'utilisateur se compose d'un utilisateur, d'un espace de noms, de clés et de valeurs associées. La combinaison d'un utilisateur, d'un espace de noms et d'une clé est unique.

Tableau : Structure du magasin de données de l'utilisateur

Élément Description Type de données
Utilisateur L'utilisateur auquel ces données sont associées Chaîne
Espace de noms L'espace de noms auquel appartient la clé Chaîne
Clé La clé sur laquelle une valeur est stockée Chaîne
Valeur La valeur stockée JSON
Chiffré Indique si la valeur doit être cryptée Booléen

Obtenir des espaces de noms

Renvoie un tableau de tous les espaces de noms existants

GET /api/33/userDataStore

Exemple requête:

curl -H "Content-Type: application/json" -u admin:district "play.dhis2.org/api/33/userDataStore"
[
  "foo",
  "bar"
]

Obtenir des clés

Renvoie un tableau de toutes les clés existantes dans un espace de noms donné

GET /api/userDataStore/<namespace>

Exemple de requête:

curl -H "Content-Type: application/json" -u admin:district "play.dhis2.org/api/33/userDataStore/foo"
[
  "key_1",
  "key_2"
]

Obtenir des valeurs

Renvoie la valeur d'un espace de noms et d'une clé donnés

GET /api/33/userDataStore/<namespace>/<key>

Exemple de requête:

curl -H "Content-Type: application/json" -u admin:district "play.dhis2.org/api/33/userDataStore/foo/bar"
{
  "some": "value"
}

Créer une valeur

Ajoute une nouvelle valeur à une clé donnée dans un espace de noms donné.

POST /api/33/userDataStore/<namespace>/<key>

Exemple de requête:

curl -X POST -H "Content-Type: application/json" -u admin:district -d "['some value']"
  "play.dhis2.org/api/33/userDataStore/foo/bar"
{
  "httpStatus": "Created",
  "httpStatusCode": 201,
  "status": "OK",
  "message": "Key 'bar' in namespace 'foo' created."
}

Si vous souhaitez que la valeur soit cryptée (par exemple, les informations d'identification de l'utilisateur et autres), vous pouvez ajouter une requête à l'url comme ceci :

GET /api/33/userDataStore/<namespace>/<key>?encrypt=true

Mettre à jour les valeurs

Met à jour une valeur existante

PUT /api/33/userDataStore/<namespace>/<key>

Exemple de requête:

curl -X PUT -H "Content-Type: application/json" -u admin:district -d "['new value']"
  "play.dhis2.org/api/33/userDataStore/foo/bar"
{
  "httpStatus":"Created",
  "httpStatusCode":201,
  "status":"OK",
  "message":"Key 'bar' in namespace 'foo' updated."
}

Clé de suppression

Supprimer une clé

DELETE /api/33/userDataStore/<namespace>/<key>

Exemple de requête:

curl -X DELETE -u admin:district "play.dhis2.org/api/33/userDataStore/foo/bar"
{
  "httpStatus":"OK",
  "httpStatusCode":200,
  "status":"OK",
  "message":"Key 'bar' deleted from the namespace 'foo."
}

Supprimer un espace de noms

Supprimer toutes les clés de l'espace de noms donné

DELETE /api/33/userDataStore/<namespace>

Exemple de requête:

curl -X DELETE -u admin:district "play.dhis2.org/api/33/userDataStore/foo"
{
  "httpStatus":"OK",
  "httpStatusCode":200,
  "status":"OK",
  "message":"All keys from namespace 'foo' deleted."
}

Admin Access to another User's Datastore

Les administrateurs peuvent manipuler le magasin de données d'un autre utilisateur en ajoutant le paramètre nom d'utilisateur à n'importe laquelle des manipulations décrites ci-dessus pour qu'elles n'affectent pas le magasin de données de l'administrateur mais celui de l'utilisateur indiqué par le paramètre nom d'utilisateur.

Par exemple, pour ajouter une valeur au magasin de données de Peter, un administrateur utilise :

POST /api/userDataStore/<namespace>/<key>?username=Peter

Partial Update (Experimental)

Le datastore et le datastore utilisateur permettent tous deux une mise à jour partielle des valeurs d'entrée.

Tous les exemples suivants partent du principe que l'entrée JSON suivante se trouve dans l'espace de noms pets avec la clé whiskers.

{
  "name": "wisker",
  "favFood": [
    "fish", "rabbit"
  ]
}

Nous pouvons effectuer de nombreuses opérations de mise à jour sur cette entrée. Les exemples suivants utilisent {store} dans les appels API, veuillez le remplacer par dataStore ou userDataStore selon votre cas d'utilisation.

Update root (entire entry)

Nous pouvons effectuer une mise à jour de l'entrée à la racine en ne fournissant pas le paramètre de requête path ou en le laissant vide path=.

PUT /api/{store}/pets/whiskers avec le corps "whiskers" met à jour l'entrée avec le corps fourni. Donc une requête GET vers /api/{store}/pets/whiskers afficherait maintenant :

"whiskers"

Update at specific path

Nous pouvons mettre à jour l'entrée selon un chemin spécifique en fournissant le paramètre de requête path et la propriété à mettre à jour.

PUT /api/{store}/pets/whiskers?path=name avec le corps "whiskers" met à jour l'entrée au niveau de la propriété name uniquement. Donc une requête GET vers /api/{store}/pets/whiskers affichera maintenant le nom mis à jour :

{
    "name": "whiskers",
    "favFood": [
        "fish",
        "rabbit"
    ]
}

Nous pouvons mettre à jour un élément de tableau selon un chemin spécifique.

PUT /api/{store}/pets/whiskers?path=favFood.[0] avec le corps "carrot" (carotte) met à jour le premier élément du tableau favFood (plat préféré) uniquement. Donc une requête GET vers /api/{store}/pets/whiskers montrerait maintenant le favFood mis à jour :

{
    "name": "wisker",
    "favFood": [
        "carrot",
        "rabbit"
    ]
}

Benefits

  • des charges plus petites pour des modifications mineures
  • moins sujettes aux erreurs (pas de copier-coller de grandes entrées pour modifier une propriété)

Roll (Experimental)

Le paramètre de requête roll permet à l'utilisateur d'avoir un nombre 'roulant' d'éléments dans un tableau. Dans notre exemple, nous avons le tableau favFood. Si nous voulions mettre à jour ce tableau précédemment, nous devrions fournir toute la charge comme suit : PUT /api/{store}/pets/whiskers avec corps

{
    "name": "wisker",
    "favFood": [
        "fish",
        "rabbit",
        "carrot"
    ]
}

Maintenant, nous pouvons utiliser le paramètre de requête roll (avec la fonctionnalité path) pour indiquer que nous voulons la fonctionnalité de roulement pour n nombre d'éléments. Dans cet exemple, nous indiquons que nous voulons que le tableau ait une valeur de roulement de 3, en passant un élément supplémentaire dans l'appel. PUT /api/{store}/pets/whiskers?roll=3&path=favFood avec le corps "carrot" donnerait le résultat suivant.

{
    "name": "wisker",
    "favFood": [
        "fish",
        "rabbit",
        "carrot"
    ]
}

Puisque nous avons utilisé la valeur de roulement 3, cela indique que nous ne voulons que les 3 derniers éléments dans le tableau. Donc si nous faisons un autre appel et que nous ajoutons un nouvel élément au tableau, nous nous attendons à ce que le premier élément (fish) soit supprimé du tableau. PUT /api/{store}/pets/whiskers?roll=3&path=favFood avec le corps "bird" donnerait le résultat suivant :

{
    "name": "wisker",
    "favFood": [
        "rabbit",
        "carrot",
        "bird"
    ]
}

Remarque

Une fois qu'une valeur de roulement a été fixée (par exemple role=3), elle ne peut être qu'augmentée (par exemple roll=5) et ne peut pas être diminuée (par exemple roll=2).

La notation par points permet d'effectuer des appels imbriqués. Supposons que nous ayons cette valeur d'entrée actuelle :

{
  "name": "wisker",
  "favFood": [
    "fish", "rabbit"
  ],
  "type": {
    "breed": ["shorthair"]
  }
}

Si nous voulions ajouter une autre variété en utilisant un tableau de roulement, nous pourrions faire l'appel : PUT /api/{store}/pets/whiskers?roll=3&path=type.breed avec le corps "small" ce qui donnerait le résultat suivant :

{
  "name": "wisker",
  "favFood": [
    "fish", "rabbit"
  ],
  "type": {
    "breed": ["shorthair, small"]
  }
}

Benefits

  • Seul le suivi de n valeurs susceptibles d'évoluer dans le temps nous intéresse

Profil d'unité d'organisation

La ressource profil d'unité d'organisation permet de définir et d'extraire un profil d'information pour les unités d'organisation dans DHIS 2.

/api/organisationUnitProfile

Un seul profil d'unité d'organisation peut être créé et s'applique à toutes les unités d'organisation.

La partie information du profil de l'unité d'organisation comprend :

  • Nom, nom abrégé, description, unité d'organisation mère, niveau, date d'ouverture, date de fermeture, URL.
  • Personne de contact, adresse, e-mail, numéro de téléphone (s'il existe).
  • Localisation (longitude/latitude).
  • Attributs de métadonnées (configurables).
  • Ensembles de groupes d'unités d'organisation et groupes (configurables).
  • Données agrégées pour les éléments de données, les indicateurs, les taux de déclaration, les indicateurs de programme (configurables).

Create organisation unit profile

Pour définir le profil de l'unité d'organisation, vous pouvez utiliser une requête POST :

POST /api/organisationUnitProfile

La charge au format JSON ressemble à ceci, où attributes fait référence aux attributs de métadonnées, groupSets fait référence aux ensembles de groupes d'unités d'organisation et dataItems fait référence aux éléments de données, aux indicateurs, aux ensembles de données et aux indicateurs de programme :

{
  "attributes": [
    "xqWyz9jNCA5",
    "n2xYlNbsfko"
  ],
  "groupSets": [
    "Bpx0589u8y0",
    "J5jldMd8OHv"
  ],
  "dataItems": [
    "WUg3MYWQ7pt",
    "vg6pdjObxsm",
    "DTVRnCGamkV",
    "Uvn6LCg7dVU",
    "eTDtyyaSA7f"
  ]
}

L'autorité F_ORG_UNIT_PROFILE_ADD est nécessaire pour définir le profil.

Get organisation unit profile

Pour extraire la définition du profil de l'unité d'organisation, vous pouvez utiliser une requête GET :

GET /api/organisationUnitProfile

La réponse sera au format JSON.

Get organisation unit profile data

Pour extraire les données du profil d'une unité d'organisation, vous pouvez utiliser une requête GET :

GET /api/organisationUnitProfile/{org-unit-id}/data?period={iso-period}

Le endpoint des données du profil de l'unité d'organisation combinera la définition du profil avec les valeurs d'informations/données qui lui sont associées.

  • La variable de chemin org-unit-id est obligatoire et fait référence à l'identifiant de l'unité d'organisation pour laquelle des données agrégées doivent être fournies.
  • Le paramètre de requête iso-period est facultatif et se réfère à l'identifiant ISO de la période pour fournir des données agrégées pour les éléments de données. Si aucun n'est spécifié, la période relative cette année sera utilisée comme solution de repli.

La réponse comprendra les sections suivantes :

  • info (informations): Informations fixes sur l'unité d'organisation.
  • attributes (attributs) : Attributs de métadonnées avec les valeurs d'attributs correspondantes.
  • groupSets (ensembles de groupes): Ensembles de groupes d'unités d'organisation avec le groupe d'unités d'organisation correspondant dont l'unité d'organisation est membre.
  • dataItems (éléments de données) : Éléments de données avec la valeur de données agrégées correspondante.

Notez que des contrôles d'accès sont effectués et que les éléments de métadonnées qui ne sont pas accessibles à l'utilisateur actuel seront omis.

Voici donc un exemple de requête :

GET /api/organisationUnitProfile/DiszpKrYNg8/data?period=2021

La réponse aux données de profil au format JSON se présente comme suit : les champs id (identifiant) et label (étiquette) renvoient à l'élément de métadonnées, et le champ value (valeur) renvoie à la valeur associée :

{
  "info": {
    "id": "DiszpKrYNg8",
    "code": "OU_559",
    "name": "Ngelehun CHC",
    "shortName": "Ngelehun CHC",
    "parentName": "Badjia",
    "level": 4,
    "levelName": "Facility",
    "openingDate": "1970-01-01T00:00:00.000",
    "longitude": -11.4197,
    "latitude": 8.1039
  },
  "attributes": [
    {
      "id": "n2xYlNbsfko",
      "label": "NGO ID",
      "value": "GHE51"
    },
    {
      "id": "xqWyz9jNCA5",
      "label": "TZ code",
      "value": "NGE54"
    }
  ],
  "groupSets": [
    {
      "id": "Bpx0589u8y0",
      "label": "Facility Ownership",
      "value": "Public facilities"
    },
    {
      "id": "J5jldMd8OHv",
      "label": "Facility Type",
      "value": "CHC"
    }
  ],
  "dataItems": [
    {
      "id": "WUg3MYWQ7pt",
      "label": "Total Population",
      "value": 3503
    },
    {
      "id": "DTVRnCGamkV",
      "label": "Total population < 1 year",
      "value": 140
    },
    {
      "id": "vg6pdjObxsm",
      "label": "Population of women of child bearing age (WRA)",
      "value": 716
    },
    {
      "id": "Uvn6LCg7dVU",
      "label": "ANC 1 Coverage",
      "value": 368.2
    },
    {
      "id": "eTDtyyaSA7f",
      "label": "FIC <1y",
      "value": 291.4
    }
  ]
}

Upload image for organisation unit

Pour télécharger une image pour une unité d'organisation, vous pouvez utiliser le endpoint fileResources.

/api/fileResources

Le endpoint fileResource accepte un fichier brut comme corps de la requête. Les formats JPG, JPEG et PNG sont supportés pour les images d'unités d'organisation. Le domaine pour les images d'unités d'organisation est ORG_UNIT.

Veuillez consulter Ressources de fichiers dans la section Métadonnées pour plus de détails sur le endpoint fileResources.

Pour télécharger une image, vous pouvez envoyer une requête POST avec ORG_UNIT comme paramètre de requête de domaine ainsi que l'image comme charge de la requête. L'en-tête Content-Type (type de contenu) doit correspondre au type de fichier téléchargé.

POST /api/fileResources?domain=ORG_UNIT

La propriété id (identifiant) de l'objet response (réponse) > fileResource (ressource de fichier) dans la réponse JSON contiendra une référence à l'identifiant de la ressource de fichier.

L'entité unité d'organisation a une propriété image qui fait référence à l'image de la ressource fichier. Pour définir la référence de la ressource fichier sur une unité d'organisation, vous pouvez envoyer une requête PATCH à l'unité d'organisation avec une charge JSON :

PATCH /api/organisationUnits/{id}
{ 
  "image": "{file-resource-id}" 
}

Vous pouvez également utiliser une requête PUT avec l'unité d'organisation complète (les champs sont omis pour des raisons de concision) :

PUT /api/organisationUnits/{id}
{
  "id": "Rp268JB6Ne4",
  "name": "Adonkia CHP",
  "image": {
    "id":  "{file-resource-iid}"
  }
}

Get image for organisation unit

L'entité unité d'organisation possède un objet image qui fait référence à une ressource fichier par identifiant. Vous pouvez obtenir les informations sur l'unité d'organisation à partir du endpoint organisationUnits. S'il est défini, le format JSON ressemble à ceci :

GET /api/organisationUnits/{id}
{
  "id": "Rp268JB6Ne4",
  "name": "Adonkia CHP",
  "image": {
    "id":  "{file-resource-id}"
  }
}

L'identifiant de la ressource du fichier image peut être utilisé pour faire une demande au endpoint fileResources afin de récupérer le contenu du fichier :

GET /api/fileResources/{id}/data

L'en-tête Content-Type (type de contenu) reflète le type de fichier récupéré.

Applications

Applications

Le endpoint /api/apps peut être utilisé pour installer, supprimer et lister des applications. La clé de l'application est basée sur le nom de l'application, mais tous les caractères non alphanumériques sont supprimés, et les espaces sont remplacés par un tiret. My app! renverra la clé My-app.

Remarque

Avant la version 2.28, la clé d'application était dérivée du nom de l'archive ZIP , à l'exclusion de l'extension du fichier. Les URLs utilisant l'ancien format devraient toujours renvoyer l'application correcte dans l'api.

/api/33/apps

Obtenir les applications

Remarque

Avant la version 2.28, la propriété d'application folderName faisait référence au chemin réel de l'application installée. Avec la possibilité de stocker les applications sur des services en nuage, l'objectif de folderName a changé et fait désormais référence à la clé de l'application.

Vous pouvez lire les clés des applications en listant toutes les applications de la ressource apps et en recherchant la propriété key. Pour lister toutes les applications installées au format JSON :

curl -u user:pass -H "Accept: application/json" "http://server.com/api/33/apps"

Vous pouvez aussi simplement orienter votre navigateur web vers l'URL de la ressource :

http://server.com/api/33/apps

La liste des applications peut également être filtrée par type d'application et par nom, en ajoutant un ou plusieurs paramètres filtre à l'URL :

http://server.com/api/33/apps?filter=appType:eq:DASHBOARD_APP&filter=name:ilike:youtube

Les noms d'applications prennent en charge les opérateurs de filtrage eq et ilike, tandis que appType ne prend en charge que eq.

Installer une application

Pour installer une application, la commande suivante peut être exécutée :

curl -X POST -u user:pass -F file=@app.zip "http://server.com/api/33/apps"

Supprimer une application

Pour supprimer une application, vous pouvez exécuter la commande suivante :

curl -X DELETE -u user:pass "http://server.com/api/33/apps/<app-key>"

Recharger les applications

Pour forcer le rechargement des applications actuellement installées, vous pouvez lancer la commande suivante. Cette commande est utile si vous avez ajouté manuellement un fichier directement dans le système de fichiers, au lieu de le télécharger via l'interface utilisateur de DHIS2.

curl -X PUT -u user:pass "http://server.com/api/33/apps"

Partager des applications entre instances

Si l'instance DHIS2 a été configurée pour utiliser le stockage en nuage, les applications seront désormais installées et stockées sur le service en nuage. Cela permettra à plusieurs instances de partager les mêmes versions des applications installées, au lieu d'installer les mêmes applications sur chaque instance individuelle.

Remarque

Avant la version 2.28, les applications installées étaient uniquement stockées sur le système de fichiers local de l'instance. Les applications installées avant la version 2.28 seront toujours disponibles sur l'instance où elles ont été installées, mais elles ne seront pas partagées avec d'autres instances, car elles sont toujours situées sur le système de fichiers local de l'instance.

Le App store

L'API Web expose le contenu de l'App Store DHIS2 sous la forme d'une représentation JSON que l'on peut trouver dans la ressource /api/appHub.

/api/33/appHub

Obtenir les applications

Vous pouvez extraire les applications à l'aide d'une requête GET :

GET /api/33/appHub

Un exemple de réponse JSON est décrit ci-dessous.

{
  [
    {
      "name": "Tabular Tracker Capture",
      "description": "Tabular Tracker Capture is an app that makes you more effective.",
      "sourceUrl": "https://github.com/dhis2/App-repository",
      "appType": "DASHBOARD_WIDGET",
      "status": "PENDING",
      "id": "NSD06BVoV21",
      "developer": {
        "name": "DHIS",
        "organisation": "Uio",
        "address": "Oslo",
        "email": "dhis@abc.com",
      },
      "versions": [
        {
          "id": "upAPqrVgwK6",
          "version": "1.2",
          "minDhisVersion": "2.17",
          "maxDhisVersion": "2.20",
          "downloadUrl": "https://dhis2.org/download/appstore/tabular-capture-12.zip",
          "demoUrl": "http://play.dhis2.org/demo"
        }
      ],
      "images": [
        {
          "id": "upAPqrVgwK6",
          "logo": "true",
          "imageUrl": "https://dhis2.org/download/appstore/tabular-capture-12.png",
          "description": "added feature snapshot",
          "caption": "dialog",
        }
      ]
    }
  ]
}

Installer des applications

Vous pouvez installer des applications sur votre instance DHIS2 en supposant que vous avez les permissions appropriées. Une application est référencée en utilisant la propriété id de la version correspondante de l'application. Une application est installée par une requête POST avec l'identifiant de la version à la ressource suivante :

POST /api/33/appHub/{app-version-id}

OpenAPI

Le serveur DHIS2 peut fournir un document OpenAPI pour son API. Ce document est créé à la volée à partir de l'analyse de l'API réelle. Cela signifie que le document est terminé, mais que des détails peuvent être perdus ou mal interprétés en raison des limites de l'analyse.

Les formats JSON et YAML sont supportés par tous les points d'entrée de l'OpenAPI. YAML doit être consulté avec un en-tête Accepter de application/x-yaml.

Pour récupérer un document unique contenant tous les points d'accès du serveur, utilisez :

GET /api/openapi.json
GET /api/openapi.yaml

OBS ! Sachez que cette opération génère un document de plusieurs Mo.

Il est possible d'accéder à un document pour un point de terminaison spécifique en ajoutant soit openapi.json ou openapi.yaml au chemin racine d'un point de terminaison. Par exemple, pour générer un document pour les points de terminaison /users, utilisez :

GET /api/users/openapi.json
GET /api/users/openapi.yaml

Pour générer un document avec une sélection spécifique de chemins d'accès à la racine et/ou des étiquettes, le point d'accès général /openapi peut être utilisé avec un ou plusieurs sélecteurs étiquette et chemin.

GET /api/openapi/openapi.json?path=/users&path=/dataElements
GET /api/openapi/openapi.yaml?tag=system&tag=metadata

Les étiquettes disponibles sont :

  • utilisateur
  • données
  • métadonnées
  • ui
  • analyses
  • système
  • messagerie
  • tracker
  • intégration
  • connexion
  • requête
  • gestion

All endpoints that generate a OpenAPI document support the following optional request parameters:

failOnNameClash

When set to true, two or more types of same simple (unqualified) name are considered clashing and the generation fails with an error.

When set false (default), name clashes are resolved by adding numbers to the simple name to make each of them unique. As a result the names are not predictable or stable. Merging simple names with their intended markdown documentation based on name will be broken. This option is meant as a preview feature which should only be used during development.

failOnInconsistency

When set to true, a semantic inconsistency in the declaration causes the generation to fail with an error. Usually this indicates a programming mistake. For example, declaring a field both as required and having a default value.

When set to false, a semantic inconsistency is logged as warning but the generation proceeds. This might produce a document that contradicts itself semantically but is valid formally.