module PIM::Calculations

Public Instance Methods

add_formula(formula) click to toggle source
# File pim.rb, line 8912
def add_formula formula
  raise "No formula was provided." if !formula
  raise "Calculation formula for attribute '#{formula.calculated_attribute.name}' is already defined" if module_formula_by_attribute.has_key?(formula.calculated_attribute)
  module_formula_by_attribute[formula.calculated_attribute] = formula
  formula.dependent_attributes.each do |attribute|
    check_attribute!(attribute, "Attribute '#{attribute}' used in calculation formula for '#{formula.calculated_attribute}' is not defined") unless data_module.has_option?(:ignore_undefined_attributes)
    module_formulas_by_dependent_attribute[attribute] << formula.calculated_attribute
  end
end
all_formulas_by_attributes(*attributes) click to toggle source
# File pim.rb, line 8922
def all_formulas_by_attributes *attributes
  formulas = {}
  formulas.merge!(module_formulas_by_attributes(*attributes))
  add_parent_objects(formulas) { |p| p.module_formulas_by_attributes(*attributes)}
  formulas
end
all_formulas_by_dependent_attribute(attribute) click to toggle source
# File pim.rb, line 8929
def all_formulas_by_dependent_attribute attribute
  formula_attributes = []
  formula_attributes.concat(@module_formulas_by_dependent_attribute[attribute]) if @module_formulas_by_dependent_attribute
  add_parent_objects(formula_attributes) { |p| p.module_formulas_by_dependent_attribute[attribute] }
  formula_attributes.empty? ? {} : all_formulas_by_attributes(*formula_attributes)
end
formula_by_attribute(attribute) click to toggle source
# File pim.rb, line 8936
def formula_by_attribute attribute
  formula = module_formula_by_attribute[attribute] if @module_formula_by_attribute
  formula = get_parent_object { |p| p.formula_by_attribute(attribute) } if formula.nil?
  formula
end

Protected Instance Methods

calculate_attribute(result, attribute_name, new_item, path = [attribute_name]) click to toggle source
# File pim.rb, line 8960
def calculate_attribute result, attribute_name, new_item, path = [attribute_name]
  formula = module_formula_by_attribute[attribute_name]
  if formula
    context = PIM::CalculationContext.new(formula, formula.calculated_attribute, formula.dependent_attributes, new_item)
    begin
      calculation_result = formula.execute(context)
      result.calculated_values_by_attribute_name[attribute_name] = calculation_result
      return calculation_result
    rescue Exception => e
      error_rule = PIM::ValidationRule.new(:execution_error)
      error_params = { :err_formula => attribute_name }
      error_msg = "Error executing calculation for attribute '#{attribute_name}': #{e.message}"
      result.fail error_rule, PIM::ValidationLevel::ERROR, path, error_msg, error_params
      log_warn(error_msg, e)
      return nil
    end
  end
end
module_formula_by_attribute() click to toggle source
# File pim.rb, line 8948
def module_formula_by_attribute
  @module_formula_by_attribute ||= {}
end
module_formulas_by_attributes(*attributes) click to toggle source
# File pim.rb, line 8952
def module_formulas_by_attributes *attributes
  formulas = {}
  if @module_formula_by_attribute
    formulas = @module_formula_by_attribute.select { |k,v| attributes.empty? or attributes.include?(k) }
  end
  formulas
end
module_formulas_by_dependent_attribute() click to toggle source
# File pim.rb, line 8944
def module_formulas_by_dependent_attribute
  @module_formulas_by_dependent_attribute ||= Hash.new { |k, v| k[v] = [] }
end