Fixed issue #377 - Reply to merged ticket gets appended to the wrong ticket.
This commit is contained in:
parent
c82622913a
commit
0bd0693de9
5 changed files with 134 additions and 5 deletions
|
@ -504,11 +504,6 @@ returns
|
||||||
state = Ticket::State.find(ticket.state_id)
|
state = Ticket::State.find(ticket.state_id)
|
||||||
state_type = Ticket::StateType.find(state.state_type_id)
|
state_type = Ticket::StateType.find(state.state_type_id)
|
||||||
|
|
||||||
# if tickte is merged, find linked ticket
|
|
||||||
if state_type.name == 'merged'
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
# set ticket to open again or keep create state
|
# set ticket to open again or keep create state
|
||||||
if !mail['x-zammad-ticket-followup-state'.to_sym] && !mail['x-zammad-ticket-followup-state_id'.to_sym]
|
if !mail['x-zammad-ticket-followup-state'.to_sym] && !mail['x-zammad-ticket-followup-state_id'.to_sym]
|
||||||
new_state = Ticket::State.find_by(default_create: true)
|
new_state = Ticket::State.find_by(default_create: true)
|
||||||
|
|
43
app/models/channel/filter/follow_up_merged.rb
Normal file
43
app/models/channel/filter/follow_up_merged.rb
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
# Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
|
||||||
|
|
||||||
|
module Channel::Filter::FollowUpMerged
|
||||||
|
|
||||||
|
def self.run(_channel, mail)
|
||||||
|
return if mail[:'x-zammad-ticket-id'].blank?
|
||||||
|
|
||||||
|
# get ticket# from subject
|
||||||
|
ticket = Ticket.find(mail[:'x-zammad-ticket-id'])
|
||||||
|
return if ticket.blank?
|
||||||
|
|
||||||
|
ticket = find_merge_follow_up_ticket(ticket)
|
||||||
|
return if ticket.blank?
|
||||||
|
|
||||||
|
mail[:'x-zammad-ticket-id'] = ticket.id
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.find_merge_follow_up_ticket(ticket)
|
||||||
|
return if ticket.state.name != 'merged'
|
||||||
|
|
||||||
|
links = Link.list(
|
||||||
|
link_object: 'Ticket',
|
||||||
|
link_object_value: ticket.id
|
||||||
|
)
|
||||||
|
return if links.blank?
|
||||||
|
|
||||||
|
merge_ticket = nil
|
||||||
|
links.each { |link|
|
||||||
|
next if link['link_type'] != 'parent'
|
||||||
|
next if link['link_object'] != 'Ticket'
|
||||||
|
|
||||||
|
check_ticket = Ticket.find(link['link_object_value'])
|
||||||
|
|
||||||
|
next if check_ticket.blank?
|
||||||
|
next if check_ticket.state.name == 'merged'
|
||||||
|
|
||||||
|
merge_ticket = check_ticket
|
||||||
|
|
||||||
|
break
|
||||||
|
}
|
||||||
|
merge_ticket
|
||||||
|
end
|
||||||
|
end
|
17
db/migrate/20170504144100_follow_up_merged.rb
Normal file
17
db/migrate/20170504144100_follow_up_merged.rb
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
class FollowUpMerged < ActiveRecord::Migration
|
||||||
|
def up
|
||||||
|
|
||||||
|
# return if it's a new setup
|
||||||
|
return if !Setting.find_by(name: 'system_init_done')
|
||||||
|
|
||||||
|
Setting.create_if_not_exists(
|
||||||
|
title: 'Defines postmaster filter.',
|
||||||
|
name: '0110_postmaster_filter_follow_up_merged',
|
||||||
|
area: 'Postmaster::PreFilter',
|
||||||
|
description: 'Defines postmaster filter to identify follow-up ticket for merged tickets.',
|
||||||
|
options: {},
|
||||||
|
state: 'Channel::Filter::FollowUpMerged',
|
||||||
|
frontend: false
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
|
@ -2271,6 +2271,15 @@ Setting.create_if_not_exists(
|
||||||
state: 'Channel::Filter::FollowUpCheck',
|
state: 'Channel::Filter::FollowUpCheck',
|
||||||
frontend: false
|
frontend: false
|
||||||
)
|
)
|
||||||
|
Setting.create_if_not_exists(
|
||||||
|
title: 'Defines postmaster filter.',
|
||||||
|
name: '0110_postmaster_filter_follow_up_merged',
|
||||||
|
area: 'Postmaster::PreFilter',
|
||||||
|
description: 'Defines postmaster filter to identify follow-up ticket for merged tickets.',
|
||||||
|
options: {},
|
||||||
|
state: 'Channel::Filter::FollowUpMerged',
|
||||||
|
frontend: false
|
||||||
|
)
|
||||||
Setting.create_if_not_exists(
|
Setting.create_if_not_exists(
|
||||||
title: 'Defines postmaster filter.',
|
title: 'Defines postmaster filter.',
|
||||||
name: '0200_postmaster_filter_follow_up_possible_check',
|
name: '0200_postmaster_filter_follow_up_possible_check',
|
||||||
|
|
65
spec/models/channel/filter/follow_up_merged_spec.rb
Normal file
65
spec/models/channel/filter/follow_up_merged_spec.rb
Normal file
|
@ -0,0 +1,65 @@
|
||||||
|
require 'rails_helper'
|
||||||
|
|
||||||
|
RSpec.describe Channel::Filter::FollowUpMerged do
|
||||||
|
|
||||||
|
describe '#find_merge_follow_up_ticket' do
|
||||||
|
|
||||||
|
it 'finds the follow up ticket for merged tickets' do
|
||||||
|
ticket1 = create(:ticket)
|
||||||
|
ticket2 = create(:ticket)
|
||||||
|
ticket3 = create(:ticket)
|
||||||
|
ticket4 = create(:ticket)
|
||||||
|
ticket5 = create(:ticket)
|
||||||
|
|
||||||
|
ticket1.merge_to( ticket_id: ticket2.id, user_id: 1 )
|
||||||
|
ticket2.merge_to( ticket_id: ticket3.id, user_id: 1 )
|
||||||
|
ticket3.merge_to( ticket_id: ticket4.id, user_id: 1 )
|
||||||
|
ticket4.merge_to( ticket_id: ticket5.id, user_id: 1 )
|
||||||
|
|
||||||
|
ticket = Channel::Filter::FollowUpMerged.find_merge_follow_up_ticket(ticket1)
|
||||||
|
expect(ticket.id).to eq(ticket5.id)
|
||||||
|
|
||||||
|
follow_up_raw = "From: me@example.com
|
||||||
|
To: customer@example.com
|
||||||
|
Subject: #{ticket1.subject_build('some new subject')}
|
||||||
|
|
||||||
|
blub follow up"
|
||||||
|
ticket_p, article_p, user_p = Channel::EmailParser.new.process({}, follow_up_raw)
|
||||||
|
expect(ticket_p.id).to eq(ticket5.id)
|
||||||
|
|
||||||
|
follow_up_raw = "From: me@example.com
|
||||||
|
To: customer@example.com
|
||||||
|
Subject: #{ticket2.subject_build('some new subject')}
|
||||||
|
|
||||||
|
blub follow up"
|
||||||
|
ticket_p, article_p, user_p = Channel::EmailParser.new.process({}, follow_up_raw)
|
||||||
|
expect(ticket_p.id).to eq(ticket5.id)
|
||||||
|
|
||||||
|
follow_up_raw = "From: me@example.com
|
||||||
|
To: customer@example.com
|
||||||
|
Subject: #{ticket3.subject_build('some new subject')}
|
||||||
|
|
||||||
|
blub follow up"
|
||||||
|
ticket_p, article_p, user_p = Channel::EmailParser.new.process({}, follow_up_raw)
|
||||||
|
expect(ticket_p.id).to eq(ticket5.id)
|
||||||
|
|
||||||
|
follow_up_raw = "From: me@example.com
|
||||||
|
To: customer@example.com
|
||||||
|
Subject: #{ticket4.subject_build('some new subject')}
|
||||||
|
|
||||||
|
blub follow up"
|
||||||
|
ticket_p, article_p, user_p = Channel::EmailParser.new.process({}, follow_up_raw)
|
||||||
|
expect(ticket_p.id).to eq(ticket5.id)
|
||||||
|
|
||||||
|
follow_up_raw = "From: me@example.com
|
||||||
|
To: customer@example.com
|
||||||
|
Subject: #{ticket5.subject_build('some new subject')}
|
||||||
|
|
||||||
|
blub follow up"
|
||||||
|
ticket_p, article_p, user_p = Channel::EmailParser.new.process({}, follow_up_raw)
|
||||||
|
expect(ticket_p.id).to eq(ticket5.id)
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
Loading…
Reference in a new issue