Check out this Pen I made!
***<!DOCTYPE html>
Cadastro de Produção PCP - Paris Atacado
<br>
:root { --bg: #0d1117; --card: #161b22; --border: #30363d; --text: #c9d1d9; --blue: #58a6ff; --green: #238636; --red: #da3633; }<br>
body { font-family: 'Segoe UI', sans-serif; background: var(--bg); color: var(--text); margin: 0; padding: 20px; display: flex; gap: 20px; }</p>
<div class="highlight"><pre class="highlight plaintext"><code> / Formulário Lateral */
.sidebar { width: 350px; background: var(--card); padding: 20px; border-radius: 8px; border: 1px solid var(--border); height: fit-content; position: sticky; top: 20px; }
h3 { color: var(--blue); margin-top: 0; text-align: center; }
.form-group { margin-bottom: 12px; }
label { display: block; font-size: 0.8rem; margin-bottom: 5px; color: #8b949e; }
input, select { width: 100%; padding: 10px; background: var(--bg); border: 1px solid var(--border); color: var(--text); border-radius: 5px; box-sizing: border-box; }
.btn-group { display: flex; flex-direction: column; gap: 10px; margin-top: 20px; }
button { cursor: pointer; border: none; border-radius: 5px; padding: 12px; font-weight: bold; color: white; transition: 0.3s; }
.btn-add { background: var(--green); }
.btn-export { background: #21262d; border: 1px solid var(--border); }
.btn-clear { background: var(--red); font-size: 0.7rem; opacity: 0.7; }
button:hover { filter: brightness(1.2); }
/* Área de Dados e Gráficos */
.main-content { flex: 1; display: flex; flex-direction: column; gap: 20px; }
.dash-row { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; }
.card { background: var(--card); padding: 20px; border-radius: 8px; border: 1px solid var(--border); }
table { width: 100%; border-collapse: collapse; font-size: 0.8rem; }
th { background: #21262d; color: var(--blue); text-align: left; padding: 12px; border-bottom: 2px solid var(--border); }
td { padding: 10px; border-bottom: 1px solid var(--border); }
.status-badge { padding: 4px 8px; border-radius: 12px; font-size: 0.7rem; font-weight: bold; }
</style>
</code></pre></div>
<p></head><br>
<body></p>
<div class="highlight"><pre class="highlight plaintext"><code><div class="sidebar">
<h3>📝 Cadastro PCP</h3>
<div class="form-group"><label>Nº Lote:</label><input type="text" id="lote" placeholder="Ex: 2654"></div>
<div class="form-group">
<label>Produto / SKU:</label>
<select id="sku">
<option value="T-Shirt Basic">T-Shirt Basic</option>
<option value="Cropped Ribana">Cropped Ribana</option>
<option value="Plus Size Max">Plus Size Max</option>
<option value="Short Saia">Short Saia</option>
</select>
</div>
<div class="form-group"><label>Quantidade:</label><input type="number" id="qtd" placeholder="0"></div>
<div class="form-group">
<label>Oficina / Fornecedor:</label>
<select id="oficina">
<option value="Monica Costura">Monica Costura</option>
<option value="Jaquelin Costura">Jaquelin Costura</option>
<option value="JS Estamparia">JS Estamparia</option>
<option value="Tiago Corte">Tiago Corte</option>
</select>
</div>
<div class="form-group">
<label>Status:</label>
<select id="status">
<option value="Corte">Em Corte</option>
<option value="Costura">Em Costura</option>
<option value="Loja">Aguardando Loja</option>
<option value="Delay">Atraso (Delay)</option>
</select>
</div>
<div class="form-group"><label>Data Prevista:</label><input type="date" id="data"></div>
&lt;div class="btn-group"&gt;
&lt;button class="btn-add" onclick="adicionarLote()"&gt;Salvar Lote&lt;/button&gt;
&lt;button class="btn-export" onclick="exportarCSV()"&gt;📥 Exportar para Excel (.csv)&lt;/button&gt;
&lt;button class="btn-clear" onclick="limparTudo()"&gt;Limpar Todo o Banco&lt;/button&gt;
&lt;/div&gt;
</div>
<div class="main-content">
<div class="dash-row">
<div class="card"><h3>Carga por Oficina</h3><canvas id="chartOficina"></canvas></div>
<div class="card"><h3>Mix de Categoria</h3><canvas id="chartMix"></canvas></div>
</div>
&lt;div class="card"&gt;
&lt;h3&gt;📋 Tabela de Produção Real-Time&lt;/h3&gt;
&lt;table id="tabelaPcp"&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Lote&lt;/th&gt;
&lt;th&gt;Produto&lt;/th&gt;
&lt;th&gt;Qtd&lt;/th&gt;
&lt;th&gt;Oficina&lt;/th&gt;
&lt;th&gt;Data&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody id="listaLotes"&gt;&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
</div>
<script>
let registros = JSON.parse(localStorage.getItem('paris_pcp_db')) || [];
let chart1, chart2;
function init() {
renderCharts();
atualizarTela();
}
function adicionarLote() {
const novo = {
lote: document.getElementById('lote').value,
sku: document.getElementById('sku').value,
qtd: parseInt(document.getElementById('qtd').value) || 0,
oficina: document.getElementById('oficina').value,
status: document.getElementById('status').value,
data: document.getElementById('data').value
};
if(!novo.lote || !novo.qtd) return alert("Preencha Lote e Quantidade!");
registros.push(novo);
localStorage.setItem('paris_pcp_db', JSON.stringify(registros));
atualizarTela();
document.getElementById('lote').value = '';
document.getElementById('qtd').value = '';
}
function atualizarTela() {
const lista = document.getElementById('listaLotes');
lista.innerHTML = '';
let dadosOficina = {};
let dadosMix = {};
registros.forEach(r =&gt; {
lista.innerHTML += `
&lt;tr&gt;
&lt;td&gt;#${r.lote}&lt;/td&gt;
&lt;td&gt;${r.sku}&lt;/td&gt;
&lt;td&gt;${r.qtd}&lt;/td&gt;
&lt;td&gt;${r.oficina}&lt;/td&gt;
&lt;td&gt;${r.data}&lt;/td&gt;
&lt;td&gt;&lt;span class="status-badge" style="background:${r.status === 'Delay' ? '#da3633' : '#238636'}"&gt;${r.status}&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;`;
dadosOficina[r.oficina] = (dadosOficina[r.oficina] || 0) + r.qtd;
dadosMix[r.sku] = (dadosMix[r.sku] || 0) + r.qtd;
});
chart1.data.labels = Object.keys(dadosOficina);
chart1.data.datasets[0].data = Object.values(dadosOficina);
chart1.update();
chart2.data.labels = Object.keys(dadosMix);
chart2.data.datasets[0].data = Object.values(dadosMix);
chart2.update();
}
function renderCharts() {
Chart.defaults.color = '#8b949e';
chart1 = new Chart(document.getElementById('chartOficina'), {
type: 'bar',
data: { labels: [], datasets: [{ label: 'Peças', data: [], backgroundColor: '#58a6ff' }] }
});
chart2 = new Chart(document.getElementById('chartMix'), {
type: 'doughnut',
data: { labels: [], datasets: [{ data: [], backgroundColor: ['#238636', '#8957e5', '#d29922', '#1f6feb'] }] }
});
}
function exportarCSV() {
let csv = "\uFEFFLote;Produto;Quantidade;Oficina;Data;Status\n";
registros.forEach(r =&gt; {
csv += `${r.lote};${r.sku};${r.qtd};${r.oficina};${r.data};${r.status}\n`;
});
const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });
const link = document.createElement("a");
link.href = URL.createObjectURL(blob);
link.download = "producao_paris_atacado.csv";
link.click();
}
function limparTudo() {
if(confirm("Apagar tudo?")) {
localStorage.clear();
registros = [];
atualizarTela();
}
}
window.onload = init;
</script>
</code></pre></div>
<p></body><br>
</html></p>
Top comments (0)