diff --git a/src/Serializer/PartNormalizer.php b/src/Serializer/PartNormalizer.php index b15a7080..c89eb0b3 100644 --- a/src/Serializer/PartNormalizer.php +++ b/src/Serializer/PartNormalizer.php @@ -21,18 +21,23 @@ namespace App\Serializer; use App\Entity\Parts\Part; +use App\Entity\Parts\PartLot; +use App\Entity\Parts\Storelocation; +use Symfony\Component\Serializer\Normalizer\ContextAwareDenormalizerInterface; use Symfony\Component\Serializer\Normalizer\ContextAwareNormalizerInterface; use Symfony\Component\Serializer\Normalizer\NormalizerInterface; use Symfony\Component\Serializer\Normalizer\ObjectNormalizer; -class PartNormalizer implements ContextAwareNormalizerInterface +class PartNormalizer implements ContextAwareNormalizerInterface, ContextAwareDenormalizerInterface { private NormalizerInterface $normalizer; + private StructuralElementFromNameDenormalizer $locationDenormalizer; - public function __construct(ObjectNormalizer $normalizer) + public function __construct(ObjectNormalizer $normalizer, StructuralElementFromNameDenormalizer $locationDenormalizer) { $this->normalizer = $normalizer; + $this->locationDenormalizer = $locationDenormalizer; } public function supportsNormalization($data, string $format = null, array $context = []) @@ -49,7 +54,7 @@ class PartNormalizer implements ContextAwareNormalizerInterface $data = $this->normalizer->normalize($object, $format, $context); //Remove type field for CSV export - if ($format == 'csv') { + if ($format === 'csv') { unset($data['type']); } @@ -57,4 +62,40 @@ class PartNormalizer implements ContextAwareNormalizerInterface return $data; } + + public function supportsDenormalization($data, string $type, string $format = null, array $context = []) + { + return is_array($data) && is_a($type, Part::class, true); + } + + public function denormalize($data, string $type, string $format = null, array $context = []) + { + $object = $this->normalizer->denormalize($data, $type, $format, $context); + + if (!$object instanceof Part) { + throw new \InvalidArgumentException('This normalizer only supports Part objects!'); + } + + if (isset($data['instock']) || isset($data['storelocation'])) { + $partLot = new PartLot(); + + if (isset($data['instock']) && $data['instock'] !== "") { + //Replace comma with dot + $instock = (float) str_replace(',', '.', $data['instock']); + + $partLot->setAmount($instock); + } else { + $partLot->setInstockUnknown(true); + } + + if (isset($data['storelocation']) && $data['storelocation'] !== "") { + $location = $this->locationDenormalizer->denormalize($data['storelocation'], Storelocation::class, $format, $context); + $partLot->setStorageLocation($location); + } + + $object->addPartLot($partLot); + } + + return $object; + } } \ No newline at end of file diff --git a/src/Serializer/StructuralElementFromNameDenormalizer.php b/src/Serializer/StructuralElementFromNameDenormalizer.php index e0b7a91b..37c9bfbe 100644 --- a/src/Serializer/StructuralElementFromNameDenormalizer.php +++ b/src/Serializer/StructuralElementFromNameDenormalizer.php @@ -54,10 +54,16 @@ class StructuralElementFromNameDenormalizer implements ContextAwareDenormalizerI foreach ($elements as $element) { $this->em->persist($element); } + if (empty($elements)) { + return null; + } return end($elements); } $elements = $repo->getEntityByPath($data, $path_delimiter); + if (empty($elements)) { + return null; + } return end($elements); } } \ No newline at end of file