feat: preenchimento automatico de dados do cliente a partir do CNPJ
Ao sair do campo CNPJ no formulario de cliente, busca automaticamente
na BrasilAPI (publica, gratuita, sem chave - dados abertos da Receita)
e preenche Razao/Fantasia/Endereco/Cidade/Bairro/UF/CEP/Telefone/
E-mail, so nos campos que estiverem vazios (nunca sobrescreve o que
ja foi digitado). So funciona para CNPJ - CPF e dado pessoal, sem
consulta publica, e a rota recusa (404) se detectar CPF.
- app/cnpj_lookup.py: cliente HTTP pra BrasilAPI, degrada em silencio
(retorna None) se nao encontrar/rede cair/formato nao reconhecido
(ex.: CNPJ alfanumerico novo, que a BrasilAPI pode nao cobrir ainda).
- Nova rota GET /clientes/consulta-cnpj/{documento}, chamada via
fetch() no formulario (JS vanilla, sem framework).
- Testado ponta a ponta contra a API real.
106/106 testes passando (10 novos).
This commit is contained in:
@@ -34,9 +34,63 @@
|
||||
<input type="number" step="0.01" id="{{ campo }}" name="{{ campo }}" value="{{ dados[campo] if dados else '' }}" {% if campo in campos_obrigatorios %}required{% endif %}>
|
||||
{% else %}
|
||||
<input type="text" id="{{ campo }}" name="{{ campo }}" value="{{ dados[campo] if dados else '' }}" {% if campo in campos_obrigatorios %}required{% endif %}>
|
||||
{% if campo == "CNPJ" %}
|
||||
<small id="cnpj-status" style="display:block;color:#a1a1aa;margin-top:4px"></small>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
<p><small>* campos obrigatórios. Os demais podem ficar em branco — implantação/mensalidade/juros ficam 0,00 e as datas de contrato ficam com a data de hoje até serem ajustadas.</small></p>
|
||||
<button type="submit">Salvar</button>
|
||||
</form>
|
||||
|
||||
<script>
|
||||
(function () {
|
||||
// Ao sair do campo CNPJ, busca os dados na Receita (via BrasilAPI, ver
|
||||
// app/cnpj_lookup.py) e preenche os campos abaixo — só os que estiverem
|
||||
// vazios, nunca sobrescreve o que já foi digitado. Não faz nada para CPF
|
||||
// (a rota /clientes/consulta-cnpj só responde para CNPJ).
|
||||
var $cnpj = document.getElementById('CNPJ');
|
||||
var $status = document.getElementById('cnpj-status');
|
||||
if (!$cnpj) return;
|
||||
|
||||
var CAMPOS_PARA_PREENCHER = ['RAZAO', 'FANTASIA', 'ENDERECO', 'CIDADE', 'BAIRRO', 'UF', 'CEP', 'TELEFONE', 'EMAIL'];
|
||||
|
||||
function normalizarCnpj(valor) {
|
||||
return (valor || '').toUpperCase().replace(/[^0-9A-Z]/g, '');
|
||||
}
|
||||
|
||||
async function buscarCnpj() {
|
||||
var limpo = normalizarCnpj($cnpj.value);
|
||||
if (limpo.length !== 14) return;
|
||||
|
||||
if ($status) $status.textContent = 'Buscando dados do CNPJ...';
|
||||
|
||||
try {
|
||||
var resposta = await fetch('/clientes/consulta-cnpj/' + encodeURIComponent(limpo));
|
||||
var corpo = await resposta.json();
|
||||
if (!resposta.ok || !corpo.encontrado) {
|
||||
if ($status) $status.textContent = 'CNPJ não encontrado na Receita — preencha manualmente.';
|
||||
return;
|
||||
}
|
||||
var preencheu = false;
|
||||
CAMPOS_PARA_PREENCHER.forEach(function (campo) {
|
||||
var $input = document.getElementById(campo);
|
||||
if ($input && !$input.value && corpo.dados[campo]) {
|
||||
$input.value = corpo.dados[campo];
|
||||
preencheu = true;
|
||||
}
|
||||
});
|
||||
if ($status) {
|
||||
$status.textContent = preencheu
|
||||
? 'Dados preenchidos automaticamente a partir do CNPJ — confira antes de salvar.'
|
||||
: 'CNPJ encontrado (campos já preenchidos não foram alterados).';
|
||||
}
|
||||
} catch (erro) {
|
||||
if ($status) $status.textContent = '';
|
||||
}
|
||||
}
|
||||
|
||||
$cnpj.addEventListener('blur', buscarCnpj);
|
||||
})();
|
||||
</script>
|
||||
{% endblock %}
|
||||
|
||||
Reference in New Issue
Block a user