diff --git a/src/Bundle/ChillPersonBundle/Serializer/Normalizer/AccompanyingPeriodWorkEvaluationDenormalizer.php b/src/Bundle/ChillPersonBundle/Serializer/Normalizer/AccompanyingPeriodWorkEvaluationDenormalizer.php new file mode 100644 index 000000000..93bf39be7 --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Serializer/Normalizer/AccompanyingPeriodWorkEvaluationDenormalizer.php @@ -0,0 +1,134 @@ +workRepository = $workRepository; + $this->em = $em; + } + + public function denormalize($data, $type, $format = null, array $context = []) + { + $work = $this->denormalizer->denormalize($data, $type, $format, array_merge( + $context, + ['skip' => self::class] + )); + dump($work); + dump($data); + dump($type); + //if (in_array('accompanying_period_work:edit', $context['groups'] ?? [], true)) { + $this->handleEvaluationCollection($data, $work, $format, $context); + //} + + return $work; + } + + public function supportsDenormalization($data, $type, $format = null, array $context = []): bool + { + return AccompanyingPeriodWorkEvaluation::class === $type + && self::class !== ($context['skip'] ?? null) + && is_array($data) + && array_key_exists('type', $data) + && 'accompanying_period_work_evaluation' === $data['type']; + } + + private function handleEvaluationCollection(array $data, AccompanyingPeriodWorkEvaluation $evaluation, string $format, array $context) + { + $dataById = []; + $dataWithoutId = []; + + foreach ($data['documents'] as $e) { + if (array_key_exists('id', $e)) { + $dataById[$e['id']] = $e; + } else { + $dataWithoutId[] = $e; + } + } + dump($dataById); + dump($dataWithoutId); + + dump($evaluation); + // partition the separate kept documents and removed one + [$kept, $removed] = $evaluation->getDocuments() + ->partition( + static fn (int $key, AccompanyingPeriodWorkEvaluationDocument $a) => array_key_exists($a->getId(), $dataById) + ); + + + + // remove the document from evaluation + foreach ($removed as $r) { + $evaluation->removeDocument($r); + } + // handle the documents kept + foreach ($kept as $k) { + $this->denormalizer->denormalize( + $dataById[$k->getId()], + AccompanyingPeriodWorkEvaluationDocument::class, + $format, + array_merge( + $context, + [ + 'groups' => ['write'], + AbstractNormalizer::OBJECT_TO_POPULATE => $k, + ] + ) + ); + } + // create new document + foreach ($dataWithoutId as $newData) { + $document = $this->denormalizer->denormalize( + $newData, + AccompanyingPeriodWorkEvaluationDocument::class, + $format, + array_merge( + $context, + ['groups' => ['accompanying_period_work_evaluation:create']] + ) + ); + $evaluation->addDocument($document); + } + } +}