Merge remote-tracking branch 'origin/master' into feat-ajuste-acesso

This commit is contained in:
2025-10-30 14:01:08 -03:00
76 changed files with 15420 additions and 1212 deletions

View File

@@ -38,6 +38,7 @@ const aposentadoValidator = v.optional(
export const getAll = query({
args: {},
returns: v.array(v.any()),
handler: async (ctx) => {
// Autorização: listar funcionários
await ctx.runQuery(internal.permissoesAcoes.assertPermissaoAcaoAtual, {
@@ -70,6 +71,7 @@ export const getAll = query({
export const getById = query({
args: { id: v.id("funcionarios") },
returns: v.union(v.any(), v.null()),
handler: async (ctx, args) => {
// Autorização: ver funcionário
await ctx.runQuery(internal.permissoesAcoes.assertPermissaoAcaoAtual, {
@@ -84,7 +86,7 @@ export const create = mutation({
args: {
// Campos obrigatórios
nome: v.string(),
matricula: v.string(),
matricula: v.optional(v.string()),
simboloId: v.id("simbolos"),
nascimento: v.string(),
rg: v.string(),
@@ -190,13 +192,15 @@ export const create = mutation({
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");
// Unicidade: Matrícula (apenas se fornecida)
if (args.matricula) {
const matriculaExists = await ctx.db
.query("funcionarios")
.withIndex("by_matricula", (q) => q.eq("matricula", args.matricula))
.unique();
if (matriculaExists) {
throw new Error("Já existe um funcionário com esta matrícula. Por favor, use outra ou deixe em branco.");
}
}
const novoFuncionarioId = await ctx.db.insert("funcionarios", args as any);
@@ -209,7 +213,7 @@ export const update = mutation({
id: v.id("funcionarios"),
// Campos obrigatórios
nome: v.string(),
matricula: v.string(),
matricula: v.optional(v.string()),
simboloId: v.id("simbolos"),
nascimento: v.string(),
rg: v.string(),
@@ -315,13 +319,15 @@ export const update = mutation({
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");
// Unicidade: Matrícula (apenas se fornecida, excluindo o próprio registro)
if (args.matricula) {
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("Já existe um funcionário com esta matrícula. Por favor, use outra ou deixe em branco.");
}
}
const { id, ...updateData } = args;
@@ -348,6 +354,7 @@ export const remove = mutation({
// Query para obter ficha completa para impressão
export const getFichaCompleta = query({
args: { id: v.id("funcionarios") },
returns: v.union(v.any(), v.null()),
handler: async (ctx, args) => {
await ctx.runQuery(internal.permissoesAcoes.assertPermissaoAcaoAtual, {
recurso: "funcionarios",
@@ -361,15 +368,55 @@ export const getFichaCompleta = query({
// Buscar informações do símbolo
const simbolo = await ctx.db.get(funcionario.simboloId);
// Buscar cursos do funcionário
const cursos = await ctx.db
.query("cursos")
.withIndex("by_funcionario", (q) => q.eq("funcionarioId", args.id))
.collect();
// Buscar URLs dos certificados
const cursosComUrls = await Promise.all(
cursos.map(async (curso) => {
let certificadoUrl = null;
if (curso.certificadoId) {
certificadoUrl = await ctx.storage.getUrl(curso.certificadoId);
}
return {
...curso,
certificadoUrl,
};
})
);
return {
...funcionario,
simbolo: simbolo
? {
nome: simbolo.nome,
descricao: simbolo.descricao,
valor: simbolo.valor,
// campos adicionais, se existirem no símbolo
tipo: (simbolo as any).tipo,
vencValor: (simbolo as any).vencValor,
repValor: (simbolo as any).repValor,
valor: (simbolo as any).valor,
}
: null,
cursos: cursosComUrls,
};
},
});
// Mutation: Configurar gestor (apenas para TI_MASTER)
export const configurarGestor = mutation({
args: {
funcionarioId: v.id("funcionarios"),
gestorId: v.optional(v.id("usuarios")),
},
returns: v.null(),
handler: async (ctx, args) => {
await ctx.db.patch(args.funcionarioId, {
gestorId: args.gestorId,
});
return null;
},
});