src/Controller/ProjectController.php line 90

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\MaxTimeProject;
  4. use App\Entity\OfferPackage;
  5. use App\Entity\Project;
  6. use App\Entity\ProjectOfferPackage;
  7. use App\Entity\User;
  8. use App\Form\CallPersonToAssignTaskType;
  9. use App\Form\ChooseMonthInProjectType;
  10. use App\Form\ProjectType;
  11. use App\Form\SortProjectType;
  12. use App\Module\Slack\SlackManager;
  13. use App\Repository\MaxTimeProjectRepository;
  14. use App\Repository\ProjectOfferPackageRepository;
  15. use App\Repository\ProjectRepository;
  16. use App\Repository\TaskRepository;
  17. use App\Repository\UserRepository;
  18. use App\Service\OfferPackage\OfferPackageService;
  19. use App\Service\TimeService;
  20. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  21. use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
  22. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  23. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  24. use Symfony\Component\HttpFoundation\Request;
  25. use Symfony\Component\HttpFoundation\Response;
  26. use Symfony\Component\HttpFoundation\StreamedResponse;
  27. use Symfony\Component\Routing\Annotation\Route;
  28. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  29. /**
  30.  * Class ProjectController
  31.  *
  32.  * @package App\Controller
  33.  * @author Lukasz Krakowiak <lukasz94krakowiak@gmail.com>
  34.  * @Route("/projekt")
  35.  */
  36. class ProjectController extends AbstractController
  37. {
  38.     /**
  39.      * @var ProjectRepository
  40.      */
  41.     private ProjectRepository $projectRepository;
  42.     /**
  43.      * @var MaxTimeProjectRepository
  44.      */
  45.     private MaxTimeProjectRepository $maxTimeProjectRepository;
  46.     /**
  47.      * @var ProjectOfferPackageRepository
  48.      */
  49.     private ProjectOfferPackageRepository $projectOfferPackageRepository;
  50.     /**
  51.      * @var OfferPackageService
  52.      */
  53.     private OfferPackageService $offerPackageService;
  54.     /**
  55.      * @var TimeService
  56.      */
  57.     private TimeService $timeService;
  58.     private UrlGeneratorInterface $router;
  59.     /**
  60.      * @param ProjectRepository $projectRepository
  61.      * @param MaxTimeProjectRepository $maxTimeProjectRepository
  62.      */
  63.     public function __construct(
  64.         ProjectRepository $projectRepository,
  65.         MaxTimeProjectRepository $maxTimeProjectRepository,
  66.         ProjectOfferPackageRepository $projectOfferPackageRepository,
  67.         OfferPackageService $offerPackageService,
  68.         TimeService $timeService,
  69.         UrlGeneratorInterface $router
  70.     ) {
  71.         $this->projectRepository $projectRepository;
  72.         $this->maxTimeProjectRepository $maxTimeProjectRepository;
  73.         $this->projectOfferPackageRepository $projectOfferPackageRepository;
  74.         $this->offerPackageService $offerPackageService;
  75.         $this->timeService $timeService;
  76.         $this->router $router;
  77.     }
  78.     /**
  79.      * @Route("/", name="project_index")
  80.      */
  81.     public function index(Request $requestProjectRepository $projectRepositoryint $category Project::CATEGORY_ALLEGRO): Response
  82.     {
  83.         $leader null;
  84.         $leaderForm $this->createForm(SortProjectType::class);
  85.         $leaderForm->handleRequest($request);
  86.         if ($leaderForm->isSubmitted() && $leaderForm->isValid()) {
  87.             $leader $leaderForm->get('leader')->getData();
  88.         }
  89.         return $this->render('project/index.html.twig', [
  90.             'projects' => $projectRepository->getProjectListByUser($this->getUser(), false, [
  91.                 "id" => $request->get('id') ?? null,
  92.                 "name" => $request->get('nazwa') ?? null,
  93.                 "leader" => $leader,
  94.                 "list" => true,
  95.                 "category" => $category,
  96.             ]),
  97.             'leaderForm' => $leaderForm->createView(),
  98.         ]);
  99.     }
  100.     /**
  101.      * @Route("/seo", name="project_seo")
  102.      */
  103.     public function projectSeo(Request $requestProjectRepository $projectRepository): Response
  104.     {
  105.         $this->denyAccessUnlessGranted('CAN_SHOW_LIST'null);
  106.         return $this->index($request$projectRepositoryProject::CATEGORY_SEO);
  107.     }
  108.     /**
  109.      * @Route("/fb", name="project_fb")
  110.      */
  111.     public function projectFb(Request $requestProjectRepository $projectRepository): Response
  112.     {
  113.         $this->denyAccessUnlessGranted('CAN_SHOW_LIST'null);
  114.         return $this->index($request$projectRepositoryProject::CATEGORY_FB_ADS);
  115.     }
  116.     /**
  117.      * @Route("/google", name="project_google")
  118.      */
  119.     public function projectGoogle(Request $requestProjectRepository $projectRepository): Response
  120.     {
  121.         $this->denyAccessUnlessGranted('CAN_SHOW_LIST'null);
  122.         return $this->index($request$projectRepositoryProject::CATEGORY_GOOGLE_ADS);
  123.     }
  124.     /**
  125.      * @Route("/emag", name="project_emag")
  126.      */
  127.     public function projectEmag(Request $requestProjectRepository $projectRepository): Response
  128.     {
  129.         $this->denyAccessUnlessGranted('CAN_SHOW_LIST'null);
  130.         return $this->index($request$projectRepositoryProject::CATEGORY_EMAG);
  131.     }
  132.     /**
  133.      * @Route("/pobierz", name="project_download")
  134.      */
  135.     public function download()
  136.     {
  137.         if ($this->isGranted("ROLE_CLIENT")) {
  138.             $this->addFlash("error""Brak dostępu");
  139.             return $this->redirectToRoute('dashboard');
  140.         }
  141.         $data $this->projectRepository->findAll();
  142.         $arr = [];
  143.         $i 0;
  144.         /** @var Project $val */
  145.         foreach ($data as $val) {
  146.             $arr[] = [
  147.                 $val->getName(),
  148.                 $val->getOfferPackage() ? $val->getOfferPackage()->getName() : "Brak pakietu",
  149.                 $val->getLeader() ? $val->getLeader()->getName() : "Brak opiekuna",
  150.                 $val->getType() == "Aktywny" "Nie aktywny",
  151.             ];
  152.         }
  153.         $spreadsheet = new Spreadsheet();
  154.         $spreadsheet->getActiveSheet()->fromArray($arr);
  155.         $writer = new Xlsx($spreadsheet);
  156.         $response = new StreamedResponse(
  157.             function () use ($writer) {
  158.                 $writer->save('php://output');
  159.             }
  160.         );
  161.         $response->headers->set('Content-Type''application/vnd.ms-excel');
  162.         $response->headers->set('Content-Disposition''attachment;filename="projekty.xlsx"');
  163.         $response->headers->set('Cache-Control''max-age=0');
  164.         return $response;
  165.     }
  166.     private function getExcludedPrice(ProjectOfferPackage $projectOfferPackage)
  167.     {
  168.         $tasks $projectOfferPackage->getOfferPackage()->getOfferPackageTasks();
  169.         $currentTime 0;
  170.         foreach ($tasks as $task) {
  171.             $data $projectOfferPackage->getData();
  172.             if (isset($data[$task->getId()])
  173.                 && isset($data[$task->getId()]['time'])) {
  174.                 $currentTime += (float)$data[$task->getId()]['time'];
  175.             }
  176.         }
  177.         $time $currentTime - ($projectOfferPackage->getOfferPackage()->getMaxExcludedTime() * 60);
  178.         if ($time <= 0) {
  179.             return 0;
  180.         }
  181.         return $time;
  182.     }
  183.     /**
  184.      * @Route("/pokaz/{project}", name="project_show")
  185.      */
  186.     public function show(Request $requestProject $projectTaskRepository $taskRepositorySlackManager $slackManagerUserRepository $userRepository): Response
  187.     {
  188.         $this->denyAccessUnlessGranted('CAN_SHOW_PROJECT'$project);
  189.         $month = new \DateTime();
  190.         $monthForm $this->createForm(ChooseMonthInProjectType::class);
  191.         $monthForm->handleRequest($request);
  192.         $defaultDateFrom = new \DateTime("midnight first day of this month");
  193.         $defaultDateTo = new \DateTime("last day of this month");
  194.         /** @var ProjectOfferPackage $projectOfferPackage */
  195.         $projectOfferPackage $this->projectOfferPackageRepository
  196.             ->getProjectOfferPackageInMonth($project$month);
  197.         if ($monthForm->isSubmitted() && $monthForm->isValid()) {
  198.             $month $monthForm->get('month')->getData();
  199.             $startDate = clone $month;
  200.             $endDate = clone $month;
  201.             $defaultDateFrom $startDate->modify("midnight first day of this month");
  202.             $defaultDateTo $endDate->modify("last day of this month 23:59");
  203.         }
  204.         $notPackageTime $this->timeService->getTimeFormatFromNumber($this->timeService->getSumReportTime($defaultDateFrom$defaultDateTo$project), $this->isGranted("ROLE_CLIENT"), $this->getUser()->getTimeMultiplier());
  205.         $price = (($this->timeService->getSumReportTime($defaultDateFrom$defaultDateTo$project) + ($projectOfferPackage $this->getExcludedPrice($projectOfferPackage) : 0)) / 60) * $project->getPrice();
  206.         $form $this->createForm(CallPersonToAssignTaskType::class);
  207.         $form->handleRequest($request);
  208.         if ($form->isSubmitted() && $form->isValid()) {
  209.             /** @var User $userCall */
  210.             $userCall $form->get('user')->getData();
  211.             $slackManager->write(
  212.                 "<@".($userCall->getSlackChannelId() ?? $userCall->getName())."> - <@".($this->getUser()->getSlackChannelId() ?? $this->getUser()->getName())."> chce abyś przypisał(a) swoje zadania w projekcie: "."<https://czas.qsell.pl".$this->router->generate("project_show", ["project" => $project->getId()])."|".$project->getName().">",
  213.                 $project->getSlackChannelId()
  214.             );
  215.             return $this->redirectToRoute('project_show', ["project" => $project->getId()]);
  216.         }
  217.         return $this->render('project/show.html.twig', [
  218.             'project' => $project,
  219.             'monthForm' => $monthForm->createView(),
  220.             'month' => $month,
  221.             'percentage' => $this->offerPackageService->completedPercentageOfferTask($project$month),
  222.             'offerPackage' => $projectOfferPackage $projectOfferPackage->getOfferPackage() : null,
  223.             'notPackageTime' => $notPackageTime,
  224.             'callForm' => $form->createView(),
  225.             'priceNotPackageTime' => round($price2),
  226.             'countAssignedTask' => $this->offerPackageService->countAssignedTask($project$month),
  227.             'employee' => $userRepository->getUserByRole("ROLE_EMPLOYER")
  228.         ]);
  229.     }
  230.     /**
  231.      * @IsGranted("ROLE_ADMIN")
  232.      * @Route("/nowy", name="project_new", methods={"GET","POST"})
  233.      */
  234.     public function new(Request $request): Response
  235.     {
  236.         $project = new Project();
  237.         $form $this->createForm(ProjectType::class, $project);
  238.         $form->handleRequest($request);
  239.         if ($form->isSubmitted() && $form->isValid()) {
  240.             $this->projectRepository->save($project);
  241.             $projectOfferPackage = new ProjectOfferPackage();
  242.             $projectOfferPackage->setProject($project)
  243.                 ->setMonth(new \DateTime())
  244.                 ->setOfferPackage($project->getOfferPackage());
  245.             $this->projectOfferPackageRepository->save($projectOfferPackage);
  246.             return $this->redirectToRoute('project_index');
  247.         }
  248.         return $this->renderForm('project/new.html.twig', [
  249.             'project' => $project,
  250.             'form' => $form,
  251.         ]);
  252.     }
  253.     /**
  254.      * @IsGranted("ROLE_ADMIN")
  255.      * @Route("/{id}/edytuj", name="project_edit", methods={"GET","POST"})
  256.      */
  257.     public function edit(Request $requestProject $project): Response
  258.     {
  259.         $offer $project->getOfferPackage();
  260.         /** @var MaxTimeProject $limit */
  261.         $limit $this->maxTimeProjectRepository->getMaxTimeInCurrentMonth($project);
  262.         $form $this->createForm(ProjectType::class, $project, [
  263.             'limit' => $limit $limit->getHourLimit() : 0,
  264.         ]);
  265.         $form->handleRequest($request);
  266.         if ($form->isSubmitted() && $form->isValid()) {
  267.             if ($form->get("deactivate")->isClicked()) {
  268.                 $project->setType(Project::TYPE_DEACTIVATE);
  269.                 $this->projectRepository->save($project);
  270.                 return $this->redirectToRoute('project_index', [], Response::HTTP_SEE_OTHER);
  271.             }
  272.             $this->projectRepository->save($project);
  273.             if ($project->getProjectOfferPackages()->count() == 0) {
  274.                 $projectOfferPackage = new ProjectOfferPackage();
  275.                 $projectOfferPackage->setProject($project)
  276.                     ->setMonth(new \DateTime())
  277.                     ->setOfferPackage($project->getOfferPackage());
  278.                 $this->projectOfferPackageRepository->save($projectOfferPackage);
  279.             } elseif ($offer !== $project->getOfferPackage()) {
  280.                 $projectOfferPackage $this->projectOfferPackageRepository
  281.                     ->getProjectOfferPackageInCurrentMonth($project)
  282.                     ->setOfferPackage($project->getOfferPackage());
  283.                 $this->projectOfferPackageRepository->save($projectOfferPackage);
  284.             }
  285.             return $this->redirectToRoute('project_index', [], Response::HTTP_SEE_OTHER);
  286.         }
  287.         return $this->renderForm('project/edit.html.twig', [
  288.             'project' => $project,
  289.             'form' => $form,
  290.         ]);
  291.     }
  292.     /**
  293.      * @IsGranted("ROLE_ADMIN")
  294.      * @Route("/{id}/delete", name="project_delete", methods={"GET"})
  295.      */
  296.     public function delete(Request $requestProject $project): Response
  297.     {
  298.         $entityManager $this->getDoctrine()->getManager();
  299.         $entityManager->remove($project);
  300.         $entityManager->flush();
  301.         return $this->redirectToRoute('project_index');
  302.     }
  303.     /**
  304.      * @IsGranted("ROLE_ADMIN")
  305.      * @Route("/{id}/dezaktywacja", name="project_deactive", methods={"GET"})
  306.      */
  307.     public function deactivate(Request $requestProject $project): Response
  308.     {
  309.         $project->setType(Project::TYPE_DEACTIVATE);
  310.         $this->projectRepository->save($project);
  311.         return $this->redirectToRoute('project_index');
  312.     }
  313.     /**
  314.      * @IsGranted("ROLE_ADMIN")
  315.      * @Route("/{id}/aktywacja", name="project_active", methods={"GET"})
  316.      */
  317.     public function activate(Request $requestProject $project): Response
  318.     {
  319.         $project->setType(Project::TYPE_ACTIVE);
  320.         $this->projectRepository->save($project);
  321.         return $this->redirectToRoute('project_index');
  322.     }
  323. }