module Oddb2xml

Constants

COLUMNS_FEBRUARY_2019

please keep this constant in sync between (GEM) swissmedic-diff/lib/swissmedic-diff.rb and (GEM) oddb2xml/lib/oddb2xml/extractor.rb

COLUMNS_JULY_2015
DOWNLOADS
FAKE_GTIN_START
GalenicForm
GalenicGroup

Calc is responsible for analysing the columns “Packungsgrösse” and “Einheit”

VERSION
WORK_DIR
XML_OPTIONS

Public Class Methods

add_epha_changes_for_ATC(iksnr, atc_code, force_run: false) click to toggle source
# File lib/oddb2xml/util.rb, line 68
def self.add_epha_changes_for_ATC(iksnr, atc_code, force_run: false)
  @atc_csv_content = {} if force_run
  if @atc_csv_content.size == 0
    Oddb2xml.uri_open(@atc_csv_origin).readlines.each { |line|
      items = line.split(",")
      @atc_csv_content[[items[0], items[1]]] = items[2]
    }

  end
  new_value = @atc_csv_content[[iksnr.to_s, atc_code]]
  new_value || atc_code
end
add_hash(string) click to toggle source
# File lib/oddb2xml/util.rb, line 190
def self.add_hash(string)
  doc = Nokogiri::XML.parse(string) do |config|
    config.huge
  end
  nr = 0
  doc.root.elements.each do |node|
    nr += 1
    next if node.name.eql?("RESULT")
    node["SHA256"] = Digest::SHA256.hexdigest node.text
  end
  doc.to_xml
end
calc_checksum(str) click to toggle source
# File lib/oddb2xml/util.rb, line 19
def self.calc_checksum(str)
  str = str.strip
  sum = 0
  val = str.split(//u)
  12.times do |idx|
    fct = ((idx % 2) * 2) + 1
    sum += fct * val[idx].to_i
  end
  ((10 - (sum % 10)) % 10).to_s
end
check_column_indices(sheet) click to toggle source

please keep this constant in sync between (GEM) swissmedic-diff/lib/swissmedic-diff.rb and (GEM) oddb2xml/lib/oddb2xml/extractor.rb

# File lib/oddb2xml/util.rb, line 118
def self.check_column_indices(sheet)
  row = sheet[5] # Headers are found at row 5 since February 5

  error_2019 = nil
  0.upto(COLUMNS_FEBRUARY_2019.size - 1).each { |idx| puts "#{idx}: #{row[idx].value}" } if $VERBOSE
  COLUMNS_FEBRUARY_2019.each { |key, value|
    header_name = row[COLUMNS_FEBRUARY_2019.keys.index(key)].value.to_s
    unless value.match(header_name)
      puts "#{__LINE__}: #{key} ->  #{COLUMNS_FEBRUARY_2019.keys.index(key)} #{value}\nbut was  #{header_name}" if $VERBOSE
      error_2019 = "Packungen.xlslx_has_unexpected_column_#{COLUMNS_FEBRUARY_2019.keys.index(key)}_#{key}_#{value}_but_was_#{header_name}"
      # require 'pry'; binding.pry
      break
    end
  }
  raise error_2019.to_s if error_2019
end
convert_to_8859_1(line) click to toggle source
# File lib/oddb2xml/util.rb, line 60
def self.convert_to_8859_1(line)
  # We want to ignore lines which are not really UTF-8 encoded
  ausgabe = Oddb2xml.patch_some_utf8(line).encode("ISO-8859-1")
  ausgabe.encode("ISO-8859-1")
rescue => error
  puts "#{error}: in #{line}"
end
download_finished(file, remove_file = true) click to toggle source
# File lib/oddb2xml/util.rb, line 106
def self.download_finished(file, remove_file = true)
  src = "#{WORK_DIR}/#{File.basename(file)}"
  dest = "#{DOWNLOADS}/#{File.basename(file)}"
  FileUtils.makedirs(DOWNLOADS)
  # return unless File.exists?(file)
  return unless file && File.exist?(file)
  return if File.expand_path(file).eql?(dest)
  FileUtils.cp(src, dest, verbose: false)
  Oddb2xml.log("download_finished saved as #{dest} #{File.size(dest)} bytes.")
end
gen_prodno(iksnr, seqnr) click to toggle source
# File lib/oddb2xml/util.rb, line 6
def self.gen_prodno(iksnr, seqnr)
  sprintf("%05d", iksnr) + sprintf("%02d", seqnr)
end
getEan13forNo8(no8) click to toggle source
# File lib/oddb2xml/util.rb, line 264
def self.getEan13forNo8(no8)
  @@no8_to_ean13[no8] || []
end
getEan13forProdno(prodno) click to toggle source
# File lib/oddb2xml/util.rb, line 260
def self.getEan13forProdno(prodno)
  @@prodno_to_ean13[prodno] || []
end
getNo8ForEan13(ean13) click to toggle source
# File lib/oddb2xml/util.rb, line 272
def self.getNo8ForEan13(ean13)
  @@ean13_to_no8[ean13]
end
getProdnoForEan13(ean13) click to toggle source
# File lib/oddb2xml/util.rb, line 268
def self.getProdnoForEan13(ean13)
  @@ean13_to_prodno[ean13]
end
html_decode(string) click to toggle source
# File lib/oddb2xml/util.rb, line 38
def self.html_decode(string)
  german = string
  german = string.force_encoding("ISO-8859-1").encode("UTF-8") if string.encoding.to_s.eql?("ASCII")
  until german.eql?(HTMLEntities.new.decode(german))
    german = HTMLEntities.new.decode(german)
  end
  Oddb2xml.patch_some_utf8(german).gsub("<br>", "\n")
end
log(msg) click to toggle source
# File lib/oddb2xml/util.rb, line 81
def self.log(msg)
  return unless @options[:log]
  # TODO:: require 'pry'; binding.pry if msg.size > 1000
  $stdout.puts "#{Time.now.strftime("%Y-%m-%d %H:%M:%S")}: #{msg[0..250]}"
  $stdout.flush
end
log_timestamp(msg) click to toggle source
# File lib/oddb2xml/compare.rb, line 4
def self.log_timestamp(msg)
  full_msg = "#{Time.now.strftime("%H:%M:%S")}: #{msg}"
  puts full_msg
  $stdout.flush
  full_msg
end
patch_some_utf8(line) click to toggle source
# File lib/oddb2xml/util.rb, line 47
def self.patch_some_utf8(line)
  begin
    line = line.encode("utf-8")
  rescue
  end
  begin
    line.tr("\u0089", "‰").tr("\u0092", "’").tr("\u0096", "-").tr("\u2013", "-").tr("\u201D", '"').chomp
  rescue => error
    puts "#{error}: in #{line}"
    line
  end
end
save_options(options) click to toggle source
# File lib/oddb2xml/util.rb, line 88
def self.save_options(options)
  @options = options
end
setEan13forNo8(no8, ean13) click to toggle source
# File lib/oddb2xml/util.rb, line 248
def self.setEan13forNo8(no8, ean13)
  if ean13.to_i == 7680006660045 || ean13.to_i == 7680006660014
    Oddb2xml.log "setEan13forNo8 #{no8} ean13 #{ean13}"
  end
  if @@no8_to_ean13[no8].nil?
    @@no8_to_ean13[no8] = ean13
    @@ean13_to_no8[ean13] = no8
  elsif !@@no8_to_ean13[no8].eql?(ean13)
    Oddb2xml.log "@@no8_to_ean13[no8] #{@@no8_to_ean13[no8]} not overridden by #{ean13}"
  end
end
setEan13forProdno(prodno, ean13) click to toggle source
# File lib/oddb2xml/util.rb, line 239
def self.setEan13forProdno(prodno, ean13)
  if ean13.to_i == 7680006660045 || ean13.to_i == 7680006660014
    Oddb2xml.log "setEan13forProdno #{prodno} ean13 #{ean13}"
  end
  @@prodno_to_ean13[prodno] ||= []
  @@prodno_to_ean13[prodno] << ean13
  @@ean13_to_prodno[ean13] = prodno
end
skip_download(file) click to toggle source
# File lib/oddb2xml/util.rb, line 96
def self.skip_download(file)
  return false if defined?(VCR)
  dest = "#{DOWNLOADS}/#{File.basename(file)}"
  if File.exist?(dest)
    FileUtils.cp(dest, file, verbose: false, preserve: true) unless File.expand_path(file).eql?(dest)
    return true
  end
  false
end
skip_download?() click to toggle source
# File lib/oddb2xml/util.rb, line 92
def self.skip_download?
  @options[:skip_download]
end
uri_open(url) click to toggle source
# File lib/oddb2xml/util.rb, line 10
def self.uri_open(url)
  version = RUBY_VERSION.split(".").map { |x| x.to_i }
  if (version <=> [2, 5, 0]) >= 0
    URI.parse(url).open
  else
    IO.popen(url)
  end
end
validate_via_xsd(xsd_file, xml_file) click to toggle source
# File lib/oddb2xml/util.rb, line 219
def self.validate_via_xsd(xsd_file, xml_file)
  xsd = IO.open(xsd_file).read
  xsd_rtikelstamm_xml = Nokogiri::XML::Schema(xsd)
  doc = Nokogiri::XML(File.read(xml_file))
  xsd_rtikelstamm_xml.validate(doc).each do |error|
    if error.message
      puts "Failed validating #{xml_file} with #{File.size(xml_file)} bytes using XSD from #{xsd_file}"
      puts "CMD: xmllint --noout --schema #{xsd_file} #{xml_file}"
    end
    msg = "expected #{error.message} to be nil\nfor #{xml_file}"
    puts msg
    expect(error.message).to be_nil, msg
  end
end
verify_sha256(file) click to toggle source
# File lib/oddb2xml/util.rb, line 203
def self.verify_sha256(file)
  f = File.open(file)
  doc = Nokogiri::XML(f)
  nr = 0
  doc.root.elements.each do |node|
    nr += 1
    next if node.name.eql?("RESULT")
    sha256 = Digest::SHA256.hexdigest node.text
    unless node["SHA256"].eql?(sha256)
      puts "Verifiying #{node["SHA256"]} != expectd #{sha256} against node #{node.text} failed"
      exit(3)
    end
  end
  true
end