src/Controller/Admin/DashboardController.php line 57

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Admin;
  3. use App\Entity\Donation;
  4. use App\Entity\Event;
  5. use App\Entity\FilmProject;
  6. use App\Entity\FilmProjectUpdate;
  7. use App\Entity\Product;
  8. use App\Entity\ProjectNotification;
  9. use App\Entity\Setting;
  10. use App\Entity\User;
  11. use App\Repository\DonationRepository;
  12. use App\Repository\FilmProjectRepository;
  13. use App\Repository\ProjectNotificationRepository;
  14. use App\String\Constant;
  15. use App\Utility\ChartBuilder;
  16. use EasyCorp\Bundle\EasyAdminBundle\Config\Action;
  17. use EasyCorp\Bundle\EasyAdminBundle\Config\Assets;
  18. use EasyCorp\Bundle\EasyAdminBundle\Config\Crud;
  19. use EasyCorp\Bundle\EasyAdminBundle\Config\Dashboard;
  20. use EasyCorp\Bundle\EasyAdminBundle\Config\MenuItem;
  21. use EasyCorp\Bundle\EasyAdminBundle\Config\UserMenu;
  22. use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractDashboardController;
  23. use EasyCorp\Bundle\EasyAdminBundle\Router\AdminUrlGenerator;
  24. use Symfony\Component\Asset\Packages;
  25. use Symfony\Component\HttpFoundation\Response;
  26. use Symfony\Component\Routing\Annotation\Route;
  27. use Symfony\Component\Security\Core\Security;
  28. use Symfony\Component\Security\Core\User\UserInterface;
  29. use Symfony\UX\Chartjs\Builder\ChartBuilderInterface;
  30. use Symfony\UX\Chartjs\Model\Chart;
  31. use App\Controller\Admin\PendingFilmProjectMemberCrudController;
  32. use App\Entity\EmailTemplate;
  33. use App\Entity\FilmProjectProgressReport;
  34. class DashboardController extends AbstractDashboardController
  35. {
  36.     private Packages $packages;
  37.     private FilmProjectRepository $filmProjectRepository;
  38.     private DonationRepository $donationRepository;
  39.     private AdminUrlGenerator $adminUrlGenerator;
  40.     private Security $security;
  41.     private ProjectNotificationRepository $projectNotificationRepository;
  42.     public function __construct(Packages $packagesFilmProjectRepository $filmProjectRepositoryDonationRepository $donationRepositoryAdminUrlGenerator $adminUrlGeneratorSecurity $securityProjectNotificationRepository $projectNotificationRepository)
  43.     {
  44.         $this->packages $packages;
  45.         $this->filmProjectRepository $filmProjectRepository;
  46.         $this->donationRepository $donationRepository;
  47.         $this->adminUrlGenerator $adminUrlGenerator;
  48.         $this->security $security;
  49.         $this->projectNotificationRepository $projectNotificationRepository;
  50.     }
  51.     #[Route('/admin'name'admin')]
  52.     public function index(ChartBuilderInterface $chartBuilder null): Response
  53.     {
  54.         if (isset($_GET['return'])) {
  55.             if ($_GET['return'] == 'invitation') {
  56.                 $invitationUrlController $this->adminUrlGenerator
  57.                     ->setController(PendingFilmProjectMemberCrudController::class)
  58.                     ->setAction(Action::INDEX)
  59.                     ->setDashboard(DashboardController::class)
  60.                     ->unset('entityId')
  61.                     ->generateUrl();
  62.             }
  63.             return $this->redirect($invitationUrlController);
  64.         }
  65.         $user $this->security->getUser();
  66.         if ($user->isAdmin()) { // ADMIN DASHBOARD HERE~~
  67.             $projects $this->filmProjectRepository->findPendingApprovalProjects();
  68.             $donations $this->donationRepository->findDonationsWithLimit(10);
  69.             
  70.             $activeCampaignProjects $this->filmProjectRepository->findAllActiveCampaignProjects($user);
  71.             $chart null;
  72.             $totalDonator 0;
  73.             $totalDonation 0;
  74.             $totalFollowers 0;
  75.             if ($activeCampaignProjects) {
  76.                 $chartBuilder = new ChartBuilder($chartBuilder$this->donationRepository);
  77.                 $chart $chartBuilder->createChartFromAllProject();
  78.                 foreach ($activeCampaignProjects as $activeProject) {
  79.                     $activeProjectId $activeProject->getId();
  80.                     
  81.                     // Get total donator number
  82.                     $currentDonations $this->donationRepository->findDonationsByFiscalYear($activeProjectId);
  83.                     foreach ($currentDonations as $currentDonation) {
  84.                         $orderDetails $currentDonation->getOrderDetails();
  85.                         $totalDonation += $orderDetails->getTotal() / 100;
  86.                     }
  87.                     $totalDonator += count($this->donationRepository->findTotalDonatorByFiscalYear($activeProjectId));
  88.                     $totalFollowers += count($activeProject->getUsers());
  89.                 }
  90.             }
  91.             return $this->render('adminPortal/dashboard.html.twig', [
  92.                 'projects' => $projects,
  93.                 'donations' => $donations,
  94.                 'activeCampaignProjects' => $activeCampaignProjects,
  95.                 'chart' => $chart,
  96.                 'totalDonation' => '0.00',
  97.                 'totalDonator' => $totalDonator,
  98.                 'totalFollowers' => $totalFollowers,
  99.             ]);
  100.         }
  101.         if (!$user->isFilmmaker()) {
  102.             return $this->redirectToRoute('supporter_dashboard');
  103.         }
  104.         $projects $this->filmProjectRepository->findDraftAndActiveProjects($user);
  105.         $activeCampaignProjects $this->filmProjectRepository->findActiveCampaignProjects($user);
  106.         
  107.         $chart null;
  108.         $totalDonator 0;
  109.         $totalDonation 0;
  110.         $totalFollowers 0;
  111.         if ($activeCampaignProjects) {
  112.             $filmProject $activeCampaignProjects[0];
  113.             $chartBuilder = new ChartBuilder($chartBuilder$this->donationRepository);
  114.             $chart $chartBuilder->createChartFromProject($filmProject);
  115.             
  116.             $totalDonation $filmProject->getTotalDonation() / 100;
  117.             $totalDonator $this->getTotalDonator($filmProject);
  118.             $totalFollowers count($filmProject->getUsers());
  119.         }
  120.         
  121.         $viewProjectLink $this->adminUrlGenerator->setController(FilmProjectCrudController::class)->setAction(Action::INDEX)->generateUrl();
  122.         return $this->render('userPortal/dashboard.html.twig', [
  123.             'projects' => $projects,
  124.             'activeCampaignProjects' => $activeCampaignProjects,
  125.             'viewProjectLink' => $viewProjectLink,
  126.             'chart' => $chart,
  127.             'totalDonation' => '0.00',
  128.             'totalDonator' => $totalDonator,
  129.             'totalFollowers' => $totalFollowers,
  130.         ]);
  131.     }
  132.     #[Route('/admin/supporter'name'supporter_dashboard')]
  133.     public function supporterDashboard(ChartBuilderInterface $chartBuilder null): Response
  134.     {
  135.         $user $this->security->getUser();
  136.         if ($user->isAdmin()) {
  137.             $projects $this->filmProjectRepository->findPendingApprovalProjects();
  138.             $donations $this->donationRepository->findDonationsWithLimit(10);
  139.             return $this->render('adminPortal/dashboard.html.twig', [
  140.                 'projects' => $projects,
  141.                 'donations' => $donations,
  142.             ]);
  143.         }
  144.         $projects $this->filmProjectRepository->findDraftAndActiveProjects($user);
  145.         $viewProjectLink $this->adminUrlGenerator->setController(FilmProjectCrudController::class)->setAction(Action::INDEX)->generateUrl();
  146.         $followedProjects $user->getFollowedFilmProjects();
  147.         $donations $this->donationRepository->findDonationsByUser($user);
  148.         return $this->render('userPortal/dashboard_supporter.html.twig', [
  149.             'projects' => $projects,
  150.             'viewProjectLink' => $viewProjectLink,
  151.             'followedProjects' => $followedProjects,
  152.             'donations' => $donations,
  153.         ]);
  154.     }
  155.     public function configureDashboard(): Dashboard
  156.     {
  157.         $imageUrl $this->packages->getUrl('build/images/logo.svg');
  158.         return Dashboard::new()
  159.             ->setTitle('<img src="'.$imageUrl.'" alt="logo">')
  160.             ->disableDarkMode()
  161.         ;
  162.     }
  163.     public function configureCrud(): Crud
  164.     {
  165.         return parent::configureCrud()
  166.             ->overrideTemplate('flash_messages''admin/crud/flash_messages_alt.html.twig')
  167.         ;
  168.     }
  169.     public function configureMenuItems(): iterable
  170.     {
  171.         $user $this->getUser();
  172.         $dashboardName 'FILMMAKER PORTAL';
  173.         if ($user->isAdmin()) {
  174.             $dashboardName 'ADMIN PORTAL';
  175.         } 
  176.         
  177.         return [
  178.             MenuItem::section($dashboardName)->setPermission(Constant::ROLE_FILMMAKER)->setCssClass('filmmaker-portal'),
  179.             MenuItem::linkToDashboard('Dashboard''fa fa-list')->setPermission(Constant::ROLE_FILMMAKER),
  180.             MenuItem::linkToUrl('Resources''fa fa-list'Constant::MY_FILMS_URL)->setLinkTarget('_blank')->setPermission(Constant::ROLE_FILMMAKER),
  181.             // MenuItem::linkToUrl('My Projects', 'fa fa-list', Constant::MY_FILMS_URL)->setLinkTarget('_blank'),
  182.             MenuItem::section('SUPPORTER')->setPermission(Constant::ROLE_DONOR),
  183.             MenuItem::linkToUrl('Dashboard''fa fa-list''/admin/supporter')->setPermission(Constant::ROLE_DONOR),
  184.             MenuItem::linkToCrud('Donations''fa fa-list'FilmProject::class)
  185.                 ->setController(DonationCrudController::class)
  186.                 ->setPermission(Constant::ROLE_DONOR),
  187.             MenuItem::linkToCrud('Projects You\'re Following''fa fa-list'FilmProject::class)
  188.                 ->setController(FollowingProjectCrudController::class)
  189.                 ->setPermission(Constant::PORTAL_USER_ROLE),
  190.                 
  191.             MenuItem::section('USERS')->setPermission(Constant::ADMIN_ROLE),
  192.             MenuItem::linkToCrud('Manage Users''fa fa-list'User::class)
  193.                 ->setController(UserAdminCrudController::class)
  194.                 ->setPermission(Constant::ADMIN_ROLE),
  195.                 
  196.             MenuItem::section('YOUR PROFILE')->setPermission(Constant::PORTAL_USER_ROLE),
  197.             MenuItem::linkToCrud('Your Account Details''fa fa-list'User::class)
  198.                 ->setAction('edit')
  199.                 ->setEntityId($user->getId())
  200.                 ->setController(UserCrudController::class)
  201.                 ->setPermission(Constant::PORTAL_USER_ROLE),
  202.             MenuItem::linkToCrud('Your Billing Details''fa fa-list'User::class)
  203.                 ->setController(UserBillingCrudController::class)
  204.                 ->setPermission(Constant::PORTAL_USER_ROLE),
  205.             MenuItem::section('PROJECTS')->setPermission(Constant::ROLE_FILMMAKER),
  206.             MenuItem::linkToCrud('Manage Projects''fa fa-list'FilmProject::class)
  207.                 ->setController(FilmProjectCrudController::class)
  208.                 ->setPermission(Constant::ROLE_FILMMAKER),
  209.             // MenuItem::linkToCrud('Manage Draft Projects', 'fa fa-list', FilmProject::class)
  210.             //     ->setController(DraftFilmProjectCrudController::class)
  211.             //     ->setPermission(Constant::ROLE_FILMMAKER),
  212.             MenuItem::linkToCrud('Pending Approval''fa fa-list'FilmProject::class)
  213.                 ->setController(PendingFilmProjectCrudController::class)
  214.                 ->setPermission(Constant::ROLE_FILMMAKER),
  215.             MenuItem::linkToCrud('Linked Projects''fa fa-list'FilmProject::class)
  216.                 ->setController(LinkedFilmProjectCrudController::class)
  217.                 ->setPermission(Constant::ROLE_FILMMAKER),
  218.             MenuItem::linkToCrud('Manage Project Updates''fa fa-list'FilmProjectUpdate::class)
  219.                 ->setController(FilmProjectAdminUpdateCrudController::class)
  220.                 ->setPermission(Constant::ADMIN_ROLE),
  221.             MenuItem::linkToCrud('Manage Progress Reports''fa fa-list'FilmProjectProgressReport::class)
  222.                 ->setController(FilmProjectProgressReportCrudController::class)
  223.                 ->setPermission(Constant::ADMIN_ROLE),
  224.             MenuItem::section('EVENT')->setPermission(Constant::ADMIN_ROLE),
  225.             MenuItem::linkToCrud('Manage Events''fa fa-list'Event::class)
  226.                 ->setController(EventCrudController::class)
  227.                 ->setPermission(Constant::ADMIN_ROLE),
  228.             MenuItem::section('PRODUCTS')->setPermission(Constant::ROLE_FINANCE),
  229.             MenuItem::linkToCrud('Manage Products''fa fa-list'Product::class)
  230.                 ->setController(ProductCrudController::class)
  231.                 ->setPermission(Constant::ROLE_FINANCE),
  232.             MenuItem::section('TRANSACTIONS'),
  233.             MenuItem::linkToCrud('View Receipts''fa fa-list'Donation::class)
  234.                 ->setController(OrderDetailsCrudController::class),
  235.             // Need to double up "donations" menu because easyadmin can only enable one permission
  236.             // at a time (Easyadmin is shiet)
  237.             // Changed my mind: Easyadmin is great as long as you know how to make config works with role hierarchy
  238.             MenuItem::section('DONATIONS')->setPermission(Constant::ADMIN_ROLE),
  239.             MenuItem::linkToCrud('View Donations''fa fa-list'Donation::class)
  240.                 ->setController(DonationCrudController::class)
  241.                 ->setPermission(Constant::ADMIN_ROLE),
  242.             MenuItem::section('NOTIFICATIONS')
  243.                 ->setPermission(Constant::PORTAL_USER_ROLE),
  244.             MenuItem::linkToCrud('Notifications''fa fa-bell'ProjectNotification::class)
  245.                 ->setController(ProjectNotificationCrudController::class)
  246.                 ->setPermission(Constant::PORTAL_USER_ROLE),
  247.             MenuItem::section('SETTINGS')->setPermission(Constant::ADMIN_ROLE),
  248.             // TODO: LAUNCH
  249.             MenuItem::linkToCrud('Manage Email Template''fa fa-list'EmailTemplate::class)
  250.                 ->setController(EmailTemplateCrudController::class)
  251.                 ->setPermission(Constant::ADMIN_ROLE),
  252.             MenuItem::linkToCrud('Manage Global Settings''fa fa-list'Setting::class)
  253.                 ->setController(SettingCrudController::class)
  254.                 ->setPermission(Constant::ADMIN_ROLE),
  255.             MenuItem::linkToCrud('Manage User Category''fa fa-list'User::class)
  256.                 ->setController(UserCategoryCrudController::class)
  257.                 ->setPermission(Constant::ADMIN_ROLE),
  258.             
  259.         ];
  260.     }
  261.     public function configureAssets(): Assets
  262.     {
  263.         $user $this->getUser();
  264.         $notifications $this->projectNotificationRepository->findNotificationsByUserAndNotRead($user);
  265.         $assets Assets::new()->addWebpackEncoreEntry('app');
  266.         if (count($notifications) > 0) {
  267.             $assets Assets::new()->addWebpackEncoreEntry('app')
  268.                 ->addHtmlContentToHead("<style>
  269.                     a.user-details::before {content: '';width: 6px;height: 6px;background-color: #e15426;display: block;margin-right: 15px;border-radius: 20px;}
  270.                     a.dropdown-item.user-action.user-notification-action::after { content: ''; width: 6px; height: 6px; background-color: #e15426; display: block; margin-left: 10px; border-radius: 20px; top: 7px; position: relative; }    
  271.                 </style>")
  272.             ;
  273.         }
  274.         return $assets;
  275.     }
  276.     public function configureUserMenu(UserInterface $user): UserMenu
  277.     {
  278.         $userProfile $user->getUserProfile();
  279.         
  280.         return parent::configureUserMenu($user)
  281.             ->displayUserName(false)
  282.             ->setAvatarUrl($userProfile->getProfilePictureUrl())
  283.             ->addMenuItems([
  284.                 MenuItem::linkToCrud('Notifications''fa fa-bell'ProjectNotification::class)
  285.                     ->setController(ProjectNotificationCrudController::class)
  286.                     ->setCssClass('user-notification-action'),
  287.             ])
  288.         ;
  289.     }
  290.     protected function getTotalDonator(FilmProject $project): ?int
  291.     {
  292.         $donationEmailArr = [];
  293.         // $donations = $project->getDonations();
  294.         $donations $this->donationRepository->findDonationsByProjectOrderDate($project->getId());
  295.         foreach ($donations as $donation) {
  296.             $orderDetails $donation->getOrderDetails();
  297.             $orderBillingDetails $orderDetails->getOrderBillingDetails();
  298.             $email $orderBillingDetails->getEmailAddress();
  299.             
  300.             if (!in_array($email$donationEmailArr)) {
  301.                 array_push($donationEmailArr$email);
  302.             }
  303.         }
  304.         $totalDonator count($donationEmailArr);
  305.         return $totalDonator;
  306.     }
  307. }