greeting_card/app/models/greeting_card_record.rb

184 lines
5.6 KiB
Ruby
Raw Normal View History

2024-12-02 00:35:08 +00:00
class GreetingCardRecord
include Mongoid::Document
include Mongoid::Timestamps
# include ActiveModel::Validations
include OrbitCategory::Categorizable
include OrbitTag::Taggable
#https://stackoverflow.com/questions/378887/how-do-i-calculate-a-strings-width-in-ruby
mount_uploader :image, ImageUploader
# 欄位定義
field :serial_number, type: Integer
field :ip, type: String
field :title, type: String
field :name, type: String
field :sender_mail, type: String
field :recipients, type: String
field :greetings, type: String
field :sending_time, type: DateTime
field :situation, type: String, default: "is_email_not_confirmed" # 預設email未驗證
field :send_email, type: Integer, default: 0
field :email_id
field :verify_email_id
field :custom_values, type: Hash, default: {}
field :agree_show, type: Boolean, default: false
field :agree_usage, type: Boolean, default: false
field :is_hidden, type: Boolean
field :review_time, type: DateTime
belongs_to :reviewer, class_name: "MemberProfile", foreign_key: :reviewer_id
belongs_to :card_image, class_name: "GreetingCardImage", foreign_key: :card
has_many :greeting_card_status_histories
index({situation: 1, is_hidden: -1}, { unique: false, background: true })
attr_accessor :release_comment, :release_file, :user
before_create do
unless self.is_hidden
last_serial_number = GreetingCardSetting.update_last_serial_number
self.serial_number = last_serial_number
end
self.generate_image(false)
end
before_save :create_greeting_card_status_history
def self.get_fonts
["Arial", "Calibri", "Times New Roman", "微軟正黑體", "標楷體", "新細明體"]
end
def release_comment=(v)
@changed = true
@release_comment = v
end
def release_file=(v)
@changed = true
@release_file = v
end
def email
mail = Email.where(:id=>self.email_id).first
end
def verify_email
verify_email = Email.where(:id=>self.verify_email_id).first
end
def reviewer_emails
email_address = GreetingCardAdmin.or(:category_ids.in => [self.category_id, [], nil]).pluck(:email).select { |s| s.present? }.uniq rescue []
authorizes = Authorization.where(module_app_id: ModuleApp.where(key: 'greeting_card').first.id).to_a rescue []
authorizes.each do |a|
if a.category_id
next if a.category_id != self.category_id
end
if a.user_id
u = a.user
email_address << u.email if u && u.email
elsif a.role_id
email_address = email_address + MemberProfile.where(role_ids: a.role_id).pluck(:email).select { |s| s.present? }.uniq
else
a.destroy
end
end
email_address = email_address.flatten
email_address.uniq
end
def get_serial_number(last_serial_number=nil, display_length=nil)
if display_length.nil? && last_serial_number.nil?
can_update_shared_hash = (defined?(OrbitHelper::SharedHash) && OrbitHelper::SharedHash)
last_serial_number = (can_update_shared_hash ? OrbitHelper::SharedHash["greeting_card"][:last_serial_number] : GreetingCardSetting.pluck(:last_serial_number)[0].to_i)
end
display_length = [last_serial_number.to_s.length + 1, 4].max if display_length.nil?
display_format_string(self.serial_number, display_length) if self.serial_number
end
def display_format_string(num, str_length)
format("%0#{str_length}d", num)
end
def send_email?
self.send_email == 1
end
def new_history
@new_history
end
def generate_image(saved=true)
if self.card_image
layout_design = GreetingCardLayoutDesign.where(:category_id=> self.category_id.to_s).first
if layout_design.nil?
layout_design = GreetingCardLayoutDesign.where(:category_id=> nil).first
if layout_design.nil?
puts "Layout Design not exist!"
return false
end
end
data = {
title: self.title,
name: self.name,
sender_mail: self.sender_mail,
recipients: self.recipients,
greetings: self.greetings
}
layout_design.generate_image(self, self.card_image.file.path, data, saved)
end
end
def build_email(site, host_url, current_user, module_app, locale, email=nil, extra_data={})
if email.nil?
email = Email.new
email.save
self.email_id = email.id
self.save
end
group_mail = self.recipients
manager_emails = self.sender_mail
mail_sentdate = self.sending_time
mail_from = site.title_translations[locale]
mail_subject = mail_from + " #{I18n.t('greeting_card.new_card')}"
template_data = {
"greeting_card_record_id" => self.id.to_s,
"site_host" => host_url
}
template_data.merge!(extra_data) if extra_data.present?
email.update_attributes(
:mail_lang=> locale,
:create_user=> current_user,
:mail_sentdate=> mail_sentdate,
:module_app=> module_app,
:mail_to=>group_mail,
:mail_subject=>mail_subject,
:template=>'greeting_cards/email',
:template_data=> template_data,
:mail_reply_to => (manager_emails.empty? ? nil : manager_emails)
)
email
end
private
def create_greeting_card_status_history
if !@skip_callback && (changed? || @changed)
@new_history = GreetingCardStatusHistory.create(
greeting_card_record: self,
status: self.situation,
comment: @release_comment,
file: @release_file,
user: @user
)
else
@new_history = nil
end
end
end