src/Controller/WHOController.php line 518

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Core\AccManager;
  4. use App\Core\Messages;
  5. use App\Core\Models\Events\PageLoaded;
  6. use App\Core\Models\Events\UserSettingsSave;
  7. use App\Core\Models\Quest\AbstractedQuest;
  8. use App\Core\ResearchManager;
  9. use App\WHO\Models\Quest\Report01UpdateManual;
  10. use App\WHO\Models\QuestLine;
  11. use App\WHO\Models\Report\ReportAgentAwaiting;
  12. use App\WHO\Models\Report\ReportCoAwaiting;
  13. use App\WHO\SettingsManager;
  14. use App\MyStore\API\MSJF;
  15. use App\WHO\Models\UserSettings;
  16. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  17. use Symfony\Component\HttpFoundation\JsonResponse;
  18. use Symfony\Component\HttpFoundation\Request;
  19. use Symfony\Component\HttpFoundation\Response;
  20. use Symfony\Component\Routing\Annotation\Route;
  21. use Twig\Environment;
  22. /**
  23.  * Controller used to manage qrCodes.
  24.  *
  25.  * @Route("/who")
  26.  *
  27.  */
  28. class WHOController extends AbstractController
  29. {
  30.     use  \App\Core\TraitExecSQL;
  31.     public function __construct()
  32.     {
  33.         @session_start();
  34.     }
  35.     /**
  36.      * @Route("/settings/save", methods="POST", name="whoSettingsPersists")
  37.      */
  38.     public function whoSettingsPersists(
  39.         Request $request,
  40.         SettingsManager $settingsManager,
  41.         AccManager $accManager,
  42.         MSJF $MSJF
  43.     ): Response {
  44.         if (!$accManager->currentAccId(0)) {
  45.             return new JsonResponse(['error' => 'Сессия завершена, обновите страничку и повторите операцию']);
  46.         }
  47.         $answer = ['result' => false'error' => 'Внутренняя ошибка сервера, мы уже работаем над ее исправлением!'];
  48.         if ($accManager->isAdmin()) {
  49.             try {
  50.                 $data file_get_contents('php://input');
  51.                 $accId $accManager->currentAccId();
  52.                 if (($accId) > 0) {
  53.                     $data = \json_decode($datatrue);
  54.                     if (isset($data['settings'])) {
  55.                         $s $data['settings'];
  56.                         $us = new UserSettings();
  57.                         $us::fillFromDB($us$s);
  58.                         if (1) {
  59.                             /**
  60.                              * @TODO зарефакторить эту отправку сообщений клиенту через квесты.
  61.                              * Нужно уметь отправлять напрямую, наверное.
  62.                              */
  63.                             $ql = new AbstractedQuest($accManager);
  64.                             $ql->msgManager->reg('UPDATE_SETTINGS');
  65.                         }
  66.                         if ($saveAnswer $settingsManager->persists($us)) {
  67.                             $answer = [
  68.                                 'result' => true,
  69.                                 'settings' => $settingsManager->loadSettings()
  70.                             ];
  71.                             /**
  72.                              * если установлена галочка, пробуем проставить вебхук на приемку.
  73.                              */
  74.                             if ($us->report01UpdateByWebhooks || $us->isCreateTaskByWebhook) {
  75.                                 try {
  76.                                     $whs $MSJF->webhook()->all();
  77.                                 } catch (\Throwable $t) {
  78.                                     $this->logException($t);
  79.                                 }
  80.                                 if ($accId == 104) {
  81.                                     $answer['d'] = 1;
  82.                                 }
  83.                                 if (is_array($whs)) {
  84.                                     $MSJF->webhook()->create(
  85.                                         MSJF::DT_SUPPLY,
  86.                                         'https://' $_SERVER['HTTP_HOST'],
  87.                                         $accManager->currentAccId()
  88.                                     );
  89.                                     // $ql->msgManager->reg($_SERVER['HTTP_HOST'].'::'.$accManager->currentAccId());
  90.                                 } else {
  91.                                     $ql->msgManager->reg(
  92.                                         'Для установки вебхуков приложению требуются права администратора. Переустановите приложение, пожалуйста.'
  93.                                     );
  94.                                 }
  95.                             } else {
  96.                                 $isDeleted false;
  97.                                 try {
  98.                                     $whs $MSJF->webhook()->all();
  99.                                 } catch (\Throwable $t) {
  100.                                     $this->logException($t);
  101.                                 }
  102.                                 if ($accId == 104) {
  103.                                     $answer['d'] = is_array($whs);
  104.                                 }
  105.                                 if (is_array($whs)) {
  106.                                     foreach ($whs as $wh) {
  107.                                         if ($wh->entityType == MSJF::DT_SUPPLY && stripos(
  108.                                                 $wh->url,
  109.                                                 $_SERVER['HTTP_HOST'],
  110.                                             ) !== false) {
  111.                                             $MSJF->webhook()->delete($wh->id);
  112.                                             $isDeleted true;
  113.                                         }
  114.                                     }
  115.                                 }
  116.                                 if ($isDeleted) {
  117.                                     $ql->msgManager->reg('Вебхуки успешно удалены.');
  118.                                 }
  119.                             }
  120.                         } else {
  121.                             $answer = ['result' => false'error' => $settingsManager->getLog()];
  122.                         }
  123.                     } else {
  124.                         $answer = [
  125.                             'result' => false,
  126.                             'error' => 'Ошибка разбора запроса. Попробуйте обновить страницу и повторить.'
  127.                         ];
  128.                     }
  129.                 } else {
  130.                     $answer['error'] = 'Сессия завершена из-за отсутствия активности, обновите страницу';
  131.                 }
  132.             } catch (\Throwable $t) {
  133.                 $answer = ['result' => false'error' => $t->getMessage(), 'trace' => $t->getTraceAsString()];
  134.             }
  135.         } else {
  136.             $answer['error'] = 'Только администратор аккаунта может изменять настройки.';
  137.         }
  138.         return new JsonResponse($answer);
  139.     }
  140.     /**
  141.      * @Route("/settings", methods="GET", name="whoSettings")
  142.      */
  143.     public function whoSettings(
  144.         Request $request,
  145.         SettingsManager $settingsManager,
  146.         AccManager $accManager,
  147.         MSJF $MSJF
  148.     ): Response {
  149.         if (!$accManager->currentAccId(false)) {
  150.             return new JsonResponse(['error' => 'Сессия завершена, обновите страничку и повторите операцию']);
  151.         }
  152.         $MSJF->setAccount($accManager);
  153.         $this->fireEventPageLoad($accManager);
  154.         $answer $this->generateDefTemplateAnswer($accManager$settingsManager);
  155.         $answer['settings'] = json_decode($answer['settings']);
  156.         try {
  157.             $answer['settings']->employees $MSJF->employee()->toSelect()->all();
  158.             usleep(500);
  159.             $answer['settings']->coStatesAsOptions $MSJF->states()->forDocument(MSJF::DT_CUSTOMER_ORDER)->toSelect(
  160.             )->all();
  161.         } catch (\Throwable $t) {
  162.             sleep(1);
  163.             try {
  164.                 $answer['settings']->coStatesAsOptions $MSJF->states()->forDocument(
  165.                     MSJF::DT_CUSTOMER_ORDER
  166.                 )->toSelect()->all();
  167.             } catch (\Throwable $t) {
  168.                 $this->logException($t);
  169.             }
  170.         }
  171.         $answer['settings'] = json_encode($answer['settings']);
  172.         return $this->render('who/settings.html.twig'$answer);
  173.     }
  174.     /**
  175.      * @Route("/settings/get", methods="GET", name="whoSettingsGet")
  176.      */
  177.     public function whoSettingsGet(
  178.         Request $request,
  179.         SettingsManager $settingsManager,
  180.         AccManager $accManager,
  181.         MSJF $MSJF
  182.     ): Response {
  183.         //-- проще мотануть вот эту дичь, чем создавать запросы ИМХО.
  184.         $answer $this->generateDefTemplateAnswer($accManager$settingsManagerfalse);
  185.         $answer['settings'] = json_decode($answer['settings']);
  186.         $answer['settings']->coStatesAsOptions $MSJF->states()->forDocument(MSJF::DT_CUSTOMER_ORDER)->toSelect()->all(
  187.         );
  188.         // $answer['accId'] = $accManager->currentAccId();
  189.         // $answer['settings']->miBPMS = rand(0,1);
  190.         // $answer['settings']->miReports = rand(0,1);
  191.         return new JsonResponse($answer);
  192.     }
  193.     /**
  194.      * @Route("/report01", methods="GET", name="whoReport01")
  195.      */
  196.     public function whoReport01(Request $requestAccManager $accManagerSettingsManager $settingsManager): Response
  197.     {
  198.         $this->fireEventPageLoad($accManager);
  199.         $answer $this->generateDefTemplateAnswer($accManager$settingsManager);
  200.         return $this->render('who/report01.html.twig'$answer);
  201.     }
  202.     /**
  203.      * @Route("/report01/get", methods="GET", name="whoReports01Get")
  204.      */
  205.     public function whoReports01Get(
  206.         Request $request,
  207.         AccManager $accManager
  208.     ): Response {
  209.         if (!$accManager->currentAccId()) {
  210.             return new JsonResponse(['error' => 'Сессия завершена, обновите страничку и повторите операцию']);
  211.         }
  212.         $report = new ReportCoAwaiting($accManager);
  213.         $reportData $report->getReportData();
  214.         //$reportData['result'] = array_slice( $reportData['result'] ,0,1);
  215.         if (is_array($reportData) && $reportData['updated']) {
  216.             $reportData['updatedDate'] = date('d.m.Y H:i'$reportData['updated'] ?? 0);
  217.         } else {
  218.             $reportData = ['updatedDate' => 0];
  219.         }
  220.         return new JsonResponse([
  221.                                     'report01' => $reportData,
  222.                                     'd' => date('Y-m-d'),
  223.                                     //'l' => $report->getLog()
  224.                                 ]
  225.         );
  226.     }
  227.     /**
  228.      * запрос на обновление данных по отчету.
  229.      * @Route("/report01/reload", methods="POST", name="whoReports01Reload")
  230.      */
  231.     public function whoReports01Reload(
  232.         Request $request,
  233.         AccManager $accManager
  234.     ): Response {
  235.         $this->fireEventPageLoad($accManager);
  236.         if (!$accManager->currentAccId()) {
  237.             return new JsonResponse(['error' => 'Сессия завершена, обновите страничку и повторите операцию']);
  238.         }
  239.         $updater = new Report01UpdateManual($accManager);
  240.         $updater->install();
  241.         return new JsonResponse([
  242.                                 ]
  243.         );
  244.     }
  245.     /**
  246.      * @Route("/report02", methods="GET", name="whoReport02")
  247.      */
  248.     public function whoReport02(Request $requestAccManager $accManagerSettingsManager $settingsManager): Response
  249.     {
  250.         $this->fireEventPageLoad($accManager);
  251.         /** @var Environment $twig */
  252.         $twig $this->container->get('twig');
  253.         try {
  254.             $twig->setCache(false);
  255.             $twig->enableAutoReload();
  256.         } catch (\Throwable $t) {
  257.             print_r($t->getMessage());
  258.             die();
  259.         }
  260.         $answer $this->generateDefTemplateAnswer($accManager$settingsManager);
  261.         return $this->render('who/report02.html.twig'$answer);
  262.     }
  263.     /**
  264.      * @Route("/report02/get", methods="GET", name="whoReports02Get")
  265.      */
  266.     public function whoReports02Get(
  267.         Request $request,
  268.         AccManager $accManager
  269.     ): Response {
  270.         if (!$accManager->currentAccId()) {
  271.             return new JsonResponse(['error' => 'Сессия завершена, обновите страничку и повторите операцию']);
  272.         }
  273.         $report = new ReportAgentAwaiting($accManager);
  274.         $reportData $report->getReportData();
  275.         if (is_array($reportData) && $reportData['updated']) {
  276.             $reportData['updatedDate'] = date('d.m.Y H:i'$reportData['updated'] ?? 0);
  277.         } else {
  278.             $reportData = ['updatedDate' => 0];
  279.         }
  280.         /**
  281.          * подсчет потоварной статистики.
  282.          * @TODO перенести это в формирование отчета!
  283.          */
  284.         $byAssortmentId = [];
  285.         $rData $reportData['result'];
  286.         if (is_array($rData)) {
  287.             foreach ($rData as $supplierInfo) {
  288.                 foreach ($supplierInfo['positions'] as $order) {
  289.                     $assortmentId $order['position']['assortment']['id'];
  290.                     $storeId $order['store']['id'];
  291.                     if (!isset($byAssortmentId[$assortmentId])) {
  292.                         $byAssortmentId[$assortmentId] = [];
  293.                     }
  294.                     if (!isset($byAssortmentId[$assortmentId][$storeId])) {
  295.                         $byAssortmentId[$assortmentId][$storeId] = [
  296.                             'assortment' => $order['position']['assortment'],
  297.                             'quantity' => 0,
  298.                             'intransit' => 0,
  299.                             'stock' => 0,
  300.                             'expectedDate' => $order['position']['expectedDate'] ?? '-',
  301.                             'storeName' => $order['store']['name'],
  302.                         ];
  303.                     }
  304.                     $byAssortmentId[$assortmentId][$storeId]['stock'] = $order['position']['stock']['quantity'];
  305.                     $byAssortmentId[$assortmentId][$storeId]['quantity'] += $order['position']['quantity'];
  306.                     $byAssortmentId[$assortmentId][$storeId]['intransit'] = $order['position']['stock']['intransit'];
  307.                 }
  308.             }
  309.         }
  310.         $reportData['assortment'] = $byAssortmentId;
  311.         return new JsonResponse([
  312.                                     'report02' => $reportData,
  313.                                     'd' => date('Y-m-d'),
  314.                                     //'l' => $report->getLog()
  315.                                 ]
  316.         );
  317.     }
  318.     /**
  319.      * отменяет всё, что было сделано в аккаунте.
  320.      * @Route("/reset", methods="POST", name="whoSettingsReset")
  321.      */
  322.     public function whoSettingsReset(
  323.         Request $request,
  324.         SettingsManager $settingsManager,
  325.         AccManager $accManager
  326.     ): Response {
  327.         if (!$accManager->currentAccId()) {
  328.             return new JsonResponse(['error' => 'Сессия завершена, обновите страничку и повторите операцию']);
  329.         }
  330.         $answer = ['result' => false'error' => 'Внутренняя ошибка сервера, мы уже работаем над ее исправлением!'];
  331.         if ($accManager->isAdmin()) {
  332.             try {
  333.                 $data file_get_contents('php://input');
  334.                 $accId $accManager->currentAccId();
  335.                 if (($accId) > 0) {
  336.                     $data = \json_decode($datatrue);
  337.                     $us = new UserSettings();
  338.                     $sm = new SettingsManager($accManager);
  339.                     $sm->persists($us);
  340.                     $ql = new QuestLine($accManager);
  341.                     $ql->fillLine4Acc(['Core''WHO']);
  342.                     $msg = new Messages($accManager);
  343.                     $msg->reg('База данных аккаунта очищена, все настройки удалены');
  344.                     $msg->reg('UPDATE_SETTINGS');
  345.                     if ($saveAnswer $settingsManager->persists($us)) {
  346.                         $response $this->forward('App\Controller\WHOController::whoSettingsGet', [
  347.                         ]);
  348.                         return $response;
  349.                     } else {
  350.                         $answer = ['result' => false'error' => $settingsManager->getLog()];
  351.                     }
  352.                 } else {
  353.                     $answer = [
  354.                         'result' => false,
  355.                         'error' => 'Ошибка разбора запроса. Попробуйте обновить страницу и повторить.'
  356.                     ];
  357.                 }
  358.             } catch (\Throwable $t) {
  359.                 $answer = ['result' => false'error' => $t->getMessage(), 'trace' => $t->getTraceAsString()];
  360.             }
  361.         } else {
  362.             $answer['error'] = 'Только администратор аккаунта может изменять настройки.';
  363.         }
  364.         return new JsonResponse($answer);
  365.     }
  366.     public function generateDefTemplateAnswer(
  367.         AccManager $accManager,
  368.         SettingsManager $settingsManager,
  369.         $isRegEvent true
  370.     ) {
  371.         $settings $settingsManager->loadSettings();
  372.         $questLine = new QuestLine($accManager);
  373.         $settings->activeQuests $questLine->getActiveQuests();
  374.         $settings->role $accManager->isAdmin() ? 'admin' 'user';
  375.         $settings->expCurrent $questLine->calcCurrentExp();
  376.         $settings->expMax 2000;
  377.         $settings->lvl 0;
  378.         $settings->version 220301;
  379.         $settings->company $accManager->getName4Acc($accManager->currentAccId());
  380.         $settings->sid session_id();
  381.         $settings->accId $accManager->currentAccId();
  382.         return [
  383.             'settings' => \json_encode($settings),
  384.             'role' => $accManager->isAdmin() ? 'admin' 'user',
  385.         ];
  386.     }
  387.     protected function fireEventPageLoad(AccManager $accManager)
  388.     {
  389.         if ($accId $accManager->currentAccId()) {
  390.             $questLine = new QuestLine($accManager);
  391.             try {
  392.                 $pageRoute debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS2)[1]['function'];
  393.             } catch (\Throwable $t) {
  394.                 $this->logException($t);
  395.                 $pageRoute '';
  396.             }
  397.             try {
  398.                 $e = (new PageLoaded())->setRoute($pageRoute);
  399.                 $questLine->fireEvent($e);
  400.             } catch (\Throwable $t) {
  401.                 $this->logException($t);
  402.             }
  403.             return $pageRoute;
  404.         } else {
  405.             return false;
  406.         }
  407.     }
  408.     /**
  409.      * @Route("/laboratory", methods="GET", name="whoLabs")
  410.      */
  411.     public function whoLabs(
  412.         Request $request,
  413.         SettingsManager $settingsManager,
  414.         AccManager $accManager,
  415.         MSJF $MSJF
  416.     ): Response {
  417.         //$accManager->setAccId($_SESSION['ad']);
  418.         $accManager->currentAccId();
  419.         $MSJF->setAccount($accManager);
  420.         $this->fireEventPageLoad($accManager);
  421.         $answer $this->generateDefTemplateAnswer($accManager$settingsManager);
  422.         $answer['settings'] = json_decode($answer['settings']);
  423.         $answer['settings'] = json_encode($answer['settings']);
  424.         return $this->render('who/lab.html.twig'$answer);
  425.     }
  426.     /**
  427.      * @Route("/research/get", methods="GET", name="whoLabGetResearch")
  428.      */
  429.     public function whoLabGetResearch(
  430.         Request $request,
  431.         SettingsManager $settingsManager,
  432.         AccManager $accManager,
  433.         ResearchManager $researchManager
  434.     ): Response {
  435.         if (!$accManager->currentAccId()) {
  436.             die('Сессия завершена из-за отсутствия активности, обновите страничку и повторите операцию');
  437.         }
  438.         $this->fireEventPageLoad($accManager);
  439.         $answer = [
  440.             'research' => $researchManager->load(1)
  441.         ];
  442.         return new JsonResponse($answer);
  443.     }
  444.     /**
  445.      * @Route("/empl/test", methods="GET", name="whoTest")
  446.      */
  447.     public function whoTest(
  448.         Request $request,
  449.         SettingsManager $settingsManager,
  450.         AccManager $accManager,
  451.         MSJF $MSJF
  452.     ): Response {
  453.         var_dump($accManager->currentAccId());
  454.         if (!$accManager->currentAccId()) {
  455.             die('Сессия завершена из-за отсутствия активности, обновите страничку и повторите операцию');
  456.         }
  457.         $MSJF->setAccount($accManager);
  458.         $this->fireEventPageLoad($accManager);
  459.         $answer $this->generateDefTemplateAnswer($accManager$settingsManager);
  460.         $answer['settings'] = json_decode($answer['settings']);
  461.         $answer['settings']->coStatesAsOptions $MSJF->states()->forDocument(MSJF::DT_CUSTOMER_ORDER)->toSelect()->all(
  462.         );
  463.         $answer['settings'] = json_encode($answer['settings']);
  464.         $customerController 'App\Controller\Customer\User' $_SESSION['ad'] . 'Controller::' . ($_GET['ac'] ?? 'defAction');
  465.         $response $this->forward($customerController, ['answer' => $answer]);
  466.         return $response;
  467.     }
  468.     /**
  469.      * @Route("/ping", methods="GET", name="whoPingMessages")
  470.      */
  471.     public function whoPingMessages(
  472.         Request $request,
  473.         SettingsManager $settingsManager,
  474.         AccManager $accManager,
  475.         Messages $messages
  476.     ): Response {
  477.         $answer = ['result' => false'error' => 'Внутренняя ошибка сервера, мы уже работаем над ее исправлением!'];
  478.         if (!$accManager->currentAccId()) {
  479.             $answer['error'] = 'Сессия завершена из-за отсутствия активности, обновите страницу';
  480.         }
  481.         $answer = ['result' => true];
  482.         unset($answer['error']);
  483.         $msg $messages->getMessages4UI();
  484.         //$msg[1] = 'EMIT_on-update-users';
  485.         //$msg[1] = 'UPDATE_SETTINGS';
  486.         if (sizeof($msg)) {
  487.             $answer['messages'] = $msg;
  488.         }
  489.         //
  490.         $answer['s'] = $accManager->currentAccId();
  491.         return new JsonResponse($answer);
  492.     }
  493.     protected function _cleanTwigCache(): void
  494.     {
  495.         /** @var Environment $twig */
  496.         $twig $this->container->get('twig');
  497.         try {
  498.             $twig->setCache(false);
  499.             $twig->enableAutoReload();
  500.         } catch (\Throwable $t) {
  501.             print_r($t->getMessage());
  502.             die();
  503.         }
  504.     }
  505. }