+++ /dev/null
-<?php
-
-namespace yii_app\actions\marketplace;
-
-use yii\base\Action;
-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\Prices;
-use yii_app\records\Products1c;
-use yii_app\records\ProductsClass;
-
-
-class InfoAboutStocksAndPrice extends Action
-{
- public function run()
- {
- $post = \Yii::$app->request->post();
- $marketId = $post['marketId'];
- $is_yandex = $post['is_yandex'];
-
- if (!array_key_exists($marketId, MarketplaceStore::getWarehouseId()))
- return;
-
- $marketplacesCount = count(MarketplaceStore::getWarehouseId());
-
- // 1. Получение гуидов букетов
- $productsGroup = ProductsClass::find()
- ->orWhere(['ilike', 'tip', ProductsClass::MARKETPLACE])
- ->orWhere(['ilike', 'tip', ProductsClass::MARKETPLACE_ADDITIONAL])
- ->select('category_id')
- ->asArray();
-
- $productsGuids = Products1c::find()
- ->andWhere(['in', 'parent_id', $productsGroup])
- ->andWhere(['<>', 'components', ''])
- ->select('id')
- ->column();
-
- // 2. Получение цен на букеты
- $prices = ArrayHelper::map(Prices::findAll(['product_id' => $productsGuids]), 'product_id', 'price');
-
- // 3. Получение состава букетов
- $bouquetComposition = [];
- foreach ($productsGuids as $guid) {
- $components = Products1c::find()
- ->andWhere(['id' => $guid])
- ->select('components')
- ->column();
-
- // Проверяем, что массив не пустой и строка валидна
- if (!empty($components) && !in_array('', $components, true)) {
- $bouquetComposition[$guid] = json_decode($components[0]); // Сохраняем компоненты
- }
- }
-
- // 4. Проверка остатков
-
- $marketplaceStores = array_column(MarketplaceStore::findAll(['warehouse_id' => $marketId]), null, 'guid');
-
- $stocks = [];
-
- foreach ($bouquetComposition as $guid => $products) {
- $stockRecords = [];
-
-
- foreach ($products as $product_id => $count) {
- // Получаем записи остатков для текущего product_id
- $balances = Balances::findAll(['product_id' => $product_id]);
-
- // Если записи остатков найдены, суммируем их
- foreach ($balances as $balance) {
- if (array_key_exists($balance->store_id, $marketplaceStores)) {
- $marketplace = $marketplaceStores[$balance->store_id];
- $stockRecords[$product_id] = ['store_guid' => $marketplace, 'count' => $balance->quantity, 'marketplace_guid' => $marketplace->warehouse_guid];
- }
- }
- }
-
-
- foreach ($stockRecords as $productGuid => $values) {
- $temp = intval($values['count'] / $products->$productGuid);
- $bouquetCount = !empty($bouquetCount) ? min($bouquetCount, $temp) : $temp;
- $store = $values['marketplace_guid'];
- }
-
- if ($bouquetCount > 0) {
- $stocks[$guid] = ['count' => $bouquetCount, 'store' => $store];
- }
- }
-
- // 5. Получение приоритетов
- $priorities = MarketplacePriority::findAll(['guid' => $productsGuids]);
-
- // 6. Массив для хранения гуидов, которые можно отправить
- $availableGuids = [];
-
- foreach ($productsGuids as $guid) {
- if (!array_key_exists($guid, $stocks)) {
- continue;
- }
-
- $stock = $stocks[$guid];
-
- $priority = MarketplacePriority::findOne(['guid' => $guid]);
-
- if (empty($priority)) {
- continue;
- }
- $minQuanity = $priority->minimal_quantity;
- $koefRemain = $priority->reminder_koef;
-
- // Учитываем количество букетов с коэффициентом
- $effectiveStock = floor($stock['count'] / $koefRemain);
-
-
- if (array_key_exists($guid, $prices)) {
- $price = $prices[$guid];
- } else {
- continue;
- }
-
- if (($effectiveStock >= $minQuanity)) {
- $availableGuids[] = array('guid' => $guid, 'count' => $stock['count'], 'price' => $price, 'store' => $stock['store']);// Добав// Добавляем GUID
- }
-
- }
-
- $distribution = [];
-
- foreach ($availableGuids as $product) {
- $stock = $stocks[$product['guid']];
-
- $priority = MarketplacePriority::findOne(['guid' => $guid]);
-
- if (empty($priority)) {
- continue;
- }
-
- $minQuanity = $priority->minimal_quantity;
- $koefRemain = $priority->reminder_koef;
-
- $totalBouquets = intval($stock['count'] / $koefRemain); // С учетом коэффициента
-
- if ($totalBouquets >= 2) {
- // Равномерное распределение
- foreach ($marketplaceStores as $store) {
- $distribution[$store->guid] = ($distribution[$store->guid] ?? 0) + floor($totalBouquets / count($marketplaceStores));
- }
- } elseif ($totalBouquets == 1 && $minQuanity == 1) {
- // Если минимальный остаток 1, отправляем только на Яндекс
- foreach ($marketplaceStores as $store) {
- if ($is_yandex) {
- $distribution[$store->guid] = ($distribution[$store->guid] ?? 0) + 1;
- }
- }
- } elseif ($totalBouquets > 1) {
- // Нечётное количество, большую часть на Яндекс
- foreach ($marketplaceStores as $store) {
- if ($is_yandex) {
- $distribution[$store->guid] = ($distribution[$store->guid] ?? 0) + ceil($totalBouquets / 2);
- } else {
- $distribution[$store->guid] = ($distribution[$store->guid] ?? 0) + floor($totalBouquets / 2);
- }
- }
- }
- }
-
- return Json::decode($availableGuids);
- }
-}
return [
'index' => \yii_app\actions\admin\IndexAction::class,
'add' => \yii_app\actions\admin\AddAction::class,
-
-
];
}
public function actions() {
return [
'priority' => \yii_app\actions\marketplace\PriorityAction::class,
- 'infoAboutStocksAndPrice' => \yii_app\actions\marketplace\InfoAboutStocksAndPrice::class,
];
}
}
\ No newline at end of file
--- /dev/null
+<?php
+
+namespace yii_app\services;
+
+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\Prices;
+use yii_app\records\Products1c;
+use yii_app\records\ProductsClass;
+
+class MarketplaceService
+{
+
+ public static function infoForMarketplace(int $marketId, bool $is_yandex) {
+ if (!array_key_exists($marketId, MarketplaceStore::getWarehouseId()))
+ return;
+
+ $marketplacesCount = count(MarketplaceStore::getWarehouseId());
+
+ // 1. Получение гуидов букетов
+ $productsGroup = ProductsClass::find()
+ ->orWhere(['ilike', 'tip', ProductsClass::MARKETPLACE])
+ ->orWhere(['ilike', 'tip', ProductsClass::MARKETPLACE_ADDITIONAL])
+ ->select('category_id')
+ ->asArray();
+
+ $productsGuids = Products1c::find()
+ ->andWhere(['in', 'parent_id', $productsGroup])
+ ->andWhere(['<>', 'components', ''])
+ ->select('id')
+ ->column();
+
+ // 2. Получение цен на букеты
+ $prices = ArrayHelper::map(Prices::findAll(['product_id' => $productsGuids]), 'product_id', 'price');
+
+ // 3. Получение состава букетов
+ $bouquetComposition = [];
+ foreach ($productsGuids as $guid) {
+ $components = Products1c::find()
+ ->andWhere(['id' => $guid])
+ ->select('components')
+ ->column();
+
+ // Проверяем, что массив не пустой и строка валидна
+ if (!empty($components) && !in_array('', $components, true)) {
+ $bouquetComposition[$guid] = json_decode($components[0]); // Сохраняем компоненты
+ }
+ }
+
+ // 4. Проверка остатков
+
+ $marketplaceStores = array_column(MarketplaceStore::findAll(['warehouse_id' => $marketId]), null, 'guid');
+
+ $stocks = [];
+
+ foreach ($bouquetComposition as $guid => $products) {
+ $stockRecords = [];
+
+
+ foreach ($products as $product_id => $count) {
+ // Получаем записи остатков для текущего product_id
+ $balances = Balances::findAll(['product_id' => $product_id]);
+
+ // Если записи остатков найдены, суммируем их
+ foreach ($balances as $balance) {
+ if (array_key_exists($balance->store_id, $marketplaceStores)) {
+ $marketplace = $marketplaceStores[$balance->store_id];
+ $stockRecords[$product_id] = ['store_guid' => $marketplace, 'count' => $balance->quantity, 'marketplace_guid' => $marketplace->warehouse_guid];
+ }
+ }
+ }
+
+
+ foreach ($stockRecords as $productGuid => $values) {
+ $temp = intval($values['count'] / $products->$productGuid);
+ $bouquetCount = !empty($bouquetCount) ? min($bouquetCount, $temp) : $temp;
+ $store = $values['marketplace_guid'];
+ }
+
+ if ($bouquetCount > 0) {
+ $stocks[$guid] = ['count' => $bouquetCount, 'store' => $store];
+ }
+ }
+
+ // 5. Получение приоритетов
+ $priorities = MarketplacePriority::findAll(['guid' => $productsGuids]);
+
+ // 6. Массив для хранения гуидов, которые можно отправить
+ $availableGuids = [];
+
+ foreach ($productsGuids as $guid) {
+ if (!array_key_exists($guid, $stocks)) {
+ continue;
+ }
+
+ $stock = $stocks[$guid];
+
+ $priority = MarketplacePriority::findOne(['guid' => $guid]);
+
+ if (empty($priority)) {
+ continue;
+ }
+ $minQuanity = $priority->minimal_quantity;
+ $koefRemain = $priority->reminder_koef;
+
+ // Учитываем количество букетов с коэффициентом
+ $effectiveStock = floor($stock['count'] / $koefRemain);
+
+
+ if (array_key_exists($guid, $prices)) {
+ $price = $prices[$guid];
+ } else {
+ continue;
+ }
+
+ if (($effectiveStock >= $minQuanity)) {
+ $availableGuids[] = array('guid' => $guid, 'count' => $stock['count'], 'price' => $price, 'store' => $stock['store']);// Добав// Добавляем GUID
+ }
+
+ }
+
+ $distribution = [];
+
+ foreach ($availableGuids as $product) {
+ $stock = $stocks[$product['guid']];
+
+ $priority = MarketplacePriority::findOne(['guid' => $guid]);
+
+ if (empty($priority)) {
+ continue;
+ }
+
+ $minQuanity = $priority->minimal_quantity;
+ $koefRemain = $priority->reminder_koef;
+
+ $totalBouquets = intval($stock['count'] / $koefRemain); // С учетом коэффициента
+
+ if ($totalBouquets >= 2) {
+ // Равномерное распределение
+ foreach ($marketplaceStores as $store) {
+ $distribution[$store->guid] = ($distribution[$store->guid] ?? 0) + floor($totalBouquets / count($marketplaceStores));
+ }
+ } elseif ($totalBouquets == 1 && $minQuanity == 1) {
+ // Если минимальный остаток 1, отправляем только на Яндекс
+ foreach ($marketplaceStores as $store) {
+ if ($is_yandex) {
+ $distribution[$store->guid] = ($distribution[$store->guid] ?? 0) + 1;
+ }
+ }
+ } elseif ($totalBouquets > 1) {
+ // Нечётное количество, большую часть на Яндекс
+ foreach ($marketplaceStores as $store) {
+ if ($is_yandex) {
+ $distribution[$store->guid] = ($distribution[$store->guid] ?? 0) + ceil($totalBouquets / 2);
+ } else {
+ $distribution[$store->guid] = ($distribution[$store->guid] ?? 0) + floor($totalBouquets / 2);
+ }
+ }
+ }
+ }
+
+ return Json::encode($availableGuids);
+ }
+}
\ No newline at end of file