--- /dev/null
+<?php
+
+namespace yii_app\actions\marketplace;
+
+use yii\base\Action;
+use yii\helpers\ArrayHelper;
+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 >= 2) {
+ // Если остаток позволяет, добавляем в доступные
+ $availableGuids[] = array('guid' => $guid, 'count' => $stock['count'], 'price' => $price, 'store' => $stock['store']);
+ } elseif ($effectiveStock == 1 && $minQuanity == 1) {
+ // Если минимальный остаток 1, добавляем в доступные
+ $availableGuids[] = array('guid' => $guid, 'count' => $stock['count'], 'price' => $price, 'store' => $stock['store']);
+ } elseif ($effectiveStock > 1) {
+ // Нечётное количество, добавляем в доступные
+ $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 $availableGuids;
+ }
+}