oddb2xml 2.5.3 → 2.5.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1a338462cc07d2820cb85ed2bab9e76e527a7b2e
4
- data.tar.gz: 8b675f13da43ab8967e5d6b389553029433899bf
3
+ metadata.gz: ecd8f5025daaf98e1a23e42069c1a0b6f0f71792
4
+ data.tar.gz: 4f7e3d9fa12579d85c93fa00399584e0185fa1ee
5
5
  SHA512:
6
- metadata.gz: 45c766b45fe01b2b441aaab304347336f3962d2b83224dd43a5462da2b11c1f3cbeb598aba0c0c79e5fbba2ce6b9d951304a572adf1a2dfe29426c99b6b7858e
7
- data.tar.gz: feb8c5046c1585e289a17a02f56d9dcebace6ddd8fb0df2c7d0027b1e4fcaabd838c555b799c2e549e2113d47acdf03cfb8cb6255a1651685987af506fb33595
6
+ metadata.gz: c81408b0c1e8afc663825b5fed409f929225ccd529f8d626c17f58b5ad625ed4b382963b74dbaedd427bf6f13b5d454ef421b442e973b73c42f5521b378eb5a4
7
+ data.tar.gz: d437a60586bc3e47307da01d9aded873f5968bcb411b848b734a951cd029f77b73bba0efefc8e41f25cdecb6550c2ba108045e14336c57b246b97ab3c79555ea
@@ -1,3 +1,8 @@
1
+ === 2.5.4 / 09.04.2018
2
+
3
+ * Correct name in Artikelstamm, when several packages exist in Preparions.xml (SL)
4
+ * Mark correctly all SL-Entries in Artikeltstamm
5
+
1
6
  === 2.5.3 / 28.03.2018
2
7
 
3
8
  * Updated needed Ruby version in README.md
@@ -40,7 +40,7 @@ Oder
40
40
  * swissmedic_package.csv https://www.swissmedic.ch/dam/swissmedic/de/dokumente/listen/excel-version_zugelasseneverpackungen.xlsx.download.xlsx/excel-version_zugelasseneverpackungen.xlsx
41
41
  * oddb2xml_files_lppv.txt https://raw.githubusercontent.com/zdavatz/oddb2xml_files/master/LPPV.txt
42
42
  * XMLPublications.zip http://bag.e-mediat.net/SL2007.Web.External/File.axd?file=XMLPublications.zip Dieses enthält
43
- ** Preparations.xml
43
+ ** Preparations.xml Hier sind alle Artikel aufgeführt, welche zur Spezialitätenliste (aka SL_ENTRY) gehören
44
44
  * transfer.zip http://pillbox.oddb.org/TRANSFER.ZIP Dieses enthält
45
45
  ** transfer.dat
46
46
 
@@ -1,10 +1,8 @@
1
1
  # encoding: utf-8
2
-
3
2
  require 'nokogiri'
4
3
  require 'oddb2xml/util'
5
4
  require 'oddb2xml/calc'
6
5
  require 'csv'
7
-
8
6
  class Numeric
9
7
  # round a given number to the nearest step
10
8
  def round_by(increment)
@@ -51,7 +49,7 @@ module Oddb2xml
51
49
  @options = args
52
50
  @subject = nil
53
51
  @refdata = {}
54
- @items = {} # Items from Preparations.xml in BAG, using @gtins as key
52
+ @items = {} # Spezailitäteniste: SL-Items from Preparations.xml in BAG, using GTINS as key
55
53
  @flags = {}
56
54
  @lppvs = {}
57
55
  @infos = {}
@@ -1399,47 +1397,57 @@ module Oddb2xml
1399
1397
  end
1400
1398
  def emit_items(xml)
1401
1399
  nr_items = 0
1402
- @nr_items = @gtins.size
1403
- @gtins.each do |ean13|
1400
+ gtins_to_article = {}
1401
+ @articles.each {|article| gtins_to_article[article[:ean13]] = article }
1402
+ sl_gtins = @items.values.collect{|x| x[:packages].keys}.flatten.uniq;
1403
+ gtins = gtins_to_article.keys + @infos_zur_rose.keys + @packs.values.collect{|x| x[:ean13]} + sl_gtins
1404
+ gtins = (gtins-@@gtin2ignore)
1405
+ gtins.sort!.uniq!
1406
+ gtins.each do |ean13|
1404
1407
  pac,no8 = nil,ean13.to_s[4..11] # BAG-XML(SL/LS)
1405
1408
  next if ean13 == 0
1406
- obj = @gtins_to_article[ean13] || @infos_zur_rose[ean13]
1409
+ obj = gtins_to_article[ean13] || @items.values.find{|x| x[:packages].keys.index(ean13) } || @infos_zur_rose[ean13]
1407
1410
  if obj
1408
1411
  obj = @packs[no8].merge(obj) if @packs[no8]
1409
1412
  else
1410
1413
  obj = @packs[no8] # obj not yet in refdata. Use data from swissmedic_package.xlsx
1411
1414
  end
1412
1415
  nr_items += 1
1413
- Oddb2xml.log "build_article #{nr_items} of #{@gtins.size} articles" if nr_items % 5000 == 0
1416
+ Oddb2xml.log "build_article #{nr_items} of #{gtins.size} articles" if nr_items % 5000 == 0
1414
1417
  item = @items[ean13]
1415
1418
  pack_info = nil
1416
1419
  pack_info = @packs[no8] if no8 && /#{ean13}/.match(@packs[no8].to_s) # info from Packungen.xlsx from swissmedic_info
1417
1420
  next if pack_info && /Tierarzneimittel/.match(pack_info[:list_code])
1418
1421
  next if obj[:desc_de] && /ad us vet/i.match(obj[:desc_de])
1419
1422
  sequence = obj[:seq]
1420
- unless sequence
1421
- if @packs[no8] && /#{ean13}/.match(@packs[no8].to_s)
1422
- sequence = {:packages =>{ean13 => @packs[no8]}}
1423
- obj[:seq] = sequence.clone
1424
- end
1423
+ if sequence.nil? && @packs[no8] && /#{ean13}/.match(@packs[no8].to_s)
1424
+ sequence = {:packages =>{ean13 => @packs[no8]}}
1425
+ obj[:seq] = sequence.clone
1425
1426
  end
1426
- if no8
1427
- ppac = ((_ppac = pack_info and !_ppac[:is_tier]) ? _ppac : nil)
1427
+ if sequence.nil? && @items[ean13] && @items[ean13][:packages][ean13]
1428
+ sequence = @items[ean13]
1428
1429
  end
1429
1430
  if sequence
1430
- unless obj[:seq][:packages].keys.index(ean13)
1431
+ if obj[:seq] && !obj[:seq][:packages].keys.index(ean13)
1431
1432
  # puts "unable to find #{ean13} in #{obj[:seq][:packages].keys}"
1432
1433
  next
1433
1434
  end
1434
1435
  sequence[:packages].each do |gtin, package|
1435
1436
  pkg_gtin = package[:ean13].clone
1437
+ if package[:no8] && (newEan13 = Oddb2xml.getEan13forNo8(package[:no8]))
1438
+ if !newEan13.eql?(pkg_gtin)
1439
+ puts "Setting #{newEan13} for #{pkg_gtin}"
1440
+ pkg_gtin = newEan13
1441
+ end
1442
+ end
1436
1443
  pharma_code = @refdata[pkg_gtin]
1437
1444
  if @refdata[pkg_gtin] && @refdata[pkg_gtin][:pharmacode]
1438
1445
  pharma_code = @refdata[pkg_gtin][:pharmacode]
1439
- else
1446
+ elsif obj[:pharmacode]
1440
1447
  pharma_code = obj[:pharmacode]
1448
+ elsif @infos_zur_rose[ean13]
1449
+ pharma_code = @infos_zur_rose[ean13][:pharmacode]
1441
1450
  end
1442
- #
1443
1451
  info = @calc_items[pkg_gtin]
1444
1452
  if @@emitted_v5_gtins.index(pkg_gtin)
1445
1453
  next
@@ -1448,17 +1456,30 @@ module Oddb2xml
1448
1456
  end
1449
1457
  options = {'PHARMATYPE' => 'P'}
1450
1458
  xml.ITEM(options) do
1451
- name = (@refdata[pkg_gtin] ? @refdata[pkg_gtin][:desc_de] : nil) || obj[:desc_de] || obj[:sequence_name]
1459
+ # require 'pry'; binding.pry if pkg_gtin.to_i == 7680665990026
1460
+ name = item[:name_de] + ' ' + item[:desc_de].strip + ' ' + package[:desc_de] if package && package[:desc_de]
1461
+ name ||= @refdata[pkg_gtin] ? @refdata[pkg_gtin][:desc_de] : nil
1462
+ name ||= @infos_zur_rose[ean13][:description] if @infos_zur_rose[ean13]
1463
+ name ||= obj[:name_de] + ', ' + obj[:desc_de].strip if obj[:name_de]
1464
+ name ||= (item[:desc_de] + item[:name_de]) if item
1465
+ name ||= obj[:sequence_name]
1452
1466
  xml.GTIN pkg_gtin.to_s.rjust(13, '0')
1453
1467
  override(xml, pkg_gtin, :PHAR, pharma_code)
1454
1468
  xml.SALECD('A')
1455
1469
  # maxLength for DSCR is 50 for Artikelstamm v3
1456
1470
  xml.DSCR(name) # for description for zur_rose
1457
- xml.DSCRF(obj[:desc_fr] || '--missing--')
1471
+ name_fr = item[:name_fr] + ' ' + item[:desc_fr].strip + ' ' + package[:desc_fr] if package && package[:desc_fr]
1472
+ name_fr ||= @refdata[pkg_gtin] ? @refdata[pkg_gtin][:desc_fr] : nil
1473
+ # Zugelassenen Packungen has only german names
1474
+ name_fr ||= (obj[:name_fr] + ', ' + obj[:desc_fr]).strip if obj[:name_fr]
1475
+ # ZuRorse has only german names
1476
+ name_fr ||= (item[:name_fr] + ', ' + item[:desc_fr]) if item
1477
+ name_fr ||= '--missing--'
1478
+ xml.DSCRF(name_fr)
1458
1479
  xml.COMP do # Manufacturer
1459
1480
  xml.NAME obj[:company_name]
1460
1481
  xml.GLN obj[:company_ean]
1461
- end
1482
+ end if obj[:company_name] || obj[:company_ean]
1462
1483
  pexf = ppub = nil
1463
1484
  if package[:prices]
1464
1485
  pexf ||= package[:prices][:exf_price][:price]
@@ -1492,16 +1513,15 @@ module Oddb2xml
1492
1513
  xml.DOSAGE_FORM info.galenic_form.descriptions['de'] if info.galenic_form.descriptions['de']
1493
1514
  xml.DOSAGE_FORMF info.galenic_form.descriptions['fr'] if info.galenic_form.descriptions['fr']
1494
1515
  end
1495
- xml.SL_ENTRY 'true' if @items[pkg_gtin]
1516
+ xml.SL_ENTRY 'true' if sl_gtins.index(pkg_gtin)
1496
1517
  xml.IKSCAT package[:swissmedic_category] if package[:swissmedic_category] && package[:swissmedic_category].length > 0
1497
1518
  xml.GENERIC_TYPE sequence[:org_gen_code] if sequence[:org_gen_code] && !sequence[:org_gen_code].empty?
1498
1519
  xml.LPPV 'true' if @lppvs[pkg_gtin.to_s] # detect_nincd
1499
1520
  case item[:deductible]
1500
- when 'Y'; xml.DEDUCTIBLE 20; # 20%
1501
- when 'N'; xml.DEDUCTIBLE 10; # 10%
1502
- else # xml.DEDUCTIBLE '' # k.A.
1521
+ when 'Y'; xml.DEDUCTIBLE 20; # 20%
1522
+ when 'N'; xml.DEDUCTIBLE 10; # 10%
1503
1523
  end if item && item[:deductible]
1504
- prodno = SwissmedicExtractor.getProdnoForEan13(pkg_gtin)
1524
+ prodno = Oddb2xml.getProdnoForEan13(pkg_gtin)
1505
1525
  xml.PRODNO prodno if prodno
1506
1526
  csv = []
1507
1527
  @csv_file << [pkg_gtin, name, package[:unit], measure,
@@ -1562,7 +1582,7 @@ module Oddb2xml
1562
1582
  @nr_articles = 0
1563
1583
  used_limitations = []
1564
1584
  Oddb2xml.log "#{variant}: Deleted #{@old_rose_size - @new_rose_size} entries from ZurRose where GTIN start with 7680 (Swissmedic)"
1565
- # Oddb2xml.log "#{variant} #{nr_products} of #{@products.size} articles and ignore #{@@gtin2ignore.size} @gtins specified via #{@@ignore_file}"
1585
+ # Oddb2xml.log "#{variant} #{nr_products} of #{@products.size} articles and ignore #{@@gtin2ignore.size} gtins specified via #{@@ignore_file}"
1566
1586
  _builder = Nokogiri::XML::Builder.new(:encoding => 'utf-8') do |xml|
1567
1587
  xml.doc.tag_suffix = @tag_suffix
1568
1588
  datetime = Time.new.strftime('%FT%T%z')
@@ -1578,11 +1598,6 @@ module Oddb2xml
1578
1598
  no8_to_prodno = {}
1579
1599
  @packs.collect{ |key, val| no8_to_prodno[key] = val [:prodno] }
1580
1600
  xml.comment("Produced by #{__FILE__} version #{VERSION} at #{Time.now}")
1581
- @gtins_to_article = {}
1582
- @articles.each {|article| @gtins_to_article[article[:ean13]] = article }
1583
- @gtins = @gtins_to_article.keys + @infos_zur_rose.keys + @packs.values.collect{|x| x[:ean13]}
1584
- @gtins = (@gtins-@@gtin2ignore)
1585
- @gtins.sort!.uniq!
1586
1601
  xml.ARTIKELSTAMM(options_xml) do
1587
1602
  xml.PRODUCTS do
1588
1603
  products = @products.sort_by { |ean13, obj| ean13 }
@@ -1603,7 +1618,7 @@ module Oddb2xml
1603
1618
  next if emitted_prodno.index(prodno)
1604
1619
  sequence ||= @articles.find{|x| x[:ean13].eql?(ean)}
1605
1620
  next unless sequence && (sequence[:name_de] || sequence[:desc_de])
1606
- if SwissmedicExtractor.getEan13forProdno(prodno).size == 0
1621
+ if Oddb2xml.getEan13forProdno(prodno).size == 0
1607
1622
  puts "No item found for prodno #{prodno} no8 #{obj[:no8]} #{sequence[:name_de]} "
1608
1623
  next
1609
1624
  end
@@ -1666,7 +1681,7 @@ module Oddb2xml
1666
1681
  lines << " - #{sprintf('%5d', @products.size)} products"
1667
1682
  lines << " - #{sprintf('%5d', @limitations.size)} limitations"
1668
1683
  lines << " - #{sprintf('%5d', @nr_articles)} articles"
1669
- lines << " - #{sprintf('%5d', @@gtin2ignore.size)} ignored @gtins"
1684
+ lines << " - #{sprintf('%5d', @@gtin2ignore.size)} ignored GTINS"
1670
1685
  @@articlestamm_v5_info_lines = lines
1671
1686
  _builder.to_xml({:indent => 4, :encoding => 'UTF-8'})
1672
1687
  end
@@ -38,6 +38,10 @@ module Oddb2xml
38
38
  data = {}
39
39
  result = PreparationsEntry.parse(@xml.sub(Strip_For_Sax_Machine, ''), :lazy => true)
40
40
  result.Preparations.Preparation.each do |seq|
41
+ if seq.SwissmedicNo5.eql?('0')
42
+ puts "BagXmlExtractor Skipping SwissmedicNo5 0 for #{seq.NameDe} #{seq.DescriptionDe} #{seq.CommentDe}"
43
+ next
44
+ end
41
45
  item = {}
42
46
  item[:data_origin] = 'bag_xml'
43
47
  item[:refdata] = true
@@ -72,19 +76,21 @@ module Oddb2xml
72
76
  item[:packages] = {} # pharmacode => package
73
77
  seq.Packs.Pack.each do |pac|
74
78
  if pac.SwissmedicNo8 && pac.SwissmedicNo8.length < 8
75
- puts "BagXmlExtractor: Adding leading zeros for SwissmedicNo8 #{pac.SwissmedicNo8} BagDossierNo #{pac.BagDossierNo} PackId #{pac.PackId} #{item[:name_de]}"
79
+ puts "BagXmlExtractor: Adding leading zeros for SwissmedicNo8 #{pac.SwissmedicNo8} BagDossierNo #{pac.BagDossierNo} PackId #{pac.PackId} #{item[:name_de]}" if $VERBOSE
76
80
  pac.SwissmedicNo8 = pac.SwissmedicNo8.rjust(8, '0')
77
81
  end
78
82
  unless pac.GTIN
79
83
  unless pac.SwissmedicNo8
80
- puts "BagXmlExtractor: Skipping as missing GTIN in SwissmedicNo8 #{pac.SwissmedicNo8} BagDossierNo #{pac.BagDossierNo} PackId #{pac.PackId} #{item[:name_de]}. Skipping"
84
+ puts "BagXmlExtractor: Missing GTIN and SwissmedicNo8 in SwissmedicNo8 #{pac.SwissmedicNo8} BagDossierNo #{pac.BagDossierNo} PackId #{pac.PackId} #{item[:name_de]}"
85
+ next
81
86
  else
82
87
  ean12 = '7680' + pac.SwissmedicNo8
83
88
  pac.GTIN = (ean12 + Oddb2xml.calc_checksum(ean12)) unless @artikelstamm
84
- puts "BagXmlExtractor: Missing GTIN in SwissmedicNo8 #{pac.SwissmedicNo8} BagDossierNo #{pac.BagDossierNo} PackId #{pac.PackId} #{item[:name_de]}."
89
+ # puts "BagXmlExtractor: Missing GTIN in SwissmedicNo8 #{pac.SwissmedicNo8} BagDossierNo #{pac.BagDossierNo} PackId #{pac.PackId} #{item[:name_de]}."
85
90
  end
86
91
  end
87
92
  ean13 = pac.GTIN.to_s
93
+ Oddb2xml.setEan13forNo8(pac.SwissmedicNo8, ean13) if pac.SwissmedicNo8
88
94
  # packages
89
95
  exf = {:price => '', :valid_date => '', :price_code => ''}
90
96
  if pac.Prices and pac.Prices.ExFactoryPrice
@@ -100,6 +106,11 @@ module Oddb2xml
100
106
  end
101
107
  item[:packages][ean13] = {
102
108
  :ean13 => ean13,
109
+ :name_de => (desc = seq.NameDe) ? desc : '',
110
+ :name_fr => (desc = seq.NameFr) ? desc : '',
111
+ :desc_de => (desc = pac.DescriptionDe) ? desc : '',
112
+ :desc_fr => (desc = pac.DescriptionFr) ? desc : '',
113
+ :sl_entry => true,
103
114
  :swissmedic_category => (cat = pac.SwissmedicCategory) ? cat : '',
104
115
  :swissmedic_number8 => (num = pac.SwissmedicNo8) ? num : '',
105
116
  :prices => { :exf_price => exf, :pub_price => pub },
@@ -168,6 +179,14 @@ module Oddb2xml
168
179
  # limitation points
169
180
  pts = pac.PointLimitations.PointLimitation.first # only first points
170
181
  item[:packages][ean13][:limitation_points] = pts ? pts.Points : ''
182
+ if pac.SwissmedicNo8
183
+ ean12 = '7680' + pac.SwissmedicNo8
184
+ correct_ean13 = ean12+ Oddb2xml.calc_checksum(ean12)
185
+ unless pac.GTIN.eql?(correct_ean13)
186
+ puts "pac.GTIN #{pac.GTIN} should be #{correct_ean13}"
187
+ item[:packages][ean13][:CORRECT_EAN13] = correct_ean13
188
+ end
189
+ end
171
190
  data[ean13] = item
172
191
  end
173
192
  end
@@ -196,11 +215,12 @@ module Oddb2xml
196
215
  end
197
216
  # but in refdata_nonPharma we have a about 700 GTINs which are 14 characters and longer
198
217
  item = {}
218
+ item[:ean13] = ean13
219
+ item[:no8] = pac.SWMC_AUTHNR
220
+ item[:pharmacode] = (phar = pac.PHAR.to_s) ? phar: '0'
199
221
  item[:data_origin] = 'refdata'
200
222
  item[:refdata] = true
201
223
  item[:_type] = (typ = pac.ATYPE.downcase.to_sym) ? typ: ''
202
- item[:ean13] = ean13
203
- item[:pharmacode] = (phar = pac.PHAR.to_s) ? phar: '0'
204
224
  item[:last_change] = (date = Time.parse(pac.DT).to_s) ? date: '' # Date and time of last data change
205
225
  item[:desc_de] = (dscr = pac.NAME_DE) ? dscr: ''
206
226
  item[:desc_fr] = (dscr = pac.NAME_FR) ? dscr: ''
@@ -225,17 +245,8 @@ module Oddb2xml
225
245
  @type = type
226
246
  Oddb2xml.log("SwissmedicExtractor #{@filename} #{File.size(@filename)} bytes")
227
247
  return unless File.exists?(@filename)
228
- @@prodno_to_ean13 = {}
229
- @@ean13_to_prodno = {}
230
248
  @sheet = RubyXL::Parser.parse(File.expand_path(@filename)).worksheets[0]
231
249
  end
232
- # Needed for ensuring consitency for the Artikelstamm
233
- def self.getEan13forProdno(prodno)
234
- @@prodno_to_ean13[prodno] || []
235
- end
236
- def self.getProdnoForEan13(ean13)
237
- @@ean13_to_prodno[ean13]
238
- end
239
250
  def to_arry
240
251
  data = []
241
252
  return data unless @sheet
@@ -304,15 +315,14 @@ module Oddb2xml
304
315
  ean_base12 = "7680#{no8}"
305
316
  prodno = Oddb2xml.gen_prodno(row[iksnr].value.to_i, row[seqnr].value.to_i)
306
317
  ean13 = (ean_base12.ljust(12, '0') + Oddb2xml.calc_checksum(ean_base12))
307
- @@prodno_to_ean13[prodno] ||= []
308
- @@prodno_to_ean13[prodno] << ean13
309
- @@ean13_to_prodno[ean13] = prodno
318
+ Oddb2xml.setEan13forProdno(prodno, ean13)
319
+ Oddb2xml.setEan13forNo8(no8, ean13)
310
320
  data[no8] = {
321
+ :no8 => no8,
311
322
  :ean13 => ean13,
312
323
  :prodno => prodno,
313
324
  :seqnr => row[seqnr].value,
314
- :iksnr => row[iksnr].value,
315
- :ith_swissmedic => row[ith] ? row[ith].value.to_s : '',
325
+ :ith_swissmedic => row[ith] ? row[ith].value.to_s : '',
316
326
  :swissmedic_category => row[cat].value.to_s,
317
327
  :atc_code => row[atc] ? Oddb2xml.add_epha_changes_for_ATC(row[iksnr].value.to_s, row[atc].value.to_s) : '',
318
328
  :list_code => row[list_code] ? row[list_code].value.to_s : '',
@@ -513,6 +523,7 @@ module Oddb2xml
513
523
  while line = @io.gets
514
524
  ean13 = "-1"
515
525
  line = Oddb2xml.patch_some_utf8(line).chomp
526
+ # next unless /(7680\d{9})(\d{1})$/.match(line) # Skip non pharma
516
527
  next if line =~ /(ad us\.* vet)|(\(vet\))/i
517
528
  if @@extended
518
529
  next unless line =~ /(\d{13})(\d{1})$/
@@ -185,4 +185,41 @@ module Oddb2xml
185
185
  end
186
186
  end
187
187
 
188
+ # Needed for ensuring consistency for the Artikelstamm
189
+ @@prodno_to_ean13 = {}
190
+ @@no8_to_ean13 = {}
191
+ @@ean13_to_prodno = {}
192
+ @@ean13_to_no8 = {}
193
+ def Oddb2xml.setEan13forProdno(prodno, ean13)
194
+ if ean13.to_i == 7680006660045 || ean13.to_i == 7680006660014
195
+ puts "setEan13forProdno #{prodno} ean13 #{ean13}"
196
+ end
197
+ @@prodno_to_ean13[prodno] ||= []
198
+ @@prodno_to_ean13[prodno] << ean13
199
+ @@ean13_to_prodno[ean13] = prodno
200
+ end
201
+ def Oddb2xml.setEan13forNo8(no8, ean13)
202
+ if ean13.to_i == 7680006660045 || ean13.to_i == 7680006660014
203
+ puts "setEan13forNo8 #{no8} ean13 #{ean13}"
204
+ end
205
+ if @@no8_to_ean13[no8].nil?
206
+ @@no8_to_ean13[no8] = ean13
207
+ @@ean13_to_no8[ean13] = no8
208
+ elsif !@@no8_to_ean13[no8].eql?(ean13)
209
+ puts "@@no8_to_ean13[no8] #{@@no8_to_ean13[no8]} not overridden by #{ean13}"
210
+ end
211
+ end
212
+ def Oddb2xml.getEan13forProdno(prodno)
213
+ @@prodno_to_ean13[prodno] || []
214
+ end
215
+ def Oddb2xml.getEan13forNo8(no8)
216
+ @@no8_to_ean13[no8] || []
217
+ end
218
+ def Oddb2xml.getProdnoForEan13(ean13)
219
+ @@ean13_to_prodno[ean13]
220
+ end
221
+ def Oddb2xml.getNo8ForEan13(ean13)
222
+ @@ean13_to_no8[ean13]
223
+ end
224
+
188
225
  end
@@ -1,3 +1,3 @@
1
1
  module Oddb2xml
2
- VERSION = "2.5.3"
2
+ VERSION = "2.5.4"
3
3
  end
@@ -24,7 +24,7 @@ describe Oddb2xml::Builder do
24
24
  unless @inhalt.index(expected_value)
25
25
  puts expected_value
26
26
  end
27
- binding.pry unless @inhalt.index(expected_value)
27
+ # binding.pry unless @inhalt.index(expected_value)
28
28
  expect(@inhalt.index(expected_value)).not_to be nil
29
29
  end
30
30
  def common_run_init(options = {})
@@ -121,7 +121,7 @@ describe Oddb2xml::Builder do
121
121
  it 'should find price from Preparations.xml by setting' do
122
122
  expect(File.exists?(@elexis_v5_csv)).to eq true
123
123
  inhalt = File.open(@elexis_v5_csv, 'r+').read
124
- expected = %(7680658560014,"DIBASE 10'000, orale Tropflösung",Flasche(n),Flasche(n),5,9.25,6585601,A11CC05,cholecalciferolum,,07.02.3.,SL)
124
+ expected = %(7680658560014,"Dibase 10'000, Tropfen 10000 IE/ml",Flasche(n),Flasche(n),5,9.25,6585601,A11CC05,cholecalciferolum,,07.02.3.,SL)
125
125
  expect(inhalt.index(expected)).to be > 0
126
126
  end
127
127
 
@@ -139,7 +139,7 @@ describe Oddb2xml::Builder do
139
139
  it 'should have a price for Lynparza' do
140
140
  expect(File.exists?(@elexis_v5_csv)).to eq true
141
141
  inhalt = File.open(@elexis_v5_csv, 'r+').read
142
- expect(inhalt.index('7680651600014,LYNPARZA Kaps 50 mg 448 Stk,,Kapsel(n),5562.48,5947.55')).not_to be nil
142
+ expect(inhalt.index('7680651600014,Lynparza Kaps 50 mg 448 Stk,,Kapsel(n),5562.48,5947.55,,,,"",,SL')).not_to be nil
143
143
  end
144
144
  it 'should trim the ean13 to 13 length' do
145
145
  gtin14 = "00040565124346"
@@ -217,32 +217,46 @@ describe Oddb2xml::Builder do
217
217
  <GTIN>7680658560014</GTIN>
218
218
  <!--override with-->
219
219
  <SALECD>A</SALECD>
220
- <DSCR>DIBASE 10'000, orale Tropflösung</DSCR>
221
- <DSCRF>--missing--</DSCRF>)
220
+ <DSCR>Dibase 10'000, Tropfen 10000 IE/ml</DSCR>
221
+ <DSCRF>Dibase 10'000, gouttes 10000 UI/ml</DSCRF>
222
+ <COMP>
223
+ <NAME>Gebro Pharma AG</NAME>
224
+ <GLN/>
225
+ </COMP>
226
+ <PEXF>5</PEXF>
227
+ <PPUB>9.25</PPUB>
228
+ <PKG_SIZE>1</PKG_SIZE>
229
+ <MEASURE>Flasche(n)</MEASURE>
230
+ <MEASUREF>Flasche(n)</MEASUREF>
231
+ <DOSAGE_FORM>orale Tropflösung</DOSAGE_FORM>
232
+ <SL_ENTRY>true</SL_ENTRY>
233
+ <IKSCAT>D</IKSCAT>
234
+ <DEDUCTIBLE>10</DEDUCTIBLE>
235
+ <PRODNO>6585601</PRODNO>
236
+ </ITEM>)
222
237
  expect(@inhalt.index(expected)).not_to be nil
223
238
  end
224
239
 
225
- it 'should contain a public price if the item was only in the SL liste (Preparations.xml)' do
226
- # same as 7680403330459 CARBADERM
227
- expect(@inhalt.index('<PPUB>27.70</PPUB>')).not_to be nil
228
- end
229
240
  it 'should contain PEVISONE Creme 30 g' do
230
- expect(@inhalt.index('PEVISONE Creme 15 g')).not_to be nil # 7680406620144
231
- expect(@inhalt.index('PEVISONE Creme 30 g')).not_to be nil # 7680406620229
241
+ expect(@inhalt.index('Pevisone Creme 15 g')).not_to be nil # 7680406620144
242
+ expect(@inhalt.index('Pevisone Creme 30 g')).not_to be nil # 7680406620229
232
243
  # Should also check for price!
233
244
  end
234
245
  it 'should validate against artikelstamm.xsd' do
235
246
  validate_via_xsd(@elexis_v5_xsd, @artikelstamm_name)
236
247
  end
237
- tests = { 'item 7680403330459 CARBADERM only in Preparations(SL)' =>
248
+ tests = { 'item 7680403330459 CARBADERM only in Preparations(SL) with public price' =>
238
249
  %(<ITEM PHARMATYPE="P">
239
250
  <GTIN>7680403330459</GTIN>
240
251
  <PHAR>3603779</PHAR>
241
252
  <SALECD>A</SALECD>
242
- <DSCR>CARBADERM Creme Tb 300 ml</DSCR>
243
- <DSCRF>--missing--</DSCRF>
244
- <PEXF>16.22</PEXF>
245
- <PPUB>27.70</PPUB>
253
+ <DSCR>Carbaderm Creme Tb 300 ml</DSCR>
254
+ <DSCRF>Carbaderm crème tb 300 ml</DSCRF>
255
+ <PEXF>14.61</PEXF>
256
+ <PPUB>26.95</PPUB>
257
+ <SL_ENTRY>true</SL_ENTRY>
258
+ <IKSCAT>D</IKSCAT>
259
+ <DEDUCTIBLE>10</DEDUCTIBLE>
246
260
  </ITEM>),
247
261
  'item 4042809018288 TENSOPLAST' =>
248
262
  %(<ITEM PHARMATYPE="N">
@@ -296,13 +310,13 @@ describe Oddb2xml::Builder do
296
310
  <DEDUCTIBLE>10</DEDUCTIBLE>
297
311
  <PRODNO>5366201</PRODNO>
298
312
  </ITEM>),
299
- 'item 7680161050583 HIRUDOID' =>
313
+ 'item 7680161050583 HIRUDOID 40g' =>
300
314
  %(<ITEM PHARMATYPE="P">
301
315
  <GTIN>7680161050583</GTIN>
302
316
  <PHAR>2731179</PHAR>
303
317
  <SALECD>A</SALECD>
304
- <DSCR>HIRUDOID Creme 3 mg/g 40 g</DSCR>
305
- <DSCRF>HIRUDOID crème 3 mg/g 40 g</DSCRF>
318
+ <DSCR>Hirudoid Creme 3 mg/g 40 g</DSCR>
319
+ <DSCRF>Hirudoid crème 3 mg/g 40 g</DSCRF>
306
320
  <COMP>
307
321
  <NAME>Medinova AG</NAME>
308
322
  <GLN>7601001002258</GLN>
@@ -318,12 +332,29 @@ describe Oddb2xml::Builder do
318
332
  <DEDUCTIBLE>10</DEDUCTIBLE>
319
333
  <PRODNO>1610501</PRODNO>
320
334
  </ITEM>),
335
+ 'item 7680161050743 100g ' =>
336
+ %( <ITEM PHARMATYPE="P">
337
+ <GTIN>7680161050743</GTIN>
338
+ <PHAR>2731179</PHAR>
339
+ <SALECD>A</SALECD>
340
+ <DSCR>Hirudoid Creme 3 mg/g 100 g</DSCR>
341
+ <DSCRF>Hirudoid crème 3 mg/g 100 g</DSCRF>
342
+ <COMP>
343
+ <NAME>Medinova AG</NAME>
344
+ <GLN>7601001002258</GLN>
345
+ </COMP>
346
+ <PEXF>9.555316</PEXF>
347
+ <PPUB>17.65</PPUB>
348
+ <SL_ENTRY>true</SL_ENTRY>
349
+ <IKSCAT>D</IKSCAT>
350
+ <DEDUCTIBLE>10</DEDUCTIBLE>
351
+ </ITEM>),
321
352
  'item 7680284860144 ANCOPIR' =>'<ITEM PHARMATYPE="P">
322
353
  <GTIN>7680284860144</GTIN>
323
354
  <PHAR>0177804</PHAR>
324
355
  <SALECD>A</SALECD>
325
- <DSCR>Ancopir, Injektionslösung</DSCR>
326
- <DSCRF>--missing--</DSCRF>
356
+ <DSCR>ANCOPIR Inj Lös 5 Amp 2 ml</DSCR>
357
+ <DSCRF>Ancopir, sol inj</DSCRF>
327
358
  <COMP>
328
359
  <NAME>Dr. Grossmann AG, Pharmaca</NAME>
329
360
  <GLN/>
@@ -340,7 +371,7 @@ describe Oddb2xml::Builder do
340
371
  <DEDUCTIBLE>10</DEDUCTIBLE>
341
372
  <PRODNO>2848601</PRODNO>
342
373
  </ITEM>',
343
- 'FERROUMET pice from ZurRose ' => %(<ITEM PHARMATYPE="P">
374
+ 'FERRO-GRADUMET price from ZurRose ' => %(<ITEM PHARMATYPE="P">
344
375
  <GTIN>7680316440115</GTIN>
345
376
  <PHAR>0020244</PHAR>
346
377
  <SALECD>A</SALECD>
@@ -389,8 +420,8 @@ describe Oddb2xml::Builder do
389
420
  <GTIN>7680532900196</GTIN>
390
421
  <PHAR>1699999</PHAR>
391
422
  <SALECD>A</SALECD>
392
- <DSCR>HUMALOG Inj Lös 100 IE/ml Durchstf 10 ml</DSCR>
393
- <DSCRF>HUMALOG sol inj 100 UI/ml flac 10 ml</DSCRF>
423
+ <DSCR>Humalog Inj Lös Durchstf 10 ml</DSCR>
424
+ <DSCRF>Humalog sol inj flac 10 ml</DSCRF>
394
425
  <COMP>
395
426
  <NAME>Eli Lilly (Suisse) SA</NAME>
396
427
  <GLN>7601001261853</GLN>
@@ -456,7 +456,7 @@ def checkProductXml(nbr_record = -1)
456
456
  expect(desitin.elements['SubstanceSwissmedic'].text).to eq 'levetiracetamum'
457
457
  expect(desitin.elements['CompositionSwissmedic'].text).to eq 'levetiracetamum 250 mg, excipiens pro compressi obducti pro charta.'
458
458
  expect(desitin.elements['CPT/CPTCMP/LINE'].text).to eq '0'
459
- expect(desitin.elements['CPT/CPTCMP/SUBNO'].text).to eq '15'
459
+ expect(desitin.elements['CPT/CPTCMP/SUBNO'].text).to eq '13'
460
460
  expect(desitin.elements['CPT/CPTCMP/QTY'].text).to eq '250'
461
461
  expect(desitin.elements['CPT/CPTCMP/QTYU'].text).to eq 'mg'
462
462
 
@@ -474,7 +474,7 @@ end
474
474
 
475
475
  describe Oddb2xml::Builder do
476
476
  NrExtendedArticles = 74
477
- NrSubstances = 30
477
+ NrSubstances = 27
478
478
  NrLimitations = 14
479
479
 
480
480
  NrInteractions = 2
@@ -69,6 +69,7 @@ describe Oddb2xml::RefdataExtractor do
69
69
  :refdata=>true,
70
70
  :_type=>:pharma,
71
71
  :ean13=> Oddb2xml::LEVETIRACETAM_GTIN.to_s,
72
+ :no8 => "62069008",
72
73
  :pharmacode=> pharma_code_LEVETIRACETAM,
73
74
  :data_origin => "refdata",
74
75
  :desc_de=>"LEVETIRACETAM DESITIN Mini Filmtab 250 mg 30 Stk",
@@ -95,6 +96,7 @@ describe Oddb2xml::RefdataExtractor do
95
96
  expected = {:refdata=>true,
96
97
  :_type=>:nonpharma,
97
98
  :ean13=>'7611600441020',
99
+ :no8 => nil,
98
100
  :pharmacode=>pharma_code_TUBEGAZE,
99
101
  :last_change => @@last_change,
100
102
  :data_origin => "refdata",
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: oddb2xml
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.5.3
4
+ version: 2.5.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yasuhiro Asaka, Zeno R.R. Davatz, Niklaus Giger
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-03-28 00:00:00.000000000 Z
11
+ date: 2018-04-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rubyzip