From c0f320ba1ad60318490cbb44ea54bc7c5cfe4ffe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Tue, 24 Jun 2025 17:02:40 +0200 Subject: [PATCH] Track caller changes in ticket normalization and history serialization --- .../Normalizer/TicketNormalizer.php | 13 +++++ .../Normalizer/TicketNormalizerTest.php | 52 ++++++++++++++----- 2 files changed, 53 insertions(+), 12 deletions(-) diff --git a/src/Bundle/ChillTicketBundle/src/Serializer/Normalizer/TicketNormalizer.php b/src/Bundle/ChillTicketBundle/src/Serializer/Normalizer/TicketNormalizer.php index 87aa5ad05..b10a0873d 100644 --- a/src/Bundle/ChillTicketBundle/src/Serializer/Normalizer/TicketNormalizer.php +++ b/src/Bundle/ChillTicketBundle/src/Serializer/Normalizer/TicketNormalizer.php @@ -15,6 +15,7 @@ use Chill\MainBundle\Entity\User; use Chill\MainBundle\Entity\UserGroup; use Chill\PersonBundle\Entity\Person; use Chill\TicketBundle\Entity\AddresseeHistory; +use Chill\TicketBundle\Entity\CallerHistory; use Chill\TicketBundle\Entity\Comment; use Chill\TicketBundle\Entity\EmergencyStatusHistory; use Chill\TicketBundle\Entity\MotiveHistory; @@ -53,6 +54,7 @@ final class TicketNormalizer implements NormalizerInterface, NormalizerAwareInte 'createdBy' => $this->normalizer->normalize($object->getCreatedBy(), $format, $context), 'currentState' => $object->getState()?->value ?? 'open', 'emergency' => $object->getEmergencyStatus()?->value ?? 'no', + 'caller' => $this->normalizer->normalize($object->getCaller(), $format, ['groups' => 'read']), ]; } @@ -115,6 +117,17 @@ final class TicketNormalizer implements NormalizerInterface, NormalizerAwareInte ], $ticket->getEmergencyStatusHistories()->toArray(), ), + ...array_map( + fn (CallerHistory $stateHistory) => [ + 'event_type' => 'set_caller', + 'at' => $stateHistory->getStartDate(), + 'by' => $stateHistory->getCreatedBy(), + 'data' => [ + 'new_caller' => $this->normalizer->normalize($ticket->getCaller(), $format, ['groups' => ['read']]), + ], + ], + $ticket->getCallerHistories()->toArray(), + ), ]; if (null !== $ticket->getCreatedBy() && null !== $ticket->getCreatedAt()) { diff --git a/src/Bundle/ChillTicketBundle/tests/Serializer/Normalizer/TicketNormalizerTest.php b/src/Bundle/ChillTicketBundle/tests/Serializer/Normalizer/TicketNormalizerTest.php index d30334b0d..2e3de468d 100644 --- a/src/Bundle/ChillTicketBundle/tests/Serializer/Normalizer/TicketNormalizerTest.php +++ b/src/Bundle/ChillTicketBundle/tests/Serializer/Normalizer/TicketNormalizerTest.php @@ -15,6 +15,7 @@ use Chill\MainBundle\Entity\User; use Chill\MainBundle\Entity\UserGroup; use Chill\PersonBundle\Entity\Person; use Chill\TicketBundle\Entity\AddresseeHistory; +use Chill\TicketBundle\Entity\CallerHistory; use Chill\TicketBundle\Entity\Comment; use Chill\TicketBundle\Entity\EmergencyStatusEnum; use Chill\TicketBundle\Entity\EmergencyStatusHistory; @@ -91,27 +92,16 @@ class TicketNormalizerTest extends KernelTestCase 'history' => [ [ 'event_type' => 'create_ticket', - 'at' => 1718495999, - 'by' => [ - 0 => 'user', - ], - 'data' => [], ], [ 'event_type' => 'state_change', - 'at' => 1718495999, - 'by' => [ - 0 => 'user', - ], - 'data' => [ - 'new_state' => 'open', - ], ], ], 'currentState' => 'open', 'updatedAt' => $t->getUpdatedAt()->getTimestamp(), 'updatedBy' => ['user'], 'emergency' => 'no', + 'caller' => null, ], ]; @@ -165,6 +155,36 @@ class TicketNormalizerTest extends KernelTestCase 'updatedAt' => $ticket->getUpdatedAt()->getTimestamp(), 'updatedBy' => ['user'], 'emergency' => 'yes', + 'caller' => null, + ], + ]; + + // ticket with caller + $ticket = new Ticket(); + $ticket->setCreatedAt(new \DateTimeImmutable('2024-06-16T00:00:00')); + $ticket->setUpdatedAt(new \DateTimeImmutable('2024-06-16T00:00:00')); + new CallerHistory(new Person(), $ticket, new \DateTimeImmutable('2024-04-01T12:00:00')); + + yield [ + $ticket, + [ + 'type' => 'ticket_ticket', + 'createdAt' => $ticket->getCreatedAt()?->getTimestamp(), + 'createdBy' => null, + 'id' => null, + 'externalRef' => '', + 'currentPersons' => [], + 'currentAddressees' => [], + 'currentInputs' => [], + 'currentMotive' => null, + 'history' => [ + ['event_type' => 'set_caller'], + ], + 'currentState' => 'open', + 'updatedAt' => $ticket->getUpdatedAt()->getTimestamp(), + 'updatedBy' => null, + 'emergency' => 'no', + 'caller' => ['person'], ], ]; } @@ -224,6 +244,11 @@ class TicketNormalizerTest extends KernelTestCase 'json', ['groups' => 'read'] )->will(fn ($args): array => $args[0]); + $normalizer->normalize( + Argument::that(fn ($arg) => is_array($arg) && 1 === count($arg) && array_key_exists('new_caller', $arg)), + 'json', + ['groups' => 'read'] + )->will(fn ($args): array => ['new_caller' => ['dummy']]); // datetime $normalizer->normalize(Argument::type(\DateTimeImmutable::class), 'json', Argument::type('array')) @@ -231,6 +256,9 @@ class TicketNormalizerTest extends KernelTestCase // user $normalizer->normalize(Argument::type(User::class), 'json', Argument::type('array')) ->willReturn(['user']); + // person + $normalizer->normalize(Argument::type(Person::class), 'json', Argument::type('array')) + ->willReturn(['person']); // motive $normalizer->normalize(Argument::type(Motive::class), 'json', Argument::type('array'))->willReturn(['type' => 'motive', 'id' => 0]); // person history