Files
compras/resources/js/components/procurement-operational-insights.tsx
T
nala c6373365bf
tests / ci (push) Canceled after 0s
commit9
2026-10-30 20:02:30 +02:00

104 lines
4.3 KiB
TypeScript

import { Link } from '@inertiajs/react';
import { Panel } from '@/components/procurement';
export type ProcurementInsights = {
method: 'procurement_facts_v1';
generated_at: string;
processes: number;
pending: {
count: number;
unknown_submission_age: number;
oldest: {
id: number;
number: string;
submitted_at: string;
days_since_submission: number;
href: string;
}[];
};
unapproved_past_needed_date: number;
approved: {
count: number;
without_registered_quotes: number;
without_visible_order: number;
};
};
export function ProcurementOperationalInsights({
data,
}: {
data: ProcurementInsights;
}) {
return (
<Panel title="Leitura operacional de Compras">
<div className="space-y-3 text-sm">
<p>
Base: {data.processes} requisições autorizadas nos filtros
actuais, incluindo todas as páginas.
</p>
{data.processes === 0 ? (
<p>Sem requisições neste âmbito para analisar.</p>
) : (
<>
<p>
{data.pending.count} requisições em aprovação.{' '}
{data.unapproved_past_needed_date} pedidos em
preparação ou aprovação têm a data de necessidade
ultrapassada.
</p>
<p>
A data de necessidade exprime quando o requisitante
precisa do bem ou serviço; não comprova atraso de
entrega do fornecedor.
</p>
{data.pending.oldest.length > 0 && (
<div>
<p className="font-medium">
Em aprovação — até cinco submissões mais
antigas
</p>
<ul className="list-disc space-y-1 pl-5">
{data.pending.oldest.map((item) => (
<li key={item.id}>
<Link
className="underline"
href={item.href}
>
{item.number}
</Link>{' '}
· {item.days_since_submission} dias
de calendário desde a submissão
</li>
))}
</ul>
</div>
)}
<p>
{data.pending.unknown_submission_age} pedidos em
aprovação sem data de submissão utilizável para
calcular antiguidade.
</p>
<p>
Das {data.approved.count} requisições aprovadas:{' '}
{data.approved.without_registered_quotes} sem
propostas registadas e{' '}
{data.approved.without_visible_order} sem ordem de
compra visível.
</p>
<p>
Estas contagens podem sobrepor-se. Propostas
registadas não significam propostas válidas ou
comparáveis; ausência de ordem visível não comprova
incumprimento.
</p>
</>
)}
<p className="text-muted-foreground">
Indicadores factuais para conferência dos processos, sem
previsões por machine learning ou decisões automáticas.
</p>
</div>
</Panel>
);
}