oddb2xml 2.5.3 → 2.5.4

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 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