src/Controller/IndexController.php line 38

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Member;
  4. use App\Entity\Opportunity;
  5. use App\Entity\Procurement;
  6. use App\Entity\Product;
  7. use App\Entity\Slide;
  8. use App\Entity\UpdateInfoRequest;
  9. use App\Form\UpdateInfoRequestFormType;
  10. use App\Repository\MemberRepository;
  11. use App\Repository\OpportunityRepository;
  12. use App\Repository\ProcurementRepository;
  13. use App\Repository\ProductRepository;
  14. use App\Repository\SlideRepository;
  15. use App\Service\CommonService;
  16. use App\Service\Helper;
  17. use App\Service\ReportApiService;
  18. use Doctrine\Common\Util\ClassUtils;
  19. use Doctrine\DBAL\Exception;
  20. use Doctrine\ORM\EntityManagerInterface;
  21. use Doctrine\Persistence\Proxy;
  22. use GuzzleHttp\Client;
  23. use GuzzleHttp\Exception\GuzzleException;
  24. use Symfony\Component\HttpFoundation\Request;
  25. use Symfony\Component\Routing\Annotation\Route;
  26. use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
  27. use Symfony\Component\Serializer\Serializer;
  28. class IndexController extends BaseController
  29. {
  30.     /**
  31.      * @Route("/", name="app_index")
  32.      */
  33.     public function indexAction()
  34.     {
  35.         $select_year = !empty($_GET['year']) ? $_GET['year'] : '2024';
  36.         $years = ['2024''2023''2022''2021''2020'];
  37.         $user $this->getUser();
  38.         /** @var SlideRepository $repo */
  39.         $repo $this->doctrine->getRepository(Slide::class);
  40.         $qb $repo->createQueryBuilder('s')
  41.             ->andWhere('s.expirationDate > :expirationDate OR s.expirationDate IS NULL OR s.isDefault = 1')
  42.             ->setParameter('expirationDate', new \DateTime())
  43.             ->getQuery()
  44.             ->getResult();
  45. //        /** @var ProcurementRepository $procurement_repo */
  46. //        $procurement_repo = $this->doctrine->getRepository(Procurement::class);
  47. //        $qb_procurement = $procurement_repo->createQueryBuilder('p')
  48. //            ->select('SUM(p.amount) as amount')
  49. //            ->join('App:Member', 'm', 'with', 'm.name = p.recipient')
  50. //            ->andWhere('p.spendYear = :year')->setParameter('year', '2022')
  51. //            ->andWhere('(p.type = \'Subscriber\' or p.type = \'Certified_Supplier\')');
  52. //        $procurement = $qb_procurement->getQuery()->getArrayResult();
  53.         $revenueData ReportApiService::getReportData('revenue_by_industry?year='$select_year);
  54.         //echo '<pre>'; print_r($revenueData); echo '</pre>'; exit();
  55.         $procurementData ReportApiService::getReportData('procurement_by_industry?year='$select_year);
  56.         $totalRevenue 0;
  57.         $totalProcurement 0;
  58.         $revenue $revenueData $revenueData['data'] : [];
  59.         foreach ($revenue as $item) {
  60.             $totalRevenue += round($item['revenue'], 2);
  61.         }
  62.         $procurement $procurementData $procurementData['data'] : [];
  63.         foreach ($procurement as $item) {
  64.             $totalProcurement += round($item['amount'], 2);
  65.         }
  66.         /** @var MemberRepository $member_repo */
  67.         $member_repo $this->doctrine->getRepository(Member::class);
  68.         $qb_member $member_repo->createQueryBuilder('m')
  69.             ->select('SUM(m.revenue) as revenue')
  70.             ->andWhere('(m.type = \'MBE\' or m.type = \'Subscriber\')');
  71.             //->andWhere('m.status = :status')
  72.             //->setParameter('status', 'Certified')
  73.         $revenue $qb_member->getQuery()->getArrayResult();
  74.         /** @var OpportunityRepository $opp_repo */
  75.         $category CommonService::$choices['industry_list'];
  76.         $opp_repo $this->doctrine->getRepository(Opportunity::class);
  77.         $opportunities $opp_repo->createQueryBuilder('o');
  78.         $opp_total $opportunities->select('COUNT(o.id) AS total')->getQuery()->getOneOrNullResult();
  79.         $result = [];
  80.         $opportunities_count 0;
  81.         foreach ($category as $item) {
  82.             $opportunities
  83.                 ->select('COUNT(o.id) AS total, o.industry')
  84.                 ->andWhere("o.industry LIKE :searchTerm")
  85.                 ->setParameter('searchTerm'"%\"{$item}\"%")
  86.                 ->andWhere('o.status = :status')
  87.                 ->setParameter('status''Active');
  88.             $qr $opportunities->getQuery()->getResult();
  89.             $result[$item] = $qr[0]['total'] > $qr[0]['total'] : 0;
  90.             if($result[$item] > 0){
  91.                 $opportunities_count += $result[$item];
  92.             }
  93.         }
  94.         /** @var ProductRepository $pro_repo */
  95.         $pro_repo $this->doctrine->getRepository(Product::class);
  96.         $bundle $pro_repo->createQueryBuilder('p')
  97.             ->andWhere('p.deleted = 0')
  98.             ->andWhere('p.status = :status')
  99.             ->setParameter('status''Active')
  100.             ->getQuery()
  101.             ->getResult();
  102.         return $this->render('index/index.twig', [
  103.             'images' => $qb,
  104.             'procurement' => $totalProcurement,
  105.             'revenue' => $totalRevenue,
  106.             'opportunities' => $opportunities_count,
  107.             'opportunities_total' => $opp_total $opp_total['total'] : 0,
  108.             'bundle' => $bundle,
  109.             'terms' => $user->getUserAcceptedTerms2() ? 0,
  110.             'years' => $years,
  111.             'select_year' => $select_year
  112.         ]);
  113.     }
  114.     /**
  115.      * @Route("/chart-data/mbe-number-employees-data-chart", name="app_chart_mbe_employees_data")
  116.      */
  117.     public function MBEsNumberFTimeEmployeesDataChart(Request $request)
  118.     {
  119.         $chartType $request->get('chartType');
  120.         $sql "
  121.             SELECT 
  122.                 COUNT(*) as c,
  123.                 CASE 
  124.                 WHEN employees BETWEEN 0 AND 5 then '1-5'
  125.                 WHEN employees BETWEEN 6 AND 10 then '6-10'
  126.                 WHEN employees BETWEEN 11 AND 100 then '11-100'
  127.                 WHEN employees BETWEEN 101 AND 500 then '101-500'
  128.                 WHEN employees > 500 then '500+'
  129.                 END AS numOfEmployees
  130.             FROM member
  131.             WHERE type = 'MBE' AND status = 'Certified'
  132.             GROUP BY numOfEmployees
  133.             ORDER BY employees
  134.         ";
  135.         try {
  136.             $stmt $this->em->getConnection()->prepare($sql);
  137.             $rows $stmt->executeQuery()->fetchAllAssociative();
  138.             if ($chartType == 'echart') {
  139.                 $data = [];
  140.                 foreach ($rows as $row) {
  141.                     if (empty($row['numOfEmployees'])) {
  142.                         $row['numOfEmployees'] = 'Unclassified';
  143.                     }
  144.                     $data[] = array(
  145.                         'name' => $row['numOfEmployees'], 'value' => intval($row['c'])
  146.                     );
  147.                 }
  148.             } else {
  149.                 $data = [['Num Of Employees''Number']];
  150.                 foreach ($rows as $row) {
  151.                     if (empty($row['numOfEmployees'])) {
  152.                         $row['numOfEmployees'] = 'Unclassified';
  153.                     }
  154.                     $data[] = [
  155.                         $row['numOfEmployees'], intval($row['c'])
  156.                     ];
  157.                 }
  158.             }
  159.             return $this->json([
  160.                 'error' => 0,
  161.                 'data' => $data,
  162.             ]);
  163.         } catch (Exception $e) {
  164.             return $this->json([
  165.                 'error' => 1,
  166.                 'message' => $e->getMessage(),
  167.             ]);
  168.         }
  169.     }
  170.     /**
  171.      * @Route("/chart-data/mbe-revenue-class-data-chart", name="app_chart_mbe_revenue_class_data")
  172.      */
  173.     public function MBEsByClassOrRevenueDataChart(Request $request)
  174.     {
  175.         $chartType $request->get('chartType');
  176.         $labels = [
  177.             'class_1' => 'Class 1 (under $1M)',
  178.             'class_2' => 'Class 2 ($1M - $10M)',
  179.             'class_3' => 'Class 3 ($10M - $50M)',
  180.             'class_4' => 'Class 4 ($50M - Above)',
  181.         ];
  182.         $sql "
  183.             SELECT 
  184.                 COUNT(*) as c,
  185.                 revenue_class AS revenueClass
  186.             FROM member
  187.             WHERE type = 'MBE' AND status = 'Certified' AND revenue_class != '' AND revenue_class IS NOT NULL
  188.             GROUP BY revenueClass
  189.             ORDER BY revenueClass
  190.         ";
  191.         try {
  192.             $stmt $this->em->getConnection()->prepare($sql);
  193.             $rows $stmt->executeQuery()->fetchAllAssociative();
  194.             if ($chartType == 'echart') {
  195.                 $data = [];
  196.                 foreach ($rows as $item) {
  197.                     $label = (!empty($labels[$item['revenueClass']])) ? $labels[$item['revenueClass']] : $item['revenueClass'];
  198.                     $data[] = [
  199.                         'name' => $label'value' => intval($item['c'])
  200.                     ];
  201.                 }
  202.             } else {
  203.                 $data = [['Class''Number']];
  204.                 foreach ($rows as $row) {
  205.                     $label = (!empty($labels[$row['revenueClass']])) ? $labels[$row['revenueClass']] : $row['revenueClass'];
  206.                     $data[] = [
  207.                         $labelintval($row['c'])
  208.                     ];
  209.                 }
  210.             }
  211.             return $this->json([
  212.                 'error' => 0,
  213.                 'data' => $data,
  214.             ]);
  215.         } catch (Exception $e) {
  216.             return $this->json([
  217.                 'error' => 1,
  218.                 'message' => $e->getMessage(),
  219.             ]);
  220.         }
  221.     }
  222.     /**
  223.      * @Route("/chart-data/mbe-year-bussiness-data-chart", name="app_chart_mbe_year_bussiness_data")
  224.      */
  225.     public function MBEsYearsInBusinessDataChart(Request $request)
  226.     {
  227.         $chartType $request->get('chartType');
  228.         $currentYear date('Y');
  229.         $sql "
  230.             SELECT 
  231.                 COUNT(*) as c,
  232.                 CASE 
  233.                 WHEN ({$currentYear} - year_established) BETWEEN 0 AND 4 OR year_established IS NULL then '0-4 Years'
  234.                 WHEN ({$currentYear} - year_established) BETWEEN 5 AND 10 then '5-10 Years'
  235.                 WHEN ({$currentYear} - year_established) BETWEEN 11 AND 20 then '11-20 Years'
  236.                 WHEN ({$currentYear} - year_established) BETWEEN 21 AND 20000 then '20+ Years'
  237.                 END AS mbeYear
  238.             FROM member
  239.             WHERE type = 'MBE' AND status = 'Certified'
  240.             GROUP BY mbeYear
  241.         ";
  242.         try {
  243.             $stmt $this->em->getConnection()->prepare($sql);
  244.             $rows $stmt->executeQuery()->fetchAllAssociative();
  245.             if ($chartType == 'echart') {
  246.                 $data = [
  247.                     '0-4 Years' => 0,
  248.                     '5-10 Years' => 0,
  249.                     '11-20 Years' => 0,
  250.                     '20+ Years' => 0,
  251.                 ];
  252.                 $colors = array(=> '#73c0de'=> '#91cc75'=> '#fac858'=> '#ee6666');
  253.                 foreach ($rows as $row) {
  254.                     $data[$row['mbeYear']] = intval($row['c']);
  255.                 }
  256.                 $label = [];
  257.                 $value = [];
  258.                 $i 0;
  259.                 foreach ($data as $title => $c) {
  260.                     $label[] = $title;
  261.                     $value[] = [
  262.                         'value' => intval($c),
  263.                         'itemStyle' => array(
  264.                             'color' => $colors[$i]
  265.                         ),
  266.                     ];
  267.                     $i++;
  268.                 }
  269.                 return $this->json([
  270.                     'error' => 0,
  271.                     'label' => $label,
  272.                     'data' => $value,
  273.                 ]);
  274.             } else {
  275.                 $data = [
  276.                     'Year' => 'Number',
  277.                     '20+ Years' => 0,
  278.                     '11-20 Years' => 0,
  279.                     '5-10 Years' => 0,
  280.                     '0-4 Years' => 0,
  281.                 ];
  282.                 foreach ($rows as $row) {
  283.                     $data[$row['mbeYear']] = intval($row['c']);
  284.                 }
  285.                 $chart = [];
  286.                 foreach ($data as $label => $c) {
  287.                     $chart[] = [$label$c];
  288.                 }
  289.                 return $this->json([
  290.                     'error' => 0,
  291.                     'data' => $chart,
  292.                 ]);
  293.             }
  294.         } catch (Exception $e) {
  295.             return $this->json([
  296.                 'error' => 1,
  297.                 'message' => $e->getMessage(),
  298.             ]);
  299.         }
  300.     }
  301.     /**
  302.      * @Route("/chart-data/mbe-ethnicity-data-chart", name="app_chart_mbe_ethnicity_data")
  303.      */
  304.     public function MBEOwnersByEthnicityDateChart(Request $request)
  305.     {
  306.         $chartType $request->get('chartType');
  307.         $sql "
  308.             SELECT 
  309.                 COUNT(*) as c,
  310.                 ethnicity
  311.             FROM member
  312.             WHERE type = 'MBE' AND status = 'Certified' 
  313.             GROUP BY ethnicity
  314.             ORDER BY ethnicity
  315.         ";
  316.         try {
  317.             $stmt $this->em->getConnection()->prepare($sql);
  318.             $rows $stmt->executeQuery()->fetchAllAssociative();
  319.             if ($chartType == 'echart') {
  320.                 $data = [];
  321.                 foreach ($rows as $row) {
  322.                     if (empty($row['ethnicity'])) {
  323.                         $row['ethnicity'] = 'Unclassified';
  324.                     }
  325.                     $data[] = [
  326.                         'name' => $row['ethnicity'], 'value' => intval($row['c'])
  327.                     ];
  328.                 }
  329.             } else {
  330.                 $data = [['Ethnicity''Number']];
  331.                 foreach ($rows as $row) {
  332.                     if (empty($row['ethnicity'])) {
  333.                         $row['ethnicity'] = 'Unclassified';
  334.                     }
  335.                     $data[] = [
  336.                         $row['ethnicity'], intval($row['c'])
  337.                     ];
  338.                 }
  339.             }
  340.             return $this->json([
  341.                 'error' => 0,
  342.                 'data' => $data,
  343.             ]);
  344.         } catch (Exception $e) {
  345.             return $this->json([
  346.                 'error' => 1,
  347.                 'message' => $e->getMessage(),
  348.             ]);
  349.         }
  350.     }
  351.     /**
  352.      * @Route("/chart-data/mbe-procurement-industry-data-chart", name="app_chart_mbe_procurement_industry_data")
  353.      */
  354.     public function MBEProcurementByIndustryDataChart(Request $request)
  355.     {
  356.         $chartType $request->get('chartType');
  357.         $selectedYear $request->get('selectedYear');
  358.         $repo $this->doctrine->getRepository(Procurement::class);
  359.         /** @var ProcurementRepository $repo */
  360.         $qb $repo->createQueryBuilder('p')
  361.             ->select('
  362.                 m.industry,
  363.                 SUM(p.amount) as amount
  364.             ')
  365.             ->join('App:Member''m''with''m.fei = p.fei AND (p.fei IS NOT NULL AND p.fei <> \'\')')
  366.             ->andWhere('m.type = :MBE')
  367.             ->setParameter('MBE''MBE')
  368.             ->andWhere('p.spendYear = :spendYear')
  369.             ->setParameter('spendYear'$selectedYear)
  370.             ->groupBy('m.industry')
  371.             ->orderBy('amount''desc');
  372.         $result $qb->getQuery()->getResult();
  373.         if ($chartType == 'echart') {
  374.             $data = [];
  375.             foreach ($result as $item) {
  376.                 if (empty($item['industry'])) {
  377.                     $item['industry'] = 'Unclassified';
  378.                 }
  379.                 $data[] = array(
  380.                     'name' => $item['industry'], 'value' => intval($item['amount'])
  381.                 );
  382.             }
  383.         } else {
  384.             $data = [['Industry''Amount']];
  385.             foreach ($result as $item) {
  386.                 if (empty($item['industry'])) {
  387.                     $item['industry'] = 'Unclassified';
  388.                 }
  389.                 $data[] = [
  390.                     $item['industry'], intval($item['amount'])
  391.                 ];
  392.             }
  393.         }
  394.         return $this->json([
  395.             'error' => 0,
  396.             'data' => $data,
  397.         ]);
  398.     }
  399.     /**
  400.      * @Route("/chart-data/mbe-procurement-ethnicity-data-chart", name="app_chart_mbe_procurement_ethnicity_data")
  401.      */
  402.     public function MBEProcurementByEthnicityDataChart(Request $request)
  403.     {
  404.         $chartType $request->get('chartType');
  405.         $selectedYear $request->get('selectedYear');
  406.         /** @var ProcurementRepository $repo */
  407.         $repo $this->doctrine->getRepository(Procurement::class);
  408.         $qb $repo->createQueryBuilder('p')
  409.             ->select('
  410.                 m.ethnicity,
  411.                 SUM(p.amount) as amount
  412.             ')
  413.             ->join('App:Member''m''with''m.fei = p.fei AND (p.fei IS NOT NULL AND p.fei <> \'\')')
  414.             ->andWhere('m.type = :MBE')
  415.             ->setParameter('MBE''MBE')
  416.             ->andWhere('p.spendYear = :spendYear')
  417.             ->setParameter('spendYear'$selectedYear)
  418.             ->groupBy('m.ethnicity')
  419.             ->orderBy('m.ethnicity''asc');
  420.         $result $qb->getQuery()->getResult();
  421.         if ($chartType == 'echart') {
  422.             $data = [];
  423.             foreach ($result as $row) {
  424.                 if (empty($row['ethnicity'])) {
  425.                     $row['ethnicity'] = 'Unclassified';
  426.                 }
  427.                 $data[] = array(
  428.                     'name' => $row['ethnicity'], 'value' => intval($row['amount'])
  429.                 );
  430.             }
  431.         } else {
  432.             $data = [['Ethnicity''Amount']];
  433.             foreach ($result as $row) {
  434.                 if (empty($row['ethnicity'])) {
  435.                     $row['ethnicity'] = 'Unclassified';
  436.                 }
  437.                 $data[] = [
  438.                     $row['ethnicity'], intval($row['amount'])
  439.                 ];
  440.             }
  441.         }
  442.         return $this->json([
  443.             'error' => 0,
  444.             'data' => $data,
  445.         ]);
  446.     }
  447.     /**
  448.      * @Route("/terms-of-use-disclaimer", name="app_terms_of_use_disclaimer")
  449.      */
  450.     public function TermsOfUseDisclaimerFinal(Request $request)
  451.     {
  452.         $user $this->getUser();
  453.         $user->setAcceptedTerms(true);
  454.         $user->setAcceptedTermsTime(new \DateTime('now'));
  455.         $this->doctrine->getManager()->persist($user);
  456.         $this->doctrine->getManager()->flush();
  457.         return $this->redirectToRoute('app_index');
  458.     }
  459.     /**
  460.      * @Route("/terms-of-use-disclaimer-2", name="app_terms_of_use_disclaimer_2")
  461.      */
  462.     public function TermsOfUseDisclaimerFinal2(Request $request)
  463.     {
  464.         $user $this->getUser();
  465.         $user->setUserAcceptedTerms2(true);
  466.         $user->setUserAcceptedTermsTime2(new \DateTime('now'));
  467.         $this->doctrine->getManager()->persist($user);
  468.         $this->doctrine->getManager()->flush();
  469.         return $this->redirectToRoute('app_index');
  470.     }
  471.     /**
  472.      * @Route("/update-info-request", name="app_update_info_request_new_2")
  473.      */
  474.     public function updateCompanyInfoAction(Request $requestEntityManagerInterface $entityManager)
  475.     {
  476.         $member '';
  477.         $user $this->getUser();
  478.         if (!empty($user->getMember())){
  479.             $member $user->getMember();
  480.         }
  481.         $updateRequest = new UpdateInfoRequest();
  482.         $updateRequest->setCompany($member);
  483.         $form $this->createForm(UpdateInfoRequestFormType::class, $updateRequest);
  484.         $form->handleRequest($request);
  485.         if ($form->isSubmitted() && $form->isValid()) {
  486.             $data $form->getData();
  487.             $updateRequest->setStatus('Synced');
  488.             foreach ($data as $key => $value) {
  489.                 $updateRequest->set($key$value);
  490.             }
  491.             if (!$this->isGranted('ROLE_ADMIN') && !$this->isGranted('ROLE_MANAGER')){
  492.                 $updateRequest->setCompany($member);
  493.             }
  494.             $signatureData $request->request->get('signature_pad_input');
  495.             $updateRequest->setCpoSignature($signatureData);
  496.             $this->doctrine->getManager()->persist($updateRequest);
  497.             $this->doctrine->getManager()->flush();
  498.             $this->sync_info_request($entityManager$updateRequest);
  499.             $this->addFlash('success''Save successful');
  500.             return $this->redirectToRoute('app_update_info_request_new_2');
  501.         }
  502.         return $this->render('index/update_info_request.html.twig', [
  503.             'companyInfoForm' => $form->createView(),
  504.         ]);
  505.     }
  506.     function sync_info_request($entityManagerUpdateInfoRequest $info){
  507.         if ($info instanceof Proxy) {
  508.             $info $entityManager->find(ClassUtils::getRealClass(get_class($info)), $info->getId());
  509.         }
  510.         $normalizer = new ObjectNormalizer(nullnullnullnullnullnull, [
  511.             'circular_reference_handler' => function ($object) {
  512.                 return $object->getId(); // Return only the ID
  513.             }
  514.         ]);
  515.         $serializer = new Serializer([$normalizer]);
  516.         $data $serializer->normalize($infonull, ['groups' => 'member:read']);
  517.         $client = new Client(['timeout' => 1]);
  518.         try {
  519.             $client->request('POST'$_ENV['WEBHOOK_UPDATE_INFO_REQUEST'], ['form_params' => $data]);
  520.         } catch (GuzzleException | \Exception $e) {
  521.             Helper::fileLog($e->getMessage(), 'ERROR''MemberUpdate');
  522.         }
  523.     }
  524. }