src/Controller/ProgressReportController.php line 114

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Controller\Admin\FilmProjectCrudController;
  4. use App\Controller\Admin\FilmProjectProgressReportCrudController;
  5. use App\Entity\FilmProject;
  6. use App\Entity\FilmProjectProgressReport;
  7. use App\Entity\FilmProjectProgressReportFile;
  8. use App\Entity\RecurringDonation;
  9. use App\Entity\User;
  10. use App\Form\ProgressReportFormType;
  11. use App\Repository\DonationRepository;
  12. use App\Repository\FilmProjectRepository;
  13. use App\Repository\RecurringDonationRepository;
  14. use App\Service\DonationService;
  15. use App\Service\UserBillingService;
  16. use App\Service\MailService;
  17. use App\Service\SettingService;
  18. use App\Service\ProgressReportService;
  19. use App\String\Constant;
  20. use Doctrine\ORM\EntityManagerInterface;
  21. use EasyCorp\Bundle\EasyAdminBundle\Config\Action;
  22. use EasyCorp\Bundle\EasyAdminBundle\Router\AdminUrlGenerator;
  23. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  24. use Symfony\Component\HttpFoundation\JsonResponse;
  25. use Symfony\Component\HttpFoundation\RedirectResponse;
  26. use Symfony\Component\HttpFoundation\Request;
  27. use Symfony\Component\HttpFoundation\Response;
  28. use Symfony\Component\Routing\Annotation\Route;
  29. use Symfony\Component\HttpFoundation\File\Exception\FileException;
  30. class ProgressReportController extends AbstractController
  31. {
  32.     public const FILE_DIRECTORY __DIR__ '/../../public/uploads/progress_reports/';  //choose the folder in which the uploaded file will be stored
  33.     #[Route('/progress-report'name'app_progress_report')]
  34.     public function index(Request $requestEntityManagerInterface $em): Response
  35.     {
  36.         $user $this->getUser();
  37.         $projectRepo $em->getRepository(FilmProject::class);
  38.         $projectId $request->get('projectId');
  39.         $filmProject $projectRepo->findOneBy(['id' => $projectId]);
  40.         if (!$filmProject) {
  41.             return $this->render('progressReport/error.html.twig', [
  42.                 'title' => 'Project doesn\'t exist.',
  43.                 'message' => 'This project doesn\'t exist. Please try again.',
  44.             ]);
  45.         }
  46.         $progressReport = (new FilmProjectProgressReport())
  47.             ->setFilmProject($filmProject)
  48.         ;
  49.         $form $this->createForm(ProgressReportFormType::class, $progressReport);
  50.         $form->handleRequest($request);
  51.         if ($form->isSubmitted() && $form->isValid()) {
  52.             $entityInstance $form->getData();
  53.             $entityInstance->setCreatedAt(new \DateTime('now'));
  54.             $entityInstance->setModifiedAt(new \DateTime('now'));
  55.             $em->persist($entityInstance); // Save data before handling file
  56.             $em->flush();
  57.             // handle files
  58.             $files $form->get('files')->getData();
  59.             foreach ($files as $file) {
  60.                 // Handle each uploaded file
  61.                 // For example, move it to a directory
  62.                 $fileName md5(uniqid()) . '.' $file->guessExtension();
  63.                 try {
  64.                     $file->move(self::FILE_DIRECTORY$fileName);
  65.                 } catch (FileException $e) {
  66.                     dd($e);
  67.                 }
  68.                 // And then we save the entity
  69.                 $progressReportFile = (new FilmProjectProgressReportFile())
  70.                     ->setFilmProjectProgressReport($entityInstance)
  71.                     // ->setFilePath(self::FILE_DIRECTORY)
  72.                     ->setFileName($fileName)
  73.                     ->setOriginalName($file->getClientOriginalName())
  74.                     ->setCreatedAt(new \DateTime('now'))
  75.                     ->setModifiedAt(new \DateTime('now'))
  76.                     // ->setStatus('completed')
  77.                 ;
  78.                 
  79.                 $em->persist($progressReportFile);
  80.             }
  81.             $em->persist($entityInstance);
  82.             $em->flush();
  83.             return $this->redirectToRoute('app_progress_report_thankyou');
  84.         }
  85.         return $this->render('progressReport/index.html.twig', [
  86.             'form' => $form->createView(),
  87.             'user' => $user,
  88.             'project' => $filmProject,
  89.         ]);
  90.     }
  91.     #[Route('/progress-report/thank-you'name'app_progress_report_thankyou')]
  92.     public function finishPage(Request $request)
  93.     {
  94.         return $this->render('donation/thankyou.html.twig');
  95.     }
  96.     #[Route('/progress-report/{currentYear}'name'app_progress_report_edit')]
  97.     public function edit(Request $requestEntityManagerInterface $emProgressReportService $progressReportServiceAdminUrlGenerator $adminUrlGenerator$currentYear): Response
  98.     {
  99.         $projectId $request->get('projectId');
  100.         $user $this->getUser();
  101.         $progressReportRepo $em->getRepository(FilmProjectProgressReport::class);
  102.         $progressReport $progressReportRepo->findByYear((int)$currentYear$projectId);
  103.         if (!$progressReport) {
  104.             return $this->render('progressReport/error.html.twig', [
  105.                 'title' => 'Progress report doesn\'t exist.',
  106.                 'message' => 'This progress report doesn\'t exist. Please try again.',
  107.             ]);
  108.         }
  109.         
  110.         // If opened, set status to receive
  111.         if ($progressReport->getStatus() == 'created') {
  112.             $progressReport->setStatus('received');
  113.             $em->persist($progressReport);
  114.             $em->flush();
  115.         }
  116.         $form $this->createForm(ProgressReportFormType::class, $progressReport);
  117.         $form->handleRequest($request);
  118.         if ($form->isSubmitted() && $form->isValid()) {
  119.             $entityInstance $form->getData();
  120.             $entityInstance->setModifiedAt(new \DateTime('now'));
  121.             $em->persist($entityInstance); // Save data before handling file
  122.             $em->flush();
  123.             if (!$entityInstance->isIsDraft()) {
  124.                 // $entityInstance->setCreatedAt(new \DateTime('now'));
  125.                 $entityInstance->setModifiedAt(new \DateTime('now'));
  126.                 // handle files
  127.                 $files $form->get('files')->getData();
  128.                 foreach ($files as $file) {
  129.                     // Handle each uploaded file
  130.                     // For example, move it to a directory
  131.                     $fileName md5(uniqid()) . '.' $file->guessExtension();
  132.                     try {
  133.                         $file->move(self::FILE_DIRECTORY$fileName);
  134.                     } catch (FileException $e) {
  135.                         dd($e);
  136.                     }
  137.                     // And then we save the entity
  138.                     $progressReportFile = (new FilmProjectProgressReportFile())
  139.                         ->setFilmProjectProgressReport($entityInstance)
  140.                         // ->setFilePath(self::FILE_DIRECTORY)
  141.                         ->setOriginalName($file->getClientOriginalName())
  142.                         ->setFileName($fileName)
  143.                         ->setCreatedAt(new \DateTime('now'))
  144.                         ->setModifiedAt(new \DateTime('now'))
  145.                         // ->setStatus('completed')
  146.                     ;
  147.                     
  148.                     $em->persist($progressReportFile);
  149.                 }
  150.                 $entityInstance->setStatus('completed');
  151.                 $em->persist($entityInstance);
  152.                 $em->flush();
  153.                 $progressReportService->dispatchPersistEntity($entityInstance);
  154.                 $this->addFlash('success''Progress report has been submitted successfully.');
  155.                 // return $this->redirectToRoute('app_progress_report_thankyou');
  156.                 $filmProjectIndexUrl $adminUrlGenerator->setController(FilmProjectCrudController::class)
  157.                     ->setAction(Action::INDEX)
  158.                     ->generateUrl();
  159.                 return new RedirectResponse($filmProjectIndexUrl);
  160.             } else {
  161.                 $this->addFlash('success''This progress report has been saved to draft.');
  162.             }
  163.         }
  164.         return $this->render('progressReport/edit.html.twig', [
  165.             'form' => $form->createView(),
  166.             'user' => $user,
  167.             'progressReport' => $progressReport,
  168.             'project' => $progressReport->getFilmProject(),
  169.         ]);
  170.     }
  171.     #[Route('/progress-report/workflow/send-email'name'app_progress_report_send_email')]
  172.     public function sendEmail(Request $requestEntityManagerInterface $emMailService $mailService): Response
  173.     {
  174.         $user $this->getUser();
  175.         $filmProjectRepo $em->getRepository(FilmProject::class);
  176.         $progressReportRepo $em->getRepository(FilmProjectProgressReport::class);
  177.         // For testing
  178.         $filmProjects $filmProjectRepo->findBy(['id' => 1]);
  179.         // $filmProjects = $filmProjectRepo->findBy(['wordpressStatus' => [
  180.         //     Constant::WP_STATUS_PUBLISH, // published projects
  181.         //     Constant::WP_STATUS_PROTECTED, // protected projects with password
  182.         //     Constant::WP_STATUS_PRIVATE, // private or hidden projects
  183.         // ]]);
  184.         foreach($filmProjects as $filmProject) {
  185.             $mailService->sendDefaultProgressReportEmail($filmProject);
  186.         }
  187.         
  188.         $response = new Response('Email(s) sent.'Response::HTTP_OK);
  189.         return $response;
  190.     }
  191.     #[Route('/progress-report/workflow/send-weekly-email'name'app_progress_report_send_weekly_email')]
  192.     public function sendWeeklyEmail(Request $requestEntityManagerInterface $emSettingService $settingServiceMailService $mailService): Response
  193.     {
  194.         $user $this->getUser();
  195.         $filmProjectRepo $em->getRepository(FilmProject::class);
  196.         $progressReportRepo $em->getRepository(FilmProjectProgressReport::class);
  197.         // For testing
  198.         // $filmProjects = $filmProjectRepo->findBy(['id' => 1]);
  199.         $filmProjects $filmProjectRepo->findBy(['wordpressStatus' => [
  200.             Constant::WP_STATUS_PUBLISH// published projects
  201.             Constant::WP_STATUS_PROTECTED// protected projects with password
  202.             Constant::WP_STATUS_PRIVATE// private or hidden projects
  203.         ]]);
  204.         $weeklyslug 'progress-report-notification-week-1';
  205.         foreach($filmProjects as $filmProject) {
  206.             $mailService->sendDefaultWeeklyProgressReportEmail($filmProject$weeklyslug);
  207.         }
  208.         
  209.         $response = new Response('Email(s) sent.'Response::HTTP_OK);
  210.         return $response;
  211.     }
  212.     #[Route('/admin/progress-report/workflow/cron'name'app_progress_report_cron')]
  213.     public function startProgressReport(Request $requestEntityManagerInterface $em,  ProgressReportService $progressReportServiceAdminUrlGenerator $adminUrlGeneratorSettingService $settingService): Response 
  214.     {
  215.         $progressReportIndexUrl $adminUrlGenerator->setController(FilmProjectProgressReportCrudController::class)
  216.             ->setAction(Action::INDEX)
  217.             ->generateUrl();
  218.         // Toggle on and off for is_progress_report
  219.         $progressReportService->toggleIsProgressReport();
  220.         if (!$progressReportService->checkIfProgressReportStarts()) {
  221.             $this->addFlash('success''Progress report has been turned off.');
  222.             // return new Response('Progress report is turned off', Response::HTTP_OK);
  223.             return new RedirectResponse($progressReportIndexUrl);
  224.         }
  225.         $filmProjectRepo $em->getRepository(FilmProject::class);
  226.         $progressReportRepo $em->getRepository(FilmProjectProgressReport::class);
  227.         $activeProjects $filmProjectRepo->findActiveProjects();
  228.         
  229.         foreach($activeProjects as $activeProject) {
  230.             $projectId $activeProject->getId();
  231.             $progressReport $progressReportRepo->findByYear((int)date("Y"), $projectId);
  232.             if ($progressReport) continue;
  233.             $progressReport = (new FilmProjectProgressReport)
  234.                 ->setFilmProject($activeProject)
  235.                 ->setCreatedAt(new \DateTime('now'))
  236.                 ->setModifiedAt(new \DateTime('now'))
  237.                 ->setStatus('created')
  238.             ;
  239.             $em->persist($progressReport);
  240.         }
  241.         $em->flush();
  242.         $todayStr date("Y-m-d H:i:s");
  243.         // set progress report start date
  244.         $settingService->setOptionValue("progress_report_start_date"$todayStr);
  245.         // $response = new Response('Progress report(s) created and sent.', Response::HTTP_OK);
  246.         // return $response;
  247.         
  248.         $this->addFlash('success''Progress report has been turned on.');
  249.         return new RedirectResponse($progressReportIndexUrl);
  250.     }
  251.     #[Route('/admin/progress-report/workflow/cron/single/{projectId}'name'app_progress_report_cron_single')]
  252.     public function startSingleProgressReport(Request $requestEntityManagerInterface $em,  ProgressReportService $progressReportServiceAdminUrlGenerator $adminUrlGeneratorSettingService $settingService$projectId): Response 
  253.     {
  254.         $progressReportIndexUrl $adminUrlGenerator->setController(FilmProjectProgressReportCrudController::class)
  255.             ->setAction(Action::INDEX)
  256.             ->generateUrl();
  257.         $filmProjectRepo $em->getRepository(FilmProject::class);
  258.         $progressReportRepo $em->getRepository(FilmProjectProgressReport::class);
  259.         $activeProject $filmProjectRepo->findOneBy(['id' => $projectId]);
  260.         
  261.         // First check if progress report status is active 
  262.         $isProgressReportActive $activeProject->isIsProgressReportActive();
  263.         if ($isProgressReportActive) {
  264.             $activeProject->setIsProgressReportActive(false); // turn off progress report status
  265.             $em->persist($activeProject);
  266.             $em->flush();
  267.             $this->addFlash('success''The progress report for project '$activeProject->getTitle() .' has been turned off.');
  268.             return new RedirectResponse($progressReportIndexUrl);
  269.         }
  270.         $activeProject->setIsProgressReportActive(true); // turn on progress report status
  271.         $em->persist($activeProject);
  272.         $em->flush();
  273.         // Then create progress report if needed
  274.         $progressReport $progressReportRepo->findByYear((int)date("Y"), $projectId);
  275.         if ($progressReport) {
  276.             $this->addFlash('success''The progress report for project '$activeProject->getTitle() .' has been turned on.');
  277.             return new RedirectResponse($progressReportIndexUrl);
  278.         }
  279.         $progressReport = (new FilmProjectProgressReport)
  280.             ->setFilmProject($activeProject)
  281.             ->setCreatedAt(new \DateTime('now'))
  282.             ->setModifiedAt(new \DateTime('now'))
  283.             ->setStatus('created')
  284.         ;
  285.         $em->persist($progressReport);
  286.         $em->flush();
  287.         
  288.         $this->addFlash('success''The progress report for project '$activeProject->getTitle() .' has been turned on.');
  289.         return new RedirectResponse($progressReportIndexUrl);
  290.     }
  291. }