src/Controller/Admin/FilmProjectProgressReportCrudController.php line 273

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Admin;
  3. use App\Entity\FilmProjectProgressReport;
  4. use App\String\Constant;
  5. use App\Service\FilmApplicationService;
  6. use App\Service\MailService;
  7. use App\Utility\PdfExporter;
  8. use App\Service\ProgressReportService;
  9. use Doctrine\ORM\EntityManagerInterface;
  10. use EasyCorp\Bundle\EasyAdminBundle\Dto\EntityDto;
  11. use EasyCorp\Bundle\EasyAdminBundle\Dto\SearchDto;
  12. use EasyCorp\Bundle\EasyAdminBundle\Collection\FieldCollection;
  13. use EasyCorp\Bundle\EasyAdminBundle\Collection\FilterCollection;
  14. use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractCrudController;
  15. use EasyCorp\Bundle\EasyAdminBundle\Dto\BatchActionDto;
  16. use EasyCorp\Bundle\EasyAdminBundle\Config\Action;
  17. use EasyCorp\Bundle\EasyAdminBundle\Config\Actions;
  18. use EasyCorp\Bundle\EasyAdminBundle\Config\Crud;
  19. use EasyCorp\Bundle\EasyAdminBundle\Config\Filters;
  20. use EasyCorp\Bundle\EasyAdminBundle\Context\AdminContext;
  21. use EasyCorp\Bundle\EasyAdminBundle\Field\IdField;
  22. use EasyCorp\Bundle\EasyAdminBundle\Field\ArrayField;
  23. use EasyCorp\Bundle\EasyAdminBundle\Field\ChoiceField;
  24. use EasyCorp\Bundle\EasyAdminBundle\Field\CollectionField;
  25. use EasyCorp\Bundle\EasyAdminBundle\Field\DateField;
  26. use EasyCorp\Bundle\EasyAdminBundle\Field\FormField;
  27. use EasyCorp\Bundle\EasyAdminBundle\Field\ImageField;
  28. use EasyCorp\Bundle\EasyAdminBundle\Field\MoneyField;
  29. use EasyCorp\Bundle\EasyAdminBundle\Field\TextareaField;
  30. use EasyCorp\Bundle\EasyAdminBundle\Field\TextField;
  31. use EasyCorp\Bundle\EasyAdminBundle\Router\AdminUrlGenerator;
  32. use Symfony\Component\HttpFoundation\RequestStack;
  33. use EasyCorp\Bundle\EasyAdminBundle\Filter\ChoiceFilter;
  34. use Knp\Snappy\Pdf;
  35. use Twig\Environment;
  36. use App\Filter\YearFilter;
  37. class FilmProjectProgressReportCrudController extends AbstractCrudController
  38. {
  39.     private EntityManagerInterface $em;
  40.     private AdminUrlGenerator $adminUrlGenerator;
  41.     private FilmApplicationService $filmApplicationService;
  42.     private $requestStack;
  43.     private ProgressReportService $progressReportService;
  44.     public function __construct(EntityManagerInterface $emAdminUrlGenerator $adminUrlGeneratorFilmApplicationService $filmApplicationServiceRequestStack $requestStackProgressReportService $progressReportService)
  45.     {
  46.         $this->em $em;
  47.         $this->adminUrlGenerator $adminUrlGenerator;
  48.         $this->filmApplicationService $filmApplicationService;
  49.         $this->requestStack $requestStack;
  50.         $this->progressReportService $progressReportService;
  51.     }
  52.     public static function getEntityFqcn(): string
  53.     {
  54.         return FilmProjectProgressReport::class;
  55.     }
  56.     public function configureFields(string $pageName): iterable
  57.     {
  58.         return [
  59.             TextField::new('filmProject.title''Project Title')->setColumns(6)->hideOnForm(),
  60.             TextField::new('filmProject.productionStage''Project Stage')->hideOnForm()->setTemplatePath('admin/field/project_stage.html.twig'),
  61.             TextField::new('filmProject.status''Status')->hideOnForm()->setTemplatePath('admin/field/project_status.html.twig'),
  62.             TextField::new('filmProject.wordpressStatus''Wordpress Status')->hideOnForm()->setTemplatePath('admin/field/project_wordpress_status.html.twig'),
  63.             IdField::new('filmProject.wordpressId''WP ID')->hideOnForm()->setTemplatePath('admin/field/wordpress_id.html.twig')->setPermission(Constant::ADMIN_ROLE),
  64.             IdField::new('oldWordpressId''old WP ID')->hideOnForm()->setTemplatePath('admin/field/wordpress_id.html.twig')->setPermission(Constant::ADMIN_ROLE),
  65.             DateField::new('createdAt''Year')->setFormat('yyyy')->hideOnForm(),
  66.             TextField::new('status''Status')->hideOnForm()->setTemplatePath('admin/field/progress_report_status.html.twig'),
  67.         ];
  68.     }
  69.     public function configureFilters(Filters $filters): Filters
  70.     {
  71.         $filters $filters
  72.             ->add(YearFilter::new('createdAt''Year'));
  73.         // Get current user profile
  74.         $filters $filters
  75.             ->add(ChoiceFilter::new('status')->setChoices([
  76.                 'Created' => 'Created',
  77.                 'Completed' => 'Completed',
  78.                 'Received' => 'Received',
  79.             ]))
  80.         ;
  81.         return $filters;
  82.     }
  83.     public function configureCrud(Crud $crud): Crud
  84.     {
  85.         $request $this->requestStack->getCurrentRequest();
  86.         $perPage $request->query->getInt('perPage', default: 10);
  87.         $crud
  88.             ->setSearchFields(['filmProject.title'])
  89.             ->setPageTitle('index''Manage Progress Reports')
  90.             ->overrideTemplate('crud/index''admin/index/index_alt.html.twig')
  91.             ->overrideTemplate('flash_messages''admin/crud/flash_messages_alt.html.twig')
  92.             ->setDefaultSort(['status' => 'ASC''modifiedAt' => 'DESC', ])
  93.             ->setPaginatorPageSize($perPage)
  94.         ;
  95.         return $crud;
  96.     }
  97.     public function deleteEntity(EntityManagerInterface $entityManager$entityInstance): void
  98.     {
  99.         $entityInstance->setFilmProject(null); // set null
  100.         $entityManager->persist($entityInstance);
  101.         $entityManager->flush();
  102.         $entityManager->remove($entityInstance);
  103.         $entityManager->flush();
  104.     }
  105.     public function configureActions(Actions $actions): Actions
  106.     {
  107.         $viewProgressReport Action::new('viewProgressReport''View Progress Report''')
  108.             ->linkToCrudAction('viewProgressReport')
  109.             ->setHtmlAttributes(['target' => '_blank'])
  110.         ;
  111.         $sendEmail Action::new('sendEmail''Send Notification')
  112.             ->linkToUrl('/progress-report/workflow/send-email')
  113.             ->createAsGlobalAction()
  114.             ->addCssClass('btn btn-primary d-block')
  115.         ;
  116.         $sendBatchEmail Action::new('sendBatchEmail''Send Notification')
  117.             ->linkToCrudAction('sendBatchEmail')
  118.         ;
  119.         $publishProjects Action::new('publishProjects''Publish')
  120.             ->linkToCrudAction('publishProjects')
  121.             ->addCssClass('wordpress-action')
  122.         ;
  123.         $unpublishProjects Action::new('unpublishProjects''Unpublish')
  124.             ->linkToCrudAction('unpublishProjects')
  125.             ->addCssClass('wordpress-action')
  126.         ;
  127.         $downloadPdf Action::new('downloadPdf''Download Progress Report')
  128.             ->linkToCrudAction('downloadPdf')
  129.             ->displayIf(static function ($entity) {
  130.                 $status $entity->getStatus();
  131.                 return $status == 'completed';
  132.             })
  133.         ;
  134.         $downloadFeedbackPdf Action::new('downloadFeedbackPdf''Download Feedback')
  135.             ->linkToCrudAction('downloadFeedbackPdf')
  136.             ->displayIf(static function ($entity) {
  137.                 $status $entity->getStatus();
  138.                 return $status == 'completed';
  139.             })
  140.         ;
  141.         $toggleOnProgressReportStatus Action::new('toggleOnProgressReportStatus''Turn on Progress Report')
  142.             ->linkToUrl(function($entity) {
  143.                 return '/admin/progress-report/workflow/cron/single/' $entity->getFilmProject()->getId();
  144.             })
  145.             ->displayIf(static function($entity) {
  146.                 $project $entity->getFilmProject();
  147.                 return $project && in_array($entity->getStatus(), ['created''received'], true) && !$project->isIsProgressReportActive();
  148.             })
  149.         ;
  150.         $toggleOffProgressReportStatus Action::new('toggleOffProgressReportStatus''Turn off Progress Report')
  151.             ->linkToUrl(function($entity) {
  152.                 return '/admin/progress-report/workflow/cron/single/' $entity->getFilmProject()->getId();
  153.             })
  154.             ->displayIf(static function($entity) {
  155.                 $project $entity->getFilmProject();
  156.                 return $project && in_array($entity->getStatus(), ['created''received'], true) && $project->isIsProgressReportActive();
  157.             })
  158.         ;
  159.         // $exportProgressReportList = Action::new('exportProgressReportList', 'Export Progress Report')
  160.         //     ->linkToUrl('/admin/project/export-progress-report')
  161.         //     ->createAsGlobalAction()
  162.         //     ->addCssClass('btn btn-primary d-block')
  163.         //     // ->displayIf(static function ($entity) {
  164.         //     //     $status = $entity->getStatus();
  165.         //     //     return $status == 'approved';
  166.         //     // })
  167.         // ;
  168.         $exportProgressReportList Action::new('exportProgressReportList''Export Progress Report')
  169.             ->linkToUrl(function () {
  170.                 $request $this->requestStack->getCurrentRequest();
  171.                 $filters $request->query->all('filters');
  172.                 return '/admin/project/export-progress-report' 
  173.                     . (!empty($filters) ? '?' http_build_query(['filters' => $filters]) : '');
  174.             })
  175.             ->createAsGlobalAction()
  176.             ->addCssClass('btn btn-primary d-block')
  177.         ;
  178.         $exportProgressReportFeedbackList Action::new('exportProgressReportFeedbackList''Export Feedback')
  179.             ->linkToUrl('/admin/project/export-progress-report-feedback')
  180.             ->createAsGlobalAction()
  181.             ->addCssClass('btn btn-primary d-block')
  182.             // ->displayIf(static function ($entity) {
  183.             //     $status = $entity->getStatus();
  184.             //     return $status == 'approved';
  185.             // })
  186.         ;
  187.         $toggleProgressReportOn Action::new('toggleProgressReportOn''Turn On Progress Report')
  188.             ->linkToUrl('/admin/progress-report/workflow/cron')
  189.             ->createAsGlobalAction()
  190.             ->addCssClass('btn btn-primary d-block')
  191.         ;
  192.         $toggleProgressReportOff Action::new('toggleProgressReportOff''Turn Off Progress Report')
  193.             ->linkToUrl('/admin/progress-report/workflow/cron')
  194.             ->createAsGlobalAction()
  195.             ->addCssClass('btn btn-primary d-block')
  196.         ;
  197.         $actions
  198.             ->add(Crud::PAGE_INDEX$viewProgressReport)
  199.             ->add(Crud::PAGE_INDEX$sendEmail)
  200.             ->add(Crud::PAGE_INDEX$downloadPdf)
  201.             // ->add(Crud::PAGE_INDEX, $downloadFeedbackPdf)
  202.             ->add(Crud::PAGE_INDEX$exportProgressReportList)
  203.             ->add(Crud::PAGE_INDEX$exportProgressReportFeedbackList)
  204.             
  205.             ->addBatchAction($publishProjects)
  206.             ->addBatchAction($unpublishProjects)
  207.             ->addBatchAction($sendBatchEmail)
  208.             ->remove(Crud::PAGE_INDEXAction::EDIT)
  209.             ->remove(Crud::PAGE_INDEXAction::NEW)
  210.             ->setPermission($sendEmailConstant::ADMIN_ROLE)
  211.             ->setPermission($publishProjectsConstant::ADMIN_ROLE)
  212.             ->setPermission($unpublishProjectsConstant::ADMIN_ROLE)
  213.             ->setPermission($sendBatchEmailConstant::ADMIN_ROLE)
  214.             ->setPermission($exportProgressReportListConstant::ADMIN_ROLE)
  215.             ->setPermission($exportProgressReportFeedbackListConstant::ADMIN_ROLE)
  216.             // ->setPermission($downloadFeedbackPdf, Constant::ADMIN_ROLE)
  217.             ->reorder(Crud::PAGE_INDEX, ['viewProgressReport''downloadPdf'Action::DELETE])
  218.         ;
  219.         if ($this->progressReportService->checkIfProgressReportStarts()) {
  220.             $actions
  221.                 ->add(Crud::PAGE_INDEX$toggleProgressReportOff)
  222.                 ->setPermission($toggleProgressReportOffConstant::ADMIN_ROLE)
  223.             ;
  224.         } else {
  225.             $actions
  226.                 ->add(Crud::PAGE_INDEX$toggleProgressReportOn)
  227.                 ->add(Crud::PAGE_INDEX$toggleOnProgressReportStatus)
  228.                 ->add(Crud::PAGE_INDEX$toggleOffProgressReportStatus)
  229.                 ->setPermission($toggleProgressReportOnConstant::ADMIN_ROLE)
  230.             ;
  231.         }
  232.         return $actions;
  233.     }
  234.     // Custom Actions
  235.     public function viewProgressReport(AdminContext $adminContext)
  236.     {
  237.         $entityInstance $adminContext->getEntity()->getInstance();
  238.         $id $entityInstance->getId();
  239.         $currentYear = (int) date('Y');
  240.         if ($entityInstance->getCreatedAt()) {
  241.             $currentYear = (int) ($entityInstance->getCreatedAt())->format('Y');
  242.         }
  243.         $filmProject $entityInstance->getFilmProject();
  244.         $progressReportUrl '/progress-report/'$currentYear .'?projectId=' $filmProject->getId();
  245.         return $this->redirect($progressReportUrl);
  246.     }
  247.     /**
  248.      * BATCH: Publish projects
  249.      *
  250.      * @param BatchActionDto $batchActionDto
  251.      * @return void
  252.      */
  253.     public function publishProjects(BatchActionDto $batchActionDto)
  254.     {
  255.         $className $batchActionDto->getEntityFqcn();
  256.         $entityManager $this->container->get('doctrine')->getManagerForClass($className);
  257.         // Check if there is non-approved projects
  258.         foreach ($batchActionDto->getEntityIds() as $id) {
  259.             $progressReport $entityManager->find($className$id);
  260.             $entityInstance $progressReport->getFilmProject();
  261.             if ($entityInstance->getStatus() != 'approved') {
  262.                 $this->addFlash('notice''Project(s) have to be approved before being published.');
  263.                 return $this->redirect($batchActionDto->getReferrerUrl());
  264.             }
  265.         }
  266.         foreach ($batchActionDto->getEntityIds() as $id) {
  267.             $progressReport $entityManager->find($className$id);
  268.             $entityInstance $progressReport->getFilmProject();
  269.             $this->filmApplicationService->publishProject($entityInstance);
  270.         }
  271.         $this->addFlash('success''Project(s) have been published');
  272.         return $this->redirect($batchActionDto->getReferrerUrl());
  273.     }
  274.     /**
  275.      * BATCH: Unublish projects
  276.      *
  277.      * @param BatchActionDto $batchActionDto
  278.      * @return void
  279.      */
  280.     public function unpublishProjects(BatchActionDto $batchActionDto)
  281.     {
  282.         $className $batchActionDto->getEntityFqcn();
  283.         $entityManager $this->container->get('doctrine')->getManagerForClass($className);
  284.         // Check if there is non-approved projects
  285.         foreach ($batchActionDto->getEntityIds() as $id) {
  286.             $progressReport $entityManager->find($className$id);
  287.             $entityInstance $progressReport->getFilmProject();
  288.             
  289.             if ($entityInstance->getStatus() != 'approved') {
  290.                 $this->addFlash('notice''Project(s) have to be approved before being unpublished.');
  291.                 return $this->redirect($batchActionDto->getReferrerUrl());
  292.             }
  293.         }
  294.         foreach ($batchActionDto->getEntityIds() as $id) {
  295.             $progressReport $entityManager->find($className$id);
  296.             $entityInstance $progressReport->getFilmProject();
  297.             $this->filmApplicationService->unpublishProject($entityInstance);
  298.         }
  299.         $this->addFlash('success''Project(s) have been unpublished');
  300.         return $this->redirect($batchActionDto->getReferrerUrl());
  301.     }
  302.     public function downloadPdf(AdminContext $contextEnvironment $twig nullPdf $pdf)
  303.     {
  304.         $progressReport $context->getEntity()->getInstance();
  305.         $pdfExporter = new PdfExporter($twig$pdf);
  306.         $pdfExporter->convertProgressReportToPdf($progressReport);
  307.     }
  308.     public function downloadFeedbackPdf(AdminContext $contextEnvironment $twig nullPdf $pdf)
  309.     {
  310.         $progressReport $context->getEntity()->getInstance();
  311.         $pdfExporter = new PdfExporter($twig$pdf);
  312.         $pdfExporter->convertProgressReportFeedbackToPdf($progressReport);
  313.     }
  314.     /**
  315.      * BATCH: Send Batch Emails
  316.      *
  317.      * @param BatchActionDto $batchActionDto
  318.      * @return void
  319.      */
  320.     public function sendBatchEmail(BatchActionDto $batchActionDtoMailService $mailService)
  321.     {
  322.         $className $batchActionDto->getEntityFqcn();
  323.         $entityManager $this->container->get('doctrine')->getManagerForClass($className);
  324.         // Check if there is non-approved projects
  325.         foreach ($batchActionDto->getEntityIds() as $id) {
  326.             $progressReport $entityManager->find($className$id);
  327.             $entityInstance $progressReport->getFilmProject();
  328.             $mailService->sendDefaultProgressReportEmail($entityInstance);
  329.             
  330.             if ($entityInstance->getStatus() != 'approved') {
  331.                 $this->addFlash('notice''Project(s) have to be approved before being published.');
  332.                 return $this->redirect($batchActionDto->getReferrerUrl());
  333.             }
  334.         }
  335.         $this->addFlash('success''Notification email(s) have been sent.');
  336.         return $this->redirect($batchActionDto->getReferrerUrl());
  337.     }
  338. }