Confirmação automática de pagamento

Atualizado em 2026-04-26

Confirmação automática de pagamento

Assim que um hóspede faz o sinal ou o pagamento total via Stripe ou Bancontact, todo o fluxo é colocado automaticamente em marcha. Tudo o que entra é visível em tempo real na página de Pagamentos.

Visão geral de pagamentos com transações em aberto, pagas e processadas

O que acontece quando entra um pagamento?

  1. Chega um webhook (do Stripe ou Bancontact) a /webhooks/stripe-payment ou /webhooks/bancontact
  2. O BedFlow atualiza a fatura:
    • financial.paid += valor
    • financial.balance = total - pago
    • financial_state passa a 'partial' (sinal) ou 'paid' (total)
    • É adicionado um registo de pagamento individual a payments[]
  3. A reserva passa de pending para confirmed + deposit_paid = true
  4. Sai um e-mail para o hóspede — qual depende da situação:
    • Primeiro pagamento (sinal ou total de uma vez) → "Pagamento recebido" (template booking-confirmed)
    • Restante após sinal anterior → "Totalmente pago" (template booking-fully-paid)
  5. Notificação Telegram para si no telemóvel:
    • 💳 "Pagamento recebido" (no caso de sinal) ou ✅ "Totalmente pago"
    • Com nome do hóspede, valor, saldo restante, data de chegada, referência
  6. WhatsApp para o hóspede (apenas no primeiro pagamento — no pagamento final basta o e-mail)
  7. O URL do portal do hóspede é gerado e guardado na reserva — o hóspede pode abrir o seu portal a partir do e-mail

Exemplo de fluxo: Jan Jansen reserva 3 noites

| Momento | O Jan vê | Você vê | |---|---|---| | Reserva via widget | "Obrigado — verifique o e-mail para o link de pagamento" | Telegram 🎫 "Nova reserva" | | Abre o e-mail, clica em Stripe | Checkout Stripe, paga €96 de sinal | — | | Webhook Stripe | "Pagamento recebido — restante €231 à chegada" | Telegram 💳 "€96 recebidos do Jan" | | 2 dias depois paga o resto | "Totalmente pago! Até breve." | Telegram ✅ "Totalmente pago pelo Jan" |

Onde está construído?

  • app/Http/Controllers/PaymentController.php::handleBookingPaymentConfirmed() é o coração
  • app/Services/EmailAutomationService::processEvent() escolhe o template certo
  • app/Services/TelegramNotificationService::info('payment_received', ...) envia o push para o admin