refactor: validação de inputs e melhorias de código
- Adiciona validação em calcularCustoTotal, calcularSecagem, calcularCEV, calcularCisalhamento, calcularPreaquecimento - Cria Logger com níveis (debug, info, warn, error) - Consolida 5 arquivos de teste em 1 (test-suite.js) - Adiciona safe DOM access em funções de cálculo
This commit is contained in:
169
public/app.js
169
public/app.js
@@ -3,6 +3,9 @@
|
||||
// Plataforma Técnica Completa com Base de Materiais
|
||||
// ========================================
|
||||
|
||||
// Logger disponível globalmente (carregado antes em logger.js)
|
||||
// Usar window.Logger.info('mensagem') para logs controlados
|
||||
|
||||
// Import state from modules (userPreferences only - appState is still global for legacy)
|
||||
import { userPreferences, loadPreferences, savePreferences, adminConfig } from './js/core/state.js';
|
||||
|
||||
@@ -893,14 +896,37 @@ function analisarUltrassom() {
|
||||
}
|
||||
|
||||
function calcularCustoTotal() {
|
||||
const area = parseFloat(document.getElementById('custo-area').value) || 0;
|
||||
const regiao = document.getElementById('custo-regiao').value;
|
||||
const tipoTinta = document.getElementById('custo-tipo-tinta').value;
|
||||
const custoMO = parseFloat(document.getElementById('custo-mo').value) || 85;
|
||||
const prod = parseFloat(document.getElementById('custo-prod').value) || 5;
|
||||
const volume = parseFloat(document.getElementById('custo-volume').value) || 0;
|
||||
const incluirEPI = document.getElementById('custo-incluir-epi').checked;
|
||||
const incluirEquip = document.getElementById('custo-incluir-equip').checked;
|
||||
const areaInput = document.getElementById('custo-area');
|
||||
const regiaoInput = document.getElementById('custo-regiao');
|
||||
const tipoTintaInput = document.getElementById('custo-tipo-tinta');
|
||||
const custoMOInput = document.getElementById('custo-mo');
|
||||
const prodInput = document.getElementById('custo-prod');
|
||||
const volumeInput = document.getElementById('custo-volume');
|
||||
|
||||
const area = parseFloat(areaInput?.value) || 0;
|
||||
const regiao = regiaoInput?.value || 'sudeste';
|
||||
const tipoTinta = tipoTintaInput?.value || 'padrao';
|
||||
const custoMO = parseFloat(custoMOInput?.value) || 85;
|
||||
const prod = parseFloat(prodInput?.value) || 5;
|
||||
const volume = parseFloat(volumeInput?.value) || 0;
|
||||
const incluirEPI = document.getElementById('custo-incluir-epi')?.checked || false;
|
||||
const incluirEquip = document.getElementById('custo-incluir-equip')?.checked || false;
|
||||
|
||||
if (area <= 0 || isNaN(area)) {
|
||||
const resultEl = document.getElementById('custo-result');
|
||||
if (resultEl) resultEl.innerHTML = '<div class="alert alert-error">⚠️ Área inválida. Insira um valor maior que 0.</div>';
|
||||
return;
|
||||
}
|
||||
if (prod <= 0) {
|
||||
const resultEl = document.getElementById('custo-result');
|
||||
if (resultEl) resultEl.innerHTML = '<div class="alert alert-error">⚠️ Produtividade inválida. Insira um valor maior que 0.</div>';
|
||||
return;
|
||||
}
|
||||
if (volume < 0) {
|
||||
const resultEl = document.getElementById('custo-result');
|
||||
if (resultEl) resultEl.innerHTML = '<div class="alert alert-error">⚠️ Volume não pode ser negativo.</div>';
|
||||
return;
|
||||
}
|
||||
|
||||
const precosTinta = {
|
||||
sudeste: { padrao: 80, premium: 120, economica: 50 },
|
||||
@@ -1002,10 +1028,31 @@ function calcularCustoTotal() {
|
||||
}
|
||||
|
||||
function calcularSecagem() {
|
||||
const tipo = document.getElementById('sec-tipo').value;
|
||||
const temp = parseFloat(document.getElementById('sec-temp').value) || 25;
|
||||
const umidade = parseFloat(document.getElementById('sec-umidade').value) || 60;
|
||||
const espessura = parseFloat(document.getElementById('sec-espessura').value) || 80;
|
||||
const tipoInput = document.getElementById('sec-tipo');
|
||||
const tempInput = document.getElementById('sec-temp');
|
||||
const umidadeInput = document.getElementById('sec-umidade');
|
||||
const espessuraInput = document.getElementById('sec-espessura');
|
||||
|
||||
const tipo = tipoInput?.value || 'epoxi';
|
||||
const temp = parseFloat(tempInput?.value) || 25;
|
||||
const umidade = parseFloat(umidadeInput?.value) || 60;
|
||||
const espessura = parseFloat(espessuraInput?.value) || 80;
|
||||
|
||||
if (temp < -20 || temp > 300) {
|
||||
const resultEl = document.getElementById('sec-result');
|
||||
if (resultEl) resultEl.innerHTML = '<div class="alert alert-error">⚠️ Temperatura inválida. Use valores entre -20°C e 300°C.</div>';
|
||||
return;
|
||||
}
|
||||
if (umidade < 0 || umidade > 100) {
|
||||
const resultEl = document.getElementById('sec-result');
|
||||
if (resultEl) resultEl.innerHTML = '<div class="alert alert-error">⚠️ Umidade inválida. Use valores entre 0% e 100%.</div>';
|
||||
return;
|
||||
}
|
||||
if (espessura <= 0 || espessura > 1000) {
|
||||
const resultEl = document.getElementById('sec-result');
|
||||
if (resultEl) resultEl.innerHTML = '<div class="alert alert-error">⚠️ Espessura inválida. Use valores entre 1 e 1000 microns.</div>';
|
||||
return;
|
||||
}
|
||||
|
||||
const dadosTinta = {
|
||||
epoxi: { tempIdeal: 25, umidadeMax: 85, tempoBase: 24, fatorEsp: 0.2 },
|
||||
@@ -4995,14 +5042,28 @@ function getReferenciaContent() {
|
||||
|
||||
// CEV Calculation
|
||||
function calcularCEV() {
|
||||
const C = parseFloat(document.getElementById('cev-c').value) || 0;
|
||||
const Mn = parseFloat(document.getElementById('cev-mn').value) || 0;
|
||||
const Cr = parseFloat(document.getElementById('cev-cr').value) || 0;
|
||||
const Mo = parseFloat(document.getElementById('cev-mo').value) || 0;
|
||||
const V = parseFloat(document.getElementById('cev-v').value) || 0;
|
||||
const Ni = parseFloat(document.getElementById('cev-ni').value) || 0;
|
||||
const Cu = parseFloat(document.getElementById('cev-cu').value) || 0;
|
||||
const thickness = parseFloat(document.getElementById('cev-thickness').value) || 0;
|
||||
const getVal = (id) => parseFloat(document.getElementById(id)?.value) || 0;
|
||||
|
||||
const C = getVal('cev-c');
|
||||
const Mn = getVal('cev-mn');
|
||||
const Cr = getVal('cev-cr');
|
||||
const Mo = getVal('cev-mo');
|
||||
const V = getVal('cev-v');
|
||||
const Ni = getVal('cev-ni');
|
||||
const Cu = getVal('cev-cu');
|
||||
const thickness = getVal('cev-thickness');
|
||||
|
||||
if ([C, Mn, Cr, Mo, V, Ni, Cu].every(v => v === 0)) {
|
||||
const resultEl = document.getElementById('cev-result');
|
||||
if (resultEl) resultEl.innerHTML = '<div class="alert alert-warning">⚠️ Preencha pelo menos um elemento de liga para calcular o CEV.</div>';
|
||||
return;
|
||||
}
|
||||
|
||||
if (C < 0 || C > 2 || Mn < 0 || Mn > 5 || Cr < 0 || Cr > 30 || Mo < 0 || Mo > 5 || V < 0 || V > 5 || Ni < 0 || Ni > 5 || Cu < 0 || Cu > 5) {
|
||||
const resultEl = document.getElementById('cev-result');
|
||||
if (resultEl) resultEl.innerHTML = '<div class="alert alert-error">⚠️ Valores fora dos limites típicos para aços. Verifique os valores inseridos.</div>';
|
||||
return;
|
||||
}
|
||||
|
||||
// IIW Formula
|
||||
const CEV = C + Mn/6 + (Cr+Mo+V)/5 + (Ni+Cu)/15;
|
||||
@@ -5864,11 +5925,37 @@ const steelBearing = {
|
||||
|
||||
// Tab 1: Cisalhamento (Shear)
|
||||
function calcularCisalhamento() {
|
||||
const boltType = document.getElementById('bolt-type').value;
|
||||
const d = parseFloat(document.getElementById('bolt-d').value);
|
||||
const qty = parseInt(document.getElementById('bolt-qty').value);
|
||||
const planes = parseInt(document.getElementById('bolt-planes').value);
|
||||
const force = parseFloat(document.getElementById('bolt-force').value);
|
||||
const getVal = (id, fallback = 0) => {
|
||||
const el = document.getElementById(id);
|
||||
return el ? (id.includes('qty') || id.includes('planes') ? parseInt(el.value) : parseFloat(el.value)) : fallback;
|
||||
};
|
||||
|
||||
const boltType = document.getElementById('bolt-type')?.value || 'a325';
|
||||
const d = getVal('bolt-d');
|
||||
const qty = getVal('bolt-qty', 1);
|
||||
const planes = getVal('bolt-planes', 1);
|
||||
const force = getVal('bolt-force');
|
||||
|
||||
if (!d || d <= 0 || d > 36) {
|
||||
const resultEl = document.getElementById('bolt-result');
|
||||
if (resultEl) resultEl.innerHTML = '<div class="alert alert-error">⚠️ Diâmetro do parafuso inválido. Use valores entre 1mm e 36mm.</div>';
|
||||
return;
|
||||
}
|
||||
if (!boltDatabase[boltType]?.capacidade[d]) {
|
||||
const resultEl = document.getElementById('bolt-result');
|
||||
if (resultEl) resultEl.innerHTML = '<div class="alert alert-error">⚠️ Diâmetro não disponível para o tipo de parafuso selecionado.</div>';
|
||||
return;
|
||||
}
|
||||
if (qty < 1 || qty > 100) {
|
||||
const resultEl = document.getElementById('bolt-result');
|
||||
if (resultEl) resultEl.innerHTML = '<div class="alert alert-error">⚠️ Quantidade de parafusos inválida. Use valores entre 1 e 100.</div>';
|
||||
return;
|
||||
}
|
||||
if (!force || force <= 0) {
|
||||
const resultEl = document.getElementById('bolt-result');
|
||||
if (resultEl) resultEl.innerHTML = '<div class="alert alert-error">⚠️ Força aplicada inválida. Insira um valor maior que 0.</div>';
|
||||
return;
|
||||
}
|
||||
|
||||
const bolt = boltDatabase[boltType];
|
||||
const area = Math.PI * Math.pow(d / 2, 2);
|
||||
@@ -7279,9 +7366,30 @@ function calcularEnergiaCompleta() {
|
||||
}
|
||||
|
||||
function calcularPreaquecimento() {
|
||||
const cev = parseFloat(document.getElementById('preheat-cev').value) || 0;
|
||||
const thickness = parseFloat(document.getElementById('preheat-thickness').value) || 0;
|
||||
const ambient = parseFloat(document.getElementById('preheat-ambient').value) || 20;
|
||||
const getVal = (id, fallback = 0) => {
|
||||
const el = document.getElementById(id);
|
||||
return el ? parseFloat(el.value) : fallback;
|
||||
};
|
||||
|
||||
const cev = getVal('preheat-cev');
|
||||
const thickness = getVal('preheat-thickness');
|
||||
const ambient = getVal('preheat-ambient', 20);
|
||||
|
||||
if (cev < 0 || cev > 2) {
|
||||
const resultEl = document.getElementById('preheat-result');
|
||||
if (resultEl) resultEl.innerHTML = '<div class="alert alert-error">⚠️ CEV inválido. Use valores entre 0 e 2.</div>';
|
||||
return;
|
||||
}
|
||||
if (thickness <= 0 || thickness > 300) {
|
||||
const resultEl = document.getElementById('preheat-result');
|
||||
if (resultEl) resultEl.innerHTML = '<div class="alert alert-error">⚠️ Espessura inválida. Use valores entre 1mm e 300mm.</div>';
|
||||
return;
|
||||
}
|
||||
if (ambient < -50 || ambient > 60) {
|
||||
const resultEl = document.getElementById('preheat-result');
|
||||
if (resultEl) resultEl.innerHTML = '<div class="alert alert-error">⚠️ Temperatura ambiente inválida. Use valores entre -50°C e 60°C.</div>';
|
||||
return;
|
||||
}
|
||||
|
||||
const preheatTemp = 50 + (cev * 100) + (thickness / 10 * 20) + ((20 - ambient) / 2);
|
||||
const maxInterpass = preheatTemp + 100;
|
||||
@@ -10858,4 +10966,7 @@ console.log('✅ SteelBase carregado com sucesso!');
|
||||
});
|
||||
|
||||
// Removido: listener de fechamento do modal Admin legado
|
||||
});
|
||||
})();
|
||||
|
||||
// Export for external use
|
||||
export { appState, userPreferences, loadPreferences, savePreferences, adminConfig, Logger };
|
||||
Reference in New Issue
Block a user