src/Controller/StanMagController.php line 1105

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Controller\DefaultValuesController;
  4. use App\Entity\AllegroCategory;
  5. use App\Entity\AllegroOffer;
  6. use App\Entity\AllegroShippingRate;
  7. use App\Entity\StanMag;
  8. use App\Entity\StanMagAllegroParams;
  9. use App\Entity\SystemConfig;
  10. use App\Form\StanMagType;
  11. use App\Integration\Marketplace\Allegro\AllegroRestApi;
  12. use Doctrine\ORM\Query\ResultSetMapping;
  13. use Doctrine\Persistence\ManagerRegistry;
  14. use Doctrine\ORM\EntityManager;
  15. use Doctrine\ORM\QueryBuilder;
  16. use Psr\Log\LoggerInterface;
  17. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  18. use Symfony\Component\HttpFoundation\JsonResponse;
  19. use Symfony\Component\HttpFoundation\Request;
  20. use Symfony\Component\HttpFoundation\Response;
  21. use Symfony\Component\Routing\Annotation\Route;
  22. use Symfony\Contracts\Translation\TranslatorInterface;
  23. /**
  24.  * @Route("/stanmag")
  25.  */
  26. class StanMagController extends AbstractController
  27. {
  28.     private LoggerInterface $logger;
  29.     private TranslatorInterface $translator;
  30.     public function __construct(TranslatorInterface $translator, LoggerInterface $logger)
  31.     {
  32.         $this->translator = $translator;
  33.         $this->logger = $logger;
  34.         $this->logger->debug($this->logPrefix(__METHOD__).' ');
  35.     }
  36.     public static function getName($translator)
  37.     {
  38.         return $translator->trans("StanMag");
  39.     }
  40.     public static function getAdminName()
  41.     {
  42.         return "stanmag";
  43.     }
  44.     /**
  45.      * @Route("/", name="app_stanmag_index", methods={"GET"})
  46.      * @param ManagerRegistry $managerRegistry
  47.      * @return Response
  48.      */
  49.     public function indexServer(ManagerRegistry $managerRegistry): Response
  50.     {
  51.         /** @var EntityManager $dm */
  52.         $dm =  $managerRegistry->getManager();
  53.         $items = null;
  54.         return $this->render('app/stanMag/index.html.twig', [
  55.             'items' => $items,
  56.             'breadcrumbTitle' => DefaultValuesController::getBreadcrumbTitle(),
  57.             'categoryTitle' => self::getName($this->translator),
  58.             'adminMenu' => self::getAdminName(),
  59.         ]);
  60.     }
  61.     /**
  62.      * @Route("/{id}/details", name="app_stanmag_show", methods={"GET"})
  63.      * @param string $id
  64.      * @param ManagerRegistry $managerRegistry
  65.      * @return Response
  66.      */
  67.     public function show(string $id, ManagerRegistry $managerRegistry): Response
  68.     {
  69.         /** @var EntityManager $dm */
  70.         $dm =  $managerRegistry->getManager();
  71.         /** @var StanMag $item */
  72.         $id = preg_replace("/-/","/",$id);
  73.         $item = $dm->getRepository(StanMag::class)->findOneBy(['nrEtykiety'=> $id]);
  74.         $images = [];
  75.         if ($item) {
  76.             $images = $dm->getRepository(StanMag::class)->getStanMagSisdPhotos($item);
  77.         }
  78.         $eligible = $this->isEligibleForAllegro($id, $managerRegistry);
  79.         return $this->render('app/stanMag/show.html.twig', [
  80.             'item' => $item,
  81.             'images' => $images,
  82.             'eligible' => $eligible,
  83.             'path' => [],
  84.             'children' => [],
  85.             'breadcrumbTitle' => DefaultValuesController::getBreadcrumbTitle(),
  86.             'categoryTitle' => self::getName($this->translator),
  87.             'adminMenu' => self::getAdminName(),
  88.         ]);
  89.     }
  90.     // -- with AGG PIPELINE -------
  91.     /**
  92.      * @Route("/find", name="app_stanmag_find", methods={"GET"})
  93.      * @param Request $request
  94.      * @param ManagerRegistry $managerRegistry
  95.      * @return Response
  96.      */
  97.     public function findJson(Request $request, ManagerRegistry $managerRegistry): Response
  98.     {
  99.         /** @var EntityManager $dm */
  100.         $dm =  $managerRegistry->getManager();
  101.         $alias = "s";
  102.         $prefix = $alias.'.';
  103.         $columns = $request->query->get('columns',null);
  104.         $draw = $request->query->getInt('draw',0);
  105.         $start = $request->query->getInt('start',0);
  106.         $length = $request->query->getInt('length',50);
  107.         $order = $request->query->get('order',null);
  108.         $orderBy = null;$orderDir = null;
  109.         if ($order) {
  110.             $orderColumnId = $order[0]['column'];
  111.             $orderDirection = $order[0]['dir'];
  112.             $orderBy = ($columns && isset($columns[$orderColumnId]['name'])) ? $prefix.$columns[$orderColumnId]['name'] : null;
  113.             $orderDir = ($orderDirection && $orderDirection == 'asc') ? 'ASC' : 'DESC';
  114.         }
  115.         $searchValue = "";
  116.         $searchField = $prefix.'nazwa';
  117.         $search = $request->query->all('search');
  118.         if ($search) {
  119.             $searchValue = trim($search['value']);
  120.             if ((int)$searchValue > 0) {
  121.                 $searchField = $prefix.'nrEtykiety';
  122.             }
  123.         }
  124.         $countTotal = $dm->getRepository(StanMag::class)->count([]);
  125.         $criteria = [
  126.         ];
  127. //        $rsm = new ResultSetMapping();
  128. //        $rsm->addEntityResult('StanMag', 's');
  129.         $queryFiltered = $dm->createQueryBuilder();
  130.         $queryFilteredCount = $dm->createQueryBuilder();
  131.         //$queryFiltered = $dm->createNativeQuery("select * from StanMag s where nrEtykiety like '%".$searchValue."%'", $rsm);
  132.         $fields = [];
  133.         $fields[] = $alias."."."nrEtykiety";
  134.         $fields[] = $alias."."."kodLokalizacji";
  135.         $fields[] = $alias."."."nazwa";
  136.         $fields[] = $alias."."."opisTowaru";
  137.         $fields[] = $alias."."."ilosc";
  138.         $fields[] = $alias."."."cena";
  139.         $fields[] = $alias."."."usun";
  140.         //implode(", ",$fields)
  141.         // Get Total Filtered Count of records based on search criteria
  142.         $queryFiltered
  143.             ->select('s','m','st')
  144.             //->select(implode(",",$fields),'m','st')
  145. //            ->select(" ".implode(",",$fields))
  146. //            ->addSelect('m')
  147. //            ->addSelect('st')
  148.             ->from(StanMag::class, $alias)
  149.             ->leftJoin($alias.'.model', 'm')
  150.             ->leftJoin($alias.'.stanMagStatus', 'st');
  151.         $queryFiltered->where('1=1');
  152.         $queryFilteredCount->select('count(s.nrEtykiety)')->from(StanMag::class, $alias)->where('1=1');
  153.         if(strlen($searchValue) > 0) {
  154.             if ($searchField == 'nrEtykiety') {
  155.                 $queryFiltered->andWhere(
  156. //                    $searchField." like '".$searchValue."%'"
  157.                     $queryFiltered->expr()->like('lower('.$searchField.')', "'".strtolower($searchValue)."%'")
  158.                 );
  159.                 $queryFilteredCount->andWhere(
  160. //                    $searchField." like '".$searchValue."%'"
  161.                     $queryFilteredCount->expr()->like('lower('.$searchField.')', "'".strtolower($searchValue)."%'")
  162.                     //$queryFilteredCount->expr()->like($searchField, "'".$searchValue."%'")
  163.                 );
  164.                 //$queryFiltered->field($searchField)->equals(new \MongoDB\BSON\Regex('^'.$searchValue.''));
  165.             } else {
  166.                 $queryFiltered->andWhere(
  167. //                    $queryFiltered->expr()->like($searchField, "'%".$searchValue."%'")
  168.                     $queryFiltered->expr()->like('lower('.$searchField.')', "'%".strtolower($searchValue)."%'")
  169. //                    $searchField." like '%".$searchValue."%'"
  170.                 );
  171.                 $queryFilteredCount->andWhere(
  172.                     $queryFilteredCount->expr()->like('lower('.$searchField.')', "'%".strtolower($searchValue)."%'")
  173.                     //$queryFilteredCount->expr()->like($searchField, "'%".$searchValue."%'")
  174. //                    $searchField." like '%".$searchValue."%'"
  175.                 );
  176.             }
  177.         }
  178.         $countFiltered = $queryFilteredCount->getQuery()->getSingleScalarResult();
  179.         //$items = $queryFiltered->getQuery()->getSQL();
  180.         //var_dump($items);die();
  181.         //$query = $queryFiltered;
  182.         //$res = $queryFiltered->getQuery()->select('count(s.nrEtykiety)')->getArrayResult();
  183.         //$countFiltered = (isset($res)) ? count($res) : 0;
  184.         if ($orderBy && $orderDir)    $queryFiltered->orderBy($orderBy,$orderDir);
  185.         $items = $queryFiltered->getQuery()
  186.             ->setFirstResult($start)
  187.             ->setMaxResults($length)
  188.             ->getArrayResult();
  189.         //$items = $items->getArrayResult();
  190.         //print_r($items);die();
  191.         if (!is_array($items)) $items = [];
  192.         $output = [
  193.             'draw' => $draw,
  194.             'search' => $search,
  195.             'order' => $order,
  196.             'recordsTotal' => $countTotal,
  197.             'recordsFiltered' => $countFiltered,
  198.             'data' => $items
  199.         ];
  200.         $output = $this->container->get('serializer')->serialize($output,'json');
  201.         return new JsonResponse($output,200,[],true);
  202.     }
  203.     // -- with AGG PIPELINE END -------
  204.     /**
  205.      * @Route("/{id}/edit", name="app_stanmag_edit", methods={"GET","POST"})
  206.      */
  207.     public function edit(Request $request, string $id, ManagerRegistry $managerRegistry): Response
  208.     {
  209.         /** @var EntityManager $dm */
  210.         $dm =  $managerRegistry->getManager();
  211.         $id = preg_replace("/-/","/",$id);
  212.         $item = $dm->getRepository(StanMag::class)->findOneBy(['nrEtykiety'=> $id]);
  213.         $form = $this->createForm(StanMagType::class, $item);
  214.         $form->handleRequest($request);
  215.         if ($form->isSubmitted() && $form->isValid()) {
  216.             $dm->flush();
  217.             return $this->redirectToRoute('app_stanmag_show', ['id' => $item->getSlug() ]);
  218.         }
  219.         return $this->render('app/stanMag/edit.html.twig', [
  220.             'item' => $item,
  221.             'breadcrumbTitle' => DefaultValuesController::getBreadcrumbTitle(),
  222.             'categoryTitle' => self::getName($this->translator),
  223.             'form' => $form->createView(),
  224.             'adminMenu' => self::getAdminName(),
  225.         ]);
  226.     }
  227.     /**
  228.      * @Route("/new", name="app_stanmag_new", methods={"GET","POST"})
  229.      */
  230.     public function new(Request $request, ManagerRegistry $managerRegistry): Response
  231.     {
  232.         /** @var EntityManager $dm */
  233.         $dm =  $managerRegistry->getManager();
  234.         $item = new StanMag();
  235.         $form = $this->createForm(StanMagType::class, $item);
  236.         $form->handleRequest($request);
  237.         if ($form->isSubmitted() && $form->isValid()) {
  238.             $dm->persist($item);
  239.             $dm->flush();
  240.             return $this->redirectToRoute('app_stanmag_index');
  241.         }
  242.         return $this->render('app/stanMag/new.html.twig', [
  243.             'item' => $item,
  244.             'breadcrumbTitle' => DefaultValuesController::getBreadcrumbTitle(),
  245.             'categoryTitle' => self::getName($this->translator),
  246.             'form' => $form->createView(),
  247.             'adminMenu' => self::getAdminName(),
  248.         ]);
  249.     }
  250.     /**
  251.      * @Route("/{id}/allegro-publish/{productId}", name="app_stanmag_allegro_publish", methods={"GET"})
  252.      */
  253.     public function publishOnAllegroFindProduct(Request $request, ManagerRegistry $managerRegistry, string $id, string $productId = ''): Response
  254.     {
  255.         /** @var EntityManager $em */
  256.         $em =  $managerRegistry->getManager();
  257.         $id = preg_replace("/-/","/",$id);
  258.         //$productId = preg_replace("/-/","/",$id);
  259.         /** @var StanMag $item */
  260.         $item = $em->getRepository(StanMag::class)->findOneBy(['nrEtykiety'=> $id]);
  261.         if (null === $item) {
  262.             return $this->redirectToRoute('app_stanmag_index');
  263.         }
  264.         $eligible = $this->isEligibleForAllegro($id, $managerRegistry);
  265.         if ($eligible['status'] == 0) {
  266.             // return error message;
  267.             return $this->redirectToRoute('app_stanmag_show', ['id' => $item->getSlug() ]);
  268.         }
  269.         $source = ($item->getKodLokalizacji() == 12) ? "waw" : "gru";
  270.         if ($item->getKodLokalizacji() == 99) $source = "aga";
  271.         $allegroClientId = $em->getRepository(SystemConfig::class)->getParameter('allegroClientId','allegro');
  272.         $allegroClientSecret = $em->getRepository(SystemConfig::class)->getParameter('allegroClientSecret','allegro');
  273.         $allegroAccessToken = $em->getRepository(SystemConfig::class)->getParameter('allegroAccessToken.'.$source,'allegro');
  274.         $api = new AllegroRestApi();
  275.         $api->setAccessToken($allegroAccessToken)
  276.             ->setClientId($allegroClientId)
  277.             ->setClientSecret($allegroClientSecret);
  278.         // if product ID provided
  279.         // if strlet productId == 0 - find the product form
  280.         // if productID == 0 - nno product, propose a product and present the form
  281.         // else - pull the product info from Allegro and present the form
  282.         $categoryId = 0;
  283.         if ($item->getCatalog() && $item->getCatalog()->getCatalogMapping()->getAllegroCategory()) {
  284.             $categoryId = $item->getCatalog()->getCatalogMapping()->getAllegroCategory()->getId();
  285.         }
  286.         // pull previously saved parameters from StanMagAllegroParams table
  287.         $prev = $em->getRepository(StanMag::class)->getAllegroParams($item);
  288.         if (strlen($productId) > 0) {
  289.             if($productId == '0') {
  290.                 // raise form with no product
  291.                 $product = null;
  292.             } else {
  293.                 $product = $api->getProduct($productId);
  294.                 if (!isset($product['id']) || !isset($product['parameters'])) {
  295.                     // unable to pull  the product through from Allegro
  296.                     $product = null;
  297.                     // unable to find the product, redirect back to product selection
  298.                     return $this->redirectToRoute('app_stanmag_allegro_publish', ['id' => $item->getSlug() ]);
  299.                 }
  300.                 if (isset($product['category']['id'])) {
  301.                     $categoryId = $product['category']['id'];
  302.                 }
  303.             }
  304.             $categoryParams = $api->getParamsForCategory($categoryId);
  305.             // pre-populate parameters for the product based on the priority:
  306.             // global default parameters
  307.             // catalog parameters
  308.             // product parameters
  309.             //$titleDefault = substr(htmlspecialchars($item->getModel()->getMake()->getName()." ".$item->getModel()->getMake()." ".$item->getCatalog()->getKeywords()), 0, 75);
  310.             //$titleDefault = substr(htmlspecialchars($item->getModel()->getFullName()." ".$item->getCatalog()->getKeywords()), 0, 75);
  311.             $titleDefault = substr(htmlspecialchars($item->getModel()->getFullName()." ".$item->getName()), 0, 75)."";
  312. //            $keywords = (null !== $item->getCatalog() && strlen($item->getCatalog()->getKeywords()) > 0 ) ? $item->getCatalog()->getKeywords()." " : $item->getName();
  313. //            $defaultTitle = substr(htmlspecialchars($item->getModel()." "." ".$keywords), 0, 75);
  314. //            $titleDefault = (strlen($item->getTytulAukcji()) > 0) ? $item->getTytulAukcji() : $defaultTitle;
  315.             $title = (strlen($item->getTytulAukcji()) > 0) ? $item->getTytulAukcji() : $titleDefault;
  316.             $defaults = [
  317.                 'global' => [
  318.                     'Producent części' => $em->getRepository(SystemConfig::class)->getParameter('allegroDefaultProducent','allegro'),
  319.                     'Typ samochodu' => $em->getRepository(SystemConfig::class)->getParameter('allegroDefaultTypSamochodu','allegro'),
  320.                     'Stan' => $em->getRepository(SystemConfig::class)->getParameter('allegroDefaultStan','allegro'),
  321.                     'Wersja' => $em->getRepository(SystemConfig::class)->getParameter('allegroDefaultWersja','allegro'),
  322.                     'Produkt wprowadzony do obrotu na terenie UE przed 13.12.2024' => $em->getRepository(SystemConfig::class)->getParameter('allegroDefaultObrotUE','allegro'),
  323.                     'Jakość części (zgodnie z GVO)' => $em->getRepository(SystemConfig::class)->getParameter('allegroDefaultJakoscGVO','allegro'),
  324.                 ]
  325.             ];
  326.             $defaults['prev'] = $prev;
  327.             $defaults['title'] = trim($title);
  328.             $defaults['description'] = '';
  329.             // get default shipping rate
  330.             $defaultConfig = $em->getRepository(SystemConfig::class)->getParameter('allegroDefaults.'.$source,'allegro', true);
  331.             if (isset($defaultConfig['shipping'])) {
  332.                 $defaults['delivery']['shippingRate'] = ''.$defaultConfig['shipping'];
  333.             }
  334.             $rateId = $item->getCatalog()->getCatalogMapping()->getAllegroShippingRate($source);
  335.             if (null !== $rateId && strlen($rateId) > 0) {
  336.                 $defaults['delivery']['shippingRate'] = $rateId;
  337.             } else {
  338.                 //$error = true; $errorMessage[] = "Unable to find  shipping rate";
  339.             }
  340.             // using previous shipping rate
  341.             if (isset($prev['shippingRate']) && strlen($prev['shippingRate']) > 0) {
  342.                 $defaults['delivery']['shippingRate'] = $prev['shippingRate'];
  343.             }
  344.             // get shipping rates for the localisation
  345.             $shippingRates  = $em->getRepository(AllegroShippingRate::class)->findBy(['source' => $source],['name' =>'ASC']);
  346.             /** @var AllegroShippingRate $_rate */
  347.             foreach ($shippingRates as $_rate) {
  348.                 $defaults['delivery']['shippingRates'][ $_rate->getId() ] = $_rate->getName();
  349.             }
  350.             $catalogDefaults = $item->getCatalog()->getCatalogMapping()->getAllegroDefaultValues();
  351.             if (count($catalogDefaults)> 0) {
  352.                 foreach ($catalogDefaults as $_id => $_catalogDefault) {
  353.                     if ($_catalogDefault != '') {
  354.                         $defaults[$_id]['value'] = $_catalogDefault;
  355.                         $defaults[$_id]['source'] = 'catalog';
  356.                     }
  357.                 }
  358.             }
  359.             if (is_array($categoryParams)) {
  360.                 foreach($categoryParams as $categoryParam) {
  361.                     $id = $categoryParam['id'];
  362.                     if ($categoryParam['name'] == 'Numer katalogowy części' ) {
  363.                         $nrOEM = $item->getNrOem();
  364.                         if (strlen($nrOEM) < 1) $nrOEM = 'AK-'.$item->getSlug();
  365.                         $defaults[$id]['value'] = $nrOEM;
  366.                         $defaults[$id]['source'] = 'generic-oem';
  367.                     }
  368.                     // found global default value by name; values in global defaults are text so additional checks need to be done by name, not ID
  369.                     if (isset($defaults['global'][ $categoryParam['name'] ])) {
  370.                         $defaults[$id]['value'] = $defaults['global'][ $categoryParam['name'] ];
  371.                         $defaults[$id]['source'] = 'global';
  372.                         if ($categoryParam['name'] == 'Producent części' && $categoryParam['type'] == 'dictionary') {
  373.                             foreach($categoryParam['dictionary'] as $dictionary) {
  374.                                 if (strtolower($dictionary['value']) == strtolower($item->getModel()->getMake()->getName())) {
  375.                                     $defaults[$id]['value'] = $dictionary['value'];
  376.                                     $defaults[$id]['source'] = 'make';
  377.                                 } else if (strtolower($dictionary['value']) == strtolower($item->getModel()->getMake()->getName())." oe") {
  378.                                     $defaults[$id]['value'] = $dictionary['value'];
  379.                                     $defaults[$id]['source'] = 'make';
  380.                                 }
  381.                             }
  382.                         }
  383.                     }
  384.                     // we have catalog defaults
  385.                     if(isset($catalogDefault[ $id ])) {
  386.                         $defaults[$id]['value'] = $catalogDefault;
  387.                         $defaults[$id]['source'] = 'catalog';
  388.                     }
  389.                     if (isset($product['parameters'])) {
  390.                         foreach($product['parameters'] as $productParameter) {
  391.                             if ($productParameter['id'] == $id) {
  392.                                 if (isset($productParameter['valuesIds'][0])) {
  393.                                     $defaults[$id]['value'] =  $productParameter['valuesIds'][0];
  394.                                 } elseif (isset($productParameter['values'][0])) {
  395.                                     $defaults[$id]['value'] =  $productParameter['values'][0];
  396.                                 }
  397.                                 $defaults[$id]['source'] = 'product';
  398.                             }
  399.                         }
  400.                     }
  401.                 }
  402.             } else {
  403.                 die("Error: no params for category $categoryId");
  404.             }
  405.             if (count($prev)> 0) {
  406.                 foreach ($prev as $_default) {
  407.                     if(isset($_default['id'])) {
  408.                         if (is_array($_default['valuesIds'])) {
  409.                             $_defaultValue = $_default['valuesIds'][0];
  410.                         } elseif (is_array($_default['values'])) {
  411.                             $_defaultValue = $_default['values'][0];
  412.                         } else {
  413.                             $_defaultValue = null;
  414.                         }
  415.                         if(null !== $_defaultValue) {
  416.                             $defaults[$_default['id']]['value'] = $_defaultValue;
  417.                             $defaults[$_default['id']]['source'] = 'previous';
  418.                         }
  419.                     }
  420.                 }
  421.             }
  422. //
  423. //            if (count($catalogDefaults)> 0) {
  424. //                foreach ($catalogDefaults as $id => $catalogDefault) {
  425. //                    if ($catalogDefault != '') {
  426. //                        $defaults[$id]['value'] = $catalogDefault;
  427. //                        $defaults[$id]['source'] = 'catalog';
  428. //                    }
  429. //                }
  430. //            }
  431.             return $this->render('app/stanMag/allegro-publish-form.html.twig', [
  432.                 'item' => $item,
  433.                 'breadcrumbTitle' => DefaultValuesController::getBreadcrumbTitle(),
  434.                 'categoryTitle' => self::getName($this->translator),
  435.                 'adminMenu' => self::getAdminName(),
  436.                 'product' => $product,
  437.                 'defaults' => $defaults,
  438.                 'productId' => $productId,
  439.                 'categoryId' => $categoryId,
  440.                 'raw' => [
  441.                     'id' => $id,
  442.                     'categoryParams' => $categoryParams,
  443. //                'products' => $products,
  444. //                'params' => $params,
  445.                 ],
  446.             ]);
  447.         } else {
  448.             // find product
  449.             $keywords = (null !== $item->getCatalog() && strlen($item->getCatalog()->getKeywords()) > 0 ) ? $item->getCatalog()->getKeywords()." " : $item->getName();
  450.             $defaultTitle = substr(htmlspecialchars($item->getModel()." "." ".$keywords), 0, 75);
  451.             //$defaultTitle = substr(htmlspecialchars($item->getModel()->getFullName()." ".$item->getName()), 0, 75)." ***";
  452.             $title = (strlen($item->getTytulAukcji()) > 0) ? $item->getTytulAukcji() : $defaultTitle;
  453.             $defaultPhrase = $item->getModel()->getFullName()." ".$item->getCatalog()->getName();
  454.             // prev
  455.             $prevProduct = null;
  456.             if (isset($prev['productId']) && strlen($prev['productId']) > 1) {
  457.                 $prevProduct = $api->getProduct($prev['productId']);
  458.             }
  459.             $description = (strlen($item->getOpisTowaru()) > 0) ? $item->getOpisTowaru() : '';
  460.             return $this->render('app/stanMag/allegro-publish-find-product.html.twig', [
  461.                 'item' => $item,
  462.                 'breadcrumbTitle' => DefaultValuesController::getBreadcrumbTitle(),
  463.                 'categoryTitle' => self::getName($this->translator),
  464.                 'adminMenu' => self::getAdminName(),
  465.                 'defaults' => [
  466.                     'title' => $title,
  467.                     'description' => $description,
  468.                     'phrase' => $defaultPhrase,
  469.                 ],
  470.                 'prevProduct' => $prevProduct,
  471.                 'raw' => [
  472.                     'productId' => $productId,
  473.                     'id' => $id,
  474. //                'products' => $products,
  475. //                'params' => $params,
  476.                 ],
  477.             ]);
  478.         }
  479.     }
  480.     /**
  481.      * @Route("/{id}/allegro-test", name="app_stanmag_test", methods={"GET"})
  482.      */
  483.     public function test(Request $request, string $id, ManagerRegistry $managerRegistry)
  484.     {
  485.         /** @var EntityManager $em */
  486.         $em =  $managerRegistry->getManager();
  487.         $id = preg_replace("/-/","/",$id);
  488.         //$productId = preg_replace("/-/","/",$id);
  489.         /** @var StanMag $item */
  490.         $item = $em->getRepository(StanMag::class)->findOneBy(['nrEtykiety'=> $id]);
  491.         return $this->render('app/stanMag/allegro-publish.html.twig', [
  492.             'item' => $item,
  493.             'breadcrumbTitle' => DefaultValuesController::getBreadcrumbTitle(),
  494.             'categoryTitle' => self::getName($this->translator),
  495.             'adminMenu' => self::getAdminName(),
  496.             'defaults' => [
  497.                 'title' => '',
  498.                 'description' => '',
  499.                 'phrase' => '',
  500.             ],
  501.             'raw' => [
  502.                 'productId' => '',
  503.                 'id' => '',
  504. //                'products' => $products,
  505. //                'params' => $params,
  506.             ],
  507.         ]);
  508.     }
  509.     /**
  510.      * @Route("/{id}/allegro-publish-post", name="app_stanmag_allegro_publish_post", methods={"POST"})
  511.      */
  512.     // the actual posting of the offer on Allegro
  513.     public function publishOnAllegroPOST(Request $request, string $id, ManagerRegistry $managerRegistry): Response
  514.     {
  515.         //print_r($_POST);die();
  516.         /** @var EntityManager $em */
  517.         $em =  $managerRegistry->getManager();
  518.         $id = preg_replace("/-/","/",$id);
  519.         /** @var StanMag $item */
  520.         $item = $em->getRepository(StanMag::class)->findOneBy(['nrEtykiety'=> $id]);
  521.         $eligible = $this->isEligibleForAllegro($id, $managerRegistry);
  522.         if ($eligible['status'] == 0) {
  523.             // return error message;
  524.             return $this->redirectToRoute('app_stanmag_show', ['id' => $item->getSlug() ]);
  525.         }
  526.         $source = ($item->getKodLokalizacji() == 12) ? "waw" : "gru";
  527.         $imagePathPrefix = "https://presim.pl/image/catalog/photos/";
  528.         if ($item->getKodLokalizacji() == 99) {
  529.             $source = "aga";
  530.             $imagePathPrefix = "https://ak20.autoczesci.market/photos/";
  531.         }
  532.         //$imagePathPrefix = $em->getRepository(SystemConfig::class)->getParameter('photoRootPath','master');
  533.         $allegroClientId = $em->getRepository(SystemConfig::class)->getParameter('allegroClientId','allegro');
  534.         $allegroClientSecret = $em->getRepository(SystemConfig::class)->getParameter('allegroClientSecret','allegro');
  535.         $allegroAccessToken = $em->getRepository(SystemConfig::class)->getParameter('allegroAccessToken.'.$source,'allegro');
  536.         $api = new AllegroRestApi();
  537.         $api->setAccessToken($allegroAccessToken)
  538.             ->setClientId($allegroClientId)
  539.             ->setClientSecret($allegroClientSecret);
  540.         $error = false;
  541.         $errorMessage = [];
  542.         if (!$item->isAvailable()) {
  543.             //$error = true;
  544.             $errorMessage[] = "Item not available";}
  545.         $_photos = $item->getStanMagPhotos();
  546.         if (count($_photos) < 1 ) {$error = true; $errorMessage[] = "No photos available";}
  547.         $output = [];
  548.         $output['id'] = $id;
  549.         $output['post'] = $_POST;
  550.         // ------ INITIAL API REQUEST --------
  551.         $apiRequest = [
  552.             'name' => trim($_POST['title']),
  553.             'language' => 'pl-PL',
  554.             'category' => [ 'id' => $_POST['category'] ],
  555.             'taxSettings' => [ 'rates' => [ [ 'rate' => '23.00', 'countryCode' => 'PL'] ] ],
  556.             'payments' => ['invoice' => 'VAT'],
  557.             'stock' => [ 'available' => 1,  'unit' => 'UNIT' ],
  558.             'publication' => [ 'duration' => null, 'status' => 'INACTIVE', ],
  559.             'sellingMode' => [
  560.                 'format' => 'BUY_NOW', 'startingPrice' => null, 'minimalPrice' => null,
  561.                 'price' => ['amount' => (100*$item->getCena())/100,'currency' => 'PLN']
  562.             ],
  563.             'external' => ['id' => trim($item->getNrEtykiety())],
  564.             'location' => ['countryCode' => 'PL'],
  565.         ];
  566.         // ------ DEFAULT VALUES --------
  567.         // get default values
  568.         // allegroDefaults.waw
  569.         $defaults = $em->getRepository(SystemConfig::class)->getParameter('allegroDefaults.'.$source,'allegro', true);
  570.         if (isset($defaults['city']) && isset($defaults['postcode']) && isset($defaults['province'])) {
  571.             $apiRequest['location'] = [
  572.                 'city' => ''.$defaults['city'],
  573.                 'postCode' => ''.$defaults['postcode'],
  574.                 'province' => ''.$defaults['province'],
  575.                 'countryCode' => $defaults['country'],
  576.             ];
  577.         } else { $error = true; $errorMessage[] = "City, postcode or province is required";}
  578.         if (isset($defaults['impliedWarranty']) && isset($defaults['returnPolicy']) && isset($defaults['warranty'])) {
  579.             $apiRequest['afterSalesServices'] = [
  580.                 'impliedWarranty' => ['id' => '' . $defaults['impliedWarranty']],
  581.                 'returnPolicy' => ['id' => '' . $defaults['returnPolicy']],
  582.                 'warranty' => ['id' => '' . $defaults['warranty']],
  583.             ];
  584.         } else { $error = true; $errorMessage[] = "Implied Warranty or Return Policy is required";}
  585.         if (isset($defaults['shipping']) && isset($defaults['handlingTime'])) {
  586.             $apiRequest['delivery'] = [
  587.                 'shippingRates' => ['id' => ''.$defaults['shipping']],
  588.                 'handlingTime' => 'PT'.$defaults['handlingTime'].'H',
  589.             ];
  590.         } else { $error = true; $errorMessage[] = "Shipping rates or handling Time is required";}
  591.         $rateId = $item->getCatalog()->getCatalogMapping()->getAllegroShippingRate($source);
  592.         if (null !== $rateId && strlen($rateId) > 0) {
  593.             $apiRequest['delivery']['shippingRates'] = ['id' => $rateId];
  594.         } else {
  595.             //$error = true; $errorMessage[] = "Unable to find  shipping rate";
  596.         }
  597.         $shippingRate = $_POST['shippingRate'];
  598.         if (strlen($shippingRate) > 0) {
  599.             $apiRequest['delivery']['shippingRates'] = ['id' => $shippingRate];
  600.         }
  601.         // ------ PARAMETERS --------
  602.         $allegroProduct = trim($_POST['product']);
  603.         $productRequiredParameters = $api->getProductParamsForCategory($_POST['category']);
  604.         $productParameters = [];
  605.         foreach($_POST['params'] as $key => $val) {
  606.             if (strlen($val) > 0) {
  607.                 if (strstr(''.$val, ''.$key)) {
  608.                     $parameter = [ 'id' => $key,  'valuesIds' => [$val],  'values' => null,  'rangeValue' => null ];
  609.                 } else {
  610.                     //$parameter = [ 'id' => $key,  'valuesIds' => [],  'values' => [(string)$val], 'rangeValue' => null ];
  611.                     $parameter = [ 'id' => $key,  'valuesIds' => null,  'values' => [(string)$val], 'rangeValue' => null ];
  612.                 }
  613.                 // if not XX
  614.                 if (array_key_exists($key, $productRequiredParameters)) {
  615.                     if ($key == '127415' && strlen($allegroProduct) > 1 ) continue;
  616.                     $productParameters[] = $parameter;
  617.                 } else {
  618.                     $apiRequest['parameters'][] = $parameter;
  619.                 }
  620.             }
  621.         }
  622.         // ------ PRODUCT --------
  623.         // Product info
  624. //        $responsible_name = 'autokasacja';
  625. //        $responsible_name = $defaults['responsiblePerson'];
  626.         // offer with product
  627.         if (strlen($allegroProduct) > 0) {
  628.             $productSet = [];
  629.             $productSet[0] = [
  630.                 'product' => [
  631. //                        'id' => trim($allegroProduct),
  632.                     'parameters' => $productParameters,
  633.                     'images' => null,
  634.                 ],
  635.                 'quantity' => ['value' => 1],
  636.                 'responsiblePerson' => ['id' => $defaults['responsiblePerson'] ],
  637.                 //'safetyInformation' => ['type' => 'NO_SAFETY_INFORMATION'],
  638.                 'safetyInformation' => ['type' => 'TEXT', 'description' => 'Produkt wprowadzony do obrotu przed 13.12.2024'],
  639.                 'marketedBeforeGPSRObligation' => true,
  640.                 ];
  641.             if (isset($defaults['responsibleProducer'])) $productSet[0]['responsibleProducer'] = ['id' => $defaults['responsibleProducer'] ];
  642.             if ($allegroProduct == '0') {
  643.                 // add name instead of ID
  644.                 $productSet[0]['product']['name'] = $item->getModel()->getFullName()." ".$item->getCatalog()->getName();
  645.                 // add main image
  646.                 if ($item->getPrimaryPhoto()) {
  647.                     $photo = $imagePathPrefix . $item->getPrimaryPhoto()->getPhotoPath();
  648.                     // send photo to Allegro, retrieve URL
  649.                     $img = $this->curl_get_file_contents($photo);
  650.                     $result = $api->postImage($img);
  651.                     if (!isset($result['location'])) {
  652.                         $error = true; $errorMessage[] = "unexpected API call result: [".json_encode($result)."] ";
  653.                     } else {
  654.                         $productSet[0]['product']['images'][0] = $result['location'];
  655.                     }
  656.                 } else { $error = true; $errorMessage[] = "Primary photo not found";}
  657.             } elseif(strlen($allegroProduct) > 1) {
  658.                 //$productSet[0]['id'] = trim($allegroProduct);
  659.                 $productSet[0]['product']['id'] = trim($allegroProduct);
  660.             }
  661.             $apiRequest['productSet'] = $productSet;
  662.         }
  663.         // main photo
  664.         // @TODO: create array of images to extract image URLs from Allegro
  665.         // @TODO: POST IMAGES before setting up the content here. URLs of images only;
  666.         $photos = [];
  667.         if ($item->getPrimaryPhoto()) {
  668.             $photo = $imagePathPrefix . $item->getPrimaryPhoto()->getPhotoPath();
  669.             // send photo to Allegro, retrieve URL
  670.             $img = $this->curl_get_file_contents( $photo);
  671.             $result = $api->postImage($img);
  672.             if (!isset($result['location'])) {
  673.                 $error = true; $errorMessage[] = "unexpected API call result: [".json_encode($result)."] ";
  674.             } else {
  675.                 $photos[0] = $result['location'];
  676.             }
  677.         } else { $error = true; $errorMessage[] = "Primary photo not found";}
  678.         if (count($_photos)>0) {
  679.             $i = 0;
  680.             foreach ($_photos as $_photo) {
  681.                 if ($_photo->getIsPrimary() != 1) {
  682.                     $i++;
  683.                     if ($i >= 16) continue; // Allegro limit - 16 photos max
  684.                     $photo = $imagePathPrefix . $_photo->getPhotoPath();
  685.                     $img = $this->curl_get_file_contents( $photo);
  686.                     $result = $api->postImage($img);
  687.                     if (!isset($result['location'])) {
  688.                         $error = true; $errorMessage[] = "unexpected API call result for photo $i : [".json_encode($result)."] ";
  689.                     } else {
  690.                         $photos[$i] = $result['location'];
  691.                     }
  692.                 }
  693.             }
  694.         } else { $error = true; $errorMessage[] = "Photos not available";}
  695. //        print_r($result);die();
  696.         // Offer Content
  697.         $apiRequest['description']['sections'] = [];
  698.         $apiRequest['description']['sections'][] = [
  699.             'items' => [
  700.                 ['type' => 'IMAGE', 'url' => $photos[0],],
  701.                 ['type' => 'TEXT', 'content' =>'<h1>'.$item->getNazwa().'</h1><p>do <b>'.$item->getModel().'</b></p>']
  702.             ]
  703.         ];
  704.         $template = $em->getRepository(SystemConfig::class)->getParameter('allegroDefaultTemplate','allegro');
  705.         $content = $this->replacePlaceholders($template,$item);
  706.         $content = str_replace('%%OPIS%%',$_POST['description'],$content);
  707.         // save description and title in StanMag table
  708.         //$item->sdtOpisTowaru
  709.         $item->setOpisTowaru(trim($_POST['description']));
  710.         $item->setTytulAukcji(trim($_POST['title']));
  711.         $em->persist($item);
  712.         // if secondary image exists
  713.         if (isset($photos[1]) && strlen($photos[1]) > 1) {
  714.             $apiRequest['description']['sections'][] = [
  715.                 'items' => [
  716.                     ['type' => 'TEXT', 'content' => ''.$content],
  717.                     ['type' => 'IMAGE', 'url' => ''.$photos[1],]
  718.                 ]
  719.             ];
  720.         } else {
  721.             $apiRequest['description']['sections'][] = [
  722.                 'items' => [
  723.                     ['type' => 'TEXT', 'content' => ''.$content]
  724.                 ]
  725.             ];
  726.         }
  727.         $apiRequest['images'] = [];
  728.         // additional photos loop
  729.         // images
  730.         foreach($photos as $i => $photo) {
  731.             $image = (isset($photo)) ? ['url' => $photo] : null;
  732.             if ($image) {
  733.                 $apiRequest['images'][$i] = $photo;
  734.                 if ($i > 1) $apiRequest['description']['sections'][] = [
  735.                     'items' => [
  736.                         ['type' => 'IMAGE', 'url' => $photo,]
  737.                     ]
  738.                 ];
  739.             }
  740.         }
  741.         $output['api_request'] = $apiRequest;
  742.         $auction_id = 0;
  743.         if ($error) {
  744.             $output['error'] = $errorMessage;
  745.         } else {
  746.             $result = $api->post('/sale/product-offers/',$apiRequest);
  747.             $output['api_result'] = $result;
  748.             $auction_id = (isset($result['id'])) ? (int)$result['id'] : 0;
  749.             if (isset($result['errors']) && count($result['errors']) > 0 ) {
  750.                 $output['api_activate_result'] = "ERROR. Unable to activate";
  751.                 $output['api_delete_result'] = $result;
  752.             } else {
  753.                 if (isset($result['validation']['errors']) && count($result['validation']['errors']) < 1  && $auction_id > 0) {
  754.                     $result = $api->publishOffersOnAllegro(array($auction_id));
  755.                     $output['api_activate_result'] = $result;
  756.                     if ($auction_id > 0) {
  757.                         
  758.                         $category = $em->getRepository(AllegroCategory::class)->findOneBy(['id'=>$_POST['category']]);
  759.                         $auction = new AllegroOffer();
  760.                         //$auction->setCategory();
  761.                         $auction->setId($auction_id);
  762.                         $auction->setName(trim($_POST['title']));
  763.                         if ($category)
  764.                             $auction->setCategory($category);
  765.                         $auction->setStanmag($item);
  766.                         $auction->setQuantity(1);
  767.                         $auction->setPrice((100*$item->getCena())/100);
  768.                         $auction->setExternal($item->getNrEtykiety());
  769.                         $auction->setStatus('PLACEHOLDER');
  770.                         $em->persist($auction);
  771.                         $em->flush();
  772.                         $allegroParams = [];
  773.                         // storing chosen product id
  774.                         $allegroParams['productId'] = $allegroProduct;
  775.                         // storing chosen shipping rate
  776.                         $allegroParams['shippingRate'] = (isset($apiRequest['delivery']['shippingRates']['id'])) ?  $apiRequest['delivery']['shippingRates']['id'] : '';
  777.                         if(is_array($productParameters)) {
  778.                             foreach ($productParameters as $productParameter) {
  779.                                 $allegroParams[$productParameter['id']] = $productParameter;
  780.                             }
  781.                         }
  782.                         $em->getRepository(StanMag::class)->setAllegroParams($item,$auction_id,$allegroParams);
  783.                     }
  784.                 } else {
  785.                     $output['api_activate_result'] = "ERROR. Unable to activate";
  786.                     // remove INACTIVE;
  787.                     $result = $api->deleteOfferFromAllegro($auction_id);
  788.                     $output['api_delete_result'] = $result;
  789.                 }
  790.             }
  791.         }
  792.         return $this->render('app/stanMag/allegro-publish-confirm.html.twig', [
  793.             'item' => $item,
  794.             'breadcrumbTitle' => DefaultValuesController::getBreadcrumbTitle(),
  795.             'categoryTitle' => self::getName($this->translator),
  796.             'adminMenu' => self::getAdminName(),
  797.             'auctionId' => $auction_id,
  798.             'request' => $_POST,
  799.             'result' => $output,
  800.         ]);
  801. //        $output = $this->container->get('serializer')->serialize($output,'json');
  802. //        return new JsonResponse($output,200,[],true);
  803.     }
  804.     /**
  805.      * @Route("/{id}/allegroFindProduct", name="app_stanmag_find_allegro_product", methods={"GET"})
  806.      * @param Request $request
  807.      * @param ManagerRegistry $managerRegistry
  808.      * @return Response
  809.      */
  810.     public function findAllegroProduct(Request $request, string $id, ManagerRegistry $managerRegistry): Response
  811.     {
  812.         /** @var EntityManager $dm */
  813.         $em =  $managerRegistry->getManager();
  814.         $phrase = $request->query->get('phrase', "");
  815.         $id = preg_replace("/-/","/",$id);
  816.         $item = $em->getRepository(StanMag::class)->findOneBy(['nrEtykiety'=> $id]);
  817.         $source = ($item->getKodLokalizacji() == 12) ? "waw" : "gru";
  818.         if ($item->getKodLokalizacji() == 99) $source = "aga";
  819.         $allegroClientId = $em->getRepository(SystemConfig::class)->getParameter('allegroClientId','allegro');
  820.         $allegroClientSecret = $em->getRepository(SystemConfig::class)->getParameter('allegroClientSecret','allegro');
  821.         $allegroAccessToken = $em->getRepository(SystemConfig::class)->getParameter('allegroAccessToken.'.$source,'allegro');
  822.         $api = new AllegroRestApi();
  823.         $api->setAccessToken($allegroAccessToken)
  824.             ->setClientId($allegroClientId)
  825.             ->setClientSecret($allegroClientSecret);
  826.         if ($phrase == "") {
  827.             $phrase = (strlen($item->getNrOem()) > 0) ? $item->getNrOem() : $item->getName()." ".$item->getModel()->getName();
  828.             $phrase = (strlen($item->getNrOem()) > 0) ? $item->getNrOem() : $item->getName()." ";
  829.         }
  830.         //$products = $api->getProducts($item->getCatalog()->getCatalogMapping()->getAllegroCategory()->getId(),$phrase);
  831.         $products = $api->getProducts(3,$phrase);
  832.         $output = [];
  833.         $output['phrase'] = $phrase;
  834.         $output['total'] = 0;
  835.         $output['products'] = [];
  836.         if (count($products) > 0) {
  837.             foreach ($products as $_product) {
  838.                 $product = [
  839.                     'id' => $_product['id'],
  840.                     'name' => $_product['name'],
  841.                 ];
  842.                 $product['category_id'] = (isset($_product['category']['id'])) ? $_product['category']['id'] : "";
  843.                 $product['category_title'] = "";
  844.                 if (strlen($product['category_id']) > 0) {
  845.                     $category = $em->getRepository(AllegroCategory::class)->find($product['category_id']);
  846.                     //$product['category_title'] = $category->getName();
  847.                     $product['category_title'] = $category->getPathString();
  848.                 }
  849.                 $product['img_url'] = (is_array($_product['images']) && isset($_product['images'][0]['url'])) ? $_product['images'][0]['url'] : "";
  850.                 if (isset($_product['parameters']) && is_array($_product['parameters'])) {
  851.                     foreach ($_product['parameters'] as $_parameter) {
  852.                         if ( in_array($_parameter['id'],['127415', '215858','247835','225693'])) {
  853.                             $product['parameters'][$_parameter['id']] = $_parameter['name'];
  854. //                        $product['parameters'][$_parameter['id']]['id'] = $_parameter['id'];
  855. //                        $product['parameters'][$_parameter['id']]['name'] = $_parameter['name'];
  856. //                        $product['parameters'][$_parameter['id']]['value'] = $_parameter['valuesLabels'];
  857.                             $product['params'][$_parameter['name']] = $_parameter['valuesLabels'];
  858.                         }
  859.                     }
  860.                 }
  861.                 $output['products'][$product['id']] = $product;
  862.             }
  863.             $output['total'] = count($output['products']);
  864.         }
  865.         $output = $this->container->get('serializer')->serialize($output,'json');
  866.         return new JsonResponse($output,200,[],true);
  867.     }
  868.     /**
  869.      * @Route("/{id}/allegroGetProduct", name="app_stanmag_get_allegro_product", methods={"GET"})
  870.      * @param Request $request
  871.      * @param ManagerRegistry $managerRegistry
  872.      * @return Response
  873.      */
  874.     public function getAllegroProduct(Request $request, string $id, ManagerRegistry $managerRegistry): Response
  875.     {
  876.         /** @var EntityManager $dm */
  877.         $em =  $managerRegistry->getManager();
  878.         $categoryId = $request->query->get('category_id', "");
  879.         $id = preg_replace("/-/","/",$id);
  880.         $item = $em->getRepository(StanMag::class)->findOneBy(['nrEtykiety'=> $id]);
  881.         $source = ($item->getKodLokalizacji() == 12) ? "waw" : "gru";
  882.         if ($item->getKodLokalizacji() == 99) $source = "aga";
  883.         $allegroClientId = $em->getRepository(SystemConfig::class)->getParameter('allegroClientId','allegro');
  884.         $allegroClientSecret = $em->getRepository(SystemConfig::class)->getParameter('allegroClientSecret','allegro');
  885.         $allegroAccessToken = $em->getRepository(SystemConfig::class)->getParameter('allegroAccessToken.'.$source,'allegro');
  886.         $api = new AllegroRestApi();
  887.         $api->setAccessToken($allegroAccessToken)
  888.             ->setClientId($allegroClientId)
  889.             ->setClientSecret($allegroClientSecret);
  890.         if ($categoryId == "") {
  891.             $categoryId = $item->getCatalog()->getCatalogMapping()->getAllegroCategory()->getId();
  892.         }
  893.         $result = $api->getParamsForCategory($categoryId);
  894.         $output = [];
  895.         $output['category_id'] = $categoryId;
  896.         $output['total'] = 0;
  897.         $output['parameters'] = [];
  898.         // @TODO: get default values from Stanmag or Katalog;
  899.         $defaults = [
  900.             'global' => [
  901.                 'Producent części' => $em->getRepository(SystemConfig::class)->getParameter('allegroDefaultProducent','allegro'),
  902.                 'Typ samochodu' => $em->getRepository(SystemConfig::class)->getParameter('allegroDefaultTypSamochodu','allegro'),
  903.                 'Stan' => $em->getRepository(SystemConfig::class)->getParameter('allegroDefaultStan','allegro'),
  904.                 'Wersja' => $em->getRepository(SystemConfig::class)->getParameter('allegroDefaultWersja','allegro'),
  905.                 'Produkt wprowadzony do obrotu na terenie UE przed 13.12.2024' => $em->getRepository(SystemConfig::class)->getParameter('allegroDefaultObrotUE','allegro'),
  906.                 'Jakość części (zgodnie z GVO)' => $em->getRepository(SystemConfig::class)->getParameter('allegroDefaultJakoscGVO','allegro'),
  907.             ]
  908.         ];
  909.         $catalogDefaults = $item->getCatalog()->getCatalogMapping()->getAllegroDefaultValues();
  910.         if (count($catalogDefaults)> 0) {
  911.             foreach ($catalogDefaults as $id => $catalogDefault) {
  912.                 if ($catalogDefault != '')
  913.                     $defaults[$id] = $catalogDefault;
  914.             }
  915.         }
  916.         if (isset($result) && is_array($result)) {
  917.             foreach ($result as $_parameter) {
  918.                 $output['parameters'][$_parameter['id']]['id'] = $_parameter['id'];
  919.                 $output['parameters'][$_parameter['id']]['name'] = $_parameter['name'];
  920.                 $output['parameters'][$_parameter['id']]['type'] = $_parameter['type'];
  921.                 $output['parameters'][$_parameter['id']]['required'] = $_parameter['required'];
  922.                 if (isset($defaults[$_parameter['id']])) {
  923.                     $output['parameters'][$_parameter['id']]['value'] = $defaults[$_parameter['id']];
  924.                 } elseif(array_key_exists($_parameter['name'], $defaults['global'])) {
  925.                     $output['parameters'][$_parameter['id']]['value'] = $defaults['global'][$_parameter['name']];
  926.                     // check Producent Czesci;
  927.                     foreach($_parameter['dictionary'] as $dictionary) {
  928.                         if (isset($dictionary['value']) && isset($dictionary['id']) && strtolower($dictionary['value']) == strtolower($item->getModel()->getMake()->getName())) {
  929.                             $output['parameters'][$_parameter['id']]['value'] = $dictionary['id'];
  930.                         }
  931.                     }
  932.                 } else {
  933.                     $output['parameters'][$_parameter['id']]['value'] = '';
  934.                 }
  935.                 if (isset($_parameter['dictionary']) && is_array($_parameter['dictionary'])) {
  936.                     $output['parameters'][$_parameter['id']]['dictionary'] = $_parameter['dictionary'];
  937.                 }
  938.             }
  939.        }
  940.         $output['total'] = count($output['parameters']);
  941.         //$output = $result;
  942.         $output = $this->container->get('serializer')->serialize($output,'json');
  943.         return new JsonResponse($output,200,[],true);
  944.     }
  945.     /**
  946.      * @Route("/{id}/syncPhotos", name="app_stanmag_sync_photos", methods={"GET"})
  947.      * @param string $id
  948.      * @param ManagerRegistry $managerRegistry
  949.      * @return Response
  950.      */
  951.     public function syncPhotos(string $id, ManagerRegistry $managerRegistry): Response
  952.     {
  953.         
  954.         /** @var EntityManager $em */
  955.         $em =  $managerRegistry->getManager();
  956.         /** @var StanMag $item */
  957.         $id = preg_replace("/-/","/",$id);
  958.         $item = $em->getRepository(StanMag::class)->findOneBy(['nrEtykiety'=> $id]);
  959.         $sync = [];
  960.         if ($item) {
  961.             $sync = $em->getRepository(StanMag::class)->syncPhotosFromSource($item, 1);
  962.         }
  963.         
  964.         //print_r($sync);die();
  965.         return $this->redirectToRoute("app_stanmag_show",['id'=>$item->getSlug()]);
  966.     }
  967.     /**
  968.      * @Route("/{id}/syncData", name="app_stanmag_sync_data", methods={"GET"})
  969.      * @param string $id
  970.      * @param ManagerRegistry $managerRegistry
  971.      * @return Response
  972.      */
  973.     public function syncData(string $id, ManagerRegistry $managerRegistry): Response
  974.     {
  975.         /** @var EntityManager $em */
  976.         $em =  $managerRegistry->getManager();
  977.         /** @var StanMag $item */
  978.         $id = preg_replace("/-/","/",$id);
  979.         $item = $em->getRepository(StanMag::class)->findOneBy(['nrEtykiety'=> $id]);
  980.         $sync = [];
  981.         if ($item) {
  982.             $sync = $em->getRepository(StanMag::class)->getStanMagSisdPhotos($item);
  983.             if (isset($sync['data']) && is_array($sync['data'])) {
  984.                 $em->getRepository(StanMag::class)->executeProcessItemStanmag($sync['data'],false);
  985.             }
  986.         }
  987.         //print_r($sync);die();
  988.         return $this->redirectToRoute("app_stanmag_show",['id'=>$item->getSlug()]);
  989.     }
  990.     private function isEligibleForAllegro(string $id, ManagerRegistry $managerRegistry): array
  991.     {
  992.         $output = [];
  993.         $error = false;
  994.         $errorMessage = [];
  995.         /** @var EntityManager $em */
  996.         $em =  $managerRegistry->getManager();
  997.         $id = preg_replace("/-/","/",$id);
  998.         /** @var StanMag $item */
  999.         $item = $em->getRepository(StanMag::class)->findOneBy(['nrEtykiety'=> $id]);
  1000.         if (!$item) {
  1001.             $error = true; $errorMessage[] = "Stanmag not found";
  1002.         } else {
  1003.             $source = ($item->getKodLokalizacji() == 12) ? "waw" : "gru";
  1004.             if ($item->getKodLokalizacji() == 99) $source = "aga";
  1005.             if (!$item->isAvailable()) {$error = true;$errorMessage[] = "Item not available";}
  1006.             $offers = $item->getAllegroOffers();
  1007.             if (count($offers) > 0 ) {
  1008.                 foreach ($offers as $offer) {
  1009.                     if ($offer->getStatus() == 'ACTIVE'  || $offer->getStatus() == 'INACTIVE' || $offer->getStatus() == 'PLACEHOLDER') {
  1010.                     //if ($offer->getStatus() == 'ACTIVE' ) {
  1011.                         $error = true;$errorMessage[] = "Active Allegro auction exists.";
  1012.                     }
  1013.                 }
  1014.             }
  1015.             if (count($item->getStanMagPhotos()) < 1 ) {$error = true; $errorMessage[] = "No photos available";}
  1016.             if (!$item->getPrimaryPhoto()) {$error = true; $errorMessage[] = "Primary photo not found";}
  1017.             // ------ DEFAULT VALUES --------
  1018.             // get default values
  1019.             // allegroDefaults.waw
  1020.             $defaults = $em->getRepository(SystemConfig::class)->getParameter('allegroDefaults.'.$source,'allegro', true);
  1021.             if (isset($defaults['city']) && isset($defaults['postcode']) && isset($defaults['province'])) {
  1022.             } else { $error = true; $errorMessage[] = "City, postcode or province is required";}
  1023.             if (isset($defaults['impliedWarranty']) && isset($defaults['returnPolicy']) && isset($defaults['warranty'])) {
  1024.             } else { $error = true; $errorMessage[] = "Implied Warranty or Return Policy is required";}
  1025.             if (isset($defaults['handlingTime'])) {
  1026.             } else { $error = true; $errorMessage[] = "Handling Time is required";}
  1027.             $rateId = $item->getCatalog()->getCatalogMapping()->getAllegroShippingRate($source);
  1028.             if (null !== $rateId && strlen($rateId) > 0) {
  1029.             } elseif(isset($defaults['shipping'])) {
  1030.             } else { $error = true; $errorMessage[] = "Unable to find shipping rate";}
  1031.         }
  1032.         
  1033.         if ($error) {
  1034.             $output['status'] = 0;
  1035.             $output['error'] = $errorMessage;
  1036.         } else {
  1037.             $output['status'] = 1;
  1038.         }
  1039.         return $output;
  1040. //        $output = $this->container->get('serializer')->serialize($output,'json');
  1041. //        return new JsonResponse($output,200,[],true);
  1042.     }
  1043.     function curl_get_file_contents($URL)
  1044.     {
  1045.         $c = curl_init();
  1046.         curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
  1047.         curl_setopt($c, CURLOPT_URL, $URL);
  1048.         $contents = curl_exec($c);
  1049.         curl_close($c);
  1050.         if ($contents) return $contents;
  1051.         else return FALSE;
  1052.     }
  1053.     public function replacePlaceholders($template, StanMag $item) {
  1054.         $content_new = $template;
  1055.         $rocznik = $item->getRocznik();
  1056.         $content_new = str_replace('%%NAZWA_KATALOG%%',$item->getCatalog(),$content_new);
  1057.         $content_new = str_replace('%%NAZWA%%',$item->getNazwa(),$content_new);
  1058.         $content_new = str_replace('%%MARKA%%',$item->getModel()->getMake(),$content_new);
  1059.         $content_new = str_replace('%%MODEL%%',$item->getModel(),$content_new);
  1060.         $content_new = str_replace('%%NUMER_ORYGINALU%%',$item->getNrOem(),$content_new);
  1061.         $content_new = str_replace('%%ROCZNIK%%',$item->getModel()->getYearFrom()." - ".$item->getModel()->getYearTo(),$content_new);
  1062.         if ($rocznik > 0) {
  1063.             $content_new = str_replace('%%ROK_PRODUKCJI%%', $item->getRocznik(), $content_new);
  1064.         } else {
  1065.             $content_new = str_replace('%%ROK_PRODUKCJI%%', " ", $content_new);
  1066.         }
  1067.         if ($item->getVehicle() && strlen($item->getVehicle()->getNumerNadwozia()) > 0) {
  1068.             $content_new = str_replace('%%NR_NADWOZIA%%', $item->getVehicle()->getNumerNadwozia(), $content_new);
  1069.         } else {
  1070.             $content_new = str_replace('%%NR_NADWOZIA%%', "", $content_new);
  1071.         }
  1072.         $content_new = str_replace('%%NR_ETYKIETY%%',$item->getNrEtykiety(),$content_new);
  1073.         //$content_new = str_replace('%%OPIS%%',$item->getOpisTowaru(),$content_new);
  1074.         return $content_new;
  1075.     }
  1076.     private function logPrefix($message)
  1077.     {
  1078.         $limit = 70;
  1079.         $content = explode("::",$message);
  1080.         $len = $limit - strlen($content[0]);
  1081.         return $content[0].str_pad(' '.$content[1],$len,'.',STR_PAD_LEFT).' ';
  1082.     }
  1083. }