]> gitweb.erp-flowers.ru Git - erp24_rep/yii-erp24/.git/commitdiff
ERP-302 Редактирование букета
authormarina <m.zozirova@gmail.com>
Thu, 13 Feb 2025 12:20:58 +0000 (15:20 +0300)
committermarina <m.zozirova@gmail.com>
Thu, 13 Feb 2025 12:20:58 +0000 (15:20 +0300)
erp24/controllers/BouquetController.php
erp24/migrations/m250213_094412_drop_columns_on_bouquet_composition.php [new file with mode: 0644]
erp24/migrations/m250213_095313_create_bouquet_matrix_type_history_table.php [new file with mode: 0644]
erp24/records/BouquetComposition.php
erp24/records/BouquetCompositionMatrixTypeHistory.php [new file with mode: 0644]
erp24/views/bouquet/_form.php
erp24/views/bouquet/create.php [new file with mode: 0644]
erp24/views/bouquet/view.php

index a53c4bcdc61ac995241b8094723b1f9de545a14c..d9922bc70a7465e0d49596455654c93be176d426 100644 (file)
@@ -10,7 +10,9 @@ use yii\helpers\Url;
 use yii\web\Controller;
 use yii\web\NotFoundHttpException;
 use yii\web\UploadedFile;
+use yii_app\helpers\DataHelper;
 use yii_app\records\BouquetComposition;
+use yii_app\records\BouquetCompositionMatrixTypeHistory;
 use yii_app\records\BouquetCompositionProducts;
 use yii_app\records\BouquetForecast;
 use yii_app\records\CityStore;
@@ -30,6 +32,82 @@ class BouquetController extends Controller
         return $this->render('index');
     }
 
+    public function actionCreate() {
+        $model = new BouquetComposition();
+
+        if (Yii::$app->request->isPost) {
+            $data = Yii::$app->request->post();
+            $model->guid = DataHelper::createGuidMy('07');
+            $model->load($data);
+            if ($data['matrix_type_id']) {
+                BouquetCompositionMatrixTypeHistory::setData($data['matrix_type_id'], $model->id);
+            }
+            if ($model->save()) {
+//                return $this->redirect('view', [
+//                    'model' => $model,
+//                    'onlineStoresList' => $onlineStoresList,
+//                    'bouquetCompositionProducts' => $bouquetCompositionProducts,
+//                    'marketplaceList' => $marketplaceList,
+//                    'storesTypeList' => $storesTypeList,
+//                    'photoUrls' => $photoUrls,
+//                    'photoFiles' => $photoFiles,
+//                    'videoUrls' => $videoUrls,
+//                    'processUrls' => $processUrls,
+//                ]);
+            }
+            $month = $data['month'];
+            $year = $data['year'];
+
+            $model->photo_bouquet = UploadedFile::getInstances($model, 'photo_bouquet');
+            if ($model->photo_bouquet) {
+                Files::deleteAll(['file_type' => 'image', 'entity_id' => $model->id, 'entity' => BouquetComposition::PHOTO_BOUQUET]);
+                foreach ($model->photo_bouquet as $photo) {
+                    FileService::saveUploadedFile($photo, BouquetComposition::PHOTO_BOUQUET, $model->id);
+                }
+            }
+
+            $model->video_presentation = UploadedFile::getInstances($model, 'video_presentation');
+            if ($model->video_presentation) {
+                Files::deleteAll(['file_type' => 'video', 'entity_id' => $model->id, 'entity' => BouquetComposition::VIDEO_PRESENTATION]);
+                FileService::saveUploadedFile($model->video_presentation, BouquetComposition::VIDEO_PRESENTATION, $model->id);
+            }
+
+            $model->video_build_process = UploadedFile::getInstances($model, 'video_build_process');
+            if ($model->video_build_process) {
+                Files::deleteAll(['file_type' => 'video', 'entity_id' => $model->id, 'entity' => BouquetComposition::VIDEO_BUILD_PROCESS]);
+                FileService::saveUploadedFile($model->video_build_process, BouquetComposition::VIDEO_BUILD_PROCESS, $model->id);
+            }
+
+
+            if (!empty($data['BouquetForecast']['type_sales_value'])) {
+                $salesData = $data['BouquetForecast']['type_sales_value'];
+
+                if (!empty($salesData['offline'])) {
+                    BouquetForecast::processSalesData($model->id, $year, $month, $salesData['offline'], BouquetForecast::OFFLINE_STORES);
+                }
+
+                if (!empty($salesData['online'])) {
+                    BouquetForecast::processSalesData($model->id, $year, $month, $salesData['online'], BouquetForecast::ONLINE_STORES);
+                }
+
+                if (!empty($salesData['marketplace'])) {
+                    BouquetForecast::processSalesData($model->id, $year, $month, $salesData['marketplace'], BouquetForecast::MARKETPLACE);
+                }
+            }
+
+        }
+
+        $storesTypeList = BouquetForecast::getStoresList(null, BouquetForecast::OFFLINE_STORES, StoreType::class, []);
+        $marketplaceList = BouquetForecast::getStoresList(null, BouquetForecast::MARKETPLACE, CityStore::class, ['visible' => CityStore::IS_VISIBLE]);
+        $onlineStoresList = BouquetForecast::getStoresList(null, BouquetForecast::ONLINE_STORES, CityStore::class, ['visible' => CityStore::IS_VISIBLE]);
+
+        return $this->render('create', [
+            'onlineStoresList' => $onlineStoresList,
+            'marketplaceList' => $marketplaceList,
+            'storesTypeList' => $storesTypeList,
+        ]);
+    }
+
     public function actionView($id)
     {
         $model = BouquetComposition::findOne($id);
@@ -39,6 +117,10 @@ class BouquetController extends Controller
             $month = $data['month'];
             $year = $data['year'];
 
+            if ($data['matrix_type_id']) {
+                BouquetCompositionMatrixTypeHistory::setData($data['matrix_type_id'], $model->id);
+            }
+
             $model->photo_bouquet = UploadedFile::getInstances($model, 'photo_bouquet');
             if ($model->photo_bouquet) {
                 Files::deleteAll(['file_type' => 'image', 'entity_id' => $id, 'entity' => BouquetComposition::PHOTO_BOUQUET]);
diff --git a/erp24/migrations/m250213_094412_drop_columns_on_bouquet_composition.php b/erp24/migrations/m250213_094412_drop_columns_on_bouquet_composition.php
new file mode 100644 (file)
index 0000000..2d5cb75
--- /dev/null
@@ -0,0 +1,30 @@
+<?php
+
+use yii\db\Migration;
+
+/**
+ * Class m250213_094412_drop_columns_on_bouquet_composition
+ */
+class m250213_094412_drop_columns_on_bouquet_composition extends Migration
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function safeUp()
+    {
+        $this->dropColumn('bouquet_composition', 'photo_id');
+        $this->dropColumn('bouquet_composition', 'video_id');
+        $this->dropColumn('bouquet_composition', 'matrix_type_id');
+
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function safeDown()
+    {
+        $this->addColumn('bouquet_composition', 'matrix_type_id', $this->integer()->comment('ИД типа матрицы'));
+        $this->addColumn('bouquet_composition', 'photo_id', $this->integer()->comment('ИД фото'));
+        $this->addColumn('bouquet_composition', 'video_id', $this->integer()->comment('ИД видео'));
+    }
+}
diff --git a/erp24/migrations/m250213_095313_create_bouquet_matrix_type_history_table.php b/erp24/migrations/m250213_095313_create_bouquet_matrix_type_history_table.php
new file mode 100644 (file)
index 0000000..e7b157b
--- /dev/null
@@ -0,0 +1,36 @@
+<?php
+
+use yii\db\Migration;
+
+/**
+ * Handles the creation of table `{{%bouquet_matrix_type_history}}`.
+ */
+class m250213_095313_create_bouquet_matrix_type_history_table extends Migration
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function safeUp()
+    {
+        $this->createTable('{{%erp24.bouquet_composition_matrix_type_history}}', [
+            'id' => $this->primaryKey(),
+            'bouquet_id' => $this->integer()->comment('Букет ИД'),
+            'matrix_type_id' => $this->integer()->comment('Тип матрицы ИД'),
+            'date_from' =>  $this->integer()->comment('Дата установки'),
+            'date_to' =>  $this->integer()->comment('Дата изменения'),
+            'is_active' => $this->boolean()->defaultValue(true)->comment('Активна ли запись'),
+            'created_at' => $this->dateTime()->comment('Дата создания'),
+            'updated_at' => $this->dateTime()->comment('Дата обновления'),
+            'created_by' => $this->integer()->comment('ID создателя записи'),
+            'updated_by' => $this->integer()->comment('ID обновителя записи'),
+        ]);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function safeDown()
+    {
+        $this->dropTable('{{%erp24.bouquet_composition_matrix_type_history}}');
+    }
+}
index 6f3f1672054be8975af35de11af475ab4b6165cf..ef0bd49a4248c52968e532848cae1228244527ed 100644 (file)
@@ -15,9 +15,6 @@ use yii_app\records\BouquetCompositionProducts;
  * @property int $id
  * @property string|null $guid
  * @property string $name
- * @property int|null $matrix_type_id
- * @property int|null $photo_id
- * @property int|null $video_id
  * @property string|null $created_at
  * @property string|null $updated_at
  * @property int|null $created_by
@@ -62,7 +59,7 @@ class BouquetComposition extends ActiveRecord
     {
         return [
             [['name'], 'required'],
-            [['matrix_type_id', 'video_id', 'created_by', 'updated_by'], 'integer'],
+            [['created_by', 'updated_by'], 'integer'],
             [['created_at', 'updated_at'], 'safe'],
             [['guid', 'name'], 'string', 'max' => 255],
             [['photo_bouquet'], 'file', 'extensions' => 'jpg, jpeg, png, gif', 'maxFiles' => 10],
@@ -76,9 +73,6 @@ class BouquetComposition extends ActiveRecord
             'id' => 'ID',
             'guid' => 'GUID букета',
             'name' => 'Название букета',
-            'matrix_type_id' => 'ИД типа матрицы',
-            'photo_id' => 'ИД фото',
-            'video_id' => 'ИД видео',
             'created_at' => 'Дата создания',
             'updated_at' => 'Дата обновления',
             'created_by' => 'ID создателя записи',
@@ -90,4 +84,11 @@ class BouquetComposition extends ActiveRecord
     {
         return $this->hasMany(BouquetCompositionProducts::class, ['bouquet_id' => 'id']);
     }
+
+    public function getMatrixType()
+    {
+        return $this->hasMany(BouquetCompositionMatrixTypeHistory::class, ['bouquet_id' => 'id'])
+            ->andWhere(['is_active' => BouquetCompositionMatrixTypeHistory::IS_ACTIVE]);
+    }
+
 }
diff --git a/erp24/records/BouquetCompositionMatrixTypeHistory.php b/erp24/records/BouquetCompositionMatrixTypeHistory.php
new file mode 100644 (file)
index 0000000..9d8e492
--- /dev/null
@@ -0,0 +1,91 @@
+<?php
+namespace yii_app\records;
+
+use Yii;
+use yii\db\ActiveRecord;
+
+/**
+ * This is the model class for table "erp24.bouquet_composition_matrix_type_history".
+ *
+ * @property int $id
+ * @property int|null $bouquet_id Букет ИД
+ * @property int|null $matrix_type_id Тип матрицы ИД
+ * @property int|null $date_from Дата установки
+ * @property int|null $date_to Дата изменения
+ * @property boolean|true $is_active Активна ли запись
+ * @property string|null $created_at Дата создания
+ * @property string|null $updated_at Дата обновления
+ * @property int|null $created_by ID создателя записи
+ * @property int|null $updated_by ID обновителя записи
+ */
+class BouquetCompositionMatrixTypeHistory extends ActiveRecord
+{
+    public const IS_ACTIVE = true;
+
+    /**
+     * {@inheritdoc}
+     */
+    public static function tableName()
+    {
+        return '{{%erp24.bouquet_composition_matrix_type_history}}';
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function rules()
+    {
+        return [
+            [['bouquet_id', 'matrix_type_id', 'date_from', 'created_by', 'updated_by'], 'integer'],
+            [['created_at', 'updated_at','date_to'], 'safe'],
+            [['is_active'], 'boolean']
+        ];
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function attributeLabels()
+    {
+        return [
+            'id' => 'ID',
+            'bouquet_id' => 'Букет ИД',
+            'matrix_type_id' => 'Тип матрицы ИД',
+            'date_from' => 'Дата установки',
+            'date_to' => 'Дата изменения',
+            'is_active' => 'Активна ли запись',
+            'created_at' => 'Дата создания',
+            'updated_at' => 'Дата обновления',
+            'created_by' => 'ID создателя записи',
+            'updated_by' => 'ID обновителя записи',
+        ];
+    }
+
+    public static function setData($value, $bouquetId) {
+        if (self::findOne(['bouquet_id' => $bouquetId])) {
+            BouquetCompositionMatrixTypeHistory::updateAll(['date_to' => date('Y-m-d H:i:s'), 'bouquet_id' => $bouquetId, 'date_from' => null, 'is_active' => self::IS_ACTIVE]);
+        }
+        $matrixHistoryType = new BouquetCompositionMatrixTypeHistory([
+            'bouquet_id' => $bouquetId,
+            'matrix_type_id' => $value,
+            'date_from' => date('Y-m-d H:i:s'),
+        ]);
+        $matrixHistoryType->save();
+    }
+
+    /**
+     * Отношение к букету
+     */
+    public function getBouquet()
+    {
+        return $this->hasOne(BouquetComposition::class, ['id' => 'bouquet_id']);
+    }
+
+    /**
+     * Отношение к типу матрицы
+     */
+    public function getMatrixType()
+    {
+        return $this->hasOne(MatrixType::class, ['id' => 'matrix_type_id']);
+    }
+}
index b3d9bbc7f3711e882119cd6b3af051245d859d04..cd0b26fdcc2391437be43107715511d5b3d89043 100644 (file)
@@ -1 +1,257 @@
 <?php
+
+use kartik\file\FileInput;
+use yii\helpers\ArrayHelper;
+use yii\helpers\Html;
+use yii\helpers\Url;
+use yii\widgets\ActiveForm;
+use yii_app\records\BouquetComposition;
+use yii_app\records\MatrixType;
+
+/** @var yii\web\View $this */
+/** @var yii_app\records\BouquetComposition $model */
+/** @var array $bouquetCompositionProducts */
+/** @var array $storesTypeList */
+/** @var array $marketplaceList */
+/** @var array $onlineStoresList */
+/** @var array $photoFiles */
+/** @var array $videoFiles */
+/** @var array $processFiles */
+
+$this->registerCss("
+             .file-caption {
+                    max-width: 62% !important; 
+                }
+            ");
+
+$photoConfig = array_map(fn($file) => [
+    'caption' => $file->url,
+    'key' => $file->id,
+    'url' => Url::to(['file/delete', 'id' => $file->id], true),
+], $photoFiles);
+
+$form = ActiveForm::begin([
+    'options' => ['enctype' => 'multipart/form-data'],
+]);
+?>
+    <div class="row d-flex border-bottom justify-content-between align-items-center py-4">
+        <div class="col-md-8 d-flex align-items-center">
+            <div class="col-md-3">
+                <h3 class="ms-3 mb-0"><?= Html::encode("Состав букета: ") ?></h3>
+            </div>
+            <div class="col-md-9">
+                <?php
+                if ($model) { ?>
+                    <h2 class="ms-2 mb-0"><strong><?= Html::encode($this->title) ?></strong></h2>
+                <?php } else {
+                    echo Html::input('text', 'BouquetComposition[name]', null, ['class' => 'form-control', 'placeholder' => 'Введите название']);
+                } ?>
+            </div>
+        </div>
+
+        <div class="col-md-3 d-flex flex-column">
+            <div class="row">
+                <div class="col-md-5">
+                    <?= Html::label('Тип матрицы', null, ['class' => 'h5 mt-2 mb-0']) ?>
+                </div>
+                <div class="col-md-7">
+                    <?= Html::dropDownList('matrix_type_id',
+                        $model && $model->matrixType ? $model->matrixType->matrix_type_id : null,
+                        ArrayHelper::map(MatrixType::find()->all(), 'id', 'name'),
+                        ['class' => 'form-control', 'prompt' => 'Тип матрицы'])
+                    ?>
+                </div>
+            </div>
+
+            <div class="row mt-1 text-center">
+                <div class="col-12">
+                    <a href="<?= Url::to('/matrix-type') ?>" class="text-decoration-none" target="_blank">Редактировать</a>
+                </div>
+            </div>
+        </div>
+    </div>
+    <div class="row">
+        <div class="col-md-4">
+            <div class="row pt-3 pb-2">
+                <div class="col-md-4 text-center font-weight-bold">Название</div>
+                <div class="col-md-2 text-center font-weight-bold">Кол-во</div>
+                <div class="col-md-1 text-center font-weight-bold">% списания</div>
+                <div class="col-md-2 text-center font-weight-bold">мрж-ть</div>
+                <div class="col-md-1 text-center font-weight-bold">% в сборке</div>
+                <div class="col-md-2 text-center font-weight-bold">ср.шт. в сборке</div>
+            </div>
+
+            <div class="row bg-white border rounded shadow-sm" style="height: 400px">
+                <?php foreach ($bouquetCompositionProducts as $product) { ?>
+                    <div class="row ms-1 py-2">
+                        <div class="col-md-4 text-center"><?= $product->product->name ?></div>
+                        <div class="col-md-2 text-center"><?= $product->count ?></div>
+                        <div class="col-md-1 text-center">10%</div>
+                        <div class="col-md-2 text-center">30%</div>
+                        <div class="col-md-1 text-center">10%</div>
+                        <div class="col-md-2 text-center">3.2%</div>
+                    </div>
+                <?php } ?>
+            </div>
+            <div class="row pt-3">
+                <div class="col-md-8"></div>
+                <div class="col-md-4">
+                    <?= Html::a('Редактировать', $model ? Url::to("/bouquet/update?id=$model->id") : Url::to("#"), ['class' => $model ? 'btn btn-warning w-100' : 'btn btn-warning w-100 disabled']) ?>
+                </div>
+            </div>
+        </div>
+        <div class="col-md-5">
+            <div class="row w-100 w-md-75 w-lg-50">
+                <?php $model = new BouquetComposition(); ?>
+                <div class="row mb-2"><?= Html::label("Фото", null, ['class' => 'text-center font-weight-bold pt-5 h5']) ?></div>
+                <?= $form->field($model, 'photo_bouquet[]')->widget(FileInput::class, [
+                    'options' => [
+                        'id' => 'bouquet-file-upload',
+                        'multiple' => true,  // Поддержка выбора нескольких файлов
+                        'accept' => 'image/png, image/jpeg, image/jpg',
+                    ],
+                    'language' => 'ru',
+                    'pluginOptions' => [
+                        'initialPreview' => $photoUrls,
+                        'initialPreviewConfig' => $photoConfig,
+                        'initialPreviewAsData' => true,
+                        'showPreview' => true,
+                        'showUpload' => false,
+                        'showCancel' => false,
+                        'mainClass' => 'input-group-lg',
+                        'maxFileSize' => 2800,  // Максимальный размер файла (в килобайтах)
+                        'dropZoneTitle' => 'Выберите изображение',  // Текст на зоне для перетаскивания
+                        'browseOnZoneClick' => true,  // Разрешить клик по зоне перетаскивания
+                        'fileActionSettings' => [
+                            'showZoom' => false,  // Убираем иконку для увеличения
+                        ],
+                    ],
+                ])->label(false) ?>
+            </div>
+            <div class="row">
+                <div class="col-md-6 w-100 w-md-75 w-lg-50">
+                    <div class="row mb-2"><?= Html::label("Презентация", null, ['class' => 'text-center font-weight-bold pt-5 h5']) ?></div>
+                    <?= $form->field($model, 'video_presentation')->widget(FileInput::class, [
+                        'options' => [
+                            'id' => 'video-file-upload',
+                            'multiple' => false,
+                            'accept' => 'video/mp4, video/avi, video/mov, video/mkv',
+                        ],
+                        'language' => 'ru',
+                        'pluginOptions' => [
+                            'showPreview' => true,
+                            'showUpload' => false,
+                            'showCancel' => false,
+                            'mainClass' => 'input-group-lg',
+                            'initialPreview' => $videoUrls,
+                            'maxFileSize' => 100000,  // Максимальный размер файла (в килобайтах)
+                            'dropZoneTitle' => 'Выберите видеофайл',  // Текст на зоне для перетаскивания
+                            'browseOnZoneClick' => true,  // Разрешить клик по зоне перетаскивания
+                            'fileActionSettings' => [
+                                'showZoom' => false,
+                            ],
+                        ],
+                    ])->label(false) ?>
+                </div>
+                <div class="col-md-6 w-100 w-md-75 w-lg-50">
+                    <div class="row mb-2"><?= Html::label("Процесс сборки", null, ['class' => 'text-center font-weight-bold pt-5 h5']) ?></div>
+                    <?= $form->field($model, 'video_build_process')->widget(FileInput::class, [
+                        'options' => [
+                            'id' => 'presentation-file-upload',
+                            'multiple' => false,
+                            'accept' => 'video/mp4, video/avi, video/mov, video/mkv',
+                        ],
+                        'language' => 'ru',
+                        'pluginOptions' => [
+                            'showPreview' => true,
+                            'showUpload' => false,
+                            'showCancel' => false,
+                            'mainClass' => 'input-group-lg',
+                            'initialPreview' => $processUrls,
+                            'maxFileSize' => 100000,  // Максимальный размер файла (в килобайтах)
+                            'dropZoneTitle' => 'Выберите видеофайл',
+                            'browseOnZoneClick' => true,  // Разрешить клик по зоне перетаскивания
+                            'fileActionSettings' => [
+                                'showZoom' => false,  // Убираем иконку для увеличения
+                            ],
+                        ],
+                    ])->label(false) ?>
+                </div>
+            </div>
+
+        </div>
+
+        <div class="col-md-3">
+            <div class="row mb-2"><?= Html::label("Прогноз продаж", null, ['class' => 'text-center font-weight-bold pt-5 h5']) ?></div>
+            <div class="row">
+                <div class="col-md-5">
+                    <div class="col-md-3"><?= Html::label("Год", null, ['class' => 'font-weight-bold pt-3 h6']) ?></div>
+                    <div class="col-md-9"> <?= Html::dropDownList("year", null, [2024 => 2024, 2025 => 2025], ['class' => 'form-control']) ?></div>
+                </div>
+                <div class="col-md-7">
+                    <div class="col-md-3"><?= Html::label("Месяц", null, ['class' => 'font-weight-bold pt-3 h6']) ?></div>
+                    <div class="col-md-9"> <?= Html::dropDownList("month", null, \yii_app\helpers\DateHelper::MONTH_NUMBER_NAMES, ['class' => 'form-control']) ?></div>
+                </div>
+            </div>
+            <div class="row">
+                <?= Html::label("Оффлайн магазины", null, ['class' => 'text-center font-weight-bold pt-4 h6']) ?>
+            </div>
+            <div class="row">
+                <div class="container border p-3" style="max-height: 185px; background-color: white; overflow: auto;">
+                    <?php foreach ($storesTypeList as $item) { ?>
+                        <div class="row align-items-center mb-2">
+                            <div class="col-md-8">
+                                <?= Html::label($item['name'], null, ['class' => "col-form-label"]); ?>
+                            </div>
+                            <div class="col-md-4">
+                                <?= Html::input('number', "BouquetForecast[type_sales_value][offline][{$item['id']}]", $item['value'], ['class' => 'form-control']) ?>
+                            </div>
+                        </div>
+                    <?php } ?>
+                </div>
+            </div>
+
+            <div class="row">
+                <?= Html::label("Интернет магазины", null, ['class' => 'text-center font-weight-bold pt-3 h6']) ?>
+            </div>
+            <div class="row">
+                <div class="container border p-3" style="max-height: 185px;background-color: white; overflow: auto;">
+                    <?php foreach ($onlineStoresList as $item) { ?>
+                        <div class="row align-items-center mb-2">
+                            <div class="col-md-8">
+                                <?= Html::label($item['name'], null, ['class' => "col-form-label"]); ?>
+                            </div>
+                            <div class="col-md-4">
+                                <?= Html::input('number', "BouquetForecast[type_sales_value][online][{$item['id']}]", $item['value'], ['class' => 'form-control']) ?>
+                            </div>
+                        </div>
+                    <?php } ?>
+                </div>
+            </div>
+
+            <div class="row">
+                <?= Html::label("Маркетплейсы", null, ['class' => 'text-center font-weight-bold pt-3 h6']) ?>
+            </div>
+            <div class="row">
+                <div class="container border p-3" style="max-height: 185px; background-color: white; overflow: auto;">
+                    <?php foreach ($marketplaceList as $item) { ?>
+                        <div class="row align-items-center mb-2">
+                            <div class="col-md-8">
+                                <?= Html::label($item['name'], null, ['class' => "col-form-label"]); ?>
+                            </div>
+                            <div class="col-md-4">
+                                <?= Html::input('number', "BouquetForecast[type_sales_value][marketplace][{$item['id']}]", $item['value'], ['class' => 'form-control']) ?>
+                            </div>
+                        </div>
+                    <?php } ?>
+                </div>
+            </div>
+        </div>
+    </div>
+    <div class="row">
+        <div class="col-md-10"></div>
+        <div class="col-md-2">
+            <?= Html::submitButton('Сохранить', ['class' => 'btn btn-success w-100']) ?>
+        </div>
+    </div>
+<?php ActiveForm::end(); ?>
\ No newline at end of file
diff --git a/erp24/views/bouquet/create.php b/erp24/views/bouquet/create.php
new file mode 100644 (file)
index 0000000..604584f
--- /dev/null
@@ -0,0 +1,33 @@
+<?php
+
+use yii\helpers\Url;
+
+/** @var yii\web\View $this */
+/** @var yii_app\records\BouquetComposition $model */
+/** @var array $bouquetCompositionProducts */
+/** @var array $storesTypeList */
+/** @var array $marketplaceList */
+/** @var array $onlineStoresList */
+/** @var array $photoFiles */
+/** @var array $videoFiles */
+/** @var array $processFiles */
+
+$this->title = 'Состав букета';
+$this->params['breadcrumbs'][] = ['label' => 'Букеты', 'url' => ['index']];
+$this->params['breadcrumbs'][] = $this->title;
+?>
+
+<div class="bouquet-create border-bottom-4 p-4">
+    <?= $this->render('_form', [
+        'onlineStoresList' => $onlineStoresList,
+        'bouquetCompositionProducts' => [],
+        'marketplaceList' => $marketplaceList,
+        'storesTypeList' => $storesTypeList,
+        'photoUrls' => [],
+        'photoFiles' => [],
+        'videoUrls' => [],
+        'processUrls' => [],
+        'model' => null
+    ]); ?>
+</div>
+
index 8a373fc551c426009ffedbbc0c445f6a226675e8..2b49b7261263fa4b928d27ba83f3226d1d36d703 100644 (file)
@@ -1,12 +1,6 @@
 <?php
 
-use kartik\file\FileInput;
-use yii\helpers\ArrayHelper;
-use yii\helpers\Html;
 use yii\helpers\Url;
-use yii\widgets\ActiveForm;
-use yii_app\records\BouquetComposition;
-use yii_app\records\MatrixType;
 
 /** @var yii\web\View $this */
 /** @var yii_app\records\BouquetComposition $model */
@@ -22,228 +16,18 @@ $this->title = $model->name;
 $this->params['breadcrumbs'][] = ['label' => 'Букеты', 'url' => ['index']];
 $this->params['breadcrumbs'][] = $this->title;
 ?>
-<?php
 
-$photoConfig = array_map(fn($file) => [
-    'caption' => $file->url,
-    'key' => $file->id,
-    'url' => Url::to(['file/delete', 'id' => $file->id], true),
-], $photoFiles);
-?>
-<?php
-$this->registerCss("
-             .file-caption {
-                    max-width: 62% !important; 
-                }
-            ");
-?>
 <div class="bouquet-view border-bottom-4 p-4">
-    <?php $form = ActiveForm::begin([
-        'options' => ['enctype' => 'multipart/form-data'],
-    ]);
-    ?>
-    <div class="row d-flex border-bottom justify-content-between align-items-center py-4">
-        <div class="col-md-8 d-flex align-items-center">
-            <h3 class="ms-3 mb-0"><?= Html::encode("Состав букета: ") ?></h3>
-            <h2 class="ms-2 mb-0"><strong><?= Html::encode($this->title) ?></strong></h2>
-        </div>
-
-        <div class="col-md-3 d-flex align-items-center">
-            <div class="me-3 text-end">
-                <?= Html::label('Тип матрицы', null, ['class' => 'h5 mb-0']) ?>
-                <br>
-                <a href="<?= Url::to('/matrix-type') ?>" class="text-decoration-none" target="_blank">Редактировать</a>
-            </div>
-            <div style="min-width: 200px;">
-                <?= Html::dropDownList('matrix_type_id', null, ArrayHelper::map(MatrixType::find()->all(), 'id', 'name'), ['class' => 'form-control', 'prompt' => 'Тип матрицы']) ?>
-            </div>
-        </div>
-    </div>
-    <div class="row">
-        <div class="col-md-4">
-            <div class="row pt-3 pb-2">
-                <div class="col-md-4 text-center font-weight-bold">Название</div>
-                <div class="col-md-2 text-center font-weight-bold">Кол-во</div>
-                <div class="col-md-1 text-center font-weight-bold">% списания</div>
-                <div class="col-md-2 text-center font-weight-bold">мрж-ть</div>
-                <div class="col-md-1 text-center font-weight-bold">% в сборке</div>
-                <div class="col-md-2 text-center font-weight-bold">ср.шт. в сборке</div>
-            </div>
-
-            <div class="row bg-white border rounded shadow-sm">
-                <?php foreach ($bouquetCompositionProducts as $product) { ?>
-                <div class="row ms-1 py-2">
-                    <div class="col-md-4 text-center"><?= $product->product->name ?></div>
-                    <div class="col-md-2 text-center"><?= $product->count ?></div>
-                    <div class="col-md-1 text-center">10%</div>
-                    <div class="col-md-2 text-center">30%</div>
-                    <div class="col-md-1 text-center">10%</div>
-                    <div class="col-md-2 text-center">3.2%</div>
-                </div>
-                <?php } ?>
-            </div>
-            <div class="row pt-3">
-                <div class="col-md-8"></div>
-                <div class="col-md-4">
-                    <?= Html::a('Редактировать', Url::to("/bouquet/update?id=$model->id"), ['class' => 'btn btn-warning w-100']) ?>
-                </div>
-            </div>
-        </div>
-        <div class="col-md-5">
-            <div class="row w-100 w-md-75 w-lg-50">
-                <?php $model = new BouquetComposition(); ?>
-                <div class="row mb-2"><?= Html::label("Фото", null, ['class' => 'text-center font-weight-bold pt-5 h5']) ?></div>
-                <?= $form->field($model, 'photo_bouquet[]')->widget(FileInput::class, [
-                    'options' => [
-                        'id' => 'bouquet-file-upload',
-                        'multiple' => true,  // Поддержка выбора нескольких файлов
-                        'accept' => 'image/png, image/jpeg, image/jpg',
-                    ],
-                    'language' => 'ru',
-                    'pluginOptions' => [
-                        'initialPreview' => $photoUrls,
-                        'initialPreviewConfig' => $photoConfig,
-                        'initialPreviewAsData' => true, 
-                        'showPreview' => true,
-                        'showUpload' => false,
-                        'showCancel' => false,
-                        'mainClass' => 'input-group-lg',
-//                        'initialPreview' => [],  // Задайте начальный список для предварительного просмотра (если есть)
-                        'maxFileSize' => 2800,  // Максимальный размер файла (в килобайтах)
-                        'dropZoneTitle' => 'Выберите изображение',  // Текст на зоне для перетаскивания
-                        'browseOnZoneClick' => true,  // Разрешить клик по зоне перетаскивания
-                        'fileActionSettings' => [
-                            'showZoom' => false,  // Убираем иконку для увеличения
-                        ],
-                    ],
-                ])->label(false) ?>
-            </div>
-            <div class="row">
-                <div class="col-md-6 w-100 w-md-75 w-lg-50">
-                    <div class="row mb-2"><?= Html::label("Презентация", null, ['class' => 'text-center font-weight-bold pt-5 h5']) ?></div>
-                    <?= $form->field($model, 'video_presentation')->widget(FileInput::class, [
-                        'options' => [
-                            'id' => 'video-file-upload',
-                            'multiple' => false,
-                            'accept' => 'video/mp4, video/avi, video/mov, video/mkv',
-                        ],
-                        'language' => 'ru',
-                        'pluginOptions' => [
-                            'showPreview' => true,
-                            'showUpload' => false,
-                            'showCancel' => false,
-                            'mainClass' => 'input-group-lg',
-                            'initialPreview' => $videoUrls,
-                            'maxFileSize' => 100000,  // Максимальный размер файла (в килобайтах)
-                            'dropZoneTitle' => 'Выберите видеофайл',  // Текст на зоне для перетаскивания
-                            'browseOnZoneClick' => true,  // Разрешить клик по зоне перетаскивания
-                            'fileActionSettings' => [
-                                'showZoom' => false,
-                            ],
-                        ],
-                    ])->label(false) ?>
-                </div>
-                <div class="col-md-6 w-100 w-md-75 w-lg-50">
-                    <div class="row mb-2"><?= Html::label("Процесс сборки", null, ['class' => 'text-center font-weight-bold pt-5 h5']) ?></div>
-                    <?= $form->field($model, 'video_build_process')->widget(FileInput::class, [
-                        'options' => [
-                            'id' => 'presentation-file-upload',
-                            'multiple' => false,
-                            'accept' => 'video/mp4, video/avi, video/mov, video/mkv',
-                        ],
-                        'language' => 'ru',
-                        'pluginOptions' => [
-                            'showPreview' => true,
-                            'showUpload' => false,
-                            'showCancel' => false,
-                            'mainClass' => 'input-group-lg',
-                            'initialPreview' => $processUrls,
-                            'maxFileSize' => 100000,  // Максимальный размер файла (в килобайтах)
-                            'dropZoneTitle' => 'Выберите видеофайл',
-                            'browseOnZoneClick' => true,  // Разрешить клик по зоне перетаскивания
-                            'fileActionSettings' => [
-                                'showZoom' => false,  // Убираем иконку для увеличения
-                            ],
-                        ],
-                    ])->label(false) ?>
-                </div>
-            </div>
-
-        </div>
-
-        <div class="col-md-3">
-            <div class="row mb-2"><?= Html::label("Прогноз продаж", null, ['class' => 'text-center font-weight-bold pt-5 h5']) ?></div>
-            <div class="row">
-                <div class="col-md-5">
-                    <div class="col-md-3"><?= Html::label("Год", null, ['class' => 'font-weight-bold pt-3 h6']) ?></div>
-                    <div class="col-md-9"> <?= Html::dropDownList("year", null, [2024 => 2024, 2025 => 2025], ['class' => 'form-control']) ?></div>
-                </div>
-                <div class="col-md-7">
-                    <div class="col-md-3"><?= Html::label("Месяц", null, ['class' => 'font-weight-bold pt-3 h6']) ?></div>
-                    <div class="col-md-9"> <?= Html::dropDownList("month", null, \yii_app\helpers\DateHelper::MONTH_NUMBER_NAMES, ['class' => 'form-control']) ?></div>
-                </div>
-            </div>
-            <div class="row">
-                <?= Html::label("Оффлайн магазины", null, ['class' => 'text-center font-weight-bold pt-4 h6']) ?>
-            </div>
-            <div class="row">
-                <div class="container border p-3" style="max-height: 185px; background-color: white; overflow: auto;">
-                    <?php foreach ($storesTypeList as $item) { ?>
-                        <div class="row align-items-center mb-2">
-                            <div class="col-md-8">
-                                <?= Html::label($item['name'], null, ['class' => "col-form-label"]); ?>
-                            </div>
-                            <div class="col-md-4">
-                                <?= Html::input('number', "BouquetForecast[type_sales_value][offline][{$item['id']}]", $item['value'], ['class' => 'form-control']) ?>
-                            </div>
-                        </div>
-                    <?php } ?>
-                </div>
-            </div>
-
-            <div class="row">
-                <?= Html::label("Интернет магазины", null, ['class' => 'text-center font-weight-bold pt-3 h6']) ?>
-            </div>
-            <div class="row">
-                <div class="container border p-3" style="max-height: 185px;background-color: white; overflow: auto;">
-                    <?php foreach ($onlineStoresList as $item) { ?>
-                        <div class="row align-items-center mb-2">
-                            <div class="col-md-8">
-                                <?= Html::label($item['name'], null, ['class' => "col-form-label"]); ?>
-                            </div>
-                            <div class="col-md-4">
-                                <?= Html::input('number', "BouquetForecast[type_sales_value][online][{$item['id']}]", $item['value'], ['class' => 'form-control']) ?>
-                            </div>
-                        </div>
-                    <?php } ?>
-                </div>
-            </div>
-
-            <div class="row">
-                <?= Html::label("Маркетплейсы", null, ['class' => 'text-center font-weight-bold pt-3 h6']) ?>
-            </div>
-            <div class="row">
-                <div class="container border p-3" style="max-height: 185px; background-color: white; overflow: auto;">
-                    <?php foreach ($marketplaceList as $item) { ?>
-                        <div class="row align-items-center mb-2">
-                            <div class="col-md-8">
-                                <?= Html::label($item['name'], null, ['class' => "col-form-label"]); ?>
-                            </div>
-                            <div class="col-md-4">
-                                <?= Html::input('number', "BouquetForecast[type_sales_value][marketplace][{$item['id']}]", $item['value'], ['class' => 'form-control']) ?>
-                            </div>
-                        </div>
-                    <?php } ?>
-                </div>
-            </div>
-        </div>
-    </div>
-    <div class="row">
-        <div class="col-md-10"></div>
-        <div class="col-md-2">
-            <?= Html::submitButton('Сохранить', ['class' => 'btn btn-success w-100']) ?>
-        </div>
-    </div>
-    <?php ActiveForm::end(); ?>
+    <?= $this->render('_form', [
+        'model' => $model,
+        'onlineStoresList' => $onlineStoresList,
+        'bouquetCompositionProducts' => $bouquetCompositionProducts,
+        'marketplaceList' => $marketplaceList,
+        'storesTypeList' => $storesTypeList,
+        'photoUrls' => $photoUrls,
+        'photoFiles' => $photoFiles,
+        'videoUrls' => $videoUrls,
+        'processUrls' => $processUrls
+    ]); ?>
 </div>