import { Head, Link } from '@inertiajs/react';
import { Printer } from 'lucide-react';
import { PageTitle, Panel } from '@/components/procurement';
import { Button } from '@/components/ui/button';
import { date, money, roleLabels } from '@/types/procurement';
import type { PurchaseOrder } from '@/types/purchase';
type History = {
id: number;
action: string;
user_id: number;
created_at: string;
};
const actions: Record = {
'award.created': 'Adjudicação registada',
'award.approved': 'Etapa do valor final aprovada',
'award.rejected': 'Adjudicação rejeitada',
'purchase_order.issued': 'Ordem emitida para revisão',
};
export default function OrderShow({
order,
history,
}: {
order: PurchaseOrder;
history: History[];
}) {
const snapshot = order.snapshot;
return (
<>
Recepções, qualidade e quantidades pendentes
Imprimir / guardar PDF
}
/>
Documento de desenvolvimento. Não autoriza compras
reais.
{' '}
Orçamento não verificado. Os dados apresentados foram
congelados na emissão.
{snapshot.approval_rules.rules_provisional &&
' Regras de aprovação provisórias.'}
{snapshot.investment_rules && (
Versão {snapshot.investment_rules.revision} ·
Tecto{' '}
{money(snapshot.investment_rules.ceiling_minor)}{' '}
·{' '}
{snapshot.investment_rules.includes_tax
? 'com IVA'
: 'sem IVA'}
Vigência: {snapshot.investment_rules.valid_from}{' '}
a {snapshot.investment_rules.valid_until}
{snapshot.equipment_requests?.map((line) => (
{line.description} · Área:{' '}
{line.production_area}
))}
)}
Nome e identificação fiscal
{snapshot.supplier.name} · NUIT{' '}
{snapshot.supplier.nuit}
Contacto
{snapshot.supplier.contact} ·{' '}
{snapshot.supplier.phone}
{snapshot.supplier.email}
Morada
{snapshot.supplier.address}
Entrega
{date(snapshot.award.delivery_date)} ·{' '}
{snapshot.award.delivery_location}
Pagamento
{snapshot.quotation.payment_terms}
Departamento e centro de custo
{snapshot.department.name} ·{' '}
{snapshot.cost_center.code} ·{' '}
{snapshot.cost_center.name}
Proposta
{snapshot.quotation.reference} ·{' '}
{order.currency}
Descrição
Quantidade
Preço sem IVA
IVA
Total com IVA
{order.items.map((item) => (
{item.description}
{Number(item.quantity)} {item.unit}
{money(item.unit_price_minor)}
{Number(item.tax_rate)}%
{money(item.total_minor)}
))}
Subtotal sem IVA
{money(order.subtotal_minor)}
IVA
{money(order.tax_minor)}
Total com IVA
{money(order.total_minor)}
{snapshot.award.justification}
{snapshot.decision_matrix.map((row) => (
{row.supplier.name} · {row.reference} ·{' '}
{row.score === null
? 'Não elegível / incompleta'
: `${row.score.toFixed(2)} / 10`}
{money(row.total_minor)} com IVA ·{' '}
{row.evaluation_count} avaliações elegíveis
{row.evaluations.map((e) => (
Avaliador #{e.evaluator_id}: qualidade{' '}
{e.quality}, histórico {e.history},
pagamento {e.payment}. {e.comment}
))}
))}
{snapshot.final_approvals.map((step) => (
{roleLabels[step.role]} · Utilizador #
{step.approver_id} · Aprovada
{step.comment && (
{step.comment}
)}
))}
Base:{' '}
{snapshot.approval_rules.approval_includes_tax
? 'com'
: 'sem'}{' '}
IVA. As aprovações da estimativa foram preservadas
separadamente.
{history.map((event) => (
{actions[event.action]} ·{' '}
{date(event.created_at)} · Utilizador #
{event.user_id}
))}
Voltar às ordens
>
);
}
OrderShow.layout = {
breadcrumbs: [
{ title: 'Ordens de compra', href: '/ordens' },
{ title: 'Documento emitido', href: '#' },
],
};