OSDN Git Service

b6804498e8e5c80c18008e2060678d3ee3d130c3
[invent/invent.git] / controllers / ItemsController.php
1 <?php
2
3 namespace app\controllers;
4
5 use Yii;
6 use app\models\Items;
7 use app\models\Import;
8 use app\models\Check;
9 use app\models\Moving;
10 use app\models\Locations;
11 use app\models\ItemsSearch;
12 use app\models\MovingSearch;
13 use app\models\Status;
14 use app\models\User;
15 use yii\web\Controller;
16 use yii\web\NotFoundHttpException;
17 use yii\web\UploadedFile;
18 use yii\filters\VerbFilter;
19
20 use kartik\mpdf\Pdf;
21 use \phpexcel;
22
23 #require "/vendor/phpoffice/phpexcel/Classes/PHPExcel.php";
24
25 /**
26  * ItemsController implements the CRUD actions for Items model.
27  */
28 class ItemsController extends Controller
29 {
30     /**
31      * {@inheritdoc}
32      */
33     public function behaviors()
34     {
35         return [
36             'verbs' => [
37                 'class'   => VerbFilter::className(),
38                 'actions' => [
39                     'delete' => [ 'POST' ],
40                 ],
41             ],
42         ];
43     }
44
45     /**
46      * Добавление предмета/оборудование если его нет
47      * @param array $options
48      *        string 'invent'
49      *        string 'model'
50      *        string 'comment'
51      *        integer|NULL 'type_id'
52      *        string|NULL 'typeName'
53      *        string|NULL 'name'
54      *        string|NULL 'os'
55      *        string|NULL 'mac'
56      *        string|NULL 'serial'
57      *        string|NULL 'product'
58      *        string|NULL 'modelnum'
59      * @return integer|FALSE
60      */
61     public static function addIfNeed($options)
62     {
63         // Если указан инвентарный номер
64         if (is_array($options) && isset($options[ 'invent' ]))
65         {
66             $item = Items::find()
67                 ->where([ 'like', 'invent', $options[ 'invent' ]]); // Ищем оборудование с инвентарным номером.
68             // Если указан серийный номер
69             if (isset($options[ 'serial' ])) {
70                 $item = $item->andWhere([ 'like', 'serial', $options[ 'serial' ]]); // Ищем дополнительно с серийным номером
71             }
72             $item = $item->all(); // Получаем все записи
73
74             if (count($item) > 0) // Записи найдены, выводим первую совпавшую
75             {
76                 return $item[0]->id;
77             }
78             // Внесённого оборудования не найдено. Добавим новую запись
79             if (isset($options[ 'model' ]))
80             {
81                 // Если указан тип предмета/оборудования
82                 if (isset($options[ 'typeName' ]))
83                 {
84                     $type_id = TypesController::addIfNeed($options[ 'typeName' ]); // Найдём или добавим тип
85                     // Если тип не добавили
86                     if($type_id === FALSE)
87                     {
88                         $type_id = NULL; // сделаем его пустым
89                     }
90                 }
91                 else
92                 {
93                     // Если указан идентификатор типа, укажем его
94                     $type_id = isset($options[ 'type_id' ]) ? $options[ 'type_id' ] : NULL;
95                 }
96                 // Создаём новую запись предмета/оборудования
97                 $item = new Items();
98                 $item->name        = isset($options[ 'name' ]) ? $options[ 'name' ] : NULL;       // Сетевое имя
99                 $item->model       = isset($options[ 'model' ]) ? $options[ 'model' ] : NULL;     // Наименование
100                 $item->invent      = isset($options[ 'invent' ]) ? $options[ 'invent' ] : NULL;   // Инвентарный номер
101                 $item->comment     = isset($options[ 'comment' ]) ? $options[ 'comment' ] : NULL; // Коментарий
102                 $item->type_id     = $type_id;                                                    // Идентификатор типа
103                 $item->os          = isset($options[ 'os' ]) ? $options[ 'os' ] : NULL;           // Операционная система
104                 $item->mac         = isset($options[ 'mac' ]) ? $options[ 'mac' ] : NULL;         // MAC-адрес
105                 $item->serial      = isset($options[ 'serial' ]) ? $options[ 'serial' ] : NULL;   // Серийный номер
106                 $item->product     = isset($options[ 'product' ]) ? $options[ 'product' ] : NULL; // Код оборудования
107                 $item->modelnumber = isset($options[ 'modelnumber' ]) ? $options[ 'modelnumber' ] : NULL; // Номер модели
108                 $item->checked     = false;                                                       // Не инвентризирован (требует внимания после импорта)
109                 // Сохраняем запись
110                 if ($item->validate() && $item->save())
111                 {
112                     return $item->id; // Возвращаем идентификатор записанного оборудования
113                 }
114             }
115         }
116         return FALSE;
117     }
118
119     /**
120      * Формирование PDF файла для печати QR-кодов для наклеек
121      * @param integer|array|null id
122      * @return mixed
123      */
124     public function actionPrint()
125     {
126         if (! User::canPermission('takingInventory') ) {
127             return $this->redirect(['site/index']);
128         }
129         // Список предметов/оборудования, если есть
130         $id = Yii::$app->request->get('id');
131
132         $models = Items::find();
133         if (isset($id))
134             if (is_array($id))
135             {
136                 $models = $models->where([ 'in', 'id', $id ]); // Несколько предметов/оборудования
137             } else
138             {
139                 $models = $models->where([ 'id' => $id ]); // Один предмет/оборудование
140             }
141         $models = $models->all(); // Формирование списка
142
143         $pdf = Yii::$app->pdf; // Pабота с PDF
144
145         $pdf->methods[ 'SetHeader' ] = ''; // Yii::t('items', 'Items');
146         $pdf->methods[ 'SetFooter' ] = ''; // ['{PAGENO}'];
147         // Границы листа
148         $pdf->marginLeft   = 5;
149         $pdf->marginRight  = 5;
150         $pdf->marginTop    = 9;
151         $pdf->marginBottom = 15;
152         // Имя файла для выгрузки, по умолчанию document.pdf
153         $pdf->filename     = Yii::t('app', Yii::$app->name) . ' (' . Yii::t('items', 'Items') . ').pdf';
154
155         // Заполнение страницы данными
156         $pdf->content = $this->renderPartial('print', [ 'models' => $models ]);
157
158         // Выгрузка PDF
159         return $pdf->render();
160     }
161
162     /**
163      * Процедура начала инвентаризации.
164      * @return mixed
165      */
166     public function actionStart_checking()
167     {
168         // Проверка доступа для проведения инвентаризации
169         if (! User::canPermission('takingInventory') ) {
170             // Переход к списку предметов/оборудования, если доступ не разрешён.
171             return $this->redirect(['index']);
172         }
173         // Запрос на получение списка идентификаторов предметов/оборудования, которые списаны
174         $modelS = Moving::find()
175             ->select('item_id')
176             ->joinWith('status')
177             ->Where([ 'ilike', Status::tableName() . '.name', 'Списано' ]);
178
179         // Получаем список всех предметов/оборудования, кроме списанного
180         $model = Items::find()
181             ->select('id')
182             ->innerJoin([ 'm' => $modelS ], 'not m.item_id = id')
183             ->all();
184
185         // Устанавливаем флаг непроинвентаризированных для всех предметов/оборудования из полученного списка.
186         Items::updateAll([ 'checked' => false ], [ 'in', 'id', $model ]);
187
188         // Переход к списку предметов/оборудования.
189         return $this->redirect([ 'index' ]);
190     }
191
192     /**
193      * Инвентаризация
194      * @param string|null $qrcheck считанный QR-код
195      * @return mixed
196      */
197      public function actionCheck()
198      {
199         // Проверка доступа для проведения инвентаризации
200         if (! User::canPermission('takingInventory') ) {
201             // Показ стартовой страницы, если доступ не разрешён.
202             return $this->redirect(['site/index']);
203         }
204
205         $model = new Check();
206         $message = '';
207         if ($model->load(Yii::$app->request->post()))
208         {
209             if ((! empty($model->qrcheck)) && strpos($model->qrcheck, ',') !== false)
210             {
211                 $keys = explode(',', $model->qrcheck);
212                 Items::updateAll([ 'checked' => true ], [ 'invent' => trim($keys[ 0 ]), 'serial' => trim($keys[ 1 ]) ]);
213                 $items = Items::find()->where([ 'invent' => trim($keys[ 0 ]), 'serial' => trim($keys[ 1 ]) ])->all();
214                 //$message = '[0] = "' . $keys[0] . '", [1] = "' . $keys[1] . '"<br />';
215                 foreach ($items as $row)
216                 {
217                     $message .= $row->model . ' (' . $row->id . ')';
218                 }
219                 if ($message != '')
220                     $message = Yii::t('items', 'Checked item(s): ') . $message;
221                 $model->qrcheck = '';
222             }
223         }
224         $searchModel = new ItemsSearch();
225         $dataProvider = $searchModel->noinvent($model);
226
227         return $this->render('check', [
228             'message'      => $message,
229             'model'        => $model,
230             'searchModel'  => $searchModel,
231             'dataProvider' => $dataProvider,
232         ]);
233      }
234
235     /**
236      * Список всех предметов/оборудования.
237      * @return mixed
238      */
239     public function actionIndex()
240     {
241         if (! User::canPermission('createRecord') ) {
242             return $this->redirect(['site/index']);
243         }
244         $searchModel = new ItemsSearch();
245         $dataProvider = $searchModel->search(Yii::$app->request->queryParams);
246
247         return $this->render('index', [
248             'searchModel' => $searchModel,
249             'dataProvider' => $dataProvider,
250         ]);
251     }
252
253     /**
254      * Импорт данных из файла csv
255      * Структура файла данных при выгрузке из 1С:
256      * | № п/п |  | Предмет/оборудование |  |  |  |  |  |  | Инвентарный номер | Материально отвественное лицо |  |  | Место размещения | Регион/подразделение | Количество |
257      * | 0     | 1| 2                    | 3| 4| 5| 6| 7| 8| 9                 |10                             |11|12|13                |14                    |15          |
258      * | A     | B| C                    | D| E| F| G| H| I| J                 | K                             | L| M| N                | O                    | P          |
259      * Так как 1С из коробки не умеет выгружать форму в .csv, то приходится сначала выгрузить в .xls(x), и уже из MS Excel/Lible office Calc сохранять в .csv
260      */
261     public function actionImport()
262     {
263         if (! User::canPermission('updateRecord') ) {
264             return $this->redirect(['site/index']);
265         }
266         $model   = new Import();
267         $count   = 0;
268         $counti  = 0;
269         $skip    = 0;
270         $existi  = 0;
271         $errors  = '';
272         $message = '';
273         $searchModel = new ItemsSearch();
274         $dataProvider = $searchModel->search(Yii::$app->request->queryParams);
275         if (Yii::$app->request->isPost)
276         {
277             $nppColumnName         = Yii::t('import', 'No. in order');
278             $itemColumnName        = Yii::t('import', 'Primary means');
279             $netColumnName         = Yii::t('import', 'Network name');
280             $inventColumnName      = Yii::t('import', 'Inventory number');
281             $molColumnName         = Yii::t('import', 'Financially responsible person');
282             $osColumnName          = Yii::t('import', 'Operation system');
283             $macColumnName         = Yii::t('import', 'MAC address');
284             $serialColumnName      = Yii::t('import', 'Serial number');
285             $ProdictColumnName     = Yii::t('import', 'Product number');
286             $modelNumberColumnName = Yii::t('import', 'Model number');
287             $dateColumnName        = Yii::t('import', 'Date of acceptance for registration');
288             $locationColumnName    = Yii::t('import', 'Location');
289             $regionColumnName      = Yii::t('import', 'Region');
290             $typeColumnName        = Yii::t('import', 'Type');
291
292             $model->filecsv = UploadedFile::getInstance($model, 'filecsv');
293             if ($model->upload())
294             {
295                 $fileName = 'upload/' . $model->filecsv->baseName . '.' . $model->filecsv->extension;
296                 $handle = fopen($fileName, 'r');
297                 if ($handle !== FALSE)
298                 {
299                     if (strcasecmp($model->filecsv->extension, 'csv') === 0 )
300                     {
301                         while (($row = fgetcsv($handle, 1024, ';')) !== false )
302                         {
303                             if (intval($row[ 0 ]) . '' == $row[ 0 ])
304                             {
305                                 $location = $row[ 13 ];
306                                 $region   = $row[ 14 ];
307                                 $count++;
308                                 $location_id = LocationsController::addIfNeed([ 'name' => $location, 'region' => $region ]);
309                                 if ($location_id !== FALSE)
310                                 {
311                                     $invent  = $row[ 9 ];
312                                     if (count(Items::find()->where([ 'like', 'invent', $invent ])->all()) == 0)
313                                     {
314                                         $model_  = $row[ 2 ];
315                                         $comment = Yii::t('moving', 'Imported. {comment}', [ 'comment' => $row[ 10 ] ]);
316                                         $item_id = $this::addIfNeed([ 'invent' => $invent, 'model' => $model_, 'comment' => $comment ]);
317                                         if ( $item_id !== FALSE)
318                                         {
319                                             $date = date('d.m.Y');
320                                             $state_id = StatusController::addIfNeed([ 'name' => 'Склад' ]);
321                                             if ($state_id === FALSE)
322                                             {
323                                                 $state_id = NULL;
324                                             } // Состояние предмета/оборудование
325
326                                             $moving = new Moving();
327                                             $moving->date = $date;
328                                             $moving->item_id = $item_id;
329                                             $moving->state_id = $state_id;
330                                             $moving->location_id = $location_id;
331                                             $moving->comment = $comment;
332                                             if ($moving->validate() && $moving->save())
333                                             {
334                                                 $counti++;
335                                             } // Добавление перемещение
336                                             else
337                                             {
338                                                 Items::find([ 'id' => $item_id ])->delete();
339                                                 $skip++;
340                                                 $errors .= '<br>Движение: ' . implode(';', $row);
341                                             } // Не удалось добавить перемещение
342                                             unset($moving);
343                                         }
344                                     } // Предмет/оборудование добавлено
345                                     else
346                                     {
347                                         $existi++;
348                                     } // Предмет/оборудование уже есть
349                                 }
350                                 else
351                                 {
352                                     $skip++;
353                                     $errors .= '<br>Место расположения: ' . implode(';', $row);
354                                 } // не удалось найти или добавить место размещения
355                             } // Строка с данными
356                         } // Перебор строк файла
357                     } else // xls файлы
358                     {
359                         $fileName = 'upload/' . $model->filecsv->baseName . '.' . $model->filecsv->extension;
360                         $inputFileType = \PHPExcel_IOFactory::identify($fileName); // Получение типа данных в файле
361                         $excelReader = \PHPExcel_IOFactory::createReader($inputFileType); // Создание потока чтения из файла
362                         $excelObj = $excelReader->load($fileName); // Открытие файла
363                         $worksheet = $excelObj->getSheet(0);       // Работаем только с первым листом (обычно туда выгружает 1С)
364                         // Индексы ячеек
365                         $modelInd       = NULL;
366                         $nameInd        = NULL;
367                         $inventInd      = NULL;
368                         $commentInd     = NULL;
369                         $osInd          = NULL;
370                         $macInd         = NULL;
371                         $serialInd      = NULL;
372                         $productInd     = NULL;
373                         $modelnumberInd = NULL;
374                         $dateInd        = NULL;
375                         $locationInd    = NULL;
376                         $regionInd      = NULL;
377                         $typeInd        = NULL;
378
379                         // Цикл по всем строкам
380                         $rowNum = 0;
381                         $lastColumn = $worksheet->getHighestColumn();
382                         foreach ($worksheet->getRowIterator() as $row)
383                         {
384                             $rowNum++;
385                             $cellIterator = $row->getCellIterator(); // Получаем итератор ячеек в строке
386                             $cellIterator->setIterateOnlyExistingCells(FALSE); // Указываем проверять даже не установленные ячейки
387                             
388                             //$myRow = []; // Массив ячеек исключительно для тестирования
389                             $flag = FALSE; // Признак строки шапки
390                             if ($inventInd === NULL) // Пока не найдена шапка, проверяем строку
391                                 foreach($cellIterator as $key => $cell)
392                                 {
393                                     if (($key == 'A') && (stripos($cell->getValue(), '№') !== FALSE) ) $flag = TRUE; // Если строка шапка, установим флаг
394                                     
395                                     if ($flag) // Работаем с шапкой
396                                     {
397                                         $counti = $rowNum;
398                                         $val = $cell->getValue(); // Получаем значение ячейки
399                                         if (stripos($val, 'Основное средство') !== FALSE) $modelInd       = $key; // Фиксируем колонку, в которой предмет/оборудование
400                                         if (stripos($val, 'Сетевое имя')       !== FALSE) $nameInd        = $key; // Фиксируем колонку, в которой сетевое имя
401                                         if (stripos($val, 'Инвентарный номер') !== FALSE) $inventInd      = $key; // Фиксируем колонку, в которой инвентарный номер
402                                         if (stripos($val, 'МОЛ')               !== FALSE) $commentInd     = $key; // Фиксируем колонку, в которой Комментарии
403                                         if (stripos($val, 'Операционная система') !== FALSE) $osInd       = $key; // Фиксируем колонку, в которой операционная система
404                                         if (stripos($val, 'Сетевой адрес')     !== FALSE) $macInd         = $key; // Фиксируем колонку, в которой сетевой адрес
405                                         if (stripos($val, 'Серийный номер')    !== FALSE) $serialInd      = $key; // Фиксируем колонку, в которой серийный номер
406                                         if (stripos($val, 'Код продукта')      !== FALSE) $productInd     = $key; // Фиксируем колонку, в которой код продукта
407                                         if (stripos($val, 'Номер модели')      !== FALSE) $modelnumberInd = $key; // Фиксируем колонку, в которой номер модели
408                                         if (stripos($val, 'Дата')              !== FALSE) $dateInd        = $key; // Фиксируем колонку, в которой дата постановки на учёт
409                                         if (stripos($val, 'ИФО')               !== FALSE) $locationInd    = $key; // Фиксируем колонку, в которой место хранения
410                                         if (stripos($val, 'Место хранения')    !== FALSE) $regionInd      = $key; // Фиксируем колонку, в которой регион/подразделение
411                                         if (stripos($val, 'Тип')               !== FALSE) $typeInd        = $key; // Фиксируем колонку, в которой тип оборудования
412                                     }
413                                     
414                                     //array_push($myRow, '['.$key.']:' . $cell->getValue()); // Наполнение массива ячеек
415                                 }
416                             else
417                             {
418                                 $npp = str_replace(' ', '', $worksheet->getCell('A'.$rowNum)->getValue());
419                                 if (ctype_digit($npp))
420                                 {
421                                     if (($modelInd === NULL) || ($inventInd === NULL) || ($locationInd === NULL) || ($regionInd === NULL))
422                                     {
423                                         $errors .= '<br>одно из важных полей отсутствует';
424                                         break;
425                                     }
426                                     $location = $worksheet->getCell($locationInd . $rowNum)->getValue();
427                                     $region   = $worksheet->getCell($regionInd . $rowNum)->getValue();
428                                     $location_id = LocationsController::addIfNeed([ 'name' => $location, 'region' => $region ]); // Получение идентификатора расположения
429                                     if ($location_id !== FALSE)
430                                     {
431                                         $count++; // Посчитаем строку оборудования
432                                         $invent = $worksheet->getCell($inventInd . $rowNum)->getValue(); // Инвентарный номер
433                                         if (count(Items::find()->where([ 'like', 'invent', $invent ])->all()) == 0)
434                                         {
435                                             $model_ = $worksheet->getCell($modelInd . $rowNum)->getValue();
436                                             $comment = $commentInd !== NULL ? Yii::t('moving', 'Imported. {comment}', [ 'comment' => $worksheet->getCell($commentInd . $rowNum)->getValue() ]) : NULL; // Комментарии
437                                             $item_id = ($typeInd !== NULL ? 
438                                                 $this::addIfNeed([ 'invent' => $invent, 'model' => $model_, 'comment' => $comment, 'typeName' => $worksheet->getCell($typeInd . $rowNum)->getValue() ]) : 
439                                                 $this::addIfNeed([ 'invent' => $invent, 'model' => $model_, 'comment' => $comment ])); // Получение идентификатора оборудования
440                                             if ($item_id !== FALSE)
441                                             {
442                                                 $date = $dateInd !== NULL ? $worksheet->getCell($dateInd . $rowNum)->getValue() : date('d.m.Y');
443                                                 if ($date  == '#NULL!') $date = date('d.m.Y');
444
445                                                 $state_id = StatusController::addIfNeed([ 'name' => 'Склад' ]);
446                                                 if ($state_id === FALSE)
447                                                 {
448                                                     $state_id = NULL;
449                                                 } // Состояние предмета/оборудование
450
451                                                 $moving = new Moving();
452                                                 $moving->date = $date;
453                                                 $moving->item_id = $item_id;
454                                                 $moving->state_id = $state_id;
455                                                 $moving->location_id = $location_id;
456                                                 $moving->comment = $comment;
457                                                 if ($moving->validate() && $moving->save())
458                                                 {
459                                                     $counti++;
460                                                 } // Добавление перемещение
461                                                 else
462                                                 {
463                                                     Items::find([ 'id' => $item_id, 'checked' => FALSE ])->one()->delete();
464                                                     $skip++;
465                                                     $errors .= '<br>Движение: ('. implode('===',$moving->errors['date']) . '::' . $moving->date .')' . implode(';', $worksheet->rangeToArray('A' . $rowNum . ':' . $lastColumn . $rowNum, NULL, NULL, FALSE)[0]);
466                                                 } // Не удалось добавить перемещение
467                                                 unset($moving);
468                                             }
469                                         } // Предмет/оборудование добавлено
470                                         else
471                                         {
472                                             $existi++;
473                                         } // Предмет/оборудование уже есть
474                                     }
475                                     else
476                                     {
477                                         $skip++;
478                                         $errors .= '<br>Место расположения: ' . implode(';', $worksheet->rangeToArray('A' . $rowNum . ':' . $lastColumn . $rowNum, NULL, NULL, FALSE)[0]);
479                                     } // не удалось найти или добавить место размещения
480                                 }
481                                 else
482                                 {
483                                     $skip++;
484                                 }
485                             }
486                         }
487                     }
488                     fclose($handle);
489                 }
490                 $message .= Yii::t('items', 'Read {count} records.<br />Imported {counti} Items.<br />Exists {exist} Items.<br />Error read {skip} records.<br />{errors}', 
491                     [ 'counti' => $counti, 'count' => $count, 'exist' => $existi, 'skip' => $skip, 'errors' => $errors ]);
492             }
493         }
494         return $this->render('import',[
495             'message' => $message,
496             'model' => $model,
497             'searchModel' => $searchModel,
498             'dataProvider' => $dataProvider,
499         ]);
500     }
501
502     /**
503      * Показ одного предмета/оборудования. (не используется)
504      * @param integer $id
505      * @return mixed
506      * @throws NotFoundHttpException если предмет/оборудование отсутствует
507      */
508     public function actionView($id)
509     {
510         if (! User::canPermission('updateRecord') ) {
511             return $this->redirect(['index']);
512         }
513         return $this->render('view', [
514             'model' => $this->findModel($id),
515         ]);
516     }
517
518     /**
519      * Создание нового предмета/оборудования.
520      * @return mixed
521      */
522     public function actionCreate()
523     {
524         if (! User::canPermission('createRecord') ) {
525             return $this->redirect(['site/index']);
526         }
527         $model = new Items(); // Новый предмет/оборудование
528         $model->checked = true;
529         $modelm = new Moving();
530         if ($model->load(Yii::$app->request->post()) && $model->save())
531         {
532             // Удалось сохранить, создаём первую запись движения
533             if ($modelm->load(Yii::$app->request->post()))
534             {
535                 $modelm->item_id = $model->id;
536                 $modelm->comment = 'Поступление';
537
538                 if ( $modelm->save() ) // Пробуем сохранить движение
539                 {
540                     return $this->redirect([ 'index', 'id' => $model->id ]); // Если удалось, показываем список оборудования
541                 } else
542                 {
543                     $this->findModel($model->id)->delete();  // Иначе удаляем созданную запись предмета/оборудования
544                     unset($model->id);                       // Очищаем идентификатор предмета/оборудования
545                     $model->isNewRecord = true;
546                     return $this->render('create', [         // Показываем форму создания нового предмета/оборудования
547                         'model'  => $model,
548                         'modelm' => $modelm,
549                     ]);
550                 }
551             } else
552             {
553                 $this->findModel($model->id)->delete();  // Иначе удаляем созданную запись предмета/оборудования
554                 unset($model->id);                      // Очищаем идентификатор предмета/оборудования
555                 $model->isNewRecord = true;
556                 return $this->render('create', [        // Показываем форму создания нового предмета/оборудования
557                     'model'  => $model,
558                     'modelm' => $modelm,
559                 ]);
560             }
561         } else // не удалось сохранить - отображаем форму создания нового предмета/оборудования
562         {
563             return $this->render('create', [
564                 'model'  => $model,
565                 'modelm' => $modelm,
566             ]);
567         }
568
569     }
570
571     /**
572      * Изменение существующего предмета/оборудвания.
573      * Если премет/обрудование сохранён, то возвращаемся на страницу списка всех предметов/оборудования.
574      * @param integer $id
575      * @return mixed
576      * @throws NotFoundHttpException если предмет/оборудование отсутствует
577      */
578     public function actionUpdate($id)
579     {
580         if (! User::canPermission('updateRecord') ) {
581             return $this->redirect(['index']);
582         }
583         $model = $this->findModel($id);
584
585         if ($model->load(Yii::$app->request->post()) && $model->save())
586         {
587             return $this->redirect([ 'index', 'id' => $model->id ]);
588         }
589
590         $searchModelM = new MovingSearch([ 'item_id' => $model->id ]);
591         $dataProviderM = $searchModelM->search(Yii::$app->request->queryParams);
592
593          return $this->render('update', [
594             'searchModelM'  => $searchModelM,
595             'dataProviderM' => $dataProviderM,
596             'model'         => $model,
597         ]);
598     }
599
600     /**
601      * Удаляет сушествующий предмет/оборудование.
602      * Если премет/обрудование удалён, то возвращаемся на страницу списка всех предметов/оборудования.
603      * @param integer $id
604      * @return mixed
605      * @throws NotFoundHttpException if the model cannot be found
606      */
607     public function actionDelete($id)
608     {
609         if (! User::canPermission('updateRecord') ) {
610             return $this->redirect(['site/index']);
611         }
612         $this->findModel($id)->delete();
613
614         return $this->redirect([ 'index' ]);
615     }
616
617     /**
618      * Finds the Items model based on its primary key value.
619      * If the model is not found, a 404 HTTP exception will be thrown.
620      * @param integer $id
621      * @return Items the loaded model
622      * @throws NotFoundHttpException если предмет/оборудование отсутствует
623      */
624     protected function findModel($id)
625     {
626         if (($model = Items::findOne($id)) !== null)
627         {
628             return $model;
629         }
630
631         throw new NotFoundHttpException(Yii::t('app', 'The requested page does not exist.'));
632     }
633 }