51 lines
3.9 KiB
PHP
51 lines
3.9 KiB
PHP
<?php
|
|
|
|
namespace App\Services;
|
|
|
|
class ProcurementEvidenceBrief
|
|
{
|
|
/**
|
|
* Accept only the report already filtered by ProcurementReviewReport.
|
|
* No database, document instructions, external model or persistent cache.
|
|
*
|
|
* @param array<string,mixed> $report
|
|
* @return array<string,mixed>
|
|
*/
|
|
public function build(array $report): array
|
|
{
|
|
$claims = [];
|
|
$add = function (string $id, string $text, string $section, string $label, string $pointer, mixed $basis) use (&$claims): void {
|
|
$claims[] = ['id' => $id, 'text' => $text, 'source' => ['label' => $label, 'href' => '#report-'.$section, 'pointer' => $pointer],
|
|
'basis_sha256' => hash('sha256', json_encode($basis, JSON_THROW_ON_ERROR))];
|
|
};
|
|
$request = $report['requisition'];
|
|
$states = ['draft' => 'rascunho', 'pending' => 'em aprovação', 'approved' => 'aprovada', 'rejected' => 'rejeitada', 'cancelled' => 'cancelada'];
|
|
$add('request', 'A requisição encontra-se no estado '.($states[$request['status']] ?? 'registado no pedido').'.', 'request', 'Identificação do pedido', 'requisition.status', [$request['id'], $request['status']]);
|
|
$comparison = $report['comparison'];
|
|
$count = count($comparison['rows']);
|
|
$add('comparison', $count.' propostas constam da comparação actual. '.($comparison['ready'] ? 'O método existente indica comparação pronta; isso não autoriza adjudicação ou emissão.' : 'O método existente ainda não indica comparação pronta.'),
|
|
'comparison', 'Comparação actual das propostas', 'comparison', $comparison);
|
|
$qualification = $report['qualification'];
|
|
$add('qualification', $qualification === null ? 'Não consta uma versão de qualificação documental nesta consulta.' :
|
|
'Qualificação documental na revisão '.$qualification['revision'].'. '.($qualification['is_current'] ? 'A base coincide com as propostas actuais.' : 'A base difere das propostas actuais; consultar o histórico antes de a usar.'),
|
|
'qualification', 'Qualificação documental', 'qualification', $qualification);
|
|
$opening = $report['opening'];
|
|
$add('opening', $opening === null ? 'Não consta acta de abertura neste módulo opcional.' : 'Acta de abertura na revisão '.$opening['revision'].'. '.($opening['source_changed'] ? 'Há diferenças face à base actual; a acta conserva a base original.' : 'A base coincide com os dados actuais.'),
|
|
'records', 'Registos do processo', 'opening', $opening);
|
|
$add('order', $report['order'] === null ? 'Não consta ordem emitida nesta consulta.' : 'Consta uma ordem emitida; a existência da ordem não comprova entrega nem pagamento.',
|
|
'records', 'Registos do processo', 'order', $report['order']);
|
|
$fulfilment = $report['fulfilment'];
|
|
$add('receipts', count($fulfilment['receipts']).' registos de recepção constam da consulta; esta contagem não comprova execução integral.',
|
|
'fulfilment', 'Recepção, facturas e registos de pagamento', 'fulfilment.receipts', $fulfilment['receipts']);
|
|
if ($fulfilment['finance_visible']) {
|
|
$add('finance', count($fulfilment['invoices']).' facturas e '.count($fulfilment['payments']).' registos de pagamento constam do âmbito financeiro autorizado. A existência de um registo não confirma a sua validação ou liquidação.',
|
|
'fulfilment', 'Recepção, facturas e registos de pagamento', 'fulfilment', ['invoices' => $fulfilment['invoices'], 'payments' => $fulfilment['payments']]);
|
|
}
|
|
|
|
$basis = ['method' => 'procurement_evidence_brief_v1', 'requisition_id' => $request['id'], 'claims' => $claims];
|
|
|
|
return [...$basis, 'generated_at' => $report['generated_at'], 'basis_sha256' => hash('sha256', json_encode($basis, JSON_THROW_ON_ERROR)),
|
|
'finance_visible' => $fulfilment['finance_visible']];
|
|
}
|
|
}
|