Blame view

common/modules/product/models/Import.php 35.4 KB
d8c1a2e0   Yarik   Big commit artbox
1
  <?php
e8ccb1b4   Yarik   Import beta
2
3
4
5
6
7
8
9
10
      
      namespace common\modules\product\models;
      
      use common\modules\language\models\Language;
      use common\modules\rubrication\models\TaxGroup;
      use common\modules\rubrication\models\TaxOption;
      use Yii;
      use yii\base\Model;
      use yii\helpers\ArrayHelper;
772a3ca4   Yarik   Big commit
11
12
13
14
15
16
  
      /**
       * Class Import
       *
       * @package common\modules\product\models
       */
e8ccb1b4   Yarik   Import beta
17
      class Import extends Model
d8c1a2e0   Yarik   Big commit artbox
18
      {
c70f24ea   Yarik   For Leha commit.
19
20
21
22
23
          /**
           * Import csv file
           *
           * @var string $file
           */
e8ccb1b4   Yarik   Import beta
24
25
          public $file;
          
c70f24ea   Yarik   For Leha commit.
26
27
28
29
30
31
32
          /**
           * Import type
           * * product
           * * price
           *
           * @var string $type
           */
e8ccb1b4   Yarik   Import beta
33
34
          public $type;
          
c70f24ea   Yarik   For Leha commit.
35
36
37
38
39
          /**
           * Import language ID
           *
           * @var int $lang
           */
e8ccb1b4   Yarik   Import beta
40
41
42
43
44
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
72
          public $lang;
          
          public $errors = [];
          
          public $output = [];
          
          /**
           * @inheritdoc
           */
          public function rules()
          {
              return [
                  [
                      [
                          'type',
                          'lang',
                      ],
                      'required',
                  ],
                  [
                      [ 'lang' ],
                      'integer',
                  ],
                  [
                      [ 'type' ],
                      'string',
                  ],
                  [
                      [ 'file' ],
                      'file',
                      'extensions' => 'csv',
                  ],
              ];
d8c1a2e0   Yarik   Big commit artbox
73
          }
e8ccb1b4   Yarik   Import beta
74
75
76
77
78
79
80
81
82
          
          /**
           * @inheritdoc
           */
          public function attributeLabels()
          {
              return [
                  'file' => Yii::t('product', 'File'),
              ];
d8c1a2e0   Yarik   Big commit artbox
83
          }
e8ccb1b4   Yarik   Import beta
84
          
c70f24ea   Yarik   For Leha commit.
85
86
87
88
89
90
          /**
           * Get import type
           *
           * @see Import::type
           * @return string
           */
e8ccb1b4   Yarik   Import beta
91
          public function getType()
d8c1a2e0   Yarik   Big commit artbox
92
          {
4428da8c   Yarik   Almost all databa...
93
              if (!$this->type) {
e8ccb1b4   Yarik   Import beta
94
                  $this->type = 'products';
d8c1a2e0   Yarik   Big commit artbox
95
              }
e8ccb1b4   Yarik   Import beta
96
97
98
              return $this->type;
          }
          
c70f24ea   Yarik   For Leha commit.
99
100
101
102
103
104
105
106
          /**
           * Import prices
           *
           * @param int  $from  Start row
           * @param null $limit Row limit
           *
           * @return array|bool Array if OK, false otherwise
           */
4428da8c   Yarik   Almost all databa...
107
          public function goPrices($from = 0, $limit = null)
e8ccb1b4   Yarik   Import beta
108
109
110
          {
              set_time_limit(0);
              
4428da8c   Yarik   Almost all databa...
111
              if (!( $handle = $this->getProductsFile('uploadFilePrices') )) {
e8ccb1b4   Yarik   Import beta
112
113
                  $this->errors[] = 'File not found';
                  return false;
d8c1a2e0   Yarik   Big commit artbox
114
              }
e8ccb1b4   Yarik   Import beta
115
116
              
              $filesize = filesize(Yii::getAlias('@uploadDir') . '/' . Yii::getAlias('@uploadFilePrices'));
4428da8c   Yarik   Almost all databa...
117
              if ($from) {
e8ccb1b4   Yarik   Import beta
118
                  fseek($handle, $from);
d8c1a2e0   Yarik   Big commit artbox
119
              }
e8ccb1b4   Yarik   Import beta
120
121
122
              
              $j = 0;
              
4428da8c   Yarik   Almost all databa...
123
124
125
126
127
128
129
130
131
132
              $is_utf = ( preg_match(
                  '//u',
                  file_get_contents(
                      Yii::getAlias('@uploadDir') . '/' . Yii::getAlias('@uploadFilePrices'),
                      null,
                      null,
                      null,
                      1000000
                  )
              ) );
e8ccb1b4   Yarik   Import beta
133
              
4428da8c   Yarik   Almost all databa...
134
135
136
              while (( empty( $limit ) || $j++ < $limit ) && ( $data = fgetcsv($handle, 10000, ";") ) !== false) {
                  foreach ($data as &$value) {
                      if (!$is_utf) {
e8ccb1b4   Yarik   Import beta
137
138
139
                          $value = iconv('windows-1251', "UTF-8//TRANSLIT//IGNORE", $value);
                      }
                      $value = trim($value);
d8c1a2e0   Yarik   Big commit artbox
140
                  }
e8ccb1b4   Yarik   Import beta
141
142
143
144
145
146
147
148
149
                  
                  // данные строк
                  $modification_code = @$data[ 0 ];
                  $price = floatval(@$data[ 1 ]);
                  $price_promo = floatval(@$data[ 2 ]);
                  $count = intval(@$data[ 3 ]);
                  $city_name = @$data[ 4 ];
                  $product_title = @$data[ 5 ];
                  
4428da8c   Yarik   Almost all databa...
150
                  if (empty ( $modification_code )) {
e8ccb1b4   Yarik   Import beta
151
                      continue;
d8c1a2e0   Yarik   Big commit artbox
152
                  }
e8ccb1b4   Yarik   Import beta
153
                  // товары в пути
4428da8c   Yarik   Almost all databa...
154
                  if (empty ( $city_name )) {
e8ccb1b4   Yarik   Import beta
155
156
157
                      $this->output[] = 'Товар ' . $product_title . ' в пути';
                      continue;
                  }
5c2eb7c8   Yarik   Big commit almost...
158
159
160
                  /**
                   * @var ProductVariant $productVariant
                   */
4428da8c   Yarik   Almost all databa...
161
162
163
                  if (( $productVariant = ProductVariant::find()
                                                        ->filterWhere([ 'sku' => $modification_code ])
                                                        ->one() ) === null
e8ccb1b4   Yarik   Import beta
164
165
166
167
168
                  ) {
                      $this->output[] = 'Для товара ' . $product_title . ' не найдено соотвествие';
                      continue;
                  }
                  // ===== Set stock ====
4428da8c   Yarik   Almost all databa...
169
170
171
172
                  if ($city_name) {
                      if (( $stock = Stock::find()
                                          ->filterWhere([ 'title' => trim($city_name) ])
                                          ->one() ) === null
e8ccb1b4   Yarik   Import beta
173
174
175
                      ) {
                          // Create stock
                          $stock = new Stock();
8af13427   Yarik   For leha commit.
176
                          $stock->title = trim($city_name);
7c4bd867   Yarik   Import browser be...
177
                          $stock->save(false);
e8ccb1b4   Yarik   Import beta
178
179
180
                      }
                      
                      $productStock = ProductStock::find()
4428da8c   Yarik   Almost all databa...
181
182
183
184
185
186
                                                  ->where(
                                                      [
                                                          'product_variant_id' => $productVariant->id,
                                                          'stock_id'           => $stock->id,
                                                      ]
                                                  )
e8ccb1b4   Yarik   Import beta
187
                                                  ->one();
4428da8c   Yarik   Almost all databa...
188
189
190
191
                      if (!$productStock instanceof ProductStock) {
                          $productStock = new ProductStock();
                          $productStock->product_variant_id = $productVariant->id;
                          $productStock->stock_id = $stock->id;
e8ccb1b4   Yarik   Import beta
192
193
194
                      }
                      $productStock->quantity = $count;
                      
7c4bd867   Yarik   Import browser be...
195
                      $productStock->save(false);
e8ccb1b4   Yarik   Import beta
196
                      $productStocks = ProductStock::find()
4428da8c   Yarik   Almost all databa...
197
198
199
200
201
202
203
204
205
206
                                                   ->where(
                                                       [ 'product_variant_id' => $productVariant->id ]
                                                   )
                                                   ->andWhere(
                                                       [
                                                           '<>',
                                                           'stock_id',
                                                           $stock->id,
                                                       ]
                                                   )
e8ccb1b4   Yarik   Import beta
207
208
                                                   ->all();
                      
d8c1a2e0   Yarik   Big commit artbox
209
210
                      $quantity = array_sum(ArrayHelper::getColumn($productStocks, 'quantity')) + $count;
                  } else {
e8ccb1b4   Yarik   Import beta
211
212
                      
                      $productStocks = ProductStock::find()
4428da8c   Yarik   Almost all databa...
213
214
215
                                                   ->where(
                                                       [ 'product_variant_id' => $productVariant->id ]
                                                   )
e8ccb1b4   Yarik   Import beta
216
217
                                                   ->all();
                      
4428da8c   Yarik   Almost all databa...
218
                      if ($productStocks instanceof ProductStock) {
e8ccb1b4   Yarik   Import beta
219
220
221
222
223
                          $quantity = array_sum(ArrayHelper::getColumn($productStocks, 'quantity')) + $count;
                      } else {
                          $quantity = 0;
                      }
                      
d8c1a2e0   Yarik   Big commit artbox
224
                  }
e8ccb1b4   Yarik   Import beta
225
                  
4428da8c   Yarik   Almost all databa...
226
                  if ($price_promo) {
e8ccb1b4   Yarik   Import beta
227
228
229
230
231
232
233
234
235
                      $productVariant->price_old = $price;
                      $productVariant->price = $price_promo;
                  } else {
                      $productVariant->price = $price;
                      $productVariant->price_old = $price_promo;
                  }
                  
                  $productVariant->stock = $quantity;
                  
7c4bd867   Yarik   Import browser be...
236
                  $productVariant->save(false);
e8ccb1b4   Yarik   Import beta
237
                  
5c2eb7c8   Yarik   Big commit almost...
238
                  $this->output[] = '<span style="color:blue">Товар ' . $product_title . ' успешно сохранен</span>';
d8c1a2e0   Yarik   Big commit artbox
239
              }
e8ccb1b4   Yarik   Import beta
240
241
242
243
244
245
246
247
248
249
250
              
              $result = [
                  'end'       => feof($handle),
                  'from'      => ftell($handle),
                  'totalsize' => $filesize,
                  'items'     => $this->output,
              
              ];
              
              fclose($handle);
              
4428da8c   Yarik   Almost all databa...
251
              if ($result[ 'end' ]) {
e8ccb1b4   Yarik   Import beta
252
                  unlink(Yii::getAlias('@uploadDir') . '/' . Yii::getAlias('@uploadFilePrices'));
d8c1a2e0   Yarik   Big commit artbox
253
              }
e8ccb1b4   Yarik   Import beta
254
255
              
              return $result;
d8c1a2e0   Yarik   Big commit artbox
256
          }
36d1807a   Yarik   Big commit.
257
          
e8ccb1b4   Yarik   Import beta
258
          /**
c70f24ea   Yarik   For Leha commit.
259
260
           * Pull name and remote_id from formatted string
           *
e8ccb1b4   Yarik   Import beta
261
262
263
264
265
           * @param string $name
           *
           * @return array
           */
          private function parseName(string $name):array
d8c1a2e0   Yarik   Big commit artbox
266
          {
e8ccb1b4   Yarik   Import beta
267
268
269
              $pattern = '/^(?P<name>.*)(?:\(#(?P<remote_id>\w+)#\))?$/U';
              $name = trim($name);
              $matches = [];
4428da8c   Yarik   Almost all databa...
270
271
              if (preg_match($pattern, $name, $matches)) {
                  if (!isset( $matches[ 'remote_id' ] )) {
b30494bf   Yarik   Import browser beta
272
                      $matches[ 'remote_id' ] = '';
d8c1a2e0   Yarik   Big commit artbox
273
                  }
e8ccb1b4   Yarik   Import beta
274
                  return $matches;
d8c1a2e0   Yarik   Big commit artbox
275
              }
e8ccb1b4   Yarik   Import beta
276
277
278
279
280
281
282
              return [
                  'name'      => $name,
                  'remote_id' => '',
              ];
          }
          
          /**
c70f24ea   Yarik   For Leha commit.
283
284
           * Save categories
           *
e8ccb1b4   Yarik   Import beta
285
286
           * @param array $catalog_names
           *
c70f24ea   Yarik   For Leha commit.
287
           * @return int[] Category IDs
e8ccb1b4   Yarik   Import beta
288
289
290
291
           * @throws \Exception
           */
          private function saveCatalog(array $catalog_names):array
          {
36d1807a   Yarik   Big commit.
292
293
              $category_id = [];
              
4428da8c   Yarik   Almost all databa...
294
              foreach ($catalog_names as $catalog_name) {
d8c1a2e0   Yarik   Big commit artbox
295
                  // ==== Set category ====
e8ccb1b4   Yarik   Import beta
296
                  $parsed_name = $this->parseName($catalog_name);
4428da8c   Yarik   Almost all databa...
297
298
299
300
301
302
                  if (!empty( $parsed_name[ 'remote_id' ] ) && ( $category = Category::find()
                                                                                     ->joinWith('lang')
                                                                                     ->andFilterWhere(
                                                                                         [ 'remote_id' => $parsed_name[ 'remote_id' ] ]
                                                                                     )
                                                                                     ->one() ) !== null
e8ccb1b4   Yarik   Import beta
303
                  ) {
4428da8c   Yarik   Almost all databa...
304
                      if (!empty( $category->lang )) {
8af13427   Yarik   For leha commit.
305
                          $category->lang->title = $parsed_name[ 'name' ];
7c4bd867   Yarik   Import browser be...
306
                          $category->lang->save(false);
e8ccb1b4   Yarik   Import beta
307
                      } else {
4428da8c   Yarik   Almost all databa...
308
309
310
311
                          throw new \Exception(
                              'Category with ID ' . $category->id . ' and lang ' . Language::getCurrent(
                              )->id . ' doesn\'t exist'
                          );
e8ccb1b4   Yarik   Import beta
312
313
314
                      }
                      
                  } else {
d8c1a2e0   Yarik   Big commit artbox
315
316
                      // Create category
                      $category = new Category();
e8ccb1b4   Yarik   Import beta
317
                      $category->generateLangs();
8af13427   Yarik   For leha commit.
318
                      $category_langs = $category->modelLangs;
4428da8c   Yarik   Almost all databa...
319
                      foreach ($category_langs as $category_lang) {
8af13427   Yarik   For leha commit.
320
                          $category_lang->title = $parsed_name[ 'name' ];
e8ccb1b4   Yarik   Import beta
321
322
                      }
                      $category->remote_id = $parsed_name[ 'remote_id' ];
7c4bd867   Yarik   Import browser be...
323
                      $category->save(false);
d8c1a2e0   Yarik   Big commit artbox
324
                  }
8af13427   Yarik   For leha commit.
325
                  $category_id[] = $category->id;
d8c1a2e0   Yarik   Big commit artbox
326
              }
e8ccb1b4   Yarik   Import beta
327
328
329
330
              return $category_id;
          }
          
          /**
c70f24ea   Yarik   For Leha commit.
331
332
333
           * Save brand
           *
           * @param string|null $brand_name
e8ccb1b4   Yarik   Import beta
334
           *
c70f24ea   Yarik   For Leha commit.
335
           * @return int|null New Brand ID if inserted or exist or null if skipped
e8ccb1b4   Yarik   Import beta
336
337
           * @throws \Exception
           */
4428da8c   Yarik   Almost all databa...
338
          private function saveBrand(string $brand_name = null):int
e8ccb1b4   Yarik   Import beta
339
340
341
          {
              
              $parsed_name = $this->parseName($brand_name);
4428da8c   Yarik   Almost all databa...
342
              if (!empty( $brand_name )) {
36d1807a   Yarik   Big commit.
343
344
345
                  /**
                   * @var Brand $brand
                   */
4428da8c   Yarik   Almost all databa...
346
347
348
349
350
351
                  if (!empty( $parsed_name[ 'remote_id' ] ) && ( $brand = Brand::find()
                                                                               ->joinWith('lang')
                                                                               ->andFilterWhere(
                                                                                   [ 'remote_id' => $parsed_name[ 'remote_id' ] ]
                                                                               )
                                                                               ->one() ) !== null
e8ccb1b4   Yarik   Import beta
352
                  ) {
4428da8c   Yarik   Almost all databa...
353
                      if (!empty( $brand->lang )) {
8af13427   Yarik   For leha commit.
354
                          $brand->lang->title = $parsed_name[ 'name' ];
7c4bd867   Yarik   Import browser be...
355
                          $brand->lang->save(false);
e8ccb1b4   Yarik   Import beta
356
                      } else {
4428da8c   Yarik   Almost all databa...
357
358
359
360
                          throw new \Exception(
                              'Brand with ID ' . $brand->id . ' and lang ' . Language::getCurrent(
                              )->id . ' doesn\'t exist'
                          );
e8ccb1b4   Yarik   Import beta
361
                      }
8af13427   Yarik   For leha commit.
362
                      return $brand->id;
d8c1a2e0   Yarik   Big commit artbox
363
364
365
                  } else {
                      // Create brand
                      $brand = new Brand();
e8ccb1b4   Yarik   Import beta
366
                      $brand->generateLangs();
8af13427   Yarik   For leha commit.
367
                      $brand_langs = $brand->modelLangs;
4428da8c   Yarik   Almost all databa...
368
                      foreach ($brand_langs as $brand_lang) {
8af13427   Yarik   For leha commit.
369
                          $brand_lang->title = $parsed_name[ 'name' ];
e8ccb1b4   Yarik   Import beta
370
371
                      }
                      $brand->remote_id = $parsed_name[ 'remote_id' ];
7c4bd867   Yarik   Import browser be...
372
                      $brand->save(false);
8af13427   Yarik   For leha commit.
373
                      return $brand->id;
d8c1a2e0   Yarik   Big commit artbox
374
375
                  }
              }
4428da8c   Yarik   Almost all databa...
376
              return null;
e8ccb1b4   Yarik   Import beta
377
378
379
          }
          
          /**
c70f24ea   Yarik   For Leha commit.
380
381
382
383
384
           * Save Product or ProductVariant photoes
           *
           * @param string[] $fotos              Photoes names
           * @param int      $product_id
           * @param int|null $product_variant_id Null if photo for Product
e8ccb1b4   Yarik   Import beta
385
           */
4428da8c   Yarik   Almost all databa...
386
          private function saveFotos(array $fotos, int $product_id, int $product_variant_id = null)
e8ccb1b4   Yarik   Import beta
387
          {
4428da8c   Yarik   Almost all databa...
388
389
              if (!empty( $fotos )) {
                  foreach ($fotos as $foto) {
4428da8c   Yarik   Almost all databa...
390
                      if (empty( $foto )) {
af036678   Yarik   Image behaviors
391
392
                          continue;
                      }
e8ccb1b4   Yarik   Import beta
393
                      $source_image = Yii::getAlias('@uploadDir') . '/product_images/' . urlencode($foto);
4428da8c   Yarik   Almost all databa...
394
395
396
397
398
399
400
401
                      if (file_exists($source_image)) {
                          if (( $productImage = ProductImage::find()
                                                            ->andWhere([ 'image' => $foto ])
                                                            ->andWhere([ 'product_id' => $product_id ])
                                                            ->andFilterWhere(
                                                                [ 'product_variant_id' => $product_variant_id ]
                                                            )
                                                            ->one() ) === null
e8ccb1b4   Yarik   Import beta
402
                          ) {
d8c1a2e0   Yarik   Big commit artbox
403
404
                              copy($source_image, Yii::getAlias('@productsDir') . "/" . $foto);
                              $productImage = new ProductImage();
e8ccb1b4   Yarik   Import beta
405
406
                              $productImage->product_id = $product_id;
                              $productImage->product_variant_id = $product_variant_id;
d8c1a2e0   Yarik   Big commit artbox
407
                              $productImage->image = $foto;
7c4bd867   Yarik   Import browser be...
408
                              $productImage->save(false);
d8c1a2e0   Yarik   Big commit artbox
409
410
411
412
                          }
                      }
                  }
              }
e8ccb1b4   Yarik   Import beta
413
414
415
          }
          
          /**
c70f24ea   Yarik   For Leha commit.
416
417
           * Save ProductVariants
           *
772a3ca4   Yarik   Big commit
418
           * @param array      $data             ProductVariats data
c70f24ea   Yarik   For Leha commit.
419
           * @param float      $product_cost_old Old price
772a3ca4   Yarik   Big commit
420
421
           * @param int        $product_id       Product ID
           * @param array      $category_id      Ca
5c2eb7c8   Yarik   Big commit almost...
422
           * @param float|null $product_cost
e8ccb1b4   Yarik   Import beta
423
           *
772a3ca4   Yarik   Big commit
424
           * @return int[] Array of ProductVariants IDs
5c2eb7c8   Yarik   Big commit almost...
425
           * @throws \Exception
e8ccb1b4   Yarik   Import beta
426
           */
4428da8c   Yarik   Almost all databa...
427
428
429
430
431
432
433
          private function saveVariants(
              array $data,
              float $product_cost_old,
              int $product_id,
              array $category_id,
              float $product_cost = null
          ):array
e8ccb1b4   Yarik   Import beta
434
          {
d8c1a2e0   Yarik   Big commit artbox
435
              $MOD_ARRAY = [];
4428da8c   Yarik   Almost all databa...
436
437
              for ($i = 13; $i < count($data); $i++) {
                  if (!empty ( $data[ $i ] )) {
e8ccb1b4   Yarik   Import beta
438
439
                      $mod_arr = explode('=', $data[ $i ]);
                      $mod_art = $mod_arr[ 0 ];
72a992f5   Yarik   Import browser v1.0
440
                      $mod_art_parsed = $this->parseName($mod_art);
e8ccb1b4   Yarik   Import beta
441
442
                      $variant_filters = explode('*', $mod_arr[ 1 ]);
                      $mod_name = $mod_arr[ 2 ];
4428da8c   Yarik   Almost all databa...
443
                      if (empty( $mod_name )) {
5c2eb7c8   Yarik   Big commit almost...
444
                          $mod_name = $mod_art_parsed[ 'name' ];
e8ccb1b4   Yarik   Import beta
445
446
447
448
                      }
                      $mod_image = $mod_arr[ 3 ];
                      $mod_stock = isset( $mod_arr[ 4 ] ) ? $mod_arr[ 4 ] : 1;
                      $mod_cost = isset( $product_cost ) ? floatval($product_cost) : 0;
d8c1a2e0   Yarik   Big commit artbox
449
                      $mod_old_cost = floatval($product_cost_old);
d8c1a2e0   Yarik   Big commit artbox
450
                      // Check product variant
e8ccb1b4   Yarik   Import beta
451
452
453
                      /**
                       * @var ProductVariant $_productVariant
                       */
4428da8c   Yarik   Almost all databa...
454
455
456
457
458
459
460
461
462
                      if (( $_productVariant = ProductVariant::find()
                                                             ->joinWith('lang')
                                                             ->andFilterWhere(
                                                                 [ 'remote_id' => $mod_art_parsed[ 'remote_id' ] ]
                                                             )
                                                             ->andFilterWhere(
                                                                 [ 'product_variant.product_id' => $product_id ]
                                                             )
                                                             ->one() ) === null
e8ccb1b4   Yarik   Import beta
463
                      ) {
d8c1a2e0   Yarik   Big commit artbox
464
                          $_productVariant = new ProductVariant();
e8ccb1b4   Yarik   Import beta
465
                          $_productVariant->product_id = $product_id;
4428da8c   Yarik   Almost all databa...
466
                          if (!empty( $mod_art_parsed[ 'remote_id' ] )) {
5c2eb7c8   Yarik   Big commit almost...
467
                              $_productVariant->remote_id = $mod_art_parsed[ 'remote_id' ];
72a992f5   Yarik   Import browser v1.0
468
                          }
e8ccb1b4   Yarik   Import beta
469
                          $_productVariant->generateLangs();
8af13427   Yarik   For leha commit.
470
                          $product_variant_langs = $_productVariant->modelLangs;
4428da8c   Yarik   Almost all databa...
471
                          foreach ($product_variant_langs as $product_variant_lang) {
8af13427   Yarik   For leha commit.
472
                              $product_variant_lang->title = $mod_name;
e8ccb1b4   Yarik   Import beta
473
474
                          }
                      } else {
4428da8c   Yarik   Almost all databa...
475
                          if (!empty( $_productVariant->lang )) {
8af13427   Yarik   For leha commit.
476
                              $_productVariant->lang->title = $mod_name;
7c4bd867   Yarik   Import browser be...
477
                              $_productVariant->lang->save(false);
e8ccb1b4   Yarik   Import beta
478
                          } else {
4428da8c   Yarik   Almost all databa...
479
480
481
482
                              throw new \Exception(
                                  'Product variant with ID ' . $_productVariant->id . ' and lang ' . Language::getCurrent(
                                  )->id . ' doesn\'t exist'
                              );
e8ccb1b4   Yarik   Import beta
483
                          }
d8c1a2e0   Yarik   Big commit artbox
484
485
                      }
                      $_productVariant->product_unit_id = 1;
5c2eb7c8   Yarik   Big commit almost...
486
                      $_productVariant->sku = $mod_art_parsed[ 'name' ];
d8c1a2e0   Yarik   Big commit artbox
487
488
489
                      $_productVariant->price = $mod_cost;
                      $_productVariant->price_old = $mod_old_cost;
                      $_productVariant->stock = $mod_stock;
e8ccb1b4   Yarik   Import beta
490
                      
4428da8c   Yarik   Almost all databa...
491
                      if (!empty ( $variant_filters )) {
e8ccb1b4   Yarik   Import beta
492
                          $variants_options = $this->saveFilters($variant_filters, 1, $category_id);
d8c1a2e0   Yarik   Big commit artbox
493
                      }
e8ccb1b4   Yarik   Import beta
494
                      
4428da8c   Yarik   Almost all databa...
495
                      if (isset( $variants_options ) && !empty( $variants_options )) {
d8c1a2e0   Yarik   Big commit artbox
496
497
                          $_productVariant->options = $variants_options;
                      }
b30494bf   Yarik   Import browser beta
498
                      
e8ccb1b4   Yarik   Import beta
499
500
501
                      /**
                       * @todo set to false
                       */
d8c1a2e0   Yarik   Big commit artbox
502
                      $_productVariant->save(false);
e8ccb1b4   Yarik   Import beta
503
                      
4428da8c   Yarik   Almost all databa...
504
505
                      $MOD_ARRAY[] = $_productVariant->id;
                      $this->saveFotos([ $mod_image ], $product_id, $_productVariant->id);
e8ccb1b4   Yarik   Import beta
506
507
508
509
510
                  }
              }
              return $MOD_ARRAY;
          }
          
772a3ca4   Yarik   Big commit
511
512
513
514
515
516
517
518
          /**
           * Perform product import
           *
           * @param int  $from  Begin row
           * @param null $limit Row limit
           *
           * @return array|bool Array if OK, false if error
           */
4428da8c   Yarik   Almost all databa...
519
          public function goProducts($from = 0, $limit = null)
e8ccb1b4   Yarik   Import beta
520
          {
e8ccb1b4   Yarik   Import beta
521
522
              set_time_limit(0);
              
4428da8c   Yarik   Almost all databa...
523
              if (!( $handle = $this->getProductsFile('uploadFileProducts') )) {
e8ccb1b4   Yarik   Import beta
524
525
526
                  $this->errors[] = 'File not found';
                  return false;
              }
b30494bf   Yarik   Import browser beta
527
              
e8ccb1b4   Yarik   Import beta
528
529
              $filesize = filesize(Yii::getAlias('@uploadDir') . '/' . Yii::getAlias('@uploadFileProducts'));
              
4428da8c   Yarik   Almost all databa...
530
              if ($from) {
e8ccb1b4   Yarik   Import beta
531
532
533
534
535
                  fseek($handle, $from);
              }
              
              $j = 0;
              
4428da8c   Yarik   Almost all databa...
536
537
538
539
540
541
542
543
544
545
              $is_utf = ( preg_match(
                  '//u',
                  file_get_contents(
                      Yii::getAlias('@uploadDir') . '/' . Yii::getAlias('@uploadFileProducts'),
                      null,
                      null,
                      null,
                      1000000
                  )
              ) );
e8ccb1b4   Yarik   Import beta
546
547
548
              
              $result_items = [];
              
4428da8c   Yarik   Almost all databa...
549
              while (( empty( $limit ) || $j++ < $limit ) && ( $data = fgetcsv($handle, 10000, ";") ) !== false) {
e8ccb1b4   Yarik   Import beta
550
                  try {
af036678   Yarik   Image behaviors
551
                      
4428da8c   Yarik   Almost all databa...
552
553
                      foreach ($data as &$value) {
                          if (!$is_utf) {
e8ccb1b4   Yarik   Import beta
554
555
556
557
558
                              $value = iconv('windows-1251', "UTF-8//TRANSLIT//IGNORE", $value);
                          }
                          $value = trim($value);
                      }
                      // будет всегда 19 элементов
4428da8c   Yarik   Almost all databa...
559
560
561
                      for ($i = 0; $i <= 18; $i++) {
                          if (!isset ( $data[ $i ] )) {
                              $data[ $i ] = null;
e8ccb1b4   Yarik   Import beta
562
563
564
565
                          }
                      }
                      // 1  Группа (категория)
                      $catalog_names = explode(',', $data[ 0 ]);
4428da8c   Yarik   Almost all databa...
566
                      if (empty ( $catalog_names )) {
e8ccb1b4   Yarik   Import beta
567
568
569
570
571
572
573
574
575
576
577
578
579
                          $result_items[] = "Не указана категория (строка $j)";
                          continue;
                      }
                      
                      // 2  Бренд
                      $brand_name = $data[ 1 ];
                      //                if(empty ( $brand_name )) {
                      //                    $result_items[] = "Не указан бренд (строка $j)";
                      //                    continue;
                      //                }
                      
                      // 3  Название товара
                      $product_name = $data[ 2 ];
4428da8c   Yarik   Almost all databa...
580
                      if (empty ( $product_name )) {
e8ccb1b4   Yarik   Import beta
581
582
583
584
585
586
587
588
589
590
591
592
593
                          $result_items[] = "Не указано наименование товара (строка $j)";
                          continue;
                      }
                      
                      // 5  Описание товара
                      $product_body = $data[ 3 ];
                      
                      // 6  Фильтр
                      $filters = explode('*', $data[ 4 ]);
                      
                      // 11 Цена акция
                      $product_cost_old = floatval($data[ 6 ]);
                      
4428da8c   Yarik   Almost all databa...
594
                      $product_cost = null;
e8ccb1b4   Yarik   Import beta
595
                      // 10 Цена
4428da8c   Yarik   Almost all databa...
596
                      if ($product_cost_old) {
e8ccb1b4   Yarik   Import beta
597
598
599
600
601
                          $product_cost_old = floatval($data[ 5 ]);
                          $product_cost = floatval($data[ 6 ]);
                      }
                      
                      // 12 Акция
4428da8c   Yarik   Almost all databa...
602
                      $product_discount = (bool) $data[ 7 ];
e8ccb1b4   Yarik   Import beta
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
                      
                      // 13 Сопуд. Тов.
                      $similar = explode(',', $data[ 8 ]);
                      
                      // 14 Новинки
                      $product_new = (bool) $data[ 9 ];
                      
                      // 15 Топ продаж
                      $product_top = (bool) $data[ 10 ];
                      
                      // 17 ВИДЕО КОД
                      $product_video = $data[ 11 ];
                      
                      // 18 Галлерея фото
                      $fotos = [];
4428da8c   Yarik   Almost all databa...
618
                      if (trim($data[ 12 ])) {
e8ccb1b4   Yarik   Import beta
619
620
621
                          $fotos = explode(',', trim($data[ 12 ]));
                      }
                      
8af13427   Yarik   For leha commit.
622
                      //                    $lang = \Yii::$app->session->get('export_lang', Language::getDefaultLanguage()->id);
b30494bf   Yarik   Import browser beta
623
624
625
626
                      //                    /**
                      //                     * @var Language $language
                      //                     */
                      //                    $language = Language::find()
8af13427   Yarik   For leha commit.
627
                      //                                        ->where([ 'id' => $lang ])
b30494bf   Yarik   Import browser beta
628
629
                      //                                        ->one();
                      //                    Language::setCurrent($language->url);
e8ccb1b4   Yarik   Import beta
630
                      $categories = $this->saveCatalog($catalog_names);
5c2eb7c8   Yarik   Big commit almost...
631
                      
e8ccb1b4   Yarik   Import beta
632
                      $brand_id = $this->saveBrand($brand_name);
e8ccb1b4   Yarik   Import beta
633
634
                      
                      $options = [];
4428da8c   Yarik   Almost all databa...
635
                      if (!empty ( $filters )) {
e8ccb1b4   Yarik   Import beta
636
                          $options = $this->saveFilters($filters, 0, $categories);
e8ccb1b4   Yarik   Import beta
637
638
639
640
641
                      }
                      $parsed_name = $this->parseName($product_name);
                      /**
                       * @var Product $_product
                       */
4428da8c   Yarik   Almost all databa...
642
643
644
645
646
647
                      if (!empty( $parsed_name[ 'remote_id' ] ) && ( $_product = Product::find()
                                                                                        ->joinWith('lang')
                                                                                        ->andFilterWhere(
                                                                                            [ 'remote_id' => $parsed_name[ 'remote_id' ] ]
                                                                                        )
                                                                                        ->one() ) !== null
e8ccb1b4   Yarik   Import beta
648
                      ) {
4428da8c   Yarik   Almost all databa...
649
                          if (!empty( $_product->lang )) {
8af13427   Yarik   For leha commit.
650
                              $_product->lang->title = $parsed_name[ 'name' ];
e8ccb1b4   Yarik   Import beta
651
                              $_product->lang->description = $product_body;
7c4bd867   Yarik   Import browser be...
652
                              $_product->lang->save(false);
e8ccb1b4   Yarik   Import beta
653
                          } else {
4428da8c   Yarik   Almost all databa...
654
655
656
657
                              throw new \Exception(
                                  'Product with ID ' . $_product->id . ' and lang ' . Language::getCurrent(
                                  )->id . ' doesn\'t exist'
                              );
e8ccb1b4   Yarik   Import beta
658
659
660
661
                          }
                      } else {
                          $_product = new Product();
                          $_product->generateLangs();
8af13427   Yarik   For leha commit.
662
                          $product_langs = $_product->modelLangs;
4428da8c   Yarik   Almost all databa...
663
                          foreach ($product_langs as $product_lang) {
8af13427   Yarik   For leha commit.
664
                              $product_lang->title = $parsed_name[ 'name' ];
e8ccb1b4   Yarik   Import beta
665
666
667
                              $product_lang->description = $product_body;
                          }
                      }
b30494bf   Yarik   Import browser beta
668
                      
8af13427   Yarik   For leha commit.
669
                      $is_new_product = empty( $_product->id );
e8ccb1b4   Yarik   Import beta
670
671
672
673
674
675
676
                      
                      $_product->categories = $categories;
                      
                      $_product->brand_id = $brand_id;
                      
                      $_product->video = $product_video;
                      $_product->is_top = $product_top;
4428da8c   Yarik   Almost all databa...
677
                      $_product->is_discount = $product_discount;
e8ccb1b4   Yarik   Import beta
678
                      $_product->is_new = $product_new;
4428da8c   Yarik   Almost all databa...
679
                      if (!empty( $options )) {
9f8be5c9   Yarik   Import browser be...
680
681
                          $_product->options = $options;
                      }
5c2eb7c8   Yarik   Big commit almost...
682
                      
4428da8c   Yarik   Almost all databa...
683
                      if (!empty( $_product->lang )) {
8af13427   Yarik   For leha commit.
684
                          $product_name_inserted = $_product->lang->title;
9f8be5c9   Yarik   Import browser be...
685
                      } else {
8af13427   Yarik   For leha commit.
686
                          $product_name_inserted = $_product->modelLangs[ Language::$current->id ]->title;
9f8be5c9   Yarik   Import browser be...
687
                      }
9f8be5c9   Yarik   Import browser be...
688
                      
4428da8c   Yarik   Almost all databa...
689
                      if (( $_product->save(false) === false ) || !$_product->transactionStatus) {
e8ccb1b4   Yarik   Import beta
690
691
                          $result_items[] = 'Product #' . $product_name_inserted . ' not saved' . " (line $j)";
                          continue;
d8c1a2e0   Yarik   Big commit artbox
692
                      }
b30494bf   Yarik   Import browser beta
693
                      
8af13427   Yarik   For leha commit.
694
                      $this->saveFotos($fotos, $_product->id);
e8ccb1b4   Yarik   Import beta
695
                      // нужно для проставления характеристик относящихся к модификациям
b30494bf   Yarik   Import browser beta
696
                      
8af13427   Yarik   For leha commit.
697
                      $this->saveVariants($data, $product_cost_old, $_product->id, $_product->categories, $product_cost);
e8ccb1b4   Yarik   Import beta
698
                      
5c2eb7c8   Yarik   Big commit almost...
699
                      //                    $_product->save(false);
e8ccb1b4   Yarik   Import beta
700
                      
8af13427   Yarik   For leha commit.
701
                      $result_items[] = "Product {$product_name_inserted} #{$_product->id} saved (" . ( $is_new_product ? 'new product' : 'exists product' ) . ")" . " (line $j)";
e8ccb1b4   Yarik   Import beta
702
                      
4428da8c   Yarik   Almost all databa...
703
                  } catch (\Exception $e) {
b30494bf   Yarik   Import browser beta
704
                      $result_items[] = $e->getMessage() . '(line ' . $j . ')';
d8c1a2e0   Yarik   Big commit artbox
705
                  }
e8ccb1b4   Yarik   Import beta
706
                  
d8c1a2e0   Yarik   Big commit artbox
707
              }
e8ccb1b4   Yarik   Import beta
708
709
710
711
712
713
714
              
              $result = [
                  'end'       => feof($handle),
                  'from'      => ftell($handle),
                  'totalsize' => $filesize,
                  'items'     => $result_items,
              ];
b30494bf   Yarik   Import browser beta
715
              
e8ccb1b4   Yarik   Import beta
716
              fclose($handle);
b30494bf   Yarik   Import browser beta
717
              
4428da8c   Yarik   Almost all databa...
718
              if ($result[ 'end' ]) {
b30494bf   Yarik   Import browser beta
719
                  //                unlink(Yii::getAlias('@uploadDir') . '/' . Yii::getAlias('@uploadFileProducts'));
d8c1a2e0   Yarik   Big commit artbox
720
              }
e8ccb1b4   Yarik   Import beta
721
722
              
              return $result;
d8c1a2e0   Yarik   Big commit artbox
723
          }
e8ccb1b4   Yarik   Import beta
724
          
772a3ca4   Yarik   Big commit
725
726
727
728
729
730
731
          /**
           * Get import file
           *
           * @param string $file_type
           *
           * @return bool|resource false if File not found and file resource if OK
           */
e8ccb1b4   Yarik   Import beta
732
733
734
          private function getProductsFile($file_type)
          {
              $filename = Yii::getAlias('@uploadDir') . '/' . Yii::getAlias('@' . $file_type);
4428da8c   Yarik   Almost all databa...
735
              if (!is_file($filename)) {
e8ccb1b4   Yarik   Import beta
736
737
                  $this->errors[] = "File $filename not found";
                  return false;
d8c1a2e0   Yarik   Big commit artbox
738
              }
e8ccb1b4   Yarik   Import beta
739
740
741
742
              return fopen($filename, 'r');
          }
          
          /**
772a3ca4   Yarik   Big commit
743
744
745
746
747
748
749
           * Save filters
           *
           * @param array $filters       array of filters like [['pol'='мужской'],['god' =
           *                             '2013'],['volume'='25 л']*['size'='49 x 30 x
           *                             20см'],['composition'='600D полиэстер']]
           * @param int   $level         0 for products and 1 for product variant
           * @param int[] $catalog_names array catalogs id
e8ccb1b4   Yarik   Import beta
750
751
752
753
754
755
756
           *
           * @return array
           * @throws \Exception
           */
          private function saveFilters(array $filters, int $level, array $catalog_names):array
          {
              $options = [];
4428da8c   Yarik   Almost all databa...
757
              foreach ($filters as $filter) {
5c2eb7c8   Yarik   Big commit almost...
758
                  
e8ccb1b4   Yarik   Import beta
759
                  preg_match_all('/\[(.*):(.*)\]/', $filter, $filter);
5c2eb7c8   Yarik   Big commit almost...
760
                  
4428da8c   Yarik   Almost all databa...
761
                  if (empty( $filter[ 1 ][ 0 ] )) {
e8ccb1b4   Yarik   Import beta
762
763
764
765
                      continue;
                  }
                  $filter_name = trim($filter[ 1 ][ 0 ]);
                  $parsed_group_name = $this->parseName($filter_name);
5c2eb7c8   Yarik   Big commit almost...
766
                  
e8ccb1b4   Yarik   Import beta
767
768
769
                  /**
                   * @var TaxGroup $taxGroup
                   */
4428da8c   Yarik   Almost all databa...
770
771
772
773
774
775
                  if (!empty( $parsed_group_name[ 'remote_id' ] ) && ( $taxGroup = TaxGroup::find()
                                                                                           ->joinWith('lang')
                                                                                           ->andFilterWhere(
                                                                                               [ 'remote_id' => $parsed_group_name[ 'remote_id' ] ]
                                                                                           )
                                                                                           ->one() ) !== null
b30494bf   Yarik   Import browser beta
776
                  ) {
4428da8c   Yarik   Almost all databa...
777
                      if (!empty( $taxGroup->lang )) {
8af13427   Yarik   For leha commit.
778
                          $taxGroup->lang->title = $parsed_group_name[ 'name' ];
7c4bd867   Yarik   Import browser be...
779
                          $taxGroup->lang->save(false);
e8ccb1b4   Yarik   Import beta
780
                      } else {
4428da8c   Yarik   Almost all databa...
781
                          throw new \Exception(
c70f24ea   Yarik   For Leha commit.
782
                              'Tax group with ID ' . $taxGroup->id . ' and lang ' . Language::getCurrent(
4428da8c   Yarik   Almost all databa...
783
784
                              )->id . ' doesn\'t exist'
                          );
e8ccb1b4   Yarik   Import beta
785
786
787
788
                      }
                  } else {
                      $taxGroup = new TaxGroup();
                      $taxGroup->generateLangs();
8af13427   Yarik   For leha commit.
789
                      $tax_group_langs = $taxGroup->modelLangs;
4428da8c   Yarik   Almost all databa...
790
                      foreach ($tax_group_langs as $tax_group_lang) {
8af13427   Yarik   For leha commit.
791
                          $tax_group_lang->title = $parsed_group_name[ 'name' ];
e8ccb1b4   Yarik   Import beta
792
793
794
795
                      }
                      $taxGroup->level = $level;
                      $taxGroup->categories = $catalog_names;
                      $taxGroup->is_filter = false;
7c4bd867   Yarik   Import browser be...
796
                      $taxGroup->save(false);
e8ccb1b4   Yarik   Import beta
797
                  }
8c4b7f44   Yarik   Import browser be...
798
                  $filters_options = explode(',', $filter[ 2 ][ 0 ]);
4428da8c   Yarik   Almost all databa...
799
                  foreach ($filters_options as $filter_options) {
8c4b7f44   Yarik   Import browser be...
800
801
802
803
                      $parsed_option_name = $this->parseName($filter_options);
                      /**
                       * @var TaxOption $option
                       */
5c2eb7c8   Yarik   Big commit almost...
804
                      
4428da8c   Yarik   Almost all databa...
805
806
807
808
809
810
                      if (!empty( $parsed_option_name[ 'remote_id' ] ) && ( $option = TaxOption::find()
                                                                                               ->joinWith('lang')
                                                                                               ->andFilterWhere(
                                                                                                   [ 'remote_id' => $parsed_option_name[ 'remote_id' ] ]
                                                                                               )
                                                                                               ->andFilterWhere(
c70f24ea   Yarik   For Leha commit.
811
                                                                                                   [ 'tax_group_id' => $taxGroup->id ]
4428da8c   Yarik   Almost all databa...
812
813
                                                                                               )
                                                                                               ->one() ) !== null
8c4b7f44   Yarik   Import browser be...
814
                      ) {
4428da8c   Yarik   Almost all databa...
815
                          if (!empty( $option->lang )) {
8c4b7f44   Yarik   Import browser be...
816
                              $option->lang->value = $parsed_option_name[ 'name' ];
7c4bd867   Yarik   Import browser be...
817
                              $option->lang->save(false);
8c4b7f44   Yarik   Import browser be...
818
                          } else {
4428da8c   Yarik   Almost all databa...
819
                              throw new \Exception(
c70f24ea   Yarik   For Leha commit.
820
                                  'Tax option with ID ' . $option->id . ' and lang ' . Language::getCurrent(
4428da8c   Yarik   Almost all databa...
821
822
                                  )->id . ' doesn\'t exist'
                              );
8c4b7f44   Yarik   Import browser be...
823
824
825
826
827
                          }
                      } else {
                          // Create option
                          $option = new TaxOption();
                          $option->generateLangs();
8af13427   Yarik   For leha commit.
828
                          $option_langs = $option->modelLangs;
4428da8c   Yarik   Almost all databa...
829
                          foreach ($option_langs as $option_lang) {
8c4b7f44   Yarik   Import browser be...
830
831
                              $option_lang->value = $parsed_option_name[ 'name' ];
                          }
c70f24ea   Yarik   For Leha commit.
832
                          $option->id = $taxGroup->id;
7c4bd867   Yarik   Import browser be...
833
                          $option->save(false);
8c4b7f44   Yarik   Import browser be...
834
                      }
c70f24ea   Yarik   For Leha commit.
835
                      $options[] = $option->id;
8c4b7f44   Yarik   Import browser be...
836
                  }
d8c1a2e0   Yarik   Big commit artbox
837
              }
e8ccb1b4   Yarik   Import beta
838
              return $options;
d8c1a2e0   Yarik   Big commit artbox
839
          }
772a3ca4   Yarik   Big commit
840
841
      }