Tracker¶
Note
Tracker has been re-implemented in DHIS2 2.36. This document describes the new tracker endpoints
POST /api/trackerGET /api/tracker/trackedEntitiesGET /api/tracker/enrollmentsGET /api/tracker/eventsGET /api/tracker/relationshipsThe deprecated tracker endpoints
GET/POST/PUT/DELETE /api/trackedEntityInstanceGET/POST/PUT/DELETE /api/enrollmentsGET/POST/PUT/DELETE /api/eventsGET/POST/PUT/DELETE /api/relationshipshave 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.
Tracked entities¶
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] } |
| storedBy | Client reference for who stored/created the tracked entity. Set on the server. | Non | Oui | Chaîne : Toute | John Doe |
| 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 lesValeurs d'attribut d'entités suivies(ou les "attributs" décrits dans le tableau précédent). Cependant, lesattributs d'entités suiviessont soit connectés à uneentité suivievia sontype d'entité suiviesoit à unprogramme. Nous désignons souvent cette séparation parAttributs de type d'entité suivietAttributs 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é suiviesont desAttributs de type d'entité suivie.
Inscriptions¶
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] } |
| storedBy | Client reference for who stored/created the enrollment. Set on the server. | Non | Oui | Chaîne : Toute | John Doe |
| 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 lesValeurs d'attribut d'entités suivies(ou les "attributs" décrits dans le tableau précédent). Cependant, lesattributs d'entités suiviessont soit connectés à uneentité suivievia sontype d'entité suiviesoit à unprogramme. Nous désignons souvent cette séparation parAttributs de type d'entité suivietAttributs 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
Inscriptionsont desAttributs 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] } |
| storedBy | Client reference for who stored/created the event. Set on the server. | Non | Oui | Chaîne : Toute | John Doe |
| 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 itemrepresents a link to an object. Since arelationshipcan be between any tracker object liketracked entity,enrollment, andevent, the value depends on therelationship type. For example, if arelationship typeconnects from aneventto atracked entity, the format is strict:{ "from": { "event": { "event": "ABCDEF12345" } }, "to": { "trackedEntity": { "trackedEntity": "FEDCBA12345" } } }
Les 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
attributeandvalueproperties are required. To remove an attribute from a tracked entity or enrollment, set thevaluetonullexample.In the context of tracker, we refer to
Tracked Entity AttributesandTracked Entity Attribute Valuessimply 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 theidSchemeon 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 |
| storedBy | Client reference for who stored/created the value. Set on the server. | Non | Oui | Chaîne : Toute | John Doe |
| 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
dataElementandvalueproperties are required. To remove a data value from an event, set thevaluetonullsee example.
Remarques¶
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 |
| storedBy | Client reference for who stored/created the note. Set on the server. | Non | Oui | Chaîne : Toute | John Doe |
| 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
uidorusernamemust 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[].attributeEvent.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
idSchemeparameters 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"
}
]
}
Create¶
Make a POST request to /api/tracker with the importStrategy set to CREATE or CREATE_AND_UPDATE and a payload as described here.
Update¶
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"
}
]
}
Delete¶
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.
Importation CSV¶
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
ERREURsi 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
uiddes objets trackers servent de noms à ces objets dans la charge. Par exemple, l'uidd'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.
Statistiques¶
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 | L'utilisateur : {0} n'a pas d'accès en écriture sur l'unité d'organisation : {1}. | Cela signifie que l'unité d'organisation {1} ne fait pas partie du champ de saisie de l'utilisateur {0} pour que l'opération d'écriture soit autorisée. |
| 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. |
| E1003 | User: {0}, has no write access to TrackedEntity: {1}. | |
| 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 | Seuls les attributs du programme sont autorisés pour l'inscription ; attributs non valides : {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 | L'Événement {0} n'existe pas. | |
| 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. |
| 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. |
| E1112 | La Valeur d'attribut : {0}, est définie sur 'confidentiel' mais le système n'est pas correctement configuré pour crypter les données. | Soit les fichiers JCE sont manquants, soit la propriété de configuration encryption.password peut être manquante dans dhis.conf. |
| 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 | Une note de Tracker avec l'uid {0} existe déjà. | |
| 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 | Il n'est pas autorisé de mettre à jour la propriété de l'entité suivie : {0}. | |
| E1127 | Il n'est pas autorisé de mettre à jour la propriété d'inscription : {0}. | |
| E1128 | Il n'est pas autorisé de mettre à jour la propriété de l'événement : {0}. | |
| 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 | L'événement {0} d'une inscription ne renvoie pas à une entité suivie existante. Les données de votre système sont peut-être corrompues. | 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. | |
| E4000 | La relation : {0} ne peut pas être reliée à elle-même | |
| E4001 | L'élément de relation {0} n'est pas valide pour la relation {1} : un élément ne peut être relié qu'à une seule entité Tracker. | |
| 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 | La relation {0} n'existe pas. | |
| 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à. | |
| E4020 | User: {0}, has no write access to relationship: {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.
Propriétés requises¶
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 :
- La référence est présente dans la charge utile et est non nulle.
- La référence indique le bon type de données et existe dans la base de données
- 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)
Accès des utilisateurs¶
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"
}
]
Valeurs réservées¶
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.
SHOWWARNINGandWARNINGONCOMPLETIONactions can generate only warnings.SHOWERROR,ERRORONCOMPLETION, andSETMANDATORYFIELDactions can generate only errors.ASSIGNaction 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_OVERWRITEsystem 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
skipProgramRulesparameter.
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.
skipSideEffectsflag 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
JSONresponse content.CSVis only supported by tracked entities and events.- You can export a CSV file by adding the
Acceptheader 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
Acceptheader application/csv+gzip for CSV or application/json+gzip for JSON.- You can export a Zip file by adding the
Acceptheader application/csv+zip for CSV or application/json+zip for JSON.
Paramètres de requête courants¶
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
Paramètres de requête pour la 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:descEntities 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
Pointet si lalatitudeet lalongitudesont 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)
- stockéBy (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), ouorgUnitMode=ALLdoit être spécifié. - Un seul des paramètres
programettrackedEntitypeut être spécifié (zéro ou un). - If
programStatusis specified, thenprogrammust also be specified. - If
enrollmentStatusis specified, thenprogrammust also be specified. - Si
followUpest spécifié, alorsprogramdoit également être spécifié. -
Si
enrollmentEnrolledAfterouenrollmentEnrolledBeforeest spécifié, alorsprogramdoit également être spécifié. -
Les éléments du filtre ne peuvent être spécifiés qu'une seule fois.
Exemples de requêtes¶
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
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,storedBy,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:
KeyTrackedEntityMaxLimitdefines the maximum tracked entities in an API response, protecting database and server resources. No limit applies when set to 0. Configure it via/api/systemSettingsas 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:
pageSizeis 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.
Syntaxe de la requête¶
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 |
Exemples de requêtes¶
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:descfield 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:w75KJ2mc4zzFiltering 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
Inscriptions¶
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
Point d'extrémité de la collecte d'inscriptions 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.
Exemples de requêtes¶
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
Format de réponse¶
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,
"storedBy": "healthworker1",
"notes": []
}
]
}
Enrollments single object endpoint¶
GET /api/tracker/enrollments/{uid}
The purpose of this endpoint is to retrieve an enrollment given its ID.
Syntaxe de la requête¶
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 |
Exemples de requêtes¶
A query for an enrollment.
GET /api/tracker/enrollments/JMgRZyeLWOo
Format de réponse¶
{
"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.
Événements 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 |
| storedBy | Nom d'utilisateur |
| providedElsewhere | booléen |
| storedByDataValue | Chaîne |
| createdAtDataValue | DateTime |
| updatedAtDataValue | DateTime |
See Events and Data Values for more field descriptions.
Événements GZIP¶
The response is file events.json.gz or events.csv.gz containing the events.json or events.csv file.
Événements ZIP¶
The response is file events.json.zip or events.csv.zip containing the events.json or events.csv file.
Point d'extrémité de la collecte d'événements 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
attributeCategoryCombonorattributeCategoryOptions, the server returns events for all attribute option combos where the user has read access.
Exemples de requêtes¶
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:/:/,//
Exemple de réponse des événements¶
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",
"storedBy": "bjorn",
"providedElsewhere": false,
"dataElement": "F3ogKBuviRA",
"value": "[-11.4880220438585,7.50978830548003]"
},
{
"createdAt": "2013-12-30T14:23:57.423",
"updatedAt": "2013-12-30T14:23:57.423",
"storedBy": "lars",
"providedElsewhere": false,
"dataElement": "eMyVanycQSC",
"value": "2018-02-07"
},
{
"createdAt": "2013-12-30T14:23:57.382",
"updatedAt": "2013-12-30T14:23:57.382",
"storedBy": "lars",
"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,storedBy,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]",admin,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,admin,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,admin,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.
Syntaxe de la requête¶
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 |
Exemples de requêtes¶
Une requête pour un événement :
GET /api/tracker/events/rgWr86qs0sI
Exemple de réponse d'un événement¶
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",
"storedBy": "system",
"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:descfield 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:w75KJ2mc4zzFiltering 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]
Paramètres de requête¶
| 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,enrollmentoreventparams, 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.
Exemple de réponse¶
{
"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.
Audité¶
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.
Protégé¶
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.
Fermé¶
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
Working lists¶
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}}] |
| 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"] |
| 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" } |
| 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.
Informations complémentaires sur la fusion¶
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"
]
}
Table: Program Notification Template payload¶
| 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.
Messages de programme¶
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
Envoi de messages de programme¶
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_NUMBERorEMAIL(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
}]
}
Table: Program message payload¶
| 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 |
Requête pour des messages de programme¶
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.
| 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
| 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.
Importation¶
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
Exportation¶
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.
Program¶
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
enrolledAtor 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.
Ownership¶
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 |