+ * Импортирование строк товаров из массива
+ */
+ public function doImport($arrayRows)
+ {
+ // Инициализация счётчиков
+ $arrayReturn = [
+ 'countRows' => count($arrayRows),
+ 'countImported' => 0,
+ 'countExists' => 0,
+ 'countErrors' => 0,
+ 'errors' => '',
+ ];
+
+ // Проверка наличия ключевых полей
+ if ((!isset($arrayRows[ 0 ][ 'model' ]))
+ || (!isset($arrayRows[ 0 ][ 'type' ]))
+ || (!isset($arrayRows[ 0 ][ 'invent' ]))
+ || (!isset($arrayRows[ 0 ][ 'location' ]))
+ || (!isset($arrayRows[ 0 ][ 'region' ]))
+ || (!isset($arrayRows[ 0 ][ 'date' ]))
+ )
+ {
+ // Сообщение об ошибке
+ $arrayReturn[ 'countErrors' ] = count($arrayRows);
+ $arrayReturn[ 'errors' ] .= '<br />' . Yii::t('import', 'Skip all. Key column(s) "model", "type", "invent", "location", "region", "date" not found: ') . print_r($arrayRows[0], TRUE);
+ }
+ else
+ {
+ // Просмотрим весь массив
+ foreach($arrayRows as $row)
+ {
+ // ПОлучим местоположения
+ $location = LocationsController::addIfNeed($row); // Получение идентификатора расположения
+ if ( $location[ 'id' ] === FALSE)
+ {
+ // Сообщим об ошибке
+ $arrayReturn[ 'countErrors' ]++;
+ $arrayReturn[ 'errors' ] .= '<br />' . $location[ 'error' ];
+ }
+ else
+ {
+ // Попробуем найти или добавить предмет/оборудование
+ $item = $this->addIfNeed($row);
+ if ($item[ 'id' ] === FALSE)
+ {
+ $arrayReturn[ 'countErrors' ]++;
+ $arrayReturn[ 'errors' ] .= '<br />' . $item[ 'error' ];
+ }
+ else
+ {
+ // Проверка, что предмет/оборудование уже были в базе
+ $item = Items::find()->where([ 'id' => $item[ 'id' ]])->one();
+ if ($item->checked === TRUE)
+ {
+ $arrayReturn[ 'countExists' ]++;
+ }
+ else
+ {
+ $state = isset($row[ 'status' ]) ? StatusController::addIfNeed($row) : StatusController::addIfNeed([ 'status' => 'Склад' ]);
+ if ( $state[ 'id' ] === FALSE )
+ {
+ // Сообщим об ошибке
+ $arrayReturn[ 'countErrors' ]++;
+ $arrayReturn[ 'errors' ] .= '<br />' . $state[ 'error' ];
+ }
+ else
+ {
+ // Новый предмет/оборудование. Пробуем добавить первое перемещение
+ // Проверка что последнее перемещение такое же, как и импортируемое
+ $moving = Moving::find()->where([ 'item_id' => $item[ 'id' ]])->all();
+ $flag = false;
+ if (count($moving) > 0)
+ {
+ // Признак, что последнее перемещение совпало с импортируемым
+ $flag = $moving[ count($moving) - 1 ]->location_id == $location[ 'id' ];
+ }
+ // Проверим, что существующая запись перемещения больше добавляемой
+ $moving = Moving::find()->where([ 'item_id' => $item[ 'id' ]])->andWhere([ '>', 'date', $row[ 'date' ]])->all();
+ if ($flag || count($moving) > 0)
+ {
+ // Добавлять запись до существующих нельзя.
+ $arrayReturn[ 'countExists' ]++;
+ }
+ else
+ {
+ // Проверим, есть ли уже такое перемещение
+ $moving = Moving::find()->where([ 'item_id' => $item[ 'id' ], 'date' => $row[ 'date' ]])->orderBy([ 'id' => SORT_ASC ])->all();
+ if (count($moving) == 0)
+ {
+ // Такой транзакции нет ещё.
+ $moving = new Moving();
+ $moving->date = $row[ 'date' ];
+ $moving->state_id = $state[ 'id' ];
+ $moving->item_id = $item[ 'id' ];
+ $moving->location_id = $location[ 'id' ];
+ $moving->comment = Yii::t('import', 'Import: {comment}', $row);
+
+ if ($moving->validate() && $moving->save())
+ {
+ // Записаали первое движение
+ $arrayReturn[ 'countImported' ]++;
+ }
+ else
+ {
+ // Запись не удалась, пробуем удалить предмет/оборудование
+ Items::find()->where([ 'id' => $item[ 'id' ], 'checked' => FALSE ])->one()->delete();
+ // Сообщим об ошибке
+ $arrayReturn[ 'countErrors' ]++;
+ $arrayReturn[ 'errors' ] .= '<br />' . Yii::t('import', 'Moving: {date} (') . $moving->errors['date'][0]. Yii::t('import', '), Inventory number:{invent}, model: {model}, location: {location} ( {region} )' , $row);
+ }
+ }
+ else
+ {
+ // Такое перемещение уже было
+ $arrayReturn[ 'countExists' ]++;
+ // Удаление дубликатов, если вдруг они образовались
+ if (count($moving) > 1)
+ {
+ // переберём все записи со второй и удалим их.
+ for ($i = 1; $i < count($moving); $i++)
+ {
+ $moving[$i]->delete();
+ }
+ }
+ }
+ }
+ unset($moving);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ // Возврат результата импорта
+ return $arrayReturn;
+ }
+
+ /**