104 lines
4.3 KiB
TypeScript
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>
|
|
);
|
|
}
|