src/Controller/Customer/Delivery/TrackAndTraceController.php line 53

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Customer\Delivery;
  3. use App\Entity\DeliveryPoint;
  4. use App\Entity\EventOrder;
  5. use App\Entity\Package;
  6. use App\Entity\CodeLocationPackage;
  7. use App\Entity\PackageCodeSenderDelivery;
  8. use App\Entity\EventPackageStateChange;
  9. use App\Entity\PackageDelivery;
  10. use App\Classes\Dictionaries\PackageState;
  11. use DateTimeInterface;
  12. use Doctrine\ORM\EntityManagerInterface;
  13. use Exception;
  14. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  15. use Symfony\Component\HttpFoundation\Response;
  16. use Symfony\Component\HttpFoundation\Request;
  17. use App\Entity\PackageCode;
  18. use App\Form\Customer\TrackAndTraceSearchType;
  19. use Symfony\Contracts\Translation\TranslatorInterface;
  20. class TrackAndTraceController extends AbstractController
  21. {
  22.     /*
  23.      * @var Pokud někdo do get parametru vloží nevalidní kód, pak true
  24.      */
  25.     public bool $warning false;
  26.     /**
  27.      * Slouží k získání kódu balíku, pokud uživatel použije formulář.
  28.      * @param Request $request
  29.      * @param EntityManagerInterface $em
  30.      * @param TranslatorInterface $translator
  31.      * @return Response
  32.      * @throws Exception
  33.      */
  34.     public function trackAndTracePageGet(Request $requestEntityManagerInterface $emTranslatorInterface $translator): Response
  35.     {
  36.         $form $this->createForm(TrackAndTraceSearchType::class, [], []);
  37.         $form->handleRequest($request);
  38.         $packageCodeString $request->query->get("code");
  39.         if ($form->isSubmitted() && $form->isValid()) {
  40.             $data $form->getData();
  41.             $packageCodeString $data['packageCode'];
  42.             return $this->redirectToRoute(
  43.                 'customer_delivery_track_and_trace_get_parameter',
  44.                 ['code' => $packageCodeString]
  45.             );
  46.         }
  47.         if (strlen($packageCodeString) > 64) {
  48.             $this->warning true;
  49.         }
  50.         if ($packageCodeString === null) {
  51.             $packageCodeString "";
  52.             $this->warning true;
  53.         }
  54.         return $this->trackAndTracePage($packageCodeString$em$translator);
  55.     }
  56.     /**
  57.      * Stranka zobrazuje zakaznikovy stav jeho balilu
  58.      * @param string $packageCodeString
  59.      * @param EntityManagerInterface $em
  60.      * @param TranslatorInterface $translator
  61.      * @return Response
  62.      * @throws Exception
  63.      */
  64.     public function trackAndTracePage(string $packageCodeStringEntityManagerInterface $emTranslatorInterface $translator): Response
  65.     {
  66.         $form $this->createForm(TrackAndTraceSearchType::class, [], []);
  67.         $package null;
  68.         $holidays null;
  69.         $eventsViewMap null;
  70.         if (!$this->warning) {
  71.             $packageCodeRepo $em->getRepository(PackageCode::class);
  72.             $delPointRepo $em->getRepository(DeliveryPoint::class);
  73.             $packageCode $packageCodeRepo->findPackageCodeByString(mb_strtoupper($packageCodeString));
  74.             if ($packageCode instanceof PackageCodeSenderDelivery) {
  75.                 $codeLocation $packageCode->getCodeLocation();
  76.                 if ($codeLocation instanceof CodeLocationPackage) {
  77.                     $package $codeLocation->getPackage();
  78.                 }
  79.                 if (!is_null($package)) {
  80.                     $eventsViewMap $this->getTrackAndTraceEvents($package$em$translator);
  81.                     $holidays $delPointRepo->getFutureOrActiveHolidays($package->getOrder()->getDeliveryPoint());
  82.                 }
  83.             }
  84.         }
  85.         return $this->render(
  86.             'Customer/Delivery/track_and_trace.html.twig',
  87.             [
  88.                 'packageCode' => $packageCodeString,
  89.                 'package' => $package,
  90.                 'missingCode' => $this->warning,
  91.                 'events' => $eventsViewMap,
  92.                 'form' => $form->createView(),
  93.                 'holidays' => $holidays
  94.             ]
  95.         );
  96.     }
  97.     /**
  98.      * Funkce vybere udalosti z baliku
  99.      * vrati pole hodnot [timestamp, description] pro view
  100.      * @param Package $package
  101.      * @param EntityManagerInterface $em
  102.      * @param TranslatorInterface $translator
  103.      * @return array<array{created:DateTimeInterface,description:string,info:string}>
  104.      */
  105.     private function getTrackAndTraceEvents(Package $packageEntityManagerInterface $emTranslatorInterface $translator): array
  106.     {
  107.         $filteredEvents = [];
  108.         $packageEvents $package->getPackageEvents();
  109.         $wantedPackageEvents = [
  110.             EventPackageStateChange::class
  111.         ];
  112.         foreach ($packageEvents as $event) {
  113.             if (in_array(get_class($event), $wantedPackageEventstrue)) {
  114.                 $filteredEvents[] = $event;
  115.             }
  116.         }
  117.         usort($filteredEvents, static function ($a$b) {
  118.             $diff $a->getCreated()->getTimestamp() - $b->getCreated()->getTimestamp();
  119.             if ($diff === 0) {
  120.                 return $a->getId() - $b->getId();
  121.             }
  122.             return $diff;
  123.         });
  124.         // slouzi k popisu dle id stavu baliku
  125.         $eventId = [
  126.             [
  127.                 'id' => PackageState::STATE_UNRECEIVED,
  128.                 'desc' => $translator->trans('Obdrželi jsme data, čekáme na přijetí zásilky na depo.', [], 'support'),
  129.                 'info' => $translator->trans('je nyní zpracováván.', [], 'support')
  130.             ],
  131.             [
  132.                 'id' => PackageState::STATE_CANCELED,
  133.                 'desc' => $translator->trans('Doručení zásilky bylo zrušeno.', [], 'support'),
  134.                 'info' => $translator->trans('byl zrušen.', [], 'support')
  135.             ],
  136.             [
  137.                 'id' => PackageState::STATE_IN_BOX,
  138.                 'desc' => $translator->trans('Zásilka je na cestě na výdejnu.', [], 'support'),
  139.                 'info' => $translator->trans('bude již brzy na výdejně.', [], 'support')
  140.             ],
  141.             [
  142.                 'id' => PackageState::STATE_PICKED_UP,
  143.                 'desc' => $translator->trans('Balík byl vyzvednut.', [], 'support'),
  144.                 'info' => $translator->trans('již je ve vašich rukou.', [], 'support')
  145.             ],
  146.         ];
  147.         if ($package instanceof PackageDelivery && $package->getLastDateForPickup() !== null) {
  148.             $date $package->getLastDateForPickup();
  149.             $eventId[] = [
  150.                 'id' => PackageState::STATE_ON_DELIVERY_POINT,
  151.                 'desc' => $translator->trans('Balík lze vyzvednout na výdejně.', [], 'support'),
  152.                 'info' => $translator->trans('si můžete vyzvednout na výdejně do %lastDate%', ['%lastDate%' =>$date->format("j. n. Y.")], 'support')
  153.             ];
  154.         } else {
  155.             $eventId[] = [
  156.                 'id' => PackageState::STATE_ON_DELIVERY_POINT,
  157.                 'desc' => $translator->trans('Balík lze vyzvednout na výdejně.', [], 'support'),
  158.                 'info' => $translator->trans('na vás již čeká na výdejně.', [], 'support')
  159.             ];
  160.         }
  161.         $orderId $package->getOrder()->getId();
  162.         $orderEvent $em->getRepository(EventOrder::class)->findOneBy(['order' => $orderId], ['id' => 'ASC']);
  163.         $firstEvent[] = [
  164.             "created" => $orderEvent->getCreated(),
  165.             "description" => $eventId[0]['desc'],
  166.             "info" => $eventId[0]['info']
  167.         ];
  168.         $restEvents = [];
  169.         foreach ($filteredEvents as $event) {
  170.             foreach ($eventId as $number) {
  171.                 if ($event instanceof EventPackageStateChange && $event->getNewState() === $number['id']) {
  172.                     $restEvents[] = [
  173.                         "created" => $event->getCreated(),
  174.                         "description" => $number['desc'],
  175.                         "info" => $number['info']
  176.                     ];
  177.                 }
  178.             }
  179.         }
  180.         return array_merge($firstEvent$restEvents);
  181.     }
  182. }