Modifications du jour
This commit is contained in:
parent
967ca4bcf2
commit
8710014345
2
.gitignore
vendored
2
.gitignore
vendored
@ -18,6 +18,8 @@ __pycache__/
|
||||
.streamlit/
|
||||
venv/
|
||||
.venv/
|
||||
Local/
|
||||
HTML/
|
||||
|
||||
# Ignorer données Fiches (adapté à ton projet)
|
||||
Instructions.md
|
||||
|
||||
@ -1,7 +1,23 @@
|
||||
<section role="region" aria-labelledby="fiche-assemblage-iot-wearables">
|
||||
<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>
|
||||
<hr/>
|
||||
<h1 id="fiche-assemblage-iot-wearables">Fiche assemblage IoT/Wearables</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>
|
||||
<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>
|
||||
<table role="table" summary="Composants assemblés">
|
||||
<thead>
|
||||
@ -82,8 +98,66 @@
|
||||
</tbody>
|
||||
<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>
|
||||
<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>
|
||||
<!---- AUTO-BEGIN:TABLEAU-ASSEMBLEURS -->
|
||||
<table role="table" summary="Principaux assembleurs">
|
||||
<thead>
|
||||
<tr>
|
||||
@ -180,8 +254,8 @@
|
||||
</tr>
|
||||
</tbody>
|
||||
<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>
|
||||
<hr/></details>
|
||||
<!---- AUTO-END:TABLEAU-ASSEMBLEURS -->
|
||||
<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>
|
||||
<table role="table" summary="Contraintes spécifiques à l'assemblage">
|
||||
<thead>
|
||||
@ -234,8 +308,7 @@
|
||||
</tr>
|
||||
</tbody>
|
||||
<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>
|
||||
<hr/></details>
|
||||
<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>
|
||||
<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">
|
||||
<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>R6</strong>: Absence de standardisation entre fabricants limitant les économies d'échelle sur les équipements d'assemblage</li>
|
||||
</ul>
|
||||
<!---- AUTO-BEGIN:SECTION-IHH -->
|
||||
<h3>Indice de Herfindahl-Hirschmann</h3>
|
||||
<table role="table" summary="Matrice des risques liés à l'assemblage">
|
||||
<thead>
|
||||
@ -302,19 +376,15 @@
|
||||
</tbody>
|
||||
<caption>Matrice des risques liés à l'assemblage</caption></table>
|
||||
<h4>IHH par entreprise (acteurs)</h4>
|
||||
<p>L’IHH pour les assembleurs d’objets 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>L’IHH 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>
|
||||
<p>L’IHH 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 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 <strong>risques géopolitiques, logistiques ou sanitaires localisés</strong>.</p>
|
||||
<p>L’IHH 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>
|
||||
<ul>
|
||||
<li>Le marché présente une <strong>structure d’acteurs plutôt diversifiée</strong> (IHH 14), favorable à la flexibilité</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>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>
|
||||
<li>Le secteur présente une <strong>structure d’acteurs plutôt diversifiée</strong> (IHH 14)</li>
|
||||
<li>La <strong>concentration géographique est élevée</strong> (IHH 36)</li>
|
||||
</ul>
|
||||
<hr/>
|
||||
<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>
|
||||
<!---- AUTO-END:SECTION-IHH --></details>
|
||||
<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>
|
||||
<ul>
|
||||
@ -329,8 +399,7 @@
|
||||
<li><strong>Impact</strong> : Mise à l’arrêt d’assemblages 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>Répercussions</strong> : Modification des configurations logicielles/hardware en fin de ligne, requalification des produits, nécessité de relocalisation</li>
|
||||
</ul>
|
||||
<hr/></details>
|
||||
</ul></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>
|
||||
<ul>
|
||||
<li>Les parts de marché des assembleurs proviennent souvent de compilations indirectes ou de rapports non publics</li>
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
<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>
|
||||
<thead>
|
||||
<tr>
|
||||
@ -11,7 +11,7 @@
|
||||
<tbody>
|
||||
<tr>
|
||||
<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>
|
||||
</tr>
|
||||
</tbody>
|
||||
@ -103,8 +103,55 @@
|
||||
</tr>
|
||||
</tbody>
|
||||
<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>
|
||||
<!---- AUTO-BEGIN:TABLEAU-ASSEMBLEURS -->
|
||||
<table role="table" summary="Principaux assembleurs">
|
||||
<thead>
|
||||
<tr>
|
||||
@ -183,6 +230,7 @@
|
||||
</tr>
|
||||
</tbody>
|
||||
<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>
|
||||
<details><summary>Contraintes spécifiques à l'assemblage</summary><h2>Contraintes spécifiques à l'assemblage</h2>
|
||||
<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>R6</strong>: Nécessité de tests utilisateurs extensifs pour validation du confort, difficilement automatisables</li>
|
||||
</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>
|
||||
<table role="table" summary="Matrice des risques liés à l'assemblage">
|
||||
<thead>
|
||||
@ -292,28 +340,27 @@
|
||||
<tr>
|
||||
<td style="text-align: left;"><strong>Acteurs</strong></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>
|
||||
</tr>
|
||||
<tr>
|
||||
<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;">41</td>
|
||||
<td style="text-align: left;"><strong>23</strong></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
<caption>Matrice des risques liés à l'assemblage</caption></table>
|
||||
<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é d’acteurs secondaires. Cela limite la dépendance extrême à un seul fournisseur tout en appelant à une vigilance en cas de consolidation future.</p>
|
||||
<p>L’IHH 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>
|
||||
<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 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.</p>
|
||||
<p>L’IHH 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>
|
||||
<ul>
|
||||
<li>Le marché présente un <strong>risque modéré sur les acteurs industriels</strong> (IHH 20)</li>
|
||||
<li>En revanche, il est <strong>hautement dépendant d’un seul pays (Chine)</strong> pour l’assemblage (IHH 41)</li>
|
||||
<li>Cette dépendance géographique est l’un des facteurs de vulnérabilité majeurs à surveiller</li>
|
||||
<li>Le calcul de l’IHH renforce ici la pertinence du scénario géopolitique ci-dessous</li>
|
||||
</ul></details>
|
||||
<li>Le secteur présente une <strong>structure d’acteurs moyennement concentrée</strong> (IHH 23)</li>
|
||||
<li>La <strong>concentration géographique est élevée</strong> (IHH 42)</li>
|
||||
</ul>
|
||||
<!---- AUTO-END:SECTION-IHH --></details>
|
||||
<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>
|
||||
<ul>
|
||||
|
||||
@ -1,7 +1,22 @@
|
||||
<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>
|
||||
<hr/>
|
||||
<details><summary>Composants assemblés</summary><h2>Composants assemblés</h2>
|
||||
<table role="table" summary="Composants assemblés">
|
||||
<thead>
|
||||
@ -88,8 +103,70 @@
|
||||
</tbody>
|
||||
<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>
|
||||
<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>
|
||||
<!---- AUTO-BEGIN:TABLEAU-ASSEMBLEURS -->
|
||||
<table role="table" summary="Principaux assembleurs">
|
||||
<thead>
|
||||
<tr>
|
||||
@ -125,21 +202,21 @@
|
||||
<td style="text-align: left;"><strong>37 %</strong></td>
|
||||
</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;">Japon</td>
|
||||
<td style="text-align: left;">14 %</td>
|
||||
</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;">Japon</td>
|
||||
<td style="text-align: left;">11 %</td>
|
||||
</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>Thailande</strong></td>
|
||||
<td style="text-align: left;"><strong>Thaïlande</strong></td>
|
||||
<td style="text-align: left;"><strong>25 %</strong></td>
|
||||
</tr>
|
||||
<tr>
|
||||
@ -192,8 +269,8 @@
|
||||
</tr>
|
||||
</tbody>
|
||||
<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>
|
||||
<hr/></details>
|
||||
<!---- 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 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>
|
||||
<table role="table" summary="Contraintes spécifiques à l'assemblage">
|
||||
<thead>
|
||||
@ -246,8 +323,7 @@
|
||||
</tr>
|
||||
</tbody>
|
||||
<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>
|
||||
<hr/></details>
|
||||
<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>
|
||||
<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">
|
||||
<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>R5</strong>: Processus d'homologation et de certification variant selon les marchés (émissions chimiques, consommation électrique)</li>
|
||||
</ul>
|
||||
<!---- AUTO-BEGIN:SECTION-IHH -->
|
||||
<h3>Indice de Herfindahl-Hirschmann</h3>
|
||||
<table role="table" summary="Matrice des risques liés à l'assemblage">
|
||||
<thead>
|
||||
@ -313,19 +390,15 @@
|
||||
</tbody>
|
||||
<caption>Matrice des risques liés à l'assemblage</caption></table>
|
||||
<h4>IHH par entreprise (acteurs)</h4>
|
||||
<p>L’IHH calculé pour les assembleurs d’imprimantes est de <strong>10</strong>, ce qui reflète une <strong>concentration industrielle faible</strong>. 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 <strong>marché industriel relativement compétitif</strong>, avec une résilience naturelle en cas de défaillance d’un acteur majeur.</p>
|
||||
<p>L’IHH 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>
|
||||
<p>L’IHH 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, 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.</p>
|
||||
<p>L’IHH 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>
|
||||
<ul>
|
||||
<li>La chaîne d’assemblage d’imprimantes est <strong>faiblement concentrée au niveau des acteurs</strong> (IHH 10), ce qui la rend robuste à moyen terme</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>Cette structure rend la chaîne <strong>moins vulnérable qu’en 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>
|
||||
<li>Le secteur présente une <strong>structure d’acteurs plutôt diversifiée</strong> (IHH 10)</li>
|
||||
<li>La <strong>concentration géographique est modérée</strong> (IHH 24)</li>
|
||||
</ul>
|
||||
<hr/>
|
||||
<p>Souhaites-tu un bloc équivalent pour une autre fiche encore non traitée ?</p>
|
||||
<hr/></details>
|
||||
<!---- AUTO-END:SECTION-IHH --></details>
|
||||
<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>
|
||||
<ul>
|
||||
@ -340,16 +413,14 @@
|
||||
<li>Impact : Embargos ou sanctions affectant les sites d’assemblage (ex. Chine, Taiwan)</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>
|
||||
</ul>
|
||||
<hr/></details>
|
||||
</ul></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>
|
||||
<ul>
|
||||
<li>Vérifier la répartition par technologies (jet d’encre, laser) dans les volumes, non toujours précisée</li>
|
||||
<li>Origine des entreprises (Taiwan/Japon) et lieux d’assemblage parfois confondus</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>
|
||||
</ul>
|
||||
<hr/></details>
|
||||
</ul></details>
|
||||
<details><summary>Sources utilisées</summary><h2>Sources utilisées</h2>
|
||||
<ol>
|
||||
<li><a href="https://www.idc.com/getdoc.jsp?containerId=prUS51171023">IDC – Worldwide Hardcopy Peripherals Tracker</a></li>
|
||||
|
||||
@ -45,9 +45,9 @@
|
||||
<caption>Mode de calcul</caption></table></details>
|
||||
<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>
|
||||
<table role="table" summary="Assemblage - CasqueVR">
|
||||
<table role="table" summary="Assemblage - CasquesVR">
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col" style="text-align: left;"><strong>IHH</strong></th>
|
||||
@ -70,7 +70,7 @@
|
||||
<td style="text-align: left;"><strong>23</strong></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
<caption>Assemblage - CasqueVR</caption></table>
|
||||
<caption>Assemblage - CasquesVR</caption></table>
|
||||
<h4>IHH par entreprise (acteurs)</h4>
|
||||
<p>L’IHH 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>
|
||||
@ -4645,7 +4645,7 @@
|
||||
</thead>
|
||||
<tbody>
|
||||
<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;">🔶 23</td>
|
||||
</tr>
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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]
|
||||
|
||||
@ -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"<!---- 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
|
||||
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<!---- 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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user