Blame view

common/components/PriceWriter.php 9.01 KB
2edfb901   Mihail   add PriceWriter a...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  <?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;
f32f4cbc   Mihail   fixed details pag...
15
  use common\models\Details;
78641da2   Mihail   rewrite parser wr...
16
  use common\components\ModelArrayValidator;
2edfb901   Mihail   add PriceWriter a...
17
  
38a1a201   Mihail   add delete func i...
18
19
20
21
22
23
24
25
26
27
28
  /**
   * Class PriceWriter
   * @package common\components
   * записывает в БД отпарсенные данные
   * запись происходит в несколько таблиц
   */
  class PriceWriter
  {
      /**
       * @var - int - 0 - интерактивный режим, 1 - консольный
       */
40acb401   Mihail   add delete price ...
29
      protected $mode;
38a1a201   Mihail   add delete func i...
30
31
32
33
  
      /**
       * @var - массив с настройками записи
       */
40acb401   Mihail   add delete price ...
34
      protected $configuration;
38a1a201   Mihail   add delete func i...
35
36
37
38
  
      /**
       * @var - массив с данными которые нужно записать
       */
40acb401   Mihail   add delete price ...
39
      protected $data;
2edfb901   Mihail   add PriceWriter a...
40
  
78641da2   Mihail   rewrite parser wr...
41
42
43
44
45
      /**
       * @var - сообщение валидатора об ошибках
       */
      protected $validated_msg;
      /**
209dad04   Mihail   add validator for...
46
       * @var - bool - есть ли ошибки валидации
78641da2   Mihail   rewrite parser wr...
47
       */
209dad04   Mihail   add validator for...
48
      protected $hasValidationError;
78641da2   Mihail   rewrite parser wr...
49
50
51
  
  
  
38a1a201   Mihail   add delete func i...
52
53
      function __construct()
      {
209dad04   Mihail   add validator for...
54
          set_time_limit(600);
38a1a201   Mihail   add delete func i...
55
56
      }
  
40acb401   Mihail   add delete price ...
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
      /**
       * @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;
      }
  
78641da2   Mihail   rewrite parser wr...
81
82
83
84
85
86
87
88
89
90
91
      /**
       * @return mixed
       */
      public function getValidatedMsg()
      {
          return $this->validated_msg;
      }
  
      /**
       * @return mixed
       */
209dad04   Mihail   add validator for...
92
      public function hasValidationError()
78641da2   Mihail   rewrite parser wr...
93
      {
209dad04   Mihail   add validator for...
94
          return $this->hasValidationError;
78641da2   Mihail   rewrite parser wr...
95
      }
40acb401   Mihail   add delete price ...
96
97
98
  
  
      public function writePriceToDB()
2edfb901   Mihail   add PriceWriter a...
99
100
101
      {
          // 1. запишем дату старта в таблицу файлов поставщика (ImportersFiles)
          // id  загруженного файла получим из конфигурации
38a1a201   Mihail   add delete func i...
102
          $files_model = ImportersFiles::findOne($this->configuration['record_id']);
2edfb901   Mihail   add PriceWriter a...
103
  
2edfb901   Mihail   add PriceWriter a...
104
105
106
107
          $update_date = date('Y-m-d H:i:s');
          $files_model->time_start = $update_date;
          // запишем дату начала загрузки
          if (!$files_model->save()) {
38a1a201   Mihail   add delete func i...
108
              throw new \ErrorException(implode(', ', $files_model->getErrors()));
2edfb901   Mihail   add PriceWriter a...
109
110
          }
  
78641da2   Mihail   rewrite parser wr...
111
          // 2. конвертируем данные
34d480b7   Mihail   temp commit - wor...
112
          // только для ручной загрузки, в авто режиме все делает конвертер при первом же проходе (в процессе парсинга)
78641da2   Mihail   rewrite parser wr...
113
114
115
          if ( $this->mode == 0 ) {
              // преобразуем значения перед записью в БД
              $this->convertDataByConfiguration();
706a1491   Mihail   add form, model a...
116
  
78641da2   Mihail   rewrite parser wr...
117
118
119
          }
          //3. провалидируем полученные данные моделью - Details
          $details_model = $this->validateByDetailsModel();
209dad04   Mihail   add validator for...
120
121
122
123
124
125
          if ( empty($this->data) ) {
              // после валидации не осталось валидных данных для записи
              return false;
          }
              //4. дополним данные значением импортера и даты обновления цены
              $this->data = CustomArrayHelper::addColumns($this->data, ['IMPORT_ID' => $this->configuration['importer_id'], 'timestamp' => $update_date]);
34d480b7   Mihail   temp commit - wor...
126
  
209dad04   Mihail   add validator for...
127
128
              //5. запишем данные в связанные таблицы
              $this->writePriceInTransaction($details_model, $files_model, $update_date);
34d480b7   Mihail   temp commit - wor...
129
  
78641da2   Mihail   rewrite parser wr...
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
  
          return true;
      }
  
      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('Не указана дата загрузки прайса для удаления');
          }
  
          $this->deletePriceInTransaction( $importer_id, $update_date );
  
          return true;
      }
  
      /**
       * ковертирует отпарсенные данные конвертером по конфигурации
       */
      protected function convertDataByConfiguration ()
      {
          foreach ($this->data as &$row) {
              if (isset($row['PRICE']))
                  $row['PRICE'] = \Yii::$app->converter->convertTo('float', $row['PRICE']);
  
              if (isset($row['BOX']))
                  $row['BOX'] = \Yii::$app->converter->convertTo('integer', $row['BOX']);
              // присвоим полный артикул
  
              if (isset($row['ARTICLE'])) {
  
                  $row['FULL_ARTICLE'] = $row['ARTICLE'];
  
                  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']);
                  }
34d480b7   Mihail   temp commit - wor...
179
              }
78641da2   Mihail   rewrite parser wr...
180
181
182
  
              if (isset($row['ADD_BOX']))
                  $row['ADD_BOX'] = \Yii::$app->converter->convertTo('integer', $row['ADD_BOX']);
2edfb901   Mihail   add PriceWriter a...
183
          }
78641da2   Mihail   rewrite parser wr...
184
      }
34d480b7   Mihail   temp commit - wor...
185
  
78641da2   Mihail   rewrite parser wr...
186
      protected function  writePriceInTransaction($details_model, $files_model, $update_date){
40acb401   Mihail   add delete price ...
187
          $transaction = \Yii::$app->db->beginTransaction();
38a1a201   Mihail   add delete func i...
188
          try {
2edfb901   Mihail   add PriceWriter a...
189
  
40acb401   Mihail   add delete price ...
190
              if (isset($this->configuration['delete_price']) && (int)$this->configuration['delete_price']) {
38a1a201   Mihail   add delete func i...
191
192
                  $details_model->delete_price = true;
              }
40acb401   Mihail   add delete price ...
193
  
38a1a201   Mihail   add delete func i...
194
              //2. попытаемся вставить данные в БД с апдейтом по ключам
40acb401   Mihail   add delete price ...
195
              $details_model->manualInsert($this->data, $this->configuration['importer_id']);
2edfb901   Mihail   add PriceWriter a...
196
  
38a1a201   Mihail   add delete func i...
197
198
              // 3. зафиксируем дату конца загрузки в файлах поставщика
              if (!$files_model->save()) {
0716cf79   Mihail   fixed testing iss...
199
                  $transaction->rollBack();
38a1a201   Mihail   add delete func i...
200
201
                  throw new \ErrorException(implode(', ', $files_model->getErrors()));
              }
2edfb901   Mihail   add PriceWriter a...
202
  
38a1a201   Mihail   add delete func i...
203
204
205
              // 4. зафиксируем дату загрузки в таблице поставщиков
              $imp_model = Importers::findOne($this->configuration['importer_id']);
              $imp_model->price_date_update = $update_date;
2edfb901   Mihail   add PriceWriter a...
206
  
38a1a201   Mihail   add delete func i...
207
              if (!$imp_model->save()) {
0716cf79   Mihail   fixed testing iss...
208
                  $transaction->rollBack();
512cc271   Mihail   add delete price ...
209
                  $imp_model->throwStringErrorException();
2edfb901   Mihail   add PriceWriter a...
210
              }
0716cf79   Mihail   fixed testing iss...
211
212
              $transaction->commit();
  
38a1a201   Mihail   add delete func i...
213
          } catch (ErrorException  $e) {
0716cf79   Mihail   fixed testing iss...
214
              $transaction->rollBack();
38a1a201   Mihail   add delete func i...
215
216
              throw new \ErrorException($e->getMessage());
          }
2edfb901   Mihail   add PriceWriter a...
217
  
2edfb901   Mihail   add PriceWriter a...
218
      }
df629228   Mihail   console csv parsing
219
  
78641da2   Mihail   rewrite parser wr...
220
      protected function  deletePriceInTransaction( $importer_id, $update_date ){
40acb401   Mihail   add delete price ...
221
222
223
224
          $transaction = \Yii::$app->db->beginTransaction();
          try {
              // 1. удалим из таблицы файлов поставщика (ImportersFiles)
  
512cc271   Mihail   add delete price ...
225
              $rows = ImportersFiles::deleteAll(['importer_id' => $importer_id, 'time_start' => $update_date]);
40acb401   Mihail   add delete price ...
226
227
              if ($rows != 1) {
                  $transaction->rollBack();
512cc271   Mihail   add delete price ...
228
                  throw new \ErrorException('Ошибка удаления из таблицы файлов поставщиков. Указанный прайс не найден');
40acb401   Mihail   add delete price ...
229
230
              }
  
512cc271   Mihail   add delete price ...
231
              $last_upload_time = ImportersFiles::find()->where(['importer_id' => $importer_id])->orderBy(['time_start' => SORT_DESC])->one()->time_start;
40acb401   Mihail   add delete price ...
232
  
78641da2   Mihail   rewrite parser wr...
233
234
              // 2. удалим прайс из таблицы товаров (Details)
              $details_model = new Details();
512cc271   Mihail   add delete price ...
235
236
237
              $conditions = "import_id = {$importer_id} AND  timestamp ='$update_date'";
  
              $details_model->manualDelete( $conditions );
40acb401   Mihail   add delete price ...
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
  
              // 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());
          }
40acb401   Mihail   add delete price ...
253
      }
df629228   Mihail   console csv parsing
254
  
78641da2   Mihail   rewrite parser wr...
255
256
257
258
259
260
261
      protected function validateByDetailsModel(){
  
          $details_model = new Details();
  
          $model_validator = new ModelArrayValidator( $details_model );
          $this->data = $model_validator->validate( $this->data );
          $this->validated_msg = $model_validator->getMassage();
209dad04   Mihail   add validator for...
262
          $this->hasValidationError =  $model_validator->hasError();
78641da2   Mihail   rewrite parser wr...
263
264
265
266
267
  
          $model_validator->close();
  
          return $details_model;
      }
2edfb901   Mihail   add PriceWriter a...
268
  }