From 77d4af01f365e5114ede002876567b011decedcf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=B1=E5=8D=9A=E4=BA=9E?= Date: Sun, 21 May 2023 17:16:16 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=99=95=E7=90=86=E7=8B=80?= =?UTF-8?q?=E6=85=8B=E5=92=8C=E5=9B=9E=E8=A6=86=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application_form_signups_controller.rb | 56 ++++++--- .../admin/application_forms_controller.rb | 30 +++++ app/models/application_form_main.rb | 2 +- app/models/application_form_setting.rb | 1 + app/models/application_form_signup.rb | 3 + app/models/application_form_ticket_status.rb | 42 +++++++ .../application_form_signups/view.html.erb | 30 ++++- .../admin/application_forms/email.html.erb | 21 ++++ .../application_forms/ticket_status.html.erb | 115 ++++++++++++++++++ application_form.gemspec | 4 + config/locales/en.yml | 10 ++ config/locales/zh_tw.yml | 10 ++ config/routes.rb | 26 +++- lib/application_form/engine.rb | 5 + 14 files changed, 335 insertions(+), 20 deletions(-) create mode 100644 app/models/application_form_ticket_status.rb create mode 100644 app/views/admin/application_forms/email.html.erb create mode 100644 app/views/admin/application_forms/ticket_status.html.erb diff --git a/app/controllers/admin/application_form_signups_controller.rb b/app/controllers/admin/application_form_signups_controller.rb index 2196886..772782c 100644 --- a/app/controllers/admin/application_form_signups_controller.rb +++ b/app/controllers/admin/application_form_signups_controller.rb @@ -39,26 +39,54 @@ class Admin::ApplicationFormSignupsController < OrbitAdminController @application_form_signup = ApplicationFormSignup.find(params[:id]) @application_form_signup.update_attributes(application_form_signup_params) - if !params[:application_form_signup_values].nil? - params[:application_form_signup_values].each_with_index do |r,i| - field_value = r.last[:id].present? - @custom_field_value = ApplicationFormSignupValue.put_field_values(@application_form_signup, r.last, r.last[:id], field_value) - end - application_form_reviews = ApplicationFormReview.where(:application_form_main_id=>@application_form_signup.application_form_main_id).to_a - application_form_reviews.each{|sr| sr.save} - @application_form = @application_form_signup.application_form_main - unassigned_application_form_signup_ids = @application_form.application_form_signup_ids.map{|s| s.to_s} - @application_form.application_form_reviews.each do |sr| - unassigned_application_form_signup_ids = unassigned_application_form_signup_ids - sr.all_application_form_signup_ids - end - @application_form.unassigned_application_form_signup_ids = unassigned_application_form_signup_ids - @application_form.save + # if !params[:application_form_signup_values].nil? + # params[:application_form_signup_values].each_with_index do |r,i| + # field_value = r.last[:id].present? + # @custom_field_value = ApplicationFormSignupValue.put_field_values(@application_form_signup, r.last, r.last[:id], field_value) + # end + # application_form_reviews = ApplicationFormReview.where(:application_form_main_id=>@application_form_signup.application_form_main_id).to_a + # application_form_reviews.each{|sr| sr.save} + # @application_form = @application_form_signup.application_form_main + # unassigned_application_form_signup_ids = @application_form.application_form_signup_ids.map{|s| s.to_s} + # @application_form.application_form_reviews.each do |sr| + # unassigned_application_form_signup_ids = unassigned_application_form_signup_ids - sr.all_application_form_signup_ids + # end + # @application_form.unassigned_application_form_signup_ids = unassigned_application_form_signup_ids + # @application_form.save + # end + if @application_form_signup.finish_time + build_email(@application_form_signup) end redirect_to "/admin/application_forms/#{@application_form_signup.application_form_main_id}/application_form_signup" end + def build_email(email_er) + @group_mail = email_er.email + @mail_sentdate = DateTime.now + + site = Site.first + mail_from = site.title_translations[site['default_locale']] + + Email.create( + :mail_lang=> site['default_locale'], + :create_user=>current_user, + :mail_sentdate=>@mail_sentdate, + :module_app=>@module_app, + :mail_to=>@group_mail, + :mail_subject=>mail_from+" #{t('application_form.reply')}:", + :template=>'admin/application_forms/email', + :template_data=>{ + situation_title: I18n.t('application_form.situation'), + finish_time_title: I18n.t('application_form.finish_time'), + situation: (ApplicationFormTicketStatus.where(key: email_er.situation).first.title rescue nil), + finish_time: email_er.finish_time.strftime("%Y/%m/%d"), + "reply" => email_er.reply + } + ) + end + def destroy @application_form_signup = ApplicationFormSignup.find(params[:id]) diff --git a/app/controllers/admin/application_forms_controller.rb b/app/controllers/admin/application_forms_controller.rb index d4af843..a5beee5 100644 --- a/app/controllers/admin/application_forms_controller.rb +++ b/app/controllers/admin/application_forms_controller.rb @@ -851,6 +851,36 @@ class Admin::ApplicationFormsController < OrbitAdminController @print_text = process_format_text(@print_text,custom_fields) @save_name = process_format_text(@save_name,custom_fields) end + + def ticket_status + @ticket_statuses = ApplicationFormTicketStatus.all + if request.xhr? + render 'ticket_status', :layout => false + end + end + def get_ticket_status + ticket_status = ApplicationFormTicketStatus.where(:id=>params[:id]).first + render :json => { + "id"=>params[:id], + "title_translations"=> (ticket_status ? ticket_status.get_title_translations : {}) + } + end + def update_ticket_status + if params[:id].blank? + ticket_status = ApplicationFormTicketStatus.new + else + ticket_status = AskTicketStatus.where(:id=>params[:id]).first + end + ticket_status.update_attributes(params.require(:application_form_ticket_status).permit!) + render :json => {:success=>true} + end + def delete_ticket_status + ticket_status = ApplicationFormTicketStatus.where(:id=>params[:id]).first + unless ticket_status.is_default + ticket_status.destroy + end + render :json => {:success=>true} + end private diff --git a/app/models/application_form_main.rb b/app/models/application_form_main.rb index 51bdf44..a9b5587 100644 --- a/app/models/application_form_main.rb +++ b/app/models/application_form_main.rb @@ -37,7 +37,7 @@ class ApplicationFormMain field :contribute_file_count, type: String - field :registration_status , :type => Array #C: 投稿者 G:一般 + field :registration_status , :type => Array, default: [] #C: 投稿者 G:一般 field :create_user_id field :update_user_id diff --git a/app/models/application_form_setting.rb b/app/models/application_form_setting.rb index 6237b85..e0b42ee 100644 --- a/app/models/application_form_setting.rb +++ b/app/models/application_form_setting.rb @@ -4,6 +4,7 @@ class ApplicationFormSetting field :reviewer_length, default: 3, :type=> Integer field :last_serial_number, :type => Integer, :default => 0 + field :last_ticket_key, type: Integer, default: 0 def self.get_one s = self.first s = self.create if s.nil? diff --git a/app/models/application_form_signup.rb b/app/models/application_form_signup.rb index 7e61864..37e8daf 100644 --- a/app/models/application_form_signup.rb +++ b/app/models/application_form_signup.rb @@ -27,6 +27,9 @@ class ApplicationFormSignup field :reviewer_ids_list, type: Array, default: [] field :agree_reviewer_ids, type: Hash, default: {} field :agree_reviewer_times, type: Hash, default: {} + field :reply, type: String + field :finish_time, type: DateTime + field :situation, type: String, default: "is_waiting" #預設待處理 def reviewer_ids_list main = self.application_form_main main.reviewer_enables.each_with_index.collect do |e,k| diff --git a/app/models/application_form_ticket_status.rb b/app/models/application_form_ticket_status.rb new file mode 100644 index 0000000..3028bb2 --- /dev/null +++ b/app/models/application_form_ticket_status.rb @@ -0,0 +1,42 @@ +class ApplicationFormTicketStatus + include Mongoid::Document + include Mongoid::Timestamps + DefaultKeys = ["is_waiting", "is_processed", "is_referral", "is_published"] + field :title, type: String, localize: true + field :is_default, type: Boolean, default: false # if true => cannot delete + field :key, type: String + before_create do + if self.key.blank? + can_update_shared_hash = (defined?(OrbitHelper::SharedHash) && OrbitHelper::SharedHash) + last_ticket_key = can_update_shared_hash ? OrbitHelper::SharedHash["application_form"][:last_ticket_key] : ApplicationFormSetting.pluck(:last_ticket_key)[0].to_i + self.key = last_ticket_key.to_s + ApplicationFormSetting.all.inc({'last_ticket_key'=>1}) + if can_update_shared_hash + OrbitHelper::SharedHash["application_form"][:last_ticket_key] = last_ticket_key + 1 + end + end + true + end + after_destroy do + # can_update_shared_hash = (defined?(OrbitHelper::SharedHash) && OrbitHelper::SharedHash) + # ApplicationFormSetting.all.inc({'last_ticket_key'=>-1}) + # if can_update_shared_hash + # OrbitHelper::SharedHash["ask"][:last_ticket_key] = OrbitHelper::SharedHash["ask"][:last_ticket_key] - 1 + # end + end + def title + tmp = super + if self.is_default + tmp = I18n.t("ask.#{self.key}") if tmp.blank? + end + tmp + end + def get_title_translations(locales=nil) + locales = I18n.available_locales if locales.nil? + trans = {} + locales.each do |locale| + trans[locale] = I18n.with_locale(locale){self.title} + end + trans + end +end \ No newline at end of file diff --git a/app/views/admin/application_form_signups/view.html.erb b/app/views/admin/application_form_signups/view.html.erb index 8229aea..25c316a 100644 --- a/app/views/admin/application_form_signups/view.html.erb +++ b/app/views/admin/application_form_signups/view.html.erb @@ -1,4 +1,5 @@ -
+<%= form_for @application_form_signup, url: admin_application_form_signup_path(@application_form_signup), html: { class: 'form-horizontal main-forms previewable',multipart: true } do |f| %> +
<% content_for :page_specific_css do %> <%= stylesheet_link_tag "lib/main-forms" %> <%= stylesheet_link_tag "lib/fileupload" %> @@ -48,10 +49,33 @@ <% end %> +
+
<%= t('application_form.situation') %>
+
+ <%= f.select :situation, ApplicationFormTicketStatus.all.map{|a| [a.title, a.key]} %> +
+
+ + +
+
<%= t('application_form.finish_time') %>
+
+ <%= f.datetime_picker :finish_time, :format => "yyyy/MM/dd", :new_record => @application_form_signup.new_record? %> +
+
+ +
+
<%= t('application_form.reply') %>
+
+ <%= f.text_area :reply, rows: 10, style: 'width: 500px', :required => true %> +
+
- <%= link_to t('application_form.go_back'), "/admin/application_forms/#{@application_form.id}/application_form_signup", :class=>"btn" %> + <%= link_to t('application_form.go_back'), "/admin/application_forms/#{@application_form.id}/application_form_signup", :class=>"btn" %> + <%= f.submit t('submit'), class: 'btn btn-primary' %>
-
\ No newline at end of file +
+<% end %> \ No newline at end of file diff --git a/app/views/admin/application_forms/email.html.erb b/app/views/admin/application_forms/email.html.erb new file mode 100644 index 0000000..ff86a19 --- /dev/null +++ b/app/views/admin/application_forms/email.html.erb @@ -0,0 +1,21 @@ + + + + + + +

+ <%= @data['situation_title'] %>: + <%= @data['situation'] %> +

+

+ <%= @data['finish_time_title'] %>: + <%= @data['finish_time'] %> +

+

+ <%= @data['reply'].to_s.gsub(/[(\n)(\r)]/, "\n" => "
", "\r" => "" ).html_safe %> +

+
+

此為系統自動發信,請勿直接回覆

+ + \ No newline at end of file diff --git a/app/views/admin/application_forms/ticket_status.html.erb b/app/views/admin/application_forms/ticket_status.html.erb new file mode 100644 index 0000000..ad639b9 --- /dev/null +++ b/app/views/admin/application_forms/ticket_status.html.erb @@ -0,0 +1,115 @@ +
+
+ + + + +
+
+
+
+ <%= form_for :application_form_ticket_status, url: update_ticket_status_admin_application_forms_path, remote: true, :html=>{id: "application_form_ticket_status_form"} do |f| %> +
+ <%= hidden_field_tag :id, "", {:id=>'hidden_id_field'} %> + <%= f.fields_for :title_translations do |f| %> + <% @site_in_use_locales.each do |locale| %> +
+ +
+ +
+
+ <% end %> + <% end %> +
+ <%= t(:cancel) %> + <%= f.submit t(:submit), class: 'btn btn-primary btn-small', id: "application_form_ticket_status_submit" %> +
+
+ <% end %> +
+
+
+
+ + + + + + + + +<% @ticket_statuses.each do |ticket_status| %> + + + + +<% end %> + +
<%= t('application_form.ticket_status') %><%= t('application_form.action') %>
<%= ticket_status.title %> + <%= t(:edit) %> + <% unless ticket_status.is_default %> + + <% end %> +
+"><%= t(:add) %> + \ No newline at end of file diff --git a/application_form.gemspec b/application_form.gemspec index 33f716d..0100af5 100644 --- a/application_form.gemspec +++ b/application_form.gemspec @@ -94,6 +94,10 @@ Gem::Specification.new do |s| s.test_files = Dir["test/**/*"] s.installed_by_version = "2.2.2" if s.respond_to? :installed_by_version + s.metadata = { + "_require" => "#{File.expand_path("../app/models/application_form_setting", __FILE__)}", + "global_hash" => "{last_ticket_key: (ApplicationFormSetting.pluck(:last_ticket_key)[0].to_i rescue 0), last_serial_number: (ApplicationFormSetting.pluck(:last_serial_number)[0].to_i rescue 0)}" + } # s.add_dependency "custom_announcement" # s.add_dependency "custom_gallery" end diff --git a/config/locales/en.yml b/config/locales/en.yml index 7f54b47..388cf0f 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -223,6 +223,16 @@ en: frontend: application_form: Semianr #線上申請表單前台 + ticket_status: "Ticket Status" + action: Action + situation: Situation + is_waiting: Pending + is_processed: Processed + is_referral: Rreferral + is_published: Processed and Published + reply: Reply + finish_time: Finish Time + application_form_item: new_item: New Item #新增項目 edit_item: Edit Item #編輯項目 diff --git a/config/locales/zh_tw.yml b/config/locales/zh_tw.yml index 1eaec49..70be0a2 100644 --- a/config/locales/zh_tw.yml +++ b/config/locales/zh_tw.yml @@ -224,6 +224,16 @@ zh_tw: frontend: application_form: 線上申請表單前台 + ticket_status: "狀態設定" + action: "動作" + situation: 狀態 + is_waiting: 待處理 + is_processed: 已處理 + is_referral: 轉介其他單位 + is_published: 已處理 + reply: 回覆 + finish_time: 完成日期 + application_form_item: new_item: 新增項目 edit_item: 編輯項目 diff --git a/config/routes.rb b/config/routes.rb index 3343e7b..e0443be 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,6 +1,22 @@ Rails.application.routes.draw do - locales = Site.first.in_use_locales rescue I18n.available_locales + if ENV['worker_num']=='0' && File.basename($0) != 'rake' && !Rails.const_defined?('Console') + Thread.new do + begin + default_keys = ApplicationFormTicketStatus::DefaultKeys + if ApplicationFormTicketStatus.count < default_keys.count + default_keys.each do |k| + ticket_status = ApplicationFormTicketStatus.where(:is_default=>true,:key=>k).first + if ticket_status.nil? + ApplicationFormTicketStatus.create(:is_default=>true,:key=>k, :title_translations=>locales.map{|l| [l.to_s, I18n.with_locale(l){I18n.t("ask.#{k}")}]}.to_h ) + end + end + end + rescue => e + puts [e, e.backtrace] + end + end + end Thread.new do ApplicationFormEmailSet.where(:field_name=>nil).destroy end @@ -15,6 +31,12 @@ Rails.application.routes.draw do get ':application_form_id/print_setting' => "application_forms#print_setting" post 'print_setting_save' + + + get 'ticket_status' + post 'get_ticket_status' + post 'update_ticket_status' + delete 'delete_ticket_status' end resources :application_forms do member do @@ -51,7 +73,7 @@ Rails.application.routes.draw do end end resources :application_form_agreements - resources :application_form_signups, except: [:edit, :update] do + resources :application_form_signups, except: [:edit] do member do get 'view' end diff --git a/lib/application_form/engine.rb b/lib/application_form/engine.rb index 2555744..40ab077 100644 --- a/lib/application_form/engine.rb +++ b/lib/application_form/engine.rb @@ -54,6 +54,11 @@ module ApplicationForm # :priority=>6, # :active_for_action=>{'admin/application_forms'=>'enquiry_for_applicants'}, # :available_for => 'users' + context_link 'application_form.ticket_status', + :link_path=>"ticket_status_admin_application_forms_path" , + :priority=>6, + :active_for_action=>{'admin/application_forms'=>'ticket_status'}, + :available_for => 'managers' context_link 'application_form.setting', :link_path=>"setting_admin_application_forms_path" , :priority=>7,