feat: integrate point management features into the dashboard

- Added a new "Meu Ponto" section for users to register their work hours, breaks, and attendance.
- Introduced a "Controle de Ponto" category in the Recursos Humanos section for managing employee time records.
- Enhanced the backend schema to support point registration and configuration settings.
- Updated various components to improve UI consistency and user experience across the dashboard.
This commit is contained in:
2025-11-18 11:44:12 -03:00
parent 52123a33b3
commit f0c6e4468f
22 changed files with 3604 additions and 128 deletions

View File

@@ -1325,5 +1325,96 @@ export default defineSchema({
criadoEm: v.number(),
atualizadoEm: v.number(),
})
.index("by_criadoEm", ["criadoEm"])
.index("by_criadoEm", ["criadoEm"]),
// Sistema de Controle de Ponto
registrosPonto: defineTable({
funcionarioId: v.id("funcionarios"),
tipo: v.union(
v.literal("entrada"),
v.literal("saida_almoco"),
v.literal("retorno_almoco"),
v.literal("saida")
),
data: v.string(), // YYYY-MM-DD
hora: v.number(),
minuto: v.number(),
segundo: v.number(),
timestamp: v.number(), // Timestamp completo para ordenação
imagemId: v.optional(v.id("_storage")),
sincronizadoComServidor: v.boolean(),
toleranciaMinutos: v.number(),
dentroDoPrazo: v.boolean(),
// Informações de Rede
ipAddress: v.optional(v.string()),
ipPublico: v.optional(v.string()),
ipLocal: v.optional(v.string()),
// Informações do Navegador
userAgent: v.optional(v.string()),
browser: v.optional(v.string()),
browserVersion: v.optional(v.string()),
engine: v.optional(v.string()),
// Informações do Sistema
sistemaOperacional: v.optional(v.string()),
osVersion: v.optional(v.string()),
arquitetura: v.optional(v.string()),
plataforma: v.optional(v.string()),
// Informações de Localização
latitude: v.optional(v.number()),
longitude: v.optional(v.number()),
precisao: v.optional(v.number()),
endereco: v.optional(v.string()),
cidade: v.optional(v.string()),
estado: v.optional(v.string()),
pais: v.optional(v.string()),
timezone: v.optional(v.string()),
// Informações do Dispositivo
deviceType: v.optional(v.string()),
deviceModel: v.optional(v.string()),
screenResolution: v.optional(v.string()),
coresTela: v.optional(v.number()),
idioma: v.optional(v.string()),
// Informações Adicionais
isMobile: v.optional(v.boolean()),
isTablet: v.optional(v.boolean()),
isDesktop: v.optional(v.boolean()),
connectionType: v.optional(v.string()),
memoryInfo: v.optional(v.string()),
criadoEm: v.number(),
})
.index("by_funcionario_data", ["funcionarioId", "data"])
.index("by_data", ["data"])
.index("by_dentro_prazo", ["dentroDoPrazo", "data"])
.index("by_funcionario_timestamp", ["funcionarioId", "timestamp"]),
configuracaoPonto: defineTable({
horarioEntrada: v.string(), // HH:mm
horarioSaidaAlmoco: v.string(), // HH:mm
horarioRetornoAlmoco: v.string(), // HH:mm
horarioSaida: v.string(), // HH:mm
toleranciaMinutos: v.number(),
ativo: v.boolean(),
atualizadoPor: v.id("usuarios"),
atualizadoEm: v.number(),
})
.index("by_ativo", ["ativo"]),
configuracaoRelogio: defineTable({
servidorNTP: v.optional(v.string()),
portaNTP: v.optional(v.number()),
usarServidorExterno: v.boolean(),
fallbackParaPC: v.boolean(),
ultimaSincronizacao: v.optional(v.number()),
offsetSegundos: v.optional(v.number()),
atualizadoPor: v.id("usuarios"),
atualizadoEm: v.number(),
})
.index("by_ativo", ["usarServidorExterno"])
});