diff --git a/src/Bundle/ChillTicketBundle/src/Command/Ticket/AssociateByPhonenumberCommand.php b/src/Bundle/ChillTicketBundle/src/Command/Ticket/AssociateByPhonenumberCommand.php new file mode 100644 index 000000000..61e652190 --- /dev/null +++ b/src/Bundle/ChillTicketBundle/src/Command/Ticket/AssociateByPhonenumberCommand.php @@ -0,0 +1,19 @@ +phoneNumberUtil->parse($command->phonenumber); + $persons = $this->personRepository->findByPhone($phone); + + foreach ($persons as $person) { + $history = new PersonHistory($person, $ticket, $this->clock->now()); + $this->entityManager->persist($history); + } + } +} diff --git a/src/Bundle/ChillTicketBundle/src/Command/Ticket/Handler/CreateTicketCommandHandler.php b/src/Bundle/ChillTicketBundle/src/Command/Ticket/Handler/CreateTicketCommandHandler.php new file mode 100644 index 000000000..a62c0418e --- /dev/null +++ b/src/Bundle/ChillTicketBundle/src/Command/Ticket/Handler/CreateTicketCommandHandler.php @@ -0,0 +1,26 @@ +setExternalRef($command->externalReference); + + return $ticket; + } +} diff --git a/src/Bundle/ChillTicketBundle/src/Controller/CreateTicketController.php b/src/Bundle/ChillTicketBundle/src/Controller/CreateTicketController.php new file mode 100644 index 000000000..ec2ea7b90 --- /dev/null +++ b/src/Bundle/ChillTicketBundle/src/Controller/CreateTicketController.php @@ -0,0 +1,60 @@ +security->isGranted('ROLE_USER')) { + throw new AccessDeniedHttpException('Only users are allowed to create tickets.'); + } + + $createCommand = new CreateTicketCommand($request->query->get('extId', '')); + $ticket = $this->createTicketCommandHandler->__invoke($createCommand); + + $this->entityManager->persist($ticket); + + if ($request->query->has('caller')) { + $associateByPhonenumberCommand = new AssociateByPhonenumberCommand($request->query->get('caller')); + $this->associateByPhonenumberCommandHandler->__invoke($ticket, $associateByPhonenumberCommand); + } + + $this->entityManager->flush(); + + return new RedirectResponse( + $this->urlGenerator->generate('chill_ticket_ticket_edit', ['id' => $ticket->getId()]) + ); + } +} diff --git a/src/Bundle/ChillTicketBundle/src/Controller/ViewTicketController.php b/src/Bundle/ChillTicketBundle/src/Controller/EditTicketController.php similarity index 64% rename from src/Bundle/ChillTicketBundle/src/Controller/ViewTicketController.php rename to src/Bundle/ChillTicketBundle/src/Controller/EditTicketController.php index 9b35c0d48..a51c3a4a8 100644 --- a/src/Bundle/ChillTicketBundle/src/Controller/ViewTicketController.php +++ b/src/Bundle/ChillTicketBundle/src/Controller/EditTicketController.php @@ -11,14 +11,16 @@ declare(strict_types=1); namespace Chill\TicketBundle\Controller; +use Chill\TicketBundle\Entity\Ticket; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; -class ViewTicketController +class EditTicketController { - #[Route('/{_locale}/ticket/ticket/{ticketId}', name: 'chill_ticket_ticket_view')] - public function __invoke(int $ticketId): Response - { + #[Route('/{_locale}/ticket/ticket/{id}/edit', name: 'chill_ticket_ticket_edit')] + public function __invoke( + Ticket $ticket + ): Response { return new Response('ok'); } } diff --git a/src/Bundle/ChillTicketBundle/src/config/services.yaml b/src/Bundle/ChillTicketBundle/src/config/services.yaml index 6d2f9e1bf..372baa81f 100644 --- a/src/Bundle/ChillTicketBundle/src/config/services.yaml +++ b/src/Bundle/ChillTicketBundle/src/config/services.yaml @@ -8,5 +8,6 @@ services: tags: - controller.service_arguments - + Chill\TicketBundle\Command\Ticket\Handler\: + resource: '../Command/Ticket/Handler/' diff --git a/src/Bundle/ChillTicketBundle/tests/Command/Ticket/Handler/AssociateByPhonenumberCommandHandlerTest.php b/src/Bundle/ChillTicketBundle/tests/Command/Ticket/Handler/AssociateByPhonenumberCommandHandlerTest.php new file mode 100644 index 000000000..ab0744015 --- /dev/null +++ b/src/Bundle/ChillTicketBundle/tests/Command/Ticket/Handler/AssociateByPhonenumberCommandHandlerTest.php @@ -0,0 +1,62 @@ +prophesize(ObjectManager::class); + + return new AssociateByPhonenumberCommandHandler( + $personACLAwareRepository, + PhoneNumberUtil::getInstance(), + new MockClock(), + $objectManager->reveal() + ); + } + + public function testHandleWithPersonFoundByPhonenumber(): void + { + $person = new Person(); + + $personAclAwareRepository = $this->prophesize(PersonACLAwareRepositoryInterface::class); + $personAclAwareRepository->findByPhone(Argument::any())->willReturn([$person]); + + $handler = $this->getHandler($personAclAwareRepository->reveal()); + + $ticket = new Ticket(); + $handler($ticket, new AssociateByPhonenumberCommand('+3281136917')); + + self::assertSame($person, $ticket->getPersons()[0]); + } +} diff --git a/src/Bundle/ChillTicketBundle/tests/Command/Ticket/Handler/CreateTicketCommandHandlerTest.php b/src/Bundle/ChillTicketBundle/tests/Command/Ticket/Handler/CreateTicketCommandHandlerTest.php new file mode 100644 index 000000000..3b94dd706 --- /dev/null +++ b/src/Bundle/ChillTicketBundle/tests/Command/Ticket/Handler/CreateTicketCommandHandlerTest.php @@ -0,0 +1,48 @@ +getHandler())($command); + + self::assertInstanceOf(Ticket::class, $actual); + self::assertEquals('', $actual->getExternalRef()); + } + + public function testHandleWithReference(): void + { + $command = new CreateTicketCommand($ref = 'external-ref'); + $actual = ($this->getHandler())($command); + + self::assertInstanceOf(Ticket::class, $actual); + self::assertEquals($ref, $actual->getExternalRef()); + } +}