Skip to content

Commit

Permalink
Fixes #3582 - Freshdesk import attribute ID mapping lookup constants …
Browse files Browse the repository at this point in the history
…fail application boot in systems with changed default names.
  • Loading branch information
mgruner authored and thorsteneckel committed Jun 1, 2021
1 parent 8d01fdd commit 18b8892
Show file tree
Hide file tree
Showing 3 changed files with 67 additions and 51 deletions.
48 changes: 27 additions & 21 deletions lib/sequencer/unit/import/freshdesk/conversation/mapping.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,27 +8,33 @@ class Mapping < Sequencer::Unit::Base

uses :resource, :id_map

SOURCE_MAP = {
0 => ::Ticket::Article::Type.select(:id).find_by(name: 'email').id, # Reply
1 => ::Ticket::Article::Type.select(:id).find_by(name: 'email').id, # Email
2 => ::Ticket::Article::Type.select(:id).find_by(name: 'web').id, # Note
3 => ::Ticket::Article::Type.select(:id).find_by(name: 'phone').id, # Phone
4 => ::Ticket::Article::Type.select(:id).find_by(name: 'note').id, # UNKNOWN!
5 => ::Ticket::Article::Type.select(:id).find_by(name: 'twitter status').id, # Created from tweets
6 => ::Ticket::Article::Type.select(:id).find_by(name: 'web').id, # Created from survey feedback
7 => ::Ticket::Article::Type.select(:id).find_by(name: 'facebook feed post').id, # Created from Facebook post
8 => ::Ticket::Article::Type.select(:id).find_by(name: 'email').id, # Created from Forwarded Email
9 => ::Ticket::Article::Type.select(:id).find_by(name: 'note').id, # Created from Phone
10 => ::Ticket::Article::Type.select(:id).find_by(name: 'note').id, # Created from Mobihelp
11 => ::Ticket::Article::Type.select(:id).find_by(name: 'note').id, # E-Commerce
}.freeze
# Since the imports rely on a fresh Zammad installation, we
# can require the default article types and senders to be present.
def source_map # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
@source_map ||= {
0 => ::Ticket::Article::Type.select(:id).find_by(name: 'email')&.id, # Reply
1 => ::Ticket::Article::Type.select(:id).find_by(name: 'email')&.id, # Email
2 => ::Ticket::Article::Type.select(:id).find_by(name: 'web')&.id, # Note
3 => ::Ticket::Article::Type.select(:id).find_by(name: 'phone')&.id, # Phone
4 => ::Ticket::Article::Type.select(:id).find_by(name: 'note')&.id, # UNKNOWN!
5 => ::Ticket::Article::Type.select(:id).find_by(name: 'twitter status')&.id, # Created from tweets
6 => ::Ticket::Article::Type.select(:id).find_by(name: 'web')&.id, # Created from survey feedback
7 => ::Ticket::Article::Type.select(:id).find_by(name: 'facebook feed post')&.id, # Created from Facebook post
8 => ::Ticket::Article::Type.select(:id).find_by(name: 'email')&.id, # Created from Forwarded Email
9 => ::Ticket::Article::Type.select(:id).find_by(name: 'note')&.id, # Created from Phone
10 => ::Ticket::Article::Type.select(:id).find_by(name: 'note')&.id, # Created from Mobihelp
11 => ::Ticket::Article::Type.select(:id).find_by(name: 'note')&.id, # E-Commerce
}.freeze
end

INCOMING_MAP = {
true => ::Ticket::Article::Sender.select(:id).find_by(name: 'Customer').id,
false => ::Ticket::Article::Sender.select(:id).find_by(name: 'Agent').id,
}.freeze
def incoming_map
@incoming_map ||= {
true => ::Ticket::Article::Sender.select(:id).find_by(name: 'Customer')&.id,
false => ::Ticket::Article::Sender.select(:id).find_by(name: 'Agent')&.id,
}.freeze
end

def process # rubocop:disable Metrics/AbcSize
def process # rubocop:disable Metrics/AbcSize
provide_mapped do
{
from: resource['from_email'],
Expand All @@ -41,8 +47,8 @@ def process # rubocop:disable Metrics/AbcSize
message_id: resource['id'],
updated_by_id: user_id,
created_by_id: user_id,
sender_id: INCOMING_MAP[ resource['incoming'] ],
type_id: SOURCE_MAP[ resource['source'] ],
sender_id: incoming_map[ resource['incoming'] ],
type_id: source_map[ resource['source'] ],
created_at: resource['created_at'],
updated_at: resource['updated_at'],
}
Expand Down
34 changes: 19 additions & 15 deletions lib/sequencer/unit/import/freshdesk/description/mapping.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,20 +8,24 @@ class Mapping < Sequencer::Unit::Base

uses :resource, :id_map

SOURCE_MAP = {
0 => ::Ticket::Article::Type.select(:id).find_by(name: 'email').id, # Reply
1 => ::Ticket::Article::Type.select(:id).find_by(name: 'email').id, # Email
2 => ::Ticket::Article::Type.select(:id).find_by(name: 'web').id, # Note
3 => ::Ticket::Article::Type.select(:id).find_by(name: 'phone').id, # Phone
4 => ::Ticket::Article::Type.select(:id).find_by(name: 'note').id, # UNKNOWN!
5 => ::Ticket::Article::Type.select(:id).find_by(name: 'twitter status').id, # Created from tweets
6 => ::Ticket::Article::Type.select(:id).find_by(name: 'web').id, # Created from survey feedback
7 => ::Ticket::Article::Type.select(:id).find_by(name: 'facebook feed post').id, # Created from Facebook post
8 => ::Ticket::Article::Type.select(:id).find_by(name: 'email').id, # Created from Forwarded Email
9 => ::Ticket::Article::Type.select(:id).find_by(name: 'note').id, # Created from Phone
10 => ::Ticket::Article::Type.select(:id).find_by(name: 'note').id, # Created from Mobihelp
11 => ::Ticket::Article::Type.select(:id).find_by(name: 'note').id, # E-Commerce
}.freeze
# Since the imports rely on a fresh Zammad installation, we
# can require the default article types to be present.
def source_map # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
@source_map ||= {
0 => ::Ticket::Article::Type.select(:id).find_by(name: 'email')&.id, # Reply
1 => ::Ticket::Article::Type.select(:id).find_by(name: 'email')&.id, # Email
2 => ::Ticket::Article::Type.select(:id).find_by(name: 'web')&.id, # Note
3 => ::Ticket::Article::Type.select(:id).find_by(name: 'phone')&.id, # Phone
4 => ::Ticket::Article::Type.select(:id).find_by(name: 'note')&.id, # UNKNOWN!
5 => ::Ticket::Article::Type.select(:id).find_by(name: 'twitter status')&.id, # Created from tweets
6 => ::Ticket::Article::Type.select(:id).find_by(name: 'web')&.id, # Created from survey feedback
7 => ::Ticket::Article::Type.select(:id).find_by(name: 'facebook feed post')&.id, # Created from Facebook post
8 => ::Ticket::Article::Type.select(:id).find_by(name: 'email')&.id, # Created from Forwarded Email
9 => ::Ticket::Article::Type.select(:id).find_by(name: 'note')&.id, # Created from Phone
10 => ::Ticket::Article::Type.select(:id).find_by(name: 'note')&.id, # Created from Mobihelp
11 => ::Ticket::Article::Type.select(:id).find_by(name: 'note')&.id, # E-Commerce
}.freeze
end

def process # rubocop:disable Metrics/AbcSize
provide_mapped do
Expand All @@ -35,7 +39,7 @@ def process # rubocop:disable Metrics/AbcSize
internal: false,
message_id: "ticketid#{resource['id']}@freshdesk.com",
sender_id: ::Ticket::Article::Sender.select(:id).find_by(name: 'Customer').id,
type_id: SOURCE_MAP[ resource['source'] ],
type_id: source_map[ resource['source'] ],
updated_by_id: requester_id,
created_by_id: requester_id,
created_at: resource['created_at'],
Expand Down
36 changes: 21 additions & 15 deletions lib/sequencer/unit/import/freshdesk/ticket/mapping.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,28 +8,34 @@ class Mapping < Sequencer::Unit::Base

uses :resource, :id_map

PRIORITY_MAP = {
1 => ::Ticket::Priority.find_by(name: '1 low').id, # low
2 => ::Ticket::Priority.find_by(name: '2 normal').id, # medium
3 => ::Ticket::Priority.find_by(name: '3 high').id, # high
4 => ::Ticket::Priority.find_by(name: '3 high').id, # urgent
}.freeze

STATE_MAP = {
2 => ::Ticket::State.find_by(name: 'open').id, # open
3 => ::Ticket::State.find_by(name: 'open').id, # pending
4 => ::Ticket::State.find_by(name: 'closed').id, # resolved
5 => ::Ticket::State.find_by(name: 'closed').id, # closed
}.freeze
# Since the imports rely on a fresh Zammad installation, we
# can require the default priority and state names to be present.
def priority_map
@priority_map ||= {
1 => ::Ticket::Priority.find_by(name: '1 low')&.id, # low
2 => ::Ticket::Priority.find_by(name: '2 normal')&.id, # medium
3 => ::Ticket::Priority.find_by(name: '3 high')&.id, # high
4 => ::Ticket::Priority.find_by(name: '3 high')&.id, # urgent
}.freeze
end

def state_map
@state_map ||= {
2 => ::Ticket::State.find_by(name: 'open')&.id, # open
3 => ::Ticket::State.find_by(name: 'open')&.id, # pending
4 => ::Ticket::State.find_by(name: 'closed')&.id, # resolved
5 => ::Ticket::State.find_by(name: 'closed')&.id, # closed
}.freeze
end

def process # rubocop:disable Metrics/AbcSize
provide_mapped do
{
title: resource['subject'],
number: resource['id'],
group_id: group_id,
priority_id: PRIORITY_MAP[resource['priority']],
state_id: STATE_MAP[resource['status']],
priority_id: priority_map[resource['priority']],
state_id: state_map[resource['status']],
owner_id: owner_id,
customer_id: customer_id,
created_at: resource['created_at'],
Expand Down

0 comments on commit 18b8892

Please sign in to comment.