Call audio video jitsi #41

Merged
deyvisonwanderley merged 11 commits from call-audio-video-jitsi into master 2025-11-23 18:11:29 +00:00
11 changed files with 2679 additions and 694 deletions
Showing only changes of commit 1ad0ee91cb - Show all commits

View File

@@ -34,7 +34,7 @@
? 'bg-red-50 border-red-200 text-red-700 dark:bg-red-900/20 dark:border-red-800 dark:text-red-400' ? 'bg-red-50 border-red-200 text-red-700 dark:bg-red-900/20 dark:border-red-800 dark:text-red-400'
: 'bg-green-50 border-green-200 text-green-700 dark:bg-green-900/20 dark:border-green-800 dark:text-green-400' : 'bg-green-50 border-green-200 text-green-700 dark:bg-green-900/20 dark:border-green-800 dark:text-green-400'
}"> }">
<span class="font-bold">+{trabalhado.horas}h {trabalhado.minutos}min</span> <span class="font-bold text-green-600 dark:text-green-400">+{trabalhado.horas}h {trabalhado.minutos}min</span>
<span class="text-base-content/50">/</span> <span class="text-base-content/50">/</span>
<span class={isNegativo ? 'text-red-600 dark:text-red-400' : 'text-green-600 dark:text-green-400'}> <span class={isNegativo ? 'text-red-600 dark:text-red-400' : 'text-green-600 dark:text-green-400'}>
{sinalDiferenca}{diferenca.horas}h {diferenca.minutos}min {sinalDiferenca}{diferenca.horas}h {diferenca.minutos}min

View File

@@ -1496,9 +1496,12 @@
saldoDiarioTotalDiferencaMinutos = -saldoDiarioTotalEsperadoMinutos; // Diferença negativa (0 - esperado) saldoDiarioTotalDiferencaMinutos = -saldoDiarioTotalEsperadoMinutos; // Diferença negativa (0 - esperado)
} }
// Calcular diferença corretamente: trabalhado - esperado (não somar diferenças dos pares)
const diferencaDiariaCorrigida = saldoDiarioTotalTrabalhadoMinutos - saldoDiarioTotalEsperadoMinutos;
// Armazenar saldo diário completo (usado no resumo do banco de horas) // Armazenar saldo diário completo (usado no resumo do banco de horas)
saldosDiariosPorData[data] = { saldosDiariosPorData[data] = {
diferencaMinutos: saldoDiarioTotalDiferencaMinutos, diferencaMinutos: diferencaDiariaCorrigida,
trabalhadoMinutos: saldoDiarioTotalTrabalhadoMinutos, trabalhadoMinutos: saldoDiarioTotalTrabalhadoMinutos,
esperadoMinutos: saldoDiarioTotalEsperadoMinutos esperadoMinutos: saldoDiarioTotalEsperadoMinutos
}; };
@@ -1921,7 +1924,6 @@
const cargaHorariaDiariaEsperadaMinutos = minutosPar1EsperadoAjustadoConfig + minutosPar2EsperadoAjustadoConfig; const cargaHorariaDiariaEsperadaMinutos = minutosPar1EsperadoAjustadoConfig + minutosPar2EsperadoAjustadoConfig;
// Calcular saldos do período selecionado baseado nos saldos diários calculados // Calcular saldos do período selecionado baseado nos saldos diários calculados
let saldoPeriodoDiferencaMinutos = 0;
let saldoPeriodoTrabalhadoMinutos = 0; let saldoPeriodoTrabalhadoMinutos = 0;
let diasComSaldoPositivo = 0; let diasComSaldoPositivo = 0;
let diasComSaldoNegativo = 0; let diasComSaldoNegativo = 0;
@@ -1930,12 +1932,14 @@
if (sections.registrosPonto && Object.keys(saldosDiariosPorData).length > 0) { if (sections.registrosPonto && Object.keys(saldosDiariosPorData).length > 0) {
// Somar todos os saldos diários do período // Somar todos os saldos diários do período
for (const saldo of Object.values(saldosDiariosPorData)) { for (const saldo of Object.values(saldosDiariosPorData)) {
saldoPeriodoDiferencaMinutos += saldo.diferencaMinutos;
saldoPeriodoTrabalhadoMinutos += saldo.trabalhadoMinutos; saldoPeriodoTrabalhadoMinutos += saldo.trabalhadoMinutos;
if (saldo.diferencaMinutos > 0) { // Calcular diferença diária corretamente: trabalhado - esperado
const diferencaDiaria = saldo.trabalhadoMinutos - saldo.esperadoMinutos;
if (diferencaDiaria > 0) {
diasComSaldoPositivo++; diasComSaldoPositivo++;
} else if (saldo.diferencaMinutos < 0) { } else if (diferencaDiaria < 0) {
diasComSaldoNegativo++; diasComSaldoNegativo++;
} }
@@ -1962,15 +1966,22 @@
for (const regs of Object.values(registrosPorDataPeriodo)) { for (const regs of Object.values(registrosPorDataPeriodo)) {
const saldoDiario = calcularSaldoDiario(regs); const saldoDiario = calcularSaldoDiario(regs);
if (saldoDiario) { if (saldoDiario) {
saldoPeriodoDiferencaMinutos += saldoDiario.saldoMinutos;
saldoPeriodoTrabalhadoMinutos += saldoDiario.saldoMinutos; saldoPeriodoTrabalhadoMinutos += saldoDiario.saldoMinutos;
} }
} }
} }
// Calcular saldo esperado do período: carga horária diária × número de dias // Calcular saldo esperado do período: carga horária diária × número de dias
// SEMPRE calcular diretamente, não somar saldos diários esperados (pode duplicar)
const saldoPeriodoEsperadoMinutos = cargaHorariaDiariaEsperadaMinutos * totalDiasPeriodo; const saldoPeriodoEsperadoMinutos = cargaHorariaDiariaEsperadaMinutos * totalDiasPeriodo;
// Calcular diferença do período corretamente: trabalhado - esperado (para "Saldo do Período Exibido")
const saldoPeriodoDiferencaMinutos = saldoPeriodoTrabalhadoMinutos - saldoPeriodoEsperadoMinutos;
// Calcular diferença do período (trabalhado - esperado) para exibição na linha "Diferença do Período"
// Negativo quando trabalhado < esperado (vermelho), positivo quando trabalhado > esperado (verde)
const diferencaPeriodoTrabalhadoMenosEsperado = saldoPeriodoTrabalhadoMinutos - saldoPeriodoEsperadoMinutos;
// Calcular médias diárias // Calcular médias diárias
const mediaDiariaTrabalhadaHoras = totalDiasPeriodo > 0 ? Math.floor(saldoPeriodoTrabalhadoMinutos / 60 / totalDiasPeriodo) : 0; const mediaDiariaTrabalhadaHoras = totalDiasPeriodo > 0 ? Math.floor(saldoPeriodoTrabalhadoMinutos / 60 / totalDiasPeriodo) : 0;
const mediaDiariaTrabalhadaMinutos = totalDiasPeriodo > 0 ? Math.floor((saldoPeriodoTrabalhadoMinutos / totalDiasPeriodo) % 60) : 0; const mediaDiariaTrabalhadaMinutos = totalDiasPeriodo > 0 ? Math.floor((saldoPeriodoTrabalhadoMinutos / totalDiasPeriodo) % 60) : 0;
@@ -1994,11 +2005,19 @@
const mediaDiariaEsperadaMinutos = totalEsperadoDiarioMinutos % 60; const mediaDiariaEsperadaMinutos = totalEsperadoDiarioMinutos % 60;
// Formatar valores // Formatar valores
// Saldo do Período Exibido: diferença (trabalhado - esperado)
const horasPeriodoDiferenca = Math.floor(Math.abs(saldoPeriodoDiferencaMinutos) / 60); const horasPeriodoDiferenca = Math.floor(Math.abs(saldoPeriodoDiferencaMinutos) / 60);
const minutosPeriodoDiferenca = Math.abs(saldoPeriodoDiferencaMinutos) % 60; const minutosPeriodoDiferenca = Math.abs(saldoPeriodoDiferencaMinutos) % 60;
const sinalPeriodoDiferenca = saldoPeriodoDiferencaMinutos >= 0 ? '+' : '-'; const sinalPeriodoDiferenca = saldoPeriodoDiferencaMinutos >= 0 ? '+' : '-';
const saldoPeriodoDiferencaFormatado = `${sinalPeriodoDiferenca}${horasPeriodoDiferenca}h ${minutosPeriodoDiferenca}min`; const saldoPeriodoDiferencaFormatado = `${sinalPeriodoDiferenca}${horasPeriodoDiferenca}h ${minutosPeriodoDiferenca}min`;
// Diferença do Período: trabalhado - esperado
// Negativo quando trabalhado < esperado (vermelho), positivo quando trabalhado > esperado (verde)
const horasDiferencaPeriodo = Math.floor(Math.abs(diferencaPeriodoTrabalhadoMenosEsperado) / 60);
const minutosDiferencaPeriodo = Math.abs(diferencaPeriodoTrabalhadoMenosEsperado) % 60;
const sinalDiferencaPeriodo = diferencaPeriodoTrabalhadoMenosEsperado >= 0 ? '+' : '-';
const diferencaPeriodoFormatado = `${sinalDiferencaPeriodo}${horasDiferencaPeriodo}h ${minutosDiferencaPeriodo}min`;
const horasPeriodoTrabalhado = Math.floor(saldoPeriodoTrabalhadoMinutos / 60); const horasPeriodoTrabalhado = Math.floor(saldoPeriodoTrabalhadoMinutos / 60);
const minutosPeriodoTrabalhado = saldoPeriodoTrabalhadoMinutos % 60; const minutosPeriodoTrabalhado = saldoPeriodoTrabalhadoMinutos % 60;
const saldoPeriodoTrabalhadoFormatado = `+${horasPeriodoTrabalhado}h ${minutosPeriodoTrabalhado}min`; const saldoPeriodoTrabalhadoFormatado = `+${horasPeriodoTrabalhado}h ${minutosPeriodoTrabalhado}min`;
@@ -2049,7 +2068,7 @@
bancoHorasData.push(['', '']); // Linha separadora bancoHorasData.push(['', '']); // Linha separadora
bancoHorasData.push(['Saldo Trabalhado do Período', saldoPeriodoTrabalhadoFormatado]); bancoHorasData.push(['Saldo Trabalhado do Período', saldoPeriodoTrabalhadoFormatado]);
bancoHorasData.push(['Saldo Esperado do Período', saldoPeriodoEsperadoFormatado]); bancoHorasData.push(['Saldo Esperado do Período', saldoPeriodoEsperadoFormatado]);
bancoHorasData.push(['Diferença do Período', saldoPeriodoDiferencaFormatado]); bancoHorasData.push(['Diferença do Período', diferencaPeriodoFormatado]);
// Adicionar estatísticas // Adicionar estatísticas
bancoHorasData.push(['', '']); // Linha separadora bancoHorasData.push(['', '']); // Linha separadora
@@ -2105,11 +2124,14 @@
} }
} else if (valor.includes('+') || campo.includes('Trabalhado') || campo.includes('Esperado')) { } else if (valor.includes('+') || campo.includes('Trabalhado') || campo.includes('Esperado')) {
// Verde para valores positivos ou campos de trabalhado/esperado // Verde para valores positivos ou campos de trabalhado/esperado
if (campo.includes('Diferença') && saldoPeriodoDiferencaMinutos < 0) { if (campo.includes('Diferença do Período')) {
data.cell.styles.textColor = [200, 0, 0]; // Vermelho se diferença negativa // Diferença do Período: trabalhado - esperado
data.cell.styles.fontStyle = 'bold'; // Negativo quando trabalhado < esperado (vermelho), positivo quando trabalhado > esperado (verde)
} else if (campo.includes('Diferença') && saldoPeriodoDiferencaMinutos > 0) { if (diferencaPeriodoTrabalhadoMenosEsperado < 0) {
data.cell.styles.textColor = [0, 128, 0]; // Verde se diferença positiva data.cell.styles.textColor = [200, 0, 0]; // Vermelho quando trabalhado < esperado
} else if (diferencaPeriodoTrabalhadoMenosEsperado > 0) {
data.cell.styles.textColor = [0, 128, 0]; // Verde quando trabalhado > esperado
}
data.cell.styles.fontStyle = 'bold'; data.cell.styles.fontStyle = 'bold';
} else if (campo.includes('Trabalhado') || campo.includes('Esperado')) { } else if (campo.includes('Trabalhado') || campo.includes('Esperado')) {
data.cell.styles.textColor = [0, 128, 0]; // Verde para trabalhado/esperado data.cell.styles.textColor = [0, 128, 0]; // Verde para trabalhado/esperado
@@ -2226,6 +2248,20 @@
theme: 'grid', theme: 'grid',
headStyles: { fillColor: [41, 128, 185], fontStyle: 'bold' }, headStyles: { fillColor: [41, 128, 185], fontStyle: 'bold' },
styles: { fontSize: 9 }, styles: { fontSize: 9 },
columnStyles: {
0: { cellWidth: 30 }, // Data
1: { cellWidth: 40 }, // Tipo
2: { cellWidth: 50, cellPadding: { top: 2, bottom: 2, left: 2, right: 2 } }, // Detalhes - maior largura
3: { cellWidth: 40 }, // Motivo
4: { cellWidth: 'auto' }, // Observações
},
didParseCell: function(data) {
// Permitir quebra de linha na coluna Detalhes (índice 2)
if (data.column.index === 2) {
data.cell.styles.overflow = 'linebreak';
data.cell.styles.cellWidth = 50;
}
},
}); });
const lastPage = doc.getNumberOfPages(); const lastPage = doc.getNumberOfPages();