diff --git a/src/Controller/PartController.php b/src/Controller/PartController.php index 5a965401..4567cdb8 100644 --- a/src/Controller/PartController.php +++ b/src/Controller/PartController.php @@ -36,6 +36,7 @@ use App\Exceptions\AttachmentDownloadException; use App\Form\Part\PartBaseType; use App\Services\Attachments\AttachmentSubmitHandler; use App\Services\Attachments\PartPreviewGenerator; +use App\Services\EntityMergers\Mergers\PartMerger; use App\Services\InfoProviderSystem\PartInfoRetriever; use App\Services\LogSystem\EventCommentHelper; use App\Services\LogSystem\HistoryHelper; @@ -233,6 +234,24 @@ class PartController extends AbstractController ]); } + #[Route(path: '/{id}/from_info_provider/{providerKey}/{providerId}/update', requirements: ['providerId' => '.+'])] + public function updateFromInfoProvider(Part $part, Request $request, string $providerKey, string $providerId, + PartInfoRetriever $infoRetriever, PartMerger $partMerger): Response + { + $this->denyAccessUnlessGranted('edit', $part); + + $this->denyAccessUnlessGranted('@info_providers.create_parts'); + + $dto = $infoRetriever->getDetails($providerKey, $providerId); + $provider_part = $infoRetriever->dtoToPart($dto); + + $part = $partMerger->merge($part, $provider_part); + + return $this->renderPartForm('edit', $request, $part, [ + 'info_provider_dto' => $dto, + ]); + } + /** * This function provides a common implementation for methods, which use the part form. * @param Request $request diff --git a/src/Services/EntityMergers/Mergers/EntityMergerHelperTrait.php b/src/Services/EntityMergers/Mergers/EntityMergerHelperTrait.php index 0d9cf751..bdc18bac 100644 --- a/src/Services/EntityMergers/Mergers/EntityMergerHelperTrait.php +++ b/src/Services/EntityMergers/Mergers/EntityMergerHelperTrait.php @@ -63,6 +63,8 @@ trait EntityMergerHelperTrait //Set the value $this->property_accessor->setValue($target, $field, $value); + + return $target; } /** @@ -75,7 +77,7 @@ trait EntityMergerHelperTrait */ protected function useOtherValueIfNotNull(object $target, object $other, string $field): object { - $this->useCallback( + return $this->useCallback( function ($target_value, $other_value) { return $target_value ?? $other_value; }, @@ -84,7 +86,6 @@ trait EntityMergerHelperTrait $field ); - return $target; } /** @@ -97,7 +98,7 @@ trait EntityMergerHelperTrait */ protected function useOtherValueIfNotEmtpy(object $target, object $other, string $field): object { - $this->useCallback( + return $this->useCallback( function ($target_value, $other_value) { return empty($target_value) ? $other_value : $target_value; }, @@ -105,8 +106,6 @@ trait EntityMergerHelperTrait $other, $field ); - - return $target; } /** @@ -119,7 +118,7 @@ trait EntityMergerHelperTrait */ protected function useLargerValue(object $target, object $other, string $field): object { - $this->useCallback( + return $this->useCallback( function ($target_value, $other_value) { return max($target_value, $other_value); }, @@ -127,8 +126,6 @@ trait EntityMergerHelperTrait $other, $field ); - - return $target; } /** @@ -141,7 +138,7 @@ trait EntityMergerHelperTrait */ protected function useSmallerValue(object $target, object $other, string $field): object { - $this->useCallback( + return $this->useCallback( function ($target_value, $other_value) { return min($target_value, $other_value); }, @@ -149,8 +146,6 @@ trait EntityMergerHelperTrait $other, $field ); - - return $target; } /** diff --git a/src/Services/EntityMergers/Mergers/PartMerger.php b/src/Services/EntityMergers/Mergers/PartMerger.php index 9fa5da05..1b31815a 100644 --- a/src/Services/EntityMergers/Mergers/PartMerger.php +++ b/src/Services/EntityMergers/Mergers/PartMerger.php @@ -37,14 +37,19 @@ class PartMerger implements EntityMergerInterface return $target instanceof Part && $other instanceof Part; } - public function merge(object $target, object $other, array $context = []): object + public function merge(object $target, object $other, array $context = []): Part { if (!$target instanceof Part || !$other instanceof Part) { throw new \InvalidArgumentException('The target and the other entity must be instances of Part'); } //Merge the fields + $this->useOtherValueIfNotNull($target, $other, 'manufacturer'); + $this->mergeCollections($target, $other, 'partLots'); + $this->mergeCollections($target, $other, 'attachments'); + $this->mergeCollections($target, $other, 'orderdetails'); + $this->mergeCollections($target, $other, 'parameters'); return $target; }