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); } });