donate/app/models/nkuht_donate_main.rb

194 lines
5.2 KiB
Ruby
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

class NkuhtDonateMain
include Mongoid::Document
include Mongoid::Timestamps
include OrbitModel::Impression
# encoding: utf-8
field :name
field :donors_service_unit
field :tel
field :email
field :donation_way, :default => 1
field :cheque_number
field :donation_amount
field :donation_use_other
field :is_alumni, :type => Boolean, :default => true
field :graduation_year
field :has_receipt, :type => Boolean, :default => true
field :receipt_title, :default => 1
field :receipt_title_other
field :receipt_number
field :receipt_address, :default => 1
field :receipt_address_other
field :donate_public, :type => Boolean, :default => true
field :note
field :create_user_id
field :update_user_id
field :donation_serial_date, :type => String, :default => Date.current #新增日
field :donation_serial_time, :type => String, :default => Time.current #新增日時分
field :donation_serial_number #流水號
field :donation_payment_number #銷帳編號 & 訂單編號
field :donation_payment_status, :type => Boolean, :default => false #付款狀態
field :donation_payment_status_msg #付款失敗訊息代碼
field :donation_write_off_status, :type => Boolean, :default => false #銷帳狀態
belongs_to :nkuht_donate_unit
belongs_to :nkuht_donate_department
belongs_to :nkuht_donate_use
validates_numericality_of :donation_amount, :only_integer => true
#10335+年月日(8)+流水號(1~999)
def self.get_payment_number
@number = '10335' + Date.current.strftime("%Y%m%d") + get_serial_number
end
def self.get_serial_number
number = "%03d" % ( NkuhtDonateMain.where(:donation_serial_date=>Date.current).count + 1 )
# return number.rjust(3, '0')
end
def get_atm_mac_number
#年月日時分秒流水號4碼 == 傳送序號
#傳送序號+特店代碼+訂單編號+銷帳編號+金額
sendseqno = self.donation_serial_time.to_datetime.strftime("%Y%m%d%H%M%S") + "%04d" % (self.donation_serial_number)
message = Digest::SHA1.hexdigest("#{sendseqno}T00774955421#{self.donation_payment_number}#{self.donation_payment_number}#{self.donation_amount}")
key = 'S8G46IY64UHZZBSKGZFI6D7E'
iv = '00000000'
message = [message+iv].pack('H*')
# Encrypt plaintext using Triple DES
cipher = OpenSSL::Cipher::Cipher.new("des-ede3-cbc")
cipher.padding = 0
cipher.key = key
cipher.iv = iv
cipher.encrypt # Call this before setting key or iv
ciphertext = cipher.update(message)
# ciphertext << cipher.final
# Base64-encode the ciphertext
encodedCipherText = Base64.strict_encode64(ciphertext)
# encodedCipherText = Base64.strict_encode64(ciphertext)
return encodedCipherText
end
def get_market_number
#A:1, B:2, C:3, D:4, E:5, F:6, G:7, H:8, I:9
# 第一段(9碼) 繳費期限yymmdd (6碼) + 代收項目6HC (3碼)
@date = self.donation_serial_date.to_date + 14 #到期日
@pdate = (@date.strftime("%Y").to_i - 1911 ).to_s[-2..-1] + @date.strftime("%m%d")
@ckno1 = @pdate + '683'
@no1 = @pdate + '6HC'
# 第二段(16碼) 交易序號由業者自行訂定(前5碼銀行編 貴校為10335,且16碼必須全為數字)
@no2 = self.donation_payment_number
# 第三段(15碼) 應繳日期 mmdd (4碼) + 檢碼(2碼) + 應繳金額(9碼)
@ckno3 = @pdate[-4..-1].to_s + ("%09d" % self.donation_amount)
@key1 = NkuhtDonateMain.get_market_number_key1(@ckno1, @no2, @ckno3)
@key2 = NkuhtDonateMain.get_market_number_key2(@ckno1, @no2, @ckno3)
@no3 = @pdate[-4..-1].to_s + @key1 + @key2 + ("%09d" % self.donation_amount)
return [@no1,@no2,@no3]
end
def self.get_market_number_key1(code1,code2,code3)
@n1 = []
(0..8).each{|a| @n1 << code1[a].to_i if a % 2 == 0 }
@n2 = []
(0..15).each{|a| @n2 << code2[a].to_i if a % 2 == 0 }
@n3 = []
(0..12).each{|a| @n3 << code3[a].to_i if a % 2 == 0 }
@key1 = (( @n1.sum + @n2.sum + @n3.sum ) % 11).to_s
if @key1 == '0'
return 'A'
elsif @key1 == '10'
return 'B'
else
return @key1
end
end
def self.get_market_number_key2(code1,code2,code3)
@n1 = []
(0..8).each{|a| @n1 << code1[a].to_i if a % 2 != 0 }
@n2 = []
(0..15).each{|a| @n2 << code2[a].to_i if a % 2 != 0 }
@n3 = []
(0..12).each{|a| @n3 << code3[a].to_i if a % 2 != 0 }
@key2 = (( @n1.sum + @n2.sum + @n3.sum ) % 11).to_s
if @key2 == '0'
return 'X'
elsif @key2 == '10'
return 'Y'
else
return @key2
end
end
# 轉大寫數字
def self.change_cash( cash )
cNum = ["","","","","","","","","","","-","-","","","","","","","","","","","","",""]
i = 0
sNum = ""
sTemp = ""
result = ""
tmp = cash.to_i
return '零' if tmp == 0
raise '整數部分加二位小數長度不能大於15' if tmp.to_s.size > 15
sNum = tmp.to_s.rjust(15, ' ')
for i in 0..14
stemp = sNum.slice(i, 1)
if stemp == ' '
next
else
result += " " + cNum[stemp.to_i] + " " + cNum[i + 10]
end
end
return result
end
end