src/IlaveU/FrontBundle/Themes/IlaveU/Controller/ShopAdmin/Order/OrderCrudController.php line 257

  1. <?php
  2. namespace App\IlaveU\FrontBundle\Themes\IlaveU\Controller\ShopAdmin\Order;
  3. use App\IlaveU\FrontBundle\Themes\IlaveU\Form\Order\MetaDataType;
  4. use App\IlaveU\ShopBundle\Entity\Shipping\StepType;
  5. use App\IlaveU\ShopBundle\Entity\Customer\Customer;
  6. use App\IlaveU\ShopBundle\Entity\Order\Order;
  7. use App\IlaveU\ShopBundle\Entity\Resource\Agent;
  8. use App\IlaveU\ShopBundle\Entity\Store\Store;
  9. use App\IlaveU\ShopBundle\Entity\Vendor\Vendor;
  10. use App\IlaveU\ShopBundle\Filter\Order\OrderNumberFilter;
  11. use App\IlaveU\ShopBundle\Filter\Order\OrderPaymentStatusFilter;
  12. use App\IlaveU\ShopBundle\Filter\Order\OrderProductFilter;
  13. use App\IlaveU\ShopBundle\Filter\Order\OrderShippingStatusFilter;
  14. use App\IlaveU\ShopBundle\Form\Order\OrderItemType;
  15. use App\IlaveU\ShopBundle\Repository\Order\OrderRepository;
  16. use App\Service\IlaveUSettingsProvider;
  17. use Doctrine\ORM\EntityManagerInterface;
  18. use EasyCorp\Bundle\EasyAdminBundle\Config\Action;
  19. use EasyCorp\Bundle\EasyAdminBundle\Config\Actions;
  20. use EasyCorp\Bundle\EasyAdminBundle\Config\Crud;
  21. use EasyCorp\Bundle\EasyAdminBundle\Config\Filters;
  22. use EasyCorp\Bundle\EasyAdminBundle\Field\IdField;
  23. use EasyCorp\Bundle\EasyAdminBundle\Field\TextField;
  24. use EasyCorp\Bundle\EasyAdminBundle\Field\TextareaField;
  25. use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractCrudController;
  26. use EasyCorp\Bundle\EasyAdminBundle\Field\AssociationField;
  27. use EasyCorp\Bundle\EasyAdminBundle\Field\CollectionField;
  28. use EasyCorp\Bundle\EasyAdminBundle\Field\DateTimeField;
  29. use EasyCorp\Bundle\EasyAdminBundle\Field\Field;
  30. use EasyCorp\Bundle\EasyAdminBundle\Field\FormField;
  31. use Doctrine\ORM\QueryBuilder;
  32. use Doctrine\Persistence\ManagerRegistry;
  33. use EasyCorp\Bundle\EasyAdminBundle\Dto\EntityDto;
  34. use EasyCorp\Bundle\EasyAdminBundle\Dto\FieldDto;
  35. use EasyCorp\Bundle\EasyAdminBundle\Dto\SearchDto;
  36. use EasyCorp\Bundle\EasyAdminBundle\Orm\EntityRepository;
  37. use EasyCorp\Bundle\EasyAdminBundle\Collection\FieldCollection;
  38. use EasyCorp\Bundle\EasyAdminBundle\Collection\FilterCollection;
  39. use EasyCorp\Bundle\EasyAdminBundle\Config\KeyValueStore;
  40. use EasyCorp\Bundle\EasyAdminBundle\Context\AdminContext;
  41. use EasyCorp\Bundle\EasyAdminBundle\Field\BooleanField;
  42. use EasyCorp\Bundle\EasyAdminBundle\Field\ChoiceField;
  43. use EasyCorp\Bundle\EasyAdminBundle\Field\DateField;
  44. use EasyCorp\Bundle\EasyAdminBundle\Field\MoneyField;
  45. use EasyCorp\Bundle\EasyAdminBundle\Field\NumberField;
  46. use EasyCorp\Bundle\EasyAdminBundle\Filter\EntityFilter;
  47. use EasyCorp\Bundle\EasyAdminBundle\Filter\ChoiceFilter;
  48. use EasyCorp\Bundle\EasyAdminBundle\Router\AdminUrlGenerator;
  49. use Symfony\Component\HttpFoundation\Request;
  50. use Symfony\Component\Routing\Annotation\Route;
  51. class OrderCrudController extends AbstractCrudController
  52. {
  53.     public function __construct(private readonly ManagerRegistry $doctrine, private readonly EntityRepository $entityRepository)
  54.     {
  55.     }
  56.     public static function getEntityFqcn(): string
  57.     {
  58.         return Order::class;
  59.     }
  60.     
  61.     public function createIndexQueryBuilder(SearchDto $searchDtoEntityDto $entityDtoFieldCollection $fieldsFilterCollection $filters): QueryBuilder
  62.     {
  63.         $em $this->doctrine->getManager();
  64.         
  65.         
  66.         parent::createIndexQueryBuilder($searchDto$entityDto$fields$filters);
  67.         
  68.         
  69.         $response $this->entityRepository->createQueryBuilder($searchDto$entityDto$fields$filters);
  70.         $response->leftJoin("entity.customer","customer");
  71.         $response->andWhere("entity.status <> 'draft'");
  72.         $response->andWhere("customer IS NOT NULL AND customer.deletedAt IS NULL ");
  73.         if($this->isGranted("ROLE_VENDOR")){
  74.             
  75.             $vendor $em->getRepository(Vendor::class)->findOneBy(["user"=>$this->getUser()]);
  76.             $response->leftJoin("entity.orderItems ","orderItems");
  77.             $response->leftJoin("orderItems.product ","product");
  78.             $response->leftJoin("entity.vendor ","vendor");
  79.             $response->andWhere("vendor = :vendor");
  80.             $response->andWhere("entity.startDeliveryAt IS NOT NULL AND entity.deliveryType IS NOT NULL");
  81.             $response->setParameter("vendor",$vendor);
  82.         }
  83.         elseif($this->isGranted("ROLE_AGENT")){
  84.             
  85.             $agent $em->getRepository(Agent::class)->findOneBy(["user"=>$this->getUser()]);
  86.             $response->leftJoin("entity.agent ","agent");
  87.             $response->andWhere("agent = :agent");
  88.             $response->andWhere("entity.startDeliveryAt IS NOT NULL AND entity.deliveryType IS NOT NULL");
  89.             $response->setParameter("agent",$agent);
  90.         }
  91.         elseif($this->isGranted("ROLE_STORE")){
  92.             
  93.             $store $em->getRepository(Store::class)->findOneBy(["user"=>$this->getUser()]);
  94.             $response->leftJoin("entity.store ","store");
  95.             $response->andWhere("store = :store");
  96.             $response->andWhere("entity.startDeliveryAt IS NOT NULL AND entity.deliveryType IS NOT NULL");
  97.             $response->setParameter("store",$store);
  98.         }
  99.         else{
  100.             $response->leftJoin("entity.orderItems ","orderItems");
  101.             $response->leftJoin("orderItems.product ","product");
  102.             $response->andWhere("product.vendor IS NULL");
  103.             $response->andWhere("entity.startProcessingAt IS NOT NULL");
  104.         }
  105.         
  106.         return $response;
  107.     }
  108.     public function persistEntity(EntityManagerInterface $entityManager$entityInstance): void
  109.     {
  110.         $customer $entityInstance->getCustomer();
  111.         if(!$entityInstance->getCustomer()){
  112.             $customer = new Customer;
  113.             $customer->setFirstName($entityInstance->getFirstName());
  114.             $customer->setLastName($entityInstance->getLastName());
  115.             $customer->setPhone($entityInstance->getTel());
  116.             $customer->setEmail($entityInstance->getEmail());
  117.             $entityManager->persist($customer);
  118.         }
  119.         
  120.         $orderItems $entityInstance->getOrderItems();
  121.         $arrayCartLdryOrder = [];
  122.         foreach($orderItems as $singleOrderItem){
  123.             // Categories 
  124.             $product $singleOrderItem->getProduct();
  125.             
  126.             $singleOrderItem->setPrice($product->getPrice());
  127.             $singleOrderItem->setParentOrder($entityInstance);
  128.             $entityManager->persist($singleOrderItem);
  129.             
  130.         }
  131.         
  132.         
  133.         $entityInstance->setCountry("Maroc");
  134.         $entityInstance->setCustomer($customer);
  135.         $entityManager->persist($entityInstance);
  136.         $entityManager->flush();
  137.     }
  138.     
  139.     public function updateEntity(EntityManagerInterface $entityManager$entityInstance): void
  140.     {
  141.         $orderItems $entityInstance->getOrderItems();
  142.         foreach($orderItems as $singleOrderItem){
  143.             if($singleOrderItem->getPrice() == null){
  144.                 $product $singleOrderItem->getProduct();
  145.                 $singleOrderItem->setPrice($product->getPrice());
  146.             }
  147.             $singleOrderItem->setParentOrder($entityInstance);
  148.             
  149.             
  150.             $entityManager->persist($singleOrderItem);
  151.             
  152.         }
  153.         $entityManager->persist($entityInstance);
  154.         $entityManager->flush();
  155.     }
  156.     public function configureFilters(Filters $filters): Filters
  157.     {
  158.         $stepTypes $this->doctrine->getRepository(StepType::class)->findBy([], ['priority' => 'ASC']);
  159.         $choices = [];
  160.         foreach ($stepTypes as $stepType) {
  161.             // Key = label visible in dropdown, Value = actual stored code
  162.             $choices[$stepType->getName()] = $stepType->getCode();
  163.         }
  164.         // Create your filter instance passing choices
  165.         $shippingStatusFilter OrderShippingStatusFilter::new('statusShipping'$choices'Statut de livraison');
  166.         return $filters
  167.                 
  168.                 ->add(OrderNumberFilter::new())
  169.                 ->add(OrderProductFilter::new())
  170.                 ->add("customer")
  171.                 ->add("createdAt","Date de creation")
  172.                 ->add("startProcessingAt")
  173.                 ->add("startDeliveryAt")
  174.                 ->add("source")
  175.                 ->add("shippingMethod")
  176.                 ->add("agent")
  177.                 ->add("store")
  178.                 ->add(OrderPaymentStatusFilter::new('status''Statut de réglement'))
  179.                 ->add($shippingStatusFilter)
  180.                 ;
  181.     }
  182.     
  183.     public function configureCrud(Crud $crud): Crud
  184.     {
  185.         return $crud
  186.         ->setDefaultSort(['createdAt' => 'DESC'])
  187.         ->setPaginatorPageSize(20)
  188.         ->overrideTemplates([
  189.             "crud/detail"=>"@IlaveU/FrontBundle/Themes/IlaveU/templates/admin/shopadmin/order/orderDetail.html.twig",
  190.             //"crud/index"=>"@IlaveU/ShopBundle/templates/orders/index.html.twig",
  191.         ])
  192.         ->renderContentMaximized(true)
  193.         ;
  194.     }
  195.     public function configureActions(Actions $actions): Actions
  196.     {
  197.         $editOrder Action::new('editOrder''Modifier la commande'null)
  198.             
  199.             ->linkToRoute('admin_pos_ilaveu', fn(Order $order): array => [
  200.                 'orderId' =>$order->getId(),
  201.             ])->setIcon("fa fa-link");
  202.         $printOrder Action::new('printOrder''Imprimer'null)
  203.             
  204.             ->linkToRoute('order_ticket', fn(Order $order): array => [
  205.                 'id' =>$order->getId(),
  206.             ])->setLabel("Imprimer ticket")->setIcon("fa fa-link");
  207.         $exportExcel Action::new('exportExcel')
  208.             ->linkToCrudAction('exportExcel')
  209.             ->setCssClass('btn btn-primary action-foo')
  210.             ->setIcon("fa-solid fa-file-excel")
  211.             ->setLabel("Exporter en excel")
  212.             ->createAsGlobalAction();
  213.             
  214.         return $actions
  215.             ->add(Crud::PAGE_INDEXAction::DETAIL, fn(Action $action) => $action->setIcon("fa fa-link")->setLabel("Consulter"))
  216.             ->add(Crud::PAGE_INDEX$exportExcel)
  217.             ->add(Crud::PAGE_INDEX$editOrder)
  218.             ->add(Crud::PAGE_INDEX,$printOrder)
  219.             //->remove(Crud::PAGE_INDEX, Action::EDIT)
  220.             ->update(Crud::PAGE_INDEXAction::EDIT, fn(Action $action) => $action->setIcon("fa fa-link")->setLabel("Affectation"))
  221.             ->remove(Crud::PAGE_INDEXAction::DELETE)
  222.             ->remove(Crud::PAGE_INDEXAction::NEW)
  223.         ;
  224.     }
  225.     public function exportExcel(AdminContext $context)
  226.     {
  227.         
  228.         $url $this->container->get(AdminUrlGenerator::class)
  229.             ->setController(ExportExcelOrderCrudController::class)
  230.             ->setAction(Action::NEW)
  231.             ->generateUrl();
  232.             return $this->redirect($url);
  233.     }
  234.     #[Route("/pos-ilaveu/{_locale}",name:"admin_pos_ilaveu")]
  235.     public function posSystem(IlaveUSettingsProvider $ilaveSettingsProvider,Request $request,OrderRepository $orderRepository)
  236.     {
  237.         $order null;
  238.         if( array_key_exists("routeParams",$request->query->all())){
  239.             $orderId $request->query->all()["routeParams"]["orderId"];
  240.             $order $orderRepository->find((int)$orderId);
  241.         }
  242.         return $this->render("@IlaveU/FrontBundle/Themes/IlaveU/templates/admin/shopadmin/order/possystem.html.twig",[
  243.             'order'=>$order
  244.         ]);
  245.     }
  246.     #[Route("/orders/ticket/{id}",name:"order_ticket")]
  247.     public function printTicket(Order $order)
  248.     {
  249.             return $this->render("@IlaveU/Apps/EcommerceBundle/templates/order/thermalTicket.html.twig",[
  250.                 "order" => $order,
  251.             ]);
  252.     }
  253.     public function configureFields(string $pageName): iterable
  254.     {
  255.         return [
  256.             FormField::addTab("Detail de la commande"),
  257.             
  258.             TextField::new('idPrefixed',"Num CMD")->setDisabled(true)->setTemplatePath("@IlaveU/FrontBundle/Themes/IlaveU/templates/admin/shopadmin/order/field/idPrefixedWithBadge.html.twig"),
  259.             //AssociationField::new('customer')->setTemplatePath("@IlaveU/ShopBundle/templates/orders/field/customer.html.twig")->onlyOnIndex(),
  260.             AssociationField::new('customer',"Client")->setTemplatePath("@IlaveU/FrontBundle/Themes/IlaveU/templates/admin/shopadmin/order/field/customer.html.twig")->onlyOnIndex(),
  261.             //MoneyField::new('walletPaymentAmount',"Crédit utilisé")->setCurrency("MAD")->onlyOnIndex(),
  262.             
  263.             MoneyField::new("fullTotalAmount","Montant")->setCurrency("MAD")->setStoredAsCents(false)->onlyOnIndex()->setTemplatePath("@IlaveU/FrontBundle/Themes/IlaveU/templates/admin/shopadmin/order/field/fullTotalAmount.html.twig"),
  264.             MoneyField::new("fullRestAmount","Reste à payer")->setCurrency("MAD")->setStoredAsCents(false)->onlyOnIndex()
  265.             ->setTemplatePath("@IlaveU/FrontBundle/Themes/IlaveU/templates/admin/shopadmin/order/field/fullRestAmount.html.twig"),
  266.             
  267.             TextField::new('tel')->onlyOnIndex()->setTemplatePath("@IlaveU/FrontBundle/Themes/IlaveU/templates/admin/shopadmin/order/field/tel.html.twig"),
  268.             DateTimeField::new('createdAt',"Date de création")->onlyOnIndex(),
  269.             DateTimeField::new('startProcessingAt',"Date Collecte")->setTemplatePath("@IlaveU/ShopBundle/templates/orders/field/startCollectAt.html.twig")->onlyOnIndex(),
  270.             DateTimeField::new('startDeliveryAt',"Date Liv")->setTemplatePath("@IlaveU/ShopBundle/templates/orders/field/startDeliveryAt.html.twig")->onlyOnIndex(),
  271.             ChoiceField::new('source')->setChoices([
  272.                 "Old Mobile APP"=>"old-mobile-app",
  273.                 "Old WebSite"=>"old-website",
  274.                 "Old ADMIN"=>"old-admin",
  275.                 "Old POS"=>"old-pos",
  276.                 "ADMIN"=>"admin",
  277.                 "Comptoir"=>"pos",
  278.                 "WEBSITE"=>"website",
  279.                 "App mobile"=>"mobile",
  280.             ])->onlyOnIndex(),
  281.             AssociationField::new('shippingMethod',"Mode de livraison")->onlyOnIndex(),
  282.             
  283.             ChoiceField::new('deliveryType',"Type de collecte")->setChoices([
  284.                 "Client comptoire"=>"on-store",
  285.                 "Collecte et livraison"=>"collecte-and-delivery",
  286.                 "Collecte"=>"collecte",
  287.                 "Livraison"=>"delivery",
  288.             ])->setTemplatePath("@IlaveU/ShopBundle/templates/orders/field/badgeText.html.twig")->onlyOnIndex(),
  289.             
  290.              AssociationField::new('agent',"Livreur")->setQueryBuilder(function($queryBuilder){
  291.                 $queryBuilder->leftJoin("entity.user","user");
  292.                 $queryBuilder->andWhere('user.roles LIKE :role');
  293.                 $queryBuilder->andWhere('user.isValid = TRUE');
  294.                 $queryBuilder->setParameter("role","%ROLE_SHIPPING_AGENT%");
  295.             }),
  296.             
  297.             AssociationField::new('store',"Magasin")->setPermission("ROLE_ADMIN"),
  298.             TextField::new('collectAddress',"Adr. Collecte"),
  299.             TextField::new('shippingAddress',"Adr. Livraison"),
  300.             MoneyField::new('shippingTips',"Pourboire")->setStoredAsCents(false)->onlyOnIndex()->setPermission("ROLE_AGENT")->setCurrency('EUR'),
  301.             BooleanField::new('isToDo',"Ajouter à mon programme")->onlyOnIndex()->setPermission("ROLE_AGENT"),
  302.             //FormField::addTab("Montant payé")->onlyOnIndex(),
  303.             // NumberField::new("payedAmount","Montant payé")->setTemplatePath("@IlaveU/ShopBundle/templates/orders/field/payedAmount.html.twig")->onlyOnIndex(),
  304.             ChoiceField::new('status',"Status de réglement")->setChoices([
  305.                 "Non complété"=>"draft",                
  306.                 "En attente"=>"waiting",
  307.                 "En cours de prépratation"=>"processing",
  308.                 "En cours de livraison"=>"shipping",
  309.                 "Articles livrés"=>"shipped",
  310.                 "Annulé"=>"cancelled",
  311.             ])->setTemplatePath("@IlaveU/FrontBundle/Themes/IlaveU/templates/admin/shopadmin/order/field/statusOrderPayment.html.twig")->onlyOnIndex(),
  312.             TextField::new("statusShipping","Status de livraison")->setTemplatePath("@IlaveU/FrontBundle/Themes/IlaveU/templates/admin/shopadmin/order/field/statusOrderShipping.html.twig")->onlyOnIndex()->onlyOnIndex(),
  313.         ];
  314.     }
  315.     
  316. }