Atestados & Licenças - Recursos Humanos

Atestados & Licenças

Registro de atestados médicos e licenças

{#if abaAtiva === 'dashboard'} {#if statsQuery?.data}
Atestados Ativos
{statsQuery.data.totalAtestadosAtivos}
Licenças Ativas
{statsQuery.data.totalLicencasAtivas}
Afastados Hoje
{statsQuery.data.funcionariosAfastadosHoje}
Dias no Mês
{statsQuery.data.totalDiasAfastamentoMes}
{/if}

Filtros

{#if eventosQuery?.data}
{/if} {#if graficosQuery?.data}

Funcionários Atualmente Afastados

{#if graficosQuery.data.funcionariosAfastados.length > 0}
{#each graficosQuery.data.funcionariosAfastados as item} {/each}
Funcionário Tipo Data Início Data Fim
{item.funcionarioNome} {item.tipo === 'atestado_medico' ? 'Atestado Médico' : item.tipo === 'declaracao_comparecimento' ? 'Declaração' : item.tipo === 'maternidade' ? 'Licença Maternidade' : item.tipo === 'paternidade' ? 'Licença Paternidade' : item.tipo} {formatarData(item.dataInicio)} {formatarData(item.dataFim)}
{:else}
Nenhum funcionário afastado no momento
{/if}
{/if}

Registros

{#each registrosFiltrados.atestados as atestado} {/each} {#each registrosFiltrados.licencas as licenca} {/each}
Funcionário Tipo Data Início Data Fim Dias Status Ações
{atestado.funcionario?.nome || '-'} {atestado.tipo === 'atestado_medico' ? 'Atestado Médico' : 'Declaração'} {formatarData(atestado.dataInicio)} {formatarData(atestado.dataFim)} {atestado.dias} {atestado.status === 'ativo' ? 'Ativo' : 'Finalizado'}
{#if atestado.documentoId} {/if}
{licenca.funcionario?.nome || '-'} Licença{' '} {licenca.tipo === 'maternidade' ? 'Maternidade' : 'Paternidade'} {licenca.ehProrrogacao ? ' (Prorrogação)' : ''} {formatarData(licenca.dataInicio)} {formatarData(licenca.dataFim)} {licenca.dias} {licenca.status === 'ativo' ? 'Ativo' : 'Finalizado'}
{#if licenca.documentoId} {/if}
{#if registrosFiltrados.atestados.length === 0 && registrosFiltrados.licencas.length === 0}
Nenhum registro encontrado
{/if}
{#if graficosQuery?.data} {@const dados = graficosQuery.data.totalDiasPorTipo} {@const maxDias = Math.max(...dados.map((d) => d.dias), 1)} {@const chartWidth = 800} {@const chartHeight = 350} {@const padding = { top: 20, right: 40, bottom: 80, left: 70 }} {@const barWidth = (chartWidth - padding.left - padding.right) / dados.length - 10} {@const innerHeight = chartHeight - padding.top - padding.bottom} {@const tendencias = graficosQuery.data.tendenciasMensais} {@const tipos = [ 'atestado_medico', 'declaracao_comparecimento', 'maternidade', 'paternidade', 'ferias' ]} {@const cores = ['#ef4444', '#f97316', '#ec4899', '#3b82f6', '#10b981']} {@const nomes = ['Atestado Médico', 'Declaração', 'Maternidade', 'Paternidade', 'Férias']} {@const maxValor = Math.max( ...tendencias.flatMap((t) => tipos.map((tipo) => t[tipo as keyof typeof t] as number)), 1 )} {@const chartWidth2 = 900} {@const chartHeight2 = 400} {@const padding2 = { top: 20, right: 40, bottom: 80, left: 70 }} {@const innerWidth = chartWidth2 - padding2.left - padding2.right} {@const innerHeight2 = chartHeight2 - padding2.top - padding2.bottom}

Total de Dias por Tipo

{#each [0, 1, 2, 3, 4, 5] as t} {@const val = Math.round((maxDias / 5) * t)} {@const y = chartHeight - padding.bottom - (val / maxDias) * innerHeight} {val} {/each} {#each dados as item, i} {@const x = padding.left + i * (barWidth + 10) + 5} {@const height = (item.dias / maxDias) * innerHeight} {@const y = chartHeight - padding.bottom - height} {@const colors = ['#ef4444', '#f97316', '#ec4899', '#3b82f6', '#10b981']} {#if item.dias > 0} {item.dias} {/if}
{item.tipo}
{/each}

Tendências Mensais (Últimos 6 Meses)

{#each [0, 1, 2, 3, 4, 5] as t} {@const val = Math.round((maxValor / 5) * t)} {@const y = chartHeight2 - padding2.bottom - (val / maxValor) * innerHeight2} {val} {/each} {#each tipos as tipo, tipoIdx} {@const cor = cores[tipoIdx]} {@const pontos = tendencias.map((t, i) => { const x = padding2.left + (i / (tendencias.length - 1 || 1)) * innerWidth; const valor = t[tipo as keyof typeof t] as number; const y = chartHeight2 - padding2.bottom - (valor / maxValor) * innerHeight2; return { x, y, valor }; })} {#if pontos.length > 0} {@const pathArea = `M ${pontos[0].x} ${chartHeight2 - padding2.bottom} ` + pontos.map((p) => `L ${p.x} ${p.y}`).join(' ') + ` L ${pontos[pontos.length - 1].x} ${chartHeight2 - padding2.bottom} Z`} {/if} {#if pontos.length > 1} `${p.x},${p.y}`).join(' ')} fill="none" stroke={cor} stroke-width="3" stroke-linecap="round" stroke-linejoin="round" /> {/if} {#each pontos as ponto, pontoIdx} {nomes[tipoIdx]}: {ponto.valor} dias em {tendencias[pontoIdx]?.mes || ''} {/each} {/each} {#each tendencias as t, i} {@const x = padding2.left + (i / (tendencias.length - 1 || 1)) * innerWidth}
{t.mes}
{/each}
{#each tipos as tipo, idx}
{nomes[idx]}
{/each}
{/if} {:else if abaAtiva === 'atestado'}

Registrar Atestado Médico

Data Início *
Data Fim *
CID *
{ atestadoMedico.documentoId = await handleDocumentoUpload(file); }} onRemove={async () => { atestadoMedico.documentoId = undefined; }} />
Observações
{:else if abaAtiva === 'declaracao'}

Registrar Declaração de Comparecimento

Data Início *
Data Fim *
{ declaracao.documentoId = await handleDocumentoUpload(file); }} onRemove={async () => { declaracao.documentoId = undefined; }} />
Observações
{:else if abaAtiva === 'maternidade'}

Registrar Licença Maternidade

Data Início *
Data Fim *
Calculado automaticamente (120 dias)
{#if licencaMaternidade.ehProrrogacao}
Licença Original *
{/if}
{ licencaMaternidade.documentoId = await handleDocumentoUpload(file); }} onRemove={async () => { licencaMaternidade.documentoId = undefined; }} />
Observações
{:else if abaAtiva === 'paternidade'}

Registrar Licença Paternidade

Data Início *
Data Fim *
Calculado automaticamente (20 dias)
{ licencaPaternidade.documentoId = await handleDocumentoUpload(file); }} onRemove={async () => { licencaPaternidade.documentoId = undefined; }} />
Observações
{:else if abaAtiva === 'relatorios'}

Imprimir Relatórios

{/if}
{ erroModal.aberto = false; }} />