70 lines
2.4 KiB
Ruby
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
|