Le FDA 21 CFR Part 820 exige que les fabricants de dispositifs médicaux maintiennent un dossier d'historique de dispositif (DHR) pour chaque unité produite. TofuPilot capture les résultats de test, les numéros de série, les mesures et les déterminations pass/fail dans un enregistrement immuable qui correspond directement aux exigences FDA et ISO 13485.
Vue d'ensemble des exigences réglementaires
La traçabilité des tests de dispositifs médicaux se situe à l'intersection de deux référentiels. Les deux exigent des preuves documentées que chaque dispositif a été fabriqué et testé conformément aux procédures approuvées.
| Réglementation | Clause | Exigence | Fonctionnalité TofuPilot |
|---|---|---|---|
| 21 CFR 820.184 | DHR | Enregistrements démontrant que le dispositif est fabriqué selon le DMR | Enregistrements de test par numéro de série avec nom de procédure |
| 21 CFR 820.80 | Réception, en-cours, acceptation du dispositif fini | Activités d'acceptation avec acceptation/rejet documentés | Résultats pass/fail avec limites de mesure |
| 21 CFR 820.90 | Produit non conforme | Investigation documentée des non-conformités | Exécutions échouées avec détail au niveau des mesures |
| 21 CFR 820.180 | Exigences générales (enregistrements) | Enregistrements conservés pendant la durée de vie du dispositif ou 2 ans | Stockage cloud immuable avec rétention |
| 21 CFR 820.250 | Techniques statistiques | Techniques statistiques valides pour la capabilité du procédé | Cpk, cartes de contrôle, FPY dans le tableau de bord |
| ISO 13485 7.5.3 | Traçabilité | Enregistrements par unité ou lot tout au long de la production | Suivi par numéro de série, historique d'unité, liens de sous-assemblages |
| ISO 13485 8.2.4 | Surveillance et mesure | Preuves de conformité aux critères d'acceptation | Mesures avec unités, limites et pass/fail |
Structurer les tests pour la conformité DHR
Le DHR doit inclure les résultats de test prouvant que chaque dispositif a été fabriqué conformément à son dossier maître du dispositif (DMR). Structurez vos tests OpenHTF de sorte que chaque procédure corresponde à un protocole de test documenté.
# Test de production de dispositif médical aligné sur les exigences DHR
import openhtf as htf
from openhtf.util import units
from tofupilot.openhtf import TofuPilot
@htf.measures(
htf.Measurement("impedance_channel_1")
.in_range(minimum=980, maximum=1020)
.with_units(units.OHM)
.doc("Impédance d'électrode selon IEC 60601-1, canal 1"),
htf.Measurement("impedance_channel_2")
.in_range(minimum=980, maximum=1020)
.with_units(units.OHM)
.doc("Impédance d'électrode selon IEC 60601-1, canal 2"),
htf.Measurement("leakage_current")
.in_range(maximum=0.00001)
.with_units(units.AMPERE)
.doc("Courant de fuite patient, partie appliquée Type BF selon IEC 60601-1"),
)
def electrical_safety(test):
test.measurements.impedance_channel_1 = 1002.3
test.measurements.impedance_channel_2 = 997.1
test.measurements.leakage_current = 0.000003
@htf.measures(
htf.Measurement("signal_accuracy_pct")
.in_range(minimum=99.0, maximum=101.0)
.doc("Précision de mesure par rapport à une référence traçable NIST"),
htf.Measurement("noise_floor")
.in_range(maximum=0.000005)
.with_units(units.VOLT)
.doc("Bruit rapporté à l'entrée, bande passante 0,05-150 Hz"),
htf.Measurement("common_mode_rejection")
.in_range(minimum=100)
.doc("CMRR à 50/60 Hz, en dB"),
)
def signal_performance(test):
test.measurements.signal_accuracy_pct = 99.8
test.measurements.noise_floor = 0.0000021
test.measurements.common_mode_rejection = 112.4
@htf.measures(
htf.Measurement("firmware_version")
.doc("Version du firmware installé, doit correspondre à la révision du DMR"),
htf.Measurement("self_test_result")
.in_range(minimum=1, maximum=1)
.doc("Auto-test du dispositif : réussi (1) ou échoué (0)"),
htf.Measurement("battery_capacity_pct")
.in_range(minimum=95)
.doc("Capacité de la batterie par rapport à la capacité nominale"),
)
def system_validation(test):
test.measurements.firmware_version = "3.2.1-release"
test.measurements.self_test_result = 1
test.measurements.battery_capacity_pct = 98.7
def main():
test = htf.Test(
electrical_safety,
signal_performance,
system_validation,
)
with TofuPilot(test):
test.execute(test_start=lambda: "MD-2026-04-00192")
if __name__ == "__main__":
main()Chaque mesure référence la norme applicable et inclut des limites d'acceptation. TofuPilot stocke le nom de la procédure, le numéro de série (lié à l'UDI) et chaque mesure avec son résultat.
Activités d'acceptation (21 CFR 820.80)
La FDA exige des activités d'acceptation documentées aux étapes de réception, en-cours de fabrication et dispositif fini. Exécutez des procédures OpenHTF séparées pour chaque étape, toutes utilisant le même numéro de série.
# Test d'acceptation en trois étapes pour la conformité FDA 820.80
import openhtf as htf
from openhtf.util import units
from tofupilot.openhtf import TofuPilot
@htf.measures(
htf.Measurement("incoming_visual_pass")
.in_range(minimum=1, maximum=1),
htf.Measurement("incoming_dimension_check")
.in_range(minimum=24.9, maximum=25.1)
.with_units(units.MILLIMETRE),
)
def receiving_inspection(test):
test.measurements.incoming_visual_pass = 1
test.measurements.incoming_dimension_check = 25.02
@htf.measures(
htf.Measurement("solder_paste_height")
.in_range(minimum=0.10, maximum=0.15)
.with_units(units.MILLIMETRE),
htf.Measurement("component_presence")
.in_range(minimum=1, maximum=1),
)
def in_process_inspection(test):
test.measurements.solder_paste_height = 0.12
test.measurements.component_presence = 1
@htf.measures(
htf.Measurement("final_functional_test")
.in_range(minimum=1, maximum=1),
htf.Measurement("label_verification")
.in_range(minimum=1, maximum=1),
)
def finished_device_acceptance(test):
test.measurements.final_functional_test = 1
test.measurements.label_verification = 1
def run_stage(phase, serial):
test = htf.Test(phase)
with TofuPilot(test):
test.execute(test_start=lambda: serial)
def main():
serial = "MD-2026-04-00192"
run_stage(receiving_inspection, serial)
run_stage(in_process_inspection, serial)
run_stage(finished_device_acceptance, serial)
if __name__ == "__main__":
main()La page de l'unité dans TofuPilot pour ce numéro de série affiche les trois étapes d'acceptation dans l'ordre. Un inspecteur FDA peut voir l'historique complet de fabrication et de test depuis une seule page.
Produit non conforme (21 CFR 820.90)
Lorsqu'un dispositif échoue au test, la FDA exige une investigation documentée. TofuPilot enregistre la mesure exacte qui a déclenché la défaillance, sa valeur et la limite qu'elle a dépassée.
Les exécutions de test échouées sont immédiatement visibles dans le tableau de bord de TofuPilot. La page d'historique de l'unité montre chaque tentative, ce qui vous permet de suivre l'investigation, la reprise et le cycle de retest. Cela satisfait l'exigence 820.90 de documenter la non-conformité, l'investigation et la disposition.
Traçabilité des composants avec les sous-unités
La clause 7.5.3 de l'ISO 13485 exige la traçabilité des composants utilisés dans chaque dispositif. Utilisez la fonctionnalité sub_units de TofuPilot pour lier les numéros de série des composants au dispositif fini.
# Enregistrer les numéros de série des composants pour la traçabilité ISO 13485
import openhtf as htf
from tofupilot.openhtf import TofuPilot
@htf.measures(
htf.Measurement("assembly_complete")
.in_range(minimum=1, maximum=1),
)
def final_assembly(test):
test.measurements.assembly_complete = 1
def main():
test = htf.Test(final_assembly)
with TofuPilot(
test,
sub_units=[
{"serial_number": "SENSOR-2026-08812"},
{"serial_number": "PCBA-2026-04410"},
{"serial_number": "BATT-2026-11023"},
],
):
test.execute(test_start=lambda: "MD-2026-04-00192")
if __name__ == "__main__":
main()Si un fournisseur de composants émet un rappel, vous pouvez tracer quels dispositifs finis contiennent les composants concernés grâce à la hiérarchie d'unités de TofuPilot.
Piste d'audit et exports
TofuPilot fournit la documentation que les auditeurs FDA et ISO 13485 attendent :
- Dossier d'historique du dispositif. Chaque exécution de test pour un numéro de série, avec la procédure, la station, l'opérateur, les mesures et le résultat. Cela constitue la partie test du DHR.
- Capabilité du procédé. Valeurs Cpk et cartes de contrôle pour toute mesure, démontrant le contrôle statistique du procédé conformément au 21 CFR 820.250.
- Analyse des défaillances. Pareto des défaillances et histogrammes de mesures pour soutenir les investigations CAPA.
- Conservation des enregistrements. Stockage immuable sans possibilité de modifier ou supprimer les enregistrements historiques via l'interface standard.
Exportez les données de test depuis le tableau de bord pour inclusion dans votre dossier de documentation DHR formel. Les enregistrements incluent les horodatages, les identifiants de station et toutes les valeurs de mesure avec leurs critères d'acceptation.