Modifications du jour

This commit is contained in:
Fabrication du Numérique 2025-05-08 21:35:37 +02:00
parent 967ca4bcf2
commit 8710014345
8 changed files with 491 additions and 78 deletions

2
.gitignore vendored
View File

@ -18,6 +18,8 @@ __pycache__/
.streamlit/ .streamlit/
venv/ venv/
.venv/ .venv/
Local/
HTML/
# Ignorer données Fiches (adapté à ton projet) # Ignorer données Fiches (adapté à ton projet)
Instructions.md Instructions.md

View File

@ -1,7 +1,23 @@
<section role="region" aria-labelledby="fiche-assemblage-iot-wearables"> <section role="region" aria-labelledby="fiche-assemblage-iot-wearables">
<h1 id="fiche-assemblage-iot-wearables">Fiche assemblage : IoT/Wearables</h1> <h1 id="fiche-assemblage-iot-wearables">Fiche assemblage IoT/Wearables</h1>
<p>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.</p> <table role="table" summary>
<hr/> <thead>
<tr>
<th scope="col" style="text-align: left;">Version</th>
<th scope="col" style="text-align: left;">Date</th>
<th scope="col" style="text-align: left;">Commentaire</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">1.0</td>
<td style="text-align: left;">2025-04-22</td>
<td style="text-align: left;">Version initiale</td>
</tr>
</tbody>
</table>
<details><summary>Présentation synthétique</summary><h2>Présentation synthétique</h2>
<p>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.</p></details>
<details><summary>Composants assemblés</summary><h2>Composants assemblés</h2> <details><summary>Composants assemblés</summary><h2>Composants assemblés</h2>
<table role="table" summary="Composants assemblés"> <table role="table" summary="Composants assemblés">
<thead> <thead>
@ -82,8 +98,66 @@
</tbody> </tbody>
<caption>Composants assemblés</caption></table> <caption>Composants assemblés</caption></table>
<p><em>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.</em></p> <p><em>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.</em></p>
<hr/></details> <p><code>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</code></p></details>
<details><summary>Principaux assembleurs</summary><h2>Principaux assembleurs</h2> <details><summary>Principaux assembleurs</summary><h2>Principaux assembleurs</h2>
<!---- AUTO-BEGIN:TABLEAU-ASSEMBLEURS -->
<table role="table" summary="Principaux assembleurs"> <table role="table" summary="Principaux assembleurs">
<thead> <thead>
<tr> <tr>
@ -180,8 +254,8 @@
</tr> </tr>
</tbody> </tbody>
<caption>Principaux assembleurs</caption></table> <caption>Principaux assembleurs</caption></table>
<p><em>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.</em></p> <!---- AUTO-END:TABLEAU-ASSEMBLEURS -->
<hr/></details> <p><em>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.</em></p></details>
<details><summary>Contraintes spécifiques à l'assemblage</summary><h2>Contraintes spécifiques à l'assemblage</h2> <details><summary>Contraintes spécifiques à l'assemblage</summary><h2>Contraintes spécifiques à l'assemblage</h2>
<table role="table" summary="Contraintes spécifiques à l'assemblage"> <table role="table" summary="Contraintes spécifiques à l'assemblage">
<thead> <thead>
@ -234,8 +308,7 @@
</tr> </tr>
</tbody> </tbody>
<caption>Contraintes spécifiques à l'assemblage</caption></table> <caption>Contraintes spécifiques à l'assemblage</caption></table>
<p><em>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.</em></p> <p><em>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.</em></p></details>
<hr/></details>
<details><summary>Matrice des risques liés à l'assemblage</summary><h2>Matrice des risques liés à l'assemblage</h2> <details><summary>Matrice des risques liés à l'assemblage</summary><h2>Matrice des risques liés à l'assemblage</h2>
<table role="table" summary="Matrice des risques liés à l'assemblage"> <table role="table" summary="Matrice des risques liés à l'assemblage">
<thead> <thead>
@ -276,6 +349,7 @@
<li><strong>R5</strong>: Combinaison de matériaux multiples dans des volumes très restreints rendant le recyclage particulièrement complexe</li> <li><strong>R5</strong>: Combinaison de matériaux multiples dans des volumes très restreints rendant le recyclage particulièrement complexe</li>
<li><strong>R6</strong>: Absence de standardisation entre fabricants limitant les économies d'échelle sur les équipements d'assemblage</li> <li><strong>R6</strong>: Absence de standardisation entre fabricants limitant les économies d'échelle sur les équipements d'assemblage</li>
</ul> </ul>
<!---- AUTO-BEGIN:SECTION-IHH -->
<h3>Indice de Herfindahl-Hirschmann</h3> <h3>Indice de Herfindahl-Hirschmann</h3>
<table role="table" summary="Matrice des risques liés à l'assemblage"> <table role="table" summary="Matrice des risques liés à l'assemblage">
<thead> <thead>
@ -302,19 +376,15 @@
</tbody> </tbody>
<caption>Matrice des risques liés à l'assemblage</caption></table> <caption>Matrice des risques liés à l'assemblage</caption></table>
<h4>IHH par entreprise (acteurs)</h4> <h4>IHH par entreprise (acteurs)</h4>
<p>LIHH pour les assembleurs dobjets connectés et wearables est de <strong>14</strong>, ce qui indique une <strong>concentration faible</strong>. Bien que <strong>Foxconn, Luxshare et Goertek</strong> regroupent plus de 55 % du marché, plusieurs autres groupes comme Compal, Inventec, Flex et Jabil viennent équilibrer le secteur. Cette structure permet une <strong>certaine résilience industrielle</strong>, avec plusieurs options en cas de tension sur un acteur majeur.</p> <p>LIHH pour les assembleurs est de <strong>14</strong>, ce qui indique une <strong>concentration faible</strong>. Bien que <strong>Foxconn (25 %)</strong>, <strong>Luxshare Precision (18 %)</strong>, <strong>Goertek (13 %)</strong> regroupent plus de 56 % du marché, plusieurs autres groupes viennent équilibrer le secteur. Cette structure permet une <strong>certaine résilience industrielle</strong>, avec plusieurs options en cas de tension sur un acteur majeur.</p>
<h4>IHH par pays</h4> <h4>IHH par pays</h4>
<p>LIHH par pays atteint <strong>36</strong>, révélant une <strong>concentration géographique élevée</strong>. La <strong>Chine domine avec 56 %</strong> des capacités dassemblage, suivie du Vietnam (15 %) et de la Malaisie (12 %). Cette dépendance marquée à lAsie de lEst expose fortement la chaîne à des <strong>risques géopolitiques, logistiques ou sanitaires localisés</strong>.</p> <p>LIHH par pays atteint <strong>36</strong>, révélant une <strong>concentration géographique élevée</strong>. La répartition est dominée par <strong>Chine (56 %)</strong>, <strong>Vietnam (15 %)</strong>, <strong>Malaisie (12 %)</strong>, représentant ensemble plus de 83 % des capacités. Cette configuration expose la chaîne à des <strong>risques géopolitiques ou logistiques localisés</strong>.</p>
<h4>En résumé</h4> <h4>En résumé</h4>
<ul> <ul>
<li>Le marché présente une <strong>structure dacteurs plutôt diversifiée</strong> (IHH 14), favorable à la flexibilité</li> <li>Le secteur présente une <strong>structure dacteurs plutôt diversifiée</strong> (IHH 14)</li>
<li>La <strong>concentration géographique est élevée</strong> (IHH 36), notamment en faveur de la Chine et de ses sous-traitants</li> <li>La <strong>concentration géographique est élevée</strong> (IHH 36)</li>
<li>Cette configuration <strong>confirme la pertinence des scénarios critiques projetés</strong>, en particulier ceux liés aux capteurs et à la régulation</li>
<li>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</li>
</ul> </ul>
<hr/> <!---- AUTO-END:SECTION-IHH --></details>
<p>Souhaites-tu que je clôture cette série par un tableau comparatif des IHH pour tous les assemblages traités ?</p>
<hr/></details>
<details><summary>Scénarios critiques projetés</summary><h2>Scénarios critiques projetés</h2> <details><summary>Scénarios critiques projetés</summary><h2>Scénarios critiques projetés</h2>
<h3>Scénario 1 : Pénurie mondiale de capteurs ou batteries miniaturisées</h3> <h3>Scénario 1 : Pénurie mondiale de capteurs ou batteries miniaturisées</h3>
<ul> <ul>
@ -329,8 +399,7 @@
<li><strong>Impact</strong> : Mise à larrêt dassemblages destinés à certaines régions (ex. Europe)</li> <li><strong>Impact</strong> : Mise à larrêt dassemblages destinés à certaines régions (ex. Europe)</li>
<li><strong>Chaînes affectées</strong> : Fabricants de trackers de santé, assistants vocaux, objets connectés intelligents</li> <li><strong>Chaînes affectées</strong> : Fabricants de trackers de santé, assistants vocaux, objets connectés intelligents</li>
<li><strong>Répercussions</strong> : Modification des configurations logicielles/hardware en fin de ligne, requalification des produits, nécessité de relocalisation</li> <li><strong>Répercussions</strong> : Modification des configurations logicielles/hardware en fin de ligne, requalification des produits, nécessité de relocalisation</li>
</ul> </ul></details>
<hr/></details>
<details><summary>Points de vigilance sur la cohérence des données</summary><h2>Points de vigilance sur la cohérence des données</h2> <details><summary>Points de vigilance sur la cohérence des données</summary><h2>Points de vigilance sur la cohérence des données</h2>
<ul> <ul>
<li>Les parts de marché des assembleurs proviennent souvent de compilations indirectes ou de rapports non publics</li> <li>Les parts de marché des assembleurs proviennent souvent de compilations indirectes ou de rapports non publics</li>

View File

@ -1,5 +1,5 @@
<section role="region" aria-labelledby="fiche-assemblage-casque-vr"> <section role="region" aria-labelledby="fiche-assemblage-casque-vr">
<h1 id="fiche-assemblage-casque-vr">Fiche assemblage : Casque VR</h1> <h1 id="fiche-assemblage-casque-vr">Fiche assemblage Casque VR</h1>
<table role="table" summary> <table role="table" summary>
<thead> <thead>
<tr> <tr>
@ -11,7 +11,7 @@
<tbody> <tbody>
<tr> <tr>
<td style="text-align: left;">1.0</td> <td style="text-align: left;">1.0</td>
<td style="text-align: left;">22 avril 2025</td> <td style="text-align: left;">2025-04-22</td>
<td style="text-align: left;">Version initiale</td> <td style="text-align: left;">Version initiale</td>
</tr> </tr>
</tbody> </tbody>
@ -103,8 +103,55 @@
</tr> </tr>
</tbody> </tbody>
<caption>Composants assemblés</caption></table> <caption>Composants assemblés</caption></table>
<p><em>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.</em></p></details> <p><em>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.</em></p>
<p><code>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</code></p></details>
<details><summary>Principaux assembleurs</summary><h2>Principaux assembleurs</h2> <details><summary>Principaux assembleurs</summary><h2>Principaux assembleurs</h2>
<!---- AUTO-BEGIN:TABLEAU-ASSEMBLEURS -->
<table role="table" summary="Principaux assembleurs"> <table role="table" summary="Principaux assembleurs">
<thead> <thead>
<tr> <tr>
@ -183,6 +230,7 @@
</tr> </tr>
</tbody> </tbody>
<caption>Principaux assembleurs</caption></table> <caption>Principaux assembleurs</caption></table>
<!---- AUTO-END:TABLEAU-ASSEMBLEURS -->
<p><em>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.</em></p></details> <p><em>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.</em></p></details>
<details><summary>Contraintes spécifiques à l'assemblage</summary><h2>Contraintes spécifiques à l'assemblage</h2> <details><summary>Contraintes spécifiques à l'assemblage</summary><h2>Contraintes spécifiques à l'assemblage</h2>
<table role="table" summary="Contraintes spécifiques à l'assemblage"> <table role="table" summary="Contraintes spécifiques à l'assemblage">
@ -277,7 +325,7 @@
<li><strong>R5</strong>: Fragilité des composants optiques nécessitant des emballages spéciaux et augmentant les coûts logistiques</li> <li><strong>R5</strong>: Fragilité des composants optiques nécessitant des emballages spéciaux et augmentant les coûts logistiques</li>
<li><strong>R6</strong>: Nécessité de tests utilisateurs extensifs pour validation du confort, difficilement automatisables</li> <li><strong>R6</strong>: Nécessité de tests utilisateurs extensifs pour validation du confort, difficilement automatisables</li>
</ul> </ul>
<p>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.</p> <!---- AUTO-BEGIN:SECTION-IHH -->
<h3>Indice de Herfindahl-Hirschmann</h3> <h3>Indice de Herfindahl-Hirschmann</h3>
<table role="table" summary="Matrice des risques liés à l'assemblage"> <table role="table" summary="Matrice des risques liés à l'assemblage">
<thead> <thead>
@ -292,28 +340,27 @@
<tr> <tr>
<td style="text-align: left;"><strong>Acteurs</strong></td> <td style="text-align: left;"><strong>Acteurs</strong></td>
<td style="text-align: left;"></td> <td style="text-align: left;"></td>
<td style="text-align: left;">20</td> <td style="text-align: left;"><strong>42</strong></td>
<td style="text-align: left;"></td> <td style="text-align: left;"></td>
</tr> </tr>
<tr> <tr>
<td style="text-align: left;"><strong>Pays</strong></td> <td style="text-align: left;"><strong>Pays</strong></td>
<td style="text-align: left;"></td> <td style="text-align: left;"></td>
<td style="text-align: left;"></td> <td style="text-align: left;"></td>
<td style="text-align: left;">41</td> <td style="text-align: left;"><strong>23</strong></td>
</tr> </tr>
</tbody> </tbody>
<caption>Matrice des risques liés à l'assemblage</caption></table> <caption>Matrice des risques liés à l'assemblage</caption></table>
<h4>IHH par entreprise (acteurs)</h4> <h4>IHH par entreprise (acteurs)</h4>
<p>L'IHH calculé pour les principaux assembleurs de casques VR est de <strong>20</strong>, ce qui indique une <strong>concentration modérée</strong>. Le marché est dominé par <strong>Goertek et Luxshare</strong> qui totalisent <strong>62 %</strong> du marché, mais il subsiste une diversité dacteurs secondaires. Cela limite la dépendance extrême à un seul fournisseur tout en appelant à une vigilance en cas de consolidation future.</p> <p>LIHH pour les assembleurs est de <strong>23</strong>, ce qui indique une <strong>concentration modérée</strong>. <strong>Goertek (40 %)</strong>, <strong>Luxshare Precision (22 %)</strong>, <strong>Foxconn (9 %)</strong> regroupent une part importante du marché. Cette structure permet une <strong>résilience relative</strong>, mais dépend encore de quelques grands groupes.</p>
<h4>IHH par pays</h4> <h4>IHH par pays</h4>
<p>L'IHH par pays atteint <strong>41</strong>, ce qui marque une <strong>forte concentration géographique</strong>. La Chine regroupe seule <strong>62 %</strong> des capacités dassemblage, 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.</p> <p>LIHH par pays atteint <strong>42</strong>, révélant une <strong>concentration géographique élevée</strong>. La répartition est dominée par <strong>Chine (62 %)</strong>, <strong>Taïwan (15 %)</strong>, <strong>États-Unis (12 %)</strong>, représentant ensemble plus de 89 % des capacités. Cette configuration expose la chaîne à des <strong>risques géopolitiques ou logistiques localisés</strong>.</p>
<h4>En résumé</h4> <h4>En résumé</h4>
<ul> <ul>
<li>Le marché présente un <strong>risque modéré sur les acteurs industriels</strong> (IHH 20)</li> <li>Le secteur présente une <strong>structure dacteurs moyennement concentrée</strong> (IHH 23)</li>
<li>En revanche, il est <strong>hautement dépendant dun seul pays (Chine)</strong> pour lassemblage (IHH 41)</li> <li>La <strong>concentration géographique est élevée</strong> (IHH 42)</li>
<li>Cette dépendance géographique est lun des facteurs de vulnérabilité majeurs à surveiller</li> </ul>
<li>Le calcul de lIHH renforce ici la pertinence du scénario géopolitique ci-dessous</li> <!---- AUTO-END:SECTION-IHH --></details>
</ul></details>
<details><summary>Scénarios critiques projetés</summary><h2>Scénarios critiques projetés</h2> <details><summary>Scénarios critiques projetés</summary><h2>Scénarios critiques projetés</h2>
<h3>Scénario 1 : Pénurie ciblée de composants clés</h3> <h3>Scénario 1 : Pénurie ciblée de composants clés</h3>
<ul> <ul>

View File

@ -1,7 +1,22 @@
<section role="region" aria-labelledby="fiche-assemblage-imprimante"> <section role="region" aria-labelledby="fiche-assemblage-imprimante">
<h1 id="fiche-assemblage-imprimante">Fiche assemblage : Imprimante</h1> <h1 id="fiche-assemblage-imprimante">Fiche assemblage Imprimante</h1>
<table role="table" summary>
<thead>
<tr>
<th scope="col" style="text-align: left;">Version</th>
<th scope="col" style="text-align: left;">Date</th>
<th scope="col" style="text-align: left;">Commentaire</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">1.0</td>
<td style="text-align: left;">2025-04-22</td>
<td style="text-align: left;">Version initiale</td>
</tr>
</tbody>
</table>
<p>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.</p> <p>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.</p>
<hr/>
<details><summary>Composants assemblés</summary><h2>Composants assemblés</h2> <details><summary>Composants assemblés</summary><h2>Composants assemblés</h2>
<table role="table" summary="Composants assemblés"> <table role="table" summary="Composants assemblés">
<thead> <thead>
@ -88,8 +103,70 @@
</tbody> </tbody>
<caption>Composants assemblés</caption></table> <caption>Composants assemblés</caption></table>
<p><em>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.</em></p> <p><em>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.</em></p>
<hr/></details> <p><code>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</code></p></details>
<details><summary>Principaux assembleurs</summary><h2>Principaux assembleurs</h2> <details><summary>Principaux assembleurs</summary><h2>Principaux assembleurs</h2>
<!---- AUTO-BEGIN:TABLEAU-ASSEMBLEURS -->
<table role="table" summary="Principaux assembleurs"> <table role="table" summary="Principaux assembleurs">
<thead> <thead>
<tr> <tr>
@ -125,21 +202,21 @@
<td style="text-align: left;"><strong>37 %</strong></td> <td style="text-align: left;"><strong>37 %</strong></td>
</tr> </tr>
<tr> <tr>
<td style="text-align: left;">Thailande</td> <td style="text-align: left;">Thaïlande</td>
<td style="text-align: left;">Canon Thailand</td> <td style="text-align: left;">Canon Thailand</td>
<td style="text-align: left;">Japon</td> <td style="text-align: left;">Japon</td>
<td style="text-align: left;">14 %</td> <td style="text-align: left;">14 %</td>
</tr> </tr>
<tr> <tr>
<td style="text-align: left;">Thailande</td> <td style="text-align: left;">Thaïlande</td>
<td style="text-align: left;">Epson Thailand</td> <td style="text-align: left;">Epson Thailand</td>
<td style="text-align: left;">Japon</td> <td style="text-align: left;">Japon</td>
<td style="text-align: left;">11 %</td> <td style="text-align: left;">11 %</td>
</tr> </tr>
<tr> <tr>
<td style="text-align: left;"><strong>Thailande</strong></td> <td style="text-align: left;"><strong>Thaïlande</strong></td>
<td style="text-align: left;"><strong>Total</strong></td> <td style="text-align: left;"><strong>Total</strong></td>
<td style="text-align: left;"><strong>Thailande</strong></td> <td style="text-align: left;"><strong>Thaïlande</strong></td>
<td style="text-align: left;"><strong>25 %</strong></td> <td style="text-align: left;"><strong>25 %</strong></td>
</tr> </tr>
<tr> <tr>
@ -192,8 +269,8 @@
</tr> </tr>
</tbody> </tbody>
<caption>Principaux assembleurs</caption></table> <caption>Principaux assembleurs</caption></table>
<p><em>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.</em></p> <!---- AUTO-END:TABLEAU-ASSEMBLEURS -->
<hr/></details> <p><em>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.</em></p></details>
<details><summary>Contraintes spécifiques à l'assemblage</summary><h2>Contraintes spécifiques à l'assemblage</h2> <details><summary>Contraintes spécifiques à l'assemblage</summary><h2>Contraintes spécifiques à l'assemblage</h2>
<table role="table" summary="Contraintes spécifiques à l'assemblage"> <table role="table" summary="Contraintes spécifiques à l'assemblage">
<thead> <thead>
@ -246,8 +323,7 @@
</tr> </tr>
</tbody> </tbody>
<caption>Contraintes spécifiques à l'assemblage</caption></table> <caption>Contraintes spécifiques à l'assemblage</caption></table>
<p><em>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.</em></p> <p><em>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.</em></p></details>
<hr/></details>
<details><summary>Matrice des risques liés à l'assemblage</summary><h2>Matrice des risques liés à l'assemblage</h2> <details><summary>Matrice des risques liés à l'assemblage</summary><h2>Matrice des risques liés à l'assemblage</h2>
<table role="table" summary="Matrice des risques liés à l'assemblage"> <table role="table" summary="Matrice des risques liés à l'assemblage">
<thead> <thead>
@ -287,6 +363,7 @@
<li><strong>R4</strong>: Vulnérabilité aux pénuries de composants électromécaniques spécialisés (moteurs pas-à-pas, encodeurs)</li> <li><strong>R4</strong>: Vulnérabilité aux pénuries de composants électromécaniques spécialisés (moteurs pas-à-pas, encodeurs)</li>
<li><strong>R5</strong>: Processus d'homologation et de certification variant selon les marchés (émissions chimiques, consommation électrique)</li> <li><strong>R5</strong>: Processus d'homologation et de certification variant selon les marchés (émissions chimiques, consommation électrique)</li>
</ul> </ul>
<!---- AUTO-BEGIN:SECTION-IHH -->
<h3>Indice de Herfindahl-Hirschmann</h3> <h3>Indice de Herfindahl-Hirschmann</h3>
<table role="table" summary="Matrice des risques liés à l'assemblage"> <table role="table" summary="Matrice des risques liés à l'assemblage">
<thead> <thead>
@ -313,19 +390,15 @@
</tbody> </tbody>
<caption>Matrice des risques liés à l'assemblage</caption></table> <caption>Matrice des risques liés à l'assemblage</caption></table>
<h4>IHH par entreprise (acteurs)</h4> <h4>IHH par entreprise (acteurs)</h4>
<p>LIHH calculé pour les assembleurs dimprimantes est de <strong>10</strong>, ce qui reflète une <strong>concentration industrielle faible</strong>. Aucun acteur nexcè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 <strong>marché industriel relativement compétitif</strong>, avec une résilience naturelle en cas de défaillance dun acteur majeur.</p> <p>LIHH pour les assembleurs est de <strong>10</strong>, ce qui indique une <strong>concentration faible</strong>. Bien que <strong>Foxconn (15 %)</strong>, <strong>Canon Thailand (14 %)</strong>, <strong>Cal-Comp (12 %)</strong> regroupent plus de 41 % du marché, plusieurs autres groupes viennent équilibrer le secteur. Cette structure permet une <strong>certaine résilience industrielle</strong>, avec plusieurs options en cas de tension sur un acteur majeur.</p>
<h4>IHH par pays</h4> <h4>IHH par pays</h4>
<p>LIHH par pays sélève à <strong>24</strong>, ce qui correspond à une <strong>concentration modérée</strong> selon les standards du DoJ. Bien que la <strong>Chine (37%)</strong> et la <strong>Thaïlande (25%)</strong> dominent, lexistence 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.</p> <p>LIHH par pays atteint <strong>24</strong>, révélant une <strong>concentration géographique modérée</strong>. La répartition est dominée par <strong>Chine (37 %)</strong>, <strong>Thailande (25 %)</strong>, <strong>Philippines (15 %)</strong>, représentant ensemble plus de 77 % des capacités.</p>
<h4>En résumé</h4> <h4>En résumé</h4>
<ul> <ul>
<li>La chaîne dassemblage dimprimantes est <strong>faiblement concentrée au niveau des acteurs</strong> (IHH 10), ce qui la rend robuste à moyen terme</li> <li>Le secteur présente une <strong>structure dacteurs plutôt diversifiée</strong> (IHH 10)</li>
<li>La <strong>répartition géographique est modérément concentrée</strong> (IHH 24), mais montre des signes positifs de diversification</li> <li>La <strong>concentration géographique est modérée</strong> (IHH 24)</li>
<li>Cette structure rend la chaîne <strong>moins vulnérable quen impression 3D ou électronique mobile</strong></li>
<li>Le scénario géopolitique reste néanmoins pertinent en raison du poids cumulé de la Chine et de la Thaïlande</li>
</ul> </ul>
<hr/> <!---- AUTO-END:SECTION-IHH --></details>
<p>Souhaites-tu un bloc équivalent pour une autre fiche encore non traitée ?</p>
<hr/></details>
<details><summary>Scénarios critiques projetés</summary><h2>Scénarios critiques projetés</h2> <details><summary>Scénarios critiques projetés</summary><h2>Scénarios critiques projetés</h2>
<h3>Scénario 1 : Pénurie ciblée de composants clés</h3> <h3>Scénario 1 : Pénurie ciblée de composants clés</h3>
<ul> <ul>
@ -340,16 +413,14 @@
<li>Impact : Embargos ou sanctions affectant les sites dassemblage (ex. Chine, Taiwan)</li> <li>Impact : Embargos ou sanctions affectant les sites dassemblage (ex. Chine, Taiwan)</li>
<li>Chaînes affectées : Réduction immédiate de capacité, besoins en relocalisation</li> <li>Chaînes affectées : Réduction immédiate de capacité, besoins en relocalisation</li>
<li>Répercussions : Baisse temporaire de production, réorganisation logistique, dépendance à des stocks</li> <li>Répercussions : Baisse temporaire de production, réorganisation logistique, dépendance à des stocks</li>
</ul> </ul></details>
<hr/></details>
<details><summary>Points de vigilance sur la cohérence des données</summary><h2>Points de vigilance sur la cohérence des données</h2> <details><summary>Points de vigilance sur la cohérence des données</summary><h2>Points de vigilance sur la cohérence des données</h2>
<ul> <ul>
<li>Vérifier la répartition par technologies (jet dencre, laser) dans les volumes, non toujours précisée</li> <li>Vérifier la répartition par technologies (jet dencre, laser) dans les volumes, non toujours précisée</li>
<li>Origine des entreprises (Taiwan/Japon) et lieux dassemblage parfois confondus</li> <li>Origine des entreprises (Taiwan/Japon) et lieux dassemblage parfois confondus</li>
<li>Données marché 2024-2025 partiellement estimées sur tendances antérieures (2022-2023)</li> <li>Données marché 2024-2025 partiellement estimées sur tendances antérieures (2022-2023)</li>
<li>Absence de visibilité sur production 3D ou industrielle (très minoritaire mais non nulle)</li> <li>Absence de visibilité sur production 3D ou industrielle (très minoritaire mais non nulle)</li>
</ul> </ul></details>
<hr/></details>
<details><summary>Sources utilisées</summary><h2>Sources utilisées</h2> <details><summary>Sources utilisées</summary><h2>Sources utilisées</h2>
<ol> <ol>
<li><a href="https://www.idc.com/getdoc.jsp?containerId=prUS51171023">IDC Worldwide Hardcopy Peripherals Tracker</a></li> <li><a href="https://www.idc.com/getdoc.jsp?containerId=prUS51171023">IDC Worldwide Hardcopy Peripherals Tracker</a></li>

View File

@ -45,9 +45,9 @@
<caption>Mode de calcul</caption></table></details> <caption>Mode de calcul</caption></table></details>
<h2>Criticité par opération</h2> <h2>Criticité par opération</h2>
<details><summary>Assemblage - CasqueVR</summary><h2>Assemblage - CasqueVR</h2> <details><summary>Assemblage - CasquesVR</summary><h2>Assemblage - CasquesVR</h2>
<h3>Indice de Herfindahl-Hirschmann</h3> <h3>Indice de Herfindahl-Hirschmann</h3>
<table role="table" summary="Assemblage - CasqueVR"> <table role="table" summary="Assemblage - CasquesVR">
<thead> <thead>
<tr> <tr>
<th scope="col" style="text-align: left;"><strong>IHH</strong></th> <th scope="col" style="text-align: left;"><strong>IHH</strong></th>
@ -70,7 +70,7 @@
<td style="text-align: left;"><strong>23</strong></td> <td style="text-align: left;"><strong>23</strong></td>
</tr> </tr>
</tbody> </tbody>
<caption>Assemblage - CasqueVR</caption></table> <caption>Assemblage - CasquesVR</caption></table>
<h4>IHH par entreprise (acteurs)</h4> <h4>IHH par entreprise (acteurs)</h4>
<p>LIHH pour les assembleurs est de <strong>23</strong>, ce qui indique une <strong>concentration modérée</strong>. <strong>Goertek (40 %)</strong>, <strong>Luxshare Precision (22 %)</strong>, <strong>Foxconn (9 %)</strong> regroupent une part importante du marché. Cette structure permet une <strong>résilience relative</strong>, mais dépend encore de quelques grands groupes.</p> <p>LIHH pour les assembleurs est de <strong>23</strong>, ce qui indique une <strong>concentration modérée</strong>. <strong>Goertek (40 %)</strong>, <strong>Luxshare Precision (22 %)</strong>, <strong>Foxconn (9 %)</strong> regroupent une part importante du marché. Cette structure permet une <strong>résilience relative</strong>, mais dépend encore de quelques grands groupes.</p>
<h4>IHH par pays</h4> <h4>IHH par pays</h4>
@ -4645,7 +4645,7 @@
</thead> </thead>
<tbody> <tbody>
<tr> <tr>
<td style="text-align: left;">CasqueVR</td> <td style="text-align: left;">CasquesVR</td>
<td style="text-align: center;">🔴 42</td> <td style="text-align: center;">🔴 42</td>
<td style="text-align: center;">🔶 23</td> <td style="text-align: center;">🔶 23</td>
</tr> </tr>

View File

@ -8,7 +8,7 @@ import markdown
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
from latex2mathml.converter import convert as latex_to_mathml from latex2mathml.converter import convert as latex_to_mathml
from utils.fiche_utils import load_seuils, render_fiche_markdown 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 import os
from utils.gitea import recuperer_date_dernier_commit from utils.gitea import recuperer_date_dernier_commit
from datetime import datetime, timezone 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) md_source = build_ivc_sections(md_source)
elif context.get("indice_court") == "IHH": elif context.get("indice_court") == "IHH":
md_source = build_ihh_sections(md_source) 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 # Rendu markdown principal
contenu_md = render_fiche_markdown(md_source, seuils) contenu_md = render_fiche_markdown(md_source, seuils)

View File

@ -468,7 +468,7 @@ if dot_file_path and st.session_state.onglet == "Analyse":
niveaux_arrivee_choix = [valeur_defaut] + niveaux_arrivee_possibles 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 --": if analyse_niveau_arrivee != "-- Sélectionner un niveau --":
niveau_arrivee = inverse_niveau_labels[analyse_niveau_arrivee] niveau_arrivee = inverse_niveau_labels[analyse_niveau_arrivee]

View File

@ -3,6 +3,24 @@ import unicodedata
from jinja2 import Template from jinja2 import Template
import streamlit as st 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 … ``` ------------- # -------- repère chaque bloc ```yaml … ``` -------------
PAIR_RE = re.compile(r"```yaml[^\n]*\n(.*?)```", re.S | re.I) 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 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"<!---- AUTO-BEGIN:TABLEAU-FABRICANTS -->.*?<!---- AUTO-END:TABLEAU-FABRICANTS -->",
f"<!---- AUTO-BEGIN:TABLEAU-FABRICANTS -->\n{tableau_final}\n<!---- AUTO-END:TABLEAU-FABRICANTS -->",
md,
flags=re.DOTALL
)
else: # type_fiche == "assemblage"
md_modifie = re.sub(
r"<!---- AUTO-BEGIN:TABLEAU-ASSEMBLEURS -->.*?<!---- AUTO-END:TABLEAU-ASSEMBLEURS -->",
f"<!---- AUTO-BEGIN:TABLEAU-ASSEMBLEURS -->\n{tableau_final}\n<!---- AUTO-END:TABLEAU-ASSEMBLEURS -->",
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"<!---- AUTO-BEGIN:SECTION-IHH -->.*?<!---- AUTO-END:SECTION-IHH -->",
f"<!---- AUTO-BEGIN:SECTION-IHH -->\n{ihh_section}\n<!---- AUTO-END:SECTION-IHH -->",
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 # 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) 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 # Compléter avec les autres types si présents
result = [] 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 # Tableau des produits
produits = {k: v for k, v in data_by_item.items() if v['type'] == 'produit'} produits = {k: v for k, v in data_by_item.items() if v['type'] == 'produit'}
if produits: if produits:
@ -330,3 +487,66 @@ def build_ihh_sections(md: str) -> str:
md_final = "\n\n".join(segments) md_final = "\n\n".join(segments)
return md_final 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<!---- AUTO-BEGIN:TABLEAU-FINAL -->.*?<!---- AUTO-END:TABLEAU-FINAL -->",
f"## Tableau de synthèse\n<!---- AUTO-BEGIN:TABLEAU-FINAL -->\n{synth_table}\n<!---- AUTO-END:TABLEAU-FINAL -->",
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