f0dbd829
Mihail
add PriceWriter a...
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<?php
/**
* Created by PhpStorm.
* User: Cibermag
* Date: 30.09.2015
* Time: 9:34
*/
namespace common\components;
use yii\base\ErrorException;
use backend\models\ImportersFiles;
use backend\models\Importers;
use backend\models\Details;
|
40cac1b6
Mihail
add delete func i...
|
17
18
19
20
21
22
23
24
25
26
27
|
/**
* Class PriceWriter
* @package common\components
* записывает в БД отпарсенные данные
* запись происходит в несколько таблиц
*/
class PriceWriter
{
/**
* @var - int - 0 - интерактивный режим, 1 - консольный
*/
|
edfa67b1
Mihail
add delete price ...
|
28
|
protected $mode;
|
40cac1b6
Mihail
add delete func i...
|
29
30
31
32
|
/**
* @var - массив с настройками записи
*/
|
edfa67b1
Mihail
add delete price ...
|
33
|
protected $configuration;
|
40cac1b6
Mihail
add delete func i...
|
34
35
36
37
|
/**
* @var - массив с данными которые нужно записать
*/
|
edfa67b1
Mihail
add delete price ...
|
38
|
protected $data;
|
f0dbd829
Mihail
add PriceWriter a...
|
39
|
|
40cac1b6
Mihail
add delete func i...
|
40
41
42
43
44
|
function __construct()
{
set_time_limit(300);
}
|
edfa67b1
Mihail
add delete price ...
|
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
/**
* @param mixed $mode
*/
public function setMode($mode)
{
$this->mode = $mode;
}
/**
* @param mixed $configuration
*/
public function setConfiguration($configuration)
{
$this->configuration = $configuration;
}
/**
* @param mixed $data
*/
public function setData($data)
{
$this->data = $data;
}
public function writePriceToDB()
|
f0dbd829
Mihail
add PriceWriter a...
|
72
73
74
|
{
// 1. запишем дату старта в таблицу файлов поставщика (ImportersFiles)
// id загруженного файла получим из конфигурации
|
40cac1b6
Mihail
add delete func i...
|
75
|
$files_model = ImportersFiles::findOne($this->configuration['record_id']);
|
f0dbd829
Mihail
add PriceWriter a...
|
76
|
|
f0dbd829
Mihail
add PriceWriter a...
|
77
78
79
80
|
$update_date = date('Y-m-d H:i:s');
$files_model->time_start = $update_date;
// запишем дату начала загрузки
if (!$files_model->save()) {
|
40cac1b6
Mihail
add delete func i...
|
81
|
throw new \ErrorException(implode(', ', $files_model->getErrors()));
|
f0dbd829
Mihail
add PriceWriter a...
|
82
83
|
}
|
f0dbd829
Mihail
add PriceWriter a...
|
84
85
|
// 2. запишем полученные данные в таблицу товаров (Details)
$details_model = new Details();
|
ef41533d
Mihail
temp commit - wor...
|
86
|
// только для ручной загрузки, в авто режиме все делает конвертер при первом же проходе (в процессе парсинга)
|
ea4ecf3d
Mihail
console csv parsing
|
87
|
if ($this->mode == 0) {
|
ef41533d
Mihail
temp commit - wor...
|
88
89
|
// преобразуем числовые значения
foreach ($this->data as &$row) {
|
edfa67b1
Mihail
add delete price ...
|
90
91
|
if (isset($row['PRICE']))
$row['PRICE'] = \Yii::$app->converter->convertTo('float', $row['PRICE']);
|
d5c6d7e0
Mihail
finish with xml a...
|
92
|
|
edfa67b1
Mihail
add delete price ...
|
93
94
|
if (isset($row['BOX']))
$row['BOX'] = \Yii::$app->converter->convertTo('integer', $row['BOX']);
|
ef41533d
Mihail
temp commit - wor...
|
95
|
// присвоим полный артикул
|
7776ca75
Mihail
add form, model a...
|
96
|
|
edfa67b1
Mihail
add delete price ...
|
97
|
if (isset($row['ARTICLE'])) {
|
61795805
Mihail
fixed testing iss...
|
98
99
|
$row['FULL_ARTICLE'] = $row['ARTICLE'];
|
7776ca75
Mihail
add form, model a...
|
100
|
|
61795805
Mihail
fixed testing iss...
|
101
102
103
104
105
106
107
|
if ((int)$this->configuration['delete_prefix']) {
$row = \Yii::$app->converter->convertTo('Article', $row, ['importer_id' => $this->configuration['importer_id']]);
} else {
if (isset($row['ARTICLE']))
$row['ARTICLE'] = \Yii::$app->converter->convertTo('Article', $row['ARTICLE']);
}
}
|
7776ca75
Mihail
add form, model a...
|
108
|
|
40cac1b6
Mihail
add delete func i...
|
109
|
if (isset($row['ADD_BOX']))
|
edfa67b1
Mihail
add delete price ...
|
110
|
$row['ADD_BOX'] = \Yii::$app->converter->convertTo('integer', $row['ADD_BOX']);
|
ef41533d
Mihail
temp commit - wor...
|
111
112
113
|
// проверим все ли обязательные колонки были указаны пользователем
$details_model->load(['Details' => $row]);
|
ef41533d
Mihail
temp commit - wor...
|
114
|
if (!$details_model->validate())
|
edfa67b1
Mihail
add delete price ...
|
115
|
$details_model->throwStringErrorException(key($this->data));
|
ef41533d
Mihail
temp commit - wor...
|
116
117
|
}
|
f0dbd829
Mihail
add PriceWriter a...
|
118
|
}
|
ef41533d
Mihail
temp commit - wor...
|
119
|
|
40cac1b6
Mihail
add delete func i...
|
120
|
// дополним данные значением импортера и даты обновления цены
|
edfa67b1
Mihail
add delete price ...
|
121
122
|
$this->data = CustomArrayHelper::addColumns($this->data, ['IMPORT_ID' => $this->configuration['importer_id'], 'timestamp' => $update_date]);
$transaction = \Yii::$app->db->beginTransaction();
|
40cac1b6
Mihail
add delete func i...
|
123
|
try {
|
f0dbd829
Mihail
add PriceWriter a...
|
124
|
|
edfa67b1
Mihail
add delete price ...
|
125
|
if (isset($this->configuration['delete_price']) && (int)$this->configuration['delete_price']) {
|
40cac1b6
Mihail
add delete func i...
|
126
127
|
$details_model->delete_price = true;
}
|
edfa67b1
Mihail
add delete price ...
|
128
|
|
40cac1b6
Mihail
add delete func i...
|
129
|
//2. попытаемся вставить данные в БД с апдейтом по ключам
|
edfa67b1
Mihail
add delete price ...
|
130
|
$details_model->manualInsert($this->data, $this->configuration['importer_id']);
|
f0dbd829
Mihail
add PriceWriter a...
|
131
|
|
40cac1b6
Mihail
add delete func i...
|
132
133
|
// 3. зафиксируем дату конца загрузки в файлах поставщика
if (!$files_model->save()) {
|
61795805
Mihail
fixed testing iss...
|
134
|
$transaction->rollBack();
|
40cac1b6
Mihail
add delete func i...
|
135
136
|
throw new \ErrorException(implode(', ', $files_model->getErrors()));
}
|
f0dbd829
Mihail
add PriceWriter a...
|
137
|
|
40cac1b6
Mihail
add delete func i...
|
138
139
140
|
// 4. зафиксируем дату загрузки в таблице поставщиков
$imp_model = Importers::findOne($this->configuration['importer_id']);
$imp_model->price_date_update = $update_date;
|
f0dbd829
Mihail
add PriceWriter a...
|
141
|
|
40cac1b6
Mihail
add delete func i...
|
142
|
if (!$imp_model->save()) {
|
61795805
Mihail
fixed testing iss...
|
143
|
$transaction->rollBack();
|
6ccb6e69
Mihail
add delete price ...
|
144
|
$imp_model->throwStringErrorException();
|
f0dbd829
Mihail
add PriceWriter a...
|
145
|
}
|
61795805
Mihail
fixed testing iss...
|
146
147
|
$transaction->commit();
|
40cac1b6
Mihail
add delete func i...
|
148
|
} catch (ErrorException $e) {
|
61795805
Mihail
fixed testing iss...
|
149
|
$transaction->rollBack();
|
40cac1b6
Mihail
add delete func i...
|
150
151
|
throw new \ErrorException($e->getMessage());
}
|
f0dbd829
Mihail
add PriceWriter a...
|
152
153
154
155
|
return true;
}
|
ea4ecf3d
Mihail
console csv parsing
|
156
|
|
edfa67b1
Mihail
add delete price ...
|
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
|
public function deletePriceFromDB()
{
$importer_id = '';
$update_date = '';
if (isset($this->configuration['importer_id']))
$importer_id = $this->configuration['importer_id'];
if (isset($this->configuration['update_date']))
$update_date = $this->configuration['update_date'];
if (!$importer_id) {
throw new \ErrorException('Не указан поставщик прайса для удаления');
} elseif (!$update_date) {
throw new \ErrorException('Не указана дата загрузки прайса для удаления');
}
$transaction = \Yii::$app->db->beginTransaction();
try {
// 1. удалим из таблицы файлов поставщика (ImportersFiles)
|
6ccb6e69
Mihail
add delete price ...
|
179
|
$rows = ImportersFiles::deleteAll(['importer_id' => $importer_id, 'time_start' => $update_date]);
|
edfa67b1
Mihail
add delete price ...
|
180
181
|
if ($rows != 1) {
$transaction->rollBack();
|
6ccb6e69
Mihail
add delete price ...
|
182
|
throw new \ErrorException('Ошибка удаления из таблицы файлов поставщиков. Указанный прайс не найден');
|
edfa67b1
Mihail
add delete price ...
|
183
184
|
}
|
6ccb6e69
Mihail
add delete price ...
|
185
|
$last_upload_time = ImportersFiles::find()->where(['importer_id' => $importer_id])->orderBy(['time_start' => SORT_DESC])->one()->time_start;
|
edfa67b1
Mihail
add delete price ...
|
186
187
188
|
// 2. удалим прайс из таблицы товаров (Details)
$details_model = new Details();
|
6ccb6e69
Mihail
add delete price ...
|
189
190
191
|
$conditions = "import_id = {$importer_id} AND timestamp ='$update_date'";
$details_model->manualDelete( $conditions );
|
edfa67b1
Mihail
add delete price ...
|
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
|
// 3. откатимся до старой даты загрузки в таблице поставщиков
$imp_model = Importers::findOne( $importer_id );
$imp_model->price_date_update = $last_upload_time;
if (!$imp_model->save()) {
$transaction->rollBack();
$imp_model->throwStringErrorException();
}
$transaction->commit();
} catch (ErrorException $e) {
$transaction->rollBack();
throw new \ErrorException($e->getMessage());
}
|
a61661bb
Mihail
work with check p...
|
207
208
|
return true;
|
edfa67b1
Mihail
add delete price ...
|
209
|
}
|
ea4ecf3d
Mihail
console csv parsing
|
210
|
|
f0dbd829
Mihail
add PriceWriter a...
|
211
|
}
|