PHPAY-93: value object Customer — uma forma só para os nove gateways - #94
Merged
Merged
Conversation
Fecha a segunda metade da crítica que originou o Money: a biblioteca normalizava os nomes dos métodos entre gateways, mas deixava os payloads crus. O mesmo campo tinha seis grafias — cpfCnpj no Asaas, tax_id no PagBank, document no Pagar.me, taxId no AbacatePay, taxID no Woovi, cpf_cnpj no Efí. O README prometia que trocar de gateway era trocar a linha do construtor, e isso era falso para qualquer coisa envolvendo cliente. Agora um Customer escrito uma vez vira o formato de cada um. O mapeamento mora na classe *CustomerRequest de cada gateway, em fromCustomer(), porque ela já detém o conhecimento do schema daquele gateway — validação e mapeamento ficam no mesmo lugar. O VO também absorve derivações que antes estavam espalhadas ou ausentes: isIndividual() e documentType() para o type do Pagar.me e o IdentityType da Cielo; firstName() e lastName() para o Mercado Pago; phoneParts() para o formato estruturado do PagBank. Antes disso, quem integrava tinha que saber dessas diferenças. SOBRE O RISCO QUE EU TINHA LEVANTADO. Ao propor isso eu disse que o escape hatch podia acabar carregando a maior parte do payload em algum gateway, e que isso precisava ser medido e não assumido. Medi: o value object cobre TODOS os campos obrigatórios de cliente dos oito gateways que têm cliente. O withExtra() só carrega opcionais — endereço, data de nascimento, referência externa. A previsão não se confirmou. Compatibilidade total: Customer|array em todo setCustomer(), setPayer() e customer(), inclusive no contrato SupportsCustomers. Quem passa array continua funcionando. Efí, Cielo e Rede não ganharam customer() porque não implementam SupportsCustomers — o modelo de capacidades já dizia isso. 275 testes no total.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #93
Fecha a segunda metade da crítica que originou o #91.
O problema, medido
O mesmo campo tinha seis grafias:
cpfCnpjtax_iddocumenttaxIdtaxIDcpf_cnpjIdentityO README prometia que "trocar de gateway é trocar a linha do construtor", e isso era falso para qualquer coisa envolvendo cliente.
A solução
Há um teste que mapeia o mesmo cliente para as oito grafias numa expectativa só.
O VO absorve derivações que estavam espalhadas
Antes, quem integrava tinha que saber dessas diferenças. Agora elas moram num lugar só, com teste.
Ao propor isso, eu disse:
Medi, com um script que cruza os campos obrigatórios de cada gateway contra o que o mapper produz:
O
withExtra()só carrega opcionais — endereço, data de nascimento, referência externa. A previsão pessimista não se confirmou.Onde o mapeamento mora
Na classe
*CustomerRequestde cada gateway, emfromCustomer(Customer): array. Ela já detinha o conhecimento do schema daquele gateway para validar — agora validação e mapeamento ficam no mesmo lugar, em vez de espalhar a tradução pelos recursos.Compatibilidade
Total.
Customer|arrayem todosetCustomer(),setPayer()ecustomer(), inclusive no contratoSupportsCustomers. Quem passa array continua funcionando.Efí, Cielo e Rede não ganharam
customer()— eles não implementamSupportsCustomers, e o modelo de capacidades já dizia isso.Verificação
275 testes (759 asserções), PHPStan nível 9 limpo, Pint limpo.