diff --git a/app/assets/javascripts/olympiamanagement.js b/app/assets/javascripts/olympiamanagement.js index cf2cbbb..c96b23b 100644 --- a/app/assets/javascripts/olympiamanagement.js +++ b/app/assets/javascripts/olympiamanagement.js @@ -1,3 +1,96 @@ +function checkid(it){ + var ALP_STR = "ABCDEFGHJKLMNPQRSTUVXYWZIO"; + var NUM_STR = "0123456789"; + function CheckPID(it) { + var sMsg = ""; + var sPID = it.value; + if (sPID == '') { + sMsg = "請輸入身分證字號"; + } else if (sPID.length != 10) { + sMsg = "身分證字號長度應為 10 !"; + } else { + sPID = sPID.toUpperCase().trim(); + if (!chkPID_CHAR(sPID)) return; + + var iChkNum = getPID_SUM(sPID); + + if (iChkNum % 10 != 0) { + var iLastNum = sPID.substr(9, 1) * 1; + for (i = 0; i < 10; i++) { + var xRightAlpNum = iChkNum - iLastNum + i; + if ((xRightAlpNum % 10) == 0) { + sMsg = "身分證字號最後一個數應為:" + i; + break; + } + } + } + } + if (sMsg.length != 0) { + //alert(sMsg); + alert((I18n.locale != "en") ? "身分證字號錯誤" : "ID Number error"); + it.select(); + return false; + }else{ + return true; + } + } + // 身分證字號檢查器 - 檢查合法字元 + function chkPID_CHAR(sPID) { + var sMsg = ""; + //sPID = trim(sPID.toUpperCase()); + var iPIDLen = String(sPID).length; + + var sChk = ALP_STR + NUM_STR; + for (i = 0; i < iPIDLen; i++) { + if (sChk.indexOf(sPID.substr(i, 1)) < 0) { + sMsg = "這個身分證字號含有不正確的字元!"; + break; + } + } + + if (sMsg.length == 0) { + if (ALP_STR.indexOf(sPID.substr(0, 1)) < 0) { + sMsg = "身分證字號第 1 碼應為英文字母(A~Z)。"; + } else if ((sPID.substr(1, 1) != "1") && (sPID.substr(1, 1) != "2")) { + sMsg = "身分證字號第 2 碼應為數字(1~2)。"; + } else { + for (var i = 2; i < iPIDLen; i++) { + if (NUM_STR.indexOf(sPID.substr(i, 1)) < 0) { + sMsg = "第 " + (i + 1) + " 碼應為數字(0~9)。"; + break; + } + } + } + } + + if (sMsg.length != 0) { + //alert(sMsg); + alert((I18n.locale != "en") ? "身分證字號錯誤" : "ID Number error"); + return false; + } else { + return true; + } + } + //身份證字號檢查器 - 累加檢查碼 + function getPID_SUM(sPID) { + var iChkNum = 0; + + // 第 1 碼 + iChkNum = ALP_STR.indexOf(sPID.substr(0, 1)) + 10; + iChkNum = Math.floor(iChkNum / 10) + (iChkNum % 10 * 9); + + // 第 2 - 9 碼 + for (var i = 1; i < sPID.length - 1; i++) { + iChkNum += sPID.substr(i, 1) * (9 - i); + } + + // 第 10 碼 + iChkNum += sPID.substr(9, 1) * 1; + + return iChkNum; + } + return CheckPID(it); +}; $(document).ready(function(){ $('.class_setting_block input[type="reset"]').off('click').on('click',function(){ $('.col_input').val(''); @@ -33,11 +126,22 @@ $(document).ready(function(){ if($('.fieldset_block .required.errFld').length != 0) return false; else - return true; + if($('#StudentIDNO').length != 0) + try{return checkid(document.getElementById('StudentIDNO')); + }catch(e){console.log(e);return false;}; }) var $el = $('.fieldset_block select'); for(var i = 0 ; i < $el.length ; i++) if($el.eq(i).attr('value') != "" && $el.eq(i).attr('value') != undefined) $el.eq(i).find('option[value='+$el.eq(i).attr('value')+']').attr('selected','selected'); - CKEDITOR.replaceAll(); + try{CKEDITOR.replaceAll()}catch(e){console.log(e)}; + if($('#StudentIdentity').val() != '1') + $('#StudentFile').removeClass('required'); + $('#StudentIdentity').click(function(){ + if(this.value != '1'){ + $('#StudentFile').removeClass('required'); + }else{ + $('#StudentFile').addClass('required'); + }; + }); }); \ No newline at end of file diff --git a/app/controllers/olympiamanagements_controller.rb b/app/controllers/olympiamanagements_controller.rb index 809afad..19979ed 100644 --- a/app/controllers/olympiamanagements_controller.rb +++ b/app/controllers/olympiamanagements_controller.rb @@ -3,6 +3,7 @@ class OlympiamanagementsController < ApplicationController before_action :set_sign_up_setting,:create_first_fields prepend_view_path "app/templates" #for_render_pages layout :get_layout #for_render_pages + helper Admin::OlympiamanagementsHelper before_action :check_login, except: :login def initialize super @@ -49,7 +50,7 @@ class OlympiamanagementsController < ApplicationController {:url=>'/olympiamanagements/edit_password',:name=>t('olympiamanagement.edit_password')}, {:url=>'/olympiamanagements/print_registration_form',:name=>t('olympiamanagement.print_registration_form')}, {:url=>'/olympiamanagements/logout',:name=>t('olympiamanagement.logout')}] - @breadcumb = render_to_string(:formats=> [:html] ,:partial=>'breadcumb',:locals=>{:data_arr=>data_arr}) + @breadcumb = render_to_string(:formats=> [:html] ,:partial=>'breadcumb',:locals=>{:data_arr=>data_arr,:@title=>I18n.t('olypiamanagement.sign_up_title')}) end def index uid = OrbitHelper.params[:uid] rescue "" @@ -83,7 +84,7 @@ class OlympiamanagementsController < ApplicationController end end data_arr = @page.child_page.map{|page| {:url=>"/#{I18n.locale}#{page.url}",:name=>page.name}} - @breadcumb = render_to_string(:formats=> [:html] ,:partial=>'breadcumb',:locals=>{:data_arr=>data_arr}) + @breadcumb = render_to_string(:formats=> [:html] ,:partial=>'breadcumb',:locals=>{:data_arr=>data_arr,:@title=>I18n.t('olypiamanagement.sign_up_title')}) @olympiamanagement_instruction = @breadcumb + @olympiamanagement_instruction.html_safe else if !@instructions_pages.empty? @@ -139,7 +140,7 @@ class OlympiamanagementsController < ApplicationController @instructions_pages.each{|page| page.destroy} end data_arr = @page.child_page.map{|page| {:url=>"/#{I18n.locale}#{page.url}",:name=>page.name}} - @breadcumb = render_to_string(:formats=> [:html] ,:partial=>'breadcumb',:locals=>{:data_arr=>data_arr}) + @breadcumb = render_to_string(:formats=> [:html] ,:partial=>'breadcumb',:locals=>{:data_arr=>data_arr,:@title=>I18n.t('olypiamanagement.sign_up_title')}) @page_content = @breadcumb+'
#{I18n.t('olympiamanagement.please_set_school_connect_data')}
".html_safe) else @student_data_field = StudentDataField.first - @olympia_student_data = (OlympiaStudentDataFields.find(params[:id]) rescue OlympiaStudentDataFields.new) + @olympia_student_data = (OlympiaStudentDataField.find(params[:id]) rescue OlympiaStudentDataField.new) @page_content = render_to_string(:formats=> [:html] ,:partial=>'add_student_data.html',:locals=>{:@error=>(@@error rescue nil),:@student_data_field=>@student_data_field,:@olympia_student_data=>@olympia_student_data}) render_contents_in_index_page(@breadcumb+@page_content.html_safe) end @@ -204,8 +205,11 @@ class OlympiamanagementsController < ApplicationController end end def sign_up_student_data_list + page_num = params[:page] || 1 @field_infos = StudentDataField.first.student_data_fields - @student_fields = OlympiaStudentDataFields.all + @olympia_school_data_fields_id = OlympiaSchoolDataFields.where(:account_number=>session[:olympia_login_id]).first.id + @sign_up_setting_id = SignUpSetting.last.id + @student_fields = OlympiaStudentDataField.where(:olympia_school_data_fields_id=>@olympia_school_data_fields_id,:sign_up_setting_id=>@sign_up_setting_id).asc(:id).page(page_num).per(10) @page_content = render_to_string(:formats=> [:html] ,:partial=>'student_data_list.html',:locals=>{:@student_fields=>(@student_fields rescue [])}).html_safe render_contents_in_index_page(@breadcumb+@page_content) end @@ -237,6 +241,20 @@ class OlympiamanagementsController < ApplicationController end end def print_registration_form + @page = Page.where(:layout=>"olympia_managements_index",:parent_page_id=>(Page.where(:name=> ((I18n.locale.to_s == "en") ? "Home" : "首頁")).first.id)).first + data_arr = @page.child_page.map{|page| {:url=>"/#{I18n.locale}#{page.url}",:name=>page.name}} + @breadcumb = render_to_string(:formats=> [:html] ,:partial=>'breadcumb',:locals=>{:data_arr=>data_arr,:@title=>I18n.t('olypiamanagement.sign_up_title')}) + @remark_texts =SignUpSetting.last.remark_field[I18n.locale.to_s].html_safe + @record_form_title = ((I18n.locale.to_s == "zh_tw") ? "#{Time.now.year}年國中科學奧林匹亞競賽國家代表隊選拔初選報名表" : "#{Time.now.year} Year International Junior Science Olympiad National Team Selection First Stage Sign up Form") + @school_data = OlympiaSchoolDataFields.where(:account_number=>session[:olympia_login_id]).first + @record_fields = [['school_name','school_code'],['school_address'],['class_number','enrollment_limited'], + ['office_tel_number','fax'],['mobile_number','email'],['principal_signature','dean_signature']] + @student_fields = ['serial_number','StudentName','StudentSex','StudentClass','StudentIDNO','birth_date','StudentArea','StudentIdentity'] + @field_infos = StudentDataField.first.student_data_fields + @olympia_school_data_fields_id = OlympiaSchoolDataFields.where(:account_number=>session[:olympia_login_id]).first.id + @sign_up_setting_id = SignUpSetting.last.id + @student_data_list = OlympiaStudentDataField.where(:olympia_school_data_fields_id=>@olympia_school_data_fields_id,:sign_up_setting_id=>@sign_up_setting_id) + render :html => @student_data_list.to_a end def logout session[:olympia_login_id] = "" @@ -529,13 +547,125 @@ class OlympiamanagementsController < ApplicationController end def updata_student_data if params[:type] == 'add_student_data' - @student_params = params.require(:add_student_data).permit(:StudentIdentity,:StudentName,:StudentSex,:StudentIDNO,:StudentBirthMonth,:StudentBirthDay,:StudentClass,:StudentPhone,:StudentCode,:StudentAddress,:StudentArea,:StudentFile) - @olympia_student_data = OlympiaStudentDataFields.find(params[:id]) rescue nil - @olympia_student_data.nil? ? OlympiaStudentDataFields.create(@student_params) : @olympia_student_data.update_attributes(@student_params) - redirect_to sign_up_student_data_list_olympiamanagements_path + @error_msg = [] + @student_params = params.require(:add_student_data).permit! + @all_fields_name = (StudentDataField.first || StudentDataField.new).student_data_fields.map{|hash| hash.keys[0]} + if @student_params.select{|key,value| !value.to_s.blank?}.count < @all_fields_name.slice(0,@all_fields_name.count-1).count + @error_msg << "缺少#{@all_fields_name.slice(0,@all_fields_name.count-1).count-@student_params.select{|key,value| !value.to_s.blank?}.count}個欄位值" + end + @student_params.select{|key,value| value.to_s.blank?}.keys.each do |key| + @error_msg << "#{I18n.t('olympiamanagement.'+key)}欄位值為空" + end + @id_error_msg = checkid(@student_params['StudentIDNO']) + if @id_error_msg.length != 0 + @error_msg << I18n.t('olympiamanagement.id_number_error') + end + if @student_params['StudentIdentity'] == '1' && (@student_params['olympia_student_images']['0']['StudentFile'].nil? rescue true) + @error_msg << I18n.t('olympiamanagement.StudentFile') + end + @olympia_school_data_field = OlympiaSchoolDataFields.where(:account_number=>session[:olympia_login_id]).first + @enrollment_limited = ((@olympia_school_data_field.enrollment_limited.nil? || @olympia_school_data_field.enrollment_limited == 0) ? ClassSettingFields.all.select{|class_setting_field| class_setting_field.class_number_range[0] <= @olympia_school_data_field.class_number.to_i && class_setting_field.class_number_range[1] >= @olympia_school_data_field.class_number.to_i}.first.enrollment_available.to_i : @olympia_school_data_field.enrollment_limited.to_i) + @student_fields = OlympiaStudentDataField.where(:olympia_school_data_fields_id=>@olympia_school_data_field.id,:sign_up_setting_id=>@sign_up_setting_id) + if @student_fields.length > @enrollment_limited + @error_msg << ((I18n.locale.to_s == "zh_tw") ? ("一般身分報名人數上限為 #{@enrollment_limited} 人。") : ("Enrollment limited of General identity is #{@enrollment_limited} people.")) + @error_msg << I18n.t('olympiamanagement.already_exceed_enrollment_limited') + end + if @error_msg.empty? + @olympia_student_data = OlympiaStudentDataField.find(params[:id]) rescue nil + if @olympia_student_data.nil? + @olympia_student_data = OlympiaStudentDataField.create(@student_params) + @olympia_student_data.olympia_school_data_fields_id = @olympia_school_data_field.id + @olympia_student_data.sign_up_setting_id = SignUpSetting.last.id + @olympia_student_data.save + else + @olympia_student_data.update_attributes(@student_params) + end + redirect_to sign_up_student_data_list_olympiamanagements_path + else + @page_content = render_to_string(:formats=>[:html],:partial=>'import_error_msg.html',:locals=>{:@error_msg=>@error_msg}) + render_contents_in_index_page(@page_content) + end + elsif params[:type] == 'delete_student_data' + @olympia_student_data = OlympiaStudentDataField.find(params[:id]) rescue nil + @olympia_student_data.destroy if !@olympia_student_data.nil? + redirect_to :back else render :html => '404' end #render :html => '123' end + def checkid(id_number) + @ALP_STR = "ABCDEFGHJKLMNPQRSTUVXYWZIO" + @NUM_STR = "0123456789" + def CheckPID(id_number) + @sMsg = "" + sPID = id_number + if(sPID == '') + @sMsg = "請輸入身分證字號" + elsif (sPID.length != 10) + @sMsg = "身分證字號長度應為 10 !" + else + sPID = sPID.upcase.strip + @sMsg = chkPID_CHAR(sPID) + if (@sMsg.length != 0) + return @sMsg + end + @iChkNum = getPID_SUM(sPID) + if (@iChkNum % 10 != 0) + iLastNum = sPID[9].to_i + for i in 0 .. 10 + xRightAlpNum = @iChkNum - iLastNum + i + if ((xRightAlpNum % 10) == 0) + @sMsg = "身分證字號最後一個數應為:#{i}" + break + end + end + end + end + return @sMsg; + end + # 身分證字號檢查器 - 檢查合法字元 + def chkPID_CHAR(sPID) + @sMsg = "" + #sPID = sPID.upcase.strip; + iPIDLen = String(sPID).length + sChk = @ALP_STR + @NUM_STR + for i in 0 ... iPIDLen + if (sChk.index(sPID[i]) < 0) + @sMsg = "這個身分證字號含有不正確的字元!" + break + end + end + if (@sMsg.length == 0) + if (@ALP_STR.index(sPID[0]) < 0) + @sMsg = "身分證字號第 1 碼應為英文字母(A~Z)。" + elsif ((sPID[1] != "1") && (sPID[1] != "2")) + @sMsg = "身分證字號第 2 碼應為數字(1~2)。" + else + for i in 2 ... iPIDLen + if (@NUM_STR.index(sPID[i]) < 0) + @sMsg = "第 #{i + 1} 碼應為數字(0~9)。" + break + end + end + end + end + return @sMsg + end + #身份證字號檢查器 - 累加檢查碼 + def getPID_SUM(sPID) + @iChkNum = 0 + #第 1 碼 + @iChkNum = @ALP_STR.index(sPID[0]) + 10 + @iChkNum = (@iChkNum / 10) + (@iChkNum % 10 * 9) + # 第 2 - 9 碼 + for i in 1 ... (sPID.length - 1) + @iChkNum += sPID[i].to_i * (9 - i) + end + # 第 10 碼 + @iChkNum += sPID[9].to_i; + return @iChkNum; + end + return CheckPID(id_number); + end end \ No newline at end of file diff --git a/app/helpers/admin/olympiamanagements_helper.rb b/app/helpers/admin/olympiamanagements_helper.rb index 0a9a00d..62c45c9 100644 --- a/app/helpers/admin/olympiamanagements_helper.rb +++ b/app/helpers/admin/olympiamanagements_helper.rb @@ -3,6 +3,7 @@ module Admin::OlympiamanagementsHelper page = 1 if page == 0 per_page_num = 10.0 all_page_num = (fields.count / per_page_num).ceil + all_page_num = 1 if all_page_num == 0 pagination = '