chatwoot-develop/enterprise/app/services/captain/tools/generate_pix_tool.rb
2026-01-14 10:24:10 -03:00

70 lines
2.4 KiB
Ruby

module Captain
module Tools
class GeneratePixTool < BaseTool
def name
'generate_pix'
end
def description
'Generates a Pix payment for the ACTIVE DRAFT reservation. Does not require parameters. Fails if no draft exists.'
end
def execute(*args, **params)
_actual_params = resolve_params(args, params)
# 1. Validate Contact Info
contact = @conversation.contact
return 'Erro: CPF não cadastrado. Use a ferramenta de atualizar contato primeiro.' if contact.custom_attributes['cpf'].blank?
return 'Erro: Nome não cadastrado. Use a ferramenta de atualizar contato primeiro.' if contact.name.blank?
# 2. Find Draft Reservation
reservation = Captain::Reservation.where(conversation_id: @conversation.id, status: 'draft').last
return 'Erro: Nenhuma reserva em rascunho encontrada. Use a ferramenta de criar intenção de reserva primeiro.' unless reservation
# 3. Generate Pix
begin
service = Captain::Inter::CobService.new(reservation)
charge = service.call
# Update status to pending payment
reservation.update!(status: 'pending_payment')
# Send Message to Chat
send_pix_message(charge.pix_copia_e_cola)
"Cobrança Pix gerada com sucesso. Copia e Cola enviado para o chat. ID Reserva: #{reservation.id}. Aguardando pagamento."
rescue StandardError => e
# Don't cancel immediately on error, allow retry
"Erro ao gerar Pix: #{e.message}"
end
end
private
def infer_unit_id(_params)
# 1. Try to find unit linked to the current inbox (Deterministic)
return @conversation.inbox.captain_inbox.unit.id if @conversation&.inbox&.captain_inbox&.unit
# 2. Fallback: simplistic approach for prototype
nil
end
def calculate_price(_unit, _category)
# Simple lookup in Captain::Pricing or default
100.00
end
def send_pix_message(pix_code)
message_content = "Aqui está o seu Pix Copia e Cola para confirmar a reserva:\n\n#{pix_code}\n\nAssim que o pagamento for confirmado, te aviso!"
@conversation.messages.create!(
content: message_content,
message_type: :outgoing,
account: @conversation.account,
inbox: @conversation.inbox,
sender: @assistant
)
end
end
end
end