First commit - backup RDOC

This commit is contained in:
2026-02-20 07:20:32 -03:00
commit b7415f0586
259 changed files with 51707 additions and 0 deletions

470
src/types/api.types.ts Normal file
View File

@@ -0,0 +1,470 @@
// Tipos para API e comunicação com o backend
// Define interfaces para requests, responses e hooks do React Query
import type {
UsuarioId,
ObraId,
RDOId,
TarefaId,
UserRoleType,
ObraStatusType,
RDOStatusType,
TarefaStatusType,
TarefaPrioridadeType,
FiltrosAvancadosObra,
CriteriosOrdenacao,
Paginacao
} from './domain.types'
import type {
Usuario,
Obra,
RDO,
Tarefa,
RDOCompleto,
ObraCompleta,
TablesInsert,
TablesUpdate
} from './database.types'
// === TIPOS BASE DA API ===
// Resposta padrão da API
export interface ApiResponse<T = any> {
success: boolean
data?: T
error?: string
message?: string
timestamp: string
}
// Resposta de erro da API
export interface ApiError {
code: string
message: string
details?: Record<string, any>
timestamp: string
}
// Metadados de resposta
export interface ResponseMetadata {
total_count?: number
page?: number
per_page?: number
has_more?: boolean
execution_time?: number
}
// Resposta paginada
export interface PaginatedApiResponse<T> extends ApiResponse<T[]> {
metadata: ResponseMetadata
pagination: Paginacao
}
// === TIPOS PARA AUTENTICAÇÃO ===
// Request de login
export interface LoginRequest {
email: string
password: string
remember_me?: boolean
}
// Response de login
export interface LoginResponse {
user: Usuario
access_token: string
refresh_token: string
expires_in: number
}
// Request de registro
export interface RegisterRequest {
nome: string
email: string
password: string
telefone?: string
cargo?: string
}
// Request de reset de senha
export interface ResetPasswordRequest {
email: string
}
// Request de mudança de senha
export interface ChangePasswordRequest {
current_password: string
new_password: string
confirm_password: string
}
// === TIPOS PARA USUÁRIOS ===
// Request de criação de usuário
export interface CreateUsuarioRequest extends TablesInsert<'usuarios'> {}
// Request de atualização de usuário
export interface UpdateUsuarioRequest extends TablesUpdate<'usuarios'> {
id: UsuarioId
}
// Filtros para listagem de usuários
export interface UsuarioFilters {
role?: UserRoleType[]
ativo?: boolean
search?: string
cargo?: string[]
}
// Parâmetros de busca de usuários
export interface UsuarioSearchParams extends UsuarioFilters {
page?: number
per_page?: number
sort_by?: string
sort_order?: 'asc' | 'desc'
}
// === TIPOS PARA OBRAS ===
// Request de criação de obra
export interface CreateObraRequest extends TablesInsert<'obras'> {}
// Request de atualização de obra
export interface UpdateObraRequest extends TablesUpdate<'obras'> {
id: ObraId
}
// Filtros para listagem de obras
export interface ObraFilters extends FiltrosAvancadosObra {
responsavel_id?: UsuarioId
status?: ObraStatusType[]
data_inicio_from?: string
data_inicio_to?: string
progresso_min?: number
progresso_max?: number
}
// Parâmetros de busca de obras
export interface ObraSearchParams extends ObraFilters {
page?: number
per_page?: number
sort_by?: string
sort_order?: 'asc' | 'desc'
include_stats?: boolean
}
// Estatísticas de obra
export interface ObraStats {
total_rdos: number
rdos_aprovados: number
rdos_pendentes: number
progresso_medio: number
total_tarefas: number
tarefas_concluidas: number
ultima_atividade: string
}
// === TIPOS PARA RDOs ===
// Request de criação de RDO
export interface CreateRDORequest extends TablesInsert<'rdos'> {
atividades?: TablesInsert<'rdo_atividades'>[]
mao_obra?: TablesInsert<'rdo_mao_obra'>[]
equipamentos?: TablesInsert<'rdo_equipamentos'>[]
ocorrencias?: TablesInsert<'rdo_ocorrencias'>[]
anexos?: TablesInsert<'rdo_anexos'>[]
}
// Request de atualização de RDO
export interface UpdateRDORequest extends TablesUpdate<'rdos'> {
id: RDOId
atividades?: TablesUpdate<'rdo_atividades'>[]
mao_obra?: TablesUpdate<'rdo_mao_obra'>[]
equipamentos?: TablesUpdate<'rdo_equipamentos'>[]
ocorrencias?: TablesUpdate<'rdo_ocorrencias'>[]
anexos?: TablesUpdate<'rdo_anexos'>[]
}
// Filtros para listagem de RDOs
export interface RDOFilters {
obra_id?: ObraId
criado_por?: UsuarioId
status?: RDOStatusType[]
data_relatorio_from?: string
data_relatorio_to?: string
aprovado_por?: UsuarioId
obra_ids?: ObraId[]
periodo?: { inicio: Date; fim: Date }
aprovado_por_ids?: UsuarioId[]
contem_ocorrencias?: boolean
tipos_atividade?: string[]
equipamentos_utilizados?: string[]
texto_busca?: string
}
// Parâmetros de busca de RDOs
export interface RDOSearchParams extends RDOFilters {
page?: number
per_page?: number
sort_by?: string
sort_order?: 'asc' | 'desc'
include_details?: boolean
}
// Request de aprovação de RDO
export interface ApproveRDORequest {
rdo_id: RDOId
aprovado: boolean
observacoes?: string
}
// === TIPOS PARA TAREFAS ===
// Request de criação de tarefa
export interface CreateTarefaRequest extends TablesInsert<'tarefas'> {}
// Request de atualização de tarefa
export interface UpdateTarefaRequest extends TablesUpdate<'tarefas'> {
id: TarefaId
}
// Filtros para listagem de tarefas
export interface TarefaFilters {
obra_id?: ObraId
responsavel_id?: UsuarioId
status?: TarefaStatusType[]
prioridade?: TarefaPrioridadeType[]
data_inicio_from?: string
data_inicio_to?: string
data_fim_from?: string
data_fim_to?: string
search?: string
}
// Parâmetros de busca de tarefas
export interface TarefaSearchParams extends TarefaFilters {
page?: number
per_page?: number
sort_by?: string
sort_order?: 'asc' | 'desc'
}
// === TIPOS PARA UPLOAD DE ARQUIVOS ===
// Request de upload
export interface UploadRequest {
file: File
entity_type: 'rdo' | 'obra' | 'usuario'
entity_id: string
description?: string
}
// Response de upload
export interface UploadResponse {
file_id: string
file_name: string
file_url: string
file_size: number
mime_type: string
uploaded_at: string
}
// === TIPOS PARA RELATÓRIOS ===
// Request de geração de relatório
export interface GenerateReportRequest {
type: 'rdo' | 'obra' | 'produtividade' | 'ocorrencias'
format: 'pdf' | 'excel' | 'csv'
filters: Record<string, any>
date_range: {
start: string
end: string
}
include_charts?: boolean
template_id?: string
}
// Response de relatório
export interface ReportResponse {
report_id: string
download_url: string
expires_at: string
file_size: number
generated_at: string
}
// === TIPOS PARA HOOKS DO REACT QUERY ===
// Opções base para queries
export interface BaseQueryOptions {
enabled?: boolean
staleTime?: number
cacheTime?: number
refetchOnWindowFocus?: boolean
refetchOnMount?: boolean
retry?: boolean | number
}
// Opções para mutations
export interface BaseMutationOptions<TData = any, TError = ApiError, TVariables = any> {
onSuccess?: (data: TData, variables: TVariables) => void
onError?: (error: TError, variables: TVariables) => void
onSettled?: (data: TData | undefined, error: TError | null, variables: TVariables) => void
}
// Resultado de query paginada
export interface UsePaginatedQueryResult<T> {
data: T[]
isLoading: boolean
isError: boolean
error: ApiError | null
pagination: Paginacao
hasNextPage: boolean
hasPreviousPage: boolean
fetchNextPage: () => void
fetchPreviousPage: () => void
refetch: () => void
}
// Resultado de mutation
export interface UseMutationResult<TData, TError, TVariables> {
mutate: (variables: TVariables) => void
mutateAsync: (variables: TVariables) => Promise<TData>
isLoading: boolean
isError: boolean
isSuccess: boolean
error: TError | null
data: TData | undefined
reset: () => void
}
// === TIPOS PARA CACHE E SINCRONIZAÇÃO ===
// Configuração de cache
export interface CacheConfig {
key: string
ttl: number
invalidateOn: string[]
dependencies: string[]
}
// Estado de sincronização
export interface SyncState {
lastSync: string
syncing: boolean
pendingChanges: number
conflicts: any[]
}
// === TIPOS PARA WEBSOCKET ===
// Mensagem de WebSocket
export interface WebSocketMessage {
type: string
payload: any
timestamp: string
user_id?: UsuarioId
}
// Eventos de WebSocket
export interface WebSocketEvents {
'rdo:created': { rdo: RDO }
'rdo:updated': { rdo: RDO }
'rdo:approved': { rdo: RDO, approved_by: UsuarioId }
'obra:updated': { obra: Obra }
'tarefa:assigned': { tarefa: Tarefa, assigned_to: UsuarioId }
'notification': { message: string, type: string }
}
// === CONSTANTES DA API ===
// Endpoints da API
export const API_ENDPOINTS = {
// Autenticação
LOGIN: '/auth/login',
LOGOUT: '/auth/logout',
REGISTER: '/auth/register',
REFRESH: '/auth/refresh',
RESET_PASSWORD: '/auth/reset-password',
CHANGE_PASSWORD: '/auth/change-password',
// Usuários
USERS: '/users',
USER_BY_ID: (id: string) => `/users/${id}`,
USER_PROFILE: '/users/profile',
// Obras
OBRAS: '/obras',
OBRA_BY_ID: (id: string) => `/obras/${id}`,
OBRA_STATS: (id: string) => `/obras/${id}/stats`,
// RDOs
RDOS: '/rdos',
RDO_BY_ID: (id: string) => `/rdos/${id}`,
RDO_APPROVE: (id: string) => `/rdos/${id}/approve`,
RDO_EXPORT: (id: string) => `/rdos/${id}/export`,
// Tarefas
TAREFAS: '/tarefas',
TAREFA_BY_ID: (id: string) => `/tarefas/${id}`,
// Upload
UPLOAD: '/upload',
UPLOAD_BY_ID: (id: string) => `/upload/${id}`,
// Relatórios
REPORTS: '/reports',
REPORT_GENERATE: '/reports/generate',
REPORT_DOWNLOAD: (id: string) => `/reports/${id}/download`,
// Configurações
SETTINGS: '/settings',
SETTINGS_BY_KEY: (key: string) => `/settings/${key}`
} as const
// Códigos de status HTTP
export const HTTP_STATUS = {
OK: 200,
CREATED: 201,
NO_CONTENT: 204,
BAD_REQUEST: 400,
UNAUTHORIZED: 401,
FORBIDDEN: 403,
NOT_FOUND: 404,
CONFLICT: 409,
UNPROCESSABLE_ENTITY: 422,
INTERNAL_SERVER_ERROR: 500
} as const
// Códigos de erro da aplicação
export const ERROR_CODES = {
VALIDATION_ERROR: 'VALIDATION_ERROR',
AUTHENTICATION_ERROR: 'AUTHENTICATION_ERROR',
AUTHORIZATION_ERROR: 'AUTHORIZATION_ERROR',
NOT_FOUND_ERROR: 'NOT_FOUND_ERROR',
DUPLICATE_ERROR: 'DUPLICATE_ERROR',
BUSINESS_RULE_ERROR: 'BUSINESS_RULE_ERROR',
EXTERNAL_SERVICE_ERROR: 'EXTERNAL_SERVICE_ERROR',
RATE_LIMIT_ERROR: 'RATE_LIMIT_ERROR'
} as const
export type ErrorCodeType = typeof ERROR_CODES[keyof typeof ERROR_CODES]
// === UTILITÁRIOS DE TIPO ===
// Extrai o tipo de dados de uma resposta da API
export type ExtractApiData<T> = T extends ApiResponse<infer U> ? U : never
// Extrai o tipo de parâmetros de uma função de API
export type ExtractApiParams<T> = T extends (...args: infer P) => any ? P[0] : never
// Tipo para query keys do React Query
export type QueryKey = readonly [string, ...any[]]
// Tipo para invalidação de queries
export type InvalidateQueriesFilter = {
queryKey?: QueryKey
exact?: boolean
type?: 'active' | 'inactive' | 'all'
}

598
src/types/database.types.ts Normal file
View File

@@ -0,0 +1,598 @@
// Tipos TypeScript gerados para o banco de dados RDO
// Baseado na arquitetura completa documentada
export interface Database {
public: {
Tables: {
usuarios: {
Row: {
id: string
email: string
nome: string
organizacao_id: string
telefone: string | null
cargo: string | null
role: 'admin' | 'engenheiro' | 'mestre_obra' | 'usuario'
ativo: boolean
created_at: string
updated_at: string
}
Insert: {
id?: string
email: string
nome: string
organizacao_id?: string
telefone?: string | null
cargo?: string | null
role?: 'admin' | 'engenheiro' | 'mestre_obra' | 'usuario'
ativo?: boolean
created_at?: string
updated_at?: string
}
Update: {
id?: string
email?: string
nome?: string
organizacao_id?: string
telefone?: string | null
cargo?: string | null
role?: 'admin' | 'engenheiro' | 'mestre_obra' | 'usuario'
ativo?: boolean
created_at?: string
updated_at?: string
}
}
obras: {
Row: {
id: string
organizacao_id: string
nome: string
descricao: string | null
endereco: string | null
cep: string | null
cidade: string | null
estado: string | null
responsavel_id: string | null
data_inicio: string | null
data_prevista_fim: string | null
data_conclusao: string | null
progresso_geral: number
status: 'ativa' | 'pausada' | 'concluida' | 'cancelada'
configuracoes: Record<string, any>
created_at: string
updated_at: string
}
Insert: {
id?: string
organizacao_id: string
nome: string
descricao?: string | null
endereco?: string | null
cep?: string | null
cidade?: string | null
estado?: string | null
responsavel_id?: string | null
data_inicio?: string | null
data_prevista_fim?: string | null
data_conclusao?: string | null
progresso_geral?: number
status?: 'ativa' | 'pausada' | 'concluida' | 'cancelada'
configuracoes?: Record<string, any>
created_at?: string
updated_at?: string
}
Update: {
id?: string
organizacao_id?: string
nome?: string
descricao?: string | null
endereco?: string | null
cep?: string | null
cidade?: string | null
estado?: string | null
responsavel_id?: string | null
data_inicio?: string | null
data_prevista_fim?: string | null
data_conclusao?: string | null
progresso_geral?: number
status?: 'ativa' | 'pausada' | 'concluida' | 'cancelada'
configuracoes?: Record<string, any>
created_at?: string
updated_at?: string
}
}
rdos: {
Row: {
id: string
organizacao_id: string
obra_id: string
criado_por: string
data_relatorio: string
condicoes_climaticas: string
observacoes_gerais: string | null
status: 'rascunho' | 'enviado' | 'aprovado' | 'rejeitado'
aprovado_por: string | null
aprovado_em: string | null
created_at: string
updated_at: string
}
Insert: {
id?: string
organizacao_id?: string
obra_id: string
criado_por: string
data_relatorio: string
condicoes_climaticas: string
observacoes_gerais?: string | null
status?: 'rascunho' | 'enviado' | 'aprovado' | 'rejeitado'
aprovado_por?: string | null
aprovado_em?: string | null
created_at?: string
updated_at?: string
}
Update: {
id?: string
organizacao_id?: string
obra_id?: string
criado_por?: string
data_relatorio?: string
condicoes_climaticas?: string
observacoes_gerais?: string | null
status?: 'rascunho' | 'enviado' | 'aprovado' | 'rejeitado'
aprovado_por?: string | null
aprovado_em?: string | null
created_at?: string
updated_at?: string
}
}
rdo_atividades: {
Row: {
id: string
rdo_id: string
tipo_atividade: string
descricao: string
localizacao: string | null
percentual_concluido: number
ordem: number
created_at: string
}
Insert: {
id?: string
rdo_id: string
tipo_atividade: string
descricao: string
localizacao?: string | null
percentual_concluido?: number
ordem?: number
created_at?: string
}
Update: {
id?: string
rdo_id?: string
tipo_atividade?: string
descricao?: string
localizacao?: string | null
percentual_concluido?: number
ordem?: number
created_at?: string
}
}
rdo_mao_obra: {
Row: {
id: string
rdo_id: string
funcao: string
quantidade: number
horas_trabalhadas: number
observacoes: string | null
created_at: string
}
Insert: {
id?: string
rdo_id: string
funcao: string
quantidade?: number
horas_trabalhadas?: number
observacoes?: string | null
created_at?: string
}
Update: {
id?: string
rdo_id?: string
funcao?: string
quantidade?: number
horas_trabalhadas?: number
observacoes?: string | null
created_at?: string
}
}
rdo_equipamentos: {
Row: {
id: string
rdo_id: string
nome_equipamento: string
tipo: string | null
horas_utilizadas: number
combustivel_gasto: number
observacoes: string | null
created_at: string
}
Insert: {
id?: string
rdo_id: string
nome_equipamento: string
tipo?: string | null
horas_utilizadas?: number
combustivel_gasto?: number
observacoes?: string | null
created_at?: string
}
Update: {
id?: string
rdo_id?: string
nome_equipamento?: string
tipo?: string | null
horas_utilizadas?: number
combustivel_gasto?: number
observacoes?: string | null
created_at?: string
}
}
rdo_ocorrencias: {
Row: {
id: string
rdo_id: string
tipo_ocorrencia: string
descricao: string
gravidade: 'baixa' | 'media' | 'alta' | 'critica'
acao_tomada: string | null
created_at: string
}
Insert: {
id?: string
rdo_id: string
tipo_ocorrencia: string
descricao: string
gravidade?: 'baixa' | 'media' | 'alta' | 'critica'
acao_tomada?: string | null
created_at?: string
}
Update: {
id?: string
rdo_id?: string
tipo_ocorrencia?: string
descricao?: string
gravidade?: 'baixa' | 'media' | 'alta' | 'critica'
acao_tomada?: string | null
created_at?: string
}
}
rdo_anexos: {
Row: {
id: string
rdo_id: string
nome_arquivo: string
tipo_arquivo: string | null
url_storage: string
tamanho_bytes: number | null
descricao: string | null
created_at: string
}
Insert: {
id?: string
rdo_id: string
nome_arquivo: string
tipo_arquivo?: string | null
url_storage: string
tamanho_bytes?: number | null
descricao?: string | null
created_at?: string
}
Update: {
id?: string
rdo_id?: string
nome_arquivo?: string
tipo_arquivo?: string | null
url_storage?: string
tamanho_bytes?: number | null
descricao?: string | null
created_at?: string
}
}
rdo_inspecoes_solda: {
Row: {
id: string
rdo_id: string
identificacao_junta: string
status_inspecao: 'aprovado' | 'reprovado' | 'pendente'
metodo_inspecao: string | null
observacoes: string | null
inspecionado_por: string | null
created_at: string
}
Insert: {
id?: string
rdo_id: string
identificacao_junta: string
status_inspecao?: 'aprovado' | 'reprovado' | 'pendente'
metodo_inspecao?: string | null
observacoes?: string | null
inspecionado_por?: string | null
created_at?: string
}
Update: {
id?: string
rdo_id?: string
identificacao_junta?: string
status_inspecao?: 'aprovado' | 'reprovado' | 'pendente'
metodo_inspecao?: string | null
observacoes?: string | null
inspecionado_por?: string | null
created_at?: string
}
}
rdo_verificacoes_torque: {
Row: {
id: string
rdo_id: string
identificacao_parafuso: string
torque_especificado: number
torque_aplicado: number
status_verificacao: 'conforme' | 'nao_conforme'
observacoes: string | null
verificado_por: string | null
created_at: string
}
Insert: {
id?: string
rdo_id: string
identificacao_parafuso: string
torque_especificado?: number
torque_aplicado: number
status_verificacao?: 'conforme' | 'nao_conforme'
observacoes?: string | null
verificado_por?: string | null
created_at?: string
}
Update: {
id?: string
rdo_id?: string
identificacao_parafuso?: string
torque_especificado?: number
torque_aplicado?: number
status_verificacao?: 'conforme' | 'nao_conforme'
observacoes?: string | null
verificado_por?: string | null
created_at?: string
}
}
tarefas: {
Row: {
id: string
organizacao_id: string
obra_id: string
titulo: string
descricao: string | null
status: 'pendente' | 'em_andamento' | 'pausada' | 'concluida' | 'cancelada' | 'atrasada'
prioridade: 'baixa' | 'media' | 'alta' | 'urgente' | 'critica'
responsavel_id: string | null
data_inicio: string | null
data_fim: string | null
progresso: number
metadados: Record<string, any>
created_at: string
updated_at: string
}
Insert: {
id?: string
organizacao_id?: string
obra_id: string
titulo: string
descricao?: string | null
status?: 'pendente' | 'em_andamento' | 'pausada' | 'concluida' | 'cancelada' | 'atrasada'
prioridade?: 'baixa' | 'media' | 'alta' | 'urgente' | 'critica'
responsavel_id?: string | null
data_inicio?: string | null
data_fim?: string | null
progresso?: number
metadados?: Record<string, any>
created_at?: string
updated_at?: string
}
Update: {
id?: string
organizacao_id?: string
obra_id?: string
titulo?: string
descricao?: string | null
status?: 'pendente' | 'em_andamento' | 'pausada' | 'concluida' | 'cancelada' | 'atrasada'
prioridade?: 'baixa' | 'media' | 'alta' | 'urgente' | 'critica'
responsavel_id?: string | null
data_inicio?: string | null
data_fim?: string | null
progresso?: number
metadados?: Record<string, any>
created_at?: string
updated_at?: string
}
}
inventario_equipamentos: {
Row: {
id: string
organizacao_id: string
nome: string
codigo: string | null
marca: string | null
modelo: string | null
numero_serie: string | null
status: 'disponivel' | 'em_uso' | 'manutencao' | 'inativo' | 'danificado' | 'perdido'
obra_atual_id: string | null
data_aquisicao: string | null
valor: number | null
created_at: string
updated_at: string
}
Insert: {
id?: string
organizacao_id?: string
nome: string
codigo?: string | null
marca?: string | null
modelo?: string | null
numero_serie?: string | null
status?: 'disponivel' | 'em_uso' | 'manutencao' | 'inativo' | 'danificado' | 'perdido'
obra_atual_id?: string | null
data_aquisicao?: string | null
valor?: number | null
created_at?: string
updated_at?: string
}
Update: {
id?: string
organizacao_id?: string
nome?: string
codigo?: string | null
marca?: string | null
modelo?: string | null
numero_serie?: string | null
status?: 'disponivel' | 'em_uso' | 'manutencao' | 'inativo' | 'danificado' | 'perdido'
obra_atual_id?: string | null
data_aquisicao?: string | null
valor?: number | null
created_at?: string
updated_at?: string
}
}
task_logs: {
Row: {
id: string
task_id: string
usuario_id: string
tipo_evento: 'inicio' | 'pausa' | 'retomada' | 'conclusao' | 'revisao' | 'edicao' | 'cancelamento'
descricao: string | null
detalhes: Record<string, any>
created_at: string
}
Insert: {
id?: string
task_id: string
usuario_id: string
tipo_evento: 'inicio' | 'pausa' | 'retomada' | 'conclusao' | 'revisao' | 'edicao' | 'cancelamento'
descricao?: string | null
detalhes?: Record<string, any>
created_at?: string
}
Update: {
id?: string
task_id?: string
usuario_id?: string
tipo_evento?: 'inicio' | 'pausa' | 'retomada' | 'conclusao' | 'revisao' | 'edicao' | 'cancelamento'
descricao?: string | null
detalhes?: Record<string, any>
created_at?: string
}
}
}
Views: {
[_ in never]: never
}
Functions: {
[_ in never]: never
}
Enums: {
[_ in never]: never
}
}
}
// Tipos auxiliares para facilitar o uso
export type Tables<T extends keyof Database['public']['Tables']> = Database['public']['Tables'][T]['Row']
export type TablesInsert<T extends keyof Database['public']['Tables']> = Database['public']['Tables'][T]['Insert']
export type TablesUpdate<T extends keyof Database['public']['Tables']> = Database['public']['Tables'][T]['Update']
// Tipos específicos das entidades
export type Usuario = Tables<'usuarios'>
export type UsuarioInsert = TablesInsert<'usuarios'>
export type UsuarioUpdate = TablesUpdate<'usuarios'>
export type Obra = Tables<'obras'>
export type ObraInsert = TablesInsert<'obras'>
export type ObraUpdate = TablesUpdate<'obras'>
export type RDO = Tables<'rdos'>
export type RDOInsert = TablesInsert<'rdos'>
export type RDOUpdate = TablesUpdate<'rdos'>
export type RDOAtividade = Tables<'rdo_atividades'>
export type RDOMaoObra = Tables<'rdo_mao_obra'>
export type RDOEquipamento = Tables<'rdo_equipamentos'>
export type RDOOcorrencia = Tables<'rdo_ocorrencias'>
export type RDOAnexo = Tables<'rdo_anexos'>
export type RDOInspecaoSolda = Tables<'rdo_inspecoes_solda'>
export type RDOVerificacaoTorque = Tables<'rdo_verificacoes_torque'>
export type Tarefa = Tables<'tarefas'>
export type TaskLog = Tables<'task_logs'>
// Tipos compostos para RDO completo
export type RDOCompleto = RDO & {
atividades: RDOAtividade[]
mao_obra: RDOMaoObra[]
equipamentos: RDOEquipamento[]
ocorrencias: RDOOcorrencia[]
anexos: RDOAnexo[]
inspecoes_solda: RDOInspecaoSolda[]
verificacoes_torque: RDOVerificacaoTorque[]
obra: Obra
criador: Usuario
}
// Tipos para inserção de RDO completo
export type RDOCompletoInsert = TablesInsert<'rdos'> & {
atividades?: TablesInsert<'rdo_atividades'>[]
mao_obra?: TablesInsert<'rdo_mao_obra'>[]
equipamentos?: TablesInsert<'rdo_equipamentos'>[]
ocorrencias?: TablesInsert<'rdo_ocorrencias'>[]
anexos?: TablesInsert<'rdo_anexos'>[]
inspecoes_solda?: TablesInsert<'rdo_inspecoes_solda'>[]
verificacoes_torque?: TablesInsert<'rdo_verificacoes_torque'>[]
}
// Tipos para obra com detalhes
export type ObraCompleta = Obra & {
responsavel: Usuario | null
rdos: RDO[]
tarefas: Tarefa[]
}
// Tipos para autenticação
export interface AuthUser {
id: string
email: string
role: Usuario['role']
nome: string
cargo: string | null
}
// Tipos para filtros e consultas
export interface FiltroRDO {
obra_id?: string
data_inicio?: string
data_fim?: string
status?: RDO['status']
criado_por?: string
}
export interface FiltroObra {
status?: Obra['status']
responsavel_id?: string
data_inicio?: string
data_fim?: string
}
export interface FiltroTarefa {
obra_id?: string
status?: Tarefa['status']
prioridade?: Tarefa['prioridade']
responsavel_id?: string
data_inicio?: string
data_fim?: string
}

347
src/types/domain.types.ts Normal file
View File

@@ -0,0 +1,347 @@
// 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 {}

358
src/types/index.ts Normal file
View File

@@ -0,0 +1,358 @@
// Exportações centralizadas de todos os tipos do sistema RDO
// Este arquivo serve como ponto único de entrada para todos os tipos
// === TIPOS DE BANCO DE DADOS ===
export type {
Database,
Tables,
TablesInsert,
TablesUpdate,
Usuario,
Obra,
RDO,
RDOAtividade,
RDOMaoObra,
RDOEquipamento,
RDOOcorrencia,
RDOAnexo,
RDOInspecaoSolda,
RDOVerificacaoTorque,
Tarefa,
TaskLog,
RDOCompleto,
RDOCompletoInsert,
ObraCompleta,
AuthUser,
FiltroRDO,
FiltroObra,
FiltroTarefa
} from './database.types'
// === TIPOS DE DOMÍNIO ===
export type {
// Branded Types
Brand,
UsuarioId,
ObraId,
RDOId,
TarefaId,
AtividadeId,
EquipamentoId,
OcorrenciaId,
AnexoId,
InspecaoSoldaId,
VerificacaoTorqueId,
TaskLogId,
// Enums e Constantes
UserRoleType,
ObraStatusType,
RDOStatusType,
TarefaStatusType,
TarefaPrioridadeType,
TaskLogTipoEventoType,
StatusVerificacaoType,
TipoNotificacaoType,
// Tipos Específicos
Coordenadas,
Endereco,
Periodo,
CondicoesClimaticas,
ProgressoDetalhado,
ConfiguracoesObra,
MetadadosTarefa,
DetalhesEventoLog,
// Validação
ResultadoValidacao,
ValidacaoRDO,
// Relatórios
EstatisticasObra,
RelatorioProdutividade,
// Busca e Filtros
CriteriosOrdenacao,
Paginacao,
ResultadoPaginado,
FiltrosAvancadosRDO,
FiltrosAvancadosObra,
// Notificações
Notificacao,
// Integração
ConfiguracaoIntegracao,
ResultadoSincronizacao,
// Utilitários
PartialExcept,
RequiredExcept,
ExtractUnion,
CamposAuditoria,
EntidadeBase,
EntidadeComAuditoria
} from './domain.types'
// === CONSTANTES DE DOMÍNIO ===
export {
UserRole,
ObraStatus,
RDOStatus,
TarefaStatus,
TarefaPrioridade,
TaskLogTipoEvento,
StatusVerificacao,
TipoNotificacao,
createUsuarioId,
createObraId,
createRDOId,
createTarefaId,
createAtividadeId,
createEquipamentoId,
createOcorrenciaId,
createAnexoId,
createInspecaoSoldaId,
createVerificacaoTorqueId,
createTaskLogId
} from './domain.types'
// === TIPOS DE VALIDAÇÃO ===
export type {
// Validação Base
ValidacaoCampo,
RegraValidacao,
// Schemas de Validação
SchemaValidacaoUsuario,
SchemaValidacaoObra,
SchemaValidacaoRDO,
// Formulários
EstadoCampoFormulario,
EstadoFormulario,
ConfiguracaoCampoFormulario,
DadosFormularioUsuario,
DadosFormularioObra,
DadosFormularioRDO,
DadosFormularioAtividade,
DadosFormularioMaoObra,
DadosFormularioEquipamento,
DadosFormularioOcorrencia,
DadosFormularioTarefa,
// Validações Específicas
ValidacaoDocumento,
ValidacaoCEP,
ValidacaoEmail,
ValidacaoSenha,
// Upload
EstadoUpload,
ConfiguracaoUpload,
ResultadoUpload,
// Busca e Filtros
FiltroBusca,
ConfiguracaoBusca,
// Relatórios
ParametrosRelatorio,
EstadoRelatorio,
// Notificações
ConfiguracaoNotificacao,
// Utilitários
FuncaoValidacao,
ValidadorComposto,
ContextoValidacao
} from './validation.types'
// === CONSTANTES DE VALIDAÇÃO ===
export {
MENSAGENS_ERRO,
PADROES_VALIDACAO
} from './validation.types'
// === TIPOS DE API ===
export type {
// Base da API
ApiResponse,
ApiError,
ResponseMetadata,
PaginatedApiResponse,
// Autenticação
LoginRequest,
LoginResponse,
RegisterRequest,
ResetPasswordRequest,
ChangePasswordRequest,
// Usuários
CreateUsuarioRequest,
UpdateUsuarioRequest,
UsuarioFilters,
UsuarioSearchParams,
// Obras
CreateObraRequest,
UpdateObraRequest,
ObraFilters,
ObraSearchParams,
ObraStats,
// RDOs
CreateRDORequest,
UpdateRDORequest,
RDOFilters,
RDOSearchParams,
ApproveRDORequest,
// Tarefas
CreateTarefaRequest,
UpdateTarefaRequest,
TarefaFilters,
TarefaSearchParams,
// Upload
UploadRequest,
UploadResponse,
// Relatórios
GenerateReportRequest,
ReportResponse,
// Hooks React Query
BaseQueryOptions,
BaseMutationOptions,
UsePaginatedQueryResult,
UseMutationResult,
// Cache e Sincronização
CacheConfig,
SyncState,
// WebSocket
WebSocketMessage,
WebSocketEvents,
// Utilitários
ExtractApiData,
ExtractApiParams,
QueryKey,
InvalidateQueriesFilter,
ErrorCodeType
} from './api.types'
// === CONSTANTES DE API ===
export {
API_ENDPOINTS,
HTTP_STATUS,
ERROR_CODES
} from './api.types'
// === TIPOS LEGADOS (para compatibilidade) ===
// Estes tipos são mantidos para compatibilidade com código existente
// e devem ser gradualmente migrados para os novos tipos
export interface Task {
id: string
title: string
description?: string
completed: boolean
priority: 'low' | 'medium' | 'high'
dueDate?: string
createdAt: string
updatedAt: string
}
export interface Equipamento {
id: string
nome: string
tipo: string
status: 'disponivel' | 'em_uso' | 'manutencao'
localizacao?: string
}
export interface ReportData {
id: string
title: string
data: any[]
generatedAt: string
type: 'rdo' | 'obra' | 'produtividade'
}
export interface Atividade {
id: string
descricao: string
tipo: string
percentual_concluido: number
localizacao?: string
}
export interface MaoDeObra {
id: string
funcao: string
quantidade: number
horas_trabalhadas: number
observacoes?: string
}
export interface Ocorrencia {
id: string
tipo: string
descricao: string
gravidade: 'baixa' | 'media' | 'alta' | 'critica'
data_ocorrencia: string
acao_tomada?: string
}
// === RE-EXPORTAÇÕES PARA COMPATIBILIDADE ===
// Aliases para manter compatibilidade com imports existentes
export type { Usuario as User } from './database.types'
export type { Obra as Project } from './database.types'
export type { RDO as Report } from './database.types'
export type { Tarefa as TaskEntity } from './database.types'
// === TIPOS UTILITÁRIOS GLOBAIS ===
// Tipo para IDs genéricos
export type ID = string
// Tipo para timestamps
export type Timestamp = string
// Tipo para status genérico
export type Status = 'active' | 'inactive' | 'pending' | 'completed' | 'cancelled'
// Tipo para prioridade genérica
export type Priority = 'low' | 'medium' | 'high' | 'urgent'
// Tipo para operações CRUD
export type CrudOperation = 'create' | 'read' | 'update' | 'delete'
// Tipo para permissões
export type Permission = 'read' | 'write' | 'delete' | 'admin'
// Tipo para ambiente
export type Environment = 'development' | 'staging' | 'production'
// === GUARDS DE TIPO ===
// Guard para verificar se um valor é um ID válido
export const isValidId = (value: any): value is string => {
return typeof value === 'string' && value.length > 0
}
// Guard para verificar se um objeto tem propriedade id
export const hasId = (obj: any): obj is { id: string } => {
return obj && typeof obj === 'object' && 'id' in obj && isValidId(obj.id)
}
// Guard para verificar se um objeto é uma entidade com auditoria
export const hasAuditFields = (obj: any): obj is import('./domain.types').CamposAuditoria => {
return obj && typeof obj === 'object' && 'created_at' in obj && 'updated_at' in obj
}

66
src/types/taskLog.ts Normal file
View File

@@ -0,0 +1,66 @@
export type TaskLogEventType =
| 'inicio'
| 'pausa'
| 'retomada'
| 'conclusao'
| 'revisao'
| 'edicao'
| 'cancelamento';
export interface TaskLogEvent {
id: string;
taskId: string;
type: TaskLogEventType;
timestamp: string;
usuario: string;
descricao?: string;
detalhes?: {
statusAnterior?: string;
statusNovo?: string;
progressoAnterior?: number;
progressoNovo?: number;
camposAlterados?: string[];
observacoes?: string;
};
}
export interface TaskLog {
taskId: string;
eventos: TaskLogEvent[];
criadoEm: string;
atualizadoEm: string;
}
export interface TaskLogStorage {
[taskId: string]: TaskLog;
}
export const eventTypeLabels: Record<TaskLogEventType, string> = {
inicio: 'Tarefa Iniciada',
pausa: 'Tarefa Pausada',
retomada: 'Tarefa Retomada',
conclusao: 'Tarefa Concluída',
revisao: 'Tarefa Revisada',
edicao: 'Tarefa Editada',
cancelamento: 'Tarefa Cancelada'
};
export const eventTypeIcons: Record<TaskLogEventType, string> = {
inicio: 'Play',
pausa: 'Pause',
retomada: 'Play',
conclusao: 'CheckCircle2',
revisao: 'RotateCcw',
edicao: 'Edit3',
cancelamento: 'X'
};
export const eventTypeColors: Record<TaskLogEventType, string> = {
inicio: 'text-blue-600 bg-blue-100 dark:bg-blue-900/30',
pausa: 'text-yellow-600 bg-yellow-100 dark:bg-yellow-900/30',
retomada: 'text-blue-600 bg-blue-100 dark:bg-blue-900/30',
conclusao: 'text-green-600 bg-green-100 dark:bg-green-900/30',
revisao: 'text-purple-600 bg-purple-100 dark:bg-purple-900/30',
edicao: 'text-orange-600 bg-orange-100 dark:bg-orange-900/30',
cancelamento: 'text-red-600 bg-red-100 dark:bg-red-900/30'
};

View File

@@ -0,0 +1,391 @@
// Tipos para validação de formulários e dados do sistema RDO
// Implementa schemas de validação e tipos para formulários
import type {
UsuarioId,
ObraId,
RDOId,
UserRoleType,
ObraStatusType,
TarefaStatusType,
TarefaPrioridadeType,
Endereco,
CondicoesClimaticas,
ConfiguracoesObra,
MetadadosTarefa
} from './domain.types'
// === TIPOS BASE DE VALIDAÇÃO ===
// Resultado de validação de campo
export interface ValidacaoCampo {
campo: string
valido: boolean
mensagem?: string
codigo_erro?: string
}
// Resultado de validação completa
export interface ResultadoValidacao {
valido: boolean
erros: ValidacaoCampo[]
avisos: ValidacaoCampo[]
}
// Regras de validação
export interface RegraValidacao {
obrigatorio?: boolean
tamanho_minimo?: number
tamanho_maximo?: number
padrao_regex?: RegExp
valores_permitidos?: string[]
validacao_customizada?: (valor: any) => boolean | string
}
// === SCHEMAS DE VALIDAÇÃO PARA ENTIDADES ===
// Schema de validação para usuário
export interface SchemaValidacaoUsuario {
nome: RegraValidacao
email: RegraValidacao
telefone: RegraValidacao
cargo: RegraValidacao
role: RegraValidacao
}
// Schema de validação para obra
export interface SchemaValidacaoObra {
nome: RegraValidacao
descricao: RegraValidacao
endereco: RegraValidacao
cep: RegraValidacao
cidade: RegraValidacao
estado: RegraValidacao
responsavel_id: RegraValidacao
data_inicio: RegraValidacao
data_prevista_fim: RegraValidacao
status: RegraValidacao
}
// Schema de validação para RDO
export interface SchemaValidacaoRDO {
obra_id: RegraValidacao
data_relatorio: RegraValidacao
condicoes_climaticas: RegraValidacao
observacoes_gerais: RegraValidacao
atividades: RegraValidacao
mao_obra: RegraValidacao
equipamentos: RegraValidacao
}
// === TIPOS PARA FORMULÁRIOS ===
// Estado de campo de formulário
export interface EstadoCampoFormulario<T = any> {
valor: T
tocado: boolean
erro?: string
validando: boolean
desabilitado: boolean
}
// Estado de formulário
export interface EstadoFormulario<T extends Record<string, any>> {
campos: {
[K in keyof T]: EstadoCampoFormulario<T[K]>
}
valido: boolean
enviando: boolean
erro_geral?: string
sucesso: boolean
}
// Configuração de campo de formulário
export interface ConfiguracaoCampoFormulario {
tipo: 'text' | 'email' | 'password' | 'number' | 'date' | 'select' | 'textarea' | 'checkbox' | 'radio' | 'file'
label: string
placeholder?: string
obrigatorio: boolean
desabilitado?: boolean
opcoes?: { valor: string; label: string }[]
validacao?: RegraValidacao
dependencias?: string[]
condicional?: (valores: Record<string, any>) => boolean
}
// === FORMULÁRIOS ESPECÍFICOS ===
// Dados do formulário de usuário
export interface DadosFormularioUsuario {
nome: string
email: string
telefone: string
cargo: string
role: UserRoleType
ativo: boolean
}
// Dados do formulário de obra
export interface DadosFormularioObra {
nome: string
descricao: string
endereco: Endereco
responsavel_id: UsuarioId | null
data_inicio: string | null
data_prevista_fim: string | null
status: ObraStatusType
configuracoes: ConfiguracoesObra
}
// Dados do formulário de RDO
export interface DadosFormularioRDO {
obra_id: ObraId
data_relatorio: string
condicoes_climaticas: CondicoesClimaticas
observacoes_gerais: string
atividades: DadosFormularioAtividade[]
mao_obra: DadosFormularioMaoObra[]
equipamentos: DadosFormularioEquipamento[]
ocorrencias: DadosFormularioOcorrencia[]
}
// Dados do formulário de atividade
export interface DadosFormularioAtividade {
tipo_atividade: string
descricao: string
localizacao: string
percentual_concluido: number
ordem: number
}
// Dados do formulário de mão de obra
export interface DadosFormularioMaoObra {
funcao: string
quantidade: number
horas_trabalhadas: number
observacoes: string
}
// Dados do formulário de equipamento
export interface DadosFormularioEquipamento {
nome: string
tipo: string
horas_utilizadas: number
operador: string
observacoes: string
}
// Dados do formulário de ocorrência
export interface DadosFormularioOcorrencia {
tipo: string
descricao: string
gravidade: 'baixa' | 'media' | 'alta' | 'critica'
acao_tomada: string
responsavel: string
}
// Dados do formulário de tarefa
export interface DadosFormularioTarefa {
obra_id: ObraId
titulo: string
descricao: string
status: TarefaStatusType
prioridade: TarefaPrioridadeType
responsavel_id: UsuarioId | null
data_inicio: string | null
data_fim: string | null
progresso: number
metadados: MetadadosTarefa
}
// === VALIDAÇÕES ESPECÍFICAS ===
// Validação de CPF/CNPJ
export interface ValidacaoDocumento {
tipo: 'cpf' | 'cnpj'
numero: string
valido: boolean
formatado: string
}
// Validação de CEP
export interface ValidacaoCEP {
cep: string
valido: boolean
endereco_encontrado?: {
logradouro: string
bairro: string
cidade: string
estado: string
}
}
// Validação de email
export interface ValidacaoEmail {
email: string
valido: boolean
disponivel?: boolean
sugestoes?: string[]
}
// Validação de senha
export interface ValidacaoSenha {
senha: string
forca: 'fraca' | 'media' | 'forte' | 'muito_forte'
criterios: {
tamanho_minimo: boolean
possui_maiuscula: boolean
possui_minuscula: boolean
possui_numero: boolean
possui_simbolo: boolean
}
sugestoes: string[]
}
// === TIPOS PARA UPLOAD DE ARQUIVOS ===
// Estado de upload
export interface EstadoUpload {
arquivo: File
progresso: number
status: 'pendente' | 'enviando' | 'concluido' | 'erro'
erro?: string
url_resultado?: string
}
// Configuração de upload
export interface ConfiguracaoUpload {
tipos_permitidos: string[]
tamanho_maximo: number
multiplos_arquivos: boolean
redimensionar_imagem?: {
largura_maxima: number
altura_maxima: number
qualidade: number
}
}
// Resultado de upload
export interface ResultadoUpload {
sucesso: boolean
arquivos: {
nome_original: string
nome_arquivo: string
url: string
tamanho: number
tipo: string
}[]
erros: string[]
}
// === TIPOS PARA BUSCA E FILTROS ===
// Filtro de busca
export interface FiltroBusca {
campo: string
operador: 'igual' | 'diferente' | 'contem' | 'inicia_com' | 'termina_com' | 'maior_que' | 'menor_que' | 'entre'
valor: any
valor_secundario?: any // Para operador 'entre'
}
// Configuração de busca
export interface ConfiguracaoBusca {
campos_busca: string[]
filtros_disponiveis: {
campo: string
label: string
tipo: 'text' | 'select' | 'date' | 'number'
opcoes?: { valor: string; label: string }[]
}[]
ordenacao_padrao: {
campo: string
direcao: 'asc' | 'desc'
}
}
// === TIPOS PARA RELATÓRIOS ===
// Parâmetros de relatório
export interface ParametrosRelatorio {
tipo: 'rdo' | 'obra' | 'produtividade' | 'ocorrencias'
formato: 'pdf' | 'excel' | 'csv'
periodo_inicio: string
periodo_fim: string
filtros: Record<string, any>
campos_incluir: string[]
agrupamento?: string
ordenacao?: {
campo: string
direcao: 'asc' | 'desc'
}
}
// Estado de geração de relatório
export interface EstadoRelatorio {
gerando: boolean
progresso: number
erro?: string
url_download?: string
concluido: boolean
}
// === TIPOS PARA NOTIFICAÇÕES ===
// Configuração de notificação
export interface ConfiguracaoNotificacao {
email_ativo: boolean
push_ativo: boolean
tipos_notificacao: {
tipo: string
ativo: boolean
email: boolean
push: boolean
}[]
}
// === UTILITÁRIOS DE VALIDAÇÃO ===
// Função de validação
export type FuncaoValidacao<T> = (valor: T, contexto?: any) => boolean | string
// Validador composto
export interface ValidadorComposto<T> {
validadores: FuncaoValidacao<T>[]
parar_no_primeiro_erro: boolean
}
// Contexto de validação
export interface ContextoValidacao {
entidade: string
operacao: 'criar' | 'atualizar' | 'deletar'
usuario_atual?: UsuarioId
dados_existentes?: Record<string, any>
}
// === CONSTANTES DE VALIDAÇÃO ===
// Mensagens de erro padrão
export const MENSAGENS_ERRO = {
CAMPO_OBRIGATORIO: 'Este campo é obrigatório',
EMAIL_INVALIDO: 'Email inválido',
TELEFONE_INVALIDO: 'Telefone inválido',
CEP_INVALIDO: 'CEP inválido',
DATA_INVALIDA: 'Data inválida',
NUMERO_INVALIDO: 'Número inválido',
TAMANHO_MINIMO: 'Deve ter pelo menos {min} caracteres',
TAMANHO_MAXIMO: 'Deve ter no máximo {max} caracteres',
VALOR_DUPLICADO: 'Este valor já existe',
FORMATO_INVALIDO: 'Formato inválido',
ARQUIVO_MUITO_GRANDE: 'Arquivo muito grande',
TIPO_ARQUIVO_INVALIDO: 'Tipo de arquivo não permitido'
} as const
// Padrões regex comuns
export const PADROES_VALIDACAO = {
EMAIL: /^[^\s@]+@[^\s@]+\.[^\s@]+$/,
TELEFONE: /^\(?\d{2}\)?[\s-]?\d{4,5}[\s-]?\d{4}$/,
CEP: /^\d{5}-?\d{3}$/,
CPF: /^\d{3}\.?\d{3}\.?\d{3}-?\d{2}$/,
CNPJ: /^\d{2}\.?\d{3}\.?\d{3}\/?\d{4}-?\d{2}$/,
SENHA_FORTE: /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$/
} as const