src/Controller/Admin/ProductController.php line 51

Open in your IDE?
  1. <?php
  2. namespace EADPlataforma\Controller\Admin;
  3. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Cache;
  4. use Symfony\Component\HttpFoundation\Request;
  5. use Symfony\Component\Routing\Annotation\Route;
  6. use EADPlataforma\Entity\Product;
  7. use EADPlataforma\Entity\ProductOffer;
  8. use EADPlataforma\Entity\ProductPage;
  9. use EADPlataforma\Entity\ProductTeam;
  10. use EADPlataforma\Entity\Category;
  11. use EADPlataforma\Entity\Course;
  12. use EADPlataforma\Entity\Faq;
  13. use EADPlataforma\Entity\Group;
  14. use EADPlataforma\Entity\CycleItem;
  15. use EADPlataforma\Entity\Enrollment;
  16. use EADPlataforma\Entity\User;
  17. use EADPlataforma\Entity\UserSubscription;
  18. use EADPlataforma\Enum\ProductEnum;
  19. use EADPlataforma\Enum\ProductPageEnum;
  20. use EADPlataforma\Enum\ProductTeamEnum;
  21. use EADPlataforma\Enum\ProductOfferEnum;
  22. use EADPlataforma\Enum\UserSubscriptionEnum;
  23. use EADPlataforma\Enum\ErrorEnum;
  24. /**
  25.  * @Route(
  26.  *      path          = "/admin/product",
  27.  *      schemes         = {"http|https"}
  28.  * )
  29.  * @Cache(
  30.  *      maxage          = "0",
  31.  *      smaxage         = "0",
  32.  *      expires         = "now",
  33.  *      public          = false
  34.  * )
  35.  */
  36. class ProductController extends AbstractController {
  37.     public function getEntityClass(){
  38.         return Product::class;
  39.     }
  40.     /**
  41.      * @Route(
  42.      *      path          = "/list/",
  43.      *      methods       = {"GET"},
  44.      * )
  45.      */
  46.     public function getProductPaginate(Request $request) {
  47.         $p1 $this->userPermissionUtil->getPermission("product""see");
  48.         $p2 $this->userPermissionUtil->getPermission(
  49.             "product""product_coupon""create"
  50.         );
  51.         $p3 $this->userPermissionUtil->getPermission(
  52.             "product""product_coupon""edit"
  53.         );
  54.         if(
  55.             $this->userPermissionUtil->isLow($p1) && 
  56.             $this->userPermissionUtil->isLow($p2) && 
  57.             $this->userPermissionUtil->isLow($p3)
  58.         ){
  59.             return $this->eadResponse(nullErrorEnum::PERMISSION);
  60.         }
  61.         $this->requestUtil->setRequest($request)->setData();
  62.         $userOnId $this->user->getId();
  63.         $userClass User::class;
  64.         $productTeamClass ProductTeam::class;
  65.         $productOfferClass ProductOffer::class;
  66.         $courseClass Course::class;
  67.         $categoryClass Category::class;
  68.         $columns = [
  69.             "p.id"
  70.             "p.status",
  71.             "p.title",
  72.             "p.order",
  73.             "p.type",
  74.             "u.name"
  75.             "u.photo",
  76.             "u.email",
  77.             "u.id AS userId",
  78.             "DATE_FORMAT(p.dateDelete, '%Y-%m-%d %H:%i:%s') AS dateDelete",
  79.             "ud.name AS userDelete"
  80.         ];
  81.         $columnNotUseInFilter = [
  82.             "(CASE WHEN p.id IN ( 
  83.                     SELECT
  84.                        IDENTITY(pt.product)
  85.                     FROM {$productTeamClass} AS pt 
  86.                     WHERE pt.deleted = 0 
  87.                     AND pt.user = {$userOnId}
  88.             ) THEN 1 ELSE 0 END ) AS isInTeam "
  89.         ];
  90.         $joins = [
  91.             "{$userClass} AS u" => "u.id = p.user",
  92.             "{$userClass} AS ud" => ["LEFT""ud.id = p.userDelete"]
  93.         ];
  94.         $courseIdNotInclude = (int)$this->requestUtil->getField('courseIdNotInclude');
  95.         if($courseIdNotInclude 0){
  96.             $courseType ProductEnum::COURSE;
  97.             $joins["{$courseClass} AS c"] = "
  98.                 p NOT MEMBER OF c.product
  99.                 AND c.deleted = 0 
  100.                 AND c.id = {$courseIdNotInclude}
  101.                 AND ( SIZE(p.course) = 0 OR p.type != {$courseType} )
  102.             ";
  103.         }
  104.         $courseId $this->requestUtil->getField('course');
  105.         if($courseId 0){
  106.             $joins["{$courseClass} AS c"] = 
  107.                 p MEMBER OF c.product 
  108.                 AND c.deleted = 0 
  109.                 AND c.id = {$courseId} ";
  110.         }
  111.         $categoryId $this->requestUtil->getField('category');
  112.         if($categoryId 0){
  113.             $joins["{$categoryClass} AS cat"] = 
  114.                 p MEMBER OF cat.product 
  115.                 AND cat.deleted = 0 
  116.                 AND cat.id = {$categoryId} ";
  117.         }
  118.         $filter = [];
  119.         $filterDelete $this->requestUtil->getDeletedParam();
  120.         $filter["whereText"] = " p.id > 0 ";
  121.         if(
  122.             !$this->userPermissionUtil->isHigh($p1) && 
  123.             !$this->userPermissionUtil->isHigh($p2) && 
  124.             !$this->userPermissionUtil->isHigh($p3)
  125.         ){
  126.             $filter["whereText"] .= " AND p.id IN ( 
  127.                                         SELECT
  128.                                            IDENTITY(pteam.product)
  129.                                         FROM {$productTeamClass} AS pteam 
  130.                                         WHERE pteam.deleted = 0 
  131.                                         AND pteam.user = {$userOnId}
  132.                                     ) ";
  133.         }
  134.         $productId = (int)$this->requestUtil->getField('product');
  135.         $status $this->requestUtil->getField('status');
  136.         $type = (int)$this->requestUtil->getField('type');
  137.         $isCharge = (int)$this->requestUtil->getField('isCharge');
  138.         $hasOffer = (int)$this->requestUtil->getField('hasOffer');
  139.         $types json_decode($this->requestUtil->getField('types'));
  140.         $isOrderBump = (int)$this->requestUtil->getField('isOrderBump');
  141.         $orderParam $this->requestUtil->getField('order');
  142.         $searchText $this->requestUtil->getField('searchText');
  143.         $limit = (int)$this->requestUtil->getField('limit');
  144.         $offset = (int)$this->requestUtil->getField('offset');
  145.         $yes ProductEnum::YES;
  146.         $offerDeleted ProductOfferEnum::ITEM_NO_DELETED;
  147.         $offerPublished ProductOfferEnum::PUBLISHED;
  148.         $draft ProductEnum::DRAFT;
  149.         if($isCharge == ProductEnum::YES){
  150.             $filter["whereText"] .= 
  151.                 AND p.status != {$draft}
  152.                 AND p.id IN ( 
  153.                     SELECT
  154.                        IDENTITY(po.product)
  155.                     FROM {$productOfferClass} AS po 
  156.                     WHERE po.deleted = {$offerDeleted}
  157.                     AND po.status = {$offerPublished}
  158.                 )
  159.             ";
  160.         }
  161.         if($hasOffer == ProductEnum::YES){
  162.             $filter["whereText"] .= 
  163.                 AND p.status != {$draft}
  164.                 AND p.id IN ( 
  165.                     SELECT
  166.                        IDENTITY(po.product)
  167.                     FROM {$productOfferClass} AS po 
  168.                     WHERE po.deleted = {$offerDeleted}
  169.                     AND po.status = {$offerPublished}
  170.                 )
  171.             ";
  172.         }
  173.         $free ProductOfferEnum::FREE;
  174.         if($isOrderBump == ProductEnum::YES){
  175.             $filter["whereText"] .= 
  176.                 AND p.status != {$draft}
  177.                 AND p.id IN ( 
  178.                     SELECT
  179.                        IDENTITY(po.product)
  180.                     FROM {$productOfferClass} AS po 
  181.                     WHERE po.deleted = {$offerDeleted}
  182.                     AND po.status = {$offerPublished}
  183.                     AND po.saleOption != {$free}
  184.                 )
  185.             ";
  186.         }
  187.         if(!empty($userId)){
  188.             $filter["p.user"] = $userId;
  189.         }
  190.         if(!empty($productId)){
  191.             $filter["p.id"] = $productId;
  192.         }
  193.         if(!is_null($status) && is_numeric($status)){
  194.             $filter["p.status"] = $status;
  195.         }
  196.         if(!empty($type)){
  197.             $filter["p.type"] = $type;
  198.         }
  199.         if(!empty($types) && is_array($types)){
  200.             $typesFilter null;
  201.             $typesFilter .= ' AND (  ';
  202.             foreach ($types as $key => $value) {
  203.                 if($key == 0){
  204.                     $typesFilter .= " p.type = {$value} ";
  205.                 }else{
  206.                     $typesFilter .= " OR p.type = {$value} ";
  207.                 }
  208.             }
  209.             $typesFilter .= ' ) ';
  210.             $filter["whereText"] .= $typesFilter;
  211.         }
  212.         $order = [ "p.order" => "DESC" ];
  213.         if(!empty($orderParam)){
  214.             $order json_decode($orderParamtrue);
  215.         }
  216.         $data $this->repository->paginate(
  217.             "p"
  218.             $searchText
  219.             $columns
  220.             $joins
  221.             $filter
  222.             $order
  223.             $limit
  224.             $offset
  225.             $filterDelete,
  226.             false,
  227.             $columnNotUseInFilter
  228.         );
  229.         return $this->eadResponse($data);
  230.     }
  231.     /**
  232.      * @Route(
  233.      *      path          = "/list/related",
  234.      *      methods       = {"GET"},
  235.      * )
  236.      */
  237.     public function getProductRelated(Request $request) {
  238.         $permission $this->userPermissionUtil->getPermission("product""see");
  239.         if($this->userPermissionUtil->isLow($permission)){
  240.             return $this->eadResponse(nullErrorEnum::PERMISSION);
  241.         }
  242.         $productId = (int)$request->get('product');
  243.         $products $this->repository->getProductRelated($productId);
  244.         return $this->eadResponse($products);
  245.     }
  246.     /**
  247.      * @Route(
  248.      *      path          = "/list/select",
  249.      *      methods       = {"GET"},
  250.      * )
  251.      */
  252.     public function getProductToSelect(Request $request) {
  253.         $permission $this->userPermissionUtil->getPermission("product""see");
  254.         if($this->userPermissionUtil->isLow($permission)){
  255.             return $this->eadResponse(nullErrorEnum::PERMISSION);
  256.         }
  257.         $this->requestUtil->setRequest($request)->setData();
  258.         $type = (int)$this->requestUtil->getField('type');
  259.         $products $this->repository->getProductToSelect($type);
  260.         return $this->eadResponse($products);
  261.     }
  262.     /**
  263.      * @Route(
  264.      *      path          = "/check/user/{id}",
  265.      *      methods       = {"GET"},
  266.      *      requirements  = { "id" = "\d+" }
  267.      * )
  268.      */
  269.     public function checkIsInProduct(Request $request){
  270.         $productId $request->get('id');
  271.         $product $this->repository->findOneBy([
  272.             "id" => $productId,
  273.             "deleted" => ProductEnum::ITEM_NO_DELETED
  274.         ]);
  275.         
  276.         if (!$product) {
  277.             return $this->eadResponse(nullErrorEnum::NOT_FOUND);
  278.         }
  279.         $isInTeam $this->em->getRepository(ProductTeam::class)->userExistInProductTeam(
  280.             $product
  281.             $this->user
  282.         );
  283.         return $this->eadResponse([ "is" => ( $isInTeam ) ]);
  284.     }
  285.     /**
  286.      * @Route(
  287.      *      path          = "/check/link/{productLink}",
  288.      *      methods       = {"GET"}
  289.      * )
  290.      */
  291.     public function checkExistProductLink(Request $request){
  292.         $productLink $request->get('productLink');
  293.         $productLink $this->stringUtil->slug($productLink);
  294.         $product $this->repository->findOneBy([
  295.             "productLink" => $productLink,
  296.             "deleted" => ProductEnum::ITEM_NO_DELETED
  297.         ]);
  298.         
  299.         return $this->eadResponse([ "exist" => ( $product ) ]);
  300.     }
  301.     /**
  302.      * @Route(
  303.      *      path          = "/detail/{id}",
  304.      *      methods       = {"GET"},
  305.      *      requirements  = { "id" = "\d+" }
  306.      * )
  307.      */
  308.     public function getProduct(Request $request) {
  309.         $permission $this->userPermissionUtil->getPermission("product""see");
  310.         if($this->userPermissionUtil->isLow($permission)){
  311.             return $this->eadResponse(nullErrorEnum::PERMISSION);
  312.         }
  313.         $this->requestUtil->setRequest($request)->setData();
  314.         $ignoreOption $this->requestUtil->getField('ignoreOption');
  315.         $productId $request->get('id');
  316.         if($ignoreOption == ProductEnum::ITEM_ON_TRASH){
  317.             $product $this->repository->findOneBy([
  318.                 "id" => $productId
  319.             ]);
  320.         }
  321.         if($ignoreOption == ProductEnum::ITEM_NO_DELETED || !$ignoreOption){
  322.             $product $this->repository->findOneBy([
  323.                 "id" => $productId,
  324.                 "deleted" => ProductEnum::ITEM_NO_DELETED
  325.             ]);
  326.         }
  327.         
  328.         if (!$product) {
  329.             return $this->eadResponse(nullErrorEnum::NOT_FOUND);
  330.         }
  331.         $productTeamRepository $this->em->getRepository(ProductTeam::class);
  332.         $isInTeam $productTeamRepository->userExistInProductTeam(
  333.             $product
  334.             $this->user
  335.         );
  336.         if(!$isInTeam && $this->userPermissionUtil->isMiddle($permission)){
  337.             return $this->eadResponse(nullErrorEnum::PERMISSION);
  338.         }
  339.         $productTeam $productTeamRepository->findOneBy([
  340.             "product" => $product->getId(),
  341.             "user" => $product->getUser()->getId(),
  342.             "deleted" => ProductTeamEnum::ITEM_NO_DELETED
  343.         ]);
  344.         $data $product->toReturn();
  345.         $data['productTeam'] = ($productTeam $productTeam->getId() : null);
  346.         $data['isInTeam'] = $isInTeam;
  347.         $data['urlProductPage'] = "{$this->eadDomain}{$product->getProductTypeText()}/";
  348.         return $this->eadResponse($data);
  349.     }
  350.     /**
  351.      * @Route(
  352.      *      path          = "/certificate/origin/{id}",
  353.      *      methods       = {"GET"},
  354.      *      defaults      = {"id": null}
  355.      * )
  356.      */
  357.     public function getProductCertificateOrigin(Request $request) {
  358.         $p1 $this->userPermissionUtil->getPermission("product""see");
  359.         $p2 $this->userPermissionUtil->getPermission("product""create");
  360.         $p3 $this->userPermissionUtil->getPermission("product""general");
  361.         if(
  362.             $this->userPermissionUtil->isLow($p1) && 
  363.             $this->userPermissionUtil->isLow($p2) && 
  364.             $this->userPermissionUtil->isLow($p3)
  365.         ){
  366.             return $this->eadResponse(nullErrorEnum::PERMISSION);
  367.         }
  368.         $productId = (int)$request->get('id');
  369.         $product $this->repository->findOneBy([
  370.             "id" => $productId,
  371.             "deleted" => ProductEnum::ITEM_NO_DELETED
  372.         ]);
  373.         
  374.         $data $this->em->getRepository(Enrollment::class)->getEnrollmentOrigins();
  375.         $dataSave null;
  376.         if ($product) {
  377.             $isInTeam $this->em->getRepository(ProductTeam::class)->userExistInProductTeam(
  378.                 $product
  379.                 $this->user
  380.             );
  381.             if(
  382.                 !$isInTeam && 
  383.                 $this->userPermissionUtil->isMiddle($p1) && 
  384.                 $this->userPermissionUtil->isMiddle($p2) && 
  385.                 $this->userPermissionUtil->isMiddle($p3)
  386.             ){
  387.                 return $this->eadResponse(nullErrorEnum::PERMISSION);
  388.             }
  389.             
  390.             $dataSave $product->getCertificateEnrollmentOrigin();
  391.         }
  392.         if(!empty($dataSave)){
  393.             $dataSave json_decode($dataSave);
  394.             if(is_array($dataSave)){
  395.                 foreach ($data as $key => $item) {
  396.                     if(in_array($item->id$dataSave)){
  397.                         $data[$key]->selected ProductEnum::YES;
  398.                     }
  399.                 }
  400.             }
  401.         }
  402.         return $this->eadResponse($data);
  403.     }
  404.     /**
  405.      * @Route(
  406.      *      path          = "/register",
  407.      *      methods       = {"POST"},
  408.      * )
  409.      */
  410.     public function registerProduct(Request $request) { 
  411.         $permission $this->userPermissionUtil->getPermission("product""create");
  412.         if($this->userPermissionUtil->isLow($permission)){
  413.             return $this->eadResponse(nullErrorEnum::PERMISSION);
  414.         }
  415.         $this->requestUtil->setRequest($request)->setData();
  416.         $product = new Product();
  417.         if($this->requestUtil->issetField('user')){
  418.             $userId $this->requestUtil->getField('user');
  419.             if($userId && $this->userPermissionUtil->isHigh($permission)){
  420.                 $user $this->em->getRepository(User::class)->findOneBy([
  421.                     "id" => $userId,
  422.                     "deleted" => ProductEnum::ITEM_NO_DELETED
  423.                 ]);
  424.                 if($user){
  425.                     $product->setUser($user);
  426.                 }
  427.             }else if($userId == $this->user->getId()){
  428.                 $course->setUser($this->user);
  429.             }
  430.         }else{
  431.             $product->setUser($this->user);
  432.         }
  433.         if($this->requestUtil->issetField('cycleItem')){
  434.             $cycleItem $this->em->getRepository(CycleItem::class)->findOneBy([
  435.                 "id" => $this->requestUtil->getField('cycleItem'),
  436.                 "deleted" => ProductEnum::ITEM_NO_DELETED
  437.             ]);
  438.             if($cycleItem){
  439.                 $product->setCycleItem($cycleItem);
  440.             }
  441.         }
  442.         if($this->requestUtil->issetField('group')){
  443.             $group $this->em->getRepository(Group::class)->findOneBy([
  444.                 "id" => $this->requestUtil->getField('group'),
  445.                 "deleted" => ProductEnum::ITEM_NO_DELETED
  446.             ]);
  447.             if($group){
  448.                 $product->setGroup($group);
  449.             }
  450.         }
  451.         $categories json_decode(
  452.             $this->requestUtil->getField('productCategory'$request)
  453.         );
  454.         if(!empty($categories)){
  455.             $categoryRepository $this->em->getRepository(Category::class);
  456.             foreach ($categories as $key => $categoryId) {
  457.                 $category $categoryRepository->findOneBy([
  458.                     "id" => $categoryId,
  459.                     "deleted" => ProductEnum::ITEM_NO_DELETED
  460.                 ]);
  461.                 if($category){
  462.                     $product->addCategory($category);
  463.                 }
  464.             }
  465.         }
  466.         $productRelatedArr json_decode(
  467.             $this->requestUtil->getField('productRelated'$request)
  468.         );
  469.         $product->removeAllProductRelated();
  470.         if(!empty($productRelatedArr)){
  471.             foreach ($productRelatedArr as $key => $productRelatedId) {
  472.                 $productRelated $this->repository->findOneBy([
  473.                     "id" => $productRelatedId,
  474.                     "deleted" => ProductEnum::ITEM_NO_DELETED
  475.                 ]);
  476.                 if($productRelated){
  477.                     $product->addProductRelated($productRelated);
  478.                 }
  479.             }
  480.         }
  481.         if($this->requestUtil->issetField('certificateEnrollmentOrigin')){
  482.             $product->setCertificateEnrollmentOrigin(
  483.                 $this->requestUtil->getField('certificateEnrollmentOrigin')
  484.             );
  485.         }
  486.         if($this->requestUtil->issetField('type')){
  487.             $product->setType((int)$this->requestUtil->getField('type'));
  488.         }
  489.         if($this->requestUtil->issetField('title')){
  490.             $product->setTitle($this->requestUtil->getField('title'));
  491.         }
  492.         if($this->requestUtil->issetField('description')){
  493.             $product->setDescription($this->requestUtil->getField('description'));
  494.         }
  495.         if($this->requestUtil->issetField('spotlight')){
  496.             $product->setSpotlight((int)$this->requestUtil->getField('spotlight'));
  497.         }
  498.         if($this->requestUtil->issetField('planSpotlight')){
  499.             $product->setPlanSpotlight((int)$this->requestUtil->getField('planSpotlight'));
  500.         }
  501.         if($this->requestUtil->issetField('executeScriptTypeNative')){
  502.             $product->setExecuteScriptTypeNative(
  503.                 (int)$this->requestUtil->getField('executeScriptTypeNative')
  504.             );
  505.         }
  506.         if($this->requestUtil->issetField('executeScriptTypeGlobal')){
  507.             $product->setExecuteScriptTypeGlobal(
  508.                 (int)$this->requestUtil->getField('executeScriptTypeGlobal')
  509.             );
  510.         }
  511.         if($this->requestUtil->issetField('executeScriptStatusApproved')){
  512.             $product->setExecuteScriptStatusApproved(
  513.                 (int)$this->requestUtil->getField('executeScriptStatusApproved')
  514.             );
  515.         }
  516.         if($this->requestUtil->issetField('executeScriptStatusWaiting')){
  517.             $product->setExecuteScriptStatusWaiting(
  518.                 (int)$this->requestUtil->getField('executeScriptStatusWaiting')
  519.             );
  520.         }
  521.         if($this->requestUtil->issetField('executeScriptStatusCanceled')){
  522.             $product->setExecuteScriptStatusCanceled(
  523.                 (int)$this->requestUtil->getField('executeScriptStatusCanceled')
  524.             );
  525.         }
  526.         if($this->requestUtil->issetField('executeScriptCard')){
  527.             $product->setExecuteScriptCard(
  528.                 (int)$this->requestUtil->getField('executeScriptCard')
  529.             );
  530.         }
  531.         if($this->requestUtil->issetField('executeScriptPix')){
  532.             $product->setExecuteScriptPix(
  533.                 (int)$this->requestUtil->getField('executeScriptPix')
  534.             );
  535.         }
  536.         if($this->requestUtil->issetField('executeScriptBill')){
  537.             $product->setExecuteScriptBill(
  538.                 (int)$this->requestUtil->getField('executeScriptBill')
  539.             );
  540.         }
  541.         if($this->requestUtil->issetField('conversionScript')){
  542.             $product->setConversionScript($this->requestUtil->getField('conversionScript'));
  543.         }
  544.         if($this->requestUtil->issetField('contract')){
  545.             $product->setContract($this->requestUtil->getField('contract'));
  546.         }
  547.         $lastOrder $this->repository->count([ 
  548.             "deleted" => ProductEnum::ITEM_NO_DELETED 
  549.         ]) + 1;
  550.         $product->setOrder($lastOrder);
  551.         $hash uniqid();
  552.         $product->setProductLink("{$product->getTitle()}-{$hash}");
  553.         $groupsValidation = [];
  554.         if(
  555.             ProductEnum::PERIOD == $product->getType() || 
  556.             ProductEnum::SUPPORT == $product->getType()
  557.         ){
  558.             $groupsValidation[] = "isCycle";
  559.         }else if(ProductEnum::GROUP == $product->getType()){
  560.             $groupsValidation[] = "isGroup";
  561.         }
  562.         if($product->getPlanSpotlight() == ProductEnum::YES){
  563.             $this->repository->updatePlanSpotlight();
  564.         }
  565.         $errors $this->validateEntity($product$groupsValidation);
  566.         if($errors){
  567.             return $this->eadResponse($errorsErrorEnum::FIELD_EMPTY);
  568.         }
  569.         
  570.         $this->repository->refreshOrder(null$lastOrder);
  571.         $productTeam = new ProductTeam();
  572.         $productTeam->setProduct($product);
  573.         $productTeam->setUser($product->getUser());
  574.         $productPage = new ProductPage();
  575.         $productPage->setProduct($product);
  576.         $productPage->setName($product->getTitle());
  577.         $productPage->setTitle($product->getTitle());
  578.         $productPage->setStatus(ProductPageEnum::PUBLISHED);
  579.         $productPage->setDefault(ProductPageEnum::YES);
  580.         $productPage->setType(ProductPageEnum::TYPE_DEFAULT);
  581.         $productPage->setDescription($product->getDescription());
  582.         $filePhoto $this->requestUtil->getFile('photo');
  583.         if($filePhoto){
  584.             $filePhoto $this->fileService->setFile($filePhoto);
  585.             if($filePhoto){
  586.                 $this->fileService->moveFile(ProductEnum::PATH_PRODUCT_PHOTO);
  587.                 $productPage->setPhoto($this->fileService->getFileName());
  588.             }
  589.         }
  590.         $this->em->persist($product);
  591.         $this->em->persist($productTeam);
  592.         $this->em->persist($productPage);
  593.         $this->em->flush();
  594.         $crmService $this->generalService->getService('CRM\\CrmService');
  595.         $crmService->saveProduct($product);
  596.         $data $product->toReturn();
  597.         $this->userLogService->logInsert(
  598.             "product_page"
  599.             $productPage->getId(),
  600.             $productPage->toReturn()
  601.         );
  602.         $this->userLogService->logInsert("product"$product->getId(), $data);
  603.         return $this->eadResponse($data);
  604.     }
  605.     /**
  606.      * @Route(
  607.      *      path          = "/edit/general/{id}",
  608.      *      methods       = {"PUT"},
  609.      *      requirements  = { "id" = "\d+" }
  610.      * )
  611.      */
  612.     public function editProductGeneral(Request $request) {
  613.         $permission $this->userPermissionUtil->getPermission("product""edit_general");
  614.         if($this->userPermissionUtil->isLow($permission)){
  615.             return $this->eadResponse(nullErrorEnum::PERMISSION);
  616.         }
  617.         $this->requestUtil->setRequest($request)->setData();
  618.         $productId $request->get('id');
  619.         $product $this->repository->findOneBy([
  620.             "id" => $productId,
  621.             "deleted" => ProductEnum::ITEM_NO_DELETED
  622.         ]);
  623.         
  624.         if (!$product) {
  625.             return $this->eadResponse(nullErrorEnum::NOT_FOUND);
  626.         }
  627.         $isInTeam $this->em->getRepository(ProductTeam::class)->userExistInProductTeam(
  628.             $product
  629.             $this->user
  630.         );
  631.         if(!$isInTeam && $this->userPermissionUtil->isMiddle($permission)){
  632.             return $this->eadResponse(nullErrorEnum::PERMISSION);
  633.         }
  634.         if($this->requestUtil->issetField('user')){
  635.             $user $this->em->getRepository(User::class)->findOneBy([
  636.                 "id" => $this->requestUtil->getField('user'),
  637.                 "deleted" => ProductEnum::ITEM_NO_DELETED
  638.             ]);
  639.             if($user){
  640.                 $product->setUser($user);
  641.             }
  642.         }
  643.         if($this->requestUtil->issetField('productTeam')){
  644.             $productTeamId $this->requestUtil->getField('productTeam');
  645.             if($productTeamId && $this->userPermissionUtil->isHigh($permission)){
  646.                 $productTeam $this->em->getRepository(ProductTeam::class)->findOneBy([
  647.                     "id" => $productTeamId,
  648.                     "product" => $product->getId(),
  649.                     "deleted" => ProductTeamEnum::ITEM_NO_DELETED
  650.                 ]);
  651.                 
  652.                 if($productTeam){
  653.                     $product->setUser($productTeam->getUser());
  654.                 }
  655.             }
  656.         }
  657.         if($this->requestUtil->issetField('cycleItem')){
  658.             $cycleItem $this->em->getRepository(CycleItem::class)->findOneBy([
  659.                 "id" => $this->requestUtil->getField('cycleItem'),
  660.                 "deleted" => ProductEnum::ITEM_NO_DELETED
  661.             ]);
  662.             if($cycleItem){
  663.                 $product->setCycleItem($cycleItem);
  664.             }
  665.         }
  666.         if($this->requestUtil->issetField('group')){
  667.             $group $this->em->getRepository(Group::class)->findOneBy([
  668.                 "id" => $this->requestUtil->getField('group'),
  669.                 "deleted" => ProductEnum::ITEM_NO_DELETED
  670.             ]);
  671.             if($group){
  672.                 $product->setGroup($group);
  673.             }
  674.         }
  675.         if($this->requestUtil->issetField('productCategory')){
  676.             $categories json_decode(
  677.                 $this->requestUtil->getField('productCategory'$request)
  678.             );
  679.             $product->removeAllCategory();
  680.             if(!empty($categories)){
  681.                 $categoryRepository $this->em->getRepository(Category::class);
  682.                 foreach ($categories as $key => $categoryId) {
  683.                     $category $categoryRepository->findOneBy([
  684.                         "id" => $categoryId,
  685.                         "deleted" => ProductEnum::ITEM_NO_DELETED
  686.                     ]);
  687.                     if($category){
  688.                         $product->addCategory($category);
  689.                     }
  690.                 }
  691.             }
  692.         }
  693.         if($this->requestUtil->issetField('productRelated')){
  694.             $productRelatedArr json_decode(
  695.                 $this->requestUtil->getField('productRelated'$request)
  696.             );
  697.             $product->removeAllProductRelated();
  698.             if(!empty($productRelatedArr)){
  699.                 foreach ($productRelatedArr as $key => $productRelatedId) {
  700.                     $productRelated $this->repository->findOneBy([
  701.                         "id" => $productRelatedId,
  702.                         "deleted" => ProductEnum::ITEM_NO_DELETED
  703.                     ]);
  704.                     if($productRelated){
  705.                         $product->addProductRelated($productRelated);
  706.                     }
  707.                 }
  708.             }
  709.         }
  710.         $oldOrder $product->getOrder();
  711.         if($this->requestUtil->issetField('order')){
  712.             $product->setOrder((int)$this->requestUtil->getField('order'));
  713.         }
  714.         if($this->requestUtil->issetField('status')){
  715.             $product->setStatus((int)$this->requestUtil->getField('status'));
  716.         }
  717.         if($this->requestUtil->issetField('productLink')){
  718.             $product->setProductLink($this->requestUtil->getField('productLink'));
  719.         }
  720.         if($this->requestUtil->issetField('certificateEnrollmentOrigin')){
  721.             $product->setCertificateEnrollmentOrigin(
  722.                 $this->requestUtil->getField('certificateEnrollmentOrigin')
  723.             );
  724.         }
  725.         if($this->requestUtil->issetField('type')){
  726.             $product->setType((int)$this->requestUtil->getField('type'));
  727.         }
  728.         if($this->requestUtil->issetField('title')){
  729.             $product->setTitle($this->requestUtil->getField('title'));
  730.         }
  731.         if($this->requestUtil->issetField('description')){
  732.             $product->setDescription($this->requestUtil->getField('description'));
  733.         }
  734.         if($this->requestUtil->issetField('spotlight')){
  735.             $product->setSpotlight((int)$this->requestUtil->getField('spotlight'));
  736.         }
  737.         if($this->requestUtil->issetField('planSpotlight')){
  738.             $product->setPlanSpotlight((int)$this->requestUtil->getField('planSpotlight'));
  739.         }
  740.         if($this->requestUtil->issetField('executeScriptTypeNative')){
  741.             $product->setExecuteScriptTypeNative(
  742.                 (int)$this->requestUtil->getField('executeScriptTypeNative')
  743.             );
  744.         }
  745.         if($this->requestUtil->issetField('executeScriptTypeGlobal')){
  746.             $product->setExecuteScriptTypeGlobal(
  747.                 (int)$this->requestUtil->getField('executeScriptTypeGlobal')
  748.             );
  749.         }
  750.         if($this->requestUtil->issetField('executeScriptStatusApproved')){
  751.             $product->setExecuteScriptStatusApproved(
  752.                 (int)$this->requestUtil->getField('executeScriptStatusApproved')
  753.             );
  754.         }
  755.         if($this->requestUtil->issetField('executeScriptStatusWaiting')){
  756.             $product->setExecuteScriptStatusWaiting(
  757.                 (int)$this->requestUtil->getField('executeScriptStatusWaiting')
  758.             );
  759.         }
  760.         if($this->requestUtil->issetField('executeScriptStatusCanceled')){
  761.             $product->setExecuteScriptStatusCanceled(
  762.                 (int)$this->requestUtil->getField('executeScriptStatusCanceled')
  763.             );
  764.         }
  765.         if($this->requestUtil->issetField('executeScriptCard')){
  766.             $product->setExecuteScriptCard(
  767.                 (int)$this->requestUtil->getField('executeScriptCard')
  768.             );
  769.         }
  770.         if($this->requestUtil->issetField('executeScriptPix')){
  771.             $product->setExecuteScriptPix(
  772.                 (int)$this->requestUtil->getField('executeScriptPix')
  773.             );
  774.         }
  775.         if($this->requestUtil->issetField('executeScriptBill')){
  776.             $product->setExecuteScriptBill(
  777.                 (int)$this->requestUtil->getField('executeScriptBill')
  778.             );
  779.         }
  780.         if($this->requestUtil->issetField('conversionScript')){
  781.             $product->setConversionScript($this->requestUtil->getField('conversionScript'));
  782.         }
  783.         if($this->requestUtil->issetField('contract')){
  784.             $product->setContract($this->requestUtil->getField('contract'));
  785.         }
  786.         $groupsValidation = [];
  787.         if(
  788.             ProductEnum::PERIOD == $product->getType() || 
  789.             ProductEnum::SUPPORT == $product->getType()
  790.         ){
  791.             $groupsValidation[] = "isCycle";
  792.         }else if(ProductEnum::GROUP == $product->getType()){
  793.             $groupsValidation[] = "isGroup";
  794.         }
  795.         
  796.         $lastOrder $this->repository->count([ 
  797.             "deleted" => ProductEnum::ITEM_NO_DELETED 
  798.         ]);
  799.         $newOrder $product->getOrder();
  800.                 
  801.         if(empty($newOrder) || ($newOrder $lastOrder)){
  802.             $product->setOrder($lastOrder);
  803.             $newOrder $lastOrder;
  804.         }
  805.         if($product->getPlanSpotlight() == ProductEnum::YES){
  806.             $this->repository->updatePlanSpotlight();
  807.         }
  808.         $errors $this->validateEntity($product$groupsValidation);
  809.         if($errors){
  810.             return $this->eadResponse($errorsErrorEnum::FIELD_EMPTY);
  811.         }
  812.         if($oldOrder != $newOrder){
  813.             $this->repository->refreshOrder($oldOrder$newOrder);
  814.         }
  815.         $this->em->flush();
  816.         $crmService $this->generalService->getService('CRM\\CrmService');
  817.         $crmService->saveProduct($product);
  818.         $data $product->toReturn();
  819.         $this->userLogService->logUpdate("product"$product->getId(), $data);
  820.         return $this->eadResponse($data);
  821.     }
  822.     /**
  823.      * @Route(
  824.      *      path          = "/edit/theme/{id}",
  825.      *      methods       = {"POST"},
  826.      *      requirements  = { "id" = "\d+" }
  827.      * )
  828.      */
  829.     public function editProductTheme(Request $request){
  830.         $permission $this->userPermissionUtil->getPermission("product""create");
  831.         if($this->userPermissionUtil->isLow($permission)){
  832.             return $this->eadResponse(nullErrorEnum::PERMISSION);
  833.         }
  834.         $this->requestUtil->setRequest($request)->setData();
  835.         
  836.         $productId $request->get('id');
  837.         $product $this->repository->findOneBy([
  838.             "id" => $productId,
  839.             "deleted" => ProductEnum::ITEM_NO_DELETED
  840.         ]);
  841.         
  842.         if (!$product) {
  843.             return $this->eadResponse(nullErrorEnum::NOT_FOUND);
  844.         }
  845.         
  846.         $isInTeam $this->em->getRepository(ProductTeam::class)->userExistInProductTeam(
  847.             $product
  848.             $this->user
  849.         );
  850.         if(!$isInTeam && $this->userPermissionUtil->isMiddle($permission)){
  851.             return $this->eadResponse(nullErrorEnum::PERMISSION);
  852.         }
  853.         $productPageRepository $this->em->getRepository(ProductPage::class);
  854.         $productPage $productPageRepository->findOneBy([
  855.             "deleted" => ProductPageEnum::ITEM_NO_DELETED,
  856.             "product" => $product->getId(),
  857.             "default" => ProductPageEnum::YES,
  858.             "status" => ProductPageEnum::PUBLISHED,
  859.         ]);
  860.         if(!$productPage){
  861.             return $this->eadResponse(nullErrorEnum::NOT_FOUND);
  862.         }
  863.         $filePhoto $this->requestUtil->getFile('photo');
  864.         $filePhotoStand $this->requestUtil->getFile('photoStand');
  865.         $filePhotoExpand $this->requestUtil->getFile('photoExpand');
  866.         $fileCover $this->requestUtil->getFile('cover');
  867.         
  868.         if($filePhoto){
  869.             $filePhoto $this->fileService->setFile($filePhoto);
  870.             if($filePhoto){
  871.                 $this->fileService->moveFile(ProductEnum::PATH_PRODUCT_PHOTO);
  872.                 $productPage->setPhoto($this->fileService->getFileName());
  873.             }
  874.         }
  875.         if($filePhotoStand){
  876.             $filePhotoStand $this->fileService->setFile($filePhotoStand);
  877.             if($filePhotoStand){
  878.                 $this->fileService->moveFile(ProductEnum::PATH_PRODUCT_PHOTO);
  879.                 $productPage->setPhotoStand($this->fileService->getFileName());
  880.             }
  881.         }
  882.         if($filePhotoExpand){
  883.             $filePhotoExpand $this->fileService->setFile($filePhotoExpand);
  884.             if($filePhotoExpand){
  885.                 $this->fileService->moveFile(ProductEnum::PATH_PRODUCT_PHOTO);
  886.                 $productPage->setPhotoExpand($this->fileService->getFileName());
  887.             }
  888.         }
  889.         if($fileCover){
  890.             $fileCover $this->fileService->setFile($fileCover);
  891.             if($fileCover){
  892.                 $this->fileService->moveFile(ProductEnum::PATH_PRODUCT_COVER);
  893.                 $productPage->setCover($this->fileService->getFileName());
  894.             }
  895.         }
  896.         
  897.         $this->em->flush();
  898.         $data $productPage->toReturn();
  899.         $this->userLogService->logUpdate("product_page"$productPage->getId(), $data);
  900.         return $this->eadResponse($product->toReturn());
  901.     }
  902.     /**
  903.      * @Route(
  904.      *      path          = "/edit/many/status",
  905.      *      methods       = {"PUT"}
  906.      * )
  907.      */
  908.     public function editManyStatusProduct(Request $request) {
  909.         $permission $this->userPermissionUtil->getPermission("product""create");
  910.         if($this->userPermissionUtil->isLow($permission)){
  911.             return $this->eadResponse(nullErrorEnum::PERMISSION);
  912.         }
  913.         $this->requestUtil->setRequest($request)->setData();
  914.         $productId $this->requestUtil->getField('products');
  915.         if(empty($productId)){
  916.             return $this->eadResponse(nullErrorEnum::ACTION_INVALID);
  917.         };
  918.         $productId json_decode($productId);
  919.         foreach ($productId as $key => $id) {
  920.             $product $this->repository->findOneBy([
  921.                 "id" => $id,
  922.                 "deleted" => ProductEnum::ITEM_NO_DELETED
  923.             ]);
  924.         
  925.             if($product) {
  926.                 $isInTeam $this->em->getRepository(ProductTeam::class)->userExistInProductTeam($product$this->user);
  927.                 if($isInTeam && $this->userPermissionUtil->isMiddle($permission) || 
  928.                     $this->userPermissionUtil->isHigh($permission)){
  929.                     if($this->requestUtil->issetField('status')){
  930.                         $product->setStatus((int)$this->requestUtil->getField('status'));
  931.                     }
  932.                     $errors $this->validateEntity($product);
  933.                     if(!$errors){
  934.                         $this->em->flush();
  935.                     
  936.                         $data $product->toReturn();
  937.                         $this->userLogService->logUpdate(
  938.                             "product"
  939.                             $product->getId(), 
  940.                             $data
  941.                         );
  942.                     }
  943.                 }
  944.             }
  945.         }
  946.         return $this->eadResponse([ "message" => "Success" ]);
  947.     }
  948.     /**
  949.      * @Route(
  950.      *      path          = "/copy/{id}",
  951.      *      methods       = {"COPY"},
  952.      *      requirements  = { "id" = "\d+" }
  953.      * )
  954.      */
  955.     public function copyProduct(Request $request) {
  956.         $permission $this->userPermissionUtil->getPermission("product""copy");
  957.         if($this->userPermissionUtil->isLow($permission)){
  958.             return $this->eadResponse(nullErrorEnum::PERMISSION);
  959.         }
  960.         $productId $request->get('id');
  961.         $product $this->repository->findOneBy([
  962.             "id" => $productId,
  963.             "deleted" => ProductEnum::ITEM_NO_DELETED
  964.         ]);
  965.         
  966.         if (!$product) {
  967.             return $this->eadResponse(nullErrorEnum::NOT_FOUND);
  968.         }
  969.         $isInTeam $this->em->getRepository(ProductTeam::class)->userExistInProductTeam(
  970.             $product
  971.             $this->user
  972.         );
  973.         if(!$isInTeam && $this->userPermissionUtil->isMiddle($permission)){
  974.             return $this->eadResponse(nullErrorEnum::PERMISSION);
  975.         }
  976.         $newProduct = clone $product;
  977.         $date date('Y-m-d-H-i-s');
  978.         $newProduct->setTitle("{$newProduct->getTitle()} - COPY ");
  979.         $newProduct->setStatus(ProductEnum::DRAFT);
  980.         $newProduct->setPlanSpotlight(ProductEnum::NO);
  981.         $linkHash $this->stringUtil->randomText(6) . $this->stringUtil->randomText(6);
  982.         $newProduct->setProductLink($linkHash);
  983.         $order $newProduct->getOrder();
  984.         $lastOrder $this->repository->count([ 
  985.             "deleted" => ProductEnum::ITEM_NO_DELETED 
  986.         ]) + 1;
  987.                 
  988.         if(empty($order) || ($order $lastOrder)){
  989.             $newProduct->setOrder($lastOrder);
  990.             $order $lastOrder;
  991.         }
  992.         $errors $this->validateEntity($newProduct);
  993.         if($errors){
  994.             return $this->eadResponse($errorsErrorEnum::FIELD_EMPTY);
  995.         }
  996.         
  997.         $this->repository->refreshOrder(null$order);
  998.         $this->em->persist($newProduct);
  999.         $productOfferRepository $this->em->getRepository(ProductOffer::class);
  1000.         $productTeamRepository $this->em->getRepository(ProductTeam::class);
  1001.         $productPageRepository $this->em->getRepository(ProductPage::class);
  1002.         $faqRepository $this->em->getRepository(Faq::class);
  1003.         
  1004.         $filter = [ 
  1005.             "product" => $productId,
  1006.             "deleted" => ProductEnum::ITEM_NO_DELETED
  1007.         ];
  1008.         $productTeams $productTeamRepository->findBy($filter);
  1009.         $productOffers $productOfferRepository->findBy($filter);
  1010.         $productPages $productPageRepository->findBy($filter);
  1011.         $faqs $faqRepository->findBy($filter);
  1012.         $fileService $this->generalService->getService('FileService');
  1013.         $oldPagesOffers = [];
  1014.         foreach ($productPages as $key => $productPage) {
  1015.             $newProductPage = clone $productPage;
  1016.             $newProductPage->setProduct($newProduct);
  1017.             try {
  1018.                 if(!empty($newProductPage->getPhoto())){
  1019.                     $pathPhoto ProductEnum::PATH_PRODUCT_PHOTO;
  1020.                     $fileService->setFile("{$pathPhoto}/{$newProductPage->getPhoto()}");
  1021.                     $hashImg =  md5(rand() . time() . $product->getId());
  1022.                     $fileName "{$hashImg}.{$fileService->getFileExtension()}";
  1023.                     $copyFile "{$pathPhoto}/{$fileName}";
  1024.                     
  1025.                     $fileService->copyFile($copyFile);
  1026.                     $newProductPage->setPhoto($fileName);
  1027.                 }
  1028.                 if(!empty($newProductPage->getPhotoStand())){
  1029.                     $pathPhoto ProductEnum::PATH_PRODUCT_PHOTO;
  1030.                     $fileService->setFile("{$pathPhoto}/{$newProductPage->getPhotoStand()}");
  1031.                     $hashImg =  md5(rand() . time() . $product->getId());
  1032.                     $fileName "{$hashImg}.{$fileService->getFileExtension()}";
  1033.                     $copyFile "{$pathPhoto}/{$fileName}";
  1034.                     
  1035.                     $fileService->copyFile($copyFile);
  1036.                     $newProductPage->setPhotoStand($fileName);
  1037.                 }
  1038.                 if(!empty($newProductPage->getPhotoExpand())){
  1039.                     $pathPhoto ProductEnum::PATH_PRODUCT_PHOTO;
  1040.                     $fileService->setFile("{$pathPhoto}/{$newProductPage->getPhotoExpand()}");
  1041.                     $hashImg =  md5(rand() . time() . $product->getId());
  1042.                     $fileName "{$hashImg}.{$fileService->getFileExtension()}";
  1043.                     $copyFile "{$pathPhoto}/{$fileName}";
  1044.                     
  1045.                     $fileService->copyFile($copyFile);
  1046.                     $newProductPage->setPhotoExpand($fileName);
  1047.                 }
  1048.                 if(!empty($newProductPage->getCover())){
  1049.                     $pathCover ProductEnum::PATH_PRODUCT_COVER;
  1050.                     $fileService->setFile("{$pathCover}/{$newProductPage->getCover()}");
  1051.                     $hashImg =  md5(rand() . time() . $product->getId());
  1052.                     $fileName "{$hashImg}.{$fileService->getFileExtension()}";
  1053.                     $copyFile "{$pathCover}/{$fileName}";
  1054.                     
  1055.                     $fileService->copyFile($copyFile);
  1056.                     $newProductPage->setCover($fileName);
  1057.                 }
  1058.             } catch (\Exception $e) {
  1059.                 return $this->eadResponse([ "message" => $e->getMessage() ], ErrorEnum::FIELD_EMPTY);
  1060.             }
  1061.             
  1062.             $this->em->persist($newProductPage);
  1063.             $oldPagesOffers[$productPage->getId()] = $newProductPage;
  1064.         }
  1065.         foreach ($productTeams as $key => $productTeam) {
  1066.             $newProductTeam = clone $productTeam;
  1067.             $newProductTeam->setProduct($newProduct);
  1068.             $this->em->persist($newProductTeam);
  1069.         }
  1070.         
  1071.         foreach ($productOffers as $key => $productOffer) {
  1072.             $newproductOffer = clone $productOffer;
  1073.             $newproductOffer->setProduct($newProduct);
  1074.             $link md5(rand() + time());
  1075.             $newproductOffer->setOfferLink($link);
  1076.             if(isset($oldPagesOffers[$productOffer->getProductPage()->getId()])){
  1077.                 $newproductOffer->setProductPage(
  1078.                     $oldPagesOffers[$productOffer->getProductPage()->getId()]
  1079.                 );
  1080.             }
  1081.             
  1082.             $this->em->persist($newproductOffer);
  1083.         }
  1084.         foreach ($faqs as $key => $faq) {
  1085.             $newFaq = clone $faq;
  1086.             $newFaq->setProduct($newProduct);
  1087.             $this->em->persist($newFaq);
  1088.         }
  1089.         $this->em->flush();
  1090.         $data $newProduct->toReturn();
  1091.         $this->userLogService->logInsert("product"$newProduct->getId(), $data);
  1092.         return $this->eadResponse($data);
  1093.     }
  1094.     /**
  1095.      * @Route(
  1096.      *      path          = "/add/course/{id}",
  1097.      *      methods       = {"POST"},
  1098.      *      requirements  = { "id" = "\d+" }
  1099.      * )
  1100.      */
  1101.     public function addCourse(Request $request) {
  1102.         $permission $this->userPermissionUtil->getPermission(
  1103.             "product""product_course""add"
  1104.         );
  1105.         if($this->userPermissionUtil->isLow($permission)){
  1106.             return $this->eadResponse(nullErrorEnum::PERMISSION);
  1107.         }
  1108.         $this->requestUtil->setRequest($request)->setData();
  1109.         $productId $request->get('id');
  1110.         $product $this->repository->findOneBy([
  1111.             "id" => $productId,
  1112.             "deleted" => ProductEnum::ITEM_NO_DELETED
  1113.         ]);
  1114.         if (!$product) {
  1115.             return $this->eadResponse(nullErrorEnum::NOT_FOUND);
  1116.         }
  1117.         $isInTeam $this->em->getRepository(ProductTeam::class)->userExistInProductTeam(
  1118.             $product
  1119.             $this->user
  1120.         );
  1121.         
  1122.         if(!$isInTeam && $this->userPermissionUtil->isMiddle($permission)){
  1123.             return $this->eadResponse(nullErrorEnum::PERMISSION);
  1124.         }
  1125.         $courses $this->requestUtil->getField('courses');
  1126.         if(empty($courses)){
  1127.             return $this->eadResponse([ "courses" ], ErrorEnum::FIELD_EMPTY);
  1128.         }
  1129.         if($product->getType() == ProductEnum::COURSE){
  1130.             if(count($product->getCourse()) > 0){
  1131.                 return $this->eadResponse([ "message" => "Success" ]);
  1132.             }
  1133.         }
  1134.         $courses json_decode($courses);
  1135.         if(!is_array($courses)){
  1136.             return $this->eadResponse([ "courses" ], ErrorEnum::FIELD_EMPTY);
  1137.         }
  1138.         if($product->getType() == ProductEnum::COURSE){
  1139.             $first array_shift($courses);
  1140.             $courses = [ $first ];
  1141.         }
  1142.         $coursesObj = [];
  1143.         $courseRepository $this->em->getRepository(Course::class);
  1144.         if(is_array($courses)){
  1145.             foreach ($courses as $key => $courseId) {
  1146.                 $course $courseRepository->findOneBy([
  1147.                     "id" => $courseId,
  1148.                     "deleted" => ProductEnum::ITEM_NO_DELETED
  1149.                 ]);
  1150.                 if($course){
  1151.                     $coursesObj[] = $course;
  1152.                     $product->addCourse($course);
  1153.                 }
  1154.             }
  1155.             
  1156.             $this->em->flush();
  1157.         }
  1158.         
  1159.         if($product->getType() == ProductEnum::SUBSCRIPTION){
  1160.             $this->em->getRepository(UserSubscription::class)->enrollUsers(
  1161.                 $product
  1162.                 $coursesObj
  1163.             );
  1164.         }
  1165.         $courseRepository->getAllCourseTimeByProduct($producttrue);
  1166.         $data = [
  1167.             'courses' => $courses,
  1168.         ];
  1169.         $this->userLogService->logInsert("product_x_course"$product->getId(), $data);
  1170.         return $this->eadResponse([ "message" => "Success" ]);
  1171.     }
  1172.     
  1173.     /**
  1174.      * @Route(
  1175.      *      path          = "/remove/course/{productId}/{courseId}",
  1176.      *      methods       = {"DELETE"},
  1177.      *      requirements  = { "productId" = "\d+", "courseId" = "\d+" }
  1178.      * )
  1179.      */
  1180.     public function removeCourse(Request $request) {
  1181.         $permission $this->userPermissionUtil->getPermission(
  1182.             "product"
  1183.             "product_course"
  1184.             "remove"
  1185.         );
  1186.         if($this->userPermissionUtil->isLow($permission)){
  1187.             return $this->eadResponse(nullErrorEnum::PERMISSION);
  1188.         }
  1189.         $productId $request->get('productId');
  1190.         $product $this->repository->findOneBy([
  1191.             "id" => $productId,
  1192.             "deleted" => ProductEnum::ITEM_NO_DELETED
  1193.         ]);
  1194.         if (!$product) {
  1195.             return $this->eadResponse(nullErrorEnum::NOT_FOUND);
  1196.         }
  1197.         $isInTeam $this->em->getRepository(ProductTeam::class)->userExistInProductTeam(
  1198.             $product
  1199.             $this->user
  1200.         );
  1201.         if(!$isInTeam && $this->userPermissionUtil->isMiddle($permission)){
  1202.             return $this->eadResponse(nullErrorEnum::PERMISSION);
  1203.         }
  1204.         $courseId $request->get('courseId');
  1205.         $courseRepository $this->em->getRepository(Course::class);
  1206.         $course $courseRepository->findOneBy([
  1207.             "id" => $courseId,
  1208.             "deleted" => ProductEnum::ITEM_NO_DELETED
  1209.         ]);
  1210.         if (!$course) {
  1211.             return $this->eadResponse([ 
  1212.                 "message" => "Course not found! ID: {$courseId}
  1213.             ], ErrorEnum::ACTION_INVALID);
  1214.         }
  1215.         $product->removeCourse($course);        
  1216.         $this->em->flush();
  1217.         $courseRepository->getAllCourseTimeByProduct($producttrue);
  1218.         $this->userLogService->logDelete(
  1219.             "product_x_course"
  1220.             $product->getId(), 
  1221.             [ "course" => $courseId ]
  1222.         );
  1223.         return $this->eadResponse([ "message" => "Success" ]);
  1224.     }
  1225.     /**
  1226.      * @Route(
  1227.      *      path          = "/remove/course/many/{productId}",
  1228.      *      methods       = {"DELETE"},
  1229.      *      requirements  = { "productId" = "\d+" }
  1230.      * )
  1231.      */
  1232.     public function removeManyCourse(Request $request) {
  1233.         $permission $this->userPermissionUtil->getPermission(
  1234.             "product"
  1235.             "product_course"
  1236.             "remove"
  1237.         );
  1238.         
  1239.         if($this->userPermissionUtil->isLow($permission)){
  1240.             return $this->eadResponse(nullErrorEnum::PERMISSION);
  1241.         }
  1242.         $productId $request->get('productId');
  1243.         $product $this->repository->findOneBy([
  1244.             "id" => $productId,
  1245.             "deleted" => ProductEnum::ITEM_NO_DELETED
  1246.         ]);
  1247.         if (!$product) {
  1248.             return $this->eadResponse(nullErrorEnum::NOT_FOUND);
  1249.         }
  1250.         $isInTeam $this->em->getRepository(ProductTeam::class)->userExistInProductTeam(
  1251.             $product
  1252.             $this->user
  1253.         );
  1254.         
  1255.         if(!$isInTeam && $this->userPermissionUtil->isMiddle($permission)){
  1256.             return $this->eadResponse(nullErrorEnum::PERMISSION);
  1257.         }
  1258.         $this->requestUtil->setRequest($request)->setData();
  1259.         $all = (int)$this->requestUtil->getField('all');
  1260.         $courses json_decode($this->requestUtil->getField('courses'));
  1261.         if(empty($all)){
  1262.             if(empty($courses) || count($courses) == 0){
  1263.                 return $this->eadResponse(nullErrorEnum::NOT_FOUND);
  1264.             }
  1265.         }
  1266.         $courseRepository $this->em->getRepository(Course::class);
  1267.         if($all == ProductEnum::YES){
  1268.             $product->removeAllCourse();
  1269.         }else{
  1270.             foreach ($courses as $key => $courseId) {
  1271.                 $course $courseRepository->findOneBy([
  1272.                     "id" => $courseId,
  1273.                     "deleted" => ProductEnum::ITEM_NO_DELETED
  1274.                 ]);
  1275.                 if ($course) {
  1276.                     $product->removeCourse($course);
  1277.                 }
  1278.             }
  1279.         }
  1280.         $this->em->flush();
  1281.         $courseRepository->getAllCourseTimeByProduct($producttrue);
  1282.         $this->userLogService->logDeleteMany(
  1283.             "product_x_course"
  1284.             $product->getId(), 
  1285.             [
  1286.                 "all" => $all,
  1287.                 "courses" => $courses
  1288.             ]
  1289.         );
  1290.         return $this->eadResponse([ "message" => "Success" ]);
  1291.     }
  1292. }