From 29cd8593857f8090f5f74e49916a8a2ea5e10f23 Mon Sep 17 00:00:00 2001 From: nala Date: Wed, 28 Oct 2026 20:35:17 +0200 Subject: [PATCH] =?UTF-8?q?Prepara=20proposta=20naveg=C3=A1vel=20de=20reco?= =?UTF-8?q?menda=C3=A7=C3=A3o=20antes=20da=20adjudica=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/exemplos-orquestracao-compras.md | 21 +- docs/proposta-recomendacao.md | 136 ++++ docs/validacao-tecnica.md | 36 + resources/js/components/sgc-shell.tsx | 6 + resources/js/pages/preview/recommendation.tsx | 621 ++++++++++++++++++ routes/preview.php | 1 + tests/Feature/PublicPreviewTest.php | 13 +- 7 files changed, 821 insertions(+), 13 deletions(-) create mode 100644 docs/proposta-recomendacao.md create mode 100644 resources/js/pages/preview/recommendation.tsx diff --git a/docs/exemplos-orquestracao-compras.md b/docs/exemplos-orquestracao-compras.md index e74f838..1c30d18 100644 --- a/docs/exemplos-orquestracao-compras.md +++ b/docs/exemplos-orquestracao-compras.md @@ -3,10 +3,13 @@ Evolução do roteiro: a visão única foi entregue em `76d2463`. O incremento de planeamento acrescenta itens por empresa, responsáveis, marcos e datas previstas/realizadas, com ligação posterior às requisições. O registo documental -opcional da abertura e actas por versão também foi implementado. Qualificação -específica e avaliação em novas modalidades continuam por implementar. Estes -avanços não importam os processos históricos nem aprovam as regras de -cancelamento de ordens emitidas. +opcional da abertura e actas por versão também foi implementado. Seguiram-se +qualificação documental, relatório de conferência e admissão/exclusão por +adopção expressa (`d020be5`). A recomendação formal está proposta para validação +em `docs/proposta-recomendacao.md`, com demonstração em +`/proposta/recomendacao`; não está activa na base de negócio. Avaliação em +novas modalidades continua por implementar. Estes avanços não importam os +processos históricos nem aprovam as regras de cancelamento de ordens emitidas. Análise de 28 de Outubro de 2026. Os quatro ficheiros indicados pelo responsável são **exemplos**, conforme instrução expressa. Não aprovam regras do SGC, @@ -68,10 +71,12 @@ preço avaliado não equivalem automaticamente à comparação ponderada actual. Um eventual novo método exige definição explícita e testes, mantendo o comportamento dos processos existentes. -O próximo incremento sugerido é uma visão do processo que reúna as etapas, -responsáveis, documentos e decisões já existentes, antes de acrescentar novas -modalidades ou alterar cálculos. Depois, incorporar planeamento e marcos e, -como incremento distinto, concursos e avaliação em etapas. +A visão do processo, o planeamento e os marcos, a abertura, a qualificação +documental e a admissão/exclusão já foram entregues como incrementos próprios. +O próximo circuito proposto é a recomendação formal antes da adjudicação, +sujeita à validação de âmbito e sem alterar a comparação ponderada existente. +Novas modalidades, métodos de classificação, correcções de preços e dispensas +continuam a exigir definição explícita. ## Aspectos que permanecem configuráveis ou por validar diff --git a/docs/proposta-recomendacao.md b/docs/proposta-recomendacao.md new file mode 100644 index 0000000..5be6b41 --- /dev/null +++ b/docs/proposta-recomendacao.md @@ -0,0 +1,136 @@ +# Proposta de âmbito para recomendação antes da adjudicação + +Estado: proposta para validação após a entrega de admissão/exclusão em +`d020be5`. A demonstração `/proposta/recomendacao` não implementa uma nova +decisão na base de negócio. Data: 28 de Outubro de 2026. + +## Resultado preparado para revisão + +Uma proposta navegável, com cabeçalho, rodapé e menus partilhados do Sistema +de Gestão de Compras (SGC), permite simular: + +- Política própria com perfis e quantidade de pessoas distintas, inicialmente + por definir, e adopção expressa de uma versão. +- Matriz pronta, empate na maior pontuação, avaliações insuficientes e + admissão pendente, todos com concorrentes e pontuações fictícios. +- Escolha manual de Compras, fundamento, conferências independentes, + devolução, novas tentativas e conservação do histórico durante a simulação. +- Mudança de base ou de política adoptada, invalidando o uso de uma tentativa + anterior sem apagar as suas conferências. +- Impressão do relatório demonstrativo, identificado como simulação. + +Os dados desaparecem ao recarregar. Os três conferentes fictícios disponíveis +não definem um limite nem um quórum para empresas. Trocar de conferente na +página não autentica outra pessoa e não demonstra segregação efectiva. As +pontuações ilustram decisões de interface; não constituem um novo algoritmo +de comparação. Não se reutilizam nomes ou valores dos exemplos históricos. + +## Circuito inicial proposto para o produto + +1. Administração da empresa activa uma política de recomendação versionada, + com fundamento, perfis autorizados e quantidade de pessoas distintas. + A política é própria desta etapa, separada da política de admissão. Não se + presume que a autorização de um conferente numa etapa valha noutra. +2. Compras adopta expressamente a versão activa antes de adjudicar. Sem essa + adopção, mantém-se o circuito existente. Neste primeiro âmbito proposto, + adoptar a recomendação exige que o processo já tenha adoptado o regime + formal de admissão; não se adopta nenhum deles automaticamente. Uma nova + política geral não reescreve a versão preservada no processo. Desactivar + impede novas adopções e não elimina as existentes. +3. A recomendação exige matriz pronta e propostas elegíveis com admissão + confirmada na base actual. Preservam-se o mínimo existente de três + fornecedores distintos elegíveis, duas avaliações por proposta, cálculo + ponderado, verificações de conflitos, validade e coerência dos dados. + Não se introduz uma dispensa de propostas ou um novo método de avaliação. +4. Compras indica expressamente a proposta a recomendar e fundamenta a + escolha. Não pode recomendar em pedido do qual seja o solicitante. A + candidata deve pertencer ao conjunto de maior pontuação devolvido pelo + método existente. Em empate, a escolha entre as empatadas exige fundamento; + não há desempate automático nem escolha por ordem de registo. Escolher + abaixo da maior pontuação continua impedido, sem política de excepção. +5. A tentativa preserva a versão adoptada da política, requisitos e análises, + decisões de admissão e conferências relevantes, matriz, avaliações e + proposta escolhida. Identidades, datas e fundamentos são auditados. Uma + nova tentativa acrescenta uma revisão e substitui a anterior para uso + futuro, sem reescrever ou copiar confirmações. +6. Conferem Finanças e/ou chefia do departamento, conforme os perfis e a + quantidade definidos pela empresa. Cada pessoa conta uma vez; deve ser + da mesma empresa, continuar elegível e não ter conflito, nem ser + solicitante ou proponente. A chefia deve pertencer ao departamento do + processo. Não se exige, neste âmbito, que um conferente seja diferente de + todos os intervenientes de outras etapas, mas mantêm-se as segregações e + impedimentos próprios de cada operação. Não se atribuem poderes a júris + ou pessoas externas sem um circuito específico aprovado. +7. As confirmações exigidas concluem a recomendação. Uma devolução encerra + aquela tentativa e exige outra proposta fundamentada; não exclui o + concorrente, cancela o processo ou desfaz uma admissão. Repetir a mesma + conferência é idempotente. Uma resposta diferente não reescreve a anterior. + As confirmações anteriores são revalidadas até à conclusão do quórum; + depois preserva-se a elegibilidade verificada na sua data. Alterações de + base ou de adopção exigem reapreciação e novas conferências. +8. Num processo que adoptou o regime, a adjudicação só pode seleccionar a + mesma proposta de uma recomendação confirmada e actual, preservando a + referência e a base. A coerência volta a ser verificada antes de aprovar + e emitir. Continuam a aplicar-se orçamento, investimento, elegibilidade, + conflitos e aprovações do valor final. Recomendação não autoriza compra. +9. Após existir adjudicação ou ordem, não se alteram a adopção ou as decisões + desta etapa. Uma base alterada antes da emissão exige o circuito de + revisão/cancelamento de adjudicação sem ordem já suportado, quando + autorizado pela política da empresa. Não há desbloqueio por omissão. + Ordens emitidas e processos anteriores não são reescritos. +10. O relatório autenticado e a sua impressão mostram base, candidata, + fundamento, conferências, devoluções e histórico, com permissões de + empresa/departamento. A impressão não representa assinatura digital, + certificação das evidências ou comunicação ao concorrente. + +Estas escolhas são o âmbito proposto do produto e não regras legais ou +obrigações universais inferidas dos documentos locais. Os valores, perfis e +decisões empresariais continuam a pertencer a cada aderente. + +## Fora do âmbito + +- Novos métodos de pontuação, correcções de preços, ajustes, multimoeda, + escolha abaixo da maior pontuação ou dispensa de requisitos/propostas. +- Júris externos, recursos, prazos legais presumidos, assinatura digital, + publicação, envio de emails ou comunicação ao concorrente. +- Alterar reservas, compromissos, facturas ou pagamentos pela recomendação, + cancelar ordens emitidas, estornar ou aplicar retroactivamente o circuito. +- Tornar a recomendação obrigatória em todos os processos ou activar + políticas reais por conta das empresas durante o desenvolvimento. + +## Verificações exigidas para a futura implementação + +Isolamento e privacidade, identidade relida no servidor, autoria, segregação, +perfil/departamento revogado, quórum sem duplicações, conflitos, matriz +incompleta, admissão pendente/desactualizada, empate, escolha fora da maior +pontuação, bases alteradas, devolução e correcções imutáveis, idempotência, +rollback de auditoria, vínculo à adjudicação/emissão e concorrência +PostgreSQL com processos independentes. Uma demonstração local não substitui +estas verificações do circuito autenticado. + +## Validação necessária antes de implementar o circuito real + +Validar **recomendação manual por Compras, conferências independentes em +quantidade/perfis definidos pela empresa, regime opcional por adopção +expressa após admissão e vínculo à adjudicação da proposta recomendada**. + +A orientação de continuidade determina: «definir com a empresa o próximo +âmbito pendente antes de o implementar», em +`docs/orientacoes-continuidade.md`. A validação anterior autorizou admissão +e exclusão; não definiu uma etapa de recomendação com estes efeitos. A +implementação do circuito real aguarda a validação deste âmbito. As +alterações locais dos três documentos de continuidade ficam preservadas. + +## Verificações desta preparação + +Passaram os 18 testes de entrada e consulta pública, com 290 asserções, +PHPStan, Pint, TypeScript, build e lint/formatação do âmbito. O acesso HTTP +devolveu 200 com componente `preview/recommendation`, identidade pública nula +e sem propriedades de negócio. O título inicial usa Sistema de Gestão de +Compras (SGC). Não houve migração, importação ou publicação de política real. +A bateria completa dos módulos de negócio não foi repetida nesta preparação. + +O navegador devolveu `The browser access host is unavailable`. As interacções +e a impressão estão preparadas para revisão, sem revisão visual concluída. +A formatação global de `docs/compatibilidade.md`, alteração local alheia, +permanece pendente e não foi alterada. diff --git a/docs/validacao-tecnica.md b/docs/validacao-tecnica.md index d8ecfdd..0a86717 100644 --- a/docs/validacao-tecnica.md +++ b/docs/validacao-tecnica.md @@ -1,5 +1,41 @@ # Validação técnica do SGC — 28 de Outubro de 2026 +## Preparação: proposta de recomendação formal + +Após `d020be5`, foi preparada `/proposta/recomendacao`, ligada ao menu +**Compras** apenas na consulta demonstrativa. Usa a navegação, cabeçalho e +rodapé partilhados do Sistema de Gestão de Compras (SGC), com dados fictícios +locais. Permite experimentar configuração de perfis/quantidade sem valores +iniciais, adopção explícita, matriz pronta/impedida, empate, escolha manual, +fundamento, conferências, devolução e histórico. A alteração de base ou de +política adoptada torna a tentativa anterior histórica. A impressão é +identificada como simulação. Não há persistência no navegador ou no servidor. + +O circuito real proposto está em `docs/proposta-recomendacao.md`. A sua +implementação aguarda validação: política própria por empresa, adopção +opcional após regime de admissão, conferência independente e vínculo da +adjudicação à recomendação confirmada na mesma base. Não se publicaram +políticas, acrescentaram migrações ou alteraram regras de adjudicação, +orçamento, facturação ou pagamento. Os exemplos históricos não fornecem +parâmetros obrigatórios às aderentes. + +Passaram **18 testes de entrada e consulta pública, com 290 asserções**, +incluindo as demonstrações de qualificação/admissão/recomendação, identidade +pública nula sem terminar a sessão existente e ausência de endpoint público +de escrita. PHPStan, Pint, TypeScript, build e lint/formatação do âmbito passaram. +Confirmado HTTP 200 com componente `preview/recommendation`, utilizador nulo, +apenas propriedades gerais da consulta pública e título inicial Sistema de +Gestão de Compras (SGC). +A bateria completa do negócio não foi repetida neste incremento de +interface; os resultados de 478 aprovados e 2 ignorados abaixo pertencem à +entrega anterior de admissão. As alterações locais dos três documentos de +continuidade foram preservadas; a formatação global de `docs/compatibilidade.md` +continua fora do âmbito desta entrega. + +O controlo do navegador voltou a devolver `The browser access host is +unavailable`. A revisão visual e de interacção, incluindo impressão, continua +pendente e não é substituída pelos testes automatizados. + ## Incremento: admissão e exclusão por adopção expressa O utilizador validou `docs/proposta-admissao-exclusao.md`. A Administração da diff --git a/resources/js/components/sgc-shell.tsx b/resources/js/components/sgc-shell.tsx index d2a3ccd..68fdea9 100644 --- a/resources/js/components/sgc-shell.tsx +++ b/resources/js/components/sgc-shell.tsx @@ -41,6 +41,12 @@ const groups: { label: string; entries: Entry[] }[] = [ demo: '/consulta/ordens', roles: readers, }, + { + label: 'Recomendação (proposta)', + path: '', + demo: '/proposta/recomendacao', + roles: [], + }, ], }, { diff --git a/resources/js/pages/preview/recommendation.tsx b/resources/js/pages/preview/recommendation.tsx new file mode 100644 index 0000000..8e9453c --- /dev/null +++ b/resources/js/pages/preview/recommendation.tsx @@ -0,0 +1,621 @@ +import { Head, Link } from '@inertiajs/react'; +import { Printer } from 'lucide-react'; +import { useState } from 'react'; +import { controlClass, PageTitle, Panel } from '@/components/procurement'; +import { Button } from '@/components/ui/button'; +import { Label } from '@/components/ui/label'; + +type Scenario = 'ready' | 'tie' | 'incomplete' | 'admission'; +type Policy = { revision: number; roles: string[]; required: number }; +type Review = { + actor: number; + verdict: 'confirmed' | 'returned'; + reason: string; +}; +type Attempt = { + revision: number; + basis: number; + scenario: Scenario; + candidate: string; + reason: string; + policy: Policy; + reviews: Review[]; +}; +const reviewers = [ + { id: 1, name: 'Conferente fictício de Finanças A', role: 'finance' }, + { id: 2, name: 'Conferente fictício de Finanças B', role: 'finance' }, + { id: 3, name: 'Chefia fictícia do departamento', role: 'department_head' }, +]; +const roleNames: Record = { + finance: 'Finanças', + department_head: 'Chefia do departamento', +}; +const scenarios: Record = { + ready: 'Matriz completa e admissões confirmadas', + tie: 'Empate na maior pontuação', + incomplete: 'Avaliações insuficientes', + admission: 'Admissão por confirmar', +}; +const candidates = [ + 'Concorrente fictício A', + 'Concorrente fictício B', + 'Concorrente fictício C', +]; +function status(attempt: Attempt) { + if (attempt.reviews.some((r) => r.verdict === 'returned')) + return 'Tentativa devolvida'; + return attempt.reviews.length >= attempt.policy.required + ? 'Recomendação confirmada na simulação' + : 'A aguardar conferência independente'; +} +function Reason({ + id, + value, + onChange, +}: { + id: string; + value: string; + onChange: (value: string) => void; +}) { + return ( +
+ +