1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- # Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
- module Ticket::Number::Date
- extend Ticket::Number::Base
- def self.generate
- date = Time.zone.now.strftime('%F')
- counter = Ticket::Counter.create_with(content: '0')
- .find_or_create_by(generator: 'Date')
- counter.with_lock do
- counter_increment = if counter.content.end_with?(date)
- counter.content.split(';').first.to_i.next
- else
- 1
- end
- counter.update(content: "#{counter_increment};#{date}")
- end
- number = date.delete('-') + Setting.get('system_id').to_s + format('%<counter>04d', counter: counter.content.split(';').first)
- number += checksum(number) if config[:checksum]
- number
- end
- def self.check(string)
- return if string.blank?
- # get config
- system_id = Setting.get('system_id') || ''
- ticket_hook = Setting.get('ticket_hook')
- ticket_hook_divider = Setting.get('ticket_hook_divider') || ''
- ticket = nil
- if Setting.get('ticket_number_ignore_system_id') == true
- system_id = ''
- end
- # probe format
- # NOTE: we use `(?<=\W|^)` at the start of the regular expressions below
- # because `\b` fails when ticket_hook begins with a non-word character (like '#')
- string.scan(%r{(?<=\W|^)#{Regexp.quote(ticket_hook)}#{Regexp.quote(ticket_hook_divider)}(\d{4,10}#{system_id}\d{2,40})\b}i) do
- ticket = Ticket.find_by(number: $1)
- break if ticket
- end
- if !ticket
- string.scan(%r{(?<=\W|^)#{Regexp.quote(ticket_hook)}\s{0,2}(\d{4,10}#{system_id}\d{2,40})\b}i) do
- ticket = Ticket.find_by(number: $1)
- break if ticket
- end
- end
- ticket
- end
- def self.config
- config = Setting.get('ticket_number_date')
- return config if !config.in?([true, false])
- # fix for https://github.com/zammad/zammad/issues/413 - can be removed later
- { checksum: config }
- end
- private_class_method :config
- end
|