src/Controller/User/UserProductController.php line 351

Open in your IDE?
  1. <?php
  2. namespace App\Controller\User;
  3. use App\Entity\Slave\JoinTableProductModelSupplier;
  4. use App\Entity\Slave\Product;
  5. use App\Entity\Slave\ProductCategory;
  6. use App\Entity\Slave\ProductComponent;
  7. use App\Entity\Slave\ProductModel;
  8. use App\Entity\Slave\ProductSubcategory;
  9. use App\Form\Model\RegenerateSupplier;
  10. use App\Form\Slave\JoinTableProductModelSupplierType;
  11. use App\Form\Slave\ProductCodeType;
  12. use App\Form\Slave\ProductDataType;
  13. use App\Form\Slave\ProductCategoryType;
  14. use App\Form\Slave\ProductComponentType;
  15. use App\Form\Slave\ProductModelEditType;
  16. use App\Form\Slave\ProductModelNewType;
  17. use App\Form\Slave\ProductModelSuppliersEditType;
  18. use App\Form\Slave\ProductSubcategoryType;
  19. use App\Form\Slave\RegenerateSupplierType;
  20. use App\Service\FilterService;
  21. use App\Service\FormValidatorService;
  22. use App\Service\MediaService;
  23. use App\Service\ProductService;
  24. use App\Service\UtilitiesService;
  25. use App\Service\ValidationService;
  26. use Doctrine\Persistence\ManagerRegistry;
  27. use Knp\Component\Pager\PaginatorInterface;
  28. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  29. use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
  30. use PhpOffice\PhpSpreadsheet\Cell\DataType;
  31. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
  32. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  33. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  34. use Symfony\Component\HttpFoundation\ResponseHeaderBag;
  35. use Symfony\Component\HttpFoundation\StreamedResponse;
  36. use Symfony\Component\Filesystem\Filesystem;
  37. use Symfony\Component\Form\FormError;
  38. use Symfony\Component\Form\FormFactoryInterface;
  39. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  40. use Symfony\Component\HttpFoundation\Request;
  41. use Symfony\Component\HttpFoundation\Response;
  42. use Symfony\Component\Routing\Annotation\Route;
  43. use Symfony\Component\Validator\Validator\ValidatorInterface;
  44. /**
  45.  * @Route("/scrivania/prodotti")
  46.  * @Security("is_granted('ROLE_USER') and is_granted('active', user) && is_granted('view', 'product')")
  47.  */
  48. class UserProductController extends AbstractController
  49. {
  50.     private $mr;
  51.     private $params;
  52.     public function __construct(ManagerRegistry $mrParameterBagInterface $params)
  53.     {
  54.         $this->mr $mr;
  55.         $this->params $params;
  56.     }
  57.     public function exportProducts($products)
  58.     {
  59.         $response = new StreamedResponse();
  60.         $response->setCallback(function() use($products) {
  61.             $handle fopen('php://output''w+');
  62.             fputcsv($handle, array('Pos''Modello''Fornitori''Matricola produttore''Matricola fornitore''Termid''Stato''Condizione''Magazzino attuale''DDT''Data importazione''Data ultimo trasferimento''EPOSM id'), ";"'"'"\\");
  63.             foreach($products as $p){
  64.                 $pos 'No';
  65.                 $model '---';
  66.                 $suppliers '---';
  67.                 $codeProducer '';
  68.                 $codeSupplier '';
  69.                 $termid '---';
  70.                 $status '---';
  71.                 $condition '---';
  72.                 $warehouse '---';
  73.                 $ddts '---';
  74.                 $dateImport '---';
  75.                 $dateLastTransfer '---';
  76.                 if($p->getModel()->getSubcategory()->getCategory()->isPos()) $pos 'Si';
  77.                 $model $p->getModel()->getName().' - '.$p->getModel()->getSubcategory()->getName().' - '.$p->getModel()->getSubcategory()->getCategory()->getName();
  78.                 if(sizeof($p->getSuppliers()) > 0){
  79.                     $suppliers "";
  80.                     $first true;
  81.                     foreach($p->getSuppliers() as $s){
  82.                         if($first$first false; else $suppliers.= ', ';
  83.                         $suppliers.= $s->getName();
  84.                     }
  85.                 }
  86.                 if($p->getCodeProducer() != null$codeProducer $p->getCodeProducer();
  87.                 if($p->getCodeSupplier() != null$codeSupplier $p->getCodeSupplier();
  88.                 if($p->getTermid() != null$termid $p->getTermid()->getCode();
  89.                 if($p->getStatus() != null$status $p->getStatus()->getValue();
  90.                 if($p->getCondition() != null$condition $p->getCondition()->getValue();
  91.                 if($p->getActualWarehouse() != null$warehouse $p->getActualWarehouse()->getNickname();
  92.                 if($p->getDateCreation() != null$dateImport $p->getDateCreation()->format('d-m-Y');
  93.                 if($p->getDateLastTransfer() != null$dateLastTransfer $p->getDateLastTransfer()->format('d-m-Y H:i');
  94.                 $ddts $p->displayTransfersDdts();
  95.                 fputcsv($handle, array($pos$model$suppliers$codeProducer$codeSupplier$termid$status$condition$warehouse$ddts$dateImport$dateLastTransfer$p->getId()), ";"'"'"\\");
  96.             }
  97.             fclose($handle);
  98.         });
  99.         
  100.         $response->setStatusCode(200);
  101.         $dispositionHeader $response->headers->makeDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT'Elenco prodotti.csv');
  102.         $response->headers->set('Content-Type''text/csv; charset=ISO-8859-15');
  103.         $response->headers->set('Content-Disposition'$dispositionHeader);
  104.         return $response;
  105.     }
  106.     public function exportStationaryProducts($products)
  107.     {
  108.         $response = new StreamedResponse();
  109.         $response->setCallback(function() use($products) {
  110.             $handle fopen('php://output''w+');
  111.             fputcsv($handle, array('Pos''Modello''Fornitori''Matricola produttore''Matricola fornitore''Stato''Condizione''Magazzino attuale''DDT''Data ultimo trasferimento''EPOSM id'), ";"'"'"\\");
  112.             foreach($products as $p){
  113.                 $pos 'No';
  114.                 $model '---';
  115.                 $suppliers '---';
  116.                 $codeProducer '';
  117.                 $codeSupplier '';
  118.                 $status '---';
  119.                 $condition '---';
  120.                 $warehouse '---';
  121.                 $ddts '---';
  122.                 $dateLastTransfer '---';
  123.                 if($p->getModel()->getSubcategory()->getCategory()->isPos()) $pos 'Si';
  124.                 $model $p->getModel()->getName().' - '.$p->getModel()->getSubcategory()->getName().' - '.$p->getModel()->getSubcategory()->getCategory()->getName();
  125.                 if(sizeof($p->getSuppliers()) > 0){
  126.                     $suppliers "";
  127.                     $first true;
  128.                     foreach($p->getSuppliers() as $s){
  129.                         if($first$first false; else $suppliers.= ', ';
  130.                         $suppliers.= $s->getName();
  131.                     }
  132.                 }
  133.                 if($p->getCodeProducer() != null$codeProducer $p->getCodeProducer();
  134.                 if($p->getCodeSupplier() != null$codeSupplier $p->getCodeSupplier();
  135.                 if($p->getStatus() != null$status $p->getStatus()->getValue();
  136.                 if($p->getCondition() != null$condition $p->getCondition()->getValue();
  137.                 if($p->getActualWarehouse() != null$warehouse $p->getActualWarehouse()->getNickname();
  138.                 if($p->getDateLastTransfer() != null$dateLastTransfer $p->getDateLastTransfer()->format('d-m-Y H:i');
  139.                 $ddts $p->displayTransfersDdts();
  140.                 fputcsv($handle, array($pos$model$suppliers$codeProducer$codeSupplier$status$condition$warehouse$ddts$dateLastTransfer$p->getId()), ";"'"'"\\");
  141.             }
  142.             fclose($handle);
  143.         });
  144.         
  145.         $response->setStatusCode(200);
  146.         $dispositionHeader $response->headers->makeDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT'Elenco prodotti.csv');
  147.         $response->headers->set('Content-Type''text/csv; charset=ISO-8859-15');
  148.         $response->headers->set('Content-Disposition'$dispositionHeader);
  149.         return $response;
  150.     }
  151.     public function exportRegeneratedProducts($rps)
  152.     {
  153.         $response = new StreamedResponse();
  154.         $response->setCallback(function() use($rps) {
  155.             $handle fopen('php://output''w+');
  156.             fputcsv($handle, array('Data rigenerazione''Modello''Matricola produttore''Matricola fornitore''Fornitore''Ammontare'), ";"'"'"\\");
  157.             foreach($rps as $rp){
  158.                 $datetime $rp->getDatetime()->format("d-m-Y H:i:s");
  159.                 $model '---';
  160.                 $codeProducer '';
  161.                 $codeSupplier '';
  162.                 $supplier '---';
  163.                 $amount '---';
  164.                 if($rp->getProduct() != null$model $rp->getProduct()->getModel()->getName();
  165.                 if($rp->getProduct()->getCodeProducer() != null$codeProducer $rp->getProduct()->getCodeProducer();
  166.                 if($rp->getProduct()->getCodeSupplier() != null$codeSupplier $rp->getProduct()->getCodeSupplier();
  167.                 if($rp->getSupplier() != null$supplier $rp->getSupplier()->getName();
  168.                 if($rp->getSupplier() != null$amount $rp->getSupplier()->getAmountRegenerate();
  169.                 fputcsv($handle, array($datetime$model$codeProducer$codeSupplier$supplier$amount), ";"'"'"\\");
  170.             }
  171.             fclose($handle);
  172.         });
  173.         
  174.         $response->setStatusCode(200);
  175.         $dispositionHeader $response->headers->makeDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT'Elenco prodotti rigenerati.csv');
  176.         $response->headers->set('Content-Type''text/csv; charset=ISO-8859-15');
  177.         $response->headers->set('Content-Disposition'$dispositionHeader);
  178.         return $response;
  179.     }
  180.     /**
  181.      * @Route("/", name="user_products")
  182.      * @Security("is_granted('view', 'product')")
  183.      */
  184.     public function userProducts(Request $request)
  185.     {    
  186.         return $this->render('role/user/product/index.html.twig');
  187.     }
  188.     // PRODOTTI
  189.         /**
  190.          * @Route("/ricerca", name="user_product_search")
  191.          * @Security("is_granted('view', 'product')")
  192.          */
  193.         public function userProductList(Request $requestValidatorInterface $validatorPaginatorInterface $paginatorFormFactoryInterface $formFactory)
  194.         {    
  195.             $em $this->mr->getManager('slave');
  196.             $session $request->getSession();
  197.             $suppliers $em->getRepository("App\Entity\Slave\Supplier")->findAllActiveOrdered();
  198.             $filters FilterService::productFilter($request);
  199.             if($session->get('codeProducer') != null){
  200.                 $filters['codeProducer'] = $session->get('codeProducer');
  201.                 $session->remove('codeProducer');
  202.             }
  203.             if($session->get('codeSupplier') != null){
  204.                 $filters['codeSupplier'] = $session->get('codeSupplier');
  205.                 $session->remove('codeSupplier');
  206.             }
  207.             $productsQuery $em->getRepository("App\Entity\Slave\Product")->findFiltered(true$filters);
  208.             $productsCountQuery = clone $productsQuery;
  209.             $products $paginator->paginate($productsQuery$request->getSession()->get($request->get("_route")."_page"), 50);
  210.             $productModels $em->getRepository('App\Entity\Slave\ProductModel')->findAllOrdered();
  211.             return $this->render('role/user/product/search.html.twig', [
  212.                 "filters" => $filters,
  213.                 "products" => $products,
  214.                 "suppliers" => $suppliers,
  215.                 "productModels" => $productModels
  216.             ]);
  217.         }
  218.         /**
  219.          * @Route("/ricerca/esporta-filtro-csv", name="user_product_search_filter_export")
  220.          * @Security("is_granted('view', 'product')")
  221.          */
  222.         public function userProductSearchFilterExport(Request $request)
  223.         {    
  224.             $em $this->mr->getManager('slave');
  225.             $session $request->getSession();
  226.             $filters $session->get('user_product_search_filters');
  227.             $products $em->getRepository("App\Entity\Slave\Product")->findFiltered(false$filters);
  228.             return $this->exportProducts($products);
  229.         }
  230.         /**
  231.          * @Route("/ricerca/esporta-per-invio", name="user_product_search_for_send_export")
  232.          * @Security("is_granted('view', 'product')")
  233.          */
  234.         public function userProductSearchForSendExport(Request $request)
  235.         {    
  236.             $em $this->mr->getManager('slave');
  237.             $session $request->getSession();
  238.             $filters $session->get('user_product_search_filters');
  239.             $products $em->getRepository("App\Entity\Slave\Product")->findFiltered(false$filters);
  240.             $response = new StreamedResponse();
  241.     
  242.             $response->setCallback(function() use($products) {
  243.                 $handle fopen('php://output''w+');
  244.                 fputcsv($handle, array('Matricola produttore''Matricola fornitore'), ";"'"'"\\");
  245.     
  246.                 foreach($products as $p){
  247.                     $codeProducer '';
  248.                     $codeSupplier '';
  249.                     if($p->getCodeProducer() != null$codeProducer $p->getCodeProducer();
  250.                     if($p->getCodeSupplier() != null$codeSupplier $p->getCodeSupplier();
  251.                     fputcsv($handle, array($codeProducer$codeSupplier), ";"'"'"\\");
  252.                 }
  253.     
  254.                 fclose($handle);
  255.             });
  256.             
  257.             $response->setStatusCode(200);
  258.             $dispositionHeader $response->headers->makeDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT'Elenco prodotti per invio.csv');
  259.             $response->headers->set('Content-Type''text/csv; charset=ISO-8859-15');
  260.             $response->headers->set('Content-Disposition'$dispositionHeader);
  261.             return $response;
  262.         }
  263.         /**
  264.          * @Route("/ricerca/selezione-multipla-azione", name="user_product_multiple_select_action")
  265.          * @Security("is_granted('edit', 'product')")
  266.          */
  267.         public function userProductMultipleSelectAction(Request $request)
  268.         {    
  269.             $em $this->mr->getManager('slave');
  270.             $session $request->getSession();
  271.             $productIds explode(','$request->request->get('ids'));
  272.             $action $request->request->get('action');
  273.             switch($action){
  274.                 case 'model':
  275.                     $productModel $em->getRepository('App\Entity\Slave\ProductModel')->findOneById($request->request->get('productModelId'));
  276.                     foreach($productIds as $id){
  277.                         $product $em->getRepository('App\Entity\Slave\Product')->findOneById($id);
  278.                         $product->setModel($productModel);
  279.                     }
  280.                     $em->flush();
  281.                     $this->addFlash('notice_success''Modello prodotti aggiornato!');
  282.                     return $this->redirectToRoute('user_product_search');
  283.                     break;
  284.                 case 'delete':
  285.                     $countDeleted 0;
  286.                     $countIgnored 0;
  287.                     foreach($productIds as $id){
  288.                         $product $em->getRepository('App\Entity\Slave\Product')->findOneById($id);
  289.                         if($product->canDelete()){
  290.                             foreach($product->getTransfers() as $jt$em->remove($jt);
  291.                             foreach($product->getTransferLogs() as $tLog$em->remove($tLog);
  292.                             foreach($product->getLogs() as $log$em->remove($log);
  293.                             $em->remove($product);
  294.                             $countDeleted++;
  295.                         }
  296.                         else{
  297.                             $countIgnored++;
  298.                         }
  299.                     }
  300.                     $em->flush();
  301.                     $this->addFlash('notice_success''Eliminati '.$countDeleted.' prodotti e ignorati '.$countIgnored.' prodotti non eliminabili!');
  302.                     return $this->redirectToRoute('user_product_search');
  303.                     break;
  304.                 case 'export':
  305.                     $products = array();
  306.                     foreach($productIds as $id){
  307.                         $p $em->getRepository('App\Entity\Slave\Product')->findOneById($id);
  308.                         array_push($products$p);
  309.                     }
  310.                     return $this->exportProducts($products);
  311.                     break;
  312.                 default: break;
  313.             }            
  314.         }
  315.         /**
  316.          * @Route("/{productId}/scheda", name="user_product_sheet")
  317.          * @Security("is_granted('view', 'product')")
  318.          */
  319.         public function userProductSheet($productIdRequest $requestValidatorInterface $validatorFormFactoryInterface $formFactoryUserPasswordHasherInterface $passwordHasher)
  320.         {    
  321.             $em $this->mr->getManager('slave');
  322.             $emMaster $this->mr->getManager('master');
  323.             $session $request->getSession();
  324.             $company $emMaster->getRepository("App\Entity\Master\Company")->findOneById($session->get("companyId"));
  325.             
  326.             $product $em->getRepository("App\Entity\Slave\Product")->findOneById($productId);
  327.             $stCoLogs = array();
  328.             $codeLogs = array();
  329.             foreach($product->getLogs() as $log){
  330.                 switch($log->getType()){
  331.                     case 'status':
  332.                     case 'condition':
  333.                         array_push($stCoLogs$log);
  334.                         break;
  335.                     case 'code-producer':
  336.                     case 'code-supplier':
  337.                         array_push($codeLogs$log);
  338.                         break;
  339.                     default: break;
  340.                 }
  341.             }
  342.             $oldConditionId $product->getCondition()->getId();
  343.             $oldStatusId $product->getStatus()->getId();
  344.             // Modifica dati
  345.             $formData $formFactory->createNamed("form_product_data_edit"ProductDataType::class, $product);
  346.             $formData->handleRequest($request);
  347.             if($formData->isSubmitted()){
  348.                 if($formData->isValid()){
  349.                                         
  350.                     if($formData->get('condition')->getData()->getId() != $oldConditionId){
  351.                         ProductService::productChangeCondition($em$this->getUser(), $product$formData->get('condition')->getData());
  352.                     }
  353.                     
  354.                     $em->flush();
  355.                     $this->addFlash('notice_success'"Dati prodotto aggiornati!");
  356.                     return $this->redirectToRoute('user_product_sheet', array('productId' => $product->getId()));
  357.                 }
  358.                 else{
  359.                     $session->set('openEditDataModal'true);
  360.                     $session->set('openEditDataModalId'$request->request('productCodeEditId'));
  361.                 }
  362.             }
  363.             // Modifica codici
  364.             $formCode $formFactory->createNamed("form_product_code_edit"ProductCodeType::class, $product);
  365.             $formCode->handleRequest($request);
  366.             if($formCode->isSubmitted()){
  367.                 $valid ValidationService::validateNotBlank($validator$formCode->get('password'));
  368.                 if($valid && !($passwordHasher->isPasswordValid($this->getUser(), $formCode->get('password')->getData()))){
  369.                     $valid false;
  370.                     $formCode->get('password')->addError(new FormError('Password errata!'));
  371.                 }
  372.                 if($valid && ($formCode->get('codeProducer')->getData() == null && $formCode->get('codeSupplier')->getData() == null)){
  373.                     $valid false;
  374.                     $formCode->get('codeProducer')->addError(new FormError('Inserisci almeno un codice matricola!'));
  375.                     $formCode->get('codeSupplier')->addError(new FormError('Inserisci almeno un codice matricola!'));
  376.                 }
  377.                 if($valid$valid ValidationService::validateNotBlankType3($validator$formCode->get('warehouseId'), $formCode->get('warehouseSearchNickname'), $formCode->get('warehouseSearchTermid'));
  378.                 if($valid && $formCode->get('codeProducer')->getData() != '') {
  379.                     $prod $em->getRepository('App\Entity\Slave\Product')->findOneBy(['codeProducer' => $formCode->get('codeProducer')->getData()]);
  380.                     if($prod != null && $prod->getId() != $product->getId()){
  381.                         $valid false;
  382.                         $formCode->get('codeProducer')->addError(new FormError('Esiste già un altro prodotto con la matricola '.$formCode->get('codeProducer')->getData().'!'));
  383.                     }
  384.                 }
  385.                 if($valid && $formCode->get('codeSupplier')->getData() != '') {
  386.                     $prod $em->getRepository('App\Entity\Slave\Product')->findOneBy(['codeSupplier' => $formCode->get('codeSupplier')->getData()]);
  387.                     if($prod != null && $prod->getId() != $product->getId()){
  388.                         $valid false;
  389.                         $formCode->get('codeSupplier')->addError(new FormError('Esiste già un altro prodotto con la matricola '.$formCode->get('codeSupplier')->getData().'!'));
  390.                     }
  391.                 }
  392.                 if($valid && $formCode->isValid()){
  393.                     
  394.                     if($product->getCodeProducer() != $formCode->get('codeProducer')->getData()){
  395.                         ProductService::createProductLog($em$product$this->getUser(), null'code-producer'$product->getCodeProducer(), $formCode->get('codeProducer')->getData());
  396.                         $product->setCodeProducer($formCode->get('codeProducer')->getData());
  397.                     }
  398.                     
  399.                     if($product->getCodeSupplier() != $formCode->get('codeSupplier')->getData()){
  400.                         ProductService::createProductLog($em$product$this->getUser(), null'code-supplier'$product->getCodeSupplier(), $formCode->get('codeSupplier')->getData());
  401.                         $product->setCodeSupplier($formCode->get('codeSupplier')->getData());
  402.                     }
  403.                     if($product->getActualWarehouse()->getId() != $formCode->get('warehouseId')->getData()){
  404.                         $fromClient false;
  405.                         $toClient false;
  406.                         if($product->getActualWarehouse()->getClient() != null)
  407.                             $fromClient true;
  408.                         
  409.                         $newWarehouse $em->getRepository('App\Entity\Slave\Warehouse')->findOneById($formCode->get('warehouseId')->getData());
  410.                         
  411.                         if($newWarehouse->getClient() != null)
  412.                             $toClient true;
  413.                         if($fromClient != $toClient){
  414.                             $oldCondition $product->getCondition();
  415.                             $oldStatus $product->getStatus();
  416.                             $statusInUse $em->getRepository('App\Entity\Slave\ProductStatus')->findOneBySlug("in_use");
  417.                             $statusNotAvailable $em->getRepository('App\Entity\Slave\ProductStatus')->findOneBySlug("not_available");
  418.                             $conditionRetired $em->getRepository('App\Entity\Slave\ProductCondition')->findOneBySlug("retired");
  419.                             $conditionFree $em->getRepository('App\Entity\Slave\ProductCondition')->findOneBySlug("free");
  420.                             if($fromClient){
  421.                                 $product->setStatus($statusNotAvailable);
  422.                                 $product->setCondition($conditionRetired);
  423.                                 if($oldStatus->getId() != $statusNotAvailable->getId())
  424.                                     ProductService::createProductLog($em$product$this->getUser(), null'status'$oldStatus->getValue(), $statusNotAvailable->getValue());
  425.                                 if($oldCondition->getId() != $conditionRetired->getId())
  426.                                     ProductService::createProductLog($em$product$this->getUser(), null'condition'$oldCondition->getValue(), $conditionRetired->getValue());
  427.                             }
  428.                             else{
  429.                                 $product->setStatus($statusInUse);
  430.                                 $product->setCondition($conditionFree);
  431.                                 if($oldStatus->getId() != $statusInUse->getId())
  432.                                     ProductService::createProductLog($em$product$this->getUser(), null'status'$oldStatus->getValue(), $statusInUse->getValue());
  433.                                 if($oldCondition->getId() != $conditionFree->getId())
  434.                                     ProductService::createProductLog($em$product$this->getUser(), null'condition'$oldCondition->getValue(), $conditionFree->getValue());
  435.                             }
  436.                         }
  437.                         ProductService::createProductTransferLog($em$productnull$this->getUser(), $newWarehouse, new \Datetime(), 'forced_password');
  438.                         $product->setActualWarehouse($newWarehouse);
  439.                         
  440.                         $product->setDateLastTransfer(new \Datetime());
  441.                         $product->isToManage(false);
  442.                         $product->setToManagePriority(0);
  443.                     }
  444.                     $em->flush();
  445.                     $this->addFlash('notice_success'"Dati prodotto aggiornati!");
  446.                     return $this->redirectToRoute('user_product_sheet', array('productId' => $product->getId()));
  447.                 }
  448.                 else{
  449.                     $session->set('openEditCodeModal'true);
  450.                     $session->set('openEditCodeModalId'$request->request->get('productDataEditId'));
  451.                 }
  452.             }
  453.             return $this->render('role/user/product/sheet.html.twig', [
  454.                 "company" => $company,
  455.                 "product" => $product,
  456.                 "stCoLogs" => $stCoLogs,
  457.                 "codeLogs" => $codeLogs,
  458.                 "formCode" => $formCode->createView(),
  459.                 "formData" => $formData->createView()
  460.             ]);
  461.         }
  462.         
  463.         /**
  464.          * @Route("/aggiorna-stato", name="user_product_change_active")
  465.          * @Security("is_granted('edit', 'product')")
  466.          */
  467.         public function userAnagraphicProductChangeActive(Request $request)
  468.         {    
  469.             $em $this->mr->getManager('slave');
  470.             $session $request->getSession();
  471.             $product $em->getRepository("App\Entity\Slave\Product")->findOneById($request->request->get("productChangeId"));
  472.             $product->setActive(!$product->isActive());
  473.             $em->flush();
  474.             
  475.             $this->addFlash('notice_success'"Stato aggiornato");
  476.             return $this->redirectToRoute('user_product_search');
  477.         }
  478.         /**
  479.          * @Route("/elimina", name="user_product_search_delete")
  480.          * @Security("is_granted('edit', 'product')")
  481.          */
  482.         public function userProductListDelete(Request $request)
  483.         {    
  484.             $em $this->mr->getManager('slave');
  485.             $product $em->getRepository("App\Entity\Slave\Product")->findOneById($request->request->get("productDelId"));
  486.             $em->remove($product);
  487.             $em->flush();
  488.             $this->addFlash('notice_success'"Prodotto eliminato");
  489.             return $this->redirectToRoute('user_product_search');
  490.         }
  491.                 
  492.         /**
  493.          * @Route("/fermi", name="user_product_stationary")
  494.          * @Security("is_granted('edit', 'product')")
  495.          */
  496.         public function userProductStationary(Request $requestPaginatorInterface $paginatorFormFactoryInterface $formFactoryValidatorInterface $validator)
  497.         {    
  498.             $em $this->mr->getManager('slave');
  499.             $session $request->getSession();
  500.             $settingDaysStationary $em->getRepository('App\Entity\Slave\Setting')->findOneBy(array('slug' => 'days_stationary'));
  501.             $suppliers $em->getRepository("App\Entity\Slave\Supplier")->findAllActiveOrdered();
  502.             $filters FilterService::productStationaryFilter($request);
  503.             $productsQuery $em->getRepository("App\Entity\Slave\Product")->findStationaryFiltered(true$filters, new \Datetime(), $settingDaysStationary->getValue());
  504.             $productsStationary $paginator->paginate($productsQuery$request->getSession()->get($request->get("_route")."_page"), 50);
  505.             return $this->render('role/user/product/stationary.html.twig', [
  506.                 "filters" => $filters,
  507.                 "suppliers" => $suppliers,
  508.                 "productsStationary" => $productsStationary
  509.             ]);
  510.         }
  511.         /**
  512.          * @Route("/fermi/esporta-filtro-csv", name="user_product_stationary_filter_export")
  513.          * @Security("is_granted('view', 'product')")
  514.          */
  515.         public function userProductStationaryFilterExport(Request $request)
  516.         {    
  517.             $em $this->mr->getManager('slave');
  518.             $session $request->getSession();
  519.             $settingDaysStationary $em->getRepository('App\Entity\Slave\Setting')->findOneBy(array('slug' => 'days_stationary'));
  520.             $filters $session->get('user_product_stationary_filters');
  521.             $products $em->getRepository("App\Entity\Slave\Product")->findStationaryFiltered(false$filters, new \Datetime(), $settingDaysStationary->getValue());
  522.             return $this->exportStationaryProducts($products);
  523.         }
  524.         /**
  525.          * @Route("/fermi/selezione-multipla-azione", name="user_product_stationary_multiple_select_action")
  526.          * @Security("is_granted('edit', 'product')")
  527.          */
  528.         public function userProductStationaryMultipleSelectAction(Request $request)
  529.         {    
  530.             $em $this->mr->getManager('slave');
  531.             $session $request->getSession();
  532.             $productIds explode(','$request->request->get('ids'));
  533.             $action $request->request->get('action');
  534.             switch($action){
  535.                 case 'export':
  536.                     $products = array();
  537.                     foreach($productIds as $id){
  538.                         $p $em->getRepository('App\Entity\Slave\Product')->findOneById($id);
  539.                         array_push($products$p);
  540.                     }
  541.                     return $this->exportStationaryProducts($products);
  542.                     break;
  543.                 default: break;
  544.             }            
  545.         }
  546.         /**
  547.          * @Route("/rigenerati", name="user_product_regenerated")
  548.          * @Security("is_granted('view', 'product')")
  549.          */
  550.         public function userProductRegenerated(Request $requestPaginatorInterface $paginatorFormFactoryInterface $formFactoryValidatorInterface $validator)
  551.         {    
  552.             $em $this->mr->getManager('slave');
  553.             $openModal false;
  554.             $openModalId null;
  555.             $session $request->getSession();
  556.                         
  557.             $filters FilterService::productRegeneratedFilter($request);
  558.             $toRegenerateQuery $em->getRepository("App\Entity\Slave\ProductRegenerated")->findFiltered(true$filtersfalse);
  559.             $toRegenerateProducts $paginator->paginate($toRegenerateQuery$request->getSession()->get($request->get("_route")."_page"), 50);
  560.             
  561.             $regenerateQuery $em->getRepository('App\Entity\Slave\ProductRegenerated')->findFiltered(true$filterstrue);
  562.             $regeneratedProducts $paginator->paginate($regenerateQuery$request->getSession()->get($request->get("_route")."_page"), 50);
  563.             $regenerateSupplier = new RegenerateSupplier();
  564.             $form $formFactory->createNamed("form_regenerate"RegenerateSupplierType::class, $regenerateSupplier);
  565.             $form->handleRequest($request);
  566.             if($form->isSubmitted()){
  567.                 $valid ValidationService::ValidateNotBlank($validator$form->get('supplier'));
  568.                 if($form->isValid() && $valid){
  569.                     $supplier $em->getRepository('App\Entity\Slave\Supplier')->findOneById($form->get('supplier')->getData());
  570.                     $productRegenerated $em->getRepository('App\Entity\Slave\ProductRegenerated')->findOneById($request->request->get('productRegeneratedId'));
  571.                     $productRegenerated->setSupplier($supplier);
  572.                     $em->flush();
  573.                     $this->addFlash('notice_success'"Fornitore aggiornato!");
  574.                     return $this->redirectToRoute('user_product_regenerated');
  575.                 }
  576.                 else{
  577.                     $openModal true;
  578.                     $openModalId $request->request->get('productRegeneratedId');
  579.                 }
  580.             }
  581.             return $this->render('role/user/product/regenerated.html.twig', [
  582.                 "filters" => $filters,
  583.                 "openModal" => $openModal,
  584.                 "openModalId" => $openModalId,
  585.                 "toRegenerateProducts" => $toRegenerateProducts,
  586.                 "regeneratedProducts" => $regeneratedProducts,
  587.                 'form' => $form->createView()
  588.             ]);
  589.         }
  590.         /**
  591.          * @Route("/rigenerati/esporta-filtro-csv/{hasSupplier}", name="user_product_regenerated_filter_export")
  592.          * @Security("is_granted('view', 'product')")
  593.          */
  594.         public function userProductRegeneratedFilterExport(Request $request$hasSupplier)
  595.         {    
  596.             $em $this->mr->getManager('slave');
  597.             $session $request->getSession();
  598.             $filters $session->get('user_product_regenerated_filters');
  599.             $regeneratedProducts $em->getRepository("App\Entity\Slave\ProductRegenerated")->findFiltered(false$filters$hasSupplier);
  600.             return $this->exportRegeneratedProducts($regeneratedProducts);
  601.         }
  602.         /**
  603.          * @Route("/rigenerati/stampa-etichette/{hasSupplier}", name="user_product_regenerated_print_labels")
  604.          * @Security("is_granted('view', 'product')")
  605.          */
  606.         public function userProductRegeneratedPrintLabels(Request $request$hasSupplier)
  607.         {    
  608.             $em $this->mr->getManager('slave');
  609.             $session $request->getSession();
  610.             $filters $session->get('user_product_regenerated_filters');
  611.             $regeneratedProducts $em->getRepository("App\Entity\Slave\ProductRegenerated")->findFiltered(false$filterstrue);
  612.             return $this->render('role/user/print/regenerated_products_labels.html.twig', [
  613.                 "regeneratedProducts" => $regeneratedProducts
  614.             ]);
  615.         }
  616.         /**
  617.          * @Route("/rigenerati/elimina", name="user_product_regenerated_delete")
  618.          * @Security("is_granted('edit', 'product')")
  619.          */
  620.         public function userProductRegeneratedDelete(Request $request)
  621.         {    
  622.             $em $this->mr->getManager('slave');
  623.             $productRegenerated $em->getRepository("App\Entity\Slave\ProductRegenerated")->findOneById($request->request->get("productRegeneratedDelId"));
  624.             $em->remove($productRegenerated);
  625.             $em->flush();
  626.             $this->addFlash('notice_success'"Rigenerazione prodotto eliminata");
  627.             return $this->redirectToRoute('user_product_regenerated');
  628.         }
  629.     //
  630.     
  631.     // MODELLI
  632.         /**
  633.          * @Route("/modelli", name="user_product_models")
  634.          * @Security("is_granted('view', 'product_model')")
  635.          */
  636.         public function userProductModels(Request $requestValidatorInterface $validatorPaginatorInterface $paginatorFormFactoryInterface $formFactoryFileSystem $fs)
  637.         {    
  638.             $emMaster $this->mr->getManager('master');
  639.             $session $request->getSession();
  640.             $company $emMaster->getRepository("App\Entity\Master\Company")->findOneById($session->get("companyId"));
  641.             $em $this->mr->getManager('slave');
  642.             $suppliers $em->getRepository("App\Entity\Slave\Supplier")->findAllActiveOrdered();
  643.             $components $em->getRepository('App\Entity\Slave\ProductComponent')->findAll();
  644.             $filters FilterService::productModelFilter($request);
  645.             $modelsQuery $em->getRepository("App\Entity\Slave\ProductModel")->queryFiltered($filters);
  646.             $models $paginator->paginate($modelsQuery$request->getSession()->get($request->get("_route")."_page"), 15);
  647.             $uploadDir $this->params->get('kernel.project_dir').'/'.$this->params->get('web_path').'/companies/'.$company->getDirectoryPath().'/product_models/';
  648.             $model = new ProductModel();
  649.             $form $formFactory->createNamed("form_model_new"ProductModelNewType::class, $model);
  650.             $form->handleRequest($request);
  651.             if($form->isSubmitted()){
  652.                 $valid ValidationService::validateNotDuplicate($validator$form->get("name"), $em"App\Entity\Slave\ProductModel", ['id' => 0]);
  653.                 if($valid$valid ValidationService::validateFile($validator$form->get('imagePath'), false$form->get('file')->getData(), '3', array('png''jpeg''jpg''webp'));
  654.                 if($valid && $form->isValid()){
  655.                     
  656.                     MediaService::uploadImage($fs$form->get('file')->getData(), null$uploadDir$model'image'1001000200true);
  657.                     $em->persist($model);
  658.                     $em->flush();
  659.                     
  660.                     $model->setInternalCode(UtilitiesService::generateModelInternalCode($model->getId()));
  661.                     foreach($form->get('suppliers') as $formSupplier){
  662.                         if($formSupplier->getData()){
  663.                             $jt = new JoinTableProductModelSupplier();
  664.                             $jt->setModel($model);
  665.                             $jt->setSupplier($em->getRepository('App\Entity\Slave\Supplier')->findOneByid($formSupplier->getName()));
  666.                             $jt->setAlarmStockActive($em->getRepository('App\Entity\Slave\Setting')->findOneBy(array('slug' => 'product_model_default_stock_active'))->getValue());
  667.                             $jt->setAlarmStockYellow($em->getRepository('App\Entity\Slave\Setting')->findOneBy(array('slug' => 'product_model_default_stock_yellow'))->getValue());
  668.                             $jt->setAlarmStockRed($em->getRepository('App\Entity\Slave\Setting')->findOneBy(array('slug' => 'product_model_default_stock_red'))->getValue());
  669.                             $em->persist($jt);
  670.                         }
  671.                     }
  672.                     $em->flush();
  673.                     $this->addFlash('notice_success'"Modello inserito");
  674.                     return $this->redirectToRoute('user_product_model_sheet', array('modelId' => $model->getId()));
  675.                 }
  676.                 else
  677.                     $session->set('openNewModal'true);
  678.             }
  679.             return $this->render('role/user/product/models.html.twig', [
  680.                 "company" => $company,
  681.                 "suppliers" => $suppliers,
  682.                 "components" => $components,
  683.                 "filters" => $filters,
  684.                 "models" => $models,
  685.                 "form" => $form->createView()
  686.             ]);
  687.         }
  688.         /**
  689.          * @Route("/modelli/duplica", name="user_product_model_duplicate")
  690.          * @Security("is_granted('edit', 'product_model')")
  691.          */
  692.         public function userProductModelDuplicate(Request $requestFileSystem $fs)
  693.         {    
  694.             $em $this->mr->getManager('slave');
  695.             $emMaster $this->mr->getManager('master');
  696.             $session $request->getSession();
  697.             $company $emMaster->getRepository("App\Entity\Master\Company")->findOneById($session->get("companyId"));
  698.             $modelDuplicate $em->getRepository("App\Entity\Slave\ProductModel")->findOneById($request->request->get("modelId"));
  699.             $uploadDir $this->params->get('kernel.project_dir').'/'.$this->params->get('web_path').'/companies/'.$company->getDirectoryPath().'/product_models/';
  700.             if($modelDuplicate->getImagePath() != null){
  701.                 $ext explode('.'$modelDuplicate->getImagePath())[1];
  702.                 $fileName md5(uniqid()).'.'.$ext;
  703.             }
  704.             $model = new ProductModel();
  705.             $model->setSubcategory($modelDuplicate->getSubcategory());
  706.             $model->setProducer($modelDuplicate->getProducer());
  707.             $model->setName('000-'.$modelDuplicate->getName());
  708.             $model->setSku($modelDuplicate->getSku());
  709.             $model->setPartNumber($modelDuplicate->getPartNumber());
  710.             if($modelDuplicate->getImagePath() != null){
  711.                 $model->setImagePath($fileName);
  712.                 $fs->copy($uploadDir.$modelDuplicate->getImagePath(), $uploadDir.$fileNametrue);
  713.                 $fs->copy($uploadDir.'thumb_'.$modelDuplicate->getImagePath(), $uploadDir.'thumb_'.$fileNametrue);
  714.             }
  715.             $em->persist($model);
  716.             
  717.             foreach($modelDuplicate->getComponents() as $com){
  718.                 $model->addComponent($com);
  719.             }
  720.             $model->setInternalCode(UtilitiesService::generateModelInternalCode($model->getId()));
  721.             $em->flush();
  722.             $this->addFlash('notice_success'"Modello duplicato");
  723.             return $this->redirectToRoute('user_product_models');
  724.         }
  725.         
  726.         /**
  727.          * @Route("/modelli/elimina", name="user_product_model_delete")
  728.          * @Security("is_granted('edit', 'product_model')")
  729.          */
  730.         public function userProductModelDelete(Request $requestFileSystem $fs)
  731.         {    
  732.             $em $this->mr->getManager('slave');
  733.             $emMaster $this->mr->getManager('master');
  734.             $session $request->getSession();
  735.             $company $emMaster->getRepository("App\Entity\Master\Company")->findOneById($session->get("companyId"));
  736.             $model $em->getRepository("App\Entity\Slave\ProductModel")->findOneById($request->request->get("modelDelId"));
  737.             $uploadDir $this->params->get('kernel.project_dir').'/'.$this->params->get('web_path').'/companies/'.$company->getDirectoryPath().'/product_models/';
  738.             foreach($model->getSuppliers() as $jt)
  739.                 $em->remove($jt);
  740.             MediaService::removeImage($fs$model->getImagePath(), $uploadDir);
  741.             $em->remove($model);
  742.             $em->flush();
  743.             $this->addFlash('notice_success'"Modello eliminato");
  744.             return $this->redirectToRoute('user_product_models');
  745.         }
  746.         
  747.         /**
  748.          * @Route("/modelli/{modelId}/scheda", name="user_product_model_sheet")
  749.          * @Security("is_granted('view', 'product_model')")
  750.          */
  751.         public function userProductModelSheet($modelIdRequest $requestValidatorInterface $validatorFormFactoryInterface $formFactoryFileSystem $fs)
  752.         {    
  753.             $emMaster $this->mr->getManager('master');
  754.             $session $request->getSession();
  755.             $company $emMaster->getRepository("App\Entity\Master\Company")->findOneById($session->get("companyId"));
  756.             $em $this->mr->getManager('slave');
  757.             $model $em->getRepository('App\Entity\Slave\ProductModel')->findOneById($modelId);
  758.             $components $em->getRepository('App\Entity\Slave\ProductComponent')->findAll();
  759.             $uploadDir $this->params->get('kernel.project_dir').'/'.$this->params->get('web_path').'/companies/'.$company->getDirectoryPath().'/product_models/';
  760.             $form $formFactory->createNamed("form_model_edit"ProductModelEditType::class, $model);
  761.             $form->handleRequest($request);
  762.             if($form->isSubmitted()){
  763.                 $valid ValidationService::validateNotDuplicate($validator$form->get("name"), $em"App\Entity\Slave\ProductModel", ['id' => $model->getId()]);
  764.                 if($valid$valid ValidationService::validateFile($validator$form->get('imagePath'), false$form->get('file')->getData(), '3', array('png''jpeg''jpg''webp'));
  765.                 if($valid && $form->isValid()){
  766.                     MediaService::uploadImage($fs$form->get('file')->getData(), null$uploadDir$model'image'1001000200true);
  767.                     $oldSuppliersIds = array();
  768.                     $newSuppliersIds = array();
  769.                     foreach($model->getSuppliers() as $jt){
  770.                         array_push($oldSuppliersIds$jt->getSupplier()->getId());
  771.                     }
  772.                     foreach($form->get('suppliers') as $formSupplier){
  773.                         if($formSupplier->getData()){
  774.                             if(!in_array($formSupplier->getName(), $oldSuppliersIds)){
  775.                                 $jt = new JoinTableProductModelSupplier();
  776.                                 $jt->setModel($model);
  777.                                 $jt->setSupplier($em->getRepository('App\Entity\Slave\Supplier')->findOneByid($formSupplier->getName()));
  778.                                 $jt->setAlarmStockActive($em->getRepository('App\Entity\Slave\Setting')->findOneBy(array('slug' => 'product_model_default_stock_active'))->getValue());
  779.                                 $jt->setAlarmStockYellow($em->getRepository('App\Entity\Slave\Setting')->findOneBy(array('slug' => 'product_model_default_stock_yellow'))->getValue());
  780.                                 $jt->setAlarmStockRed($em->getRepository('App\Entity\Slave\Setting')->findOneBy(array('slug' => 'product_model_default_stock_red'))->getValue());
  781.                                 $em->persist($jt);
  782.                             }
  783.                             array_push($newSuppliersIds$formSupplier->getName());
  784.                         }
  785.                     }
  786.                     foreach($oldSuppliersIds as $oldId){
  787.                         if(!in_array($oldId$newSuppliersIds)){
  788.                             $oldJtpms $em->getRepository('App\Entity\Slave\JoinTableProductModelSupplier')->findOneByModelAndSupplier($model->getId(), $oldId);
  789.                             $em->remove($oldJtpms);
  790.                         }
  791.                     }
  792.                     
  793.                     $em->flush();
  794.                     $this->addFlash('notice_success'"Modifiche salvate");
  795.                     return $this->redirectToRoute('user_product_model_sheet', array('modelId' => $model->getId()));
  796.                 }
  797.                 else{
  798.                     $session->set('openEditModal'true);
  799.                 }
  800.             }
  801.             $jtpms = new JoinTableProductModelSupplier();
  802.             $formJtpmsEdit $formFactory->createNamed("form_jtpms_edit"JoinTableProductModelSupplierType::class, $jtpms);
  803.             $formJtpmsEdit->handleRequest($request);
  804.             if($formJtpmsEdit->isSubmitted()){
  805.                 $valid FormValidatorService::validateJtpms($formJtpmsEdittruenull);
  806.                 if($valid && $formJtpmsEdit->isValid()){
  807.                     
  808.                     $jtpmsEdit $em->getRepository('App\Entity\Slave\JoinTableProductModelSupplier')->findOneById($request->request->get('jtpmsEditId'));
  809.                     $jtpmsEdit->setAlarmStockActive($formJtpmsEdit->get('alarmStockActive')->getData());
  810.                     if($formJtpmsEdit->get('alarmStockActive')->getData()){
  811.                         $jtpmsEdit->setAlarmStockYellow($formJtpmsEdit->get('alarmStockYellow')->getData());
  812.                         $jtpmsEdit->setAlarmStockRed($formJtpmsEdit->get('alarmStockRed')->getData());
  813.                     }
  814.                     else{
  815.                         $jtpmsEdit->setAlarmStockYellow(null);
  816.                         $jtpmsEdit->setAlarmStockRed(null);
  817.                     }
  818.                     $em->flush();
  819.                     $this->addFlash('notice_success'"Scorte aggiornate");
  820.                     return $this->redirectToRoute('user_product_model_sheet', array('modelId' => $model->getId()));
  821.                 }
  822.                 else{
  823.                     $session->set('openEditJtpmsModal'true);
  824.                     $session->set('openEditJtpmsModalId'$request->request->get('jtpmsEditId'));
  825.                 }
  826.             }
  827.             return $this->render('role/user/product/model_sheet.html.twig', [
  828.                 "company" => $company,
  829.                 "model" => $model,
  830.                 "components" => $components,
  831.                 "form" => $form->createView(),
  832.                 "formJtpmsEdit" => $formJtpmsEdit->createView()
  833.             ]);
  834.         }
  835.         /**
  836.          * @Route("/modelli/fornitori-elimina", name="user_product_model_jtpms_delete")
  837.          * @Security("is_granted('edit', 'product_model')")
  838.          */
  839.         public function userProductModelJtpmsDelete(Request $request)
  840.         {    
  841.             $em $this->mr->getManager('slave');
  842.             $jtpms $em->getRepository("App\Entity\Slave\JoinTableProductModelSupplier")->findOneById($request->request->get("jtpmsDelId"));
  843.             $modelId $jtpms->getModel()->getId();
  844.             $em->remove($jtpms);
  845.             $em->flush();
  846.             $this->addFlash('notice_success'"Fornitore eliminato");
  847.             return $this->redirectToRoute('user_product_model_sheet', array('modelId' => $modelId));
  848.         }
  849.         
  850.         /**
  851.          * @Route("/modelli/immagine-elimina", name="user_product_model_image_delete")
  852.          * @Security("is_granted('edit', 'product_model')")
  853.          */
  854.         public function userProductModelImageDelete(Request $requestFileSystem $fs)
  855.         {
  856.             $em $this->mr->getManager('slave');
  857.             $emMaster $this->mr->getManager('master');
  858.             $session $request->getSession();
  859.             $company $emMaster->getRepository('App\Entity\Master\Company')->findOneById($session->get('companyId'));
  860.             $model $em->getRepository('App\Entity\Slave\ProductModel')->findOneById($request->request->get('modelId'));
  861.             $uploadDir $this->params->get('kernel.project_dir').'/'.$this->params->get('web_path').'/companies/'.$company->getDirectoryPath().'/product_models/';
  862.     
  863.             if($model->getImagePath() != null && $model->getImagePath() != ""){
  864.                 MediaService::removeImage($fs$model->getImagePath(), $uploadDir);
  865.                 $model->setImagePath(null);
  866.             }
  867.             $em->flush();
  868.             
  869.             $response = array("code" => 200"success" => true);
  870.             return new Response(json_encode($response));
  871.         }
  872.     //
  873.     
  874.     // SOTTOCATEGORIE
  875.         /**
  876.          * @Route("/sottocategorie", name="user_product_subcategories")
  877.          * @Security("is_granted('view', 'product_subcategory')")
  878.          */
  879.         public function userProductSubcategories(Request $requestValidatorInterface $validatorPaginatorInterface $paginatorFormFactoryInterface $formFactory)
  880.         {    
  881.             $em $this->mr->getManager('slave');
  882.             $session $request->getSession();
  883.             $filters FilterService::productSubcategoryFilter($request);
  884.             $subcategoriesQuery $em->getRepository("App\Entity\Slave\ProductSubcategory")->queryFiltered($filters);
  885.             $subcategories $paginator->paginate($subcategoriesQuery$request->getSession()->get($request->get("_route")."_page"), 15);
  886.             $subcategory = new ProductSubcategory();
  887.             $form $formFactory->createNamed("form_subcategory_new"ProductSubcategoryType::class, $subcategory);
  888.             $form->handleRequest($request);
  889.             if($form->isSubmitted()){
  890.                 $valid ValidationService::validateNotDuplicate($validator$form->get("name"), $em"App\Entity\Slave\ProductSubcategory", ['categoryId' => $form->get('category')->getData()->getId()]);
  891.                 if($form->isValid()){
  892.                     $em->persist($subcategory);
  893.                     $em->flush();
  894.                     $this->addFlash('notice_success'"Sottocategoria inserita");
  895.                     return $this->redirectToRoute('user_product_subcategories');
  896.                 }
  897.                 else
  898.                     $session->set('openNewModal'true);
  899.             }
  900.             $subcategoryEdit = new ProductSubcategory();
  901.             $formEdit $formFactory->createNamed("form_subcategory_edit"ProductSubcategoryType::class, $subcategoryEdit);
  902.             $formEdit->handleRequest($request);
  903.             if($formEdit->isSubmitted()){
  904.                 $valid ValidationService::validateNotDuplicate($validator$formEdit->get("name"), $em"App\Entity\Slave\ProductSubcategory", ['categoryId' => $subcategoryEdit->getCategory()->getId()]);
  905.                 if($valid && $formEdit->isValid()){
  906.                     $pt $em->getRepository("App\Entity\Slave\ProductSubcategory")->findOneById($request->request->get("subcategoryEditId"));
  907.                     $pt->setName($subcategoryEdit->getName());
  908.                     $pt->setCategory($subcategoryEdit->getCategory());
  909.                     $em->flush();
  910.                     $this->addFlash('notice_success'"Sottocategoria modificata");
  911.                     return $this->redirectToRoute('user_product_subcategories');
  912.                 }
  913.                 else{
  914.                     $session->set('openEditModal'true);
  915.                     $session->set('openEditModalId'$request->request->get("subcategoryEditId"));
  916.                 }
  917.             }
  918.             
  919.             return $this->render('role/user/product/subcategories.html.twig', [
  920.                 "filters" => $filters,
  921.                 "subcategories" => $subcategories,
  922.                 "form" => $form->createView(),
  923.                 "formEdit" => $formEdit->createView()
  924.             ]);
  925.         }
  926.         /**
  927.          * @Route("/sottocategorie/elimina", name="user_product_subcategory_delete")
  928.          * @Security("is_granted('edit', 'product_subcategory')")
  929.          */
  930.         public function userProductSubcategoryDelete(Request $request)
  931.         {    
  932.             $em $this->mr->getManager('slave');
  933.             $subcategory $em->getRepository("App\Entity\Slave\ProductSubcategory")->findOneById($request->request->get("subcategoryDelId"));
  934.             $em->remove($subcategory);
  935.             $em->flush();
  936.             $this->addFlash('notice_success'"Sottocategoria eliminata");
  937.             return $this->redirectToRoute('user_product_subcategories');
  938.         }
  939.     //
  940.     
  941.     // CATEGORIE
  942.         /**
  943.          * @Route("/categorie", name="user_product_categories")
  944.          * @Security("is_granted('view', 'product_category')")
  945.          */
  946.         public function userProductCategories(Request $requestValidatorInterface $validatorPaginatorInterface $paginatorFormFactoryInterface $formFactory)
  947.         {    
  948.             $em $this->mr->getManager('slave');
  949.             $session $request->getSession();
  950.             $filters FilterService::productCategoryFilter($request);
  951.             $categoriesQuery $em->getRepository("App\Entity\Slave\ProductCategory")->queryFiltered($filters);
  952.             $categories $paginator->paginate($categoriesQuery$request->getSession()->get($request->get("_route")."_page"), 15);
  953.             $category = new ProductCategory();
  954.             $form $formFactory->createNamed("form_category_new"ProductCategoryType::class, $category);
  955.             $form->handleRequest($request);
  956.             if($form->isSubmitted()){
  957.                 $valid ValidationService::validateNotDuplicate($validator$form->get("name"), $em"App\Entity\Slave\ProductCategory", ['id' => 0]);
  958.                 if($form->isValid()){
  959.                     $em->persist($category);
  960.                     $em->flush();
  961.                     $this->addFlash('notice_success'"Categoria inserita");
  962.                     return $this->redirectToRoute('user_product_categories');
  963.                 }
  964.                 else
  965.                     $session->set('openNewModal'true);
  966.             }
  967.             $categoryEdit = new ProductCategory();
  968.             $formEdit $formFactory->createNamed("form_category_edit"ProductCategoryType::class, $categoryEdit);
  969.             $formEdit->handleRequest($request);
  970.             if($formEdit->isSubmitted()){
  971.                 $valid ValidationService::validateNotDuplicate($validator$formEdit->get("name"), $em"App\Entity\Slave\ProductCategory", ['id' => $request->request->get("categoryEditId")]);
  972.                 if($valid && $formEdit->isValid()){
  973.                     $pt $em->getRepository("App\Entity\Slave\ProductCategory")->findOneById($request->request->get("categoryEditId"));
  974.                     $pt->setName($categoryEdit->getName());
  975.                     $pt->setPos($categoryEdit->isPos());
  976.                     $em->flush();
  977.                     $this->addFlash('notice_success'"Categoria modificata");
  978.                     return $this->redirectToRoute('user_product_categories');
  979.                 }
  980.                 else{
  981.                     $session->set('openEditModal'true);
  982.                     $session->set('openEditModalId'$request->request->get("categoryEditId"));
  983.                 }
  984.             }
  985.             
  986.             return $this->render('role/user/product/categories.html.twig', [
  987.                 "filters" => $filters,
  988.                 "categories" => $categories,
  989.                 "form" => $form->createView(),
  990.                 "formEdit" => $formEdit->createView()
  991.             ]);
  992.         }
  993.         /**
  994.          * @Route("/categorie/elimina", name="user_product_category_delete")
  995.          * @Security("is_granted('edit', 'product_category')")
  996.          */
  997.         public function userProductCategoryDelete(Request $request)
  998.         {    
  999.             $em $this->mr->getManager('slave');
  1000.             $category $em->getRepository("App\Entity\Slave\ProductCategory")->findOneById($request->request->get("categoryDelId"));
  1001.             $em->remove($category);
  1002.             $em->flush();
  1003.             $this->addFlash('notice_success'"Categoria eliminata");
  1004.             return $this->redirectToRoute('user_product_categories');
  1005.         }
  1006.     //
  1007.     
  1008.     // COMPONENTI
  1009.         /**
  1010.          * @Route("/componenti", name="user_product_components")
  1011.          * @Security("is_granted('view', 'product_component')")
  1012.          */
  1013.         public function userProductComponents(Request $requestValidatorInterface $validatorPaginatorInterface $paginatorFormFactoryInterface $formFactory)
  1014.         {    
  1015.             $em $this->mr->getManager('slave');
  1016.             $session $request->getSession();
  1017.             $filters FilterService::nameFilter($request);
  1018.             $componentsQuery $em->getRepository("App\Entity\Slave\ProductComponent")->queryFiltered($filters);
  1019.             $components $paginator->paginate($componentsQuery$request->getSession()->get($request->get("_route")."_page"), 15);
  1020.             $component = new ProductComponent();
  1021.             $form $formFactory->createNamed("form_component_new"ProductComponentType::class, $component);
  1022.             $form->handleRequest($request);
  1023.             if($form->isSubmitted()){
  1024.                 $valid ValidationService::validateNotDuplicate($validator$form->get("name"), $em"App\Entity\Slave\ProductComponent", ['id' => 0]);
  1025.                 if($form->isValid()){
  1026.                     $em->persist($component);
  1027.                     $em->flush();
  1028.                     $this->addFlash('notice_success'"Componente inserito");
  1029.                     return $this->redirectToRoute('user_product_components');
  1030.                 }
  1031.                 else
  1032.                     $session->set('openNewModal'true);
  1033.             }
  1034.             $componentEdit = new ProductComponent();
  1035.             $formEdit $formFactory->createNamed("form_component_edit"ProductComponentType::class, $componentEdit);
  1036.             $formEdit->handleRequest($request);
  1037.             if($formEdit->isSubmitted()){
  1038.                 $valid ValidationService::validateNotDuplicate($validator$formEdit->get("name"), $em"App\Entity\Slave\ProductComponent", ['id' => $request->request->get("componentEditId")]);
  1039.                 if($valid && $formEdit->isValid()){
  1040.                     $pt $em->getRepository("App\Entity\Slave\ProductComponent")->findOneById($request->request->get("componentEditId"));
  1041.                     $pt->setName($componentEdit->getName());
  1042.                     $em->flush();
  1043.                     $this->addFlash('notice_success'"Componente modificato");
  1044.                     return $this->redirectToRoute('user_product_components');
  1045.                 }
  1046.                 else{
  1047.                     $session->set('openEditModal'true);
  1048.                     $session->set('openEditModalId'$request->request->get("componentEditId"));
  1049.                 }
  1050.             }
  1051.             
  1052.             return $this->render('role/user/product/components.html.twig', [
  1053.                 "filters" => $filters,
  1054.                 "components" => $components,
  1055.                 "form" => $form->createView(),
  1056.                 "formEdit" => $formEdit->createView()
  1057.             ]);
  1058.         }
  1059.         /**
  1060.          * @Route("/componenti/elimina", name="user_product_component_delete")
  1061.          * @Security("is_granted('edit', 'product_component')")
  1062.          */
  1063.         public function userProductComponentDelete(Request $request)
  1064.         {    
  1065.             $em $this->mr->getManager('slave');
  1066.             $component $em->getRepository("App\Entity\Slave\ProductComponent")->findOneById($request->request->get("componentDelId"));
  1067.             $em->remove($component);
  1068.             $em->flush();
  1069.             $this->addFlash('notice_success'"Componente eliminato");
  1070.             return $this->redirectToRoute('user_product_components');
  1071.         }
  1072.     //
  1073. }