Skip to content

feat(student-app): aluno paga a propria fatura pelo app (checkout Stripe)#154

Merged
renanfulas merged 2 commits into
mainfrom
feat/payment-p3-student-pay
Jun 24, 2026
Merged

feat(student-app): aluno paga a propria fatura pelo app (checkout Stripe)#154
renanfulas merged 2 commits into
mainfrom
feat/payment-p3-student-pay

Conversation

@renanfulas

Copy link
Copy Markdown
Owner

Fecha o P3 (self-service): o aluno paga a própria fatura pelo app. Botão "Pagar" nas cobranças em aberto do Perfil → checkout Stripe → a baixa segue pelo webhook já existente (#140) + a confirmação (#150).

O que entra

  • create_checkout_session ganha success_url/cancel_url opcionais (default = rotas do staff, retrocompat) e trata ator anônimo (o aluno não é request.user do Django — auth por cookie próprio). Roda no schema do box ativo, então o box_schema entra na metadata e a reconciliação funciona.
  • resolve_payable_student_invoice (segurança): só a fatura do próprio aluno e em aberto (pendente/atrasada) é pagável — qualquer outra (de outro aluno, paga, cancelada, inexistente) é negada.
  • StudentPayInvoiceView: rate-limit anti card-testing (reusa checkout_rate_limit_exceeded) + checagem de posse → redireciona pro Stripe. Páginas de retorno StudentPaySuccessView/StudentPayCancelView no /aluno/.
  • URLs + templates pay_success/pay_cancel (no shell do app) + botão "Pagar" nas linhas de Pagamentos do Perfil (só nas em aberto).

Testes

tests/test_student_payment_flow.py: posse/estado da fatura (próprio/outro/paga/inexistente), rows com id/is_open, e create_checkout_session com URLs do aluno + ator anônimo. Lógica verificada no CI.

Revisar

O visual segue o shell do app (reusei student-card/student-primary-action), mas não verifico headless — dá uma olhada no /aluno/configuracoes/ (botão Pagar) e nas telas de retorno quando puder.

🤖 Generated with Claude Code

…ipe)

P3: botao "Pagar" nas cobrancas em aberto do Perfil inicia um checkout Stripe da
PROPRIA fatura. Roda no schema do box ativo -> a baixa segue pelo webhook ja
existente (router._handle_student_payment + confirmacao do #150).

- integrations.stripe.create_checkout_session: aceita success_url/cancel_url
  opcionais (default = rotas do staff, retrocompat) e trata ator anonimo (o aluno
  nao e request.user do Django).
- student_app.student_payments_presentation.resolve_payable_student_invoice:
  seguranca — so a fatura DO PROPRIO aluno e EM ABERTO e pagavel. As rows ganham
  id + is_open.
- student_app/views/payment_views.py: StudentPayInvoiceView (rate-limit anti
  card-testing + checagem de posse, redireciona pro Stripe) + paginas de retorno
  StudentPaySuccessView/StudentPayCancelView no /aluno/.
- urls + templates pay_success/pay_cancel + botao "Pagar" no settings.html.
- Testes: posse/estado da fatura (proprio/outro/paga/inexistente), rows id/is_open,
  e create_checkout_session com URLs do aluno + ator anonimo.

Visual segue o shell do app (revisar no /aluno/). Logica verificada no CI.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Jun 23, 2026

Copy link
Copy Markdown

Coverage report

Click to see where and how coverage changed

FileStatementsMissingCoverageCoverage
(new stmts)
Lines missing
  integrations/stripe
  services.py 34, 51, 95-96
  student_app
  student_payments_presentation.py
  student_app/views
  __init__.py
  payment_views.py 35-55
Project Total  

This report was generated by python-coverage-comment-action

@renanfulas renanfulas merged commit 7a4b52c into main Jun 24, 2026
12 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant