109 lines
4.7 KiB
HTML
109 lines
4.7 KiB
HTML
<!-- app/templates/cliente_form.html -->
|
|
{% extends "base.html" %}
|
|
{% block titulo %}{{ "Editar" if cliente else "Novo" }} cliente{% endblock %}
|
|
{% block conteudo %}
|
|
<h1>{{ "Editar" if cliente else "Novo" }} cliente</h1>
|
|
{% if erro_codigo_duplicado %}
|
|
<div class="mensagem danger">
|
|
O código {{ dados.CODIGO }} já está em uso por outro cliente — escolha outro código antes de salvar.
|
|
</div>
|
|
{% endif %}
|
|
{% if aviso_dv_invalido %}
|
|
<div class="mensagem warning">
|
|
O dígito verificador do documento ({{ dados.CNPJ }}) não confere — confirme se digitou certo antes de salvar.
|
|
<form method="post">
|
|
<input type="hidden" name="csrf_token" value="{{ csrf_token }}">
|
|
{% for campo, valor in dados.items() %}<input type="hidden" name="{{ campo }}" value="{{ valor }}">{% endfor %}
|
|
<input type="hidden" name="confirmar_dv_invalido" value="1">
|
|
<button type="submit">Cadastrar mesmo assim</button>
|
|
</form>
|
|
</div>
|
|
{% endif %}
|
|
{% if erro_cnpj_invalido %}
|
|
<div class="mensagem danger">
|
|
O dígito verificador do CNPJ ({{ dados.CNPJ }}) não confere — corrija antes de salvar.
|
|
</div>
|
|
{% endif %}
|
|
{% if erro_gravacao %}
|
|
<div class="mensagem danger">
|
|
Não foi possível salvar: {{ erro_gravacao }}
|
|
</div>
|
|
{% endif %}
|
|
<div class="cartao">
|
|
<form method="post">
|
|
<input type="hidden" name="csrf_token" value="{{ csrf_token }}">
|
|
<div class="grid-form">
|
|
{% for campo in campos %}
|
|
{% set largura_total = campo in ["OBS"] %}
|
|
<div class="{{ 'grid-form-largura-total' if largura_total }}">
|
|
<label for="{{ campo }}">{{ campo }}{% if campo in campos_obrigatorios %} *{% endif %}</label>
|
|
{% if campo in ["DATA_CONTRATO", "VENCIMENTO_CONTRATO"] %}
|
|
<input type="date" id="{{ campo }}" name="{{ campo }}" value="{{ dados[campo] if dados else '' }}" {% if campo in campos_obrigatorios %}required{% endif %}>
|
|
{% elif campo in ["IMPLANTACAO", "MENSALIDADE", "JUROS_MORA", "JUROS_MULTA"] %}
|
|
<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:var(--cor-texto-secundario);margin-top:4px"></small>
|
|
{% endif %}
|
|
{% endif %}
|
|
</div>
|
|
{% endfor %}
|
|
</div>
|
|
<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>
|
|
</div>
|
|
|
|
<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 %}
|