From 8710014345b72a2a1503a713222ae5dd2a8dce31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabrication=20du=20Num=C3=A9rique?= Date: Thu, 8 May 2025 21:35:37 +0200 Subject: [PATCH] Modifications du jour --- .gitignore | 2 + .../Fiche assemblage IoT_Wearables.html | 107 ++++++-- .../Fiche assemblage casques VR.html | 73 ++++- .../Fiche assemblage imprimante.html | 119 +++++++-- HTML/Criticités/Fiche technique IHH.html | 8 +- components/fiches.py | 6 +- fabnum.py | 2 +- utils/fiche_dynamic.py | 252 ++++++++++++++++-- 8 files changed, 491 insertions(+), 78 deletions(-) diff --git a/.gitignore b/.gitignore index f500bc5..594e9fd 100644 --- a/.gitignore +++ b/.gitignore @@ -18,6 +18,8 @@ __pycache__/ .streamlit/ venv/ .venv/ +Local/ +HTML/ # Ignorer données Fiches (adapté à ton projet) Instructions.md diff --git a/HTML/Assemblage/Fiche assemblage IoT_Wearables.html b/HTML/Assemblage/Fiche assemblage IoT_Wearables.html index 8197fb9..7ffa121 100644 --- a/HTML/Assemblage/Fiche assemblage IoT_Wearables.html +++ b/HTML/Assemblage/Fiche assemblage IoT_Wearables.html @@ -1,7 +1,23 @@
-

Fiche assemblage : IoT/Wearables

-

Les objets connectés (IoT) et les appareils électroniques portables (wearables) constituent l'un des segments les plus dynamiques du marché des technologies, avec plus de 1,5 milliard d'unités produites annuellement et une croissance projetée de 15-20% par an. Cette catégorie englobe une grande diversité de produits, des montres connectées aux trackers fitness, en passant par les objets domotiques et les capteurs industriels. Leur assemblage présente des défis uniques liés à la miniaturisation extrême, aux contraintes énergétiques et à la nécessité d'intégrer de multiples fonctionnalités dans des volumes très restreints. Le processus d'assemblage comprend généralement le montage d'une carte électronique miniaturisée, l'intégration de capteurs spécialisés, la connexion de batteries compactes et l'encapsulation dans des boîtiers souvent étanches ou résistants. La production est fortement concentrée en Asie, avec une spécialisation croissante selon les types de produits.

-
+

Fiche assemblage IoT/Wearables

+ + + + + + + + + + + + + + + +
VersionDateCommentaire
1.02025-04-22Version initiale
+
Présentation synthétique

Présentation synthétique

+

Les objets connectés (IoT) et les appareils électroniques portables (wearables) constituent l'un des segments les plus dynamiques du marché des technologies, avec plus de 1,5 milliard d'unités produites annuellement et une croissance projetée de 15-20% par an. Cette catégorie englobe une grande diversité de produits, des montres connectées aux trackers fitness, en passant par les objets domotiques et les capteurs industriels. Leur assemblage présente des défis uniques liés à la miniaturisation extrême, aux contraintes énergétiques et à la nécessité d'intégrer de multiples fonctionnalités dans des volumes très restreints. Le processus d'assemblage comprend généralement le montage d'une carte électronique miniaturisée, l'intégration de capteurs spécialisés, la connexion de batteries compactes et l'encapsulation dans des boîtiers souvent étanches ou résistants. La production est fortement concentrée en Asie, avec une spécialisation croissante selon les types de produits.

Composants assemblés

Composants assemblés

@@ -82,8 +98,66 @@
Composants assemblés

Note: Chaque composant listé fait l'objet d'une fiche détaillée séparée qui analyse sa propre chaîne d'approvisionnement et ses vulnérabilités spécifiques. La grande diversité des produits IoT/wearables implique des variations significatives dans l'importance relative de ces composants.

-
+

yaml +Assemblage_IoTWearables: + Malaisie_Assemblage_IoTWearables: + nom_du_pays: Malaisie + part_de_marche: 12% + acteurs: + Flextronics_Malaisie_Assemblage_IoTWearables: + nom_de_l_acteur: Flextronics + part_de_marche: 7% + pays_d_origine: États-Unis + Jabil_Malaisie_Assemblage_IoTWearables: + nom_de_l_acteur: Jabil Circuit + part_de_marche: 5% + pays_d_origine: États-Unis + Chine_Assemblage_IoTWearables: + nom_du_pays: Chine + part_de_marche: 56% + acteurs: + Luxshare_Chine_Assemblage_IoTWearables: + nom_de_l_acteur: Luxshare Precision + part_de_marche: 18% + pays_d_origine: Chine + Foxconn_Chine_Assemblage_IoTWearables: + nom_de_l_acteur: Foxconn + part_de_marche: 25% + pays_d_origine: Taïwan + Goertek_Chine_Assemblage_IoTWearables: + nom_de_l_acteur: Goertek + part_de_marche: 13% + pays_d_origine: Chine + Vietnam_Assemblage_IoTWearables: + nom_du_pays: Vietnam + part_de_marche: 15% + acteurs: + Inventec_Vietnam_Assemblage_IoTWearables: + nom_de_l_acteur: Inventec + part_de_marche: 6% + pays_d_origine: Taïwan + Compal_Vietnam_Assemblage_IoTWearables: + nom_de_l_acteur: Compal Electronics + part_de_marche: 9% + pays_d_origine: Taïwan + Inde_Assemblage_IoTWearables: + nom_du_pays: Inde + part_de_marche: 4% + acteurs: + Dixon_Inde_Assemblage_IoTWearables: + nom_de_l_acteur: Dixon Technologies + part_de_marche: 4% + pays_d_origine: Inde + CoreeDuSud_Assemblage_IoTWearables: + nom_du_pays: Corée du Sud + part_de_marche: 6% + acteurs: + Samsung_CoreeDuSud_Assemblage_IoTWearables: + nom_de_l_acteur: Samsung Electronics + part_de_marche: 6% + pays_d_origine: Corée du Sud

Principaux assembleurs

Principaux assembleurs

+ @@ -180,8 +254,8 @@
Principaux assembleurs
-

Note: Les capacités indiquées représentent la capacité d'assemblage annuelle en 2024-2025. Une spécialisation s'observe entre la production massive en Chine, les wearables haut de gamme en Corée/Malaisie, et les solutions IoT industrielles dans différentes régions.

-
+ +

Note: Les capacités indiquées représentent la capacité d'assemblage annuelle en 2024-2025. Une spécialisation s'observe entre la production massive en Chine, les wearables haut de gamme en Corée/Malaisie, et les solutions IoT industrielles dans différentes régions.

Contraintes spécifiques à l'assemblage

Contraintes spécifiques à l'assemblage

@@ -234,8 +308,7 @@
Contraintes spécifiques à l'assemblage
-

Note: Ces contraintes concernent spécifiquement l'étape d'assemblage final et non la fabrication des composants individuels qui ont leurs propres contraintes traitées dans les fiches spécifiques.

-
+

Note: Ces contraintes concernent spécifiquement l'étape d'assemblage final et non la fabrication des composants individuels qui ont leurs propres contraintes traitées dans les fiches spécifiques.

Matrice des risques liés à l'assemblage

Matrice des risques liés à l'assemblage

@@ -276,6 +349,7 @@
  • R5: Combinaison de matériaux multiples dans des volumes très restreints rendant le recyclage particulièrement complexe
  • R6: Absence de standardisation entre fabricants limitant les économies d'échelle sur les équipements d'assemblage
  • +

    Indice de Herfindahl-Hirschmann

    @@ -302,19 +376,15 @@
    Matrice des risques liés à l'assemblage

    IHH par entreprise (acteurs)

    -

    L’IHH pour les assembleurs d’objets connectés et wearables est de 14, ce qui indique une concentration faible. Bien que Foxconn, Luxshare et Goertek regroupent plus de 55 % du marché, plusieurs autres groupes comme Compal, Inventec, Flex et Jabil viennent équilibrer le secteur. Cette structure permet une certaine résilience industrielle, avec plusieurs options en cas de tension sur un acteur majeur.

    +

    L’IHH pour les assembleurs est de 14, ce qui indique une concentration faible. Bien que Foxconn (25 %), Luxshare Precision (18 %), Goertek (13 %) regroupent plus de 56 % du marché, plusieurs autres groupes viennent équilibrer le secteur. Cette structure permet une certaine résilience industrielle, avec plusieurs options en cas de tension sur un acteur majeur.

    IHH par pays

    -

    L’IHH par pays atteint 36, révélant une concentration géographique élevée. La Chine domine avec 56 % des capacités d’assemblage, suivie du Vietnam (15 %) et de la Malaisie (12 %). Cette dépendance marquée à l’Asie de l’Est expose fortement la chaîne à des risques géopolitiques, logistiques ou sanitaires localisés.

    +

    L’IHH par pays atteint 36, révélant une concentration géographique élevée. La répartition est dominée par Chine (56 %), Vietnam (15 %), Malaisie (12 %), représentant ensemble plus de 83 % des capacités. Cette configuration expose la chaîne à des risques géopolitiques ou logistiques localisés.

    En résumé

      -
    • Le marché présente une structure d’acteurs plutôt diversifiée (IHH 14), favorable à la flexibilité
    • -
    • La concentration géographique est élevée (IHH 36), notamment en faveur de la Chine et de ses sous-traitants
    • -
    • Cette configuration confirme la pertinence des scénarios critiques projetés, en particulier ceux liés aux capteurs et à la régulation
    • -
    • La diversification géographique ou sectorielle (IoT industriel, médical, etc.) est un axe stratégique majeur pour renforcer la robustesse de la chaîne
    • +
    • Le secteur présente une structure d’acteurs plutôt diversifiée (IHH 14)
    • +
    • La concentration géographique est élevée (IHH 36)
    -
    -

    Souhaites-tu que je clôture cette série par un tableau comparatif des IHH pour tous les assemblages traités ?

    -
    +
    Scénarios critiques projetés

    Scénarios critiques projetés

    Scénario 1 : Pénurie mondiale de capteurs ou batteries miniaturisées

      @@ -329,8 +399,7 @@
    • Impact : Mise à l’arrêt d’assemblages destinés à certaines régions (ex. Europe)
    • Chaînes affectées : Fabricants de trackers de santé, assistants vocaux, objets connectés intelligents
    • Répercussions : Modification des configurations logicielles/hardware en fin de ligne, requalification des produits, nécessité de relocalisation
    • -
    -
    +
    Points de vigilance sur la cohérence des données

    Points de vigilance sur la cohérence des données

    • Les parts de marché des assembleurs proviennent souvent de compilations indirectes ou de rapports non publics
    • diff --git a/HTML/Assemblage/Fiche assemblage casques VR.html b/HTML/Assemblage/Fiche assemblage casques VR.html index d98d23b..8156252 100644 --- a/HTML/Assemblage/Fiche assemblage casques VR.html +++ b/HTML/Assemblage/Fiche assemblage casques VR.html @@ -1,5 +1,5 @@
      -

      Fiche assemblage : Casque VR

      +

      Fiche assemblage Casque VR

      @@ -11,7 +11,7 @@ - + @@ -103,8 +103,55 @@
      1.022 avril 20252025-04-22 Version initiale
      Composants assemblés
      -

      Note: Chaque composant listé fait l'objet d'une fiche détaillée séparée qui analyse sa propre chaîne d'approvisionnement et ses vulnérabilités spécifiques.

    +

    Note: Chaque composant listé fait l'objet d'une fiche détaillée séparée qui analyse sa propre chaîne d'approvisionnement et ses vulnérabilités spécifiques.

    +

    yaml +Assemblage_CasquesVR: + CoreeDuSud_Assemblage_CasquesVR: + nom_du_pays: Corée du Sud + part_de_marche: 6% + acteurs: + Samsung_CoreeDuSud_Assemblage_CasquesVR: + nom_de_l_acteur: Samsung Electronics + part_de_marche: 6% + pays_d_origine: Corée du Sud + Chine_Assemblage_CasquesVR: + nom_du_pays: Chine + part_de_marche: 62% + acteurs: + Luxshare_Chine_Assemblage_CasquesVR: + nom_de_l_acteur: Luxshare Precision + part_de_marche: 22% + pays_d_origine: Chine + Goertek_Chine_Assemblage_CasquesVR: + nom_de_l_acteur: Goertek + part_de_marche: 40% + pays_d_origine: Chine + EtatsUnis_Assemblage_CasquesVR: + nom_du_pays: États-Unis + part_de_marche: 12% + acteurs: + Flextronics_EtatsUnis_Assemblage_CasquesVR: + nom_de_l_acteur: Flextronics + part_de_marche: 7% + pays_d_origine: États-Unis + Jabil_EtatsUnis_Assemblage_CasquesVR: + nom_de_l_acteur: Jabil Circuit + part_de_marche: 5% + pays_d_origine: États-Unis + Taiwan_Assemblage_CasquesVR: + nom_du_pays: Taïwan + part_de_marche: 15% + acteurs: + Foxconn_Taiwan_Assemblage_CasquesVR: + nom_de_l_acteur: Foxconn + part_de_marche: 9% + pays_d_origine: Taïwan + Pegatron_Taiwan_Assemblage_CasquesVR: + nom_de_l_acteur: Pegatron + part_de_marche: 6% + pays_d_origine: Taïwan

    Principaux assembleurs

    Principaux assembleurs

    + @@ -183,6 +230,7 @@
    Principaux assembleurs
    +

    Note: Les capacités indiquées représentent la capacité d'assemblage annuelle en 2024-2025. On observe une spécialisation géographique selon le segment de marché, avec les modèles premium plus souvent assemblés aux États-Unis et en Corée du Sud.

    Contraintes spécifiques à l'assemblage

    Contraintes spécifiques à l'assemblage

    @@ -277,7 +325,7 @@
  • R5: Fragilité des composants optiques nécessitant des emballages spéciaux et augmentant les coûts logistiques
  • R6: Nécessité de tests utilisateurs extensifs pour validation du confort, difficilement automatisables
  • -

    Voici comment je veux que ce soit présenté. Pour la fiche serveur, calcule lIHH acteurs et pays et donne moi le chapitre correspondant dans une zone texte à copier.

    +

    Indice de Herfindahl-Hirschmann

    @@ -292,28 +340,27 @@ - + - +
    Acteurs 2042
    Pays 4123
    Matrice des risques liés à l'assemblage

    IHH par entreprise (acteurs)

    -

    L'IHH calculé pour les principaux assembleurs de casques VR est de 20, ce qui indique une concentration modérée. Le marché est dominé par Goertek et Luxshare qui totalisent 62 % du marché, mais il subsiste une diversité d’acteurs secondaires. Cela limite la dépendance extrême à un seul fournisseur tout en appelant à une vigilance en cas de consolidation future.

    +

    L’IHH pour les assembleurs est de 23, ce qui indique une concentration modérée. Goertek (40 %), Luxshare Precision (22 %), Foxconn (9 %) regroupent une part importante du marché. Cette structure permet une résilience relative, mais dépend encore de quelques grands groupes.

    IHH par pays

    -

    L'IHH par pays atteint 41, ce qui marque une forte concentration géographique. La Chine regroupe seule 62 % des capacités d’assemblage, ce qui rend la chaîne très vulnérable à des événements géopolitiques, sanitaires ou douaniers. Les autres pays (Taïwan, États-Unis, Corée du Sud) disposent de parts trop faibles pour rééquilibrer significativement le risque.

    +

    L’IHH par pays atteint 42, révélant une concentration géographique élevée. La répartition est dominée par Chine (62 %), Taïwan (15 %), États-Unis (12 %), représentant ensemble plus de 89 % des capacités. Cette configuration expose la chaîne à des risques géopolitiques ou logistiques localisés.

    En résumé

      -
    • Le marché présente un risque modéré sur les acteurs industriels (IHH 20)
    • -
    • En revanche, il est hautement dépendant d’un seul pays (Chine) pour l’assemblage (IHH 41)
    • -
    • Cette dépendance géographique est l’un des facteurs de vulnérabilité majeurs à surveiller
    • -
    • Le calcul de l’IHH renforce ici la pertinence du scénario géopolitique ci-dessous
    • -
    +
  • Le secteur présente une structure d’acteurs moyennement concentrée (IHH 23)
  • +
  • La concentration géographique est élevée (IHH 42)
  • + +
    Scénarios critiques projetés

    Scénarios critiques projetés

    Scénario 1 : Pénurie ciblée de composants clés

      diff --git a/HTML/Assemblage/Fiche assemblage imprimante.html b/HTML/Assemblage/Fiche assemblage imprimante.html index a28248d..4df7d86 100644 --- a/HTML/Assemblage/Fiche assemblage imprimante.html +++ b/HTML/Assemblage/Fiche assemblage imprimante.html @@ -1,7 +1,22 @@
      -

      Fiche assemblage : Imprimante

      +

      Fiche assemblage Imprimante

      + + + + + + + + + + + + + + + +
      VersionDateCommentaire
      1.02025-04-22Version initiale

      Les imprimantes représentent un segment mature mais toujours essentiel du marché des périphériques informatiques, avec environ 80 millions d'unités produites annuellement. Ce marché englobe diverses technologies (jet d'encre, laser, thermique, 3D) destinées aux usages personnels, professionnels et industriels. L'assemblage des imprimantes présente des défis spécifiques liés à la précision mécanique, à l'intégration de systèmes électromécaniques complexes et à la nécessité d'une fiabilité élevée. Le processus comprend généralement le montage d'un châssis mécanique, l'installation des moteurs et systèmes d'entraînement, l'intégration de la tête d'impression ou du système laser, le montage de la carte mère et des composants électroniques, puis l'assemblage du boîtier extérieur. La production est répartie entre quelques acteurs majeurs, avec une concentration en Asie pour les modèles grand public et une fabrication plus distribuée pour les équipements professionnels et industriels.

      -
      Composants assemblés

      Composants assemblés

      @@ -88,8 +103,70 @@
      Composants assemblés

      Note: Chaque composant listé fait l'objet d'une fiche détaillée séparée qui analyse sa propre chaîne d'approvisionnement et ses vulnérabilités spécifiques. La répartition des coûts varie significativement selon la technologie d'impression et la gamme de produit.

      -
      +

      yaml +Assemblage_Imprimante: + Malaisie_Assemblage_Imprimante: + nom_du_pays: Malaisie + part_de_marche: 6% + acteurs: + HP_Malaisie_Assemblage_Imprimante: + nom_de_l_acteur: HP Malaysia + part_de_marche: 6% + pays_d_origine: États-Unis + Chine_Assemblage_Imprimante: + nom_du_pays: Chine + part_de_marche: 37% + acteurs: + Kinpo_Chine_Assemblage_Imprimante: + nom_de_l_acteur: Kinpo Electronics + part_de_marche: 10% + pays_d_origine: Taïwan + Foxconn_Chine_Assemblage_Imprimante: + nom_de_l_acteur: Foxconn + part_de_marche: 15% + pays_d_origine: Taïwan + CalComp_Chine_Assemblage_Imprimante: + nom_de_l_acteur: Cal-Comp + part_de_marche: 12% + pays_d_origine: Taïwan + Thailande_Assemblage_Imprimante: + nom_du_pays: Thaïlande + part_de_marche: 25% + acteurs: + Canon_Thailande_Assemblage_Imprimante: + nom_de_l_acteur: Canon Thailand + part_de_marche: 14% + pays_d_origine: Japon + Epson_Thailande_Assemblage_Imprimante: + nom_de_l_acteur: Epson Thailand + part_de_marche: 11% + pays_d_origine: Japon + Japon_Assemblage_Imprimante: + nom_du_pays: Japon + part_de_marche: 12% + acteurs: + Canon_Japon_Assemblage_Imprimante: + nom_de_l_acteur: Canon + part_de_marche: 7% + pays_d_origine: Japon + Ricoh_Japon_Assemblage_Imprimante: + nom_de_l_acteur: Ricoh + part_de_marche: 5% + pays_d_origine: Japon + Philippines_Assemblage_Imprimante: + nom_du_pays: Philippines + part_de_marche: 15% + acteurs: + Canon_Philippines_Assemblage_Imprimante: + nom_de_l_acteur: Canon Philippines + part_de_marche: 6% + pays_d_origine: Japon + Brother_Philippines_Assemblage_Imprimante: + nom_de_l_acteur: Brother Industries + part_de_marche: 9% + pays_d_origine: Japon

    Principaux assembleurs

    Principaux assembleurs

    + @@ -125,21 +202,21 @@ - + - + - + - + @@ -192,8 +269,8 @@
    37 %
    ThailandeThaïlande Canon Thailand Japon 14 %
    ThailandeThaïlande Epson Thailand Japon 11 %
    ThailandeThaïlande TotalThailandeThaïlande 25 %
    Principaux assembleurs
    -

    Note: Les capacités indiquées représentent la capacité d'assemblage annuelle en 2024-2025. On observe une spécialisation par technologie et segment de marché, avec les modèles grand public principalement assemblés en Chine et les équipements professionnels au Japon.

    -
    + +

    Note: Les capacités indiquées représentent la capacité d'assemblage annuelle en 2024-2025. On observe une spécialisation par technologie et segment de marché, avec les modèles grand public principalement assemblés en Chine et les équipements professionnels au Japon.

    Contraintes spécifiques à l'assemblage

    Contraintes spécifiques à l'assemblage

    @@ -246,8 +323,7 @@
    Contraintes spécifiques à l'assemblage
    -

    Note: Ces contraintes concernent spécifiquement l'étape d'assemblage final et non la fabrication des composants individuels qui ont leurs propres contraintes traitées dans les fiches spécifiques.

    -
    +

    Note: Ces contraintes concernent spécifiquement l'étape d'assemblage final et non la fabrication des composants individuels qui ont leurs propres contraintes traitées dans les fiches spécifiques.

    Matrice des risques liés à l'assemblage

    Matrice des risques liés à l'assemblage

    @@ -287,6 +363,7 @@
  • R4: Vulnérabilité aux pénuries de composants électromécaniques spécialisés (moteurs pas-à-pas, encodeurs)
  • R5: Processus d'homologation et de certification variant selon les marchés (émissions chimiques, consommation électrique)
  • +

    Indice de Herfindahl-Hirschmann

    @@ -313,19 +390,15 @@
    Matrice des risques liés à l'assemblage

    IHH par entreprise (acteurs)

    -

    L’IHH calculé pour les assembleurs d’imprimantes est de 10, ce qui reflète une concentration industrielle faible. Aucun acteur n’excède 15 % de part de marché et la distribution reste bien ventilée entre plusieurs groupes asiatiques et japonais (Foxconn, Canon, Epson, Cal-Comp…). Cela suggère un marché industriel relativement compétitif, avec une résilience naturelle en cas de défaillance d’un acteur majeur.

    +

    L’IHH pour les assembleurs est de 10, ce qui indique une concentration faible. Bien que Foxconn (15 %), Canon Thailand (14 %), Cal-Comp (12 %) regroupent plus de 41 % du marché, plusieurs autres groupes viennent équilibrer le secteur. Cette structure permet une certaine résilience industrielle, avec plusieurs options en cas de tension sur un acteur majeur.

    IHH par pays

    -

    L’IHH par pays s’élève à 24, ce qui correspond à une concentration modérée selon les standards du DoJ. Bien que la Chine (37 %) et la Thaïlande (25 %) dominent, l’existence de capacités importantes aux Philippines, au Japon et en Malaisie limite partiellement les risques de dépendance extrême à une seule zone géographique.

    +

    L’IHH par pays atteint 24, révélant une concentration géographique modérée. La répartition est dominée par Chine (37 %), Thailande (25 %), Philippines (15 %), représentant ensemble plus de 77 % des capacités.

    En résumé

      -
    • La chaîne d’assemblage d’imprimantes est faiblement concentrée au niveau des acteurs (IHH 10), ce qui la rend robuste à moyen terme
    • -
    • La répartition géographique est modérément concentrée (IHH 24), mais montre des signes positifs de diversification
    • -
    • Cette structure rend la chaîne moins vulnérable qu’en impression 3D ou électronique mobile
    • -
    • Le scénario géopolitique reste néanmoins pertinent en raison du poids cumulé de la Chine et de la Thaïlande
    • +
    • Le secteur présente une structure d’acteurs plutôt diversifiée (IHH 10)
    • +
    • La concentration géographique est modérée (IHH 24)
    -
    -

    Souhaites-tu un bloc équivalent pour une autre fiche encore non traitée ?

    -
    +
    Scénarios critiques projetés

    Scénarios critiques projetés

    Scénario 1 : Pénurie ciblée de composants clés

      @@ -340,16 +413,14 @@
    • Impact : Embargos ou sanctions affectant les sites d’assemblage (ex. Chine, Taiwan)
    • Chaînes affectées : Réduction immédiate de capacité, besoins en relocalisation
    • Répercussions : Baisse temporaire de production, réorganisation logistique, dépendance à des stocks
    • -
    -
    +
    Points de vigilance sur la cohérence des données

    Points de vigilance sur la cohérence des données

    • Vérifier la répartition par technologies (jet d’encre, laser) dans les volumes, non toujours précisée
    • Origine des entreprises (Taiwan/Japon) et lieux d’assemblage parfois confondus
    • Données marché 2024-2025 partiellement estimées sur tendances antérieures (2022-2023)
    • Absence de visibilité sur production 3D ou industrielle (très minoritaire mais non nulle)
    • -
    -
    +
    Sources utilisées

    Sources utilisées

    1. IDC – Worldwide Hardcopy Peripherals Tracker
    2. diff --git a/HTML/Criticités/Fiche technique IHH.html b/HTML/Criticités/Fiche technique IHH.html index ed972e6..bc126f8 100644 --- a/HTML/Criticités/Fiche technique IHH.html +++ b/HTML/Criticités/Fiche technique IHH.html @@ -45,9 +45,9 @@ Mode de calcul

    Criticité par opération

    -
    Assemblage - CasqueVR

    Assemblage - CasqueVR

    +
    Assemblage - CasquesVR

    Assemblage - CasquesVR

    Indice de Herfindahl-Hirschmann

    - +
    @@ -70,7 +70,7 @@ -
    IHH23
    Assemblage - CasqueVR
    +Assemblage - CasquesVR

    IHH par entreprise (acteurs)

    L’IHH pour les assembleurs est de 23, ce qui indique une concentration modérée. Goertek (40 %), Luxshare Precision (22 %), Foxconn (9 %) regroupent une part importante du marché. Cette structure permet une résilience relative, mais dépend encore de quelques grands groupes.

    IHH par pays

    @@ -4645,7 +4645,7 @@ -CasqueVR +CasquesVR 🔴 42 🔶 23 diff --git a/components/fiches.py b/components/fiches.py index ed3479d..f969bba 100644 --- a/components/fiches.py +++ b/components/fiches.py @@ -8,7 +8,7 @@ import markdown from bs4 import BeautifulSoup from latex2mathml.converter import convert as latex_to_mathml from utils.fiche_utils import load_seuils, render_fiche_markdown -from utils.fiche_dynamic import build_dynamic_sections, build_ivc_sections, build_ihh_sections +from utils.fiche_dynamic import build_dynamic_sections, build_ivc_sections, build_ihh_sections, build_isg_sections, build_assemblage_sections import os from utils.gitea import recuperer_date_dernier_commit from datetime import datetime, timezone @@ -71,6 +71,10 @@ def creer_fiche(md_source: str, dossier: str, nom_fichier: str, seuils: dict) -> md_source = build_ivc_sections(md_source) elif context.get("indice_court") == "IHH": md_source = build_ihh_sections(md_source) + elif context.get("indice_court") == "ISG": + md_source = build_isg_sections(md_source) + elif type_fiche == "assemblage" or type_fiche == "fabrication": + md_source = build_assemblage_sections(md_source) # Rendu markdown principal contenu_md = render_fiche_markdown(md_source, seuils) diff --git a/fabnum.py b/fabnum.py index b19e7c7..6f62f75 100644 --- a/fabnum.py +++ b/fabnum.py @@ -468,7 +468,7 @@ if dot_file_path and st.session_state.onglet == "Analyse": niveaux_arrivee_choix = [valeur_defaut] + niveaux_arrivee_possibles - analyse_niveau_arrivee = st.selectbox("Niveau de départ", niveau_choix, key="analyse_niveau_arrivee") + analyse_niveau_arrivee = st.selectbox("Niveau d'arrivée", niveau_choix, key="analyse_niveau_arrivee") if analyse_niveau_arrivee != "-- Sélectionner un niveau --": niveau_arrivee = inverse_niveau_labels[analyse_niveau_arrivee] diff --git a/utils/fiche_dynamic.py b/utils/fiche_dynamic.py index 6b5cd55..36f42d6 100644 --- a/utils/fiche_dynamic.py +++ b/utils/fiche_dynamic.py @@ -3,6 +3,24 @@ import unicodedata from jinja2 import Template import streamlit as st + +def pastille(indice, valeur): + try: + SEUILS = st.session_state['seuils'] + VERT = SEUILS[indice]["vert"]["max"] + ROUGE = SEUILS[indice]["rouge"]["min"] + pastille_verte = "✅" + pastille_orange = "🔶" + pastille_rouge = "🔴" + if float(valeur) < VERT: + return pastille_verte + elif float(valeur) > ROUGE: + return pastille_rouge + else: + return pastille_orange + except: + return "" + # -------- repère chaque bloc ```yaml … ``` ------------- PAIR_RE = re.compile(r"```yaml[^\n]*\n(.*?)```", re.S | re.I) @@ -156,6 +174,161 @@ def build_ivc_sections(md: str) -> str: return md_final +def build_assemblage_sections(md: str) -> str: + """Traite les fiches d'assemblage/fabrication et génère le tableau des assembleurs/fabricants à partir du bloc YAML.""" + # Extraire le schéma depuis l'en-tête YAML de la fiche + schema = None + front_match = re.match(r"(?s)^---\n(.*?)\n---\n", md) + if front_match: + try: + front_matter = yaml.safe_load(front_match.group(1)) + schema = front_matter.get("schema") + type_fiche = front_matter.get("type_fiche") + + # Vérifier si c'est bien une fiche d'assemblage ou de fabrication + if type_fiche not in ["assemblage", "fabrication"] or not schema: + return md + except Exception as e: + st.error(f"Erreur lors du chargement du front matter: {e}") + return md + + # Rechercher le bloc YAML dans la fiche (entre ```yaml et ```) + yaml_block = re.search(r"```yaml\n(.+?)\n```", md, re.DOTALL) + + if not yaml_block: + return md # Pas de bloc YAML trouvé, retourner la fiche inchangée + + # Charger les données YAML + try: + yaml_data = yaml.safe_load(yaml_block.group(1)) + except Exception as e: + st.error(f"Erreur lors du chargement du YAML: {e}") + return md + + # Vérifier la structure du YAML (clé principale suivie des pays) + if not isinstance(yaml_data, dict) or len(yaml_data) == 0: + return md + + # Récupérer la clé principale (nom du produit assemblé) + produit_key = list(yaml_data.keys())[0] + produit_data = yaml_data[produit_key] + + # Structure pour stocker les données triées + pays_data = [] + + # Pour chaque pays, extraire ses données et celles de ses acteurs + for pays_key, pays_info in produit_data.items(): + nom_pays = pays_info.get('nom_du_pays', '') + part_marche_pays = pays_info.get('part_de_marche', '0%') + + # Convertir la part de marché en nombre pour le tri + part_marche_num = float(part_marche_pays.strip('%')) + + acteurs = [] + for acteur_key, acteur_info in pays_info.get('acteurs', {}).items(): + nom_acteur = acteur_info.get('nom_de_l_acteur', '') + part_marche_acteur = acteur_info.get('part_de_marche', '0%') + pays_origine = acteur_info.get('pays_d_origine', '') + + # Convertir la part de marché en nombre pour le tri + part_marche_acteur_num = float(part_marche_acteur.strip('%')) + + acteurs.append({ + 'nom': nom_acteur, + 'part_marche': part_marche_acteur, + 'part_marche_num': part_marche_acteur_num, + 'pays_origine': pays_origine + }) + + # Trier les acteurs par part de marché décroissante + acteurs_tries = sorted(acteurs, key=lambda x: x['part_marche_num'], reverse=True) + + pays_data.append({ + 'nom': nom_pays, + 'part_marche': part_marche_pays, + 'part_marche_num': part_marche_num, + 'acteurs': acteurs_tries + }) + + # Trier les pays par part de marché décroissante + pays_tries = sorted(pays_data, key=lambda x: x['part_marche_num'], reverse=True) + + # Générer le tableau des assembleurs + lignes_tableau = [ + "| **Pays d'implantation** | **Entreprise** | **Pays d'origine** | **Part de marché** |", + "| :-- | :-- | :-- | :-- |" + ] + + for pays in pays_tries: + for acteur in pays['acteurs']: + # Formater la part de marché (retirer le % du texte et ajouter un espace avant %) + part_marche_formattee = acteur['part_marche'].strip('%') + ' %' + lignes_tableau.append( + f"| {pays['nom']} | {acteur['nom']} | {acteur['pays_origine']} | {part_marche_formattee} |" + ) + + # Ajouter la ligne de total pour le pays (en gras) + part_marche_pays_formattee = pays['part_marche'].strip('%') + ' %' + lignes_tableau.append( + f"| **{pays['nom']}** | **Total** | **{pays['nom']}** | **{part_marche_pays_formattee}** |" + ) + + # Construire le tableau final + tableau_final = "\n".join(lignes_tableau) + + # Remplacer la section du tableau dans la fiche (assembleurs ou fabricants selon le type) + if type_fiche == "fabrication": + md_modifie = re.sub( + r".*?", + f"\n{tableau_final}\n", + md, + flags=re.DOTALL + ) + else: # type_fiche == "assemblage" + md_modifie = re.sub( + r".*?", + f"\n{tableau_final}\n", + md, + flags=re.DOTALL + ) + + # Chercher et remplacer la section IHH si un schéma a été identifié + if schema: + # Charger le contenu de la fiche technique IHH + try: + # Essayer de lire le fichier depuis le système de fichiers + ihh_path = "Fiches/Criticités/Fiche technique IHH.md" + with open(ihh_path, "r", encoding="utf-8") as f: + ihh_content = f.read() + + # Chercher la section IHH correspondant au schéma et au type de fiche + # Format de la section : ## Assemblage/Fabrication - [Schema] + if type_fiche == "fabrication": + ihh_section_pattern = rf"## Fabrication - {schema}\s*\n### Indice de Herfindahl-Hirschmann[\s\S]*?(?=\n## |$)" + else: # type_fiche == "assemblage" + ihh_section_pattern = rf"## Assemblage - {schema}\s*\n### Indice de Herfindahl-Hirschmann[\s\S]*?(?=\n## |$)" + ihh_section_match = re.search(ihh_section_pattern, ihh_content) + + if ihh_section_match: + # Extraire la section complète sans le titre principal + ihh_section = ihh_section_match.group(0).split("\n", 2)[2].strip() + + # Remplacer la section IHH dans la fiche d'assemblage + md_modifie = re.sub( + r".*?", + f"\n{ihh_section}\n", + md_modifie, + flags=re.DOTALL + ) + else: + # Si aucune section IHH n'est trouvée pour ce schéma, laisser la section existante + st.warning(f"Aucune section IHH trouvée pour le schéma {schema} dans la fiche technique IHH.") + except Exception as e: + st.error(f"Erreur lors de la lecture/traitement de la fiche IHH: {e}") + + return md_modifie + + # Regex pour capturer les blocs YAML d'opération dans les fiches IHH IHH_RE = re.compile(r"```yaml\s+opération:(.*?)```", re.S | re.I) @@ -205,22 +378,6 @@ def _synth_ihh(operations: list[dict]) -> str: # Compléter avec les autres types si présents result = [] - def pastille(indice, valeur): - if not valeur: - return "" - SEUILS = st.session_state['seuils'] - VERT = SEUILS[indice]["vert"]["max"] - ROUGE = SEUILS[indice]["rouge"]["min"] - pastille_verte = "✅" - pastille_orange = "🔶" - pastille_rouge = "🔴" - if float(valeur) < VERT: - return pastille_verte - elif float(valeur) > ROUGE: - return pastille_rouge - else: - return pastille_orange - # Tableau des produits produits = {k: v for k, v in data_by_item.items() if v['type'] == 'produit'} if produits: @@ -330,3 +487,66 @@ def build_ihh_sections(md: str) -> str: md_final = "\n\n".join(segments) return md_final + + +def _synth_isg(md: str) -> str: + """Crée un tableau de synthèse pour les ISG à partir du bloc YAML des pays.""" + # Regex pour trouver le bloc YAML des pays + yaml_block = re.search(r"```yaml\n(.+?)\n```", md, re.DOTALL) + + if not yaml_block: + return "*(aucune donnée de pays trouvée)*" + + # Charger les données YAML + yaml_data = yaml.safe_load(yaml_block.group(1)) + + # Préparer les lignes du tableau + lignes = ["| Pays | WGI | FSI | NDGAIN | ISG |", "| :-- | :-- | :-- | :-- | :-- |"] + + # Trier les pays par nom + sorted_pays = sorted(yaml_data.items(), key=lambda x: x[1]['pays'].lower()) + + # Ajouter chaque pays au tableau + for identifiant, data in sorted_pays: + pays = data['pays'] + wgi_ps = data['wgi_ps'] + fsi = data['fsi'] + ndgain = data['ndgain'] + isg = data['isg'] + + # Ajouter pastilles en fonction des seuils + pastille_isg = pastille("ISG", isg) if 'ISG' in st.session_state.get('seuils', {}) else "" + + lignes.append(f"| {pays} | {wgi_ps} | {fsi} | {ndgain} | {pastille_isg} {isg} |") + + return "\n".join(lignes) + +def build_isg_sections(md: str) -> str: + """Traite les fiches ISG pour générer le tableau de synthèse des pays.""" + # Vérifier si c'est une fiche ISG (via indice_court dans les frontmatter) + front_match = re.match(r"(?s)^---\n(.*?)\n---\n", md) + if front_match: + front_matter = yaml.safe_load(front_match.group(1)) + if front_matter.get("indice_court") != "ISG": + return md # Ce n'est pas une fiche ISG + + # Générer le tableau de synthèse + synth_table = _synth_isg(md) + + # Remplacer la section du tableau final + md_final = re.sub( + r"## Tableau de synthèse\s*\n.*?", + f"## Tableau de synthèse\n\n{synth_table}\n", + md, + flags=re.S + ) + + # Supprimer le bloc YAML des pays (entre # Criticité par pays et le prochain titre ##) + md_final = re.sub( + r"# Criticité par pays\s*\n```yaml[\s\S]*?```\s*", + "# Criticité par pays\n\n", + md_final, + flags=re.S + ) + + return md_final