O foco do dia foi aprimorar e validar o módulo de atribuição de tarefas no sistema de simulação de emergência, com ênfase em controle de permissões, fluxo de estados, validação de formulários, filtragem avançada e registro de operações.
Controel Granular de Permissões
O sistema implementa um modelo baseado em papéis com quatro níveis:
- Administrador: acesso total
- Coordenador: criação, atribuição e gerenciamento de tarefas
- Chefe de Departamento: visualização e execução de tarefas do próprio departamento
- Usuário Comum: apenas visualização e execução de tarefas atribuídas diretamente
A lógica de autorização é centralizada em um hook reutilizável que avalia tanto o papel do usuário quanto o contexto da tarefa (como o departamento do destinatário):
// hooks/useAuthz.ts
import { useSimulationStore } from '@/stores/simulation';
export const useAuthz = () => {
const { user } = useSimulationStore();
const capabilities = {
admin: ['create', 'dispatch', 'modify', 'remove', 'view_all', 'execute'],
coordinator: ['create', 'dispatch', 'modify', 'view_all', 'execute'],
dept_lead: ['modify', 'view_dept', 'execute'],
member: ['view_own', 'execute']
};
const can = (action: string): boolean => {
const role = user?.role || 'member';
return capabilities[role]?.includes(action) ?? false;
};
const canModify = (taskRecipient: string): boolean => {
if (can('modify')) return true;
if (can('view_dept')) {
return user?.dept === extractDept(taskRecipient);
}
return false;
};
return { can, canModify };
};
Fluxo de Estados com Validação Rigorosa
O ciclo de vida das tarefas segue uma máquina de estados bem definida com transições controladas:
draft → pending → assigned → waiting → in_progress → [completed | aborted]
↘ cancelled ↗
Cada transição é validada antes da persistência:
// lib/stateGuard.ts
type SimulationState = 'draft' | 'pending' | 'assigned' | 'waiting' |
'in_progress' | 'completed' | 'cancelled' | 'aborted';
const transitions: Record<SimulationState, SimulationState[]> = {
draft: ['pending'],
pending: ['assigned', 'cancelled'],
assigned: ['waiting'],
waiting: ['in_progress', 'cancelled'],
in_progress: ['completed', 'aborted'],
completed: [],
cancelled: ['pending'],
aborted: []
};
export const isValidTransition = (from: SimulationState, to: SimulationState): boolean => {
return transitions[from]?.includes(to) ?? false;
};
Validação Aprimorada de Formulários
Regras de validação foram implementadas para todos os campos críticos, incluindo verificação de datas futuras e limites de caracteres. Um hook dedicado separa a lógica de validação dos componentes de UI:
// hooks/useValidation.ts
export const useFormGuard = () => {
const validateDispatchForm = (data: FormData): ValidationResult => {
const errors: Record<string, string> = {};
const deadline = new Date(data.get('deadline') as string);
if (isNaN(deadline.getTime()) || deadline <= new Date()) {
errors.deadline = 'Prazo deve ser uma data futura válida';
}
// demais validações...
return { valid: Object.keys(errors).length === 0, errors };
};
return { validateDispatchForm };
};
Filtragem Inteligente de Listas
A interface de listagem suporta múltiplos critérios simultâneos:
- Pesquisa textual em título, descrição e nomes de pessoas
- Filtro por estado atual da tarefa
- Segmentação por departamento
- Classificação por prioridade
Resultados de busca destacam os termos correspondentes:
const highlightMatches = (text: string, query: string) => {
if (!query) return text;
return text.replace(
new RegExp(`(${query})`, 'gi'),
'<mark class="bg-amber-200">$1</mark>'
);
};
Registro Completo de Auditoria
Todas as operações significativas são registradas com metadados contextuais:
interface AuditRecord {
id: string;
timestamp: ISO8601;
action: 'created' | 'updated' | 'deleted' | 'state_changed' | 'assigned';
resourceType: 'simulation_task';
resourceId: string;
actor: string;
details?: { [key: string]: any };
}
O sistema mantém um histórico local enquanto sincroniza com o backend, garantindo rastreabilidade mesmo em cenários offline temporários.
Verificação de Funcionalidades
Foram executados 22 cenários de teste cobrindo:
- Fluxo completo do ciclo de vida de uma tarefa
- Restrições de permissão entre diferentes papéis
- Transições de estado válidas e inválidas
- Entradas extremas e falhas de rede
Todos os casos passaram com 100% de sucesso, confirmando a robustez do módulo.