]> gitweb.erp-flowers.ru Git - erp24_rep/yii-erp24/.git/commitdiff
Мерж с девом файла MarketplaceService.php
authorfomichev <vladimir.fomichev@erp-flowers.ru>
Fri, 8 Nov 2024 14:41:59 +0000 (17:41 +0300)
committerfomichev <vladimir.fomichev@erp-flowers.ru>
Fri, 8 Nov 2024 14:41:59 +0000 (17:41 +0300)
erp24/services/MarketplaceService.php

index 31517c928929cde4fbf664954f5b64428057fa06..c0ddbc2e290820080a289d5a222be51ccb93ad70 100644 (file)
@@ -164,4 +164,286 @@ class MarketplaceService
 
         return Json::encode($availableGuids);
     }
+
+    /**
+     * Статический метод для получения всей информации по продуктам, которая необходима для создания фида.
+     *
+     * @return array
+     */
+    public static function getAllProductsInfo($id)
+    {
+        $parents = ProductsClass::find()
+            ->select('category_id')
+            ->where(['tip' => 'marketplace'])
+            ->column();
+
+        $products = Products1c::find()
+            ->where(['tip' => 'products'])
+            ->andWhere(['not', ['components' => '']])
+            ->andWhere(['parent_id' => $parents])
+            ->all();
+
+        $count = (int)$id;
+        $selectedProducts = array_slice($products, 0, $count);
+
+        $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.";
+                Yii::error($message, __METHOD__);
+
+                // Запись ошибки в таблицу InfoLogs
+                InfoLogService::setInfoLog(
+                    __FILE__,
+                    __LINE__,
+                    $message,
+                    'Zero price error'
+                );
+                continue; // пропускаем продукт
+            }
+
+            $components = json_decode($product->components, true);
+            $composition = [];
+
+            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;
+    }
+
+
+    /**
+     * Статический метод для получения информации о заданном количестве продуктов.
+     *
+     * @param int $limit Количество продуктов, которые нужно получить.
+     * @return array
+     */
+    public static function getSomeProductsInfo($limit)
+    {
+        $products = Products1c::find()
+            ->where(['tip' => 'products'])
+            ->andWhere(['not', ['components' => '']])
+            ->limit($limit)
+            ->all();
+
+        $result = [];
+
+        foreach ($products as $index => $product) {
+            $components = json_decode($product->components, true);
+            $composition = [];
+
+            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' => 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),
+                'composition' => $composition,
+                'available' => self::getProductAvailability($product->id),
+                'category_id' => self::getProductCategory($product->id),
+                'params' => self::getProductParams($product->id) // Добавление параметров продукта
+            ];
+        }
+
+        return $result;
+    }
+
+    /**
+     * Статический метод для создания XML-фида на основе информации о продуктах.
+     *
+     * @param array $productsInfo
+     * @return string
+     */
+    public static function createXMLFeed($productsInfo)
+    {
+        $xml = new \SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?><yml_catalog/>');
+        $xml->addAttribute('date', date('Y-m-d H:i'));
+
+        $shop = $xml->addChild('shop');
+        $shop->addChild('name', 'Интернет магазин База Цветов 24');
+        $shop->addChild('company', 'Интернет магазин База Цветов 24');
+        $shop->addChild('url', 'https://bazacvetov24.ru');
+        $shop->addChild('platform', 'BSM/Yandex/Market');
+
+        // Добавление валюты
+        $currencies = $shop->addChild('currencies');
+        $currency = $currencies->addChild('currency');
+        $currency->addAttribute('id', 'RUB');
+        $currency->addAttribute('rate', '1');
+
+        // Добавление категорий (пример добавления нескольких категорий)
+        $categories = $shop->addChild('categories');
+        $category1 = $categories->addChild('category', 'Букеты');
+        $category1->addAttribute('id', '1');
+        $category2 = $categories->addChild('category', 'Цветы');
+        $category2->addAttribute('id', '2');
+
+        // Добавление офферов (продуктов)
+        $offers = $shop->addChild('offers');
+        foreach ($productsInfo as $product) {
+            $offer = $offers->addChild('offer');
+            $offer->addAttribute('id', $product['id']);
+            $offer->addAttribute('available', $product['available'] ? 'true' : 'false');
+
+            // Добавление URL продукта
+            $offer->addChild('url', 'https://bazacvetov24.ru/product/' . $product['id']);
+
+            // Добавление цены и валюты
+            $offer->addChild('price', $product['price']);
+            $offer->addChild('oldPrice', $product['oldprice']);
+            $offer->addChild('currencyId', 'RUB');
+            $offer->addChild('categoryId', $product['category_id']); // Здесь нужно указать правильный ID категории для продукта
+
+            // Добавление доступности доставки
+            $offer->addChild('delivery', 'true');
+
+            // Описание продукта
+            if (!empty($product['description'])) {
+                $offer->addChild('description', htmlspecialchars($product['description']));
+            }
+
+            // Добавление веса и количества
+            $offer->addChild('weight', $product['weight']);
+            //  $offer->addChild('qty', $product['qty']);
+            // $offer->addChild('amount', $product['amount']);
+            //   $offer->addChild('cost', $product['amount']);
+
+            foreach ($product['composition'] as $component) {
+                $consist = $offer->addChild('consist', $component['quantity']);
+                $consist->addAttribute('name', $component['name']);
+                $consist->addAttribute('unit', $component['unit']);
+                //   $consist->addAttribute('cost', 12);
+            }
+
+            // Добавление параметров
+            if (!empty($product['params'])) {
+                foreach ($product['params'] as $paramName => $paramValue) {
+                    $param = $offer->addChild('param', htmlspecialchars($paramValue));
+                    $param->addAttribute('name', htmlspecialchars($paramName));
+                }
+            }
+
+            // Название продукта
+            $offer->addChild('name', htmlspecialchars($product['name']));
+
+            // Добавление изображений продукта
+            if (!empty($product['pictures'])) {
+                foreach ($product['pictures'] as $picture) {
+                    $offer->addChild('picture', $picture);
+                }
+            }
+        }
+
+        return $xml->asXML();
+    }
+
+
+
+    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'];
+    }
+    private static function getProductPrice($productId) {
+        $price = Prices::find()
+            ->where(['product_id' => $productId])
+            ->one();
+        return $price['price'] ?? 0;
+    }
+    private static function getProductOldPrice($productId) { return 300; }
+    private static function getProductDescription($productId) { return 'Описание'; }
+    private static function getProductQty($productId) { return 9; }
+    private static function getProductWeight($productId) {
+        return 0.5;
+    }
+    private static function getProductCategory($productId) {
+        return 1;
+    }
+    private static function getProductMinOrder($productId) {
+        return 1;
+    }
+    private static function getProductAvailability($productId) {
+        return true;
+    }
+
+    private static function getProductMaterial($productId)
+    {
+        // Здесь можно реализовать логику получения материала продукта
+        return 'Цветы'; // Пример значения
+    }
+
+    private static function getProductWidth($productId)
+    {
+        // Здесь можно реализовать логику получения ширины продукта
+        return 18; // Пример значения
+    }
+
+    private static function getProductHeight($productId)
+    {
+        // Здесь можно реализовать логику получения высоты продукта
+        return 20; // Пример значения
+    }
+
+    private static function getProductLength($productId)
+    {
+        // Здесь можно реализовать логику получения длины продукта
+        return 9; // Пример значения
+    }
+
+    private static function getProductParams($productId)
+    {
+        return [
+
+            'Ширина, См' => self::getProductWidth($productId),
+            'Высота, См' => self::getProductHeight($productId),
+
+        ];
+    }
+
+
+
 }
\ No newline at end of file