Skip to content

lefuturis/openlmis_dhis2

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

7 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

OpenLMIS-DHIS2 Synchronization Middleware

Middleware Django pour synchroniser les mouvements de stocks entre OpenLMIS (source) et DHIS2 (destination).

🎯 Objectif

Cette application agrège les mouvements de stocks réels (Stock Movements/Events) d'OpenLMIS pour calculer les consommations et réceptions mensuelles, puis pousse ces résultats vers DHIS2.

πŸ—οΈ Architecture

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    Docker Compose Stack                          β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  PostgreSQL β”‚    Redis    β”‚  RabbitMQ   β”‚   Django    β”‚ Celery  β”‚
β”‚   (Base)    β”‚   (Cache)   β”‚  (Broker)   β”‚   (API)     β”‚ (Tasks) β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                β”‚
                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                    β”‚                       β”‚
              β”Œβ”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”           β”Œβ”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”
              β”‚ OpenLMIS  β”‚           β”‚   DHIS2   β”‚
              β”‚   API     β”‚           β”‚    API    β”‚
              β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜           β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸš€ DΓ©marrage Rapide

1. Configuration

# Copier le fichier d'environnement
cp .env.example .env

# Γ‰diter avec vos credentials
nano .env

2. Lancer les services

# Construire et dΓ©marrer tous les services
docker-compose up -d

# VΓ©rifier les logs
docker-compose logs -f

3. Initialiser la base de donnΓ©es

# ExΓ©cuter les migrations
docker-compose exec django python manage.py migrate

# CrΓ©er un superuser
docker-compose exec django python manage.py createsuperuser

# Importer les fichiers CSV de configuration
docker-compose exec django python manage.py import_csv --all

πŸ“ Structure du Projet

openlmis_dhis2/
β”œβ”€β”€ config/                 # Configuration Django/Celery
β”‚   β”œβ”€β”€ settings.py        # Settings avec Loguru
β”‚   β”œβ”€β”€ celery.py          # Configuration Celery Beat
β”‚   └── urls.py
β”œβ”€β”€ sync/                   # Application principale
β”‚   β”œβ”€β”€ models.py          # ModΓ¨les Django (Servers, Mappings, Logs)
β”‚   β”œβ”€β”€ tasks.py           # TΓ’ches Celery
β”‚   β”œβ”€β”€ views.py           # API endpoints
β”‚   β”œβ”€β”€ services/
β”‚   β”‚   β”œβ”€β”€ openlmis_client.py   # Client API OpenLMIS
β”‚   β”‚   β”œβ”€β”€ aggregator.py        # Moteur d'agrΓ©gation Pandas
β”‚   β”‚   └── dhis2_client.py      # Client API DHIS2
β”‚   └── management/commands/
β”‚       └── import_csv.py        # Import des CSV
β”œβ”€β”€ data/                   # Fichiers CSV de configuration
β”‚   β”œβ”€β”€ dhis2.servers.csv
β”‚   β”œβ”€β”€ dhis2.shared_facilities.csv
β”‚   β”œβ”€β”€ dhis2.data_elements.csv
β”‚   β”œβ”€β”€ dhis2.datasets.csv
β”‚   └── dhis2.schedules.csv
β”œβ”€β”€ docker-compose.yml
β”œβ”€β”€ Dockerfile
└── requirements.txt

πŸ“Š Fichiers CSV de Configuration

Fichier Description
dhis2.servers.csv Credentials des serveurs DHIS2
dhis2.shared_facilities.csv Mapping Facility OpenLMIS β†’ Org Unit DHIS2
dhis2.data_elements.csv Mapping Produit + Indicateur β†’ DataElement
dhis2.datasets.csv Configuration des DataSets DHIS2
dhis2.schedules.csv Planification des synchronisations

πŸ”„ Workflow de Synchronisation

Γ‰tape A: Extraction (OpenLMIS)

  • Authentification OAuth2
  • RΓ©cupΓ©ration des stock cards avec pagination
  • Filtrage par pΓ©riode (mois prΓ©cΓ©dent)

Γ‰tape B: Transformation

  • AgrΓ©gation avec Pandas par produit et type de mouvement
  • Calcul des indicateurs: RECEIVED, ISSUED, ADJUSTMENT, OPENING_BALANCE, CLOSING_BALANCE
  • Mapping vers les DataElements DHIS2

Γ‰tape C: Chargement (DHIS2)

  • Construction du payload DataValueSet
  • POST sur /api/dataValueSets
  • Gestion des erreurs et conflits

πŸ–₯️ Endpoints API

Endpoint MΓ©thode Description
/api/status/ GET Statut des dernières syncs
/api/trigger/ POST DΓ©clencher une sync manuelle
/api/logs/ GET Historique des syncs

DΓ©clencher une sync manuellement

curl -X POST http://localhost:8000/api/trigger/ \
  -H "Content-Type: application/json" \
  -d '{"period": "202511"}'

πŸ“ Logs

Les logs sont gΓ©rΓ©s par Loguru avec rotation automatique:

logs/
β”œβ”€β”€ app_2026-01-20.log      # Logs gΓ©nΓ©raux
β”œβ”€β”€ errors_2026-01-20.log   # Erreurs uniquement
└── sync_2026-01-20.log     # Logs de synchronisation

Exemples de logs:

INFO: Start Sync for Facility D001 (Month: Nov 2025)
DEBUG: Aggregated BCG - Received: 150, Issued: 40
ERROR: Mapping missing for Product 'Paracetamol' in data_elements.csv

πŸ”§ Commandes Utiles

# Voir les logs Celery
docker-compose logs -f celery_worker

# AccΓ©der au shell Django
docker-compose exec django python manage.py shell

# Relancer une sync Γ©chouΓ©e
docker-compose exec django python manage.py shell -c \
  "from sync.tasks import retry_failed_syncs; retry_failed_syncs.delay('202511')"

# Monitoring Celery via Flower
# AccΓ©der Γ  http://localhost:5555

πŸ” Variables d'Environnement

Variable Description DΓ©faut
OPENLMIS_BASE_URL URL de l'API OpenLMIS -
OPENLMIS_CLIENT_ID Client ID OAuth2 -
OPENLMIS_CLIENT_SECRET Client Secret OAuth2 -
OPENLMIS_USERNAME Utilisateur OpenLMIS -
OPENLMIS_PASSWORD Mot de passe OpenLMIS -
SYNC_DAY_OF_MONTH Jour de sync mensuelle 5
SYNC_HOUR Heure de sync 2

πŸ“ˆ Monitoring

πŸ› οΈ DΓ©veloppement

# Installer les dΓ©pendances localement
pip install -r requirements.txt

# Lancer les tests
python manage.py test

# VΓ©rifier le code
python manage.py check

πŸ“„ License

MIT License

About

OpenLMIS to DHIS2 Data Synchronization

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors