# Planification de l'actualisation des données EUDR

Objectif : exécuter automatiquement, à horaire fixe, la même actualisation que le
bouton **Paramètres › Actualisation données › Actualiser maintenant**.

L'enchaînement est centralisé dans une seule procédure : **`dbo.usp_Refresh_STG_ALL`**
(base `DB_EUDR_APP`). Elle appelle les 6 procédures de staging dans le bon ordre.
Chacune journalise déjà son passage dans `dbo.app_staging_runs`, donc la tuile
**« Dernier run »** de l'application reflète aussi les exécutions planifiées.

---

## Étape 1 — Installer la procédure (une seule fois)

Sur le serveur SQL, exécuter le script sur la base **DB_EUDR_APP** :

```
sqlcmd -S localhost,1433 -E -d DB_EUDR_APP -C -i sql\15_refresh_all.sql
```

(ou l'ouvrir dans SSMS, vérifier que la base sélectionnée est `DB_EUDR_APP`, puis Exécuter.)

Test manuel :

```
sqlcmd -S localhost,1433 -E -d DB_EUDR_APP -b -C -Q "EXEC dbo.usp_Refresh_STG_ALL;"
```

---

## Étape 2 — Planifier

Deux méthodes. **La méthode A convient à toutes les éditions de SQL Server**
(y compris Express). La méthode B n'est possible que si SQL Server Agent existe.

### Méthode A (recommandée) — Planificateur de tâches Windows + `refresh_eudr.bat`

1. Copier le dossier `scheduler\` sur le serveur (ex. `C:\eudr\scheduler\`).
2. Ouvrir `refresh_eudr.bat` et vérifier en haut :
   - `SQLSERVER=localhost,1433` et `DBNAME=DB_EUDR_APP` (adapter si besoin) ;
   - authentification : `-E` (Windows) par défaut. Pour une auth SQL, suivre les
     commentaires dans le fichier (décommenter `SQL_USER` / `SQL_PWD` / `AUTH`).
3. Créer la tâche planifiée. En ligne de commande (PowerShell/CMD **en administrateur**),
   pour un lancement **tous les jours à 06:00** :

   ```
   schtasks /Create /TN "EUDR - Actualisation" ^
     /TR "C:\eudr\scheduler\refresh_eudr.bat" ^
     /SC DAILY /ST 06:00 ^
     /RU "DOMAINE\compte_service" /RP * ^
     /RL HIGHEST /F
   ```

   - `/RU` : compte Windows qui exécute la tâche. Il doit avoir le droit
     d'exécuter `usp_Refresh_STG_ALL` sur `DB_EUDR_APP` **et** l'accès au linked
     server `EXAT_SRV` (souvent le compte de service SQL ou un compte de domaine dédié).
   - `/RP *` : demande le mot de passe du compte de façon interactive.
   - Cocher « Exécuter même si l'utilisateur n'est pas connecté » (fait par `/RU`+`/RP`).

   *Alternative graphique :* Planificateur de tâches → Créer une tâche →
   Déclencheurs : quotidien 06:00 → Actions : Démarrer un programme →
   `C:\eudr\scheduler\refresh_eudr.bat` → onglet Général : « Exécuter même si
   l'utilisateur n'est pas connecté » + « Exécuter avec les autorisations maximales ».

4. Vérifier : clic droit sur la tâche → **Exécuter**, puis consulter le journal
   généré dans `scheduler\logs\refresh_AAAAMMJJ.log`, et la tuile « Dernier run »
   dans l'application.

**Changer l'horaire :** relancer `schtasks /Create ... /F` avec un autre `/ST`,
ou modifier le déclencheur dans l'interface. Exemples :
- 2× / jour (06:00 et 18:00) : créer une 2ᵉ tâche `/ST 18:00`, ou déclencheur répété.
- Toutes les heures : `/SC HOURLY /MO 1`.

### Méthode B (si SQL Server Agent disponible)

Exécuter `scheduler\eudr_refresh_agent_job.sql` (sur `msdb`). Cela crée le job
**« EUDR - Actualisation stagings »**, quotidien à 06:00. Modifier
`@active_start_time` / `@freq_*` dans le script pour changer l'horaire.
Vérifier ensuite dans SSMS → SQL Server Agent → Jobs.

> Express n'a pas d'Agent : utiliser la méthode A.

---

## Points d'attention

- **Compte d'exécution** : c'est le point le plus fréquent d'échec. Le compte de la
  tâche (ou du service Agent) doit pouvoir lire EXAT via le **linked server EXAT_SRV**.
  Si le test manuel de l'étape 1 fonctionne sous un compte, faites tourner la tâche
  sous ce même compte.
- **Concurrence** : évitez de planifier pendant qu'un utilisateur clique
  « Actualiser maintenant ». Un créneau creux (tôt le matin) est idéal.
- **Suivi** : les erreurs remontent dans `scheduler\logs\*.log` (méthode A),
  dans l'historique du job (méthode B), et toujours dans `dbo.app_staging_runs`
  (colonnes `status` / `message`) + la tuile « Dernier run ».
