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

@@ -5,6 +5,62 @@ import { registrarAtividade } from "./logsAtividades";
import { Id } from "./_generated/dataModel";
import { api } from "./_generated/api";
/**
* Associar funcionário a um usuário
*/
export const associarFuncionario = mutation({
args: {
usuarioId: v.id("usuarios"),
funcionarioId: v.id("funcionarios"),
},
returns: v.object({ sucesso: v.boolean() }),
handler: async (ctx, args) => {
// Verificar se o funcionário existe
const funcionario = await ctx.db.get(args.funcionarioId);
if (!funcionario) {
throw new Error("Funcionário não encontrado");
}
// Verificar se o funcionário já está associado a outro usuário
const usuarioExistente = await ctx.db
.query("usuarios")
.withIndex("by_funcionarioId", (q) =>
q.eq("funcionarioId", args.funcionarioId)
)
.first();
if (usuarioExistente && usuarioExistente._id !== args.usuarioId) {
throw new Error(
`Este funcionário já está associado ao usuário: ${usuarioExistente.nome} (${usuarioExistente.matricula})`
);
}
// Associar funcionário ao usuário
await ctx.db.patch(args.usuarioId, {
funcionarioId: args.funcionarioId,
});
return { sucesso: true };
},
});
/**
* Desassociar funcionário de um usuário
*/
export const desassociarFuncionario = mutation({
args: {
usuarioId: v.id("usuarios"),
},
returns: v.object({ sucesso: v.boolean() }),
handler: async (ctx, args) => {
await ctx.db.patch(args.usuarioId, {
funcionarioId: undefined,
});
return { sucesso: true };
},
});
/**
* Criar novo usuário (apenas TI)
*/
@@ -413,6 +469,7 @@ export const obterPerfil = query({
nome: v.string(),
email: v.string(),
matricula: v.string(),
funcionarioId: v.optional(v.id("funcionarios")),
avatar: v.optional(v.string()),
fotoPerfil: v.optional(v.id("_storage")),
fotoPerfilUrl: v.union(v.string(), v.null()),
@@ -500,6 +557,7 @@ export const obterPerfil = query({
nome: usuarioAtual.nome,
email: usuarioAtual.email,
matricula: usuarioAtual.matricula,
funcionarioId: usuarioAtual.funcionarioId,
avatar: usuarioAtual.avatar,
fotoPerfil: usuarioAtual.fotoPerfil,
fotoPerfilUrl,
@@ -522,7 +580,7 @@ export const listarParaChat = query({
_id: v.id("usuarios"),
nome: v.string(),
email: v.string(),
matricula: v.string(),
matricula: v.optional(v.string()),
avatar: v.optional(v.string()),
fotoPerfil: v.optional(v.id("_storage")),
fotoPerfilUrl: v.union(v.string(), v.null()),
@@ -558,7 +616,7 @@ export const listarParaChat = query({
_id: usuario._id,
nome: usuario.nome,
email: usuario.email,
matricula: usuario.matricula,
matricula: usuario.matricula || undefined,
avatar: usuario.avatar,
fotoPerfil: usuario.fotoPerfil,
fotoPerfilUrl,