Preservar a oportunidade durante o registo e preparacao do perfil

This commit is contained in:
2026-10-30 21:22:40 +02:00
parent f5f5649cfc
commit 86b31f2840
8 changed files with 184 additions and 16 deletions
+6
View File
@@ -1,5 +1,11 @@
# Desenvolvimento do SGC
## Escolha preservada no registo e preparação do perfil, 30 de Outubro de 2026
A escolha pública segue agora tanto para a entrada como para o registo. Uma nova conta conserva uma referência à oportunidade na sessão, associada à identidade e empresa; não copia regras ou dados internos para essa referência. O perfil permite retomar o formulário depois de preparar os dados e confirmar o email, sem submissão automática. A criação da conta mantém o destino de preparação do perfil. Cada consulta reconfirma publicação, prazo e empresa; uma oportunidade retirada deixa de aparecer e produz informação genérica de indisponibilidade. Sessões com outra identidade/empresa ou referência incompleta não conservam o atalho. Sair ou concluir explicitamente a submissão remove a escolha. A confirmação de email e as restantes validações da candidatura são mantidas.
Validação final SQLite: 28 testes/457 asserções. PostgreSQL descartável: 68 testes/1484 asserções, incluindo o percurso registo → perfil → tentativa não confirmada recusada → submissão explícita após confirmação fictícia. Base descartável removida, sem contas, mensagens ou candidaturas reais no domínio. A verificação adicional de referência de sessão incompleta foi exercida em SQLite/análise estática. Compilação concluída com código zero; PHPStan sem erros, tipos, Pint/lint e frontend dirigidos registados na prova `proofs/candidate-registration-selection.json`. Sem novas migrações. Incremento apenas local, posterior a f5f5649; produção continua em bf84575. Conferência visual ainda pendente.
## Oportunidade escolhida preservada na entrada, 30 de Outubro de 2026
O botão de entrada de cada oportunidade guarda a escolha no formulário de login e apresenta o título escolhido. Após autenticação válida, o servidor volta a conferir publicação, empresa e prazo e encaminha para o formulário dessa oportunidade. Não aceita URLs de retorno fornecidos pelo cliente. Um identificador inexistente, de outra empresa, retirado ou expirado encaminha para o perfil com mensagem genérica de indisponibilidade. A entrada não envia a candidatura, não modifica o perfil e não dispensa confirmação de email ou requisitos documentais. Criar uma nova conta mantém o percurso de preparação do perfil anteriormente existente.
@@ -0,0 +1,16 @@
{
"checked_at": "2026-10-30T19:21:10+00:00",
"database": "disposable PostgreSQL",
"application_role_reused_without_privilege_change": true,
"result": "passed",
"test_files": [
"CandidateSubmissionsTest",
"PeopleHiringTest",
"CandidatePortalTest",
"CandidateDocumentFormatsTest"
],
"original_evaluation_untouched": true,
"database_removed": true,
"tests": 68,
"assertions": 1484
}
@@ -0,0 +1,42 @@
{
"checked_at": "2026-10-30T19:22:25.916372+00:00",
"base_commit": "f5f5649",
"scope": [
"selected public opportunity preserved through new candidate registration and profile preparation",
"session choice scoped to company and account",
"fresh publication and deadline check on profile reads",
"selection removed on logout account mismatch withdrawal and successful submission",
"no automatic application or email verification bypass"
],
"module_sqlite": {
"tests": 28,
"assertions": 457,
"passed": true
},
"postgresql": {
"tests": 68,
"assertions": 1484,
"passed": true,
"disposable_database_removed": true
},
"frontend": {
"tests": 11,
"passed": true
},
"phpstan_errors": 0,
"typescript": true,
"pint": true,
"targeted_lint": true,
"build": {
"exit_code": 0,
"completed": true
},
"new_migrations": false,
"production_installed": false,
"visual_review": "pending; connector unavailable",
"source_sha256": {
"app/Http/Controllers/CandidatePortalController.php": "b54e01ef8f1013925a13c854945f60f8e360a090aa048d5627878c853c10e22d",
"resources/js/pages/candidate/entry.tsx": "35429f08b1ce635545284b4804bde3382891f1007ff9bb74536df6a8ccc7f2cb",
"resources/js/pages/candidate/profile.tsx": "f0ddeb382185c836fb03652b3ab498ef4a9651175ca4fcb7ff4a659d0f6bcc3a"
}
}