From: Vladimir Fomichev Date: Fri, 25 Jul 2025 14:55:55 +0000 (+0300) Subject: Выгрузка корректировки и филтрация по раскрытым спискам X-Git-Url: https://gitweb.erp-flowers.ru/?a=commitdiff_plain;h=2bd0ec7d17c769432f35167f4ac9d5745d73016a;p=erp24_rep%2Fyii-erp24%2F.git Выгрузка корректировки и филтрация по раскрытым спискам --- diff --git a/erp24/controllers/AutoPlannogrammaController.php b/erp24/controllers/AutoPlannogrammaController.php index 2cdee373..df838f56 100644 --- a/erp24/controllers/AutoPlannogrammaController.php +++ b/erp24/controllers/AutoPlannogrammaController.php @@ -102,8 +102,8 @@ class AutoPlannogrammaController extends BaseController ->andFilterWhere(['=', 'cp.address_city', $filters['city']]) ->andFilterWhere(['=', 'cp.address_region', $filters['region']]) ->andFilterWhere(['=', 'cp.address_district', $filters['district']]) - ->andFilterWhere(['=', 'cp.store_type', $filters['store_type']]) - ->andFilterWhere(['=', 'a.capacity_type', $filters['capacity_type']]); + ->andFilterWhere(['=', 'cp.store_type', $filters['store_type']]); + if (!empty($filters['territorial_manager'])) { $territorialManagerStoreIds = StoreDynamic::find() @@ -1432,19 +1432,13 @@ class AutoPlannogrammaController extends BaseController $this->layout = false; Yii::$app->response->format = Response::FORMAT_RAW; - $mappingTypes = [ - 'offline' => 'Офлайн', - 'online' => 'Онлайн', - 'write_offs' => 'Списания', - 'marketplace' => 'Маркетплейс' - ]; while (ob_get_level() > 0) { ob_end_clean(); } $filters = []; - $request->get(); + $request->get(); $filters['year'] = (int)$request->get('year'); $filters['week'] = (int)$request->get('week'); $filters['city'] = $request->get('city', null); @@ -1454,21 +1448,43 @@ class AutoPlannogrammaController extends BaseController $filters['store_type'] = is_numeric($request->get('store_type')) ? (int)$request->get('store_type') : null; $filters['territorial_manager'] = is_numeric($request->get('territorial_manager')) ? (int)$request->get('territorial_manager') : null; $filters['bush_chef_florist'] = is_numeric($request->get('bush_chef_florist')) ? (int)$request->get('bush_chef_florist') : null; - + $filters['auto'] = (int)$request->get('auto', 0); + $filters['categories'] = []; + if ($catsJson = $request->get('categories')) { + $decoded = json_decode($catsJson, true); + if (json_last_error() === JSON_ERROR_NONE && is_array($decoded)) { + $filters['categories'] = $decoded; + } + } $query = Autoplannogramma::find() ->alias('a') ->leftJoin('products_1c_nomenclature p1n', 'p1n.id = a.product_id') ->leftJoin('city_store_params cp', 'cp.store_id = a.store_id') ->leftJoin('city_store c', 'c.id = a.store_id') - // ->where(['p1n.category' => $category]) - // ->andWhere(['p1n.subcategory' => $subcategory]) + ->andFilterWhere(['=', 'a.year', $filters['year']]) ->andFilterWhere(['=', 'a.week', $filters['week']]) ->andFilterWhere(['=', 'cp.address_city', $filters['city']]) ->andFilterWhere(['=', 'cp.address_region', $filters['region']]) ->andFilterWhere(['=', 'cp.address_district', $filters['district']]) - ->andFilterWhere(['=', 'cp.store_type', $filters['store_type']]) - ->andFilterWhere(['=', 'a.capacity_type', $filters['capacity_type']]); + ->andFilterWhere(['=', 'cp.store_type', $filters['store_type']]); + // ->andFilterWhere(['=', 'a.capacity_type', $filters['capacity_type']]); + + if (!empty($filters['categories'])) { + $or = ['or']; + foreach ($filters['categories'] as $pair) { + if (count($pair) === 2) { + list($cat, $sub) = $pair; + $or[] = ['and', + ['p1n.category' => $cat], + ['p1n.subcategory' => $sub], + ]; + } + } + if (count($or) > 1) { + $query->andWhere($or); + } + } if (!empty($filters['territorial_manager'])) { $territorialManagerStoreIds = StoreDynamic::find() @@ -1498,7 +1514,8 @@ class AutoPlannogrammaController extends BaseController 'a.store_id', 'c.name AS store_name', 'a.modify', - 'a.capacity_type', + 'a.calculate', + 'a.total', 'a.details', 'a.month', 'a.year', @@ -1507,48 +1524,120 @@ class AutoPlannogrammaController extends BaseController ->asArray() ->all(); - $detailsData = []; - foreach ($autoplannogrammData as $product) { - $data = $product['details']; - while (is_string($data)) { - $decoded = json_decode($data, true); - if (json_last_error() !== JSON_ERROR_NONE) { - break; + $detailsData = []; + $auto = $filters['auto'] == 1; + + foreach ($autoplannogrammData as $product) { + + $data = $product['details']; + while (is_string($data)) { + $decoded = json_decode($data, true); + if (json_last_error() !== JSON_ERROR_NONE) break; + $data = $decoded; + } + $detailsArray = $data ?? []; + + if (!$auto && $product['modify'] !== null) { + $detailsData[] = [ + 'product_name' => $product['product_name'], + 'category' => $product['category'], + 'subcategory' => $product['subcategory'], + 'species' => $product['species'], + 'month' => $product['month'], + 'year' => $product['year'], + 'week' => "{$product['week']}/{$product['year']}/{$product['month']}", + 'type_pm' => $filters['capacity_type'] == 'max' ? 'max' : 'min', + 'shop' => "{$product['store_id']} {$product['store_name']}", + 'group_name' => 'Корректировка', + 'quantity' => $product['modify'], + 'value_type' => 'Корректировка', + ]; + continue; + } + + + foreach ($detailsArray as $type => $typeArr) { + + if ($type === AutoPlannogrammaService::TYPE_OFFLINE) { + + $detailsData[] = [ + 'product_name' => $product['product_name'], + 'category' => $product['category'], + 'subcategory' => $product['subcategory'], + 'species' => $product['species'], + 'month' => $product['month'], + 'year' => $product['year'], + 'week' => "{$product['week']}/{$product['year']}/{$product['month']}", + 'type_pm' => $filters['capacity_type'] == 'max' ? 'max' : 'min', + 'shop' => "{$product['store_id']} {$product['store_name']}", + 'group_name' => 'Оффлайн', + 'quantity' => $product['calculate'], + 'value_type' => AutoPlannogrammaService::TYPE_OFFLINE, + ]; + // группы offline + if (!empty($typeArr['groups']) && is_array($typeArr['groups'])) { + foreach ($typeArr['groups'] as $groupKey => $qty) { + $detailsData[] = [ + 'product_name' => $product['product_name'], + 'category' => $product['category'], + 'subcategory' => $product['subcategory'], + 'species' => $product['species'], + 'month' => $product['month'], + 'year' => $product['year'], + 'week' => "{$product['week']}/{$product['year']}/{$product['month']}", + 'type_pm' => $filters['capacity_type'] == 'max' ? 'max' : 'min', + 'shop' => "{$product['store_id']} {$product['store_name']}", + 'group_name' => $groupKey, + 'quantity' => $qty, + 'value_type' => AutoPlannogrammaService::TYPE_OFFLINE, + ]; + } } - $data = $decoded; + continue; } - $detailsArray = $data ?? []; - foreach ($detailsArray as $type => $typeArr) { - if (!isset($typeArr['groups']) && $type !== AutoPlannogrammaService::TYPE_WRITE_OFFS) { - continue; - } - $groups = $typeArr['groups'] ?? []; - $groups[$type] = $typeArr['quantity']; - foreach ($groups as $group => $quantity) { - if (in_array($group, array_keys($mappingTypes))) { - $groupName = $mappingTypes[$group]; - } else { - $groupName = $group; - } + + // writeOffs + if ($type === AutoPlannogrammaService::TYPE_WRITE_OFFS && isset($typeArr['quantity'])) { + $detailsData[] = [ + 'product_name' => $product['product_name'], + 'category' => $product['category'], + 'subcategory' => $product['subcategory'], + 'species' => $product['species'], + 'month' => $product['month'], + 'year' => $product['year'], + 'week' => "{$product['week']}/{$product['year']}/{$product['month']}", + 'type_pm' => $filters['capacity_type'] == 'max' ? 'max' : 'min', + 'shop' => "{$product['store_id']} {$product['store_name']}", + 'group_name' => 'Списание', + 'quantity' => $typeArr['quantity'], + 'value_type' => AutoPlannogrammaService::TYPE_WRITE_OFFS, + ]; + continue; + } + + // --- остальные типы: только группы --- + if (!empty($typeArr['groups']) && is_array($typeArr['groups'])) { + foreach ($typeArr['groups'] as $groupKey => $qty) { $detailsData[] = [ 'product_name' => $product['product_name'], - 'category' => $product['category'], - 'subcategory' => $product['subcategory'], - 'species' => $product['species'], - 'month' => $product['month'], - 'year' => $product['year'], - 'week' => $product['week'] . '/' . $product['year'] . '/' . $product['month'], - 'type_pm' => $product['capacity_type'] == 1 ? 'max' : 'min', - 'shop' => $product['store_id'] . ' ' . $product['store_name'], - 'group_name' => $groupName, - 'quantity' => $quantity, - 'value_type' => $type, + 'category' => $product['category'], + 'subcategory' => $product['subcategory'], + 'species' => $product['species'], + 'month' => $product['month'], + 'year' => $product['year'], + 'week' => "{$product['week']}/{$product['year']}/{$product['month']}", + 'type_pm' => $filters['capacity_type'] == 'max' ? 'max' : 'min', + 'shop' => "{$product['store_id']} {$product['store_name']}", + 'group_name' => $groupKey, + 'quantity' => $qty, + 'value_type' => $type, ]; } - } } - $spreadsheet = new Spreadsheet(); + } + + $spreadsheet = new Spreadsheet(); $sheet = $spreadsheet->getActiveSheet(); $sheet->setTitle('Отчёт'); diff --git a/erp24/services/AutoPlannogrammaService.php b/erp24/services/AutoPlannogrammaService.php index 12f0cb06..3ba843b2 100644 --- a/erp24/services/AutoPlannogrammaService.php +++ b/erp24/services/AutoPlannogrammaService.php @@ -31,6 +31,7 @@ class AutoPlannogrammaService private const CATEGORY_LOOKBACK_MONTHS = 3; // Период для анализа категорий (месяцы) private const LOOKBACK_MONTHS = 2; // Отступаемый шаг от плановой даты перед расчетами public const HELIUM_GUID = '2b72702a-792f-11e8-9edd-1c6f659fb563'; + const TYPE_OFFLINE = 'offline'; /** * Получение списка видимых магазинов diff --git a/erp24/views/auto-plannogramma/index.php b/erp24/views/auto-plannogramma/index.php index 950f0727..f34a483f 100644 --- a/erp24/views/auto-plannogramma/index.php +++ b/erp24/views/auto-plannogramma/index.php @@ -188,11 +188,15 @@ $this->registerJsFile('/js/autoplannogramma/autoplannogramma.js', ['position' =>
'btn btn-success ms-1 btn-auto', - 'id' => 'export-excel-btn', + 'class' => 'btn btn-success ms-1 export-excel-btn', + 'data-auto' => '1', + 'target' => '_blank' + ]) ?> + 'btn btn-success ms-1 export-excel-btn', + 'data-auto' => '0', 'target' => '_blank' ]) ?> - 'btn btn-success ms-1 btn-corrected']) ?>
$storeName): ?> @@ -246,7 +250,7 @@ $this->registerJsFile('/js/autoplannogramma/autoplannogramma.js', ['position' =>