// 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 & { __brand: K } // IDs tipados por entidade export type UsuarioId = Brand export type ObraId = Brand export type RDOId = Brand export type TarefaId = Brand export type AtividadeId = Brand export type EquipamentoId = Brand export type OcorrenciaId = Brand export type AnexoId = Brand export type InspecaoSoldaId = Brand export type VerificacaoTorqueId = Brand export type TaskLogId = Brand // 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 { 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 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 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 = Partial & Pick // Torna todas as propriedades obrigatórias exceto as especificadas export type RequiredExcept = Required & Partial> // Extrai tipos de união export type ExtractUnion = 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 {}