forked from zdavatz/oddb.org
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Consider out_of_trade. Prioritize differently for desitin
- Loading branch information
Showing
2 changed files
with
268 additions
and
145 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 = packages.uniq.sort_by! { |package| | ||
classify_package(package, session) | ||
if @package_from_desitin and @priorize_desitin | ||
if @priority == IsNotClassified | ||
@priority = IsGenerikum - 0.1 # must come before IsGenerikum | ||
end | ||
end | ||
[ | ||
package.expired? ? 1 : -1, | ||
@priority, | ||
@name_to_use, | ||
package.galenic_forms.collect { |gf| galform_str(gf, session) }, | ||
dose_value(package.dose), | ||
package.comparable_size, | ||
] | ||
} | ||
if false # only for debug purposes | ||
id = 0 | ||
packages.each{ | ||
|package| | ||
id += 1 | ||
classify_package(package, session) | ||
puts "id #{id}: #{package.barcode} priorize #{@priorize_desitin} '#{package.name_base.to_s}' > #{@priority} #{@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 classify_package(package, session) | ||
@package_from_desitin = (package.company and /desitin/i.match(package.company.to_s) != nil) | ||
@priorize_desitin = false | ||
@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) | ||
@priority = classified_group(package) | ||
@name_to_use = (@priorize_desitin ? ' '+package.name_base.clone.to_s : package.name_base.clone.to_s).sub(/\s+\d+.+/, '') | ||
end | ||
|
||
def classified_group(package) | ||
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 |
Oops, something went wrong.