src/Controller/ProjectManagement/ProjectManagementController.php line 42

Open in your IDE?
  1. <?php
  2. namespace App\Controller\ProjectManagement;
  3. use App\Entity\Vendor;
  4. use App\Form\ProjectManagement\VendorType;
  5. use App\Repository\DepartmentRepository;
  6. use App\Repository\ProjectRepository;
  7. use App\Repository\TimeSpentRepository;
  8. use App\Repository\TaskRepository;
  9. use App\Repository\UserRepository;
  10. use App\Repository\VendorRepository;
  11. use App\Service\CurrencyService;
  12. use App\Entity\Client;
  13. use App\Repository\ClientRepository;
  14. use App\Form\ProjectManagement\ClientType;
  15. use App\Repository\IndustryClassificationRepository;
  16. use App\Repository\ProjectClassificationRepository;
  17. use App\Service\GoogleDriveService;
  18. use App\Service\ProjectService;
  19. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  20. use Symfony\Component\HttpFoundation\JsonResponse;
  21. use Symfony\Component\HttpFoundation\Request;
  22. use Symfony\Component\HttpFoundation\Response;
  23. use Symfony\Component\Routing\Annotation\Route;
  24. use Symfony\Contracts\Translation\TranslatorInterface;
  25. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  26. use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
  27. use Symfony\Component\HttpFoundation\RedirectResponse;
  28. class ProjectManagementController extends AbstractController
  29. {
  30.     /**
  31.      * @param ClientRepository $clientRepository
  32.      * @param ProjectRepository $projectRepository
  33.      * @param DepartmentRepository $departmentRepository
  34.      * @param TaskRepository $taskRepository
  35.      * @param Request $request
  36.      * @return Response
  37.      */
  38.     #[Route(path'/project-management'name'project_management')]
  39.     public function projectManagement(ProjectRepository $projectRepositoryClientRepository $clientRepositoryTaskRepository $taskRepositoryDepartmentRepository $departmentRepositoryRequest $requestIndustryClassificationRepository $industryClassificationRepositoryProjectClassificationRepository $projectClassificationRepository): Response
  40.     {
  41.         $user $this->getUser();
  42.         $page  intval($request->query->get('page'));
  43.         $limit intval($request->query->get('limit'));
  44.         if ($limit === 0) {
  45.             $limit 20;
  46.         }
  47.         $keyword $request->get('keyword');
  48.         $order $request->get('order');
  49.         $orderBy $request->get('orderBy');
  50.         $startDate $request->get('startDate');
  51.         $endDate $request->get('endDate');
  52.         $client $request->get('client');
  53.         $project $request->get('project');
  54.         $task $request->get('task');
  55.         $status $request->get('status');
  56.         $type $request->get('type');
  57.         $department $user->getDepartment()->getId();
  58.         $assignedUser count(array_intersect(['ROLE_FINANCE''ROLE_HR''ROLE_MANAGEMENT'], $user->getRoles())) > null $user->getId();
  59.         $assignedDepartment =  count(array_intersect(['ROLE_FINANCE''ROLE_HR''ROLE_MANAGEMENT'], $user->getRoles())) > null $user->getDepartment()->getId();
  60.         $clientsList $clientRepository->findByPage($page$limit$keyword$order$orderBy$department$assignedUser);
  61.         $projectsList $projectRepository->findByPage($page$limit$keyword$order$orderBy$startDate$endDate$type$client$status$project$department$assignedUser);
  62.         $departmentList $departmentRepository->findAll();
  63.         $taskList $taskRepository->findSummaryByPage($page$limit$keyword$order$orderBy$user$task$assignedDepartment);
  64.         $totalProject $projectRepository->getTotalProjectByEmployee($user);
  65.         $industryClassification $industryClassificationRepository->findAll();
  66.         $projectClassification $projectClassificationRepository->findAll();
  67.         return $this->render('private/project-management/project-management.html.twig', [
  68.             'user' => $user,
  69.             'totalProject' => $totalProject,
  70.             'clientList' => $clientsList,
  71.             'projectList' => $projectsList,
  72.             'departmentList' => $departmentList,
  73.             'taskList' => $taskList,
  74.             'industryClassification' => $industryClassification,
  75.             'projectClassification' => $projectClassification
  76.         ]);
  77.     }
  78.     /**
  79.      * @param UserRepository $userRepository
  80.      * @param Request $request
  81.      * @throws \PhpOffice\PhpSpreadsheet\Exception
  82.      * @throws \PhpOffice\PhpSpreadsheet\Writer\Exception
  83.      */
  84.     #[Route(path'/employee-task/export-summary'name'export_employee_task_summary')]
  85.     public function exportEmployeeSummary(UserRepository $userRepositoryRequest $request)
  86.     {
  87.         $page  intval($request->query->get('page') - 1);
  88.         if($page 0$page =0;
  89.         $limit intval($request->query->get('limit'));
  90.         if ($limit === 0$limit 1000000;
  91.         $keyword $request->get('keyword');
  92.         $order $request->get('order');
  93.         $orderBy $request->get('orderBy');
  94.         $waitForPage $request->query->get('waitForPage');
  95.         $waitForPage === null $result['waitForPage'] = 'false' $result['waitForPage'] = $waitForPage;
  96.         $office $request->get('office');
  97.         $startDate $request->get('startDate');
  98.         $endDate $request->get('endDate');
  99.         $department $request->get('department');
  100.         $employeeSummaryList $userRepository->findEmployeeTaskSummaryByPage($page$limit$keyword$order$orderBy$department$office$startDate$endDate);
  101. //        dd($employeeSummaryList);
  102.         $spreadsheet = new Spreadsheet();
  103.         $sheet $spreadsheet->getActiveSheet();
  104.         $sheet->setCellValue('A1''Employee');
  105.         $sheet->setCellValue('B1''Department');
  106.         $sheet->setCellValue('C1''Total Project');
  107.         $sheet->setCellValue('D1''Total Hours');
  108.         $sheet->setCellValue('E1''COST');
  109.         $filename 'Employees' date('Y-m-d') . '.xlsx';
  110.         for($i =0$i sizeof($employeeSummaryList); $i++){
  111.             $row $sheet->getHighestRow()+1;
  112.             $sheet->insertNewRowBefore($row);
  113.             $sheet->setCellValue('A'.$row$employeeSummaryList[$i]['fullName']);
  114.             $sheet->setCellValue('B'.$row$employeeSummaryList[$i]['department']);
  115.             $sheet->setCellValue('C'.$row$employeeSummaryList[$i]['projects']);
  116.             $sheet->setCellValue('D'.$row$employeeSummaryList[$i]['hours']);
  117.             $sheet->setCellValue('E'.$row$employeeSummaryList[$i]['cost']);
  118.         }
  119.         $writer = new Xlsx($spreadsheet);
  120.         $writer->save($filename);
  121.         // Set the content-type:
  122.         header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
  123.         header('Content-Length: ' filesize($filename));
  124.         readfile($filename); // send file
  125.         unlink($filename); // delete file
  126.         exit;
  127.     }
  128.     /**
  129.      * @param UserRepository $userRepository
  130.      * @param Request $request
  131.      * @return Response
  132.      */
  133.     #[Route(path'/ajax/employee-task/summary'name'ajax_employee_task_summary')]
  134.     public function ajaxListEmployeeTaskSummary(UserRepository $userRepositoryRequest $request): Response
  135.     {
  136.         // Example params:
  137.         // ?office=1&startDate=2022-05-22&endDate=2022-05-26&department=1&keyword=&order=asc
  138.         $user $this->getUser();
  139.         $page  intval($request->query->get('page') - 1);
  140.         if($page 0$page =0;
  141.         $limit intval($request->query->get('limit'));
  142.         if ($limit === 0$limit 20;
  143.         $keyword $request->get('keyword');
  144.         $order $request->get('order');
  145.         $orderBy $request->get('orderBy');
  146.         $waitForPage $request->query->get('waitForPage');
  147.         $waitForPage === null $result['waitForPage'] = 'false' $result['waitForPage'] = $waitForPage;
  148.         $office $request->get('office');
  149.         $startDate $request->get('startDate');
  150.         $endDate $request->get('endDate');
  151.         $department $request->get('department');
  152.         $employeeSummaryList $userRepository->findEmployeeTaskSummaryByPage($user->assignedCompany(), $page$limit$keyword$order$orderBy$department$office$startDate$endDate);
  153.         $total $userRepository->countEmployeeTaskSummary($user->assignedCompany(), $keyword$department$office$startDate$endDate);
  154.         $body $this->renderView('private/project-management/employee/components/list-employee.html.twig', [
  155.             'employeeList' => $employeeSummaryList
  156.         ]);
  157.         $result['content'] = [
  158.             'html' => $body,
  159.             'total' => $total
  160.         ];
  161.         $result['status'] = 'OK';
  162.         return new JsonResponse($result);
  163.     }
  164.     /**
  165.      * @param Request $request
  166.      * @param ProjectRepository $projectRepository
  167.      * @param TimeSpentRepository $timeSpentRepository
  168.      * @param UserRepository $userRepository
  169.      * @param TranslatorInterface $translator
  170.      * @param Request $request
  171.      * @param UploadService $uploadService
  172.      * @param LogService $log
  173.      * @return Response
  174.      */
  175.     #[Route(path'/ajax/employee-task/time-record'name'ajax_project_employee_time_record')]
  176.     public function ajaxProjectEmployeeTimeRecord(Request $requestTimeSpentRepository $timeSpentRepositoryProjectRepository $projectRepositoryUserRepository $userRepositoryTranslatorInterface $translator): Response
  177.     {
  178.         $_id intval($request->get('projectId'));
  179.         $project $projectRepository->find($_id);
  180.         if (!$project) {
  181.             $result['status'] = 'OK';
  182.             return new JsonResponse($result);
  183.         };
  184.         $employeeTimeRecords $timeSpentRepository->getEmployeeTimeRecord($_id);
  185.         $totalTasks $timeSpentRepository->getTotalTasks($_id);
  186.         $totalHours $timeSpentRepository->getTotalHours($_id);
  187.         $totalHoursAll 0;
  188.         $totalCostAll 0;
  189.         $departments $timeSpentRepository->getDepartmentsForProject($_id$project->getStartDate(), $project->getEndDate());
  190.         for ($i 0$i sizeof($departments); $i++) {
  191.             $startDate $project->getStartDate() ? $project->getStartDate()->format('Y-m-d') : $project->getCreatedAt()->format('Y-m-d');
  192.             $endDate $project->getEndDate() ? $project->getEndDate()->format('Y-m-d') : null;
  193.             $employeeSummaryList $userRepository->findTaskSummary($_id$departments[$i]['id'], $startDate$endDate);
  194.             
  195.             $i2 0;
  196.             /*foreach($employeeSummaryList as $employee){
  197.                 $projectMember = $project->getProjectMember($employee['id']);
  198.                 $employeeSummaryList[$i2]['hourly'] = $projectMember->getUser()->getHourlyRateUsd();
  199.                 $i2++;
  200.             }*/
  201.            
  202.             $departments[$i]['employeeSummaryList'] = $employeeSummaryList;
  203.             $tmpHours 0;
  204.             $tmpCost 0;
  205.             for ($j 0$j sizeof($employeeSummaryList); $j++) {
  206.                 $tmpHours $tmpHours $employeeSummaryList[$j]['hours'];
  207.                 $tmpCost $tmpCost $employeeSummaryList[$j]['cost'];
  208.             }
  209.             //$totalManpowerCost += $tmpCost;
  210.             $departments[$i]['totalCost'] = $tmpCost;
  211.             $departments[$i]['totalHours'] = $tmpHours;
  212.         }
  213.         if (count($departments) > 0){
  214.             foreach($departments as $department){
  215.                 $totalHoursAll += $department['totalHours'];
  216.                 $totalCostAll += $department['totalCost'];
  217.             }
  218.         }
  219.         $body $this->renderView('private/project-management/employee/components/list-employee-time-record.html.twig', [
  220.             'timeRecordsByDepartments' => $departments
  221.         ]);
  222.         $result['content'] = [
  223.             'html' => $body,
  224.         ];
  225.         $result['status'] = 'OK';
  226.    
  227.         return new JsonResponse($result);
  228.     }
  229.     /**
  230.      * @param TaskRepository $taskRepository
  231.      * @param Request $request
  232.      * @return Response
  233.      */
  234.     #[Route(path'/ajax/task/summary'name'ajax_task_summary')]
  235.     public function ajaxListTaskSummary(TaskRepository $taskRepositoryRequest $request): Response
  236.     {
  237.         // Example params:
  238.         // page=0&limit=25&keyword=&orderBy=task&order=asc&waitForPage=true&user=1&task=1
  239.         $page  intval($request->query->get('page'));
  240.         $limit intval($request->query->get('limit'))  ;
  241.         if ($limit === 0$limit 20;
  242.         $keyword $request->get('keyword');
  243.         $order $request->get('order');
  244.         $orderBy $request->get('orderBy');
  245.         $waitForPage $request->query->get('waitForPage');
  246.         $waitForPage === null $result['waitForPage'] = 'false' $result['waitForPage'] = $waitForPage;
  247.         $user $request->get('user');
  248.         $task $request->get('task');
  249.         $timeSpentsList $taskRepository->findSummaryByPage($page$limit$keyword$order$orderBy$user$task);
  250.         $body $this->renderView('private/project-management/time-spent/list-time-spent.html.twig', [
  251.             'timeSpentList' => $timeSpentsList
  252.         ]);
  253.         $result['content'] = [
  254.             'html' => $body,
  255.             'empty' => $timeSpentsList == null true false
  256.         ];
  257.         $result['status'] = 'OK';
  258.         return new JsonResponse($result);
  259.     }
  260.     #[Route(path'/debug/currency'name'debug_currency')]
  261.     public function debugCurrency(CurrencyService $currencyHistoryService ) :Response{
  262.         // TODO remove this later when service in use already and this not needed
  263.         $date '2022-06-01';
  264.         $to_ccy 'SGD';
  265.         $from_ccy 'USD';
  266.         $amount '1025.44';
  267.         $converted $currencyHistoryService->convertAtDate($date$from_ccy$to_ccy$amount);
  268.         return new Response($converted);
  269.     }
  270.     #[Route(path'/report/employee/{_target}'defaults: ['_target' => ''], name'report_employee_project')]
  271.     public function reportEmployeeProject(string $_targetRequest $requestTaskRepository $taskRepositoryGoogleDriveService $googleDriveService)
  272.     {
  273.         $baseurl $request->getScheme() . '://' $request->getHttpHost() . $request->getBasePath();
  274.         $start $request->get('start');
  275.         $end $request->get('end');
  276.         $keyword $request->get('keyword');
  277.         $user $this->getUser();
  278.         $userRoles $user->getRoles();
  279.         $start $request->get('start');
  280.         $end $request->get('end');
  281.         $start str_replace('/''-'$start);
  282.         $start date('Y-m-d'strtotime($start));
  283.         $startRange date('d-M-Y'strtotime($start));
  284.         $end str_replace('/''-'$end);
  285.         $end date('Y-m-d'strtotime($end));
  286.         $endRange date('d-M-Y'strtotime($end));
  287.         $baseurl $request->getScheme() . '://' $request->getHttpHost() . $request->getBasePath();
  288.         $user $this->getUser();
  289.         $userRoles $user->getRoles();
  290.         $company $user->assignedCompany();
  291.         $spreadsheet = new Spreadsheet();
  292.         $sheet $spreadsheet->getActiveSheet();
  293.         $sheet->setCellValue('A1''Today\'s Date');
  294.         $sheet->setCellValue('A2''From');
  295.         $sheet->setCellValue('A3''To');
  296.         $sheet->setCellValue('B1'date('d-M-Y'));
  297.         $sheet->setCellValue('B2'$startRange);
  298.         $sheet->setCellValue('B3'$endRange);
  299.         $sheet->setCellValue('A5''Employee Name');
  300.         $sheet->setCellValue('B5''Employee Status');
  301.         $sheet->setCellValue('C5''Project Type');
  302.         $sheet->setCellValue('D5''Client Name');
  303.         $sheet->setCellValue('E5''Project Name');
  304.         $sheet->setCellValue('F5''Project Status');
  305.         $sheet->setCellValue('G5''Project Start date');
  306.         $sheet->setCellValue('H5''Project End date');
  307.         $sheet->setCellValue('I5''Employee Hours');
  308.         $sheet->setCellValue('J5''Total Revenue');
  309.         $sheet->setCellValue('K5''Total Cost');
  310.         $sheet->setCellValue('L5''Total Profit');
  311.         $lastCol 'L';
  312.         $sheet->getDefaultColumnDimension()->setWidth(25);
  313.         $sheet->getColumnDimension('E')->setWidth(42);
  314.         $sheet->getStyle("A1:B3")->getFont()->setBold(true);
  315.         $sheet->getStyle("A5:".$lastCol."5")->getFont()->setBold(true);
  316.         $sheet->getStyle("A5:".$lastCol."5")->getFont()->getColor()->setARGB(\PhpOffice\PhpSpreadsheet\Style\Color::COLOR_WHITE);
  317.         $sheet->getStyle("A5:".$lastCol."5")->getFill()->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)->getStartColor()->setARGB('00000000');
  318.         $sheet->getStyle("A6:".$lastCol."6")->getFont()->setBold(false);
  319.         $sheet->getStyle("A6:".$lastCol."6")->getAlignment()->setWrapText(true);
  320.         $sheet->getStyle("A6:".$lastCol."6")->getAlignment()->setVertical(\PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_TOP);
  321.         $filename "Employee_Report";
  322.         $filename .= $start "_" urlencode($start) : "";
  323.         $filename .= $end "-" urlencode($end) : "";
  324.         $filename .= $keyword "_" urlencode($keyword) : "";
  325.         $filename .= ($start && $end) ? '.xlsx' "_" date('Y-m-d') . '.xlsx';
  326.         /*        
  327.         $projects = $projectRepository->findByPage(0, 9999, $keyword, 'ASC', 'generatedId', $start, $end, '', 0, null, 0, null, null, null, false, 0, null, null, null);
  328.         
  329.         $row = $sheet->getHighestRow();
  330.         foreach($projects as $project){
  331.             $projectMembers = $project[0]->getProjectMembers();
  332.             foreach($projectMembers as $member){
  333.                 // if($project['type'] == 'CONFIRMED' || $project['type'] == 'LEAD'){
  334.                     $memberName = $member->getUser()->getPersonalInfo()->getFullName();
  335.                     $sheet->setCellValue('A' . $row, $memberName);
  336.                     $sheet->setCellValue('B' . $row, $member->getUser()->getIsActive() ? 'Active' : 'Deactivated');
  337.                     $sheet->setCellValue('C' . $row, $project['type']);
  338.                     $sheet->setCellValue('D' . $row, $project['clientName']);
  339.                     $sheet->setCellValue('E' . $row, $project['fullName']);
  340.                     $sheet->setCellValue('F' . $row, $project[0]->actualStatus() ?: '-');
  341.                     $sheet->setCellValue('G'. $row, $project['startDate'] ? $project['startDate']->format('Y-m-d') : '-');
  342.                     $sheet->setCellValue('H'. $row, $project['endDate'] ? $project['endDate']->format('Y-m-d') : '-');
  343.                     $sheet->setCellValue('I'. $row, $member->getUser()->getTotalHoursByProject($project['name']) ?: '-');
  344.                     $sheet->setCellValue('J'. $row, $project[0]->getPlannedRevenueUsd() ?: '-');
  345.                     $totalCost = $project['type'] == 'CONFIRMED' ? $project[0]->getProjectCost() : $project[0]->getProjectEstimatedCostUsd();
  346.                     $totalProfit = $project['type'] == 'CONFIRMED' ? $project[0]->getProjectProfit1() : $project[0]->getEstimatedProfitUsd();
  347.                     $sheet->setCellValue('K'. $row, $totalCost ?: '-');
  348.                     $sheet->setCellValue('L'. $row, $totalProfit ?: '-');
  349.                     $row++;
  350.                 // }
  351.             }
  352.         }
  353.         $sheet->getStyle('I5:'.$lastCol.$sheet->getHighestRow())->getNumberFormat()->setFormatCode(\PhpOffice\PhpSpreadsheet\Style\NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED2);
  354.         */
  355.         $tasks $taskRepository->findByRangeGroupByPerson($start$end);
  356.         $row $sheet->getHighestRow();
  357.         foreach($tasks as $task){
  358.             $user $task[0]->getUser();
  359.             $personalInfo $user->getPersonalInfo();
  360.             $project $task[0]->getProject();
  361.             $sheet->setCellValue('A' $row$personalInfo->getFullName());
  362.             $sheet->setCellValue('B' $row$user->getIsActive() ? 'Active' 'Deactivated');
  363.             $sheet->setCellValue('C' $row$project->getType());
  364.             $sheet->setCellValue('D' $row$project->getClient()->getName());
  365.             $sheet->setCellValue('E' $row$project->fullName());
  366.             $sheet->setCellValue('F' $row$project->actualStatus() ?: '-');
  367.             $sheet->setCellValue('G'$row$project->getStartDate() ? $project->getStartDate()->format('Y-m-d') : '-');
  368.             $sheet->setCellValue('H'$row$project->getEndDate() ? $project->getEndDate()->format('Y-m-d') : '-');
  369.             $sheet->setCellValue('I'$row$task['hours'] ?: '-');
  370.             $sheet->setCellValue('J'$row$project->getPlannedRevenueUsd() ?: '-');
  371.             $totalCost $project->getType() == 'CONFIRMED' $project->getProjectCost() : $project->getProjectEstimatedCostUsd();
  372.             $totalProfit $project->getType() == 'CONFIRMED' $project->getProjectProfit1() : $project->getEstimatedProfitUsd();
  373.             $sheet->setCellValue('K'$row$totalCost ?: '-');
  374.             $sheet->setCellValue('L'$row$totalProfit ?: '-');
  375.             $row++;
  376.         }
  377.         // $sheet->getStyle('J5:'.$lastCol.$sheet->getHighestRow())->getNumberFormat()->setFormatCode(\PhpOffice\PhpSpreadsheet\Style\NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED2);
  378.         
  379.         $sheet->getStyle('J5:'.$lastCol.$sheet->getHighestRow())->getNumberFormat()->setFormatCode('#,##0.00;(#,##0.00)');
  380.         $sheet->setAutoFilter('A5:'.$lastCol.$sheet->getHighestRow());
  381.         $writer = new Xlsx($spreadsheet);
  382.         $writer->save($filename);
  383.         if($_target == 'google'){
  384.             $gsheetURL $googleDriveService->uploadToGoogleDrive($filename);
  385.             if($gsheetURL){
  386.                 unlink($filename);
  387.                 return new RedirectResponse($gsheetURL302);
  388.             }
  389.         }else{
  390.             $response = new Response();
  391.             $response->headers->set('Content-type''application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
  392.             $response->headers->set('Content-Disposition'sprintf('attachment; filename="%s"'$filename));
  393.             $response->setContent(file_get_contents($filename));
  394.             $response->setStatusCode(\Symfony\Component\HttpFoundation\Response::HTTP_OK);
  395.             $response->headers->set('Content-Transfer-Encoding''binary');
  396.             $response->headers->set('Pragma''no-cache');
  397.             $response->headers->set('Expires''0');
  398.             unlink($filename);
  399.             return $response;
  400.             exit;
  401.         } 
  402.     }
  403. }