# Chaîne de fabrication du numérique

La chaîne de fabrication du numérique, qui s'étend de l'extraction des matières premières à l'assemblage final, joue un rôle central dans les activités économiques et sociétales.

Pourtant, cette chaîne reste insuffisamment étudiée dans son entièreté. De nombreuses analyses existantes portant sur la « criticité » des minerais ne vont pas au-delà d'une approche macroéconomique, souvent focalisée sur la seule rareté d'un métal ou sur le degré de concentration de sa production.

Or, dans le contexte actuel de « polycrise globale », marqué par des tensions géopolitiques, des aléas climatiques et une croissance rapide de la demande hors numérique (transition énergétique, défense, etc.), ces approches généralistes révèlent leurs limites.

L'objectif de ce projet est de proposer à la fois des données les plus complètes possibles sur cette chaîne, et de fournir les outils nécessaires pour la visualisation des relations, les analyses, la lecture des fiches des opérations (assemblage, fabrication, extraction, …).

Le code proposé répond à la partie outillage, avec une architecture modulaire et simplifiée pour faciliter la maintenance et l'évolution.

## Principe général

Le projet est bâti sur un backeng Gitea pour la gestion des fiches et des tickets d'évolution. (Accéder au backend)[https://fabnum-git.peccini.fr/FabNum/Fiches]

Le serveur qui héberge l'application héberge aussi le service Gitea, ce qui permet d'éliminer les temps de latence dus au réseau. Les fiches sont toutefois mise en cache localement en générant les fichiers markdown (référence), html (affichage) et pdf (download).

L'application est écrite en python et utilise majoritairement streamlit.

## Les données du code

### Requirements

Le fichier **requirements.txt** permet d'installer tout ce qui est nécessaire pour l'application.

    python -m venv venv
    source venv/bin/activate
    # Installation depuis le fichier
    pip install -r requirements.txt
    # Génération du fichier
    pipreqs requirements.txt

### Environnement

Le fichier **.env.local** qui contient GITEA_TOKEN n'est pas dans le dépôt car il contient la clé pour accéder au backend. Il doit donc être créé ainsi que le Token. Le TOken doit permetre l'accès en lecture au dépôt et en lecture/écriture au gestionnaire des tickets.

Pour l'environnement de pré-production, (https://fabnum-dev.peccini.fr)[https://fabnum-dev.peccini.fr] :

    ENV_CODE = "dev"
    PORT=8502
    DOT_FILE = "schema.txt"
    GITEA_URL = "https://fabnum-git.peccini.fr/api/v1"
    ORGANISATION = "fabnum"
    DEPOT_FICHES = "fiches"
    DEPOT_CODE = "code"
    ID_PROJET = "3"
    INSTRUCTIONS = "Instructions.md"
    FICHE_IHH = "Fiches/Criticités/Fiche technique IHH.md"
    FICHE_ICS = "Fiches/Criticités/Fiche technique ICS.md"
    FICHE_ISG = "Fiches/Criticités/Fiche technique ISG.md"
    FICHE_IVC = "Fiches/Criticités/Fiche technique IVC.md"

Pour l'environnement de production, (https://fabnum.peccini.fr)[https://fabnum.peccini.fr], le fichier est identique sauf pour :

    PORT=8501

La différence entre les deux environnements se fait au travers de la configuration du proxy Nginx (ci-après celle de dev ; il suffit de changer dev en public pour l'environnement de production) :

    # Ajout d'un en-tête personnalisé pour indiquer l'environnement
    add_header X-Environment "dev" always;
    # Transmettre l'en-tête d'environnement au backend
    proxy_set_header X-Environment "dev";

Cette configuration est utilisée par config.py.

dev et public sont les deux branches officielles du dépôt.

L'application se lance simplement sous la forme :

    streamlit run fabnum.py --server.port 8502

### Lancement par systemd

Ce script permet de lancer l'application en prenant en compte le fichier .env

Pour automatiser le lancement, il est intégré dans systemd :

**/etc/systemd/system/multi-user.target.wants/fabnum-dev.service**

    [Unit]
    Description=Fabnum Dev - Streamlit App
    After=network.target

    [Service]
    User=fabnum
    WorkingDirectory=/home/fabnum/fabnum-dev
    ExecStart=/home/fabnum/fabnum-dev/venv/bin/streamlit run /home/fabnum/fabnum-dev/fabnum.py --server.port 8502
    Restart=always
    RestartSec=5
    Environment=PYTHONUNBUFFERED=1

    [Install]
    WantedBy=multi-user.target


### fabnum.py

Le cœur de l'application. Ce script sert de point d'entrée et d'orchestrateur pour tous les modules fonctionnels :

- **Configuration de l'interface** : Initialisation de Streamlit et chargement des thèmes
- **Gestion de la navigation** : Coordination entre les différents modules selon l'onglet sélectionné
- **Chargement des données** : Acquisition des données depuis le backend Gitea
- **Orchestration des modules** :
  - Module Fiches pour la consultation documentaire
  - Module Analyse pour l'étude des chaînes de dépendance
  - Module Visualisations pour les représentations graphiques
  - Module Personnalisation pour la modification du graphe

Ce fichier est conçu de manière modulaire, déléguant les fonctionnalités spécifiques aux modules spécialisés, ce qui facilite la maintenance et les évolutions futures.

Dans la sidebar, l'application indique une estimation des émissions de gaz à effet de serre. Pour cela, un mécanisme est mis en place dans la configuration Nginx pour enregistrer dans le fichier :
    /var/log/nginx/fabnum-dev.access.log
les informations d'octets transférés.

Ce système est basé sur la création d'un cookie de session, utilisé ensuite pour distinguer les utilisations.

<<<<<<<<<<<à compléter avec la configuration Nginx>>>>>>>>>>>

## Architecture et principes de conception

### Modularité et simplification

L'application a été structurée selon les principes suivants :

1. **Séparation des responsabilités** : Chaque module a une fonction bien définie
2. **Modularité** : Les fonctionnalités sont décomposées en composants réutilisables
3. **Simplification des fonctions** : Les fonctions complexes ont été divisées en sous-fonctions plus simples
4. **Documentation intégrée** : Chaque module dispose de sa propre documentation

### Modules principaux

- **Module Analyse** : [Voir documentation](app/analyse/README.md)
  - Permet d'analyser les relations entre les différents éléments de la chaîne
  - Génère des visualisations Sankey pour identifier les vulnérabilités

- **Module Fiches** : [Voir documentation](app/fiches/README.md)
  - Gère la consultation et l'affichage des fiches techniques
  - Intègre un système de tickets pour la collaboration

- **Module Personnalisation** : [Voir documentation](app/personnalisation/README.md)
  - Permet d'ajouter et modifier des produits personnalisés
  - Offre des fonctionnalités d'import/export de configurations

- **Module Visualisations** : [Voir documentation](app/visualisations/README.md)
  - Propose diverses visualisations graphiques des données
  - Permet d'explorer les données sous différents angles

- **Composants d'interface** : [Voir documentation](components/README.md)
  - Fournit des éléments d'interface réutilisables
  - Assure la cohérence visuelle de l'application

- **Utilitaires partagés** : [Voir documentation](utils/README.md)
  - Centralise les fonctions communes utilisées par les différents modules
  - Gère l'interaction avec l'API Gitea et la manipulation des graphes

### Organisation du code

L'application est organisée de façon modulaire, avec une structure simplifiée qui facilite la maintenance :

```
fabnum-dev/
├── fabnum.py                     # Point d'entrée principal
├── config.py                     # Configuration et variables d'environnement
├── app/                          # Modules fonctionnels principaux
│   ├── analyse/                  # Module d'analyse des chaînes de dépendance
│   │   ├── interface.py          # Interface utilisateur pour l'analyse
│   │   ├── sankey.py             # Génération des diagrammes Sankey
│   │   └── README.md             # Documentation du module
│   ├── fiches/                   # Gestion et affichage des fiches
│   │   ├── interface.py          # Interface utilisateur pour les fiches
│   │   ├── generer.py            # Génération des fiches
│   │   ├── utils/                # Utilitaires spécifiques aux fiches
│   │   ├── utils/dynamic         # Gestion de la génération et affichage des fiches par type d'opération
│   │   ├── utils/tickets         # Gestion de l'affichage et de la création des tickets
│   │   ├── utils/fiches_utils.py # Outils de gestion et rendu des fiches
│   │   └── README.md             # Documentation du module
│   ├── personnalisation/         # Personnalisation de la chaîne
│   │   ├── interface.py          # Interface principale
│   │   ├── ajout.py              # Ajout de produits
│   │   ├── modification.py       # Modification de produits
│   │   ├── import_export.py      # Import/export de configurations
│   │   └── README.md             # Documentation du module
│   └── visualisations/           # Visualisations graphiques
│       ├── interface.py          # Interface des visualisations
│       ├── graphes.py            # Gestion des graphes à visualiser
│       └── README.md             # Documentation du module
├── components/                   # Composants d'interface réutilisables
│   ├── sidebar.py                # Barre latérale de navigation
│   ├── header.py                 # En-tête de l'application
│   ├── footer.py                 # Pied de page
│   ├── connexion.py              # Module de connexion à partir d'un token Gitea
│   └── README.md                 # Documentation des composants
├── utils/                        # Utilitaires partagés
│   ├── gitea.py                  # Connexion API Gitea
│   ├── graph_utils.py            # Manipulation des graphes
│   ├── translations.py           # Module de gestion de l'internationalisation
│   ├── visualisations.py         # Manipulation des graphes de l'onglet Visualisations
│   └── README.md                 # Documentation des utilitaires
├── assets/                       # Ressources statiques
│   ├── locales/                  # Gestion de l'internationalisation
│   ├── styles/                   # Feuilles de style CSS
│   ├── confir.yaml               # Définition des seuils pour les indices
│   ├── fiches_labels.csv         # Dictionnaire d'association entre les fiches et leurs labels (tickets)
│   ├── impact_co2.js             # Calcul d'impact environnemental
│   ├── licence.md                # Licence ajoutée à toutes les fiches
│   └── weakness.png              # Icône de l'onglet dans le navigateur
├── .env                          # Configuration versionnée
├── .env.local                    # Configuration locale (non versionnée)
└── requirements.txt              # Dépendances Python
├── .streamlit/                   # Configuration streamlit côté serveur
│   └── config.toml               # Fichier de configuration : important theme.base = light
```

Chaque module dispose de sa propre documentation détaillée dans un fichier README.md.

## 📚 Documentation complète

Pour une documentation technique détaillée, consultez le dossier [docs/](docs/) :

- **[docs/README.md](docs/README.md)** - Index de la documentation
- **[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)** - Architecture complète du projet
- **[docs/MODULES.md](docs/MODULES.md)** - Guide des modules et exemples d'utilisation
- **[docs/GUIDE_RUFF.md](docs/GUIDE_RUFF.md)** - Guide du linter Ruff
- **[docs/GUIDE_LOGS.md](docs/GUIDE_LOGS.md)** - Système de logging
- **[docs/CONNEXION.md](docs/CONNEXION.md)** - Configuration Gitea

### Tests et qualité du code

Le projet dispose d'une suite de tests automatisés avec **67 tests** (100% passent) :

```bash
# Exécuter tous les tests
pytest -v

# Avec rapport de couverture
pytest --cov=utils --cov=app --cov-report=html

# Tests spécifiques
pytest tests/unit/test_gitea.py -v
```

**Couverture actuelle :** 16% (en progression)

**Modules testés :**
- `utils/gitea.py` : 100% ✓
- `utils/widgets.py` : 100% ✓
- `utils/logger.py` : 94% ✓
- `app/fiches/utils/tickets/core.py` : 77% ✓

Pour plus de détails, consultez [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md#tests).
