|null $areas * @return array|null */ public function handle(Project $project, ?array $areas = null): ?array { $project->loadMissing('projectTemplate'); /** @var ProjectTemplate|null $projectTemplate */ $projectTemplate = $project->projectTemplate; if ($projectTemplate === null) { return null; } $selectedAreas = $areas === null ? DuplicateProjectConfiguration::copyableAreas() : $this->duplicateProjectConfiguration->normalizeCopyAreas($areas); $templateConfiguration = collect($projectTemplate->configuration_snapshot ?? []) ->only($selectedAreas) ->all(); $currentConfiguration = $this->duplicateProjectConfiguration->export($project, $selectedAreas); $overriddenAreas = []; $inheritedAreas = []; foreach ($selectedAreas as $area) { $label = $this->labelForArea($area); $hasTemplateValue = array_key_exists($area, $templateConfiguration); $hasCurrentValue = array_key_exists($area, $currentConfiguration); if (! $hasTemplateValue && ! $hasCurrentValue) { continue; } if ($hasTemplateValue && $hasCurrentValue && $currentConfiguration[$area] === $templateConfiguration[$area]) { $inheritedAreas[] = [ 'label' => $label, 'value' => $area, ]; continue; } $overriddenAreas[] = [ 'label' => $label, 'value' => $area, ]; } $overriddenAreaValues = array_flip(array_column($overriddenAreas, 'value')); $inheritedAreaValues = array_flip(array_column($inheritedAreas, 'value')); return [ 'effectiveConfiguration' => array_replace($templateConfiguration, array_intersect_key($currentConfiguration, $overriddenAreaValues)), 'inheritedAreas' => $inheritedAreas, 'inheritedConfiguration' => array_intersect_key($templateConfiguration, $inheritedAreaValues), 'inheritsFromTemplate' => true, 'overriddenAreas' => $overriddenAreas, 'overriddenConfiguration' => array_intersect_key($currentConfiguration, $overriddenAreaValues), 'templateConfiguration' => $templateConfiguration, 'templateId' => $projectTemplate->id, 'templateName' => $projectTemplate->name, 'templateSlug' => $projectTemplate->slug, ]; } private function labelForArea(string $area): string { foreach (DuplicateProjectConfiguration::copyAreaOptions() as $option) { if ($option['value'] === $area) { return $option['label']; } } return $area; } }