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 = [ "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)[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); }, });