TenantAtlas/apps/platform/app/Support/ReviewPublicationResolution/ReviewPublicationProofResolver.php
ahmido ba7622a158 feat: implement ReviewPublicationResolutionWorkflow (Spec 386) (#457)
## Summary\n- Implements the ReviewPublicationResolutionWorkflow for Spec 386.\n- Adds resolution case/step persistence, policies, services, audit action IDs, and Filament integration.\n- Updates specs, UI/UX documentation, screenshots, and Pest coverage.\n\n## Tests\n- Not run during this handoff; branch was already clean and pushed.\n\n## Target\n- Base: platform-dev\n- Head/topic: 386-review-publication-resolution-workflow-v1

Co-authored-by: Ahmed Darrazi <ahmed.darrazi@live.de>
Reviewed-on: #457
2026-06-18 21:06:20 +00:00

86 lines
3.1 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Support\ReviewPublicationResolution;
use App\Models\EnvironmentReview;
use App\Models\EvidenceSnapshot;
use App\Models\ReviewPack;
use App\Support\Evidence\EvidenceSnapshotStatus;
use App\Support\ReviewPackStatus;
final class ReviewPublicationProofResolver
{
/**
* @return array{
* proof_type:?string,
* proof_id:?int,
* proof_status:?string,
* operation_run_id:?int
* }
*/
public function proofFor(ReviewPublicationResolutionStepKey $stepKey, EnvironmentReview $review): array
{
$review->loadMissing(['evidenceSnapshot', 'currentExportReviewPack', 'operationRun']);
return match ($stepKey) {
ReviewPublicationResolutionStepKey::ValidateReviewReadiness,
ReviewPublicationResolutionStepKey::RefreshReviewComposition,
ReviewPublicationResolutionStepKey::ReturnToPublication => [
'proof_type' => 'environment_review',
'proof_id' => (int) $review->getKey(),
'proof_status' => (string) $review->status,
'operation_run_id' => is_numeric($review->operation_run_id) ? (int) $review->operation_run_id : null,
],
ReviewPublicationResolutionStepKey::CompleteRequiredReports,
ReviewPublicationResolutionStepKey::CollectEvidenceSnapshot => $this->evidenceProof($review->evidenceSnapshot),
ReviewPublicationResolutionStepKey::GenerateReviewPack => $this->reviewPackProof($review->currentExportReviewPack),
};
}
/**
* @return array{proof_type:?string, proof_id:?int, proof_status:?string, operation_run_id:?int}
*/
public function evidenceProof(?EvidenceSnapshot $snapshot): array
{
if (! $snapshot instanceof EvidenceSnapshot) {
return [
'proof_type' => null,
'proof_id' => null,
'proof_status' => EvidenceSnapshotStatus::Failed->value,
'operation_run_id' => null,
];
}
return [
'proof_type' => 'evidence_snapshot',
'proof_id' => (int) $snapshot->getKey(),
'proof_status' => (string) $snapshot->status,
'operation_run_id' => is_numeric($snapshot->operation_run_id) ? (int) $snapshot->operation_run_id : null,
];
}
/**
* @return array{proof_type:?string, proof_id:?int, proof_status:?string, operation_run_id:?int}
*/
public function reviewPackProof(?ReviewPack $reviewPack): array
{
if (! $reviewPack instanceof ReviewPack) {
return [
'proof_type' => null,
'proof_id' => null,
'proof_status' => ReviewPackStatus::Failed->value,
'operation_run_id' => null,
];
}
return [
'proof_type' => 'review_pack',
'proof_id' => (int) $reviewPack->getKey(),
'proof_status' => (string) $reviewPack->status,
'operation_run_id' => is_numeric($reviewPack->operation_run_id) ? (int) $reviewPack->operation_run_id : null,
];
}
}