src/Controller/ProductsController.php line 60

Open in your IDE?
  1. <?php
  2. /*
  3.  * To change this license header, choose License Headers in Project Properties.
  4.  * To change this template file, choose Tools | Templates
  5.  * and open the template in the editor.
  6.  */
  7. namespace App\Controller;
  8. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  9. use Symfony\Component\HttpFoundation\Session\Session;
  10. use Symfony\Component\HttpFoundation\StreamedResponse;
  11. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  12. use Symfony\Component\HttpFoundation\JsonResponse;
  13. use Symfony\Component\HttpFoundation\File\Exception\FileException;
  14. use Symfony\Component\HttpFoundation\File\UploadedFile;
  15. use Symfony\Component\HttpFoundation\Request;
  16. use Symfony\Component\HttpFoundation\Response;
  17. use Knp\Component\Pager\PaginatorInterface;
  18. use App\Entity\Products;
  19. use App\Entity\Attributes;
  20. use App\Form\AttributosType;
  21. use App\Entity\ProductAttributes;
  22. use App\Controller\WCController;
  23. use App\Entity\Categorias;
  24. use App\Entity\Marcas;
  25. use App\Entity\Proveedores;
  26. use App\Form\ProveedoresType;
  27. use App\Entity\Albaranes;
  28. use App\Entity\ProductMarca;
  29. use App\Entity\ProductUploads;
  30. use App\Entity\ProveedorOrder;
  31. use CodeItNow\BarcodeBundle\Utils\BarcodeGenerator;
  32. use Symfony\Component\Serializer\Serializer;
  33. use Symfony\Component\Serializer\Encoder\JsonEncoder;
  34. use Symfony\Component\Serializer\Encoder\XmlEncoder;
  35. use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
  36. use Symfony\Component\Serializer\Encoder\CsvEncoder;
  37. use App\Form\CategoriasType;
  38. /**
  39.  * Description of ProductsController
  40.  *
  41.  * @author joseangelparra
  42.  */
  43. class ProductsController extends AbstractController {
  44.     private $params;
  45.     private $api;
  46.     public function __construct(ParameterBagInterface $params) {
  47.         $this->session = new Session();
  48.         $this->params $params;
  49.         $this->api = new WCController();
  50.     }
  51.     public function index(Request $requestPaginatorInterface $paginator) {
  52.         if (!$this->getUser() || !is_object($this->getUser())) {
  53.             return $this->redirectToRoute('logout');
  54.         }
  55.         $em $this->getDoctrine()->getManager();
  56.         $s = ($request->get("s") ) ? $request->get("s") : "";
  57.         $s_str "";
  58.         if ($s) {
  59.             $s_str " AND p.name LIKE '%" $s "%' OR p.ean LIKE '%" $s "%' OR p.sku LIKE '%" $s "%'";
  60.         }
  61.         $orden = ($request->get("orden")) ? $request->get("orden") : 'DESC';
  62.         $filter = ($request->get("filter")) ? $request->get("filter") : 'id';
  63.         $prods $em->createQueryBuilder()->select("p")
  64.                         ->from("App\Entity\Products""p")
  65.                         ->where("p.id <> '' and p.status > 0 and p.parent= 0" $s_str)
  66.                         ->orderBy("p." $filter$orden)
  67.                         ->getQuery()->getResult();
  68.         $productos $paginator->paginate(
  69.                 $prods, ($request->query->getInt('page')>0) ? $request->query->getInt('page'1) : 120);
  70.         
  71.         /*$productos = $paginator->paginate(
  72.                 $prods, $request->query->getInt('page', 1), 20);
  73. */
  74.         return $this->render('products/list.html.twig', array(
  75.                     'productos' => $productos,
  76.                     's' => $s,
  77.                     'orden' => $orden
  78.         ));
  79.     }
  80.     public function addProduct(Request $request) {
  81.         $page $request->get("page");
  82.         $em $this->getDoctrine()->getManager();
  83.         $parent_products $em->createQueryBuilder()->select('p')
  84.                 ->from("App\Entity\Products""p")
  85.                 ->where("(p.parent=0 ) and p.status=1")
  86.                 ->orderBy("p.name""ASC")
  87.                 ->getQuery()
  88.                 ->getResult();
  89.         $attr $em->getRepository(Attributes::class)->findAll();
  90.         $cats $em->getRepository(Categorias::class)->findAll();
  91.         $marcas =  $em->createQueryBuilder()->select('p')
  92.                 ->from("App\Entity\Marcas""p")
  93.                 ->where("p.status=1")
  94.                 ->getQuery()
  95.                 ->getResult();
  96.         
  97.         return $this->render('products/add.html.twig', array(
  98.                     'parents' => $parent_products,
  99.                     'attr' => $attr,
  100.                     'cats' => $cats,
  101.                     'page' => $page,
  102.                     'marcas'=>$marcas
  103.         ));
  104.     }
  105.     public function getAttributesConfig(Request $request) {
  106.         $id $request->get("id");
  107.         $em $this->getDoctrine()->getManager();
  108.         $attr $em->getRepository(Attributes::class)->find($id);
  109.         return $this->render('products/_parts/attrConfig.html.twig', array(
  110.                     'attr' => $attr
  111.         ));
  112.     }
  113.     public function storeProduct(Request $request) {
  114.         
  115.         $page $request->get("page");
  116.         $em $this->getDoctrine()->getManager();
  117.         
  118.         $info $request->request->all();
  119.         //dd($info);
  120.         if (isset($info["id"]) && $info["id"] != "") {
  121.             $product $em->getRepository(Products::class)->find($info["id"]);
  122.             $prod_image $product->getImage();
  123.         } else {
  124.             $product = new Products();
  125.             $product->setDateCreated(new \DateTime());
  126.             $prod_image "";
  127.         }
  128.         //seteamos
  129.         $product->setName($info["name"]);
  130.         $product->setSku($info["sku"]);
  131.         $product->setEan($info["ean"]);
  132.         $product->setDescription($info["description"]);
  133.         $product->setPrice(floatval($info["price"]));
  134.         $product->setIva(floatval($info["iva"]));
  135.         $product->setCostPrice($info["cost_price"]);
  136.         $product->setStoreStock($info["store_stock"]);
  137.         $product->setWpStock($info["wp_stock"]);
  138.         if ($info["discount_from"] != "") {
  139.             $disc_from = \DateTime::createFromFormat('d/m/Y'$info["discount_from"]);
  140.             $product->setDiscountFrom($disc_from);
  141.         } else {
  142.             $product->setDiscountFrom(null);
  143.         }
  144.         if ($info["discount_to"] != "") {
  145.             $disc_to = \DateTime::createFromFormat('d/m/Y'$info["discount_to"]);
  146.             $product->setDiscountTo($disc_to);
  147.         } else {
  148.             $product->setDiscountTo(null);
  149.         }
  150.         $product->setStoreDiscount(($info["store_discount"] != "") ? $info["store_discount"] : );
  151.         $product->setWebDiscount(($info["web_discount"] != "") ? $info["web_discount"] : 0);
  152.         $product->setDateModify(new \DateTime());
  153.         $product->setGlobalStock(floatval($info["store_stock"]) + floatval($info["wp_stock"]));
  154.         $product->setStatus(1);
  155.         $product->setParent((isset($info["parent"]) ? $info["parent"] : 0));
  156.         //imagen
  157.         $image $request->files->get("image");
  158.         if ($image) { //subimos la imagen
  159.             $originalFilename pathinfo($image[0]->getClientOriginalName(), PATHINFO_FILENAME);
  160.             $safeFilename = \transliterator_transliterate('Any-Latin; Latin-ASCII; [^A-Za-z0-9_] remove; Lower()'$originalFilename);
  161.             $newFileName $safeFilename "-product" uniqid() . "." $image[0]->guessExtension();
  162.             try {
  163.                 $image[0]->move(
  164.                         'assets/images/products/',
  165.                         $newFileName
  166.                 );
  167.             } catch (FileException $e) {
  168.                 var_dump($e);
  169.                 die();
  170.             }
  171.             $product->setImage($newFileName);
  172.             if (count($image) > 0) {
  173.                 $gal = [];
  174.                 for ($i 1$i count($image); $i++) {
  175.                     $originalFilename pathinfo($image[$i]->getClientOriginalName(), PATHINFO_FILENAME);
  176.                     $safeFilename = \transliterator_transliterate('Any-Latin; Latin-ASCII; [^A-Za-z0-9_] remove; Lower()'$originalFilename);
  177.                     $newFileName $safeFilename "-product" uniqid() . "." $image[$i]->guessExtension();
  178.                     try {
  179.                         $image[$i]->move(
  180.                                 'assets/images/products/',
  181.                                 $newFileName
  182.                         );
  183.                     } catch (FileException $e) {
  184.                         var_dump($e);
  185.                         die();
  186.                     }
  187.                     $gal[] = $newFileName;
  188.                 }
  189.                 $product->setGallery(json_encode($gal));
  190.             }
  191.         } else {
  192.             $product->setImage($prod_image);
  193.         }
  194.         
  195.         //guardamos en local
  196.         $em->persist($product);
  197.         $f $em->flush();
  198.         if ($f == null) {
  199.             //atributos
  200.             if (isset($info["attr"]) && $info["attr"] != "") {
  201.                 //borramos los atributos actuales
  202.                 $p_attr $em->getRepository(ProductAttributes::class)->findBy(array("productId" => $product->getId()));
  203.                 foreach ($p_attr as $p_at) {
  204.                     $em->remove($p_at);
  205.                     $em->flush();
  206.                 }
  207.                 foreach ($info["attr"] as $attr_id) {
  208.                     $value $info["attrib_" $attr_id "_value"];
  209.                     $prod_attr = new ProductAttributes();
  210.                     $prod_attr->setAttributeId($attr_id);
  211.                     $prod_attr->setProductId($product->getId());
  212.                     $prod_attr->setValue($value);
  213.                     $em->persist($prod_attr);
  214.                     $em->flush();
  215.                 }
  216.             }
  217.             //categorías
  218.             if (isset($info["categoria"]) && count($info["categoria"])>0) {
  219.                 
  220.                 foreach($info["categoria"] as $cat){
  221.                   $prod_cat = new \App\Entity\ProductCats();
  222.                   $prod_cat->setCatId($cat);
  223.                   $prod_cat->setProductId($product->getId());
  224.                   $prod_cat->setDateCreated(new \DateTime());
  225.                 
  226.                   $em->persist($prod_cat);
  227.                   $em->flush();
  228.                 }
  229.             }
  230.             
  231.             //marca
  232.             if(isset($info["marca"]) && $info["marca"] !=""){
  233.                 $marc = new ProductMarca();
  234.                 $marc->setProductId($product->getId());
  235.                 $marc->setMarcaId($info["marca"]);
  236.                 
  237.                 $em->persist($marc);
  238.                 $em->flush();
  239.             }
  240.             //web
  241.             
  242.             if (isset($info["web"]) && $info["web"] == "on") {
  243.                 //lo enviamos a WP
  244.                 $addedwp $this->api->addProductToWP($product$em);
  245.             }
  246.             $type 1;
  247.             $status "Producto guardado correctamente";
  248.         } else {
  249.             $type 0;
  250.             $status "Error al guardar el producto";
  251.         }
  252.         $this->session->getFlashBag()->add('type'$type);
  253.         $this->session->getFlashBag()->add('status'$status);
  254.         return $this->redirectToRoute('productos', ['page' => $page]);
  255.     }
  256.     public function deleteProduct(Request $request) {
  257.         
  258.         if (!$this->getUser() || !is_object($this->getUser())) {
  259.             return $this->redirectToRoute('logout');
  260.         }
  261.         $em $this->getDoctrine()->getManager();
  262.         $pid $request->get("id");
  263.         $page $request->get("page");
  264.         $prod $em->getRepository(Products::class)->find($pid);
  265.         if ($prod) {
  266.             if ($prod->getWpId() != null) {
  267.                     $delete_wp $this->api->deleteProductToWP($prod$em);
  268.             }
  269.             //$prod->remove(0);
  270.             $em->remove($prod);
  271.             $f $em->flush();
  272.             if ($f == null) {
  273.                 $type 1;
  274.                 $status "Producto eliminado correctamente";
  275.             } else {
  276.                 $type 0;
  277.                 $status "Error al eliminar el producto";
  278.             }
  279.         } else {
  280.             $type 0;
  281.             $status "Producto no encontrado";
  282.         }
  283.         $this->session->getFlashBag()->add('type'$type);
  284.         $this->session->getFlashBag()->add('status'$status);
  285.         return $this->redirectToRoute('productos', ['page' => $page]);
  286.     }
  287.     public function generateAutoSku() {
  288.         $em $this->getDoctrine()->getManager();
  289.         $l_prod $em->createQueryBuilder()->select('p')
  290.                 ->from("App\Entity\Products""p")
  291.                 ->where("p.id<>''")
  292.                 ->orderBy("p.id""DESC")
  293.                 ->setMaxResults(1)
  294.                 ->getQuery()
  295.                 ->getResult();
  296.         if ($l_prod) {
  297.             $last_num $l_prod[0]->getSku();
  298.             $last_num++;
  299.         } else {
  300.             $last_num date("Y") . "00001";
  301.         }
  302.         return new JsonResponse(array('sku' => $last_num));
  303.     }
  304.     public function editProduct(Request $request) {
  305.         $em $this->getDoctrine()->getManager();
  306.         $id $request->get("id");
  307.         $page $request->get("page");
  308.         $prod $em->getRepository(Products::class)->find($id);
  309.         $parent_products $em->createQueryBuilder()->select('p')
  310.                 ->from("App\Entity\Products""p")
  311.                 ->where("(p.parent=0 ) and p.status=1")
  312.                 ->orderBy("p.name""ASC")
  313.                 ->getQuery()
  314.                 ->getResult();
  315.         $product_attr $em->getRepository(ProductAttributes::class)->findBy(array("productId" => $id));
  316.         $atrib = array();
  317.         foreach ($product_attr as $pa) {
  318.             $atrib[] = $pa->getAttributeId();
  319.         }
  320.         $attr $em->getRepository(Attributes::class)->findAll();
  321.         $cats $em->getRepository(Categorias::class)->findAll();
  322.         $product_cats $em->getRepository(\App\Entity\ProductCats::class)->findBy(array("productId" => $id));
  323.         $c_cats = array();
  324.         foreach ($product_cats as $c) {
  325.             $c_cats[] = $c->getCatId();
  326.         }
  327.         
  328.         $marcas $marcas =  $em->createQueryBuilder()->select('p')
  329.                 ->from("App\Entity\Marcas""p")
  330.                 ->where("p.status=1")
  331.                 ->getQuery()
  332.                 ->getResult();
  333.                 
  334.         $product_marcas $em->getRepository(ProductMarca::class)->findBy(array("productId"=>$id));
  335.         $c_marc = array();
  336.         foreach($product_marcas as $m){
  337.           $c_marc[] = $m->getMarcaId();
  338.         }
  339.         
  340.         return $this->render('products/edit.html.twig', array(
  341.                     "prod" => $prod,
  342.                     'parents' => $parent_products,
  343.                     'attr' => $attr,
  344.                     'c_attr' => $product_attr,
  345.                     'atrib' => $atrib,
  346.                     'cats' => $cats,
  347.                     'c_cats' => $c_cats,
  348.                     'page' => $page,
  349.                     'marcas'=>$marcas,
  350.                     'c_marc'=>$c_marc
  351.         ));
  352.     }
  353.     public function updateProduct(Request $request) {
  354.         $em $this->getDoctrine()->getManager();
  355.         $page $request->request->get("page");
  356.         $info $request->request->all();
  357.         //dd($info);
  358.         if (isset($info["id"]) && $info["id"] != "") {
  359.             $product $em->getRepository(Products::class)->find($info["id"]);
  360.             $prod_image $product->getImage();
  361.         } else {
  362.             return false;
  363.         }
  364.         //seteamos
  365.         $product->setName($info["name"]);
  366.         $product->setSku($info["sku"]);
  367.         $product->setEan($info["ean"]);
  368.         $product->setDescription($info["description"]);
  369.         $product->setPrice(floatval($info["price"]));
  370.         $product->setIva(floatval($info["iva"]));
  371.         $product->setCostPrice($info["cost_price"]);
  372.         $product->setStoreStock($info["store_stock"]);
  373.         $product->setWpStock($info["wp_stock"]);
  374.         if ($info["discount_from"] != "") {
  375.             $disc_from = \DateTime::createFromFormat('d/m/Y'$info["discount_from"]);
  376.             $product->setDiscountFrom($disc_from);
  377.         }
  378.         if ($info["discount_to"] != "") {
  379.             $disc_to = \DateTime::createFromFormat('d/m/Y'$info["discount_to"]);
  380.             $product->setDiscountTo($disc_to);
  381.         }
  382.         $product->setStoreDiscount(($info["store_discount"] != "") ? $info["store_discount"] : );
  383.         $product->setWebDiscount(($info["web_discount"] != "") ? $info["web_discount"] : 0);
  384.         $product->setDateModify(new \DateTime());
  385.         $product->setGlobalStock(floatval($info["store_stock"]) + floatval($info["wp_stock"]));
  386.         $product->setParent((isset($info["parent"]) ? $info["parent"] : 0));
  387.         //imagen
  388.         $image $request->files->get("image");
  389.         if ($image) { //subimos la imagen
  390.             $originalFilename pathinfo($image[0]->getClientOriginalName(), PATHINFO_FILENAME);
  391.             $safeFilename = \transliterator_transliterate('Any-Latin; Latin-ASCII; [^A-Za-z0-9_] remove; Lower()'$originalFilename);
  392.             $newFileName $safeFilename "-product" uniqid() . "." $image[0]->guessExtension();
  393.             try {
  394.                 $image[0]->move(
  395.                         'assets/images/products/',
  396.                         $newFileName
  397.                 );
  398.             } catch (FileException $e) {
  399.                 var_dump($e);
  400.                 die();
  401.             }
  402.             $product->setImage($newFileName);
  403.             if (count($image) > 0) {
  404.                 $gal = [];
  405.                 for ($i 1$i count($image); $i++) {
  406.                     $originalFilename pathinfo($image[$i]->getClientOriginalName(), PATHINFO_FILENAME);
  407.                     $safeFilename = \transliterator_transliterate('Any-Latin; Latin-ASCII; [^A-Za-z0-9_] remove; Lower()'$originalFilename);
  408.                     $newFileName $safeFilename "-product" uniqid() . "." $image[$i]->guessExtension();
  409.                     try {
  410.                         $image[$i]->move(
  411.                                 'assets/images/products/',
  412.                                 $newFileName
  413.                         );
  414.                     } catch (FileException $e) {
  415.                         var_dump($e);
  416.                         die();
  417.                     }
  418.                     $gal[] = $newFileName;
  419.                 }
  420.                 $product->setGallery(json_encode($gal));
  421.             }
  422.         } else {
  423.             $product->setImage($prod_image);
  424.         }
  425.         //guardamos en local
  426.         $em->persist($product);
  427.         $f $em->flush();
  428.         if ($f == null) {
  429.             //atributos
  430.             if (isset($info["attr"]) && $info["attr"] != "") {
  431.                 //borramos los atributos actuales
  432.                 $p_attr $em->getRepository(ProductAttributes::class)->findBy(array("productId" => $product->getId()));
  433.                 foreach ($p_attr as $p_at) {
  434.                     $em->remove($p_at);
  435.                     $em->flush();
  436.                 }
  437.                 foreach ($info["attr"] as $attr_id) {
  438.                     $value $info["attrib_" $attr_id "_value"];
  439.                     $prod_attr = new ProductAttributes();
  440.                     $prod_attr->setAttributeId($attr_id);
  441.                     $prod_attr->setProductId($product->getId());
  442.                     $prod_attr->setValue($value);
  443.                     $em->persist($prod_attr);
  444.                     $em->flush();
  445.                 }
  446.             }
  447.             //categorías
  448.             
  449.             $p_cats $em->getRepository(\App\Entity\ProductCats::class)->findBy(array('productId' => $product->getId()));
  450.                 foreach ($p_cats as $pc) {
  451.                     $em->remove($pc);
  452.                     $em->flush();
  453.                 }
  454.             if (isset($info["categoria"]) && count($info["categoria"])>0) {
  455.                 //borramos la actual
  456.                 
  457.                 foreach($info["categoria"] as $cat){
  458.                   $prod_cat = new \App\Entity\ProductCats();
  459.                   $prod_cat->setCatId($cat);
  460.                   $prod_cat->setProductId($product->getId());
  461.                   $prod_cat->setDateCreated(new \DateTime());
  462.                 
  463.                   $em->persist($prod_cat);
  464.                   $em->flush();
  465.                 }
  466.                 
  467.             }
  468.             
  469.             if(isset($info["marca"]) && $info["marca"] !=""){
  470.               //borramos la actual
  471.                 $p_cats $em->getRepository(\App\Entity\ProductMarca::class)->findBy(array('productId' => $product->getId()));
  472.                 foreach ($p_cats as $pc) {
  473.                     $em->remove($pc);
  474.                     $em->flush();
  475.                 }
  476.                 $marc = new ProductMarca();
  477.                 $marc->setProductId($product->getId());
  478.                 $marc->setMarcaId($info["marca"]);
  479.                 
  480.                 $em->persist($marc);
  481.                 $em->flush();
  482.             }
  483.             //web
  484.             
  485.             if (isset($info["web"]) && $info["web"] == "on") {
  486.                 if ($product->getWpId()) {
  487.                     //update
  488.                     $updatedwp $this->api->updateProductToWP($product$em);
  489.                 } else {
  490.                     //create
  491.                     $addedwp $this->api->addProductToWP($product$em);
  492.                     //dd($addedwp);
  493.                 }
  494.             } else {
  495.                 if ($product->getWpId()) {
  496.                     $deleteWp $this->api->deleteProductToWP($product$em);
  497.                 }
  498.             }
  499.             $type 1;
  500.             $status "Producto guardado correctamente";
  501.         } else {
  502.             $type 0;
  503.             $status "Error al guardar el producto";
  504.         }
  505.         $this->session->getFlashBag()->add('type'$type);
  506.         $this->session->getFlashBag()->add('status'$status);
  507.         return $this->redirectToRoute('productos', ['page' => $page]);
  508.     }
  509.     public function addProductVariation(Request $request) {
  510.         $em $this->getDoctrine()->getManager();
  511.         $id $request->get("id");
  512.         $prod $em->getRepository(Products::class)->find($id);
  513.         $parent_products $em->createQueryBuilder()->select('p')
  514.                 ->from("App\Entity\Products""p")
  515.                 ->where("(p.parent=0 ) and p.status=1")
  516.                 ->orderBy("p.name""ASC")
  517.                 ->getQuery()
  518.                 ->getResult();
  519.         $product_attr $em->getRepository(ProductAttributes::class)->findBy(array("productId" => $id));
  520.         $atrib = array();
  521.         foreach ($product_attr as $pa) {
  522.             $atrib[] = $pa->getAttributeId();
  523.         }
  524.         $attr $em->getRepository(Attributes::class)->findAll();
  525.         $cats $em->getRepository(Categorias::class)->findAll();
  526.         $product_cats $em->getRepository(\App\Entity\ProductCats::class)->findBy(array("productId" => $id));
  527.         $c_cats = array();
  528.         foreach ($product_cats as $c) {
  529.             $c_cats[] = $c->getCatId();
  530.         }
  531.         
  532.         $marcas =  $em->createQueryBuilder()->select('p')
  533.                 ->from("App\Entity\Marcas""p")
  534.                 ->where("p.status=1")
  535.                 ->getQuery()
  536.                 ->getResult();
  537.         $product_marcas $em->getRepository(\App\Entity\ProductMarca::class)->findBy(array("productId" => $id));
  538.         $c_marc = array();
  539.         foreach($product_marcas as $m){
  540.           $c_marc[] = $m->getMarcaId();
  541.         }
  542.         
  543.         return $this->render('products/addProdVariation.html.twig', array(
  544.                     "prod" => $prod,
  545.                     'parents' => $parent_products,
  546.                     'attr' => $attr,
  547.                     'c_attr' => $product_attr,
  548.                     'atrib' => $atrib,
  549.                     'cats' => $cats,
  550.                     'c_cats' => $c_cats,
  551.                     'marcas'=>$marcas,
  552.                     'c_marc'=>$c_marc
  553.         ));
  554.     }
  555.     public function viewProductVariations(Request $requestPaginatorInterface $paginator) {
  556.         $em $this->getDoctrine()->getManager();
  557.         $id $request->get("id");
  558.         $prod_parent $em->getRepository(Products::class)->find($id);
  559.         $prods $em->createQueryBuilder()->select("p")
  560.                         ->from("App\Entity\Products""p")
  561.                         ->where("p.id <> '' and p.status > 0 and p.parent=" $id)
  562.                         ->getQuery()->getResult();
  563.         $productos $paginator->paginate(
  564.                 $prods$request->query->getInt('page'1), 20);
  565.         return $this->render('products/listVariations.html.twig', array(
  566.                     'productos' => $productos,
  567.                     'prod' => $prod_parent
  568.         ));
  569.     }
  570.     /*
  571.      * Attributes functions
  572.      */
  573.     public function indexAtributes(Request $requestPaginatorInterface $paginator) {
  574.         $em $this->getDoctrine()->getManager();
  575.         $attr_new = new Attributes();
  576.         $form $this->createForm(AttributosType::class, $attr_new, ['save_lbl' => "Guardar"]);
  577.         $form->handleRequest($request);
  578.         if ($form->isSubmitted()) {
  579.             $attr_new->setDatecreated(new \DateTime());
  580.             $em->persist($attr_new);
  581.             $f $em->flush();
  582.             if ($f == null) {
  583.                 $type 1;
  584.                 $status "Atributo guardado correctamente";
  585.             } else {
  586.                 $type 0;
  587.                 $status "Error al guardar el atributo";
  588.             }
  589.             $this->session->getFlashBag()->add('type'$type);
  590.             $this->session->getFlashBag()->add('status'$status);
  591.             return $this->redirectToRoute('atributos');
  592.         }
  593.         $orden = ($request->get("orden")) ? $request->get("orden") : 'DESC';
  594.         $filter = ($request->get("filter")) ? $request->get("filter") : 'id';
  595.         $attrs $em->createQueryBuilder()->select("a")
  596.                         ->from("App\Entity\Attributes""a")
  597.                         ->where("a.id <> ''")
  598.                         ->orderBy("a." $filter$orden)
  599.                         ->getQuery()->getResult();
  600.         $atributos $paginator->paginate(
  601.                 $attrs$request->query->getInt('page'1), 20);
  602.         return $this->render('products/attributes/list.html.twig', array(
  603.                     'atributos' => $atributos,
  604.                     'orden' => $orden,
  605.                     'form' => $form->createView()
  606.         ));
  607.     }
  608.     public function addAtributeValues(Request $request) {
  609.         $em $this->getdoctrine()->getManager();
  610.         $values $request->request->get("valores");
  611.         $id $request->request->get('id_attr');
  612.         if ($values != "") {
  613.             $valores json_encode(explode(","$values));
  614.             $atr $em->getRepository(Attributes::class)->find($id);
  615.             $atr->setValue($valores);
  616.             $em->persist($atr);
  617.             $f $em->flush();
  618.             if ($f == null) {
  619.                 $type 1;
  620.                 $status "Atributos guardados correctamente";
  621.             } else {
  622.                 $type 0;
  623.                 $status "Error al guardar atributos";
  624.             }
  625.             $this->session->getFlashBag()->add('type'$type);
  626.             $this->session->getFlashBag()->add('status'$status);
  627.             return $this->redirectToRoute('atributos');
  628.         }
  629.     }
  630.     /*
  631.      * Categorias functions
  632.      */
  633.     public function indexCategorias(Request $requestPaginatorInterface $paginator) {
  634.         $em $this->getDoctrine()->getManager();
  635.         $orden = ($request->get("orden")) ? $request->get("orden") : 'DESC';
  636.         //$cats = $em->getRepository(\App\Entity\Categorias::class)->findAll();
  637.         
  638.         $cats $em->createQueryBuilder()->select("c")
  639.             ->from("App\Entity\Categorias""c")
  640.             ->where("c.id <> '' and c.status > 0")
  641.             ->getQuery()->getResult();
  642.         
  643.         $pagination $paginator->paginate(
  644.                 $cats$request->query->getInt('page'1), 20);
  645.                 
  646.         $cat_new = new Categorias();
  647.         $p_cats $em->getRepository(Categorias::class)->findBy(array('parent'=>0));
  648.         $parents = ["Ninguna"=>0];
  649.         foreach($p_cats as $cat){
  650.             if ($cat->getStatus() != '0')
  651.             $parents[$cat->getNombre()]=$cat->getId();
  652.         }
  653.         
  654.         $form $this->createForm(CategoriasType::class,$cat_new, [
  655.             'save_lbl'=>"Guardar",
  656.             'parents'=>$parents
  657.         ]);
  658.         
  659.         $form->handleRequest($request);
  660.         
  661.         if($form->isSubmitted()){
  662.             
  663.             $cat_new->setStatus('1');
  664.             //crear categoria a wp
  665.             $wc = new WCController();
  666.             $parent_cat_wp 0;
  667.             if($cat_new->getParent()){
  668.                 $par_cat $em->getRepository(Categorias::class)->find($cat_new->getParent());
  669.                 $parent_cat_wp $par_cat->getIdWp();
  670.             }
  671.             $wp_cat $wc->createCat($cat_new->getNombre(), str_replace(" ""-"strtolower($cat_new->getNombre())), $parent_cat_wp);
  672.             //dd($wp_cat);
  673.             $cat_new->setIdWp($wp_cat->id);
  674.             $cat_new->setParentWp($wp_cat->parent);
  675.             $em->persist($cat_new);
  676.             $f $em->flush();
  677.             if($f == null){
  678.                 
  679.                 $type 1;
  680.                 $status "Categoría guardada correctamente";
  681.             }else{
  682.                 $type 0;
  683.                 $status "Error al guardar categoría";
  684.             }
  685.             $this->session->getFlashBag()->add('type'$type);
  686.             $this->session->getFlashBag()->add('status'$status);
  687.             return $this->redirectToRoute('categorias');
  688.         }
  689.         
  690.         return $this->render('products/categories/list.html.twig', array(
  691.                     "cats" => $pagination,
  692.                     'orden' => $orden,
  693.                     'form'=>$form->createView()
  694.         ));
  695.     }
  696.     
  697.     public function categoryEditForm(Request $request) {
  698.         
  699.         $em $this->getDoctrine()->getManager();
  700.         
  701.         $id $request->request->get('id');
  702.         
  703.         $cat $em->getRepository(Categorias::class)->findBy(['id' => $id]);
  704.         $cats $em->createQueryBuilder()->select("c")
  705.             ->from("App\Entity\Categorias""c")
  706.             ->where("c.id <> '' and c.status > 0")
  707.             ->getQuery()->getResult();
  708.         
  709.         
  710.         
  711.         return $this->render('products/categories/editForm.html.twig', array(
  712.                     "id" => $id,
  713.                     "cat" => $cat[0],
  714.                     "cats" => $cats,
  715.         ));
  716.     }
  717.     
  718.     public function categoryEdit(Request $request) {
  719.         
  720.         //dd($request->request);
  721.         $em $this->getDoctrine()->getManager();
  722.         $data $request->request->all();
  723.         
  724.         $cat $em->getRepository(Categorias::class)->find($data['id']);
  725.         
  726.         if($data && $cat && $data['nombre']){
  727.             
  728.             $cat->setNombre($data['nombre']); 
  729.             $cat->setParent($data['padre']);
  730.             $wc = new WCController();
  731.             if($cat->getIdWp()==""){
  732.                 
  733.                 $parent_cat_wp 0;
  734.                 if($cat->getParent()){
  735.                     $par_cat $em->getRepository(Categorias::class)->find($cat->getParent());
  736.                     $parent_cat_wp $par_cat->getIdWp();
  737.                 }
  738.                 $wp_cat $wc->createCat($cat->getNombre(), str_replace(" ""-"strtolower($cat->getNombre())), $parent_cat_wp);
  739.                 $cat->setIdWp($wp_cat->id);
  740.                 $cat->setParentWp($wp_cat->parent);
  741.             }else{
  742.                 $parent_cat_wp 0;
  743.                 $wp_cat $wc->updateCat($cat->getNombre(), str_replace(" ""-"strtolower($cat->getNombre())), $cat->getParentWp(), $cat->getIdWp());
  744.             }
  745.             
  746.             $em->persist($cat);
  747.             $f $em->flush();
  748.             
  749.             if($f == null){
  750.                 $type 1;
  751.                 $status "Categoría editada correctamente";
  752.             }else{
  753.                 $type 0;
  754.                 $status "Error al editar la categoría";
  755.             } 
  756.         } else {
  757.             $type 0;
  758.             $status "Datos incorrectos o no se encontro la categoría";
  759.         }
  760.         $this->session->getFlashBag()->add('type'$type);
  761.         $this->session->getFlashBag()->add('status'$status);
  762.         
  763.         return $this->redirectToRoute('categorias');
  764.     }
  765.     
  766.     public function categoryDelete(Request $request) {
  767.         
  768.         if (!$this->getUser() || !is_object($this->getUser())) {
  769.             return $this->redirectToRoute('logout');
  770.         }
  771.         
  772.         $em $this->getDoctrine()->getManager();
  773.         $id $request->query->get('id');
  774.         
  775.         $cat $em->getRepository(Categorias::class)->find($id);
  776.         
  777.         if($id && $cat){
  778.             $cat->setStatus(0);
  779.             if($cat->getIdWP()!=""){
  780.                 $wc = new WCController();
  781.                 $del $wc->deleteCat($cat->getIdWp());
  782.                 $cat->setIdWp("");
  783.                 $cat->setParentWp("");
  784.             }
  785.             $em->persist($cat);
  786.             $f $em->flush();
  787.             
  788.             if($f == null){
  789.                 
  790.                 $type 1;
  791.                 $status "Categoría eliminada correctamente";
  792.             }else{
  793.                 $type 0;
  794.                 $status "Error al eliminar la categoría";
  795.             }
  796.         } else {
  797.             $type 0;
  798.             $status "Datos incorrectos o no se encontro la categoría";
  799.         }
  800.         $this->session->getFlashBag()->add('type'$type);
  801.         $this->session->getFlashBag()->add('status'$status);
  802.         
  803.         return $this->redirectToRoute('categorias');
  804.     }
  805.     public function SyncCatsWP(Request $request) {
  806.         $em $this->getDoctrine()->getManager();
  807.         $api = new WCController();
  808.         $return $request->get("return");
  809.         $cats $api->getProductCats();
  810.         
  811.         foreach ($cats as $cat) {
  812.             if (!is_object($cat)) {
  813.                 dd($cat);
  814.             }
  815.             $cate $em->getRepository(Categorias::class)->findOneBy(array('idWp' => $cat->id));
  816.             if (!$cate) {
  817.                 $cate = new Categorias();
  818.                 $cate->setStatus(1);
  819.             }
  820.             $cate->setIdWp($cat->id);
  821.             $cate->setNombre($cat->name);
  822.             
  823.             if ($cat->parent == 0) {
  824.                 $cate->setParent($cat->parent);
  825.             } else {
  826.                 $parent_cat $em->getRepository(Categorias::class)->findOneBy(array('idWp' => $cat->parent));
  827.                 if ($parent_cat) {
  828.                     $cate->setParent($parent_cat->getId());
  829.                 } else {
  830.                     $cate->setParent(0);
  831.                 }
  832.             }
  833.             $cate->setParentWp($cat->parent);
  834.             $em->persist($cate);
  835.             $em->flush();
  836.         }
  837.         if ($return == 1) {
  838.             $this->session->getFlashBag()->add('type'1);
  839.             $this->session->getFlashBag()->add('status'"Categorías sincronizadas");
  840.             return $this->redirectToRoute('categorias');
  841.         } else {
  842.             dd($cats);
  843.         }
  844.     }
  845.     public function SyncBrandsWP(Request $request) {
  846.         $api = new WCController();
  847.         $brands $api->getProductBrands();
  848.         dd($brands);
  849.     }
  850.     /*
  851.      * Proveedores functions
  852.      */
  853.     public function proveedoresIndex(Request $requestPaginatorInterface $paginator) {
  854.         if (!$this->getUser() || !is_object($this->getUser())) {
  855.             return $this->redirectToRoute('logout');
  856.         }
  857.         $s = ($request->get("s") ) ? $request->get("s") : "";
  858.         $s_str "";
  859.         if ($s) {
  860.             $s_str " AND p.name LIKE '%" $s "%' OR p.email LIKE '%" $s "%'";
  861.         }
  862.         $orden = ($request->get("orden")) ? $request->get("orden") : 'DESC';
  863.         $filter = ($request->get("filter")) ? $request->get("filter") : 'id';
  864.         $em $this->getDoctrine()->getManager();
  865.         $proveedores $em->createQueryBuilder()->select("p")
  866.                 ->from("App\Entity\Proveedores""p")
  867.                 ->where("p.id <> ''")
  868.                 ->orderBy("p." $filter$orden)
  869.                 ->getQuery()
  870.                 ->getResult();
  871.         $provs $paginator->paginate(
  872.                 $proveedores$request->query->getInt('page'1), 20);
  873.         $new_p = new Proveedores();
  874.         $form $this->createForm(ProveedoresType::class, $new_p, [
  875.             'save_lbl' => "Guardar"
  876.         ]);
  877.         $form->handleRequest($request);
  878.         if ($form->isSubmitted()) {
  879.             $new_p->setDatecreated(new \DateTime());
  880.             $em->persist($new_p);
  881.             $f $em->flush();
  882.             if ($f == null) {
  883.                 $type 1;
  884.                 $status "Proveedor guardado correctamente";
  885.             } else {
  886.                 $type 0;
  887.                 $status "Error al guardar el proveedor";
  888.             }
  889.             $this->session->getFlashBag()->add('type'$type);
  890.             $this->session->getFlashBag()->add('status'$status);
  891.             return $this->redirectToRoute('proveedores');
  892.         }
  893.         return $this->render('products/proveedores/index.html.twig', array(
  894.                     "s" => $s,
  895.                     "proveedores" => $provs,
  896.                     'orden' => $orden,
  897.                     'form' => $form->createView()
  898.         ));
  899.     }
  900.     public function deleteProveedor(Request $request) {
  901.         $id $request->get("id");
  902.         $em $this->getDoctrine()->getManager();
  903.         $provee $em->getRepository(Proveedores::class)->find($id);
  904.         if ($provee) {
  905.             $em->remove($provee);
  906.             $f $em->flush();
  907.             if ($f == null) {
  908.                 $type 1;
  909.                 $status "Proveedor eliminado correctamente";
  910.             } else {
  911.                 $type 0;
  912.                 $status "Error al eliminar el proveedor";
  913.             }
  914.             $this->session->getFlashBag()->add('type'$type);
  915.             $this->session->getFlashBag()->add('status'$status);
  916.             return $this->redirectToRoute('proveedores');
  917.         }
  918.     }
  919.     public function editProveedor(Request $request) {
  920.         $id $request->get("id");
  921.         $em $this->getDoctrine()->getManager();
  922.         $prove $em->getRepository(Proveedores::class)->find($id);
  923.         $form $this->createForm(ProveedoresType::class, $prove, [
  924.             'save_lbl' => "Guardar"
  925.         ]);
  926.         $form->handleRequest($request);
  927.         if ($form->isSubmitted()) {
  928.             $em->persist($prove);
  929.             $f $em->flush();
  930.             if ($f == null) {
  931.                 $type 1;
  932.                 $status "Proveedor editado correctamente";
  933.             } else {
  934.                 $type 0;
  935.                 $status "Error al editar el proveedor";
  936.             }
  937.             $this->session->getFlashBag()->add('type'$type);
  938.             $this->session->getFlashBag()->add('status'$status);
  939.             return $this->redirectToRoute('proveedores');
  940.         }
  941.         return $this->render('products/proveedores/edit.html.twig', array(
  942.                     'id' => $id,
  943.                     'form' => $form->createView()
  944.         ));
  945.     }
  946.     public function proveedorAlbaranes(Request $requestPaginatorInterface $paginator) {
  947.         if (!$this->getUser() || !is_object($this->getUser())) {
  948.             return $this->redirectToRoute('logout');
  949.         }
  950.         $s = ($request->get("s") ) ? $request->get("s") : "";
  951.         $s_str "";
  952.         if ($s) {
  953.             $s_str " AND a.num_albaran LIKE '%" $s "%'";
  954.         }
  955.         $orden = ($request->get("orden")) ? $request->get("orden") : 'DESC';
  956.         $filter = ($request->get("filter")) ? $request->get("filter") : 'id';
  957.         $em $this->getDoctrine()->getManager();
  958.         $id $request->get("id");
  959.         $proveedor $em->getRepository(Proveedores::class)->find($id);
  960.         $albaranes $em->createQueryBuilder()->select("a")
  961.                 ->from("App\Entity\Albaranes""a")
  962.                 ->where("a.id_provider = " $id " " $s_str)
  963.                 ->orderBy("a." $filter$orden)
  964.                 ->getQuery()
  965.                 ->getResult();
  966.         $provs $paginator->paginate(
  967.                 $albaranes$request->query->getInt('page'1), 20);
  968.                 
  969.         $uploads $em->createQueryBuilder()->select("p")
  970.                 ->from("App\Entity\ProductUploads""p")
  971.                 ->where("p.proveedorId = " $id " " $s_str)
  972.                 ->getQuery()
  973.                 ->getResult();
  974.         return $this->render('products/proveedores/albaranes.html.twig', array(
  975.                     'id' => $id,
  976.                     'albaranes' => $provs,
  977.                     'proveedor' => $proveedor,
  978.                     "s" => $s,
  979.                     'orden' => $orden,
  980.                     'uploads' => $uploads,
  981.                         //'form'=>$form->createView()
  982.         ));
  983.     }
  984.     public function addAlbaran(Request $request) {
  985.         if (!$this->getUser() || !is_object($this->getUser())) {
  986.             return $this->redirectToRoute('logout');
  987.         }
  988.         $em $this->getDoctrine()->getManager();
  989.         $id $request->get("id");
  990.         $proveedor $em->getRepository(Proveedores::class)->find($id);
  991.         return $this->render('products/proveedores/add_albaran.html.twig', array(
  992.                     'id' => $id,
  993.                     'proveedor' => $proveedor,
  994.         ));
  995.     }
  996.     public function printLabel(Request $request) {
  997.         $em $this->getDoctrine()->getManager();
  998.         $id $request->request->get("id");
  999.         $prod $em->getRepository(Products::class)->find($id);
  1000.         $barcode = new BarcodeGenerator();
  1001.         $barcode->setText($prod->getSku());
  1002.         $barcode->setType(BarcodeGenerator::Code128);
  1003.         $barcode->setScale(2);
  1004.         $barcode->setThickness(25);
  1005.         $barcode->setFontSize(10);
  1006.         $code $barcode->generate();
  1007.         return $this->render('products/label.html.twig', array(
  1008.                     'id' => $id,
  1009.                     'prod' => $prod,
  1010.                     'code' => $code
  1011.         ));
  1012.     }
  1013.     public function addNewProductAjax(Request $request) {
  1014.         $em $this->getDoctrine()->getManager();
  1015.         $data $request->request->get("form");
  1016.         $prod = new Products();
  1017.         $prod->setCostPrice(0);
  1018.         $prod->setDateCreated(new \DateTime());
  1019.         $prod->setDescription("");
  1020.         $prod->setDateModify(new \DateTime());
  1021.         $prod->setDiscount(0);
  1022.         $prod->setDiscountFrom(null);
  1023.         $prod->setDiscountTo(null);
  1024.         $prod->setEan("");
  1025.         $prod->setGlobalStock($data[3]["value"]);
  1026.         $prod->setImage("");
  1027.         $prod->setName($data[0]["value"]);
  1028.         $prod->setParent(0);
  1029.         $prod->setPrice($data[2]["value"]);
  1030.         $prod->setSku($data[1]["value"]);
  1031.         $prod->setStatus(1);
  1032.         $prod->setStoreDiscount(0);
  1033.         $prod->setStoreStock($data[3]["value"]);
  1034.         $prod->setWebDiscount(0);
  1035.         $prod->setWpId(null);
  1036.         $prod->setWpStock(0);
  1037.         $prod->setIva(21);
  1038.         $em->persist($prod);
  1039.         $f $em->flush();
  1040.         if ($f == null) {
  1041.             return new JsonResponse(array("ok" => true"sku" => $prod->getSku()));
  1042.         } else {
  1043.             return new JsonResponse(array("ok" => false));
  1044.         }
  1045.     }
  1046.     public function getAlbaranesLine(Request $request) {
  1047.         $em $this->getDoctrine()->getManager();
  1048.         $id $request->request->get("id");
  1049.         $prod $em->getRepository(Products::class)->find($id);
  1050.         return $this->render('products/proveedores/albaranLineTable.html.twig', array(
  1051.                     'prod' => $prod,
  1052.         ));
  1053.     }
  1054.     public function UpdateAllProductsToWp(Request $request) {
  1055.         $em $this->getDoctrine()->getManager();
  1056.         $products $em->createQueryBuilder()->select("p")
  1057.                 ->from(Products::class, "p")
  1058.                 ->where("p.wpId IS NOT NULL AND p.wpId <> '' and p.sku > 3627")
  1059.                 ->getQuery()
  1060.                 ->getResult();
  1061.                 //dd($products);
  1062.             //creem tots els productes
  1063.             foreach ($products as $product) {
  1064.                 $product->setWpId(null);
  1065.                 
  1066.                 $this->api->addProductToWP($product$em);
  1067.                 //die();
  1068.                 
  1069.             }
  1070.         return new JsonResponse(array("ok" => true));
  1071.     }
  1072.     
  1073.     public function choice(Request $request) {
  1074.         
  1075.         if (!$this->getUser() || !is_object($this->getUser())) {
  1076.             return $this->redirectToRoute('logout');
  1077.         }
  1078.         $em $this->getDoctrine()->getManager();
  1079.         $id $request->get("id");
  1080.         $proveedor $em->getRepository(Proveedores::class)->find($id);
  1081.         
  1082.         return $this->render('products/proveedores/choice.html.twig', array(
  1083.                     'id' => $id,
  1084.                     'proveedor' => $proveedor,
  1085.         ));
  1086.     }
  1087.     
  1088.     public function volcar(Request $request) {
  1089.         
  1090.         if (!$this->getUser() || !is_object($this->getUser())) {
  1091.             return $this->redirectToRoute('logout');
  1092.         }
  1093.         $em $this->getDoctrine()->getManager();
  1094.         $id $request->get("id");
  1095.         $proveedor $em->getRepository(Proveedores::class)->find($id);
  1096.         
  1097.         return $this->render('products/proveedores/volcar.html.twig', array(
  1098.                     'id' => $id,
  1099.                     'proveedor' => $proveedor,
  1100.         ));
  1101.     }
  1102.     
  1103.     public function saveFiles(Request $request): response {
  1104.         
  1105.         if (!$this->getUser() || !is_object($this->getUser())) {
  1106.             return $this->redirectToRoute('logout');
  1107.         }
  1108.         $em $this->getDoctrine()->getManager();
  1109.         $id $request->get("proveedor_id");
  1110.         
  1111.         $images $request->files->get("imgs");
  1112.         $file $request->files->get("file");
  1113.         
  1114.         // UPLOAD IMAGES
  1115.         $newImagesFileName NULL;
  1116.         if ($images) {
  1117.             if ($images->guessExtension() == "zip") {
  1118.                 $originalImagesFilename pathinfo($images->getClientOriginalName(), PATHINFO_FILENAME);
  1119.                 $safeImagesFilename = \transliterator_transliterate('Any-Latin; Latin-ASCII; [^A-Za-z0-9_] remove; Lower()'$originalImagesFilename);
  1120.                 $newImagesFileName $safeImagesFilename "-product" uniqid() . "." $images->guessExtension();
  1121.                 try {
  1122.                     $images->move(
  1123.                         'assets/images/products/',
  1124.                         $newImagesFileName
  1125.                     );
  1126.                 } catch (FileException $e) {
  1127.                     var_dump($e);
  1128.                     die();
  1129.                 }
  1130.             } else {
  1131.                 $type 0;
  1132.                 $status "Formato de imágenes incorrecto. Asegúrese de subir un archivo comprimido .zip";
  1133.                 $this->session->getFlashBag()->add('type'$type);
  1134.                 $this->session->getFlashBag()->add('status'$status);
  1135.                 return $this->redirectToRoute('proveedor_volcar', [ 'id' => $id ]);
  1136.             }
  1137.         }
  1138.         
  1139.         //UPLOAD FILE
  1140.         $extension "";
  1141.         if ($file != null) { $extension '.'.$file->getClientOriginalExtension();}
  1142.         if ($file && $extension == ".csv") {
  1143.             
  1144.             $originalFilename pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME);
  1145.             $safeFilename = \transliterator_transliterate('Any-Latin; Latin-ASCII; [^A-Za-z0-9_] remove; Lower()'$originalFilename);
  1146.             $newFileName $safeFilename "-product" uniqid() . $extension;
  1147.             
  1148.             try {
  1149.                 $file->move(
  1150.                     'assets/files/products/',
  1151.                     $newFileName
  1152.                 );
  1153.             } catch (FileException $e) {
  1154.                 var_dump($e);
  1155.                 die();
  1156.             }
  1157.             
  1158.         } else {
  1159.             
  1160.             $type 0;
  1161.             $status "Archivo .csv no seleccionado o formato incorrecto";
  1162.             
  1163.             $this->session->getFlashBag()->add('type'$type);
  1164.             $this->session->getFlashBag()->add('status'$status);
  1165.             
  1166.             return $this->redirectToRoute('proveedor_volcar', [ 'id' => $id ]);
  1167.             
  1168.         } 
  1169.         
  1170.         $productUploads = new ProductUploads();
  1171.         
  1172.         $productUploads->setProveedorId($request->get("proveedor_id"));
  1173.         $productUploads->setFile($newFileName);
  1174.         if ($newImagesFileName != NULL) {
  1175.         $productUploads->setImages($newImagesFileName);
  1176.         } else {
  1177.             $productUploads->setImages("null");
  1178.         }
  1179.         
  1180.         $em->persist($productUploads);
  1181.         $em->flush();
  1182.         
  1183.         $prodUploadsId $productUploads->getId();
  1184.         
  1185.         return $this->redirectToRoute('proveedor_selectRows', [ 'id' => $prodUploadsId ]);
  1186.     }
  1187.     
  1188.     public function selectRows(Request $request){
  1189.         
  1190.         if (!$this->getUser() || !is_object($this->getUser())) {
  1191.             return $this->redirectToRoute('logout');
  1192.         }
  1193.         
  1194.         $em $this->getDoctrine()->getManager();
  1195.         $id $request->get("id");
  1196.         $prodUploads $em->getRepository(ProductUploads::class)->find($id);
  1197.         $proveedorId $prodUploads->getProveedorId();
  1198.         $proveedor $em->getRepository(Proveedores::class)->find($proveedorId);
  1199.         
  1200.         $order $em->createQueryBuilder()->select("o.rowsOrder")
  1201.                 ->from(ProveedorOrder::class, "o")
  1202.                 ->where("o.proveedorId = '$proveedorId'")
  1203.                 ->orderBy("o.id""DESC"// Ordena por ID en orden descendente
  1204.                 ->setMaxResults(1)
  1205.                 ->getQuery()
  1206.                 ->getOneOrNullResult();
  1207.         
  1208.         $arrayOrder = (array) null;
  1209.         if ($order) {
  1210.             
  1211.             $arrayOrder json_decode($order['rowsOrder']);
  1212.           
  1213.         }
  1214.         
  1215.         
  1216.         $file $prodUploads->getFile();
  1217.         $filePath 'assets/files/products/' $file;
  1218.         
  1219.         // CSV Decoder
  1220.         $csvEncoder = new CsvEncoder();
  1221.         $values $csvEncoder->decode(file_get_contents($filePath), 'csv',[CsvEncoder::DELIMITER_KEY => ';']);
  1222.         //dd(count($values[0]));
  1223.         if (count($values[0]) == 1) {
  1224.             $values $csvEncoder->decode(file_get_contents($filePath), 'csv',[CsvEncoder::DELIMITER_KEY => ',']);
  1225.         }
  1226.         
  1227.         // Save only array keys (first colum)
  1228.         $columnNames array_keys($values[0]);
  1229.         
  1230.         return $this->render('products/proveedores/selectRows.html.twig', array(
  1231.             'rows' => $columnNames,
  1232.             'proveedor' => $proveedor,
  1233.             'prod_uploads_id' => $id,
  1234.             'order' => $arrayOrder,
  1235.         ));
  1236.     }
  1237.     
  1238.     public function saveOrder(Request $request) {
  1239.         
  1240.         if (!$this->getUser() || !is_object($this->getUser())) {
  1241.             return $this->redirectToRoute('logout');
  1242.         }
  1243.         
  1244.         $em $this->getDoctrine()->getManager();
  1245.         $proveedorId $request->get("proveedor_id");
  1246.         $prodUploadsId $request->get("prod_uploads_id");
  1247.         $rows $request->get("product");
  1248.         
  1249.         //Si mantenen el valor per defecte del formulari ho cambia a null
  1250.         for ($i 0$i <= 21$i++) {
  1251.             if ($rows[$i] == "Seleccionar columna") {
  1252.                 $rows[$i] = "null";
  1253.             }
  1254.         }
  1255.         
  1256.         $stringRows json_encode($rows);
  1257.         
  1258.         $proveedorOrder = new ProveedorOrder();
  1259.         $proveedorOrder->setProveedorId($proveedorId);
  1260.         $proveedorOrder->setRowsOrder($stringRows);
  1261.         $proveedorOrder->setProductUploadId($prodUploadsId);
  1262.         $em->persist($proveedorOrder);
  1263.         $em->flush();
  1264.         
  1265.         //MUNTAR PRODUCTES
  1266.         
  1267.         //CARREGAR EL FILE I IMAGES
  1268.         $prodUploads $em->getRepository(ProductUploads::class)->find($prodUploadsId);
  1269.         $file $prodUploads->getFile();
  1270.         $images $prodUploads->getImages();
  1271.         
  1272.         $filePath 'assets/files/products/' $file;
  1273.         $imagePath 'assets/images/products/' $images;
  1274.         $savePath 'assets/images/products/';
  1275.         
  1276.         // CSV Decoder
  1277.         $csvEncoder = new CsvEncoder();
  1278.         $values $csvEncoder->decode(file_get_contents($filePath), 'csv',[CsvEncoder::DELIMITER_KEY => ';']); //posar el ';'
  1279.         if (count($values[0]) == 1) {
  1280.             $values $csvEncoder->decode(file_get_contents($filePath), 'csv',[CsvEncoder::DELIMITER_KEY => ',']);
  1281.         }
  1282.         //DESCOMPRIMIR LES IMATGES I BORRAR EL ZIP
  1283.         
  1284.         $zip = new \ZipArchive();
  1285.         if ($zip->open($imagePath) === TRUE) {
  1286.             $zip->extractTo($savePath);
  1287.             $zip->close();
  1288.         }
  1289.         
  1290.         foreach ($values as $key => $value) {
  1291.                 
  1292.             //$orderedValue = array_merge(array_flip($rows), $value);
  1293.             $index = [];
  1294.             foreach ($rows as $clave) {
  1295.                 $index[] = isset($value[$clave]) ? $value[$clave] : null;
  1296.             }
  1297.             $sku = array("sku" => "$index[2]");
  1298.             $product $em->getRepository(Products::class)->findOneBy($sku);
  1299.             
  1300.             if (isset($index[0]) && $index[0] !== "") {
  1301.                 
  1302.                 if (!isset($product) && $product == "") {
  1303.                     $product = new Products();
  1304.                     $product->setDateCreated(new \DateTime());
  1305.                 }
  1306.                 //convert parent id into int
  1307.                 $parentIdInt = (int)$index[7];
  1308.                 //Setters
  1309.                 $product->setName(($index[0])?$index[0] : '');
  1310.                 $product->setEan(($index[1])?$index[1] : '');
  1311.                 if ($index[2] != null || $index[2] != "") {
  1312.                     $product->setSku($index[2]);
  1313.                 } else {
  1314.                     //Generate sku
  1315.                     $genSkuJson $this->generateAutoSku();
  1316.                     $content $genSkuJson->getContent();
  1317.                     $data json_decode($contenttrue);
  1318.                     if ($sku["sku"] == null || $sku["sku"] == "") {
  1319.                         $product->setSku($data["sku"]);
  1320.                         } else {
  1321.                             $product->setSku($index[2]);
  1322.                     }
  1323.                 }
  1324.                 $product->setDescription(($index[3])?$index[3] : '');
  1325.                 $product->setPrice(($index[4])?floatval(str_replace(",",".",$index[4])) : 0);
  1326.                 $product->setIva(($index[5])?floatval($index[5]) : 0);
  1327.                 //$product->setDateCreated(new \DateTime());
  1328.                 $product->setParent((isset($parentIdInt) ? $parentIdInt 0));
  1329.                 //wpId = $index[8]
  1330.                 $images explode(",",$index[9]);
  1331.                 if($images){
  1332.                     $product->setImage($images[0]);
  1333.                 }
  1334.                 $product->setCostPrice((isset($index[10]) ? floatval($index[10]) : 0));
  1335.                 $product->setDateModify(new \DateTime());
  1336.                 //globalStock = $index[12]
  1337.                 $product->setWpStock((isset($index[13]) ? floatval($index[13]) : 0));
  1338.                 $product->setStoreStock((isset($index[14]) ? floatval($index[14]) : 0));
  1339.                 ////discount = $index[15]
  1340.                 if ($index[16] != "") {
  1341.                     $disc_from = \DateTime::createFromFormat('d/m/Y'$index[16]);
  1342.                     $product->setDiscountFrom($disc_from);
  1343.                 } else {
  1344.                     $product->setDiscountFrom(null);
  1345.                 }
  1346.                 if ($index[17] != "") {
  1347.                     $disc_to = \DateTime::createFromFormat('d/m/Y'$index[17]);
  1348.                     $product->setDiscountTo($disc_to);
  1349.                 } else {
  1350.                     $product->setDiscountTo(null);
  1351.                 }
  1352.                 $product->setStoreDiscount(($index[18] != "") ? $index[18] : );
  1353.                 $product->setWebDiscount(($index[19] != "") ? $index[19] : 0);
  1354.                 //$product->setGlobalStock(floatval($index[14]) + floatval($index[13]));
  1355.                 $product->setGlobalStock((isset($index[14]) ? floatval($index[14]) : 0));
  1356.                 $product->setStatus(1);
  1357.                 $em->persist($product);
  1358.                 $f $em->flush();
  1359.             }
  1360.         }
  1361.         
  1362.         if ($f == null) {
  1363.             $type 1;
  1364.             $status "Albaran subido correctamente";
  1365.         } else {
  1366.             $type 0;
  1367.             $status "Error al guardar el Albaran";
  1368.         }
  1369.         $this->session->getFlashBag()->add('type'$type);
  1370.         $this->session->getFlashBag()->add('status'$status);
  1371.         
  1372.         return $this->redirectToRoute('proveedor_albaranes', [ 'id' => $proveedorId ]);
  1373.     }
  1374.     public function syncStocksWeb(Request $request){
  1375.         $em $this->getDoctrine()->getManager();
  1376.         if($request->get("page")){
  1377.             $paged 20 * (intval($request->get("page"))-1);
  1378.         }else{
  1379.             $paged 0;
  1380.         }
  1381.         
  1382.         $products $em->createQueryBuilder()->select("p")
  1383.                 ->from(Products::class, "p")
  1384.                 ->where("p.wpId <> 'NULL'")
  1385.                 ->orderBy("p.id""DESC"// Ordena por ID en orden descendente
  1386.                 ->setFirstResult($paged)
  1387.                 ->setMaxResults(20)
  1388.                 ->getQuery()
  1389.                 ->getResult();
  1390.         //dd(count($products));
  1391.         $wc = new WCController();
  1392.         foreach($products as $prod){
  1393.             $wc->updateProductToWP($prod$em);
  1394.         }
  1395.         
  1396.         dd($products);
  1397.     }
  1398.     
  1399.     public function exportProductsStocks(Request $request){
  1400.         $entityManager $this->getDoctrine()->getManager();
  1401.         
  1402.         $products $entityManager->getRepository(Products::class)->findAll();
  1403.         
  1404.         $response = new StreamedResponse(function() use ($products) {
  1405.             $output fopen('php://output''w');
  1406.             
  1407.             // Write headers
  1408.             fputcsv($output, [
  1409.                 'ID''Name''EAN''SKU''Description''Price''IVA''Date Created',
  1410.                 'Parent''WP ID''Image''Cost Price''Date Modified''Global Stock',
  1411.                 'Store Stock''Discount''Discount From''Discount To',
  1412.                 'Store Discount''Web Discount''Status''Gallery'
  1413.             ],";");
  1414.             
  1415.             // Write data
  1416.             foreach ($products as $product) {
  1417.                 fputcsv($output, [
  1418.                     $product->getId(),
  1419.                     $product->getName(),
  1420.                     $product->getEan(),
  1421.                     $product->getSku(),
  1422.                     $product->getDescription(),
  1423.                     number_format($product->getPrice(),2,",",""),
  1424.                     $product->getIva(),
  1425.                     $product->getDateCreated()->format('Y-m-d H:i:s'),
  1426.                     $product->getParent(),
  1427.                     $product->getWpId(),
  1428.                     $product->getImage(),
  1429.                     $product->getCostPrice(),
  1430.                     $product->getDateModify()->format('Y-m-d H:i:s'),
  1431.                     $product->getGlobalStock(),
  1432.                     
  1433.                     $product->getStoreStock(),
  1434.                     $product->getDiscount(),
  1435.                     $product->getDiscountFrom() ? $product->getDiscountFrom()->format('Y-m-d H:i:s') : '',
  1436.                     $product->getDiscountTo() ? $product->getDiscountTo()->format('Y-m-d H:i:s') : '',
  1437.                     $product->getStoreDiscount(),
  1438.                     $product->getWebDiscount(),
  1439.                     $product->getStatus(),
  1440.                     $product->getGallery()
  1441.                 ],";");
  1442.             }
  1443.             
  1444.             fclose($output);
  1445.         });
  1446.         
  1447.         $response->headers->set('Content-Type''text/csv; charset=utf-8');
  1448.         $response->headers->set('Content-Disposition''attachment; filename="products_export.csv"');
  1449.         
  1450.         return $response;
  1451.     }
  1452. }