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.
- checksums.yaml +4 -4
- data/CLAUDE.md +2 -0
- data/Gemfile.lock +1 -1
- data/History.txt +4 -0
- data/data/bag_sl_group_prices.csv +143 -0
- data/data/weleda_arzneimittel.csv +835 -0
- data/lib/oddb2xml/builder.rb +44 -3
- data/lib/oddb2xml/cli.rb +10 -0
- data/lib/oddb2xml/downloader.rb +20 -0
- data/lib/oddb2xml/version.rb +1 -1
- data/lib/oddb2xml/weleda_sl.rb +115 -0
- data/spec/artikelstamm_spec.rb +11 -0
- data/spec/builder_spec.rb +12 -0
- data/spec/data/bag_sl_group_prices.csv +143 -0
- data/spec/data/transfer.dat +1 -0
- data/spec/data/weleda_arzneimittel.csv +835 -0
- data/spec/spec_helper.rb +2 -0
- data/spec/weleda_sl_spec.rb +94 -0
- data/tools/generate_bag_sl_group_prices.rb +65 -0
- metadata +11 -1
data/lib/oddb2xml/builder.rb
CHANGED
|
@@ -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
|
-
|
|
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
|
data/lib/oddb2xml/downloader.rb
CHANGED
|
@@ -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
|
data/lib/oddb2xml/version.rb
CHANGED
|
@@ -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
|
data/spec/artikelstamm_spec.rb
CHANGED
|
@@ -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
|
data/spec/data/transfer.dat
CHANGED
|
@@ -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
|