Blame view

common/components/PriceWriter.php 7.45 KB
2edfb901   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;
  
38a1a201   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 - консольный
       */
40acb401   Mihail   add delete price ...
28
      protected $mode;
38a1a201   Mihail   add delete func i...
29
30
31
32
  
      /**
       * @var - массив с настройками записи
       */
40acb401   Mihail   add delete price ...
33
      protected $configuration;
38a1a201   Mihail   add delete func i...
34
35
36
37
  
      /**
       * @var - массив с данными которые нужно записать
       */
40acb401   Mihail   add delete price ...
38
      protected $data;
2edfb901   Mihail   add PriceWriter a...
39
  
38a1a201   Mihail   add delete func i...
40
41
42
43
44
      function __construct()
      {
          set_time_limit(300);
      }
  
40acb401   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()
2edfb901   Mihail   add PriceWriter a...
72
73
74
      {
          // 1. запишем дату старта в таблицу файлов поставщика (ImportersFiles)
          // id  загруженного файла получим из конфигурации
38a1a201   Mihail   add delete func i...
75
          $files_model = ImportersFiles::findOne($this->configuration['record_id']);
2edfb901   Mihail   add PriceWriter a...
76
  
2edfb901   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()) {
38a1a201   Mihail   add delete func i...
81
              throw new \ErrorException(implode(', ', $files_model->getErrors()));
2edfb901   Mihail   add PriceWriter a...
82
83
          }
  
2edfb901   Mihail   add PriceWriter a...
84
85
          // 2. запишем полученные данные в таблицу товаров (Details)
          $details_model = new Details();
34d480b7   Mihail   temp commit - wor...
86
          // только для ручной загрузки, в авто режиме все делает конвертер при первом же проходе (в процессе парсинга)
df629228   Mihail   console csv parsing
87
          if ($this->mode == 0) {
34d480b7   Mihail   temp commit - wor...
88
89
              // преобразуем числовые значения
              foreach ($this->data as &$row) {
40acb401   Mihail   add delete price ...
90
91
                  if (isset($row['PRICE']))
                      $row['PRICE'] = \Yii::$app->converter->convertTo('float', $row['PRICE']);
ae83e13e   Mihail   finish with xml a...
92
  
40acb401   Mihail   add delete price ...
93
94
                  if (isset($row['BOX']))
                      $row['BOX'] = \Yii::$app->converter->convertTo('integer', $row['BOX']);
34d480b7   Mihail   temp commit - wor...
95
                  // присвоим полный артикул
706a1491   Mihail   add form, model a...
96
  
40acb401   Mihail   add delete price ...
97
                  if (isset($row['ARTICLE'])) {
0716cf79   Mihail   fixed testing iss...
98
99
  
                      $row['FULL_ARTICLE'] = $row['ARTICLE'];
706a1491   Mihail   add form, model a...
100
  
0716cf79   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']);
                      }
                  }
706a1491   Mihail   add form, model a...
108
  
38a1a201   Mihail   add delete func i...
109
                  if (isset($row['ADD_BOX']))
40acb401   Mihail   add delete price ...
110
                      $row['ADD_BOX'] = \Yii::$app->converter->convertTo('integer', $row['ADD_BOX']);
34d480b7   Mihail   temp commit - wor...
111
112
113
  
                  // проверим все ли обязательные колонки были указаны пользователем
                  $details_model->load(['Details' => $row]);
34d480b7   Mihail   temp commit - wor...
114
                  if (!$details_model->validate())
40acb401   Mihail   add delete price ...
115
                      $details_model->throwStringErrorException(key($this->data));
34d480b7   Mihail   temp commit - wor...
116
117
  
              }
2edfb901   Mihail   add PriceWriter a...
118
          }
34d480b7   Mihail   temp commit - wor...
119
  
38a1a201   Mihail   add delete func i...
120
          // дополним данные значением импортера и даты обновления цены
40acb401   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();
38a1a201   Mihail   add delete func i...
123
          try {
2edfb901   Mihail   add PriceWriter a...
124
  
40acb401   Mihail   add delete price ...
125
              if (isset($this->configuration['delete_price']) && (int)$this->configuration['delete_price']) {
38a1a201   Mihail   add delete func i...
126
127
                  $details_model->delete_price = true;
              }
40acb401   Mihail   add delete price ...
128
  
38a1a201   Mihail   add delete func i...
129
              //2. попытаемся вставить данные в БД с апдейтом по ключам
40acb401   Mihail   add delete price ...
130
              $details_model->manualInsert($this->data, $this->configuration['importer_id']);
2edfb901   Mihail   add PriceWriter a...
131
  
38a1a201   Mihail   add delete func i...
132
133
              // 3. зафиксируем дату конца загрузки в файлах поставщика
              if (!$files_model->save()) {
0716cf79   Mihail   fixed testing iss...
134
                  $transaction->rollBack();
38a1a201   Mihail   add delete func i...
135
136
                  throw new \ErrorException(implode(', ', $files_model->getErrors()));
              }
2edfb901   Mihail   add PriceWriter a...
137
  
38a1a201   Mihail   add delete func i...
138
139
140
              // 4. зафиксируем дату загрузки в таблице поставщиков
              $imp_model = Importers::findOne($this->configuration['importer_id']);
              $imp_model->price_date_update = $update_date;
2edfb901   Mihail   add PriceWriter a...
141
  
38a1a201   Mihail   add delete func i...
142
              if (!$imp_model->save()) {
0716cf79   Mihail   fixed testing iss...
143
                  $transaction->rollBack();
40acb401   Mihail   add delete price ...
144
                  $imp_model->throwStringErrorException();;
2edfb901   Mihail   add PriceWriter a...
145
              }
0716cf79   Mihail   fixed testing iss...
146
147
              $transaction->commit();
  
38a1a201   Mihail   add delete func i...
148
          } catch (ErrorException  $e) {
0716cf79   Mihail   fixed testing iss...
149
              $transaction->rollBack();
38a1a201   Mihail   add delete func i...
150
151
              throw new \ErrorException($e->getMessage());
          }
2edfb901   Mihail   add PriceWriter a...
152
153
154
155
  
  
          return true;
      }
df629228   Mihail   console csv parsing
156
  
40acb401   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
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
      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)
  
              $rows = ImportersFiles::deleteAll(['importer_id' => $importer_id, 'upload_time' => $update_date]);
              if ($rows != 1) {
                  $transaction->rollBack();
                  throw new \ErrorException('Ошибка удаления из таблицы фалов поставщиков');
              }
  
              $last_upload_time = ImportersFiles::find(['importer_id' => $importer_id])->orderBy(['upload_time' => SORT_DESC])->one()->upload_time;
  
                  // 2. удалим прайс из таблицы товаров (Details)
          $details_model = new Details();
              $conditions = "importer_id = {$importer_id} AND upload_time = {$update_date}";
              $details_model->manualDelete($conditions);
  
              // 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());
          }
      }
df629228   Mihail   console csv parsing
207
  
2edfb901   Mihail   add PriceWriter a...
208
  }