- Introduced a modal for managing user profiles, allowing for the creation and editing of profiles with improved state management. - Updated the role filtering logic to enhance type safety and readability. - Refactored UI components for better user experience, including improved button states and loading indicators. - Removed outdated code related to permissions and streamlined the overall structure for maintainability.
203 lines
6.6 KiB
TypeScript
203 lines
6.6 KiB
TypeScript
import { v } from "convex/values";
|
|
import { mutation, query } from "./_generated/server";
|
|
import { Id } from "./_generated/dataModel";
|
|
|
|
// Mutation para fazer upload de arquivo e obter o storage ID
|
|
export const generateUploadUrl = mutation({
|
|
args: {},
|
|
returns: v.string(),
|
|
handler: async (ctx) => {
|
|
return await ctx.storage.generateUploadUrl();
|
|
},
|
|
});
|
|
|
|
// Mutation para atualizar um campo de documento do funcionário
|
|
export const updateDocumento = mutation({
|
|
args: {
|
|
funcionarioId: v.id("funcionarios"),
|
|
campo: v.string(),
|
|
storageId: v.union(v.id("_storage"), v.null()),
|
|
},
|
|
returns: v.null(),
|
|
handler: async (ctx, args) => {
|
|
const funcionario = await ctx.db.get(args.funcionarioId);
|
|
if (!funcionario) {
|
|
throw new Error("Funcionário não encontrado");
|
|
}
|
|
|
|
// Atualizar o campo específico do documento
|
|
await ctx.db.patch(args.funcionarioId, {
|
|
[args.campo]: args.storageId,
|
|
});
|
|
|
|
return null;
|
|
},
|
|
});
|
|
|
|
// Query para obter URLs de todos os documentos de um funcionário
|
|
export const getDocumentosUrls = query({
|
|
args: { funcionarioId: v.id("funcionarios") },
|
|
returns: v.object({
|
|
certidaoAntecedentesPF: v.union(v.string(), v.null()),
|
|
certidaoAntecedentesJFPE: v.union(v.string(), v.null()),
|
|
certidaoAntecedentesSDS: v.union(v.string(), v.null()),
|
|
certidaoAntecedentesTJPE: v.union(v.string(), v.null()),
|
|
certidaoImprobidade: v.union(v.string(), v.null()),
|
|
rgFrente: v.union(v.string(), v.null()),
|
|
rgVerso: v.union(v.string(), v.null()),
|
|
cpfFrente: v.union(v.string(), v.null()),
|
|
cpfVerso: v.union(v.string(), v.null()),
|
|
situacaoCadastralCPF: v.union(v.string(), v.null()),
|
|
tituloEleitorFrente: v.union(v.string(), v.null()),
|
|
tituloEleitorVerso: v.union(v.string(), v.null()),
|
|
comprovanteVotacao: v.union(v.string(), v.null()),
|
|
carteiraProfissionalFrente: v.union(v.string(), v.null()),
|
|
carteiraProfissionalVerso: v.union(v.string(), v.null()),
|
|
comprovantePIS: v.union(v.string(), v.null()),
|
|
certidaoRegistroCivil: v.union(v.string(), v.null()),
|
|
certidaoNascimentoDependentes: v.union(v.string(), v.null()),
|
|
cpfDependentes: v.union(v.string(), v.null()),
|
|
reservistaDoc: v.union(v.string(), v.null()),
|
|
comprovanteEscolaridade: v.union(v.string(), v.null()),
|
|
comprovanteResidencia: v.union(v.string(), v.null()),
|
|
comprovanteContaBradesco: v.union(v.string(), v.null()),
|
|
declaracaoAcumulacaoCargo: v.union(v.string(), v.null()),
|
|
declaracaoDependentesIR: v.union(v.string(), v.null()),
|
|
declaracaoIdoneidade: v.union(v.string(), v.null()),
|
|
termoNepotismo: v.union(v.string(), v.null()),
|
|
termoOpcaoRemuneracao: v.union(v.string(), v.null()),
|
|
}),
|
|
handler: async (ctx, args) => {
|
|
const funcionario = await ctx.db.get(args.funcionarioId);
|
|
if (!funcionario) {
|
|
throw new Error("Funcionário não encontrado");
|
|
}
|
|
|
|
// Tipo exato do retorno para alinhar com o validator
|
|
type DocumentUrls = {
|
|
certidaoAntecedentesPF: string | null;
|
|
certidaoAntecedentesJFPE: string | null;
|
|
certidaoAntecedentesSDS: string | null;
|
|
certidaoAntecedentesTJPE: string | null;
|
|
certidaoImprobidade: string | null;
|
|
rgFrente: string | null;
|
|
rgVerso: string | null;
|
|
cpfFrente: string | null;
|
|
cpfVerso: string | null;
|
|
situacaoCadastralCPF: string | null;
|
|
tituloEleitorFrente: string | null;
|
|
tituloEleitorVerso: string | null;
|
|
comprovanteVotacao: string | null;
|
|
carteiraProfissionalFrente: string | null;
|
|
carteiraProfissionalVerso: string | null;
|
|
comprovantePIS: string | null;
|
|
certidaoRegistroCivil: string | null;
|
|
certidaoNascimentoDependentes: string | null;
|
|
cpfDependentes: string | null;
|
|
reservistaDoc: string | null;
|
|
comprovanteEscolaridade: string | null;
|
|
comprovanteResidencia: string | null;
|
|
comprovanteContaBradesco: string | null;
|
|
declaracaoAcumulacaoCargo: string | null;
|
|
declaracaoDependentesIR: string | null;
|
|
declaracaoIdoneidade: string | null;
|
|
termoNepotismo: string | null;
|
|
termoOpcaoRemuneracao: string | null;
|
|
};
|
|
|
|
const urls: DocumentUrls = {
|
|
certidaoAntecedentesPF: null,
|
|
certidaoAntecedentesJFPE: null,
|
|
certidaoAntecedentesSDS: null,
|
|
certidaoAntecedentesTJPE: null,
|
|
certidaoImprobidade: null,
|
|
rgFrente: null,
|
|
rgVerso: null,
|
|
cpfFrente: null,
|
|
cpfVerso: null,
|
|
situacaoCadastralCPF: null,
|
|
tituloEleitorFrente: null,
|
|
tituloEleitorVerso: null,
|
|
comprovanteVotacao: null,
|
|
carteiraProfissionalFrente: null,
|
|
carteiraProfissionalVerso: null,
|
|
comprovantePIS: null,
|
|
certidaoRegistroCivil: null,
|
|
certidaoNascimentoDependentes: null,
|
|
cpfDependentes: null,
|
|
reservistaDoc: null,
|
|
comprovanteEscolaridade: null,
|
|
comprovanteResidencia: null,
|
|
comprovanteContaBradesco: null,
|
|
declaracaoAcumulacaoCargo: null,
|
|
declaracaoDependentesIR: null,
|
|
declaracaoIdoneidade: null,
|
|
termoNepotismo: null,
|
|
termoOpcaoRemuneracao: null,
|
|
};
|
|
|
|
const campos: Array<keyof DocumentUrls> = [
|
|
"certidaoAntecedentesPF",
|
|
"certidaoAntecedentesJFPE",
|
|
"certidaoAntecedentesSDS",
|
|
"certidaoAntecedentesTJPE",
|
|
"certidaoImprobidade",
|
|
"rgFrente",
|
|
"rgVerso",
|
|
"cpfFrente",
|
|
"cpfVerso",
|
|
"situacaoCadastralCPF",
|
|
"tituloEleitorFrente",
|
|
"tituloEleitorVerso",
|
|
"comprovanteVotacao",
|
|
"carteiraProfissionalFrente",
|
|
"carteiraProfissionalVerso",
|
|
"comprovantePIS",
|
|
"certidaoRegistroCivil",
|
|
"certidaoNascimentoDependentes",
|
|
"cpfDependentes",
|
|
"reservistaDoc",
|
|
"comprovanteEscolaridade",
|
|
"comprovanteResidencia",
|
|
"comprovanteContaBradesco",
|
|
"declaracaoAcumulacaoCargo",
|
|
"declaracaoDependentesIR",
|
|
"declaracaoIdoneidade",
|
|
"termoNepotismo",
|
|
"termoOpcaoRemuneracao",
|
|
];
|
|
|
|
for (const campo of campos) {
|
|
const storageId = (funcionario as Record<string, unknown>)[campo as string] as
|
|
| Id<"_storage">
|
|
| undefined;
|
|
if (storageId) {
|
|
urls[campo] = await ctx.storage.getUrl(storageId);
|
|
} else {
|
|
urls[campo] = null;
|
|
}
|
|
}
|
|
|
|
return urls;
|
|
},
|
|
});
|
|
|
|
// Query para obter metadados de um documento
|
|
export const getDocumentoMetadata = query({
|
|
args: { storageId: v.id("_storage") },
|
|
returns: v.union(
|
|
v.object({
|
|
_id: v.id("_storage"),
|
|
_creationTime: v.number(),
|
|
contentType: v.optional(v.string()),
|
|
sha256: v.string(),
|
|
size: v.number(),
|
|
}),
|
|
v.null()
|
|
),
|
|
handler: async (ctx, args) => {
|
|
return await ctx.db.system.get(args.storageId);
|
|
},
|
|
});
|
|
|