First commit - backup RDOC
This commit is contained in:
470
src/types/api.types.ts
Normal file
470
src/types/api.types.ts
Normal 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
598
src/types/database.types.ts
Normal 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
347
src/types/domain.types.ts
Normal 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
358
src/types/index.ts
Normal 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
66
src/types/taskLog.ts
Normal 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'
|
||||
};
|
||||
391
src/types/validation.types.ts
Normal file
391
src/types/validation.types.ts
Normal 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
|
||||
Reference in New Issue
Block a user