Envio do organization_slug e do cliente Asaas nos eventos do accounts
TLDR: o payload de
PURCHASE_CREATED,INSTALLMENT_PAIDeINSTALLMENT_OVERDUEpassa a levarorganization_slug, ao lado deproduct_slug, ecustomer.provider_customer_id(ocus_...do Asaas), para oaccountssaber de qual organização é a compra e qual é o cliente no gateway.
Contexto
Hoje o accounts recebe só o product_slug. Os três eventos montam o payload interno pelo mesmo Accounts::PurchaseSerializer, então basta um atributo novo nele para os três passarem a enviar.
O accounts também precisa do id do cliente no Asaas. Ele vem da própria cobrança: os três eventos já buscam as parcelas ao vivo (GET payments?installment=...), e cada cobrança da resposta traz customer. Esse valor foi preferido ao OrganizationCustomer#gateway_customer_id local porque é o cliente que está de fato na cobrança, e porque pode existir mais de um OrganizationCustomer para o mesmo cliente e organização (o CheckoutService busca incluindo o gateway_customer_id).
Objetivos
- Enviar
organization_slug(payment.checkout.organization.slug) nopayloaddos três eventos doaccounts. - Enviar
nullquando a organização não tem slug (a coluna é anulável e aceita branco, ver R-003). Slug em branco ("") também sai comonull. - Enviar
customer.provider_customer_id, lido do campocustomerda primeira cobrança buscada no Asaas. Vainullquando a lista vem vazia ou semcustomer.
Fora de escopo
- Não bloqueia o evento quando falta slug: o evento sai com
organization_slug: null. - Não mexe no envelope (
event_type,external_id,occurred_at). - Não mexe no contrato
new_checkout.repayment_sync: orepayment_servicemonta as parcelas escolhendo as chaves, então a chave nova do hash normalizado não aparece lá. - Não lê o
OrganizationCustomerlocal. - Não mexe em eventos já gravados no outbox.
Mudanças
app/serializers/accounts/purchase_serializer.rb: atributoorganization_slug, logo antes deproduct_slug, com valorobject.checkout.organization.slug.presence.app/services/asaas/installments/fetch_from_gateway.rb:normalizepassa a incluirgateway_customer_id(installment[:customer]).app/serializers/accounts/purchase_serializer.rb:customerganhaprovider_customer_id, vindo dogateway_customer_idda primeira parcela eminstance_options[:installments].spec/services/asaas/installments/fetch_from_gateway_spec.rb: os testes comeqno hash normalizado recebemcustomerno dado bruto egateway_customer_idno esperado.spec/serializers/accounts/purchase_serializer_spec.rb: incluiorganization_slug: "citrg"eprovider_customer_idnoexpected_payload, e adiciona testes para a organização sem slug (null) e para a lista de parcelas sem cliente (null).spec/services/accounts/dispatch_purchase_created_spec.rb,dispatch_installment_paid_spec.rb,dispatch_installment_overdue_spec.rb: esses specs comparam o envelope inteiro comeq, então precisam receber"organization_slug" => "citrg"e"provider_customer_id"no payload esperado, ecustomerno dado bruto do Asaas. Muda testes existentes, e isso depende da sua aprovação deste spec.
Como verificar
bundle exec rspec spec/serializers/accounts spec/services/accountspassando.- Pelo console,
Accounts::DispatchPurchaseCreated.new(payment).envelopecom um pagamento real mostraorganization_slugecustomer.provider_customer_idnopayload.
Documentação
.project/docs/reference/payments/accounts_purchase_created_event.md: exemplo do payload e notas sobreorganization_slugecustomer.provider_customer_id(nullquando não há valor)..project/docs/reference/payments/accounts_installment_paid_event.mdeaccounts_installment_overdue_event.md: exemplo do payload, se o exemplo estiver repetido nesses arquivos..project/docs/README.md: entrada deste spec no índice.