refactor: enhance employee management with regime de trabalho integration

- Added regime de trabalho selection to employee forms for better categorization.
- Updated backend validation to include regime de trabalho options for employees.
- Enhanced employee data handling by integrating regime de trabalho into various components.
- Removed the print modal for financial data to streamline the employee profile interface.
- Improved overall code clarity and maintainability across multiple files.
This commit is contained in:
2025-11-11 16:10:08 -03:00
parent 3cc774d7df
commit 8a0a4552f7
12 changed files with 3213 additions and 1802 deletions

View File

@@ -25,7 +25,6 @@
let documentosUrls = $state<Record<string, string | null>>({});
let loading = $state(true);
let showPrintModal = $state(false);
let showPrintFinanceiro = $state(false);
async function load() {
try {
@@ -41,6 +40,9 @@
funcionario = data;
simbolo = data.simbolo;
if (simbolo) {
funcionario = { ...funcionario, simbolo };
}
cursos = data.cursos || [];
// Carregar URLs dos documentos
@@ -200,26 +202,6 @@
</svg>
Imprimir Ficha
</button>
<button
class="btn btn-info gap-2"
onclick={() => (showPrintFinanceiro = true)}
>
<svg
xmlns="http://www.w3.org/2000/svg"
class="h-5 w-5"
fill="none"
viewBox="0 0 24 24"
stroke="currentColor"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M12 8c-1.657 0-3 .895-3 2s1.343 2 3 2 3 .895 3 2-1.343 2-3 2m0-8c1.11 0 2.08.402 2.599 1M12 8V7m0 1v8m0 0v1m0-1c-1.11 0-2.08-.402-2.599-1M21 12a9 9 0 11-18 0 9 9 0 0118 0z"
/>
</svg>
Imprimir Dados Financeiros
</button>
</div>
</div>
</div>
@@ -904,138 +886,5 @@
<PrintModal {funcionario} onClose={() => (showPrintModal = false)} />
{/if}
<!-- Modal de Impressão Dados Financeiros -->
{#if showPrintFinanceiro && simbolo}
<dialog class="modal modal-open">
<div class="modal-box max-w-2xl">
<h3 class="font-bold text-2xl mb-6 border-b pb-3">
Dados Financeiros - {funcionario.nome}
</h3>
<div class="space-y-4 print:space-y-2" id="dados-financeiros-print">
<!-- Informações Básicas -->
<div class="grid grid-cols-2 gap-4">
<div>
<p class="text-sm font-semibold text-base-content/70">Nome</p>
<p class="text-lg">{funcionario.nome}</p>
</div>
<div>
<p class="text-sm font-semibold text-base-content/70">
Matrícula
</p>
<p class="text-lg">{funcionario.matricula || "N/A"}</p>
</div>
<div>
<p class="text-sm font-semibold text-base-content/70">CPF</p>
<p class="text-lg">{maskCPF(funcionario.cpf)}</p>
</div>
<div>
<p class="text-sm font-semibold text-base-content/70">
Data Admissão
</p>
<p class="text-lg">{funcionario.admissaoData || "N/A"}</p>
</div>
</div>
<div class="divider"></div>
<!-- Dados Financeiros -->
<div>
<h4 class="font-bold text-lg mb-3">Remuneração</h4>
<div class="space-y-2">
<div class="flex justify-between p-2 bg-base-200 rounded">
<span class="font-semibold">Símbolo:</span>
<span>{simbolo.nome}</span>
</div>
<div class="flex justify-between p-2 bg-base-200 rounded">
<span class="font-semibold">Tipo:</span>
<span
>{simbolo.tipo === "cargo_comissionado"
? "Cargo Comissionado"
: "Função Gratificada"}</span
>
</div>
{#if funcionario.simboloTipo === "cargo_comissionado"}
<div class="flex justify-between p-2 bg-info/10 rounded">
<span class="font-semibold">Vencimento:</span>
<span class="text-info font-bold">R$ {simbolo.vencValor}</span
>
</div>
<div class="flex justify-between p-2 bg-warning/10 rounded">
<span class="font-semibold">Representação:</span>
<span class="text-warning font-bold"
>R$ {simbolo.repValor}</span
>
</div>
{/if}
<div
class="flex justify-between p-3 bg-success/20 rounded border-2 border-success/40"
>
<span class="font-bold text-lg">TOTAL:</span>
<span class="text-success font-bold text-2xl"
>R$ {simbolo.valor}</span
>
</div>
</div>
</div>
{#if funcionario.contaBradescoNumero}
<div class="divider"></div>
<div>
<h4 class="font-bold text-lg mb-3">Dados Bancários</h4>
<div class="space-y-2">
<div class="flex justify-between p-2 bg-base-200 rounded">
<span class="font-semibold">Banco:</span>
<span>Bradesco</span>
</div>
<div class="flex justify-between p-2 bg-base-200 rounded">
<span class="font-semibold">Agência:</span>
<span>{funcionario.contaBradescoAgencia || "N/A"}</span>
</div>
<div class="flex justify-between p-2 bg-base-200 rounded">
<span class="font-semibold">Conta:</span>
<span
>{funcionario.contaBradescoNumero}{funcionario.contaBradescoDV
? `-${funcionario.contaBradescoDV}`
: ""}</span
>
</div>
</div>
</div>
{/if}
</div>
<div class="modal-action">
<button class="btn btn-primary gap-2" onclick={() => window.print()}>
<svg
xmlns="http://www.w3.org/2000/svg"
class="h-5 w-5"
fill="none"
viewBox="0 0 24 24"
stroke="currentColor"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M17 17h2a2 2 0 002-2v-4a2 2 0 00-2-2H5a2 2 0 00-2 2v4a2 2 0 002 2h2m2 4h6a2 2 0 002-2v-4a2 2 0 00-2-2H9a2 2 0 00-2 2v4a2 2 0 002 2zm8-12V5a2 2 0 00-2-2H9a2 2 0 00-2 2v4h10z"
/>
</svg>
Imprimir
</button>
<button
class="btn btn-ghost"
onclick={() => (showPrintFinanceiro = false)}>Fechar</button
>
</div>
</div>
<form method="dialog" class="modal-backdrop">
<button
type="button"
onclick={() => (showPrintFinanceiro = false)}
aria-label="Fechar modal">Fechar</button
>
</form>
</dialog>
{/if}
<!-- Modal de Impressão Dados Financeiros removido -->
{/if}

View File

@@ -84,6 +84,14 @@
let pertenceOrgaoPublico = $state(false);
let orgaoOrigem = $state("");
let aposentado = $state("nao");
let regimeTrabalho = $state("estatutario_pe");
const REGIME_TRABALHO_OPTIONS = [
{ value: "clt", label: "CLT" },
{ value: "estatutario_municipal", label: "Estatutário Municipal" },
{ value: "estatutario_pe", label: "Estatutário PE" },
{ value: "estatutario_federal", label: "Estatutário Federal" }
] as const;
// Dados Bancários
let contaBradescoNumero = $state("");
@@ -176,6 +184,7 @@
pertenceOrgaoPublico = func.pertenceOrgaoPublico || false;
orgaoOrigem = func.orgaoOrigem || "";
aposentado = func.aposentado || "nao";
regimeTrabalho = func.regimeTrabalho || "estatutario_pe";
contaBradescoNumero = func.contaBradescoNumero || "";
contaBradescoDV = func.contaBradescoDV || "";
@@ -372,6 +381,7 @@
contaBradescoNumero: contaBradescoNumero || undefined,
contaBradescoDV: contaBradescoDV || undefined,
contaBradescoAgencia: contaBradescoAgencia || undefined,
regimeTrabalho,
...Object.fromEntries(
Object.entries(documentosStorage).map(([key, value]) => [key, value as any])
@@ -1207,6 +1217,24 @@
/>
</div>
<!-- Regime de Trabalho -->
<div class="form-control">
<label class="label" for="regimeTrabalho">
<span class="label-text font-medium">Regime do Funcionário <span class="text-error">*</span></span>
</label>
<select
id="regimeTrabalho"
class="select select-bordered w-full"
bind:value={regimeTrabalho}
required
>
<option value="">Selecione...</option>
{#each REGIME_TRABALHO_OPTIONS as option}
<option value={option.value}>{option.label}</option>
{/each}
</select>
</div>
<!-- Pertence a Órgão Público -->
<div class="form-control lg:col-span-3">
<label class="label cursor-pointer justify-start gap-4">

View File

@@ -80,6 +80,14 @@
let pertenceOrgaoPublico = $state(false);
let orgaoOrigem = $state("");
let aposentado = $state("nao");
let regimeTrabalho = $state("estatutario_pe");
const REGIME_TRABALHO_OPTIONS = [
{ value: "clt", label: "CLT" },
{ value: "estatutario_municipal", label: "Estatutário Municipal" },
{ value: "estatutario_pe", label: "Estatutário PE" },
{ value: "estatutario_federal", label: "Estatutário Federal" }
] as const;
// Dados Bancários
let contaBradescoNumero = $state("");
@@ -310,6 +318,7 @@
// Cargo e Vínculo
descricaoCargo: descricaoCargo || undefined,
regimeTrabalho: regimeTrabalho,
nomeacaoPortaria: nomeacaoPortaria || undefined,
nomeacaoData: nomeacaoData || undefined,
nomeacaoDOE: nomeacaoDOE || undefined,
@@ -1375,6 +1384,24 @@
/>
</div>
<!-- Regime de Trabalho -->
<div class="form-control">
<label class="label" for="regimeTrabalho">
<span class="label-text font-medium">Regime do Funcionário</span>
</label>
<select
id="regimeTrabalho"
class="select select-bordered w-full"
bind:value={regimeTrabalho}
required
>
<option value="">Selecione...</option>
{#each REGIME_TRABALHO_OPTIONS as option}
<option value={option.value}>{option.label}</option>
{/each}
</select>
</div>
<!-- Pertence a Órgão Público -->
<div class="form-control lg:col-span-3">
<label class="label cursor-pointer justify-start gap-4">