Files
compras/app/Services/ProcurementEvidenceBrief.php
T
nala c6373365bf
tests / ci (push) Canceled after 0s
commit9
2026-10-30 20:02:30 +02:00

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']];
}
}