From 80a4d07c7939c4e22efb19eba0eabed19971f1c5 Mon Sep 17 00:00:00 2001 From: vladfo Date: Fri, 20 Sep 2024 17:16:43 +0300 Subject: [PATCH] =?utf8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20=D0=BF?= =?utf8?q?=D0=BE=20=D0=B4=D0=B0=D1=82=D0=B0=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- erp24/controllers/crud/TaskController.php | 74 +-- erp24/views/crud/task/_form.php | 626 ++++++++++------------ erp24/views/layouts/main.php | 2 +- erp24/views/task/index.php | 2 +- 4 files changed, 336 insertions(+), 368 deletions(-) diff --git a/erp24/controllers/crud/TaskController.php b/erp24/controllers/crud/TaskController.php index 42d7f381..543b4263 100644 --- a/erp24/controllers/crud/TaskController.php +++ b/erp24/controllers/crud/TaskController.php @@ -210,7 +210,8 @@ class TaskController extends Controller $model->description = ''; $model->task_type_id = 0; $model->deadline = date("Y-m-d H:i:s", strtotime("+1 day", strtotime($model->data_start))); - + $model->data_end = date("Y-m-d H:i:s", strtotime("+1 day", strtotime($model->data_start))); + $model->group_id = 1; // Возвращаем HTML формы для рендеринга в модальном окне @@ -375,44 +376,53 @@ class TaskController extends Controller } $informOnce = false; + foreach ($attrsBefore as $name => $value) { - if (strtotime($value) == false && $attrsAfter[$name] != $value || (strtotime($value) != false && strtotime($value) != strtotime($attrsAfter[$name]))) { - if ($name == 'status') { - if ($model->status == Task::STATUS_CLOSED) { - if (!TaskService::taskCanBeClosed($model->id)) { - $model->status = $value; + + + try { + if ($value !== null && (strtotime($value) === false && $attrsAfter[$name] != $value) || (strtotime($value) !== false && strtotime($value) != strtotime($attrsAfter[$name]))) { + if ($name == 'status') { + if ($model->status == Task::STATUS_CLOSED) { + if (!TaskService::taskCanBeClosed($model->id)) { + $model->status = $value; + } else { + $model->closed_at = date("Y-m-d H:i:s"); + } + $model->save(false); } else { - $model->closed_at = date("Y-m-d H:i:s"); + $model->status_updated_at = date('Y-m-d H:i:s'); + $model->save(false); + TaskService::informStatusChange($model->id); + $informOnce = true; + if ($model->status == Task::STATUS_CLOSED) { + TaskService::createNextTaskInProject($model->id); + } } - $model->save(false); - } else { - $model->status_updated_at = date('Y-m-d H:i:s'); - $model->save(false); - TaskService::informStatusChange($model->id); + } + + if (!$informOnce && $name == "updated_by") { + TaskService::informUpdatedByChange($model->id, $value, $attrsAfter[$name]); + $informOnce = true; + } + if (!$informOnce && $name == "controller_id") { + TaskService::informControllerChange($model->id, $value, $attrsAfter[$name]); $informOnce = true; - if ($model->status == Task::STATUS_CLOSED) { - TaskService::createNextTaskInProject($model->id); - } } - } - if (!$informOnce && $name == "updated_by") { - TaskService::informUpdatedByChange($model->id, $value, $attrsAfter[$name]); - $informOnce = true; - } - if (!$informOnce && $name == "controller_id") { - TaskService::informControllerChange($model->id, $value, $attrsAfter[$name]); - $informOnce = true; + // Логирование изменений + $taskLogs = new TaskLogs(); + $taskLogs->task_id = $model->id; + $taskLogs->name = "~~~"; + $taskLogs->created_at = date("Y-m-d H:i:s"); + $taskLogs->field_name = $name; + $taskLogs->value_before = $value ?? ''; + $taskLogs->value_after = $attrsAfter[$name]; + $taskLogs->save(false); } - - $taskLogs = new TaskLogs(); - $taskLogs->task_id = $model->id; - $taskLogs->name = "~~~"; - $taskLogs->created_at = date("Y-m-d H:i:s"); - $taskLogs->field_name = $name; - $taskLogs->value_before = $value ?? ''; - $taskLogs->value_after = $attrsAfter[$name]; - $taskLogs->save(false); + } catch (\Exception $e) { + Yii::error("Ошибка при обновлении задачи: " . $e->getMessage()); + Yii::$app->session->setFlash('error', 'Произошла ошибка при обновлении задачи. Пожалуйста, попробуйте еще раз.'); } } diff --git a/erp24/views/crud/task/_form.php b/erp24/views/crud/task/_form.php index 040cae96..4bf0270b 100755 --- a/erp24/views/crud/task/_form.php +++ b/erp24/views/crud/task/_form.php @@ -4,20 +4,19 @@ use yii\helpers\Html; use yii\helpers\Url; use yii\widgets\ActiveForm; use yii\helpers\ArrayHelper; + use kartik\select2\Select2; use dosamigos\datetimepicker\DateTimePicker; + use yii_app\records\Admin; + +use yii_app\helpers\PrintBlockHelper; use yii_app\services\FileService; /* @var $this yii\web\View */ /* @var $model yii_app\records\Task */ /* @var $form yii\widgets\ActiveForm */ -/* @var $comment yii_app\records\Comment|null */ -/* @var $entities array */ -/* @var $taskEntity array */ -/* @var $tasksType array */ -/* @var $taskStatus array */ -/* @var $taskAlertLevels array */ +/* @var $comment \yii_app\records\Comment */ /* @var $canUpdateAll boolean */ /* @var $canUpdateStatusAndDuration boolean */ @@ -25,358 +24,317 @@ $this->registerJsFile('/js/crud/task/update.js', ['position' => \yii\web\View::P ?> -
+
- ['enctype' => 'multipart/form-data']]); ?> + ['enctype' => 'multipart/form-data']]); ?>
field($model, 'id')->hiddenInput()->label(false) ?>
-
- - field($model, 'task_type_id')->dropDownList( - ArrayHelper::map($tasksType, 'id', 'name'), - ['disabled' => $canUpdateAll ? null : 'disabled'] - )->label(false); ?> -
- -
- - field($model, 'name')->textInput([ - 'maxlength' => true, - 'disabled' => $canUpdateAll ? null : 'disabled' - ])->label(false); ?> -
- -
- - field($model, 'description')->textarea([ - 'rows' => 6, - 'disabled' => $canUpdateAll ? null : 'disabled' - ])->label(false); ?> -
- -
- - field($model, 'entity_type')->widget(Select2::class, [ - 'data' => ArrayHelper::map($taskEntity, 'id', 'name'), - 'language' => 'ru', - 'options' => ['placeholder' => 'Тип сущности для привязки...'], - 'pluginOptions' => [ - 'allowClear' => true, - 'disabled' => !$canUpdateAll - ], - 'pluginEvents' => [ - "change" => "function() { - var value= $(this).val(); - console.log(value); - $.ajax({ - method: 'POST', - dataType: 'text', - url: window.location.href, - data: { value : value }, - success: function (response) { - var r = JSON.parse(response); - console.log(r); - var myDropDownList = document.getElementById('task-entity_id'); - while (myDropDownList.options.length > 0) { - myDropDownList.remove(myDropDownList.options.length - 1); - } - $.each(r, function(index, value) { - var option = document.createElement(\"option\"); - option.text = value; - option.value = index; - try { - myDropDownList.options.add(option); - } catch (e) { - alert(e); - } - }); + field($model, 'task_type_id')->dropDownList( + ArrayHelper::map($tasksType, 'id', 'name'), ['disabled' => $canUpdateAll ? null : 'disabled'])->label(false)); ?> + + field($model, 'name')->textInput(['maxlength' => true, 'disabled' => $canUpdateAll ? null : 'disabled'])->label(false)) ?> + + field($model, 'description')->textarea(['rows' => 6, 'disabled' => $canUpdateAll ? null : 'disabled'])->label(false)) ?> + + field($model, 'group_id')->textInput() ?> + + field($model, 'entity_type')->widget(Select2::class, [ + 'data' => ArrayHelper::map($taskEntity, 'id', 'name'), + 'language' => 'ru', + 'options' => ['placeholder' => 'Тип сущности для привязки...'], + 'pluginOptions' => [ + 'allowClear' => true, + 'disabled' => !$canUpdateAll + ], + 'pluginEvents' => [ + "change" => "function() { + var value= $(this).val(); + + $.ajax({ + method: 'POST', + dataType: 'text', + url: window.location.href, + data: { value : value }, + success: function (response) { + var r = JSON.parse(response); + var myDropDownList = document.getElementById('task-entity_id'); + while (myDropDownList.options.length > 0) { + myDropDownList.remove(myDropDownList.options.length - 1); } - }); - }", - ] - ])->label(false); ?> -
- -
- - field($model, 'entity_id')->dropDownList( - $entities, - ['disabled' => $canUpdateAll ? null : 'disabled'] - )->label(false); ?> -
- -
- - field($model, 'status')->dropDownList( - ArrayHelper::map($taskStatus, 'id', 'name'), - ['disabled' => $canUpdateStatusAndDuration ? null : 'disabled'] - )->label(false); ?> -
- -
- - field($model, 'prioritet')->dropDownList( - [ - 0 => 'Очень низкий', - 1 => 'Низкий', - 2 => 'Терпит', - 3 => 'Можно не спешить', - 4 => 'Пониженый', - 5 => 'Обычный', - 6 => 'Повышенный', - 7 => 'Ниже среднего', - 8 => 'Средний', - 9 => 'Высокий', - 10 => 'Самая важная' - ], - ['prompt' => 'Выберите приоритет'] // Опционально: можно добавить "пустую" опцию - )->label(false); ?> -
- -
- -
-
Продолжительность
-
- duration); - $value = $paramArray[0] ?? 0; - $scale = $paramArray[1] ?? 'm'; // По умолчанию "минуты" - ?> - - - /> - - - - - - -
-
- - -
- field($model, 'duration')->hiddenInput()->label(false) ?> -
-
- - - - - -
- - field($model, 'data_start')->widget(DateTimePicker::class, [ - 'language' => 'ru', - 'template' => '{input}', - 'clientOptions' => [ - 'autoclose' => true, - 'format' => 'yyyy-mm-dd hh:ii', - 'todayBtn' => true + }", + ] + ])->label(false)) ?> + + field($model, 'entity_id')->textInput() ?> + + field($model, 'entity_id')->dropDownList($entities, ['disabled' => $canUpdateAll ? null : 'disabled'])->label(false)) ?> + + + field($model, 'entity_type')->dropDownList( + // ArrayHelper::map($entityType, 'id', 'name')) ?> + + field($model, 'status')->dropDownList( + ArrayHelper::map($taskStatus, 'id','name'), ['disabled' => $canUpdateStatusAndDuration ? null : 'disabled'])->label(false)) ?> + + field($model, 'prioritet')->dropDownList( + [ + 0 => 'Очень низкий', + 1 => 'Низкий', + 2 => 'Терпит', + 3 => 'Можно не спешить', + 4 => 'Пониженный', + 5 => 'Обычный', + 6 => 'Повышенный', + 7 => 'Ниже среднего', + 8 => 'Средний', + 9 => 'Высокий', + 10 => 'Самая важная' ], - ])->label(false); ?> -
- -
- - field($model, 'data_end')->widget(DateTimePicker::class, [ - 'language' => 'ru', - 'template' => '{input}', - 'clientOptions' => [ - 'autoclose' => true, - 'format' => 'yyyy-mm-dd hh:ii', - 'todayBtn' => true - ], - ])->label(false); ?> -
- -deadline_permission != 0 || ($model->controller && ($model->controller->id == $_SESSION['admin_id']))): ?> -
- - field($model, 'deadline')->widget(DateTimePicker::class, [ + ['prompt' => 'Выберите приоритет'] // Опционально: можно добавить "пустую" опцию + )->label(false) + ); + ?> + + + + + + + + field($model, 'duration')->textInput(['type' => 'number'])->label(false)) ?> + + field($model, 'is_completed')->textInput() ?> + + field($model, 'data_start')->widget(DateTimePicker::class, [ + 'language' => 'ru', + 'template' => '{input}', + 'clientOptions' => [ + 'autoclose' => true, + 'format' => 'yyyy-m-d H:i:s', + 'todayBtn' => true + ], + ])->label(false)) ?> + + field($model, 'data_end')->widget(DateTimePicker::class, [ + 'language' => 'ru', + 'template' => '{input}', + 'clientOptions' => [ + 'autoclose' => true, + 'format' => 'yyyy-m-d H:i:s', + 'todayBtn' => true + ], + ])->label(false)) ?> + + field($model, 'data_start', [ + 'inputOptions' => [ + 'class' => 'form-control datetime', + 'type' => 'datetime-local', + ], + 'options' => ['tag' => null], + ])->textInput()->label(false)) */ ?> + + field($model, 'data_start')->textInput() // календарь ?> + + deadline_permission != 0 || ($model->controller && ($model->controller->id == $_SESSION['admin_id']))) { + PrintBlockHelper::printBlock('Крайний срок', $form->field($model, 'deadline')->widget(DateTimePicker::class, [ 'language' => 'ru', 'template' => '{input}', 'clientOptions' => [ 'autoclose' => true, - 'format' => 'yyyy-mm-dd hh:ii', + 'format' => 'yyyy-m-d H:i:s', 'todayBtn' => true ], - ])->label(false); ?> -
- - -
- - field($model, 'alert_level_id')->dropDownList( - ArrayHelper::map($taskAlertLevels, 'id', 'name'), - ['disabled' => $canUpdateAll ? null : 'disabled'] - )->label(false); ?> -
- -
- - field($model, 'motivation_id')->dropDownList( - ArrayHelper::map(\yii_app\records\TaskMotivation::find()->all(), 'id', 'name'), - ['disabled' => $canUpdateAll ? null : 'disabled'] - )->label(false); ?> -
- -with('adminGroup')->all() as $admin) { - $adminArr[] = ['id' => $admin->id, 'name' => $admin->name, 'groupName' => $admin->adminGroup->name ?? "Другие"]; -} -$admins = ArrayHelper::map($adminArr, 'id', 'name', 'groupName'); -?> - -
- - field($model, 'updated_by')->widget(Select2::class, [ - 'data' => $admins, - 'language' => 'ru', - 'options' => ['placeholder' => 'Кому адресовать задачу...'], - 'pluginOptions' => [ - 'allowClear' => true, - 'disabled' => !$canUpdateAll - ], - ])->label(false); ?> -
+ ])->label(false)); + } + + ?> + + field($model, 'deadline', [ + 'inputOptions' => [ + 'class' => 'form-control datetime', + 'type' => 'datetime-local', + ], + 'options' => ['tag' => null], + ])->textInput()->label(false)) */ ?> + + field($model, 'dead_line')->textInput() // календарь ?> + + field($model, 'data_end')->textInput() ?> + + field($model, 'result')->textarea(['rows' => 6]) ?> + + field($model, 'updated_by')->textInput() // проверяющий id должен быть в бд, а поле это "для кого" подтягивается из админа ?> + + field($model, 'alert_level_id')->dropDownList( + ArrayHelper::map($taskAlertLevels, 'id', 'name'), ['disabled' => $canUpdateAll ? null : 'disabled'])->label(false)) ?> + + field($model, 'motivation_id')->dropDownList( + ArrayHelper::map(\yii_app\records\TaskMotivation::find()->all(), 'id', 'name'), ['disabled' => $canUpdateAll ? null : 'disabled'])->label(false)) ?> + + with('adminGroup')->all() as $admin) { + $adminArr[] = ['id' => $admin->id, 'name' => $admin->name, 'groupName' => $admin->adminGroup->name ?? "Другие"]; + } + + ?> + + + + field($model, 'updated_by')->widget(Select2::class, [ + 'data' => $admins, + 'language' => 'ru', + 'options' => ['placeholder' => 'Кому адресовать задачу...'], + 'pluginOptions' => [ + 'allowClear' => true, + 'disabled' => !$canUpdateAll + ], + ])->label(false)); ?> + + field($model, 'controller_id')->widget(Select2::class, [ + 'data' => $admins, + 'language' => 'ru', + 'options' => ['placeholder' => 'Кто контроллирует задачу...'], + 'pluginOptions' => [ + 'allowClear' => true, + 'disabled' => !$canUpdateAll + ], + ])->label(false)); ?> + + 'taskUsers', + 'value' => array_values(ArrayHelper::map($model->users, 'id', 'id')), + 'data' => $admins, + 'options' => ['multiple' => true, 'placeholder' => 'Выберете участников ...'], + 'pluginOptions' => [ + 'disabled' => !$canUpdateAll + ], + ])); ?> + + 'taskViewers', + 'value' => array_values(ArrayHelper::map($model->viewers, 'id', 'id')), + 'data' => $admins, + 'options' => ['multiple' => true, 'placeholder' => 'Выберете наблюдателей ...'], + 'pluginOptions' => [ + 'disabled' => !$canUpdateAll + ], + ])); ?> + + field($model, 'created_by')->textInput() // создаётся из под того кто сидит ?> + + field($model, 'created_at')->textInput() // автоматом в момент создания ?> + + field($model, 'updated_at')->textInput() ?> + + field($model, 'close_at')->textInput() ?> + + field($model, 'closed_by')->textInput() ?> + + attachedFiles): ?> +
+ attachedFiles as $file): ?> +
+ file_type == 'image'): ?> + img + + url)?> + +
+ +
+ -
- - field($model, 'controller_id')->widget(Select2::class, [ - 'data' => $admins, - 'language' => 'ru', - 'options' => ['placeholder' => 'Кто контроллирует задачу...'], - 'pluginOptions' => [ - 'allowClear' => true, - 'disabled' => !$canUpdateAll - ], - ])->label(false); ?> -
+ +
'); ?> +
- - 'taskUsers', - 'value' => array_values(ArrayHelper::map($model->users, 'id', 'id')), - 'data' => $admins, - 'options' => ['multiple' => true, 'placeholder' => 'Выберете участников ...'], - 'pluginOptions' => [ - 'disabled' => !$canUpdateAll - ], - ]); ?> + 'btn btn-success btn-lg']) ?>
-
- - 'taskViewers', - 'value' => array_values(ArrayHelper::map($model->viewers, 'id', 'id')), - 'data' => $admins, - 'options' => ['multiple' => true, 'placeholder' => 'Выберете наблюдателей ...'], - 'pluginOptions' => [ - 'disabled' => !$canUpdateAll - ], -]); ?> -
+ - attachedFiles): ?> -
- attachedFiles as $file): ?> -
- file_type == 'image'): ?> - img - - url) ?> - -
- -
- + + 'comment-form', 'options' => ['enctype' => 'multipart/form-data']]) ?> + field($comment, 'msg')->textInput()->label(false)) ?> - -
- -
- -
-
- +
'); ?>
- 'btn btn-success btn-lg']) ?> + 'btn btn-success btn']) ?>
- - - - - 'comment-form', 'options' => ['enctype' => 'multipart/form-data']]) ?> -
- - field($comment, 'msg')->textInput()->label(false) ?> -
- -
- -
- + + + comments)): ?> + comments as $cmnt): ?> +
+
+ createdBy->name ?> (created_at) ?>):
-
- -
- 'btn btn-success btn']) ?> -
- - - - comments)): ?> - comments as $cmnt): ?> -
-
- createdBy->name ?> (created_at) ?>): -
-
- msg ?> - attachedFiles)): ?> - attachedFiles as $file): ?> - file_type == 'image'): ?> - url), [$file->url], ['class' => 'btn btn-link', 'target' => '_blank']) ?> - - url), ['/files/download', 'url' => $file->url], ['class' => 'btn btn-link']) ?> - - - -
+
+ msg ?> + attachedFiles)): ?> + attachedFiles as $file): ?> + file_type == 'image'): ?> + url), [$file->url], ['class' => 'btn btn-link', 'target' => '_blank']) ?> + + url), ['/files/download', 'url' => $file->url], ['class' => 'btn btn-link']) ?> + + +
- - -
\ No newline at end of file +
+ + +
+ \ No newline at end of file diff --git a/erp24/views/layouts/main.php b/erp24/views/layouts/main.php index 56b170f7..881b4bf6 100755 --- a/erp24/views/layouts/main.php +++ b/erp24/views/layouts/main.php @@ -11,7 +11,7 @@ app\assets\JQueryPluginsAsset::register($this); /** @TODO удалить пос ?> beginPage() ?> - + diff --git a/erp24/views/task/index.php b/erp24/views/task/index.php index e3523701..1c53901d 100755 --- a/erp24/views/task/index.php +++ b/erp24/views/task/index.php @@ -111,7 +111,7 @@ function writeNode($node, $selectedNode, $depth, $writePosit) {
- 'btn btn-light mb-2', 'onClick' => 'editTask(' . $task->id . ')'])?> + $task->id], ['class' => 'btn btn-primary ml-2']) ?> status == 5 && $task->controller_id == $_SESSION['admin_id']): ?> id)): ?> 'accept-proofs-form', 'options' => ['data-pjax' => true]]); ?> -- 2.39.5