Zusammenfassung
Beim Abgleich der oddb2xml-Ausgabe (oddb2xml -e, Gem 3.0.25) mit der offiziellen SL-XLSX fielen zwei Diskrepanzen auf:
- Zu viele
NINCD=10 – 119 Produkte tragen im Output NINCD=10 (= „in SL“), obwohl sie nicht in der SL-XLSX stehen (fast ausschliesslich enterale/metabolische Spezialnahrung: Milupa/Nutricia PKU- & Stoffwechselnahrung, Fresubin, Resource, Ensure, …). → siehe FalscherNINCD.csv.
- Fehlende SL-Einträge – diverse SL-Medikamente fehlen im Output bzw. verlieren SL-Flag/Preis. → siehe
SLNichtVorhanden.csv.
Gemeinsame Ursache: Seit Juni 2026 verwendet -e/--extended standardmässig den FHIR-Feed (foph-sl-export-latest-*.ndjson von epl.bag.admin.ch) als SL-Quelle statt der klassischen BAG-Preparations.xml/SL-XLSX (lib/oddb2xml/options.rb:77). Der FHIR-Feed und die klassische SL-XLSX sind nicht dieselbe Liste.
Datengrundlage des Abgleichs
| Quelle |
Datei |
Stand |
| Klassische SL |
…/static/sl/current/excel/publication/2026-06-01/Publications.xlsx, Blatt Publications (10’265 Zeilen) |
2026-06-01 |
| oddb2xml-Quelle |
…/static/fhir/foph-sl-export-latest-de.ndjson (6’763 Bundles, 10’299 Packungen) |
2026-06-01 |
Beide Publikationen tragen denselben Stichtag 2026-06-01 → echter 1:1-Vergleich (GTIN-Schlüssel).
Diff-Resultat (XLSX ↔ FHIR, nach GTIN)
|
Anzahl |
| GTINs in beiden |
10’180 |
| nur in XLSX, nicht in FHIR |
27 (mit GTIN) + 58 ohne GTIN |
| nur in FHIR, nicht in XLSX |
119 (alle listingStatus=Listed) |
| GTINs in beiden mit abweichendem Publikumspreis |
0 |
Die 119 decken sich exakt mit FalscherNINCD.csv; die 58 GTIN-losen XLSX-Zeilen decken sich exakt mit den leeren GTIN-Zeilen in SLNichtVorhanden.csv.
Symptom 1 — 119 × NINCD=10 zu viel
Oddb2xml::FHIR::FhirExtractor#to_hash (lib/oddb2xml/fhir_support.rb) übernimmt jede Präparation des NDJSON in @items (einziger Filter: SwissmedicNo5 != "0", Zeile 705) und markiert jede Packung bedingungslos mit sl_entry: true (Zeile 789) – ohne zu prüfen, ob überhaupt eine aktive Reimbursement-SL-Berechtigung mit Preis vorliegt. Builder#detect_nincd (builder.rb:1352) liefert dann 10, sobald die GTIN in @items auftaucht.
Im FHIR-Feed sind alle 119 als RegulatedAuthorization type="Reimbursement SL" / status=Reimbursed / listingStatus=Listed deklariert – 111 davon ohne SL-Preis, 8 mit Preis. oddb2xml gibt also den FHIR-Feed korrekt wieder; der FHIR-Feed ist schlicht breiter als die SL-XLSX (er enthält reimbursierte Spezialnahrung, die in der klassischen SL-XLSX nicht geführt wird).
Die 8 Fälle mit Preis (nur in FHIR, nicht in XLSX)
4008976480525 125.05 (MSUD 1 Plv Bébé)
4008976480532 160.30 (MSUD 2 Plv Kind)
4008976480549 127.40 (OS 1 Plv Bébé)
4008976480587 197.70 (PKU 2 Gran Kind)
4008976481492 163.75 (OS 2 Plv Kind)
4008976481591 197.70 (PKU 3 Gran Erw)
5016533650532 158.65 (Milupa PKU 1 Gran Bébé (alt))
7680697070017 2088.75 (NEMLUVIO – echtes SL-Medikament, s.u. GTIN-Mismatch)
Symptom 2 — fehlende SL-Einträge
(a) 58 SL-XLSX-Zeilen ohne GTIN. oddb2xml schlüsselt jedes <ART> über die GTIN (build_article, builder.rb:982); ohne GTIN ist kein Output möglich – unabhängig von FHIR. Betroffen: Radiopharmaka (b.e.imaging: MIBG, TechneScan, UltratechneKow, …), Impfstoff-„Teilpackungen“ (Comirnaty, Encepur, FSME Immun, Menveo, Vitarubin Depot), magistrale Morphinium-HCl, Candesartan CPS (Cheplapharm), Zolgensma. Keine dieser Zeilen ist per SwissmedicNo8 im FHIR-Feed auffindbar.
(b) 27 SL-XLSX-Zeilen mit GTIN, die im FHIR-Feed fehlen. Dies sind echte, gelistete SL-Medikamente mit Preis, die der FHIR-Feed nicht enthält. Mit --fhir verlieren sie SL-Flag + SL-Preis; 3 fehlen ganz im Output (nicht über Refdata/ZurRose rekonstruierbar – die in SLNichtVorhanden.csv gemeldeten Diaphin IR/SR + Nemluvio), die übrigen erscheinen via Refdata, aber ohne NINCD=10/SL-Preis.
Die 27 SL-Medikamente, die im FHIR-Feed fehlen
03499320017039 Nemluvio, Trockensub 30 mg c Solv Fertpen (Pub 2088.75) -> GTIN-Mismatch, s.u.
7680525740013 Natriumiodid (I-123), Inj Lös 37 MBq (240.20)
7680546130077 Vicks Nasivin, Nasenspray 0.025 % (7.50)
7680546130084 Vicks Nasivin, Nasenspray 0.05 % (7.50)
7680577200015 Diaphin SR, Ret Filmtabl 200 mg, 100 Stk (367.05)
7680577240011 Diaphin IR, Tabl 200 mg, 100 Stk (367.05)
7680656721011…7680656721363 Metoject Autoinjektor (8 Stärken 7.5–25 mg)
7680658820095 Praluent, Inj Lös 75 mg/ml Reflex-Pen (389.90)
7680658820101 Praluent, Inj Lös 150 mg/ml Reflex-Pen (389.90)
7680687800013…7680687800044 Hemgenix, Inf Konz (4 Packungen, je 2'757'269.20)
7680694500012…7680694500067 Eltrombopag NOBEL (6 Stärken)
7680701600018 Vicks Nasivin, Gtt Nas 0.01 %, Fl 5 ml (7.00)
GTIN-Mismatch (Nemluvio). Nemluvio taucht in beiden gemeldeten Listen auf: die SL-XLSX führt GTIN 03499320017039 (Parallelimport-Präfix 3499), FHIR/Refdata verwenden die Schweizer GTIN 7680697070017 (IKSNR 69707). Gleiches Produkt, zwei Barcodes → beim GTIN-Abgleich erscheint die XLSX-GTIN als „fehlt“ und die Output-GTIN als „nicht in SL“.
Preise (die „2 mit falschem Preis“)
Unter den 10’180 in beiden Feeds vorhandenen GTINs gibt es 0 Publikumspreis-Abweichungen. Die beobachteten Falschpreise sind daher eine Folge von Symptom 2(b): SL-Medikamente, die im FHIR-Feed fehlen, behalten einen Nicht-SL-/ZurRose-Preis (oft geblankt, vgl. ZurRose-Pubpreis-Thematik) bzw. keinen. Wenn die 2 betroffenen GTINs genannt werden, lässt sich das exakt nachverfolgen.
Lösungsvorschläge
- SL-Flag/
NINCD=10 an echte Reimbursement-SL binden statt an blosse Feed-Präsenz: in FhirExtractor#to_hash sl_entry: true nur setzen, wenn eine Reimbursement SL-Auth mit listingStatus=Listed (und ggf. Preis) existiert. Das entfernt die 111 preislosen Nahrungs-Einträge aus NINCD=10 und bringt den Output näher an die XLSX. (Politische Entscheidung: BAG deklariert sie im FHIR de facto als reimbursiert – Definition von „SL“ für die Konsumenten klären.)
- Lücke der 27 SL-Medikamente im FHIR-Feed: primär ein Upstream-/BAG-Datenproblem (FHIR ≠ XLSX trotz gleichem Stichtag) – an FOPH/BAG melden. Optional: Fallback auf XLSX/
Preparations.xml für SL-Flag+Preis, wenn eine GTIN im FHIR fehlt; oder vorerst --no-fhir verwenden.
- 58 GTIN-lose SL-Zeilen: ggf. über eine aus SwissmedicNo8 abgeleitete Pseudo-GTIN (
7680+No8+Prüfziffer) ausgeben – oder als Upstream-Lücke akzeptieren.
Reproduktion
# XLSX (klassische SL) und FHIR (oddb2xml-Quelle), beide Stand 2026-06-01:
curl -O https://epl.bag.admin.ch/static/sl/current/excel/publication/2026-06-01/Publications.xlsx
curl -O https://epl.bag.admin.ch/static/fhir/foph-sl-export-latest-de.ndjson
# Diff nach GTIN: 119 nur-FHIR (alle Listed, 111 ohne Preis); 27 nur-XLSX-mit-GTIN; 58 XLSX ohne GTIN; 0 Preisdiffs.
Angehängt (vom Melder): FalscherNINCD.csv (119), SLNichtVorhanden.csv. Vollständige Diff-Listen diff_in_fhir_not_xlsx.csv / diff_in_xlsx_not_fhir.csv können beigelegt werden.
Ausgeführt wurde oddb2xml -e (FHIR ist seit Juni 2026 Default für -e).
Zusammenfassung
Beim Abgleich der oddb2xml-Ausgabe (
oddb2xml -e, Gem 3.0.25) mit der offiziellen SL-XLSX fielen zwei Diskrepanzen auf:NINCD=10– 119 Produkte tragen im OutputNINCD=10(= „in SL“), obwohl sie nicht in der SL-XLSX stehen (fast ausschliesslich enterale/metabolische Spezialnahrung: Milupa/Nutricia PKU- & Stoffwechselnahrung, Fresubin, Resource, Ensure, …). → sieheFalscherNINCD.csv.SLNichtVorhanden.csv.Gemeinsame Ursache: Seit Juni 2026 verwendet
-e/--extendedstandardmässig den FHIR-Feed (foph-sl-export-latest-*.ndjsonvonepl.bag.admin.ch) als SL-Quelle statt der klassischen BAG-Preparations.xml/SL-XLSX (lib/oddb2xml/options.rb:77). Der FHIR-Feed und die klassische SL-XLSX sind nicht dieselbe Liste.Datengrundlage des Abgleichs
…/static/sl/current/excel/publication/2026-06-01/Publications.xlsx, BlattPublications(10’265 Zeilen)…/static/fhir/foph-sl-export-latest-de.ndjson(6’763 Bundles, 10’299 Packungen)Beide Publikationen tragen denselben Stichtag 2026-06-01 → echter 1:1-Vergleich (GTIN-Schlüssel).
Diff-Resultat (XLSX ↔ FHIR, nach GTIN)
listingStatus=Listed)Die 119 decken sich exakt mit
FalscherNINCD.csv; die 58 GTIN-losen XLSX-Zeilen decken sich exakt mit den leeren GTIN-Zeilen inSLNichtVorhanden.csv.Symptom 1 — 119 ×
NINCD=10zu vielOddb2xml::FHIR::FhirExtractor#to_hash(lib/oddb2xml/fhir_support.rb) übernimmt jede Präparation des NDJSON in@items(einziger Filter:SwissmedicNo5 != "0", Zeile 705) und markiert jede Packung bedingungslos mitsl_entry: true(Zeile 789) – ohne zu prüfen, ob überhaupt eine aktive Reimbursement-SL-Berechtigung mit Preis vorliegt.Builder#detect_nincd(builder.rb:1352) liefert dann10, sobald die GTIN in@itemsauftaucht.Im FHIR-Feed sind alle 119 als
RegulatedAuthorization type="Reimbursement SL" / status=Reimbursed / listingStatus=Listeddeklariert – 111 davon ohne SL-Preis, 8 mit Preis. oddb2xml gibt also den FHIR-Feed korrekt wieder; der FHIR-Feed ist schlicht breiter als die SL-XLSX (er enthält reimbursierte Spezialnahrung, die in der klassischen SL-XLSX nicht geführt wird).Die 8 Fälle mit Preis (nur in FHIR, nicht in XLSX)
Symptom 2 — fehlende SL-Einträge
(a) 58 SL-XLSX-Zeilen ohne GTIN. oddb2xml schlüsselt jedes
<ART>über die GTIN (build_article,builder.rb:982); ohne GTIN ist kein Output möglich – unabhängig von FHIR. Betroffen: Radiopharmaka (b.e.imaging: MIBG, TechneScan, UltratechneKow, …), Impfstoff-„Teilpackungen“ (Comirnaty, Encepur, FSME Immun, Menveo, Vitarubin Depot), magistrale Morphinium-HCl, Candesartan CPS (Cheplapharm), Zolgensma. Keine dieser Zeilen ist per SwissmedicNo8 im FHIR-Feed auffindbar.(b) 27 SL-XLSX-Zeilen mit GTIN, die im FHIR-Feed fehlen. Dies sind echte, gelistete SL-Medikamente mit Preis, die der FHIR-Feed nicht enthält. Mit
--fhirverlieren sie SL-Flag + SL-Preis; 3 fehlen ganz im Output (nicht über Refdata/ZurRose rekonstruierbar – die inSLNichtVorhanden.csvgemeldeten Diaphin IR/SR + Nemluvio), die übrigen erscheinen via Refdata, aber ohneNINCD=10/SL-Preis.Die 27 SL-Medikamente, die im FHIR-Feed fehlen
GTIN-Mismatch (Nemluvio). Nemluvio taucht in beiden gemeldeten Listen auf: die SL-XLSX führt GTIN
03499320017039(Parallelimport-Präfix 3499), FHIR/Refdata verwenden die Schweizer GTIN7680697070017(IKSNR 69707). Gleiches Produkt, zwei Barcodes → beim GTIN-Abgleich erscheint die XLSX-GTIN als „fehlt“ und die Output-GTIN als „nicht in SL“.Preise (die „2 mit falschem Preis“)
Unter den 10’180 in beiden Feeds vorhandenen GTINs gibt es 0 Publikumspreis-Abweichungen. Die beobachteten Falschpreise sind daher eine Folge von Symptom 2(b): SL-Medikamente, die im FHIR-Feed fehlen, behalten einen Nicht-SL-/ZurRose-Preis (oft geblankt, vgl. ZurRose-Pubpreis-Thematik) bzw. keinen. Wenn die 2 betroffenen GTINs genannt werden, lässt sich das exakt nachverfolgen.
Lösungsvorschläge
NINCD=10an echte Reimbursement-SL binden statt an blosse Feed-Präsenz: inFhirExtractor#to_hashsl_entry: truenur setzen, wenn eineReimbursement SL-Auth mitlistingStatus=Listed(und ggf. Preis) existiert. Das entfernt die 111 preislosen Nahrungs-Einträge ausNINCD=10und bringt den Output näher an die XLSX. (Politische Entscheidung: BAG deklariert sie im FHIR de facto als reimbursiert – Definition von „SL“ für die Konsumenten klären.)Preparations.xmlfür SL-Flag+Preis, wenn eine GTIN im FHIR fehlt; oder vorerst--no-fhirverwenden.7680+No8+Prüfziffer) ausgeben – oder als Upstream-Lücke akzeptieren.Reproduktion
Angehängt (vom Melder):
FalscherNINCD.csv(119),SLNichtVorhanden.csv. Vollständige Diff-Listendiff_in_fhir_not_xlsx.csv/diff_in_xlsx_not_fhir.csvkönnen beigelegt werden.Ausgeführt wurde
oddb2xml -e(FHIR ist seit Juni 2026 Default für-e).