whereKey($project->id)->lockForUpdate()->firstOrFail(); $configuration = $this->duplicateProjectConfiguration->normalizeConfiguration( $template->configuration_snapshot ?? [], ); $localAreas = array_values(array_diff( DuplicateProjectConfiguration::copyableAreas(), array_keys($configuration), )); $project->forceFill([ 'project_template_id' => $template->id, 'template_overrides' => $localAreas, ])->saveQuietly(); $blockedAreas = $this->duplicateProjectConfiguration->apply($project, $configuration); $this->projectTemplateOverrideManager->clear( $project->fresh(), array_values(array_diff(array_keys($configuration), $blockedAreas)), ); }); } /** * @param list $areas * @param array $statusReplacements */ public function reset(Project $project, array $areas, array $statusReplacements = []): void { $template = $project->projectTemplate; if ($template === null) { return; } DB::transaction(function () use ($project, $template, $areas, $statusReplacements): void { $project = Project::query()->whereKey($project->id)->lockForUpdate()->firstOrFail(); $configuration = collect($this->duplicateProjectConfiguration->normalizeConfiguration( $template->configuration_snapshot ?? [], ))->only($areas)->all(); $blockedAreas = $this->duplicateProjectConfiguration->apply( $project, $configuration, $statusReplacements, ); $this->projectTemplateOverrideManager->clear( $project->fresh(), array_values(array_diff(array_keys($configuration), $blockedAreas)), ); }); } }