58 lines
5.4 KiB
PHP
58 lines
5.4 KiB
PHP
<!DOCTYPE html>
|
|
<html lang="pt">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<title>Recomendação · {{ $requisition->number }} · Sistema de Gestão de Compras (SGC)</title>
|
|
<style>
|
|
@page { size: A4 landscape; margin: 14mm; }
|
|
body { font: 12px Arial, sans-serif; color: #111; margin: 24px; }
|
|
header { border-bottom: 3px solid #ed1c24; margin-bottom: 18px; padding-bottom: 12px; }
|
|
h1 { font-size: 21px; } h2 { margin-top: 22px; font-size: 16px; }
|
|
table { width: 100%; border-collapse: collapse; margin-top: 12px; }
|
|
th, td { border: 1px solid #bbb; padding: 7px; text-align: left; vertical-align: top; overflow-wrap: anywhere; }
|
|
th { background: #eee; } thead { display: table-header-group; }
|
|
tr, article { break-inside: avoid; } p { overflow-wrap: anywhere; }
|
|
.reason { white-space: pre-wrap; } .notice { border: 1px solid #999; padding: 12px; }
|
|
article { border-left: 3px solid #ddd; padding-left: 12px; margin: 14px 0; }
|
|
footer { border-top: 1px solid #999; margin-top: 24px; padding-top: 10px; }
|
|
@media print { .controls { display: none; } body { margin: 0; } }
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<nav class="controls"><a href="{{ route('recommendations.show', $requisition) }}">Voltar ao processo</a> · <button onclick="window.print()">Imprimir</button></nav>
|
|
<header><strong>Sistema de Gestão de Compras (SGC)</strong><h1>Recomendação antes da adjudicação · {{ $requisition->number }}</h1><p>Adopção {{ $adoption->revision }} · política {{ $adoption->snapshot['policy_revision'] }} · tentativa {{ $attempt->revision }}</p></header>
|
|
@php
|
|
$states = ['pending' => 'A aguardar conferência', 'confirmed' => 'Recomendação confirmada', 'returned' => 'Tentativa devolvida'];
|
|
$rows = $attempt->snapshot['basis']['rows'];
|
|
$candidate = collect($rows)->firstWhere('id', $attempt->quotation_id);
|
|
@endphp
|
|
<p class="notice"><strong>{{ $states[$state] }} · {{ $current ? 'Base actual na consulta' : 'Histórica ou base desactualizada: não utilizável para adjudicar' }}</strong><br>Recomendação não autoriza compra, não substitui aprovações do valor final e não constitui assinatura digital ou certificação de evidências.</p>
|
|
<p>Consulta por {{ $generatedBy }} em {{ $generatedAt->format('d/m/Y H:i:s') }} · Africa/Johannesburg (UTC+2). A situação actual pode mudar após esta consulta.</p>
|
|
<h2>Proposta recomendada</h2><p><strong>{{ $candidate['supplier_name'] ?? 'Fornecedor indisponível' }}</strong> · {{ $candidate['reference'] ?? $attempt->quotation_id }}</p>
|
|
<p>Proponente: {{ $attempt->snapshot['proponent']['name'] }} · Registo: {{ $attempt->created_at }} UTC</p><p class="reason">{{ $attempt->reason }}</p>
|
|
<p>Política preservada: {{ $adoption->snapshot['required_count'] }} pessoas distintas; {{ implode(', ', array_map(fn ($role) => \App\Enums\PurchasingRole::from($role)->label(), $adoption->snapshot['roles'])) }}.</p>
|
|
<p>Base preservada: {{ $attempt->basis_hash }}</p>
|
|
<h2>Matriz preservada na tentativa</h2>
|
|
<table><thead><tr><th>Fornecedor e proposta</th><th>Total</th><th>Avaliações elegíveis</th><th>Pontuação / 10</th><th>Situação na base preservada</th></tr></thead><tbody>
|
|
@foreach($rows as $row)
|
|
<tr><td>{{ $row['supplier_name'] }} · {{ $row['reference'] }}</td><td>{{ number_format($row['total_minor'] / 100, 2, ',', ' ') }} {{ $row['currency'] }}</td><td>{{ $row['evaluation_count'] }}</td><td>{{ $row['score_minor'] === null ? 'Por concluir' : number_format($row['score_minor'] / 100, 2, ',', ' ') }}</td><td>{{ $row['eligible'] ? 'Elegível, com admissão confirmada' : implode(' ', $row['ineligibility_reasons']) }}{{ in_array($row['id'], $attempt->snapshot['basis']['top_ids'], true) ? ' · Maior pontuação' : '' }}</td></tr>
|
|
@endforeach
|
|
</tbody></table>
|
|
<h2>Referências de admissão preservadas</h2>
|
|
@foreach($attempt->snapshot['basis']['admissions'] as $admission)
|
|
<p>Proposta #{{ $admission['quotation_id'] }} · requisitos #{{ $admission['basis']['set_id'] ?? 'não disponíveis' }} · decisão #{{ $admission['decision']['id'] ?? 'não disponível' }} · conferências {{ implode(', ', array_column($admission['reviews'], 'id')) ?: 'sem registos' }}.</p>
|
|
@endforeach
|
|
<h2>Conferências desta tentativa</h2>
|
|
@forelse($reviews as $review)
|
|
<article><strong>{{ $review->snapshot['name'] }} · {{ \App\Enums\PurchasingRole::from($review->snapshot['purchasing_role'])->label() }} · {{ $review->verdict === 'approved' ? 'Confirmou' : 'Devolveu' }}</strong><p>{{ $review->created_at }} UTC</p><p class="reason">{{ $review->reason }}</p></article>
|
|
@empty<p>Sem conferências registadas.</p>@endforelse
|
|
<h2>Histórico desta adopção até à tentativa impressa</h2>
|
|
@forelse($history as $entry)
|
|
<article><strong>Tentativa {{ $entry['attempt']->revision }} · proposta #{{ $entry['attempt']->quotation_id }} · {{ $states[$entry['state']] }} · histórica</strong><p class="reason">{{ $entry['attempt']->reason }}</p>
|
|
@foreach($entry['reviews'] as $review)<p class="reason">{{ $review->snapshot['name'] }} · {{ $review->verdict === 'approved' ? 'Confirmou' : 'Devolveu' }} · {{ $review->created_at }} UTC · {{ $review->reason }}</p>@endforeach</article>
|
|
@empty<p>Sem tentativas anteriores nesta adopção.</p>@endforelse
|
|
<footer>Sistema de Gestão de Compras (SGC) · Registos preservados para conferência. Outras adopções são consultáveis no histórico autenticado do processo.</footer>
|
|
</body>
|
|
</html>
|