PriceWriter.php
4.67 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
<?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;
/**
 * Class PriceWriter
 * @package common\components
 * записывает в БД отпарсенные данные
 * запись происходит в несколько таблиц
 */
class PriceWriter
{
    /**
     * @var - int - 0 - интерактивный режим, 1 - консольный
     */
    public $mode;
    /**
     * @var - массив с настройками записи
     */
    public $configuration;
    /**
     * @var - массив с данными которые нужно записать
     */
    public $data;
    function __construct()
    {
        set_time_limit(300);
    }
    public function writeDataToDB()
    {
        // 1. запишем дату старта в таблицу файлов поставщика (ImportersFiles)
        // id  загруженного файла получим из конфигурации
        $files_model = ImportersFiles::findOne($this->configuration['record_id']);
        $update_date = date('Y-m-d H:i:s');
        $files_model->time_start = $update_date;
        // запишем дату начала загрузки
        if (!$files_model->save()) {
            throw new \ErrorException(implode(', ', $files_model->getErrors()));
        }
        // 2. запишем полученные данные в таблицу товаров (Details)
        $details_model = new Details();
        // только для ручной загрузки, в авто режиме все делает конвертер при первом же проходе (в процессе парсинга)
        if ($this->mode == 0) {
            // преобразуем числовые значения
            foreach ($this->data as &$row) {
                $row['PRICE'] = \Yii::$app->converter->convertTo('float',$row['PRICE']);
                $row['BOX'] = \Yii::$app->converter->convertTo('integer',$row['BOX']);
                // присвоим полный артикул
                $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 {
                    $row['ARTICLE'] = \Yii::$app->converter->convertTo( 'Article', $row['ARTICLE'] );
                }
                if (isset($row['ADD_BOX']))
                    $row['ADD_BOX'] = \Yii::$app->converter->convertTo( 'integer', $row['ADD_BOX'] );
                // проверим все ли обязательные колонки были указаны пользователем
                $details_model->load(['Details' => $row]);
                if (!$details_model->validate())
                    //@todo предоставить более детальную информацию об ошибке
                    throw new \ErrorException('Ошибка записи товаров');
            }
        }
        // дополним данные значением импортера и даты обновления цены
        $this->data = CustomArrayHelper::addColumns( $this->data, ['IMPORT_ID' => $this->configuration['importer_id'], 'timestamp' => $update_date] );
        try {
            //@todo add transaction
            if ( isset($this->configuration['delete_price']) && (int)$this->configuration['delete_price'] ) {
                $details_model->delete_price = true;
            }
            //2. попытаемся вставить данные в БД с апдейтом по ключам
            $details_model->ManualInsert($this->data, $this->configuration['importer_id']);
            // 3. зафиксируем дату конца загрузки в файлах поставщика
            if (!$files_model->save()) {
                throw new \ErrorException(implode(', ', $files_model->getErrors()));
            }
            // 4. зафиксируем дату загрузки в таблице поставщиков
            $imp_model = Importers::findOne($this->configuration['importer_id']);
            $imp_model->price_date_update = $update_date;
            if (!$imp_model->save()) {
                throw new \ErrorException(implode(', ', $imp_model->getErrors()));
            }
        } catch (ErrorException  $e) {
            throw new \ErrorException($e->getMessage());
        }
        return true;
    }
}