module Anubis module Core module Data ## # Data conversion moule between database and human representation module Convert ## # Format a number with grouped thousands # @param number [Float] The number being formatted. # @param precision [Integer] Sets the number of decimal points. # @param point [Char] Sets the separator for the decimal point. # @param separator [Char] Sets the thousands separator. # @return [String] A formatted version of number. def number_format(number, precision = 2, point = ',', separator = '') val = sprintf('%.'+precision.to_s+'f', number.round(precision)).to_s if separator != '' && number >= 1000 whole_part, decimal_part = val.split('.') val = [whole_part.gsub(/(\d)(?=\d{3}+$)/, '\1'+separator), decimal_part].compact.join(point) else val = val.gsub('.', point) end val end ## # @!group Block of conversion database value into human view format ## # Convert value from database to view format according by defining field type and {Anubis::Etc::Base#action action} # @param key [Symbol] field's identifier in {Anubis::Etc::Data#fields self.etc.data.fields} structure # @param value [String] value from database def convert_db_to_view_value(key, value) field = self.etc.data.fields[key] return { key => value } if !field.type proc = format('convert_db_to_view_value_%s', field.type) result = self.send proc, key, value result end ## # Convert value from database to view format for 'string' type # @param key [Symbol] field's identifier in {Anubis::Etc::Data#fields self.etc.data.fields} structure # @param value [String] value from database def convert_db_to_view_value_string(key, value) return { key => '' } if !value return { key => value } end ## # Convert value from database to view format for 'boolean' type # @param key [Symbol] field's identifier in {Anubis::Etc::Data#fields self.etc.data.fields} structure # @param value [Boolean] value from database def convert_db_to_view_value_boolean(key, value) return { key => '' } if !value return { key => value } end ## # Convert value from database to view format for 'integer' type # @param key [Symbol] field's identifier in {Anubis::Etc::Data#fields self.etc.data.fields} structure # @param value [String] value from database def convert_db_to_view_value_number(key, value) return { key => self.etc.data.fields[key].error_text } if !value return { key => value.to_s.to_i } if self.etc.data.fields[key].precision == 0 return { key => format('%.' + self.etc.data.fields[key].precision.to_s + 'f', value) } end ## # Convert value from database to view format for 'text' type # @param key [Symbol] field's identifier in {Anubis::Etc::Data#fields self.etc.data.fields} structure # @param value [String] value from database def convert_db_to_view_value_text(key, value) return { key => '' } if !value return { key => value } end ## # Convert value from database to view format for 'html' type # @param key [Symbol] field's identifier in {Anubis::Etc::Data#fields self.etc.data.fields} structure # @param value [String] value from database def convert_db_to_view_value_html(key, value) return { key => '' } if !value return { key => value } end ## # Convert value from database to table format for 'listbox' type # @param key [Symbol] field's identifier in {Anubis::Etc::Data#fields self.etc.data.fields} structure # @param value [String] value from database def convert_db_to_view_value_listbox(key, value) field = self.etc.data.fields[key] new_value = '' if field.options if field.format == 'single' new_value = field.options.list[value.to_s.to_sym] if field.options.list else new_value = [] if value if field.options.list value.each do |key| new_value.push field.options.list[key.to_s.to_sym] end end end end end case self.etc.action when 'index', 'show', 'export' if field.format == 'single' return { key => new_value, format('%s_raw', key).to_sym => value } else return { key => new_value.join(', '), format('%s_raw', key).to_sym => new_value } end when 'new', 'edit' if field.format == 'single' return { key => value.to_s, format('%s_view', key).to_sym => new_value } else return { key => value, format('%s_view', key).to_sym => new_value.join(', ') } end else if field.format == 'single' return { key => value.to_s, format('%s_view', key).to_sym => new_value } else return { key => value, format('%s_view', key).to_sym => new_value.join(', ') } end end end ## # Convert value from database to view format for 'key' type # @param key [Symbol] field's identifier in {Anubis::Etc::Data#fields self.etc.data.fields} structure # @param value [String] value from database def convert_db_to_view_value_key(key, value) return { key => '' } if !value return { key => value } end ## # Convert value from database to table view for datetime type def convert_db_to_view_value_datetime(key, value) field = self.etc.data.fields[key] #puts key #puts value.class if (value.class == Date) || (value.class == ActiveSupport::TimeWithZone) begin new_value = case field.format when 'month' then I18n.t('anubis.months.main')[value.month-1]+' '+value.year.to_s when 'date' then value.day.to_s+' '+ I18n.t('anubis.months.second')[value.month-1]+' '+value.year.to_s when 'datetime' then value.day.to_s+' '+ I18n.t('anubis.months.second')[value.month-1]+' '+value.year.to_s+', '+value.hour.to_s+':'+('%02d' % value.min) else value.day.to_s+' '+ I18n.t('anubis.months.second')[value.month-1]+' '+value.year.to_s+', '+value.hour.to_s+':'+('%02d' % value.min)+':'+('%02d' % value.sec) end if %w[month date].include? field.format raw_value = value.year.to_s + '-' + ('%02d' % value.month) + '-' + ('%02d' % value.day) else #raw_value = value.year.to_s + '-' + ('%02d' % value.month) + '-' + ('%02d' % value.day) + ' ' + ('%02d' % value.hour) + ':' + ('%02d' % value.min) raw_value = value.iso8601(2)[0..18] end rescue StandardError => e #puts e new_value = field.error_text end else new_value = ''; end case self.etc.action when 'new', 'edit' return { key => raw_value, format('%s_view', key).to_sym => new_value } end return { key => new_value, format('%s_raw', key).to_sym => value } end ## # Convert value from database to table view for text type def convert_db_to_table_value_text1(key, field, value) return { key => '', ('raw_'+key.to_s).to_sym => '' } if !value new_value = ERB::Util.html_escape(value).to_s.gsub(/(?:\n\r?|\r\n?)/, '
') return { key => new_value, ('raw_'+key.to_s).to_sym => value } end ## # Convert value from database to table view for string type def convert_db_to_table_value_integer1(key, field, value) return { key => '' } if !value return { key => value } end ## # Convert value from database to table view for longlistbox type def convert_db_to_table_value_longlistbox1(key, field, value) return { key => '' } if !value return { key => value } end ## # Convert value from database to table view for datetime type def convert_db_to_table_value_datetime1(key, field, value) begin value = case field[:format] when 'month' then I18n.t('months.main')[value.month-1]+' '+value.year.to_s when 'date' then value.day.to_s+' '+ I18n.t('months.second')[value.month-1]+' '+value.year.to_s when 'datetime' then value.day.to_s+' '+ I18n.t('months.second')[value.month-1]+' '+value.year.to_s+', '+value.hour.to_s+':'+('%02d' % value.min) else value.day.to_s+' '+ I18n.t('months.second')[value.month-1]+' '+value.year.to_s+', '+value.hour.to_s+':'+('%02d' % value.min)+':'+('%02d' % value.sec) end rescue value = I18n.t('incorrect_field_format') end return { key => value } end ## # Convert value from database to table view for float type # @param key [Symbol] key of table field # @param field [Tims::Etc::Table#fields] set of options of field by key # @param value [Float] value from database before processing # @return [Hash] return resulting value at format { key: processed_value, 'raw_'+key: value } def convert_db_to_table_value_float1(key, field, value) return { key => number_format(value, field[:precision], field[:point], field[:separator]), ('raw_'+key.to_s).to_sym => value} end ## # Convert value from database to edit form for datetime type # @param key [Symbol] field's identifier # @param field [Hash] field's options # @param value [Any] value from database before processing # @return [Hash] resulting value in format { key: processed_value } def convert_db_to_table_value_datetime(key, field, value) begin value = case field[:format] when 'month' then I18n.t('months.main')[value.month-1]+' '+value.year.to_s when 'date' then value.day.to_s+' '+ I18n.t('months.second')[value.month-1]+' '+value.year.to_s when 'datetime' then value.day.to_s+' '+ I18n.t('months.second')[value.month-1]+' '+value.year.to_s+', '+value.hour.to_s+':'+('%02d' % value.min) else value.day.to_s+' '+ I18n.t('months.second')[value.month-1]+' '+value.year.to_s+', '+value.hour.to_s+':'+('%02d' % value.min)+':'+('%02d' % value.sec) end rescue value = I18n.t('incorrect_field_format') end return { key => value } end ## # Convert value from database to edit form for float type # @param key [Symbol] field's identifier # @param field [Anubis::Etc::Data#fields] field's options # @param value [Float] value from database before processing # @return [Hash] return resulting value at format { key+'_view': processed_value, key: value } def convert_db_to_table_value_float(key, field, value) return { (key.to_s+'_view').to_sym => number_format(value, field[:precision], field[:point], field[:separator]), key => value} end # @!endgroup ## # @!group Block of conversion human view values to database format ## # Converts inputted value to database format. # Field type is got from {Anubis::Etc::Data#fields self.etc.data.fields} according by key. # Resulting data is placed into {Anubis::Etc::Data#data self.etc.data.data} attribute according by key. # Errors are placed in {Anubis::Output::Update#errors self.output.errors} array according by key. # @param key [Symbol] field's identifier in {Anubis::Etc::Data#fields self.etc.data.fields} structure # @param value [String] value from user input def convert_view_to_db_value(key, value) field = self.etc.data.fields[key] return { key => value } unless field return { key => value } unless field.type proc = format('convert_view_to_db_value_%s', field.type) self.send proc, key, value end ## # Converts inputted value to database format for {Anubis::Etc::Field#type 'string' field type}. # @param key [Symbol] field's identifier in {Anubis::Etc::Data#fields self.etc.data.fields} structure # @param value [String] inputted value def convert_view_to_db_value_string(key, value) proc = format('self.etc.data.data.%s = value', key) #self.etc.data.data[key] = value eval proc end ## # Converts inputted value to database format for {Anubis::Etc::Field#type 'boolean' field type}. # @param key [Symbol] field's identifier in {Anubis::Etc::Data#fields self.etc.data.fields} structure # @param value [Boolean] inputted value def convert_view_to_db_value_boolean(key, value) proc = format('self.etc.data.data.%s = value', key) #self.etc.data.data[key] = value eval proc end ## # Converts inputted value to database format for {Anubis::Etc::Field#type 'number' field type}. # @param key [Symbol] field's identifier in {Anubis::Etc::Data#fields self.etc.data.fields} structure # @param value [String] inputted value def convert_view_to_db_value_number(key, value) field = self.etc.data.fields[key] if field.precision == 0 value = value.to_s.to_i else value = value.to_s.to_f end proc = format('self.etc.data.data.%s = value', key) #self.etc.data.data[key] = value eval proc end ## # Converts inputted value to database format for {Anubis::Etc::Field#type 'text' field type}. # @param key [Symbol] field's identifier in {Anubis::Etc::Data#fields self.etc.data.fields} structure # @param value [String] inputted value def convert_view_to_db_value_text(key, value) proc = format('self.etc.data.data.%s = value', key) #self.etc.data.data[key] = value eval proc end ## # Converts inputted value to database format for {Anubis::Etc::Field#type 'html' field type}. # @param key [Symbol] field's identifier in {Anubis::Etc::Data#fields self.etc.data.fields} structure # @param value [String] inputted value def convert_view_to_db_value_html(key, value) proc = format('self.etc.data.data.%s = value', key) #self.etc.data.data[key] = value eval proc end ## # Converts inputted value to database format for {Anubis::Etc::Field#type 'listbox' field type} # for {Anubis::Data::Actions#create 'create'} action # @param key [Symbol] field's identifier in {Anubis::Etc::Data#fields self.etc.data.fields} structure # @param value [String] inputted value def convert_view_to_db_value_listbox(key, value) field = self.etc.data.fields[key] begin proc = format('self.etc.data.data.%s = value', field.field) #self.etc.data.data[field.field] = value eval proc rescue self.etc.data.data[field.field] = nil end end ## # Converts inputted value to database format for {Anubis::Etc::Field#type 'key' field type} # for {Anubis::Data::Actions#create 'create'} action # @param key [Symbol] field's identifier in {Anubis::Etc::Data#fields self.etc.data.fields} structure # @param value [String] inputted value def convert_view_to_db_value_key(key, value) field = self.etc.data.fields[key] where = {} where[field.model.title.to_s.to_sym] = value value = field.model.model.where(where).first proc = format('self.etc.data.data.%s = value', field.key) eval(proc) #begin # self.etc.data.data[key] = value # rescue # self.etc.data.data[key] = nil # end end ## # Converts inputted value to database format for {Anubis::Etc::Field#type 'datetime' field type}. # @param key [Symbol] field's identifier in {Anubis::Etc::Data#fields self.etc.data.fields} structure # @param value [String] inputted value def convert_view_to_db_value_datetime(key, value) zone = ActiveSupport::TimeZone[self.current_user.timezone] offset = if zone.utc_offset/3600 < 0 then (zone.utc_offset/3600).to_s else '+'+(zone.utc_offset/3600).to_s end #puts 'convert_view_to_db_value_datetime' #puts value value = Time.zone.parse value #puts value #puts zone #puts offset #puts value.utc_offset if value proc = format('self.etc.data.data.%s = value', key) #self.etc.data.data[key] = value eval proc end # @!endgroup end end end end