src/Controller/Customer/TrackAndTraceController.php line 53

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Customer;
  3. use App\Classes\Dictionaries\OrderState;
  4. use App\Entity\Package;
  5. use App\Entity\CodeLocationPackage;
  6. use App\Entity\PackageCodeCustomer;
  7. use App\Entity\PackageCodeSenderDelivery;
  8. use App\Entity\PackageCodeSenderPostman;
  9. use App\Entity\EventPackageDelivered;
  10. use App\Entity\EventPackageStateChange;
  11. use Doctrine\ORM\EntityManagerInterface;
  12. use Exception;
  13. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  14. use Symfony\Component\HttpFoundation\Response;
  15. use Symfony\Component\HttpFoundation\Request;
  16. use App\Entity\PackageCode;
  17. use App\Form\Customer\TrackAndTraceSearchType;
  18. use Symfony\Contracts\Translation\TranslatorInterface;
  19. /**
  20.  * Description of TrackAndTraceController
  21.  *
  22.  * @author martinjo
  23.  */
  24. class TrackAndTraceController extends AbstractController
  25. {
  26.     /*
  27.      * @var Pokud někdo do get parametru vloží nevalidní kód, pak true
  28.      */
  29.     public bool $warning false;
  30.     /**
  31.      * Slouží k získání kódu balíku, pokud uživatel použije formulář.
  32.      * @param Request $request
  33.      * @param TranslatorInterface $translator
  34.      * @return Response
  35.      * @throws Exception
  36.      */
  37.     public function trackAndTracePageGet(Request $requestEntityManagerInterface $emTranslatorInterface $translator): Response
  38.     {
  39.         $form $this->createForm(TrackAndTraceSearchType::class, [], []);
  40.         $form->handleRequest($request);
  41.         $packageCodeString $request->query->get("code");
  42.         if ($form->isSubmitted() && $form->isValid()) {
  43.             $data            $form->getData();
  44.             $packageCodeString $data['packageCode'];
  45.             return $this->redirectToRoute('customer_track_and_trace_get_parameter', ['code' => $packageCodeString]);
  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.      *
  62.      * @return Response
  63.      * @throws Exception
  64.      */
  65.     public function trackAndTracePage(string $packageCodeStringEntityManagerInterface $emTranslatorInterface $translator): Response
  66.     {
  67.         $form $this->createForm(TrackAndTraceSearchType::class, [], []);
  68.         $package null;
  69.         $eventsViewMap  null;
  70.         if (!$this->warning) {
  71.             $packageCodeRepo $em->getRepository(PackageCode::class);
  72.             $packageCode $packageCodeRepo->findPackageCodeByString(mb_strtoupper($packageCodeString));
  73.             if ($packageCode instanceof PackageCodeCustomer || $packageCode instanceof PackageCodeSenderPostman) {
  74.                 $codeLocation $packageCode->getCodeLocation();
  75.                 if (get_class($codeLocation) == CodeLocationPackage::class) {
  76.                     $package $codeLocation->getPackage();
  77.                 }
  78.                 $eventsViewMap $this->getTackAndTraceEvents($package$translator);
  79.             }
  80.         }
  81.         return $this->render(
  82.             'Customer/Postman/track_and_trace.html.twig',
  83.             [
  84.                     'packageCode' => $packageCodeString,
  85.                     'package' => $package,
  86.                     'missingCode' => $this->warning,
  87.                     'events' => $eventsViewMap,
  88.                     'form' => $form->createView()
  89.                 ]
  90.         );
  91.     }
  92.     /**
  93.      * Funkce vybere udalosti z baliku a objednavky
  94.      * vrati pole hodnot [timestamp, description] pro view
  95.      * @param Package $package
  96.      * @param TranslatorInterface $translator
  97.      *
  98.      * @return array
  99.      * @throws Exception
  100.      */
  101.     private function getTackAndTraceEvents(Package $packageTranslatorInterface $translator): array
  102.     {
  103.         $filteredEvents = [];
  104.         //vybereme udalosti objednavky
  105.         try {
  106.             $orderEvents $package->getOrder()->getOrderEvents();
  107.         } catch (\Throwable $e) {
  108.             $orderEvents = [];
  109.         }
  110.         $wantedOrderEvents = [
  111.             "App\Entity\EventOrderCreated",
  112.             "App\Entity\EventOrderPaid",
  113.         ];
  114.         foreach ($orderEvents as $event) {
  115.             if (in_array(get_class($event), $wantedOrderEventstrue)) {
  116.                 $filteredEvents[] = $event;
  117.             }
  118.         }
  119.         $packageEvents       $package->getPackageEvents();
  120.         $wantedPackageEvents = [
  121.             "App\Entity\EventPackageReceived",
  122.             "App\Entity\EventPackageDelivered",
  123.         ];
  124.         //vybereme udalosti baliku
  125.         foreach ($packageEvents as $event) {
  126.             $packageEventClass get_class($event);
  127.             if ($packageEventClass === EventPackageDelivered::class) {
  128.                 /** @var EventPackageDelivered $event */
  129.                 $event->setCreated($event->getTimeDelivered());
  130.                 $filteredEvents[] = $event;
  131.             } elseif (($packageEventClass === EventPackageStateChange::class)) {
  132.                 /** @var EventPackageStateChange $event */ /* Kvuli phpstanu rozdeluji podminku*/
  133.                 if ($event->getNewState() === OrderState::STATE_DONE) {
  134.                     $filteredEvents[] = $event;
  135.                 }
  136.             } elseif (in_array($packageEventClass$wantedPackageEventstrue)) {
  137.                 $filteredEvents[] = $event;
  138.             }
  139.         }
  140.         //seradime udalosti podle data vytvoreni
  141.         usort($filteredEvents, function ($a$b) {
  142.             $diff $a->getCreated()->getTimestamp() - $b->getCreated()->getTimestamp();
  143.             if ($diff === 0) {
  144.                 //fix aby se neradilo odeslani z depa pred prijeti (muze nastat ze udalosti maji stejny cas)
  145.                 return $a->getId() - $b->getId();
  146.             }
  147.             return $diff;
  148.         });
  149.         // vratime pole pro hodnot zobrazeni
  150.         return $this->mapEventsForView($filteredEvents$translator);
  151.     }
  152.     /**
  153.      * Funkce prevede pole events na pole poli pro view
  154.      * delame to proto ze v events descriprion nejsou hodnoty vhodne pro zobrazeni klientovy
  155.      * @param  array $events
  156.      * @param TranslatorInterface $translator
  157.      *
  158.      * @return array
  159.      */
  160.     private function mapEventsForView(
  161.         array $events,
  162.         TranslatorInterface $translator
  163.     ): array {
  164.         $stateDescriptionMap = [
  165.             "App\Entity\EventOrderCreated"       => $translator->trans(
  166.                 "Objednávka byla vytvořena.",
  167.                 [],
  168.                 'customer'
  169.             ),
  170.             "App\Entity\EventOrderPaid"          => $translator->trans(
  171.                 "Přijata platba.",
  172.                 [],
  173.                 'customer'
  174.             ),
  175.             "App\Entity\EventPackageReceived"    => $translator->trans(
  176.                 "Balík byl přijat na depo.",
  177.                 [],
  178.                 'customer'
  179.             ),
  180.             "App\Entity\EventPackageDelivered"   => $translator->trans(
  181.                 "Balík byl doručen.",
  182.                 [],
  183.                 'customer'
  184.             ),
  185.             "App\Entity\EventPackageStateChange" => $translator->trans(
  186.                 "Balík byl odeslán z depa.",
  187.                 [],
  188.                 'customer'
  189.             ),
  190.         ];
  191.         $map = [];
  192.         foreach ($events as $event) {
  193.             $map[] = [
  194.                 "created"     => $event->getCreated(),
  195.                 "description" => $stateDescriptionMap[get_class($event)],
  196.             ];
  197.         }
  198.         return $map;
  199.     }
  200. }