]> gitweb.erp-flowers.ru Git - erp24_rep/yii-erp24/.git/commitdiff
Правки категорий
authorfomichev <vladimir.fomichev@erp-flowers.ru>
Fri, 4 Jul 2025 12:23:40 +0000 (15:23 +0300)
committerfomichev <vladimir.fomichev@erp-flowers.ru>
Fri, 4 Jul 2025 12:23:40 +0000 (15:23 +0300)
erp24/controllers/CategoryPlanController.php
erp24/views/category-plan/index.php
erp24/views/category-plan/new.php [deleted file]
erp24/web/js/category-plan/index.js

index cf3032516e30a3ae33580196929bbdea2395ef3c..d61d7c083bbe8fbaee63b54cb15b693be87ec792 100644 (file)
@@ -52,7 +52,7 @@ class CategoryPlanController extends Controller {
         $service = new AutoPlannogrammaService();
         $isEditable = date($model->year . '-' . $model->month . '-d') > date('Y-m-d') && (
             (date('d') < 27) || (date('Y-m-d', strtotime('-1 month', strtotime(date($model->year . '-' . $model->month . '-d')))) > date('Y-m-d')));
-        $isEditable = true;
+        //$isEditable = true;
         $categoryPlan = CategoryPlan::find()->where(['year' => $model->year, 'month' => $model->month, 'store_id' => $model->store_id])->indexBy('category')->asArray()->all();
         $types = [];
         $table = [];
index 80396cb335c088c1e18789a914c61fd4d44bc1d8..3aeb55ef4f54cc567a9db8a73210667b4dc2289f 100644 (file)
@@ -213,7 +213,7 @@ input[readonly] {
                     ?>
                     <thead>
                     <tr><th rowspan="4" class="text-center align-middle border">Категории</th><th colspan="4" class="text-center border">План продаж</th><th colspan="2" class="text-center border">Списания</th></tr>
-                    <tr><th colspan="2" class="text-center border">Ð\9eÑ\84Ñ\84лайн</th><th colspan="2" class="text-center border">Ð\98нÑ\82еÑ\80неÑ\82\9cагазин</th><th colspan="2" class="text-center border">Списания</th></tr>
+                    <tr><th colspan="2" class="text-center border">Ð\9eÑ\84Ñ\84лайн</th><th colspan="2" class="text-center border">Ð\9eнлайн</th><th colspan="2" class="text-center border">Списания</th></tr>
                     <tr><th colspan="2" class="text-center border" data-value="<?= $offline_sale ?>"><?= number_format($offline_sale, 0, '.', ' ') ?></th>
                         <th colspan="2" class="text-center border" data-value="<?= $online_sale ?>"><?= number_format($online_sale, 0, '.', ' ') ?></th>
                         <th colspan="2" class="text-center border" data-value="<?= $write_offs ?>"><?= number_format($write_offs, 0, '.', ' ') ?></th></tr>
diff --git a/erp24/views/category-plan/new.php b/erp24/views/category-plan/new.php
deleted file mode 100644 (file)
index b566f1e..0000000
+++ /dev/null
@@ -1,255 +0,0 @@
-<?php
-
-use yii\helpers\Html;
-use yii\base\DynamicModel;
-use yii\helpers\Url;
-use yii\widgets\ActiveForm;
-use yii\helpers\ArrayHelper;
-
-use kartik\select2\Select2;
-use yii_app\helpers\HtmlHelper;
-use yii_app\records\SalesWriteOffsPlan;
-use yii_app\records\StoreCityList;
-use yii_app\records\Admin;
-use yii_app\records\AdminGroup;
-use yii_app\records\StoreType;
-
-/* @var $model DynamicModel */
-/* @var $years array */
-/* @var $stores array */
-/* @var $table array */
-/* @var $tableOnline array */
-/* @var $types array */
-/* @var $tableWriteOffs array */
-/* @var $salesWriteOffsPlan SalesWriteOffsPlan */
-/* @var $isEditable boolean */
-/* @var $categoryPlan array */
-
-$this->registerJsFile('/js/category-plan/index.js', ['position' => \yii\web\View::POS_END]);
-
-$this->registerCss('
-input[readonly] {
-  background: lightgray;
-}
-');
-
-?>
-
-<div class="categoryPlanIndex m-5">
-
-    <h1>План по категориям</h1>
-  <p><?= Html::a(
-          '📖 Документация',
-          Url::to(
-              ['wiki/show-doc', 'returnUrl' => Yii::$app->request->url]
-          ),
-          ['class' => 'ms-3 mb-3 pb-3', 'target' => '_blank', 'title' => 'Открыть документацию']
-      ) ?></p>
-
-
-    <?php $form = ActiveForm::begin([
-        'id' => 'filter-form',
-        'method' => 'GET',
-        'action' => '/category-plan/new'
-    ]) ?>
-
-    <div class="row">
-        <div class="col-6">
-            <div class="row">
-                <div class="col-4">
-                    <?= $form->field($model, 'year')->dropDownList($years, ['onchange' => '//this.form.submit();'])->label(false) ?>
-                </div>
-                <div class="col-4">
-                    <?= $form->field($model, 'city_id')->widget(Select2::class, [
-                        'data' => ArrayHelper::map(StoreCityList::findAll(['type' => StoreCityList::TYPE_CITY]), 'id', 'name'),
-                        'language' => 'ru',
-                        'options' => ['placeholder' => 'Города...'],
-                        'pluginOptions' => [
-                            'allowClear' => true,
-                        ]
-                    ])->label(false) ?>
-                </div>
-                <div class="col-4">
-                    <?= $form->field($model, 'store_type_id')->widget(Select2::class, [
-                        'data' => ArrayHelper::map(StoreType::find()->all(), 'id', 'name'),
-                        'language' => 'ru',
-                        'options' => ['placeholder' => 'Тип магазина...'],
-                        'pluginOptions' => [
-                            'allowClear' => true,
-                        ]
-                    ])->label(false) ?>
-                </div>
-            </div>
-            <div class="row mt-1">
-                <div class="col-4">
-                    <?= $form->field($model, 'month')->dropDownList(HtmlHelper::getMonthNames(), ['onchange' => '//this.form.submit();'])->label(false) ?>
-                </div>
-                <div class="col-4">
-                    <?= $form->field($model, 'region_id')->widget(Select2::class, [
-                        'data' => ArrayHelper::map(StoreCityList::findAll(['type' => StoreCityList::TYPE_REGION]), 'id', 'name'),
-                        'language' => 'ru',
-                        'options' => ['placeholder' => 'Регион...'],
-                        'pluginOptions' => [
-                            'allowClear' => true,
-                        ]
-                    ])->label(false) ?>
-                </div>
-                <div class="col-4">
-                    <?= $form->field($model, 'territory_manager_id')->widget(Select2::class, [
-                        'data' => ArrayHelper::map(Admin::findAll(['group_id' => AdminGroup::GROUP_BUSH_DIRECTOR]), 'id', 'name_full'),
-                        'language' => 'ru',
-                        'options' => ['placeholder' => 'Тер. Управляющий...'],
-                        'pluginOptions' => [
-                            'allowClear' => true,
-                        ]
-                    ])->label(false) ?>
-                </div>
-            </div>
-
-            <div class="row mt-2">
-                <div class="col-4">
-                </div>
-                <div class="col-4">
-                    <?= $form->field($model, 'raion_id')->widget(Select2::class, [
-                        'data' => ArrayHelper::map(StoreCityList::findAll(['type' => StoreCityList::TYPE_DISTRICT]), 'id', 'name'),
-                        'language' => 'ru',
-                        'options' => ['placeholder' => 'Район...'],
-                        'pluginOptions' => [
-                            'allowClear' => true,
-                        ]
-                    ])->label(false) ?>
-                </div>
-                <div class="col-4">
-                    <?= $form->field($model, 'kshf_id')->widget(Select2::class, [
-                        'data' => ArrayHelper::map(Admin::findAll(['group_id' => AdminGroup::GROUP_BUSH_CHEF_FLORIST]), 'id', 'name'),
-                        'language' => 'ru',
-                        'options' => ['placeholder' => 'кШФ...'],
-                        'pluginOptions' => [
-                            'allowClear' => true,
-                        ]
-                    ])->label(false) ?>
-                </div>
-            </div>
-        </div>
-        <div class="col-4">
-            <div class="row">
-                <div class="col-1">
-                    <div class="row" style="min-height: 150px; align-items: center;">
-                        <div class="col-12">
-                            <button onclick="updateStores(); return false;">
-                                <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-play-fill" viewBox="0 0 16 16">
-                                    <path d="m11.596 8.697-6.363 3.692c-.54.313-1.233-.066-1.233-.697V4.308c0-.63.692-1.01 1.233-.696l6.363 3.692a.802.802 0 0 1 0 1.393"/>
-                                </svg>
-                            </button>
-                        </div>
-                    </div>
-                </div>
-                <div class="col-11">
-                    <?= $form->field($model, 'store_id')->dropDownList($stores, [
-                        'multiple' => false,
-                        'size' => 6,
-                        'class' => 'form-control',
-                        'id' => 'selected-store',
-                        'onchange' => '//this.form.submit()',
-                        'style'=> 'overflow-y: scroll, height: auto; max-height: 200px;  overflow-x: hidden;',
-                    ])->label(false) ?>
-                </div>
-            </div>
-            <div class="row">
-                <div class="col-1"></div>
-                <div class="col-11">
-                    <?= Html::submitButton('Применить', ['class' => 'btn btn-secondary'])?>
-
-                </div>
-            </div>
-        </div>
-    </div>
-    <?php ActiveForm::end() ?>
-
-    <?php if (isset($model->store_id)): ?>
-        <div class="row">
-            <div class="col-4">
-                <h1><?= $stores[$model->store_id]?></h1>
-                <?php if ($model->month && $model->year && $model->store_id) { ?>
-                    <?= Html::button('Вернуть автоплан', [
-                        'class' => 'btn btn-danger ms-2',
-                        'name'  => 'delete',
-                        'id' => 'delete',
-                        'value' => 1,
-                        'data'  => [
-                            'confirm' => 'Вы уверены, что хотите вернуть автоплан за '
-                                . $model->month . '.' . $model->year . '?',
-                        ],
-                    ])
-                    ?>
-
-                    <?= Html::button('Пересчитать автопланограмму', [
-                        'class' => 'btn btn-success ms-2',
-                        'disabled' => true,
-                        'id' => 'rebuild',
-                        'name'  => 'rebuild',
-                        'value' => 1,
-                        'data'  => [
-                            'confirm' => 'Вы уверены, что хотите пересчитать автопланограмму за '
-                                . $model->month . '.' . $model->year . ' для магазина ' . $stores[$model->store_id] . '?',
-                        ],
-                    ])
-                    ?>
-                <?php } ?>
-                <div id="changes-count"></div>
-                <div id="changes" style="display:none;"></div>
-            </div>
-        </div>
-        <?php if (isset($salesWriteOffsPlan)): ?>
-        <div class="table-responsive" style="max-width: 1285px;">
-            <table id="categoryPlan" style="width:100%">
-                <?php
-                $offline_sale = $salesWriteOffsPlan->offline_sales_plan;
-                $online_sale = $salesWriteOffsPlan->online_sales_shop_plan;
-                $write_offs = $salesWriteOffsPlan->write_offs_plan;
-                ?>
-                <thead>
-                    <tr><th rowspan="4" class="text-center align-middle border">Категории</th><th colspan="4" class="text-center border">План продаж</th><th colspan="2" class="text-center border">Списания</th></tr>
-                    <tr><th colspan="2" class="text-center border">Оффлайн</th><th colspan="2" class="text-center border">Интернет-Магазин</th><th colspan="2" class="text-center border">Списания</th></tr>
-                    <tr><th colspan="2" class="text-center border" data-value="<?= $offline_sale ?>"><?= number_format($offline_sale, 0, '.', ' ') ?></th>
-                        <th colspan="2" class="text-center border" data-value="<?= $online_sale ?>"><?= number_format($online_sale, 0, '.', ' ') ?></th>
-                        <th colspan="2" class="text-center border" data-value="<?= $write_offs ?>"><?= number_format($write_offs, 0, '.', ' ') ?></th></tr>
-                    <tr><th class="text-center border">%</th><th class="text-center border">Сумма</th><th class="text-center border">%</th><th class="text-center border">Cумма</th><th class="text-center border">%</th><th class="text-center border">Cумма</th></tr>
-                </thead>
-                <tbody>
-                    <?php foreach ($types as $type): ?>
-                        <tr>
-                            <th data-type><?= $type ?></th>
-                            <?php
-                            $data = $categoryPlan[$type]['offline'];
-                            $p1 = $offline_sale <= 0 ? 0 : round( $data / $offline_sale, 4) * 100;
-                            ?>
-                            <td data-p1-<?= $type ?> data-offline="<?= $offline_sale ?>" data-offline-type="<?= $type ?>"><?= Html::textInput('p1', number_format($p1, 2, '.', ''), ['type' => 'number', 'style' => 'max-width: 80px;', 'readonly' => !$isEditable, 'onchange' => 'editProcent(this);']) ?>%</td>
-                            <td data-offline-type="<?= $type ?>"><?= Html::textInput('offline', number_format($categoryPlan[$type]['offline'], 0, '.', ''), ['type' => 'number', 'readonly' => true, ]) ?></td>
-                            <?php
-                            $data2 = $categoryPlan[$type]['internet_shop'];
-                            $p2 = $online_sale <= 0 ? 0 : round( $data2 / $online_sale, 4) * 100;
-                            ?>
-                            <td data-p2-<?= $type ?> data-online="<?= $online_sale ?>" data-online-type="<?= $type ?>"><?= Html::textInput('p2', number_format($p2, 2, '.', ''), ['type' => 'number', 'style' => 'max-width: 80px;', 'readonly' => !$isEditable, 'onchange' => 'editProcent(this);']) ?>%</td>
-                            <td data-online-type="<?= $type ?>"><?= Html::textInput('internet_shop', number_format($categoryPlan[$type]['internet_shop'], 0, '.', ''), ['type' => 'number', 'readonly' => true, ]) ?></td>
-                            <?php //<td></td><td></td> ?>
-                            <?php
-                            $data4 = $categoryPlan[$type]['write_offs'];
-                            $p3 = $write_offs <= 0 ? 0 : round( $data4 / $write_offs, 4) * 100;
-                            ?>
-                            <td data-p3-<?= $type ?> data-writeoffs="<?= $write_offs ?>" data-writeoffs-type="<?= $type ?>"><?= Html::textInput('p3', number_format($p3, 2, '.', ''), ['type' => 'number', 'style' => 'max-width: 80px;', 'readonly' => !$isEditable, 'onchange' => 'editProcent(this);']) ?>%</td>
-                            <td data-writeoffs-type="<?= $type ?>"><?= Html::textInput('write_offs', number_format($categoryPlan[$type]['write_offs'], 0, '.', ''), ['type' => 'number',  'readonly' => true, ]) ?></td>
-                        </tr>
-                    <?php endforeach; ?>
-                </tbody>
-            </table>
-        </div>
-        <?php else: ?>
-            <span class="text-lightpink-red font-weight-bold">
-                Не задан план по магазину. Чтобы задать план пройдите на страницу
-                <a href="/sales-write-offs-plan" target="_blank"><?= \yii\helpers\Url::base(true) . '/sales/write-offs-plan' ?></a>.
-            </span>
-        <?php endif; ?>
-    <?php endif; ?>
-
-</div>
index 952716c9750e15e1e04a382a3c63cb46fbb579e0..c7a8be95b352a7423cc564f334ee008e26d46666 100644 (file)
@@ -272,9 +272,11 @@ $(document).ready(() => {
 });
 
 let taskPollInterval = null;
+let isDone = false;
 
 function startTaskPolling() {
     if (taskPollInterval) return;
+    if (isDone) return;
     console.log('check-task');
     taskPollInterval = setInterval(() => {
         $.ajax({
@@ -300,6 +302,7 @@ function startTaskPolling() {
                 if (data.status === 'done') {
                     clearInterval(taskPollInterval);
                     taskPollInterval = null;
+                    isDone = true;
                     localStorage.removeItem('planChanges');
                     $('#categoryPlan').removeClass('block_table');
                     $('#rebuild').prop('disabled', true).text('Пересчитать автопланограмму');