oddb2xml 1.3.0 → 1.3.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,7 @@
1
+ === 1.3.1 / 04.02.2013
2
+
3
+ * Update product.xml with swissINDEX and Packungen.xls
4
+
1
5
  === 1.3.0 / 04.02.2013
2
6
 
3
7
  * Change PRDNO in product.xml to GTIN from INDEX
@@ -141,17 +141,33 @@ module Oddb2xml
141
141
  end
142
142
  def prepare_products
143
143
  unless @products
144
- # merge company info from swissINDEX
145
144
  @products = []
146
145
  @products = @items.values.uniq.map do |seq|
147
146
  %w[de fr].each do |lang|
147
+ # Values come from swissINDEX and Packungen.xls
148
+ # * company_name
149
+ # * atc_code
150
+ # * it_code
151
+ it_code = ''
152
+ if ppac = @packs[seq[:swissmedic_number5]]
153
+ ht_code = ppac[:ith_swissmedic]
154
+ end
148
155
  name_key = "company_name_#{lang}".intern
149
- seq[name_key] = ''
150
- if pharmacode = seq[:pharmacodes].first
151
- indices = @index[lang.upcase]
152
- if index = indices[pharmacode]
153
- seq[:ean] = index[:ean]
154
- seq[name_key] = index[:company_name]
156
+ seq[name_key] = ''
157
+ indices = @index[lang.upcase]
158
+ seq[:packages].each_pair do |phar, pac|
159
+ if index = indices[phar]
160
+ if seq[name_key].empty?
161
+ seq[name_key] = index[:company_name]
162
+ end
163
+ if it_code.empty? and
164
+ num = pac[:swissmedic_number8] and
165
+ ppac = @packs[num]
166
+ it_code = ppac[:ith_swissmedic]
167
+ end
168
+ seq[:atc_code] = index[:atc_code]
169
+ seq[:it_code] = it_code
170
+ seq[:packages][phar][:ean] = index[:ean]
155
171
  end
156
172
  end
157
173
  end
@@ -344,116 +360,121 @@ module Oddb2xml
344
360
  'PROD_DATE' => datetime,
345
361
  'VALID_DATE' => datetime,
346
362
  ) {
363
+ length = 0
347
364
  @products.each do |seq|
348
- xml.PRD('DT' => '') {
349
- xml.GTIN seq[:ean] if seq[:ean] and !seq[:ean].empty?
350
- %w[de fr].each do |l|
351
- name = "name_#{l}".intern
352
- desc = "desc_#{l}".intern
353
- elem = "DSCR" + l[0].upcase
354
- if !seq[name].empty? and !seq[desc].empty?
355
- xml.send(elem, seq[name] + ' ' + seq[desc])
356
- elsif !seq[desc].empty?
357
- xml.send(elem, seq[desc])
358
- end
359
- end
360
- #xml.BNAMD
361
- #xml.BNAMF
362
- #xml.ADNAMD
363
- #xml.ADNAMF
364
- #xml.SIZE
365
- xml.ADINFD seq[:comment_de] unless seq[:comment_de].empty?
366
- xml.ADINFF seq[:comment_fr] unless seq[:comment_fr].empty?
367
- xml.GENCD seq[:org_gen_code] unless seq[:org_gen_code].empty?
368
- #xml.GENGRP
369
- xml.ATC seq[:atc_code] unless seq[:atc_code].empty?
370
- xml.IT seq[:it_code] unless seq[:it_code].empty?
371
- #xml.ITBAG
372
- #xml.KONO
373
- #xml.TRADE
374
- #xml.PRTNO
375
- #xml.MONO
376
- #xml.CDGALD
377
- #xml.CDGALF
378
- #xml.FORMD
379
- #xml.FORMF
380
- #xml.DOSE
381
- #xml.DOSEU
382
- #xml.DRGFD
383
- #xml.DRGFF
384
- seq[:packages].values.first[:swissmedic_number8] =~ /(\d{5})(\d{3})/
385
- xml.ORPH @orphans.include?($1.to_s) ? true : false
386
- #xml.BIOPHA
387
- #xml.BIOSIM
388
- #xml.BFS
389
- #xml.BLOOD
390
- #xml.MSCD # always empty
391
- #xml.DEL
392
- xml.CPT {
393
- #xml.CPTLNO
394
- #xml.CNAMED
395
- #xml.CNAMEF
396
- #xml.IDXIND
397
- #xml.DDDD
398
- #xml.DDDU
399
- #xml.DDDA
400
- #xml.IDXIA
401
- #xml.IXREL
402
- #xml.GALF
403
- #xml.DRGGRPCD
404
- #xml.PRBSUIT
405
- #xml.CSOLV
406
- #xml.CSOLVQ
407
- #xml.CSOLVQU
408
- #xml.PHVAL
409
- #xml.LSPNSOL
410
- #xml.APDURSOL
411
- #xml.EXCIP
412
- #xml.EXCIPQ
413
- #xml.EXCIPCD
414
- #xml.EXCIPCF
415
- #xml.PQTY
416
- #xml.PQTYU
417
- #xml.SIZEMM
418
- #xml.WEIGHT
419
- #xml.LOOKD
420
- #xml.LOOKF
421
- #xml.IMG2
422
- seq[:substances].each do |sub|
423
- xml.CPTCMP {
424
- xml.LINE sub[:index] unless sub[:index].empty?
425
- xml.SUBNO @substances.index(sub[:name]) + 1 if @substances.include?(sub[:name])
426
- xml.QTY sub[:quantity] unless sub[:quantity].empty?
427
- xml.QTYU sub[:unit] unless sub[:unit].empty?
428
- #xml.WHK
429
- }
365
+ seq[:packages].each_value do |pac|
366
+ next if !pac[:ean] or pac[:ean].empty?
367
+ length += 1
368
+ xml.PRD('DT' => '') {
369
+ xml.GTIN pac[:ean]
370
+ %w[de fr].each do |l|
371
+ name = "name_#{l}".intern
372
+ desc = "desc_#{l}".intern
373
+ elem = "DSCR" + l[0].upcase
374
+ if !seq[name].empty? and !seq[desc].empty?
375
+ xml.send(elem, seq[name] + ' ' + seq[desc])
376
+ elsif !seq[desc].empty?
377
+ xml.send(elem, seq[desc])
378
+ end
430
379
  end
431
- @interactions.each do |ix|
432
- if [ix[:act1], ix[:act2]].include?(seq[:atc_code])
433
- xml.CPTIX {
434
- xml.IXNO ix[:ixno]
435
- #xml.GRP
436
- xml.RLV @codes[ix[:grad]]
380
+ #xml.BNAMD
381
+ #xml.BNAMF
382
+ #xml.ADNAMD
383
+ #xml.ADNAMF
384
+ #xml.SIZE
385
+ xml.ADINFD seq[:comment_de] unless seq[:comment_de].empty?
386
+ xml.ADINFF seq[:comment_fr] unless seq[:comment_fr].empty?
387
+ xml.GENCD seq[:org_gen_code] unless seq[:org_gen_code].empty?
388
+ #xml.GENGRP
389
+ xml.ATC seq[:atc_code] unless seq[:atc_code].empty?
390
+ xml.IT seq[:it_code] unless seq[:it_code].empty?
391
+ #xml.ITBAG
392
+ #xml.KONO
393
+ #xml.TRADE
394
+ #xml.PRTNO
395
+ #xml.MONO
396
+ #xml.CDGALD
397
+ #xml.CDGALF
398
+ #xml.FORMD
399
+ #xml.FORMF
400
+ #xml.DOSE
401
+ #xml.DOSEU
402
+ #xml.DRGFD
403
+ #xml.DRGFF
404
+ pac[:swissmedic_number8] =~ /(\d{5})(\d{3})/
405
+ xml.ORPH @orphans.include?($1.to_s) ? true : false
406
+ #xml.BIOPHA
407
+ #xml.BIOSIM
408
+ #xml.BFS
409
+ #xml.BLOOD
410
+ #xml.MSCD # always empty
411
+ #xml.DEL
412
+ xml.CPT {
413
+ #xml.CPTLNO
414
+ #xml.CNAMED
415
+ #xml.CNAMEF
416
+ #xml.IDXIND
417
+ #xml.DDDD
418
+ #xml.DDDU
419
+ #xml.DDDA
420
+ #xml.IDXIA
421
+ #xml.IXREL
422
+ #xml.GALF
423
+ #xml.DRGGRPCD
424
+ #xml.PRBSUIT
425
+ #xml.CSOLV
426
+ #xml.CSOLVQ
427
+ #xml.CSOLVQU
428
+ #xml.PHVAL
429
+ #xml.LSPNSOL
430
+ #xml.APDURSOL
431
+ #xml.EXCIP
432
+ #xml.EXCIPQ
433
+ #xml.EXCIPCD
434
+ #xml.EXCIPCF
435
+ #xml.PQTY
436
+ #xml.PQTYU
437
+ #xml.SIZEMM
438
+ #xml.WEIGHT
439
+ #xml.LOOKD
440
+ #xml.LOOKF
441
+ #xml.IMG2
442
+ seq[:substances].each do |sub|
443
+ xml.CPTCMP {
444
+ xml.LINE sub[:index] unless sub[:index].empty?
445
+ xml.SUBNO @substances.index(sub[:name]) + 1 if @substances.include?(sub[:name])
446
+ xml.QTY sub[:quantity] unless sub[:quantity].empty?
447
+ xml.QTYU sub[:unit] unless sub[:unit].empty?
448
+ #xml.WHK
437
449
  }
438
450
  end
439
- end
440
- #xml.CPTROA {
441
- #xml.SYSLOC
442
- #xml.ROA
451
+ @interactions.each do |ix|
452
+ if [ix[:act1], ix[:act2]].include?(seq[:atc_code])
453
+ xml.CPTIX {
454
+ xml.IXNO ix[:ixno]
455
+ #xml.GRP
456
+ xml.RLV @codes[ix[:grad]]
457
+ }
458
+ end
459
+ end
460
+ #xml.CPTROA {
461
+ #xml.SYSLOC
462
+ #xml.ROA
463
+ #}
464
+ }
465
+ #xml.PRDICD { # currently empty
466
+ #xml.ICD
467
+ #xml.RTYP
468
+ #xml.RSIG
469
+ #xml.REMD
470
+ #xml.REMF
443
471
  #}
444
472
  }
445
- #xml.PRDICD { # currently empty
446
- #xml.ICD
447
- #xml.RTYP
448
- #xml.RSIG
449
- #xml.REMD
450
- #xml.REMF
451
- #}
452
- }
473
+ end
453
474
  end
454
475
  xml.RESULT {
455
476
  xml.OK_ERROR 'OK'
456
- xml.NBR_RECORD @products.length.to_s
477
+ xml.NBR_RECORD length.to_s
457
478
  xml.ERROR_CODE ''
458
479
  xml.MESSAGE ''
459
480
  }
@@ -700,11 +721,13 @@ module Oddb2xml
700
721
  seq[:packages].values.each do |pac|
701
722
  if pac[:swissmedic_number8] =~ /(\d{5})(\d{3})/
702
723
  number = $1.to_s
703
- if i = info_index[number]
724
+ if ((i = info_index[number]) and
725
+ (pac[:ean] and pac[:ean][0..3] == '7680'))
704
726
  length += 1
705
727
  xml.KP('DT' => '') {
706
728
  xml.MONID @infos[lang][i][:monid]
707
- xml.PRDNO seq[:product_key] unless seq[:product_key].empty?
729
+ xml.GTIN pac[:ean]
730
+ xml.LANG lang
708
731
  # as orphans ?
709
732
  xml.DEL @orphans.include?(number) ? true : false
710
733
  }
@@ -188,7 +188,7 @@ module Oddb2xml
188
188
  when :packages
189
189
  i_5,i_3 = 0,10 # :swissmedic_numbers
190
190
  cat = 13 # :swissmedic_category
191
- ith = 4 # :ith_swissmedic (swissmedic-diff)
191
+ ith = 4 # :ith_swissmedic IT-Code (swissmedic-diff)
192
192
  @sheet.each do |row|
193
193
  no8 = extract_number(row, i_5).to_s + extract_number(row, i_3, /^\d{3}$/).to_s
194
194
  unless no8.empty?
@@ -254,8 +254,8 @@ module Oddb2xml
254
254
  item[:paragraph] = "<title><p>#{item[:name]}</p></title>" +
255
255
  ((paragraph = html.xpath("///div[@class='paragraph']")) ? paragraph.to_s : '')
256
256
  if text = html.xpath("///div[@id='Section7750']/p").text
257
- if text =~ /(\d{5})[,\s]*(\d{5})?/
258
- [$1, $2].compact.each do |n|
257
+ if text =~ /(\d{5})[,\s]*(\d{5})?[,\s]*(\d{5})?/ or # max 3 numbers
258
+ [$1, $2, $3].compact.each do |n|
259
259
  item[:monid] = n
260
260
  data[lang] << item
261
261
  end
@@ -1,3 +1,3 @@
1
1
  module Oddb2xml
2
- VERSION = "1.3.0"
2
+ VERSION = "1.3.1"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: oddb2xml
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.0
4
+ version: 1.3.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ date: 2013-02-04 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rubyzip
16
- requirement: &12823180 !ruby/object:Gem::Requirement
16
+ requirement: &8803620 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *12823180
24
+ version_requirements: *8803620
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: archive-tar-minitar
27
- requirement: &12822440 !ruby/object:Gem::Requirement
27
+ requirement: &8802860 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *12822440
35
+ version_requirements: *8802860
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: mechanize
38
- requirement: &12821860 !ruby/object:Gem::Requirement
38
+ requirement: &8802240 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *12821860
46
+ version_requirements: *8802240
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: nokogiri
49
- requirement: &12820840 !ruby/object:Gem::Requirement
49
+ requirement: &8801360 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '0'
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *12820840
57
+ version_requirements: *8801360
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: savon
60
- requirement: &12820000 !ruby/object:Gem::Requirement
60
+ requirement: &8800260 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: '2.0'
66
66
  type: :runtime
67
67
  prerelease: false
68
- version_requirements: *12820000
68
+ version_requirements: *8800260
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: spreadsheet
71
- requirement: &12819040 !ruby/object:Gem::Requirement
71
+ requirement: &8799500 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ! '>='
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: '0'
77
77
  type: :runtime
78
78
  prerelease: false
79
- version_requirements: *12819040
79
+ version_requirements: *8799500
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: rspec
82
- requirement: &12818280 !ruby/object:Gem::Requirement
82
+ requirement: &8798780 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ! '>='
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: '0'
88
88
  type: :development
89
89
  prerelease: false
90
- version_requirements: *12818280
90
+ version_requirements: *8798780
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: webmock
93
- requirement: &12817400 !ruby/object:Gem::Requirement
93
+ requirement: &8797940 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ! '>='
@@ -98,10 +98,10 @@ dependencies:
98
98
  version: '0'
99
99
  type: :development
100
100
  prerelease: false
101
- version_requirements: *12817400
101
+ version_requirements: *8797940
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: ZenTest
104
- requirement: &12816780 !ruby/object:Gem::Requirement
104
+ requirement: &8797360 !ruby/object:Gem::Requirement
105
105
  none: false
106
106
  requirements:
107
107
  - - ! '>='
@@ -109,10 +109,10 @@ dependencies:
109
109
  version: '0'
110
110
  type: :development
111
111
  prerelease: false
112
- version_requirements: *12816780
112
+ version_requirements: *8797360
113
113
  - !ruby/object:Gem::Dependency
114
114
  name: hoe
115
- requirement: &12816200 !ruby/object:Gem::Requirement
115
+ requirement: &8796800 !ruby/object:Gem::Requirement
116
116
  none: false
117
117
  requirements:
118
118
  - - ! '>='
@@ -120,10 +120,10 @@ dependencies:
120
120
  version: '3.4'
121
121
  type: :development
122
122
  prerelease: false
123
- version_requirements: *12816200
123
+ version_requirements: *8796800
124
124
  - !ruby/object:Gem::Dependency
125
125
  name: rdoc
126
- requirement: &12815740 !ruby/object:Gem::Requirement
126
+ requirement: &8796360 !ruby/object:Gem::Requirement
127
127
  none: false
128
128
  requirements:
129
129
  - - ! '>='
@@ -131,10 +131,10 @@ dependencies:
131
131
  version: '0'
132
132
  type: :development
133
133
  prerelease: false
134
- version_requirements: *12815740
134
+ version_requirements: *8796360
135
135
  - !ruby/object:Gem::Dependency
136
136
  name: rdoc
137
- requirement: &12814940 !ruby/object:Gem::Requirement
137
+ requirement: &8795540 !ruby/object:Gem::Requirement
138
138
  none: false
139
139
  requirements:
140
140
  - - ~>
@@ -142,10 +142,10 @@ dependencies:
142
142
  version: '3.10'
143
143
  type: :development
144
144
  prerelease: false
145
- version_requirements: *12814940
145
+ version_requirements: *8795540
146
146
  - !ruby/object:Gem::Dependency
147
147
  name: hoe
148
- requirement: &12814420 !ruby/object:Gem::Requirement
148
+ requirement: &8795040 !ruby/object:Gem::Requirement
149
149
  none: false
150
150
  requirements:
151
151
  - - ~>
@@ -153,7 +153,7 @@ dependencies:
153
153
  version: '2.13'
154
154
  type: :development
155
155
  prerelease: false
156
- version_requirements: *12814420
156
+ version_requirements: *8795040
157
157
  description: oddb2xml creates xml files using swissINDEX, BAG-XML and Swissmedic.
158
158
  email: yasaka@ywesee.com, zdavatz@ywesee.com
159
159
  executables: