Modernização da criação de pedidos (Orders)

TLDR: introduzir a entidade Order para permitir um pagamento que abranja mais de um checkout, criado de forma assíncrona, com endpoints separados por forma de pagamento.

Contexto

A criação de pagamentos é acoplada a um único checkout e é síncrona. Precisamos de uma estrutura mais moderna, que permita pedidos com múltiplos checkouts e que não bloqueie o request enquanto conversa com o gateway.

Objetivos

  • O controller de criação de order captura todas as informações do usuário — quais produtos quer comprar e como quer pagar. Um job é disparado para criar o pagamento no gateway, e essa informação fica disponível nos detalhes do pedido.
  • O endpoint orders/:id (details) retorna a informação do pagamento, possivelmente apenas o ID.
  • PIX: endpoint orders/:order_id/payments/:id/pix, que bate no gateway apenas uma vez e depois retorna.
  • Boleto: endpoint orders/:order_id/payments/:id/boleto, que bate no gateway apenas uma vez e depois retorna.
  • Cartão de crédito: POST orders/:order_id/payments/:id/credit_cards, que bate no gateway ao tentar pagar.
  • Registrar audit em tudo que for feito.

Fora de escopo

— (não registrado na spec original)

Mudanças

Modelo Order

  • has_many :checkouts
  • has_many :payments
Campo Nome
pid ID do Order
user_id ID do comprador
checkout_id ID do checkout principal
affiliate_id ID do afiliado

Controller e API

Não definido na spec original.

Como verificar

— (não registrado na spec original)

Documentação

Não implementado. Não existe app/models/order.rb nem rotas de orders no config/routes.rb. O fluxo assíncrono de criação de pagamento que existe hoje (Payments::Creation::CreateFlow + ScheduleWithGatewayJob, descrito em ../reference/payments/payment_flow.md) resolve parte da motivação original — a assincronia —, mas continua atrelado a um único checkout.