src/Controller/Support/UtilityController.php line 218

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Support;
  3. use App\Entity\Box;
  4. use App\Classes\Dictionaries\BoxState;
  5. use App\Entity\Configuration;
  6. use App\Entity\OrderDelivery;
  7. use App\Classes\Dictionaries\OrderState;
  8. use App\Entity\PackageDelivery;
  9. use App\Classes\Dictionaries\PackageState;
  10. use Doctrine\DBAL\Exception;
  11. use Doctrine\ORM\EntityManagerInterface;
  12. use Doctrine\ORM\Exception\ORMException;
  13. use Doctrine\ORM\OptimisticLockException;
  14. use Psr\Log\LoggerInterface;
  15. use RuntimeException;
  16. use Symfony\Bundle\FrameworkBundle\Console\Application;
  17. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  18. use Symfony\Component\Console\Input\StringInput;
  19. use Symfony\Component\Console\Output\BufferedOutput;
  20. use Symfony\Component\HttpFoundation\RedirectResponse;
  21. use Symfony\Component\HttpFoundation\Response;
  22. use Symfony\Component\HttpKernel\KernelInterface;
  23. use PhpMyAdmin\SqlParser\Parser;
  24. use PhpMyAdmin\SqlParser\Statement;
  25. use Symfony\Component\Security\Core\Security;
  26. use Symfony\Contracts\Translation\TranslatorInterface;
  27. use function in_array;
  28. class UtilityController extends AbstractController
  29. {
  30.     /**
  31.      * Dočasná metoda pro výpis objednávek/balíků v nekonzistentním stavu zrušen/nezrušen
  32.      * @param EntityManagerInterface $entityManager
  33.      * @return Response
  34.      */
  35.     public function fixCanceledPackagesAndOrders(EntityManagerInterface $entityManager): Response
  36.     {
  37.         echo 'Objednávky, které obsahují jenom zrušené balíky, ale nejsou zrušené.' '</br>';
  38.         $packageDeliveryRepo $entityManager->getRepository(PackageDelivery::class);
  39.         //canceledPackagesWithActiveOrder
  40.         $canceledPackages $packageDeliveryRepo->findBy(['packageState' => PackageState::STATE_CANCELED]);
  41.         foreach ($canceledPackages as $package) {
  42.             $order $package->getOrder();
  43.             if ($order->getOrderState() === OrderState::STATE_CANCELED) {
  44.                 //zrušený balík ve zrušené objednávce = ok
  45.                 continue;
  46.             } else {
  47.                 //zrušený balík ve objednávce která není zrušená = možná špatně
  48.                 $cancelOrder true;
  49.                 if ($order->getPackages()->count() !== 1) {
  50.                     foreach ($order->getPackages() as $packageInOrder) {
  51.                         if ($packageInOrder->getPackageState() !== PackageState::STATE_CANCELED) {
  52.                             $cancelOrder false;
  53.                         }
  54.                     }
  55.                 }
  56.                 //balík je v obj jediný, nebo i ostatní jsou zrušené = zrušit obj
  57.                 if ($cancelOrder) {
  58.                     echo $order->getIdentifier() . '</br>';
  59.                 }
  60.             }
  61.         }
  62.         echo '---------------------------' '</br>';
  63.         echo 'Nezrušené balíky ve zrušených objednávkách' '</br>';
  64.         $orderDeliveryRepo $entityManager->getRepository(OrderDelivery::class);
  65.         //canceledPackagesWithActiveOrder
  66.         $canceledOrders $orderDeliveryRepo->findBy(['orderState' => OrderState::STATE_CANCELED]);
  67.         foreach ($canceledOrders as $order) {
  68.             $packages $order->getPackages();
  69.             //echo $order->getIdentifier()."</br>";
  70.             foreach ($packages as $package) {
  71.                 if ($package->getPackageState() !== PackageState::STATE_CANCELED) {
  72.                     echo $package->getPackageCode()->getCode() . '</br>';
  73.                 }
  74.             }
  75.         }
  76.         return new Response();
  77.     }
  78.     /**
  79.      * Najde krabice, jejich balíčky jsou už naskladněny, nebo vydány, ale krabice sama je nedoručená. Krabice bude dodatečně označená jako doručená.
  80.      * @param EntityManagerInterface $entityManager
  81.      * @param Security $security
  82.      * @return RedirectResponse
  83.      * @throws ORMException
  84.      * @throws OptimisticLockException
  85.      */
  86.     public function fixDeliveredBoxes(EntityManagerInterface $entityManagerSecurity $security): RedirectResponse
  87.     {
  88.         $boxRepo $entityManager->getRepository(Box::class);
  89.         $boxes $boxRepo->findBy(['delivered'=>null,'boxState'=>BoxState::STATE_CLOSED]);
  90.         $message "";
  91.         foreach ($boxes as $box) {
  92.             $packages $box->getPackages();
  93.             $toFix true;
  94.             foreach ($packages as $package) {
  95.                 if (!in_array($package->getPackageState(), [PackageState::STATE_ON_DELIVERY_POINTPackageState::STATE_PICKED_UPPackageState::STATE_CANCELED])) {
  96.                     $toFix false;
  97.                 }
  98.             }
  99.             if ($toFix === true) {
  100.                 $boxRepo->deliverBoxAndSave($box$security->getUser());
  101.                 $message .= ' ' .$box->getCode()->getCode(). ', ';
  102.             }
  103.         }
  104.         $message substr($message0, -2);
  105.         $this->addFlash('success''Nedořučené krabice, které měly všechny balíky vydané nebo na výdejně byly nastaveny jako doručené.' .$message);
  106.         return $this->redirectToRoute('support_index');
  107.     }
  108.     /**
  109.      * Po zavolání url obnoví obsah databáze.
  110.      * Může zavolat přihlášený uživatel.
  111.      * @param KernelInterface $kernel
  112.      * @param EntityManagerInterface $entityManager
  113.      * @param LoggerInterface $logger
  114.      * @param TranslatorInterface $translator
  115.      * @return RedirectResponse
  116.      * @throws Exception
  117.      * @throws \Exception
  118.      */
  119.     public function databaseReset(
  120.         KernelInterface $kernel,
  121.         EntityManagerInterface $entityManager,
  122.         LoggerInterface $logger,
  123.         TranslatorInterface $translator
  124.     ): RedirectResponse {
  125.         if ($kernel->getEnvironment() === 'demo') {
  126.             $basePath $kernel->getProjectDir() . '/docker/build/backend/database_bootstrap.sql';
  127.             $baseQuery file_get_contents($basePath);
  128.             if ($baseQuery === '') {
  129.                 throw new RuntimeException(
  130.                     $translator->trans('SQL skript: %path% ...je prázdný', ['%path%' => $basePath], 'support')
  131.                 );
  132.             }
  133.             $demoPath $kernel->getProjectDir() . '/docker/build/backend/database_bootstrap_demo.sql';
  134.             $demoQuery file_get_contents($demoPath);
  135.             if ($demoQuery === '') {
  136.                 throw new RuntimeException(
  137.                     $translator->trans('SQL skript: %path% ...je prázdný', ['%path%' => $demoPath], 'support')
  138.                 );
  139.             }
  140.             $application = new Application($kernel);
  141.             $application->setAutoExit(false);
  142.             //dropnutí tabulek
  143.             $input = new StringInput('doctrine:schema:drop --force --full-database');
  144.             $output = new BufferedOutput();
  145.             $application->run($input$output);
  146.             $info $output->fetch();
  147.             $content $info;
  148.             $logger->info($info);
  149.             //obnovení prázdné databáze
  150.             $input = new StringInput('doctrine:schema:update --force');
  151.             $output = new BufferedOutput();
  152.             $application->run($input$output);
  153.             $info $output->fetch();
  154.             $content .= $info;
  155.             $logger->info($info);
  156.             //naparsování a provedení SQL base skriptu
  157.             $sqlParser = new Parser($baseQuery);
  158.             $statementsCount 0;
  159.             foreach ($sqlParser->statements as $statement) {
  160.                 $entityManager->getConnection()->executeQuery(
  161.                     /** @var Statement $statement */
  162.                     str_replace('`'''$statement->build()),
  163.                 );
  164.                 $statementsCount++;
  165.             }
  166.             $entityManager->clear();
  167.             //naparsování a provedení SQL base skriptu
  168.             $sqlParser = new Parser($demoQuery);
  169.             foreach ($sqlParser->statements as $statement) {
  170.                 $entityManager->getConnection()->executeQuery(
  171.                     /** @var Statement $statement */
  172.                     str_replace('`'''$statement->build()),
  173.                 );
  174.                 $statementsCount++;
  175.             }
  176.             $entityManager->clear();
  177.             $info 'Executed ' $statementsCount ' statements. Database ready...[OK]';
  178.             $content .= $info;
  179.             $logger->info($info);
  180.             $this->addFlash('success'$content);
  181.             return $this->redirectToRoute('support_index');
  182.         }
  183.         throw new RuntimeException(
  184.             $translator->trans('Tento skript lze spustit pouze v prostředí "demo".', [], 'support')
  185.         );
  186.     }
  187.     /**
  188.      * Vrátí odpověď s blokem, který obsahuje číslo a email na podporu.
  189.      * Číslo a email je zvoleno podle domény. postman/delivery
  190.      * @param EntityManagerInterface $em
  191.      * @param LoggerInterface $logger
  192.      * @return Response
  193.      */
  194.     public function supportContact(EntityManagerInterface $emLoggerInterface $logger): Response
  195.     {
  196.         $config $em->getRepository(Configuration::class);
  197.         try {
  198.             return $this->render('Support/InternalTemplates/Shared/support_contact.html.twig', [
  199.             'support_delivery_phone' => $config->get('support_delivery_phone'),
  200.             'support_postman_phone' => $config->get('support_postman_phone'),
  201.             'support_delivery_support_email' => $config->get('support_delivery_support_email'),
  202.             'support_postman_email' => $config->get('support_postman_email')
  203.         ]);
  204.         } catch (\Exception $e) {
  205.             $logger->error($e->getMessage().' '.$e->getFile().':'.$e->getLine());
  206.             return new Response('');
  207.         }
  208.     }
  209. }