source($request);
};
$evaluationPages = [
'/dashboard' => 'Visão geral', '/empresa' => 'Empresa e equipa',
'/requisicoes' => 'Requisições', '/planeamento' => 'Planeamento',
'/fornecedores' => 'Fornecedores', '/cotacoes' => 'Cotações', '/ordens' => 'Ordens de compra',
'/recepcoes' => 'Recepções', '/stock' => 'Stock e movimentos', '/stock/operacoes' => 'Saídas e inventários',
'/equipamentos' => 'Equipamentos e peças', '/orcamentos' => 'Orçamentos',
'/regras-investimento' => 'Regras de investimento', '/facturas' => 'Facturas',
'/pagamentos' => 'Pagamentos externos', '/obrigacoes-fornecedores' => 'Obrigações a fornecedores',
'/conflitos' => 'Conflitos de interesses', '/revisao-compras' => 'Revisão e cancelamento',
'/politica-admissao' => 'Política de admissão', '/politica-recomendacao' => 'Política de recomendação',
'/relatorios' => 'Relatórios de compras',
'/relatorios/medidas-fornecedores' => 'Medidas de melhoria de fornecedores',
'/administracao/parametrizacao' => 'Parametrização da aplicação',
];
Route::get('/avaliar', function (Request $request) use ($evaluationScope, $evaluationPages) {
$evaluationScope($request);
$token = htmlspecialchars(csrf_token(), ENT_QUOTES, 'UTF-8');
$html = '
Explorar SGCExplorar SGC
Entrada local sem palavra-passe. Os exemplos e alterações ficam guardados nesta instalação de testes.
Acesso de proprietário
Abre a administração e as páginas dos módulos abaixo. As regras dos processos e as funções operacionais continuam visíveis.
';
if ($request->user()) {
$html .= 'Áreas da aplicação
';
foreach ($evaluationPages as $path => $label) {
$html .= '- '.$label.'
';
}
$html .= '
';
}
$html .= 'Experimentar funções operacionais
Para preparar ou decidir passos específicos, podes entrar nestes perfis sintéticos sem pedir contas ou credenciais.
';
foreach (PurchasingRole::cases() as $role) {
if (in_array($role, [PurchasingRole::Admin, PurchasingRole::Configured], true)) {
continue;
}
$html .= '';
}
return response($html.'Ambiente sintético partilhado. Sem transferências bancárias. Não altera a instalação habitual na porta 8015. Aprovações próprias e restantes regras de integridade não são dispensadas.
')->header('Cache-Control', 'no-store')->header('X-Robots-Tag', 'noindex, nofollow');
});
Route::post('/avaliar/entrar', function (Request $request) use ($evaluationScope) {
$source = $evaluationScope($request);
$destination = EvaluationNavigation::returnPath($request->session()->get('url.intended'), $request);
$data = $request->validate(['role' => ['required', Rule::in(array_map(fn (PurchasingRole $role) => $role->value, array_filter(PurchasingRole::cases(), fn (PurchasingRole $role) => $role !== PurchasingRole::Configured)))]]);
abort_if(array_diff(array_keys($request->all()), ['role', '_token']) !== [], 422);
$role = PurchasingRole::from($data['role']);
$user = DB::transaction(function () use ($source, $role) {
DB::select('select pg_advisory_xact_lock(?)', [80502910]);
$user = User::firstOrCreate(['email' => 'avaliacao-'.$role->value.'@example.test'],
['name' => $role === PurchasingRole::Admin ? 'Proprietário — avaliação local' : $role->label().' — avaliação local', 'password' => bin2hex(random_bytes(32))]);
abort_if($user->tenant_id !== null && (int) $user->tenant_id !== (int) $source->tenant_id, 403);
$user->forceFill(['tenant_id' => $source->tenant_id, 'department_id' => $source->department_id,
'purchasing_role' => $role, 'email_verified_at' => $user->email_verified_at ?? now()])->save();
// The isolated payables workspace has its own explicit action grants.
foreach ($role === PurchasingRole::Admin ? ['view', 'prepare', 'validate'] : ['view'] as $action) {
DB::table('pa_access')->insertOrIgnore(['user_id' => $user->id, 'tenant_id' => $source->tenant_id, 'company_id' => 0, 'unit_id' => 0, 'person' => 'evaluation-person-'.$user->id, 'action' => $action]);
}
return $user;
});
Auth::logout();
$request->session()->invalidate();
$request->session()->regenerateToken();
Auth::login($user, false);
$request->session()->regenerate();
app(RequisitionWorkflow::class)->audit($user, 'evaluation.entered', null, null, ['role' => $role->value, 'synthetic' => true]);
return redirect($destination);
})->middleware('throttle:30,1');