donate/app/models/nkuht_donate_main.rb

194 lines
5.2 KiB
Ruby
Raw Normal View History

2015-01-30 07:02:08 +00:00
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