2025-04-09 09:20:07 -03:00
|
|
|
// Função para converter data DD/MM/YYYY para objeto Date
|
|
|
|
|
function converterDataParaComparacao(dataStr) {
|
|
|
|
|
console.log('Convertendo data para comparação:', dataStr);
|
|
|
|
|
|
|
|
|
|
if (!dataStr) return null;
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
// Se já estiver no formato ISO
|
|
|
|
|
if (/^\d{4}-\d{2}-\d{2}/.test(dataStr)) {
|
|
|
|
|
const data = new Date(dataStr);
|
|
|
|
|
console.log('Data ISO convertida:', data);
|
|
|
|
|
return data;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Se estiver no formato DD/MM/YYYY
|
|
|
|
|
if (/^\d{2}\/\d{2}\/\d{4}/.test(dataStr)) {
|
|
|
|
|
const [dia, mes, ano] = dataStr.split('/').map(Number);
|
|
|
|
|
const data = new Date(ano, mes - 1, dia);
|
|
|
|
|
console.log('Data DD/MM/YYYY convertida:', data);
|
|
|
|
|
return data;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
console.warn('Formato de data não reconhecido:', dataStr);
|
|
|
|
|
return null;
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.error('Erro ao converter data:', error, 'Data:', dataStr);
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Função para ordenar tabelas
|
|
|
|
|
function configurarOrdenacaoTabela(tabelaId) {
|
|
|
|
|
console.log('Configurando ordenação para tabela:', tabelaId);
|
|
|
|
|
|
|
|
|
|
const table = document.getElementById(tabelaId);
|
|
|
|
|
if (!table) {
|
|
|
|
|
console.warn('Tabela não encontrada:', tabelaId);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const headers = table.querySelectorAll('th[data-sort]');
|
|
|
|
|
headers.forEach(header => {
|
|
|
|
|
if (header.dataset.sort) {
|
|
|
|
|
header.addEventListener('click', () => {
|
|
|
|
|
const column = header.dataset.sort;
|
|
|
|
|
const tbody = table.getElementsByTagName('tbody')[0];
|
|
|
|
|
const rows = Array.from(tbody.getElementsByTagName('tr'));
|
|
|
|
|
|
|
|
|
|
console.log('Ordenando coluna:', column);
|
|
|
|
|
|
|
|
|
|
rows.sort((a, b) => {
|
|
|
|
|
const aValue = a.querySelector(`td[data-${column}]`).dataset[column];
|
|
|
|
|
const bValue = b.querySelector(`td[data-${column}]`).dataset[column];
|
|
|
|
|
|
|
|
|
|
// Ordenação por data
|
|
|
|
|
if (column === 'data' ||
|
|
|
|
|
column === 'data_vencimento' ||
|
|
|
|
|
column === 'data_alteracao' ||
|
2025-04-15 18:30:41 -03:00
|
|
|
column === 'data_comprovante' ||
|
2025-04-09 09:20:07 -03:00
|
|
|
column === 'data_venda' ||
|
|
|
|
|
column === 'data_relatorio') {
|
|
|
|
|
const aDate = converterDataParaComparacao(aValue);
|
|
|
|
|
const bDate = converterDataParaComparacao(bValue);
|
|
|
|
|
|
|
|
|
|
// Se alguma data for inválida
|
|
|
|
|
if (!aDate && !bDate) return 0;
|
|
|
|
|
if (!aDate) return 1;
|
|
|
|
|
if (!bDate) return -1;
|
|
|
|
|
|
|
|
|
|
return aDate - bDate;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Ordenação por valor monetário
|
|
|
|
|
if (column === 'valor' ||
|
|
|
|
|
column === 'valor_total' ||
|
|
|
|
|
column === 'valor_antigo' ||
|
|
|
|
|
column === 'valor_novo') {
|
|
|
|
|
const aNum = parseFloat(aValue.replace(/[^\d,-]/g, '').replace(',', '.'));
|
|
|
|
|
const bNum = parseFloat(bValue.replace(/[^\d,-]/g, '').replace(',', '.'));
|
|
|
|
|
return aNum - bNum;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Ordenação padrão para texto
|
|
|
|
|
return aValue.localeCompare(bValue);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Alternar direção da ordenação
|
|
|
|
|
if (header.classList.contains('asc')) {
|
|
|
|
|
rows.reverse();
|
|
|
|
|
header.classList.remove('asc');
|
|
|
|
|
header.classList.add('desc');
|
|
|
|
|
console.log('Ordenação descendente');
|
|
|
|
|
} else {
|
|
|
|
|
header.classList.remove('desc');
|
|
|
|
|
header.classList.add('asc');
|
|
|
|
|
console.log('Ordenação ascendente');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Atualizar tabela
|
|
|
|
|
tbody.innerHTML = '';
|
|
|
|
|
rows.forEach(row => tbody.appendChild(row));
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Configurar ordenação para todas as tabelas que precisam
|
|
|
|
|
document.addEventListener('DOMContentLoaded', function() {
|
|
|
|
|
console.log('Configurando ordenação para todas as tabelas...');
|
|
|
|
|
|
|
|
|
|
const tabelas = [
|
|
|
|
|
'materiaisTable',
|
|
|
|
|
'vendasTable',
|
|
|
|
|
'cotasTable',
|
2025-04-15 18:30:41 -03:00
|
|
|
'comprovantesTable'
|
2025-04-09 09:20:07 -03:00
|
|
|
];
|
|
|
|
|
|
|
|
|
|
tabelas.forEach(tabelaId => {
|
|
|
|
|
configurarOrdenacaoTabela(tabelaId);
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
document.addEventListener('DOMContentLoaded', function() {
|
|
|
|
|
console.log('Carregando script table_sort.js...');
|
|
|
|
|
|
|
|
|
|
// Função para comparar datas no formato DD/MM/YYYY
|
|
|
|
|
function compararDatas(a, b) {
|
|
|
|
|
if (!a || !b) return 0;
|
|
|
|
|
|
|
|
|
|
const [diaA, mesA, anoA] = a.split('/').map(Number);
|
|
|
|
|
const [diaB, mesB, anoB] = b.split('/').map(Number);
|
|
|
|
|
|
|
|
|
|
const dataA = new Date(anoA, mesA - 1, diaA);
|
|
|
|
|
const dataB = new Date(anoB, mesB - 1, diaB);
|
|
|
|
|
|
|
|
|
|
return dataA - dataB;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Função para comparar valores monetários
|
|
|
|
|
function compararValores(a, b) {
|
|
|
|
|
const valorA = parseFloat(a.replace('R$ ', '').replace('.', '').replace(',', '.'));
|
|
|
|
|
const valorB = parseFloat(b.replace('R$ ', '').replace('.', '').replace(',', '.'));
|
|
|
|
|
|
|
|
|
|
if (isNaN(valorA)) return -1;
|
|
|
|
|
if (isNaN(valorB)) return 1;
|
|
|
|
|
|
|
|
|
|
return valorA - valorB;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Configurar ordenação para todas as tabelas com classe 'table-sort'
|
|
|
|
|
document.querySelectorAll('table.table-sort').forEach(tabela => {
|
|
|
|
|
const tbody = tabela.querySelector('tbody');
|
|
|
|
|
const headers = tabela.querySelectorAll('th[data-sort]');
|
|
|
|
|
|
|
|
|
|
headers.forEach(header => {
|
|
|
|
|
const tipoOrdenacao = header.dataset.sort;
|
|
|
|
|
|
|
|
|
|
header.addEventListener('click', () => {
|
|
|
|
|
const rows = Array.from(tbody.querySelectorAll('tr'));
|
|
|
|
|
const colIndex = Array.from(header.parentNode.children).indexOf(header);
|
|
|
|
|
|
|
|
|
|
rows.sort((rowA, rowB) => {
|
|
|
|
|
const cellA = rowA.children[colIndex].dataset[tipoOrdenacao] || rowA.children[colIndex].textContent.trim();
|
|
|
|
|
const cellB = rowB.children[colIndex].dataset[tipoOrdenacao] || rowB.children[colIndex].textContent.trim();
|
|
|
|
|
|
|
|
|
|
switch (tipoOrdenacao) {
|
|
|
|
|
case 'data':
|
|
|
|
|
return compararDatas(cellA, cellB);
|
|
|
|
|
case 'valor':
|
|
|
|
|
return compararValores(cellA, cellB);
|
|
|
|
|
case 'numero':
|
|
|
|
|
return parseFloat(cellA) - parseFloat(cellB);
|
|
|
|
|
default:
|
|
|
|
|
return cellA.localeCompare(cellB);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
if (header.classList.contains('asc')) {
|
|
|
|
|
rows.reverse();
|
|
|
|
|
header.classList.remove('asc');
|
|
|
|
|
header.classList.add('desc');
|
|
|
|
|
} else {
|
|
|
|
|
header.classList.remove('desc');
|
|
|
|
|
header.classList.add('asc');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Remover classes de ordenação de outros headers
|
|
|
|
|
headers.forEach(h => {
|
|
|
|
|
if (h !== header) {
|
|
|
|
|
h.classList.remove('asc', 'desc');
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Atualizar tabela
|
|
|
|
|
tbody.innerHTML = '';
|
|
|
|
|
rows.forEach(row => tbody.appendChild(row));
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
});
|
2025-04-15 18:30:41 -03:00
|
|
|
});
|
|
|
|
|
|
|
|
|
|
function sortTable(table, column, type = 'text') {
|
|
|
|
|
// ... existing code ...
|
|
|
|
|
if (column === 'data_comprovante') {
|
|
|
|
|
// ... existing code ...
|
|
|
|
|
}
|
|
|
|
|
// ... existing code ...
|
|
|
|
|
}
|