# encoding: utf-8
class ApplicationFormSignup
require 'openssl/cipher'
include Mongoid::Document
include Mongoid::Timestamps
HiddenFields = ['application_form_signup_id', 'password', 'status', 'reviewer_ids_list','_id', 'created_at', 'updated_at','application_form_main_id',"serial_number","final_session","final_sessions","preferred_sessions",'application_form_session_id',"application_form_session_ids","preferred_session","sort_number","abstract_number","presentation_type", "cipher_stage_num", "process_stage", "review_status"]
DefaultEnableFields = ['name','tel','phone','email', 'recaptcha']
field :sort_number , type: Integer, default: 10000
field :process_stage, type: Integer, default: 1
field :review_status, type: Integer, default: 0 # 0 => 審核中, 1 => 不通過, 2=> 申請通過
field :cipher_stage_num, type: Array, default: []
field :status
field :name # become Last Name for TICC
field :tel, type: String # become First Name for TICC
field :unit, localize: true
field :phone, type: String
field :fax, type: String
field :email, type: String
field :address, localize: true
field :password
field :note, localize: true
field :serial_number
field :final_session #only store old data , not used
field :final_sessions
field :preferred_sessions, type: Array, default: []
field :reviewer_ids_list, type: Array, default: []
def reviewer_ids_list
main = self.application_form_main
main.reviewer_enables.each_with_index.collect do |e,k|
if e
if main.reviewer_type_list[k]=='fixed'
main.reviewer_ids_list[k]
else
super()[k]
end
else
nil
end
end
end
belongs_to :application_form_main
field :application_form_session_id #only store old data , not used
field :application_form_session_ids, type: Array, default: []
has_many :application_form_signup_values, :autosave => true, :dependent => :destroy
has_many :application_form_signup_contributes, :autosave => true, :dependent => :destroy
accepts_nested_attributes_for :application_form_signup_values, allow_destroy: true
accepts_nested_attributes_for :application_form_signup_contributes, allow_destroy: true
scope :sort_ordered, ->{ order_by(:sort_number=>1,:created_at=>1) }
before_create do
unit = self.unit_translations.values.select{|v| v.present?}.first
self.unit_translations = I18n.available_locales.map{|l| [l.to_s,unit]}.to_h
self.random_cipher(false)
if self.serial_number.nil?
s = ApplicationFormSetting.first
s.last_serial_number += 1
self.serial_number = s.last_serial_number
s.save(:validate=>false)
end
end
after_destroy do
application_form_main = self.application_form_main
if application_form_main.present?
application_form_reviews = application_form_main.application_form_reviews
id = self.id.to_s
application_form_reviews.each do |sr|
if sr.all_application_form_signup_ids.include?(id)
sr.application_form_signup_ids.delete(id)
sr.remove_application_form_signup_ids.delete(id)
sr.default_application_form_signup_ids.delete(id)
sr.save
end
end
if application_form_main.unassigned_application_form_signup_ids.delete(id)
application_form_main.save
end
end
application_form_session = ApplicationFormSession.where(:id=>self.application_form_session_id).first
if application_form_session
application_form_session.application_form_signup_ids.delete(self.id.to_s)
application_form_session.save
end
end
def clean_cipher
self.update(:cipher_stage_num => [])
end
def random_cipher(save_flag=true)
cipher = OpenSSL::Cipher::AES.new(128, :CBC)
cipher.encrypt
key = cipher.random_key
iv = cipher.random_iv
(1..5).each do |i|
encrypted = cipher.update(i.to_s) + cipher.final
self.cipher_stage_num << Base64.encode64(encrypted).strip()
end
self.save if save_flag
end
def update_process_stage(new_stage) #stage start from 0
(0..new_stage - 1).each{|i| self.cipher_stage_num[i] = nil}
new_stage = new_stage + 1
self.process_stage = new_stage
self.save
end
def review_progress
stage_trans = I18n.t('application_form.stage')
max_stage = @max_stage
if max_stage.nil?
max_stage = self.application_form_main.get_max_stage
end
max_stage += 1
" #{I18n.t('application_form.num.'+self.process_stage.to_s)}#{stage_trans} / #{I18n.t('application_form.num.'+max_stage.to_s)}#{stage_trans} : #{I18n.t('application_form.status.'+review_status.to_s)}"
end
def get_reviewer_email(stage=self.process_stage, override_reviewer_ids_list=nil)
stage = stage - 1
if override_reviewer_ids_list.nil?
override_reviewer_ids_list = self.reviewer_ids_list
end
member_ids = override_reviewer_ids_list[stage]
return MemberProfile.where(:id.in=>member_ids).pluck(:email).select{|s| s.present?}.uniq
end
def get_cipher_stage(stage)
self.cipher_stage_num[stage - 1]
end
def get_stage_num(cipher)
return self.cipher_stage_num.index(cipher)
end
def display_serial_number
display_format_string(self.serial_number,4)
end
def display_format_string(num, str_length)
return format("%0#{str_length}d", num)
end
def set_preferred_sessions
self.preferred_sessions = self.application_form_signup_contributes.pluck(:preferred_session)
self.save
end
def get_display_fields
application_form = self.application_form_main
if application_form.nil?
return []
else
locale = I18n.locale.to_s
except_fields = ["password", "recaptcha"]
all_fields = []
if application_form.application_form_signup_field_sets.count != 0
all_fields = application_form.application_form_signup_field_sets.map do |set|
field_name = set.field_name
next if set.disabled || except_fields.include?(field_name)
value = self.send(field_name) rescue nil
next if value.nil?
if field_name == "status"
value = I18n.t("application_form.registration_status_#{value}")
elsif self.fields[field_name].options[:localize]
values = self.send("#{field_name}_translations").select{|k,v| v.present?}
value = ""
if values.count == 0
next
elsif values.count == 1
value = values.values.first
else
last_idx = values.count - 1
values.each_with_index do |(l, v), i|
value += (I18n.t(l) + ": " + v )
if i != last_idx
value += "
"
end
end
end
end
{
"field_name"=>field_name,
"title"=>set.name[locale],
"value"=> value
}
end.compact
else
field_names = self.class::DefaultEnableFields
all_fields = field_names.map do |field_name|
next if except_fields.include?(field_name)
value = self.send(field_name) rescue nil
next if value.nil?
field_name_trans = I18n.t("application_form_signup.#{field_name}")
if field_name == "status"
I18n.t("application_form.registration_status_#{value}")
elsif self.fields[field_name].options[:localize]
values = self.send("#{field_name}_translations").select{|k,v| v.present?}
value = ""
if values.count == 0
next
elsif values.count == 1
value = values.values.first
else
last_idx = values.count - 1
values.each_with_index do |(l, v), i|
value += (I18n.t(l) + ": " + v )
if i != last_idx
value += "
"
end
end
end
end
{
"field_name"=>field_name,
"title"=> field_name_trans,
"value"=> value
}
end.compact
end
application_form.application_form_signup_fields.asc(:_id).each do |rf|
application_form_signup_value = rf.application_form_signup_values.where(:application_form_signup_id=>self.id).last
if application_form_signup_value
value = application_form_signup_value.get_field_value rescue nil
if value
all_fields << value
end
end
end
return all_fields
end
end
end