<< | Index | >>
:a! (paste) ESC
Plan
Experiment (test only Migel::Model::Group)
#!/usr/bin/env ruby
# encoding: utf-8
# Migel::Model::Group -- migel -- 18.08.2011 -- mhatakeyama@ywesee.com
#$: << File.expand_path("../../../src", File.dirname(__FILE__))
module Migel
module Model
class Group < Migel::ModelSuper
attr_accessor :limitation_text
attr_reader :code
has_many :subgroups, on_delete(:cascade), on_save(:cascade)
multilingual :limitation_text
multilingual :name
alias :pointer_descr :code
def initialize(groupcd)
@code = groupcd
end
end
end
end
#!/usr/bin/env ruby
# enconding: utf-8
# Migel::Importer -- migel -- 18.08.2011 -- mhatakeyama@ywesee.com
require 'csv'
module Migel
class Importer
def update(path, language)
CSV.readlines(path)[1..-1].each do |row|
id = row.at(13).to_s.split('.')
if(id.empty?)
id = row.at(4).to_s.split('.')
else
id[-1].replace(id[-1][0,1])
end
unless id.empty?
group = update_group(id, row, language)
p group
end
end
end
def update_group(id, row, language)
groupcd = id.at(0)
hash = {
:code => groupcd,
language => row.at(2).to_s,
}
group = Migel::Model::Group.find_by_code(groupcd) || Migel::Model::Group.new(groupcd)
group.name.send(language.to_s + '=', row.at(2).to_s)
text = row.at(3).to_s
text.tr!("\v", " ")
text.strip!
unless(text.empty?)
group.limitation_text.send(language.to_s + '=', text)
end
group.save
group
end
end
end
require 'migel/importer'
Run
migel> Migel::Importer.new.update('data/csv/migel_de_sample.csv','de')
-> Array
Log
#<Migel::Model::Group:0x7f9d13903438 @odba_id=5, @subgroups=[], @odba_persistent=true, @name=#<Migel::Util::Multilingual:0x7f9d13903320 @canonical={:de=>"ABSAUGGERAETE"}, @synonyms=[]>, @odba_observers=[], @code="01">
#<Migel::Model::Group:0x7f9d13903438 @odba_id=5, @subgroups=[], @odba_persistent=true, @name=#<Migel::Util::Multilingual:0x7f9d13903320 @canonical={:de=>"ABSAUGGERAETE"}, @synonyms=[]>, @odba_observers=[], @code="01">
#<Migel::Model::Group:0x7f9d13903438 @odba_id=5, @subgroups=[], @odba_persistent=true, @name=#<Migel::Util::Multilingual:0x7f9d13903320 @canonical={:de=>"ABSAUGGERAETE"}, @synonyms=[]>, @odba_observers=[], @code="01">
#<Migel::Model::Group:0x7f9d13903438 @odba_id=5, @subgroups=[], @odba_persistent=true, @name=#<Migel::Util::Multilingual:0x7f9d13903320 @canonical={:de=>"ABSAUGGERAETE"}, @synonyms=[]>, @odba_observers=[], @code="01">
#<Migel::Model::Group:0x7f9d13903438 @odba_id=5, @subgroups=[], @odba_persistent=true, @name=#<Migel::Util::Multilingual:0x7f9d13903320 @canonical={:de=>"ABSAUGGERAETE"}, @synonyms=[]>, @odba_observers=[], @code="01">
#<Migel::Model::Group:0x7f9d13903438 @odba_id=5, @subgroups=[], @odba_persistent=true, @name=#<Migel::Util::Multilingual:0x7f9d13903320 @canonical={:de=>"ABSAUGGERAETE"}, @synonyms=[]>, @odba_observers=[], @code="01">
#<Migel::Model::Group:0x7f9d138529d0 @odba_id=7, @subgroups=[], @odba_persistent=true, @name=#<Migel::Util::Multilingual:0x7f9d138528e0 @canonical={:de=>"APPLIKATIONSHILFEN"}, @synonyms=[]>, @odba_observers=[], @code="03">
#<Migel::Model::Group:0x7f9d138529d0 @odba_id=7, @subgroups=[], @odba_persistent=true, @name=#<Migel::Util::Multilingual:0x7f9d138528e0 @canonical={:de=>"APPLIKATIONSHILFEN"}, @synonyms=[]>, @odba_observers=[], @code="03">
#<Migel::Model::Group:0x7f9d138529d0 @odba_id=7, @subgroups=[], @odba_persistent=true, @name=#<Migel::Util::Multilingual:0x7f9d138528e0 @canonical={:de=>"APPLIKATIONSHILFEN"}, @synonyms=[]>, @odba_observers=[], @code="03">
#<Migel::Model::Group:0x7f9d138529d0 @odba_id=7, @subgroups=[], @odba_persistent=true, @name=#<Migel::Util::Multilingual:0x7f9d138528e0 @canonical={:de=>"APPLIKATIONSHILFEN"}, @synonyms=[]>, @odba_observers=[], @code="03">
...
Result
migel> Migel::Model::Group.find_by_code('01').class
-> Migel::Model::Group
migel> Migel::Model::Group.find_by_code('01').name
-> ABSAUGGERAETE
migel> Migel::Model::Group.find_by_code('03').class
-> Migel::Model::Group
migel> Migel::Model::Group.find_by_code('03').name.de
-> APPLIKATIONSHILFEN
migel> Migel::Model::Group.find_by_code('01').limitation_text
-> Gerätereparaturen beim Kaufsystem: Bei sorgfältigem Gebrauch ohne Selbstverschuldung, Vergütung nach Aufwand nur nach vorgängiger Kostengutsprache durch den Krankenversicherer.
migel> Migel::Model::Group.find_by_code('03').limitation_text.de
-> Gerätereparaturen beim Kaufsystem: Bei sorgfältigem Gebrauch ohne Selbstverschuldung, Vergütung nach Aufwand nur nach vorgängiger Kostengutsprache durch den Krankenversicherer.
def update_subgroup(id, group, row, language)
subgroupcd = id.at(1)
subgroup = group.subgroups.find{|sg| sg.code == subgroupcd} || begin
sg = Migel::Model::Subgroup.new(subgroupcd)
group.subgroups.push sg
group.save
sg
end
subgroup.name.send(language.to_s + '=', row.at(6).to_s)
if text = row.at(7).to_s and !text.empty?
p text
subgroup.limitation_text.send(language.to_s + '=', text)
end
subgroup.save
subgroup
end
#!/usr/bin/env ruby
# encoding: utf-8
# Migel::Model::Subgroup -- migel -- 18.08.2011 -- mhatakeyama@ywesee.com
module Migel
module Model
class Subgroup < Migel::ModelSuper
belongs_to :group
has_many :migelids, on_delete(:cascade), on_save(:cascade)
attr_reader :code
alias :pointer_descr :code
multilingual :limitation_text
multilingual :name
def initialize(code)
@code = code
end
end
end
end
Result
migel> Migel::Importer.new.update('data/csv/migel_de_sample.csv','de')
-> Array
migel> Migel::Model::Group.find_by_code('03').subgroups[2].code
-> 03
migel> Migel::Model::Group.find_by_code('03').subgroups[2].limitation_text
-> Limitation: Zur Zytostatika-, Antibiotika-, Schmerz-, Chelatbildner-, Parkinsontherapie sowie für die parenterale Ernährung.
#!/usr/bin/env ruby
# encoding: utf-8
# Migel::Model::Migelid -- migel -- 18.08.2011 -- mhatakeyama@ywesee.com
#require 'util/language'
#require 'model/text'
#require 'model/feedback_observer'
#require 'util/searchterms'
#require 'model/migel/item'
module Migel
module Model
class Migelid < Migel::ModelSuper
belongs_to :subgroup
has_many :products, on_delete(:cascade), on_save(:cascade)
has_many :accessories
has_many :migelids
=begin
include SimpleLanguage
include FeedbackObserver
ODBA_SERIALIZABLE = ['@descriptions']
=end
#attr_reader :code, :accessories, :products, :product_text, :items
#attr_reader :code, :product_text
#attr_accessor :subgroup, :limitation, :price, :type, :date,
attr_accessor :limitation, :price, :type, :date, :qty, :unit
attr_reader :code
alias :pointer_descr :code
multilingual :limitation_text
multilingual :migelid_text
multilingual :name
def initialize(code)
@code = code
end
def update_multilingual(data, language)
data.keys.each do |key|
self.send(key).send(language.to_s + '=', data[key])
end
end
def add_accessory(acc)
accessories.push(acc)
end
def add_migelid(mi)
if mi
unless(migelids.include?(mi))
mi.add_accessory(self)
migelids.push(mi)
end
end
mi
end
def update_migelid(id, subgroup, row, language)
# take data from csv
migelidcd = id[2,3].join(".")
name = row.at(12).to_s
migelid_text = row.at(15).gsub(/[ \t]+/u, " ")
migelid_text.tr!("\v", "\n")
limitation_text = if(idx = migelid_text.index(/Limitation|Limitazione/u))
migelid_text.slice!(idx..-1).strip
else
''
end
if(name.to_s.strip.empty?)
name = migelid_text.slice!(/^[^\n]+/u)
end
migelid_text.strip!
type = SALE_TYPES[id.at(4)]
price = ((row.at(18).to_s[/\d[\d.]*/u].to_f) * 100).round
date = date_object(row.at(20))
limitation = (row.at(14) == 'L')
qty = row.at(16).to_i
unit = row.at(17).to_s
# save instance
migelid = subgroup.migelids.find{|mi| mi.code == migelidcd} || begin
mi = Migel::Model::Migelid.new(migelidcd)
subgroup.migelids.push mi
subgroup.save
mi
end
migelid.subgroup = subgroup
migelid.save
multilingual_data = {
:name => name,
:migelid_text => (migelid_text unless migelid_text.empty?),
:limitation_text => (limitation_text unless limitation_text.empty?)
}
migelid.update_multilingual(multilingual_data, language)
migelid.type = type
migelid.price = price
migelid.date = date
migelid.limitation = limitation
migelid.qty = qty if qty > 0
migelid.unit = unit unless unit.empty?
if(id[3] != "00")
1.upto(3) { |num|
micd = [id[2], '00', num].join('.')
if mi = subgroup.migelids.find{|m| m.code == micd}
migelid.add_migelid(mi)
end
}
end
migelid.save
migelid
end
end
end
Result
migel> Migel::Importer.new.update('data/csv/migel_de_sample.csv','de')
-> Array
migel> a=Migel::Model::Group.find_by_code('03').subgroups[0].migelids[0].class
-> Migel::Model::Migelid
migel> a=Migel::Model::Group.find_by_code('03').subgroups[0].name
-> Applikationshilfen für die künstliche Ernährung
migel> a=Migel::Model::Group.find_by_code('03').subgroups[0].migelids[0].subgroup.name
-> Applikationshilfen für die künstliche Ernährung
migel> a=Migel::Model::Group.find_by_code('03').subgroups[0].migelids[0].limitation
-> false
migel> a=Migel::Model::Group.find_by_code('03').subgroups[0].migelids[0].limitation_text
->
migel> a=Migel::Model::Group.find_by_code('03').subgroups[0].migelids[0].migelid_text
->
migel> a=Migel::Model::Group.find_by_code('03').subgroups[0].migelids[0].qty
-> 1
#!/usr/bin/env ruby
# encondig: utf-8
# Migel::Model::Product -- migel -- 18.08.2011 -- mhatakeyama@ywesee.com
module Migel
module Model
class Product < Migel::ModelSuper
belongs_to :product, delegates(:price, :unit, :migel_code)
alias :pointer_descr :migel_code
attr_accessor :ean_code, :pharmacode, :article_name, :companyname, :companyean, :ppha, :ppub, :factor, :pzr, :size, :status, :datetime, :stdate, :language
multilingual :article_name
end
end
end
Next
#!/usr/bin/env ruby
# enconding: utf-8
# Migel::Util::Swissindex -- migel -- 18.08.2011 -- mhatakeyama@ywesee.com
require 'sbsm/drbserver'
module ODDB
module Swissindex
class SwissindexNonpharma; end
end
end
module Migel
module Util
module Swissindex
SWISSINDEX_NONPHARMA_URI = 'druby://localhost:50002'
SWISSINDEX_NONPHARMA_SERVER = DRbObject.new(nil, SWISSINDEX_NONPHARMA_URI)
class << self
def search_item(pharmacode)
item = {}
SWISSINDEX_NONPHARMA_SERVER.session(ODDB::Swissindex::SwissindexNonpharma) do |swissindex|
item = swissindex.search_item_with_swissindex_migel(pharmacode)
end
item
end
end
end # Swissindex
end # Util
end # Migel
Run
Result
migel> Migel::Util::Swissindex.search_item('2355664')[:article_name]
-> MANUTRAIN Handgelenkband links Gr 6 19-20cm titan
Note
Next
def update_products_by_migel_code(migel_code, lang = 'de')
if migelid = Migel::Model::Migelid.find_by_migel_code(migel_code)
migel_code = migelid.migel_code.split('.').to_s
if table = Migel::Util::Swissindex.search_migel_table(migel_code)
table.each do |record|
if record[:pharmacode] and record[:article_name]
update_product(migelid, record)
end
end
end
end
end
def update_product(migelid, record)
# pointer = product.pointer + [:item, record[:pharmacode]]
product = migelid.products.find{|i| i.pharmacode == record[:pharmacode]} || begin
i = Migel::Model::Product.new(record[:pharmacode])
migelid.products.push i
migelid.save
i
end
product.migelid = migelid
product.save
product.ean_code = record[:ean_code]
product.article_name = record[:article_name]
product.companyname = record[:companyname]
product.companyean = record[:companyean]
product.ppha = record[:ppha]
product.ppub = record[:ppub]
product.factor = record[:factor]
product.pzr = record[:pzr]
product.size = record[:size]
product.status = record[:status]
product.datetime = record[:datetime]
product.stdate = record[:stdate]
product.language = record[:language]
product.save
product
end
end
end
Run
masa@masa ~/ywesee/migel $ sudo -u postgres dropdb migel masa@masa ~/ywesee/migel $ sudo -u postgres createdb -E UTF8 -T template0 migel
migel> Migel::Importer.new.update('data/csv/migel_de_sample.csv','de')
-> Array
migel> Migel::Importer.new.update_products_by_migel_code('03.02.01.00.2')
-> Array
Result (Check)
migel> Migel::Model::Migelid.find_by_migel_code('03.02.01.00.2').products.length
-> 94
migel> Migel::Model::Migelid.find_by_migel_code('03.02.01.00.2').products[0].pharmacode
-> 4438897
migel> Migel::Model::Migelid.find_by_migel_code('03.02.01.00.2').products[0].article_name
-> ACCU CHEK COMBO Service Pack normal
migel> Migel::Model::Product.find_by_pharmacode('4438897').article_name
-> ACCU CHEK COMBO Service Pack normal
migel> Migel::Model::Migelid.find_by_migel_code('03.02.01.00.2').products[0].uid
-> 142
migel> Migel::Model::Product.find_by_pharmacode('4438897').uid
-> 142
Note
Next
def update_all_products(lang = 'de')
Migel::Model::Migelid.all.each do |migelid|
update_products_by_migel_code(migelid.migel_code)
end
end
Result
migel> Migel::Model::Migelid.all.length -> 44 migel> Migel::Model::Product.all.length -> 94 migel> Migel::Importer.new.update_all_products -> Array (after update_all_products) migel> Migel::Model::Migelid.all.length -> 44 migel> Migel::Model::Product.all.length -> 644
Final import (only 'de')
Run
masa@masa ~/ywesee/migel $ sudo -u postgres dropdb migel masa@masa ~/ywesee/migel $ sudo -u postgres createdb -E UTF8 -T template0 migel
migel> Migel::Importer.new.update('data/csv/migel_de.csv','de')
migel> Migel::Importer.new.update_all_products true
Log
... 15 / 571 Estimate total: 1.57 [h] It will be done in: 1.53 [h] 16 / 571 Estimate total: 1.52 [h] It will be done in: 1.48 [h] 17 / 571 Estimate total: 1.44 [h] It will be done in: 1.39 [h] 18 / 571 Estimate total: 1.37 [h] It will be done in: 1.32 [h] ...
Note