From 20ef676cf1614053bc7a2eee6b0429a0979c3935 Mon Sep 17 00:00:00 2001 From: Darren Clarke Date: Fri, 25 Jul 2025 22:39:07 +0200 Subject: [PATCH] Fix incoming Signal messages when conversation initiated from Zammad --- docker/compose/bridge.yml | 12 ++++++------ docker/compose/zammad.yml | 1 + .../controllers/channels_cdr_signal_controller.rb | 12 +++++++++--- .../src/app/jobs/communicate_cdr_signal_job.rb | 3 ++- .../src/config/routes/channel_cdr_signal.rb | 1 + packages/zammad-addon-bridge/src/lib/cdr_signal.rb | 9 ++++++++- 6 files changed, 27 insertions(+), 11 deletions(-) diff --git a/docker/compose/bridge.yml b/docker/compose/bridge.yml index e76ae96..c8ae8f5 100644 --- a/docker/compose/bridge.yml +++ b/docker/compose/bridge.yml @@ -9,12 +9,12 @@ x-bridge-vars: &common-bridge-variables DATABASE_ROOT_PASSWORD: ${BRIDGE_DATABASE_ROOT_PASSWORD} DATABASE_OWNER: ${DATABASE_USER} DATABASE_PASSWORD: ${DATABASE_PASSWORD} - DATABASE_URL: "postgresql://bridge:${DATABASE_PASSWORD}@postgresql/cdr" - WORKER_DATABASE_URL: "postgresql://bridge:${DATABASE_PASSWORD}@postgresql/cdr" - SHADOW_DATABASE_URL: "postgresql://bridge:${DATABASE_PASSWORD}@postgresql/cdr_shadow" - ROOT_DATABASE_URL: "postgresql://bridge:${DATABASE_PASSWORD}@postgresql/template1" - APP_ROOT_DATABASE_URL: "postgresql://root:${BRIDGE_DATABASE_ROOT_PASSWORD}@postgresql/bridge" - DATABASE_AUTH_URL: "postgresql://app_graphile_auth:${BRIDGE_DATABASE_AUTHENTICATOR_PASSWORD}@postgresql/cdr" + DATABASE_URL: "postgresql://${DATABASE_USER}:${DATABASE_PASSWORD}@postgresql/cdr" + WORKER_DATABASE_URL: "postgresql://${DATABASE_USER}:${DATABASE_PASSWORD}@postgresql/cdr" + SHADOW_DATABASE_URL: "postgresql://${DATABASE_USER}:${DATABASE_PASSWORD}@postgresql/cdr_shadow" + ROOT_DATABASE_URL: "postgresql://${DATABASE_USER}:${DATABASE_PASSWORD}@postgresql/template1" + APP_ROOT_DATABASE_URL: "postgresql://zammad:${ZAMMAD_DATABASE_PASSWORD}@postgresql/zammad_production" + DATABASE_AUTH_URL: "postgresql://${DATABASE_USER}:${DATABASE_PASSWORD}@postgresql/cdr" FRONTEND_URL: ${BRIDGE_DOMAIN} API_URL: "http://bridge-api:3001" NEXTAUTH_URL: ${BRIDGE_DOMAIN} diff --git a/docker/compose/zammad.yml b/docker/compose/zammad.yml index 73bae17..ed270e1 100644 --- a/docker/compose/zammad.yml +++ b/docker/compose/zammad.yml @@ -14,6 +14,7 @@ x-zammad-vars: &common-zammad-variables ELASTICSEARCH_PASS: ${OPENSEARCH_ADMIN_PASSWORD} ELASTICSEARCH_SSL_VERIFY: "false" # this doesn't set es_ssl_verify as expected, but ideally it would ELASTICSEARCH_SCHEMA: "https" + BRIDGE_SIGNAL_AUTO_GROUPS: ${BRIDGE_SIGNAL_AUTO_GROUPS} x-zammad-args: &common-zammad-args EMBEDDED: "true" diff --git a/packages/zammad-addon-bridge/src/app/controllers/channels_cdr_signal_controller.rb b/packages/zammad-addon-bridge/src/app/controllers/channels_cdr_signal_controller.rb index aa822a6..d8c9f23 100644 --- a/packages/zammad-addon-bridge/src/app/controllers/channels_cdr_signal_controller.rb +++ b/packages/zammad-addon-bridge/src/app/controllers/channels_cdr_signal_controller.rb @@ -213,11 +213,12 @@ class ChannelsCdrSignalController < ApplicationController Rails.logger.info "Channel ID: #{channel.id}" begin - all_tickets = Ticket.where(customer_id: customer.id) - .where.not(state_id: state_ids) + # For group messages, search all tickets regardless of customer + # since users may have duplicate phone numbers + all_tickets = Ticket.where.not(state_id: state_ids) .order(updated_at: :desc) - Rails.logger.info "Found #{all_tickets.count} active tickets for customer" + Rails.logger.info "Found #{all_tickets.count} active tickets (searching all customers for group match)" ticket = all_tickets.find do |t| begin @@ -247,6 +248,11 @@ class ChannelsCdrSignalController < ApplicationController if ticket Rails.logger.info "=== FOUND MATCHING TICKET BY GROUP ID: ##{ticket.number} ===" + # Update customer if different (handles duplicate phone numbers) + if ticket.customer_id != customer.id + Rails.logger.info "Updating ticket customer from #{ticket.customer_id} to #{customer.id}" + ticket.customer_id = customer.id + end else Rails.logger.info "=== NO MATCHING TICKET BY GROUP ID - CHECKING BY PHONE NUMBER ===" end diff --git a/packages/zammad-addon-bridge/src/app/jobs/communicate_cdr_signal_job.rb b/packages/zammad-addon-bridge/src/app/jobs/communicate_cdr_signal_job.rb index b2dbc78..bacd982 100644 --- a/packages/zammad-addon-bridge/src/app/jobs/communicate_cdr_signal_job.rb +++ b/packages/zammad-addon-bridge/src/app/jobs/communicate_cdr_signal_job.rb @@ -25,7 +25,8 @@ class CommunicateCdrSignalJob < ApplicationJob log_error(article, "Can't find ticket.preferences['cdr_signal']['bot_token'] for Ticket.find(#{article.ticket_id})") end - unless ticket.preferences['cdr_signal']['chat_id'] + # Only require chat_id if auto-groups is not enabled + if ENV['BRIDGE_SIGNAL_AUTO_GROUPS'].to_s.downcase != 'true' && ticket.preferences['cdr_signal']['chat_id'].blank? log_error(article, "Can't find ticket.preferences['cdr_signal']['chat_id'] for Ticket.find(#{article.ticket_id})") end diff --git a/packages/zammad-addon-bridge/src/config/routes/channel_cdr_signal.rb b/packages/zammad-addon-bridge/src/config/routes/channel_cdr_signal.rb index 8de4b97..b7df05b 100644 --- a/packages/zammad-addon-bridge/src/config/routes/channel_cdr_signal.rb +++ b/packages/zammad-addon-bridge/src/config/routes/channel_cdr_signal.rb @@ -7,6 +7,7 @@ Zammad::Application.routes.draw do match "#{api_path}/channels_cdr_signal", to: 'channels_cdr_signal#add', via: :post match "#{api_path}/channels_cdr_signal/:id", to: 'channels_cdr_signal#update', via: :put match "#{api_path}/channels_cdr_signal_webhook/:token", to: 'channels_cdr_signal#webhook', via: :post + match "#{api_path}/channels_cdr_signal_webhook/:token/update_group", to: 'channels_cdr_signal#update_group', via: :post match "#{api_path}/channels_cdr_signal_disable", to: 'channels_cdr_signal#disable', via: :post match "#{api_path}/channels_cdr_signal_enable", to: 'channels_cdr_signal#enable', via: :post match "#{api_path}/channels_cdr_signal", to: 'channels_cdr_signal#destroy', via: :delete diff --git a/packages/zammad-addon-bridge/src/lib/cdr_signal.rb b/packages/zammad-addon-bridge/src/lib/cdr_signal.rb index 5c910a3..c6f011f 100644 --- a/packages/zammad-addon-bridge/src/lib/cdr_signal.rb +++ b/packages/zammad-addon-bridge/src/lib/cdr_signal.rb @@ -319,7 +319,14 @@ class CdrSignal raise "No ticket found for article #{article.id}" unless ticket recipient = ticket.preferences.dig('cdr_signal', 'chat_id') - raise "No Signal chat_id found in ticket preferences" unless recipient + + # If auto-groups is enabled and no chat_id, use original_recipient + if recipient.blank? && ENV['BRIDGE_SIGNAL_AUTO_GROUPS'].to_s.downcase == 'true' + recipient = ticket.preferences.dig('cdr_signal', 'original_recipient') + raise "No Signal chat_id or original_recipient found in ticket preferences" unless recipient + elsif recipient.blank? + raise "No Signal chat_id found in ticket preferences" + end Rails.logger.debug { "Sending to recipient: '#{recipient}'" }