src/Controller/DashboardController.php line 37

  1. <?php
  2. namespace App\Controller;
  3. use App\Repository\TheCaseActionsRepository;
  4. use App\Repository\TheCaseRepository;
  5. use App\Service\EDeskService;
  6. use Nzo\UrlEncryptorBundle\Encryptor\Encryptor;
  7. use Omines\DataTablesBundle\DataTableFactory;
  8. use PhpOffice\PhpSpreadsheet\Style\Border;
  9. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  10. use Symfony\Component\HttpFoundation\Request;
  11. use Symfony\Component\HttpFoundation\Response;
  12. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  13. use Symfony\Component\HttpFoundation\StreamedResponse;
  14. use Symfony\Component\Routing\Annotation\Route;
  15. use Symfony\Contracts\Translation\TranslatorInterface;
  16. use Symfony\UX\Chartjs\Builder\ChartBuilderInterface;
  17. use Symfony\UX\Chartjs\Model\Chart;
  18. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  19. use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
  20. class DashboardController extends AbstractController
  21. {
  22.     private EDeskService $GetStep;
  23.     private ChartBuilderInterface $chartBuilder;
  24.     public function __construct(EDeskService $GetStep,ChartBuilderInterface $chartBuilder)
  25.     {
  26.         $this->GetStep = $GetStep;
  27.         $this->chartBuilder = $chartBuilder;
  28.     }
  29.     #[Route('/dashboard', name: 'app_dashboard')]
  30.     public function index(TheCaseRepository $theCaseRepository,Request $request,TranslatorInterface $translator): Response
  31.     {
  32.         //dd($theCaseRepository->CaseWithLastAction());
  33.         $GetCharte = $this->GetCharte($theCaseRepository, $translator->trans('Cases',[],'translation'));
  34.         $GetCountCase = $theCaseRepository->CountCases($this->getUser()->getLawOffice());
  35.         $GetStepStats = $this->GetStep->GetStepStat();
  36.         return $this->render('dashboard/index.html.twig', [
  37.             'controller_name' => 'DashboardController',
  38.             'StepStats' => $GetStepStats,
  39.             'CountCases' => $GetCountCase,
  40.             'ChartByMonth'=> $GetCharte,
  41.             'CasesWithLastActions' => $theCaseRepository->CaseWithLastAction(),
  42.         ]);
  43.     }
  44.    #[Route('/light-mode', name: 'light-mode')]
  45.     public function themeLight(SessionInterface $session): Response
  46.     {
  47.         $session->remove('theme');
  48.         return $this->redirectToRoute('app_dashboard');
  49.     }
  50.     #[Route('/dark-mode', name: 'dark-mode')]
  51.     public function themeDark(SessionInterface $session): Response
  52.     {
  53.         $session->set('theme', 'dark');
  54.         return $this->redirectToRoute('app_dashboard');
  55.     }
  56.     function GetCharte(TheCaseRepository $theCaseRepository,String $ChartTitle): Chart
  57.     {
  58.         $TypeCharte = 'ChartSticks';
  59.         $labels = [];
  60.         $data = [];
  61.         $max = 0;
  62.         $DatasRepo= $theCaseRepository->CaseByMonth();
  63.         //dd($DatasRepo);
  64.         if (empty($DatasRepo))
  65.         {
  66.             return $this->chartBuilder->createChart($TypeCharte);
  67.         }
  68.         foreach ($DatasRepo as $DataRepo )
  69.         {
  70.             //dd($DataRepo);
  71.             $labels[] = $DataRepo['Month'];
  72.             $data[] = $DataRepo['Total'];
  73.             if ($DataRepo['Total'] > $max)
  74.             {
  75.                 $max = $DataRepo['Total'];
  76.             }
  77.         }
  78.         switch ($TypeCharte) {
  79.             case "ChartCurved":
  80.                 $TypeCharte = Chart::TYPE_LINE;
  81.                 break;
  82.             case "ChartPie":
  83.                 $TypeCharte = Chart::TYPE_PIE;
  84.                 break;
  85.             case "ChartSticks":
  86.                 $TypeCharte = Chart::TYPE_BAR;
  87.                 break;
  88.         }
  89.         $chart = $this->chartBuilder->createChart($TypeCharte);
  90.         $chart->setData([
  91.             'labels' => $labels,
  92.             'datasets' => [
  93.                 [
  94.                     'label' => $ChartTitle,
  95.                     'backgroundColor' => $this->GetColor(count($data)),
  96.                     'data' => $data,
  97.                 ],
  98.             ],
  99.         ]);
  100.         $chart->setOptions([
  101.             'scales' => [
  102.                 'y' => [
  103.                     'suggestedMin' => 0,
  104.                     'suggestedMax' => $max+0.2,
  105.                 ],
  106.                 //'x'=>'gridLines'
  107.             ],
  108.         ]);
  109.         return $chart;
  110.     }
  111.     function GetColor($num) {
  112.         $ColorRanges =[];
  113.         for ($i = 1; $i <= $num; $i++) {
  114.             $hash = md5('color' . $i);
  115.             $ColorRange = 'rgb('.hexdec(substr($hash, 0, 2)).','.hexdec(substr($hash, 2, 2)).','.hexdec(substr($hash, 4, 2)).')';
  116.             array_push($ColorRanges, $ColorRange);
  117.         }
  118.         return $ColorRanges;
  119.     }
  120.     #[Route('Hearing', name: 'app_Hearing', methods: ['GET'])]
  121.     public function showHearing(Request $request,TheCaseActionsRepository $theCaseActionsRepository,Encryptor $encryptor,DataTableFactory $dataTableFactory,TranslatorInterface $translator,): Response
  122.     {
  123.         $DateValue = $encryptor->decrypt($request->get("Date"));
  124.         //$DateValue = $DateValue;
  125.         $LawOffice = $this->getUser()->getLawOffice();
  126.         $theCaseActions = $theCaseActionsRepository->FindByActionDate($DateValue,$LawOffice);
  127.         //dd($theCaseActions);
  128.         $Hearings = $this->render('the_case_actions/showmodal.html.twig', [
  129.             'Hearings' => $theCaseActions,
  130.             'ThisDate' => $request->get("Date"),
  131.             'DateValue' => $DateValue,
  132.         ]);
  133.         return $this->json([
  134.             'Status' => 'Success',
  135.             'Hearing' => $Hearings,
  136.         ], 200);
  137.         //return $this->redirectToRoute('app_case_continue', ['id'=>$theCaseAction->getTheCase()->getId()], Response::HTTP_SEE_OTHER);
  138.     }
  139.     #[Route('exportHearing', name: 'app_Hearing_Export', methods: ['GET'])]
  140.     public function showHearingExport(Request $request,TheCaseActionsRepository $theCaseActionsRepository,Encryptor $encryptor,TranslatorInterface $translator,): Response
  141.     {
  142.         $DateValue = $encryptor->decrypt($request->get("Date"));
  143.         //$DateValue = $DateValue;
  144.         $LawOffice = $this->getUser()->getLawOffice();
  145.         $theCaseActions = $theCaseActionsRepository->FindByActionDate($DateValue,$LawOffice);
  146.         $SubTitleStyleArray = [
  147.             'font' => [
  148.                 'bold' => true,
  149.                 'Size'=> 13
  150.             ],
  151.             'alignment' => [
  152.                 'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,
  153.             ],
  154.             'borders' => [
  155.                 'top' => [
  156.                     'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN,
  157.                 ],
  158.             ],
  159.             'fill' => [
  160.                 'fillType' => \PhpOffice\PhpSpreadsheet\Style\Fill::FILL_GRADIENT_LINEAR,
  161.                 'startColor' => [
  162.                     'argb' => 'FFA0A0A0',
  163.                 ],
  164.                 'endColor' => [
  165.                     'argb' => 'FFFFFFFF',
  166.                 ],
  167.             ],
  168.         ];
  169.         // Convert string $DateValue to date format:
  170.         $DateSTRToDate = new \DateTime($DateValue);
  171.         $spreadsheet = new Spreadsheet();
  172.         $sheet = $spreadsheet->getActiveSheet();
  173.         $sheet = $spreadsheet->getActiveSheet()->setTitle('جدول الجلسات');
  174.         $sheet->setCellValue('A1', 'جدول الجلسات ليوم : '.$DateSTRToDate->format('Y/m/d'))->mergeCells('A1:H1');
  175.         $sheet->getStyle('A1:H1')->getFont()->setSize(14);
  176.         $sheet->getStyle('A1:H1')->getFont()->setBold(true);
  177.         $sheet->getStyle('A1:H1')->getBorders()->getAllBorders()->setBorderStyle(true);
  178.         $sheet->getStyle('A1:H1')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
  179.         $sheet->getStyle('A2:H2')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
  180.         $sheet->getStyle('A2:H2')->getBorders()->getAllBorders()->setBorderStyle(true);
  181.         $sheet->getStyle('A2:H2')->getFont()->setBold(true);
  182.         $sheet->getColumnDimension('A')->setWidth(20);
  183.         $sheet->getColumnDimension('B')->setWidth(26);
  184.         $sheet->getColumnDimension('C')->setAutoSize(true);
  185.         $sheet->getColumnDimension('D')->setAutoSize(true);
  186.         $sheet->getColumnDimension('E')->setAutoSize(true);
  187.         $sheet->getColumnDimension('F')->setAutoSize(true);
  188.         $sheet->getColumnDimension('G')->setAutoSize(true);
  189.         $sheet->getColumnDimension('H')->setAutoSize(true);
  190.         /// Title Column
  191.         $sheet->setCellValue('A2', $translator->trans('Memo',[],'translation'));
  192.         $sheet->setCellValue('B2', $translator->trans('Demand',[],'translation'));
  193.         $sheet->setCellValue('C2', $translator->trans('LawyerAdv',[],'translation'));
  194.         $sheet->setCellValue('D2', $translator->trans('OpponentName',[],'translation'));
  195.         $sheet->setCellValue('E2', $translator->trans('Client',[],'translation'));
  196.         $sheet->setCellValue('F2', $translator->trans('CaseType',[],'translation'));
  197.         $sheet->setCellValue('G2', $translator->trans('FullFileTpiNum',[],'translation'));
  198.         $sheet->setCellValue('H2', $translator->trans('RefLawOffice',[],'translation'));
  199.         $i = 3;
  200.         //$Cells = ['A',"B","C","D","E","F","G","H"];
  201.         foreach ($theCaseActions as $theCaseAction) {
  202.             $sheet->setCellValue('A'.$i, '');
  203.             $sheet->setCellValue('B'.$i, $theCaseAction->getActionName());
  204.             $sheet->setCellValue('C'.$i, $theCaseAction->getTheCase()->getLawyerAdv());
  205.             $sheet->setCellValue('D'.$i, $theCaseAction->getTheCase()->getOpponentName());
  206.             $sheet->setCellValue('E'.$i, $theCaseAction->getTheCase()->getClient()->getFirstName().' '.$theCaseAction->getTheCase()->getClient()->getLastName());
  207.             $sheet->setCellValue('F'.$i, $theCaseAction->getTheCase()->getCaseType()->getcaseTypeName());
  208.             $sheet->setCellValue('G'.$i, $theCaseAction->getTheCase()->getFullFileTpiNum());
  209.             $sheet->setCellValue('H'.$i, $theCaseAction->getTheCase()->getRefLawOffice());
  210.             $i++;
  211.         }
  212.         $styleArrayContent = array(
  213.             'borders' => array(
  214.                 'outline' => array(
  215.                     'style' => Border::BORDER_MEDIUM,
  216.                 ),
  217.             ),
  218.         );
  219.         $CellsCoordinate = "A3:H".$i;
  220.         $sheet->getStyle($CellsCoordinate)->applyFromArray($styleArrayContent);
  221.         //dd($theCaseActions);
  222.         $contentType = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
  223.         $writer = new Xlsx($spreadsheet);
  224.         $response = new StreamedResponse();
  225.         $response->headers->set('Content-Type', $contentType);
  226.         $response->headers->set('Content-Disposition', 'attachment;filename="exports-'.time().'.xlsx"');
  227.         $response->setPrivate();
  228.         $response->headers->addCacheControlDirective('no-cache', true);
  229.         $response->headers->addCacheControlDirective('must-revalidate', true);
  230.         $response->setCallback(function() use ($writer) {
  231.             $writer->save('php://output');
  232.         });
  233.         return $response;
  234.     }
  235. }