oddb2xml 3.0.20 → 3.0.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -43,6 +43,7 @@ module Oddb2xml
43
43
  attr_accessor :subject, :refdata, :items, :flags, :lppvs,
44
44
  :actions, :migel, :orphan,
45
45
  :infos, :packs, :infos_zur_rose, :firstbase,
46
+ :weleda_sl,
46
47
  :ean14, :tag_suffix,
47
48
  :companies, :people,
48
49
  :xsd
@@ -57,6 +58,7 @@ module Oddb2xml
57
58
  @packs = {}
58
59
  @migel = {}
59
60
  @infos_zur_rose ||= {}
61
+ @weleda_sl ||= {}
60
62
  @firstbase ||= {}
61
63
  @actions = []
62
64
  @orphan = []
@@ -1168,6 +1170,20 @@ module Oddb2xml
1168
1170
  }
1169
1171
  end
1170
1172
  end
1173
+ # BAG SL public price for a Kapitel-70 medicine missing from the
1174
+ # FHIR feed (issue #121); see Oddb2xml::WeledaSL. The FHIR price
1175
+ # wins, so this is only added when the GTIN is absent from the SL
1176
+ # items, where no PPUB ARTPRI is otherwise emitted. Filled into the
1177
+ # standard public-price tag (PTYP "PPUB") so existing consumers
1178
+ # pick it up; the raw, often-blanked ZURROSEPUB (issue #117) stays
1179
+ # alongside it.
1180
+ if (weleda = @weleda_sl[ean.to_s.rjust(13, "0")]) && weleda[:price] && !@items[ean]
1181
+ xml.ARTPRI {
1182
+ xml.comment "from BAG SL group price #{weleda[:csl]} (#{weleda[:abgabe]})"
1183
+ xml.PTYP "PPUB"
1184
+ xml.PRICE weleda[:price]
1185
+ }
1186
+ end
1171
1187
  nincd = detect_nincd(obj)
1172
1188
  if nincd
1173
1189
  xml.ARTINS {
@@ -1690,6 +1706,15 @@ module Oddb2xml
1690
1706
  ppub ||= zur_rose_detail[:pub_price]
1691
1707
  end
1692
1708
  end
1709
+ # Kapitel-70 item missing from the FHIR feed but registered in
1710
+ # Swissmedic Packungen.xlsx (so it enters here, via @packs):
1711
+ # fill the BAG public price from the Weleda list + BAG SL
1712
+ # group-price table when nothing else priced it (issue #121).
1713
+ pkg_weleda = @weleda_sl[pkg_gtin.to_s.rjust(13, "0")]
1714
+ if pkg_weleda && ppub.nil? && pkg_weleda[:price]
1715
+ xml.comment "PPUB #{pkg_weleda[:price]} from BAG SL group price #{pkg_weleda[:csl]} (#{pkg_weleda[:abgabe]})"
1716
+ ppub = pkg_weleda[:price]
1717
+ end
1693
1718
  xml.PEXF pexf if pexf
1694
1719
  xml.PPUB ppub if ppub
1695
1720
  measure = ""
@@ -1710,7 +1735,7 @@ module Oddb2xml
1710
1735
  xml.DOSAGE_FORMF info.galenic_form.descriptions["fr"] if info.galenic_form.descriptions["fr"]
1711
1736
  xml.DOSAGE_FORMI info.galenic_form.descriptions["it"] if info.galenic_form.descriptions["it"]
1712
1737
  end
1713
- xml.SL_ENTRY "true" if sl_gtins.index(pkg_gtin)
1738
+ xml.SL_ENTRY "true" if sl_gtins.index(pkg_gtin) || pkg_weleda
1714
1739
  xml.IKSCAT package[:swissmedic_category][0] if package[:swissmedic_category] && package[:swissmedic_category].length > 0
1715
1740
  xml.GENERIC_TYPE sequence[:org_gen_code] if sequence[:org_gen_code] && !sequence[:org_gen_code].empty?
1716
1741
  xml.LPPV "true" if @lppvs[pkg_gtin.to_s] # detect_nincd
@@ -1767,7 +1792,12 @@ module Oddb2xml
1767
1792
  Oddb2xml.log "found chapter #{obj[:pharmacode]}" if $VERBOSE
1768
1793
  chap70 = true
1769
1794
  end
1770
- patched_pharma_type = (/^7680/.match(ean13.to_s.rjust(13, "0")) || chap70 ? "P" : "N")
1795
+ # Kapitel-70 complementary medicine missing from the FHIR feed,
1796
+ # recovered from the Weleda list + BAG SL group-price table
1797
+ # (issue #121). Mirror the old chapter-70 hack: emit it as a
1798
+ # Pharma item with the SL flag (and the BAG public price below).
1799
+ weleda = @weleda_sl[ean13.to_s.rjust(13, "0")] unless @items[ean13]
1800
+ patched_pharma_type = (/^7680/.match(ean13.to_s.rjust(13, "0")) || chap70 || weleda ? "P" : "N")
1771
1801
  next if /^#{Oddb2xml::FAKE_GTIN_START}/o.match?(ean13.to_s)
1772
1802
  next if obj[:data_origin].eql?("zur_rose") && /^7680/.match(ean13) # must skip inactiv items
1773
1803
  xml.ITEM({"PHARMATYPE" => patched_pharma_type}) do
@@ -1803,7 +1833,7 @@ module Oddb2xml
1803
1833
  xml.PEXF(pexf = zur_rose_detail[:price])
1804
1834
  end
1805
1835
  end
1806
- if obj[:pub_price] && !obj[:pub_price].empty?
1836
+ if obj[:pub_price] && !obj[:pub_price].empty? && !obj[:pub_price].eql?("0.00")
1807
1837
  xml.PPUB(ppub = obj[:pub_price])
1808
1838
  elsif zur_rose_detail
1809
1839
  if zur_rose_detail[:pub_price] && !zur_rose_detail[:pub_price].empty? && !zur_rose_detail[:pub_price].eql?("0.00")
@@ -1811,6 +1841,17 @@ module Oddb2xml
1811
1841
  xml.PPUB(ppub = zur_rose_detail[:pub_price])
1812
1842
  end
1813
1843
  end
1844
+ # SL flag + BAG public price for the recovered Kapitel-70 item.
1845
+ # The FHIR/ZurRose price always wins -- the BAG SL group price
1846
+ # only fills a gap (ppub still nil here means ZurRose blanked it,
1847
+ # issue #117). See Oddb2xml::WeledaSL.
1848
+ if weleda && !chap70
1849
+ if ppub.nil? && weleda[:price]
1850
+ xml.comment "PPUB #{weleda[:price]} from BAG SL group price #{weleda[:csl]} (#{weleda[:abgabe]})"
1851
+ xml.PPUB(ppub = weleda[:price])
1852
+ end
1853
+ xml.SL_ENTRY "true"
1854
+ end
1814
1855
  @csv_file << [ean13, description, "", "", pexf, ppub, "", "", "", "", "", ""]
1815
1856
  if chap70
1816
1857
  xml.comment "Chapter70 hack #{ean13.to_s.rjust(13, "0")} #{description.encode(xml: :text).gsub("--", "-")}"
data/lib/oddb2xml/cli.rb CHANGED
@@ -4,6 +4,7 @@ require "oddb2xml/extractor"
4
4
  require "oddb2xml/compressor"
5
5
  require "oddb2xml/options"
6
6
  require "oddb2xml/proxy_check"
7
+ require "oddb2xml/weleda_sl"
7
8
  require "oddb2xml/util"
8
9
  require "rubyXL"
9
10
  require "date" # for today
@@ -151,6 +152,15 @@ module Oddb2xml
151
152
  %w[actions orphan migel infos_zur_rose firstbase].each do |addition|
152
153
  builder.send("#{addition}=".intern, instance_variable_get("@#{addition}"))
153
154
  end
155
+ # SL flag + BAG public price for Kapitel-70 medicines missing from the
156
+ # FHIR feed (issue #121). Consumed by the Artikelstamm output
157
+ # (SL_ENTRY + PPUB) and by oddb_article.xml (ARTPRI BAGPUB) for the
158
+ # -e/--extended and -b/--firstbase product feeds.
159
+ builder.weleda_sl = if @options[:extended] || @options[:firstbase] || @options[:artikelstamm]
160
+ Oddb2xml::WeledaSL.load(@options)
161
+ else
162
+ {}
163
+ end
154
164
  end
155
165
  builder.tag_suffix = @options[:tag_suffix]
156
166
  end
@@ -167,6 +167,36 @@ module Oddb2xml
167
167
  end
168
168
  end
169
169
 
170
+ # Weleda "Kapitel 70" article list (GTIN, Abgabekategorie/SL flag,
171
+ # Pharma-Gruppen-Code). See Oddb2xml::WeledaSL.
172
+ class WeledaDownloader < Downloader
173
+ include DownloadMethod
174
+ def download
175
+ @url ||= "https://raw.githubusercontent.com/zdavatz/oddb2xml_files/master/weleda_arzneimittel.csv"
176
+ download_as("weleda_arzneimittel.csv", "w+")
177
+ end
178
+ end
179
+
180
+ # WALA "Kapitel 70" article list (GTIN, Abgabekategorie, Pharma-Gruppen-Code
181
+ # and the inline BAG SL 70.01 package price). See Oddb2xml::WeledaSL.
182
+ class WalaDownloader < Downloader
183
+ include DownloadMethod
184
+ def download
185
+ @url ||= "https://raw.githubusercontent.com/zdavatz/oddb2xml_files/master/wala_arzneimittel.csv"
186
+ download_as("wala_arzneimittel.csv", "w+")
187
+ end
188
+ end
189
+
190
+ # BAG SL Pharma-Gruppen-Code -> public price table, extracted from the BAG SL
191
+ # definition PDF "Homoeopathica, Anthroposophica, Allergene". See WeledaSL.
192
+ class BagSlGroupPricesDownloader < Downloader
193
+ include DownloadMethod
194
+ def download
195
+ @url ||= "https://raw.githubusercontent.com/zdavatz/oddb2xml_files/master/bag_sl_group_prices.csv"
196
+ download_as("bag_sl_group_prices.csv", "w+")
197
+ end
198
+ end
199
+
170
200
  class ZurroseDownloader < Downloader
171
201
  include DownloadMethod
172
202
  def download
@@ -1,3 +1,3 @@
1
1
  module Oddb2xml
2
- VERSION = "3.0.20"
2
+ VERSION = "3.0.22"
3
3
  end
@@ -0,0 +1,158 @@
1
+ require "csv"
2
+ require "oddb2xml/downloader"
3
+
4
+ module Oddb2xml
5
+ # Recovers the SL reimbursement flag and the public price for the Swiss
6
+ # "Kapitel 70" complementary medicines (Homöopathika / Anthroposophika /
7
+ # Phytotherapeutika) that are *not* present in the BAG FHIR NDJSON feed.
8
+ #
9
+ # These products were historically scraped from the BAG "varia" page
10
+ # (chapter_70_hack). That page became a JavaScript SPA (issue #118) and the
11
+ # FHIR feed only covers a part of the catalogue, so the magistral Weleda
12
+ # products (GTIN prefix 7611916…) arrive via ZurRose with no SL flag and a
13
+ # zeroed/absent public price (issue #117/#121).
14
+ #
15
+ # Two data files close the gap. They live in
16
+ # github.com/zdavatz/oddb2xml_files (downloaded at runtime, so they can be
17
+ # refreshed without a gem release) with a bundled copy under data/ as an
18
+ # offline fallback:
19
+ #
20
+ # * weleda_arzneimittel.csv GTIN -> abgabekategorie (the "… / SL" flag)
21
+ # and csl (= Pharma-Gruppen-Code).
22
+ # * bag_sl_group_prices.csv Pharma-Gruppen-Code -> public price (CHF,
23
+ # incl. MWST). Extracted from the BAG SL
24
+ # definition PDF "Homoeopathica, Anthroposophica,
25
+ # Allergene.pdf" — the authoritative price source.
26
+ # * wala_arzneimittel.csv The same gap for WALA products (GTIN prefix
27
+ # 7640187…). Different layout (";"-separated,
28
+ # BOM): a row is SL when it carries a CSL-Code
29
+ # (Kapitel-70.01 group code) and the public
30
+ # package price is given *inline* in the
31
+ # "CSL 70.01." column — already multiplied for
32
+ # the pack size (the multiplier lives only in the
33
+ # galenic-form text, e.g. "Solutio ad inj.
34
+ # 10 x 1 ml"), so it is used verbatim rather than
35
+ # re-joined against bag_sl_group_prices.csv.
36
+ #
37
+ # Weleda join: GTIN -> csl -> price. The csl may carry a package multiplier in
38
+ # the form "N x <code>" (e.g. "8x2070631"), meaning the package holds N units
39
+ # priced at <code> each, so the public price is N * price[<code>].
40
+ #
41
+ # The FHIR feed always wins: this enrichment is only applied to GTINs that
42
+ # are absent from the NDJSON (see Builder#build_artikelstamm).
43
+ module WeledaSL
44
+ DATA_DIR = File.expand_path(File.join(__dir__, "..", "..", "data"))
45
+
46
+ module_function
47
+
48
+ # Returns a Hash keyed by the 13-digit GTIN (String, zero-padded):
49
+ # "7611916162404" => { sl: true, price: "26.95", csl: "2069591", abgabe: "FM / SL" }
50
+ # Only rows carrying a "/ SL" Abgabekategorie are included. Returns {} if the
51
+ # data cannot be obtained (never raises — the rest of the build must proceed).
52
+ def load(options = {})
53
+ prices = parse_prices(source(BagSlGroupPricesDownloader, options, "bag_sl_group_prices.csv"))
54
+ map = build_map(source(WeledaDownloader, options, "weleda_arzneimittel.csv"), prices)
55
+ weleda_size = map.size
56
+ build_wala_map(source(WalaDownloader, options, "wala_arzneimittel.csv")).each do |gtin, entry|
57
+ map[gtin] ||= entry # Weleda wins on the (unlikely) GTIN collision
58
+ end
59
+ Oddb2xml.log "WeledaSL: #{map.size} SL products with prices loaded " \
60
+ "(Weleda #{weleda_size}, WALA #{map.size - weleda_size})"
61
+ map
62
+ rescue => error
63
+ Oddb2xml.log "WeledaSL: disabled (#{error.class}: #{error.message})"
64
+ {}
65
+ end
66
+
67
+ # Download the file from oddb2xml_files; fall back to the bundled copy under
68
+ # data/ when the download is unavailable (e.g. an allow-list proxy blocks
69
+ # raw.githubusercontent.com).
70
+ def source(downloader_class, options, basename)
71
+ content = nil
72
+ begin
73
+ content = downloader_class.new(options).download
74
+ rescue => error
75
+ Oddb2xml.log "WeledaSL: download of #{basename} failed (#{error.class}: #{error.message})"
76
+ end
77
+ if content.nil? || content.to_s.strip.empty?
78
+ bundled = File.join(DATA_DIR, basename)
79
+ if File.exist?(bundled)
80
+ Oddb2xml.log "WeledaSL: using bundled #{basename}"
81
+ content = File.read(bundled)
82
+ end
83
+ end
84
+ content
85
+ end
86
+
87
+ # Pharma-Gruppen-Code => unit price (String, "NN.NN").
88
+ def parse_prices(csv_string)
89
+ prices = {}
90
+ return prices if csv_string.nil? || csv_string.strip.empty?
91
+ CSV.parse(csv_string, headers: true) do |row|
92
+ code = row["pharma_group_code"].to_s.strip
93
+ price = row["price_chf_incl_vat"].to_s.strip
94
+ prices[code] = price unless code.empty? || price.empty?
95
+ end
96
+ prices
97
+ end
98
+
99
+ def build_map(csv_string, prices)
100
+ map = {}
101
+ return map if csv_string.nil? || csv_string.strip.empty?
102
+ CSV.parse(csv_string, headers: true) do |row|
103
+ next unless (row["abgabekategorie"].to_s =~ /\bSL\b/)
104
+ gtin = row["ean"].to_s.strip.rjust(13, "0")
105
+ next unless gtin =~ /\A\d{13}\z/
106
+ price = resolve_price(row["csl"], prices)
107
+ map[gtin] = {
108
+ sl: true,
109
+ price: price,
110
+ csl: row["csl"].to_s.strip,
111
+ abgabe: row["abgabekategorie"].to_s.strip
112
+ }
113
+ end
114
+ map
115
+ end
116
+
117
+ # WALA layout: ";"-separated, BOM, header columns carry trailing spaces.
118
+ # A row is an SL product when it has a CSL-Code (Kapitel-70.01 group code);
119
+ # the public package price is taken verbatim from the inline "CSL 70.01."
120
+ # column (already multiplied for the pack size). Keyed by 13-digit GTIN.
121
+ def build_wala_map(csv_string)
122
+ map = {}
123
+ return map if csv_string.nil? || csv_string.strip.empty?
124
+ content = csv_string.sub("", "")
125
+ table = CSV.parse(content, headers: true, col_sep: ";")
126
+ col = {}
127
+ table.headers.compact.each { |h| col[h.to_s.strip] = h }
128
+ table.each do |row|
129
+ csl = row[col["CSL-Code*"]].to_s.strip
130
+ next if csl.empty? # no group code => not an SL product
131
+ gtin = row[col["EAN-Code"]].to_s.strip.rjust(13, "0")
132
+ next unless gtin =~ /\A\d{13}\z/
133
+ raw_price = row[col["CSL 70.01."]].to_s.strip
134
+ next if raw_price.empty?
135
+ map[gtin] = {
136
+ sl: true,
137
+ price: sprintf("%.2f", raw_price.tr(",", ".").to_f),
138
+ csl: csl,
139
+ abgabe: row[col["KAT"]].to_s.strip
140
+ }
141
+ end
142
+ map
143
+ end
144
+
145
+ # csl is either "<code>" or "<N> x <code>" (the package multiplier). Returns
146
+ # the public price as a "NN.NN" String, or nil when it cannot be resolved.
147
+ def resolve_price(csl, prices)
148
+ csl = csl.to_s.strip
149
+ return nil if csl.empty?
150
+ m = csl.match(/\A(?:(\d+)\s*[x×]\s*)?(\d{7})\z/i)
151
+ return nil unless m
152
+ multiplier = (m[1] || "1").to_i
153
+ base = prices[m[2]]
154
+ return nil unless base
155
+ sprintf("%.2f", base.to_f * multiplier)
156
+ end
157
+ end
158
+ end
@@ -79,6 +79,17 @@ describe Oddb2xml::Builder do
79
79
  expect(@inhalt.index(expected)).not_to be nil
80
80
  end
81
81
 
82
+ # issue #121: Kapitel-70 complementary medicine that is absent from the FHIR
83
+ # feed and arrives via ZurRose (GTIN 7611916162404, csl 2069591) with a
84
+ # blanked public price. WeledaSL must add the SL flag and the BAG SL group
85
+ # price (CHF 26.95).
86
+ it "should add the SL flag and BAG public price to a Weleda Kapitel-70 item" do
87
+ block = @inhalt[%r{<ITEM PHARMATYPE="P">\s*<GTIN>7611916162404</GTIN>.*?</ITEM>}m]
88
+ expect(block).not_to be_nil
89
+ expect(block).to include("<SL_ENTRY>true</SL_ENTRY>")
90
+ expect(block).to include("<PPUB>26.95</PPUB>")
91
+ end
92
+
82
93
  it "should have a DSCRF and ATC for product PRIORIX TETRA" do
83
94
  expected = %(<PRODUCT>
84
95
  <PRODNO>5815801</PRODNO>
data/spec/builder_spec.rb CHANGED
@@ -795,6 +795,18 @@ describe Oddb2xml::Builder do
795
795
  checkPrices(false)
796
796
  end
797
797
 
798
+ # issue #121: a Kapitel-70 medicine missing from the FHIR feed (GTIN
799
+ # 7611916162404) gets the BAG SL public price filled into the standard
800
+ # public-price tag (ARTPRI PPUB) in oddb_article.xml, while the raw
801
+ # (blanked) ZURROSEPUB is preserved.
802
+ it "should fill the standard ARTPRI PPUB with the BAG SL public price for a Weleda Kapitel-70 article" do
803
+ doc = REXML::Document.new File.new(checkAndGetArticleXmlName)
804
+ art = checkAndGetArticleWithGTIN(doc, "7611916162404")
805
+ expect(art).not_to be_nil
806
+ expect(art.elements["ARTPRI[PTYP='PPUB']/PRICE"].text).to eq "26.95"
807
+ expect(art.elements["ARTPRI[PTYP='ZURROSEPUB']/PRICE"].text).to eq "0.00"
808
+ end
809
+
798
810
  it "should generate the flag ORPH for orphan" do
799
811
  doc = REXML::Document.new File.new(oddb_product_xml)
800
812
  orphan = checkAndGetProductWithGTIN(doc, Oddb2xml::ORPHAN_GTIN)
@@ -0,0 +1,143 @@
1
+ pharma_group_code,price_chf_incl_vat,description,limitation
2
+ 2069562,13.40,Urtinktur 1−10 g/ml,""
3
+ 2069579,16.05,Urtinktur 11−20 g/ml,""
4
+ 2069585,20.80,Urtinktur 21−40 g/ml,""
5
+ 2069591,26.95,Urtinktur 41−60 g/ml,""
6
+ 2069616,39.80,Urtinktur 61−125 g/ml,""
7
+ 2069622,25.20,17117 Ceres Urtinktur 20 ml,L1
8
+ 2069639,31.35,Ceres Urtinktur gemäss L2 20 ml,"L1, L2"
9
+ 2069645,7.65,D/C 1−9,""
10
+ 2069651,14.20,D/C 1−9 11−20 g/ml,""
11
+ 2069668,18.00,D/C 1−9 21−40 g/ml,""
12
+ 2069674,24.00,D/C 1−9 41−60 g/ml,""
13
+ 2069680,28.65,D/C 1−9 61−125 g/ml,""
14
+ 2069705,8.50,D/C 10−29,""
15
+ 2069711,15.75,D/C 10−29 11−20 g/ml,""
16
+ 2069728,19.95,D/C 10−29 21−40 g/ml,""
17
+ 2069734,26.55,D/C 10−29 41−60 g/ml,""
18
+ 2069740,31.65,D/C 10−29 61−125 g/ml,""
19
+ 2069763,11.30,D/C 30−60,""
20
+ 2069786,21.05,D/C 30−60 11−20 g/ml,""
21
+ 2069792,27.20,D/C 30−60 21−40 g/ml,""
22
+ 2069800,35.10,D/C 30−60 41−60 g/ml,""
23
+ 2069817,41.85,D/C 30−60 61−125 g/ml,""
24
+ 2069852,19.95,"D/C 100, 200",""
25
+ 2069869,29.80,"D/C 300, 400, 500",L3
26
+ 2069875,40.20,D/C 1000 1−10 g/ml,L3
27
+ 2069881,20.05,LM I−XXX (Q 1-30) 1−10 g/ml,""
28
+ 3793722,37.10,LM I−XXX (Q 1-30) 11−20 g/ml,""
29
+ 3793768,29.70,LM ab XXXI (Q ab 31) 1−10 g/ml,""
30
+ 3793780,54.90,LM ab XXXI (Q ab 31) 11−20 g/ml,""
31
+ 3487669,5.45,CF 30 1 Dose,""
32
+ 2069898,5.45,K 30 1 Dose / 1 g,""
33
+ 2069912,6.15,K 30 2−5 g,""
34
+ 2069935,16.30,K 30 5 Dosen,""
35
+ 3487729,7.60,CF 200 1 Dose,""
36
+ 2069941,7.60,K 200 1 Dose / 1 g,""
37
+ 2069958,10.15,K 200 2−5 g,""
38
+ 2069964,22.85,K 200 5 Dosen,""
39
+ 3487735,8.65,CF 1000 (MCF) 1 Dose,""
40
+ 2069970,8.65,K 1000 (MK) 1 Dose /1 g,""
41
+ 2069987,12.85,K 1000 (MK) 2−5 g,L3
42
+ 2069993,26.05,K 1000 (MK) 5 Dosen,L3
43
+ 3487741,9.80,CF 10 000 (XMCF) 1 Dose,""
44
+ 2070016,9.80,K 10 000 (XMK) 1 Dose / 1 g,""
45
+ 2070022,15.25,K 10 000 (XMK) 2−5 g,L3
46
+ 2070039,29.15,K 10 000 (XMK) 5 Dosen,L3
47
+ 3487758,16.05,CF 50 000 (LMCF) 1 Dose,L3
48
+ 2070045,16.05,K 50 000 (LMK) 1 Dose / 1 g,L3
49
+ 2070051,17.80,K 50 000 (LMK) 2−5 g,L3
50
+ 2070068,47.10,K 50 000 (LMK) 5 Dosen,L3
51
+ 3487764,18.10,CF 100 000 (CMCF) 1 Dose,L3
52
+ 2070074,18.10,K 100 000 (CMK) 1 Dose / 1 g,L3
53
+ 2070080,18.85,K 100 000 (CMK) 2−5 g,L3
54
+ 2070097,53.00,K 100 000 (CMK) 5 Dosen,L3
55
+ 3793857,23.40,Kapseln 10−50 Stk,""
56
+ 3793834,37.20,Kapseln 51−100 Stk,""
57
+ 3793811,69.35,Kapseln 101−200 Stk,""
58
+ 3793892,23.65,Mundspray 21−40 ml,""
59
+ 3793917,31.45,Mundspray 41−60 ml,""
60
+ 2070111,11.70,"Äusserliche Tinkturen, Essentia 10−50 g/ml",""
61
+ 2070128,16.50,"Äusserliche Tinkturen, Essentia 51−100 g/ml",""
62
+ 2070140,16.25,"Cremes, Salben, Pasten, Gele 10−50 g/ml",""
63
+ 2070157,26.45,"Cremes, Salben, Pasten, Gele 51−100 g/ml",""
64
+ 2070186,10.85,"Emulsionen, Öle 10−50 g/ml",""
65
+ 2070192,19.90,"Emulsionen, Öle 51−100 g/ml",""
66
+ 2070200,8.25,"Nasen-, Ohrentropfen 1−10 g/ml",""
67
+ 3793969,14.05,Nasenspray 20 ml,""
68
+ 3793946,13.90,Augensalbe 5−10 g,""
69
+ 2070217,10.85,Augentropfen 1−10 g/ml,""
70
+ 2070223,1.70,"Suppositorien, Ovula (1-12 Stk) 1 Stk",""
71
+ 2070631,2.50,D/C 1−9 Ampulle 1−9 ml (1−10 Stk) 1 Stk,""
72
+ 2070648,1.95,D/C 1−9 Ampulle 1−9 ml (11−50 Stk) 1 Stk,""
73
+ 2070654,2.95,D/C 10−29 Ampulle 1−9 ml (1−10 Stk) 1 Stk,""
74
+ 2070660,2.35,D/C 10−29 Ampulle 1−9 ml (11−50 Stk) 1 Stk,""
75
+ 2070677,4.45,D/C 30−499 Ampulle 1−9 ml (1−10 Stk) 1 Stk,""
76
+ 2070683,3.55,D/C 30−499 Ampulle 1−9 ml (11−50 Stk) 1 Stk,""
77
+ 2070708,4.45,D/C 500 Ampulle 1−9 ml (1−10 Stk) 1 Stk,L3
78
+ 2070714,3.55,D/C 500 Ampulle 1−9 ml (11−50 Stk) 1 Stk,L3
79
+ 4961009,5.45,D 1000 Ampulle 1−9 ml (1−10 Stk) 1 Stk,L3
80
+ 4961038,4.55,D 1000 Ampulle 1−9 ml (11−50 Stk) 1 Stk,L3
81
+ 2070720,7.55,D/C 1−60 Ampulle 10 ml 1 Stk,""
82
+ 2070246,16.60,Urtinktur 1−10 g/ml,""
83
+ 2070252,18.35,Urtinktur 11−20 g/ml,""
84
+ 2070269,22.40,Urtinktur 21−40 g/ml,""
85
+ 2070275,28.45,Urtinktur 41−60 g/ml,""
86
+ 2070281,45.95,Urtinktur 61−125 g/ml,""
87
+ 2070298,13.35,D/C 1−9 1−10 g/ml,""
88
+ 2070306,16.55,D/C 1−9 11−20 g/ml,""
89
+ 2070312,18.45,D/C 1−9 21−40 g/ml,""
90
+ 2070329,25.70,D/C 1−9 41−60 g/ml,""
91
+ 2070335,41.50,D/C 1−9 61−125 g/ml,""
92
+ 2070341,14.80,D/C 10−29 1−10 g/ml,""
93
+ 2070358,18.35,D/C 10−29 11−20 g/ml,""
94
+ 2070364,20.50,D/C 10−29 21−40 g/ml,""
95
+ 2070370,28.45,D/C 10−29 41−60 g/ml,""
96
+ 2070387,45.95,D/C 10−29 61−125 g/ml,""
97
+ 2070393,23.20,D/C 30−60 1−10 g/ml,""
98
+ 2070401,27.30,D/C 30−60 11−20 g/ml,""
99
+ 2070418,32.35,D/C 30−60 21−40 g/ml,""
100
+ 2070424,41.10,D/C 30−60 41−60 g/ml,""
101
+ 2070430,66.25,D/C 30−60 61−125 g/ml,""
102
+ 2070447,29.45,"D/C 100, 200 1−10 g/ml",""
103
+ 4960990,36.65,D 1000 30 g/ml,""
104
+ 3794130,29.30,Kapseln 10−50 Stk,""
105
+ 3794118,46.50,Kapseln 51−100 Stk,""
106
+ 3794101,86.75,Kapseln 101−200 Stk,""
107
+ 3794207,24.45,Mundspray 21−40 ml,""
108
+ 3794199,32.60,Mundspray 41−60 ml,""
109
+ 2070453,14.70,"Äusserliche Tinkturen, Essentia 10−50 g/ml",""
110
+ 2070476,20.60,"Äusserliche Tinkturen, Essentia 51−100 g/ml",""
111
+ 2070482,20.25,"Cremes, Salben, Pasten, Gele 10−50 g/ml",""
112
+ 2070499,32.80,"Cremes, Salben, Pasten, Gele 50−100 g/ml",""
113
+ 2070507,13.90,"Emulsionen, Öle 10−50 g/ml",""
114
+ 2070513,24.80,"Emulsionen, Öle 51−100 g/ml",""
115
+ 2070536,10.40,"Nasen-, Ohrentropfen 1−10 g/ml",""
116
+ 3794182,17.55,Nasenspray 20 ml,""
117
+ 3794176,17.40,Augensalbe 5−10 g,""
118
+ 2070542,13.90,Augentropfen 1−10 g/ml,""
119
+ 2070559,2.30,"Suppositorien, Ovula (1−12 Stk) 1 Stk",""
120
+ 2070565,3.05,D/C 1−9 Ampulle 1−9 ml (1−10 Stk) 1 Stk,""
121
+ 2070571,2.40,D/C 1−9 Ampulle 1−9 ml (11−50 Stk) 1 Stk,""
122
+ 2070588,3.90,D/C 10−29 Ampulle 1−9 ml (1−10 Stk) 1 Stk,""
123
+ 2070594,3.10,D/C 10−29 Ampulle 1−9 ml (11−50 Stk) 1 Stk,""
124
+ 2070602,5.90,D/C 30−60 Ampulle 1−9 ml (1−10 Stk) 1 Stk,""
125
+ 2070619,4.80,D/C 30−60 Ampulle 1−9 ml (11−50 Stk) 1 Stk,""
126
+ 4961021,7.90,D 60−200 Ampulle 1−9 ml (1−10 Stk) 1 Stk,""
127
+ 4961015,6.50,D 60−200 Ampulle 1−9 ml (11−50 Stk) 1 Stk,""
128
+ 2070625,11.15,D/C 1−60 Ampulle 10 ml 1 Stk,""
129
+ 5001116,433.95,433.95 L,L
130
+ 5001122,405.50,405.50 L,L
131
+ 5001151,281.45,281.45 L,L
132
+ 5001168,301.05,301.05 L,L
133
+ 5001174,193.05,193.05 L,L
134
+ 5001464,223.50,3 Fl 10 ml,L
135
+ 5001470,301.75,orale Lösung 3 Fl 10 ml,L
136
+ 5001487,143.50,4 Fl 10 ml,L
137
+ 5001493,115.25,orale Lösung 1 Fl 10 ml,L
138
+ 5120223,289.20,5 Stk,L
139
+ 5120246,235.10,1 Stk,L
140
+ 5120252,359.75,4 x 5 ml,L
141
+ 5120269,291.40,5 ml,L
142
+ 6516710,273.85,273.85 L,L
143
+ 6516727,312.15,312.15 L,L
@@ -72,3 +72,4 @@
72
72
  1130361821SEROCYTOL Kolon Supp 3 Stk 002275003960401B080700076800027800132
73
73
  1131770177VARILRIX Trockensub c Solv (alt) Fertspr 0.5 ml 004768006650101B080800076800058500102
74
74
  1127766692VARILRIX Trockensub c Solv Fertspr 0.5 ml 004767006650101B080800076800058500342
75
+ 1111019849Absinthium ethanol Infusum D1 Tropfen 50 ml 002000000000300B080160076119161624044