src/Controller/ProgressReportController.php line 115

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\Setting;
  10. use App\Entity\User;
  11. use App\Form\ProgressReportFormType;
  12. use App\Repository\DonationRepository;
  13. use App\Repository\FilmProjectRepository;
  14. use App\Repository\RecurringDonationRepository;
  15. use App\Service\DonationService;
  16. use App\Service\UserBillingService;
  17. use App\Service\MailService;
  18. use App\Service\SettingService;
  19. use App\Service\ProgressReportService;
  20. use App\String\Constant;
  21. use Doctrine\ORM\EntityManagerInterface;
  22. use EasyCorp\Bundle\EasyAdminBundle\Config\Action;
  23. use EasyCorp\Bundle\EasyAdminBundle\Router\AdminUrlGenerator;
  24. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  25. use Symfony\Component\HttpFoundation\JsonResponse;
  26. use Symfony\Component\HttpFoundation\RedirectResponse;
  27. use Symfony\Component\HttpFoundation\Request;
  28. use Symfony\Component\HttpFoundation\Response;
  29. use Symfony\Component\Routing\Annotation\Route;
  30. use Symfony\Component\HttpFoundation\File\Exception\FileException;
  31. class ProgressReportController extends AbstractController
  32. {
  33.     public const FILE_DIRECTORY __DIR__ '/../../public/uploads/progress_reports/';  //choose the folder in which the uploaded file will be stored
  34.     #[Route('/progress-report'name'app_progress_report')]
  35.     public function index(Request $requestEntityManagerInterface $em): Response
  36.     {
  37.         $user $this->getUser();
  38.         $projectRepo $em->getRepository(FilmProject::class);
  39.         $projectId $request->get('projectId');
  40.         $filmProject $projectRepo->findOneBy(['id' => $projectId]);
  41.         if (!$filmProject) {
  42.             return $this->render('progressReport/error.html.twig', [
  43.                 'title' => 'Project doesn\'t exist.',
  44.                 'message' => 'This project doesn\'t exist. Please try again.',
  45.             ]);
  46.         }
  47.         $progressReport = (new FilmProjectProgressReport())
  48.             ->setFilmProject($filmProject)
  49.         ;
  50.         $form $this->createForm(ProgressReportFormType::class, $progressReport);
  51.         $form->handleRequest($request);
  52.         if ($form->isSubmitted() && $form->isValid()) {
  53.             $entityInstance $form->getData();
  54.             $entityInstance->setCreatedAt(new \DateTime('now'));
  55.             $entityInstance->setModifiedAt(new \DateTime('now'));
  56.             $em->persist($entityInstance); // Save data before handling file
  57.             $em->flush();
  58.             // handle files
  59.             $files $form->get('files')->getData();
  60.             foreach ($files as $file) {
  61.                 // Handle each uploaded file
  62.                 // For example, move it to a directory
  63.                 $fileName md5(uniqid()) . '.' $file->guessExtension();
  64.                 try {
  65.                     $file->move(self::FILE_DIRECTORY$fileName);
  66.                 } catch (FileException $e) {
  67.                     dd($e);
  68.                 }
  69.                 // And then we save the entity
  70.                 $progressReportFile = (new FilmProjectProgressReportFile())
  71.                     ->setFilmProjectProgressReport($entityInstance)
  72.                     // ->setFilePath(self::FILE_DIRECTORY)
  73.                     ->setFileName($fileName)
  74.                     ->setOriginalName($file->getClientOriginalName())
  75.                     ->setCreatedAt(new \DateTime('now'))
  76.                     ->setModifiedAt(new \DateTime('now'))
  77.                     // ->setStatus('completed')
  78.                 ;
  79.                 
  80.                 $em->persist($progressReportFile);
  81.             }
  82.             $em->persist($entityInstance);
  83.             $em->flush();
  84.             return $this->redirectToRoute('app_progress_report_thankyou');
  85.         }
  86.         return $this->render('progressReport/index.html.twig', [
  87.             'form' => $form->createView(),
  88.             'user' => $user,
  89.             'project' => $filmProject,
  90.         ]);
  91.     }
  92.     #[Route('/progress-report/thank-you'name'app_progress_report_thankyou')]
  93.     public function finishPage(Request $request)
  94.     {
  95.         return $this->render('donation/thankyou.html.twig');
  96.     }
  97.     #[Route('/progress-report/{currentYear}'name'app_progress_report_edit')]
  98.     public function edit(Request $requestEntityManagerInterface $emProgressReportService $progressReportServiceAdminUrlGenerator $adminUrlGeneratorSettingService $settingService$currentYear): Response
  99.     {
  100.         $projectId $request->get('projectId');
  101.         $user $this->getUser();
  102.         $progressReportRepo $em->getRepository(FilmProjectProgressReport::class);
  103.         $progressReport $progressReportRepo->findByYear((int)$currentYear$projectId);
  104.         if (!$progressReport) {
  105.             return $this->render('progressReport/error.html.twig', [
  106.                 'title' => 'Progress report doesn\'t exist.',
  107.                 'message' => 'This progress report doesn\'t exist. Please try again.',
  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.                     $em->persist($progressReportFile);
  148.                 }
  149.                 $entityInstance->setStatus('completed');
  150.                 $em->persist($entityInstance);
  151.                 $em->flush();
  152.                 $progressReportService->dispatchPersistEntity($entityInstance);
  153.                 $this->addFlash('success''Progress report has been submitted successfully.');
  154.                 // return $this->redirectToRoute('app_progress_report_thankyou');
  155.                 $filmProjectIndexUrl $adminUrlGenerator->setController(FilmProjectCrudController::class)
  156.                     ->setAction(Action::INDEX)
  157.                     ->generateUrl();
  158.                 return new RedirectResponse($filmProjectIndexUrl);
  159.             } else {
  160.                 $this->addFlash('success''This progress report has been saved to draft.');
  161.             }
  162.         }
  163.         $progressReportIntroCopy $settingService->getOptionValue('progress_report_intro_copy');
  164.         return $this->render('progressReport/edit.html.twig', [
  165.             'form' => $form->createView(),
  166.             'user' => $user,
  167.             'progressReport' => $progressReport,
  168.             'project' => $progressReport->getFilmProject(),
  169.             'progressReportIntroCopy' => $progressReportIntroCopy,
  170.         ]);
  171.     }
  172.     #[Route('/progress-report/workflow/send-email'name'app_progress_report_send_email')]
  173.     public function sendEmail(Request $requestAdminUrlGenerator $adminUrlGeneratorEntityManagerInterface $emMailService $mailService): Response
  174.     {
  175.         set_time_limit(0); // Long running task to avoid timeout
  176.         $progressReportIndexUrl $adminUrlGenerator->setController(FilmProjectProgressReportCrudController::class)
  177.             ->setAction(Action::INDEX)
  178.             ->generateUrl();
  179.         $filmProjectRepo $em->getRepository(FilmProject::class);
  180.         // For testing
  181.         // $filmProjects = $filmProjectRepo->findBy(['id' => 1]);
  182.         $filmProjects $filmProjectRepo->findActiveProjects();
  183.         foreach($filmProjects as $filmProject) {
  184.             $mailService->sendDefaultProgressReportEmail($filmProject);
  185.         }
  186.         $this->addFlash('success''Notification email(s) have been sent to project owners.');
  187.         return new RedirectResponse($progressReportIndexUrl);
  188.     }
  189.     #[Route('/progress-report/workflow/send-weekly-email'name'app_progress_report_send_weekly_email')]
  190.     public function sendWeeklyEmail(Request $requestEntityManagerInterface $emSettingService $settingServiceMailService $mailService): Response
  191.     {
  192.         $user $this->getUser();
  193.         $filmProjectRepo $em->getRepository(FilmProject::class);
  194.         $progressReportRepo $em->getRepository(FilmProjectProgressReport::class);
  195.         $filmProjects $filmProjectRepo->findBy(['wordpressStatus' => [
  196.             Constant::WP_STATUS_PUBLISH// published projects
  197.             Constant::WP_STATUS_PROTECTED// protected projects with password
  198.             Constant::WP_STATUS_PRIVATE// private or hidden projects
  199.         ]]);
  200.         $isProgressReport $settingService->getOptionValue('is_progress_report');
  201.         $progressReportStartDate $settingService->getOptionValue('progress_report_start_date');
  202.         if (!$isProgressReport || !$progressReportStartDate) { // handle empty cases
  203.             $response = new Response('Progress report is inactive.'Response::HTTP_OK);
  204.             return $response;
  205.         }
  206.         if ($isProgressReport != '1') { // handle non-empty cases
  207.             $response = new Response('Progress report is inactive.'Response::HTTP_OK);
  208.             return $response;
  209.         }
  210.         $startDate = new \DateTime($progressReportStartDate);
  211.         $startDate->modify('next Monday');
  212.         $dayOfMonth $startDate->format('j');  // Get the day of the month
  213.         $weekOfMonth ceil($dayOfMonth 7); // Determine the week of the month starting from the next week
  214.         $slug 'progress-report-notification-week-1';
  215.         switch($weekOfMonth) {
  216.             case 1
  217.                 $slug 'progress-report-notification-week-1';
  218.                 break;
  219.             case 2
  220.                 $slug 'progress-report-notification-week-2';
  221.                 break;
  222.             case 3
  223.                 $slug 'progress-report-notification-week-3';
  224.                 break;
  225.             case 4
  226.                 $slug 'progress-report-notification-week-4';
  227.                 break;
  228.             default:
  229.                 break;
  230.         }
  231.         // If more than 4 weeks, don't send emails at all
  232.         if ($weekOfMonth 4) {
  233.             $response = new Response('All autogen emails have been sent.'Response::HTTP_OK);
  234.             return $response;
  235.         }
  236.         foreach($filmProjects as $filmProject) {
  237.             $mailService->sendDefaultWeeklyProgressReportEmail($filmProject$slug);
  238.         }
  239.         
  240.         $response = new Response('Email(s) sent.'Response::HTTP_OK);
  241.         return $response;
  242.     }
  243.     #[Route('/progress-report/workflow/send-weekly-email-testing'name'app_progress_report_send_weekly_email')]
  244.     public function sendWeeklyEmailTesting(Request $requestEntityManagerInterface $emSettingService $settingServiceMailService $mailService): Response
  245.     {
  246.         $filmProjectRepo $em->getRepository(FilmProject::class);
  247.         $filmProjects $filmProjectRepo->findBy(['isProgressReportActive' => 1]);
  248.         foreach($filmProjects as $filmProject) {
  249.             $startDate = new \DateTime($filmProject->getProgressReportStartDate());
  250.             $startDate->modify('next Monday');
  251.             $dayOfMonth $startDate->format('j');  // Get the day of the month
  252.             $weekOfMonth ceil($dayOfMonth 7); // Determine the week of the month starting from the next week
  253.             $slug 'progress-report-notification-week-1';
  254.             switch($weekOfMonth) {
  255.                 case 1
  256.                     $slug 'progress-report-notification-week-1';
  257.                     break;
  258.                 case 2
  259.                     $slug 'progress-report-notification-week-2';
  260.                     break;
  261.                 case 3
  262.                     $slug 'progress-report-notification-week-3';
  263.                     break;
  264.                 case 4
  265.                     $slug 'progress-report-notification-week-4';
  266.                     break;
  267.                 default:
  268.                     break;
  269.             }
  270.             // If more than 4 weeks, don't send emails at all
  271.             if ($weekOfMonth 4) {
  272.                 $response = new Response('All autogen emails have been sent.'Response::HTTP_OK);
  273.                 return $response;
  274.             }
  275.             $mailService->sendDefaultWeeklyProgressReportEmail($filmProject$slug);
  276.         }
  277.         $response = new Response('Email(s) sent.'Response::HTTP_OK);
  278.         return $response;
  279.     }
  280.     #[Route('/admin/progress-report/workflow/cron'name'app_progress_report_cron')]
  281.     public function startProgressReport(Request $requestEntityManagerInterface $em,  ProgressReportService $progressReportServiceAdminUrlGenerator $adminUrlGeneratorSettingService $settingService): Response 
  282.     {
  283.         $progressReportIndexUrl $adminUrlGenerator->setController(FilmProjectProgressReportCrudController::class)
  284.             ->setAction(Action::INDEX)
  285.             ->generateUrl();
  286.         // Toggle on and off for is_progress_report
  287.         $progressReportService->toggleIsProgressReport();
  288.         if (!$progressReportService->checkIfProgressReportStarts()) {
  289.             // Set all active projects' isProgressReportActive to false
  290.             $filmProjectRepo $em->getRepository(FilmProject::class);
  291.             
  292.             $activeProjects $filmProjectRepo->findActiveProjectsProgressReport();
  293.             foreach ($activeProjects as $activeProject) {
  294.                 $activeProject->setIsProgressReportActive(false);
  295.                 $em->persist($activeProject);
  296.             }
  297.             $em->flush();
  298.             $this->addFlash('success''Progress report has been turned off.');
  299.             // return new Response('Progress report is turned off', Response::HTTP_OK);
  300.             return new RedirectResponse($progressReportIndexUrl);
  301.         }
  302.         $filmProjectRepo $em->getRepository(FilmProject::class);
  303.         $progressReportRepo $em->getRepository(FilmProjectProgressReport::class);
  304.         $activeProjects $filmProjectRepo->findActiveProjects();
  305.         foreach($activeProjects as $activeProject) {
  306.             $projectId $activeProject->getId();
  307.             $progressReport $progressReportRepo->findByYear((int)date("Y"), $projectId);
  308.             if ($progressReport) continue;
  309.             $progressReport = (new FilmProjectProgressReport)
  310.                 ->setFilmProject($activeProject)
  311.                 ->setCreatedAt(new \DateTime('now'))
  312.                 ->setModifiedAt(new \DateTime('now'))
  313.                 ->setStatus('created')
  314.             ;
  315.             $em->persist($progressReport);
  316.         }
  317.         $em->flush();
  318.         $todayStr date("Y-m-d H:i:s");
  319.         // set progress report start date
  320.         $settingService->setOptionValue("progress_report_start_date"$todayStr);
  321.         // $response = new Response('Progress report(s) created and sent.', Response::HTTP_OK);
  322.         // return $response;
  323.         
  324.         $this->addFlash('success''Progress report has been turned on.');
  325.         return new RedirectResponse($progressReportIndexUrl);
  326.     }
  327.     #[Route('/admin/progress-report/workflow/cron/single/{projectId}'name'app_progress_report_cron_single')]
  328.     public function startSingleProgressReport(Request $requestEntityManagerInterface $em,  ProgressReportService $progressReportServiceAdminUrlGenerator $adminUrlGeneratorSettingService $settingService$projectId): Response 
  329.     {
  330.         $progressReportIndexUrl $adminUrlGenerator->setController(FilmProjectProgressReportCrudController::class)
  331.             ->setAction(Action::INDEX)
  332.             ->generateUrl();
  333.         $filmProjectRepo $em->getRepository(FilmProject::class);
  334.         $progressReportRepo $em->getRepository(FilmProjectProgressReport::class);
  335.         $activeProject $filmProjectRepo->findOneBy(['id' => $projectId]);
  336.         
  337.         // First check if progress report status is active 
  338.         $isProgressReportActive $activeProject->isIsProgressReportActive();
  339.         if ($isProgressReportActive) {
  340.             $activeProject->setIsProgressReportActive(false); // turn off progress report status
  341.             $em->persist($activeProject);
  342.             $em->flush();
  343.             $this->addFlash('success''The progress report for project '$activeProject->getTitle() .' has been turned off.');
  344.             return new RedirectResponse($progressReportIndexUrl);
  345.         }
  346.         $activeProject
  347.             ->setIsProgressReportActive(true)
  348.             ->setProgressReportStartDate(new \DateTime('now'))
  349.         ; // turn on progress report status
  350.         $em->persist($activeProject);
  351.         $em->flush();
  352.         // Then create progress report if needed
  353.         $progressReport $progressReportRepo->findByYear((int)date("Y"), $projectId);
  354.         if ($progressReport) {
  355.             $this->addFlash('success''The progress report for project '$activeProject->getTitle() .' has been turned on.');
  356.             return new RedirectResponse($progressReportIndexUrl);
  357.         }
  358.         $progressReport = (new FilmProjectProgressReport)
  359.             ->setFilmProject($activeProject)
  360.             ->setCreatedAt(new \DateTime('now'))
  361.             ->setModifiedAt(new \DateTime('now'))
  362.             ->setStatus('created')
  363.         ;
  364.         $em->persist($progressReport);
  365.         $em->flush();
  366.         
  367.         $this->addFlash('success''The progress report for project '$activeProject->getTitle() .' has been turned on.');
  368.         return new RedirectResponse($progressReportIndexUrl);
  369.     }
  370. }