src/Controller/Admin/FilmProjectProgressReportCrudController.php line 181

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