# 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