# Changelog — Simulação de Custo de Contratação > Histórico específico desta aplicação, extraído de `plano.md`. > > **Formato**: uma entrada por rodada, `### Rodada N — Título`; quando a rodada não tem número registrado, `### Título` só. **A numeração de rodada não é global** — cada aplicação conta as próprias, e o mesmo número designa trabalhos diferentes em arquivos diferentes. Ao citar uma rodada, sempre nomear o arquivo. Ver o topo de `plano.md`. ### Rodada 37 — Simulação de Custo de Contratação (Geradoc) Pedido (2026-08-11): substituir a planilha manual de custo de contratação (`projects/planilha de custo/*.xlsx`) por um formulário no Portal que gera um PDF pronto pra enviar ao cliente — primeira aplicação de "Geradoc" a sair do estado de placeholder. Decisões confirmadas com o usuário: v1 cobre só Empregado CLT (as outras 4 modalidades do pedido original — Simples Nacional, Regime Normal, Pró-labore, Empregado Doméstico — ficam para quando houver planilha de referência equivalente); cálculo pontual, sem persistência (devolve o PDF direto, nada salva no banco); corrigido um gap real da planilha original (dedução por dependente não somava à base do IRRF quando usava desconto real de INSS); e as tabelas de INSS/IRRF, que nasceram hardcoded, viraram um cadastro editável (`ParametroFiscalCustoContratacao`, singleton) na mesma rodada em que a redução de IRRF da Lei 15.270/2025 (vigente desde jan/2026) foi implementada, já que ambas mudam por lei/todo ano. PDF gerado via `reportlab` (adicionado ao `requirements.txt`), com cabeçalho nas cores reais da marca (dourado/marrom amostrados de `logo.png`), não o roxo do tema do Portal. Migração `0023_parametrofiscalcustocontratacao`. Detalhe técnico completo no `CLAUDE.md` desta pasta. ### Rodada 38 — Revisão de interface (30/09/2026): validação, tabelas fiscais e formulário no celular Correções de interface apontadas pela revisão de interface de 30/09/2026, só no frontend (`custo-contratacao.js`/`.css`/`.html`); nada mudou no cálculo nem no backend. - **Tabelas fiscais sem valor inválido gravado como 0**: `parseValorBrEstrito()` aceita só número no formato brasileiro ("1.234,56" ou "1234,56"); campo inválido fica marcado em vermelho (`.is-invalido`), o cursor vai ao primeiro deles e nada é salvo. Antes um valor inválido virava 0 sem aviso e era gravado para todos os usuários. - **Tabelas fiscais com milhar e coeficiente com vírgula**: os inputs das faixas e dos parâmetros passam a ser preenchidos com separador de milhar ("7.350,00", `formataValorBrMilhar`), compatível com `parseValorBrEstrito` ao salvar. O coeficiente B da Lei 15.270/2025 aparece com vírgula ("0,133145"); o salvar continua aceitando vírgula ou ponto. `formataValorBr` (sem milhar) continua sendo a usada no payload da simulação. - **Falha ao carregar as tabelas fiscais**: mensagem com próximo passo ("Recarregue a página; se persistir, contate a Inovação.") e "Salvar tabelas" desabilitado até a carga terminar com sucesso, para não gravar tabelas vazias. - **Validação do formulário**: item de "Outros itens"/"Outros benefícios"/"Outros descontos" com valor e sem nome bloqueia o envio (antes era descartado do cálculo sem aviso) e leva o cursor ao nome; salário contratual, % de INSS Empregador e % de FGTS em branco também levam o cursor ao campo, em vez de só mostrar a mensagem no rodapé. - **Gerar PDF**: a aba é aberta no clique, antes do `fetch` (senão o bloqueador de pop-up costuma barrar), recebe o PDF quando ele chega e o blob é revogado depois; os botões mostram "Gerando…"/"Salvando…" e ficam travados até terminar. - **Limpar**: pede confirmação (`pidConfirm`, perigoso) só quando há algo preenchido no formulário ou alguma linha incluída nos itens. - **Campos e layout**: campos monetários e percentuais com `inputmode="decimal"` (inclusive as faixas criadas pelo JS); placeholder do coeficiente B "Ex.: 0,133145…"; linhas de 2 e 3 colunas do formulário e do painel fiscal viram uma coluna em tela de celular (até 640px, com escopo só no conteúdo da Simulação, sem afetar os modais comuns do shell); `tabular-nums` nos inputs das faixas. Ficaram sem `inputmode="decimal"` de propósito os campos que aceitam valor **ou** percentual ("Adicional Art. 62" e os três descontos, ex.: "40%"): em teclado virtual de celular esse modo pode não oferecer o "%".