feat: implement employee registration form with validation and data handling

This commit is contained in:
2025-10-24 17:25:46 -03:00
parent 316877e1bb
commit be3522ae74
5 changed files with 855 additions and 16 deletions

View File

@@ -1,24 +1,179 @@
import { v } from "convex/values";
import { query, mutation } from "./_generated/server";
import { simboloTipo } from "./schema";
export const getAll = query({
args: {},
returns: v.array(
v.object({
_id: v.id("funcionarios"),
_creationTime: v.number(),
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.string(),
admissaoData: v.optional(v.string()),
desligamentoData: v.optional(v.string()),
simboloId: v.id("simbolos"),
simboloTipo: simboloTipo,
})
),
handler: async (ctx) => {
return await ctx.db.query("funcionarios").collect();
},
});
export const getById = query({
args: { id: v.id("funcionarios") },
returns: v.union(
v.object({
_id: v.id("funcionarios"),
_creationTime: v.number(),
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.string(),
admissaoData: v.optional(v.string()),
desligamentoData: v.optional(v.string()),
simboloId: v.id("simbolos"),
simboloTipo: simboloTipo,
}),
v.null()
),
handler: async (ctx, args) => {
return await ctx.db.get(args.id);
},
});
export const create = mutation({
args: {
nome: v.string(),
matricula: v.string(),
simboloId: v.id("simbolos"),
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(),
admissaoData: v.optional(v.string()),
desligamentoData: v.optional(v.string()),
simboloTipo: simboloTipo,
},
returns: v.id("funcionarios"),
handler: async (ctx, args) => {
// Unicidade: CPF
const cpfExists = await ctx.db
.query("funcionarios")
.withIndex("by_cpf", (q) => q.eq("cpf", args.cpf))
.unique();
if (cpfExists) {
throw new Error("CPF já cadastrado");
}
// Unicidade: Matrícula
const matriculaExists = await ctx.db
.query("funcionarios")
.withIndex("by_matricula", (q) => q.eq("matricula", args.matricula))
.unique();
if (matriculaExists) {
throw new Error("Matrícula já cadastrada");
}
const novoFuncionarioId = await ctx.db.insert("funcionarios", {
nome: args.nome,
nascimento: args.nascimento,
rg: args.rg,
cpf: args.cpf,
endereco: args.endereco,
cep: args.cep,
cidade: args.cidade,
uf: args.uf,
telefone: args.telefone,
email: args.email,
matricula: args.matricula,
admissaoData: args.admissaoData,
desligamentoData: args.desligamentoData,
simboloId: args.simboloId,
simboloTipo: args.simboloTipo,
});
return await ctx.db.get(novoFuncionarioId);
return novoFuncionarioId;
},
});
export const update = mutation({
args: {
id: v.id("funcionarios"),
nome: v.string(),
matricula: v.string(),
simboloId: v.id("simbolos"),
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(),
admissaoData: v.optional(v.string()),
desligamentoData: v.optional(v.string()),
simboloTipo: simboloTipo,
},
returns: v.null(),
handler: async (ctx, args) => {
// Unicidade: CPF (excluindo o próprio registro)
const cpfExists = await ctx.db
.query("funcionarios")
.withIndex("by_cpf", (q) => q.eq("cpf", args.cpf))
.unique();
if (cpfExists && cpfExists._id !== args.id) {
throw new Error("CPF já cadastrado");
}
// Unicidade: Matrícula (excluindo o próprio registro)
const matriculaExists = await ctx.db
.query("funcionarios")
.withIndex("by_matricula", (q) => q.eq("matricula", args.matricula))
.unique();
if (matriculaExists && matriculaExists._id !== args.id) {
throw new Error("Matrícula já cadastrada");
}
await ctx.db.patch(args.id, {
nome: args.nome,
nascimento: args.nascimento,
rg: args.rg,
cpf: args.cpf,
endereco: args.endereco,
cep: args.cep,
cidade: args.cidade,
uf: args.uf,
telefone: args.telefone,
email: args.email,
matricula: args.matricula,
admissaoData: args.admissaoData,
desligamentoData: args.desligamentoData,
simboloId: args.simboloId,
simboloTipo: args.simboloTipo,
});
return null;
},
});