import { defineTable } from 'convex/server'; import { type Infer, v } from 'convex/values'; export const simboloTipo = v.union( v.literal('cargo_comissionado'), v.literal('funcao_gratificada') ); export type SimboloTipo = Infer; export const funcionariosTables = { simbolos: defineTable({ nome: v.string(), tipo: simboloTipo, descricao: v.string(), vencValor: v.string(), repValor: v.string(), valor: v.string() }), funcionarios: defineTable({ // Campos obrigatórios existentes nome: v.string(), nascimento: v.string(), rg: v.string(), cpf: v.string(), endereco: v.string(), cep: v.string(), cidade: v.string(), uf: v.string(), telefone: v.string(), email: v.string(), matricula: v.optional(v.string()), admissaoData: v.optional(v.string()), desligamentoData: v.optional(v.string()), simboloId: v.id('simbolos'), simboloTipo: simboloTipo, gestorId: v.optional(v.id('usuarios')), statusFerias: v.optional(v.union(v.literal('ativo'), v.literal('em_ferias'))), // Regime de trabalho (para cálculo correto de férias) regimeTrabalho: v.optional( v.union( v.literal('clt'), // CLT - Consolidação das Leis do Trabalho v.literal('estatutario_pe'), // Servidor Público Estadual de Pernambuco v.literal('estatutario_federal'), // Servidor Público Federal v.literal('estatutario_municipal') // Servidor Público Municipal ) ), // Dados Pessoais Adicionais (opcionais) nomePai: v.optional(v.string()), nomeMae: v.optional(v.string()), naturalidade: v.optional(v.string()), naturalidadeUF: v.optional(v.string()), sexo: v.optional(v.union(v.literal('masculino'), v.literal('feminino'), v.literal('outro'))), estadoCivil: v.optional( v.union( v.literal('solteiro'), v.literal('casado'), v.literal('divorciado'), v.literal('viuvo'), v.literal('uniao_estavel') ) ), nacionalidade: v.optional(v.string()), // Documentos Pessoais rgOrgaoExpedidor: v.optional(v.string()), rgDataEmissao: v.optional(v.string()), carteiraProfissionalNumero: v.optional(v.string()), carteiraProfissionalSerie: v.optional(v.string()), carteiraProfissionalDataEmissao: v.optional(v.string()), reservistaNumero: v.optional(v.string()), reservistaSerie: v.optional(v.string()), tituloEleitorNumero: v.optional(v.string()), tituloEleitorZona: v.optional(v.string()), tituloEleitorSecao: v.optional(v.string()), pisNumero: v.optional(v.string()), // Formação e Saúde grauInstrucao: v.optional( v.union( v.literal('fundamental'), v.literal('medio'), v.literal('superior'), v.literal('pos_graduacao'), v.literal('mestrado'), v.literal('doutorado') ) ), formacao: v.optional(v.string()), formacaoRegistro: v.optional(v.string()), grupoSanguineo: v.optional( v.union(v.literal('A'), v.literal('B'), v.literal('AB'), v.literal('O')) ), fatorRH: v.optional(v.union(v.literal('positivo'), v.literal('negativo'))), // Cargo e Vínculo descricaoCargo: v.optional(v.string()), nomeacaoPortaria: v.optional(v.string()), nomeacaoData: v.optional(v.string()), nomeacaoDOE: v.optional(v.string()), pertenceOrgaoPublico: v.optional(v.boolean()), orgaoOrigem: v.optional(v.string()), aposentado: v.optional(v.union(v.literal('nao'), v.literal('funape_ipsep'), v.literal('inss'))), // Dados Bancários contaBradescoNumero: v.optional(v.string()), contaBradescoDV: v.optional(v.string()), contaBradescoAgencia: v.optional(v.string()), // Documentos Anexos (Storage IDs) certidaoAntecedentesPF: v.optional(v.id('_storage')), certidaoAntecedentesJFPE: v.optional(v.id('_storage')), certidaoAntecedentesSDS: v.optional(v.id('_storage')), certidaoAntecedentesTJPE: v.optional(v.id('_storage')), certidaoImprobidade: v.optional(v.id('_storage')), rgFrente: v.optional(v.id('_storage')), rgVerso: v.optional(v.id('_storage')), cpfFrente: v.optional(v.id('_storage')), cpfVerso: v.optional(v.id('_storage')), situacaoCadastralCPF: v.optional(v.id('_storage')), tituloEleitorFrente: v.optional(v.id('_storage')), tituloEleitorVerso: v.optional(v.id('_storage')), comprovanteVotacao: v.optional(v.id('_storage')), carteiraProfissionalFrente: v.optional(v.id('_storage')), carteiraProfissionalVerso: v.optional(v.id('_storage')), comprovantePIS: v.optional(v.id('_storage')), certidaoRegistroCivil: v.optional(v.id('_storage')), certidaoNascimentoDependentes: v.optional(v.id('_storage')), cpfDependentes: v.optional(v.id('_storage')), reservistaDoc: v.optional(v.id('_storage')), comprovanteEscolaridade: v.optional(v.id('_storage')), comprovanteResidencia: v.optional(v.id('_storage')), comprovanteContaBradesco: v.optional(v.id('_storage')), // Dependentes do funcionário (uploads opcionais) dependentes: v.optional( v.array( v.object({ parentesco: v.union( v.literal('filho'), v.literal('filha'), v.literal('conjuge'), v.literal('outro') ), nome: v.string(), cpf: v.string(), nascimento: v.string(), documentoId: v.optional(v.id('_storage')), // Benefícios/declarações por dependente salarioFamilia: v.optional(v.boolean()), impostoRenda: v.optional(v.boolean()) }) ) ), // Declarações (Storage IDs) declaracaoAcumulacaoCargo: v.optional(v.id('_storage')), declaracaoDependentesIR: v.optional(v.id('_storage')), declaracaoIdoneidade: v.optional(v.id('_storage')), termoNepotismo: v.optional(v.id('_storage')), termoOpcaoRemuneracao: v.optional(v.id('_storage')) }) .index('by_matricula', ['matricula']) .index('by_nome', ['nome']) .index('by_simboloId', ['simboloId']) .index('by_simboloTipo', ['simboloTipo']) .index('by_cpf', ['cpf']) .index('by_rg', ['rg']) .index('by_gestor', ['gestorId']) };