From e27e82c66eda4d928f9c474d3a4121c008c49249 Mon Sep 17 00:00:00 2001 From: Niklaus Giger Date: Mon, 11 May 2015 10:44:11 +0200 Subject: [PATCH] Consider out_of_trade. Prioritize differently for desitin. Take 7 Signed-off-by: Niklaus Giger --- Gemfile | 1 + Gemfile.lock | 4 + src/util/resultsort.rb | 178 +++++++++++++++++++++++++----------------- test/test_util/resultsort.rb | 181 ++++++++++++++++++++++++++++--------------- 4 files changed, 231 insertions(+), 133 deletions(-) diff --git a/Gemfile b/Gemfile index 1d42180..235234b 100644 --- a/Gemfile +++ b/Gemfile @@ -36,6 +36,7 @@ gem 'net-http-persistent', '2.9.3' gem 'nokogiri', '1.6.1' gem 'odba', '1.1.0' gem 'oddb2tdat', '1.1.2' +gem 'parslet', '1.7.0' gem 'paypal', '2.0.0' gem 'pg', '0.17.1' gem 'rclconf', '1.0.0' diff --git a/Gemfile.lock b/Gemfile.lock index 7359b85..ab101ec 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -25,6 +25,7 @@ GEM nokogiri archive-tarsimple (1.1.1) bigdecimal (1.2.5) + blankslate (3.1.3) builder (3.2.2) childprocess (0.5.3) ffi (~> 1.0, >= 1.0.11) @@ -112,6 +113,8 @@ GEM watir-webdriver (>= 0.6.9) page_navigation (0.9) data_magic (>= 0.14) + parslet (1.7.0) + blankslate (>= 2.0, <= 4.0) paypal (2.0.0) money (> 0.0.0) pg (0.17.1) @@ -234,6 +237,7 @@ DEPENDENCIES odba (= 1.1.0) oddb2tdat (= 1.1.2) page-object + parslet (= 1.7.0) paypal (= 2.0.0) pg (= 0.17.1) pry-debugger diff --git a/src/util/resultsort.rb b/src/util/resultsort.rb index ec94ee2..767d62f 100644 --- a/src/util/resultsort.rb +++ b/src/util/resultsort.rb @@ -1,85 +1,123 @@ #!/usr/bin/env ruby # encoding: utf-8 -# ODDB::ResultSort -- oddb.org -- 28.02.2012 -- mhatakeyama@ywesee.com -# ODDB::ResultSort -- oddb.org -- 10.09.2003 -- mhuggler@ywesee.com module ODDB - module ResultStateSort - def sort - get_sortby! + module ResultStateSort + def sort + get_sortby! if @model - @model.each { |atc| + @model.each { |atc| atc.packages.sort! { |a, b| compare_entries(a, b) } atc.packages.reverse! if(@sort_reverse) } end - self - end - end - module ResultSort - def sort_result(packages, session) - begin - packages.sort_by { |package| - priorize_desitin = false - package_from_desitin = (package.company and /desitin/i.match(package.company.to_s) != nil) - priorize_desitin = true if package_from_desitin and session and session.lookandfeel.enabled?(:evidentia, false) - priorize_desitin = true if package_from_desitin and session and - session.user and not session.user.is_a?(ODDB::UnknownUser) and - /@desitin/i.match(session.user.name.to_s) - name_to_use = (priorize_desitin && generic_type_weight(package) == 5)? ' '+package.name_base.to_s : package.name_base.to_s - name_to_use = name_to_use.gsub(/\d.*/, '') - [ - package.expired? ? 1 : -1, - generic_type_weight(package), - name_to_use, - package.galenic_forms.collect { |gf| galform_str(gf, session) }, - dose_value(package.dose), - package.comparable_size, - ] - } - rescue StandardError => e - puts e.class - puts e.message - puts e.backtrace - packages - end - end - def dose_value(dose) - dose || Dose.new(0) - end - def package_count - @packages.size - end - def galform_str(galform, session) - if(galform.odba_instance.nil?) - '' + self + end + end + module ResultSort + IsOriginal = 1 + IsGenerikum = 2 + IsNotClassified = 3 + IsNotRefDataListed = 4 + + # zeno defined the sort order on May 11 2015 as follow + # 1. Original (SL) + # 2. Generikum (SL) + # 3. Nicht klassifiziert (SL) + # 4. Bei Refdata nicht gelistet. + # + # Innerhalb dieser Reihenfolge (Gruppe) ist wie folgt sortiert: + # + # Alphabetisch aufsteigend nach Galenik, Stärke, Packung. + # + # Bei Desitin (evidentia und Desitin Power-User Login) müssen die + # Produkte unter 3 vor 2 kommen (siehe oben). + + def sort_result(packages, session) + begin + packages.sort_by! { |package| + prio, name_to_use, package_from_desitin = get_prio_and_name(package, session) + if package_from_desitin + if prio == IsNotClassified + prio = IsGenerikum - 0.1 # must come before IsGenerikum + end + end + [ + package.expired? ? 1 : -1, + prio, + name_to_use, + package.galenic_forms.collect { |gf| galform_str(gf, session) }, + dose_value(package.dose), + package.comparable_size, + ] + } + if true # only for debug purposes + id = 0 + packages.each{ + |package| + id += 1 + prio, name_to_use = get_prio_and_name(package, session) + puts "id #{id}: #{package.barcode} '#{package.name_base.to_s}' > #{prio} #{name_to_use.inspect} out_of_trade #{package.out_of_trade.inspect} type #{package.generic_type.inspect} sl #{package.sl_generic_type.inspect}" + } + end + packages + rescue StandardError => e + puts e.class + puts e.message + puts e.backtrace + packages + end + end + def dose_value(dose) + dose || Dose.new(0) + end + def package_count + @packages.size + end + def galform_str(galform, session) + if(galform.odba_instance.nil?) + '' elsif galform.respond_to?(session.language.to_sym) - galform.send(session.language) + galform.send(session.language) else '' - end - end - def generic_type_weight(package) - type = package.generic_type - type = package.sl_generic_type.to_sym if package and package.generic_type and package.sl_generic_type and package.generic_type.to_sym == :unknown - case type ? type.to_sym : nil - when :original - 0 - when :generic - 5 - when :comarketing - 10 - when :complementary - 15 - else - 20 - end - # the following was madly inefficient! + end + end +private + def get_prio_and_name(package, session) + package_from_desitin = (package.company and /desitin/i.match(package.company.to_s) != nil) + priorize_desitin = true if package_from_desitin and session and session.lookandfeel.enabled?(:evidentia, false) + priorize_desitin = true if package_from_desitin and session and + session.user and not session.user.is_a?(ODDB::UnknownUser) and + /@desitin/i.match(session.user.name.to_s) + prio = classified_group(package, priorize_desitin) + name_to_use = (priorize_desitin ? ' '+package.name_base.clone.to_s : package.name_base.clone.to_s).gsub(/\S+\s+\d+/, '') + return prio, name_to_use, package_from_desitin + end + + def classified_group(package, priorize_desitin = false) + return IsNotRefDataListed if package.out_of_trade + if package.sl_generic_type + if package.sl_generic_type.eql?(:original) + return IsOriginal + elsif package.sl_generic_type.eql?(:generic) + return IsGenerikum + end + end + if package.generic_type + if package.generic_type.eql?(:original) + return IsOriginal + elsif package.generic_type.eql?(:generic) + return IsGenerikum + end + end + return IsNotClassified + # the following was madly inefficient! =begin - types = session.valid_values(:generic_type) - index = types.index(package.generic_type.to_s).to_i - 10 - (index*2) + types = session.valid_values(:generic_type) + index = types.index(package.generic_type.to_s).to_i + 10 - (index*2) =end - end - end + end + end end diff --git a/test/test_util/resultsort.rb b/test/test_util/resultsort.rb index b798090..10942ca 100644 --- a/test/test_util/resultsort.rb +++ b/test/test_util/resultsort.rb @@ -43,11 +43,13 @@ module ODDB class TestResultSort 'dummy@desitin.ch') @session.should_receive(:user).and_return(user) setup_more_products - expected_order = [@p111_original, # original - @p166_sl_original, - @p999_original, # original - @p333_generic_from_desitin, # because it is from desitin - @p133_generic, # alphabetically sorted - ] - expected_order.each{ |item| assert_equal(FlexMock, item.class) } - assert_equal(expected_order, @sort.sort_result([@p111_original, @p133_generic, @p333_generic_from_desitin, @p999_original, @p166_sl_original], @session)) - assert_equal(expected_order, @sort.sort_result([@p166_sl_original, @p111_original, @p333_generic_from_desitin, @p999_original, @p133_generic], @session)) - assert_equal(expected_order, @sort.sort_result([@p999_original, @p333_generic_from_desitin, @p166_sl_original, @p133_generic, @p111_original], @session)) + @expected_order_desitin.each{ |item| assert_equal(FlexMock, item.class) } + assert_equal(@expected_order_desitin, @sort.sort_result(@order_2, @session)) + assert_equal(@expected_order_desitin, @sort.sort_result(@order_3, @session)) + assert_equal(@expected_order_desitin, @sort.sort_result(@order_4, @session)) end end end # ODDB -- 2.1.4