2014-02-03 19:23:00 +00:00
|
|
|
# Copyright (C) 2012-2014 Zammad Foundation, http://zammad-foundation.org/
|
2013-06-12 15:59:58 +00:00
|
|
|
|
2012-04-10 14:06:46 +00:00
|
|
|
module Ticket::Number::Date
|
2013-06-12 15:59:58 +00:00
|
|
|
extend self
|
2012-04-10 14:06:46 +00:00
|
|
|
|
2013-08-15 22:16:38 +00:00
|
|
|
def generate
|
2012-11-27 23:01:33 +00:00
|
|
|
|
2012-04-10 14:06:46 +00:00
|
|
|
# get config
|
|
|
|
config = Setting.get('ticket_number_date')
|
2012-11-27 23:01:33 +00:00
|
|
|
|
2012-04-10 14:06:46 +00:00
|
|
|
t = Time.now
|
|
|
|
date = t.strftime("%Y-%m-%d")
|
|
|
|
|
|
|
|
# read counter
|
2012-11-27 23:01:33 +00:00
|
|
|
counter_increment = nil
|
|
|
|
Ticket::Counter.transaction do
|
|
|
|
counter = Ticket::Counter.where( :generator => 'Date' ).lock(true).first
|
|
|
|
if !counter
|
|
|
|
counter = Ticket::Counter.new( :generator => 'Date', :content => '0' )
|
|
|
|
end
|
2012-04-10 14:06:46 +00:00
|
|
|
|
2012-11-27 23:01:33 +00:00
|
|
|
# increase counter
|
|
|
|
counter_increment, date_file = counter.content.to_s.split(';')
|
|
|
|
if date_file == date
|
|
|
|
counter_increment = counter_increment.to_i + 1
|
|
|
|
else
|
|
|
|
counter_increment = 1
|
|
|
|
end
|
2012-04-10 14:06:46 +00:00
|
|
|
|
2012-11-27 23:01:33 +00:00
|
|
|
# store new counter value
|
|
|
|
counter.content = counter_increment.to_s + ';' + date
|
|
|
|
counter.save
|
|
|
|
end
|
2012-04-10 14:06:46 +00:00
|
|
|
|
|
|
|
system_id = Setting.get('system_id') || ''
|
2012-11-27 23:01:33 +00:00
|
|
|
number = t.strftime("%Y%m%d") + system_id.to_s + sprintf( "%04d", counter_increment)
|
|
|
|
|
2012-04-10 14:06:46 +00:00
|
|
|
# calculate a checksum
|
|
|
|
# The algorithm to calculate the checksum is derived from the one
|
|
|
|
# Deutsche Bundesbahn (german railway company) uses for calculation
|
|
|
|
# of the check digit of their vehikel numbering.
|
|
|
|
# The checksum is calculated by alternately multiplying the digits
|
|
|
|
# with 1 and 2 and adding the resulsts from left to right of the
|
|
|
|
# vehikel number. The modulus to 10 of this sum is substracted from
|
|
|
|
# 10. See: http://www.pruefziffernberechnung.de/F/Fahrzeugnummer.shtml
|
|
|
|
# (german)
|
|
|
|
if config[:checksum]
|
|
|
|
chksum = 0
|
|
|
|
mult = 1
|
|
|
|
(1..number.length).each do |i|
|
|
|
|
digit = number.to_s[i, 1]
|
|
|
|
chksum = chksum + ( mult * digit.to_i )
|
2012-11-27 23:01:33 +00:00
|
|
|
mult += 1
|
2012-04-10 14:06:46 +00:00
|
|
|
if mult == 3
|
2012-11-27 23:01:33 +00:00
|
|
|
mult = 1
|
2012-04-10 14:06:46 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
chksum %= 10
|
|
|
|
chksum = 10 - chksum
|
|
|
|
if chksum == 10
|
|
|
|
chksum = 1
|
|
|
|
end
|
|
|
|
number += chksum.to_s
|
|
|
|
end
|
|
|
|
return number
|
|
|
|
end
|
2013-08-15 22:16:38 +00:00
|
|
|
def check(string)
|
2012-04-10 14:06:46 +00:00
|
|
|
|
|
|
|
# get config
|
|
|
|
system_id = Setting.get('system_id') || ''
|
|
|
|
ticket_hook = Setting.get('ticket_hook')
|
|
|
|
ticket_hook_divider = Setting.get('ticket_hook_divider') || ''
|
|
|
|
ticket = nil
|
|
|
|
|
|
|
|
# probe format
|
|
|
|
if string =~ /#{ticket_hook}#{ticket_hook_divider}(#{system_id}\d{2,50})/i then
|
|
|
|
ticket = Ticket.where( :number => $1 ).first
|
|
|
|
elsif string =~ /#{ticket_hook}\s{0,2}(#{system_id}\d{2,50})/i then
|
|
|
|
ticket = Ticket.where( :number => $1 ).first
|
|
|
|
end
|
|
|
|
return ticket
|
|
|
|
end
|
2013-06-12 15:59:58 +00:00
|
|
|
end
|