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;
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);
$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]);
--- /dev/null
+<?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('ИД видео'));
+ }
+}
--- /dev/null
+<?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}}');
+ }
+}
* @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
{
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],
'id' => 'ID',
'guid' => 'GUID букета',
'name' => 'Название букета',
- 'matrix_type_id' => 'ИД типа матрицы',
- 'photo_id' => 'ИД фото',
- 'video_id' => 'ИД видео',
'created_at' => 'Дата создания',
'updated_at' => 'Дата обновления',
'created_by' => 'ID создателя записи',
{
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]);
+ }
+
}
--- /dev/null
+<?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']);
+ }
+}
<?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
--- /dev/null
+<?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>
+
<?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 */
$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>