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;
class MarketplaceService
{
+
+ private const CATEGORIES_WITH_SUBCATEGORIES = [
+ "Цветы" => [
+ "Монобукеты",
+ "Авторские букеты",
+ "Цветы в коробке",
+ "Цветы в корзине",
+ "Букеты невесты",
+ "Композиции из цветов",
+ "Мягкие игрушки",
+ "Подарочные наборы",
+ "Мишки из роз",
+ "Открытки",
+ "Стабилизированные цветы",
+ "Букеты из сухоцветов",
+ "Искусственные цветы",
+ "Цветы в ящиках",
+ "Другое",
+ "Цветы поштучно",
+ "Траурные цветы",
+ "Букеты из мыла",
+ "Цветы для интерьера",
+ ],
+ "Живые растения" => [
+ "Цветы в горшках",
+ "Флорариумы",
+ "Суккуленты, кактусы",
+ "Бонсаи",
+ "Пальмы и деревья",
+ "Левитирующие растения",
+ "Саженцы и рассада",
+ "Фитокартины",
+ "Семена",
+ "Другое",
+ "Кашпо и горшки для цветов",
+ "Наборы для выращивания",
+ "Грунты и удобрения",
+ "Аксессуары для комнатных растений",
+ "Спатифиллумы",
+ "Замиокулькасы",
+ "Антуриумы"
+ ]
+ ];
+
public static function infoForMarketplace(int $marketId, bool $is_yandex) {
if (!array_key_exists($marketId, MarketplaceStore::getWarehouseId()))
return;
{
$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;
$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 = [];
}
}
+ $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-фида на основе информации о продуктах.
*
$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');
}
+ 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])
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;
}