📊

Contratos Faturados por Item

INSTALE TECNOLOGIA · INSTECH TECNOLOGIA
Total de Itens
—
Valor Total
—
Itens Ăšnicos
—
Ticket Médio
—

🔍 Filtros

đź“‹ Detalhamento por Item

—
Empresa ⇅ Cliente ⇅ Pedido ⇅ Data ⇅ Código ⇅ Item ⇅ Categoria ⇅ Departamento ⇅ Qtd ⇅ Vlr Unit. ⇅ Vlr Total ⇅
let DADOS = []; let sortField = 'data_faturamento'; let sortAsc = false; const PER_PAGE = 50; let currentPage = 1; async function carregarDados() { try { const resp = await fetch('data/contratos_faturados_completo.json'); const json = await resp.json(); DADOS = json.itens || json.items || json; const st = document.getElementById('stat-total'); if(st) st.textContent = DADOS.length; initApp(); } catch(e) { console.error('Erro ao carregar dados:', e); const tbody = document.querySelector('tbody'); if (tbody) tbody.innerHTML = 'Erro: ' + e.message + ''; } } function initApp() { // Populate client filter const clienteSelect = document.getElementById('filtro-cliente'); if (clienteSelect) { const uniqueClientes = [...new Set(DADOS.map(i => i.cliente || ''))].filter(Boolean).sort(); uniqueClientes.forEach(c => { const opt = document.createElement('option'); opt.value = c; opt.textContent = c.length > 40 ? c.substring(0, 40) + '...' : c; clienteSelect.appendChild(opt); }); } // Populate item filter const itemSelect = document.getElementById('filtro-item'); if (itemSelect) { const uniqueItems = [...new Set(DADOS.map(i => i.item_descricao))].filter(Boolean).sort(); uniqueItems.forEach(item => { const opt = document.createElement('option'); opt.value = item; opt.textContent = item.length > 50 ? item.substring(0, 50) + '...' : item; itemSelect.appendChild(opt); }); } aplicarFiltros(); } function aplicarFiltros() { const empresa = document.getElementById('filtro-empresa').value; const cliente = document.getElementById('filtro-cliente').value; const dataIni = document.getElementById('filtro-data-ini').value; const dataFim = document.getElementById('filtro-data-fim').value; const item = document.getElementById('filtro-item').value; const categoria = document.getElementById('filtro-categoria').value; const depto = document.getElementById('filtro-depto').value; filtrados = DADOS.filter(i => { if (empresa && i.empresa !== empresa) return false; if (cliente && (i.cliente || '') !== cliente) return false; if (item && i.item_descricao !== item) return false; if (categoria && i.categoria_nome !== categoria) return false; if (depto && i.departamento_nome !== depto) return false; if (dataIni || dataFim) { const d = parseDate(i.data_faturamento); if (!d) return false; if (dataIni && d < new Date(dataIni)) return false; if (dataFim && d > new Date(dataFim + 'T23:59:59')) return false; } return true; }); currentPage = 1; sortData(); render(); } function limparFiltros() { document.getElementById('filtro-empresa').value = ''; document.getElementById('filtro-cliente').value = ''; document.getElementById('filtro-data-ini').value = ''; document.getElementById('filtro-data-fim').value = ''; document.getElementById('filtro-item').value = ''; document.getElementById('filtro-categoria').value = ''; document.getElementById('filtro-depto').value = ''; filtrados = [...DADOS]; currentPage = 1; sortData(); render(); } function sortBy(field) { if (sortField === field) { sortAsc = !sortAsc; } else { sortField = field; sortAsc = true; } sortData(); render(); } function sortData() { filtrados.sort((a, b) => { let va = a[sortField] ?? ''; let vb = b[sortField] ?? ''; // Numeric sort if (typeof va === 'number') return sortAsc ? va - vb : vb - va; // Date sort if (sortField === 'data_faturamento') { const da = parseDate(va); const db = parseDate(vb); if (da && db) return sortAsc ? da - db : db - da; } // String sort va = String(va).toLowerCase(); vb = String(vb).toLowerCase(); return sortAsc ? va.localeCompare(vb) : vb.localeCompare(va); }); } function render() { // Stats const totalItens = filtrados.length; const valorTotal = filtrados.reduce((s, i) => s + (i.valor_total || 0), 0); const unicos = new Set(filtrados.map(i => i.item_descricao)).size; const ticket = totalItens > 0 ? valorTotal / totalItens : 0; document.getElementById('stat-total').textContent = formatNumber(totalItens); document.getElementById('stat-valor').textContent = formatCurrency(valorTotal); document.getElementById('stat-unicos').textContent = formatNumber(unicos); document.getElementById('stat-ticket').textContent = formatCurrency(ticket); document.getElementById('table-count').textContent = totalItens + ' registros'; // Table const start = (currentPage - 1) * PER_PAGE; const pageData = filtrados.slice(start, start + PER_PAGE); const tbody = document.getElementById('table-body'); tbody.innerHTML = pageData.map(i => ` ${i.empresa} ${i.cliente ? (i.cliente.length > 25 ? i.cliente.substring(0,25)+'...' : i.cliente) : '—'} ${i.numero_pedido} ${i.data_faturamento || '—'} ${i.item_codigo} ${i.item_descricao ? (i.item_descricao.length > 40 ? i.item_descricao.substring(0,40)+'...' : i.item_descricao) : '—'} ${i.categoria_nome || '—'} ${i.departamento_nome ? (i.departamento_nome.length > 25 ? i.departamento_nome.substring(0,25)+'...' : i.departamento_nome) : '—'} ${formatNumber(i.quantidade)} ${formatCurrency(i.valor_unitario)} ${formatCurrency(i.valor_total)} `).join(''); // Pagination const totalPages = Math.ceil(filtrados.length / PER_PAGE); const pag = document.getElementById('pagination'); if (totalPages <= 1) { pag.innerHTML = ''; return; } let pagHtml = ''; pagHtml += ``; const maxButtons = 7; let startPage = Math.max(1, currentPage - Math.floor(maxButtons/2)); let endPage = Math.min(totalPages, startPage + maxButtons - 1); if (endPage - startPage < maxButtons - 1) startPage = Math.max(1, endPage - maxButtons + 1); for (let p = startPage; p <= endPage; p++) { pagHtml += ``; } pagHtml += ``; pagHtml += `${currentPage}/${totalPages}`; pag.innerHTML = pagHtml; } function goPage(p) { const totalPages = Math.ceil(filtrados.length / PER_PAGE); if (p < 1 || p > totalPages) return; currentPage = p; render(); } function exportarCSV() { const headers = ['Empresa','Cliente','Pedido','Data','Código Item','Descrição','Categoria','Departamento','Qtd','Vlr Unitário','Vlr Total']; const rows = filtrados.map(i => [ i.empresa, `"${(i.cliente||'').replace(/"/g,'""')}"`, i.numero_pedido, i.data_faturamento, i.item_codigo, `"${(i.item_descricao||'').replace(/"/g,'""')}"`, `"${(i.categoria_nome||'').replace(/"/g,'""')}"`, `"${(i.departamento_nome||'').replace(/"/g,'""')}"`, i.quantidade, i.valor_unitario, i.valor_total ]); let csv = headers.join(';') + '\n'; rows.forEach(r => csv += r.join(';') + '\n'); const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = 'contratos_faturados_' + new Date().toISOString().slice(0,10) + '.csv'; a.click(); URL.revokeObjectURL(url); } // Init sortData(); render(); document.addEventListener('DOMContentLoaded', carregarDados);