src/Controller/HomeController.php line 76

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Theme;
  4. use App\Repository\BasketRepository;
  5. use App\Repository\CellRuleRepository;
  6. use App\Repository\ClientRepository;
  7. use App\Repository\CounterpartyRepository;
  8. use App\Repository\CurrencyRepository;
  9. use App\Repository\HoverOverRepository;
  10. use App\Repository\SdsFormRequestRepository;
  11. use App\Repository\SettingsRepository;
  12. use App\Repository\ThemeRepository;
  13. use App\Repository\UserRepository;
  14. use App\Service\CommonService;
  15. use App\Service\SpreadsheetService;
  16. use Doctrine\ORM\EntityManagerInterface;
  17. use PhpOffice\PhpSpreadsheet\Exception;
  18. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  19. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  20. use Symfony\Component\HttpFoundation\Request;
  21. use Symfony\Component\HttpFoundation\Response;
  22. use Symfony\Component\Routing\Annotation\Route;
  23. use Symfony\Component\Serializer\Encoder\JsonEncoder;
  24. use Symfony\Component\Serializer\Normalizer\AbstractNormalizer;
  25. use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
  26. use Symfony\Component\Serializer\Serializer;
  27. class HomeController extends AbstractController
  28. {
  29.     public function __construct(private readonly EntityManagerInterface $entityManager, private readonly ParameterBagInterface $parameterBag)
  30.     {
  31.     }
  32.     #[Route('/'name'index')]
  33.     public function index(): Response
  34.     {
  35.         if ($this->getUser()) {
  36.             if (in_array('ROLE_ADMIN'$this->getUser()->getRoles())) {
  37.                 return $this->redirectToRoute('admin_dashboard');
  38.             } elseif (in_array('ROLE_STAFF'$this->getUser()->getRoles())) {
  39.                 return $this->redirectToRoute('sds_requests_menu');
  40.             } elseif (in_array('ROLE_COUNTERPARTY'$this->getUser()->getRoles())) {
  41.                 return $this->redirectToRoute('counterparty_home');
  42.             } else {
  43.                 return $this->redirectToRoute('home');
  44.             }
  45.         }
  46.         return $this->redirectToRoute('home');
  47.     }
  48.     // Waiting for approval page
  49.     #[Route('/user/waiting-for-approval'name'waiting_for_approval')]
  50.     public function waitingForApproval(): Response
  51.     {
  52.         /** @var \App\Entity\User|null $user */
  53.         $user $this->getUser();
  54.         if ($user && $user->isApproved()) {
  55.             return $this->redirectToRoute('index');
  56.         }
  57.         return $this->render('waiting_for_approval.html.twig');
  58.     }
  59.     // Privacy Policy page
  60.     #[Route('/user/privacy-policy'name'privacy_policy')]
  61.     public function privacyPolicy(): Response
  62.     {
  63.         return $this->render('privacy_policy.html.twig');
  64.     }
  65.     #[Route('/user/home'name'home')]
  66.     public function home(
  67.         CommonService $commonService,
  68.         UserRepository $userRepository,
  69.         ThemeRepository $themeRepository,
  70.         HoverOverRepository $hoverOverRepository,
  71.         BasketRepository $basketRepository,
  72.         CounterpartyRepository $counterpartyRepository,
  73.         CellRuleRepository $cellRuleRepository,
  74.         CurrencyRepository $currencyRepository,
  75.         SettingsRepository $settingsRepository,
  76.         ClientRepository $clientRepository
  77.     ): Response {
  78.         /** @var \App\Entity\User|null $user */
  79.         $user $this->getUser();
  80.         if ($user && !$user->isApproved()) {
  81.             return $this->redirectToRoute('waiting_for_approval');
  82.         }
  83.         $loggedUser $userRepository->findOneBy(['email' => $this->getUser()->getUserIdentifier()]);
  84.         $loggedUserTheme $loggedUser->getAssociatedTheme();
  85.         try {
  86.             $ratesTableSpreadsheet = new SpreadsheetService($this->parameterBag->get('kernel.project_dir').'/spreadsheets/WWW_rates_table.xlsx');
  87.         } catch (Exception) {
  88.             return $this->render('please_wait.html.twig', [
  89.                 'timer' => 1,
  90.                 'url' => $this->generateUrl('home'),
  91.             ]);
  92.         }
  93.         $userSelectedCurrency $loggedUser->getSelectedCurrency()->getValue();
  94.         $sheetName $userSelectedCurrency.'_'.$loggedUserTheme->getDataSheetName();
  95.         $dataTablesSheet $ratesTableSpreadsheet->loadSheet($sheetName);
  96.         if (null == $dataTablesSheet) {
  97.             return $this->render('please_wait.html.twig', [
  98.                 'timer' => 1,
  99.                 'url' => $this->generateUrl('home'),
  100.             ]);
  101.         }
  102.         $dataTablesSheetArray $ratesTableSpreadsheet->loadArraySheet($sheetName);
  103.         // Rendering Graph Image
  104.         $graphImgPath $this->getParameter('kernel.project_dir').'/public/assets/spreadsheet_images/';
  105.         $graphImgName $ratesTableSpreadsheet->loadGraphImg('Graph'$graphImgPath);
  106.         // Bank Holidays Dates Disabling
  107.         $bankHolidaysArray = [];
  108.         $bankHolidaysSheetData $ratesTableSpreadsheet->loadArraySheet('Bank_Hols');
  109.         foreach ($bankHolidaysSheetData as $row) {
  110.             if ($row['C'] == $userSelectedCurrency) {
  111.                 $bankHolidaysArray[] = date('Y-m-d'strtotime($row['A']));
  112.             }
  113.         }
  114.         // User Saved Form read from DB
  115.         $encoder = new JsonEncoder();
  116.         $defaultContext = [
  117.             AbstractNormalizer::CIRCULAR_REFERENCE_HANDLER => fn ($object$format$context) => $object->getId(),
  118.         ];
  119.         $normalizer = new ObjectNormalizer(nullnullnullnullnullnull$defaultContext);
  120.         $serializer = new Serializer([$normalizer], [$encoder]);
  121.         $userSavedForm $serializer->normalize($loggedUser->getUserForm(), 'json', ['attributes' => ['seek''amount''tolerance''settlementType''ccEmails''notes']]);
  122.         $userSavedFormExtension = [
  123.             'tradingEntity' => $loggedUser->getUserForm() && $loggedUser->getUserForm()->getClient() ? $loggedUser->getUserForm()->getClient()->getId() : '',
  124.             'basket' => $loggedUser->getUserForm() && $loggedUser->getUserForm()->getBasket() ? $loggedUser->getUserForm()->getBasket()->getId() : '',
  125.             'counterparty' => $loggedUser->getUserForm() && $loggedUser->getUserForm()->getCounterparty() ? $loggedUser->getUserForm()->getCounterparty()->getId() : '',
  126.             'currency' => $loggedUser->getUserForm() && $loggedUser->getUserForm()->getCurrency() ? $loggedUser->getUserForm()->getCurrency()->getId() : '',
  127.         ];
  128.         // Cell rules from DB
  129.         $backgroundColorSelectableCellsArray = [];
  130.         $fontColorSelectableCellsArray = [];
  131.         $cellRules $cellRuleRepository->findAll();
  132.         foreach ($cellRules as $cellRule) {
  133.             if (str_contains($cellRule->getValue(), 'BG-')) {
  134.                 $backgroundColorSelectableCellsArray[] = substr($cellRule->getValue(), 3);
  135.             } elseif (str_contains($cellRule->getValue(), 'TXT-')) {
  136.                 $fontColorSelectableCellsArray[] = substr($cellRule->getValue(), 4);
  137.             }
  138.         }
  139.         $feeMargin $loggedUser->getFeeMargin() / 100;
  140.         $feeMarginStr = (string) $feeMargin;
  141.         $feeMarginDotPos strpos($feeMarginStr'.');
  142.         $feeMarginDigits false !== $feeMarginDotPos strlen(substr($feeMarginStr$feeMarginDotPos)) - 0;
  143.         $newTableArr = [];
  144.         foreach ($dataTablesSheetArray as $key => $row) {
  145.             if (== $key) {
  146.                 $newTableArr[] = $row;
  147.             } else {
  148.                 $oneRowArr = [];
  149.                 foreach ($row as $letterRef => $cellValue) {
  150.                     if (('double' == gettype($cellValue)) || ('integer' == gettype($cellValue))) {
  151.                         $cellValueStr = (string) $cellValue;
  152.                         $cellValueDotPos strpos($cellValueStr'.');
  153.                         $cellValueDigits false !== $cellValueDotPos strlen(substr($cellValueStr$cellValueDotPos)) - 0;
  154.                         $scale $cellValueDigits >= $feeMarginDigits $cellValueDigits $feeMarginDigits;
  155.                         $cellValue bcsub($cellValueStr$feeMarginStr$scale);
  156.                     }
  157.                     $oneRowArr[$letterRef] = $cellValue;
  158.                 }
  159.                 $newTableArr[] = $oneRowArr;
  160.             }
  161.         }
  162.         $associatedClients $clientRepository->fetchUserLinkedClients($loggedUser->getId());
  163.         $associatedClientsEntitiesApprovedSsisCurrencies $currencyRepository->fetchAssociatedClientsEntitiesApprovedSsisCurrenciesByUserId($loggedUser->getId());
  164.         return $this->render('home/index.html.twig', [
  165.             'table_data_sheet' => $dataTablesSheet,
  166.             'table_data_sheet_array' => $newTableArr,
  167.             'border_width_array' => Theme::BORDER_WIDTH,
  168.             'hover_data_array' => $hoverOverRepository->findAll(),
  169.             'theme' => $loggedUserTheme,
  170.             'table_column_style' => $commonService->getColumnsStyle($dataTablesSheet$dataTablesSheetArray[1]),
  171.             'counterparty_data_array' => $counterpartyRepository->findBy(['isDeleted' => false]),
  172.             'basket_data_array' => $basketRepository->findBy(['isDeleted' => false]),
  173.             'currency_data_array' => $currencyRepository->findBy(['isDeleted' => false]),
  174.             'graph_img_path' => $graphImgName,
  175.             'available_themes' => $themeRepository->fetchPublicThemes(),
  176.             'bank_Holidays_Array_Encoded' => json_encode($bankHolidaysArray),
  177.             'user_form_array' => json_encode($userSavedForm),
  178.             'user_form_array_extension' => json_encode($userSavedFormExtension),
  179.             'background_color_selectable_cells' => json_encode($backgroundColorSelectableCellsArray),
  180.             'font_color_selectable_cells' => json_encode($fontColorSelectableCellsArray),
  181.             /* 'currencies' => $currencyRepository->findBy(["isDeleted" => false]), */
  182.             'currencies' => $associatedClientsEntitiesApprovedSsisCurrencies,
  183.             'instructions_from_db' => $settingsRepository->findOneBy(['property' => 'instructions']),
  184.             'clients' => $associatedClients,
  185.         ]);
  186.     }
  187.     // Save theme for user
  188.     #[Route('/user/home/theme/save'name'theme_save')]
  189.     public function themeSave(Request $requestThemeRepository $themeRepositoryUserRepository $userRepository): Response
  190.     {
  191.         $selectedThemeId $request->request->get('selectedTheme');
  192.         $selectedTheme $themeRepository->find($selectedThemeId);
  193.         $loggedUser $userRepository->findOneBy(['email' => $this->getUser()->getUserIdentifier()]);
  194.         $loggedUser->setAssociatedTheme($selectedTheme);
  195.         $this->entityManager->persist($loggedUser);
  196.         $this->entityManager->flush();
  197.         return $this->redirect($request->headers->get('referer'));
  198.     }
  199.     #[Route('/user/home/currency/save'name'currency_save')]
  200.     public function currencySave(Request $requestCurrencyRepository $currencyRepositoryUserRepository $userRepository): Response
  201.     {
  202.         $selectedCurrencyId $request->request->get('currencyToChange');
  203.         $selectedCurrency $currencyRepository->find($selectedCurrencyId);
  204.         if ($selectedCurrency) {
  205.             $loggedUser $userRepository->findOneBy(['email' => $this->getUser()->getUserIdentifier()]);
  206.             $loggedUser->setSelectedCurrency($selectedCurrency);
  207.             $this->entityManager->persist($loggedUser);
  208.             $this->entityManager->flush();
  209.         }
  210.         return $this->redirect($request->headers->get('referer'));
  211.     }
  212.     // Populate form data from link
  213.     #[Route('/user/home/{id}/autofill'name'sds_request_indication_only_form_autofill')]
  214.     public function autofillFormDataIndication(int $idSdsFormRequestRepository $sdsFormRequestRepositoryRequest $request): Response
  215.     {
  216.         $session $request->getSession();
  217.         $sdsRequest $sdsFormRequestRepository->find($id);
  218.         $currency $sdsRequest->getCurrency();
  219.         $sdsRequestUser $sdsRequest->getUser()->setSelectedCurrency($currency);
  220.         $autofilledCounts $sdsRequest->getAutoFilledRequestsCount();
  221.         ++$autofilledCounts;
  222.         $sdsRequest->setAutoFilledRequestsCount($autofilledCounts);
  223.         $this->entityManager->persist($sdsRequestUser);
  224.         $this->entityManager->flush();
  225.         $session->set('requestsCount'$autofilledCounts);
  226.         $session->set('tradingEntity'$sdsRequest->getClient()->getId());
  227.         $session->set('amount'$sdsRequest->getAmount());
  228.         if ($sdsRequest->getCounterparty()) {
  229.             $session->set('counterpartyId'$sdsRequest->getCounterparty()->getId());
  230.             $session->set('counterpartyValue'$sdsRequest->getCounterparty()->getValue());
  231.         }
  232.         if ($sdsRequest->getBasket()) {
  233.             $session->set('basket'$sdsRequest->getBasket()->getId());
  234.             $session->set('basketValue'$sdsRequest->getBasket()->getValue());
  235.         }
  236.         if ($sdsRequest->getRate()) {
  237.             $session->set('period'explode(' - '$sdsRequest->getRate())[0]);
  238.         }
  239.         if ($sdsRequest->getNetTradeRate()) {
  240.             $session->set('tradeRate'$sdsRequest->getNetTradeRate());
  241.         }
  242.         if ($sdsRequest->getValueDate()) {
  243.             $session->set('valueDate'$sdsRequest->getValueDate()->format('d-m-Y'));
  244.         }
  245.         if ($sdsRequest->getMaturityDate()) {
  246.             $session->set('maturityDate'$sdsRequest->getMaturityDate()->format('d-m-Y'));
  247.         }
  248.         if ($sdsRequest->getSeek()) {
  249.             $session->set('seek'$sdsRequest->getSeek());
  250.         }
  251.         if ($sdsRequest->getTolerance()) {
  252.             $session->set('tolerance'$sdsRequest->getTolerance());
  253.         }
  254.         if ($sdsRequest->getCcEmails()) {
  255.             $session->set('ccEmails'implode(';'$sdsRequest->getCcEmails()));
  256.         }
  257.         if ($sdsRequest->getNotes() && '' !== trim($sdsRequest->getNotes())) {
  258.             $session->set('notes'trim(preg_replace("/\r|\n/"' '$sdsRequest->getNotes())));
  259.         } else {
  260.             $session->set('notes''');
  261.         }
  262.         $session->set('indicationRequestDateTime'$sdsRequest->getCreatedAt()->format('Y-m-d H:i'));
  263.         return $this->redirectToRoute('home');
  264.     }
  265. }