From bf86afb056e1b9f8a7263c019e2d82fe4615b3a9 Mon Sep 17 00:00:00 2001 From: Thorsten Eckel Date: Thu, 21 May 2015 16:40:04 +0200 Subject: [PATCH] Implemented Ticket.process_pending. --- app/models/ticket.rb | 46 +++++++++++++++++++ .../20150521134926_process_pending_tickets.rb | 27 +++++++++++ test/unit/ticket_test.rb | 24 ++++++++++ 3 files changed, 97 insertions(+) create mode 100644 db/migrate/20150521134926_process_pending_tickets.rb diff --git a/app/models/ticket.rb b/app/models/ticket.rb index 471b234ec..1929107ed 100644 --- a/app/models/ticket.rb +++ b/app/models/ticket.rb @@ -111,6 +111,52 @@ returns =begin +processes tickets which have reached their pending time and sets next state_id + + processed_tickets = Ticket.process_pending() + +returns + + processed_tickets = [, ...] + +=end + + def self.process_pending + + ticket_states = Ticket::State.where( + state_type_id: Ticket::StateType.find_by( name: 'pending action' ), + ) + .where.not(next_state_id: nil) # rubocop:disable Style/MultilineOperationIndentation + + return [] if !ticket_states + + next_state_map = {} + ticket_states.each { |state| + next_state_map[state.id] = state.next_state_id + } + + tickets = where( + state_id: next_state_map.keys, + ) + .where( 'pending_time <= ?', Time.zone.now ) # rubocop:disable Style/MultilineOperationIndentation + + return [] if !tickets + + result = [] + tickets.each { |ticket| + ticket.state_id = next_state_map[ticket.state_id] + ticket.updated_at = Time.zone.now + ticket.updated_by_id = 1 + ticket.save! + + result.push ticket + } + + result + end + +=begin + merge tickets ticket = Ticket.find(123) diff --git a/db/migrate/20150521134926_process_pending_tickets.rb b/db/migrate/20150521134926_process_pending_tickets.rb new file mode 100644 index 000000000..7b10ee2d0 --- /dev/null +++ b/db/migrate/20150521134926_process_pending_tickets.rb @@ -0,0 +1,27 @@ +require 'scheduler' +require 'ticket/state' +class ProcessPendingTickets < ActiveRecord::Migration + def up + + # fix wrong next_state_id for state 'pending close' + pending_close_state = Ticket::State.find_by( + name: 'pending close', + ) + closed_state = Ticket::State.find_by( + name: 'closed', + ) + pending_close_state.next_state_id = closed_state.id + pending_close_state.save! + + # add Ticket.process_pending + Scheduler.create_or_update( + name: 'Process pending tickets', + method: 'Ticket.process_pending', + period: 60 * 15, + prio: 1, + active: true, + updated_by_id: 1, + created_by_id: 1, + ) + end +end diff --git a/test/unit/ticket_test.rb b/test/unit/ticket_test.rb index bf4d8e490..63077beeb 100644 --- a/test/unit/ticket_test.rb +++ b/test/unit/ticket_test.rb @@ -161,4 +161,28 @@ class TicketTest < ActiveSupport::TestCase assert_equal( Ticket.latest_change.to_s, ticket2.updated_at.to_s ) end + + test 'ticket process_pending' do + + ticket = Ticket.create( + title: "pending close test", + group: Group.lookup( name: 'Users'), + customer_id: 2, + state: Ticket::State.lookup( name: 'pending close' ), + pending_time: Time.zone.now - 60, + priority: Ticket::Priority.lookup( name: '2 normal' ), + updated_by_id: 1, + created_by_id: 1, + ) + + lookup_ticket = Ticket.find_by( 'pending_time <= ?', Time.zone.now ) + + assert_equal( lookup_ticket.id, ticket.id, 'ticket.pending_time verify' ) + + Ticket.process_pending() + + lookup_ticket = Ticket.find_by( 'pending_time <= ?', Time.zone.now ) + + assert_nil( lookup_ticket, 'ticket.pending_time processed verify' ) + end end