oddb2xml 3.0.20 → 3.0.21

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,26 @@ 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
+ # BAG SL Pharma-Gruppen-Code -> public price table, extracted from the BAG SL
181
+ # definition PDF "Homoeopathica, Anthroposophica, Allergene". See WeledaSL.
182
+ class BagSlGroupPricesDownloader < Downloader
183
+ include DownloadMethod
184
+ def download
185
+ @url ||= "https://raw.githubusercontent.com/zdavatz/oddb2xml_files/master/bag_sl_group_prices.csv"
186
+ download_as("bag_sl_group_prices.csv", "w+")
187
+ end
188
+ end
189
+
170
190
  class ZurroseDownloader < Downloader
171
191
  include DownloadMethod
172
192
  def download
@@ -1,3 +1,3 @@
1
1
  module Oddb2xml
2
- VERSION = "3.0.20"
2
+ VERSION = "3.0.21"
3
3
  end
@@ -0,0 +1,115 @@
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
+ #
27
+ # Join: GTIN -> csl -> price. The csl may carry a package multiplier in the
28
+ # form "N x <code>" (e.g. "8x2070631"), meaning the package holds N units
29
+ # priced at <code> each, so the public price is N * price[<code>].
30
+ #
31
+ # The FHIR feed always wins: this enrichment is only applied to GTINs that
32
+ # are absent from the NDJSON (see Builder#build_artikelstamm).
33
+ module WeledaSL
34
+ DATA_DIR = File.expand_path(File.join(__dir__, "..", "..", "data"))
35
+
36
+ module_function
37
+
38
+ # Returns a Hash keyed by the 13-digit GTIN (String, zero-padded):
39
+ # "7611916162404" => { sl: true, price: "26.95", csl: "2069591", abgabe: "FM / SL" }
40
+ # Only rows carrying a "/ SL" Abgabekategorie are included. Returns {} if the
41
+ # data cannot be obtained (never raises — the rest of the build must proceed).
42
+ def load(options = {})
43
+ prices = parse_prices(source(BagSlGroupPricesDownloader, options, "bag_sl_group_prices.csv"))
44
+ map = build_map(source(WeledaDownloader, options, "weleda_arzneimittel.csv"), prices)
45
+ Oddb2xml.log "WeledaSL: #{map.size} SL products with prices loaded"
46
+ map
47
+ rescue => error
48
+ Oddb2xml.log "WeledaSL: disabled (#{error.class}: #{error.message})"
49
+ {}
50
+ end
51
+
52
+ # Download the file from oddb2xml_files; fall back to the bundled copy under
53
+ # data/ when the download is unavailable (e.g. an allow-list proxy blocks
54
+ # raw.githubusercontent.com).
55
+ def source(downloader_class, options, basename)
56
+ content = nil
57
+ begin
58
+ content = downloader_class.new(options).download
59
+ rescue => error
60
+ Oddb2xml.log "WeledaSL: download of #{basename} failed (#{error.class}: #{error.message})"
61
+ end
62
+ if content.nil? || content.to_s.strip.empty?
63
+ bundled = File.join(DATA_DIR, basename)
64
+ if File.exist?(bundled)
65
+ Oddb2xml.log "WeledaSL: using bundled #{basename}"
66
+ content = File.read(bundled)
67
+ end
68
+ end
69
+ content
70
+ end
71
+
72
+ # Pharma-Gruppen-Code => unit price (String, "NN.NN").
73
+ def parse_prices(csv_string)
74
+ prices = {}
75
+ return prices if csv_string.nil? || csv_string.strip.empty?
76
+ CSV.parse(csv_string, headers: true) do |row|
77
+ code = row["pharma_group_code"].to_s.strip
78
+ price = row["price_chf_incl_vat"].to_s.strip
79
+ prices[code] = price unless code.empty? || price.empty?
80
+ end
81
+ prices
82
+ end
83
+
84
+ def build_map(csv_string, prices)
85
+ map = {}
86
+ return map if csv_string.nil? || csv_string.strip.empty?
87
+ CSV.parse(csv_string, headers: true) do |row|
88
+ next unless (row["abgabekategorie"].to_s =~ /\bSL\b/)
89
+ gtin = row["ean"].to_s.strip.rjust(13, "0")
90
+ next unless gtin =~ /\A\d{13}\z/
91
+ price = resolve_price(row["csl"], prices)
92
+ map[gtin] = {
93
+ sl: true,
94
+ price: price,
95
+ csl: row["csl"].to_s.strip,
96
+ abgabe: row["abgabekategorie"].to_s.strip
97
+ }
98
+ end
99
+ map
100
+ end
101
+
102
+ # csl is either "<code>" or "<N> x <code>" (the package multiplier). Returns
103
+ # the public price as a "NN.NN" String, or nil when it cannot be resolved.
104
+ def resolve_price(csl, prices)
105
+ csl = csl.to_s.strip
106
+ return nil if csl.empty?
107
+ m = csl.match(/\A(?:(\d+)\s*[x×]\s*)?(\d{7})\z/i)
108
+ return nil unless m
109
+ multiplier = (m[1] || "1").to_i
110
+ base = prices[m[2]]
111
+ return nil unless base
112
+ sprintf("%.2f", base.to_f * multiplier)
113
+ end
114
+ end
115
+ 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