src/Controller/Admin/OrderDetailsCrudController.php line 310

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Admin;
  3. use App\Entity\OrderDetails;
  4. use App\Repository\DonationRepository;
  5. use App\Service\DonationService;
  6. use App\Service\FilmApplicationService;
  7. use App\Service\OrderDetailsService;
  8. use App\Service\UserService;
  9. use App\String\Constant;
  10. use App\Utility\PdfExporter;
  11. use Doctrine\ORM\QueryBuilder;
  12. use Doctrine\ORM\EntityManagerInterface;
  13. use EasyCorp\Bundle\EasyAdminBundle\Collection\FieldCollection;
  14. use EasyCorp\Bundle\EasyAdminBundle\Collection\FilterCollection;
  15. use EasyCorp\Bundle\EasyAdminBundle\Config\Action;
  16. use EasyCorp\Bundle\EasyAdminBundle\Config\Actions;
  17. use EasyCorp\Bundle\EasyAdminBundle\Config\Crud;
  18. use EasyCorp\Bundle\EasyAdminBundle\Context\AdminContext;
  19. use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractCrudController;
  20. use EasyCorp\Bundle\EasyAdminBundle\Dto\BatchActionDto;
  21. use EasyCorp\Bundle\EasyAdminBundle\Dto\EntityDto;
  22. use EasyCorp\Bundle\EasyAdminBundle\Dto\SearchDto;
  23. use EasyCorp\Bundle\EasyAdminBundle\Field\ChoiceField;
  24. use EasyCorp\Bundle\EasyAdminBundle\Field\DateField;
  25. use EasyCorp\Bundle\EasyAdminBundle\Field\IdField;
  26. use EasyCorp\Bundle\EasyAdminBundle\Field\MoneyField;
  27. use EasyCorp\Bundle\EasyAdminBundle\Field\TextField;
  28. use EasyCorp\Bundle\EasyAdminBundle\Orm\EntityRepository;
  29. use EasyCorp\Bundle\EasyAdminBundle\Router\AdminUrlGenerator;
  30. use Knp\Snappy\Pdf;
  31. use Symfony\Component\HttpFoundation\RedirectResponse;
  32. use Symfony\Component\HttpFoundation\Response;
  33. use Twig\Environment;
  34. class OrderDetailsCrudController extends AbstractCrudController
  35. {
  36.     private UserService $userService;
  37.     private OrderDetailsService $orderDetailsService;
  38.     private AdminUrlGenerator $adminUrlGenerator;
  39.     private $donationRepository;
  40.     public function __construct(UserService $userServiceOrderDetailsService $orderDetailsServiceAdminUrlGenerator $adminUrlGeneratorDonationRepository $donationRepository)
  41.     {
  42.         $this->userService $userService;
  43.         $this->orderDetailsService $orderDetailsService;
  44.         $this->adminUrlGenerator $adminUrlGenerator;
  45.         $this->donationRepository $donationRepository;
  46.     }
  47.     public static function getEntityFqcn(): string
  48.     {
  49.         return OrderDetails::class;
  50.     }
  51.     public function configureFields(string $pageName): iterable
  52.     {
  53.         return [
  54.             IdField::new('id''Order Id')->hideOnForm()->setTemplatePath('admin/field/order_mw_id.html.twig')->setSortable(true)->setPermission(Constant::ADMIN_ROLE),
  55.             TextField::new('invoiceNumber''Invoice Id')->hideOnForm()->setTemplatePath('admin/field/order_details_id.html.twig'),
  56.             TextField::new('orderBillingDetails.fullName''Account Name')->hideOnForm(),
  57.             TextField::new('type''Order Type'),
  58.             TextField::new('projectTitle''Project')->hideOnForm(),
  59.             DateField::new('modifiedAt''Date')->setFormat('dd MMM yyyy'),
  60.             MoneyField::new('total''Amount')->setCurrency('AUD')->setTextAlign('left'),
  61.             TextField::new('paymentDetails.status''Status')->setTemplatePath('admin/field/payment_status.html.twig')->hideOnForm()->setSortable(true),
  62.             ChoiceField::new('paymentDetails.status''Status')->setChoices([
  63.                 'Pending' => 'Pending',
  64.                 'Completed' => 'Completed',
  65.                 'Refunded' => 'Refunded',
  66.             ])->hideOnIndex(),
  67.             TextField::new('paymentDetails.type''Payment Type')->setTemplatePath('admin/field/payment_type.html.twig')->hideOnForm(),
  68.             ChoiceField::new('paymentDetails.type''Payment Type')->setChoices([
  69.                 Constant::PAYMENT_EFT => Constant::PAYMENT_EFT,
  70.                 Constant::PAYMENT_CREDIT_CARD => Constant::PAYMENT_CREDIT_CARD,
  71.             ])->hideOnIndex(),
  72.         ];
  73.     }
  74.     public function createEntity(string $entityFqcn)
  75.     {
  76.         $user $this->userService->getCurrentUser();
  77.         $entity $this->orderDetailsService->createDonationOrderObj($user);
  78.         return $entity;
  79.     }
  80.     public function deleteEntity(EntityManagerInterface $entityManager$entityInstance): void
  81.     {
  82.         $paymentDetails $entityInstance->getPaymentDetails();
  83.         $paymentDetails->setStatus('archived');
  84.         
  85.         $entityManager->persist($entityInstance);
  86.         $entityManager->flush();
  87.         $this->addFlash('Receipt removed''The receipt has been removed.');     
  88.     }
  89.     public function createIndexQueryBuilder(SearchDto $searchDtoEntityDto $entityDtoFieldCollection $fieldsFilterCollection $filters): QueryBuilder
  90.     {
  91.         $user $this->getUser();
  92.         $response $this->container->get(EntityRepository::class)->createQueryBuilder($searchDto$entityDto$fields$filters);
  93.         if ($user->isAdmin()) {
  94.             $response
  95.             ->innerJoin('entity.paymentDetails','p')
  96.             ->andWhere('entity.total > 0')
  97.             ->andWhere('p.status IS NOT NULL')
  98.             // ->andWhere('p.status = :completed')
  99.             // ->setParameter('completed', 'Completed')
  100.             ->andWhere('p.status != :archived')
  101.             ->setParameter('archived''archived')
  102.             ->addOrderBy('entity.modifiedAt''DESC');
  103.             return $response;
  104.         }
  105.         $response
  106.             ->innerJoin('entity.paymentDetails','p')
  107.             ->innerJoin('entity.orderBillingDetails','ob')
  108.             ->andWhere('entity.total > 0')
  109.             ->andWhere('p.status IS NOT NULL')
  110.             // ->andWhere('(p.status != :refunded) and (p.status != :partialRefunded) and (p.status != :archived)')
  111.             ->andWhere('p.status != :archived')
  112.             ->andWhere('(ob.emailAddress = :email) or (entity.user = :userId)')
  113.             ->setParameter('email'$user->getEmail())
  114.             ->setParameter('userId'$user->getId())
  115.             // ->setParameter('refunded', 'Refunded')
  116.             ->setParameter('archived''archived')
  117.             // ->setParameter('partialRefunded', 'Partially Refunded')
  118.             ->addOrderBy('entity.modifiedAt''DESC');
  119.         return $response;
  120.     }
  121.     public function configureCrud(Crud $crud): Crud
  122.     {
  123.         $crud
  124.             ->setSearchFields(['invoiceNumber''orderBillingDetails.firstName''orderBillingDetails.lastName''type''donation.filmProject.title''filmProject.title'])
  125.             ->setPageTitle('index''View Receipts')
  126.             ->setPageTitle('new''Add New Transaction')
  127.             ->setPageTitle('edit''Edit Transaction')
  128.             ->overrideTemplate('crud/index''admin/index/index_alt.html.twig')
  129.             ->overrideTemplate('flash_messages''admin/crud/flash_messages_alt.html.twig')
  130.         ;
  131.         return $crud;
  132.     }
  133.     public function configureActions(Actions $actions): Actions
  134.     {
  135.         $viewInvoice Action::new('viewInvoice''View Receipt''')
  136.             ->setHtmlAttributes(['target' => '_blank'])
  137.             ->linkToCrudAction('viewInvoice')
  138.             ->displayIf(static function($entity) {
  139.                 $paymentDetails $entity->getPaymentDetails();
  140.                 return ($paymentDetails->getStatus() == Constant::PAYMENT_STATUS_PAID && !empty($entity->getXeroId()));
  141.             })
  142.         ;
  143.         $downloadInvoice Action::new('downloadInvoice''Download Receipt''')
  144.             ->linkToCrudAction('downloadInvoice')
  145.             ->displayIf(static function($entity) {
  146.                 $paymentDetails $entity->getPaymentDetails();
  147.                 return ($paymentDetails->getStatus() == Constant::PAYMENT_STATUS_PAID && !empty($entity->getXeroId()));
  148.             })
  149.         ;
  150.         $generateCustomInvoice Action::new('generateCustomInvoice''Download Receipt''')
  151.             ->linkToCrudAction('generateCustomInvoice')
  152.             ->displayIf(static function($entity) {
  153.                 $paymentDetails $entity->getPaymentDetails();
  154.                 return ($paymentDetails->getStatus() == Constant::PAYMENT_STATUS_PAID && !empty($entity->getXeroId()));
  155.             })
  156.         ;
  157.         $downloadInvoices Action::new('downloadInvoices''Export to PDF')
  158.             ->linkToCrudAction('downloadInvoices')
  159.         ;
  160.         
  161.         $refundTransaction Action::new('refundTransaction''Refund''')
  162.             ->linkToCrudAction('refundTransaction')
  163.             ->displayIf(static function ($entity) {
  164.                 $paymentDetails $entity->getPaymentDetails();
  165.                 $paymentStatus $paymentDetails->getStatus();
  166.                 $isRefund false;
  167.                 if ($paymentStatus == Constant::PAYMENT_STATUS_PAID && ($paymentDetails->getType() != Constant::PAYMENT_EFT)) {
  168.                     $isRefund true;
  169.                 } 
  170.                 return $isRefund;
  171.             })
  172.         ;
  173.         $getRefundInvoice Action::new('getRefundInvoice''Download Refund Bill''')
  174.             ->linkToCrudAction('getRefundInvoice')
  175.             ->displayIf(static function ($entity) {
  176.                 $isRefund $entity->isIsRefund();
  177.                 return $isRefund;
  178.             })
  179.         ;
  180.         $fixInvoice Action::new('fixInvoice''Fix Invoice''')
  181.             ->linkToCrudAction('fixInvoice')
  182.             ->displayIf(static function ($entity) {
  183.                 $xeroId $entity->getXeroId();
  184.                 return empty($xeroId);
  185.             })
  186.         ;
  187.         return $actions
  188.             ->add(Crud::PAGE_INDEX$viewInvoice)
  189.             ->add(Crud::PAGE_INDEX$generateCustomInvoice)
  190.             ->add(Crud::PAGE_INDEX$refundTransaction)
  191.             ->add(Crud::PAGE_INDEX$getRefundInvoice)
  192.             ->add(Crud::PAGE_INDEX$fixInvoice)
  193.             ->remove(Crud::PAGE_INDEXAction::NEW)
  194.             ->remove(Crud::PAGE_INDEXAction::DELETE)
  195.             //->addBatchAction($downloadInvoices)
  196.             ->reorder(Crud::PAGE_INDEX, [Action::EDIT'viewInvoice''generateCustomInvoice''refundTransaction''getRefundInvoice'])
  197.             ->setPermission(Crud::PAGE_EDITConstant::ADMIN_ROLE)
  198.             // ->setPermission(Action::DELETE, Constant::ADMIN_ROLE)
  199.             ->setPermission(Action::BATCH_DELETEConstant::ADMIN_ROLE)
  200.             ->setPermission($refundTransactionConstant::ADMIN_ROLE)
  201.             ->setPermission($getRefundInvoiceConstant::ADMIN_ROLE)
  202.         ;
  203.     }
  204.     // Custom Actions
  205.     public function viewInvoice(AdminContext $context): Response
  206.     {
  207.         $entityInstance $context->getEntity()->getInstance();
  208.         $xeroId $entityInstance->getXeroId();
  209.         return $this->redirectToRoute('app_view_custom_invoice', ['invoiceId' => $xeroId]);
  210.     }
  211.     public function downloadInvoice(AdminContext $context): Response
  212.     {
  213.         $entityInstance $context->getEntity()->getInstance();
  214.         $xeroId $entityInstance->getXeroId();
  215.         return $this->redirectToRoute('app_xero_invoice', ['invoiceId' => $xeroId]);
  216.     }
  217.     public function downloadInvoices(BatchActionDto $batchActionDto)
  218.     {
  219.         $className $batchActionDto->getEntityFqcn();
  220.         $entityManager $this->container->get('doctrine')->getManagerForClass($className);
  221.         
  222.         $invoiceIds = [];
  223.         foreach ($batchActionDto->getEntityIds() as $id) {
  224.             $orderDetails $entityManager->find($className$id);
  225.             $invoiceId $orderDetails->getXeroId();
  226.             $invoiceName 'Invoice '$orderDetails->getInvoiceNumber() .'.pdf';
  227.             $invoiceIds[$invoiceName] = $invoiceId;
  228.         }
  229.         $this->orderDetailsService->downloadInvoicesByInvoiceIds($invoiceIds);
  230.     }
  231.     public function refundTransaction(AdminContext $context): Response
  232.     {
  233.         $entityInstance $context->getEntity()->getInstance();
  234.         $this->orderDetailsService->refundTransaction($entityInstance);
  235.         $donationIndexUrl $this->adminUrlGenerator->setController(OrderDetailsCrudController::class)
  236.             ->setAction(Action::INDEX)
  237.             ->generateUrl();
  238.         $this->addFlash('success''The receipt has been refunded.');
  239.         return new RedirectResponse($donationIndexUrl);
  240.     }
  241.     public function getRefundInvoice(AdminContext $context): Response
  242.     {
  243.         $entityInstance $context->getEntity()->getInstance();
  244.         $xeroId $entityInstance->getRefundXeroId();
  245.         return $this->redirectToRoute('app_xero_refund_invoice', ['invoiceId' => $xeroId]);
  246.     }
  247.     /**
  248.      * Generates invoice through custom pdf exporter
  249.      */
  250.     public function generateCustomInvoice(AdminContext $contextEnvironment $twig nullPdf $pdf)
  251.     {
  252.         $orderDetails $context->getEntity()->getInstance();
  253.         $pdfExporter = new PdfExporter($twig$pdf);
  254.         if (!empty($orderDetails->getFilmProject())) {
  255.             $pdfExporter->convertFilmReceiptPdf($orderDetails);
  256.         } else {
  257.             $pdfExporter->convertDonationReceiptPdf($orderDetails);
  258.         }
  259.     }
  260.     public function fixInvoice(AdminContext $contextFilmApplicationService $filmApplicationServiceDonationService $donationService): Response
  261.     {
  262.         $orderIndexUrl $this->adminUrlGenerator->setController(OrderDetailsCrudController::class)
  263.             ->setAction(Action::INDEX)
  264.             ->generateUrl();
  265.         $orderDetails $context->getEntity()->getInstance();
  266.         assert($orderDetails instanceof OrderDetails); // ensure orderDetails is an instance of OrderDetails
  267.         if ($orderDetails->getType() == Constant::DONATION_PRODUCT_TYPE) { // Donation
  268.             $donation $orderDetails->getDonation();
  269.             if (!$donation) {
  270.                 $this->addFlash('failed''Donation doesn\'t exist in this order.');
  271.                 return new RedirectResponse(($orderIndexUrl));
  272.             }
  273.             $donationService->dispatchPersistEntity($donation);
  274.         } else { // Film Application
  275.             $user $orderDetails->getUser() ?? $this->getUser();
  276.             $filmApplicationService->createFilmProjectInvoice($user$orderDetails->getFilmProject()); // Re-create Xero ID
  277.         }
  278.         $this->addFlash('success''The invoice has been fixed.');
  279.         return new RedirectResponse(($orderIndexUrl));
  280.     }
  281. }