Spaces:
Running
Running
Upload 9 files
Browse files- IFSBRC.json +1242 -0
- brcGSv9.json +0 -0
- build_data.js +137 -0
- correspondances.json +0 -0
- css/style.css +317 -0
- data.js +0 -0
- ifs_food_v8_fr.json +0 -0
- index.html +55 -19
- js/app.js +233 -0
IFSBRC.json
ADDED
|
@@ -0,0 +1,1242 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
[
|
| 2 |
+
{
|
| 3 |
+
"chapitre_ifs": "1",
|
| 4 |
+
"titre_chapitre": "Responsabilité de la direction",
|
| 5 |
+
"exigences": [
|
| 6 |
+
{
|
| 7 |
+
"ifs_ref": "1.1.1",
|
| 8 |
+
"ifs_texte": "La direction doit développer, mettre en place et tenir à jour une politique d’entreprise qui doit inclure, au moins : la sécurité des aliments, la qualité, la légalité et l’authenticité des produits, l’écoute client, la food safety culture, le développement durable. La politique d’entreprise doit être communiquée à l’ensemble des employés.",
|
| 9 |
+
"brc_refs": ["1.1.1", "1.1.2", "1.1.3", "1.1.5"],
|
| 10 |
+
"brc_texte": "1.1.1 Le site doit posséder une politique documentée... signée, communiquée... inclure culture de sécurité. 1.1.2 Plan clair pour le développement de la culture de sécurité (activités, plan d'action, revue). 1.1.3 Objectifs clairs définis, documentés, communiqués et contrôlés (trimestriel). 1.1.5 Programme de réunions mensuelles."
|
| 11 |
+
},
|
| 12 |
+
{
|
| 13 |
+
"ifs_ref": "1.1.2",
|
| 14 |
+
"ifs_texte": "Toutes les informations relatives à la sécurité des aliments, la qualité, la légalité et l’authenticité des produits doivent être communiquées au personnel concerné de manière efficace et dans les délais prévus.",
|
| 15 |
+
"brc_refs": ["1.1.6", "1.1.10", "1.1.11", "1.1.12", "1.1.13"],
|
| 16 |
+
"brc_texte": "1.1.6 Système de signalement confidentiel. 1.1.10 Audits de recertification à date. 1.1.11 Présence direction aux audits. 1.1.12 Causes fondamentales des non-conformités audit précédent traitées. 1.1.13 Usage logo BRCGS."
|
| 17 |
+
},
|
| 18 |
+
{
|
| 19 |
+
"ifs_ref": "1.2.1 (KO N°1)",
|
| 20 |
+
"ifs_texte": "La direction doit garantir que les employés sont conscients de leurs responsabilités relatives à la sécurité des aliments et à la qualité des produits et que des mécanismes sont mis en place pour vérifier l’efficacité de leurs actions.",
|
| 21 |
+
"brc_refs": ["1.2.1", "1.2.2", "1.2.3"],
|
| 22 |
+
"brc_texte": "1.2.1 Organigramme et distribution claire des responsabilités. 1.2.2 Personnel conscient des responsabilités et accès aux documents. 1.2.3 Personnel conscient d'informer supérieur en cas de risque."
|
| 23 |
+
},
|
| 24 |
+
{
|
| 25 |
+
"ifs_ref": "1.2.2",
|
| 26 |
+
"ifs_texte": "La direction doit fournir des ressources appropriées et suffisantes pour satisfaire aux exigences des produits et des procédés.",
|
| 27 |
+
"brc_refs": ["1.1.7"],
|
| 28 |
+
"brc_texte": "1.1.7 La direction doit apporter les ressources humaines et financières nécessaires."
|
| 29 |
+
},
|
| 30 |
+
{
|
| 31 |
+
"ifs_ref": "1.2.3",
|
| 32 |
+
"ifs_texte": "Le service responsable du management de la sécurité des aliments et de la qualité doit reporter directement à la direction. Un organigramme présentant la structure de la société doit être documenté.",
|
| 33 |
+
"brc_refs": ["1.2.1"],
|
| 34 |
+
"brc_texte": "Voir 1.2.1 (Organigramme et hiérarchie)."
|
| 35 |
+
},
|
| 36 |
+
{
|
| 37 |
+
"ifs_ref": "1.2.4",
|
| 38 |
+
"ifs_texte": "La direction doit garantir que tous les processus (documentés ou non) sont connus par le personnel concerné et appliqués de manière cohérente.",
|
| 39 |
+
"brc_refs": ["1.2.2"],
|
| 40 |
+
"brc_texte": "Voir 1.2.2 (Travail conforme aux procédures)."
|
| 41 |
+
},
|
| 42 |
+
{
|
| 43 |
+
"ifs_ref": "1.2.5",
|
| 44 |
+
"ifs_texte": "Système de veille (législation, scientifique, guides bonnes pratiques, food defence, fraude alimentaire).",
|
| 45 |
+
"brc_refs": ["1.1.8", "1.2.4"],
|
| 46 |
+
"brc_texte": "1.1.8 Système d'information (avancées scientifiques, codes d'usage, authenticité, législation). 1.2.4 Recours à compétences externes si nécessaire."
|
| 47 |
+
},
|
| 48 |
+
{
|
| 49 |
+
"ifs_ref": "1.3.1",
|
| 50 |
+
"ifs_texte": "Revue de direction planifiée (12 mois, max 15 mois). Inclut objectifs, culture FS, audits, retours clients, conformité, fraude, défense, corrections.",
|
| 51 |
+
"brc_refs": ["1.1.4"],
|
| 52 |
+
"brc_texte": "1.1.4 Réunions d'examen de la gestion planifiées annuellement. Évaluation plans d'action, audits, objectifs, réclamations, incidents, HACCP, Food Defence, Fraude, Culture."
|
| 53 |
+
},
|
| 54 |
+
{
|
| 55 |
+
"ifs_ref": "1.3.2",
|
| 56 |
+
"ifs_texte": "Actions résultant de la revue de direction (amélioration, suivi).",
|
| 57 |
+
"brc_refs": ["1.1.4"],
|
| 58 |
+
"brc_texte": "1.1.4 Décisions et actions communiquées, ressources, révision objectifs."
|
| 59 |
+
},
|
| 60 |
+
{
|
| 61 |
+
"ifs_ref": "1.3.3",
|
| 62 |
+
"ifs_texte": "Revue des infrastructures et environnement de travail (bâtiments, machines, transport, locaux personnel, hygiène, ergonomie).",
|
| 63 |
+
"brc_refs": [],
|
| 64 |
+
"brc_texte": "Non spécifié directement dans la grille en face (couvert par section 4 BRC)."
|
| 65 |
+
}
|
| 66 |
+
]
|
| 67 |
+
},
|
| 68 |
+
{
|
| 69 |
+
"chapitre_ifs": "2",
|
| 70 |
+
"titre_chapitre": "Système de Management de la Qualité et Sécurité (HACCP)",
|
| 71 |
+
"exigences": [
|
| 72 |
+
{
|
| 73 |
+
"ifs_ref": "2.1.1.1",
|
| 74 |
+
"ifs_texte": "Procédure de maîtrise des documents (mise en place, tenue à jour, modifications).",
|
| 75 |
+
"brc_refs": ["1.1.9", "3.1.1", "3.1.2", "3.2.1"],
|
| 76 |
+
"brc_texte": "1.1.9 Exemplaire de la norme. 3.1.1 Manuel qualité. 3.1.2 Accès au manuel. 3.2.1 Procédure gestion documents (liste, identification, modifications, remplacement, sécurité)."
|
| 77 |
+
},
|
| 78 |
+
{
|
| 79 |
+
"ifs_ref": "2.1.1.2",
|
| 80 |
+
"ifs_texte": "Système de management documenté, gardé en lieu sûr (physique/numérique).",
|
| 81 |
+
"brc_refs": ["3.1.3"],
|
| 82 |
+
"brc_texte": "3.1.3 Procédures lisibles, non ambiguës, photos/diagrammes si nécessaire."
|
| 83 |
+
},
|
| 84 |
+
{
|
| 85 |
+
"ifs_ref": "2.1.1.3",
|
| 86 |
+
"ifs_texte": "Documents lisibles, clairs, disponibles à tout moment.",
|
| 87 |
+
"brc_refs": ["3.2.1"],
|
| 88 |
+
"brc_texte": "3.2.1 Liste des documents contrôlés, version, modifications."
|
| 89 |
+
},
|
| 90 |
+
{
|
| 91 |
+
"ifs_ref": "2.1.2.1",
|
| 92 |
+
"ifs_texte": "Enregistrements lisibles, renseignés, authentiques. Protection contre modification (système électronique).",
|
| 93 |
+
"brc_refs": ["3.3.1"],
|
| 94 |
+
"brc_texte": "3.3.1 Enregistrements lisibles, non modifiables sans autorisation, sauvegardes."
|
| 95 |
+
},
|
| 96 |
+
{
|
| 97 |
+
"ifs_ref": "2.1.2.2",
|
| 98 |
+
"ifs_texte": "Conservation des enregistrements (Légal + exigences clients). Min 1 an après DLUO.",
|
| 99 |
+
"brc_refs": ["3.3.2"],
|
| 100 |
+
"brc_texte": "3.3.2 Conservation DLUO + 12 mois minimum."
|
| 101 |
+
},
|
| 102 |
+
{
|
| 103 |
+
"ifs_ref": "2.1.2.3",
|
| 104 |
+
"ifs_texte": "Stockage sécurisé et accessible des enregistrements.",
|
| 105 |
+
"brc_refs": ["3.3.1"],
|
| 106 |
+
"brc_texte": "3.3.1 Faciles à trouver, bon état, sécurisés."
|
| 107 |
+
},
|
| 108 |
+
{
|
| 109 |
+
"ifs_ref": "2.2.1.1",
|
| 110 |
+
"ifs_texte": "Plan HACCP complet (Codex, BPF, BPH, législation). Spécifique au site.",
|
| 111 |
+
"brc_refs": ["2.1.2"],
|
| 112 |
+
"brc_texte": "2.1.2 Portée du plan HACCP définie."
|
| 113 |
+
},
|
| 114 |
+
{
|
| 115 |
+
"ifs_ref": "2.2.1.2",
|
| 116 |
+
"ifs_texte": "Couverture de toutes matières premières, emballages, produits, procédés (y compris développement).",
|
| 117 |
+
"brc_refs": ["2.1.2"],
|
| 118 |
+
"brc_texte": "Voir 2.1.2."
|
| 119 |
+
},
|
| 120 |
+
{
|
| 121 |
+
"ifs_ref": "2.2.1.3",
|
| 122 |
+
"ifs_texte": "Plan HACCP basé sur littérature scientifique, avis experts, à jour.",
|
| 123 |
+
"brc_refs": ["2.3.2"],
|
| 124 |
+
"brc_texte": "2.3.2 Informations pertinentes pour analyse dangers (législation, codes d'usage, données scientifiques)."
|
| 125 |
+
},
|
| 126 |
+
{
|
| 127 |
+
"ifs_ref": "2.3.1.1",
|
| 128 |
+
"ifs_texte": "Équipe HACCP multidisciplinaire (connaissances spécifiques, personnel opérationnel).",
|
| 129 |
+
"brc_refs": ["2.1.1"],
|
| 130 |
+
"brc_texte": "2.1.1 Équipe pluridisciplinaire, chef d'équipe compétent, formation HACCP."
|
| 131 |
+
},
|
| 132 |
+
{
|
| 133 |
+
"ifs_ref": "2.3.1.2",
|
| 134 |
+
"ifs_texte": "Responsables HACCP : chef d'équipe interne, formation appropriée.",
|
| 135 |
+
"brc_refs": ["2.1.1"],
|
| 136 |
+
"brc_texte": "Voir 2.1.1."
|
| 137 |
+
},
|
| 138 |
+
{
|
| 139 |
+
"ifs_ref": "2.3.2.1",
|
| 140 |
+
"ifs_texte": "Description complète du produit (composition, physico-chimique, traitement, emballage, DLUO, transport).",
|
| 141 |
+
"brc_refs": ["2.3.1"],
|
| 142 |
+
"brc_texte": "2.3.1 Description complète (composition, origine, pH/aw, traitement, emballage, stockage)."
|
| 143 |
+
},
|
| 144 |
+
{
|
| 145 |
+
"ifs_ref": "2.3.3.1",
|
| 146 |
+
"ifs_texte": "Usage prévu et groupes de consommateurs sensibles.",
|
| 147 |
+
"brc_refs": ["2.4.1"],
|
| 148 |
+
"brc_texte": "2.4.1 Utilisation prévue, groupes vulnérables."
|
| 149 |
+
},
|
| 150 |
+
{
|
| 151 |
+
"ifs_ref": "2.3.4.1",
|
| 152 |
+
"ifs_texte": "Diagramme de flux documenté (étapes, CCP, recyclage).",
|
| 153 |
+
"brc_refs": ["2.5.1"],
|
| 154 |
+
"brc_texte": "2.5.1 Diagramme de flux couvrant tous les aspects (réception, stockage, séparation zones, déchets)."
|
| 155 |
+
},
|
| 156 |
+
{
|
| 157 |
+
"ifs_ref": "2.3.5.1",
|
| 158 |
+
"ifs_texte": "Vérification sur site du diagramme de flux.",
|
| 159 |
+
"brc_refs": ["2.6.1"],
|
| 160 |
+
"brc_texte": "2.6.1 Vérification annuelle ou lors de changements (audit sur site)."
|
| 161 |
+
},
|
| 162 |
+
{
|
| 163 |
+
"ifs_ref": "2.3.6.1",
|
| 164 |
+
"ifs_texte": "Analyse des dangers (physiques, chimiques, bio, radio, allergenes). Probabilité/Gravité.",
|
| 165 |
+
"brc_refs": ["2.7.1", "2.7.2", "2.7.3", "2.7.4"],
|
| 166 |
+
"brc_texte": "2.7.1 Identification dangers (microbio, physique, chimique, fraude, malveillance, allergènes). 2.7.2 Analyse risques (probabilité/gravité). 2.7.3 Mesures de maîtrise. 2.7.4 Programmes préalables."
|
| 167 |
+
},
|
| 168 |
+
{
|
| 169 |
+
"ifs_ref": "2.3.7.1",
|
| 170 |
+
"ifs_texte": "Détermination des CCP (Arbre de décision).",
|
| 171 |
+
"brc_refs": ["2.8.1"],
|
| 172 |
+
"brc_texte": "2.8.1 Détermination CCP (arbre de décision)."
|
| 173 |
+
},
|
| 174 |
+
{
|
| 175 |
+
"ifs_ref": "2.3.8.1",
|
| 176 |
+
"ifs_texte": "Limites critiques définies et validées pour chaque CCP.",
|
| 177 |
+
"brc_refs": ["2.9.1", "2.9.2"],
|
| 178 |
+
"brc_texte": "2.9.1 Limites critiques mesurables. 2.9.2 Validation des limites critiques."
|
| 179 |
+
},
|
| 180 |
+
{
|
| 181 |
+
"ifs_ref": "2.3.9.1 (KO N°2)",
|
| 182 |
+
"ifs_texte": "Procédures de surveillance spécifiques (méthode, fréquence, enregistrement). CCP sous contrôle.",
|
| 183 |
+
"brc_refs": ["2.10.1", "2.10.2"],
|
| 184 |
+
"brc_texte": "2.10.1 Procédure de surveillance (en ligne/hors ligne). 2.10.2 Enregistrements signés et vérifiés."
|
| 185 |
+
},
|
| 186 |
+
{
|
| 187 |
+
"ifs_ref": "2.3.9.2",
|
| 188 |
+
"ifs_texte": "Vérification des enregistrements CCP par personne responsable.",
|
| 189 |
+
"brc_refs": ["2.10.2"],
|
| 190 |
+
"brc_texte": "Voir 2.10.2."
|
| 191 |
+
},
|
| 192 |
+
{
|
| 193 |
+
"ifs_ref": "2.3.9.3",
|
| 194 |
+
"ifs_texte": "Formation spécifique du personnel opérationnel aux CCP.",
|
| 195 |
+
"brc_refs": ["7.1.2"],
|
| 196 |
+
"brc_texte": "Voir 7.1.2 (Section Personnel)."
|
| 197 |
+
},
|
| 198 |
+
{
|
| 199 |
+
"ifs_ref": "2.3.9.4",
|
| 200 |
+
"ifs_texte": "Surveillance des autres mesures de maîtrise (non CCP).",
|
| 201 |
+
"brc_refs": ["2.7.4"],
|
| 202 |
+
"brc_texte": "Voir 2.7.4."
|
| 203 |
+
},
|
| 204 |
+
{
|
| 205 |
+
"ifs_ref": "2.3.10.1",
|
| 206 |
+
"ifs_texte": "Actions correctives en cas de perte de maîtrise CCP (produit, cause racine).",
|
| 207 |
+
"brc_refs": ["2.11.1"],
|
| 208 |
+
"brc_texte": "2.11.1 Plan d'action corrective documenté (produits et processus)."
|
| 209 |
+
},
|
| 210 |
+
{
|
| 211 |
+
"ifs_ref": "2.3.11.2",
|
| 212 |
+
"ifs_texte": "Procédures de vérification du plan HACCP (audit, analyses, plaintes). Min 1 fois/an.",
|
| 213 |
+
"brc_refs": ["2.12.1", "2.12.2", "2.12.3"],
|
| 214 |
+
"brc_texte": "2.12.1 Validation avant changements. 2.12.2 Procédures de vérification (audits, retraits). 2.12.3 Revue annuelle ou lors de changements."
|
| 215 |
+
},
|
| 216 |
+
{
|
| 217 |
+
"ifs_ref": "2.2.1.4",
|
| 218 |
+
"ifs_texte": "Revue du plan HACCP en cas de changement (MP, emballage, process).",
|
| 219 |
+
"brc_refs": ["2.12.3"],
|
| 220 |
+
"brc_texte": "Voir 2.12.3."
|
| 221 |
+
},
|
| 222 |
+
{
|
| 223 |
+
"ifs_ref": "2.3.12.1",
|
| 224 |
+
"ifs_texte": "Documentation et enregistrements HACCP disponibles.",
|
| 225 |
+
"brc_refs": ["2.13.1"],
|
| 226 |
+
"brc_texte": "2.13.1 Documentation et tenue de registres suffisantes."
|
| 227 |
+
}
|
| 228 |
+
]
|
| 229 |
+
},
|
| 230 |
+
{
|
| 231 |
+
"chapitre_ifs": "3",
|
| 232 |
+
"titre_chapitre": "Gestion des Ressources (Personnel)",
|
| 233 |
+
"exigences": [
|
| 234 |
+
{
|
| 235 |
+
"ifs_ref": "3.1.1",
|
| 236 |
+
"ifs_texte": "Personnel compétent (études, expérience, formation).",
|
| 237 |
+
"brc_refs": ["7.1"],
|
| 238 |
+
"brc_texte": "7.1 Formation : zones de manipulation... Fondamental. Personnel manifestement compétent."
|
| 239 |
+
},
|
| 240 |
+
{
|
| 241 |
+
"ifs_ref": "3.1.2",
|
| 242 |
+
"ifs_texte": "Responsabilités et fiches de postes documentées.",
|
| 243 |
+
"brc_refs": ["1.2.1"],
|
| 244 |
+
"brc_texte": "Voir 1.2.1."
|
| 245 |
+
},
|
| 246 |
+
{
|
| 247 |
+
"ifs_ref": "3.2.1",
|
| 248 |
+
"ifs_texte": "Exigences hygiène personnelle documentées (cheveux, barbe, vêtements, mains, bijoux, maladies).",
|
| 249 |
+
"brc_refs": ["7.2.1", "7.2.5"],
|
| 250 |
+
"brc_texte": "7.2.1 Exigences hygiène (montres, bijoux, ongles, parfum). 7.2.5 Médicaments personnels."
|
| 251 |
+
},
|
| 252 |
+
{
|
| 253 |
+
"ifs_ref": "3.2.2 (KO N°3)",
|
| 254 |
+
"ifs_texte": "Exigences hygiène appliquées par personnel, prestataires et visiteurs.",
|
| 255 |
+
"brc_refs": ["7.2"],
|
| 256 |
+
"brc_texte": "Voir 7.2."
|
| 257 |
+
},
|
| 258 |
+
{
|
| 259 |
+
"ifs_ref": "3.2.3",
|
| 260 |
+
"ifs_texte": "Surveillance conformité hygiène (fréquence risques, min 3 mois).",
|
| 261 |
+
"brc_refs": ["7.2.1"],
|
| 262 |
+
"brc_texte": "Voir 7.2.1."
|
| 263 |
+
},
|
| 264 |
+
{
|
| 265 |
+
"ifs_ref": "3.2.4",
|
| 266 |
+
"ifs_texte": "Programme maîtrise efficacité hygiène des mains.",
|
| 267 |
+
"brc_refs": [],
|
| 268 |
+
"brc_texte": "Non explicitement listé en face (inclus dans 7.2 BRC)."
|
| 269 |
+
},
|
| 270 |
+
{
|
| 271 |
+
"ifs_ref": "3.2.5",
|
| 272 |
+
"ifs_texte": "Bijoux et montres interdits (sauf dérogation évaluée).",
|
| 273 |
+
"brc_refs": ["7.2.1"],
|
| 274 |
+
"brc_texte": "Voir 7.2.1."
|
| 275 |
+
},
|
| 276 |
+
{
|
| 277 |
+
"ifs_ref": "3.2.6",
|
| 278 |
+
"ifs_texte": "Coupures et pansements (couleur différente, étanches, détectables).",
|
| 279 |
+
"brc_refs": ["7.2.3", "7.2.4"],
|
| 280 |
+
"brc_texte": "7.2.3 Pansements couleur différente (bleue), détectables. 7.2.4 Test détecteur métaux pansements."
|
| 281 |
+
},
|
| 282 |
+
{
|
| 283 |
+
"ifs_ref": "3.2.7",
|
| 284 |
+
"ifs_texte": "Cheveux couverts (coiffe/cache barbe).",
|
| 285 |
+
"brc_refs": ["7.4.2"],
|
| 286 |
+
"brc_texte": "7.4.2."
|
| 287 |
+
},
|
| 288 |
+
{
|
| 289 |
+
"ifs_ref": "3.2.8",
|
| 290 |
+
"ifs_texte": "Règles usage gants (couleur différente).",
|
| 291 |
+
"brc_refs": ["7.4.5"],
|
| 292 |
+
"brc_texte": "7.4.5 Gants adaptés, jetables, couleur distinctive (bleu)."
|
| 293 |
+
},
|
| 294 |
+
{
|
| 295 |
+
"ifs_ref": "3.2.9",
|
| 296 |
+
"ifs_texte": "Vêtements de protection en quantité suffisante.",
|
| 297 |
+
"brc_refs": ["7.4.2"],
|
| 298 |
+
"brc_texte": "7.4.2 Vêtements disponibles, pas de poches extérieures, résilles."
|
| 299 |
+
},
|
| 300 |
+
{
|
| 301 |
+
"ifs_ref": "3.2.10",
|
| 302 |
+
"ifs_texte": "Lavage vêtements (interne ou prestataire, validé, séparation propre/sale).",
|
| 303 |
+
"brc_refs": ["7.4.3", "7.4.6"],
|
| 304 |
+
"brc_texte": "7.4.3 Blanchisserie agréée ou interne validée. Séparation. 7.4.6 Nettoyage vêtements non lavables (tabliers)."
|
| 305 |
+
},
|
| 306 |
+
{
|
| 307 |
+
"ifs_ref": "3.2.11",
|
| 308 |
+
"ifs_texte": "Gestion maladies infectieuses.",
|
| 309 |
+
"brc_refs": ["7.3.1", "7.3.2", "7.3.3"],
|
| 310 |
+
"brc_texte": "7.3.1 Signalement symptômes. 7.3.2 Visiteurs/prestataires questionnaire santé. 7.3.3 Procédures maladies contagieuses."
|
| 311 |
+
},
|
| 312 |
+
{
|
| 313 |
+
"ifs_ref": "3.3.1",
|
| 314 |
+
"ifs_texte": "Programmes de formation documentés (contenu, fréquence, langue, évaluation).",
|
| 315 |
+
"brc_refs": ["7.1.3"],
|
| 316 |
+
"brc_texte": "7.1.3 Programmes documentés, compétences définies, langue adaptée."
|
| 317 |
+
},
|
| 318 |
+
{
|
| 319 |
+
"ifs_ref": "3.3.2",
|
| 320 |
+
"ifs_texte": "Formation avant prise de fonction (inclus temporaires).",
|
| 321 |
+
"brc_refs": ["7.1.1"],
|
| 322 |
+
"brc_texte": "7.1.1 Formation avant commencement travail."
|
| 323 |
+
},
|
| 324 |
+
{
|
| 325 |
+
"ifs_ref": "3.3.3",
|
| 326 |
+
"ifs_texte": "Enregistrements formation (liste, contenu, formateur).",
|
| 327 |
+
"brc_refs": ["7.1.6"],
|
| 328 |
+
"brc_texte": "7.1.6 Enregistrements disponibles (nom, date, contenu, formateur)."
|
| 329 |
+
},
|
| 330 |
+
{
|
| 331 |
+
"ifs_ref": "3.3.4",
|
| 332 |
+
"ifs_texte": "Revue contenu formation (sécurité, authenticité, fraude, défense).",
|
| 333 |
+
"brc_refs": ["7.1.7", "4.14.12"],
|
| 334 |
+
"brc_texte": "7.1.7 Vérification compétences. 4.14.12 Formation signes nuisibles."
|
| 335 |
+
},
|
| 336 |
+
{
|
| 337 |
+
"ifs_ref": "3.4.1",
|
| 338 |
+
"ifs_texte": "Locaux personnel adaptés (taille, équipement, propreté).",
|
| 339 |
+
"brc_refs": ["4.8", "4.8.2"],
|
| 340 |
+
"brc_texte": "4.8 Installations du personnel. 4.8.2 Stockage effets personnels."
|
| 341 |
+
},
|
| 342 |
+
{
|
| 343 |
+
"ifs_ref": "3.4.2",
|
| 344 |
+
"ifs_texte": "Risques contamination par aliments/boissons/cantine.",
|
| 345 |
+
"brc_refs": ["4.8.7", "4.8.8", "4.8.3"],
|
| 346 |
+
"brc_texte": "4.8.7 Stockage aliments personnels. 4.8.8 Restauration/distributeurs. 4.8.3 Séparation vêtements extérieurs."
|
| 347 |
+
},
|
| 348 |
+
{
|
| 349 |
+
"ifs_ref": "3.4.4",
|
| 350 |
+
"ifs_texte": "Toilettes (pas d'accès direct prod, lave-mains, ventilation).",
|
| 351 |
+
"brc_refs": ["4.8.5"],
|
| 352 |
+
"brc_texte": "4.8.5 Toilettes séparées, lave-mains, panneaux incitatifs."
|
| 353 |
+
},
|
| 354 |
+
{
|
| 355 |
+
"ifs_ref": "3.4.5",
|
| 356 |
+
"ifs_texte": "Installations hygiène mains (nombre, emplacement, usage dédié).",
|
| 357 |
+
"brc_refs": ["4.8.4"],
|
| 358 |
+
"brc_texte": "4.8.4 Installations adéquates entrée prod. Robinets sans contact, savon, séchage."
|
| 359 |
+
},
|
| 360 |
+
{
|
| 361 |
+
"ifs_ref": "3.4.6",
|
| 362 |
+
"ifs_texte": "Eau potable, température, désinfection, séchage.",
|
| 363 |
+
"brc_refs": ["7.2.2"],
|
| 364 |
+
"brc_texte": "7.2.2 Mains nettoyées entrée prod."
|
| 365 |
+
},
|
| 366 |
+
{
|
| 367 |
+
"ifs_ref": "3.4.7",
|
| 368 |
+
"ifs_texte": "Zones haut risque : commande non manuelle, désinfection, poubelles.",
|
| 369 |
+
"brc_refs": ["4.8.4"],
|
| 370 |
+
"brc_texte": "Voir 4.8.4."
|
| 371 |
+
},
|
| 372 |
+
{
|
| 373 |
+
"ifs_ref": "3.4.8",
|
| 374 |
+
"ifs_texte": "Nettoyage bottes/chaussures si nécessaire.",
|
| 375 |
+
"brc_refs": ["4.8.1", "4.8.6", "8.4.1"],
|
| 376 |
+
"brc_texte": "4.8.1 Accès direct ou nettoyage chaussures. 4.8.6 Zones fumeurs. 8.4.1 Vestiaires zones haut risque (changement chaussures)."
|
| 377 |
+
}
|
| 378 |
+
]
|
| 379 |
+
}
|
| 380 |
+
]
|
| 381 |
+
[
|
| 382 |
+
{
|
| 383 |
+
"chapitre_ifs": "4",
|
| 384 |
+
"titre_chapitre": "Processus opérationnels",
|
| 385 |
+
"exigences": [
|
| 386 |
+
{
|
| 387 |
+
"ifs_ref": "4.1.1",
|
| 388 |
+
"ifs_texte": "Procédure d'écoute client et revue.",
|
| 389 |
+
"brc_refs": [],
|
| 390 |
+
"brc_texte": "(Non spécifié directement, couvert par principes généraux 1.1.2 BRC)"
|
| 391 |
+
},
|
| 392 |
+
{
|
| 393 |
+
"ifs_ref": "4.1.2",
|
| 394 |
+
"ifs_texte": "Exigences clients connues et communiquées.",
|
| 395 |
+
"brc_refs": [],
|
| 396 |
+
"brc_texte": "(Non spécifié directement)"
|
| 397 |
+
},
|
| 398 |
+
{
|
| 399 |
+
"ifs_ref": "4.1.3 (KO N°4)",
|
| 400 |
+
"ifs_texte": "Respect des accords clients (recette, process, emballage, étiquetage).",
|
| 401 |
+
"brc_refs": ["6.1.1", "5.1"],
|
| 402 |
+
"brc_texte": "6.1.1 Spécifications de processus conformes aux spécifications produits finis. 5.1 Conception et développement produits."
|
| 403 |
+
},
|
| 404 |
+
{
|
| 405 |
+
"ifs_ref": "4.1.4",
|
| 406 |
+
"ifs_texte": "Information des clients en cas de problème qualité/sécurité/légalité.",
|
| 407 |
+
"brc_refs": [],
|
| 408 |
+
"brc_texte": "(Non spécifié directement)"
|
| 409 |
+
},
|
| 410 |
+
{
|
| 411 |
+
"ifs_ref": "4.2.1.1",
|
| 412 |
+
"ifs_texte": "Spécifications produits finis documentées, à jour, conformes.",
|
| 413 |
+
"brc_refs": ["3.6.2"],
|
| 414 |
+
"brc_texte": "3.6.2 Spécifications produits finis correctes et actualisées."
|
| 415 |
+
},
|
| 416 |
+
{
|
| 417 |
+
"ifs_ref": "4.2.1.2",
|
| 418 |
+
"ifs_texte": "Procédure création/validation/modification spécifications.",
|
| 419 |
+
"brc_refs": ["3.6.3", "4.1.2", "5.4.6"],
|
| 420 |
+
"brc_texte": "3.6.3 Accord formel spécifications (marque client). 4.1.2 Revue exigences. 5.4.6 Statut certification pour allégations (Bio, Halal)."
|
| 421 |
+
},
|
| 422 |
+
{
|
| 423 |
+
"ifs_ref": "4.2.1.3 (KO N°5)",
|
| 424 |
+
"ifs_texte": "Spécifications matières premières (ingrédients, emballage) documentées et conformes.",
|
| 425 |
+
"brc_refs": ["3.6.1", "3.6.4"],
|
| 426 |
+
"brc_texte": "3.6.1 Spécifications MP adéquates et correctes. 3.6.4 Revue spécifications (min 3 ans)."
|
| 427 |
+
},
|
| 428 |
+
{
|
| 429 |
+
"ifs_ref": "4.2.1.4",
|
| 430 |
+
"ifs_texte": "Spécifications disponibles pour le personnel.",
|
| 431 |
+
"brc_refs": [],
|
| 432 |
+
"brc_texte": "(Non spécifié directement)"
|
| 433 |
+
},
|
| 434 |
+
{
|
| 435 |
+
"ifs_ref": "4.3.1",
|
| 436 |
+
"ifs_texte": "Procédure développement produit (analyse dangers, évaluation risques).",
|
| 437 |
+
"brc_refs": ["5.1.1", "5.1.2"],
|
| 438 |
+
"brc_texte": "5.1.1 Procédure développement nouveaux produits. 5.1.2 Approbation par équipe HACCP avant introduction."
|
| 439 |
+
},
|
| 440 |
+
{
|
| 441 |
+
"ifs_ref": "4.3.2",
|
| 442 |
+
"ifs_texte": "Conformité étiquetage législation pays destination.",
|
| 443 |
+
"brc_refs": ["5.2.1", "5.2.3"],
|
| 444 |
+
"brc_texte": "5.2.1 Produits étiquetés selon exigences légales. 5.2.3 Informations fournies par client pour étiquette."
|
| 445 |
+
},
|
| 446 |
+
{
|
| 447 |
+
"ifs_ref": "4.3.3",
|
| 448 |
+
"ifs_texte": "Développement aboutit à spécifications (formulation, emballage, process).",
|
| 449 |
+
"brc_refs": ["5.1.3"],
|
| 450 |
+
"brc_texte": "5.1.3 Essais industriels pour confirmer sécurité/qualité."
|
| 451 |
+
},
|
| 452 |
+
{
|
| 453 |
+
"ifs_ref": "4.3.4",
|
| 454 |
+
"ifs_texte": "Tests durée de vie (microbio, chimique, organoleptique).",
|
| 455 |
+
"brc_refs": ["5.1.4"],
|
| 456 |
+
"brc_texte": "5.1.4 Essais durée de vie documentés."
|
| 457 |
+
},
|
| 458 |
+
{
|
| 459 |
+
"ifs_ref": "4.3.5",
|
| 460 |
+
"ifs_texte": "Validation recommandations préparation/utilisation.",
|
| 461 |
+
"brc_refs": ["5.2.4"],
|
| 462 |
+
"brc_texte": "5.2.4 Validation conseils de cuisson."
|
| 463 |
+
},
|
| 464 |
+
{
|
| 465 |
+
"ifs_ref": "4.3.6",
|
| 466 |
+
"ifs_texte": "Validation allégations nutritionnelles.",
|
| 467 |
+
"brc_refs": ["4.3.1", "5.2.2"],
|
| 468 |
+
"brc_texte": "5.2.2 Révision étiquetage si changement recette/MP."
|
| 469 |
+
},
|
| 470 |
+
{
|
| 471 |
+
"ifs_ref": "4.4.1",
|
| 472 |
+
"ifs_texte": "Procédure approvisionnement et approbation fournisseurs (risques, audit, certif).",
|
| 473 |
+
"brc_refs": ["3.5.1.1", "3.5.1.2"],
|
| 474 |
+
"brc_texte": "3.5.1.1 Évaluation risques MP (allergènes, corps étrangers, fraude). 3.5.1.2 Procédure approbation (GFSI, Audit, Questionnaire si faible risque)."
|
| 475 |
+
},
|
| 476 |
+
{
|
| 477 |
+
"ifs_ref": "4.4.2",
|
| 478 |
+
"ifs_texte": "Évaluation matériaux achetés (sécurité, qualité, légalité).",
|
| 479 |
+
"brc_refs": ["3.5.1.2"],
|
| 480 |
+
"brc_texte": "Voir 3.5.1.2."
|
| 481 |
+
},
|
| 482 |
+
{
|
| 483 |
+
"ifs_ref": "4.4.3",
|
| 484 |
+
"ifs_texte": "Évaluation prestataires de services.",
|
| 485 |
+
"brc_refs": ["3.5.3.1", "3.5.3.2", "3.5.3.3"],
|
| 486 |
+
"brc_texte": "3.5.3.1 Procédure approbation prestataires. 3.5.3.2 Contrats formels. 3.5.3.3 Évaluation continue performance."
|
| 487 |
+
},
|
| 488 |
+
{
|
| 489 |
+
"ifs_ref": "4.4.4",
|
| 490 |
+
"ifs_texte": "Maîtrise processus sous-traités (production, emballage, étiquetage).",
|
| 491 |
+
"brc_refs": ["3.5.4.5", "3.5.4.6"],
|
| 492 |
+
"brc_texte": "3.5.4.5 Traitement externalisé conforme contrats. 3.5.4.6 Inspection/test produits externalisés."
|
| 493 |
+
},
|
| 494 |
+
{
|
| 495 |
+
"ifs_ref": "4.4.5",
|
| 496 |
+
"ifs_texte": "Accord écrit pour processus sous-traités.",
|
| 497 |
+
"brc_refs": ["3.5.4", "3.5.4.1"],
|
| 498 |
+
"brc_texte": "3.5.4 Gestion transformation externalisée. 3.5.4.1 Accord client pour externalisation."
|
| 499 |
+
},
|
| 500 |
+
{
|
| 501 |
+
"ifs_ref": "4.4.6",
|
| 502 |
+
"ifs_texte": "Approbation fournisseurs sous-traités (IFS, GFSI ou Audit documenté).",
|
| 503 |
+
"brc_refs": ["3.5.4.2", "3.5.4.3", "3.5.4.4"],
|
| 504 |
+
"brc_texte": "3.5.4.2 Approbation transformateurs externalisés (GFSI ou Audit). 3.5.4.3 Risques inclus dans HACCP. 3.5.4.4 Spécification de service."
|
| 505 |
+
},
|
| 506 |
+
{
|
| 507 |
+
"ifs_ref": "4.4.7",
|
| 508 |
+
"ifs_texte": "Revue sourcing et évaluation fournisseurs (min 12 mois).",
|
| 509 |
+
"brc_refs": ["3.5.1.3", "3.5.1.4", "3.5.1.5", "3.5.1.6", "3.5.1.7"],
|
| 510 |
+
"brc_texte": "3.5.1.3 Évaluation continue performance. 3.5.1.4 Liste fournisseurs approuvés. 3.5.1.6 Vérification traçabilité fournisseurs."
|
| 511 |
+
},
|
| 512 |
+
{
|
| 513 |
+
"ifs_ref": "4.5.1",
|
| 514 |
+
"ifs_texte": "Spécifications emballages, barrières fonctionnelles, conformité légale.",
|
| 515 |
+
"brc_refs": ["5.5.1"],
|
| 516 |
+
"brc_texte": "5.5.1 Certificats conformité emballages primaires, aptitude usage."
|
| 517 |
+
},
|
| 518 |
+
{
|
| 519 |
+
"ifs_ref": "4.5.2",
|
| 520 |
+
"ifs_texte": "Déclarations de conformité matériaux emballage.",
|
| 521 |
+
"brc_refs": ["4.5.3"],
|
| 522 |
+
"brc_texte": "(Référence dans grille semble incorrecte ou décalée, voir 5.5.1)."
|
| 523 |
+
},
|
| 524 |
+
{
|
| 525 |
+
"ifs_ref": "4.5.3",
|
| 526 |
+
"ifs_texte": "Conformité emballage/étiquette au produit (contrôle début/fin production).",
|
| 527 |
+
"brc_refs": ["6.2.1", "6.2.2", "6.2.3", "6.2.4"],
|
| 528 |
+
"brc_texte": "6.2.1 Contrôle distribution emballages ligne. 6.2.2 Vérification vide de ligne. 6.2.3 Contrôles emballage/étiquetage (date, lot, quantité). 6.2.4 Vérification lecteurs codes-barres."
|
| 529 |
+
},
|
| 530 |
+
{
|
| 531 |
+
"ifs_ref": "4.6.1",
|
| 532 |
+
"ifs_texte": "Impact environnement usine (risques extérieurs).",
|
| 533 |
+
"brc_refs": ["4.1.1"],
|
| 534 |
+
"brc_texte": "4.1.1 Attention activités locales et environnement site."
|
| 535 |
+
},
|
| 536 |
+
{
|
| 537 |
+
"ifs_ref": "4.7.1",
|
| 538 |
+
"ifs_texte": "Zones extérieures propres, drainées.",
|
| 539 |
+
"brc_refs": ["4.1.2", "4.1.3"],
|
| 540 |
+
"brc_texte": "4.1.2 Zones extérieures entretenues. 4.1.3 Enveloppe bâtiment entretenue."
|
| 541 |
+
},
|
| 542 |
+
{
|
| 543 |
+
"ifs_ref": "4.7.2",
|
| 544 |
+
"ifs_texte": "Stockage extérieur réduit, protégé contamination.",
|
| 545 |
+
"brc_refs": ["4.15.5"],
|
| 546 |
+
"brc_texte": "4.15.5 Stockage extérieur protégé contamination."
|
| 547 |
+
},
|
| 548 |
+
{
|
| 549 |
+
"ifs_ref": "4.8.1",
|
| 550 |
+
"ifs_texte": "Plan du site (flux produits, personnel, déchets, eau).",
|
| 551 |
+
"brc_refs": ["4.3.2"],
|
| 552 |
+
"brc_texte": "4.3.2 Plan du site (zones risques, accès, flux, déchets)."
|
| 553 |
+
},
|
| 554 |
+
{
|
| 555 |
+
"ifs_ref": "4.8.2",
|
| 556 |
+
"ifs_texte": "Flux production pour éviter contamination croisée.",
|
| 557 |
+
"brc_refs": ["4.3.1", "4.3.3", "4.8.4", "8.1.1"],
|
| 558 |
+
"brc_texte": "4.3.1 Évaluation zones risques. 8.1.1 Plan site emplacement pathogènes."
|
| 559 |
+
},
|
| 560 |
+
{
|
| 561 |
+
"ifs_ref": "4.8.3",
|
| 562 |
+
"ifs_texte": "Conception zones sensibles (microbio, chimique).",
|
| 563 |
+
"brc_refs": ["4.3.3", "4.8.4"],
|
| 564 |
+
"brc_texte": "4.3.3 Sous-traitants/visiteurs informés. 4.8.4 Laboratoires."
|
| 565 |
+
},
|
| 566 |
+
{
|
| 567 |
+
"ifs_ref": "4.8.4",
|
| 568 |
+
"ifs_texte": "Laboratoires et contrôles n'impactent pas sécurité produits.",
|
| 569 |
+
"brc_refs": ["8.1.1", "4.3.4", "8.1.2", "8.1.3", "8.1.4"],
|
| 570 |
+
"brc_texte": "4.3.4 Déplacements ne compromettent pas sécurité. 8.1.2 Séparation physique zones haut risque."
|
| 571 |
+
},
|
| 572 |
+
{
|
| 573 |
+
"ifs_ref": "4.9.1.1",
|
| 574 |
+
"ifs_texte": "Locaux conçus, construits, entretenus pour sécurité aliments.",
|
| 575 |
+
"brc_refs": [],
|
| 576 |
+
"brc_texte": "(Couvert par Section 4 BRC)."
|
| 577 |
+
},
|
| 578 |
+
{
|
| 579 |
+
"ifs_ref": "4.9.2.1",
|
| 580 |
+
"ifs_texte": "Murs : conception, prévention contamination, nettoyage.",
|
| 581 |
+
"brc_refs": ["4.4.1"],
|
| 582 |
+
"brc_texte": "4.4.1 Finition murs et maintenance."
|
| 583 |
+
},
|
| 584 |
+
{
|
| 585 |
+
"ifs_ref": "4.9.2.2",
|
| 586 |
+
"ifs_texte": "Surfaces murs imperméables, résistantes.",
|
| 587 |
+
"brc_refs": ["8.2.3"],
|
| 588 |
+
"brc_texte": "8.2.3 Parois amovibles zones haut risque."
|
| 589 |
+
},
|
| 590 |
+
{
|
| 591 |
+
"ifs_ref": "4.9.2.3",
|
| 592 |
+
"ifs_texte": "Raccords murs/sols/plafonds faciles à nettoyer.",
|
| 593 |
+
"brc_refs": [],
|
| 594 |
+
"brc_texte": "(Non spécifié directement)"
|
| 595 |
+
},
|
| 596 |
+
{
|
| 597 |
+
"ifs_ref": "4.9.3.1",
|
| 598 |
+
"ifs_texte": "Sols : conception, imperméables, résistants.",
|
| 599 |
+
"brc_refs": ["4.4.2"],
|
| 600 |
+
"brc_texte": "4.4.2 Sols résistants, imperméables, maintenus."
|
| 601 |
+
},
|
| 602 |
+
{
|
| 603 |
+
"ifs_ref": "4.9.3.2",
|
| 604 |
+
"ifs_texte": "Drainage sols conçu pour minimiser risques.",
|
| 605 |
+
"brc_refs": ["4.4.3", "8.2.1"],
|
| 606 |
+
"brc_texte": "4.4.3 Canalisations situées pour minimiser risques. 8.2.1 Carte zones écoulement (Haut risque)."
|
| 607 |
+
},
|
| 608 |
+
{
|
| 609 |
+
"ifs_ref": "4.9.3.3",
|
| 610 |
+
"ifs_texte": "Écoulement direct eaux usées, pas de stagnation.",
|
| 611 |
+
"brc_refs": ["4.9.3.3"],
|
| 612 |
+
"brc_texte": "(Référence circulaire dans grille)."
|
| 613 |
+
},
|
| 614 |
+
{
|
| 615 |
+
"ifs_ref": "4.9.4.1",
|
| 616 |
+
"ifs_texte": "Plafonds/structures aériennes conçus pour minimiser poussière/condensation.",
|
| 617 |
+
"brc_refs": ["4.4.4"],
|
| 618 |
+
"brc_texte": "4.4.4 Plafonds/structures construits pour prévenir contamination."
|
| 619 |
+
},
|
| 620 |
+
{
|
| 621 |
+
"ifs_ref": "4.9.4.2",
|
| 622 |
+
"ifs_texte": "Accès aux faux plafonds pour nettoyage/nuisibles.",
|
| 623 |
+
"brc_refs": ["4.4.5"],
|
| 624 |
+
"brc_texte": "4.4.5 Accès faux plafonds pour inspection nuisibles."
|
| 625 |
+
},
|
| 626 |
+
{
|
| 627 |
+
"ifs_ref": "4.9.5.1",
|
| 628 |
+
"ifs_texte": "Fenêtres conçues pour éviter saleté.",
|
| 629 |
+
"brc_refs": [],
|
| 630 |
+
"brc_texte": "(Non spécifié directement)"
|
| 631 |
+
},
|
| 632 |
+
{
|
| 633 |
+
"ifs_ref": "4.9.5.2",
|
| 634 |
+
"ifs_texte": "Fenêtres fermées si risque contamination.",
|
| 635 |
+
"brc_refs": ["4.4.7"],
|
| 636 |
+
"brc_texte": "4.4.7 Fenêtres ouvertes grillagées."
|
| 637 |
+
},
|
| 638 |
+
{
|
| 639 |
+
"ifs_ref": "4.9.5.3",
|
| 640 |
+
"ifs_texte": "Moustiquaires sur fenêtres ouvrantes.",
|
| 641 |
+
"brc_refs": ["4.9.3.4"],
|
| 642 |
+
"brc_texte": "4.9.3.4 Protection vitres (bris de verre)."
|
| 643 |
+
},
|
| 644 |
+
{
|
| 645 |
+
"ifs_ref": "4.9.5.4",
|
| 646 |
+
"ifs_texte": "Protection bris de verre fenêtres zones produits nus.",
|
| 647 |
+
"brc_refs": ["4.9.3.4"],
|
| 648 |
+
"brc_texte": "Voir 4.9.3.4."
|
| 649 |
+
},
|
| 650 |
+
{
|
| 651 |
+
"ifs_ref": "4.9.6.1",
|
| 652 |
+
"ifs_texte": "Portes : bon état, faciles à nettoyer, matériaux non absorbants.",
|
| 653 |
+
"brc_refs": ["4.4.8"],
|
| 654 |
+
"brc_texte": "4.4.8 Portes maintenues bon état, étanches."
|
| 655 |
+
},
|
| 656 |
+
{
|
| 657 |
+
"ifs_ref": "4.9.6.2",
|
| 658 |
+
"ifs_texte": "Portes extérieures étanches aux nuisibles.",
|
| 659 |
+
"brc_refs": [],
|
| 660 |
+
"brc_texte": "(Non spécifié directement)"
|
| 661 |
+
},
|
| 662 |
+
{
|
| 663 |
+
"ifs_ref": "4.9.6.3",
|
| 664 |
+
"ifs_texte": "Lanières plastiques propres et bon état.",
|
| 665 |
+
"brc_refs": ["4.4.11"],
|
| 666 |
+
"brc_texte": "4.4.11 Rideaux lanières bon état, propres."
|
| 667 |
+
},
|
| 668 |
+
{
|
| 669 |
+
"ifs_ref": "4.9.7.1",
|
| 670 |
+
"ifs_texte": "Éclairage adéquat toutes zones.",
|
| 671 |
+
"brc_refs": ["4.4.9", "4.9.3.5"],
|
| 672 |
+
"brc_texte": "4.4.9 Éclairage adapté. 4.9.3.5 Protection ampoules/néons."
|
| 673 |
+
},
|
| 674 |
+
{
|
| 675 |
+
"ifs_ref": "4.9.8.1",
|
| 676 |
+
"ifs_texte": "Ventilation adéquate toutes zones.",
|
| 677 |
+
"brc_refs": ["8.2.2", "4.4.10"],
|
| 678 |
+
"brc_texte": "8.2.2 Renouvellement air filtré zones haut risque. 4.4.10 Ventilation zones stockage."
|
| 679 |
+
},
|
| 680 |
+
{
|
| 681 |
+
"ifs_ref": "4.9.8.2",
|
| 682 |
+
"ifs_texte": "Filtres ventilation accessibles et maintenus.",
|
| 683 |
+
"brc_refs": [],
|
| 684 |
+
"brc_texte": "(Non spécifié directement)"
|
| 685 |
+
},
|
| 686 |
+
{
|
| 687 |
+
"ifs_ref": "4.9.8.4",
|
| 688 |
+
"ifs_texte": "Extraction poussières.",
|
| 689 |
+
"brc_refs": ["4.5"],
|
| 690 |
+
"brc_texte": "4.5 Fluides techniques."
|
| 691 |
+
},
|
| 692 |
+
{
|
| 693 |
+
"ifs_ref": "4.9.9.1",
|
| 694 |
+
"ifs_texte": "Eau potable, suffisante, adaptée usage.",
|
| 695 |
+
"brc_refs": ["4.5.1"],
|
| 696 |
+
"brc_texte": "4.5.1 Eau potable, analysée annuellement."
|
| 697 |
+
},
|
| 698 |
+
{
|
| 699 |
+
"ifs_ref": "4.9.9.2",
|
| 700 |
+
"ifs_texte": "Qualité eau/vapeur/glace surveillée.",
|
| 701 |
+
"brc_refs": ["4.5.2"],
|
| 702 |
+
"brc_texte": "4.5.2 Diagramme distribution eau."
|
| 703 |
+
},
|
| 704 |
+
{
|
| 705 |
+
"ifs_ref": "4.9.9.3",
|
| 706 |
+
"ifs_texte": "Eau recyclée sans risque.",
|
| 707 |
+
"brc_refs": ["4.5.3"],
|
| 708 |
+
"brc_texte": "4.5.3 Air/gaz comprimés contrôlés."
|
| 709 |
+
},
|
| 710 |
+
{
|
| 711 |
+
"ifs_ref": "4.9.9.4",
|
| 712 |
+
"ifs_texte": "Tuyauterie eau non potable séparée.",
|
| 713 |
+
"brc_refs": [],
|
| 714 |
+
"brc_texte": "(Non spécifié directement)"
|
| 715 |
+
},
|
| 716 |
+
{
|
| 717 |
+
"ifs_ref": "4.9.10.1",
|
| 718 |
+
"ifs_texte": "Qualité air comprimé contrôlée (risque contamination).",
|
| 719 |
+
"brc_refs": ["4.5.3"],
|
| 720 |
+
"brc_texte": "Voir 4.5.3."
|
| 721 |
+
},
|
| 722 |
+
{
|
| 723 |
+
"ifs_ref": "4.9.10.2",
|
| 724 |
+
"ifs_texte": "Gaz contact alimentaire : sécurité et qualité.",
|
| 725 |
+
"brc_refs": ["4.5.3"],
|
| 726 |
+
"brc_texte": "Voir 4.5.3."
|
| 727 |
+
},
|
| 728 |
+
{
|
| 729 |
+
"ifs_ref": "4.10.1",
|
| 730 |
+
"ifs_texte": "Plans nettoyage désinfection validés (objectifs, produits, fréquences).",
|
| 731 |
+
"brc_refs": ["4.11.2", "4.11.3"],
|
| 732 |
+
"brc_texte": "4.11.2 Procédures nettoyage documentées. 4.11.3 Limites acceptables nettoyage définies."
|
| 733 |
+
},
|
| 734 |
+
{
|
| 735 |
+
"ifs_ref": "4.10.2",
|
| 736 |
+
"ifs_texte": "Mise en place nettoyage efficace.",
|
| 737 |
+
"brc_refs": ["4.11.4"],
|
| 738 |
+
"brc_texte": "4.11.4 Moyens disponibles, démontage équipements."
|
| 739 |
+
},
|
| 740 |
+
{
|
| 741 |
+
"ifs_ref": "4.10.3",
|
| 742 |
+
"ifs_texte": "Enregistrements nettoyage vérifiés.",
|
| 743 |
+
"brc_refs": ["4.11.8", "4.11.8.1", "4.11.8.2"],
|
| 744 |
+
"brc_texte": "4.11.8 Surveillance environnementale."
|
| 745 |
+
},
|
| 746 |
+
{
|
| 747 |
+
"ifs_ref": "4.10.4",
|
| 748 |
+
"ifs_texte": "Personnel nettoyage compétent et formé.",
|
| 749 |
+
"brc_refs": ["4.1.8.3", "4.11.5", "5.3.8"],
|
| 750 |
+
"brc_texte": "4.11.5 Vérification propreté avant production. 5.3.8 Nettoyage allergènes validé."
|
| 751 |
+
},
|
| 752 |
+
{
|
| 753 |
+
"ifs_ref": "4.10.5",
|
| 754 |
+
"ifs_texte": "Usage équipement nettoyage spécifié, stockage propre.",
|
| 755 |
+
"brc_refs": ["4.11.6"],
|
| 756 |
+
"brc_texte": "4.11.6 Équipements nettoyage conçus hygiéniques, identifiés, propres."
|
| 757 |
+
},
|
| 758 |
+
{
|
| 759 |
+
"ifs_ref": "4.10.6",
|
| 760 |
+
"ifs_texte": "FDS et instructions produits chimiques disponibles.",
|
| 761 |
+
"brc_refs": ["4.11.7", "4.11.7.1"],
|
| 762 |
+
"brc_texte": "4.11.7 Nettoyage en place (NEP). 4.11.7.1 Validation conception NEP."
|
| 763 |
+
},
|
| 764 |
+
{
|
| 765 |
+
"ifs_ref": "4.10.7",
|
| 766 |
+
"ifs_texte": "Vérification efficacité nettoyage (visuel, rapide, analyse).",
|
| 767 |
+
"brc_refs": ["4.11.7.2", "4.11.7.4"],
|
| 768 |
+
"brc_texte": "4.11.7.2 Limites NEP définies. 4.11.7.4 Contrôle installations NEP."
|
| 769 |
+
},
|
| 770 |
+
{
|
| 771 |
+
"ifs_ref": "4.10.9",
|
| 772 |
+
"ifs_texte": "Contrat prestataire nettoyage externe.",
|
| 773 |
+
"brc_refs": ["4.10.7.3", "8.5.4", "8.5.1", "8.5.2", "8.5.3"],
|
| 774 |
+
"brc_texte": "8.5.1 Procédures nettoyage zones haut risque. 8.5.2 Limites microbio nettoyage haut risque. 8.5.3 Équipements nettoyage dédiés haut risque."
|
| 775 |
+
},
|
| 776 |
+
{
|
| 777 |
+
"ifs_ref": "4.11.1",
|
| 778 |
+
"ifs_texte": "Procédure gestion déchets (contamination croisée).",
|
| 779 |
+
"brc_refs": ["4.12", "4.12.1"],
|
| 780 |
+
"brc_texte": "4.12 Déchets. 4.12.1 Licence retrait déchets."
|
| 781 |
+
},
|
| 782 |
+
{
|
| 783 |
+
"ifs_ref": "4.11.3",
|
| 784 |
+
"ifs_texte": "Retrait rapide déchets des zones production.",
|
| 785 |
+
"brc_refs": ["4.12.3", "4.12.2"],
|
| 786 |
+
"brc_texte": "4.12.3 Retrait déchets zones produits nus. 4.12.2 Conteneurs déchets gérés."
|
| 787 |
+
},
|
| 788 |
+
{
|
| 789 |
+
"ifs_ref": "4.11.4",
|
| 790 |
+
"ifs_texte": "Conteneurs déchets signalés, entretenus, nettoyés.",
|
| 791 |
+
"brc_refs": ["4.9.1.1", "4.9.1.2"],
|
| 792 |
+
"brc_texte": "4.9.1.1 Gestion produits chimiques. 4.9.1.2 Substances odorantes."
|
| 793 |
+
},
|
| 794 |
+
{
|
| 795 |
+
"ifs_ref": "4.11.5",
|
| 796 |
+
"ifs_texte": "Déchets pour nutrition animale (séparation).",
|
| 797 |
+
"brc_refs": ["4.12.4"],
|
| 798 |
+
"brc_texte": "4.12.4 Destruction produits marque."
|
| 799 |
+
},
|
| 800 |
+
{
|
| 801 |
+
"ifs_ref": "4.11.6",
|
| 802 |
+
"ifs_texte": "Tri et élimination par tiers agréés.",
|
| 803 |
+
"brc_refs": ["4.13", "4.13.1", "4.13.2", "4.13.3", "8.6.1"],
|
| 804 |
+
"brc_texte": "4.13.1 Excédent produits marque. 4.13.3 Produits pour alimentation animale. 8.6.1 Déchets zones haut risque."
|
| 805 |
+
},
|
| 806 |
+
{
|
| 807 |
+
"ifs_ref": "4.12.1 (KO N°6)",
|
| 808 |
+
"ifs_texte": "Procédures corps étrangers basées risques.",
|
| 809 |
+
"brc_refs": ["4.9.2.1", "4.9.6.1", "4.9.6.2", "4.9.6.3", "4.9.2.2", "4.9.5"],
|
| 810 |
+
"brc_texte": "4.9.2.1 Politique objets tranchants (cutters interdits). 4.9.6.1 Déballage. 4.9.6.2 Stylos/objets portatifs contrôlés. 4.9.5 Bois."
|
| 811 |
+
},
|
| 812 |
+
{
|
| 813 |
+
"ifs_ref": "4.12.2",
|
| 814 |
+
"ifs_texte": "Protection produits contre contamination physique.",
|
| 815 |
+
"brc_refs": ["4.4.6"],
|
| 816 |
+
"brc_texte": "4.4.6 Passerelles surélevées."
|
| 817 |
+
},
|
| 818 |
+
{
|
| 819 |
+
"ifs_ref": "4.12.3",
|
| 820 |
+
"ifs_texte": "Produits chimiques adaptés, étiquetés, stockés.",
|
| 821 |
+
"brc_refs": ["4.9.1.1"],
|
| 822 |
+
"brc_texte": "4.9.1.1 Processus gestion produits chimiques."
|
| 823 |
+
},
|
| 824 |
+
{
|
| 825 |
+
"ifs_ref": "4.12.4",
|
| 826 |
+
"ifs_texte": "Détecteurs métaux (efficacité, maintenance).",
|
| 827 |
+
"brc_refs": ["4.10", "4.10.1", "4.10.3"],
|
| 828 |
+
"brc_texte": "4.10 Équipement détection corps étrangers. 4.10.3 Détecteurs métaux/Rayons X."
|
| 829 |
+
},
|
| 830 |
+
{
|
| 831 |
+
"ifs_ref": "4.12.5",
|
| 832 |
+
"ifs_texte": "Précision et tests équipements détection.",
|
| 833 |
+
"brc_refs": ["4.10.3.1", "4.10.3.2"],
|
| 834 |
+
"brc_texte": "4.10.3.1 Justification si non utilisation. 4.10.3.2 Rejet automatique/arrêt courroie."
|
| 835 |
+
},
|
| 836 |
+
{
|
| 837 |
+
"ifs_ref": "4.12.9",
|
| 838 |
+
"ifs_texte": "Procédure bris de verre (arrêt, isolement, nettoyage).",
|
| 839 |
+
"brc_refs": ["4.10.3.3", "4.10.3.4", "4.10.3.5", "4.10.4", "4.10.5", "4.9.3.3"],
|
| 840 |
+
"brc_texte": "4.10.3.4 Procédures test détecteurs métaux. 4.9.3.3 Procédures bris de verre."
|
| 841 |
+
},
|
| 842 |
+
{
|
| 843 |
+
"ifs_ref": "4.12.10",
|
| 844 |
+
"ifs_texte": "Enregistrement bris de verre.",
|
| 845 |
+
"brc_refs": ["4.9.4.3"],
|
| 846 |
+
"brc_texte": "4.9.4.3 Enregistrements bris récipient."
|
| 847 |
+
},
|
| 848 |
+
{
|
| 849 |
+
"ifs_ref": "4.12.12",
|
| 850 |
+
"ifs_texte": "Exclusion bois ou maîtrise risques.",
|
| 851 |
+
"brc_refs": ["4.9.5.1"],
|
| 852 |
+
"brc_texte": "4.9.5.1 Bois non utilisé sauf exigence process."
|
| 853 |
+
},
|
| 854 |
+
{
|
| 855 |
+
"ifs_ref": "4.13.1",
|
| 856 |
+
"ifs_texte": "Infrastructures anti-nuisibles.",
|
| 857 |
+
"brc_refs": ["4.14", "4.14.4", "4.14.12"],
|
| 858 |
+
"brc_texte": "4.14 Lutte contre nuisibles. 4.14.4 Documents gestion nuisibles. 4.14.12 Personnel formé signes nuisibles."
|
| 859 |
+
},
|
| 860 |
+
{
|
| 861 |
+
"ifs_ref": "4.13.2",
|
| 862 |
+
"ifs_texte": "Mesures lutte nuisibles (plan, appâts, inspection).",
|
| 863 |
+
"brc_refs": ["4.14.1", "4.14.2"],
|
| 864 |
+
"brc_texte": "4.14.1 Infestation consignée. 4.14.2 Prestataire compétent ou interne formé."
|
| 865 |
+
},
|
| 866 |
+
{
|
| 867 |
+
"ifs_ref": "4.13.3",
|
| 868 |
+
"ifs_texte": "Contrat prestataire nuisibles.",
|
| 869 |
+
"brc_refs": ["4.14.3"],
|
| 870 |
+
"brc_texte": "4.14.3 Gestion efficace nuisibles."
|
| 871 |
+
},
|
| 872 |
+
{
|
| 873 |
+
"ifs_ref": "4.13.4",
|
| 874 |
+
"ifs_texte": "Inspections et actions nuisibles documentées.",
|
| 875 |
+
"brc_refs": ["4.14.9"],
|
| 876 |
+
"brc_texte": "4.14.9 Enregistrements inspections."
|
| 877 |
+
},
|
| 878 |
+
{
|
| 879 |
+
"ifs_ref": "4.13.5",
|
| 880 |
+
"ifs_texte": "Appâts et destructeurs insectes fonctionnels.",
|
| 881 |
+
"brc_refs": ["4.14.5", "4.14.6"],
|
| 882 |
+
"brc_texte": "4.14.5 Stations appâts. 4.14.6 Désinsectiseurs."
|
| 883 |
+
},
|
| 884 |
+
{
|
| 885 |
+
"ifs_ref": "4.13.6",
|
| 886 |
+
"ifs_texte": "Inspection livraisons entrantes (nuisibles).",
|
| 887 |
+
"brc_refs": ["4.14.8", "4.14.7", "4.14.10"],
|
| 888 |
+
"brc_texte": "4.14.8 Actions cas infestation. 4.14.7 Protection contre oiseaux. 4.14.10 Évaluation gestion nuisibles."
|
| 889 |
+
},
|
| 890 |
+
{
|
| 891 |
+
"ifs_ref": "4.13.7",
|
| 892 |
+
"ifs_texte": "Surveillance efficacité lutte nuisibles (tendances).",
|
| 893 |
+
"brc_refs": ["4.14.11"],
|
| 894 |
+
"brc_texte": "4.14.11 Analyse tendances résultats inspections."
|
| 895 |
+
},
|
| 896 |
+
{
|
| 897 |
+
"ifs_ref": "4.14.1",
|
| 898 |
+
"ifs_texte": "Conformité produits réceptionnés (plan surveillance).",
|
| 899 |
+
"brc_refs": ["3.5.2", "3.5.2.1", "3.5.2.2"],
|
| 900 |
+
"brc_texte": "3.5.2.1 Procédure réception matières premières."
|
| 901 |
+
},
|
| 902 |
+
{
|
| 903 |
+
"ifs_ref": "4.14.2",
|
| 904 |
+
"ifs_texte": "Conditions stockage conformes spécifications.",
|
| 905 |
+
"brc_refs": ["4.15", "4.15.1", "4.15.2"],
|
| 906 |
+
"brc_texte": "4.15.1 Procédures stockage (transfert, séparation, hors sol)."
|
| 907 |
+
},
|
| 908 |
+
{
|
| 909 |
+
"ifs_ref": "4.14.5",
|
| 910 |
+
"ifs_texte": "Identification produits et FIFO/FEFO.",
|
| 911 |
+
"brc_refs": ["4.15.6"],
|
| 912 |
+
"brc_texte": "4.15.6 Rotation stocks."
|
| 913 |
+
},
|
| 914 |
+
{
|
| 915 |
+
"ifs_ref": "4.15.1",
|
| 916 |
+
"ifs_texte": "Contrôle véhicules avant chargement.",
|
| 917 |
+
"brc_refs": ["4.16", "4.16.1", "4.16.2"],
|
| 918 |
+
"brc_texte": "4.16.1 Procédures chargement/transport. 4.16.2 Véhicules adaptés et propres."
|
| 919 |
+
},
|
| 920 |
+
{
|
| 921 |
+
"ifs_ref": "4.15.2",
|
| 922 |
+
"ifs_texte": "Contrôle température véhicules avant chargement.",
|
| 923 |
+
"brc_refs": ["4.16.3"],
|
| 924 |
+
"brc_texte": "4.16.3 Contrôle température transport."
|
| 925 |
+
},
|
| 926 |
+
{
|
| 927 |
+
"ifs_ref": "4.15.5",
|
| 928 |
+
"ifs_texte": "Hygiène véhicules transport.",
|
| 929 |
+
"brc_refs": ["4.16.4"],
|
| 930 |
+
"brc_texte": "4.16.4 Entretien et nettoyage véhicules."
|
| 931 |
+
},
|
| 932 |
+
{
|
| 933 |
+
"ifs_ref": "4.15.7",
|
| 934 |
+
"ifs_texte": "Prestataire transport externe certifié.",
|
| 935 |
+
"brc_refs": ["4.16.6", "4.16.5"],
|
| 936 |
+
"brc_texte": "4.16.6 Approbation sous-traitants transport. 4.16.5 Procédures transport."
|
| 937 |
+
},
|
| 938 |
+
{
|
| 939 |
+
"ifs_ref": "4.16.1",
|
| 940 |
+
"ifs_texte": "Plan de maintenance équipements critiques.",
|
| 941 |
+
"brc_refs": ["4.7", "4.7.1", "4.7.2", "4.7.5", "4.7.4", "4.7.6"],
|
| 942 |
+
"brc_texte": "4.7.1 Calendrier maintenance préventif. 4.7.4 Sécurité non menacée après maintenance."
|
| 943 |
+
},
|
| 944 |
+
{
|
| 945 |
+
"ifs_ref": "4.16.5",
|
| 946 |
+
"ifs_texte": "Réparations provisoires documentées.",
|
| 947 |
+
"brc_refs": ["4.7.3"],
|
| 948 |
+
"brc_texte": "4.7.3 Réparations provisoires contrôlées."
|
| 949 |
+
},
|
| 950 |
+
{
|
| 951 |
+
"ifs_ref": "4.16.6",
|
| 952 |
+
"ifs_texte": "Prestataire maintenance externe (contrat).",
|
| 953 |
+
"brc_refs": ["8.3.1", "8.3.2", "8.3.3"],
|
| 954 |
+
"brc_texte": "8.3.1 Maintenance zones haut risque."
|
| 955 |
+
},
|
| 956 |
+
{
|
| 957 |
+
"ifs_ref": "4.17.1",
|
| 958 |
+
"ifs_texte": "Équipements : conception adaptée et validée.",
|
| 959 |
+
"brc_refs": ["4.6", "4.4.6", "4.6.1", "4.6.2", "4.6.3", "4.6.4", "4.6.5", "4.6.6"],
|
| 960 |
+
"brc_texte": "4.6.1 Fiche achat équipement. 4.6.2 Conception hygiénique. 4.6.3 Mise en service."
|
| 961 |
+
},
|
| 962 |
+
{
|
| 963 |
+
"ifs_ref": "4.17.5",
|
| 964 |
+
"ifs_texte": "Changement équipement : revue caractéristiques.",
|
| 965 |
+
"brc_refs": ["4.6.7"],
|
| 966 |
+
"brc_texte": "4.6.7 Chargeurs batteries."
|
| 967 |
+
},
|
| 968 |
+
{
|
| 969 |
+
"ifs_ref": "4.18.1 (KO N°7)",
|
| 970 |
+
"ifs_texte": "Système de traçabilité documenté (amont/aval, 4h).",
|
| 971 |
+
"brc_refs": ["3.9", "3.9.1"],
|
| 972 |
+
"brc_texte": "3.9.1 Procédure traçabilité."
|
| 973 |
+
},
|
| 974 |
+
{
|
| 975 |
+
"ifs_ref": "4.18.2",
|
| 976 |
+
"ifs_texte": "Test traçabilité (bilan matière) annuel.",
|
| 977 |
+
"brc_refs": ["3.9.3"],
|
| 978 |
+
"brc_texte": "3.9.3 Test système traçabilité (quantité/bilan massique)."
|
| 979 |
+
},
|
| 980 |
+
{
|
| 981 |
+
"ifs_ref": "4.18.3",
|
| 982 |
+
"ifs_texte": "Traçabilité sous 4 heures.",
|
| 983 |
+
"brc_refs": ["3.9.2", "3.9.4"],
|
| 984 |
+
"brc_texte": "3.9.4 Retraitement traçable."
|
| 985 |
+
},
|
| 986 |
+
{
|
| 987 |
+
"ifs_ref": "4.19.1",
|
| 988 |
+
"ifs_texte": "Évaluation risques allergènes matières premières.",
|
| 989 |
+
"brc_refs": ["5.3", "5.3.1", "5.3.2", "5.3.3"],
|
| 990 |
+
"brc_texte": "5.3.1 Évaluation MP allergènes. 5.3.3 Évaluation risques contamination croisée."
|
| 991 |
+
},
|
| 992 |
+
{
|
| 993 |
+
"ifs_ref": "4.19.2",
|
| 994 |
+
"ifs_texte": "Mesures prévention contamination croisée allergènes.",
|
| 995 |
+
"brc_refs": ["5.3.4", "5.3.5"],
|
| 996 |
+
"brc_texte": "5.3.4 Procédures gestion allergènes (séparation, nettoyage). 5.3.5 Produits recyclés."
|
| 997 |
+
},
|
| 998 |
+
{
|
| 999 |
+
"ifs_ref": "4.19.3",
|
| 1000 |
+
"ifs_texte": "Étiquetage allergènes conforme.",
|
| 1001 |
+
"brc_refs": ["5.3.6", "5.3.7"],
|
| 1002 |
+
"brc_texte": "5.3.6 Avertissement sur étiquette (si risque justifié). 5.3.7 Validation allégations 'sans'."
|
| 1003 |
+
},
|
| 1004 |
+
{
|
| 1005 |
+
"ifs_ref": "4.20.1",
|
| 1006 |
+
"ifs_texte": "Responsabilités évaluation vulnérabilité fraude.",
|
| 1007 |
+
"brc_refs": ["5.4", "5.4.1"],
|
| 1008 |
+
"brc_texte": "5.4.1 Personnel impliqué évaluation vulnérabilité."
|
| 1009 |
+
},
|
| 1010 |
+
{
|
| 1011 |
+
"ifs_ref": "4.20.2",
|
| 1012 |
+
"ifs_texte": "Évaluation vulnérabilité fraude alimentaire documentée.",
|
| 1013 |
+
"brc_refs": ["5.4.2"],
|
| 1014 |
+
"brc_texte": "5.4.2 Accès informations menaces chaîne approvisionnement."
|
| 1015 |
+
},
|
| 1016 |
+
{
|
| 1017 |
+
"ifs_ref": "4.20.3",
|
| 1018 |
+
"ifs_texte": "Plan atténuation fraude alimentaire.",
|
| 1019 |
+
"brc_refs": ["5.4.3"],
|
| 1020 |
+
"brc_texte": "5.4.3 Évaluation vulnérabilité documentée (facteurs économiques, facilité accès)."
|
| 1021 |
+
},
|
| 1022 |
+
{
|
| 1023 |
+
"ifs_ref": "4.20.4",
|
| 1024 |
+
"ifs_texte": "Revue évaluation vulnérabilité (min 12 mois).",
|
| 1025 |
+
"brc_refs": ["5.4.4", "5.4.5", "5.4.7", "3.5.3"],
|
| 1026 |
+
"brc_texte": "5.4.4 Contrôles MP à risque. 5.4.5 Vérification statut MP pour allégations."
|
| 1027 |
+
},
|
| 1028 |
+
{
|
| 1029 |
+
"ifs_ref": "4.21.1",
|
| 1030 |
+
"ifs_texte": "Responsabilités Food Defence.",
|
| 1031 |
+
"brc_refs": ["4.2", "4.2.1"],
|
| 1032 |
+
"brc_texte": "4.2.1 Responsable Food Defence."
|
| 1033 |
+
},
|
| 1034 |
+
{
|
| 1035 |
+
"ifs_ref": "4.21.2",
|
| 1036 |
+
"ifs_texte": "Plan Food Defence (évaluation menaces).",
|
| 1037 |
+
"brc_refs": ["4.2.2"],
|
| 1038 |
+
"brc_texte": "4.2.2 Évaluation risques (menaces)."
|
| 1039 |
+
},
|
| 1040 |
+
{
|
| 1041 |
+
"ifs_ref": "4.21.3",
|
| 1042 |
+
"ifs_texte": "Test efficacité plan Food Defence.",
|
| 1043 |
+
"brc_refs": ["4.2.3", "4.1.4"],
|
| 1044 |
+
"brc_texte": "4.2.3 Contrôles atténuation risques. 4.1.4 Contrôle accès site."
|
| 1045 |
+
}
|
| 1046 |
+
]
|
| 1047 |
+
}
|
| 1048 |
+
]
|
| 1049 |
+
[
|
| 1050 |
+
{
|
| 1051 |
+
"chapitre_ifs": "5",
|
| 1052 |
+
"titre_chapitre": "Mesures, analyses, améliorations",
|
| 1053 |
+
"exigences": [
|
| 1054 |
+
{
|
| 1055 |
+
"ifs_ref": "5.1.1 (KO N°8)",
|
| 1056 |
+
"ifs_texte": "Programme d'audit interne documenté (toutes exigences IFS, sites stockage inclus). Planifié sur 12 mois.",
|
| 1057 |
+
"brc_refs": ["3.4", "3.4.1"],
|
| 1058 |
+
"brc_texte": "3.4.1 Planification audits internes (min 4 dates/an). Couverture HACCP, prérequis, fraude, défense."
|
| 1059 |
+
},
|
| 1060 |
+
{
|
| 1061 |
+
"ifs_ref": "5.1.2",
|
| 1062 |
+
"ifs_texte": "Auditeurs compétents et indépendants.",
|
| 1063 |
+
"brc_refs": ["3.4.2"],
|
| 1064 |
+
"brc_texte": "3.4.2 Auditeurs compétents et indépendants."
|
| 1065 |
+
},
|
| 1066 |
+
{
|
| 1067 |
+
"ifs_ref": "5.1.3",
|
| 1068 |
+
"ifs_texte": "Rapports audits internes documentés, communiqués, actions correctives.",
|
| 1069 |
+
"brc_refs": ["3.4.3"],
|
| 1070 |
+
"brc_texte": "3.4.3 Rapports audits conformités/non-conformités. Actions correctives vérifiées."
|
| 1071 |
+
},
|
| 1072 |
+
{
|
| 1073 |
+
"ifs_ref": "5.2.1",
|
| 1074 |
+
"ifs_texte": "Inspections usine planifiées (hygiène, bâtiment, corps étrangers). Fréquence risques.",
|
| 1075 |
+
"brc_refs": ["3.4.4"],
|
| 1076 |
+
"brc_texte": "3.4.4 Programme inspections distinct (hygiène/fabrication). Min mensuel pour zones produits nus."
|
| 1077 |
+
},
|
| 1078 |
+
{
|
| 1079 |
+
"ifs_ref": "5.3.1",
|
| 1080 |
+
"ifs_texte": "Critères validation et maîtrise procédés définis.",
|
| 1081 |
+
"brc_refs": ["6.1.6", "6.1.2"],
|
| 1082 |
+
"brc_texte": "6.1.6 Procédures cas défaillance/écarts. 6.1.2 Accès restreint paramètres équipements."
|
| 1083 |
+
},
|
| 1084 |
+
{
|
| 1085 |
+
"ifs_ref": "5.3.2",
|
| 1086 |
+
"ifs_texte": "Paramètres procédés surveillés (T°, temps, pression).",
|
| 1087 |
+
"brc_refs": ["6.1.3", "6.1.5", "4.15.3", "4.15.4"],
|
| 1088 |
+
"brc_texte": "6.1.3 Contrôle processus. 6.1.5 Validation variations processing. 4.15.3 Contrôle température stockage."
|
| 1089 |
+
},
|
| 1090 |
+
{
|
| 1091 |
+
"ifs_ref": "5.3.3",
|
| 1092 |
+
"ifs_texte": "Validation opérations recyclage.",
|
| 1093 |
+
"brc_refs": ["6.1.4"],
|
| 1094 |
+
"brc_texte": "6.1.4 Alarmes dispositifs contrôle en ligne."
|
| 1095 |
+
},
|
| 1096 |
+
{
|
| 1097 |
+
"ifs_ref": "5.3.4",
|
| 1098 |
+
"ifs_texte": "Procédures notification dysfonctionnements.",
|
| 1099 |
+
"brc_refs": ["6.1.7"],
|
| 1100 |
+
"brc_texte": "6.1.7 Contrôle produits hors portée audit."
|
| 1101 |
+
},
|
| 1102 |
+
{
|
| 1103 |
+
"ifs_ref": "5.3.5",
|
| 1104 |
+
"ifs_texte": "Validation procédés (données pertinentes).",
|
| 1105 |
+
"brc_refs": [],
|
| 1106 |
+
"brc_texte": "(Non spécifié directement)"
|
| 1107 |
+
},
|
| 1108 |
+
{
|
| 1109 |
+
"ifs_ref": "5.4.1",
|
| 1110 |
+
"ifs_texte": "Étalonnage équipements mesure et surveillance (liste, statut).",
|
| 1111 |
+
"brc_refs": ["6.4", "6.4.1"],
|
| 1112 |
+
"brc_texte": "6.4.1 Liste dispositifs mesure, code identification, date calibrage."
|
| 1113 |
+
},
|
| 1114 |
+
{
|
| 1115 |
+
"ifs_ref": "5.4.2",
|
| 1116 |
+
"ifs_texte": "Vérification/Etalonnage intervalles réguliers.",
|
| 1117 |
+
"brc_refs": ["6.4.2"],
|
| 1118 |
+
"brc_texte": "6.4.2 Vérification précision et lisibilité."
|
| 1119 |
+
},
|
| 1120 |
+
{
|
| 1121 |
+
"ifs_ref": "5.4.3",
|
| 1122 |
+
"ifs_texte": "Gestion équipements mesure défectueux.",
|
| 1123 |
+
"brc_refs": ["6.4.3", "6.4.4"],
|
| 1124 |
+
"brc_texte": "6.4.4 Actions si dispositifs hors tolérance."
|
| 1125 |
+
},
|
| 1126 |
+
{
|
| 1127 |
+
"ifs_ref": "5.5.1",
|
| 1128 |
+
"ifs_texte": "Contrôle quantité (poids/volume) conforme législation.",
|
| 1129 |
+
"brc_refs": ["6.3", "6.3.1", "6.3.3", "6.3.2"],
|
| 1130 |
+
"brc_texte": "6.3.1 Fréquence contrôle quantité légale. 6.3.3 Tests pesage en ligne."
|
| 1131 |
+
},
|
| 1132 |
+
{
|
| 1133 |
+
"ifs_ref": "5.5.2",
|
| 1134 |
+
"ifs_texte": "Surveillance quantité (échantillonnage représentatif).",
|
| 1135 |
+
"brc_refs": ["5.6"],
|
| 1136 |
+
"brc_texte": "5.6 Inspection et analyse produits."
|
| 1137 |
+
},
|
| 1138 |
+
{
|
| 1139 |
+
"ifs_ref": "5.6.1",
|
| 1140 |
+
"ifs_texte": "Plans contrôle analytique (MP, produits, environnement).",
|
| 1141 |
+
"brc_refs": ["5.6.1"],
|
| 1142 |
+
"brc_texte": "5.6.1 Planification tests produits (microbio, chimique, organoleptique)."
|
| 1143 |
+
},
|
| 1144 |
+
{
|
| 1145 |
+
"ifs_ref": "5.6.2",
|
| 1146 |
+
"ifs_texte": "Surveillance environnementale documentée (risques).",
|
| 1147 |
+
"brc_refs": ["5.6.4"],
|
| 1148 |
+
"brc_texte": "5.6.4 Analyses pathogènes (sous-traitées ou isolées)."
|
| 1149 |
+
},
|
| 1150 |
+
{
|
| 1151 |
+
"ifs_ref": "5.6.3",
|
| 1152 |
+
"ifs_texte": "Laboratoires accrédités ISO 17025 (ou vérification croisée).",
|
| 1153 |
+
"brc_refs": ["5.6.6"],
|
| 1154 |
+
"brc_texte": "5.6.6 Laboratoire accrédité pour analyses sécurité/légalité."
|
| 1155 |
+
},
|
| 1156 |
+
{
|
| 1157 |
+
"ifs_ref": "5.6.4",
|
| 1158 |
+
"ifs_texte": "Fiabilité analyses internes (ring tests).",
|
| 1159 |
+
"brc_refs": ["5.6.7"],
|
| 1160 |
+
"brc_texte": "5.6.7 Procédures fiabilité résultats internes."
|
| 1161 |
+
},
|
| 1162 |
+
{
|
| 1163 |
+
"ifs_ref": "5.6.5",
|
| 1164 |
+
"ifs_texte": "Évaluation résultats analyses et tendances.",
|
| 1165 |
+
"brc_refs": ["5.6.3", "5.6.2"],
|
| 1166 |
+
"brc_texte": "5.6.2 Revue résultats tests et tendances."
|
| 1167 |
+
},
|
| 1168 |
+
{
|
| 1169 |
+
"ifs_ref": "5.6.6",
|
| 1170 |
+
"ifs_texte": "Conditions laboratoires internes (procédures, personnel, équipements).",
|
| 1171 |
+
"brc_refs": ["5.6.5"],
|
| 1172 |
+
"brc_texte": "5.6.5 Localisation et conception laboratoires internes."
|
| 1173 |
+
},
|
| 1174 |
+
{
|
| 1175 |
+
"ifs_ref": "5.6.7",
|
| 1176 |
+
"ifs_texte": "Tests organoleptiques internes.",
|
| 1177 |
+
"brc_refs": ["5.6.8"],
|
| 1178 |
+
"brc_texte": "(Non spécifié directement, implicite dans 5.6.1)"
|
| 1179 |
+
},
|
| 1180 |
+
{
|
| 1181 |
+
"ifs_ref": "5.7.1",
|
| 1182 |
+
"ifs_texte": "Procédure quarantaine et libération produits.",
|
| 1183 |
+
"brc_refs": ["5.7", "5.7.1"],
|
| 1184 |
+
"brc_texte": "5.7.1 Procédure contrôle libératoire positif."
|
| 1185 |
+
},
|
| 1186 |
+
{
|
| 1187 |
+
"ifs_ref": "5.8.1",
|
| 1188 |
+
"ifs_texte": "Gestion réclamations et notifications autorités.",
|
| 1189 |
+
"brc_refs": ["3.10"],
|
| 1190 |
+
"brc_texte": "3.10 Gestion réclamations."
|
| 1191 |
+
},
|
| 1192 |
+
{
|
| 1193 |
+
"ifs_ref": "5.8.2",
|
| 1194 |
+
"ifs_texte": "Enregistrement et évaluation réclamations.",
|
| 1195 |
+
"brc_refs": ["3.10.1"],
|
| 1196 |
+
"brc_texte": "3.10.1 Enregistrement et enquête réclamations."
|
| 1197 |
+
},
|
| 1198 |
+
{
|
| 1199 |
+
"ifs_ref": "5.8.3",
|
| 1200 |
+
"ifs_texte": "Analyse réclamations pour éviter récurrence.",
|
| 1201 |
+
"brc_refs": ["3.10.2"],
|
| 1202 |
+
"brc_texte": "3.10.2 Analyse tendances réclamations."
|
| 1203 |
+
},
|
| 1204 |
+
{
|
| 1205 |
+
"ifs_ref": "5.9.1 (KO N°9)",
|
| 1206 |
+
"ifs_texte": "Procédure gestion incidents, retraits, rappels.",
|
| 1207 |
+
"brc_refs": ["3.11", "3.11.1", "3.11.2"],
|
| 1208 |
+
"brc_texte": "3.11.1 Procédures incidents. 3.11.2 Procédure retrait/rappel."
|
| 1209 |
+
},
|
| 1210 |
+
{
|
| 1211 |
+
"ifs_ref": "5.9.2",
|
| 1212 |
+
"ifs_texte": "Test procédure rappel/retrait (annuel).",
|
| 1213 |
+
"brc_refs": ["3.11.3"],
|
| 1214 |
+
"brc_texte": "3.11.3 Test annuel procédure rappel."
|
| 1215 |
+
},
|
| 1216 |
+
{
|
| 1217 |
+
"ifs_ref": "5.10.1",
|
| 1218 |
+
"ifs_texte": "Gestion produits non conformes (isolement, étiquetage).",
|
| 1219 |
+
"brc_refs": ["3.8", "3.8.1"],
|
| 1220 |
+
"brc_texte": "3.8.1 Procédures gestion non-conformes."
|
| 1221 |
+
},
|
| 1222 |
+
{
|
| 1223 |
+
"ifs_ref": "5.11.1",
|
| 1224 |
+
"ifs_texte": "Procédure corrections et actions correctives (analyse causes).",
|
| 1225 |
+
"brc_refs": ["3.7", "3.7.1"],
|
| 1226 |
+
"brc_texte": "3.7.1 Procédure gestion problèmes et actions préventives."
|
| 1227 |
+
},
|
| 1228 |
+
{
|
| 1229 |
+
"ifs_ref": "5.11.3 (KO N°10)",
|
| 1230 |
+
"ifs_texte": "Mise en place actions correctives et prévention récurrence.",
|
| 1231 |
+
"brc_refs": ["3.7.2"],
|
| 1232 |
+
"brc_texte": "3.7.2 Analyse cause fondamentale non-conformités."
|
| 1233 |
+
},
|
| 1234 |
+
{
|
| 1235 |
+
"ifs_ref": "5.11.4",
|
| 1236 |
+
"ifs_texte": "Évaluation efficacité actions correctives.",
|
| 1237 |
+
"brc_refs": ["3.7.2"],
|
| 1238 |
+
"brc_texte": "Vérification efficacité actions."
|
| 1239 |
+
}
|
| 1240 |
+
]
|
| 1241 |
+
}
|
| 1242 |
+
]
|
brcGSv9.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
build_data.js
ADDED
|
@@ -0,0 +1,137 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
const fs = require('fs');
|
| 2 |
+
const path = require('path');
|
| 3 |
+
|
| 4 |
+
// File Paths
|
| 5 |
+
const IFS_BRC_MAP_PATH = 'IFSBRC.json';
|
| 6 |
+
const IFS_CONTENT_PATH = 'ifs_food_v8_fr.json';
|
| 7 |
+
const BRC_CONTENT_PATH = 'brcGSv9.json';
|
| 8 |
+
const OUTPUT_PATH = 'correspondances.json';
|
| 9 |
+
|
| 10 |
+
// Utility: Clean ID (remove trailing stuff like (KO N°1) for matching)
|
| 11 |
+
function cleanId(id) {
|
| 12 |
+
if (!id) return '';
|
| 13 |
+
// Removes "(KO N°...)" and whitespace
|
| 14 |
+
return id.replace(/\s*\(KO N°\d+\)/, '').trim();
|
| 15 |
+
}
|
| 16 |
+
|
| 17 |
+
function normalizeId(id) {
|
| 18 |
+
return cleanId(id).replace(/\*$/, ''); // Remove trailing asterisks often found in IFS
|
| 19 |
+
}
|
| 20 |
+
|
| 21 |
+
// Main Function
|
| 22 |
+
function buildData() {
|
| 23 |
+
console.log('Reading files...');
|
| 24 |
+
|
| 25 |
+
let mapRaw = fs.readFileSync(IFS_BRC_MAP_PATH, 'utf8');
|
| 26 |
+
// detailed fix: IFSBRC.json might be multiple arrays simply concatenated like [...] [...]
|
| 27 |
+
// We try to join them into one big array.
|
| 28 |
+
mapRaw = mapRaw.trim();
|
| 29 |
+
// detailed logic: if it looks like `] [` or `]\r\n[` we replace with `,`
|
| 30 |
+
// Regex: look for closing bracket, optional whitespace, opening bracket
|
| 31 |
+
mapRaw = mapRaw.replace(/\]\s*\[/g, ',');
|
| 32 |
+
|
| 33 |
+
const mapData = JSON.parse(mapRaw);
|
| 34 |
+
const ifsData = JSON.parse(fs.readFileSync(IFS_CONTENT_PATH, 'utf8'));
|
| 35 |
+
const brcData = JSON.parse(fs.readFileSync(BRC_CONTENT_PATH, 'utf8'));
|
| 36 |
+
|
| 37 |
+
// 1. Flatten specific content into lookup maps for easy access
|
| 38 |
+
const ifsLookup = {};
|
| 39 |
+
const brcLookup = {};
|
| 40 |
+
|
| 41 |
+
// Build IFS Lookup
|
| 42 |
+
// Structure: Array of Chapters -> Sections -> Requirements
|
| 43 |
+
ifsData.forEach(chapter => {
|
| 44 |
+
chapter.sous_sections?.forEach(sub => {
|
| 45 |
+
sub.exigences?.forEach(req => {
|
| 46 |
+
const id = normalizeId(req.numero);
|
| 47 |
+
ifsLookup[id] = {
|
| 48 |
+
id: req.numero,
|
| 49 |
+
text: req.texte,
|
| 50 |
+
chapter: chapter.titre,
|
| 51 |
+
section: sub.titre,
|
| 52 |
+
ko: req.estKO
|
| 53 |
+
};
|
| 54 |
+
});
|
| 55 |
+
});
|
| 56 |
+
});
|
| 57 |
+
|
| 58 |
+
// Build BRC Lookup
|
| 59 |
+
// Structure: part_1_info ... sections -> subsections -> clauses
|
| 60 |
+
// Note: brcGSv9.json is an array of parts
|
| 61 |
+
brcData.forEach(part => {
|
| 62 |
+
part.sections?.forEach(section => {
|
| 63 |
+
section.subsections?.forEach(sub => {
|
| 64 |
+
sub.clauses?.forEach(clause => {
|
| 65 |
+
brcLookup[clause.clause_id] = {
|
| 66 |
+
id: clause.clause_id,
|
| 67 |
+
text: clause.requirement,
|
| 68 |
+
section: section.title,
|
| 69 |
+
subsection: sub.title
|
| 70 |
+
};
|
| 71 |
+
});
|
| 72 |
+
// Some subsections contain subsections? (Recursive check not strictly needed based on file view, but usually clauses are in subsections)
|
| 73 |
+
// Based on file view, it seems flat enough: sections -> subsections -> clauses
|
| 74 |
+
});
|
| 75 |
+
});
|
| 76 |
+
});
|
| 77 |
+
|
| 78 |
+
// 2. Build the Correspondence structure
|
| 79 |
+
// We want a list of all IFS items, all BRC items, and the links.
|
| 80 |
+
// The "mapData" (IFSBRC.json) drives the linking.
|
| 81 |
+
|
| 82 |
+
const mappings = [];
|
| 83 |
+
const usedIfsIds = new Set();
|
| 84 |
+
const usedBrcIds = new Set();
|
| 85 |
+
|
| 86 |
+
// Iterate Mapping File
|
| 87 |
+
// Structure: Array of Chapters -> exigences -> ifs_ref, brc_refs (Array)
|
| 88 |
+
mapData.forEach(chapter => {
|
| 89 |
+
chapter.exigences?.forEach(mapping => {
|
| 90 |
+
const ifsRefRaw = mapping.ifs_ref;
|
| 91 |
+
const ifsIdClean = normalizeId(ifsRefRaw);
|
| 92 |
+
|
| 93 |
+
const brcRefs = mapping.brc_refs || [];
|
| 94 |
+
|
| 95 |
+
// Create Mapping Entry
|
| 96 |
+
mappings.push({
|
| 97 |
+
source_id: ifsIdClean, // Normalized for matching
|
| 98 |
+
target_ids: brcRefs,
|
| 99 |
+
// We can keep original ref for display if needed
|
| 100 |
+
ifs_original_ref: ifsRefRaw
|
| 101 |
+
});
|
| 102 |
+
|
| 103 |
+
usedIfsIds.add(ifsIdClean);
|
| 104 |
+
brcRefs.forEach(ref => usedBrcIds.add(ref));
|
| 105 |
+
});
|
| 106 |
+
});
|
| 107 |
+
|
| 108 |
+
// 3. Prepare Final JSON
|
| 109 |
+
// We will dump the lookups as arrays for easier iteration in frontend
|
| 110 |
+
|
| 111 |
+
// Convert lookups to arrays
|
| 112 |
+
const ifsList = Object.values(ifsLookup);
|
| 113 |
+
const brcList = Object.values(brcLookup);
|
| 114 |
+
|
| 115 |
+
const output = {
|
| 116 |
+
ifs_standards: ifsList,
|
| 117 |
+
brc_standards: brcList,
|
| 118 |
+
mappings: mappings
|
| 119 |
+
};
|
| 120 |
+
|
| 121 |
+
const OUTPUT_JS_PATH = 'data.js';
|
| 122 |
+
|
| 123 |
+
console.log(`IFS Items: ${ifsList.length}`);
|
| 124 |
+
console.log(`BRC Items: ${brcList.length}`);
|
| 125 |
+
console.log(`Mappings: ${mappings.length}`);
|
| 126 |
+
|
| 127 |
+
const fileContent = `window.APP_DATA = ${JSON.stringify(output, null, 2)};`;
|
| 128 |
+
|
| 129 |
+
fs.writeFileSync(OUTPUT_JS_PATH, fileContent);
|
| 130 |
+
console.log(`Successfully wrote to ${OUTPUT_JS_PATH}`);
|
| 131 |
+
}
|
| 132 |
+
|
| 133 |
+
try {
|
| 134 |
+
buildData();
|
| 135 |
+
} catch (e) {
|
| 136 |
+
console.error("Error building data:", e);
|
| 137 |
+
}
|
correspondances.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
css/style.css
ADDED
|
@@ -0,0 +1,317 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
/* Base Reset & Fonts */
|
| 2 |
+
:root {
|
| 3 |
+
--primary-ifs: #005BBB;
|
| 4 |
+
--primary-ifs-hover: #004a99;
|
| 5 |
+
--primary-ifs-light: #E6F0FA;
|
| 6 |
+
|
| 7 |
+
--primary-brc: #E84C22;
|
| 8 |
+
--primary-brc-hover: #cc3d18;
|
| 9 |
+
--primary-brc-light: #FDECE9;
|
| 10 |
+
|
| 11 |
+
--text-main: #1E293B;
|
| 12 |
+
--text-secondary: #64748B;
|
| 13 |
+
--bg-app: #F8FAFC;
|
| 14 |
+
--bg-surface: #FFFFFF;
|
| 15 |
+
|
| 16 |
+
--border-color: #E2E8F0;
|
| 17 |
+
--radius-sm: 6px;
|
| 18 |
+
--radius-md: 10px;
|
| 19 |
+
}
|
| 20 |
+
|
| 21 |
+
* {
|
| 22 |
+
box-sizing: border-box;
|
| 23 |
+
margin: 0;
|
| 24 |
+
padding: 0;
|
| 25 |
+
}
|
| 26 |
+
|
| 27 |
+
body {
|
| 28 |
+
font-family: 'Inter', sans-serif;
|
| 29 |
+
color: var(--text-main);
|
| 30 |
+
background-color: var(--bg-app);
|
| 31 |
+
height: 100vh;
|
| 32 |
+
display: flex;
|
| 33 |
+
flex-direction: column;
|
| 34 |
+
overflow: hidden;
|
| 35 |
+
}
|
| 36 |
+
|
| 37 |
+
/* Header */
|
| 38 |
+
.app-header {
|
| 39 |
+
background-color: var(--bg-surface);
|
| 40 |
+
padding: 0.75rem 1.5rem;
|
| 41 |
+
border-bottom: 1px solid var(--border-color);
|
| 42 |
+
display: flex;
|
| 43 |
+
justify-content: space-between;
|
| 44 |
+
align-items: center;
|
| 45 |
+
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
|
| 46 |
+
z-index: 20;
|
| 47 |
+
}
|
| 48 |
+
|
| 49 |
+
.header-content h1 {
|
| 50 |
+
font-family: 'Outfit', sans-serif;
|
| 51 |
+
font-size: 1.25rem;
|
| 52 |
+
font-weight: 700;
|
| 53 |
+
color: var(--text-main);
|
| 54 |
+
display: flex;
|
| 55 |
+
align-items: center;
|
| 56 |
+
gap: 0.5rem;
|
| 57 |
+
}
|
| 58 |
+
|
| 59 |
+
.search-bar input {
|
| 60 |
+
width: 350px;
|
| 61 |
+
padding: 0.5rem 1rem;
|
| 62 |
+
border: 1px solid var(--border-color);
|
| 63 |
+
border-radius: var(--radius-sm);
|
| 64 |
+
font-size: 0.9rem;
|
| 65 |
+
transition: all 0.2s;
|
| 66 |
+
}
|
| 67 |
+
|
| 68 |
+
.search-bar input:focus {
|
| 69 |
+
outline: none;
|
| 70 |
+
border-color: var(--primary-ifs);
|
| 71 |
+
box-shadow: 0 0 0 3px rgba(0, 91, 187, 0.1);
|
| 72 |
+
}
|
| 73 |
+
|
| 74 |
+
/* Main Layout */
|
| 75 |
+
.main-container {
|
| 76 |
+
flex: 1;
|
| 77 |
+
display: flex;
|
| 78 |
+
gap: 0;
|
| 79 |
+
/* Removing gap, using borders instead */
|
| 80 |
+
overflow: hidden;
|
| 81 |
+
}
|
| 82 |
+
|
| 83 |
+
.column {
|
| 84 |
+
flex: 1;
|
| 85 |
+
display: flex;
|
| 86 |
+
flex-direction: column;
|
| 87 |
+
border-right: 1px solid var(--border-color);
|
| 88 |
+
background-color: var(--bg-app);
|
| 89 |
+
}
|
| 90 |
+
|
| 91 |
+
.column:last-child {
|
| 92 |
+
border-right: none;
|
| 93 |
+
}
|
| 94 |
+
|
| 95 |
+
.column-header {
|
| 96 |
+
padding: 1rem;
|
| 97 |
+
background-color: var(--bg-surface);
|
| 98 |
+
border-bottom: 1px solid var(--border-color);
|
| 99 |
+
display: flex;
|
| 100 |
+
justify-content: space-between;
|
| 101 |
+
align-items: center;
|
| 102 |
+
}
|
| 103 |
+
|
| 104 |
+
.column-header h2 {
|
| 105 |
+
font-family: 'Outfit', sans-serif;
|
| 106 |
+
font-size: 1.1rem;
|
| 107 |
+
font-weight: 600;
|
| 108 |
+
color: var(--text-main);
|
| 109 |
+
}
|
| 110 |
+
|
| 111 |
+
.scrollable-list {
|
| 112 |
+
flex: 1;
|
| 113 |
+
overflow-y: auto;
|
| 114 |
+
padding: 1rem;
|
| 115 |
+
padding-bottom: 3rem;
|
| 116 |
+
}
|
| 117 |
+
|
| 118 |
+
/* --- ACCORDION DESIGN --- */
|
| 119 |
+
|
| 120 |
+
/* L1: Chapter / Section - The heavy lifters */
|
| 121 |
+
details.acc-l1 {
|
| 122 |
+
margin-bottom: 0.75rem;
|
| 123 |
+
border-radius: var(--radius-md);
|
| 124 |
+
overflow: hidden;
|
| 125 |
+
background-color: var(--bg-surface);
|
| 126 |
+
border: 1px solid var(--border-color);
|
| 127 |
+
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.03);
|
| 128 |
+
}
|
| 129 |
+
|
| 130 |
+
details.acc-l1>summary {
|
| 131 |
+
padding: 0.75rem 1rem;
|
| 132 |
+
font-family: 'Outfit', sans-serif;
|
| 133 |
+
font-weight: 600;
|
| 134 |
+
font-size: 1rem;
|
| 135 |
+
cursor: pointer;
|
| 136 |
+
list-style: none;
|
| 137 |
+
display: flex;
|
| 138 |
+
align-items: center;
|
| 139 |
+
justify-content: space-between;
|
| 140 |
+
transition: background 0.2s;
|
| 141 |
+
}
|
| 142 |
+
|
| 143 |
+
/* IFS Branding for L1 */
|
| 144 |
+
.ifs-column details.acc-l1>summary {
|
| 145 |
+
background-color: white;
|
| 146 |
+
color: var(--primary-ifs);
|
| 147 |
+
border-left: 4px solid var(--primary-ifs);
|
| 148 |
+
}
|
| 149 |
+
|
| 150 |
+
.ifs-column details.acc-l1>summary:hover {
|
| 151 |
+
background-color: var(--primary-ifs-light);
|
| 152 |
+
}
|
| 153 |
+
|
| 154 |
+
/* BRC Branding for L1 */
|
| 155 |
+
.brc-column details.acc-l1>summary {
|
| 156 |
+
background-color: white;
|
| 157 |
+
color: var(--primary-brc);
|
| 158 |
+
border-left: 4px solid var(--primary-brc);
|
| 159 |
+
}
|
| 160 |
+
|
| 161 |
+
.brc-column details.acc-l1>summary:hover {
|
| 162 |
+
background-color: var(--primary-brc-light);
|
| 163 |
+
}
|
| 164 |
+
|
| 165 |
+
/* L1 Arrow */
|
| 166 |
+
details.acc-l1>summary::after {
|
| 167 |
+
content: '+';
|
| 168 |
+
font-weight: 400;
|
| 169 |
+
font-size: 1.2rem;
|
| 170 |
+
color: #94A3B8;
|
| 171 |
+
}
|
| 172 |
+
|
| 173 |
+
details.acc-l1[open]>summary::after {
|
| 174 |
+
content: '−';
|
| 175 |
+
}
|
| 176 |
+
|
| 177 |
+
/* L1 Content Area */
|
| 178 |
+
.acc-content-l1 {
|
| 179 |
+
padding: 0.5rem;
|
| 180 |
+
background-color: #F8FAFC;
|
| 181 |
+
border-top: 1px solid var(--border-color);
|
| 182 |
+
}
|
| 183 |
+
|
| 184 |
+
/* L2: Nested Sections */
|
| 185 |
+
details.acc-l2 {
|
| 186 |
+
margin-bottom: 0.5rem;
|
| 187 |
+
background-color: transparent;
|
| 188 |
+
}
|
| 189 |
+
|
| 190 |
+
details.acc-l2>summary {
|
| 191 |
+
padding: 0.5rem 0.75rem;
|
| 192 |
+
font-size: 0.9rem;
|
| 193 |
+
font-weight: 500;
|
| 194 |
+
color: var(--text-main);
|
| 195 |
+
cursor: pointer;
|
| 196 |
+
list-style: none;
|
| 197 |
+
border-radius: var(--radius-sm);
|
| 198 |
+
display: flex;
|
| 199 |
+
align-items: center;
|
| 200 |
+
gap: 0.5rem;
|
| 201 |
+
transition: background 0.2s;
|
| 202 |
+
}
|
| 203 |
+
|
| 204 |
+
details.acc-l2>summary:hover {
|
| 205 |
+
background-color: rgba(0, 0, 0, 0.05);
|
| 206 |
+
}
|
| 207 |
+
|
| 208 |
+
/* L2 Arrow (Leading) */
|
| 209 |
+
details.acc-l2>summary::before {
|
| 210 |
+
content: '▶';
|
| 211 |
+
font-size: 0.6rem;
|
| 212 |
+
color: var(--text-secondary);
|
| 213 |
+
transition: transform 0.2s;
|
| 214 |
+
}
|
| 215 |
+
|
| 216 |
+
details.acc-l2[open]>summary::before {
|
| 217 |
+
transform: rotate(90deg);
|
| 218 |
+
}
|
| 219 |
+
|
| 220 |
+
.acc-content-l2 {
|
| 221 |
+
padding-left: 0.75rem;
|
| 222 |
+
/* Indent items */
|
| 223 |
+
padding-top: 0.25rem;
|
| 224 |
+
display: flex;
|
| 225 |
+
flex-direction: column;
|
| 226 |
+
gap: 0.5rem;
|
| 227 |
+
}
|
| 228 |
+
|
| 229 |
+
|
| 230 |
+
/* --- REQUIREMENT ITEMS --- */
|
| 231 |
+
/* More compact, cleaner look */
|
| 232 |
+
|
| 233 |
+
.item-card {
|
| 234 |
+
background-color: white;
|
| 235 |
+
border: 1px solid var(--border-color);
|
| 236 |
+
border-radius: var(--radius-sm);
|
| 237 |
+
padding: 0.75rem;
|
| 238 |
+
cursor: pointer;
|
| 239 |
+
position: relative;
|
| 240 |
+
transition: all 0.15s ease;
|
| 241 |
+
}
|
| 242 |
+
|
| 243 |
+
.item-card:hover {
|
| 244 |
+
border-color: #94A3B8;
|
| 245 |
+
background-color: #FFFFFF;
|
| 246 |
+
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
|
| 247 |
+
z-index: 2;
|
| 248 |
+
}
|
| 249 |
+
|
| 250 |
+
/* Meta Line */
|
| 251 |
+
.meta-info {
|
| 252 |
+
display: flex;
|
| 253 |
+
justify-content: space-between;
|
| 254 |
+
align-items: center;
|
| 255 |
+
margin-bottom: 0.4rem;
|
| 256 |
+
}
|
| 257 |
+
|
| 258 |
+
.ref-id {
|
| 259 |
+
font-size: 0.75rem;
|
| 260 |
+
font-weight: 700;
|
| 261 |
+
color: var(--text-secondary);
|
| 262 |
+
background-color: #F1F5F9;
|
| 263 |
+
padding: 2px 6px;
|
| 264 |
+
border-radius: 4px;
|
| 265 |
+
}
|
| 266 |
+
|
| 267 |
+
.ko-tag {
|
| 268 |
+
font-size: 0.65rem;
|
| 269 |
+
font-weight: 800;
|
| 270 |
+
color: white;
|
| 271 |
+
background-color: #EF4444;
|
| 272 |
+
padding: 2px 6px;
|
| 273 |
+
border-radius: 4px;
|
| 274 |
+
}
|
| 275 |
+
|
| 276 |
+
.item-text {
|
| 277 |
+
font-size: 0.85rem;
|
| 278 |
+
line-height: 1.4;
|
| 279 |
+
color: var(--text-main);
|
| 280 |
+
}
|
| 281 |
+
|
| 282 |
+
/* --- ACTIVE STATES --- */
|
| 283 |
+
/* Strong visual cue when selected/linked */
|
| 284 |
+
|
| 285 |
+
.item-card.active {
|
| 286 |
+
background-color: #FFF;
|
| 287 |
+
box-shadow: 0 0 0 2px transparent;
|
| 288 |
+
}
|
| 289 |
+
|
| 290 |
+
/* IFS Active */
|
| 291 |
+
.ifs-card.active {
|
| 292 |
+
border-color: var(--primary-ifs);
|
| 293 |
+
background-color: #f0f7ff;
|
| 294 |
+
box-shadow: 0 0 0 1px var(--primary-ifs);
|
| 295 |
+
}
|
| 296 |
+
|
| 297 |
+
.ifs-card.active .ref-id {
|
| 298 |
+
background-color: var(--primary-ifs);
|
| 299 |
+
color: white;
|
| 300 |
+
}
|
| 301 |
+
|
| 302 |
+
/* BRC Active */
|
| 303 |
+
.brc-card.active {
|
| 304 |
+
border-color: var(--primary-brc);
|
| 305 |
+
background-color: #fff5f2;
|
| 306 |
+
box-shadow: 0 0 0 1px var(--primary-brc);
|
| 307 |
+
}
|
| 308 |
+
|
| 309 |
+
.brc-card.active .ref-id {
|
| 310 |
+
background-color: var(--primary-brc);
|
| 311 |
+
color: white;
|
| 312 |
+
}
|
| 313 |
+
|
| 314 |
+
/* Utility to ensure details marker is hidden in standard browsers */
|
| 315 |
+
details>summary::-webkit-details-marker {
|
| 316 |
+
display: none;
|
| 317 |
+
}
|
data.js
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
ifs_food_v8_fr.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
index.html
CHANGED
|
@@ -1,19 +1,55 @@
|
|
| 1 |
-
<!
|
| 2 |
-
<html>
|
| 3 |
-
|
| 4 |
-
|
| 5 |
-
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
|
| 9 |
-
|
| 10 |
-
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
|
| 19 |
-
</
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="fr">
|
| 3 |
+
|
| 4 |
+
<head>
|
| 5 |
+
<meta charset="UTF-8">
|
| 6 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 7 |
+
<title>Correspondance IFS v8 - BRC v9</title>
|
| 8 |
+
<link rel="preconnect" href="https://fonts.googleapis.com">
|
| 9 |
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
| 10 |
+
<link
|
| 11 |
+
href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600&family=Outfit:wght@400;600;700&display=swap"
|
| 12 |
+
rel="stylesheet">
|
| 13 |
+
<link rel="stylesheet" href="css/style.css">
|
| 14 |
+
</head>
|
| 15 |
+
|
| 16 |
+
<body>
|
| 17 |
+
<header class="app-header">
|
| 18 |
+
<div class="header-content">
|
| 19 |
+
<h1>Correspondance IFS v8 <span class="arrow">↔</span> BRC v9</h1>
|
| 20 |
+
<p>Outil d'analyse comparative des référentiels de sécurité des aliments</p>
|
| 21 |
+
</div>
|
| 22 |
+
<div class="search-bar">
|
| 23 |
+
<input type="text" id="searchInput" placeholder="Rechercher un mot-clé ou une référence (ex: 1.1.1)...">
|
| 24 |
+
</div>
|
| 25 |
+
</header>
|
| 26 |
+
|
| 27 |
+
<main class="main-container">
|
| 28 |
+
<!-- IFS Column -->
|
| 29 |
+
<section class="column ifs-column">
|
| 30 |
+
<div class="column-header">
|
| 31 |
+
<h2>IFS Food v8</h2>
|
| 32 |
+
<span class="badge ifs-badge">IFS</span>
|
| 33 |
+
</div>
|
| 34 |
+
<div id="ifsList" class="scrollable-list">
|
| 35 |
+
<!-- Items will be injected here -->
|
| 36 |
+
</div>
|
| 37 |
+
</section>
|
| 38 |
+
|
| 39 |
+
<!-- BRC Column -->
|
| 40 |
+
<section class="column brc-column">
|
| 41 |
+
<div class="column-header">
|
| 42 |
+
<h2>BRCGS Food v9</h2>
|
| 43 |
+
<span class="badge brc-badge">BRCGS</span>
|
| 44 |
+
</div>
|
| 45 |
+
<div id="brcList" class="scrollable-list">
|
| 46 |
+
<!-- Items will be injected here -->
|
| 47 |
+
</div>
|
| 48 |
+
</section>
|
| 49 |
+
</main>
|
| 50 |
+
|
| 51 |
+
<script src="data.js"></script>
|
| 52 |
+
<script src="js/app.js"></script>
|
| 53 |
+
</body>
|
| 54 |
+
|
| 55 |
+
</html>
|
js/app.js
ADDED
|
@@ -0,0 +1,233 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
document.addEventListener('DOMContentLoaded', () => {
|
| 2 |
+
const ifsListContainer = document.getElementById('ifsList');
|
| 3 |
+
const brcListContainer = document.getElementById('brcList');
|
| 4 |
+
const searchInput = document.getElementById('searchInput');
|
| 5 |
+
|
| 6 |
+
let appData = null;
|
| 7 |
+
|
| 8 |
+
// Load Data from Global Variable (loaded via data.js)
|
| 9 |
+
if (window.APP_DATA) {
|
| 10 |
+
appData = window.APP_DATA;
|
| 11 |
+
renderLists(appData);
|
| 12 |
+
} else {
|
| 13 |
+
console.error('APP_DATA not found. Ensure data.js is loaded.');
|
| 14 |
+
}
|
| 15 |
+
|
| 16 |
+
// fetch('correspondances.json') ... removed
|
| 17 |
+
|
| 18 |
+
|
| 19 |
+
|
| 20 |
+
function renderLists(data) {
|
| 21 |
+
// Render IFS (Grouped by Chapter -> Section)
|
| 22 |
+
const ifsGroups = groupData(data.ifs_standards, 'chapter', 'section');
|
| 23 |
+
renderGroupedList(ifsListContainer, ifsGroups, 'ifs');
|
| 24 |
+
|
| 25 |
+
// Render BRC (Grouped by Section -> Subsection)
|
| 26 |
+
const brcGroups = groupData(data.brc_standards, 'section', 'subsection');
|
| 27 |
+
renderGroupedList(brcListContainer, brcGroups, 'brc');
|
| 28 |
+
}
|
| 29 |
+
|
| 30 |
+
// Helper to group flat list into Level1 -> Level2 -> Items
|
| 31 |
+
function groupData(items, key1, key2) {
|
| 32 |
+
const groups = {};
|
| 33 |
+
items.forEach(item => {
|
| 34 |
+
// Clean/Fallback
|
| 35 |
+
let k1 = item[key1];
|
| 36 |
+
let k2 = item[key2];
|
| 37 |
+
|
| 38 |
+
if (!k1 || k1 === 'undefined') k1 = 'Général';
|
| 39 |
+
if (!k2 || k2 === 'undefined') k2 = 'Section Générale';
|
| 40 |
+
|
| 41 |
+
if (!groups[k1]) groups[k1] = {};
|
| 42 |
+
if (!groups[k1][k2]) groups[k1][k2] = [];
|
| 43 |
+
|
| 44 |
+
groups[k1][k2].push(item);
|
| 45 |
+
});
|
| 46 |
+
return groups;
|
| 47 |
+
}
|
| 48 |
+
|
| 49 |
+
function renderGroupedList(container, groups, type) {
|
| 50 |
+
container.innerHTML = ''; // Clear existing
|
| 51 |
+
|
| 52 |
+
Object.keys(groups).forEach(l1Key => {
|
| 53 |
+
// Level 1 Accordion (e.g., Chapter)
|
| 54 |
+
const detailsL1 = document.createElement('details');
|
| 55 |
+
detailsL1.className = 'acc-l1';
|
| 56 |
+
|
| 57 |
+
const summaryL1 = document.createElement('summary');
|
| 58 |
+
summaryL1.className = 'acc-summary-l1';
|
| 59 |
+
summaryL1.innerHTML = `<span>${l1Key}</span>`;
|
| 60 |
+
detailsL1.appendChild(summaryL1);
|
| 61 |
+
|
| 62 |
+
const contentL1 = document.createElement('div');
|
| 63 |
+
contentL1.className = 'acc-content-l1';
|
| 64 |
+
|
| 65 |
+
const l2Groups = groups[l1Key];
|
| 66 |
+
Object.keys(l2Groups).forEach(l2Key => {
|
| 67 |
+
// Level 2 Accordion (e.g., Section)
|
| 68 |
+
const detailsL2 = document.createElement('details');
|
| 69 |
+
detailsL2.className = 'acc-l2';
|
| 70 |
+
|
| 71 |
+
const summaryL2 = document.createElement('summary');
|
| 72 |
+
summaryL2.className = 'acc-summary-l2';
|
| 73 |
+
summaryL2.innerHTML = `<span>${l2Key}</span>`;
|
| 74 |
+
detailsL2.appendChild(summaryL2);
|
| 75 |
+
|
| 76 |
+
const contentL2 = document.createElement('div');
|
| 77 |
+
contentL2.className = 'acc-content-l2';
|
| 78 |
+
|
| 79 |
+
// Items
|
| 80 |
+
l2Groups[l2Key].forEach(item => {
|
| 81 |
+
const card = createCard(item, type);
|
| 82 |
+
contentL2.appendChild(card);
|
| 83 |
+
});
|
| 84 |
+
|
| 85 |
+
detailsL2.appendChild(contentL2);
|
| 86 |
+
contentL1.appendChild(detailsL2);
|
| 87 |
+
});
|
| 88 |
+
|
| 89 |
+
detailsL1.appendChild(contentL1);
|
| 90 |
+
container.appendChild(detailsL1);
|
| 91 |
+
});
|
| 92 |
+
}
|
| 93 |
+
|
| 94 |
+
function createCard(item, type) {
|
| 95 |
+
const div = document.createElement('div');
|
| 96 |
+
div.className = `item-card ${type}-card`;
|
| 97 |
+
// Store ID for lookup
|
| 98 |
+
div.dataset.id = cleanId(item.id);
|
| 99 |
+
div.dataset.type = type;
|
| 100 |
+
|
| 101 |
+
// Handling content variations
|
| 102 |
+
const isKO = item.ko === true || (item.text && item.text.includes('KO'));
|
| 103 |
+
const koBadge = isKO ? '<span class="ko-tag">KO</span>' : '';
|
| 104 |
+
|
| 105 |
+
// Breadcrumbs removed from card since we have headers now
|
| 106 |
+
|
| 107 |
+
div.innerHTML = `
|
| 108 |
+
<div class="meta-info">
|
| 109 |
+
<span class="ref-id">${item.id}</span>
|
| 110 |
+
${koBadge}
|
| 111 |
+
</div>
|
| 112 |
+
<div class="item-text">${truncateText(item.text, 300)}</div>
|
| 113 |
+
`;
|
| 114 |
+
|
| 115 |
+
div.addEventListener('click', () => handleCardClick(div, item.id, type));
|
| 116 |
+
return div;
|
| 117 |
+
}
|
| 118 |
+
|
| 119 |
+
function cleanId(id) {
|
| 120 |
+
if (!id) return '';
|
| 121 |
+
return id.replace(/\*$/, '').trim(); // Remove asterisks from IDs like "1.1.1*"
|
| 122 |
+
}
|
| 123 |
+
|
| 124 |
+
function handleCardClick(element, id, type) {
|
| 125 |
+
const cleanID = cleanId(id);
|
| 126 |
+
|
| 127 |
+
// 1. Reset all active states
|
| 128 |
+
document.querySelectorAll('.active').forEach(el => el.classList.remove('active'));
|
| 129 |
+
|
| 130 |
+
// 2. Set clicked item active
|
| 131 |
+
element.classList.add('active');
|
| 132 |
+
|
| 133 |
+
// Ensure parent details are open (redundant since we clicked it, but good for safety)
|
| 134 |
+
openParents(element);
|
| 135 |
+
|
| 136 |
+
element.scrollIntoView({ behavior: 'smooth', block: 'center' });
|
| 137 |
+
|
| 138 |
+
// 3. Find Correspondences
|
| 139 |
+
let targetIds = [];
|
| 140 |
+
|
| 141 |
+
if (type === 'ifs') {
|
| 142 |
+
// Find mapping where this IFS ID is the source
|
| 143 |
+
// Note: Data source ID might have * removed or not, our cleanId handles it.
|
| 144 |
+
// Our mapping table has source_id cleaned.
|
| 145 |
+
|
| 146 |
+
const mapping = appData.mappings.find(m => cleanId(m.source_id) === cleanID);
|
| 147 |
+
if (mapping && mapping.target_ids) {
|
| 148 |
+
targetIds = mapping.target_ids;
|
| 149 |
+
}
|
| 150 |
+
} else {
|
| 151 |
+
// BRC clicked -> Find Mappings where this BRC ID is in target_ids
|
| 152 |
+
const relatedMappings = appData.mappings.filter(m =>
|
| 153 |
+
m.target_ids.some(tid => cleanId(tid) === cleanID)
|
| 154 |
+
);
|
| 155 |
+
targetIds = relatedMappings.map(m => m.source_id);
|
| 156 |
+
}
|
| 157 |
+
|
| 158 |
+
// 4. Highlight Targets
|
| 159 |
+
highlightTargets(targetIds, type === 'ifs' ? 'brc' : 'ifs');
|
| 160 |
+
}
|
| 161 |
+
|
| 162 |
+
function highlightTargets(ids, targetType) {
|
| 163 |
+
if (!ids || ids.length === 0) return;
|
| 164 |
+
|
| 165 |
+
let firstFound = null;
|
| 166 |
+
|
| 167 |
+
ids.forEach(id => {
|
| 168 |
+
const clean = cleanId(id);
|
| 169 |
+
// We need to find the card with this data-id
|
| 170 |
+
// Selector: .targetType-card[data-id="..."]
|
| 171 |
+
// Note: data-id in DOM has cleaned ID.
|
| 172 |
+
|
| 173 |
+
// There might be slight variations in spacing in IDs, so simple attribute selector is best attempt
|
| 174 |
+
const selector = `.${targetType}-card[data-id="${clean}"]`;
|
| 175 |
+
const el = document.querySelector(selector);
|
| 176 |
+
|
| 177 |
+
if (el) {
|
| 178 |
+
el.classList.add('active');
|
| 179 |
+
// MAGIC: Open the accordions containing this element!
|
| 180 |
+
openParents(el);
|
| 181 |
+
|
| 182 |
+
if (!firstFound) firstFound = el;
|
| 183 |
+
}
|
| 184 |
+
});
|
| 185 |
+
|
| 186 |
+
if (firstFound) {
|
| 187 |
+
// Delay slightly to allow expansion animation
|
| 188 |
+
setTimeout(() => {
|
| 189 |
+
firstFound.scrollIntoView({ behavior: 'smooth', block: 'center' });
|
| 190 |
+
}, 100);
|
| 191 |
+
}
|
| 192 |
+
}
|
| 193 |
+
|
| 194 |
+
function openParents(element) {
|
| 195 |
+
let parent = element.parentElement;
|
| 196 |
+
while (parent) {
|
| 197 |
+
if (parent.tagName === 'DETAILS') {
|
| 198 |
+
parent.open = true;
|
| 199 |
+
}
|
| 200 |
+
parent = parent.parentElement;
|
| 201 |
+
}
|
| 202 |
+
}
|
| 203 |
+
|
| 204 |
+
function truncateText(text, length) {
|
| 205 |
+
if (!text) return '';
|
| 206 |
+
if (text.length <= length) return text;
|
| 207 |
+
return text.substring(0, length) + '...';
|
| 208 |
+
}
|
| 209 |
+
|
| 210 |
+
// Search Logic (Improved for Accordions)
|
| 211 |
+
searchInput.addEventListener('input', (e) => {
|
| 212 |
+
const term = e.target.value.toLowerCase();
|
| 213 |
+
|
| 214 |
+
// 1. Filter Cards
|
| 215 |
+
let hasVisible = false;
|
| 216 |
+
document.querySelectorAll('.item-card').forEach(card => {
|
| 217 |
+
const text = card.innerText.toLowerCase();
|
| 218 |
+
const match = text.includes(term);
|
| 219 |
+
if (match) {
|
| 220 |
+
card.style.display = 'block';
|
| 221 |
+
// Automatically open parents if searched
|
| 222 |
+
if (term.length > 2) openParents(card);
|
| 223 |
+
} else {
|
| 224 |
+
card.style.display = 'none';
|
| 225 |
+
}
|
| 226 |
+
});
|
| 227 |
+
|
| 228 |
+
// 2. Hide empty accordions (Optional refinement, but good for UX)
|
| 229 |
+
// Simple approach: If search is cleared, collapse all? Or leave as is.
|
| 230 |
+
// For now, we trust the user. Ideally we'd hide empty details.
|
| 231 |
+
});
|
| 232 |
+
|
| 233 |
+
});
|