src/StockBundle/Controller/ScriptsController.php line 63

Open in your IDE?
  1. <?php
  2. namespace StockBundle\Controller;
  3. use Pimcore\Controller\FrontendController;
  4. use Symfony\Component\HttpFoundation\Request;
  5. use Symfony\Component\HttpFoundation\Response;
  6. use Symfony\Component\HttpFoundation\RedirectResponse;
  7. use Symfony\Component\Routing\Annotation\Route;
  8. use Pimcore\Log\ApplicationLogger;
  9. use Pimcore\Tool\Session;
  10. use Pimcore\Model\DataObject;
  11. use Pimcore\Model\DataObject\ClassDefinition;
  12. use StockBundle\Tools\OpencartConnector;
  13. use StockBundle\Tools\OdooExport;
  14. use StockBundle\Tools\OdooData;
  15. use StockBundle\Tools\Common\MonkeyConfig;
  16. use StockBundle\Tools\Common\Telegram;
  17. use GuzzleHttp\Client;
  18. class ScriptsController extends FrontendController
  19. {
  20.     private $db;
  21.     private $logger;
  22.     private $odooExport;
  23.     private $mmConfig;
  24.     private $opencart;
  25.     private $pim_root_cat_id;
  26.     public function __construct()
  27.     {
  28.         $this->pim_root_cat_id 56;
  29.         $this->db = \Pimcore\Db::get();
  30.         $this->logger ApplicationLogger::getInstance();
  31.         $this->odooExport = new OdooExport();
  32.         $this->mmConfig = new MonkeyConfig();
  33.         $this->opencart = new OpencartConnector();
  34.     }
  35.     /**
  36.      * @Route("/scripts/upload-queue", name="upload_queue")
  37.      */
  38.     public function uploadQueueAction(Request $request)
  39.     {
  40.         $this->logger->info('Очередь товаров проверена.');
  41.         $tasks $this->db->query("SELECT pt.*, o.o_key, o.o_className
  42.                                    FROM pim_tasks as pt
  43.                                    LEFT JOIN objects as o ON pt.pim_id = o.o_id
  44.                                    WHERE pt.upload_status is NULL;");
  45.         $response $this->render('StockBundle:Scripts:upload-queue.html.twig', [
  46.             'title' => 'Очередь выгрузки',
  47.             'tasks' => $tasks->fetchAll()
  48.         ]);
  49.         return $response;
  50.     }
  51.     /**
  52.      * @Route("/rest/pim-odoo-prices-update", name="rest_pim_odoo_prices")
  53.      */
  54.     public function restPimOdooPricesAction(Request $request)
  55.     {
  56.         if ($request->getMethod() != "POST") {
  57.             return $this->json(array('status' => 'FAIL'));
  58.         }
  59.         try {
  60.             $data json_decode($request->getContent(), true);
  61.             foreach ($data['products'] as $product) {
  62.                 $this->mmConfig->updateDataPimOdooProducts((object)$product);
  63.             }
  64.         } catch (Exception $e) {
  65.             return $this->json(array('status' => 'FAIL'"message" => $e->getMessage()));
  66.         }
  67.         return $this->json(array('status' => 'OK'));
  68.         
  69.     }
  70.     /**
  71.      * @Route("/scripts/brand-and-category-sync", name="brand_and_category_sync")
  72.      */
  73.     public function syncBrandCategoryAction(Request $request)
  74.     {
  75.         $this->logger->info('Синхронизация брендов и категорий запущена (syncBrandCategoryAction).');
  76.         // Создаем в Odoo бренды, у которых нет odoo_id
  77.         $items DataObject\Manufacturer::getList([
  78.             "condition" => "odoo_id is Null",
  79.         ]);
  80.         $items->load();
  81.         if (count($items)) {
  82.             foreach ($items as $brand) {
  83.                 // Создаю в CRM
  84.                 $id $this->odooExport->createOdooManufacturer($brand->getkey());
  85.                 $brand->setodoo_id($id);
  86.                 $brand->save();
  87.                 echo '<div class="alert alert-primary" role="alert">Бренд <b>'$brand->getkey().'</b> выгружен в CRM</div>';
  88.             }
  89.         } else {
  90.             echo '<div class="alert alert-warning" role="alert">Нет брендов на выгрузку в CRM</div>';
  91.         }
  92.         // Выгрузка брендов на сайт
  93.         $items DataObject\Manufacturer::getList([
  94.             "condition" => "site_id is Null",
  95.         ]);
  96.         $items->load();
  97.         
  98.         if (count($items)) {
  99.             $data = [];
  100.             foreach ($items as $b) {
  101.                 echo $b->id "<br>";
  102.                 if (is_null($b)) {
  103.                     continue;
  104.                 }
  105.                 $brandData $this->opencart->prepareBrandData($b);
  106.                 if ($brandData) {
  107.                     $data[] = $brandData;
  108.                 }
  109.                 echo '<div class="alert alert-primary" role="alert">Бренд <b>'$b->getkey().'</b> готов к выгрузке на сайт</div>';
  110.             }
  111.         
  112.             $r $this->opencart->uloadManufacturer($data);
  113.             if (is_null($r)) {
  114.                 foreach ($items as $b) {
  115.                     $siteId $this->opencart->getManufacturerByName($b->getname());
  116.                     if ($siteId) {
  117.                         $b->setsite_id($siteId);
  118.                         $b->save();
  119.                     }
  120.                 }
  121.             } else {
  122.                 foreach ($r as $id=>$siteId) {
  123.                     $manufacturer DataObject::getById($id);
  124.                     $manufacturer->setsite_id($siteId);
  125.                     $manufacturer->save();
  126.                 }
  127.             }
  128.         } else {
  129.             echo '<div class="alert alert-warning" role="alert">Нет брендов на выгрузку на сайт</div>';
  130.         }
  131.         // Обновляю бренды на сайте
  132.         $items $this->mmConfig->selectPimBrandTask();
  133.         if ($items) {
  134.             foreach ($items as $brand) {
  135.                 echo $brand['pim_id'] . "<br>";
  136.                 $b DataObject::getById($brand['pim_id']);
  137.                 if (is_null($b)) {
  138.                     continue;
  139.                 }
  140.                 $brandData $this->opencart->prepareBrandData($b);
  141.                 if ($brandData) {
  142.                     $upload $this->opencart->uloadManufacturer([$brandData]);
  143.                     $this->mmConfig->uploadPimTaskStatusDone($brand['id']);
  144.                     echo '<div class="alert alert-primary" role="alert">Бренд <b>'$brand['id'].'</b> обновлен на сайте.</div>';
  145.                 }
  146.             }
  147.         } else {
  148.             echo '<div class="alert alert-warning" role="alert">Нет брендов на обновение на сайте</div>';
  149.         }
  150.         // Выгрузка новых категорий на сайт
  151.         $items DataObject\Category::getList([
  152.             "condition" => "site_id is Null",
  153.         ]);
  154.         $items->load();
  155.         if (count($items)) {
  156.             $data = [];
  157.             foreach ($items as $c) {
  158.                 $Data $this->opencart->prepareCategoryData($c);
  159.                 if ($Data) {
  160.                     $data[] = $Data;
  161.                 }
  162.             }
  163.             $r = (array)$this->opencart->uploadCategory($data);
  164.             foreach ($r as $id=>$siteId) {
  165.                 $manufacturer DataObject::getById($id);
  166.                 $manufacturer->setsite_id($siteId);
  167.                 $manufacturer->save();
  168.                 echo '<div class="alert alert-primary" role="alert">Бренд <b>'$manufacturer->getkey().'</b> обновлен на сайте.</div>';
  169.             }
  170.         } else {
  171.             echo '<div class="alert alert-warning" role="alert">Нет категорий на создание на сайте</div>';
  172.         }
  173.         // Создаем категории в CRM, у которых нет odoo_id
  174.         $categories_to_create DataObject\Category::getList([
  175.             "condition" => "odoo_id is Null",
  176.         ]);
  177.         $categories_to_create->load();
  178.     
  179.         if (count($categories_to_create)) {
  180.             foreach ($categories_to_create as $cat) {
  181.                 $name $cat->getkey();
  182.     
  183.                 // Определяем родителя для категории
  184.                 $parentId $cat->getParentId();
  185.                 if ($parentId == $this->pim_root_cat_id || strpos($cat->getPath(), "Синтетические/")) {
  186.                     $parentIdFromOdoo 2
  187.                 } else {
  188.                     $parentIdFromOdoo $cat->getValueFromParent('odoo_id');
  189.                 }
  190.         
  191.                 $s $this->odooExport->createOdooCategory([
  192.                     'name' => $name,
  193.                     'translit_name' => $cat->getslug(),
  194.                     'parent_id' => $parentIdFromOdoo,
  195.                 ]);
  196.                 
  197.                 if (is_int($s)) {
  198.                     echo '<div class="alert alert-primary" role="alert">Категория '.$name.' создана.</div>';
  199.                     $cat->setodoo_id($s);
  200.                     $cat->save();
  201.                 } else {
  202.                     MonkeyConfig::print_pre($s);
  203.                     echo "ОШИБКА ПРИ СОЗДАНИИ, СООБЩИТЕ ПРОГРАММИСТУ:<pre>"print_r(gettype($s)); echo "</pre>";
  204.                 }
  205.             }
  206.         } else {
  207.             echo '<div class="alert alert-warning" role="alert">Нет категорий на создание в Odoo</div>';
  208.         }
  209.         // Обновление категорий на сайте и в CRM
  210.         $items $this->mmConfig->selectPimCategoryTask();
  211.         if ($items) {
  212.             foreach ($items as $c) {
  213.                 $cat DataObject::getById($c['pim_id']);
  214.                 if (empty($cat)) {
  215.                     continue;
  216.                 }
  217.                 $data $this->opencart->prepareCategoryData($cat);
  218.                 $upload $this->opencart->uploadCategory([$data]);
  219.                 echo '<div class="alert alert-primary" role="alert">Категория <b>'$c['id'].'</b> обновлена на сайте.</div>';
  220.                 // Обновляю в CRM
  221.                 if (!$cat->getIsSyntetic()) {
  222.                     $parentId $cat->getParentId();
  223.                     if ($parentId == $this->pim_root_cat_id || strpos($cat->getPath(), "Синтетические/")) {
  224.                         $parentIdFromOdoo 2
  225.                     } else {
  226.                         $parentIdFromOdoo $cat->getValueFromParent('odoo_id');
  227.                     }
  228.                     $data = [
  229.                         'name' => $cat->getkey(),
  230.                         'translit_name' => $cat->getslug(),
  231.                         'parent_id' => $parentIdFromOdoo,
  232.                         'property_cost_method' => 'fifo',
  233.                         'property_valuation' => 'real_time' 
  234.                     ];
  235.                     $a $this->odooExport->updateOdooCategory($data$cat->getodoo_id());
  236.                 }
  237.                 $this->mmConfig->uploadPimTaskStatusDone($c['id']);
  238.             }
  239.         } else {
  240.             echo '<div class="alert alert-warning" role="alert">Нет категорий на обновление на сайте</div>';
  241.         }
  242.         $response $this->render('StockBundle:Scripts:blank.html.twig', [
  243.             'title' => 'Синхронизация брендов и категорий',
  244.         ]);
  245.         return $response;
  246.     }
  247.     
  248.     /**
  249.      * @Route("/scripts/products-sync", name="products_sync")
  250.      */
  251.     public function syncProductsAction(Request $request)
  252.     {   
  253.         $only_site $request->query->get('site');
  254.         $this->logger->info('Синхронизация товаров запущена (syncProductsAction).');
  255.         $date date("Y-m-d");
  256.         try {
  257.         // Актуализируем названия
  258.         $products $this->db->fetchAll("SELECT pim_id, pim_sku FROM `pim_odoo_products` WHERE `pim_sku` LIKE '%-tmp%'");
  259.         if ($products) {
  260.             foreach ($products as $p) {
  261.                 $pim_id $p['pim_id'];
  262.                 $pim_sku $p['pim_sku'];
  263.                 $obj DataObject::getById($pim_id);
  264.                 $new_sku $obj->getKey();
  265.                 
  266.                 if ($new_sku != $pim_sku) {
  267.                     $this->db->query("UPDATE `pim_odoo_products` SET pim_sku = '$new_sku' WHERE pim_id = '$pim_id'");
  268.                     $obj->save();
  269.                 }
  270.             }
  271.         }
  272.         // Достаем товары с 0 id opencart
  273.         $products $this->db->fetchAll("SELECT pim_id, pim_sku FROM `pim_odoo_products` WHERE `opencart_id` = '0'");
  274.         if ($products) {
  275.             $data = [];
  276.             foreach ($products as $p) {
  277.                 $data[$p['pim_sku']] = $p['pim_id'];
  278.             }
  279.             $opencart_products $this->opencart->getProductQtyIds();
  280.             foreach ($opencart_products as $oc_product) {
  281.                 if (array_key_exists($oc_product->sku$data)) {
  282.                     //echo $oc_product->sku . " exist!<br>";
  283.                     $pim_id $data[$oc_product->sku];
  284.                     $obj DataObject::getById($pim_id);
  285.                     if (!empty($obj)) {
  286.                         $this->db->query("UPDATE `pim_odoo_products` SET opencart_id = '$oc_product->product_id' WHERE pim_id = '$pim_id'");
  287.                         $obj->save();
  288.                     }
  289.                 }
  290.             }
  291.         }
  292.         // Логика создания товаров в Оду и Сайте
  293.         $items $this->db->fetchAll("SELECT * FROM pim_tasks WHERE upload_status IS NULL AND type = 'product' AND action = 'CRE' ORDER BY pim_id DESC");
  294.         if (count($items)) {
  295.             try {
  296.                 foreach ($items as $item) {
  297.                     $db_id $item['id'];
  298.                     $pim_id $item['pim_id'];
  299.                     $product DataObject::getById($pim_id);
  300.     
  301.                     if (is_null($product)) {
  302.                         $this->db->query("DELETE FROM `pim_tasks` WHERE `pim_id` = '$pim_id'");
  303.                         echo '<div class="alert alert-info" role="alert">'.$pim_id.' skipped. Товара уже не существует.</div>';
  304.                         continue;
  305.                     }
  306.     
  307.                     if (empty($product->getManufacturer()) || empty($product->getCategory())) {
  308.                         echo '<div class="alert alert-info" role="alert">'.$pim_id.' skipped. Нет бренда или категории.</div>';
  309.                         continue;
  310.                     }
  311.                     
  312.                     if (!$product->getOdooId()) {
  313.                         $odoo_exist $this->odooExport->searchOdooProductBySKU($product->getKey());
  314.                         if ($odoo_exist) {
  315.                             $this->mmConfig->setPimOdooId((int)$odoo_exist$product->getId());
  316.                         } else {
  317.                             $this->odooExport->createOdooProductFromObject($product);
  318.                             echo '<div class="alert alert-primary" role="alert">'.$pim_id.' выгружен в CRM</div>';
  319.                         }
  320.                     }
  321.     
  322.                     // Экспорт нового товара на сайт
  323.                     if (empty($product->getphotomain())) {
  324.                         echo '<div class="alert alert-info" role="alert">'.$pim_id.' skipped. Нет главного фото.</div>';
  325.                         continue;
  326.                     }
  327.                     if (!$product->getOpencartId()) {
  328.                         $opencart_id_exist_on_site $this->opencart->getProductBySKU($product->getkey());
  329.                         if ($opencart_id_exist_on_site) {
  330.                             $this->mmConfig->setPimOpencartId($opencart_id_exist_on_site$product->getkey());
  331.                             $this->mmConfig->insertPimTaskUpdate($product->getid());
  332.                             $this->db->query("DELETE FROM `pim_tasks` WHERE `pim_id` = '$pim_id'");
  333.                         } else {
  334.                             $create json_decode($this->opencart->createProduct($product));
  335.                             var_dump($create);
  336.                             if (is_null($create)) {
  337.                                 $opencart_id_exist_on_site $this->opencart->getProductBySKU($product->getkey());
  338.                                 if ($opencart_id_exist_on_site) {
  339.                                     $this->mmConfig->setPimOpencartId($opencart_id_exist_on_site$product->getkey());
  340.                                     $this->mmConfig->insertPimTaskUpdate($product->getid());
  341.                                     $this->db->query("DELETE FROM `pim_tasks` WHERE `pim_id` = '$pim_id'");
  342.                                 }
  343.                             } else {
  344.                                 foreach ($create->products as $sku => $opencartId) {
  345.                                     $this->mmConfig->setPimOpencartId($opencartId$sku);
  346.                                     echo '<div class="alert alert-primary" role="alert">'.$pim_id.' выгружен на сайт</div>';
  347.                                 }
  348.                             }
  349.                         }
  350.                     }
  351.     
  352.                     // Отмечаю экспорт товара как выполненный
  353.                     $this->db->exec("UPDATE pim_tasks SET upload_status=1 WHERE id = $db_id");
  354.                 }
  355.             } catch (Exception $e) {
  356.                 Telegram::send("Ошибка при обновлении товаров:\n" $e->getMessage(), 'pim_seo_errors');
  357.             }
  358.         } else {
  359.             echo '<div class="alert alert-warning" role="alert">Нет товаров на создание</div>';
  360.         }
  361.         // Выгрузка на сайт blogposts данных
  362.         $items $this->db->fetchAll("SELECT * FROM pim_tasks WHERE upload_status IS NULL AND type = 'blogpost' ORDER BY pim_id DESC");
  363.         if ($items) {
  364.             foreach ($items as $item) {
  365.                 $db_id $item['id'];
  366.                 $pim_id $item['pim_id'];
  367.                 $block DataObject::getById($pim_id);
  368.                 if (is_null($block)) {
  369.                     $this->db->query("DELETE FROM `pim_tasks` WHERE `pim_id` = '$pim_id'");
  370.                     echo '<div class="alert alert-info" role="alert">'.$pim_id.' skipped. Статьи блога уже не существует.</div>';
  371.                     continue;
  372.                 }
  373.                 $block_info $this->opencart->prepareBlogPostItem($block);
  374.                 $this->opencart->uloadBlogPostItem($block_info);
  375.                 // Отмечаю экспорт товара как выполненный
  376.                 $this->db->exec("UPDATE pim_tasks SET upload_status=1 WHERE id = $db_id");
  377.             }
  378.         } else {
  379.             echo '<div class="alert alert-warning" role="alert">Нет статей блога на обновление или создание</div>';
  380.         }
  381.         // Логика обновления товаров
  382.         $items $this->db->fetchAll("SELECT id, pim_id FROM pim_tasks WHERE (upload_status IS NULL OR upload_status = '1') AND type = 'product' AND action = 'UPD' LIMIT 100");
  383.         if (count($items)) {
  384.             foreach ($items as $item) {
  385.                 $db_id $item['id'];
  386.                 $pim_id $item['pim_id'];
  387.                 $product DataObject::getById($pim_id);
  388.                 if (is_null($product)) {
  389.                     $this->db->query("DELETE FROM `pim_tasks` WHERE `pim_id` = '$pim_id'");
  390.                     echo '<div class="alert alert-info" role="alert">'.$pim_id.' skipped. Товара уже не существует.</div>';
  391.                     continue;
  392.                 }
  393.                 $productid = (integer)$product->getOdooId();
  394.                 if (empty($productid)) {
  395.                     echo '<div class="alert alert-info" role="alert">'.$pim_id.' skipped. Нет ID с CRM.</div>';
  396.                     // Проверяем, существует ли такой товар
  397.                     $data $this->odooExport->searchProductIds($product->getkey());
  398.                     //var_dump($data);
  399.                     if ($data) {
  400.                         $odoo_id $data[0]['id'];
  401.                         $variant_id $data[0]['product_variant_id'][0];
  402.                         $this->db->exec("UPDATE pim_odoo_products SET odoo_id=$odoo_id, pp_odoo_id=$variant_id WHERE pim_id = $pim_id");
  403.                     } else {
  404.                         // Создаем товар
  405.                         $this->odooExport->createOdooProductFromObject($product);
  406.                         echo '<div class="alert alert-primary" role="alert">'.$pim_id.' выгружен в CRM</div>';
  407.                     }
  408.                     // Пытаемся найти товар, может он был создан в другом класе ранее
  409.                     //$this->db->query("DELETE FROM `pim_tasks` WHERE `pim_id` = '$pim_id'");
  410.                     continue;
  411.                 }
  412.                 if (empty($product->getManufacturer()) || empty($product->getCategory())) {
  413.                     echo '<div class="alert alert-info" role="alert">'.$pim_id.' skipped. Нет бренда или категории.</div>';
  414.                     continue;
  415.                 }
  416.                 if (empty($product->getphotomain())) {
  417.                     echo '<div class="alert alert-info" role="alert">'.$pim_id.' skipped. Нет главного фото.</div>';
  418.                     continue;
  419.                 }
  420.                 if (!$only_site) {
  421.                     $this->odooExport->updateOdooProductFromObject($productid$product);
  422.                 }
  423.                 if (!$product->getOpencartID()) {
  424.                     $opencart_id_exist_on_site $this->opencart->getProductBySKU($product->getkey());
  425.                     if ($opencart_id_exist_on_site) {
  426.                         $this->mmConfig->setPimOpencartId($opencart_id_exist_on_site$product->getkey());
  427.                         $this->mmConfig->insertPimTaskUpdate($product->getid());
  428.                         $this->db->query("DELETE FROM `pim_tasks` WHERE `pim_id` = '$pim_id' AND action = 'CRE'");
  429.                     } else {
  430.                         echo '<div class="alert alert-error" role="alert">'.$pim_id.' HAVE SOME ERRORS</div>';
  431.                     }
  432.                     //echo "Создаю...";
  433.                     // $create = json_decode($this->opencart->createProduct($product));
  434.                     // var_dump($create);
  435.                     // foreach ($create->products as $sku => $opencartId) {
  436.                     //     $this->mmConfig->setPimOpencartId($opencartId, $sku);
  437.                     //     $this->odooExport->updateOdooProductOpenCartID($product->getOdooId(), $opencartId);
  438.                     // }
  439.                     // echo '<div class="alert alert-primary" role="alert">'.$pim_id.' создан на сайте</div>';
  440.                 } else {
  441.                     //echo "Обновляю...";
  442.                     $update json_decode($this->opencart->updateProduct($product));
  443.                     if ($update) {
  444.                         foreach ($update->products as $sku => $opencartId) {
  445.                             $this->mmConfig->setPimOpencartId($opencartId$sku);
  446.                             echo '<div class="alert alert-primary" role="alert">'.$pim_id.' обновлен на сайте</div>';
  447.                         }
  448.                     }
  449.                 }
  450.                 // Отмечаю экспорт товара как выполненный
  451.                 $this->db->exec("UPDATE pim_tasks SET upload_status=2 WHERE id = $db_id");
  452.             }
  453.         }
  454.         // Чистим таблицу с очередью
  455.         $items $this->db->query("DELETE FROM pim_tasks 
  456.             WHERE timestamp < now() - interval 30 DAY 
  457.             AND upload_status = '1' 
  458.             AND type = 'product' 
  459.             AND action = 'CRE'");
  460.         $items $this->db->query("DELETE FROM pim_tasks WHERE timestamp < now() - interval 30 DAY AND upload_status = '2'");
  461.         $this->opencart->clearZeroProductSlug();
  462.         // Clean and completeness pim_odoo_products table
  463.         // $items = $this->db->fetchAll("SELECT id, pim_id FROM pim_odoo_products WHERE odoo_id IS NULL OR pp_odoo_id IS NULL AND pim_class_id != 54 LIMIT 30");
  464.         // foreach ($items as $item) {
  465.         //     $pim_id = $item['pim_id'];
  466.         //     $id = $item['id'];
  467.         //     $obj = DataObject::getById($pim_id);
  468.         //     if (!$obj) {
  469.         //         $this->db->query("DELETE FROM pim_odoo_products WHERE id = $id");
  470.         //         continue;
  471.         //     }
  472.         //     var_dump($item);
  473.         // }
  474.         } catch (Exception $e) {
  475.             Telegram::send("Ошибка при обновлении товаров:\n" $e->getMessage(), 'pim_seo_errors');
  476.         }
  477.         $response $this->render('StockBundle:Scripts:blank.html.twig', [
  478.             'title' => 'Синхронизация товаров',
  479.         ]);
  480.         return $response;
  481.     }
  482. }