<?php
namespace StockBundle\Controller;
use Pimcore\Controller\FrontendController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Routing\Annotation\Route;
use Pimcore\Log\ApplicationLogger;
use Pimcore\Tool\Session;
use Pimcore\Model\DataObject;
use Pimcore\Model\DataObject\ClassDefinition;
use StockBundle\Tools\OpencartConnector;
use StockBundle\Tools\OdooExport;
use StockBundle\Tools\OdooData;
use StockBundle\Tools\Common\MonkeyConfig;
use StockBundle\Tools\Common\Telegram;
use GuzzleHttp\Client;
class ScriptsController extends FrontendController
{
private $db;
private $logger;
private $odooExport;
private $mmConfig;
private $opencart;
private $pim_root_cat_id;
public function __construct()
{
$this->pim_root_cat_id = 56;
$this->db = \Pimcore\Db::get();
$this->logger = ApplicationLogger::getInstance();
$this->odooExport = new OdooExport();
$this->mmConfig = new MonkeyConfig();
$this->opencart = new OpencartConnector();
}
/**
* @Route("/scripts/upload-queue", name="upload_queue")
*/
public function uploadQueueAction(Request $request)
{
$this->logger->info('Очередь товаров проверена.');
$tasks = $this->db->query("SELECT pt.*, o.o_key, o.o_className
FROM pim_tasks as pt
LEFT JOIN objects as o ON pt.pim_id = o.o_id
WHERE pt.upload_status is NULL;");
$response = $this->render('StockBundle:Scripts:upload-queue.html.twig', [
'title' => 'Очередь выгрузки',
'tasks' => $tasks->fetchAll()
]);
return $response;
}
/**
* @Route("/rest/pim-odoo-prices-update", name="rest_pim_odoo_prices")
*/
public function restPimOdooPricesAction(Request $request)
{
if ($request->getMethod() != "POST") {
return $this->json(array('status' => 'FAIL'));
}
try {
$data = json_decode($request->getContent(), true);
foreach ($data['products'] as $product) {
$this->mmConfig->updateDataPimOdooProducts((object)$product);
}
} catch (Exception $e) {
return $this->json(array('status' => 'FAIL', "message" => $e->getMessage()));
}
return $this->json(array('status' => 'OK'));
}
/**
* @Route("/scripts/brand-and-category-sync", name="brand_and_category_sync")
*/
public function syncBrandCategoryAction(Request $request)
{
$this->logger->info('Синхронизация брендов и категорий запущена (syncBrandCategoryAction).');
// Создаем в Odoo бренды, у которых нет odoo_id
$items = DataObject\Manufacturer::getList([
"condition" => "odoo_id is Null",
]);
$items->load();
if (count($items)) {
foreach ($items as $brand) {
// Создаю в CRM
$id = $this->odooExport->createOdooManufacturer($brand->getkey());
$brand->setodoo_id($id);
$brand->save();
echo '<div class="alert alert-primary" role="alert">Бренд <b>'. $brand->getkey().'</b> выгружен в CRM</div>';
}
} else {
echo '<div class="alert alert-warning" role="alert">Нет брендов на выгрузку в CRM</div>';
}
// Выгрузка брендов на сайт
$items = DataObject\Manufacturer::getList([
"condition" => "site_id is Null",
]);
$items->load();
if (count($items)) {
$data = [];
foreach ($items as $b) {
echo $b->id . "<br>";
if (is_null($b)) {
continue;
}
$brandData = $this->opencart->prepareBrandData($b);
if ($brandData) {
$data[] = $brandData;
}
echo '<div class="alert alert-primary" role="alert">Бренд <b>'. $b->getkey().'</b> готов к выгрузке на сайт</div>';
}
$r = $this->opencart->uloadManufacturer($data);
if (is_null($r)) {
foreach ($items as $b) {
$siteId = $this->opencart->getManufacturerByName($b->getname());
if ($siteId) {
$b->setsite_id($siteId);
$b->save();
}
}
} else {
foreach ($r as $id=>$siteId) {
$manufacturer = DataObject::getById($id);
$manufacturer->setsite_id($siteId);
$manufacturer->save();
}
}
} else {
echo '<div class="alert alert-warning" role="alert">Нет брендов на выгрузку на сайт</div>';
}
// Обновляю бренды на сайте
$items = $this->mmConfig->selectPimBrandTask();
if ($items) {
foreach ($items as $brand) {
echo $brand['pim_id'] . "<br>";
$b = DataObject::getById($brand['pim_id']);
if (is_null($b)) {
continue;
}
$brandData = $this->opencart->prepareBrandData($b);
if ($brandData) {
$upload = $this->opencart->uloadManufacturer([$brandData]);
$this->mmConfig->uploadPimTaskStatusDone($brand['id']);
echo '<div class="alert alert-primary" role="alert">Бренд <b>'. $brand['id'].'</b> обновлен на сайте.</div>';
}
}
} else {
echo '<div class="alert alert-warning" role="alert">Нет брендов на обновение на сайте</div>';
}
// Выгрузка новых категорий на сайт
$items = DataObject\Category::getList([
"condition" => "site_id is Null",
]);
$items->load();
if (count($items)) {
$data = [];
foreach ($items as $c) {
$Data = $this->opencart->prepareCategoryData($c);
if ($Data) {
$data[] = $Data;
}
}
$r = (array)$this->opencart->uploadCategory($data);
foreach ($r as $id=>$siteId) {
$manufacturer = DataObject::getById($id);
$manufacturer->setsite_id($siteId);
$manufacturer->save();
echo '<div class="alert alert-primary" role="alert">Бренд <b>'. $manufacturer->getkey().'</b> обновлен на сайте.</div>';
}
} else {
echo '<div class="alert alert-warning" role="alert">Нет категорий на создание на сайте</div>';
}
// Создаем категории в CRM, у которых нет odoo_id
$categories_to_create = DataObject\Category::getList([
"condition" => "odoo_id is Null",
]);
$categories_to_create->load();
if (count($categories_to_create)) {
foreach ($categories_to_create as $cat) {
$name = $cat->getkey();
// Определяем родителя для категории
$parentId = $cat->getParentId();
if ($parentId == $this->pim_root_cat_id || strpos($cat->getPath(), "Синтетические/")) {
$parentIdFromOdoo = 2;
} else {
$parentIdFromOdoo = $cat->getValueFromParent('odoo_id');
}
$s = $this->odooExport->createOdooCategory([
'name' => $name,
'translit_name' => $cat->getslug(),
'parent_id' => $parentIdFromOdoo,
]);
if (is_int($s)) {
echo '<div class="alert alert-primary" role="alert">Категория '.$name.' создана.</div>';
$cat->setodoo_id($s);
$cat->save();
} else {
MonkeyConfig::print_pre($s);
echo "ОШИБКА ПРИ СОЗДАНИИ, СООБЩИТЕ ПРОГРАММИСТУ:<pre>"; print_r(gettype($s)); echo "</pre>";
}
}
} else {
echo '<div class="alert alert-warning" role="alert">Нет категорий на создание в Odoo</div>';
}
// Обновление категорий на сайте и в CRM
$items = $this->mmConfig->selectPimCategoryTask();
if ($items) {
foreach ($items as $c) {
$cat = DataObject::getById($c['pim_id']);
if (empty($cat)) {
continue;
}
$data = $this->opencart->prepareCategoryData($cat);
$upload = $this->opencart->uploadCategory([$data]);
echo '<div class="alert alert-primary" role="alert">Категория <b>'. $c['id'].'</b> обновлена на сайте.</div>';
// Обновляю в CRM
if (!$cat->getIsSyntetic()) {
$parentId = $cat->getParentId();
if ($parentId == $this->pim_root_cat_id || strpos($cat->getPath(), "Синтетические/")) {
$parentIdFromOdoo = 2;
} else {
$parentIdFromOdoo = $cat->getValueFromParent('odoo_id');
}
$data = [
'name' => $cat->getkey(),
'translit_name' => $cat->getslug(),
'parent_id' => $parentIdFromOdoo,
'property_cost_method' => 'fifo',
'property_valuation' => 'real_time'
];
$a = $this->odooExport->updateOdooCategory($data, $cat->getodoo_id());
}
$this->mmConfig->uploadPimTaskStatusDone($c['id']);
}
} else {
echo '<div class="alert alert-warning" role="alert">Нет категорий на обновление на сайте</div>';
}
$response = $this->render('StockBundle:Scripts:blank.html.twig', [
'title' => 'Синхронизация брендов и категорий',
]);
return $response;
}
/**
* @Route("/scripts/products-sync", name="products_sync")
*/
public function syncProductsAction(Request $request)
{
$only_site = $request->query->get('site');
$this->logger->info('Синхронизация товаров запущена (syncProductsAction).');
$date = date("Y-m-d");
try {
// Актуализируем названия
$products = $this->db->fetchAll("SELECT pim_id, pim_sku FROM `pim_odoo_products` WHERE `pim_sku` LIKE '%-tmp%'");
if ($products) {
foreach ($products as $p) {
$pim_id = $p['pim_id'];
$pim_sku = $p['pim_sku'];
$obj = DataObject::getById($pim_id);
$new_sku = $obj->getKey();
if ($new_sku != $pim_sku) {
$this->db->query("UPDATE `pim_odoo_products` SET pim_sku = '$new_sku' WHERE pim_id = '$pim_id'");
$obj->save();
}
}
}
// Достаем товары с 0 id opencart
$products = $this->db->fetchAll("SELECT pim_id, pim_sku FROM `pim_odoo_products` WHERE `opencart_id` = '0'");
if ($products) {
$data = [];
foreach ($products as $p) {
$data[$p['pim_sku']] = $p['pim_id'];
}
$opencart_products = $this->opencart->getProductQtyIds();
foreach ($opencart_products as $oc_product) {
if (array_key_exists($oc_product->sku, $data)) {
//echo $oc_product->sku . " exist!<br>";
$pim_id = $data[$oc_product->sku];
$obj = DataObject::getById($pim_id);
if (!empty($obj)) {
$this->db->query("UPDATE `pim_odoo_products` SET opencart_id = '$oc_product->product_id' WHERE pim_id = '$pim_id'");
$obj->save();
}
}
}
}
// Логика создания товаров в Оду и Сайте
$items = $this->db->fetchAll("SELECT * FROM pim_tasks WHERE upload_status IS NULL AND type = 'product' AND action = 'CRE' ORDER BY pim_id DESC");
if (count($items)) {
try {
foreach ($items as $item) {
$db_id = $item['id'];
$pim_id = $item['pim_id'];
$product = DataObject::getById($pim_id);
if (is_null($product)) {
$this->db->query("DELETE FROM `pim_tasks` WHERE `pim_id` = '$pim_id'");
echo '<div class="alert alert-info" role="alert">'.$pim_id.' skipped. Товара уже не существует.</div>';
continue;
}
if (empty($product->getManufacturer()) || empty($product->getCategory())) {
echo '<div class="alert alert-info" role="alert">'.$pim_id.' skipped. Нет бренда или категории.</div>';
continue;
}
if (!$product->getOdooId()) {
$odoo_exist = $this->odooExport->searchOdooProductBySKU($product->getKey());
if ($odoo_exist) {
$this->mmConfig->setPimOdooId((int)$odoo_exist, $product->getId());
} else {
$this->odooExport->createOdooProductFromObject($product);
echo '<div class="alert alert-primary" role="alert">'.$pim_id.' выгружен в CRM</div>';
}
}
// Экспорт нового товара на сайт
if (empty($product->getphotomain())) {
echo '<div class="alert alert-info" role="alert">'.$pim_id.' skipped. Нет главного фото.</div>';
continue;
}
if (!$product->getOpencartId()) {
$opencart_id_exist_on_site = $this->opencart->getProductBySKU($product->getkey());
if ($opencart_id_exist_on_site) {
$this->mmConfig->setPimOpencartId($opencart_id_exist_on_site, $product->getkey());
$this->mmConfig->insertPimTaskUpdate($product->getid());
$this->db->query("DELETE FROM `pim_tasks` WHERE `pim_id` = '$pim_id'");
} else {
$create = json_decode($this->opencart->createProduct($product));
var_dump($create);
if (is_null($create)) {
$opencart_id_exist_on_site = $this->opencart->getProductBySKU($product->getkey());
if ($opencart_id_exist_on_site) {
$this->mmConfig->setPimOpencartId($opencart_id_exist_on_site, $product->getkey());
$this->mmConfig->insertPimTaskUpdate($product->getid());
$this->db->query("DELETE FROM `pim_tasks` WHERE `pim_id` = '$pim_id'");
}
} else {
foreach ($create->products as $sku => $opencartId) {
$this->mmConfig->setPimOpencartId($opencartId, $sku);
echo '<div class="alert alert-primary" role="alert">'.$pim_id.' выгружен на сайт</div>';
}
}
}
}
// Отмечаю экспорт товара как выполненный
$this->db->exec("UPDATE pim_tasks SET upload_status=1 WHERE id = $db_id");
}
} catch (Exception $e) {
Telegram::send("Ошибка при обновлении товаров:\n" . $e->getMessage(), 'pim_seo_errors');
}
} else {
echo '<div class="alert alert-warning" role="alert">Нет товаров на создание</div>';
}
// Выгрузка на сайт blogposts данных
$items = $this->db->fetchAll("SELECT * FROM pim_tasks WHERE upload_status IS NULL AND type = 'blogpost' ORDER BY pim_id DESC");
if ($items) {
foreach ($items as $item) {
$db_id = $item['id'];
$pim_id = $item['pim_id'];
$block = DataObject::getById($pim_id);
if (is_null($block)) {
$this->db->query("DELETE FROM `pim_tasks` WHERE `pim_id` = '$pim_id'");
echo '<div class="alert alert-info" role="alert">'.$pim_id.' skipped. Статьи блога уже не существует.</div>';
continue;
}
$block_info = $this->opencart->prepareBlogPostItem($block);
$this->opencart->uloadBlogPostItem($block_info);
// Отмечаю экспорт товара как выполненный
$this->db->exec("UPDATE pim_tasks SET upload_status=1 WHERE id = $db_id");
}
} else {
echo '<div class="alert alert-warning" role="alert">Нет статей блога на обновление или создание</div>';
}
// Логика обновления товаров
$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");
if (count($items)) {
foreach ($items as $item) {
$db_id = $item['id'];
$pim_id = $item['pim_id'];
$product = DataObject::getById($pim_id);
if (is_null($product)) {
$this->db->query("DELETE FROM `pim_tasks` WHERE `pim_id` = '$pim_id'");
echo '<div class="alert alert-info" role="alert">'.$pim_id.' skipped. Товара уже не существует.</div>';
continue;
}
$productid = (integer)$product->getOdooId();
if (empty($productid)) {
echo '<div class="alert alert-info" role="alert">'.$pim_id.' skipped. Нет ID с CRM.</div>';
// Проверяем, существует ли такой товар
$data = $this->odooExport->searchProductIds($product->getkey());
//var_dump($data);
if ($data) {
$odoo_id = $data[0]['id'];
$variant_id = $data[0]['product_variant_id'][0];
$this->db->exec("UPDATE pim_odoo_products SET odoo_id=$odoo_id, pp_odoo_id=$variant_id WHERE pim_id = $pim_id");
} else {
// Создаем товар
$this->odooExport->createOdooProductFromObject($product);
echo '<div class="alert alert-primary" role="alert">'.$pim_id.' выгружен в CRM</div>';
}
// Пытаемся найти товар, может он был создан в другом класе ранее
//$this->db->query("DELETE FROM `pim_tasks` WHERE `pim_id` = '$pim_id'");
continue;
}
if (empty($product->getManufacturer()) || empty($product->getCategory())) {
echo '<div class="alert alert-info" role="alert">'.$pim_id.' skipped. Нет бренда или категории.</div>';
continue;
}
if (empty($product->getphotomain())) {
echo '<div class="alert alert-info" role="alert">'.$pim_id.' skipped. Нет главного фото.</div>';
continue;
}
if (!$only_site) {
$this->odooExport->updateOdooProductFromObject($productid, $product);
}
if (!$product->getOpencartID()) {
$opencart_id_exist_on_site = $this->opencart->getProductBySKU($product->getkey());
if ($opencart_id_exist_on_site) {
$this->mmConfig->setPimOpencartId($opencart_id_exist_on_site, $product->getkey());
$this->mmConfig->insertPimTaskUpdate($product->getid());
$this->db->query("DELETE FROM `pim_tasks` WHERE `pim_id` = '$pim_id' AND action = 'CRE'");
} else {
echo '<div class="alert alert-error" role="alert">'.$pim_id.' HAVE SOME ERRORS</div>';
}
//echo "Создаю...";
// $create = json_decode($this->opencart->createProduct($product));
// var_dump($create);
// foreach ($create->products as $sku => $opencartId) {
// $this->mmConfig->setPimOpencartId($opencartId, $sku);
// $this->odooExport->updateOdooProductOpenCartID($product->getOdooId(), $opencartId);
// }
// echo '<div class="alert alert-primary" role="alert">'.$pim_id.' создан на сайте</div>';
} else {
//echo "Обновляю...";
$update = json_decode($this->opencart->updateProduct($product));
if ($update) {
foreach ($update->products as $sku => $opencartId) {
$this->mmConfig->setPimOpencartId($opencartId, $sku);
echo '<div class="alert alert-primary" role="alert">'.$pim_id.' обновлен на сайте</div>';
}
}
}
// Отмечаю экспорт товара как выполненный
$this->db->exec("UPDATE pim_tasks SET upload_status=2 WHERE id = $db_id");
}
}
// Чистим таблицу с очередью
$items = $this->db->query("DELETE FROM pim_tasks
WHERE timestamp < now() - interval 30 DAY
AND upload_status = '1'
AND type = 'product'
AND action = 'CRE'");
$items = $this->db->query("DELETE FROM pim_tasks WHERE timestamp < now() - interval 30 DAY AND upload_status = '2'");
$this->opencart->clearZeroProductSlug();
// Clean and completeness pim_odoo_products table
// $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");
// foreach ($items as $item) {
// $pim_id = $item['pim_id'];
// $id = $item['id'];
// $obj = DataObject::getById($pim_id);
// if (!$obj) {
// $this->db->query("DELETE FROM pim_odoo_products WHERE id = $id");
// continue;
// }
// var_dump($item);
// }
} catch (Exception $e) {
Telegram::send("Ошибка при обновлении товаров:\n" . $e->getMessage(), 'pim_seo_errors');
}
$response = $this->render('StockBundle:Scripts:blank.html.twig', [
'title' => 'Синхронизация товаров',
]);
return $response;
}
}