1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- # Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
- class Sequencer::Unit::Import::Freshdesk::Conversation::Mapping < Sequencer::Unit::Base
- include ::Sequencer::Unit::Import::Common::Mapping::Mixin::ProvideMapped
- uses :resource, :id_map
- # 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
- 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
- provide_mapped do
- {
- from: resource['from_email'],
- to: resource['to_emails']&.join(', '),
- cc: resource['cc_emails']&.join(', '),
- ticket_id: ticket_id,
- body: resource['body'],
- content_type: 'text/html',
- internal: resource['private'].present?,
- 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'] ] || default_type_id,
- created_at: resource['created_at'],
- updated_at: resource['updated_at'],
- }
- end
- end
- private
- def ticket_id
- id_map['Ticket'][resource['ticket_id']]
- end
- def user_id
- id_map['User'][resource['user_id']] || 1
- end
- def default_type_id
- @default_type_id ||= ::Ticket::Article::Type.select(:id).find_by(name: 'note')&.id
- end
- end
|