347 lines
8.8 KiB
TypeScript
347 lines
8.8 KiB
TypeScript
// Tipos específicos do domínio RDO com branded types para maior type safety
|
|
// Implementa branded types para IDs únicos e tipos de domínio específicos
|
|
|
|
// === BRANDED TYPES PARA IDs ===
|
|
// Branded types garantem que IDs de diferentes entidades não sejam intercambiáveis
|
|
|
|
export type Brand<T, K> = T & { __brand: K }
|
|
|
|
// IDs tipados por entidade
|
|
export type UsuarioId = Brand<string, 'UsuarioId'>
|
|
export type ObraId = Brand<string, 'ObraId'>
|
|
export type RDOId = Brand<string, 'RDOId'>
|
|
export type TarefaId = Brand<string, 'TarefaId'>
|
|
export type AtividadeId = Brand<string, 'AtividadeId'>
|
|
export type EquipamentoId = Brand<string, 'EquipamentoId'>
|
|
export type OcorrenciaId = Brand<string, 'OcorrenciaId'>
|
|
export type AnexoId = Brand<string, 'AnexoId'>
|
|
export type InspecaoSoldaId = Brand<string, 'InspecaoSoldaId'>
|
|
export type VerificacaoTorqueId = Brand<string, 'VerificacaoTorqueId'>
|
|
export type TaskLogId = Brand<string, 'TaskLogId'>
|
|
|
|
// Funções helper para criar IDs tipados
|
|
export const createUsuarioId = (id: string): UsuarioId => id as UsuarioId
|
|
export const createObraId = (id: string): ObraId => id as ObraId
|
|
export const createRDOId = (id: string): RDOId => id as RDOId
|
|
export const createTarefaId = (id: string): TarefaId => id as TarefaId
|
|
export const createAtividadeId = (id: string): AtividadeId => id as AtividadeId
|
|
export const createEquipamentoId = (id: string): EquipamentoId => id as EquipamentoId
|
|
export const createOcorrenciaId = (id: string): OcorrenciaId => id as OcorrenciaId
|
|
export const createAnexoId = (id: string): AnexoId => id as AnexoId
|
|
export const createInspecaoSoldaId = (id: string): InspecaoSoldaId => id as InspecaoSoldaId
|
|
export const createVerificacaoTorqueId = (id: string): VerificacaoTorqueId => id as VerificacaoTorqueId
|
|
export const createTaskLogId = (id: string): TaskLogId => id as TaskLogId
|
|
|
|
// === ENUMS E CONSTANTES DO DOMÍNIO ===
|
|
|
|
// Roles de usuário
|
|
export const UserRole = {
|
|
ADMIN: 'admin',
|
|
ENGENHEIRO: 'engenheiro',
|
|
MESTRE_OBRA: 'mestre_obra',
|
|
USUARIO: 'usuario'
|
|
} as const
|
|
|
|
export type UserRoleType = typeof UserRole[keyof typeof UserRole]
|
|
|
|
// Status de obra
|
|
export const ObraStatus = {
|
|
ATIVA: 'ativa',
|
|
PAUSADA: 'pausada',
|
|
CONCLUIDA: 'concluida',
|
|
CANCELADA: 'cancelada'
|
|
} as const
|
|
|
|
export type ObraStatusType = typeof ObraStatus[keyof typeof ObraStatus]
|
|
|
|
// Status de RDO
|
|
export const RDOStatus = {
|
|
RASCUNHO: 'rascunho',
|
|
ENVIADO: 'enviado',
|
|
APROVADO: 'aprovado',
|
|
REJEITADO: 'rejeitado'
|
|
} as const
|
|
|
|
export type RDOStatusType = typeof RDOStatus[keyof typeof RDOStatus]
|
|
|
|
// Status de tarefa
|
|
export const TarefaStatus = {
|
|
PENDENTE: 'pendente',
|
|
EM_ANDAMENTO: 'em_andamento',
|
|
CONCLUIDA: 'concluida',
|
|
CANCELADA: 'cancelada'
|
|
} as const
|
|
|
|
export type TarefaStatusType = typeof TarefaStatus[keyof typeof TarefaStatus]
|
|
|
|
// Prioridade de tarefa
|
|
export const TarefaPrioridade = {
|
|
BAIXA: 'baixa',
|
|
MEDIA: 'media',
|
|
ALTA: 'alta',
|
|
URGENTE: 'urgente'
|
|
} as const
|
|
|
|
export type TarefaPrioridadeType = typeof TarefaPrioridade[keyof typeof TarefaPrioridade]
|
|
|
|
// Tipos de evento de task log
|
|
export const TaskLogTipoEvento = {
|
|
INICIO: 'inicio',
|
|
PAUSA: 'pausa',
|
|
RETOMADA: 'retomada',
|
|
CONCLUSAO: 'conclusao',
|
|
REVISAO: 'revisao',
|
|
EDICAO: 'edicao',
|
|
CANCELAMENTO: 'cancelamento'
|
|
} as const
|
|
|
|
export type TaskLogTipoEventoType = typeof TaskLogTipoEvento[keyof typeof TaskLogTipoEvento]
|
|
|
|
// Status de verificação
|
|
export const StatusVerificacao = {
|
|
CONFORME: 'conforme',
|
|
NAO_CONFORME: 'nao_conforme'
|
|
} as const
|
|
|
|
export type StatusVerificacaoType = typeof StatusVerificacao[keyof typeof StatusVerificacao]
|
|
|
|
// === TIPOS DE DOMÍNIO ESPECÍFICOS ===
|
|
|
|
// Coordenadas geográficas
|
|
export interface Coordenadas {
|
|
latitude: number
|
|
longitude: number
|
|
}
|
|
|
|
// Endereço completo
|
|
export interface Endereco {
|
|
logradouro: string
|
|
numero?: string
|
|
complemento?: string
|
|
bairro: string
|
|
cidade: string
|
|
estado: string
|
|
cep: string
|
|
coordenadas?: Coordenadas
|
|
}
|
|
|
|
// Período de tempo
|
|
export interface Periodo {
|
|
inicio: Date
|
|
fim: Date
|
|
}
|
|
|
|
// Condições climáticas estruturadas
|
|
export interface CondicoesClimaticas {
|
|
temperatura?: number
|
|
umidade?: number
|
|
vento?: string
|
|
precipitacao?: string
|
|
visibilidade?: string
|
|
observacoes?: string
|
|
}
|
|
|
|
// Progresso com detalhes
|
|
export interface ProgressoDetalhado {
|
|
percentual: number
|
|
etapa_atual: string
|
|
etapas_concluidas: string[]
|
|
proximas_etapas: string[]
|
|
observacoes?: string
|
|
}
|
|
|
|
// Configurações de obra
|
|
export interface ConfiguracoesObra {
|
|
tipos_atividade_permitidos: string[]
|
|
funcoes_mao_obra: string[]
|
|
equipamentos_disponiveis: string[]
|
|
templates_relatorio: string[]
|
|
aprovacao_automatica: boolean
|
|
notificacoes_email: boolean
|
|
backup_automatico: boolean
|
|
}
|
|
|
|
// Metadados de tarefa
|
|
export interface MetadadosTarefa {
|
|
tags: string[]
|
|
categoria: string
|
|
estimativa_horas?: number
|
|
recursos_necessarios: string[]
|
|
dependencias: TarefaId[]
|
|
anexos: string[]
|
|
}
|
|
|
|
// Detalhes de evento de log
|
|
export interface DetalhesEventoLog {
|
|
campo_alterado?: string
|
|
valor_anterior?: any
|
|
valor_novo?: any
|
|
motivo?: string
|
|
observacoes?: string
|
|
anexos?: string[]
|
|
}
|
|
|
|
// === TIPOS DE VALIDAÇÃO ===
|
|
|
|
// Resultado de validação
|
|
export interface ResultadoValidacao {
|
|
valido: boolean
|
|
erros: string[]
|
|
avisos: string[]
|
|
}
|
|
|
|
// Validação de RDO
|
|
export interface ValidacaoRDO extends ResultadoValidacao {
|
|
campos_obrigatorios_faltantes: string[]
|
|
atividades_invalidas: number[]
|
|
equipamentos_invalidos: number[]
|
|
inconsistencias_horario: string[]
|
|
}
|
|
|
|
// === TIPOS DE RELATÓRIO ===
|
|
|
|
// Estatísticas de obra
|
|
export interface EstatisticasObra {
|
|
total_rdos: number
|
|
rdos_aprovados: number
|
|
rdos_pendentes: number
|
|
progresso_medio: number
|
|
atividades_concluidas: number
|
|
total_horas_trabalhadas: number
|
|
equipamentos_utilizados: number
|
|
ocorrencias_reportadas: number
|
|
}
|
|
|
|
// Relatório de produtividade
|
|
export interface RelatorioProdutividade {
|
|
periodo: Periodo
|
|
obra_id: ObraId
|
|
total_atividades: number
|
|
atividades_concluidas: number
|
|
horas_trabalhadas: number
|
|
eficiencia_percentual: number
|
|
gargalos_identificados: string[]
|
|
recomendacoes: string[]
|
|
}
|
|
|
|
// === TIPOS DE BUSCA E FILTROS ===
|
|
|
|
// Critérios de ordenação
|
|
export interface CriteriosOrdenacao {
|
|
campo: string
|
|
direcao: 'asc' | 'desc'
|
|
}
|
|
|
|
// Paginação
|
|
export interface Paginacao {
|
|
pagina: number
|
|
itens_por_pagina: number
|
|
total_itens?: number
|
|
total_paginas?: number
|
|
}
|
|
|
|
// Resultado paginado
|
|
export interface ResultadoPaginado<T> {
|
|
dados: T[]
|
|
paginacao: Paginacao
|
|
}
|
|
|
|
// Filtros avançados para RDO
|
|
export interface FiltrosAvancadosRDO {
|
|
obra_ids?: ObraId[]
|
|
periodo?: Periodo
|
|
status?: RDOStatusType[]
|
|
criado_por?: UsuarioId[]
|
|
aprovado_por?: UsuarioId[]
|
|
contem_ocorrencias?: boolean
|
|
tipos_atividade?: string[]
|
|
equipamentos_utilizados?: string[]
|
|
texto_busca?: string
|
|
}
|
|
|
|
// Filtros avançados para obras
|
|
export interface FiltrosAvancadosObra {
|
|
status?: ObraStatusType[]
|
|
responsavel_ids?: UsuarioId[]
|
|
periodo_inicio?: Periodo
|
|
periodo_fim?: Periodo
|
|
progresso_minimo?: number
|
|
progresso_maximo?: number
|
|
cidades?: string[]
|
|
estados?: string[]
|
|
texto_busca?: string
|
|
}
|
|
|
|
// === TIPOS DE NOTIFICAÇÃO ===
|
|
|
|
// Tipos de notificação
|
|
export const TipoNotificacao = {
|
|
RDO_CRIADO: 'rdo_criado',
|
|
RDO_APROVADO: 'rdo_aprovado',
|
|
RDO_REJEITADO: 'rdo_rejeitado',
|
|
TAREFA_ATRIBUIDA: 'tarefa_atribuida',
|
|
TAREFA_VENCIDA: 'tarefa_vencida',
|
|
OBRA_ATUALIZADA: 'obra_atualizada',
|
|
OCORRENCIA_REPORTADA: 'ocorrencia_reportada'
|
|
} as const
|
|
|
|
export type TipoNotificacaoType = typeof TipoNotificacao[keyof typeof TipoNotificacao]
|
|
|
|
// Notificação
|
|
export interface Notificacao {
|
|
id: string
|
|
tipo: TipoNotificacaoType
|
|
titulo: string
|
|
mensagem: string
|
|
usuario_id: UsuarioId
|
|
lida: boolean
|
|
dados_contexto: Record<string, any>
|
|
created_at: Date
|
|
}
|
|
|
|
// === TIPOS DE INTEGRAÇÃO ===
|
|
|
|
// Configuração de integração externa
|
|
export interface ConfiguracaoIntegracao {
|
|
nome: string
|
|
ativa: boolean
|
|
url_base: string
|
|
chave_api?: string
|
|
configuracoes: Record<string, any>
|
|
ultima_sincronizacao?: Date
|
|
}
|
|
|
|
// Resultado de sincronização
|
|
export interface ResultadoSincronizacao {
|
|
sucesso: boolean
|
|
itens_sincronizados: number
|
|
erros: string[]
|
|
timestamp: Date
|
|
}
|
|
|
|
// === UTILITÁRIOS DE TIPO ===
|
|
|
|
// Torna todas as propriedades opcionais exceto as especificadas
|
|
export type PartialExcept<T, K extends keyof T> = Partial<T> & Pick<T, K>
|
|
|
|
// Torna todas as propriedades obrigatórias exceto as especificadas
|
|
export type RequiredExcept<T, K extends keyof T> = Required<T> & Partial<Pick<T, K>>
|
|
|
|
// Extrai tipos de união
|
|
export type ExtractUnion<T, U> = T extends U ? T : never
|
|
|
|
// Tipo para campos de auditoria
|
|
export interface CamposAuditoria {
|
|
created_at: Date
|
|
updated_at: Date
|
|
created_by?: UsuarioId
|
|
updated_by?: UsuarioId
|
|
}
|
|
|
|
// Tipo base para entidades
|
|
export interface EntidadeBase {
|
|
id: string
|
|
}
|
|
|
|
// Tipo para entidades com auditoria
|
|
export interface EntidadeComAuditoria extends EntidadeBase, CamposAuditoria {} |