Blame view

common/components/PriceWriter.php 7.52 KB
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
  }