commit6
tests / ci (push) Canceled after 0s

This commit is contained in:
2026-10-30 08:07:27 +02:00
parent 413c201d97
commit 465426847e
8 changed files with 72 additions and 0 deletions
+1
View File
@@ -56,6 +56,7 @@ export function AppSidebar() {
...(canReadPurchases
? [
{ title: 'Fornecedores', href: '/fornecedores', icon: Users },
{ title: 'Avaliação de fornecedores', href: '/fornecedores/avaliacoes', icon: Users },
{ title: 'Cotações', href: '/cotacoes', icon: Scale },
{
title: 'Ordens de compra',
@@ -113,6 +113,12 @@ export function procurementNavigation(
path: '/fornecedores',
roles: readers,
},
{
id: 'supplier_evaluations',
label: 'Avaliação de fornecedores',
path: '/fornecedores/avaliacoes',
roles: readers,
},
],
},
{
File diff suppressed because one or more lines are too long
@@ -0,0 +1,39 @@
import { Head } from '@inertiajs/react';
import { useState } from 'react';
import { PageTitle, Panel } from '@/components/procurement';
import proposal from './evaluation-proposal';
const areas = [
['Avaliações planeadas', 'Definir fornecedor, período, âmbito e responsáveis pela avaliação.'],
['Nova avaliação', 'Identificar contratos e ordens abrangidas, escolher a grelha de bens ou serviços e reunir notas, justificações e evidências.'],
['Rascunhos', 'Preparar a avaliação e completar evidências antes de submeter para revisão.'],
['Avaliações em revisão', 'Conferência independente, com devolução para correcção ou aprovação documentada.'],
['Avaliações aprovadas', 'Consultar versões aprovadas; rectificações devem gerar revisão identificável.'],
['Histórico por fornecedor', 'Consultar a evolução, observações e contestações com decisão documentada. Comparar apenas âmbitos e grelhas equivalentes.'],
['Planos de melhoria', 'Acompanhar acções, responsáveis, prazos, evidências de conclusão e validação de eficácia.'],
['Relatórios de avaliação', 'Ficha por fornecedor e período, resultados por critério, ocorrências críticas e cobertura de evidências.'],
];
export default function SupplierEvaluations() {
const [selected, setSelected] = useState(0);
return <>
<Head title="Avaliação de fornecedores" />
<div className="space-y-6 p-4 md:p-8">
<PageTitle eyebrow="Fornecedores" title="Avaliação de fornecedores" description="Acompanhamento da prestação da entidade fornecedora durante ou após o fornecimento." />
<div className="rounded-xl border border-amber-300 bg-amber-50 p-4 text-sm text-amber-950">
Proposta funcional para validação da organização. As áreas abaixo descrevem o circuito previsto; o registo e a aprovação de avaliações ainda não estão disponíveis. Pesos, escala e limiares são ilustrativos.
</div>
<nav aria-label="Áreas da avaliação de fornecedores" className="flex flex-wrap gap-2">
{areas.map(([label], index) => <button key={label} type="button" aria-pressed={selected === index} onClick={() => setSelected(index)} className={`rounded-lg border px-4 py-2 text-sm ${selected === index ? 'bg-primary text-primary-foreground' : 'bg-card hover:bg-muted'}`}>{label}</button>)}
</nav>
<Panel title={areas[selected][0]} description={areas[selected][1]}>
<p className="text-sm text-muted-foreground">Área prevista na proposta. Não são apresentados resultados de fornecedores reais.</p>
</Panel>
<Panel title="Proposta funcional completa" description="Qualificação verifica elegibilidade; avaliação analisa o cumprimento efectivo. Uma pontuação não suspende nem exclui automaticamente um fornecedor.">
<details><summary className="cursor-pointer font-medium">Consultar campos, grelhas, evidências e regras propostas</summary>
<div className="mt-4 whitespace-pre-wrap text-sm leading-7">{proposal}</div>
</details>
</Panel>
</div>
</>;
}
SupplierEvaluations.layout = { breadcrumbs: [{ title: 'Fornecedores', href: '/fornecedores' }, { title: 'Avaliação de fornecedores', href: '/fornecedores/avaliacoes' }] };