From ea8ff830343e48e301e06954c5f995c692f64c6f Mon Sep 17 00:00:00 2001 From: Rodribm10 Date: Tue, 14 Apr 2026 20:09:20 -0300 Subject: [PATCH] feat: Captain::PixCharge posta nota interna quando PIX eh gerado Antes so existiam 2 notas automaticas: 1. 'Nova reserva criada' (from Captain::Reservation after_create_commit) 2. 'Pagamento confirmado' (from Captain::Payments::ConfirmationService) Adiciona uma terceira entre elas: 'PIX enviado, aguardando pagamento' (from Captain::PixCharge after_create_commit). A atendente ve no timeline: reserva -> pix enviado -> pix pago. --- enterprise/app/models/captain/pix_charge.rb | 29 +++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/enterprise/app/models/captain/pix_charge.rb b/enterprise/app/models/captain/pix_charge.rb index 210633324..f6960e16b 100644 --- a/enterprise/app/models/captain/pix_charge.rb +++ b/enterprise/app/models/captain/pix_charge.rb @@ -41,6 +41,8 @@ class Captain::PixCharge < ApplicationRecord validates :txid, presence: true, uniqueness: true validates :unit_id, presence: true + after_create_commit :post_internal_pix_sent_note + def expires_at return nil unless created_at @@ -53,6 +55,33 @@ class Captain::PixCharge < ApplicationRecord now > expires_at end + # Cria uma nota interna (privada) na conversa avisando que o PIX foi gerado + # e enviado ao cliente. Nao significa que o cliente pagou — e so o marcador + # de "aguardando pagamento" com os detalhes da cobranca pra atendente. + def post_internal_pix_sent_note + conversation = reservation&.conversation + return if conversation.blank? + + value = original_value.to_f + expires_fmt = expires_at&.strftime('%d/%m/%Y %H:%M') || '—' + + content = [ + '💸 *PIX enviado ao cliente* — aguardando pagamento', + "Valor: R$ #{format('%.2f', value)}", + "Txid: #{txid}", + "Expira em: #{expires_fmt}", + "Reserva ##{reservation_id}" + ].join("\n") + + Messages::MessageBuilder.new( + nil, + conversation, + { content: content, message_type: 'outgoing', private: true } + ).perform + rescue StandardError => e + Rails.logger.warn("[Captain::PixCharge] failed to post sent note: #{e.class} - #{e.message}") + end + # Retorna o valor original da cobrança a partir do payload da Inter def original_value if raw_webhook_payload.present?