Merge branch 'master' into feat-controle-ponto

This commit is contained in:
2025-11-21 12:45:31 -03:00
committed by GitHub
53 changed files with 2962 additions and 2240 deletions

View File

@@ -120,11 +120,78 @@ export const reportStatus = v.union(
v.literal("falhou")
);
export const situacaoContrato = v.union(
v.literal("em_execucao"),
v.literal("rescendido"),
v.literal("aguardando_assinatura"),
v.literal("finalizado")
);
export default defineSchema({
contratos: defineTable({
contratadaId: v.id("empresas"),
objeto: v.string(),
numeroNotaEmpenho: v.string(),
responsavelId: v.id("funcionarios"),
departamento: v.string(),
situacao: situacaoContrato,
numeroProcessoLicitatorio: v.string(),
modalidade: v.string(),
numeroContrato: v.string(),
anoContrato: v.number(),
dataInicioVigencia: v.string(),
dataFimVigencia: v.string(),
nomeFiscal: v.string(),
valorTotal: v.string(),
dataAditivoPrazo: v.optional(v.string()),
diasAvisoVencimento: v.number(),
criadoPor: v.id("usuarios"),
criadoEm: v.number(),
atualizadoEm: v.optional(v.number()),
})
.index("by_responsavel", ["responsavelId"])
.index("by_situacao", ["situacao"])
.index("by_vigencia_inicio", ["dataInicioVigencia"])
.index("by_vigencia_fim", ["dataFimVigencia"]),
todos: defineTable({
text: v.string(),
completed: v.boolean(),
}),
enderecos: defineTable({
cep: v.string(),
logradouro: v.string(),
numero: v.string(),
complemento: v.optional(v.string()),
bairro: v.string(),
cidade: v.string(),
uf: v.string(),
criadoPor: v.optional(v.id("usuarios")),
atualizadoPor: v.optional(v.id("usuarios")),
}).index("by_cep", ["cep"]),
empresas: defineTable({
razao_social: v.string(),
nome_fantasia: v.optional(v.string()),
cnpj: v.string(),
telefone: v.string(),
email: v.string(),
descricao: v.optional(v.string()),
enderecoId: v.optional(v.id("enderecos")),
criadoPor: v.optional(v.id("usuarios")),
})
.index("by_razao_social", ["razao_social"])
.index("by_cnpj", ["cnpj"]),
contatosEmpresa: defineTable({
empresaId: v.id("empresas"),
nome: v.string(),
funcao: v.string(),
email: v.string(),
telefone: v.string(),
adicionadoPor: v.optional(v.id("usuarios")),
descricao: v.optional(v.string()),
})
.index("by_empresa", ["empresaId"])
.index("by_email", ["email"]),
funcionarios: defineTable({
// Campos obrigatórios existentes
nome: v.string(),
@@ -447,24 +514,6 @@ export default defineSchema({
valor: v.string(),
}),
solicitacoesAcesso: defineTable({
nome: v.string(),
matricula: v.string(),
email: v.string(),
telefone: v.string(),
status: v.union(
v.literal("pendente"),
v.literal("aprovado"),
v.literal("rejeitado")
),
dataSolicitacao: v.number(),
dataResposta: v.optional(v.number()),
observacoes: v.optional(v.string()),
})
.index("by_status", ["status"])
.index("by_matricula", ["matricula"])
.index("by_email", ["email"]),
// Sistema de Autenticação e Controle de Acesso
usuarios: defineTable({
authId: v.string(),
@@ -486,7 +535,7 @@ export default defineSchema({
ultimaTentativaLogin: v.optional(v.number()), // timestamp da última tentativa
// Campos de Chat e Perfil
avatar: v.optional(v.string()), // "avatar-1" até "avatar-15" ou storageId
fotoPerfil: v.optional(v.id("_storage")),
setor: v.optional(v.string()),
statusMensagem: v.optional(v.string()), // max 100 chars
@@ -712,7 +761,7 @@ export default defineSchema({
v.literal("sala_reuniao")
),
nome: v.optional(v.string()), // nome do grupo/sala
avatar: v.optional(v.string()), // avatar do grupo/sala
participantes: v.array(v.id("usuarios")), // IDs dos participantes
administradores: v.optional(v.array(v.id("usuarios"))), // IDs dos administradores (apenas para sala_reuniao)
ultimaMensagem: v.optional(v.string()),