commit5
tests / ci (push) Canceled after 0s

This commit is contained in:
2026-10-30 10:55:18 +02:00
parent 0235c7609e
commit 48347e2d3a
161 changed files with 11814 additions and 265 deletions
+18 -7
View File
@@ -2,22 +2,24 @@
use App\Enums\PurchasingRole;
use App\Models\User;
use App\Services\EvaluationNavigation;
use App\Services\RequisitionWorkflow;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Route;
use Illuminate\Validation\Rule;
// Only the existing isolated local Compras evaluation database may use this entry.
$evaluationScope = static function (Request $request): User {
abort_unless(app()->environment('payable-testing')
&& in_array($request->ip(), ['127.0.0.1', '::1'], true)
&& in_array($request->getHost(), ['127.0.0.1', 'localhost', '::1'], true), 404);
abort_unless(EvaluationNavigation::local($request), 404);
$db = DB::connection();
abort_unless($db->getDriverName() === 'pgsql' && $db->getConfig('host') === '127.0.0.1'
&& preg_match('/^compras_receipts_test_[a-f0-9]{12}$/D', $db->getDatabaseName()), 404);
$identity = $db->selectOne('select current_database() as db, current_user as role');
abort_unless($identity->db === $db->getDatabaseName()
&& $identity->role === 'payable_qa_'.substr($identity->db, -12), 404);
return User::where('email', 'preparacao-obrigacoes@example.test')->firstOrFail();
};
@@ -31,6 +33,9 @@ $evaluationPages = [
'/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) {
@@ -46,15 +51,19 @@ Route::get('/avaliar', function (Request $request) use ($evaluationScope, $evalu
}
$html .= '<section><h2>Experimentar funções operacionais</h2><p>Para preparar ou decidir passos específicos, podes entrar nestes perfis sintéticos sem pedir contas ou credenciais.</p>';
foreach (PurchasingRole::cases() as $role) {
if ($role === PurchasingRole::Admin) continue;
if ($role === PurchasingRole::Admin) {
continue;
}
$html .= '<form method="post" action="/avaliar/entrar"><input type="hidden" name="_token" value="'.$token.'"><input type="hidden" name="role" value="'.$role->value.'"><button>'.$role->label().'</button></form>';
}
return response($html.'</section><p>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.</p></main></html>')->header('Cache-Control', 'no-store')->header('X-Robots-Tag', 'noindex, nofollow');
});
Route::post('/avaliar/entrar', function (Request $request) use ($evaluationScope) {
$source = $evaluationScope($request);
$data = $request->validate(['role' => ['required', \Illuminate\Validation\Rule::enum(PurchasingRole::class)]]);
$destination = EvaluationNavigation::returnPath($request->session()->get('url.intended'), $request);
$data = $request->validate(['role' => ['required', Rule::enum(PurchasingRole::class)]]);
abort_if(array_diff(array_keys($request->all()), ['role', '_token']) !== [], 422);
$role = PurchasingRole::from($data['role']);
$user = DB::transaction(function () use ($source, $role) {
@@ -68,6 +77,7 @@ Route::post('/avaliar/entrar', function (Request $request) use ($evaluationScope
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();
@@ -75,6 +85,7 @@ Route::post('/avaliar/entrar', function (Request $request) use ($evaluationScope
$request->session()->regenerateToken();
Auth::login($user, false);
$request->session()->regenerate();
app(\App\Services\RequisitionWorkflow::class)->audit($user, 'evaluation.entered', null, null, ['role' => $role->value, 'synthetic' => true]);
return redirect('/dashboard');
app(RequisitionWorkflow::class)->audit($user, 'evaluation.entered', null, null, ['role' => $role->value, 'synthetic' => true]);
return redirect($destination);
})->middleware('throttle:30,1');