42 lines
2.8 KiB
PHP
42 lines
2.8 KiB
PHP
<?php
|
|
|
|
namespace App\Services;
|
|
|
|
use App\Models\Opportunity;
|
|
|
|
/** Multiple identified references in the existing encrypted investment context. */
|
|
final class InvestmentOpportunityChoices
|
|
{
|
|
public function resolve(array $choices, array $previous = []): array
|
|
{
|
|
$result = [];
|
|
foreach ($choices as $choice) {
|
|
$ref = app(InvestorContext::class)->reference($choice['source']);
|
|
abort_unless($ref['kind'] === 'opportunity', 422, 'Seleccione uma ficha de oportunidade.');
|
|
$record = Opportunity::findOrFail($ref['id']);
|
|
$documented = $record->primary_territory_id;
|
|
$territory = $choice['territory'] ?? ($documented ? 'territory:'.$documented : null);
|
|
$old = collect($previous)->first(fn ($row) => $row['opportunity']['key'] === $ref['key']);
|
|
$previousTerritory = $old['territory']['key'] ?? null;
|
|
$newAlternative = $documented && $territory !== 'territory:'.$documented
|
|
&& (! $old || ($old['documented_territory_id'] ?? null) !== $documented || $territory !== $previousTerritory);
|
|
if ($newAlternative || ($previousTerritory && $territory !== $previousTerritory)) {
|
|
abort_unless(! empty($choice['confirm_location_change']) && mb_strlen(trim($choice['location_reason'] ?? '')) >= 20,
|
|
422, 'Uma localização documentada ou já confirmada só muda por escolha explícita, com confirmação e motivo.');
|
|
}
|
|
$location = $territory ? app(InvestorContext::class)->reference($territory) : null;
|
|
abort_unless($location === null || $location['kind'] === 'territory', 422);
|
|
$result[] = ['opportunity' => $ref, 'territory' => $location,
|
|
'territory_path' => $location ? array_map(fn ($node) => \Illuminate\Support\Arr::only((array) $node, ['id', 'name', 'parent_id', 'location_type']), app(InvestmentGeography::class)->path($location['id'], true)) : [],
|
|
'activities' => $choice['activities'] ?? ($old['activities'] ?? []),
|
|
'documented_territory_id' => $documented, 'location_reason' => $choice['location_reason'] ?? '',
|
|
'location_state' => $location ? ($documented && $territory === 'territory:'.$documented ? 'documented' : 'investor_selected') : 'undetermined',
|
|
'location_changed_explicitly' => $old && $territory === $previousTerritory ? (bool) ($old['location_changed_explicitly'] ?? false) : (bool) ($choice['confirm_location_change'] ?? false),
|
|
'coverage' => data_get($record->workflow_context, 'corridor_agribusiness.corridor'),
|
|
'source' => data_get($record->workflow_context, 'corridor_agribusiness.source'),
|
|
'source_sha256' => data_get($record->workflow_context, 'corridor_agribusiness.source_sha256')];
|
|
}
|
|
return $result;
|
|
}
|
|
}
|