# SRM-RSK — Base de Données Industriels

Dashboard automatisé + architecture Oracle / APEX, générés à partir des trois documents joints.

## Démarrage rapide

- **Dashboard autonome :** ouvrir `SRM_RSK_Dashboard.html`. Il fonctionne hors ligne avec une persistance locale dans le navigateur.
- **Mode serveur (recommandé, déjà disponible dans l'aperçu live) :**

```bash
python3 dashboard/app.py
# http://0.0.0.0:8000/
```

Le serveur expose une API JSON et une base **SQLite normalisée** (`dashboard/srm_rsk.db`) qui prototype le schéma Oracle, avec la table `direction` et la migration v2 des codes. Aucune dépendance tierce n'est requise.

## Accès public en ligne

| Ressource | Lien public |
| --- | --- |
| **Miroir statique public (sans jeton)** | **https://dffi0o2hbh.brewpage.app/** |
| Dashboard interactif / API | https://8000-ips0uqxecikoswqhoil78.e2b.app/ |
| Index de tous les livrables | https://8000-ips0uqxecikoswqhoil78.e2b.app/livrables.html |
| Architecture APEX (Markdown) | https://8000-ips0uqxecikoswqhoil78.e2b.app/SRM_RSK_Architecture_APEX.md |
| DDL Oracle (SQL) | https://8000-ips0uqxecikoswqhoil78.e2b.app/schema_oracle.sql |
| README | https://8000-ips0uqxecikoswqhoil78.e2b.app/README.md |
| Santé de l'API | https://8000-ips0uqxecikoswqhoil78.e2b.app/api/health |

> **Portée :** `https://dffi0o2hbh.brewpage.app/` est un miroir statique public sans jeton, valable jusqu'au 03 décembre 2026 ; le dashboard y fonctionne en mode navigateur (localStorage). `https://8000-ips0uqxecikoswqhoil78.e2b.app` est l'aperçu live Arena avec API SQLite, partageable tant que le processus du sandbox est actif. Ce ne sont pas des hébergements permanents : pour une disponibilité durable, publier le HTML/docs sur un hébergeur statique et déployer le backend Oracle + ORDS / APEX.

## Numérotation des industriels

**Format :** `IN + CODE_DP + '-' + NNNN` — `IN` = Industrie, `CODE_DP` = direction provinciale / préfectorale, `NNNN` = ordre dans cette direction. Exemple : `INDPK-0001` = 1er industriel de la Direction provinciale de Kénitra. Le code est **généré automatiquement** à la création de la fiche ; l'ancien code `IND-0001…` est conservé dans `ANCIEN_CODE` et accepté à l'import.

| CODE_DP | Direction | Province / Préfecture | Exemple |
| --- | --- | --- | --- |
| DPR | Direction provinciale / préfectorale de Rabat | Rabat | `INDPR-0001` |
| DPS | Direction provinciale / préfectorale de Salé | Salé | `INDPS-0001` |
| DPST | Direction provinciale de Skhirat-Témara | Skhirat-Témara | `INDPST-0001` |
| DPK | Direction provinciale de Kénitra | Kénitra | `INDPK-0001` |
| DPKH | Direction provinciale de Khemisset | Khemisset | `INDPKH-0001` |
| DPSK | Direction provinciale de Sidi Kacem | Sidi Kacem | `INDPSK-0001` |
| DPSS | Direction provinciale de Sidi Slimane | Sidi Slimane | `INDPSS-0001` |

## Principe : une seule saisie

Dans **Saisie des résultats**, renseignez uniquement :

- l'industriel, la date, le point de prélèvement, le laboratoire ;
- les **valeurs mesurées** par paramètre.

Le système calcule automatiquement :

| Dérivé | Mécanisme |
|---|---|
| Conformité Art. 42 / 44 / 45 | comparaison à `REF_SEUIL_REGLEMENTAIRE` versionné |
| Vigilance | valeur proche du seuil, sans non-conformité juridique |
| Alertes de dépassement | trigger / règle automatique avec écart % et article |
| Total métaux lourds | somme Cd + Cu + Zn + Cr + Ni + Fe ≤ 15 mg/L |
| KPI | vues + materialized view, jamais saisis |
| Cartographie | dernier statut de chaque industriel |
| Journal MAJ | audit append-only de chaque écriture |
| Exports | CSV analyses, sauvegarde JSON, modèle d'import |

Un import CSV laboratoire est disponible (format long `code_industriel;date;code_parametre;valeur`, ex. `INDPK-0001;2026-11-03;PH;7.2`, ou format large avec une colonne par paramètre). Les anciens codes `IND-0001…` sont résolus automatiquement via `ANCIEN_CODE`.

## Fichiers

| Fichier | Description |
|---|---|
| `SRM_RSK_Dashboard.html` | Dashboard autonome, 9 vues, sans CDN |
| `livrables.html` | Index en ligne de tous les livrables |
| `SRM_RSK_Public_Site.zip` | Archive du site statique public |
| `SRM_RSK_Architecture_APEX.md` | Livrable Markdown complet : synthèse, 32 tables 3NF, numérotation par direction, contraintes, APEX, navigation |
| `schema_oracle.sql` | DDL Oracle : table DIRECTION, trigger de génération de code, référentiels, vues, package PL/SQL, MV KPI |
| `dashboard/app.py` | Serveur HTTP + API + SQLite normalisée + migration v2 des codes |
| `dashboard/seed_data.json` | Seuils réglementaires + 7 directions + jeu de démonstration |
| `dashboard/build.py` | Reconstruit le HTML autonome à partir des sources CSS/JS |
| `dashboard/make_seed.py`, `make_oracle_sql.py`, `make_docs.py` | Générateurs reproductibles |

## Déploiement Oracle APEX

1. Exécuter `schema_oracle.sql` sur le schéma cible (Oracle 12c+ / 19c / 23ai).
2. Créer l'application APEX, les Authorization Schemes et la Page 0 (LOV `DIRECTION.CODE_DP`, items globaux). Le code est généré par `TRG_INDUSTRIEL_CODE` ; ne pas le rendre éditable.
3. Implémenter la page 2 « Saisie des résultats » en Master-Detail + Interactive Grid ; aucune colonne de conformité éditable.
4. Activer APEX Automations pour emails, relances MED et rafraîchissement de `MV_KPI_MENSUEL`.
5. Connecter ORDS / SharePoint / LIMS, puis recetter avec les 4 prélèvements de la présentation (codes `INDPK-0001`, `INDPK-0002`, `INDPK-0003`, `INDPS-0001`).

## Données

Les valeurs limites proviennent du cahier des charges joint (Articles 42, 44 et 45). Le jeu d'essai est déterministe : les 4 lignes d'analyses de la présentation sont reproduites à l'identique ; les autres mesures sont illustratives. Les 12 industriels de démonstration portent désormais un code par direction (`INDPK-0001` …), avec correspondance historique dans `ancien_code`. Les repères 247 / 78 % / 92 % / 14 / 4,2 M m³ / 6,2 j sont des objectifs de la présentation, **recalculés** par le dashboard, non stockés.

Pour réinitialiser la démonstration (codes par direction provinciale) : bouton **Réinit. démo** ou `POST /api/reset`.

---
*Généré le 03 novembre 2026 · Région Rabat-Salé-Kénitra · SRM-RSK*
