From 0b2ea19ebc19057e686276e9b67c690b8674ccf0 Mon Sep 17 00:00:00 2001 From: Darren Clarke Date: Fri, 19 Dec 2025 12:38:49 +0100 Subject: [PATCH] Add Signal group ticket split compatibility --- .../models/link/setup_split_signal_group.rb | 49 +++++++++++++++++++ .../src/config/initializers/cdr_signal.rb | 8 ++- 2 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 packages/zammad-addon-bridge/src/app/models/link/setup_split_signal_group.rb diff --git a/packages/zammad-addon-bridge/src/app/models/link/setup_split_signal_group.rb b/packages/zammad-addon-bridge/src/app/models/link/setup_split_signal_group.rb new file mode 100644 index 0000000..df07bba --- /dev/null +++ b/packages/zammad-addon-bridge/src/app/models/link/setup_split_signal_group.rb @@ -0,0 +1,49 @@ +# frozen_string_literal: true + +module Link::SetupSplitSignalGroup + extend ActiveSupport::Concern + + included do + after_create :setup_signal_group_for_split_ticket + end + + private + + def setup_signal_group_for_split_ticket + # Only if auto-groups enabled + return unless ENV['BRIDGE_SIGNAL_AUTO_GROUPS'].to_s.downcase == 'true' + + # Only child links (splits create child->parent links) + return unless link_type_id == Link::Type.find_by(name: 'child')&.id + + # Only Ticket-to-Ticket links + ticket_object_id = Link::Object.find_by(name: 'Ticket')&.id + return unless link_object_source_id == ticket_object_id + return unless link_object_target_id == ticket_object_id + + child_ticket = Ticket.find_by(id: link_object_source_value) + parent_ticket = Ticket.find_by(id: link_object_target_value) + return unless child_ticket && parent_ticket + + # Only if parent has Signal group (chat_id starts with "group.") + parent_signal_prefs = parent_ticket.preferences&.dig('cdr_signal') + return unless parent_signal_prefs.present? + return unless parent_signal_prefs['chat_id']&.start_with?('group.') + + original_recipient = parent_signal_prefs['original_recipient'] + return unless original_recipient.present? + + # Set up child for lazy group creation: + # chat_id = phone number triggers new group on first message + child_ticket.preferences ||= {} + child_ticket.preferences['channel_id'] = parent_ticket.preferences['channel_id'] + child_ticket.preferences['cdr_signal'] = { + 'bot_token' => parent_signal_prefs['bot_token'], + 'chat_id' => original_recipient, # Phone number, NOT group ID + 'original_recipient' => original_recipient + } + child_ticket.save! + + Rails.logger.info "Signal split: Ticket ##{child_ticket.number} set up for new group (recipient: #{original_recipient})" + end +end diff --git a/packages/zammad-addon-bridge/src/config/initializers/cdr_signal.rb b/packages/zammad-addon-bridge/src/config/initializers/cdr_signal.rb index f00feca..c56d0ee 100644 --- a/packages/zammad-addon-bridge/src/config/initializers/cdr_signal.rb +++ b/packages/zammad-addon-bridge/src/config/initializers/cdr_signal.rb @@ -1,10 +1,15 @@ # frozen_string_literal: true -Rails.application.config.after_initialize do +Rails.application.config.after_initialize do class Ticket::Article include Ticket::Article::EnqueueCommunicateCdrSignalJob end + # Handle Signal group setup for split tickets + class Link + include Link::SetupSplitSignalGroup + end + icon = File.read('public/assets/images/icons/cdr_signal.svg') doc = File.open('public/assets/images/icons.svg') { |f| Nokogiri::XML(f) } if !doc.at_css('#icon-cdr-signal') @@ -15,4 +20,3 @@ Rails.application.config.after_initialize do end File.write('public/assets/images/icons.svg', doc.to_xml) end - \ No newline at end of file