Corrige autorizacao transaccional e valida modulos implementados
This commit is contained in:
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"tested_at_utc": "2026-10-28T15:16:34+00:00",
|
||||
"database": "compras_receipts_test_0612e6280f36",
|
||||
"separate_database": true,
|
||||
"transport": "Laravel HTTP kernel in independent PHP processes; real PostgreSQL connections",
|
||||
"scenarios": [
|
||||
{
|
||||
"name": "role_revoked_while_waiting",
|
||||
"passed": true,
|
||||
"overlapping_lock_waits": 2,
|
||||
"statuses": [403, 403],
|
||||
"receipts": 0,
|
||||
"stock_movements": 0
|
||||
}
|
||||
],
|
||||
"passed": true,
|
||||
"test_database_dropped": true,
|
||||
"live_user_count_unchanged": true
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"tested_at_utc": "2026-10-28T12:32:47+00:00",
|
||||
"tested_at_utc": "2026-10-28T15:07:45+00:00",
|
||||
"separate_database": true,
|
||||
"transport": "Independent PHP service transactions and PostgreSQL connections",
|
||||
"scenarios": [
|
||||
|
||||
@@ -23,6 +23,15 @@ Preservar enums, políticas, modelos relacionais, Brick Math e isolamento por em
|
||||
|
||||
## Verificação actual
|
||||
|
||||
Revisão transversal: **407 aprovados, 2 ignorados (MFA desligado), 2.964 asserções**.
|
||||
32 cenários concorrentes PostgreSQL aprovados; bases temporárias eliminadas.
|
||||
Perfis e departamentos são novamente verificados dentro da transacção;
|
||||
dotações pendentes não apresentam fundos disponíveis. Evidências, âmbito e
|
||||
pendências em [validação técnica](validacao-tecnica.md). Revisão visual,
|
||||
cancelamento, MFA e validação operacional integral continuam pendentes.
|
||||
|
||||
### Histórico da entrega de investimento
|
||||
|
||||
Regras de investimento entregues por empresa, com parâmetros explícitos e duas
|
||||
aprovações administrativas independentes. Dotação classificada, reserva e Finanças
|
||||
obrigatórias para equipamento; regra congelada e revalidada antes de emitir.
|
||||
|
||||
@@ -1,5 +1,26 @@
|
||||
# Desenvolvimento do SGC
|
||||
|
||||
## Revisão transversal de autorização e validação
|
||||
|
||||
Corrigidas verificações de perfil que aconteciam antes de esperar pelo bloqueio
|
||||
da empresa: o operador é agora recarregado e bloqueado na transacção nos módulos
|
||||
de facturas, banco, armazém, requisições e compras. Departamento/centro de custo
|
||||
também são revalidados. Dotação não aprovada deixou de mostrar verba disponível.
|
||||
Corrigido um teste indevidamente ignorado com MFA desligado e traduzidos os textos
|
||||
da página de segurança. Configuração de fontes alinhada com a dependência opcional
|
||||
ausente, sem mudança de fonte ou instalação de pacotes.
|
||||
|
||||
Suite: **407 aprovados, 2 ignorados, 2.964 asserções**. Os dois ignorados são de
|
||||
MFA activado, que continua desligado. **32 cenários concorrentes PostgreSQL**
|
||||
aprovados, incluindo revogação real de perfil enquanto dois pedidos aguardam
|
||||
bloqueio: ambos responderam 403, sem movimentos. Bases temporárias eliminadas.
|
||||
Sem migrações ou alterações de contas/dados de negócio reais nesta revisão.
|
||||
|
||||
Detalhes das correcções, evidências e pendências estão em
|
||||
[validação técnica](validacao-tecnica.md). Revisão visual e validação operacional
|
||||
integral permanecem pendentes. Funcionalidades não implementadas, incluindo
|
||||
revisão/cancelamento, não foram tratadas como se já existissem.
|
||||
|
||||
## Regras de investimento por empresa
|
||||
|
||||
Implementadas em `/regras-investimento`, sem montantes predefinidos ou regras
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"tested_at_utc": "2026-10-28T12:19:17+00:00",
|
||||
"tested_at_utc": "2026-10-28T15:07:45+00:00",
|
||||
"separate_database": true,
|
||||
"transport": "Independent PHP service transactions and PostgreSQL connections",
|
||||
"scenarios": [
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"tested_at_utc": "2026-10-28T13:24:32+00:00",
|
||||
"tested_at_utc": "2026-10-28T15:07:45+00:00",
|
||||
"separate_database": true,
|
||||
"transport": "Independent PHP service transactions and PostgreSQL connections",
|
||||
"scenarios": [
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"tested_at_utc": "2026-10-28T12:11:20+00:00",
|
||||
"tested_at_utc": "2026-10-28T15:07:45+00:00",
|
||||
"separate_database": true,
|
||||
"transport": "Independent PHP service transactions and PostgreSQL connections",
|
||||
"scenarios": [
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"tested_at_utc": "2026-10-28T12:49:13+00:00",
|
||||
"tested_at_utc": "2026-10-28T15:07:45+00:00",
|
||||
"separate_database": true,
|
||||
"transport": "Independent PHP service transactions and PostgreSQL connections",
|
||||
"scenarios": [
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"tested_at_utc": "2026-10-28T10:56:15+00:00",
|
||||
"database": "compras_receipts_test_84e8492cd8f3",
|
||||
"tested_at_utc": "2026-10-28T15:07:45+00:00",
|
||||
"database": "compras_receipts_test_c9a6d4b5eeb5",
|
||||
"separate_database": true,
|
||||
"transport": "Laravel HTTP kernel in independent PHP processes; real PostgreSQL connections",
|
||||
"scenarios": [
|
||||
@@ -9,19 +9,19 @@
|
||||
"passed": true,
|
||||
"overlapping_lock_waits": 2,
|
||||
"responses": [
|
||||
{
|
||||
"status": 201,
|
||||
"id": 1,
|
||||
"created": true,
|
||||
"error_fields": [],
|
||||
"backend_pid": 4688
|
||||
},
|
||||
{
|
||||
"status": 422,
|
||||
"id": null,
|
||||
"created": null,
|
||||
"error_fields": ["items"],
|
||||
"backend_pid": 2068
|
||||
"backend_pid": 24512
|
||||
},
|
||||
{
|
||||
"status": 201,
|
||||
"id": 1,
|
||||
"created": true,
|
||||
"error_fields": [],
|
||||
"backend_pid": 15424
|
||||
}
|
||||
],
|
||||
"receipts": 1,
|
||||
@@ -34,19 +34,19 @@
|
||||
"passed": true,
|
||||
"overlapping_lock_waits": 2,
|
||||
"responses": [
|
||||
{
|
||||
"status": 201,
|
||||
"id": 2,
|
||||
"created": true,
|
||||
"error_fields": [],
|
||||
"backend_pid": 9064
|
||||
},
|
||||
{
|
||||
"status": 200,
|
||||
"id": 2,
|
||||
"created": false,
|
||||
"error_fields": [],
|
||||
"backend_pid": 1036
|
||||
"backend_pid": 6580
|
||||
},
|
||||
{
|
||||
"status": 201,
|
||||
"id": 2,
|
||||
"created": true,
|
||||
"error_fields": [],
|
||||
"backend_pid": 5964
|
||||
}
|
||||
],
|
||||
"receipts": 1,
|
||||
@@ -59,19 +59,19 @@
|
||||
"passed": true,
|
||||
"overlapping_lock_waits": 2,
|
||||
"responses": [
|
||||
{
|
||||
"status": 201,
|
||||
"id": 4,
|
||||
"created": true,
|
||||
"error_fields": [],
|
||||
"backend_pid": 3020
|
||||
},
|
||||
{
|
||||
"status": 201,
|
||||
"id": 3,
|
||||
"created": true,
|
||||
"error_fields": [],
|
||||
"backend_pid": 24624
|
||||
"backend_pid": 26176
|
||||
},
|
||||
{
|
||||
"status": 201,
|
||||
"id": 4,
|
||||
"created": true,
|
||||
"error_fields": [],
|
||||
"backend_pid": 24244
|
||||
}
|
||||
],
|
||||
"receipts": 2,
|
||||
@@ -84,19 +84,19 @@
|
||||
"passed": true,
|
||||
"overlapping_lock_waits": 2,
|
||||
"responses": [
|
||||
{
|
||||
"status": 422,
|
||||
"id": null,
|
||||
"created": null,
|
||||
"error_fields": ["delivery_note"],
|
||||
"backend_pid": 22120
|
||||
},
|
||||
{
|
||||
"status": 201,
|
||||
"id": 5,
|
||||
"created": true,
|
||||
"error_fields": [],
|
||||
"backend_pid": 4720
|
||||
"backend_pid": 21524
|
||||
},
|
||||
{
|
||||
"status": 422,
|
||||
"id": null,
|
||||
"created": null,
|
||||
"error_fields": ["delivery_note"],
|
||||
"backend_pid": 25700
|
||||
}
|
||||
],
|
||||
"receipts": 1,
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"tested_at_utc": "2026-10-28T12:59:44+00:00",
|
||||
"tested_at_utc": "2026-10-28T15:07:46+00:00",
|
||||
"separate_database": true,
|
||||
"transport": "Independent PHP service transactions and PostgreSQL connections",
|
||||
"scenarios": [
|
||||
@@ -24,7 +24,7 @@
|
||||
"passed": true,
|
||||
"overlapping_lock_waits": 2,
|
||||
"approved_total_minor": 12000,
|
||||
"reserved_minor": 10000,
|
||||
"reserved_minor": 0,
|
||||
"original_allocation_unchanged": true
|
||||
}
|
||||
],
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"tested_at_utc": "2026-10-28T11:35:31+00:00",
|
||||
"database": "compras_receipts_test_d97ad8ad1eb7",
|
||||
"tested_at_utc": "2026-10-28T15:07:45+00:00",
|
||||
"database": "compras_receipts_test_aa453293fa81",
|
||||
"separate_database": true,
|
||||
"transport": "Laravel HTTP kernel in independent PHP processes; real PostgreSQL connections",
|
||||
"scenarios": [
|
||||
@@ -9,19 +9,19 @@
|
||||
"passed": true,
|
||||
"overlapping_lock_waits": 2,
|
||||
"responses": [
|
||||
{
|
||||
"status": 201,
|
||||
"id": 1,
|
||||
"created": true,
|
||||
"error_fields": [],
|
||||
"backend_pid": 5004
|
||||
},
|
||||
{
|
||||
"status": 422,
|
||||
"id": null,
|
||||
"created": null,
|
||||
"error_fields": ["quantity"],
|
||||
"backend_pid": 27024
|
||||
"backend_pid": 23636
|
||||
},
|
||||
{
|
||||
"status": 201,
|
||||
"id": 1,
|
||||
"created": true,
|
||||
"error_fields": [],
|
||||
"backend_pid": 15544
|
||||
}
|
||||
],
|
||||
"source_milli": 400,
|
||||
@@ -37,14 +37,14 @@
|
||||
"id": 2,
|
||||
"created": true,
|
||||
"error_fields": [],
|
||||
"backend_pid": 7640
|
||||
"backend_pid": 19896
|
||||
},
|
||||
{
|
||||
"status": 200,
|
||||
"id": 2,
|
||||
"created": false,
|
||||
"error_fields": [],
|
||||
"backend_pid": 22852
|
||||
"backend_pid": 25896
|
||||
}
|
||||
],
|
||||
"source_milli": 400,
|
||||
@@ -55,19 +55,19 @@
|
||||
"passed": true,
|
||||
"overlapping_lock_waits": 2,
|
||||
"responses": [
|
||||
{
|
||||
"status": 201,
|
||||
"id": 3,
|
||||
"created": true,
|
||||
"error_fields": [],
|
||||
"backend_pid": 25232
|
||||
},
|
||||
{
|
||||
"status": 200,
|
||||
"id": 3,
|
||||
"created": false,
|
||||
"error_fields": [],
|
||||
"backend_pid": 28856
|
||||
"backend_pid": 22516
|
||||
},
|
||||
{
|
||||
"status": 201,
|
||||
"id": 3,
|
||||
"created": true,
|
||||
"error_fields": [],
|
||||
"backend_pid": 24156
|
||||
}
|
||||
],
|
||||
"source_milli": 400,
|
||||
@@ -83,18 +83,18 @@
|
||||
"id": 4,
|
||||
"created": true,
|
||||
"error_fields": [],
|
||||
"backend_pid": 5268
|
||||
"backend_pid": 2604
|
||||
},
|
||||
{
|
||||
"status": 422,
|
||||
"id": null,
|
||||
"created": null,
|
||||
"error_fields": ["quantity"],
|
||||
"backend_pid": 4288
|
||||
"status": 201,
|
||||
"id": 5,
|
||||
"created": true,
|
||||
"error_fields": [],
|
||||
"backend_pid": 22296
|
||||
}
|
||||
],
|
||||
"source_milli": 400,
|
||||
"destination_milli": 600
|
||||
"source_milli": 500,
|
||||
"destination_milli": 500
|
||||
},
|
||||
{
|
||||
"name": "same_adjustment",
|
||||
@@ -103,17 +103,17 @@
|
||||
"responses": [
|
||||
{
|
||||
"status": 200,
|
||||
"id": 6,
|
||||
"id": 7,
|
||||
"created": false,
|
||||
"error_fields": [],
|
||||
"backend_pid": 13608
|
||||
"backend_pid": 26392
|
||||
},
|
||||
{
|
||||
"status": 201,
|
||||
"id": 6,
|
||||
"id": 7,
|
||||
"created": true,
|
||||
"error_fields": [],
|
||||
"backend_pid": 2320
|
||||
"backend_pid": 17308
|
||||
}
|
||||
],
|
||||
"source_milli": 800,
|
||||
@@ -129,14 +129,14 @@
|
||||
"id": null,
|
||||
"created": null,
|
||||
"error_fields": ["count_id"],
|
||||
"backend_pid": 25516
|
||||
"backend_pid": 24416
|
||||
},
|
||||
{
|
||||
"status": 422,
|
||||
"id": null,
|
||||
"created": null,
|
||||
"error_fields": ["count_id"],
|
||||
"backend_pid": 23640
|
||||
"backend_pid": 15140
|
||||
}
|
||||
],
|
||||
"source_milli": 900,
|
||||
@@ -149,17 +149,17 @@
|
||||
"responses": [
|
||||
{
|
||||
"status": 201,
|
||||
"id": 9,
|
||||
"id": 10,
|
||||
"created": true,
|
||||
"error_fields": [],
|
||||
"backend_pid": 18244
|
||||
"backend_pid": 4480
|
||||
},
|
||||
{
|
||||
"status": 422,
|
||||
"id": null,
|
||||
"created": null,
|
||||
"error_fields": ["quantity"],
|
||||
"backend_pid": 2452
|
||||
"backend_pid": 20176
|
||||
}
|
||||
],
|
||||
"source_milli": 400,
|
||||
|
||||
@@ -0,0 +1,83 @@
|
||||
# Validação técnica do SGC — 28 de Outubro de 2026
|
||||
|
||||
Esta revisão cobre os módulos implementados e as pendências documentadas no
|
||||
repositório. Não equivale a validação operacional integral ou certificação de
|
||||
todos os requisitos do sistema. Valores e políticas reais continuam a pertencer
|
||||
a cada empresa; nenhum foi criado nesta revisão.
|
||||
|
||||
## Correcções verificadas
|
||||
|
||||
- Operações que verificavam o perfil antes de esperar pelo bloqueio da empresa
|
||||
passam a recarregar e bloquear o utilizador dentro da transacção. Abrange
|
||||
facturas, dados bancários, stock, recepções, requisições, adjudicação, emissão,
|
||||
validação técnica e dotação inicial. Mudança de perfil ou de empresa durante
|
||||
a espera não é autorizada pelo perfil antigo em memória.
|
||||
- Requisição volta a verificar departamento e centro de custo ao guardar e o
|
||||
departamento do solicitante ao submeter. Decisões departamentais usam o perfil
|
||||
actual; revisão técnica e aprovadores finais são bloqueados durante as
|
||||
verificações transaccionais.
|
||||
- Dotação pendente mostra **zero disponível e zero aprovado**, preservando o
|
||||
valor proposto e o histórico. O servidor já bloqueava a reserva; a interface
|
||||
deixou de apresentar verba proposta como disponível.
|
||||
- Teste da página de segurança com MFA desligado deixou de ser indevidamente
|
||||
ignorado. Textos dessa página e confirmação de alteração de palavra-passe
|
||||
traduzidos para português. Nenhuma palavra-passe real foi alterada.
|
||||
- Configuração de fontes passou a declarar desactivada a optimização opcional
|
||||
que já não era gerada por ausência de `fontaine`. Mantém Instrument Sans e
|
||||
elimina o aviso de dependência opcional sem instalar pacotes novos.
|
||||
|
||||
## Resultados
|
||||
|
||||
**407 testes aprovados, 2 ignorados, 2.964 asserções** na suite completa SQLite
|
||||
em memória. Os dois ignorados dependem de MFA activado, actualmente desligado;
|
||||
não são apresentados como funcionalidades validadas. PHPStan, Pint, TypeScript,
|
||||
compilação e formatação/lint frontend verificados no fecho.
|
||||
|
||||
**32 cenários concorrentes PostgreSQL aprovados**, todos em bases exclusivas
|
||||
de teste, eliminadas no final:
|
||||
|
||||
| Área | Cenários | Evidência |
|
||||
| ------------------------------ | -------: | ------------------------------------------------------ |
|
||||
| Recepções | 4 | [Relatório](recepcao-concorrencia-postgresql.json) |
|
||||
| Stock e peças | 7 | [Relatório](stock-concorrencia-postgresql.json) |
|
||||
| Reservas e compromissos | 5 | [Relatório](orcamento-concorrencia-postgresql.json) |
|
||||
| Facturas e consumo | 3 | [Relatório](facturas-concorrencia-postgresql.json) |
|
||||
| Dados bancários | 3 | [Relatório](bancos-concorrencia-postgresql.json) |
|
||||
| Pagamentos externos | 3 | [Relatório](pagamentos-concorrencia-postgresql.json) |
|
||||
| Reforços | 3 | [Relatório](reforcos-concorrencia-postgresql.json) |
|
||||
| Regras de investimento | 3 | [Relatório](investimento-concorrencia-postgresql.json) |
|
||||
| Perfil revogado durante espera | 1 | [Relatório](autorizacao-concorrencia-postgresql.json) |
|
||||
|
||||
O último ensaio bloqueia a empresa, observa duas ligações simultaneamente à
|
||||
espera e revoga os dois perfis de Armazém antes de libertar o bloqueio. Os dois
|
||||
pedidos pelo kernel HTTP retornam **403**; não criam recepções nem movimentos.
|
||||
Os restantes ensaios verificam saldos, duplicações e integridade conforme os
|
||||
respectivos relatórios. Não são testes de carga ou uma validação de todos os
|
||||
possíveis cruzamentos concorrentes do sistema.
|
||||
|
||||
Sem migrações, seeds, criação de contas, alteração de configuração de ambiente
|
||||
ou escritas de negócio na base real nesta revisão. Acesso HTTP pode actualizar
|
||||
sessões. Nenhuma autorização de compra ou transferência bancária foi emitida.
|
||||
|
||||
## O que permanece por tratar
|
||||
|
||||
| Pendência | Situação |
|
||||
| -------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| Revisão visual pública, autenticada e impressão | Bloqueada pelo acesso ao navegador; testes HTTP não a substituem. |
|
||||
| MFA obrigatório e ciclo completo de acessos | Não implementados/activados; dois testes condicionais continuam ignorados. |
|
||||
| Revisão/cancelamento de adjudicações e ordens | Fluxo e política próprios ainda ausentes. Operações incompatíveis continuam bloqueadas. |
|
||||
| Reversões, estornos, notas de crédito e devoluções | Funcionalidades ainda não implementadas; não se apagam lançamentos existentes. |
|
||||
| Regras empresariais | Escalões provisórios, regras fiscais, validade/levantamento de conflitos e excepções exigem decisão da empresa. |
|
||||
| Investimento agregado e fraccionamento | Apenas tecto por processo suportado; sem agregação/detecção automática. |
|
||||
| Outras etapas do roteiro | Multimoeda, reposição, tolerâncias/investigação de inventários, manutenção/activos e requisitos de subscrição/hosting continuam no roteiro. |
|
||||
| Controlos operacionais | Carga, permissões contra SQL administrativo, retenção e recuperação por empresa ainda exigem validação própria. |
|
||||
|
||||
Estas pendências não foram marcadas como concluídas por compilação ou testes
|
||||
funcionais. O próximo incremento de revisão/cancelamento deve definir e guardar
|
||||
uma política explícita por empresa, conservar o passado e exigir novas decisões
|
||||
para processos revistos; não pode autorizar por omissão a alteração de ordens
|
||||
emitidas ou a libertação de compromissos já consumidos.
|
||||
|
||||
Verificação HTTP local no fecho: **18 páginas públicas responderam 200** e
|
||||
**13 rotas protegidas responderam 302 sem sessão**. O navegador voltou a devolver
|
||||
`The browser access host is unavailable`; a revisão visual continua pendente.
|
||||
Reference in New Issue
Block a user