class MarketplaceService
{
-
+ // Порядок основных категорий (Цветы, Живые растения) не менять, добавлять в конец массива
private const CATEGORIES_WITH_SUBCATEGORIES = [
"Цветы" => [
- "Монобукеты",
- "Авторские букеты",
- "Цветы в коробке",
- "Цветы в корзине",
- "Букеты невесты",
- "Композиции из цветов",
- "Мягкие игрушки",
- "Подарочные наборы",
- "Мишки из роз",
- "Открытки",
- "Стабилизированные цветы",
- "Букеты из сухоцветов",
- "Искусственные цветы",
- "Цветы в ящиках",
- "Другое",
- "Цветы поштучно",
- "Траурные цветы",
- "Букеты из мыла",
- "Цветы для интерьера",
+ 1 => "Монобукеты",
+ 2 => "Авторские букеты",
+ 3 => "Цветы в коробке",
+ 4 => "Цветы в корзине",
+ 5 => "Букеты невесты",
+ 6 => "Композиции из цветов",
+ 7 => "Мягкие игрушки",
+ 8 => "Подарочные наборы",
+ 9 => "Мишки из роз",
+ 10 => "Открытки",
+ 11 => "Стабилизированные цветы",
+ 12 => "Букеты из сухоцветов",
+ 13 => "Искусственные цветы",
+ 14 => "Цветы в ящиках",
+ 15 => "Другое",
+ 16 => "Цветы поштучно",
+ 17 => "Траурные цветы",
+ 18 => "Букеты из мыла",
+ 19 => "Цветы для интерьера",
],
"Живые растения" => [
- "Цветы в горшках",
- "Флорариумы",
- "Суккуленты, кактусы",
- "Бонсаи",
- "Пальмы и деревья",
- "Левитирующие растения",
- "Саженцы и рассада",
- "Фитокартины",
- "Семена",
- "Другое",
- "Кашпо и горшки для цветов",
- "Наборы для выращивания",
- "Грунты и удобрения",
- "Аксессуары для комнатных растений",
- "Спатифиллумы",
- "Замиокулькасы",
- "Антуриумы"
+ 1 => "Цветы в горшках",
+ 2 => "Флорариумы",
+ 3 => "Суккуленты, кактусы",
+ 4 => "Бонсаи",
+ 5 => "Пальмы и деревья",
+ 6 => "Левитирующие растения",
+ 7 => "Саженцы и рассада",
+ 8 => "Фитокартины",
+ 9 => "Семена",
+ 10 => "Другое",
+ 11 => "Кашпо и горшки для цветов",
+ 12 => "Наборы для выращивания",
+ 13 => "Грунты и удобрения",
+ 14 => "Аксессуары для комнатных растений",
+ 15 => "Спатифиллумы",
+ 16 => "Замиокулькасы",
+ 17 => "Антуриумы",
]
];
$productsGuidsIds = array_column($productsGuids, 'id');
- //var_dump( $productsGuidsIds);
+
// 2. Получение цен на букеты
- //$prices = ArrayHelper::map(Prices::findAll(['product_id' => ArrayHelper::getColumn($productsGuids, 'id')]), 'product_id', 'price');
+ $prices = ArrayHelper::map(Prices::findAll(['product_id' => ArrayHelper::getColumn($productsGuids, 'id')]), 'product_id', 'price');
- $allPrices = Prices::findAll(['product_id' => $productsGuidsIds]);
+ /* $allPrices = Prices::findAll(['product_id' => $productsGuidsIds]);
if (empty($allPrices)) {
Yii::warning('Не найдено цен для GUID.');
} elseif (!is_scalar($productId)) {
Yii::warning('Invalid productId type: ' . gettype($productId));
}
- }
+ }*/
+
- //var_dump($prices);
// 3. Получение состава букетов
$bouquetComposition = [];
}
}
$componentsGuids = array_unique($componentsGuids);
- //var_dump($componentsGuids);
+
// 4. Проверка остатков
$marketplaceStores = array_column(MarketplaceStore::findAll(['warehouse_id' => $marketId]), null, 'guid');
$balance2Dim[$balance['store_id']][$balance['product_id']] = $balance['quantity'];
$balanceStoreIds[] = $balance['store_id'];
}
- //var_dump( $balanceStoreIds );
+
$balanceStoreIds = array_unique($balanceStoreIds);
foreach ($bouquetComposition as $guid => $products) {
$stocks[$guid] = ['count' => $bouquetCount, 'store' => $store];
}
}
- //var_dump(ArrayHelper::getColumn($productsGuids, 'id'));
+
// 5. Получение приоритетов
$priorities = MarketplacePriority::find()
->where(['guid' => ArrayHelper::getColumn($productsGuids, 'id')])->indexBy('guid')->asArray()->all();
- //var_dump($priorities);
+
// 6. Массив для хранения гуидов, которые можно отправить
$availableGuids = [];
}
}
- // var_dump($availableGuids);
+
$distribution = [];
foreach ($availableGuids as $product) {
$koefRemain = $priority['reminder_koef'];
$totalBouquets = intval($stock['count'] / $koefRemain); // С учетом коэффициента
- // echo "<pre>"; var_dump($availableGuids); var_dump($totalBouquets); var_dump($stock); die;
+
if ($totalBouquets >= 2) {
// Равномерное распределение
foreach ($marketplaceStores as $store) {
}
// var_dump($distribution);
- return Json::encode($distribution);
+ return $distribution;
}
$price = MarketplaceService::getProductPrice($product->id);
- /* if ($price == 0) {
+ if ($price == 0) {
$message = "У товара {$product->id} отсутствует цена и он будет исключен из фида.";
Yii::error($message, __METHOD__);
-
-
- InfoLogService::setInfoLog(
+ InfoLogService::setInfoLog(
__FILE__,
__LINE__,
$message,
'Zero price error'
);
continue;
- }*/
+ }
$components = json_decode($product->components, true);
$composition = [];
}
- public static function getProductsInfoForFeed(int $warehouseGuid, $storeData)
+ public static function getProductsInfoForFeed(int $warehouseGuid, array $storeData)
{
- if (is_string($storeData)) {
- $storeData = json_decode($storeData, true);
-
-
- if (json_last_error() !== JSON_ERROR_NONE) {
- Yii::error('Невалидный JSON в storeData: ' . json_last_error_msg(), __METHOD__);
- return [];
- }
- }
-
-
if (!is_array($storeData)) {
Yii::error('Invalid data format for storeData; expected array.', __METHOD__);
return [];
$price = MarketplaceService::getProductPrice($product->id);
- /* if ($price == 0) {
+ if ($price == 0) {
$message = "У товара {$product->id} отсутствует цена и он будет исключен из фида.";
Yii::error($message, __METHOD__);
'Zero price error'
);
continue;
- }*/
+ }
$components = json_decode($product->components, true);
$composition = [];
'weight' => MarketplaceService::getProductWeight($product->id),
'minorder' => MarketplaceService::getProductMinOrder($product->id),
'composition' => $composition,
- 'available' => MarketplaceService::getProductAvailability($product->id),
+ 'available' => MarketplaceService::getProductAvailability($availableQty),
'category_id' => MarketplaceService::getProductCategory($product->id),
'category_name' => $properties['flowwowSubcategory'],
'params' => MarketplaceService::getProductParams($product->id),
// Добавление цены и валюты
$offer->addChild('price', $product['price']);
- $offer->addChild('oldPrice', $product['oldprice']);
+ // $offer->addChild('oldPrice', $product['oldprice']);
$offer->addChild('currencyId', 'RUB');
$offer->addChild('categoryId', $product['category_id']);
// Добавление доступности доставки
$offer->addChild('delivery', 'true');
+ // Название продукта
+ $offer->addChild('name', $product['name']);
+
// Описание продукта
if (!empty($product['description'])) {
$offer->addChild('description', $product['description']);
}
// Добавление веса и количества
- $offer->addChild('weight', $product['weight']);
- $offer->addChild('qty', $product['qty']);
+ // $offer->addChild('weight', $product['weight']);
+
+ if (!self::CATEGORIES_WITH_SUBCATEGORIES[0]) {
+ $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'])) {
+ /* if (!empty($product['params'])) {
foreach ($product['params'] as $paramName => $paramValue) {
$param = $offer->addChild('param', $paramValue);
$param->addAttribute('name', $paramName);
}
- }
+ }*/
+
- // Название продукта
- $offer->addChild('name', $product['name']);
// Добавление изображений продукта
if (!empty($product['pictures'])) {
->one();
if (!$product) {
- return null; // Вернуть null, если продукт не найден
+ return null;
}
return $product->description;
->one();
if (!$product) {
+ $message = "У товара {$product-> guid} отсутствует запись в таблице свойств.";
+ Yii::error($message, __METHOD__);
+ InfoLogService::setInfoLog(
+ __FILE__,
+ __LINE__,
+ $message,
+ 'No MatrixErpProperty'
+ );
return null;
}
$categories = self::CATEGORIES_WITH_SUBCATEGORIES;
if (!array_key_exists($category, $categories)) {
+
+ $message = "У категории {$category} отсутствует запись в таблице свойств.";
+ Yii::error($message, __METHOD__);
+ InfoLogService::setInfoLog(
+ __FILE__,
+ __LINE__,
+ $message,
+ 'No CATEGORIES'
+ );
return null;
}
$categoryIndex = array_search($category, array_keys($categories)) + 1;
- $subcategoryIndex = array_search($subcategory, $categories[$category]) + 1;
+
+ $subcategoryIndex = array_search($subcategory, $categories[$category]);
if ($subcategoryIndex === false) {
+ $message = "У подкатегории {$subcategoryIndex} отсутствует запись в таблице свойств.";
+ Yii::error($message, __METHOD__);
+ InfoLogService::setInfoLog(
+ __FILE__,
+ __LINE__,
+ $message,
+ 'No subcategoryIndex'
+ );
return null;
}
-
return (string)$categoryIndex . (string)$subcategoryIndex;
}
private static function getProductMinOrder($productId) {
return 1;
}
- private static function getProductAvailability($productId) {
- return true;
+ private static function getProductAvailability($availableQty) {
+ return $availableQty > 0;
}
private static function getProductMaterial($productId)