src/Controller/IndexController.php line 35

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Company;
  4. use App\Entity\CompanyGroup;
  5. use App\Entity\Product;
  6. use App\Form\Filter\AppGraphFilterType;
  7. use App\Helper\EnumsHelper;
  8. use App\Repository\CompanyRepository;
  9. use App\Repository\OrderRepository;
  10. use App\Repository\ProductRepository;
  11. use App\Services\GalosoftGraphsFactory;
  12. use App\Services\GalosoftMailer;
  13. use App\Services\GalosoftMailerInterface;
  14. use Gotenberg\Gotenberg;
  15. use Gotenberg\Stream;
  16. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  17. use Symfony\Component\HttpFoundation\Request;
  18. use Symfony\Component\HttpFoundation\Response;
  19. use Symfony\Component\HttpFoundation\Session\Session;
  20. use Symfony\Component\Routing\Annotation\Route;
  21. class IndexController extends AbstractController
  22. {
  23.     const DASHBOARD_COLUMN 'dashboard_column';
  24.     const DASHBOARD_DATEFROM 'dashboard_datefrom';
  25.     const DASHBOARD_DATETO 'dashboard_dateto';
  26.     /**
  27.      * @Route("/", name="app_homepage")
  28.      */
  29.     public function index(
  30.         Session $session,
  31.         CompanyRepository $companyRepository,
  32.         GalosoftGraphsFactory $galosoftGraphsFactory,
  33.         OrderRepository $orderRepository,
  34.         ProductRepository $productRepository
  35.     ): Response
  36.     {
  37.         $selectedColumn $session->get(self::DASHBOARD_COLUMN3);
  38.         $dateFrom $session->get(self::DASHBOARD_DATEFROM, new \DateTime('now-12months'));
  39.         $dateTo $session->get(self::DASHBOARD_DATETO, new \DateTime('now'));
  40.         $qb $companyRepository->createQueryBuilder('qc');
  41.         $qb->leftJoin('qc.companyFiles''companyFiles');
  42.         $qb->andWhere($qb->expr()->isInstanceOf('qc'CompanyGroup::class));
  43.         //$qb->andWhere($qb->expr()->neq('companyFiles.showOnWebsite', false));
  44.         $companies $qb->getQuery()->getResult();
  45.         // CURRENT USER
  46.         $graphMyProduction $galosoftGraphsFactory->create();
  47.         $gmp $galosoftGraphsFactory->createLine();
  48.         if($this->isGranted('ROLE_COMPANY_ADMIN') || $this->isGranted('ROLE_COMPANY_USER')){
  49.             // company admin
  50.             $dataMyProduction $orderRepository->ordersByCompanyGroupByDays($dateFrom$dateTo$this->getUser(), $selectedColumn);
  51.         }elseif ($this->isGranted('ROLE_MERCHANT')){
  52.             // merchant
  53.             $dataMyProduction $orderRepository->orderCountByDays($dateFrom$dateTo$this->getUser(), $selectedColumn);
  54.         }
  55.         foreach ($dataMyProduction as $row) {
  56.             $gmp->createPoint($row['den'], $row['total']);
  57.         }
  58.         $graphMyProduction->addLine($gmp);
  59.         // BY Companies
  60.         $graphMyProductionByCompanies $galosoftGraphsFactory->create();
  61.         $dataMyProduction $orderRepository->orderCountByCompaniesByDays($dateFrom$dateTo$this->getUser(), $selectedColumn);
  62.         $lines = [];
  63.         foreach ($dataMyProduction as $row) {
  64.             if(!isset($lines[$row['company_group_id']])){
  65.                 $lines[$row['company_group_id']] = $galosoftGraphsFactory->createLine($row['company_label']);
  66.             }
  67.             $lines[$row['company_group_id']]->createPoint($row['den'], $row['total']);
  68.         }
  69.         foreach ($lines as $line) {
  70.             $graphMyProductionByCompanies->addLine($line);
  71.         }
  72.         // BY EMITENTS
  73.         $graphMyProductionByProducts $galosoftGraphsFactory->create();
  74.         if($this->isGranted('ROLE_COMPANY_ADMIN') || $this->isGranted('ROLE_COMPANY_USER')){
  75.             // comapny admin
  76.             $dataMyProduction $orderRepository->orderByCompanyGroupByProductsByDays($dateFrom$dateTo$this->getUser(), $selectedColumn);
  77.         }elseif($this->isGranted('ROLE_MERCHANT')){
  78.             // merchant
  79.             $dataMyProduction $orderRepository->orderCountByProductsByDays($dateFrom$dateTo$this->getUser(), $selectedColumn);
  80.         }
  81.         $lines = [];
  82.         foreach ($dataMyProduction as $row) {
  83.             if(!isset($lines[$row['product_id']])){
  84.                 $lines[$row['product_id']] = $galosoftGraphsFactory->createLine($row['product_label']);
  85.             }
  86.             $lines[$row['product_id']]->createPoint($row['den'], $row['total']);
  87.         }
  88.         foreach ($lines as $line) {
  89.             $graphMyProductionByProducts->addLine($line);
  90.         }
  91.         $graphMyProductionByNetworks $galosoftGraphsFactory->create();
  92.         $dataOtherProduction $orderRepository->orderByAffilCode($dateFrom$dateTo$this->getUser(), $selectedColumn);
  93.         $filter $this->createForm(AppGraphFilterType::class);
  94.         $qbProducts $productRepository->createQueryBuilder('p');
  95.         $products $qbProducts
  96.                 ->andWhere($qbProducts->expr()->notIn('p.productType', [EnumsHelper::PRODUCT_TYPE_METAL]))
  97.                 ->andWhere($qbProducts->expr()->eq('p.active'true))
  98.                 ->getQuery()->getResult();
  99.         return $this->render('index/emitents.html.twig', [
  100.             'companies' => $companies,
  101.             'products' => $products,
  102.             'graphMyProduction' => $graphMyProduction,
  103.             'graphMyProductionByCompanies' => $graphMyProductionByCompanies,
  104.             'graphMyProductionByProducts' => $graphMyProductionByProducts,
  105.             'graphMyProductionByNetworks' => $graphMyProductionByNetworks,
  106.             'tableOtherProduction' => $dataOtherProduction,
  107.             'selectedColumn' => $selectedColumn,
  108.             'dateFrom' => $dateFrom->format('j.n.Y'),
  109.             'dateTo' => $dateTo->format('j.n.Y'),
  110.             'form' => $filter->createView()
  111.         ]);
  112.     }
  113.     /**
  114.      * @Route("/dashboard/settings", name="app_dashboard_settings")
  115.      */
  116.     public function saveDashboardColumn(Request $requestSession $session){
  117.         $dashboardColumn $request->request->get('dashboard_column');
  118.         $appGraphFilter $request->request->get('app_graph_filter');
  119.         $session->set(self::DASHBOARD_COLUMN$dashboardColumn);
  120.         $session->set(self::DASHBOARD_DATEFROM\DateTime::createFromFormat('j.n.Y'$appGraphFilter['dateFrom']));
  121.         $session->set(self::DASHBOARD_DATETO\DateTime::createFromFormat('j.n.Y'$appGraphFilter['dateTo']));
  122.         return $this->forward(IndexController::class. '::index');
  123.     }
  124.     /**
  125.      * @Route("/emitent/{emitent}", name="app_emitent_detail")
  126.      */
  127.     public function emitentDetail(
  128.         Company $emitent,
  129.         ProductRepository $productRepository,
  130.         CompanyRepository $companyRepository
  131.     ): Response
  132.     {
  133.         $companyIds = [$emitent->getId()];
  134.         $companies $companyRepository->findBy(['companyGroup' => $emitent->getId()]);
  135.         foreach ($companies as $company) {
  136.             $companyIds[] = $company->getId();
  137.         }
  138.         $qbpr $productRepository->createQueryBuilder('pr');
  139.         $qbpr
  140.             ->andWhere($qbpr->expr()->gt('pr.webOrder'0))
  141.             ->andWhere($qbpr->expr()->isNotNull('pr.webOrder'))
  142.             ->andWhere($qbpr->expr()->in('pr.company'$companyIds))
  143.             ->addOrderBy('pr.webOrder''ASC');
  144.         $products $qbpr->getQuery()->getResult();
  145.         return $this->render('index/emitent.html.twig', [
  146.             'emitent' => $emitent,
  147.             'products' => $products
  148.         ]);
  149.     }
  150.     /**
  151.      * @Route("/kontakty", name="app_index_kontakty")
  152.      */
  153.     public function kontakty(){
  154.         $bossUsers $this->getUser()->getBosses();
  155.         return $this->render('index/contact.html.twig', [
  156.             'bossRelationFirstLine' => $bossUsers
  157.         ]);
  158.     }
  159.     /**
  160.      * @Route("/eshop-bak", name="app_index_eshop")
  161.      */
  162.     public function eshop(){
  163.         return $this->render('index/eshop.html.twig');
  164.     }
  165.     /**
  166.      * @Route("/basket-1", name="app_index_basket_1")
  167.      */
  168.     public function basket1(){
  169.         return $this->render('index/basket1.html.twig');
  170.     }
  171.     /**
  172.      * @Route("/basket-2", name="app_index_basket_2")
  173.      */
  174.     public function basket2(){
  175.         return $this->render('index/basket2.html.twig');
  176.     }
  177.     /**
  178.      * @Route("/basket-3", name="app_index_basket_3")
  179.      */
  180.     public function basket3(){
  181.         return $this->render('index/basket3.html.twig');
  182.     }
  183.     /**
  184.      * @Route("/basket-4", name="app_index_basket_4")
  185.      */
  186.     public function basket4(){
  187.         return $this->render('index/basket4.html.twig');
  188.     }
  189.     /**
  190.      * @Route("/basket-5", name="app_index_basket_5")
  191.      */
  192.     public function basket5(){
  193.         return $this->render('basket/basket5.html.twig');
  194.     }
  195.     /**
  196.      * @Route("/kalendar-akci", name="app_index_calendar")
  197.      */
  198.     public function calendar(){
  199.         return $this->render('index/calendar.html.twig');
  200.     }
  201.     /**
  202.      * @Route("/invoice", name="app_index_invoice")
  203.      */
  204.     public function invoice(GalosoftMailerInterface $mailer){
  205.         $data = [
  206.             "id" => "123",
  207.             "variable" => "123",
  208.             "issued" => date("j.n.Y"strtotime("10.8.2023")),
  209.             "due" => date("j.n.Y"strtotime("12.8.2023")),
  210.             "name" => "ABC s.r.o.",
  211.             "surname" => "",
  212.             "street" => "Ulice 123",
  213.             "postal" => "123 00",
  214.             "town" => "Město",
  215.             "ic" => "123456789",
  216.             "dic" => "CZ123456789",
  217.             "totalPriceExclVat" => number_format(2002","" "),
  218.             "totalPriceVat" => number_format(422","" "),
  219.             "totalPriceInclVat" => number_format(2422","" "),
  220.             "items" => [
  221.                 => [
  222.                     "name" => "Zlatý slitek 1 Oz Argor Heraeus",
  223.                     "count" => number_format(1,0""""),
  224.                     "vat" => number_format(210""""),
  225.                     "priceExclVat" => number_format(1002","" "),
  226.                     "priceVat" => number_format(212","" "),
  227.                     "priceInclVat" => number_format(1212","" "),
  228.                     "totalPriceExclVat" => number_format(1002","" "),
  229.                     "totalPriceVat" => number_format(212","" "),
  230.                     "totalPriceInclVat" => number_format(1212","" "),
  231.                 ],
  232.                 => [
  233.                     "name" => "Zlatý slitek 1 Oz Argor Heraeus",
  234.                     "count" => number_format(1,0""""),
  235.                     "vat" => number_format(210""""),
  236.                     "priceExclVat" => number_format(1002","" "),
  237.                     "priceVat" => number_format(212","" "),
  238.                     "priceInclVat" => number_format(1212","" "),
  239.                     "totalPriceExclVat" => number_format(1002","" "),
  240.                     "totalPriceVat" => number_format(212","" "),
  241.                     "totalPriceInclVat" => number_format(1212","" "),
  242.                 ]
  243.             ],
  244.         ];
  245.         $urlPreffix '../public/files/temp';
  246.         if (!is_dir($urlPreffix)) mkdir($urlPreffix);
  247.         $html $this->render('index/invoice.html.twig', ["data" => $data])->getContent();
  248.         $request Gotenberg::chromium("gotenberg:3000")
  249.             ->html(Stream::string('my.html',$html));
  250.         $file Gotenberg::save($request$urlPreffix);
  251.         $mailer->send([
  252.             "template_id" => "d-ac95fa387b2f4ab486b4940fa53578ff",
  253.             "from" => array(
  254.                 "name" => "EFS",
  255.                 "email" => "info@efsgroup.cz"
  256.             ),
  257.             "personalizations" => array(
  258.                 array(
  259.                     "dynamic_template_data" => $data,
  260.                     "to" => array(
  261.                         array(
  262.                             "email" => "kohout@galosoft.cz"
  263.                         ),
  264.                     )
  265.                 )
  266.             ),
  267.             "attachments" => [
  268.                 [
  269.                     //TODO - cesta k souboru bude /public/files/contracts/ID/HASH.pdf
  270.                     //TODO - pristup k ni bude take ze zalozky dokumenty v detailu objednavky viz prejmenovani zalozky dle EFS-159
  271.                     "content" => base64_encode(file_get_contents($urlPreffix."/".$file)),
  272.                     "type" => "pdf",
  273.                     "filename" => "Zálohová faktura č." $data["id"] . ".pdf"
  274.                 ]
  275.             ]
  276.         ]);
  277.         return $this->render('index/invoice.html.twig', ["data" => $data]);
  278.     }
  279. }