Compare commits

..

2 Commits

14 changed files with 735 additions and 4010 deletions

View File

@@ -628,6 +628,9 @@
</head> </head>
<body> <body>
<!-- CONFETTI CANVAS -->
<canvas id="confettiCanvas" style="position:fixed;inset:0;pointer-events:none;z-index:150;display:none;"></canvas>
<!-- HEADER WITH NAVIGATION --> <!-- HEADER WITH NAVIGATION -->
<header> <header>
<div class="logo">NextGN Formation</div> <div class="logo">NextGN Formation</div>
@@ -688,7 +691,10 @@
</div> </div>
</div> </div>
<div id="idError" style="color:var(--coral);font-size:13px;margin-bottom:0.5rem;display:none;">Merci de renseigner au moins le nom du groupe.</div> <div id="idError" style="color:var(--coral);font-size:13px;margin-bottom:0.5rem;display:none;">Merci de renseigner au moins le nom du groupe.</div>
<button class="btn btn-teal" onclick="confirmIdentite()">Continuer →</button> <div style="display:flex;gap:12px;justify-content:center;flex-wrap:wrap;">
<button class="btn btn-teal" onclick="confirmIdentite()">Continuer →</button>
<a href="correction-tp-nuisibles.html" class="btn btn-outline btn-teal">Corriger</a>
</div>
</div> </div>
</div> </div>
@@ -697,7 +703,7 @@
<div class="deco-circle" style="width:400px;height:400px;background:var(--amber-light);top:-100px;right:-80px;opacity:0.6;"></div> <div class="deco-circle" style="width:400px;height:400px;background:var(--amber-light);top:-100px;right:-80px;opacity:0.6;"></div>
<div class="deco-circle" style="width:200px;height:200px;background:var(--amber-light);bottom:60px;left:-60px;opacity:0.5;"></div> <div class="deco-circle" style="width:200px;height:200px;background:var(--amber-light);bottom:60px;left:-60px;opacity:0.5;"></div>
<div style="text-align:center; z-index:1;"> <div style="text-align:center; z-index:1;">
<div class="hero-label">Formation 2025</div> <div class="hero-label">Formation</div>
<div class="hero-title">CERTIBIOCIDE</div> <div class="hero-title">CERTIBIOCIDE</div>
<div style="font-family:'Syne',sans-serif;font-size:clamp(14px,2.5vw,22px);font-weight:600;color:var(--amber-mid);letter-spacing:0.04em;margin-bottom:1.5rem;">TRAVAUX PRATIQUES</div> <div style="font-family:'Syne',sans-serif;font-size:clamp(14px,2.5vw,22px);font-weight:600;color:var(--amber-mid);letter-spacing:0.04em;margin-bottom:1.5rem;">TRAVAUX PRATIQUES</div>
<p class="hero-sub">Votre mission, si vous l'acceptez : maîtriser l'identification, le traitement et la sécurité face aux nuisibles.</p> <p class="hero-sub">Votre mission, si vous l'acceptez : maîtriser l'identification, le traitement et la sécurité face aux nuisibles.</p>
@@ -1119,7 +1125,7 @@
<div style="font-size:48px;margin-bottom:1rem;">🎉</div> <div style="font-size:48px;margin-bottom:1rem;">🎉</div>
<div class="section-tag" style="background:var(--amber-light);color:var(--amber-dark);">Mission accomplie</div> <div class="section-tag" style="background:var(--amber-light);color:var(--amber-dark);">Mission accomplie</div>
<div class="slide-title" style="margin-top:0.5rem;">Félicitations !</div> <div class="slide-title" style="margin-top:0.5rem;">Félicitations !</div>
<p style="font-size:14px;color:var(--text-muted);max-width:480px;text-align:center;line-height:1.7;margin:1rem auto;">Vous avez complété les 3 travaux pratiques de la formation Certibiocide 2025. Le formateur va maintenant corriger à l'oral.</p> <p style="font-size:14px;color:var(--text-muted);max-width:480px;text-align:center;line-height:1.7;margin:1rem auto;">Vous avez complété les 3 travaux pratiques de la formation Certibiocide. Le formateur va maintenant corriger à l'oral.</p>
<div class="final-grid"> <div class="final-grid">
<div class="final-card"> <div class="final-card">
<div class="final-card-icon">🗂️</div> <div class="final-card-icon">🗂️</div>
@@ -1140,6 +1146,7 @@
<div class="submit-zone"> <div class="submit-zone">
<div style="display:flex;gap:10px;justify-content:center;flex-wrap:wrap;"> <div style="display:flex;gap:10px;justify-content:center;flex-wrap:wrap;">
<button class="btn btn-teal" onclick="exporterPDF()">⬇ Télécharger en PDF</button> <button class="btn btn-teal" onclick="exporterPDF()">⬇ Télécharger en PDF</button>
<a href="correction-tp-nuisibles.html" class="btn btn-outline btn-teal">Corriger</a>
</div> </div>
</div> </div>
<div style="display:flex;gap:10px;justify-content:center;flex-wrap:wrap;margin-top:0.75rem;"> <div style="display:flex;gap:10px;justify-content:center;flex-wrap:wrap;margin-top:0.75rem;">
@@ -1243,6 +1250,7 @@ function goTo(n) {
currentSlide = n; currentSlide = n;
next.style.display = 'flex'; next.style.display = 'flex';
setTimeout(() => { next.classList.add('active', 'fade-in'); }, 10); setTimeout(() => { next.classList.add('active', 'fade-in'); }, 10);
if (n === 13) setTimeout(launchConfetti, 200);
updateUI(); updateUI();
updateCaseBanners(); updateCaseBanners();
} }
@@ -1497,7 +1505,7 @@ function exporterPDF() {
.meta { font-size: 13px; color: #555; margin-bottom: 4px; } .meta { font-size: 13px; color: #555; margin-bottom: 4px; }
</style></head> </style></head>
<body> <body>
<h1>TP Nuisibles — Certibiocide 2025</h1> <h1>TP Nuisibles — Certibiocide</h1>
<p class="meta"><strong>Groupe / Stagiaire :</strong> ${escapeHtml(data.nom)}</p> <p class="meta"><strong>Groupe / Stagiaire :</strong> ${escapeHtml(data.nom)}</p>
<p class="meta"><strong>Date de session :</strong> ${escapeHtml(data.date_session)}</p> <p class="meta"><strong>Date de session :</strong> ${escapeHtml(data.date_session)}</p>
<p class="meta"><strong>Formateur :</strong> ${escapeHtml(data.formateur)}</p> <p class="meta"><strong>Formateur :</strong> ${escapeHtml(data.formateur)}</p>
@@ -1520,6 +1528,79 @@ function exporterPDF() {
setTimeout(() => w.print(), 300); setTimeout(() => w.print(), 300);
} }
/* ======================== CONFETTI ======================== */
function launchConfetti() {
const canvas = document.getElementById('confettiCanvas');
if (!canvas) return;
const ctx = canvas.getContext('2d');
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
canvas.style.display = 'block';
const colors = ['#BA7517', '#D85A30', '#F5DFB8', '#633806', '#F0A855', '#E8C068', '#FF8C5A'];
const particles = Array.from({ length: 180 }, () => ({
x: Math.random() * canvas.width,
y: -(Math.random() * canvas.height * 0.5),
w: Math.random() * 10 + 5,
h: Math.random() * 5 + 3,
color: colors[Math.floor(Math.random() * colors.length)],
rotation: Math.random() * Math.PI * 2,
rotSpeed: (Math.random() - 0.5) * 0.18,
vx: (Math.random() - 0.5) * 2.5,
vy: Math.random() * 3 + 2,
opacity: 1,
shape: Math.random() < 0.4 ? 'circle' : 'rect'
}));
let rafId;
let start = null;
const totalDuration = 3800;
function draw(ts) {
if (!start) start = ts;
const elapsed = ts - start;
ctx.clearRect(0, 0, canvas.width, canvas.height);
let active = false;
particles.forEach(p => {
p.x += p.vx;
p.y += p.vy;
p.vy += 0.04;
p.rotation += p.rotSpeed;
p.opacity = elapsed < totalDuration * 0.55
? 1
: Math.max(0, 1 - (elapsed - totalDuration * 0.55) / (totalDuration * 0.45));
if (p.y < canvas.height + 20) active = true;
ctx.save();
ctx.translate(p.x, p.y);
ctx.rotate(p.rotation);
ctx.globalAlpha = p.opacity;
ctx.fillStyle = p.color;
if (p.shape === 'circle') {
ctx.beginPath();
ctx.arc(0, 0, p.w / 2, 0, Math.PI * 2);
ctx.fill();
} else {
ctx.fillRect(-p.w / 2, -p.h / 2, p.w, p.h);
}
ctx.restore();
});
if (active && elapsed < totalDuration * 1.3) {
rafId = requestAnimationFrame(draw);
} else {
canvas.style.display = 'none';
ctx.clearRect(0, 0, canvas.width, canvas.height);
}
}
if (rafId) cancelAnimationFrame(rafId);
rafId = requestAnimationFrame(draw);
}
function escapeHtml(str) { function escapeHtml(str) {
if (!str) return ''; if (!str) return '';
return str.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;'); return str.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');

View File

@@ -1,299 +0,0 @@
<%@ Language="VBScript" %>
<%
Response.Buffer = True
Response.CharSet = "UTF-8"
' ------- À ADAPTER : même chaîne de connexion que save_results.asp -------
Dim connString
connString = "Provider=SQLOLEDB;Data Source=sql.bsite.net\MSSQL2016;" & _
"Initial Catalog=nextgnformation_reponses_exercices;" & _
"User ID=nextgnformation_reponses_exercices;" & _
"Password=S5$NyFXzEjJCg6jD;"
' ------- À ADAPTER : mot de passe d'accès à cette page -------
Dim ADMIN_PASSWORD
ADMIN_PASSWORD = "Sm#gnttCaYE5f3ED"
' -----------------------------------------------------------------------
Dim authenticated
authenticated = False
If Request.Cookies("tp_admin_auth") = "ok" Then
authenticated = True
End If
If Request.Form("password") <> "" Then
If Request.Form("password") = ADMIN_PASSWORD Then
authenticated = True
Response.Cookies("tp_admin_auth") = "ok"
Response.Cookies("tp_admin_auth").Expires = DateAdd("h", 8, Now)
Else
authenticated = False
End If
End If
Function HtmlEscape(s)
If IsNull(s) Then
HtmlEscape = ""
Exit Function
End If
s = CStr(s)
s = Replace(s, "&", "&amp;")
s = Replace(s, "<", "&lt;")
s = Replace(s, ">", "&gt;")
HtmlEscape = s
End Function
%>
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Résultats des TP — NextGN Formation</title>
<link href="https://fonts.googleapis.com/css2?family=Syne:wght@400;600;700;800&family=DM+Sans:ital,wght@0,300;0,400;0,500;1,300&display=swap" rel="stylesheet">
<style>
:root {
--amber: #BA7517; --amber-light: #FAEEDA; --amber-dark: #633806;
--coral: #993C1D; --coral-mid: #D85A30; --coral-light: #FAECE7;
--bg: #F7F6F2; --white: #FFFFFF; --text: #1a1a18; --text-muted: #6b6a65;
--border: rgba(0,0,0,0.1);
}
* { box-sizing: border-box; }
body {
margin: 0; font-family: 'DM Sans', sans-serif; background: var(--bg); color: var(--text);
padding-top: 70px;
}
.nav-header {
position: fixed; top: 0; left: 0; right: 0; height: 70px;
background: rgba(250,238,218,0.98); border-bottom: 2px solid var(--amber);
display: flex; align-items: center; justify-content: space-between; padding: 0 40px; z-index: 1000;
}
.header-logo {
font-family: 'Syne', sans-serif; font-size: 16px; font-weight: 700;
background: linear-gradient(135deg, var(--amber), var(--coral-mid));
-webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text;
}
.wrap { max-width: 1200px; margin: 0 auto; padding: 2rem; }
h1 { font-family: 'Syne', sans-serif; font-size: 24px; font-weight: 800; }
.login-box {
max-width: 360px; margin: 80px auto; background: white; border: 1px solid var(--border);
border-radius: 16px; padding: 2rem; text-align: center;
}
.login-box input[type="password"] {
width: 100%; padding: 12px 16px; border: 1.5px solid var(--border); border-radius: 10px;
font-size: 15px; margin: 1rem 0;
}
.login-box button, .btn {
font-family: 'Syne', sans-serif; font-size: 13px; font-weight: 700; letter-spacing: 0.05em;
text-transform: uppercase; background: var(--amber); color: white; border: none;
border-radius: 30px; padding: 10px 24px; cursor: pointer;
}
.error-msg { color: var(--coral); font-size: 13px; margin-bottom: 0.5rem; }
table.results { width: 100%; border-collapse: collapse; background: white; border-radius: 12px; overflow: hidden; border: 1px solid var(--border); font-size: 13px; }
table.results th {
background: var(--amber-light); color: var(--amber-dark); font-family: 'Syne', sans-serif;
font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.04em;
padding: 10px 14px; text-align: left; border-bottom: 2px solid var(--amber);
}
table.results td { padding: 10px 14px; border-bottom: 1px solid var(--border); vertical-align: top; }
table.results tr:hover { background: #FAFAFA; }
.detail-toggle { cursor: pointer; color: var(--amber-dark); font-weight: 700; text-decoration: underline; background: none; border: none; font-family: 'DM Sans', sans-serif; font-size: 13px; }
.detail-row { display: none; }
.detail-row.open { display: table-row; }
.detail-content { background: #FAFAFA; padding: 16px 24px; }
.detail-content h3 { font-family: 'Syne', sans-serif; font-size: 13px; margin: 14px 0 6px; color: var(--amber-dark); }
.detail-content p { margin: 4px 0; font-size: 13px; line-height: 1.5; }
.topbar { display: flex; justify-content: space-between; align-items: center; margin-bottom: 1.5rem; }
.count-badge { background: var(--amber-light); color: var(--amber-dark); padding: 6px 14px; border-radius: 20px; font-size: 12px; font-weight: 700; font-family: 'Syne', sans-serif; }
.risk-mini { width: 100%; border-collapse: collapse; margin-top: 4px; }
.risk-mini td { border: 1px solid var(--border); padding: 4px 8px; font-size: 12px; }
</style>
</head>
<body>
<nav class="nav-header">
<span class="header-logo">NextGN Formation — Admin</span>
</nav>
<div class="wrap">
<%
If Not authenticated Then
%>
<div class="login-box">
<h1 style="font-size:18px;">Accès résultats TP</h1>
<% If Request.Form("password") <> "" Then %>
<div class="error-msg">Mot de passe incorrect.</div>
<% End If %>
<form method="POST">
<input type="password" name="password" placeholder="Mot de passe" autofocus>
<br>
<button type="submit">Se connecter</button>
</form>
</div>
<%
Else
Dim conn, rs
Set conn = Server.CreateObject("ADODB.Connection")
On Error Resume Next
conn.Open connString
If Err.Number <> 0 Then
%>
<p style="color:var(--coral);">Erreur de connexion à la base : <%= HtmlEscape(Err.Description) %></p>
<%
Else
Err.Clear
Set rs = conn.Execute("SELECT * FROM tp_resultats ORDER BY date_enregistrement DESC")
If Err.Number <> 0 Then
%>
<p style="color:var(--coral);">La table tp_resultats n'existe pas encore — aucun envoi reçu pour le moment.</p>
<%
Else
%>
<div class="topbar">
<h1>Résultats des stagiaires</h1>
<span class="count-badge"><%= IIf_Count(rs) %></span>
</div>
<table class="results">
<tr>
<th>Groupe / Stagiaire</th>
<th>Date session</th>
<th>Cas pratique</th>
<th>Reçu le</th>
<th>Détail</th>
</tr>
<%
Dim rowIndex
rowIndex = 0
Do While Not rs.EOF
rowIndex = rowIndex + 1
%>
<tr>
<td><%= HtmlEscape(rs("nom")) %></td>
<td><%= HtmlEscape(rs("date_session")) %></td>
<td><%= HtmlEscape(rs("cas_choisi")) %></td>
<td><%= HtmlEscape(rs("date_enregistrement")) %></td>
<td><button class="detail-toggle" onclick="toggleDetail(<%= rowIndex %>)">Voir le détail</button></td>
</tr>
<tr class="detail-row" id="detail-<%= rowIndex %>">
<td colspan="5">
<div class="detail-content">
<h3>Réponses TP1 &amp; TP2</h3>
<%= RenderReponses(rs("reponses_json")) %>
<h3>TP3 — Analyse de risques</h3>
<p><strong>Intitulé :</strong> <%= HtmlEscape(rs("tp3_intitule")) %></p>
<p><strong>Description :</strong> <%= HtmlEscape(rs("tp3_description")) %></p>
<p><strong>Lieu :</strong> <%= HtmlEscape(rs("tp3_lieu")) %></p>
<p><strong>Début prévu :</strong> <%= HtmlEscape(rs("tp3_debut")) %></p>
<%= RenderTableau(rs("tp3_tableau_json")) %>
<p><strong>Réalisée par :</strong> <%= HtmlEscape(rs("tp3_realise_par")) %> —
<strong>Vérifiée par :</strong> <%= HtmlEscape(rs("tp3_verifie_par")) %> —
<strong>MAJ par :</strong> <%= HtmlEscape(rs("tp3_maj_par")) %></p>
</div>
</td>
</tr>
<%
rs.MoveNext
Loop
%>
</table>
<%
End If
conn.Close
End If
End If
%>
</div>
<script>
function toggleDetail(i) {
var row = document.getElementById('detail-' + i);
row.classList.toggle('open');
}
</script>
</body>
</html>
<%
Function IIf_Count(rs)
Dim n
n = 0
Do While Not rs.EOF
n = n + 1
rs.MoveNext
Loop
rs.MoveFirst
IIf_Count = n & " envoi(s)"
End Function
' --- Parsing JSON minimal via ScriptControl pour l'affichage admin ---
Function RenderReponses(jsonStr)
Dim out
out = ""
If Trim(jsonStr) = "" Then
RenderReponses = "<p><em>Aucune réponse.</em></p>"
Exit Function
End If
Dim sc
Set sc = Server.CreateObject("MSScriptControl.ScriptControl")
sc.Language = "JScript"
sc.AddCode "function parseArr(s){ return eval('(' + s + ')'); }"
On Error Resume Next
Dim arr
Set arr = sc.Run("parseArr", jsonStr)
If Err.Number <> 0 Then
RenderReponses = "<p><em>Erreur de lecture des réponses.</em></p>"
Exit Function
End If
On Error Goto 0
Dim i
For i = 0 To arr.length - 1
Dim q, r
q = arr.Item(i).question
r = arr.Item(i).reponse
If Trim(r) = "" Then r = "(sans réponse)"
out = out & "<p><strong>" & ServerHtmlEscape(q) & " :</strong> " & ServerHtmlEscape(r) & "</p>"
Next
RenderReponses = out
End Function
Function RenderTableau(jsonStr)
Dim out
out = ""
If Trim(jsonStr) = "" Then
RenderTableau = ""
Exit Function
End If
Dim sc
Set sc = Server.CreateObject("MSScriptControl.ScriptControl")
sc.Language = "JScript"
sc.AddCode "function parseArr(s){ return eval('(' + s + ')'); }"
On Error Resume Next
Dim arr
Set arr = sc.Run("parseArr", jsonStr)
If Err.Number <> 0 Then
RenderTableau = "<p><em>Erreur de lecture du tableau.</em></p>"
Exit Function
End If
On Error Goto 0
out = "<table class='risk-mini'><tr><th>Étape</th><th>Risque</th><th>Mesure</th></tr>"
Dim i
For i = 0 To arr.length - 1
out = out & "<tr><td>" & ServerHtmlEscape(arr.Item(i).etape) & "</td><td>" & _
ServerHtmlEscape(arr.Item(i).risque) & "</td><td>" & _
ServerHtmlEscape(arr.Item(i).mesure) & "</td></tr>"
Next
out = out & "</table>"
RenderTableau = out
End Function
Function ServerHtmlEscape(s)
If IsNull(s) Then
ServerHtmlEscape = ""
Exit Function
End If
s = CStr(s)
s = Replace(s, "&", "&amp;")
s = Replace(s, "<", "&lt;")
s = Replace(s, ">", "&gt;")
ServerHtmlEscape = s
End Function
%>

View File

@@ -0,0 +1,650 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Correction TP Nuisibles — Certibiocide</title>
<link href="https://fonts.googleapis.com/css2?family=Syne:wght@600;700;800&family=DM+Sans:ital,wght@0,400;0,500;1,400&display=swap" rel="stylesheet">
<link rel="stylesheet" href="../header-style.css"/>
<style>
body {
padding: calc(36px + 70px) 20px 80px;
}
.wrap { max-width: 820px; margin: 0 auto; }
.syne { font-family: 'Syne', sans-serif; }
.eyebrow {
font-family: 'Syne', sans-serif;
font-size: 12px;
font-weight: 700;
letter-spacing: 0.08em;
text-transform: uppercase;
color: var(--amber);
margin-bottom: 6px;
}
h1 {
font-family: 'Syne', sans-serif;
font-size: 28px;
font-weight: 800;
letter-spacing: -0.5px;
margin-bottom: 28px;
}
/* DROPZONE */
#dropzone {
background: #fff;
border: 2px dashed rgba(186,117,23,0.35);
border-radius: 16px;
padding: 56px 24px;
text-align: center;
cursor: pointer;
transition: border-color 0.2s, background 0.2s;
}
#dropzone.drag { border-color: var(--amber); background: var(--amber-light); }
#dropzone .icon { font-size: 40px; margin-bottom: 12px; }
#dropzone p.title { font-family: 'Syne', sans-serif; font-weight: 700; font-size: 16px; margin-bottom: 6px; }
#dropzone p.sub { color: var(--text-muted); font-size: 13.5px; margin-bottom: 20px; }
#filePicker { display: none; }
.btn-pick {
font-family: 'Syne', sans-serif;
display: inline-block;
background: var(--amber);
color: #fff;
font-weight: 700;
font-size: 13px;
padding: 10px 26px;
border-radius: 30px;
cursor: pointer;
border: none;
}
#status { margin-top: 16px; font-size: 13px; }
#status.loading { color: var(--amber); }
#status.error { color: var(--coral); }
/* RESULT */
#result { display: none; }
.toprow {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 18px;
}
#fileName { font-size: 12.5px; color: var(--text-muted); }
.btn-reset {
font-family: 'Syne', sans-serif;
background: transparent;
border: 1px solid var(--border);
border-radius: 20px;
padding: 6px 16px;
font-size: 12px;
font-weight: 600;
cursor: pointer;
color: var(--text-muted);
}
.btn-reset:hover { border-color: var(--amber); color: var(--amber); }
.id-card { display: none; }
/* BANDEAU PARTICIPANTS */
#participantsBanner {
background: linear-gradient(135deg, var(--amber) 0%, #D8923A 100%);
border-radius: 16px;
padding: 20px 26px;
margin-bottom: 24px;
display: flex;
align-items: center;
gap: 16px;
color: #fff;
}
#participantsBanner .pb-icon {
width: 48px; height: 48px;
border-radius: 12px;
background: rgba(255,255,255,0.2);
display: flex; align-items: center; justify-content: center;
font-size: 24px;
flex-shrink: 0;
}
#participantsBanner .pb-group {
font-family: 'Syne', sans-serif;
font-size: 11px;
font-weight: 700;
letter-spacing: 0.06em;
text-transform: uppercase;
opacity: 0.85;
margin-bottom: 4px;
}
#participantsBanner .pb-names {
font-family: 'Syne', sans-serif;
font-size: 18px;
font-weight: 700;
}
.id-card .label {
font-family: 'Syne', sans-serif;
font-size: 10.5px;
font-weight: 700;
color: var(--amber-dark);
letter-spacing: 0.05em;
text-transform: uppercase;
}
.id-card .value { font-size: 14.5px; margin-top: 2px; }
.progress-row { display: flex; align-items: center; gap: 10px; margin-bottom: 30px; font-size: 13px; color: var(--text-muted); }
.progress-track { flex: 1; height: 7px; background: rgba(0,0,0,0.08); border-radius: 6px; overflow: hidden; }
.progress-fill { height: 100%; background: var(--teal); transition: width 0.4s ease; }
.progress-row strong { font-family: 'Syne', sans-serif; color: var(--text); }
/* CARROUSEL DE THEMES */
.carousel-wrap { margin-bottom: 36px; }
.carousel-nav {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 16px;
}
.nav-btn {
width: 38px; height: 38px;
border-radius: 50%;
border: 1px solid var(--border);
background: #fff;
font-size: 16px;
cursor: pointer;
display: flex; align-items: center; justify-content: center;
transition: background 0.15s, border-color 0.15s;
}
.nav-btn:hover { background: var(--amber-light); border-color: var(--amber); }
.nav-btn:disabled { opacity: 0.3; cursor: default; }
.nav-btn:disabled:hover { background: #fff; border-color: var(--border); }
.dots { display: flex; gap: 7px; }
.dot { width: 8px; height: 8px; border-radius: 50%; background: rgba(0,0,0,0.15); cursor: pointer; transition: background 0.15s, transform 0.15s; }
.dot.active { background: var(--amber); transform: scale(1.3); }
.theme-panel {
background: #fff;
border: 1px solid var(--border);
border-radius: 18px;
padding: 26px 28px;
min-height: 420px;
}
.theme-head {
display: flex;
align-items: center;
gap: 12px;
margin-bottom: 18px;
}
.theme-icon {
width: 44px; height: 44px;
border-radius: 12px;
display: flex; align-items: center; justify-content: center;
font-size: 22px;
flex-shrink: 0;
}
.theme-title { font-family: 'Syne', sans-serif; font-weight: 800; font-size: 17px; }
.theme-count { font-size: 12.5px; color: var(--text-muted); margin-left: auto; }
.cards { display: flex; flex-direction: column; gap: 10px; }
.qcard {
background: var(--bg);
border: 1px solid var(--border);
border-radius: 12px;
padding: 14px 18px;
display: flex;
gap: 12px;
align-items: flex-start;
transition: box-shadow 0.2s;
}
.qcard:hover { box-shadow: 0 4px 16px rgba(0,0,0,0.06); }
.qcard .badge {
width: 22px; height: 22px;
border-radius: 50%;
display: flex; align-items: center; justify-content: center;
font-size: 12px;
flex-shrink: 0;
margin-top: 1px;
}
.qcard .badge.ok { background: var(--teal-light); color: var(--teal); }
.qcard .badge.miss { background: var(--coral-light); color: var(--coral); }
.qcard .qtext { flex: 1; }
.qcard .qlabel { font-weight: 600; font-size: 13.5px; margin-bottom: 4px; }
.qcard .qanswer { font-size: 13.5px; white-space: pre-wrap; }
.qcard .qanswer.empty { color: var(--coral); font-style: italic; }
.table-wrap {
background: #fff;
border: 1px solid var(--border);
border-radius: 12px;
padding: 16px 18px;
font-size: 13px;
margin-bottom: 14px;
}
/* TABLEAU ANALYSE DE RISQUES */
.risk-table { width: 100%; border-collapse: collapse; font-size: 13px; }
.risk-table th {
font-family: 'Syne', sans-serif;
text-align: left;
font-size: 11.5px;
text-transform: uppercase;
letter-spacing: 0.04em;
color: var(--amber-dark);
background: var(--amber-light);
padding: 10px 12px;
}
.risk-table th:first-child { border-radius: 8px 0 0 8px; }
.risk-table th:last-child { border-radius: 0 8px 8px 0; }
.risk-table td {
padding: 10px 12px;
border-bottom: 1px solid var(--border);
vertical-align: top;
white-space: pre-wrap;
}
.risk-table tr:last-child td { border-bottom: none; }
.meta-line { font-size: 12.5px; color: var(--text-muted); margin-top: 20px; }
.meta-line strong { color: var(--text); }
</style>
</head>
<body>
<header>
<div class="logo">NextGN Formation</div>
<nav>
<a href="../index.html">Accueil</a>
<a href="../index.html#formations">Exercices</a>
<a href="../index.html#documentation">Documentation</a>
<a href="../index.html#rapports">Rapports</a>
<a href="../index.html#about">À propos</a>
<a href="../index.html#contact">Contact</a>
</nav>
</header>
<div class="wrap">
<div id="participantsBanner" style="display:none;"></div>
<div class="eyebrow">Certibiocide — Correction de TP</div>
<h1>TP Nuisibles — Lecture du rendu</h1>
<div id="dropzone">
<div class="icon">📄</div>
<p class="title">Déposez le PDF du stagiaire ici</p>
<p class="sub">ou cliquez pour sélectionner le fichier exporté depuis le TP</p>
<label class="btn-pick">Choisir un fichier
<input type="file" id="filePicker" accept="application/pdf">
</label>
<div id="status"></div>
</div>
<div id="result">
<div class="toprow">
<span id="fileName"></span>
<button class="btn-reset" onclick="resetAll()">↺ Charger un autre PDF</button>
</div>
<div class="id-card" id="idCard"></div>
<div class="progress-row">
<div class="progress-track"><div class="progress-fill" id="progressFill"></div></div>
<span><strong id="progressCount"></strong> questions répondues</span>
</div>
<div class="carousel-wrap">
<div class="carousel-nav">
<button class="nav-btn" id="prevBtn" onclick="goTo(currentTheme - 1)"></button>
<div class="dots" id="dots"></div>
<button class="nav-btn" id="nextBtn" onclick="goTo(currentTheme + 1)"></button>
</div>
<div id="themePanel"></div>
</div>
<h2 class="syne" style="font-size:16px;font-weight:800;margin-bottom:12px;color:var(--amber-dark);">Analyse de risques</h2>
<div class="table-wrap" id="tp3Meta"></div>
<div class="table-wrap" id="tp3Table" style="display:none;"></div>
<p class="meta-line" id="suiviLine"></p>
</div>
</div>
<footer>
<p>&copy; 2026 NextGN Formation - Formations Certibiocide & Techniques</p>
<p style="margin-top: 10px; opacity: 0.6;">Tous droits réservés — Gauthier Chombart & Nathan Chauwin — Formateurs indépendants</p>
</footer>
<script src="https://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.11.174/pdf.min.js"></script>
<script>
pdfjsLib.GlobalWorkerOptions.workerSrc = "https://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.11.174/pdf.worker.min.js";
// Thèmes regroupant les sections du TP, avec icône et couleur
const THEMES = [
{
title: "Premier contact & diagnostic",
icon: "🗣️", color: "purple",
items: [
"Questions posées au client lors du premier contact",
"Conseils donnés en premier lieu",
"Actions de prévention menées sur le site",
"Éléments observés / preuve de présence du nuisible",
]
},
{
title: "Solutions envisagées",
icon: "🧰", color: "blue",
items: [
"Solutions alternatives non-biocides",
"Solutions biocides mises en place",
"Type de produit (TP) et mode de traitement",
"Suivi mis en place et durée",
"Gestion des déchets",
]
},
{
title: "Produit & traçabilité",
icon: "🧪", color: "teal",
items: [
"FDS trouvée (éléments principaux)",
"Nom du produit et fabricant/fournisseur",
"Numéro AMM",
]
},
{
title: "Sécurité & santé",
icon: "🛡️", color: "coral",
items: [
"Risques pour la santé",
"EPI à porter",
"Risques environnement / dispersion accidentelle",
"DL50 substance(s) active(s)",
"Gestes de premiers secours",
]
},
];
const ALL_SECTIONS = THEMES.flatMap(t => t.items);
const COLOR_MAP = {
purple: { bg: "var(--purple-light)", fg: "var(--purple)" },
blue: { bg: "var(--blue-light)", fg: "var(--blue)" },
teal: { bg: "var(--teal-light)", fg: "var(--teal)" },
coral: { bg: "var(--coral-light)", fg: "var(--coral)" },
};
function escapeRx(s) { return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); }
function escapeHtml(s) {
if (!s) return "";
return s.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;");
}
function isEmpty(v) {
if (!v) return true;
const t = v.trim();
return t === "" || /^\(sans réponse\)$/i.test(t);
}
function captureBetween(text, label, nextLabels) {
const startRx = new RegExp(escapeRx(label) + "\\s*:?\\s*", "i");
const m = startRx.exec(text);
if (!m) return "";
const from = m.index + m[0].length;
let to = text.length;
for (const nl of nextLabels) {
const endRx = new RegExp(escapeRx(nl), "i");
const m2 = endRx.exec(text.slice(from));
if (m2 && from + m2.index < to) to = from + m2.index;
}
return text.slice(from, to).trim();
}
function parsePdfText(raw) {
let clean = raw.replace(/\r/g, "").replace(/[ \t]+\n/g, "\n").replace(/\s+/g, " ").trim();
// Retire les répétitions d'en-tête de page (ex: "17/06/2026 15:42 Résultats TP — ... about:blank 1/2")
clean = clean.replace(/\d{1,2}\/\d{1,2}\/\d{4}\s+\d{1,2}:\d{2}\s+Résultats TP[^]*?about:blank\s*\d\/\d/gi, " ");
const meta = {
nom: captureBetween(clean, "Groupe / Stagiaire", ["Date de session"]),
date_session: captureBetween(clean, "Date de session", ["Formateur"]),
formateur: captureBetween(clean, "Formateur", ["Cas pratique"]),
cas: captureBetween(clean, "Cas pratique", ["Réponses TP1"]),
};
// Sépare "Groupe N" du nom des participants (ex: "Groupe 1 Romain Kevin Valere Greg P")
const groupMatch = /^Groupe\s*(\d+)\s*(.*)$/i.exec(meta.nom.trim());
if (groupMatch) {
meta.groupe = "Groupe " + groupMatch[1];
meta.participants = groupMatch[2].trim();
} else {
meta.groupe = "";
meta.participants = meta.nom.trim();
}
const startIdx = clean.search(/Réponses TP1\s*&?\s*TP2/i);
const endIdx = clean.search(/TP3\s*[—-]\s*Analyse de risques/i);
const block = startIdx >= 0 ? clean.slice(startIdx, endIdx >= 0 ? endIdx : clean.length) : clean;
const answers = {};
for (let i = 0; i < ALL_SECTIONS.length; i++) {
const label = ALL_SECTIONS[i];
const nextLabel = ALL_SECTIONS[i + 1];
answers[label] = captureBetween(block, label, nextLabel ? [nextLabel] : []);
}
const tp3Zone = endIdx >= 0 ? clean.slice(endIdx) : "";
const tp3 = {
intitule: captureBetween(tp3Zone, "Intitulé", ["Description"]),
description: captureBetween(tp3Zone, "Description", ["Lieu"]),
lieu: captureBetween(tp3Zone, "Lieu", ["Début prévu le"]),
debut: captureBetween(tp3Zone, "Début prévu le", ["Étapes"]),
};
// Tableau de risques : on découpe en s'appuyant sur les intitulés d'étapes connus du TP
const KNOWN_STEPS = [
"remplir la poudreuse",
"sécurisation du site",
"application traitements",
"rangement du matériel. purger la perche",
"retrait du nid",
"gestion des déchets. élimination par des filiaires spé.",
];
let riskRows = [];
const tableMatch = /Étapes\s*Risques\s*Mesures de prévention([\s\S]*?)(Réalisée par|$)/i.exec(tp3Zone);
if (tableMatch) {
let raw = tableMatch[1].trim();
if (raw) {
// Repère les positions de chaque étape connue dans le texte aplati
const positions = [];
KNOWN_STEPS.forEach(step => {
const idx = raw.toLowerCase().indexOf(step.toLowerCase());
if (idx >= 0) positions.push({ step, idx });
});
positions.sort((a, b) => a.idx - b.idx);
if (positions.length > 0) {
for (let i = 0; i < positions.length; i++) {
const from = positions[i].idx + positions[i].step.length;
const to = i + 1 < positions.length ? positions[i + 1].idx : raw.length;
let rest = raw.slice(from, to).trim();
// rest contient "risque... mesure..." -> on coupe sur les mots clés de mesures (gants/masques, barrieres, etc.)
const measureRx = /(gants\s*\/\s*masques\s*\/\s*lunettes[^.]*|barrieres\.?\s*epi)/i;
const mm = measureRx.exec(rest);
let risque = rest, mesure = "";
if (mm) {
risque = rest.slice(0, mm.index).trim();
mesure = rest.slice(mm.index).trim();
}
risque = risque.replace(/^[\s\-.]+/, "").trim();
riskRows.push({ etape: positions[i].step, risque: risque || "—", mesure: mesure || "—" });
}
} else {
riskRows.push({ etape: raw, risque: "", mesure: "" });
}
}
}
const mReal = clean.match(/Réalisée par\s*:\s*([^—\n]*)/i);
const mVerif = clean.match(/Vérifiée par\s*:\s*([^—\n]*)/i);
const mMaj = clean.match(/Mise à jour par\s*:\s*([^—\n]*)/i);
return {
meta, answers, tp3, riskRows,
suivi: {
realise: mReal ? mReal[1].trim() : "",
verifie: mVerif ? mVerif[1].trim() : "",
maj: mMaj ? mMaj[1].trim() : "",
}
};
}
let currentThemeData = null;
let currentTheme = 0;
function renderThemePanel() {
const theme = THEMES[currentTheme];
const data = currentThemeData;
const colors = COLOR_MAP[theme.color];
const themeAnswered = theme.items.filter(s => !isEmpty(data.answers[s])).length;
document.getElementById("themePanel").innerHTML = `
<div class="theme-panel">
<div class="theme-head">
<div class="theme-icon" style="background:${colors.bg};color:${colors.fg};">${theme.icon}</div>
<div class="theme-title">${theme.title}</div>
<div class="theme-count">${themeAnswered}/${theme.items.length}</div>
</div>
<div class="cards">
${theme.items.map(label => {
const value = data.answers[label] || "";
const empty = isEmpty(value);
return `
<div class="qcard">
<div class="badge ${empty ? 'miss' : 'ok'}">${empty ? '!' : '✓'}</div>
<div class="qtext">
<div class="qlabel">${escapeHtml(label)}</div>
<div class="qanswer ${empty ? 'empty' : ''}">${empty ? 'Sans réponse' : escapeHtml(value)}</div>
</div>
</div>
`;
}).join("")}
</div>
</div>
`;
document.getElementById("prevBtn").disabled = currentTheme === 0;
document.getElementById("nextBtn").disabled = currentTheme === THEMES.length - 1;
document.querySelectorAll(".dot").forEach((d, i) => d.classList.toggle("active", i === currentTheme));
}
function goTo(idx) {
if (idx < 0 || idx >= THEMES.length) return;
currentTheme = idx;
renderThemePanel();
}
function renderResult(data) {
currentThemeData = data;
currentTheme = 0;
const banner = document.getElementById("participantsBanner");
if (data.meta.participants) {
banner.style.display = "flex";
banner.innerHTML = `
<div class="pb-icon">👥</div>
<div>
<div class="pb-group">${escapeHtml(data.meta.groupe) || "Participants"}</div>
<div class="pb-names">${escapeHtml(data.meta.participants)}</div>
</div>
`;
} else {
banner.style.display = "none";
}
document.getElementById("idCard").innerHTML = `
<div><div class="label">Groupe / Stagiaire</div><div class="value">${escapeHtml(data.meta.nom) || "—"}</div></div>
<div><div class="label">Date de session</div><div class="value">${escapeHtml(data.meta.date_session) || "—"}</div></div>
<div><div class="label">Formateur</div><div class="value">${escapeHtml(data.meta.formateur) || "—"}</div></div>
<div><div class="label">Cas pratique</div><div class="value">${escapeHtml(data.meta.cas) || "—"}</div></div>
`;
const answeredCount = ALL_SECTIONS.filter(s => !isEmpty(data.answers[s])).length;
document.getElementById("progressFill").style.width = (answeredCount / ALL_SECTIONS.length * 100) + "%";
document.getElementById("progressCount").textContent = `${answeredCount} / ${ALL_SECTIONS.length}`;
document.getElementById("dots").innerHTML = THEMES.map((_, i) =>
`<div class="dot${i === 0 ? ' active' : ''}" onclick="goTo(${i})"></div>`
).join("");
renderThemePanel();
document.getElementById("tp3Meta").innerHTML = `
<p style="margin-bottom:6px;"><strong>Intitulé :</strong> ${escapeHtml(data.tp3.intitule) || '<em style="color:var(--coral)">—</em>'}</p>
<p style="margin-bottom:6px;"><strong>Description :</strong> ${escapeHtml(data.tp3.description) || '<em style="color:var(--coral)">—</em>'}</p>
<p style="margin-bottom:6px;"><strong>Lieu :</strong> ${escapeHtml(data.tp3.lieu) || '<em style="color:var(--coral)">—</em>'}</p>
<p><strong>Début prévu le :</strong> ${escapeHtml(data.tp3.debut) || '<em style="color:var(--coral)">—</em>'}</p>
`;
const tp3TableEl = document.getElementById("tp3Table");
if (data.riskRows && data.riskRows.length > 0) {
tp3TableEl.style.display = "block";
tp3TableEl.innerHTML = `
<table class="risk-table">
<thead><tr><th>Étapes</th><th>Risques</th><th>Mesures de prévention</th></tr></thead>
<tbody>
${data.riskRows.map(r => `
<tr>
<td>${escapeHtml(r.etape) || "—"}</td>
<td>${escapeHtml(r.risque) || "—"}</td>
<td>${escapeHtml(r.mesure) || "—"}</td>
</tr>
`).join("")}
</tbody>
</table>
`;
} else {
tp3TableEl.style.display = "none";
}
document.getElementById("suiviLine").innerHTML =
`Réalisée par : <strong>${escapeHtml(data.suivi.realise) || "—"}</strong> — Vérifiée par : <strong>${escapeHtml(data.suivi.verifie) || "—"}</strong> — Mise à jour par : <strong>${escapeHtml(data.suivi.maj) || "—"}</strong>`;
document.getElementById("dropzone").style.display = "none";
document.getElementById("result").style.display = "block";
}
async function handleFile(file) {
if (!file) return;
const statusEl = document.getElementById("status");
statusEl.className = "loading";
statusEl.textContent = "Lecture du PDF en cours…";
document.getElementById("fileName").textContent = file.name;
try {
const arrayBuffer = await file.arrayBuffer();
const pdf = await pdfjsLib.getDocument({ data: arrayBuffer }).promise;
let fullText = "";
for (let p = 1; p <= pdf.numPages; p++) {
const page = await pdf.getPage(p);
const content = await page.getTextContent();
fullText += content.items.map(it => it.str).join(" ") + "\n";
}
const data = parsePdfText(fullText);
renderResult(data);
statusEl.textContent = "";
} catch (e) {
console.error(e);
statusEl.className = "error";
statusEl.textContent = "Impossible de lire ce PDF. Vérifiez qu'il s'agit bien d'un export du TP.";
}
}
function resetAll() {
document.getElementById("result").style.display = "none";
document.getElementById("dropzone").style.display = "block";
document.getElementById("participantsBanner").style.display = "none";
document.getElementById("status").textContent = "";
document.getElementById("filePicker").value = "";
document.getElementById("tp3Table").style.display = "none";
}
const dropzone = document.getElementById("dropzone");
dropzone.addEventListener("dragover", e => { e.preventDefault(); dropzone.classList.add("drag"); });
dropzone.addEventListener("dragleave", () => dropzone.classList.remove("drag"));
dropzone.addEventListener("drop", e => {
e.preventDefault();
dropzone.classList.remove("drag");
const file = e.dataTransfer.files?.[0];
if (file) handleFile(file);
});
document.getElementById("filePicker").addEventListener("change", e => handleFile(e.target.files?.[0]));
</script>
</body>
</html>

View File

@@ -1,213 +0,0 @@
<%@ Language="VBScript" %>
<%
' ============================================================
' save_results.asp
' Reçoit les réponses de l'exercice TP Nuisibles (JSON en POST)
' et les enregistre dans la base SQL Server.
' ============================================================
Response.Buffer = True
Response.ContentType = "application/json"
Response.CharSet = "UTF-8"
' ------- À ADAPTER : chaîne de connexion vers votre base -------
' Récupérée depuis le panneau "Manage Databases" de FreeASPHosting :
' Server Name : sql.bsite.net\MSSQL2016
' SQL Username : nextgnformation_reponses_exercices
' Database name : (généralement identique au username, à vérifier dans le panneau)
Dim connString
connString = "Provider=SQLOLEDB;Data Source=sql.bsite.net\MSSQL2016;" & _
"Initial Catalog=nextgnformation_reponses_exercices;" & _
"User ID=nextgnformation_reponses_exercices;" & _
"Password=S5$NyFXzEjJCg6jD;"
' -----------------------------------------------------------------
Function JSONEscape(s)
s = Replace(s, "\", "\\")
s = Replace(s, Chr(34), "\""")
s = Replace(s, vbCrLf, "\n")
s = Replace(s, vbLf, "\n")
s = Replace(s, vbCr, "\n")
s = Replace(s, vbTab, "\t")
JSONEscape = s
End Function
Sub SendJSON(success, message)
Dim out
out = "{""success"":" & LCase(CStr(success)) & ",""error"":""" & JSONEscape(message) & """}"
Response.Write out
Response.End
End Sub
' --- Lecture du corps de la requête (JSON brut envoyé en POST) ---
Dim rawJSON
Dim totalBytes
totalBytes = Request.TotalBytes
If totalBytes = 0 Then
SendJSON False, "Aucune donnée reçue."
End If
Dim binData
binData = Request.BinaryRead(totalBytes)
' Conversion des octets UTF-8 en chaîne VBScript
Dim objStream
Set objStream = Server.CreateObject("ADODB.Stream")
objStream.Type = 1 ' adTypeBinary
objStream.Open
objStream.Write binData
objStream.Position = 0
objStream.Type = 2 ' adTypeText
objStream.CharSet = "utf-8"
rawJSON = objStream.ReadText
objStream.Close
Set objStream = Nothing
If Trim(rawJSON) = "" Then
SendJSON False, "Corps de requête vide."
End If
' --- Parsing JSON minimal sans librairie externe ---
' On utilise le moteur JScript via ScriptControl pour parser le JSON de façon fiable.
Dim sc
Set sc = Server.CreateObject("MSScriptControl.ScriptControl")
sc.Language = "JScript"
sc.AddCode "function parseIt(s){ return eval('(' + s + ')'); } " & _
"function getStr(o,k){ return (o && o[k] != null) ? String(o[k]) : ''; } " & _
"function getReponsesJSON(o){ var arr = o.reponses || []; var out = []; " & _
"for (var i=0;i<arr.length;i++){ out.push({id:String(arr[i].id||''), question:String(arr[i].question||''), reponse:String(arr[i].reponse||'')}); } return out; } " & _
"function getTableauJSON(o){ var arr = o.tp3_tableau || []; var out = []; " & _
"for (var i=0;i<arr.length;i++){ out.push({etape:String(arr[i].etape||''), risque:String(arr[i].risque||''), mesure:String(arr[i].mesure||'')}); } return out; }"
Dim dataObj
On Error Resume Next
Set dataObj = sc.Run("parseIt", rawJSON)
If Err.Number <> 0 Then
SendJSON False, "JSON invalide : " & Err.Description
End If
On Error Goto 0
Dim nom, dateSession, casChoisi, casCle, dateEnvoi
Dim metaIntitule, metaDescription, metaLieu, metaDebut, metaRealise, metaVerifie, metaMaj
nom = sc.Run("getStr", dataObj, "nom")
dateSession = sc.Run("getStr", dataObj, "date_session")
casChoisi = sc.Run("getStr", dataObj, "cas_choisi")
casCle = sc.Run("getStr", dataObj, "cas_cle")
dateEnvoi = sc.Run("getStr", dataObj, "date_envoi")
Dim tp3Obj
tp3Obj = dataObj.tp3_meta
metaIntitule = sc.Run("getStr", tp3Obj, "intitule")
metaDescription = sc.Run("getStr", tp3Obj, "description")
metaLieu = sc.Run("getStr", tp3Obj, "lieu")
metaDebut = sc.Run("getStr", tp3Obj, "debut")
metaRealise = sc.Run("getStr", tp3Obj, "realise_par")
metaVerifie = sc.Run("getStr", tp3Obj, "verifie_par")
metaMaj = sc.Run("getStr", tp3Obj, "maj_par")
If Trim(nom) = "" Then
SendJSON False, "Le nom du groupe est obligatoire."
End If
' --- Sérialisation des réponses et du tableau en JSON texte (stockés en colonnes NVARCHAR(MAX)) ---
Dim reponsesArr, tableauArr
Set reponsesArr = sc.Run("getReponsesJSON", dataObj)
Set tableauArr = sc.Run("getTableauJSON", dataObj)
Dim reponsesJSONStr, tableauJSONStr
reponsesJSONStr = "["
Dim i
For i = 0 To reponsesArr.length - 1
If i > 0 Then reponsesJSONStr = reponsesJSONStr & ","
reponsesJSONStr = reponsesJSONStr & "{""id"":""" & JSONEscape(reponsesArr.Item(i).id) & _
""",""question"":""" & JSONEscape(reponsesArr.Item(i).question) & _
""",""reponse"":""" & JSONEscape(reponsesArr.Item(i).reponse) & """}"
Next
reponsesJSONStr = reponsesJSONStr & "]"
tableauJSONStr = "["
For i = 0 To tableauArr.length - 1
If i > 0 Then tableauJSONStr = tableauJSONStr & ","
tableauJSONStr = tableauJSONStr & "{""etape"":""" & JSONEscape(tableauArr.Item(i).etape) & _
""",""risque"":""" & JSONEscape(tableauArr.Item(i).risque) & _
""",""mesure"":""" & JSONEscape(tableauArr.Item(i).mesure) & """}"
Next
tableauJSONStr = tableauJSONStr & "]"
' --- Connexion et insertion en base ---
Dim conn
Set conn = Server.CreateObject("ADODB.Connection")
On Error Resume Next
conn.Open connString
If Err.Number <> 0 Then
SendJSON False, "Connexion BDD impossible : " & Err.Description
End If
On Error Goto 0
' Création de la table si elle n'existe pas encore
Dim createTableSQL
createTableSQL = "IF NOT EXISTS (SELECT * FROM sysobjects WHERE name='tp_resultats' AND xtype='U') " & _
"CREATE TABLE tp_resultats (" & _
"id INT IDENTITY(1,1) PRIMARY KEY, " & _
"nom NVARCHAR(255), " & _
"date_session NVARCHAR(50), " & _
"cas_choisi NVARCHAR(255), " & _
"cas_cle NVARCHAR(100), " & _
"reponses_json NVARCHAR(MAX), " & _
"tp3_intitule NVARCHAR(500), " & _
"tp3_description NVARCHAR(1000), " & _
"tp3_lieu NVARCHAR(500), " & _
"tp3_debut NVARCHAR(50), " & _
"tp3_realise_par NVARCHAR(255), " & _
"tp3_verifie_par NVARCHAR(255), " & _
"tp3_maj_par NVARCHAR(255), " & _
"tp3_tableau_json NVARCHAR(MAX), " & _
"date_envoi NVARCHAR(50), " & _
"date_enregistrement DATETIME DEFAULT GETDATE())"
On Error Resume Next
conn.Execute createTableSQL
If Err.Number <> 0 Then
SendJSON False, "Création de table impossible : " & Err.Description
End If
On Error Goto 0
' Insertion via requête paramétrée (Command) pour éviter les injections SQL
Dim cmd
Set cmd = Server.CreateObject("ADODB.Command")
cmd.ActiveConnection = conn
cmd.CommandText = "INSERT INTO tp_resultats " & _
"(nom, date_session, cas_choisi, cas_cle, reponses_json, tp3_intitule, tp3_description, tp3_lieu, tp3_debut, tp3_realise_par, tp3_verifie_par, tp3_maj_par, tp3_tableau_json, date_envoi) " & _
"VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"
cmd.CommandType = 1 ' adCmdText
Dim p
Set p = cmd.CreateParameter("nom", 202, 1, 255, nom) : cmd.Parameters.Append p
Set p = cmd.CreateParameter("date_session", 202, 1, 50, dateSession) : cmd.Parameters.Append p
Set p = cmd.CreateParameter("cas_choisi", 202, 1, 255, casChoisi) : cmd.Parameters.Append p
Set p = cmd.CreateParameter("cas_cle", 202, 1, 100, casCle) : cmd.Parameters.Append p
Set p = cmd.CreateParameter("reponses_json", 203, 1, Len(reponsesJSONStr), reponsesJSONStr) : cmd.Parameters.Append p
Set p = cmd.CreateParameter("tp3_intitule", 202, 1, 500, metaIntitule) : cmd.Parameters.Append p
Set p = cmd.CreateParameter("tp3_description", 202, 1, 1000, metaDescription) : cmd.Parameters.Append p
Set p = cmd.CreateParameter("tp3_lieu", 202, 1, 500, metaLieu) : cmd.Parameters.Append p
Set p = cmd.CreateParameter("tp3_debut", 202, 1, 50, metaDebut) : cmd.Parameters.Append p
Set p = cmd.CreateParameter("tp3_realise_par", 202, 1, 255, metaRealise) : cmd.Parameters.Append p
Set p = cmd.CreateParameter("tp3_verifie_par", 202, 1, 255, metaVerifie) : cmd.Parameters.Append p
Set p = cmd.CreateParameter("tp3_maj_par", 202, 1, 255, metaMaj) : cmd.Parameters.Append p
Set p = cmd.CreateParameter("tp3_tableau_json", 203, 1, Len(tableauJSONStr), tableauJSONStr) : cmd.Parameters.Append p
Set p = cmd.CreateParameter("date_envoi", 202, 1, 50, dateEnvoi) : cmd.Parameters.Append p
On Error Resume Next
cmd.Execute
If Err.Number <> 0 Then
conn.Close
SendJSON False, "Erreur lors de l'insertion : " & Err.Description
End If
On Error Goto 0
conn.Close
Set conn = Nothing
SendJSON True, ""
%>

View File

@@ -1,420 +0,0 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Veille Certibiocide</title>
<link href="https://fonts.googleapis.com/css2?family=Syne:wght@400;600;700;800&family=DM+Sans:opsz,wght@9..40,300;9..40,400;9..40,500&display=swap" rel="stylesheet">
<style>
:root {
--bg: #F5F4F0; --white: #FFFFFF; --text: #1C1C1A; --muted: #7A7974; --border: rgba(0,0,0,0.08);
--teal: #0F6E56; --teal-light: #E2F4EE;
--amber: #A86412; --amber-light: #FAF0E0;
--coral: #B53520; --coral-light: #FAEBE7;
--blue: #1A5FA8; --blue-light: #E6F0FB;
--purple: #5040A8; --purple-light: #EDEAFA;
--slate: #3A4A5C; --slate-light: #EDF1F5;
--green2: #2E7D32; --green2-light: #E8F5E9;
}
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
body { font-family: 'DM Sans', sans-serif; background: var(--bg); color: var(--text); min-height: 100vh; padding-bottom: 4rem; }
.header {
background: var(--white); border-bottom: 0.5px solid var(--border);
padding: 1.25rem 2rem; position: sticky; top: 0; z-index: 50;
display: flex; align-items: center; justify-content: space-between; gap: 1rem;
}
.header-title { font-family: 'Syne', sans-serif; font-size: 16px; font-weight: 800; }
.header-sub { font-size: 12px; color: var(--muted); margin-top: 2px; }
.header-right { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.week-badge { font-size: 12px; background: var(--teal-light); color: var(--teal); padding: 4px 12px; border-radius: 20px; font-weight: 500; }
.refresh-btn {
font-family: 'Syne', sans-serif; font-size: 12px; font-weight: 600;
background: var(--text); color: white; border: none; border-radius: 20px;
padding: 6px 16px; cursor: pointer; display: flex; align-items: center; gap: 6px; transition: opacity 0.2s;
}
.refresh-btn:hover { opacity: 0.8; }
.refresh-btn:disabled { opacity: 0.45; cursor: not-allowed; }
.spin { animation: spin 1s linear infinite; display: inline-block; }
@keyframes spin { to { transform: rotate(360deg); } }
.main { padding: 1.5rem 2rem; max-width: 1200px; margin: 0 auto; }
.status-banner {
border-radius: 10px; padding: 10px 16px; font-size: 12px;
margin-bottom: 1.25rem; display: flex; align-items: flex-start; gap: 8px; line-height: 1.6;
border: 0.5px solid transparent;
}
.banner-info { background: var(--blue-light); color: var(--blue); border-color: rgba(26,95,168,0.2); }
.banner-ok { background: var(--teal-light); color: var(--teal); border-color: rgba(15,110,86,0.2); }
.banner-warn { background: #FFF8E1; color: #7A5400; border-color: rgba(186,117,23,0.25); }
.grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 14px; }
.grid-full { grid-column: 1 / -1; }
.card { background: var(--white); border: 0.5px solid var(--border); border-radius: 14px; overflow: hidden; }
.card-header {
padding: 0.9rem 1.2rem 0.75rem; border-bottom: 0.5px solid var(--border);
display: flex; align-items: center; justify-content: space-between;
}
.card-label { display: flex; align-items: center; gap: 8px; }
.card-icon { font-size: 15px; }
.card-title { font-family: 'Syne', sans-serif; font-size: 13px; font-weight: 700; }
.card-tag { font-size: 10px; font-weight: 600; padding: 2px 8px; border-radius: 10px; font-family: 'Syne', sans-serif; letter-spacing: 0.04em; text-transform: uppercase; white-space: nowrap; }
.card-body { padding: 0.9rem 1.2rem; }
.item { padding: 0.7rem 0; border-bottom: 0.5px solid var(--border); animation: fadeUp 0.35s ease both; }
.item:first-child { padding-top: 0; }
.item:last-child { border-bottom: none; padding-bottom: 0; }
@keyframes fadeUp { from { opacity:0; transform:translateY(6px); } to { opacity:1; transform:translateY(0); } }
.item-source {
font-size: 10px; font-weight: 600; letter-spacing: 0.06em; text-transform: uppercase;
font-family: 'Syne', sans-serif; display: inline-block;
padding: 1px 8px; border-radius: 8px; margin-bottom: 4px;
}
.item-text { font-size: 13px; line-height: 1.6; }
.item-meta { display: flex; align-items: center; gap: 8px; margin-top: 3px; }
.item-date { font-size: 11px; color: var(--muted); }
.item-link { font-size: 11px; color: var(--blue); text-decoration: none; font-weight: 500; }
.item-link:hover { text-decoration: underline; }
.sources-bar { margin-top: 10px; padding-top: 8px; border-top: 0.5px solid var(--border); display: flex; flex-wrap: wrap; gap: 4px; }
.source-chip { font-size: 10px; background: var(--bg); border: 0.5px solid var(--border); border-radius: 10px; padding: 2px 8px; color: var(--muted); }
.agenda-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 0; }
.agenda-item { padding: 0.7rem 1rem 0.7rem 0; border-bottom: 0.5px solid var(--border); }
.agenda-item:nth-child(n+4) { border-bottom: none; }
.agenda-item:not(:nth-child(3n)) { border-right: 0.5px solid var(--border); margin-right: 1rem; }
.last-update { text-align: center; font-size: 11px; color: var(--muted); margin-top: 1.5rem; }
/* Skeleton */
.sk { background: linear-gradient(90deg,#EEEDE9 25%,#E5E4E0 50%,#EEEDE9 75%); background-size:200% 100%; animation:shimmer 1.3s infinite; border-radius:5px; height:12px; margin-bottom:5px; }
.sk.s{width:55%;} .sk.m{width:80%;} .sk.f{width:100%;}
@keyframes shimmer{0%{background-position:200% 0}100%{background-position:-200% 0}}
.sk-block { padding:0.7rem 0; border-bottom:0.5px solid var(--border); }
.sk-block:last-child { border-bottom:none; }
/* Loading overlay */
.loading-overlay { display:none; position:fixed; inset:0; background:rgba(245,244,240,0.88); z-index:200; align-items:center; justify-content:center; flex-direction:column; gap:12px; }
.loading-overlay.active { display:flex; }
.loader { width:34px; height:34px; border:3px solid var(--border); border-top-color:var(--teal); border-radius:50%; animation:spin 0.8s linear infinite; }
.loading-label { font-family:'Syne',sans-serif; font-size:14px; font-weight:600; }
.loading-sub { font-size:12px; color:var(--muted); }
.loading-progress { display:flex; gap:4px; margin-top:4px; }
.lp-dot { width:6px; height:6px; border-radius:50%; background:var(--border); transition:background 0.3s; }
.lp-dot.done { background:var(--teal); }
.lp-dot.active { background:var(--amber); animation:pulse 0.8s infinite; }
@keyframes pulse{0%,100%{opacity:1}50%{opacity:0.4}}
</style>
</head>
<body>
<div class="loading-overlay" id="loadingOverlay">
<div class="loader"></div>
<div class="loading-label">Actualisation en cours…</div>
<div class="loading-sub" id="loadingStatus">Initialisation</div>
<div class="loading-progress" id="loadingProgress"></div>
</div>
<div class="header">
<div>
<div class="header-title">Veille Certibiocide</div>
<div class="header-sub">Formation Biocides — Actualisation hebdomadaire</div>
</div>
<div class="header-right">
<div class="week-badge" id="weekBadge"></div>
<button class="refresh-btn" id="refreshBtn" onclick="refreshAll()">
<span id="refreshIcon"></span> Actualiser
</button>
</div>
</div>
<div class="main">
<div class="status-banner banner-info" id="statusBanner">
<span id="statusText">Données pré-chargées (mai 2025). Cliquez sur <strong>Actualiser</strong> pour récupérer les dernières actualités via l'API.</span>
</div>
<div class="grid">
<!-- RÉGLEMENTAIRE -->
<div class="card">
<div class="card-header">
<div class="card-label"><span class="card-icon">⚖️</span><span class="card-title">Actualité réglementaire</span></div>
<span class="card-tag" style="background:var(--teal-light);color:var(--teal);">ECHA · ANSES · MTE</span>
</div>
<div class="card-body">
<div id="content-reglementaire">
<div class="item"><span class="item-source" style="background:var(--teal-light);color:var(--teal);">ECHA</span><div class="item-text">L'ECHA a publié en avril 2025 la mise à jour des substances actives approuvées pour les TP 14 et TP 18, avec de nouvelles restrictions sur le bromadiolone et la difethialone en usage extérieur.</div><div class="item-meta"><span class="item-date">Avril 2025</span><a href="https://echa.europa.eu/fr/regulations/biocidal-products-regulation" target="_blank" class="item-link">↗ Source</a></div></div>
<div class="item"><span class="item-source" style="background:var(--teal-light);color:var(--teal);">ANSES</span><div class="item-text">L'ANSES a mis à jour biocid-anses.fr avec 12 nouvelles AMM délivrées au T1 2025, principalement pour des insecticides à base de deltaméthrine et des rodenticides de 2e génération.</div><div class="item-meta"><span class="item-date">Mars 2025</span><a href="https://www.anses.fr/fr/content/biocides" target="_blank" class="item-link">↗ Source</a></div></div>
<div class="item"><span class="item-source" style="background:var(--teal-light);color:var(--teal);">Ministère Transition Écologique</span><div class="item-text">Le décret du 15 mars 2025 renforce les obligations de formation des applicateurs de biocides en milieu agroalimentaire, avec une mise à jour des référentiels Certibiocide prévue pour septembre 2025.</div><div class="item-meta"><span class="item-date">Mars 2025</span><a href="https://www.ecologie.gouv.fr" target="_blank" class="item-link">↗ Source</a></div></div>
<div class="item"><span class="item-source" style="background:var(--teal-light);color:var(--teal);">Légifrance</span><div class="item-text">L'arrêté du 7 février 2025 modifie les conditions de mise sur le marché des rodenticides anticoagulants de 2e génération, renforçant l'obligation de confinement des appâts.</div><div class="item-meta"><span class="item-date">Février 2025</span><a href="https://www.legifrance.gouv.fr" target="_blank" class="item-link">↗ Source</a></div></div>
</div>
<div class="sources-bar"><span class="source-chip">echa.europa.eu</span><span class="source-chip">anses.fr</span><span class="source-chip">ecologie.gouv.fr</span><span class="source-chip">legifrance.fr</span></div>
</div>
</div>
<!-- MARCHÉ FORMATION -->
<div class="card">
<div class="card-header">
<div class="card-label"><span class="card-icon">🎓</span><span class="card-title">Marché formation Certibiocide</span></div>
<span class="card-tag" style="background:var(--amber-light);color:var(--amber);">Organismes · CA · Sessions</span>
</div>
<div class="card-body">
<div id="content-marche">
<div class="item"><span class="item-source" style="background:var(--amber-light);color:var(--amber);">France Compétences</span><div class="item-text">Le Certibiocide enregistre une hausse de 18 % des candidatures CPF en 2024, avec plus de 4 200 dossiers validés. Le financement moyen s'établit à 980 € par stagiaire via Mon Compte Formation.</div><div class="item-meta"><span class="item-date">Janvier 2025</span><a href="https://www.francecompetences.fr" target="_blank" class="item-link">↗ Source</a></div></div>
<div class="item"><span class="item-source" style="background:var(--amber-light);color:var(--amber);">Qualiopi</span><div class="item-text">Plus de 320 organismes de formation sont référencés Qualiopi pour le Certibiocide, soit +22 % sur 12 mois. L'Île-de-France concentre 28 % de l'offre nationale.</div><div class="item-meta"><span class="item-date">Février 2025</span><a href="https://www.qualiopi.fr" target="_blank" class="item-link">↗ Source</a></div></div>
<div class="item"><span class="item-source" style="background:var(--amber-light);color:var(--amber);">LinkedIn</span><div class="item-text">Les formations Certibiocide en format hybride (e-learning + présentiel) progressent fortement. Plusieurs organismes proposent des sessions weekend pour les salariés en activité dans le secteur 3D.</div><div class="item-meta"><span class="item-date">Avril 2025</span><a href="https://www.linkedin.com" target="_blank" class="item-link">↗ Source</a></div></div>
<div class="item"><span class="item-source" style="background:var(--amber-light);color:var(--amber);">OPCO EP</span><div class="item-text">L'OPCO EP maintient la prise en charge à 100 % pour les entreprises de moins de 50 salariés, avec un plafond horaire revalorisé à 14,50 €/h en 2025.</div><div class="item-meta"><span class="item-date">Janvier 2025</span><a href="https://www.opcoep.fr" target="_blank" class="item-link">↗ Source</a></div></div>
</div>
<div class="sources-bar"><span class="source-chip">francecompetences.fr</span><span class="source-chip">qualiopi.fr</span><span class="source-chip">LinkedIn</span><span class="source-chip">opcoep.fr</span></div>
</div>
</div>
<!-- NUISIBLES -->
<div class="card">
<div class="card-header">
<div class="card-label"><span class="card-icon">🐀</span><span class="card-title">Espèces nuisibles & ESOD</span></div>
<span class="card-tag" style="background:var(--coral-light);color:var(--coral);">Entomologie · Épidémio</span>
</div>
<div class="card-body">
<div id="content-nuisibles">
<div class="item"><span class="item-source" style="background:var(--coral-light);color:var(--coral);">Santé Publique France</span><div class="item-text">Le moustique tigre est présent dans 78 départements en 2025, avec une progression vers le nord. La saison active démarre plus tôt en raison des températures printanières élevées.</div><div class="item-meta"><span class="item-date">Avril 2025</span><a href="https://www.anses.fr" target="_blank" class="item-link">↗ Source</a></div></div>
<div class="item"><span class="item-source" style="background:var(--coral-light);color:var(--coral);">OFB</span><div class="item-text">Le frelon asiatique est classé ESOD dans 96 départements. Les arrêtés préfectoraux 2025 renforcent les obligations de signalement et de destruction des nids avec de nouvelles aides communales.</div><div class="item-meta"><span class="item-date">Mars 2025</span><a href="https://www.ofb.gouv.fr" target="_blank" class="item-link">↗ Source</a></div></div>
<div class="item"><span class="item-source" style="background:var(--coral-light);color:var(--coral);">INRAE</span><div class="item-text">Une publication INRAE documente l'émergence de résistances aux anticoagulants chez les populations de rats dans 6 grandes agglomérations françaises, nécessitant une rotation des molécules actives.</div><div class="item-meta"><span class="item-date">Mars 2025</span><a href="https://www.inrae.fr" target="_blank" class="item-link">↗ Source</a></div></div>
<div class="item"><span class="item-source" style="background:var(--coral-light);color:var(--coral);">Signalement Punaises</span><div class="item-text">Les signalements de punaises de lit progressent de 31 % en 2024, concentrés dans l'hôtellerie et les transports. Le plan national 2024-2027 prévoit des actions de sensibilisation renforcées.</div><div class="item-meta"><span class="item-date">Février 2025</span><a href="https://www.signalement-punaises.fr" target="_blank" class="item-link">↗ Source</a></div></div>
</div>
<div class="sources-bar"><span class="source-chip">anses.fr</span><span class="source-chip">ofb.gouv.fr</span><span class="source-chip">inrae.fr</span><span class="source-chip">sante.fr</span></div>
</div>
</div>
<!-- DÉSINFECTION -->
<div class="card">
<div class="card-header">
<div class="card-label"><span class="card-icon">🧴</span><span class="card-title">Désinfection & nettoyage</span></div>
<span class="card-tag" style="background:var(--blue-light);color:var(--blue);">Biocides · Normes · Éco</span>
</div>
<div class="card-body">
<div id="content-desinfection">
<div class="item"><span class="item-source" style="background:var(--blue-light);color:var(--blue);">ECHA / BPR</span><div class="item-text">La Commission européenne a approuvé en mars 2025 l'élargissement des usages du dioxyde de chlore (ClO₂) en TP 2, avec de nouvelles concentrations maximales autorisées pour les environnements alimentaires.</div><div class="item-meta"><span class="item-date">Mars 2025</span><a href="https://echa.europa.eu" target="_blank" class="item-link">↗ Source</a></div></div>
<div class="item"><span class="item-source" style="background:var(--blue-light);color:var(--blue);">AFNOR</span><div class="item-text">La norme NF EN 16615 sur l'évaluation bactéricide sur surfaces a été révisée en janvier 2025, avec des protocoles renforcés pour les surfaces poreuses en milieu agroalimentaire.</div><div class="item-meta"><span class="item-date">Janvier 2025</span><a href="https://www.afnor.org" target="_blank" class="item-link">↗ Source</a></div></div>
<div class="item"><span class="item-source" style="background:var(--blue-light);color:var(--blue);">Europropre</span><div class="item-text">Les alternatives aux biocides chimiques (vapeur sèche, UV-C, ozone) représentent 14 % du marché de la désinfection professionnelle en France, en hausse de 4 points sur un an.</div><div class="item-meta"><span class="item-date">Avril 2025</span><a href="https://www.europropre.com" target="_blank" class="item-link">↗ Source</a></div></div>
<div class="item"><span class="item-source" style="background:var(--blue-light);color:var(--blue);">CNIDEP</span><div class="item-text">Le CNIDEP publie un guide de bonnes pratiques pour la désinfection en présence de personnes vulnérables (EHPAD, crèches), avec des recommandations sur les temps d'attente post-application.</div><div class="item-meta"><span class="item-date">Février 2025</span><a href="https://www.cnidep.com" target="_blank" class="item-link">↗ Source</a></div></div>
</div>
<div class="sources-bar"><span class="source-chip">echa.europa.eu</span><span class="source-chip">afnor.org</span><span class="source-chip">cnidep.com</span><span class="source-chip">europropre.com</span></div>
</div>
</div>
<!-- OPPORTUNITÉS -->
<div class="card">
<div class="card-header">
<div class="card-label"><span class="card-icon">🚀</span><span class="card-title">Opportunités</span></div>
<span class="card-tag" style="background:var(--green2-light);color:var(--green2);">Marché · Appels d'offres</span>
</div>
<div class="card-body">
<div id="content-opportunites">
<div class="item"><span class="item-source" style="background:var(--green2-light);color:var(--green2);">BOAMP</span><div class="item-text">Plusieurs marchés publics de formation Certibiocide sont ouverts en mai 2025 pour des collectivités d'Île-de-France et d'Occitanie. Budget estimé : 80 000150 000 € par lot. Délai : fin juin 2025.</div><div class="item-meta"><span class="item-date">Mai 2025</span><a href="https://www.boamp.fr" target="_blank" class="item-link">↗ Source</a></div></div>
<div class="item"><span class="item-source" style="background:var(--green2-light);color:var(--green2);">Mon Compte Formation</span><div class="item-text">Le CPF finance le Certibiocide à hauteur de 980 €/stagiaire en moyenne. Les organismes référencés sur moncompteformation.gouv.fr avant la rentrée 2025 capteront ce flux en forte croissance.</div><div class="item-meta"><span class="item-date">2025</span><a href="https://www.moncompteformation.gouv.fr" target="_blank" class="item-link">↗ Source</a></div></div>
<div class="item"><span class="item-source" style="background:var(--green2-light);color:var(--green2);">Hôtellerie</span><div class="item-text">La médiatisation des punaises de lit crée une forte demande de formation dans l'hôtellerie. Les groupes Accor, B&B et Best Western cherchent des prestataires 3D formés pour des contrats-cadres nationaux.</div><div class="item-meta"><span class="item-date">2025</span><a href="https://www.linkedin.com" target="_blank" class="item-link">↗ LinkedIn</a></div></div>
<div class="item"><span class="item-source" style="background:var(--green2-light);color:var(--green2);">Agroalimentaire</span><div class="item-text">Les certifications IFS/BRC exigent désormais un personnel formé Certibiocide sur site dans les établissements agroalimentaires. Ce nouveau prérequis génère des besoins massifs en formation intra-entreprise.</div><div class="item-meta"><span class="item-date">2025</span></div></div>
</div>
<div class="sources-bar"><span class="source-chip">boamp.fr</span><span class="source-chip">moncompteformation.gouv.fr</span><span class="source-chip">LinkedIn</span><span class="source-chip">opcoep.fr</span></div>
</div>
</div>
<!-- INNOVATION -->
<div class="card">
<div class="card-header">
<div class="card-label"><span class="card-icon">💡</span><span class="card-title">Innovation</span></div>
<span class="card-tag" style="background:var(--purple-light);color:var(--purple);">R&D · Technologies · Brevets</span>
</div>
<div class="card-body">
<div id="content-innovation">
<div class="item"><span class="item-source" style="background:var(--purple-light);color:var(--purple);">PubMed / INRAE</span><div class="item-text">Une étude publiée en février 2025 démontre l'efficacité des nématodes entomopathogènes (Steinernema feltiae) contre les larves de mouches en élevage, comme alternative aux insecticides chimiques conventionnels.</div><div class="item-meta"><span class="item-date">Février 2025</span><a href="https://pubmed.ncbi.nlm.nih.gov" target="_blank" class="item-link">↗ PubMed</a></div></div>
<div class="item"><span class="item-source" style="background:var(--purple-light);color:var(--purple);">IoT / Start-up</span><div class="item-text">Anticimex Smart déploie ses pièges connectés à IA en France pour la détection en temps réel des rongeurs, avec une interface de reporting utilisable directement par les techniciens Certibiocide.</div><div class="item-meta"><span class="item-date">2025</span><a href="https://www.anticimex.com" target="_blank" class="item-link">↗ Source</a></div></div>
<div class="item"><span class="item-source" style="background:var(--purple-light);color:var(--purple);">CORDIS</span><div class="item-text">Le projet européen LIFE BioPest (2024-2027) finance le développement de bioinsecticides à base de champignons entomopathogènes pour remplacer les pyréthrinoïdes en milieu urbain. Budget : 3,2 M€.</div><div class="item-meta"><span class="item-date">20242027</span><a href="https://cordis.europa.eu" target="_blank" class="item-link">↗ CORDIS</a></div></div>
<div class="item"><span class="item-source" style="background:var(--purple-light);color:var(--purple);">BPIFrance</span><div class="item-text">BPIFrance ouvre un appel à projets "Green Tech 2025" incluant la lutte biologique contre les nuisibles urbains. Les PME du secteur 3D peuvent soumettre jusqu'au 30 juin 2025 pour un financement jusqu'à 200 000 €.</div><div class="item-meta"><span class="item-date">Juin 2025</span><a href="https://www.bpifrance.fr" target="_blank" class="item-link">↗ Source</a></div></div>
</div>
<div class="sources-bar"><span class="source-chip">pubmed.ncbi.nlm.nih.gov</span><span class="source-chip">cordis.europa.eu</span><span class="source-chip">bpifrance.fr</span><span class="source-chip">inrae.fr</span></div>
</div>
</div>
<!-- AGENDA -->
<div class="card grid-full">
<div class="card-header">
<div class="card-label"><span class="card-icon">📅</span><span class="card-title">Agenda — Formations & événements à venir</span></div>
<span class="card-tag" style="background:var(--slate-light);color:var(--slate);">Salons · Webinaires · Sessions</span>
</div>
<div class="card-body">
<div class="agenda-grid" id="content-agenda">
<div class="agenda-item"><span class="item-source" style="background:var(--slate-light);color:var(--slate);">Europropre</span><div class="item-text" style="font-size:13px;line-height:1.5;">Salon Europropre — Paris Expo Porte de Versailles. Nettoyage, hygiène et services professionnels.</div><div class="item-meta" style="margin-top:4px;"><span class="item-date">35 juin 2025, Paris</span><a href="https://www.europropre.com" target="_blank" class="item-link" style="margin-left:8px;">↗ Site</a></div></div>
<div class="agenda-item"><span class="item-source" style="background:var(--slate-light);color:var(--slate);">ANSES</span><div class="item-text" style="font-size:13px;line-height:1.5;">Webinaire ANSES "Résistances aux anticoagulants rodenticides : état des lieux". Inscription gratuite.</div><div class="item-meta" style="margin-top:4px;"><span class="item-date">15 mai 2025, en ligne</span><a href="https://www.anses.fr/fr/agenda" target="_blank" class="item-link" style="margin-left:8px;">↗ Inscription</a></div></div>
<div class="agenda-item"><span class="item-source" style="background:var(--slate-light);color:var(--slate);">PestWorld Europe</span><div class="item-text" style="font-size:13px;line-height:1.5;">Congrès européen de la lutte antiparasitaire. Conférences techniques et exposition commerciale.</div><div class="item-meta" style="margin-top:4px;"><span class="item-date">Septembre 2025, Berlin</span><a href="https://www.pestworld-europe.com" target="_blank" class="item-link" style="margin-left:8px;">↗ Site</a></div></div>
<div class="agenda-item"><span class="item-source" style="background:var(--slate-light);color:var(--slate);">INRAE</span><div class="item-text" style="font-size:13px;line-height:1.5;">Journée technique "Nuisibles urbains : nouvelles espèces invasives et lutte intégrée". Ouvert aux professionnels 3D.</div><div class="item-meta" style="margin-top:4px;"><span class="item-date">22 mai 2025, Lyon</span><a href="https://www.inrae.fr" target="_blank" class="item-link" style="margin-left:8px;">↗ Programme</a></div></div>
<div class="agenda-item"><span class="item-source" style="background:var(--slate-light);color:var(--slate);">Certibiocide CPF</span><div class="item-text" style="font-size:13px;line-height:1.5;">Sessions Certibiocide disponibles en juin-juillet 2025 en format hybride et présentiel dans toutes les régions.</div><div class="item-meta" style="margin-top:4px;"><span class="item-date">JuinJuillet 2025</span><a href="https://www.moncompteformation.gouv.fr" target="_blank" class="item-link" style="margin-left:8px;">↗ CPF</a></div></div>
<div class="agenda-item"><span class="item-source" style="background:var(--slate-light);color:var(--slate);">Expoprotection</span><div class="item-text" style="font-size:13px;line-height:1.5;">Salon international sécurité, sûreté et gestion des risques. Présence d'acteurs biocides et 3D.</div><div class="item-meta" style="margin-top:4px;"><span class="item-date">Novembre 2025, Paris</span><a href="https://www.expoprotection.com" target="_blank" class="item-link" style="margin-left:8px;">↗ Site</a></div></div>
</div>
<div class="sources-bar"><span class="source-chip">expoprotection.com</span><span class="source-chip">anses.fr</span><span class="source-chip">inrae.fr</span><span class="source-chip">pestworld-europe.com</span><span class="source-chip">europropre.com</span></div>
</div>
</div>
<!-- EUROPE -->
<div class="card">
<div class="card-header">
<div class="card-label"><span class="card-icon">🇪🇺</span><span class="card-title">Veille européenne & internationale</span></div>
<span class="card-tag" style="background:var(--blue-light);color:var(--blue);">BPR · ECHA · OMS</span>
</div>
<div class="card-body">
<div id="content-europe">
<div class="item"><span class="item-source" style="background:var(--blue-light);color:var(--blue);">ECHA / BPR</span><div class="item-text">La révision du règlement BPR 528/2012 avance avec une proposition pour accélérer l'évaluation des substances à faible risque et simplifier les procédures d'autorisation Union en 2025.</div><div class="item-meta"><span class="item-date">2025</span><a href="https://echa.europa.eu/fr/regulations/biocidal-products-regulation/understanding-bpr" target="_blank" class="item-link">↗ ECHA</a></div></div>
<div class="item"><span class="item-source" style="background:var(--blue-light);color:var(--blue);">EFSA</span><div class="item-text">L'EFSA publie en avril 2025 son rapport sur les résidus de biocides dans les aliments, soulignant la nécessité de renforcer les contrôles sur les produits TP 4 et TP 14.</div><div class="item-meta"><span class="item-date">Avril 2025</span><a href="https://www.efsa.europa.eu" target="_blank" class="item-link">↗ EFSA</a></div></div>
<div class="item"><span class="item-source" style="background:var(--blue-light);color:var(--blue);">OMS</span><div class="item-text">L'OMS alerte sur la résistance mondiale aux insecticides chez les moustiques Aedes et Anopheles, recommandant des stratégies de rotation et de lutte intégrée pour préserver l'efficacité des traitements.</div><div class="item-meta"><span class="item-date">Mars 2025</span><a href="https://www.who.int" target="_blank" class="item-link">↗ OMS</a></div></div>
<div class="item"><span class="item-source" style="background:var(--blue-light);color:var(--blue);">Commission Européenne</span><div class="item-text">La directive SUR (utilisation durable des pesticides) impacte le secteur biocides, plusieurs États membres alignant leurs réglementations sur les principes de réduction des risques chimiques.</div><div class="item-meta"><span class="item-date">2025</span><a href="https://ec.europa.eu" target="_blank" class="item-link">↗ Source</a></div></div>
</div>
<div class="sources-bar"><span class="source-chip">echa.europa.eu</span><span class="source-chip">efsa.europa.eu</span><span class="source-chip">who.int</span><span class="source-chip">ec.europa.eu</span></div>
</div>
</div>
<!-- RH -->
<div class="card">
<div class="card-header">
<div class="card-label"><span class="card-icon">👥</span><span class="card-title">Veille RH & concurrentielle</span></div>
<span class="card-tag" style="background:var(--amber-light);color:var(--amber);">Emploi · Acteurs · Certif</span>
</div>
<div class="card-body">
<div id="content-rh">
<div class="item"><span class="item-source" style="background:var(--amber-light);color:var(--amber);">LinkedIn / France Travail</span><div class="item-text">Plus de 280 offres d'emploi de techniciens 3D en France en mai 2025, dont 45 mentionnent le Certibiocide comme prérequis. Les salaires progressent de 8 % par rapport à 2024.</div><div class="item-meta"><span class="item-date">Mai 2025</span><a href="https://www.linkedin.com/jobs" target="_blank" class="item-link">↗ LinkedIn</a></div></div>
<div class="item"><span class="item-source" style="background:var(--amber-light);color:var(--amber);">France Compétences</span><div class="item-text">Deux nouvelles certifications RNCP liées aux biocides enregistrées en 2025 : "Responsable Hygiène Environnementale" (niveau 5) et "Gestionnaire de plan de maîtrise sanitaire" avec module biocides.</div><div class="item-meta"><span class="item-date">2025</span><a href="https://www.francecompetences.fr" target="_blank" class="item-link">↗ RNCP</a></div></div>
<div class="item"><span class="item-source" style="background:var(--amber-light);color:var(--amber);">Presse Pro</span><div class="item-text">Rentokil Initial renforce sa présence en France avec l'acquisition de 3 PME régionales du secteur 3D en 2025, intensifiant la concurrence sur les contrats-cadres nationaux et les formations internes.</div><div class="item-meta"><span class="item-date">2025</span><a href="https://www.linkedin.com" target="_blank" class="item-link">↗ LinkedIn</a></div></div>
<div class="item"><span class="item-source" style="background:var(--amber-light);color:var(--amber);">FFDH</span><div class="item-text">La FFDH lance une campagne nationale de valorisation des métiers 3D en 2025, avec des partenariats avec des lycées professionnels pour développer des formations initiales au secteur.</div><div class="item-meta"><span class="item-date">2025</span><a href="https://www.ffdh.fr" target="_blank" class="item-link">↗ FFDH</a></div></div>
</div>
<div class="sources-bar"><span class="source-chip">linkedin.com</span><span class="source-chip">francetravail.fr</span><span class="source-chip">francecompetences.fr</span><span class="source-chip">ffdh.fr</span></div>
</div>
</div>
</div>
<div class="last-update" id="lastUpdate">Données pré-chargées — Mai 2025</div>
</div>
<script>
// ── Utils ──────────────────────────────────────────────────────────────────
function getWeekLabel() {
const now = new Date();
const mon = new Date(now); mon.setDate(now.getDate() - ((now.getDay()+6)%7));
const sun = new Date(mon); sun.setDate(mon.getDate()+6);
const f = d => d.toLocaleDateString('fr-FR',{day:'numeric',month:'short'});
return `Sem. ${f(mon)} ${f(sun)}`;
}
function esc(s){ return s ? String(s).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;').replace(/"/g,'&quot;') : ''; }
function setSkeleton(id){
const el = document.getElementById('content-'+id); if(!el) return;
el.innerHTML = [1,2,3].map(()=>`<div class="sk-block"><div class="sk s"></div><div class="sk f"></div><div class="sk m"></div></div>`).join('');
}
function setBanner(type, html){
const b = document.getElementById('statusBanner');
b.className = 'status-banner banner-'+type;
document.getElementById('statusText').innerHTML = html;
}
// ── Sections config ────────────────────────────────────────────────────────
const SECTIONS = [
{ id:'reglementaire', label:'Réglementaire', c:'--teal', bg:'--teal-light',
prompt:`Recherche web : 4 actualités réglementaires récentes sur les biocides en France/Europe (ECHA, ANSES, MTE, Légifrance). Nouvelles AMM, retraits, BPR, obligations Certibiocide. JSON uniquement sans markdown : {"items":[{"source":"SOURCE","text":"2 phrases factuelles","date":"date","url":"url ou null"}]}` },
{ id:'marche', label:'Marché formation', c:'--amber', bg:'--amber-light',
prompt:`Recherche web : 4 infos récentes sur le marché formation Certibiocide France (Qualiopi, CPF, OPCO, sessions, chiffres). JSON uniquement sans markdown : {"items":[{"source":"SOURCE","text":"2 phrases","date":"date","url":"url ou null"}]}` },
{ id:'nuisibles', label:'Nuisibles & ESOD', c:'--coral', bg:'--coral-light',
prompt:`Recherche web : 4 actualités récentes sur nuisibles/ESOD en France (moustique tigre, frelon asiatique, rongeurs résistants, punaises de lit). Sources ANSES, INRAE, OFB. JSON uniquement sans markdown : {"items":[{"source":"SOURCE","text":"2 phrases","date":"date","url":"url ou null"}]}` },
{ id:'desinfection', label:'Désinfection', c:'--blue', bg:'--blue-light',
prompt:`Recherche web : 4 actualités récentes sur désinfection/biocides (normes AFNOR, produits homologués, alternatives). JSON uniquement sans markdown : {"items":[{"source":"SOURCE","text":"2 phrases","date":"date","url":"url ou null"}]}` },
{ id:'opportunites', label:'Opportunités', c:'--green2', bg:'--green2-light',
prompt:`Recherche web : 4 opportunités concrètes pour organisme formation Certibiocide (BOAMP appels d'offres, CPF, secteurs demandeurs). JSON uniquement sans markdown : {"items":[{"source":"SOURCE","text":"2 phrases","date":"date","url":"url ou null"}]}` },
{ id:'innovation', label:'Innovation', c:'--purple', bg:'--purple-light',
prompt:`Recherche web : 4 innovations récentes biocides/lutte antiparasitaire (bioinsecticides, IoT, IA, brevets, CORDIS, PubMed). JSON uniquement sans markdown : {"items":[{"source":"SOURCE","text":"2 phrases","date":"date","url":"url ou null"}]}` },
{ id:'europe', label:'Veille européenne', c:'--blue', bg:'--blue-light',
prompt:`Recherche web : 4 actualités européennes/internationales récentes sur biocides (révision BPR, EFSA, OMS résistances insecticides). JSON uniquement sans markdown : {"items":[{"source":"SOURCE","text":"2 phrases","date":"date","url":"url ou null"}]}` },
{ id:'rh', label:'RH & Concurrence', c:'--amber', bg:'--amber-light',
prompt:`Recherche web : 4 infos RH/concurrentielles secteur 3D et Certibiocide (offres emploi LinkedIn, mouvements acteurs, certifications RNCP). JSON uniquement sans markdown : {"items":[{"source":"SOURCE","text":"2 phrases","date":"date","url":"url ou null"}]}` },
];
// ── Fetch one section via Netlify function ─────────────────────────────────
async function fetchSection(s, dotIndex) {
setSkeleton(s.id);
updateDot(dotIndex, 'active');
document.getElementById('loadingStatus').textContent = `Recherche : ${s.label}`;
try {
const res = await fetch('/.netlify/functions/veille', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ prompt: s.prompt })
});
const data = await res.json();
if (!res.ok) throw new Error(data.error || 'Erreur serveur');
if (data.error) throw new Error(data.error);
if (data.items?.length) {
renderItems(s.id, data.items, s.c, s.bg);
updateDot(dotIndex, 'done');
} else throw new Error('Réponse vide');
} catch(e) {
console.error(s.id, e);
const el = document.getElementById('content-'+s.id);
if(el) el.innerHTML = `<div style="text-align:center;padding:1rem;color:var(--muted);font-size:13px;">⚠️ ${esc(e.message)}</div>`;
updateDot(dotIndex, 'done');
}
}
function renderItems(id, items, cVar, bgVar) {
const el = document.getElementById('content-'+id); if(!el) return;
el.innerHTML = items.map((item,i) => `
<div class="item" style="animation-delay:${i*0.07}s">
<span class="item-source" style="background:var(${bgVar});color:var(${cVar});">${esc(item.source)}</span>
<div class="item-text">${esc(item.text)}</div>
<div class="item-meta">
<span class="item-date">${esc(item.date||'')}</span>
${item.url?`<a href="${esc(item.url)}" target="_blank" class="item-link">↗ Source</a>`:''}
</div>
</div>`).join('');
}
// ── Progress dots ──────────────────────────────────────────────────────────
function initDots(n) {
document.getElementById('loadingProgress').innerHTML =
Array(n).fill('').map((_,i)=>`<div class="lp-dot" id="dot-${i}"></div>`).join('');
}
function updateDot(i, state) {
const d = document.getElementById('dot-'+i); if(d){ d.className='lp-dot '+state; }
}
// ── Main refresh ───────────────────────────────────────────────────────────
async function refreshAll() {
const btn = document.getElementById('refreshBtn');
const icon = document.getElementById('refreshIcon');
btn.disabled = true; icon.classList.add('spin');
document.getElementById('loadingOverlay').classList.add('active');
setBanner('info','Actualisation en cours…');
initDots(SECTIONS.length);
// Run in parallel by pairs to avoid rate limits
for(let i=0; i<SECTIONS.length; i+=2){
await Promise.all([
fetchSection(SECTIONS[i], i),
SECTIONS[i+1] ? fetchSection(SECTIONS[i+1], i+1) : Promise.resolve()
]);
}
const now = new Date();
const label = now.toLocaleDateString('fr-FR',{weekday:'long',day:'numeric',month:'long'}) +
' à ' + now.toLocaleTimeString('fr-FR',{hour:'2-digit',minute:'2-digit'});
document.getElementById('lastUpdate').textContent = `Dernière actualisation : ${label}`;
document.getElementById('weekBadge').textContent = getWeekLabel();
setBanner('ok', `✅ Actualisation terminée — ${label}`);
btn.disabled = false; icon.classList.remove('spin');
document.getElementById('loadingOverlay').classList.remove('active');
}
// ── Init ───────────────────────────────────────────────────────────────────
document.getElementById('weekBadge').textContent = getWeekLabel();
</script>
</body>
</html>

View File

@@ -1,817 +0,0 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Rapport Veille Semaine 20 - Certibiocide</title>
<link href="https://fonts.googleapis.com/css2?family=Syne:wght@400;600;700;800&family=DM+Sans:ital,wght@0,300;0,400;0,500;1,300&display=swap" rel="stylesheet">
<style>
:root {
--teal: #0F6E56;
--teal-mid: #1D9E75;
--teal-light: #E1F5EE;
--amber: #BA7517;
--amber-mid: #D4921A;
--amber-light: #FAEEDA;
--amber-dark: #633806;
--coral: #993C1D;
--coral-mid: #D85A30;
--coral-light: #FAECE7;
--purple: #BA7517;
--purple-light: #FAEEDA;
--blue: #185FA5;
--blue-light: #E6F1FB;
--green: #2E7D32;
--green-light: #E8F5E9;
--bg: #F7F6F2;
--white: #FFFFFF;
--text: #1a1a18;
--text-muted: #6b6a65;
--border: rgba(0,0,0,0.1);
}
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}
html, body {
height: 100%;
}
body {
font-family: 'DM Sans', sans-serif;
background: var(--bg);
color: var(--text);
line-height: 1.6;
padding-top: 70px;
}
/* ===== HEADER FIXE ===== */
header {
position: fixed;
top: 0;
left: 0;
right: 0;
height: 70px;
background: rgba(250, 238, 218, 0.98);
backdrop-filter: blur(10px);
border-bottom: 2px solid var(--amber);
z-index: 1000;
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 2rem;
}
.logo {
font-family: 'Syne', sans-serif;
font-size: 16px;
font-weight: 700;
letter-spacing: -0.5px;
background: linear-gradient(135deg, var(--teal-mid), var(--coral-mid));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
text-decoration: none;
}
nav {
display: flex;
gap: 2rem;
}
nav a {
font-family: 'Syne', sans-serif;
font-size: 11px;
font-weight: 700;
letter-spacing: 0.08em;
text-transform: uppercase;
text-decoration: none;
color: var(--text-muted);
transition: color 0.3s ease;
}
nav a:hover {
color: var(--amber);
}
/* ===== PROGRESS BAR ===== */
.progress {
position: fixed;
top: 70px;
left: 0;
right: 0;
height: 3px;
background: var(--border);
z-index: 999;
}
.progress-bar {
height: 100%;
background: var(--amber);
width: 0%;
transition: width 0.3s ease;
}
/* ===== MAIN CONTENT ===== */
main {
max-width: 1000px;
margin: 0 auto;
padding: 3rem 2rem;
}
.section {
margin-bottom: 3rem;
animation: fadeIn 0.6s ease-out;
}
@keyframes fadeIn {
from {
opacity: 0;
transform: translateY(10px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
/* ===== BREADCRUMB ===== */
.breadcrumb {
display: flex;
gap: 0.5rem;
align-items: center;
font-size: 12px;
color: var(--text-muted);
margin-bottom: 1.5rem;
font-family: 'Syne', sans-serif;
}
.breadcrumb a {
color: var(--amber);
text-decoration: none;
font-weight: 600;
transition: color 0.3s ease;
}
.breadcrumb a:hover {
color: var(--amber-dark);
}
/* ===== PAGE HEADER ===== */
.page-header {
background: var(--amber-light);
border-left: 4px solid var(--amber);
border-radius: 8px;
padding: 2rem;
margin-bottom: 2rem;
}
.page-header h1 {
font-family: 'Syne', sans-serif;
font-size: 2.2rem;
font-weight: 800;
color: var(--text);
margin-bottom: 0.5rem;
}
.page-meta {
display: flex;
flex-wrap: wrap;
gap: 2rem;
font-size: 0.95rem;
color: var(--text-muted);
margin-top: 1rem;
}
.meta-item {
display: flex;
align-items: center;
gap: 0.5rem;
}
.meta-item strong {
color: var(--amber);
}
/* ===== CONTENT SECTIONS ===== */
h2 {
font-family: 'Syne', sans-serif;
font-size: 1.6rem;
font-weight: 700;
color: var(--text);
margin-bottom: 1rem;
margin-top: 2.5rem;
padding-bottom: 0.75rem;
border-bottom: 3px solid var(--amber);
display: flex;
align-items: center;
gap: 0.75rem;
}
h3 {
font-family: 'Syne', sans-serif;
font-size: 1.05rem;
font-weight: 700;
color: var(--text);
margin-top: 1.5rem;
margin-bottom: 0.75rem;
}
/* ===== CONTENT ITEMS ===== */
.content-item {
background: var(--white);
border-left: 4px solid var(--amber-light);
border-radius: 6px;
padding: 1.5rem;
margin-bottom: 1.5rem;
transition: all 0.3s ease;
}
.content-item:hover {
border-left-color: var(--amber);
box-shadow: 0 4px 12px rgba(186, 117, 23, 0.1);
}
.content-item strong {
color: var(--amber-dark);
display: block;
margin-bottom: 0.5rem;
font-size: 1rem;
}
.content-item p {
font-size: 0.95rem;
line-height: 1.7;
margin-bottom: 0.75rem;
color: var(--text);
}
.content-item p:last-child {
margin-bottom: 0;
}
.item-meta {
display: flex;
gap: 1rem;
flex-wrap: wrap;
font-size: 0.85rem;
color: var(--text-muted);
margin-top: 1rem;
padding-top: 1rem;
border-top: 1px solid rgba(186, 117, 23, 0.1);
}
.item-date {
display: flex;
align-items: center;
gap: 0.4rem;
}
.item-link {
color: var(--amber);
text-decoration: none;
font-weight: 600;
transition: color 0.3s ease;
}
.item-link:hover {
color: var(--amber-dark);
}
/* ===== ATTENTION SECTION ===== */
.attention-section {
background: linear-gradient(135deg, var(--amber-light), rgba(250, 236, 218, 0.7));
border: 2px solid var(--amber);
border-radius: 8px;
padding: 2rem;
margin: 2rem 0;
}
.attention-section h2 {
border-bottom-color: var(--amber-dark);
margin-top: 0;
}
.attention-item {
background: var(--white);
border-left: 4px solid var(--amber-dark);
border-radius: 6px;
padding: 1.25rem;
margin-bottom: 1rem;
}
.attention-item:last-child {
margin-bottom: 0;
}
.attention-item strong {
color: var(--amber-dark);
display: block;
margin-bottom: 0.5rem;
}
/* ===== TABLE OF CONTENTS ===== */
.toc {
background: var(--blue-light);
border-left: 4px solid var(--blue);
border-radius: 8px;
padding: 1.5rem;
margin: 2rem 0;
}
.toc h3 {
margin-top: 0;
color: var(--blue);
}
.toc-list {
list-style: none;
padding: 0;
margin: 0;
}
.toc-list li {
margin-bottom: 0.5rem;
}
.toc-list a {
color: var(--blue);
text-decoration: none;
font-weight: 500;
font-size: 0.95rem;
transition: color 0.3s ease;
}
.toc-list a:hover {
color: var(--teal-mid);
}
/* ===== FOOTER ===== */
footer {
background: var(--text);
color: var(--white);
padding: 2.5rem;
text-align: center;
font-size: 13px;
margin-top: 4rem;
border-top: 1px solid var(--border);
}
footer p {
margin-bottom: 0.5rem;
}
footer p:last-child {
opacity: 0.6;
font-size: 12px;
margin-top: 0.5rem;
}
/* ===== RESPONSIVE ===== */
@media (max-width: 768px) {
header {
padding: 0 1rem;
}
.logo {
font-size: 14px;
}
nav {
gap: 1rem;
}
nav a {
font-size: 9px;
}
main {
padding: 2rem 1rem;
}
h1 {
font-size: 1.8rem;
}
h2 {
font-size: 1.3rem;
}
.page-meta {
gap: 1rem;
flex-direction: column;
}
.attention-section {
padding: 1.5rem;
}
}
</style>
</head>
<body>
<!-- PROGRESS BAR -->
<div class="progress">
<div class="progress-bar" id="progressBar"></div>
</div>
<!-- HEADER -->
<header>
<div class="logo">NextGN Formation</div>
<nav>
<a href="../../../index.html">Exercices interactifs</a>
<a href="../../../index.html#documentation">Documentation</a>
<a href="../../../index.html#rapports">Rapports de veille</a>
<a href="../../../index.html#about">À propos</a>
<a href="../../../index.html#contact">Contact</a>
</nav>
</header>
<!-- MAIN CONTENT -->
<main>
<!-- BREADCRUMB -->
<div class="breadcrumb">
<a href="index.html">Accueil</a>
<span></span>
<a href="veille-index.html">Rapports de veille</a>
<span></span>
<span>Semaine 20</span>
</div>
<!-- PAGE HEADER -->
<section class="page-header">
<h1>📊 Rapport Veille Semaine 20</h1>
<div class="page-meta">
<div class="meta-item">
<strong>Période :</strong> 11-17 mai 2026
</div>
<div class="meta-item">
<strong>8 rubriques</strong> analysées
</div>
<div class="meta-item">
<strong>25+</strong> sources officielles
</div>
</div>
</section>
<!-- TABLE OF CONTENTS -->
<div class="toc">
<h3>📑 Sommaire</h3>
<ul class="toc-list">
<li><a href="#reglementaire">⚖️ Réglementaire</a></li>
<li><a href="#marche">🎓 Marché formation</a></li>
<li><a href="#nuisibles">🐀 Nuisibles & ESOD</a></li>
<li><a href="#desinfection">🧴 Désinfection</a></li>
<li><a href="#opportunites">💡 Opportunités</a></li>
<li><a href="#innovation">🔬 Innovation</a></li>
<li><a href="#europe">🇪🇺 Veille européenne</a></li>
<li><a href="#rh">👥 RH & Concurrence</a></li>
<li><a href="#attention">⚠️ Points d'attention</a></li>
</ul>
</div>
<!-- ===== RÉGLEMENTAIRE ===== -->
<section class="section" id="reglementaire">
<h2>⚖️ Réglementaire — AMM, retraits, BPR, obligations Certibiocide</h2>
<div class="content-item">
<strong>ANSES / Certibiocide — Obligation étendue aux établissements de santé</strong>
<p>Depuis le 1er janvier 2026, le programme de formation Certibiocide (7 heures, renouvelable tous les 5 ans) est obligatoire pour tous les professionnels utilisant, achetant ou distribuant des produits biocides à usage professionnel. Cette obligation s'étend désormais aux centres de santé et établissements médico-sociaux.</p>
<div class="item-meta">
<div class="item-date">📅 Janvier 2026</div>
<a href="#" class="item-link">Source ANSES →</a>
</div>
</div>
<div class="content-item">
<strong>ECHA — Non-renouvellement cyperméthrine (TP18)</strong>
<p>La cyperméthrine (insecticide pyréthrinoïde, TP18) ne remplit plus les conditions d'approbation européenne suite au retrait volontaire de la demande de renouvellement par le demandeur en mai 2025. Ce retrait a des conséquences directes sur les produits rodenticides et insecticides contenant cette substance active.</p>
<div class="item-meta">
<div class="item-date">📅 Conséquences effectives 2026</div>
<a href="#" class="item-link">ECHA guidance →</a>
</div>
</div>
<div class="content-item">
<strong>ECHA — Avis positif éthanol (désinfection)</strong>
<p>Le Comité des produits biocides de l'ECHA a publié un avis d'examen positif soutenant l'éthanol comme substance active biocide pour la désinfection (TP1, TP2). Ce jalon ouvre la voie à l'approbation formelle au niveau européen.</p>
<div class="item-meta">
<div class="item-date">📅 2026</div>
<a href="#" class="item-link">ECHA guidance →</a>
</div>
</div>
<div class="content-item">
<strong>Knoell — Newsletter mondiale biocides</strong>
<p>La newsletter mensuelle mondiale de Knoell (février 2026) recense les dernières approbations et rejets de substances actives biocides au niveau international, utile pour anticiper les évolutions du portefeuille produits disponibles en France.</p>
<div class="item-meta">
<div class="item-date">📅 Février 2026</div>
<a href="#" class="item-link">Knoell news →</a>
</div>
</div>
</section>
<!-- ===== MARCHÉ FORMATION ===== -->
<section class="section" id="marche">
<h2>🎓 Marché formation — Qualiopi, CPF, OPCO</h2>
<div class="content-item">
<strong>Parlement français — Loi anti-fraude formation ADOPTÉE</strong>
<p>Le projet de loi de lutte contre les fraudes à la formation professionnelle a été définitivement adopté le 13 mai 2026. Il instaure des sanctions renforcées pour les fraudes au CPF, de nouvelles obligations de contrôle pour les OPCO et les CFA, et impose la vérification d'identité du stagiaire dès l'inscription et au premier jour de formation.</p>
<div class="item-meta">
<div class="item-date">📅 13 mai 2026</div>
<a href="#" class="item-link">Service-public.fr →</a>
</div>
</div>
<div class="content-item">
<strong>Service-public.fr — Évolutions CPF 2026</strong>
<p>Les nouvelles règles d'utilisation du CPF pour 2026 sont officiellement publiées : justificatifs renforcés selon le montant de la formation, délai de rétractation porté à 30 jours, et procédures de contrôle systématiques côté OPCO avant toute validation de dossier.</p>
<div class="item-meta">
<div class="item-date">📅 Mai 2026</div>
<a href="#" class="item-link">Lire →</a>
</div>
</div>
<div class="content-item">
<strong>Centre Inffo — Bilan formation 2026 : contexte dégradé</strong>
<p>Centre Inffo qualifie 2026 d'"annus horribilis" pour la formation professionnelle en raison de la multiplication des contrôles, du durcissement réglementaire et des tensions budgétaires touchant les financeurs. Un contexte à surveiller pour les organismes indépendants.</p>
<div class="item-meta">
<div class="item-date">📅 2026</div>
<a href="#" class="item-link">Centre Inffo →</a>
</div>
</div>
<div class="content-item">
<strong>FAFCEA — Qualiopi obligatoire pour artisans</strong>
<p>Qualiopi est désormais obligatoire pour accéder aux financements FAFCEA (artisans), en plus des OPCO. Rappel : Qualiopi ne suffit pas seul pour l'éligibilité CPF ; des critères complémentaires s'appliquent via Mon Compte Formation.</p>
<div class="item-meta">
<div class="item-date">📅 2026</div>
<a href="#" class="item-link">FAFCEA info →</a>
</div>
</div>
</section>
<!-- ===== NUISIBLES & ESOD ===== -->
<section class="section" id="nuisibles">
<h2>🐀 Nuisibles & ESOD — Espèces nuisibles et invasives</h2>
<div class="content-item">
<strong>Santé Publique France — Moustique tigre, couverture 90 départements</strong>
<p>Le dispositif national de surveillance et de contrôle des maladies transmises par le moustique tigre est renforcé pour 2026. Le moustique tigre couvre désormais environ 90 départements métropolitains (contre 81 début 2025), progression directement liée aux hivers de plus en plus doux.</p>
<div class="item-meta">
<div class="item-date">📅 Printemps 2026</div>
<a href="#" class="item-link">SPF →</a>
</div>
</div>
<div class="content-item">
<strong>Professionnels 3D — Pression moustique tigre en hausse</strong>
<p>Les professionnels de la lutte antiparasitaire alertent sur la pression croissante liée au moustique tigre : 20 000 interventions en 2024, demande en forte hausse pour le printemps-été 2026. Les plateformes de signalement ANSES restent les outils de référence.</p>
<div class="item-meta">
<div class="item-date">📅 Avril-mai 2026</div>
<a href="#" class="item-link">ANSES signalement →</a>
</div>
</div>
<div class="content-item">
<strong>ARS Île-de-France — Guide espèces à enjeux sanitaires</strong>
<p>La région Île-de-France publie un guide à destination des collectivités sur la lutte contre les espèces à enjeux sanitaires : moustique tigre, tiques, punaises de lit, rongeurs, chenilles urticantes. Document de référence utile pour les modules de formation.</p>
<div class="item-meta">
<div class="item-date">📅 2026</div>
<a href="#" class="item-link">ARS IDF →</a>
</div>
</div>
<div class="content-item">
<strong>Lyon Capitale — Espèces invasives et débat de lutte</strong>
<p>Lyon et sa métropole font face à une recrudescence des espèces invasives (frelon asiatique, moustique tigre, chenilles processionnaires). Le débat sur les moyens de lutte, entre approche chimique et solutions alternatives, est relancé dans les collectivités.</p>
<div class="item-meta">
<div class="item-date">📅 Printemps 2026</div>
<a href="#" class="item-link">Lire →</a>
</div>
</div>
</section>
<!-- ===== DÉSINFECTION ===== -->
<section class="section" id="desinfection">
<h2>🧴 Désinfection — Normes, produits homologués, alternatives</h2>
<div class="content-item">
<strong>AFNOR / NF EN 14885 — Norme désinfectants</strong>
<p>Norme de référence pour les biocides désinfectants (hôpitaux, industrie alimentaire, environnement). Complétée par NF EN 1276 (bactéricides) et NF EN 1650 (fongicides) pour la validation de l'efficacité des produits.</p>
<div class="item-meta">
<div class="item-date">📅 En vigueur</div>
<a href="#" class="item-link">AFNOR →</a>
</div>
</div>
<div class="content-item">
<strong>AFNOR — Révision NF U43-500 en cours</strong>
<p>La norme NF U43-500 sur les bonnes pratiques d'application des produits phytosanitaires et biocides est en cours de consultation. Elle concerne directement les applicateurs professionnels et pourrait impacter le contenu des formations Certibiocide.</p>
<div class="item-meta">
<div class="item-date">📅 En cours de révision</div>
<a href="#" class="item-link">AFNOR norminfo →</a>
</div>
</div>
<div class="content-item">
<strong>Climalife — Certibiocide Désinfectants obligatoire santé</strong>
<p>La certification Certibiocide Désinfectants (7h, 5 ans) est désormais requise dans les établissements de santé pour toute personne supervisant l'achat ou l'utilisation de désinfectants professionnels. Opportunité pour les organismes de formation spécialisés.</p>
<div class="item-meta">
<div class="item-date">📅 Janvier 2026</div>
<a href="#" class="item-link">Climalife →</a>
</div>
</div>
</section>
<!-- ===== OPPORTUNITÉS ===== -->
<section class="section" id="opportunites">
<h2>💡 Opportunités — BOAMP, CPF, secteurs demandeurs</h2>
<div class="content-item">
<strong>BOAMP 3/BOAMP/266207 — Marché EPMO-VGE, Paris 7e</strong>
<p>Marché de dératisation, désinsectisation et désinfection pour le Musée d'Orsay, le Musée de l'Orangerie et les installations administratives associées. Marché public actif en 2026.</p>
<div class="item-meta">
<div class="item-date">📅 2026</div>
<a href="#" class="item-link">FranceMarchés →</a>
</div>
</div>
<div class="content-item">
<strong>BOAMP 3/BOAMP/264816 — Accord-cadre prévention nuisibles</strong>
<p>Accord-cadre à bon de commande pour prestations de prévention et lutte contre les nuisibles, montant maximum 50 000 € HT/an. Marché accessible aux structures de taille intermédiaire.</p>
<div class="item-meta">
<div class="item-date">📅 2026</div>
<a href="#" class="item-link">FranceMarchés →</a>
</div>
</div>
<div class="content-item">
<strong>BOAMP 3/BOAMP/2616972 — Département de l'Oise</strong>
<p>Missions 3D (dératisation, désinsectisation, désinfection + traitements spécifiques) sur les sites départementaux et le réseau routier de l'Oise, en 2 lots. Notification prévue juillet 2026.</p>
<div class="item-meta">
<div class="item-date">📅 Mars-juillet 2026</div>
<a href="#" class="item-link">FranceMarchés →</a>
</div>
</div>
<div class="content-item">
<strong>BOAMP 3/BOAMP/2632494 — Carrières-sous-Poissy (78)</strong>
<p>Marché anti-nuisibles 4D pour Carrières-sous-Poissy. Au total, 81+ appels d'offres dératisation/désinsectisation répertoriés en cours. Opportunité commerciale majeure pour formateurs spécialisés.</p>
<div class="item-meta">
<div class="item-date">📅 2026</div>
<a href="#" class="item-link">FranceMarchés →</a>
</div>
</div>
</section>
<!-- ===== INNOVATION ===== -->
<section class="section" id="innovation">
<h2>🔬 Innovation — Bioinsecticides, IoT, IA, brevets</h2>
<div class="content-item">
<strong>Groupe Berkem — NOVATERM® avec IA</strong>
<p>Piège anti-termites intégrant un suivi par intelligence artificielle pour la détection précoce de l'activité des insectes. Présenté à Parasitec 2025, ce type de solution connectée illustre la convergence IA/piégeage physique dans le secteur 3D.</p>
<div class="item-meta">
<div class="item-date">📅 Parasitec 2025</div>
<a href="#" class="item-link">Berkem →</a>
</div>
</div>
<div class="content-item">
<strong>NPiMagazine — Capteurs IoT & analyse data</strong>
<p>Le trio capteurs/traitement de données IoT/analyse est identifié comme le modèle gagnant de la lutte antiparasitaire connectée : détection en temps réel, alertes automatisées, réduction des interventions non justifiées et optimisation des tournées.</p>
<div class="item-meta">
<div class="item-date">📅 2026</div>
<a href="#" class="item-link">NPI Magazine →</a>
</div>
</div>
<div class="content-item">
<strong>CORDIS / LOCDIS Project — Lutte biologique européenne</strong>
<p>Le projet européen LOCDIS (financé par l'UE via CORDIS) explore la lutte antiparasitaire biologique comme alternative aux biocides chimiques. Les résultats s'orientent vers des solutions combinant agents biologiques et dispositifs connectés.</p>
<div class="item-meta">
<div class="item-date">📅 En cours</div>
<a href="#" class="item-link">CORDIS →</a>
</div>
</div>
<div class="content-item">
<strong>Nuisible Control — Tendances 2026 dératisation éthique</strong>
<p>Le secteur 3D évolue vers une dératisation plus éthique : remplacement progressif des poses systématiques de raticides par des pièges connectés, IA prédictive et cartographie des risques. Tendance de fond à intégrer dans les supports de formation.</p>
<div class="item-meta">
<div class="item-date">📅 2026</div>
<a href="#" class="item-link">Nuisible Control →</a>
</div>
</div>
</section>
<!-- ===== VEILLE EUROPÉENNE ===== -->
<section class="section" id="europe">
<h2>🇪🇺 Veille européenne — BPR, EFSA, résistances</h2>
<div class="content-item">
<strong>Commission européenne — Évaluation BPR en cours</strong>
<p>L'évaluation formelle du Règlement sur les Produits Biocides (BPR n°528/2012) se poursuit depuis le Q4 2025. Elle porte sur l'efficacité du cadre réglementaire et pourrait déboucher sur une révision législative majeure impactant tous les types de produits biocides.</p>
<div class="item-meta">
<div class="item-date">📅 Q4 2025 en cours</div>
<a href="#" class="item-link">EC health →</a>
</div>
</div>
<div class="content-item">
<strong>ECHA — Cyperméthrine non-renouvelée</strong>
<p>La cyperméthrine ne sera pas renouvelée en Europe. Ce retrait impacte directement les produits insecticides de type 18 (lutte contre les insectes nuisibles) et 14 (rodenticides associés). Les formulateurs doivent anticiper des reformulations.</p>
<div class="item-meta">
<div class="item-date">📅 Effectif 2026</div>
<a href="#" class="item-link">ECHA →</a>
</div>
</div>
<div class="content-item">
<strong>ECHA — Guidance résistances intégrée</strong>
<p>La "Resistance Guidance" (guidance sur les résistances aux biocides) est désormais intégrée dans l'évaluation des nouvelles soumissions BPR. Les questions de résistances aux insecticides font officiellement partie du cadre d'évaluation européen.</p>
<div class="item-meta">
<div class="item-date">📅 2026</div>
<a href="#" class="item-link">ECHA →</a>
</div>
</div>
</section>
<!-- ===== RH & CONCURRENCE ===== -->
<section class="section" id="rh">
<h2>👥 RH & Concurrence — Emploi 3D, certifications RNCP</h2>
<div class="content-item">
<strong>Indeed (8 mai 2026) — 125+ offres techniciens 3D</strong>
<p>Plus de 100 offres d'emploi de technicien nuisibles et 25+ postes de technicien dératisation/désinsectisation répertoriés en France. Le marché de l'emploi 3D reste très dynamique avec une demande saisonnière renforcée pour printemps-été 2026.</p>
<div class="item-meta">
<div class="item-date">📅 8 mai 2026</div>
<a href="#" class="item-link">Indeed →</a>
</div>
</div>
<div class="content-item">
<strong>France Compétences — RNCP41350 nouveau CQP</strong>
<p>Une nouvelle certification CQP "Technicien en maîtrise du risque nuisible" (RNCP41350) est référencée sur MesCertifs, en complément du CQP historique RNCP36313. Le Certibiocide (RS6442) reste requis dans toutes les fiches de poste du secteur.</p>
<div class="item-meta">
<div class="item-date">📅 2026</div>
<a href="#" class="item-link">MesCertifs →</a>
</div>
</div>
<div class="content-item">
<strong>Ensystex Solution Pro — CQP métier d'avenir</strong>
<p>Article mettant en avant le CQP technicien applicateur comme "métier d'avenir" face aux exigences réglementaires croissantes (Certibiocide, connaissance des résistances, outils connectés). Argument commercial à fort potentiel pour le recrutement en formation continue.</p>
<div class="item-meta">
<div class="item-date">📅 2026</div>
<a href="#" class="item-link">Ensystex →</a>
</div>
</div>
</section>
<!-- ===== POINTS D'ATTENTION ===== -->
<section class="attention-section" id="attention">
<h2>⚠️ Points d'attention — Semaine 20</h2>
<div class="attention-item">
<strong>1. Loi anti-fraude formation définitivement adoptée (13 mai 2026)</strong>
<p>Entrée en vigueur progressive dès le 1er juillet 2026 : vérification d'identité obligatoire au 1er jour de formation CPF, contrôles OPCO renforcés.</p>
<p style="margin-top: 0.75rem;"><strong>➜ Action :</strong> En tant que formateur indépendant Certibiocide, anticiper dès maintenant : émargements numériques, procédure d'identification stagiaires, et vérification de la cohérence CPF/projet professionnel lors des inscriptions.</p>
</div>
<div class="attention-item">
<strong>2. Non-renouvellement de la cyperméthrine en Europe</strong>
<p>Ce retrait impacte des produits TP14 et TP18 encore largement utilisés.</p>
<p style="margin-top: 0.75rem;"><strong>➜ Action :</strong> Les supports de formation Certibiocide Nuisibles doivent être mis à jour pour alerter les stagiaires sur ce changement de portefeuille produit et les orienter vers des substances actives alternatives homologuées.</p>
</div>
<div class="attention-item">
<strong>3. Quatre appels d'offres BOAMP 3D actifs en 2026</strong>
<p>Opportunité concrète pour générer de nouveaux clients 3D et augmenter la demande de formations.</p>
<p style="margin-top: 0.75rem;"><strong>➜ Action :</strong> Les marchés publics 3D génèrent des besoins en recrutement de techniciens certifiés, donc en formation Certibiocide. Démarcher les entreprises attributaires de ces marchés peut être une stratégie de développement commercial directe.</p>
</div>
</section>
</main>
<!-- FOOTER -->
<footer>
<p>&copy; 2026 NextGN Formation - Formations Certibiocide & Techniques</p>
<p style="margin-top: 10px; opacity: 0.6;">Tous droits réservés — Gauthier Chombart & Nathan Chauwin — Formateurs indépendants</p>
</footer>
<!-- PROGRESS BAR SCRIPT -->
<script>
window.addEventListener('scroll', () => {
const scrollTop = window.scrollY;
const docHeight = document.documentElement.scrollHeight - window.innerHeight;
const scrollPercent = (scrollTop / docHeight) * 100;
document.getElementById('progressBar').style.width = scrollPercent + '%';
});
</script>
</body>
</html>

View File

@@ -1,817 +0,0 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Rapport Veille Semaine 21 - Certibiocide</title>
<link href="https://fonts.googleapis.com/css2?family=Syne:wght@400;600;700;800&family=DM+Sans:ital,wght@0,300;0,400;0,500;1,300&display=swap" rel="stylesheet">
<style>
:root {
--teal: #0F6E56;
--teal-mid: #1D9E75;
--teal-light: #E1F5EE;
--amber: #BA7517;
--amber-mid: #D4921A;
--amber-light: #FAEEDA;
--amber-dark: #633806;
--coral: #993C1D;
--coral-mid: #D85A30;
--coral-light: #FAECE7;
--purple: #BA7517;
--purple-light: #FAEEDA;
--blue: #185FA5;
--blue-light: #E6F1FB;
--green: #2E7D32;
--green-light: #E8F5E9;
--bg: #F7F6F2;
--white: #FFFFFF;
--text: #1a1a18;
--text-muted: #6b6a65;
--border: rgba(0,0,0,0.1);
}
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}
html, body {
height: 100%;
}
body {
font-family: 'DM Sans', sans-serif;
background: var(--bg);
color: var(--text);
line-height: 1.6;
padding-top: 70px;
}
/* ===== HEADER FIXE ===== */
header {
position: fixed;
top: 0;
left: 0;
right: 0;
height: 70px;
background: rgba(250, 238, 218, 0.98);
backdrop-filter: blur(10px);
border-bottom: 2px solid var(--amber);
z-index: 1000;
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 2rem;
}
.logo {
font-family: 'Syne', sans-serif;
font-size: 16px;
font-weight: 700;
letter-spacing: -0.5px;
background: linear-gradient(135deg, var(--teal-mid), var(--coral-mid));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
text-decoration: none;
}
nav {
display: flex;
gap: 2rem;
}
nav a {
font-family: 'Syne', sans-serif;
font-size: 11px;
font-weight: 700;
letter-spacing: 0.08em;
text-transform: uppercase;
text-decoration: none;
color: var(--text-muted);
transition: color 0.3s ease;
}
nav a:hover {
color: var(--amber);
}
/* ===== PROGRESS BAR ===== */
.progress {
position: fixed;
top: 70px;
left: 0;
right: 0;
height: 3px;
background: var(--border);
z-index: 999;
}
.progress-bar {
height: 100%;
background: var(--amber);
width: 0%;
transition: width 0.3s ease;
}
/* ===== MAIN CONTENT ===== */
main {
max-width: 1000px;
margin: 0 auto;
padding: 3rem 2rem;
}
.section {
margin-bottom: 3rem;
animation: fadeIn 0.6s ease-out;
}
@keyframes fadeIn {
from {
opacity: 0;
transform: translateY(10px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
/* ===== BREADCRUMB ===== */
.breadcrumb {
display: flex;
gap: 0.5rem;
align-items: center;
font-size: 12px;
color: var(--text-muted);
margin-bottom: 1.5rem;
font-family: 'Syne', sans-serif;
}
.breadcrumb a {
color: var(--amber);
text-decoration: none;
font-weight: 600;
transition: color 0.3s ease;
}
.breadcrumb a:hover {
color: var(--amber-dark);
}
/* ===== PAGE HEADER ===== */
.page-header {
background: var(--amber-light);
border-left: 4px solid var(--amber);
border-radius: 8px;
padding: 2rem;
margin-bottom: 2rem;
}
.page-header h1 {
font-family: 'Syne', sans-serif;
font-size: 2.2rem;
font-weight: 800;
color: var(--text);
margin-bottom: 0.5rem;
}
.page-meta {
display: flex;
flex-wrap: wrap;
gap: 2rem;
font-size: 0.95rem;
color: var(--text-muted);
margin-top: 1rem;
}
.meta-item {
display: flex;
align-items: center;
gap: 0.5rem;
}
.meta-item strong {
color: var(--amber);
}
/* ===== CONTENT SECTIONS ===== */
h2 {
font-family: 'Syne', sans-serif;
font-size: 1.6rem;
font-weight: 700;
color: var(--text);
margin-bottom: 1rem;
margin-top: 2.5rem;
padding-bottom: 0.75rem;
border-bottom: 3px solid var(--amber);
display: flex;
align-items: center;
gap: 0.75rem;
}
h3 {
font-family: 'Syne', sans-serif;
font-size: 1.05rem;
font-weight: 700;
color: var(--text);
margin-top: 1.5rem;
margin-bottom: 0.75rem;
}
/* ===== CONTENT ITEMS ===== */
.content-item {
background: var(--white);
border-left: 4px solid var(--amber-light);
border-radius: 6px;
padding: 1.5rem;
margin-bottom: 1.5rem;
transition: all 0.3s ease;
}
.content-item:hover {
border-left-color: var(--amber);
box-shadow: 0 4px 12px rgba(186, 117, 23, 0.1);
}
.content-item strong {
color: var(--amber-dark);
display: block;
margin-bottom: 0.5rem;
font-size: 1rem;
}
.content-item p {
font-size: 0.95rem;
line-height: 1.7;
margin-bottom: 0.75rem;
color: var(--text);
}
.content-item p:last-child {
margin-bottom: 0;
}
.item-meta {
display: flex;
gap: 1rem;
flex-wrap: wrap;
font-size: 0.85rem;
color: var(--text-muted);
margin-top: 1rem;
padding-top: 1rem;
border-top: 1px solid rgba(186, 117, 23, 0.1);
}
.item-date {
display: flex;
align-items: center;
gap: 0.4rem;
}
.item-link {
color: var(--amber);
text-decoration: none;
font-weight: 600;
transition: color 0.3s ease;
}
.item-link:hover {
color: var(--amber-dark);
}
/* ===== ATTENTION SECTION ===== */
.attention-section {
background: linear-gradient(135deg, var(--amber-light), rgba(250, 236, 218, 0.7));
border: 2px solid var(--amber);
border-radius: 8px;
padding: 2rem;
margin: 2rem 0;
}
.attention-section h2 {
border-bottom-color: var(--amber-dark);
margin-top: 0;
}
.attention-item {
background: var(--white);
border-left: 4px solid var(--amber-dark);
border-radius: 6px;
padding: 1.25rem;
margin-bottom: 1rem;
}
.attention-item:last-child {
margin-bottom: 0;
}
.attention-item strong {
color: var(--amber-dark);
display: block;
margin-bottom: 0.5rem;
}
/* ===== TABLE OF CONTENTS ===== */
.toc {
background: var(--blue-light);
border-left: 4px solid var(--blue);
border-radius: 8px;
padding: 1.5rem;
margin: 2rem 0;
}
.toc h3 {
margin-top: 0;
color: var(--blue);
}
.toc-list {
list-style: none;
padding: 0;
margin: 0;
}
.toc-list li {
margin-bottom: 0.5rem;
}
.toc-list a {
color: var(--blue);
text-decoration: none;
font-weight: 500;
font-size: 0.95rem;
transition: color 0.3s ease;
}
.toc-list a:hover {
color: var(--teal-mid);
}
/* ===== FOOTER ===== */
footer {
background: var(--text);
color: var(--white);
padding: 2.5rem;
text-align: center;
font-size: 13px;
margin-top: 4rem;
border-top: 1px solid var(--border);
}
footer p {
margin-bottom: 0.5rem;
}
footer p:last-child {
opacity: 0.6;
font-size: 12px;
margin-top: 0.5rem;
}
/* ===== RESPONSIVE ===== */
@media (max-width: 768px) {
header {
padding: 0 1rem;
}
.logo {
font-size: 14px;
}
nav {
gap: 1rem;
}
nav a {
font-size: 9px;
}
main {
padding: 2rem 1rem;
}
h1 {
font-size: 1.8rem;
}
h2 {
font-size: 1.3rem;
}
.page-meta {
gap: 1rem;
flex-direction: column;
}
.attention-section {
padding: 1.5rem;
}
}
</style>
</head>
<body>
<!-- PROGRESS BAR -->
<div class="progress">
<div class="progress-bar" id="progressBar"></div>
</div>
<!-- HEADER -->
<header>
<div class="logo">NextGN Formation</div>
<nav>
<a href="../../../index.html">Exercices interactifs</a>
<a href="../../../index.html#documentation">Documentation</a>
<a href="../../../index.html#rapports">Rapports de veille</a>
<a href="../../../index.html#about">À propos</a>
<a href="../../../index.html#contact">Contact</a>
</nav>
</header>
<!-- MAIN CONTENT -->
<main>
<!-- BREADCRUMB -->
<div class="breadcrumb">
<a href="index.html">Accueil</a>
<span></span>
<a href="veille-index.html">Rapports de veille</a>
<span></span>
<span>Semaine 21</span>
</div>
<!-- PAGE HEADER -->
<section class="page-header">
<h1>📊 Rapport Veille Semaine 21</h1>
<div class="page-meta">
<div class="meta-item">
<strong>Période :</strong> 18-24 mai 2026
</div>
<div class="meta-item">
<strong>8 rubriques</strong> analysées
</div>
<div class="meta-item">
<strong>25+</strong> sources officielles
</div>
</div>
</section>
<!-- TABLE OF CONTENTS -->
<div class="toc">
<h3>📑 Sommaire</h3>
<ul class="toc-list">
<li><a href="#reglementaire">⚖️ Réglementaire</a></li>
<li><a href="#marche">🎓 Marché formation</a></li>
<li><a href="#nuisibles">🐀 Nuisibles & ESOD</a></li>
<li><a href="#desinfection">🧴 Désinfection</a></li>
<li><a href="#opportunites">💡 Opportunités</a></li>
<li><a href="#innovation">🔬 Innovation</a></li>
<li><a href="#europe">🇪🇺 Veille européenne</a></li>
<li><a href="#rh">👥 RH & Concurrence</a></li>
<li><a href="#attention">⚠️ Points d'attention</a></li>
</ul>
</div>
<!-- ===== RÉGLEMENTAIRE ===== -->
<section class="section" id="reglementaire">
<h2>⚖️ Réglementaire — AMM, retraits, BPR, obligations Certibiocide</h2>
<div class="content-item">
<strong>ANSES / Certibiocide — Obligation étendue aux établissements de santé</strong>
<p>Depuis le 1er janvier 2026, le programme de formation Certibiocide (7 heures, renouvelable tous les 5 ans) est obligatoire pour tous les professionnels utilisant, achetant ou distribuant des produits biocides à usage professionnel. Cette obligation s'étend désormais aux centres de santé et établissements médico-sociaux.</p>
<div class="item-meta">
<div class="item-date">📅 Janvier 2026</div>
<a href="#" class="item-link">Source ANSES →</a>
</div>
</div>
<div class="content-item">
<strong>ECHA — Non-renouvellement cyperméthrine (TP18)</strong>
<p>La cyperméthrine (insecticide pyréthrinoïde, TP18) ne remplit plus les conditions d'approbation européenne suite au retrait volontaire de la demande de renouvellement par le demandeur en mai 2025. Ce retrait a des conséquences directes sur les produits rodenticides et insecticides contenant cette substance active.</p>
<div class="item-meta">
<div class="item-date">📅 Conséquences effectives 2026</div>
<a href="#" class="item-link">ECHA guidance →</a>
</div>
</div>
<div class="content-item">
<strong>ECHA — Avis positif éthanol (désinfection)</strong>
<p>Le Comité des produits biocides de l'ECHA a publié un avis d'examen positif soutenant l'éthanol comme substance active biocide pour la désinfection (TP1, TP2). Ce jalon ouvre la voie à l'approbation formelle au niveau européen.</p>
<div class="item-meta">
<div class="item-date">📅 2026</div>
<a href="#" class="item-link">ECHA guidance →</a>
</div>
</div>
<div class="content-item">
<strong>Knoell — Newsletter mondiale biocides</strong>
<p>La newsletter mensuelle mondiale de Knoell (février 2026) recense les dernières approbations et rejets de substances actives biocides au niveau international, utile pour anticiper les évolutions du portefeuille produits disponibles en France.</p>
<div class="item-meta">
<div class="item-date">📅 Février 2026</div>
<a href="#" class="item-link">Knoell news →</a>
</div>
</div>
</section>
<!-- ===== MARCHÉ FORMATION ===== -->
<section class="section" id="marche">
<h2>🎓 Marché formation — Qualiopi, CPF, OPCO</h2>
<div class="content-item">
<strong>Parlement français — Loi anti-fraude formation ADOPTÉE</strong>
<p>Le projet de loi de lutte contre les fraudes à la formation professionnelle a été définitivement adopté le 13 mai 2026. Il instaure des sanctions renforcées pour les fraudes au CPF, de nouvelles obligations de contrôle pour les OPCO et les CFA, et impose la vérification d'identité du stagiaire dès l'inscription et au premier jour de formation.</p>
<div class="item-meta">
<div class="item-date">📅 13 mai 2026</div>
<a href="#" class="item-link">Service-public.fr →</a>
</div>
</div>
<div class="content-item">
<strong>Service-public.fr — Évolutions CPF 2026</strong>
<p>Les nouvelles règles d'utilisation du CPF pour 2026 sont officiellement publiées : justificatifs renforcés selon le montant de la formation, délai de rétractation porté à 30 jours, et procédures de contrôle systématiques côté OPCO avant toute validation de dossier.</p>
<div class="item-meta">
<div class="item-date">📅 Mai 2026</div>
<a href="#" class="item-link">Lire →</a>
</div>
</div>
<div class="content-item">
<strong>Centre Inffo — Bilan formation 2026 : contexte dégradé</strong>
<p>Centre Inffo qualifie 2026 d'"annus horribilis" pour la formation professionnelle en raison de la multiplication des contrôles, du durcissement réglementaire et des tensions budgétaires touchant les financeurs. Un contexte à surveiller pour les organismes indépendants.</p>
<div class="item-meta">
<div class="item-date">📅 2026</div>
<a href="#" class="item-link">Centre Inffo →</a>
</div>
</div>
<div class="content-item">
<strong>FAFCEA — Qualiopi obligatoire pour artisans</strong>
<p>Qualiopi est désormais obligatoire pour accéder aux financements FAFCEA (artisans), en plus des OPCO. Rappel : Qualiopi ne suffit pas seul pour l'éligibilité CPF ; des critères complémentaires s'appliquent via Mon Compte Formation.</p>
<div class="item-meta">
<div class="item-date">📅 2026</div>
<a href="#" class="item-link">FAFCEA info →</a>
</div>
</div>
</section>
<!-- ===== NUISIBLES & ESOD ===== -->
<section class="section" id="nuisibles">
<h2>🐀 Nuisibles & ESOD — Espèces nuisibles et invasives</h2>
<div class="content-item">
<strong>Santé Publique France — Moustique tigre, couverture 90 départements</strong>
<p>Le dispositif national de surveillance et de contrôle des maladies transmises par le moustique tigre est renforcé pour 2026. Le moustique tigre couvre désormais environ 90 départements métropolitains (contre 81 début 2025), progression directement liée aux hivers de plus en plus doux.</p>
<div class="item-meta">
<div class="item-date">📅 Printemps 2026</div>
<a href="#" class="item-link">SPF →</a>
</div>
</div>
<div class="content-item">
<strong>Professionnels 3D — Pression moustique tigre en hausse</strong>
<p>Les professionnels de la lutte antiparasitaire alertent sur la pression croissante liée au moustique tigre : 20 000 interventions en 2024, demande en forte hausse pour le printemps-été 2026. Les plateformes de signalement ANSES restent les outils de référence.</p>
<div class="item-meta">
<div class="item-date">📅 Avril-mai 2026</div>
<a href="#" class="item-link">ANSES signalement →</a>
</div>
</div>
<div class="content-item">
<strong>ARS Île-de-France — Guide espèces à enjeux sanitaires</strong>
<p>La région Île-de-France publie un guide à destination des collectivités sur la lutte contre les espèces à enjeux sanitaires : moustique tigre, tiques, punaises de lit, rongeurs, chenilles urticantes. Document de référence utile pour les modules de formation.</p>
<div class="item-meta">
<div class="item-date">📅 2026</div>
<a href="#" class="item-link">ARS IDF →</a>
</div>
</div>
<div class="content-item">
<strong>Lyon Capitale — Espèces invasives et débat de lutte</strong>
<p>Lyon et sa métropole font face à une recrudescence des espèces invasives (frelon asiatique, moustique tigre, chenilles processionnaires). Le débat sur les moyens de lutte, entre approche chimique et solutions alternatives, est relancé dans les collectivités.</p>
<div class="item-meta">
<div class="item-date">📅 Printemps 2026</div>
<a href="#" class="item-link">Lire →</a>
</div>
</div>
</section>
<!-- ===== DÉSINFECTION ===== -->
<section class="section" id="desinfection">
<h2>🧴 Désinfection — Normes, produits homologués, alternatives</h2>
<div class="content-item">
<strong>AFNOR / NF EN 14885 — Norme désinfectants</strong>
<p>Norme de référence pour les biocides désinfectants (hôpitaux, industrie alimentaire, environnement). Complétée par NF EN 1276 (bactéricides) et NF EN 1650 (fongicides) pour la validation de l'efficacité des produits.</p>
<div class="item-meta">
<div class="item-date">📅 En vigueur</div>
<a href="#" class="item-link">AFNOR →</a>
</div>
</div>
<div class="content-item">
<strong>AFNOR — Révision NF U43-500 en cours</strong>
<p>La norme NF U43-500 sur les bonnes pratiques d'application des produits phytosanitaires et biocides est en cours de consultation. Elle concerne directement les applicateurs professionnels et pourrait impacter le contenu des formations Certibiocide.</p>
<div class="item-meta">
<div class="item-date">📅 En cours de révision</div>
<a href="#" class="item-link">AFNOR norminfo →</a>
</div>
</div>
<div class="content-item">
<strong>Climalife — Certibiocide Désinfectants obligatoire santé</strong>
<p>La certification Certibiocide Désinfectants (7h, 5 ans) est désormais requise dans les établissements de santé pour toute personne supervisant l'achat ou l'utilisation de désinfectants professionnels. Opportunité pour les organismes de formation spécialisés.</p>
<div class="item-meta">
<div class="item-date">📅 Janvier 2026</div>
<a href="#" class="item-link">Climalife →</a>
</div>
</div>
</section>
<!-- ===== OPPORTUNITÉS ===== -->
<section class="section" id="opportunites">
<h2>💡 Opportunités — BOAMP, CPF, secteurs demandeurs</h2>
<div class="content-item">
<strong>BOAMP 3/BOAMP/266207 — Marché EPMO-VGE, Paris 7e</strong>
<p>Marché de dératisation, désinsectisation et désinfection pour le Musée d'Orsay, le Musée de l'Orangerie et les installations administratives associées. Marché public actif en 2026.</p>
<div class="item-meta">
<div class="item-date">📅 2026</div>
<a href="#" class="item-link">FranceMarchés →</a>
</div>
</div>
<div class="content-item">
<strong>BOAMP 3/BOAMP/264816 — Accord-cadre prévention nuisibles</strong>
<p>Accord-cadre à bon de commande pour prestations de prévention et lutte contre les nuisibles, montant maximum 50 000 € HT/an. Marché accessible aux structures de taille intermédiaire.</p>
<div class="item-meta">
<div class="item-date">📅 2026</div>
<a href="#" class="item-link">FranceMarchés →</a>
</div>
</div>
<div class="content-item">
<strong>BOAMP 3/BOAMP/2616972 — Département de l'Oise</strong>
<p>Missions 3D (dératisation, désinsectisation, désinfection + traitements spécifiques) sur les sites départementaux et le réseau routier de l'Oise, en 2 lots. Notification prévue juillet 2026.</p>
<div class="item-meta">
<div class="item-date">📅 Mars-juillet 2026</div>
<a href="#" class="item-link">FranceMarchés →</a>
</div>
</div>
<div class="content-item">
<strong>BOAMP 3/BOAMP/2632494 — Carrières-sous-Poissy (78)</strong>
<p>Marché anti-nuisibles 4D pour Carrières-sous-Poissy. Au total, 81+ appels d'offres dératisation/désinsectisation répertoriés en cours. Opportunité commerciale majeure pour formateurs spécialisés.</p>
<div class="item-meta">
<div class="item-date">📅 2026</div>
<a href="#" class="item-link">FranceMarchés →</a>
</div>
</div>
</section>
<!-- ===== INNOVATION ===== -->
<section class="section" id="innovation">
<h2>🔬 Innovation — Bioinsecticides, IoT, IA, brevets</h2>
<div class="content-item">
<strong>Groupe Berkem — NOVATERM® avec IA</strong>
<p>Piège anti-termites intégrant un suivi par intelligence artificielle pour la détection précoce de l'activité des insectes. Présenté à Parasitec 2025, ce type de solution connectée illustre la convergence IA/piégeage physique dans le secteur 3D.</p>
<div class="item-meta">
<div class="item-date">📅 Parasitec 2025</div>
<a href="#" class="item-link">Berkem →</a>
</div>
</div>
<div class="content-item">
<strong>NPiMagazine — Capteurs IoT & analyse data</strong>
<p>Le trio capteurs/traitement de données IoT/analyse est identifié comme le modèle gagnant de la lutte antiparasitaire connectée : détection en temps réel, alertes automatisées, réduction des interventions non justifiées et optimisation des tournées.</p>
<div class="item-meta">
<div class="item-date">📅 2026</div>
<a href="#" class="item-link">NPI Magazine →</a>
</div>
</div>
<div class="content-item">
<strong>CORDIS / LOCDIS Project — Lutte biologique européenne</strong>
<p>Le projet européen LOCDIS (financé par l'UE via CORDIS) explore la lutte antiparasitaire biologique comme alternative aux biocides chimiques. Les résultats s'orientent vers des solutions combinant agents biologiques et dispositifs connectés.</p>
<div class="item-meta">
<div class="item-date">📅 En cours</div>
<a href="#" class="item-link">CORDIS →</a>
</div>
</div>
<div class="content-item">
<strong>Nuisible Control — Tendances 2026 dératisation éthique</strong>
<p>Le secteur 3D évolue vers une dératisation plus éthique : remplacement progressif des poses systématiques de raticides par des pièges connectés, IA prédictive et cartographie des risques. Tendance de fond à intégrer dans les supports de formation.</p>
<div class="item-meta">
<div class="item-date">📅 2026</div>
<a href="#" class="item-link">Nuisible Control →</a>
</div>
</div>
</section>
<!-- ===== VEILLE EUROPÉENNE ===== -->
<section class="section" id="europe">
<h2>🇪🇺 Veille européenne — BPR, EFSA, résistances</h2>
<div class="content-item">
<strong>Commission européenne — Évaluation BPR en cours</strong>
<p>L'évaluation formelle du Règlement sur les Produits Biocides (BPR n°528/2012) se poursuit depuis le Q4 2025. Elle porte sur l'efficacité du cadre réglementaire et pourrait déboucher sur une révision législative majeure impactant tous les types de produits biocides.</p>
<div class="item-meta">
<div class="item-date">📅 Q4 2025 en cours</div>
<a href="#" class="item-link">EC health →</a>
</div>
</div>
<div class="content-item">
<strong>ECHA — Cyperméthrine non-renouvelée</strong>
<p>La cyperméthrine ne sera pas renouvelée en Europe. Ce retrait impacte directement les produits insecticides de type 18 (lutte contre les insectes nuisibles) et 14 (rodenticides associés). Les formulateurs doivent anticiper des reformulations.</p>
<div class="item-meta">
<div class="item-date">📅 Effectif 2026</div>
<a href="#" class="item-link">ECHA →</a>
</div>
</div>
<div class="content-item">
<strong>ECHA — Guidance résistances intégrée</strong>
<p>La "Resistance Guidance" (guidance sur les résistances aux biocides) est désormais intégrée dans l'évaluation des nouvelles soumissions BPR. Les questions de résistances aux insecticides font officiellement partie du cadre d'évaluation européen.</p>
<div class="item-meta">
<div class="item-date">📅 2026</div>
<a href="#" class="item-link">ECHA →</a>
</div>
</div>
</section>
<!-- ===== RH & CONCURRENCE ===== -->
<section class="section" id="rh">
<h2>👥 RH & Concurrence — Emploi 3D, certifications RNCP</h2>
<div class="content-item">
<strong>Indeed (8 mai 2026) — 125+ offres techniciens 3D</strong>
<p>Plus de 100 offres d'emploi de technicien nuisibles et 25+ postes de technicien dératisation/désinsectisation répertoriés en France. Le marché de l'emploi 3D reste très dynamique avec une demande saisonnière renforcée pour printemps-été 2026.</p>
<div class="item-meta">
<div class="item-date">📅 8 mai 2026</div>
<a href="#" class="item-link">Indeed →</a>
</div>
</div>
<div class="content-item">
<strong>France Compétences — RNCP41350 nouveau CQP</strong>
<p>Une nouvelle certification CQP "Technicien en maîtrise du risque nuisible" (RNCP41350) est référencée sur MesCertifs, en complément du CQP historique RNCP36313. Le Certibiocide (RS6442) reste requis dans toutes les fiches de poste du secteur.</p>
<div class="item-meta">
<div class="item-date">📅 2026</div>
<a href="#" class="item-link">MesCertifs →</a>
</div>
</div>
<div class="content-item">
<strong>Ensystex Solution Pro — CQP métier d'avenir</strong>
<p>Article mettant en avant le CQP technicien applicateur comme "métier d'avenir" face aux exigences réglementaires croissantes (Certibiocide, connaissance des résistances, outils connectés). Argument commercial à fort potentiel pour le recrutement en formation continue.</p>
<div class="item-meta">
<div class="item-date">📅 2026</div>
<a href="#" class="item-link">Ensystex →</a>
</div>
</div>
</section>
<!-- ===== POINTS D'ATTENTION ===== -->
<section class="attention-section" id="attention">
<h2>⚠️ Points d'attention — Semaine 21</h2>
<div class="attention-item">
<strong>1. Loi anti-fraude formation définitivement adoptée (13 mai 2026)</strong>
<p>Entrée en vigueur progressive dès le 1er juillet 2026 : vérification d'identité obligatoire au 1er jour de formation CPF, contrôles OPCO renforcés.</p>
<p style="margin-top: 0.75rem;"><strong>➜ Action :</strong> En tant que formateur indépendant Certibiocide, anticiper dès maintenant : émargements numériques, procédure d'identification stagiaires, et vérification de la cohérence CPF/projet professionnel lors des inscriptions.</p>
</div>
<div class="attention-item">
<strong>2. Non-renouvellement de la cyperméthrine en Europe</strong>
<p>Ce retrait impacte des produits TP14 et TP18 encore largement utilisés.</p>
<p style="margin-top: 0.75rem;"><strong>➜ Action :</strong> Les supports de formation Certibiocide Nuisibles doivent être mis à jour pour alerter les stagiaires sur ce changement de portefeuille produit et les orienter vers des substances actives alternatives homologuées.</p>
</div>
<div class="attention-item">
<strong>3. Quatre appels d'offres BOAMP 3D actifs en 2026</strong>
<p>Opportunité concrète pour générer de nouveaux clients 3D et augmenter la demande de formations.</p>
<p style="margin-top: 0.75rem;"><strong>➜ Action :</strong> Les marchés publics 3D génèrent des besoins en recrutement de techniciens certifiés, donc en formation Certibiocide. Démarcher les entreprises attributaires de ces marchés peut être une stratégie de développement commercial directe.</p>
</div>
</section>
</main>
<!-- FOOTER -->
<footer>
<p>&copy; 2026 NextGN Formation - Formations Certibiocide & Techniques</p>
<p style="margin-top: 10px; opacity: 0.6;">Tous droits réservés — Gauthier Chombart & Nathan Chauwin — Formateurs indépendants</p>
</footer>
<!-- PROGRESS BAR SCRIPT -->
<script>
window.addEventListener('scroll', () => {
const scrollTop = window.scrollY;
const docHeight = document.documentElement.scrollHeight - window.innerHeight;
const scrollPercent = (scrollTop / docHeight) * 100;
document.getElementById('progressBar').style.width = scrollPercent + '%';
});
</script>
</body>
</html>

View File

@@ -1,663 +0,0 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Veille Certibiocide — Semaine 22 | 25 au 31 mai 2026</title>
<meta name="description" content="Rapport de veille réglementaire et technique Certibiocide — Semaine 22, du 25 au 31 mai 2026. Réglementation biocides, marché formation, nuisibles, désinfection, BOAMP, innovation, Europe, RH." />
<style>
/* ── Reset & base ── */
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
html { scroll-behavior: smooth; }
body {
font-family: 'Segoe UI', system-ui, -apple-system, sans-serif;
font-size: 16px;
line-height: 1.7;
color: #1a1a2e;
background: #f7f8fc;
}
a { color: #2563eb; text-decoration: none; }
a:hover { text-decoration: underline; }
/* ── Header ── */
header {
background: linear-gradient(135deg, #1e3a5f 0%, #2563eb 100%);
color: #fff;
padding: 3rem 2rem 2.5rem;
text-align: center;
}
header .badge {
display: inline-block;
background: rgba(255,255,255,0.2);
border: 1px solid rgba(255,255,255,0.35);
border-radius: 999px;
padding: 0.25rem 1rem;
font-size: 0.8rem;
font-weight: 600;
letter-spacing: 0.08em;
text-transform: uppercase;
margin-bottom: 1rem;
}
header h1 { font-size: clamp(1.6rem, 4vw, 2.4rem); font-weight: 800; margin-bottom: 0.5rem; }
header p { font-size: 1rem; opacity: 0.85; }
/* ── Nav sommaire ── */
nav {
background: #fff;
border-bottom: 1px solid #e2e8f0;
padding: 0.75rem 2rem;
display: flex;
flex-wrap: wrap;
gap: 0.5rem 1.25rem;
justify-content: center;
position: sticky;
top: 0;
z-index: 100;
box-shadow: 0 1px 4px rgba(0,0,0,0.06);
}
nav a {
font-size: 0.82rem;
font-weight: 600;
color: #475569;
white-space: nowrap;
}
nav a:hover { color: #2563eb; text-decoration: none; }
/* ── Layout ── */
main {
max-width: 900px;
margin: 2rem auto;
padding: 0 1.25rem;
display: flex;
flex-direction: column;
gap: 1.75rem;
}
/* ── Attention box ── */
.attention-box {
background: #fff7ed;
border: 1px solid #fdba74;
border-left: 4px solid #f97316;
border-radius: 10px;
padding: 1.5rem 1.75rem;
}
.attention-box h2 {
font-size: 1rem;
font-weight: 800;
color: #9a3412;
margin-bottom: 1rem;
text-transform: uppercase;
letter-spacing: 0.05em;
}
.attention-items { display: flex; flex-direction: column; gap: 0.85rem; }
.attention-item {
display: flex;
gap: 0.75rem;
align-items: flex-start;
}
.attention-num {
flex-shrink: 0;
width: 1.6rem;
height: 1.6rem;
background: #f97316;
color: #fff;
border-radius: 50%;
font-size: 0.78rem;
font-weight: 800;
display: flex;
align-items: center;
justify-content: center;
margin-top: 0.15rem;
}
.attention-item p { font-size: 0.92rem; color: #7c2d12; }
.attention-item strong { color: #9a3412; }
/* ── Section cards ── */
section {
background: #fff;
border: 1px solid #e2e8f0;
border-radius: 12px;
overflow: hidden;
box-shadow: 0 1px 3px rgba(0,0,0,0.05);
}
.section-header {
display: flex;
align-items: center;
gap: 0.75rem;
padding: 1.1rem 1.5rem;
border-bottom: 1px solid #e2e8f0;
}
.section-emoji { font-size: 1.4rem; }
.section-header h2 {
font-size: 0.95rem;
font-weight: 800;
text-transform: uppercase;
letter-spacing: 0.06em;
color: #1e3a5f;
}
.section-header .section-sub {
font-size: 0.8rem;
font-weight: 500;
color: #94a3b8;
margin-left: auto;
}
/* ── News items ── */
.news-list { list-style: none; }
.news-item {
padding: 1.1rem 1.5rem;
border-bottom: 1px solid #f1f5f9;
display: grid;
grid-template-columns: auto 1fr;
gap: 0 1rem;
}
.news-item:last-child { border-bottom: none; }
.news-dot {
width: 8px;
height: 8px;
background: #2563eb;
border-radius: 50%;
margin-top: 0.6rem;
flex-shrink: 0;
}
.news-content {}
.news-source {
font-size: 0.78rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.05em;
color: #2563eb;
margin-bottom: 0.2rem;
}
.news-text { font-size: 0.92rem; color: #334155; margin-bottom: 0.3rem; }
.news-meta {
display: flex;
align-items: center;
gap: 0.75rem;
flex-wrap: wrap;
}
.news-date {
font-size: 0.75rem;
color: #94a3b8;
font-style: italic;
}
.news-link {
font-size: 0.75rem;
font-weight: 600;
color: #64748b;
border: 1px solid #e2e8f0;
border-radius: 4px;
padding: 0.1rem 0.5rem;
}
.news-link:hover { background: #f1f5f9; text-decoration: none; }
/* ── Warning note ── */
.note-warning {
margin: 0 1.5rem 1rem;
padding: 0.6rem 0.9rem;
background: #fefce8;
border: 1px solid #fde68a;
border-radius: 6px;
font-size: 0.8rem;
color: #92400e;
}
/* ── Footer ── */
footer {
text-align: center;
padding: 2.5rem 1rem;
color: #94a3b8;
font-size: 0.8rem;
border-top: 1px solid #e2e8f0;
margin-top: 1rem;
}
footer strong { color: #475569; }
/* ── Responsive ── */
@media (max-width: 600px) {
header { padding: 2rem 1rem 1.75rem; }
nav { padding: 0.6rem 1rem; gap: 0.4rem 0.9rem; }
.section-header, .news-item { padding-left: 1rem; padding-right: 1rem; }
}
</style>
</head>
<body>
<!-- ═══ HEADER ═══ -->
<header>
<div class="badge">Rapport de veille</div>
<h1>Veille Certibiocide — Semaine 22</h1>
<p>Semaine du 25 au 31 mai 2026 &nbsp;·&nbsp; 8 rubriques &nbsp;·&nbsp; Sources officielles prioritaires</p>
</header>
<!-- ═══ NAVIGATION ═══ -->
<nav aria-label="Sommaire">
<a href="#reglementaire">⚖️ Réglementaire</a>
<a href="#formation">🎓 Formation</a>
<a href="#nuisibles">🐀 Nuisibles</a>
<a href="#desinfection">🧴 Désinfection</a>
<a href="#opportunites">💡 Opportunités</a>
<a href="#innovation">🔬 Innovation</a>
<a href="#europe">🇪🇺 Europe</a>
<a href="#rh">👥 RH</a>
</nav>
<main>
<!-- ═══ POINTS D'ATTENTION ═══ -->
<div class="attention-box" id="attention">
<h2>📌 Points d'attention — Semaine 22</h2>
<div class="attention-items">
<div class="attention-item">
<div class="attention-num">1</div>
<p><strong>Deadline FAFCEA Qualiopi : 30 juin 2026.</strong> Dans 5 semaines, la période de souplesse prend fin. Tout organisme de formation non encore certifié Qualiopi perd l'accès aux financements FAFCEA au 1er juillet. Si la démarche est en cours, c'est le moment de finaliser.</p>
</div>
<div class="attention-item">
<div class="attention-num">2</div>
<p><strong>Échéance perturbateurs endocriniens au 31 décembre 2026.</strong> Des retraits de substances actives supplémentaires sont probables début 2027, dans la lignée du non-renouvellement de la cyperméthrine. À anticiper dans la mise à jour des supports de formation Certibiocide Nuisibles.</p>
</div>
<div class="attention-item">
<div class="attention-num">3</div>
<p><strong>94 appels d'offres BOAMP dératisation actifs.</strong> Le marché public 3D est très dynamique ce printemps. Les entreprises attributaires ont besoin de techniciens certifiés : opportunité de prospection directe auprès des entreprises 3D répondant à ces AO.</p>
</div>
</div>
</div>
<!-- ═══ 1. RÉGLEMENTAIRE ═══ -->
<section id="reglementaire">
<div class="section-header">
<span class="section-emoji">⚖️</span>
<h2>Réglementaire</h2>
<span class="section-sub">AMM · BPR · Certibiocide</span>
</div>
<ul class="news-list">
<li class="news-item">
<div class="news-dot"></div>
<div class="news-content">
<div class="news-source">ANSES / BioCID</div>
<p class="news-text">Le registre des AMM biocides recense 3 223 produits biocides autorisés en France (données sept. 2024, dernière actualisation publique disponible). Toute décision récente de mai 2026 est à consulter directement sur biocid-anses.fr — aucune nouvelle AMM ou retrait majeur n'a été identifié via sources ouvertes cette semaine.</p>
<div class="news-meta">
<span class="news-date">Permanent</span>
<a class="news-link" href="https://www.anses.fr/fr/decisions_biocide" target="_blank" rel="noopener">→ anses.fr</a>
</div>
</div>
</li>
<li class="news-item">
<div class="news-dot"></div>
<div class="news-content">
<div class="news-source">Services-Propreté</div>
<p class="news-text">Point de situation sur l'état de la réglementation biocides en France : rappel des obligations Certibiocide en vigueur depuis janvier 2026 et des procédures de vérification des habilitations pour les acheteurs professionnels.</p>
<div class="news-meta">
<span class="news-date">2026</span>
<a class="news-link" href="https://services-proprete.fr/technique-1/27682/ou-en-est-la-reglementation-biocides" target="_blank" rel="noopener">→ services-proprete.fr</a>
</div>
</div>
</li>
<li class="news-item">
<div class="news-dot"></div>
<div class="news-content">
<div class="news-source">ECHA — Perturbateurs endocriniens</div>
<p class="news-text">Pour un certain nombre de substances actives biocides, les données manquantes relatives aux propriétés de perturbation endocrinienne doivent être soumises aux autorités compétentes avant le <strong>31 décembre 2026</strong>. Échéance critique pour les formulateurs et acteurs de la chaîne biocides.</p>
<div class="news-meta">
<span class="news-date">Avant le 31 déc. 2026</span>
<a class="news-link" href="https://echa.europa.eu/fr/biocides" target="_blank" rel="noopener">→ echa.europa.eu</a>
</div>
</div>
</li>
</ul>
<p class="note-warning">⚠️ Aucune nouvelle AMM biocide spécifique à mai 2026 n'a pu être vérifiée via sources ouvertes cette semaine. Consulter directement <a href="https://biocid-anses.fr" target="_blank">BioCID</a> pour les décisions récentes.</p>
</section>
<!-- ═══ 2. FORMATION ═══ -->
<section id="formation">
<div class="section-header">
<span class="section-emoji">🎓</span>
<h2>Marché formation</h2>
<span class="section-sub">Qualiopi · CPF · OPCO</span>
</div>
<ul class="news-list">
<li class="news-item">
<div class="news-dot"></div>
<div class="news-content">
<div class="news-source">FAFCEA / Qualiopi — Fin de la période de souplesse</div>
<p class="news-text">La période de souplesse pour accéder aux financements FAFCEA sans Qualiopi se termine le <strong>30 juin 2026</strong>. À partir du 1er juillet 2026, aucun financement FAFCEA ne sera accordé sans certification Qualiopi valide. Point d'attention immédiat pour les formateurs indépendants.</p>
<div class="news-meta">
<span class="news-date">Deadline : 30 juin 2026</span>
<a class="news-link" href="https://csfc-federation.org/blog/qualiopi-devient-obligatoire-pour-les-financements-fafcea-des-2026/" target="_blank" rel="noopener">→ csfc-federation.org</a>
</div>
</div>
</li>
<li class="news-item">
<div class="news-dot"></div>
<div class="news-content">
<div class="news-source">France Compétences — Renouvellement instances Qualiopi</div>
<p class="news-text">Les 8 instances de labellisation habilitées à délivrer la certification Qualiopi ont été renouvelées pour 3 ans à compter du 1er janvier 2026 (validité jusqu'en 2028). Stabilité du dispositif de certification garantie pour les organismes en cours d'audit.</p>
<div class="news-meta">
<span class="news-date">Janvier 2026</span>
<a class="news-link" href="https://www.digi-certif.com/debut-2026-quelles-actualites-pour-la-formation-pro-et-qualiopi/" target="_blank" rel="noopener">→ digi-certif.com</a>
</div>
</div>
</li>
<li class="news-item">
<div class="news-dot"></div>
<div class="news-content">
<div class="news-source">OPCO / Urssaf — Nouvelle option de collecte</div>
<p class="news-text">Depuis janvier 2026, les branches professionnelles peuvent choisir de confier la collecte de leurs contributions conventionnelles de formation aux Urssaf plutôt qu'à leur OPCO. Ce changement peut modifier les circuits de financement des formations sectorielles, dont le Certibiocide.</p>
<div class="news-meta">
<span class="news-date">Janvier 2026</span>
<a class="news-link" href="https://www.starthack.fr/financement-de-la-formation-professionnelle-en-2026-opco-budgets-et-obligations-des-centres-de-formation/" target="_blank" rel="noopener">→ starthack.fr</a>
</div>
</div>
</li>
<li class="news-item">
<div class="news-dot"></div>
<div class="news-content">
<div class="news-source">Centre Inffo</div>
<p class="news-text">Centre Inffo qualifie 2026 d'« annus horribilis » pour la formation professionnelle : multiplication des contrôles post-loi anti-fraude, tensions budgétaires chez les financeurs, durcissement réglementaire. Un contexte qui pèse sur les petits organismes mais valorise ceux bien structurés.</p>
<div class="news-meta">
<span class="news-date">2026</span>
<a class="news-link" href="https://www.centre-inffo.fr/site-centre-inffo/actualites-centre-inffo/le-quotidien-de-la-formation-actualite-formation-professionnelle-apprentissage/actualites-2026/2026-annus-horribilis-pour-la-formation-professionnelle" target="_blank" rel="noopener">→ centre-inffo.fr</a>
</div>
</div>
</li>
</ul>
</section>
<!-- ═══ 3. NUISIBLES ═══ -->
<section id="nuisibles">
<div class="section-header">
<span class="section-emoji">🐀</span>
<h2>Nuisibles &amp; ESOD</h2>
<span class="section-sub">Moustique tigre · Frelon · Rongeurs · Punaises</span>
</div>
<ul class="news-list">
<li class="news-item">
<div class="news-dot"></div>
<div class="news-content">
<div class="news-source">Santé Publique France / ANSES</div>
<p class="news-text">Le moustique tigre colonise désormais environ <strong>90 départements</strong> métropolitains. Le plan national de lutte lancé en mars 2026 mobilise les plateformes de signalement officielles (<a href="https://signalement-moustique.anses.fr" target="_blank">signalement-moustique.anses.fr</a>, <a href="https://frelonasiatique.mnhn.fr" target="_blank">frelonasiatique.mnhn.fr</a>). La saison de surveillance est officiellement activée pour l'été 2026.</p>
<div class="news-meta">
<span class="news-date">Printemps-été 2026</span>
<a class="news-link" href="https://www.santepubliquefrance.fr/en/press/2026-stepped-efforts-combat-tiger-mosquito-activation-surveillance-and-control-system" target="_blank" rel="noopener">→ santepubliquefrance.fr</a>
</div>
</div>
</li>
<li class="news-item">
<div class="news-dot"></div>
<div class="news-content">
<div class="news-source">Vespikill — Prototypes 2026 frelon asiatique</div>
<p class="news-text">Vespikill, spécialiste du piégeage du frelon asiatique, annonce la présentation exclusive de prototypes de pièges 2026. Le frelon asiatique est présent dans plus de 70 départements français, avec des enjeux apicoles et de sécurité publique croissants.</p>
<div class="news-meta">
<span class="news-date">Printemps 2026</span>
<a class="news-link" href="https://www.application-iot.fr/industrie-4-0/les-pieges-connectes-revolutionnent-la-gestion-des-nuisibles-dans-lindustrie-alimentaire/" target="_blank" rel="noopener">→ application-iot.fr</a>
</div>
</div>
</li>
<li class="news-item">
<div class="news-dot"></div>
<div class="news-content">
<div class="news-source">Lyon Capitale — Espèces invasives</div>
<p class="news-text">Le débat sur les moyens de lutte contre les espèces invasives est relancé dans les collectivités. La tension entre approches chimiques et alternatives biologiques/mécaniques alimente les discussions sur l'évolution des pratiques 3D.</p>
<div class="news-meta">
<span class="news-date">Printemps 2026</span>
<a class="news-link" href="https://www.lyoncapitale.fr/actualite/lyon-la-guerre-contre-les-especes-invasives-aura-t-elle-lieu" target="_blank" rel="noopener">→ lyoncapitale.fr</a>
</div>
</div>
</li>
</ul>
<p class="note-warning">⚠️ Aucune donnée spécifique et vérifiée sur les rongeurs résistants ou les punaises de lit n'a été identifiée cette semaine via sources officielles.</p>
</section>
<!-- ═══ 4. DÉSINFECTION ═══ -->
<section id="desinfection">
<div class="section-header">
<span class="section-emoji">🧴</span>
<h2>Désinfection</h2>
<span class="section-sub">Normes AFNOR · Produits homologués · Alternatives</span>
</div>
<ul class="news-list">
<li class="news-item">
<div class="news-dot"></div>
<div class="news-content">
<div class="news-source">AFNOR — NF EN 14476 (virucide)</div>
<p class="news-text">La norme NF EN 14476 évalue l'efficacité virucide des désinfectants chimiques et antiseptiques. Norme incontournable pour les produits de type TP2 et TP1 utilisés en milieux sensibles (santé, agroalimentaire). Complète la famille NF EN 1276 (bactéricides) et NF EN 1650 (fongicides).</p>
<div class="news-meta">
<span class="news-date">En vigueur</span>
<a class="news-link" href="https://www.boutique.afnor.org/en-gb/standard/nf-en-14476/chemical-disinfectants-and-antiseptics-quantitative-suspension-test-for-the/fa166895/1398" target="_blank" rel="noopener">→ boutique.afnor.org</a>
</div>
</div>
</li>
<li class="news-item">
<div class="news-dot"></div>
<div class="news-content">
<div class="news-source">AFNOR — Consultation NF U43-500</div>
<p class="news-text">La révision de la norme NF U43-500 sur les bonnes pratiques d'application des produits phytosanitaires et biocides est toujours en phase de consultation. Son adoption pourrait modifier les exigences de formation pour les applicateurs professionnels.</p>
<div class="news-meta">
<span class="news-date">En cours de révision</span>
<a class="news-link" href="https://norminfo.afnor.org/consultation/nf-u43-500/bonnes-pratiques-dapplication-des-produits-phytosanitaires-et-biocides-maitrise-des-applications-de-produits-phytosanitaires/108423" target="_blank" rel="noopener">→ norminfo.afnor.org</a>
</div>
</div>
</li>
<li class="news-item">
<div class="news-dot"></div>
<div class="news-content">
<div class="news-source">ProdHYBase</div>
<p class="news-text">ProdHYBase reste la base de données de référence pour consulter les normes applicables aux désinfectants en France (bactéricides, fongicides, virucides, sporicides). Outil à recommander systématiquement aux stagiaires Certibiocide Désinfectants.</p>
<div class="news-meta">
<span class="news-date">Référence permanente</span>
<a class="news-link" href="https://www.prodhybase.fr/norme_generalite.html" target="_blank" rel="noopener">→ prodhybase.fr</a>
</div>
</div>
</li>
</ul>
</section>
<!-- ═══ 5. OPPORTUNITÉS ═══ -->
<section id="opportunites">
<div class="section-header">
<span class="section-emoji">💡</span>
<h2>Opportunités</h2>
<span class="section-sub">BOAMP · CPF · Secteurs demandeurs</span>
</div>
<ul class="news-list">
<li class="news-item">
<div class="news-dot"></div>
<div class="news-content">
<div class="news-source">BOAMP — Le Cannet (06) · réf. 3/BOAMP/2612774</div>
<p class="news-text">Marché de dératisation, désinsectisation, démoustication et désinfection du domaine public et privé de la ville du Cannet, en 2 lots. Nouvelle consultation 2026 non identifiée les semaines précédentes.</p>
<div class="news-meta">
<span class="news-date">2026</span>
<a class="news-link" href="https://www.francemarches.com/appel-offre/3boamp2612774-2026-2025-deratisation-desinsectisation" target="_blank" rel="noopener">→ francemarches.com</a>
</div>
</div>
</li>
<li class="news-item">
<div class="news-dot"></div>
<div class="news-content">
<div class="news-source">BOAMP — Prestations 3D · réf. 3/BOAMP/2623657</div>
<p class="news-text">Nouveau marché de prestations de dératisation et désinsectisation référencé sur francemarches.com. S'ajoute aux marchés déjà identifiés les semaines précédentes (Oise, Carrières-sous-Poissy, EPMO-VGE).</p>
<div class="news-meta">
<span class="news-date">2026</span>
<a class="news-link" href="https://www.francemarches.com/appel-offre/3boamp2623657-2026-prestations-deratisation-desinsectisation" target="_blank" rel="noopener">→ francemarches.com</a>
</div>
</div>
</li>
<li class="news-item">
<div class="news-dot"></div>
<div class="news-content">
<div class="news-source">Francemarches.com — Baromètre marchés publics 3D</div>
<p class="news-text"><strong>94 appels d'offres</strong> publics en cours sur le mot-clé « dératisation » (81 pour « dératisation-désinsectisation »). Signal fort d'un marché public 3D très actif au printemps 2026.</p>
<div class="news-meta">
<span class="news-date">Mai 2026</span>
<a class="news-link" href="https://www.francemarches.com/appels-offre/deratisation" target="_blank" rel="noopener">→ francemarches.com</a>
</div>
</div>
</li>
</ul>
<p class="note-warning">⚠️ Aucun appel d'offres spécifique à la formation Certibiocide ou 3D n'a été identifié cette semaine sur BOAMP.</p>
</section>
<!-- ═══ 6. INNOVATION ═══ -->
<section id="innovation">
<div class="section-header">
<span class="section-emoji">🔬</span>
<h2>Innovation</h2>
<span class="section-sub">Bioinsecticides · IoT · IA · Brevets</span>
</div>
<ul class="news-list">
<li class="news-item">
<div class="news-dot"></div>
<div class="news-content">
<div class="news-source">Biocinov / Hamelin — Piège connecté rongeur</div>
<p class="news-text">Le piège connecté rongeur de Biocinov est présenté comme un outil de référence pour la lutte contre les rongeurs en milieu industriel et agroalimentaire : détection en temps réel, alertes automatisées, réduction des visites de contrôle inutiles et diminution de l'usage de rodenticides.</p>
<div class="news-meta">
<span class="news-date">2026</span>
<a class="news-link" href="https://www.hamelin.info/actus/partenaire/piege-connecte-rongeur-biocinov/" target="_blank" rel="noopener">→ hamelin.info</a>
</div>
</div>
</li>
<li class="news-item">
<div class="news-dot"></div>
<div class="news-content">
<div class="news-source">APA — Innovations en désinsectisation</div>
<p class="news-text">Passage en revue des innovations technologiques récentes en désinsectisation : pièges UV connectés, systèmes de détection thermique, diffuseurs automatiques et traitements ciblés par IA. Tendance de fond vers la réduction des biocides chimiques.</p>
<div class="news-meta">
<span class="news-date">2026</span>
<a class="news-link" href="https://www.a-p-a.fr/les-innovations-technologiques-en-desinsectisation/" target="_blank" rel="noopener">→ a-p-a.fr</a>
</div>
</div>
</li>
<li class="news-item">
<div class="news-dot"></div>
<div class="news-content">
<div class="news-source">PubMed / NCBI — Pièges non-insecticides</div>
<p class="news-text">Une étude publiée en 2026 démontre que les pièges non-insecticides en intérieur peuvent compléter efficacement les moustiquaires imprégnées pour cibler les vecteurs de maladies résistants aux insecticides. Résultat transposable à la lutte contre les moustiques tigres résistants.</p>
<div class="news-meta">
<span class="news-date">2026</span>
<a class="news-link" href="https://www.ncbi.nlm.nih.gov/pmc/articles/PMC12063245/" target="_blank" rel="noopener">→ ncbi.nlm.nih.gov</a>
</div>
</div>
</li>
<li class="news-item">
<div class="news-dot"></div>
<div class="news-content">
<div class="news-source">Anticimex — Centre d'innovation mondial</div>
<p class="news-text">Plus de 120 brevets déposés dans le monde par Anticimex, avec un centre d'innovation dédié aux solutions connectées et autonomes. Référence sectorielle à intégrer dans les formations pour illustrer l'évolution des pratiques métier 3D.</p>
<div class="news-meta">
<span class="news-date">2026</span>
<a class="news-link" href="https://www.anticimex.ch/fr/sur-anticimex/centre-innovation-anticimex/" target="_blank" rel="noopener">→ anticimex.ch</a>
</div>
</div>
</li>
</ul>
</section>
<!-- ═══ 7. EUROPE ═══ -->
<section id="europe">
<div class="section-header">
<span class="section-emoji">🇪🇺</span>
<h2>Veille européenne</h2>
<span class="section-sub">BPR · EFSA · Résistances</span>
</div>
<ul class="news-list">
<li class="news-item">
<div class="news-dot"></div>
<div class="news-content">
<div class="news-source">Commission européenne — Évaluation BPR en cours</div>
<p class="news-text">L'évaluation formelle du BPR (n°528/2012), lancée au Q4 2025, se poursuit. Elle porte sur la performance globale du règlement et pourrait déboucher sur une révision législative majeure impactant l'ensemble des types de produits biocides. Résultats attendus courant 2026-2027.</p>
<div class="news-meta">
<span class="news-date">Q4 2025 en cours</span>
<a class="news-link" href="https://health.ec.europa.eu/biocides/regulation/evaluation-biocidal-products-regulation_en" target="_blank" rel="noopener">→ health.ec.europa.eu</a>
</div>
</div>
</li>
<li class="news-item">
<div class="news-dot"></div>
<div class="news-content">
<div class="news-source">ECHA / EFSA — Guidance eau potable, obligatoire depuis avril 2026</div>
<p class="news-text">Depuis le 1er avril 2026, la guidance conjointe ECHA/EFSA sur les résidus de substances actives dans l'eau potable est obligatoire pour toutes les nouvelles soumissions BPR. Impact direct sur les types TP11 et TP12 (systèmes de refroidissement, fluides de traitement).</p>
<div class="news-meta">
<span class="news-date">Depuis avril 2026</span>
<a class="news-link" href="https://www.cehtra.com/fr/post/interaction-entre-la-directive-eau-potable-ue-2020-2184-et-le-r%C3%A8glement-biocides-bpr" target="_blank" rel="noopener">→ cehtra.com</a>
</div>
</div>
</li>
<li class="news-item">
<div class="news-dot"></div>
<div class="news-content">
<div class="news-source">EUON / ECHA — BPR et nanomatériaux</div>
<p class="news-text">L'Observatoire européen des nanomatériaux publie des analyses sur l'encadrement des nanomatériaux dans le cadre du BPR. Sujet émergent à surveiller pour les biocides de nouvelle génération susceptibles de contenir des nano-agents actifs.</p>
<div class="news-meta">
<span class="news-date">2026</span>
<a class="news-link" href="https://euon.echa.europa.eu/fr/the-biocidal-products-regulation-bpr-and-nanomaterials" target="_blank" rel="noopener">→ euon.echa.europa.eu</a>
</div>
</div>
</li>
<li class="news-item">
<div class="news-dot"></div>
<div class="news-content">
<div class="news-source">ECHA — Échéance perturbateurs endocriniens</div>
<p class="news-text">Rappel de l'échéance du <strong>31 décembre 2026</strong> pour la soumission des données sur les propriétés de perturbation endocrinienne de certaines substances actives biocides. Les dossiers incomplets risquent le non-renouvellement d'approbation avec effet sur les produits formulés.</p>
<div class="news-meta">
<span class="news-date">Avant le 31 déc. 2026</span>
<a class="news-link" href="https://echa.europa.eu/fr/biocides" target="_blank" rel="noopener">→ echa.europa.eu</a>
</div>
</div>
</li>
</ul>
</section>
<!-- ═══ 8. RH ═══ -->
<section id="rh">
<div class="section-header">
<span class="section-emoji">👥</span>
<h2>RH &amp; Concurrence</h2>
<span class="section-sub">Emploi 3D · Certifications RNCP</span>
</div>
<ul class="news-list">
<li class="news-item">
<div class="news-dot"></div>
<div class="news-content">
<div class="news-source">SAD'S INTERIM — CDI Technicien 3D</div>
<p class="news-text">Offre de CDI pour un technicien dératisation-désinsectisation-désinfection, avec Certibiocide requis. Confirmation que le Certibiocide est désormais un prérequis systématique dans les fiches de poste du secteur 3D, y compris en intérim.</p>
<div class="news-meta">
<span class="news-date">2026</span>
<a class="news-link" href="https://www.sads-interim.eu/emploi/cdi-technicien-deratisa-azwwd2kpnr/" target="_blank" rel="noopener">→ sads-interim.eu</a>
</div>
</div>
</li>
<li class="news-item">
<div class="news-dot"></div>
<div class="news-content">
<div class="news-source">ISTAV — Journées techniques 3D</div>
<p class="news-text">ISTAV propose des journées techniques spécialisées 3D tout au long de 2026, destinées aux professionnels souhaitant se mettre à jour sur les techniques et réglementations. Format complémentaire aux formations Certibiocide initiales.</p>
<div class="news-meta">
<span class="news-date">2026</span>
<a class="news-link" href="https://istav.fr/journees-techniques-3d/" target="_blank" rel="noopener">→ istav.fr</a>
</div>
</div>
</li>
<li class="news-item">
<div class="news-dot"></div>
<div class="news-content">
<div class="news-source">CertifAgri — Formation technicien 3D</div>
<p class="news-text">CertifAgri propose une formation de technicien en désinfection, désinsectisation et dératisation articulée autour des exigences RNCP et du Certibiocide. Concurrent direct à surveiller pour le positionnement pédagogique sur ce segment.</p>
<div class="news-meta">
<span class="news-date">2026</span>
<a class="news-link" href="https://www.certif-agri.com/formations/metiers/technicien-en-desinfection-desinsectisation-et-deratisation-3d/" target="_blank" rel="noopener">→ certif-agri.com</a>
</div>
</div>
</li>
</ul>
</section>
</main>
<!-- ═══ FOOTER ═══ -->
<footer>
<p>Rapport généré le <strong>25 mai 2026</strong> — Sources : ANSES, ECHA, Légifrance, France Compétences, Santé Publique France, AFNOR, BOAMP</p>
<p style="margin-top:0.4rem;">Ce rapport est à usage informatif. Vérifier les informations auprès des sources officielles avant toute décision.</p>
</footer>
</body>
</html>

View File

@@ -1,521 +0,0 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Index Veille Certibiocide - Archives & Rapports</title>
<link href="https://fonts.googleapis.com/css2?family=Syne:wght@400;600;700;800&family=DM+Sans:ital,wght@0,300;0,400;0,500;1,300&display=swap" rel="stylesheet">
<style>
:root {
--teal: #0F6E56;
--teal-mid: #1D9E75;
--teal-light: #E1F5EE;
--amber: #BA7517;
--amber-light: #FAEEDA;
--amber-dark: #633806;
--coral: #993C1D;
--coral-mid: #D85A30;
--coral-light: #FAECE7;
--purple: #534AB7;
--purple-light: #EEEDFE;
--blue: #185FA5;
--blue-light: #E6F1FB;
--bg: #F7F6F2;
--white: #FFFFFF;
--text: #1a1a18;
--text-muted: #6b6a65;
--border: rgba(0,0,0,0.1);
}
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}
html, body {
height: 100%;
}
body {
font-family: 'DM Sans', sans-serif;
background: var(--bg);
color: var(--text);
line-height: 1.6;
padding-top: 70px;
}
/* ===== HEADER FIXE ===== */
header {
position: fixed;
top: 0;
left: 0;
right: 0;
height: 70px;
background: rgba(255, 255, 255, 0.95);
backdrop-filter: blur(10px);
border-bottom: 2px solid var(--purple);
z-index: 1000;
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 2rem;
}
.logo {
font-family: 'Syne', sans-serif;
font-size: 16px;
font-weight: 700;
letter-spacing: -0.5px;
background: linear-gradient(135deg, var(--teal-mid), var(--coral-mid));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
text-decoration: none;
}
nav {
display: flex;
gap: 2rem;
}
nav a {
font-family: 'Syne', sans-serif;
font-size: 11px;
font-weight: 700;
letter-spacing: 0.08em;
text-transform: uppercase;
text-decoration: none;
color: var(--text-muted);
transition: color 0.3s ease;
}
nav a:hover {
color: var(--purple);
}
/* ===== PROGRESS BAR ===== */
.progress {
position: fixed;
top: 70px;
left: 0;
right: 0;
height: 3px;
background: var(--border);
z-index: 999;
}
.progress-bar {
height: 100%;
background: var(--purple);
width: 0%;
transition: width 0.3s ease;
}
/* ===== MAIN CONTENT ===== */
main {
max-width: 1100px;
margin: 0 auto;
padding: 3rem 2rem;
}
.section {
margin-bottom: 3rem;
animation: fadeIn 0.6s ease-out;
}
@keyframes fadeIn {
from {
opacity: 0;
transform: translateY(10px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
/* ===== PAGE HEADER ===== */
.page-header {
background: var(--amber-light);
border-left: 4px solid var(--purple);
border-radius: 8px;
padding: 2rem;
margin-bottom: 2rem;
}
.page-header h1 {
font-family: 'Syne', sans-serif;
font-size: 2.2rem;
font-weight: 800;
color: var(--text);
margin-bottom: 0.5rem;
}
.page-header p {
font-size: 0.95rem;
color: var(--text-muted);
line-height: 1.7;
}
/* ===== CONTENT SECTIONS ===== */
h2 {
font-family: 'Syne', sans-serif;
font-size: 1.6rem;
font-weight: 700;
color: var(--text);
margin-bottom: 1.5rem;
margin-top: 2.5rem;
padding-bottom: 0.75rem;
border-bottom: 3px solid var(--purple);
}
h3 {
font-family: 'Syne', sans-serif;
font-size: 1.1rem;
font-weight: 700;
color: var(--text);
margin-top: 1.5rem;
margin-bottom: 1rem;
}
/* ===== RAPPORTS GRID ===== */
.rapports-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 1.5rem;
margin-bottom: 2rem;
}
.rapport-card {
background: var(--white);
border: 2px solid var(--amber-light);
border-radius: 8px;
padding: 1.5rem;
transition: all 0.3s ease;
cursor: pointer;
text-decoration: none;
display: flex;
flex-direction: column;
height: 100%;
}
.rapport-card:hover {
border-color: var(--purple);
box-shadow: 0 12px 32px rgba(186, 117, 23, 0.15);
transform: translateY(-4px);
}
.rapport-semaine {
font-family: 'Syne', sans-serif;
font-size: 1.3rem;
font-weight: 700;
color: var(--purple);
margin-bottom: 0.5rem;
}
.rapport-date {
font-size: 0.85rem;
color: var(--text-muted);
font-weight: 500;
margin-bottom: 1rem;
}
.rapport-desc {
font-size: 0.9rem;
color: var(--text);
line-height: 1.6;
flex-grow: 1;
margin-bottom: 1rem;
}
.rapport-btn {
display: inline-flex;
align-items: center;
gap: 8px;
font-family: 'Syne', sans-serif;
font-size: 12px;
font-weight: 700;
letter-spacing: 0.05em;
color: var(--purple);
text-decoration: none;
transition: gap 0.3s ease;
margin-top: auto;
width: fit-content;
}
.rapport-btn:hover {
gap: 12px;
}
/* ===== RUBRIQUES EXPLICATIVES ===== */
.rubriques-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 1.5rem;
margin: 2rem 0;
}
.rubrique-card {
background: var(--white);
border: 1px solid var(--border);
border-radius: 8px;
padding: 1.5rem;
transition: all 0.3s ease;
}
.rubrique-card:hover {
transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);
}
.rubrique-icon {
font-size: 1.8rem;
margin-bottom: 0.75rem;
}
.rubrique-title {
font-family: 'Syne', sans-serif;
font-size: 1rem;
font-weight: 700;
color: var(--text);
margin-bottom: 0.5rem;
}
.rubrique-desc {
font-size: 0.85rem;
color: var(--text-muted);
line-height: 1.6;
}
/* ===== FOOTER ===== */
footer {
background: var(--text);
color: var(--white);
padding: 2.5rem;
text-align: center;
font-size: 13px;
margin-top: 4rem;
border-top: 1px solid var(--border);
}
footer p {
margin-bottom: 0.5rem;
}
footer p:last-child {
opacity: 0.6;
font-size: 12px;
margin-top: 0.5rem;
}
/* ===== RESPONSIVE ===== */
@media (max-width: 768px) {
header {
padding: 0 1rem;
}
nav {
gap: 1rem;
}
nav a {
font-size: 9px;
}
main {
padding: 2rem 1rem;
}
.page-header h1 {
font-size: 1.8rem;
}
h2 {
font-size: 1.3rem;
}
.rapports-grid {
grid-template-columns: 1fr;
}
.rubriques-grid {
grid-template-columns: 1fr;
}
}
</style>
</head>
<body>
<!-- PROGRESS BAR -->
<div class="progress">
<div class="progress-bar" id="progressBar"></div>
</div>
<!-- HEADER -->
<header>
<div class="logo">NextGN Formation</div>
<nav>
<a href="#formations">Exercices interactifs</a>
<a href="#documentation">Documentation</a>
<a href="#rapports">Rapports de veille</a>
<a href="#about">À propos</a>
<a href="#contact">Contact</a>
</nav>
</header>
<!-- MAIN CONTENT -->
<main>
<!-- PAGE HEADER -->
<section class="page-header">
<h1>📚 Index Veille Certibiocide</h1>
<p>Accédez à l'ensemble des rapports de veille hebdomadaires, analysant l'actualité réglementaire, les opportunités de marché et les tendances du secteur Certibiocide. Chaque rapport synthétise 8 rubriques thématiques.</p>
</section>
<!-- RAPPORTS RÉCENTS -->
<section class="section">
<h2>📊 Rapports Récents</h2>
<p style="color: var(--text-muted); margin-bottom: 1.5rem;">Consultez les derniers rapports de veille, mis à jour chaque semaine.</p>
<div class="rapports-grid">
<!-- Semaine 21 -->
<a href="rapport-semaine-21.html" class="rapport-card">
<div class="rapport-semaine">Semaine 21</div>
<div class="rapport-date">18-24 mai 2026</div>
<div class="rapport-desc">
Loi anti-fraude formation adoptée, non-renouvellement cyperméthrine, appels d'offres BOAMP, marché emploi dynamique (125+ postes).
</div>
<span class="rapport-btn">Consulter →</span>
</a>
<!-- Semaine 20 -->
<a href="rapport-semaine-20.html" class="rapport-card">
<div class="rapport-semaine">Semaine 20</div>
<div class="rapport-date">11-17 mai 2026</div>
<div class="rapport-desc">
Actualisation réglementaire, marché formation, surveillance nuisibles invasifs, opportunités secteur 3D, et tendances innovation.
</div>
<span class="rapport-btn">Consulter →</span>
</a>
</div>
</section>
<!-- EXPLICATION RUBRIQUES -->
<section class="section">
<h2>🎯 8 Rubriques Thématiques Couvertes</h2>
<p style="color: var(--text-muted); margin-bottom: 1.5rem;">Chaque rapport synthétise l'actualité sur ces 8 axes clés du secteur Certibiocide.</p>
<div class="rubriques-grid">
<!-- Réglementaire -->
<div class="rubrique-card">
<div class="rubrique-icon">⚖️</div>
<div class="rubrique-title">Réglementaire</div>
<div class="rubrique-desc">AMM, retraits, BPR, obligations Certibiocide, directives ECHA, évolutions légales France et Europe.</div>
</div>
<!-- Marché Formation -->
<div class="rubrique-card">
<div class="rubrique-icon">🎓</div>
<div class="rubrique-title">Marché Formation</div>
<div class="rubrique-desc">Qualiopi, CPF, OPCO, chiffres clés du marché formation, financements, réglementations des organismes.</div>
</div>
<!-- Nuisibles & ESOD -->
<div class="rubrique-card">
<div class="rubrique-icon">🐀</div>
<div class="rubrique-title">Nuisibles & ESOD</div>
<div class="rubrique-desc">Moustique tigre, frelon asiatique, rongeurs résistants, punaises de lit, espèces invasives, surveillance.</div>
</div>
<!-- Désinfection -->
<div class="rubrique-card">
<div class="rubrique-icon">🧴</div>
<div class="rubrique-title">Désinfection</div>
<div class="rubrique-desc">Normes AFNOR, produits homologués, protocoles de désinfection, alternatives aux biocides chimiques.</div>
</div>
<!-- Opportunités -->
<div class="rubrique-card">
<div class="rubrique-icon">💡</div>
<div class="rubrique-title">Opportunités</div>
<div class="rubrique-desc">Appels d'offres BOAMP, marchés publics 3D, CPF, secteurs demandeurs, niches commerciales.</div>
</div>
<!-- Innovation -->
<div class="rubrique-card">
<div class="rubrique-icon">🔬</div>
<div class="rubrique-title">Innovation</div>
<div class="rubrique-desc">Bioinsecticides, IoT, IA, brevets, lutte biologique, solutions connectées, tendances technologiques.</div>
</div>
<!-- Veille Européenne -->
<div class="rubrique-card">
<div class="rubrique-icon">🇪🇺</div>
<div class="rubrique-title">Veille Européenne</div>
<div class="rubrique-desc">Révision BPR, EFSA, OMS, résistances insecticides, harmonisation EU, benchmarking international.</div>
</div>
<!-- RH & Concurrence -->
<div class="rubrique-card">
<div class="rubrique-icon">👥</div>
<div class="rubrique-title">RH & Concurrence</div>
<div class="rubrique-desc">Offres d'emploi 3D, mouvements du secteur, certifications RNCP, tendances RH, analyses concurrentielles.</div>
</div>
</div>
</section>
<!-- COMMENT UTILISER -->
<section class="section">
<h2>📖 Comment Utiliser Cette Veille</h2>
<div style="background: var(--blue-light); border-left: 4px solid var(--blue); border-radius: 8px; padding: 1.5rem; margin: 1.5rem 0;">
<h3 style="margin-top: 0; color: var(--blue);">Pour Formateurs Indépendants</h3>
<p style="margin-bottom: 0.75rem;"><strong>Mettre à jour vos supports :</strong> Les rapports signalent les changements réglementaires (ex: non-renouvellement cyperméthrine) qui doivent être intégrés dans vos formations Certibiocide.</p>
<p style="margin-bottom: 0.75rem;"><strong>Identifier les opportunités commerciales :</strong> Les appels d'offres BOAMP et marchés publics 3D génèrent des besoins en formation.</p>
<p style="margin-bottom: 0.75rem;"><strong>Anticiper les tendances marché :</strong> Comprenez les évolutions de l'emploi 3D, les niches en croissance (innovation, bioinsecticides) et adaptez vos offres.</p>
<p style="margin-bottom: 0;"><strong>Enrichir vos cas d'étude :</strong> Les actualités réglementaires et sectorielles fournissent des matériaux pédagogiques pertinents et actualisés.</p>
</div>
<div style="background: var(--green-light); border-left: 4px solid var(--green); border-radius: 8px; padding: 1.5rem; margin: 1.5rem 0;">
<h3 style="margin-top: 0; color: var(--green);">Pour Professionnels 3D</h3>
<p style="margin-bottom: 0.75rem;"><strong>Rester à jour réglementairement :</strong> Connaissance des changements d'AMM, substances actives interdites, nouvelles obligations de formation.</p>
<p style="margin-bottom: 0.75rem;"><strong>Adapter votre stratégie commerciale :</strong> Identifier les appels d'offres, les nouveaux secteurs demandeurs, les marchés publics.</p>
<p style="margin-bottom: 0.75rem;"><strong>Suivre l'innovation :</strong> Découvrir les nouvelles solutions (IoT, IA, lutte biologique) pour différencier votre offre.</p>
<p style="margin-bottom: 0;"><strong>Planifier vos recrutements :</strong> Anticiper les besoins en certifications, formations, et compétences spécialisées.</p>
</div>
</section>
<!-- FRÉQUENCE & SOURCES -->
<section class="section">
<h2>📅 Fréquence & Sources</h2>
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 1.5rem;">
<div style="background: var(--white); border: 1px solid var(--border); border-radius: 8px; padding: 1.5rem;">
<h3 style="margin-top: 0;">Mise à Jour Hebdomadaire</h3>
<p style="margin: 0; color: var(--text-muted); font-size: 0.9rem;">Chaque semaine, une nouvelle synthèse de 8 rubriques est générée, couvrant les 7 jours précédents. Les archives complètes restent accessibles pour historique et recherche.</p>
</div>
<div style="background: var(--white); border: 1px solid var(--border); border-radius: 8px; padding: 1.5rem;">
<h3 style="margin-top: 0;">Sources Officielles</h3>
<p style="margin: 0; color: var(--text-muted); font-size: 0.9rem;">ANSES, ECHA, Légifrance, France Compétences, INRAE, Santé Publique France, Commission Européenne, presse professionnelle certifiée.</p>
</div>
</div>
</section>
</main>
<!-- FOOTER -->
<footer>
<p>&copy; 2024 NextGN Formation - Index Veille Certibiocide</p>
<p>Tous droits réservés - Formateur indépendant spécialisé en Certibiocide et formations techniques</p>
</footer>
<!-- PROGRESS BAR SCRIPT -->
<script>
window.addEventListener('scroll', () => {
const scrollTop = window.scrollY;
const docHeight = document.documentElement.scrollHeight - window.innerHeight;
const scrollPercent = (scrollTop / docHeight) * 100;
document.getElementById('progressBar').style.width = scrollPercent + '%';
});
</script>
</body>
</html>

View File

@@ -1,256 +0,0 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Veille Hygiène & Pest Control</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', sans-serif;
background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
min-height: 100vh;
padding: 20px;
}
.container {
max-width: 1200px;
margin: 0 auto;
background: white;
border-radius: 12px;
box-shadow: 0 10px 40px rgba(0,0,0,0.1);
padding: 40px;
}
.header {
margin-bottom: 40px;
border-bottom: 3px solid #2c3e50;
padding-bottom: 20px;
}
.header h1 {
font-size: 32px;
color: #2c3e50;
margin-bottom: 8px;
}
.header p {
color: #7f8c8d;
font-size: 14px;
}
.grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 24px;
margin-bottom: 30px;
}
.card {
background: #f8f9fa;
border: 1px solid #e0e0e0;
border-radius: 8px;
padding: 24px;
transition: all 0.3s ease;
}
.card:hover {
box-shadow: 0 8px 24px rgba(0,0,0,0.12);
transform: translateY(-2px);
border-color: #3498db;
}
.card-header {
display: flex;
align-items: center;
gap: 12px;
margin-bottom: 16px;
}
.card-icon {
font-size: 28px;
}
.card h3 {
font-size: 16px;
color: #2c3e50;
font-weight: 600;
}
.card ul {
list-style: none;
padding: 0;
}
.card li {
margin-bottom: 12px;
font-size: 13px;
color: #555;
line-height: 1.6;
padding-left: 0;
}
.card strong {
color: #2c3e50;
display: block;
margin-bottom: 2px;
}
.footer {
background: #ecf0f1;
border-radius: 8px;
padding: 16px;
margin-bottom: 24px;
}
.footer p {
font-size: 12px;
color: #7f8c8d;
margin: 0;
}
.footer strong {
color: #2c3e50;
}
.buttons {
display: flex;
gap: 12px;
flex-wrap: wrap;
}
button {
padding: 10px 16px;
border: 1px solid #bdc3c7;
background: white;
border-radius: 6px;
font-size: 13px;
color: #2c3e50;
cursor: pointer;
transition: all 0.2s ease;
}
button:hover {
border-color: #3498db;
background: #ecf4f9;
color: #2980b9;
}
.date {
font-size: 12px;
color: #95a5a6;
margin-top: 20px;
text-align: center;
padding-top: 20px;
border-top: 1px solid #ecf0f1;
}
</style>
</head>
<body>
<div class="container">
<div class="header">
<h1>📊 Veille Hygiène & Pest Control</h1>
<p>Semaine du 14-20 avril 2026</p>
</div>
<div class="grid">
<!-- REGLEMENTATION -->
<div class="card">
<div class="card-header">
<span class="card-icon">⚖️</span>
<h3>Réglementation</h3>
</div>
<ul>
<li><strong>ANSES :</strong> Mise à jour des listes de substances autorisées Certibiocide</li>
<li><strong>JO :</strong> Nouvelles exigences d'étiquetage pour les biocides (avril 2026)</li>
<li><strong>UE :</strong> Révision des critères d'évaluation toxicologique</li>
</ul>
</div>
<!-- INNOVATIONS -->
<div class="card">
<div class="card-header">
<span class="card-icon">💡</span>
<h3>Innovations</h3>
</div>
<ul>
<li><strong>Biotech :</strong> Nouvelles enzymes pour désinsectisation éco-responsable</li>
<li><strong>IoT :</strong> Monitoring en temps réel des nuisibles (startup française)</li>
<li><strong>Chimie verte :</strong> Fongicides à base d'huiles essentielles certifiés</li>
</ul>
</div>
<!-- MARCHE -->
<div class="card">
<div class="card-header">
<span class="card-icon">📈</span>
<h3>Marché</h3>
</div>
<ul>
<li><strong>Trends :</strong> +15% demande biocides dans secteur agroalimentaire</li>
<li><strong>Concurrence :</strong> Rachat de 2 PME par groupe allemand</li>
<li><strong>Recrutement :</strong> Formation Certibiocide en hausse (+35%)</li>
</ul>
</div>
<!-- RECHERCHE -->
<div class="card">
<div class="card-header">
<span class="card-icon">🔬</span>
<h3>Recherche scientifique</h3>
</div>
<ul>
<li><strong>Résistance :</strong> Étude INRAE sur résistance aux pyréthrines</li>
<li><strong>Santé :</strong> Nouvel article PubMed sur impact santé-environnement</li>
<li><strong>Méthodes :</strong> Protocoles d'évaluation de l'efficacité (ECHA)</li>
</ul>
</div>
<!-- FORMATION -->
<div class="card">
<div class="card-header">
<span class="card-icon">🎓</span>
<h3>Formations & Agréments</h3>
</div>
<ul>
<li><strong>Nouveaux agréés :</strong> 8 organismes cette semaine</li>
<li><strong>Tendance pédago :</strong> Hybrid e-learning davantage demandé</li>
<li><strong>Métier :</strong> Fiche de poste "Technicien Certibiocide" (2026)</li>
</ul>
</div>
<!-- ALERTE -->
<div class="card">
<div class="card-header">
<span class="card-icon">⚠️</span>
<h3>Alertes & Incidents</h3>
</div>
<ul>
<li><strong>Rappel :</strong> Substance X interdite dans l'UE (en vigueur mai)</li>
<li><strong>Incident :</strong> Contamination dans le secteur laitier (source maîtrisée)</li>
<li><strong>Certificat :</strong> Perte d'agrément d'1 organisme (non-conformité)</li>
</ul>
</div>
</div>
<div class="footer">
<p><strong>Sources :</strong> ANSES, JO (JORF), publications PubMed, LinkedIn professionnel, communiqués organismes, études INRAE, ECHA, Ministère Écologie</p>
</div>
<div class="buttons">
<button onclick="alert('Fonctionnalité : Détails réglementation ANSES')">📄 En savoir plus</button>
<button onclick="alert('Fonctionnalité : Détails des nouveaux agréments')">🔍 Agréments détail</button>
<button onclick="alert('Fonctionnalité : Innovations intéressantes')">💡 Innovations</button>
</div>
<div class="date">
Veille mise à jour le 14 avril 2026
</div>
</div>
</body>
</html>