Skip to content

oddb2xml -e (FHIR-Default): SL-XLSX-Abgleich — 119 Produkte fälschlich NINCD=10, SL-Medikamente fehlen (FHIR-Feed ≠ SL-XLSX) #125

Description

@zdavatz

Zusammenfassung

Beim Abgleich der oddb2xml-Ausgabe (oddb2xml -e, Gem 3.0.25) mit der offiziellen SL-XLSX fielen zwei Diskrepanzen auf:

  1. 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.
  2. 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

  1. 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.)
  2. 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.
  3. 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).

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions