Toda loja brasileira precisa de CPF ou CNPJ pra emitir nota, e a primeira reação é procurar um módulo. Antes disso: o Magento já tem dois campos de documento no core, e é bem provável que o seu gateway leia de um deles.
A confusão que faz todo mundo perder tarde é que os dois se chamam parecido no admin e vivem em lugares diferentes do banco.
São dois campos, não um
Guarde essa tabela, ela resolve 90% das dúvidas:
taxvat | vat_id | |
|---|---|---|
| Entidade | cliente | endereço |
| Aparece em | criar conta e editar conta | formulário de endereço, inclusive no checkout |
| Config | customer/address/taxvat_show | customer/create_account/vat_frontend_visibility |
| Valores | vazio, opt ou req | 0 ou 1 |
| Dá pra tornar obrigatório por config | sim | não |
O taxvat pendura no cliente, então ele é um só, independente de quantos endereços a pessoa tenha. O vat_id pendura no endereço, então cada endereço tem o seu — o que faz sentido pra quem compra com CNPJ da empresa e CPF de casa.
O detalhe que pega: o formulário de endereço do checkout é montado a partir dos atributos do customer_address, e o taxvat não é um deles. Por isso ligar só o Tax/VAT Number no admin e ir olhar o checkout não mostra nada.
Ligando cada um
Pelo admin, os caminhos são:
- Stores > Configuration > Customers > Customer Configuration > Name and Address Options > Show Tax/VAT Number, com as opções No, Optional e Required.
- Stores > Configuration > Customers > Customer Configuration > Create New Account Options > Show VAT Number on Storefront, Yes ou No.
Pela CLI, que é o que eu uso em deploy:
php bin/magento config:set customer/address/taxvat_show req
php bin/magento config:set customer/create_account/vat_frontend_visibility 1
php bin/magento cache:flushUma coisa que ninguém conta sobre o primeiro comando: ele não guarda só um valor de configuração. O backend model Magento\Customer\Model\Config\Backend\Show\Customer escreve is_visible e is_required direto no atributo EAV taxvat. É por isso que req torna o campo obrigatório também no cadastro pelo admin, e é por isso que a mudança não volta sozinha se você só limpar o cache.
Já o vat_frontend_visibility só liga a visibilidade. Quem decide isso é uma linha do AttributeMerger do checkout, que esconde o vat_id quando a config está desligada. Deixar o campo obrigatório no checkout exige mexer no is_required do atributo, o que já é data patch ou SQL — aí não é mais "sem módulo".
Troque o rótulo para CPF / CNPJ
"VAT Number" não diz nada pro brasileiro. O rótulo do campo no checkout passa por __() antes de ir pra tela, então uma linha de tradução resolve, sem tocar em código. Crie o arquivo app/design/frontend/SuaMarca/seu-tema/i18n/pt_BR.csv com:
"VAT Number","CPF / CNPJ"
"Tax/VAT Number","CPF / CNPJ"Depois:
php bin/magento setup:static-content:deploy pt_BR -f
php bin/magento cache:clean translate full_pageSe a loja usa mais de um idioma, repita no CSV do idioma que interessa. E confira que a store view está mesmo em pt_BR em Stores > Configuration > General > Locale Options, senão o CSV nem é lido.
O que isso não faz
Não valida CPF. O campo aceita "123" e salva feliz. O Magento tem validação de VAT europeu via VIES, que não serve pra nada aqui. Se você precisa de máscara e de dígito verificador, aí sim entra módulo ou um validador seu.
O que vale checar antes de comprar qualquer coisa: o seu gateway provavelmente já lê desses campos. O módulo do PagBank, por exemplo, tem uma configuração chamada Get Document From, em payment/ricardomartins_pagbank/document_from, com exatamente três opções — taxvat, vat_id ou pedir no próprio formulário de pagamento.
Pra loja que vende muito pra convidado, a terceira opção costuma ser a mais tranquila: o gateway pede o documento na hora de pagar, com máscara e validação prontas, e você não precisa nem ligar os campos do core. Ligue o taxvat como req quando o cadastro for obrigatório de qualquer jeito e você quiser o documento no cliente, não no pedido.
Perguntas rápidas
Liguei o Show Tax/VAT Number e o campo não apareceu no checkout. Está quebrado?
Não. Esse campo é o taxvat, que pertence ao cliente e só aparece nos formulários de criar conta e editar conta. O formulário de endereço do checkout usa atributos de endereço, e o de documento ali é o vat_id, ligado pela config Show VAT Number on Storefront.
Dá pra usar o mesmo campo para CPF e CNPJ?
Dá, e é o que a maioria das lojas faz, porque os dois são o documento fiscal do comprador. Como não existe validação nativa, o campo aceita os dois formatos. Se você precisa tratar pessoa física e jurídica de forma diferente no ERP, o caminho é distinguir pelo tamanho do número na integração.
Mudei taxvat_show para req e clientes antigos ficaram sem o campo preenchido. É problema?
O atributo passa a ser obrigatório dali pra frente. Cadastros antigos continuam sem valor até o cliente editar a conta, e a validação só dispara em formulário que envia esse campo. Se você precisa do documento de todo mundo, o jeito é pedir numa próxima compra ou fazer uma campanha de atualização de cadastro.
Pra conferir na fonte
- Magento_Customer etc/adminhtml/system.xml — GitHub
- Magento_Checkout AttributeMerger.php — GitHub
- Magento_Customer etc/config.xml — GitHub
- PagBank Magento 2: DocumentFromOptions.php — GitHub