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}
{order.items.map((item) => ( ))}
Descrição Quantidade Preço sem IVA IVA Total com IVA
{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) => (
  1. {roleLabels[step.role]} · Utilizador # {step.approver_id} · Aprovada {step.comment && (

    {step.comment}

    )}
  2. ))}

Base:{' '} {snapshot.approval_rules.approval_includes_tax ? 'com' : 'sem'}{' '} IVA. As aprovações da estimativa foram preservadas separadamente.

    {history.map((event) => (
  1. {actions[event.action]} ·{' '} {date(event.created_at)} · Utilizador # {event.user_id}
  2. ))}
Voltar às ordens
); } OrderShow.layout = { breadcrumbs: [ { title: 'Ordens de compra', href: '/ordens' }, { title: 'Documento emitido', href: '#' }, ], };