]> gitweb.erp-flowers.ru Git - erp24_rep/yii-erp24/.git/commitdiff
Добавление свойств
authorfomichev <vladimir.fomichev@erp-flowers.ru>
Mon, 11 Nov 2024 10:23:51 +0000 (13:23 +0300)
committerfomichev <vladimir.fomichev@erp-flowers.ru>
Mon, 11 Nov 2024 10:23:51 +0000 (13:23 +0300)
erp24/services/MarketplaceService.php

index c0ddbc2e290820080a289d5a222be51ccb93ad70..b99f3c85f3346cd30593774736d6e6b1c2fd8461 100644 (file)
@@ -2,11 +2,14 @@
 
 namespace yii_app\services;
 
+use Yii;
 use yii\helpers\ArrayHelper;
 use yii\helpers\Json;
 use yii_app\records\Balances;
 use yii_app\records\MarketplacePriority;
 use yii_app\records\MarketplaceStore;
+use yii_app\records\MatrixErpMedia;
+use yii_app\records\MatrixErpProperty;
 use yii_app\records\Prices;
 use yii_app\records\Products1c;
 use yii_app\records\ProductsClass;
@@ -14,6 +17,50 @@ use yii_app\records\ProductsClass;
 class MarketplaceService
 {
 
+
+    private const CATEGORIES_WITH_SUBCATEGORIES = [
+        "Цветы" => [
+            "Монобукеты",
+            "Авторские букеты",
+            "Цветы в коробке",
+            "Цветы в корзине",
+            "Букеты невесты",
+            "Композиции из цветов",
+            "Мягкие игрушки",
+            "Подарочные наборы",
+            "Мишки из роз",
+            "Открытки",
+            "Стабилизированные цветы",
+            "Букеты из сухоцветов",
+            "Искусственные цветы",
+            "Цветы в ящиках",
+            "Другое",
+            "Цветы поштучно",
+            "Траурные цветы",
+            "Букеты из мыла",
+            "Цветы для интерьера",
+        ],
+        "Живые растения" => [
+            "Цветы в горшках",
+            "Флорариумы",
+            "Суккуленты, кактусы",
+            "Бонсаи",
+            "Пальмы и деревья",
+            "Левитирующие растения",
+            "Саженцы и рассада",
+            "Фитокартины",
+            "Семена",
+            "Другое",
+            "Кашпо и горшки для цветов",
+            "Наборы для выращивания",
+            "Грунты и удобрения",
+            "Аксессуары для комнатных растений",
+            "Спатифиллумы",
+            "Замиокулькасы",
+            "Антуриумы"
+        ]
+    ];
+
     public static function infoForMarketplace(int $marketId, bool $is_yandex) {
         if (!array_key_exists($marketId, MarketplaceStore::getWarehouseId()))
             return;
@@ -174,13 +221,15 @@ class MarketplaceService
     {
         $parents = ProductsClass::find()
             ->select('category_id')
-            ->where(['tip' => 'marketplace'])
+            ->orWhere(['ilike', 'tip', ProductsClass::MARKETPLACE])
+            ->orWhere(['ilike', 'tip', ProductsClass::MARKETPLACE_ADDITIONAL])
             ->column();
 
         $products = Products1c::find()
             ->where(['tip' => 'products'])
             ->andWhere(['not', ['components' => '']])
             ->andWhere(['parent_id' => $parents])
+
             ->all();
 
         $count = (int)$id;
@@ -189,76 +238,39 @@ class MarketplaceService
         $result = [];
 
         foreach ($selectedProducts as $product) {
-            $price = self::getProductPrice($product->id);
 
-            // Логируем ошибку и пропускаем продукт, если цена равна 0
-            if ($price == 0) {
-                $message = "Product ID {$product->id} has zero price and will be excluded from the feed.";
+            $properties = MarketplaceService::getProductPropertiesByGuid($product->guid);
+            if (!$properties) {
+                $message = "Товар с GUID {$product->guid} не имеет свойств в MatrixErpProperty и был исключен из фида.";
                 Yii::error($message, __METHOD__);
 
-                // Запись ошибки в таблицу InfoLogs
+
                 InfoLogService::setInfoLog(
                     __FILE__,
                     __LINE__,
                     $message,
-                    'Zero price error'
+                    'Missing properties error'
                 );
-                continue; // пропускаем продукт
+                continue;
             }
 
-            $components = json_decode($product->components, true);
-            $composition = [];
+            $price = MarketplaceService::getProductPrice($product->id);
 
-            foreach ($components as $componentId => $quantity) {
-                $component = Products1c::findOne(['id' => $componentId]);
-                if ($component && $quantity > 0) {
-                    $composition[] = [
-                        'name' => $component->name,
-                        'quantity' => $quantity,
-                        'unit' => 'шт'
-                    ];
-                }
-            }
-
-            $result[] = [
-                'id' => $product->id,
-                'name' => $product->name,
-                'pictures' => self::getProductPictureUrl($product->id),
-                'price' => $price,
-                'oldprice' => self::getProductOldPrice($product->id),
-                'description' => self::getProductDescription($product->id),
-                'qty' => self::getProductQty($product->id),
-                'amount' => self::getProductQty($product->id),
-                'weight' => self::getProductWeight($product->id),
-                'minorder' => self::getProductMinOrder($product->id),
-                'composition' => $composition,
-                'available' => self::getProductAvailability($product->id),
-                'category_id' => self::getProductCategory($product->id),
-                'params' => self::getProductParams($product->id)
-            ];
-        }
-
-        return $result;
-    }
 
+            if ($price == 0) {
+                $message = "У товара {$product->id} отсутствует цена и он будет исключен из фида.";
+                Yii::error($message, __METHOD__);
 
-    /**
-     * Статический метод для получения информации о заданном количестве продуктов.
-     *
-     * @param int $limit Количество продуктов, которые нужно получить.
-     * @return array
-     */
-    public static function getSomeProductsInfo($limit)
-    {
-        $products = Products1c::find()
-            ->where(['tip' => 'products'])
-            ->andWhere(['not', ['components' => '']])
-            ->limit($limit)
-            ->all();
 
-        $result = [];
+                InfoLogService::setInfoLog(
+                    __FILE__,
+                    __LINE__,
+                    $message,
+                    'Zero price error'
+                );
+                continue;
+            }
 
-        foreach ($products as $index => $product) {
             $components = json_decode($product->components, true);
             $composition = [];
 
@@ -273,27 +285,32 @@ class MarketplaceService
                 }
             }
 
+            $properties = MarketplaceService::getProductPropertiesByGuid($product->id);
+
             $result[] = [
                 'id' => $product->id,
-                'name' => $product->name,
-                'pictures' => self::getProductPictureUrl($product->id),
-                'price' => self::getProductPrice($product->id),
-                'oldprice' => self::getProductOldPrice($product->id),
-                'description' => self::getProductDescription($product->id),
-                'qty' => self::getProductQty($product->id),
-                'amount' => self::getProductQty($product->id),
-                'weight' => self::getProductWeight($product->id),
-                'minorder' => self::getProductMinOrder($product->id),
+                'name' => $properties['displayName'],
+                'pictures' => MarketplaceService::getProductImageUrl($product->id),
+                'price' => $price,
+                'oldprice' => MarketplaceService::getProductOldPrice($product->id),
+                'description' => MarketplaceService::getProductDescription($product->id),
+                'qty' => MarketplaceService::getProductQty($product->id),
+                'amount' => MarketplaceService::getProductQty($product->id),
+                'weight' => MarketplaceService::getProductWeight($product->id),
+                'minorder' => MarketplaceService::getProductMinOrder($product->id),
                 'composition' => $composition,
-                'available' => self::getProductAvailability($product->id),
-                'category_id' => self::getProductCategory($product->id),
-                'params' => self::getProductParams($product->id) // Добавление параметров продукта
+                'available' => MarketplaceService::getProductAvailability($product->id),
+                'category_id' => MarketplaceService::getProductCategory($product->id),
+                'category_name' => $properties['flowwowSubcategory'],
+                'params' => MarketplaceService::getProductParams($product->id),
+                'productLink' => MarketplaceService::getProductLinkByGuid($product->guid),
             ];
         }
 
         return $result;
     }
 
+
     /**
      * Статический метод для создания XML-фида на основе информации о продуктах.
      *
@@ -318,11 +335,23 @@ class MarketplaceService
         $currency->addAttribute('rate', '1');
 
         // Добавление категорий (пример добавления нескольких категорий)
+        $uniqueCategories = [];
+        foreach ($productsInfo as $product) {
+            $categoryId = $product['category_id'];
+            $categoryName = $product['category_name'];
+
+
+            if (!isset($uniqueCategories[$categoryId])) {
+                $uniqueCategories[$categoryId] = $categoryName;
+            }
+        }
+
+
         $categories = $shop->addChild('categories');
-        $category1 = $categories->addChild('category', 'Букеты');
-        $category1->addAttribute('id', '1');
-        $category2 = $categories->addChild('category', 'Цветы');
-        $category2->addAttribute('id', '2');
+        foreach ($uniqueCategories as $id => $name) {
+            $category = $categories->addChild('category', htmlspecialchars($name));
+            $category->addAttribute('id', $id);
+        }
 
         // Добавление офферов (продуктов)
         $offers = $shop->addChild('offers');
@@ -384,10 +413,43 @@ class MarketplaceService
     }
 
 
+    private static function getProductPropertiesByGuid($guid) {
+        $product = MatrixErpProperty::find()
+            ->where(['guid' => $guid])
+            ->one();
+
+        if (!$product) {
+            return null; // Вернуть null, если продукт не найден
+        }
+
+        return [
+            'id' => $product->id,
+            'description' => $product->description,
+            'imageUrl' => self::getProductImageUrl($product->image_id),
+            'date' => $product->date,
+            'displayName' => $product->display_name,
+            'externalImageUrl' => $product->external_image_url,
+            'productUrl' => $product->product_url,
+            'flowwowCategory' => $product->flowwow_category,
+            'flowwowSubcategory' => $product->flowwow_subcategory,
+        ];
+    }
+
+    private static function getProductImageUrl($imageId) {
+        $mediaRecord = MatrixErpMedia::find()
+            ->where(['name' => $imageId])
+            ->one();
 
-    private static function getProductPictureUrl($productId) {
-        return ['https://bazacvetov24.ru/products/8798/29-krasnykh-i-belykh-roz_10919_lg.jpg', 'https://bazacvetov24.ru/products/5339/51-roza-premium_3326_md.jpg'];
+        if ($mediaRecord && $mediaRecord->file_id) {
+            return 'https://media.dev.erp-flowers.ru/media/view?id=' . $mediaRecord->file_id;
+        }
+
+        return null; // Возвращаем null, если изображение не найдено
+    }
+    private static function getProductLinkByGuid($guid) {
+        return 'https://media.dev.erp-flowers.ru/media/view-card?guid=' . urlencode($guid);
     }
+
     private static function getProductPrice($productId) {
         $price = Prices::find()
             ->where(['product_id' => $productId])
@@ -395,14 +457,54 @@ class MarketplaceService
         return $price['price'] ?? 0;
     }
     private static function getProductOldPrice($productId) { return 300; }
-    private static function getProductDescription($productId) { return 'Описание'; }
+    private static function getProductDescription($productId) {
+
+        $product = MatrixErpProperty::find()
+            ->where(['guid' => $productId])
+            ->one();
+
+        if (!$product) {
+            return null; // Вернуть null, если продукт не найден
+        }
+
+        return $product->description;
+    }
     private static function getProductQty($productId) { return 9; }
     private static function getProductWeight($productId) {
         return 0.5;
     }
     private static function getProductCategory($productId) {
-        return 1;
+
+        $product = MatrixErpProperty::find()
+            ->where(['guid' => $productId])
+            ->one();
+
+        if (!$product) {
+            return null;
+        }
+
+        return  self::getCategorySubcategoryId($product->flowwow_category, $product->flowwow_subcategory);
+    }
+
+    public static function getCategorySubcategoryId($category, $subcategory)
+    {
+        $categories = self::CATEGORIES_WITH_SUBCATEGORIES;
+
+        if (!array_key_exists($category, $categories)) {
+            return null;
+        }
+
+        $categoryIndex = array_search($category, array_keys($categories)) + 1;
+        $subcategoryIndex = array_search($subcategory, $categories[$category]) + 1;
+
+        if ($subcategoryIndex === false) {
+            return null;
+        }
+
+
+        return (string)$categoryIndex . (string)$subcategoryIndex;
     }
+
     private static function getProductMinOrder($productId) {
         return 1;
     }