Commit 166dd085afd8890d3dfc5a959163582a5b25e0f8
Merge remote-tracking branch 'origin/master'
Showing
51 changed files
with
2436 additions
and
415 deletions
Show diff stats
.gitignore
backend/components/base/BaseActiveRecord.php
@@ -9,4 +9,17 @@ | @@ -9,4 +9,17 @@ | ||
9 | namespace backend\components\base; | 9 | namespace backend\components\base; |
10 | 10 | ||
11 | 11 | ||
12 | -class BaseActiveRecord extends \yii\db\ActiveRecord {} | ||
13 | \ No newline at end of file | 12 | \ No newline at end of file |
13 | +use yii\base\ErrorException; | ||
14 | + | ||
15 | +class BaseActiveRecord extends \yii\db\ActiveRecord { | ||
16 | + | ||
17 | + public function throwStringErrorException(){ | ||
18 | + | ||
19 | + $errors_str = ''; | ||
20 | + foreach ($this->getErrors() as $error) { | ||
21 | + $errors_str .= implode( array_values($error) ); | ||
22 | + } | ||
23 | + throw new ErrorException( $errors_str ); | ||
24 | + } | ||
25 | + | ||
26 | +} | ||
14 | \ No newline at end of file | 27 | \ No newline at end of file |
1 | +<?php | ||
2 | +namespace backend\components\parsers; | ||
3 | +use yii\multiparser\Converter; | ||
4 | + | ||
5 | +class CustomConverter extends Converter { | ||
6 | + | ||
7 | + /** | ||
8 | + * @param $value_arr - двумерный массив значений, которому нужно присвоить ключи | ||
9 | + * @param $key_array - ключи для вложенного массива | ||
10 | + * @return array - таблица с проименованными колонками | ||
11 | + */ | ||
12 | + public static function convertToAssocArray ( array $value_arr, array $key_array, $key_prefix = '') | ||
13 | + { | ||
14 | + // очистка служебного префикса в массиве заголовков | ||
15 | + if ($key_prefix) { | ||
16 | + $params_array = array_fill( 0, count($key_array), $key_prefix ); | ||
17 | + //@todo переписать с использованием array_walk | ||
18 | + $key_array = array_map( function ($value, $key_prefix){ return str_replace( $key_prefix, '',$value ); }, $key_array, $params_array ); | ||
19 | + //уберем пустые элементы | ||
20 | + $key_array = array_filter($key_array, function ($value){ return $value !==''; }); | ||
21 | + } | ||
22 | + | ||
23 | + // преобразуем массив ключей (обернем в массив), для передачи его в качестве параметра в анонимную функцию для array_map | ||
24 | + // для этого увеличим размерность массива, что бы при каждом обходе массива $value_arr , функции был доступен исходный массив ключей | ||
25 | + $key_array = array_fill( 0, count($value_arr), $key_array ); | ||
26 | + // \common\components\CustomVarDamp::dumpAndDie($key_array); | ||
27 | + $result = array_map( | ||
28 | + function ($value, $key_array) { | ||
29 | + $res = $value; | ||
30 | + foreach ($value as $key => $sub_value) { | ||
31 | + if (isset($key_array[$key])) { | ||
32 | + // если такой ключ в базовом массиве (массиве ключей) есть, то заменим новым, иначе просто удалим | ||
33 | + $new_key = $key_array[$key]; | ||
34 | + if( !array_key_exists( $new_key , $res ) ){ | ||
35 | + $res[ $new_key ] = $res[$key]; | ||
36 | + } | ||
37 | + } | ||
38 | + unset( $res[$key] ); | ||
39 | + } | ||
40 | + | ||
41 | + return $res; | ||
42 | + }, | ||
43 | + $value_arr, $key_array); | ||
44 | + return $result; | ||
45 | + } | ||
46 | + | ||
47 | + /** | ||
48 | + * @param $value_arr - двумерный массив к которому нужно добавить колонки | ||
49 | + * @param $add_array - массив с колонками (ключи) и занчениями колонок | ||
50 | + * @return mixed | ||
51 | + */ | ||
52 | + public function addColumns ( array $value_arr , array $add_array ) | ||
53 | + { | ||
54 | + $i = 0; | ||
55 | + while ($i < count($value_arr)) { | ||
56 | + foreach ($add_array as $add_key => $add_value) { | ||
57 | + $value_arr[$i][$add_key] = $add_value; | ||
58 | + } | ||
59 | + $i++; | ||
60 | + } | ||
61 | + return $value_arr; | ||
62 | + } | ||
63 | +} | ||
0 | \ No newline at end of file | 64 | \ No newline at end of file |
1 | +<?php | ||
2 | + return [ | ||
3 | + 'global' => | ||
4 | + ['ini' => ['upload_max_filesize' => '20M', | ||
5 | + 'post_max_size integer' => '30M', | ||
6 | + ]], | ||
7 | + 'csv' => | ||
8 | + ['web' => | ||
9 | + ['class' => 'backend\components\parsers\CustomCsvParser', | ||
10 | + 'auto_detect_first_line' => true, | ||
11 | + 'converter_conf' => ['class' => ' backend\components\parsers\CustomConverter', | ||
12 | + 'configuration' => ["string" => 'DESCR'],] | ||
13 | + ], | ||
14 | + | ||
15 | + 'basic_column' => [ | ||
16 | + Null => 'Пусто', | ||
17 | + "BRAND" => 'Бренд', | ||
18 | + "ARTICLE"=> 'Артикул', | ||
19 | + "PRICE" => 'Цена', | ||
20 | + "DESCR" => 'Наименование', | ||
21 | + "BOX" => 'Колво', | ||
22 | + "ADD_BOX"=> 'В пути', | ||
23 | + "GROUP" => 'Группа RG' | ||
24 | + ], | ||
25 | + ], | ||
26 | + 'xml' => | ||
27 | + ['web' => | ||
28 | + ['class' => 'yii\multiparser\XmlParser', | ||
29 | + 'node' => 'Товар',], | ||
30 | + | ||
31 | + 'basic_column' => [ | ||
32 | + "BRAND" => 'Производитель', | ||
33 | + "ARTICLE"=> 'Код', | ||
34 | + "PRICE" => 'Розница', | ||
35 | + "DESCR" => 'Наименование', | ||
36 | + "BOX" => 'Колво', | ||
37 | + "ADD_BOX"=> 'Ожидаемое', | ||
38 | + "GROUP" => 'Группа' | ||
39 | + ], | ||
40 | + ] | ||
41 | + ]; | ||
42 | + | ||
43 | + | ||
44 | +//[ | ||
45 | +// "float" => 'PRICE', | ||
46 | +// "integer" => ['BOX' , 'ADD_BOX' ], | ||
47 | +// "prefix" => 'ARTICLE' | ||
48 | +//] | ||
0 | \ No newline at end of file | 49 | \ No newline at end of file |
1 | +<?php | ||
2 | + | ||
3 | +namespace backend\controllers; | ||
4 | + | ||
5 | +use Yii; | ||
6 | +use common\models\CartBillsView; | ||
7 | +use common\models\CartBillsSearch; | ||
8 | +use backend\components\base\BaseController; | ||
9 | +use yii\web\NotFoundHttpException; | ||
10 | +use yii\filters\VerbFilter; | ||
11 | + | ||
12 | +/** | ||
13 | + * CartController implements the CRUD actions for CartBills model. | ||
14 | + */ | ||
15 | +class CartController extends BaseController | ||
16 | +{ | ||
17 | + public $layout = "/column"; | ||
18 | + | ||
19 | + /** | ||
20 | + * Lists all CartBills models. | ||
21 | + * @return mixed | ||
22 | + */ | ||
23 | + public function actionIndex() | ||
24 | + { | ||
25 | + $searchModel = new CartBillsSearch(); | ||
26 | + $dataProvider = $searchModel->search(Yii::$app->request->queryParams); | ||
27 | + | ||
28 | + return $this->render('index', [ | ||
29 | + 'searchModel' => $searchModel, | ||
30 | + 'dataProvider' => $dataProvider, | ||
31 | + ]); | ||
32 | + } | ||
33 | + | ||
34 | + /** | ||
35 | + * Displays a single CartBills model. | ||
36 | + * @param string $id | ||
37 | + * @return mixed | ||
38 | + */ | ||
39 | + public function actionView($id) | ||
40 | + { | ||
41 | + return $this->render('view', [ | ||
42 | + 'model' => $this->findModel($id), | ||
43 | + ]); | ||
44 | + } | ||
45 | + | ||
46 | + | ||
47 | + /** | ||
48 | + * Finds the CartBills model based on its primary key value. | ||
49 | + * If the model is not found, a 404 HTTP exception will be thrown. | ||
50 | + * @param string $id | ||
51 | + * @return CartBills the loaded model | ||
52 | + * @throws NotFoundHttpException if the model cannot be found | ||
53 | + */ | ||
54 | + protected function findModel($id) | ||
55 | + { | ||
56 | + if (($model = CartBillsView::findById($id)) !== null) { | ||
57 | + return $model; | ||
58 | + } else { | ||
59 | + throw new NotFoundHttpException('The requested page does not exist.'); | ||
60 | + } | ||
61 | + } | ||
62 | +} |
backend/controllers/ParserController.php
1 | <?php | 1 | <?php |
2 | namespace backend\controllers; | 2 | namespace backend\controllers; |
3 | 3 | ||
4 | +use common\components\archives\ArchiveCreator; | ||
5 | +use common\components\mail\ImapMailReader; | ||
6 | +use common\components\mail\MailAttachmentsSaver; | ||
7 | +use common\components\parsers\MailParser; | ||
4 | use Yii; | 8 | use Yii; |
5 | use yii\data\ActiveDataProvider; | 9 | use yii\data\ActiveDataProvider; |
6 | use yii\filters\AccessControl; | 10 | use yii\filters\AccessControl; |
@@ -15,6 +19,7 @@ use backend\models\Importers; | @@ -15,6 +19,7 @@ use backend\models\Importers; | ||
15 | use yii\base\ErrorException; | 19 | use yii\base\ErrorException; |
16 | use common\components\PriceWriter; | 20 | use common\components\PriceWriter; |
17 | use common\components\CustomVarDamp; | 21 | use common\components\CustomVarDamp; |
22 | +use common\components\CustomArrayHelper; | ||
18 | 23 | ||
19 | /** | 24 | /** |
20 | * Parser controller | 25 | * Parser controller |
@@ -51,10 +56,10 @@ class ParserController extends BaseController | @@ -51,10 +56,10 @@ class ParserController extends BaseController | ||
51 | 56 | ||
52 | public function actionIndex($mode = 0) | 57 | public function actionIndex($mode = 0) |
53 | { | 58 | { |
59 | + $this->mailTest(); | ||
54 | $model = new UploadFileParsingForm(); | 60 | $model = new UploadFileParsingForm(); |
55 | // установим режим, 0 - ручная загрузка, 1 - автозагрузка | 61 | // установим режим, 0 - ручная загрузка, 1 - автозагрузка |
56 | $model->mode = $mode; | 62 | $model->mode = $mode; |
57 | - //CustomVarDamp::dumpAndDie(phpinfo()); | ||
58 | return $this->render('index', ['model' => $model]); | 63 | return $this->render('index', ['model' => $model]); |
59 | } | 64 | } |
60 | 65 | ||
@@ -81,7 +86,6 @@ class ParserController extends BaseController | @@ -81,7 +86,6 @@ class ParserController extends BaseController | ||
81 | try { | 86 | try { |
82 | $files_model->save(); | 87 | $files_model->save(); |
83 | } catch (ErrorException $e) { | 88 | } catch (ErrorException $e) { |
84 | - // CustomVarDamp::dump($e->getMessage()); | ||
85 | throw $e; | 89 | throw $e; |
86 | } | 90 | } |
87 | // получим id только что записанной записи - его запишем в название файла | 91 | // получим id только что записанной записи - его запишем в название файла |
@@ -125,11 +129,12 @@ class ParserController extends BaseController | @@ -125,11 +129,12 @@ class ParserController extends BaseController | ||
125 | 129 | ||
126 | } else { | 130 | } else { |
127 | // не прошла валидация форма загрузки файлов | 131 | // не прошла валидация форма загрузки файлов |
128 | - $errors_str = ''; | ||
129 | - foreach ($model->getErrors() as $error) { | ||
130 | - $errors_str .= implode( array_values($error) ); | ||
131 | - } | ||
132 | - throw new ErrorException( $errors_str ); | 132 | +// $errors_str = ''; |
133 | +// foreach ($model->getErrors() as $error) { | ||
134 | +// $errors_str .= implode( array_values($error) ); | ||
135 | +// } | ||
136 | +// throw new ErrorException( $errors_str ); | ||
137 | + $model->throwStringErrorException(); | ||
133 | } | 138 | } |
134 | // листаем пагинатором, или повторно вызываем - считываем из кеша отпрасенные данные | 139 | // листаем пагинатором, или повторно вызываем - считываем из кеша отпрасенные данные |
135 | } else if (Yii::$app->getCache()->get('parser_data')) { | 140 | } else if (Yii::$app->getCache()->get('parser_data')) { |
@@ -145,7 +150,6 @@ class ParserController extends BaseController | @@ -145,7 +150,6 @@ class ParserController extends BaseController | ||
145 | ], | 150 | ], |
146 | ]); | 151 | ]); |
147 | 152 | ||
148 | - | ||
149 | $last_index = end( array_flip( $data[0] ) ); | 153 | $last_index = end( array_flip( $data[0] ) ); |
150 | $header_counts = $last_index + 1; | 154 | $header_counts = $last_index + 1; |
151 | //формируем заголовок для пользователя, где он сможет выбрать соответсвие полей (выпадающий список) | 155 | //формируем заголовок для пользователя, где он сможет выбрать соответсвие полей (выпадающий список) |
@@ -186,7 +190,7 @@ class ParserController extends BaseController | @@ -186,7 +190,7 @@ class ParserController extends BaseController | ||
186 | 190 | ||
187 | // соотнесем отпарсенные данные с соответсивем полученным от пользователя | 191 | // соотнесем отпарсенные данные с соответсивем полученным от пользователя |
188 | // для этого преобразуем массив отпарсенных данных - назначим ключи согласно соответствию | 192 | // для этого преобразуем массив отпарсенных данных - назначим ключи согласно соответствию |
189 | - $data = \Yii::$app->multiparser->convertToAssocArray($data, $arr , 'attr_'); | 193 | + $data = CustomArrayHelper::createAssocArray( $data, $arr , 'attr_' ); |
190 | 194 | ||
191 | // запустим специальный класс который запишет данные в таблицы связанные с прайсами | 195 | // запустим специальный класс который запишет данные в таблицы связанные с прайсами |
192 | $writer = new PriceWriter(); | 196 | $writer = new PriceWriter(); |
@@ -287,5 +291,71 @@ class ParserController extends BaseController | @@ -287,5 +291,71 @@ class ParserController extends BaseController | ||
287 | // $csv->actionParseCsv(); | 291 | // $csv->actionParseCsv(); |
288 | } | 292 | } |
289 | 293 | ||
294 | + private function mailTest(){ | ||
295 | + | ||
296 | + $mail_reader = new ImapMailReader( '{imap.gmail.com:993/imap/ssl/novalidate-cert}', 'tsurkanovm@gmail.com', 'Wtvr@2000' ); | ||
297 | + $mailboxes = $mail_reader->getListMailboxes(); | ||
298 | + $files = []; | ||
299 | + foreach ( $mailboxes as $custom_label ) { | ||
300 | + $words = explode(" ",str_replace( array($mail_reader->getHostname(),"!"),"",imap_utf7_decode($custom_label)) ); | ||
301 | + $importer_id = (int)preg_replace("/[^A-Z0-9]+/","", strtoupper($words[0])); | ||
302 | + | ||
303 | + $mail_reader->reOpen( $custom_label ); | ||
304 | + $saver = new MailAttachmentsSaver( $mail_reader ); | ||
305 | + if ( $importer_id ) { | ||
306 | + $saver->setFileNamePrefix( $importer_id . '~!~' ); | ||
307 | + } | ||
308 | + | ||
309 | + if( $saver->saveAttachmentsTo(\Yii::getAlias('@temp_upload'), 'UNSEEN') ){ | ||
310 | + $files = array_merge( $files, $saver->getSavedFilesArr() ); | ||
311 | + }else{ | ||
312 | + continue; | ||
313 | + } | ||
314 | + | ||
315 | + } | ||
316 | + | ||
317 | + if ( !$files ) { | ||
318 | + return; | ||
319 | + } | ||
320 | + | ||
321 | + $arch_creator = new ArchiveCreator(); | ||
322 | + $arch_extensions = $arch_creator->getHandleExtension(); | ||
323 | + $arch_files = array_intersect( $files , $arch_extensions ); | ||
324 | + foreach ($arch_files as $arch_name => $arch_ext) { | ||
325 | + $arch_reader = $arch_creator->create( $arch_name, $arch_ext ); | ||
326 | + $arch_reader->extractTo(\Yii::getAlias('@temp_upload')); | ||
327 | + unset( $files[$arch_name] ); | ||
328 | + $files = array_merge( $files, $arch_reader->getExtractedFiles()); | ||
329 | + } | ||
330 | + | ||
331 | + $new_destination = \Yii::getAlias('@auto_upload') . '/'; | ||
332 | + foreach ( $files as $name => $ext ) { | ||
333 | + | ||
334 | + $file_name = pathinfo($name, PATHINFO_FILENAME) . '.' . $ext; | ||
335 | + if( $ext = 'csv' ){ | ||
336 | + $files_model = new ImportersFiles(); | ||
337 | + $files_model->importer_id = $importer_id; | ||
338 | + if ($files_model->save()) { | ||
339 | + | ||
340 | + $file_name = \Yii::$app->db->getLastInsertID() . '.csv'; | ||
341 | + | ||
342 | + } else{ | ||
343 | + | ||
344 | + $files_model->throwStringErrorException(); | ||
345 | + } | ||
346 | + | ||
347 | + } | ||
348 | + $new_destination .= $file_name; | ||
349 | + if( rename( $name, $new_destination ) ){ | ||
350 | + | ||
351 | + CustomVarDamp::dump('1111111'); | ||
352 | + | ||
353 | + } else{ | ||
354 | + new \ErrorException("Нет возможности переписать файл {$name}"); | ||
355 | + } | ||
356 | + | ||
357 | + } | ||
358 | + | ||
359 | + } | ||
290 | 360 | ||
291 | } | 361 | } |
1 | +<?php | ||
2 | +/** | ||
3 | + * Created by PhpStorm. | ||
4 | + * User: Tsurkanov | ||
5 | + * Date: 27.10.2015 | ||
6 | + * Time: 15:22 | ||
7 | + */ | ||
8 | + | ||
9 | +namespace backend\controllers; | ||
10 | + | ||
11 | +use backend\components\base\BaseController; | ||
12 | +use backend\models\UploadFileRgForm; | ||
13 | +use common\components\CustomVarDamp; | ||
14 | +use common\components\parsers\MailAttachmentsSaver; | ||
15 | +use common\models\Margins; | ||
16 | +use common\models\MarginsGroups; | ||
17 | +use yii\filters\AccessControl; | ||
18 | +use Yii; | ||
19 | +use yii\web\UploadedFile; | ||
20 | +use yii\data\ArrayDataProvider; | ||
21 | +use yii\multiparser\DynamicFormHelper; | ||
22 | +use common\components\CustomArrayHelper; | ||
23 | + | ||
24 | +class RgGrupController extends BaseController | ||
25 | +{ | ||
26 | + public $layout = "/column"; | ||
27 | + | ||
28 | + /** | ||
29 | + * @inheritdoc | ||
30 | + */ | ||
31 | + public function behaviors() | ||
32 | + { | ||
33 | + return [ | ||
34 | + 'access' => [ | ||
35 | + 'class' => AccessControl::className(), | ||
36 | + 'rules' => [ | ||
37 | + [ | ||
38 | + 'allow' => true, | ||
39 | + 'roles' => ['@'], | ||
40 | + ], | ||
41 | + ], | ||
42 | + ], | ||
43 | +// 'verbs' => [ | ||
44 | +// 'class' => VerbFilter::className(), | ||
45 | +// 'actions' => [ | ||
46 | +// 'logout' => ['post'], | ||
47 | +// ], | ||
48 | +// ], | ||
49 | + ]; | ||
50 | + } | ||
51 | + | ||
52 | + public function actionIndex() | ||
53 | + { | ||
54 | + $model = new UploadFileRgForm(); | ||
55 | + | ||
56 | + return $this->render('index', ['model' => $model]); | ||
57 | + } | ||
58 | + | ||
59 | + public function actionResults() | ||
60 | + { | ||
61 | + $model = new UploadFileRgForm(); | ||
62 | + $data = []; | ||
63 | + | ||
64 | + if ($model->load(Yii::$app->request->post())) { | ||
65 | + $model->file = UploadedFile::getInstance($model, 'file'); | ||
66 | + // первый проход - валидируем, сохраняем файл, ложим в кеш отпарсенные данные и параметры модели (потом при записи в базу данных они пригодятся) | ||
67 | + if ($model->validate()) { | ||
68 | + | ||
69 | + $model->file_path = Yii::getAlias('@manual_upload') . '/' . $model->file->name; | ||
70 | + $model->file->saveAs($model->file_path); | ||
71 | + | ||
72 | + //запускаем парсинг | ||
73 | + $data = $model->readFile(); | ||
74 | + // сохраняем в кеш отпарсенные даные | ||
75 | + Yii::$app->getCache()->set('parser_data', json_encode($data)); | ||
76 | + // сохраняем в кеш модель - в ней настройки для дальнейшей обработки данных | ||
77 | + Yii::$app->getCache()->set('parser_configuration', serialize($model)); | ||
78 | + | ||
79 | + | ||
80 | + } else { | ||
81 | + // не прошла валидация форма загрузки файлов | ||
82 | + $errors_str = ''; | ||
83 | + foreach ($model->getErrors() as $error) { | ||
84 | + $errors_str .= implode(array_values($error)); | ||
85 | + } | ||
86 | + throw new \ErrorException($errors_str); | ||
87 | + } | ||
88 | + // листаем пагинатором, или повторно вызываем - считываем из кеша отпрасенные данные | ||
89 | + } else if (Yii::$app->getCache()->get('parser_data')) { | ||
90 | + | ||
91 | + $data = json_decode(Yii::$app->getCache()->get('parser_data'), true); | ||
92 | + | ||
93 | + } | ||
94 | + $provider = new ArrayDataProvider([ | ||
95 | + 'allModels' => $data, | ||
96 | + 'pagination' => [ | ||
97 | + 'pageSize' => 10, | ||
98 | + ], | ||
99 | + ]); | ||
100 | + // создадим модель на столько реквизитов сколько колонок в отпарсенном файле | ||
101 | + $last_index = end(array_flip($data[0])); | ||
102 | + $header_counts = $last_index + 1; | ||
103 | + $header_model = DynamicFormHelper::CreateDynamicModel($header_counts); | ||
104 | + | ||
105 | + // соберем массив данных из которых будет пользователь выбирать значения в конструкторе (выпадающий список) | ||
106 | + $header_array = Margins::getHeader(); | ||
107 | + | ||
108 | + return $this->render('results', | ||
109 | + ['model' => $data, | ||
110 | + 'header_model' => $header_model, | ||
111 | + // список колонок для выбора | ||
112 | + 'basic_column' => $header_array, | ||
113 | + 'dataProvider' => $provider]); | ||
114 | + } | ||
115 | + | ||
116 | + public function actionWrite() | ||
117 | + { | ||
118 | + //получим колонки которые выбрал пользователь | ||
119 | + $arr_attributes = Yii::$app->request->post()['DynamicModel']; | ||
120 | + //соберем модель по полученным данным | ||
121 | + $model = DynamicFormHelper::CreateDynamicModel($arr_attributes); | ||
122 | + //добавим правила валидации (колонки должны быть те что в модели) | ||
123 | + foreach ($arr_attributes as $key => $value) { | ||
124 | + $model->addRule($key, 'in', ['range' => array_keys(Margins::getHeader())]); | ||
125 | + } | ||
126 | + | ||
127 | + // провалидируем выбранные колонки | ||
128 | + if ($model->validate()) { | ||
129 | + | ||
130 | + // валидация успешна у нас есть соответсвие колонок, преобразуем в массив данное соответсвие для дальнейшей работы | ||
131 | + $arr = $model->toArray(); | ||
132 | + | ||
133 | + // получим данные из кеша | ||
134 | + if (Yii::$app->getCache()->get('parser_data') && Yii::$app->getCache()->get('parser_configuration')) { | ||
135 | + $data = json_decode(Yii::$app->getCache()->get('parser_data'), true); | ||
136 | + $configuration = unserialize(Yii::$app->getCache()->get('parser_configuration')); | ||
137 | + } else { | ||
138 | + throw new \ErrorException('Ошибка кеша'); | ||
139 | + } | ||
140 | + | ||
141 | + array_walk($arr, function (&$val) { | ||
142 | + $val = '!' . $val; | ||
143 | + }); | ||
144 | + | ||
145 | + // соотнесем отпарсенные данные с соответсивем полученным от пользователя | ||
146 | + // для этого преобразуем массив отпарсенных данных - назначим ключи согласно соответствию | ||
147 | + $data = CustomArrayHelper::createAssocArray($data, $arr, 'attr_'); | ||
148 | + | ||
149 | + // в первой строке у нас заголовки - уберем | ||
150 | + unset($data[0]); | ||
151 | + // подготовим данные для записи в таблицу w_margins_groups | ||
152 | + $arr_values = []; | ||
153 | + $group = ''; | ||
154 | + $importer_id = $configuration['importer_id']; | ||
155 | + foreach ($data as $row_data) { | ||
156 | + | ||
157 | + if (isset($row_data['!group'])) { | ||
158 | + $group = $row_data['!group']; | ||
159 | + unset($row_data['!group']); | ||
160 | + } | ||
161 | + if (isset($row_data['!_null'])) { | ||
162 | + unset($row_data['!_null']); | ||
163 | + } | ||
164 | + | ||
165 | + foreach ($row_data as $key => $value) { | ||
166 | + if ($group) | ||
167 | + $row['group'] = trim($group); | ||
168 | + | ||
169 | + $row['importer_id'] = trim($importer_id); | ||
170 | + $row['margin_id'] = ltrim($key, '!'); | ||
171 | + $row['koef'] = \Yii::$app->converter->convertTo('float', $value); | ||
172 | + | ||
173 | + $arr_values[] = $row; | ||
174 | + | ||
175 | + } | ||
176 | + | ||
177 | + } | ||
178 | + // сохраним подготовленные данные | ||
179 | + MarginsGroups::ManualInsertWithUpdate( $arr_values, [ 'group','importer_id','margin_id' ] ); | ||
180 | + | ||
181 | + | ||
182 | + Yii::$app->session->setFlash('success', "Файл {$configuration['file']} успешно загружен"); | ||
183 | + // все прошло успешно - очищаем кеш | ||
184 | + Yii::$app->getCache()->delete('parser_data'); | ||
185 | + Yii::$app->getCache()->delete('parser_configuration'); | ||
186 | + | ||
187 | + if (file_exists($configuration['file_path'])) | ||
188 | + unlink($configuration['file_path']); | ||
189 | + | ||
190 | + return $this->render('index', ['model' => $configuration]); | ||
191 | + | ||
192 | + } | ||
193 | + | ||
194 | + } | ||
195 | + | ||
196 | + public function actionMail() | ||
197 | + { | ||
198 | + $mail_saver = new MailAttachmentsSaver('{imap.gmail.com:993/imap/ssl/novalidate-cert}', 'tsurkanovm@gmail.com', 'Wtvr@2000'); | ||
199 | + //$mail_saver = new MailAttachmentsSaver('{imap.gmail.com:993/imap/ssl/novalidate-cert}', 'price@italauto.com.ua', '67853562'); | ||
200 | + $mail_saver->saveAttachmentsTo(); | ||
201 | + } | ||
202 | + | ||
203 | +} |
backend/models/Details.php
@@ -36,6 +36,7 @@ class Details extends BaseActiveRecord | @@ -36,6 +36,7 @@ class Details extends BaseActiveRecord | ||
36 | /** | 36 | /** |
37 | * @var bool - признак необходимости удалить префикс Артикула перед вставкой | 37 | * @var bool - признак необходимости удалить префикс Артикула перед вставкой |
38 | */ | 38 | */ |
39 | + | ||
39 | public $delete_price = false; | 40 | public $delete_price = false; |
40 | 41 | ||
41 | /** | 42 | /** |
@@ -131,6 +132,9 @@ class Details extends BaseActiveRecord | @@ -131,6 +132,9 @@ class Details extends BaseActiveRecord | ||
131 | 132 | ||
132 | //воспользуемся пакетной вставкой от фреймворка | 133 | //воспользуемся пакетной вставкой от фреймворка |
133 | $query_insert = Yii::$app->db->createCommand()->batchInsert($table_name, $keys_arr, $current_batch_array)->sql; | 134 | $query_insert = Yii::$app->db->createCommand()->batchInsert($table_name, $keys_arr, $current_batch_array)->sql; |
135 | + if ($this->delete_prefix) { | ||
136 | + $query_insert = $this->prepareArticul( $query_insert ); | ||
137 | + } | ||
134 | // добавим фрагмент с апдейтом при дубляже | 138 | // добавим фрагмент с апдейтом при дубляже |
135 | $query = "{$query_insert} {$query_update}"; | 139 | $query = "{$query_insert} {$query_update}"; |
136 | // \common\components\CustomVarDamp::dumpAndDie($query); | 140 | // \common\components\CustomVarDamp::dumpAndDie($query); |
@@ -138,4 +142,5 @@ class Details extends BaseActiveRecord | @@ -138,4 +142,5 @@ class Details extends BaseActiveRecord | ||
138 | 142 | ||
139 | } | 143 | } |
140 | } | 144 | } |
145 | + | ||
141 | } | 146 | } |
backend/models/UploadFileParsingForm.php
@@ -48,7 +48,7 @@ class UploadFileParsingForm extends Model | @@ -48,7 +48,7 @@ class UploadFileParsingForm extends Model | ||
48 | return [ | 48 | return [ |
49 | ['importer_id', 'required', 'message' => 'Не указан поставщик!' ], | 49 | ['importer_id', 'required', 'message' => 'Не указан поставщик!' ], |
50 | ['file', 'required', 'message' => 'Не выбран файл!' ], | 50 | ['file', 'required', 'message' => 'Не выбран файл!' ], |
51 | - [['file'], 'file', 'extensions' => ['csv', 'xml'], 'checkExtensionByMimeType'=>false ], | 51 | + [['file'], 'file', 'extensions' => ['csv', 'xlsx'], 'checkExtensionByMimeType'=>false ], |
52 | ['importer_id', 'integer','max' => 999999, 'min' => 0 ], | 52 | ['importer_id', 'integer','max' => 999999, 'min' => 0 ], |
53 | [['action','delete_prefix', 'delete_price', 'success'], 'boolean', 'except' => 'auto' ], // только для ручной загрузки | 53 | [['action','delete_prefix', 'delete_price', 'success'], 'boolean', 'except' => 'auto' ], // только для ручной загрузки |
54 | ['delimiter', 'string', 'max' => 1], | 54 | ['delimiter', 'string', 'max' => 1], |
@@ -71,12 +71,15 @@ class UploadFileParsingForm extends Model | @@ -71,12 +71,15 @@ class UploadFileParsingForm extends Model | ||
71 | public function readFile( $options = [] ){ | 71 | public function readFile( $options = [] ){ |
72 | 72 | ||
73 | $data = Yii::$app->multiparser->parse( $this->file_path, $options ); | 73 | $data = Yii::$app->multiparser->parse( $this->file_path, $options ); |
74 | - if( !is_array( $data ) ){ | 74 | + |
75 | + if( !is_array( $data ) || count($data) == 0 ){ | ||
75 | throw new ErrorException("Ошибка чтения из файла прайса {$this->file_path}"); | 76 | throw new ErrorException("Ошибка чтения из файла прайса {$this->file_path}"); |
76 | } | 77 | } |
77 | // файл больше не нужен - данные прочитаны и сохранены в кеш | 78 | // файл больше не нужен - данные прочитаны и сохранены в кеш |
78 | - if( file_exists($this->file_path) ) | ||
79 | - unlink($this->file_path); | 79 | + if( file_exists($this->file_path) ) |
80 | + //@ todo - перестало работать - нет доступа на удалениев этом сеансе, в следующем - файл удаляется - разобраться | ||
81 | + //unlink( $this->file_path ); | ||
82 | + | ||
80 | 83 | ||
81 | return $data; | 84 | return $data; |
82 | } | 85 | } |
1 | +<?php | ||
2 | +namespace backend\models; | ||
3 | + | ||
4 | +use yii\base\ErrorException; | ||
5 | +use yii\base\Model; | ||
6 | +use yii\web\UploadedFile; | ||
7 | +use Yii; | ||
8 | +use common\components\CustomVarDamp; | ||
9 | + | ||
10 | +/** | ||
11 | + * UploadForm is the model behind the upload form. | ||
12 | + */ | ||
13 | +class UploadFileRgForm extends Model | ||
14 | +{ | ||
15 | + /** | ||
16 | + * @var UploadedFile file attribute | ||
17 | + */ | ||
18 | + // атрибуты формы | ||
19 | + public $file; | ||
20 | + public $file_path; | ||
21 | + public $importer_id; | ||
22 | + | ||
23 | + | ||
24 | + | ||
25 | + public function rules() | ||
26 | + { | ||
27 | + return [ | ||
28 | + ['file', 'required', 'message' => 'Не выбран файл!' ], | ||
29 | + ['importer_id', 'required', 'message' => 'Не указан поставщик!' ], | ||
30 | + [['file'], 'file', 'extensions' => 'xlsx', 'checkExtensionByMimeType'=>false ] | ||
31 | + ]; | ||
32 | + } | ||
33 | + | ||
34 | + public function attributeLabels() | ||
35 | + { | ||
36 | + return [ | ||
37 | + 'file' => Yii::t('app', 'Источник'), | ||
38 | + 'importer_id' => Yii::t('app', 'Поставщик'), | ||
39 | + ]; | ||
40 | + } | ||
41 | + | ||
42 | + public function readFile( $options = [] ){ | ||
43 | + | ||
44 | + $data = Yii::$app->multiparser->parse( $this->file_path, $options ); | ||
45 | + if( !is_array( $data ) ){ | ||
46 | + throw new ErrorException("Ошибка чтения из файла RG групп {$this->file_path}"); | ||
47 | + } | ||
48 | + | ||
49 | + | ||
50 | + return $data; | ||
51 | + } | ||
52 | + | ||
53 | + function __destruct() | ||
54 | + { | ||
55 | + // файл больше не нужен - данные прочитаны и сохранены в кеш | ||
56 | + // if( file_exists($this->file_path) ) | ||
57 | + // unlink($this->file_path); | ||
58 | + } | ||
59 | + | ||
60 | + | ||
61 | +} | ||
0 | \ No newline at end of file | 62 | \ No newline at end of file |
1 | +<?php | ||
2 | + | ||
3 | +use yii\helpers\Html; | ||
4 | +use yii\widgets\ActiveForm; | ||
5 | + | ||
6 | +/* @var $this yii\web\View */ | ||
7 | +/* @var $model common\models\CartBills */ | ||
8 | +/* @var $form yii\widgets\ActiveForm */ | ||
9 | +?> | ||
10 | + | ||
11 | +<div class="cart-bills-form"> | ||
12 | + | ||
13 | + <?php $form = ActiveForm::begin(); ?> | ||
14 | + | ||
15 | + <?= $form->field($model, 'account_id')->textInput(['maxlength' => true]) ?> | ||
16 | + | ||
17 | + <?= $form->field($model, 'manager_id')->textInput(['maxlength' => true]) ?> | ||
18 | + | ||
19 | + <?= $form->field($model, 'office_id')->textInput(['maxlength' => true]) ?> | ||
20 | + | ||
21 | + <?= $form->field($model, 'status')->textInput(['maxlength' => true]) ?> | ||
22 | + | ||
23 | + <?= $form->field($model, 'f1')->textInput(['maxlength' => true]) ?> | ||
24 | + | ||
25 | + <?= $form->field($model, 'f2')->textInput(['maxlength' => true]) ?> | ||
26 | + | ||
27 | + <?= $form->field($model, 'f3')->textInput(['maxlength' => true]) ?> | ||
28 | + | ||
29 | + <?= $form->field($model, 'message')->textarea(['rows' => 6]) ?> | ||
30 | + | ||
31 | + <?= $form->field($model, 'safe_bill')->textInput() ?> | ||
32 | + | ||
33 | + <?= $form->field($model, 'delivery')->textInput(['maxlength' => true]) ?> | ||
34 | + | ||
35 | + <?= $form->field($model, 'delivery_price')->textInput() ?> | ||
36 | + | ||
37 | + <?= $form->field($model, 'timestamp')->textInput() ?> | ||
38 | + | ||
39 | + <div class="form-group"> | ||
40 | + <?= Html::submitButton($model->isNewRecord ? Yii::t('app', 'Create') : Yii::t('app', 'Update'), ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?> | ||
41 | + </div> | ||
42 | + | ||
43 | + <?php ActiveForm::end(); ?> | ||
44 | + | ||
45 | +</div> |
1 | +<?php | ||
2 | + | ||
3 | +use yii\helpers\Html; | ||
4 | +use yii\widgets\ActiveForm; | ||
5 | + | ||
6 | +/* @var $this yii\web\View */ | ||
7 | +/* @var $model common\models\CartBillsSearch */ | ||
8 | +/* @var $form yii\widgets\ActiveForm */ | ||
9 | +?> | ||
10 | + | ||
11 | +<div class="cart-bills-search"> | ||
12 | + | ||
13 | + <?php $form = ActiveForm::begin([ | ||
14 | + 'action' => ['index'], | ||
15 | + 'method' => 'get', | ||
16 | + ]); ?> | ||
17 | + | ||
18 | + <?= $form->field($model, 'id') ?> | ||
19 | + | ||
20 | + <?= $form->field($model, 'account_id') ?> | ||
21 | + | ||
22 | + <?= $form->field($model, 'manager_id') ?> | ||
23 | + | ||
24 | + <?= $form->field($model, 'office_id') ?> | ||
25 | + | ||
26 | + <?= $form->field($model, 'status')->dropDownList(\yii\helpers\ArrayHelper::map( \common\models\DicStatuses::find()->where(['active' =>1])->all(), 'id','name' )) ?> | ||
27 | + | ||
28 | + <?php // echo $form->field($model, 'f1') ?> | ||
29 | + | ||
30 | + <?php // echo $form->field($model, 'f2') ?> | ||
31 | + | ||
32 | + <?php // echo $form->field($model, 'f3') ?> | ||
33 | + | ||
34 | + <?php // echo $form->field($model, 'message') ?> | ||
35 | + | ||
36 | + <?php // echo $form->field($model, 'safe_bill') ?> | ||
37 | + | ||
38 | + <?php // echo $form->field($model, 'delivery') ?> | ||
39 | + | ||
40 | + <?php // echo $form->field($model, 'delivery_price') ?> | ||
41 | + | ||
42 | + <?php // echo $form->field($model, 'timestamp') ?> | ||
43 | + | ||
44 | + <div class="form-group"> | ||
45 | + <?= Html::submitButton(Yii::t('app', 'Search'), ['class' => 'btn btn-primary']) ?> | ||
46 | + <?= Html::resetButton(Yii::t('app', 'Reset'), ['class' => 'btn btn-default']) ?> | ||
47 | + </div> | ||
48 | + | ||
49 | + <?php ActiveForm::end(); ?> | ||
50 | + | ||
51 | +</div> |
1 | +<?php | ||
2 | + | ||
3 | +use yii\helpers\Html; | ||
4 | +use yii\grid\GridView; | ||
5 | +use kartik\date\DatePicker; | ||
6 | + | ||
7 | +/* @var $this yii\web\View */ | ||
8 | +/* @var $searchModel common\models\CartBillsSearch */ | ||
9 | +/* @var $dataProvider yii\data\ActiveDataProvider */ | ||
10 | + | ||
11 | +$this->title = Yii::t('app', 'Заказы'); | ||
12 | +$this->params['breadcrumbs'][] = $this->title; | ||
13 | + | ||
14 | +?> | ||
15 | +<div class="cart-bills-index"> | ||
16 | + | ||
17 | + <h1><?= Html::encode($this->title) ?></h1> | ||
18 | + <?php // echo $this->render('_search', ['model' => $searchModel]); ?> | ||
19 | + | ||
20 | + | ||
21 | + <?= GridView::widget([ | ||
22 | + 'dataProvider' => $dataProvider, | ||
23 | + 'filterModel' => $searchModel, | ||
24 | + 'columns' => [ | ||
25 | + ['class' => 'yii\grid\SerialColumn'], | ||
26 | + | ||
27 | + 'id', | ||
28 | + 'account_id', | ||
29 | + ['label' =>'Информация', | ||
30 | + 'value' =>function ($data) { | ||
31 | + $info = $data->scode . ' /n'; | ||
32 | + $info .= $data->name; | ||
33 | + return $info; | ||
34 | + }, | ||
35 | + ], | ||
36 | + 'sum', | ||
37 | + [ | ||
38 | + 'label' =>'Статус', | ||
39 | + 'attribute' => 'status', | ||
40 | + 'filter' => \yii\helpers\ArrayHelper::map( \common\models\DicStatuses::find()->where(['active' =>1])->all(), 'id','name' ), | ||
41 | + ], | ||
42 | + 'manager_name', | ||
43 | + [ | ||
44 | + 'label' =>'Дата', | ||
45 | + 'value' =>function ($data) { | ||
46 | + return date('Y-m-d', $data->dt); | ||
47 | + }, | ||
48 | + 'attribute' => 'dt', | ||
49 | + 'filter' => DatePicker::widget([ | ||
50 | + 'model' =>$searchModel, | ||
51 | + 'language' =>'ru', | ||
52 | + 'size' =>'xs', | ||
53 | + 'separator' =>'по', | ||
54 | + 'attribute' => 'dt', | ||
55 | + 'type' => DatePicker::TYPE_RANGE, | ||
56 | + 'attribute2' => 'date_to', | ||
57 | + ]), | ||
58 | + ], | ||
59 | + | ||
60 | + ], | ||
61 | + ]); ?> | ||
62 | + | ||
63 | +</div> |
1 | +<?php | ||
2 | + | ||
3 | +use yii\helpers\Html; | ||
4 | +use yii\widgets\DetailView; | ||
5 | + | ||
6 | +/* @var $this yii\web\View */ | ||
7 | +/* @var $model common\models\CartBills */ | ||
8 | + | ||
9 | +$this->title = $model->id; | ||
10 | +$this->params['breadcrumbs'][] = ['label' => Yii::t('app', 'Cart Bills'), 'url' => ['index']]; | ||
11 | +$this->params['breadcrumbs'][] = $this->title; | ||
12 | +?> | ||
13 | +<div class="cart-bills-view"> | ||
14 | + | ||
15 | + <h1><?= Html::encode($this->title) ?></h1> | ||
16 | + | ||
17 | + <p> | ||
18 | + <?= Html::a(Yii::t('app', 'Update'), ['update', 'id' => $model->id], ['class' => 'btn btn-primary']) ?> | ||
19 | + <?= Html::a(Yii::t('app', 'Delete'), ['delete', 'id' => $model->id], [ | ||
20 | + 'class' => 'btn btn-danger', | ||
21 | + 'data' => [ | ||
22 | + 'confirm' => Yii::t('app', 'Are you sure you want to delete this item?'), | ||
23 | + 'method' => 'post', | ||
24 | + ], | ||
25 | + ]) ?> | ||
26 | + </p> | ||
27 | + | ||
28 | + <?= DetailView::widget([ | ||
29 | + 'model' => $model, | ||
30 | + 'attributes' => [ | ||
31 | + 'id', | ||
32 | + 'account_id', | ||
33 | + 'manager_id', | ||
34 | + 'office_id', | ||
35 | + 'status', | ||
36 | + 'f1', | ||
37 | + 'f2', | ||
38 | + 'f3', | ||
39 | + 'message:ntext', | ||
40 | + 'safe_bill', | ||
41 | + 'delivery', | ||
42 | + 'delivery_price', | ||
43 | + 'timestamp', | ||
44 | + ], | ||
45 | + ]) ?> | ||
46 | + | ||
47 | +</div> |
backend/views/layouts/column.php
@@ -282,7 +282,10 @@ $this->beginContent('@app/views/layouts/main.php'); | @@ -282,7 +282,10 @@ $this->beginContent('@app/views/layouts/main.php'); | ||
282 | echo Menu::widget([ | 282 | echo Menu::widget([ |
283 | 'options' => ['class' => 'sidebar-menu'], | 283 | 'options' => ['class' => 'sidebar-menu'], |
284 | 'items' => [ | 284 | 'items' => [ |
285 | + ['label' => 'Заказы', 'url' => ['cart/index']], | ||
285 | ['label' => "Загрузка файлов", 'url' => ['#'], 'items' => [ | 286 | ['label' => "Загрузка файлов", 'url' => ['#'], 'items' => [ |
287 | + ['label' => 'Кросс файлы', 'url' => ['crossing-upload/index']], | ||
288 | + ['label' => 'Группы RG', 'url' => ['rg-grup/index']], | ||
286 | ['label' => 'Файлы на сервере', 'url' => ['parser/server-files']], | 289 | ['label' => 'Файлы на сервере', 'url' => ['parser/server-files']], |
287 | ['label' => 'Загрузить файл на сервер', 'url' => ['parser/index', 'mode' => 1]], | 290 | ['label' => 'Загрузить файл на сервер', 'url' => ['parser/index', 'mode' => 1]], |
288 | ['label' => 'Ручная загрузка', 'url' => ['parser/index']], | 291 | ['label' => 'Ручная загрузка', 'url' => ['parser/index']], |
@@ -317,10 +320,7 @@ $this->beginContent('@app/views/layouts/main.php'); | @@ -317,10 +320,7 @@ $this->beginContent('@app/views/layouts/main.php'); | ||
317 | ['label' => 'Vin коды', 'url' => ['currency/index']], | 320 | ['label' => 'Vin коды', 'url' => ['currency/index']], |
318 | ['label' => 'Запросы по номеру', 'url' => ['currency/index']], | 321 | ['label' => 'Запросы по номеру', 'url' => ['currency/index']], |
319 | ['label' => 'Офисы', 'url' => ['offices/index']], | 322 | ['label' => 'Офисы', 'url' => ['offices/index']], |
320 | - ], | ||
321 | - ], | ||
322 | - ['label' => 'Справочник', 'url' => ['#'], 'items' => [ | ||
323 | - ['label' => 'Замены брендов', 'url' => ['currency/index']], | 323 | + ['label' => 'Валюты', 'url' => ['currency/index']], |
324 | ], | 324 | ], |
325 | ], | 325 | ], |
326 | 326 |
1 | +<?php | ||
2 | +use yii\widgets\ActiveForm; | ||
3 | +use yii\helpers\Html; | ||
4 | +use backend\models\Importers; | ||
5 | +use yii\helpers\ArrayHelper; | ||
6 | + | ||
7 | +$button_label = 'Прочитать'; | ||
8 | + | ||
9 | + | ||
10 | +?> | ||
11 | +<div class="row"> | ||
12 | + <div class="col-lg-5"> | ||
13 | + <?php $form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data',],'action'=>['rg-grup/results']]); | ||
14 | + | ||
15 | + if ($msg = \Yii::$app->session->getFlash('success')) { // вернулись после успешной загрузки данного файла | ||
16 | + echo Html::tag('h3', $msg ,['class'=>'bg-success']); | ||
17 | + } | ||
18 | + ?> | ||
19 | + <h3>Загрузка RG групп поставщиков</h3> | ||
20 | + | ||
21 | + | ||
22 | + <?= $form->field($model, 'importer_id')->dropDownList(ArrayHelper::map( Importers::find()->all(), 'id','name' )); ?> | ||
23 | + | ||
24 | + | ||
25 | + <?= $form->field($model, 'file')->fileInput()->label(false) ?> | ||
26 | + <div class="form-group"> | ||
27 | + <?= Html::submitButton(Yii::t( 'app', $button_label ), ['class' => 'btn btn-primary']) ?> | ||
28 | + </div> | ||
29 | + | ||
30 | + <?php ActiveForm::end() ?> | ||
31 | + </div> | ||
32 | + <?= Html::a('Почта', ['rg-grup/mail'], ['class' => 'btn btn-primary', 'name' => 'Mail',]) ?> | ||
33 | +</div> | ||
34 | + |
1 | +<?php | ||
2 | + | ||
3 | +use yii\helpers\Html; | ||
4 | +use yii\multiparser\DynamicFormHelper; | ||
5 | +use yii\widgets\ActiveForm; | ||
6 | + | ||
7 | + | ||
8 | +/* @var $this yii\web\View */ | ||
9 | +/* @var $searchModel backend\models\CatalogSearch */ | ||
10 | +/* @var $dataProvider yii\data\ActiveDataProvider */ | ||
11 | + | ||
12 | +$this->title = 'Отпарсенные данные файла'; | ||
13 | +$this->params['breadcrumbs'][] = $this->title; | ||
14 | +?> | ||
15 | +<div class="catalog-index"> | ||
16 | + | ||
17 | + <h1><?= Html::encode($this->title) ?></h1> | ||
18 | + <?php // echo $this->render('_search', ['model' => $searchModel]); | ||
19 | + | ||
20 | + | ||
21 | + $form = ActiveForm::begin(['action' => 'write']); | ||
22 | + ?> | ||
23 | + <?= DynamicFormHelper::CreateGridWithDropDownListHeader( $dataProvider, $form, $header_model, $basic_column )?> | ||
24 | + | ||
25 | + <div class="form-group"> | ||
26 | + <?= Html::submitButton(Yii::t('app', 'Записать в БД'), ['class' => 'btn btn-primary']) ?> | ||
27 | + </div> | ||
28 | + | ||
29 | + <?php ActiveForm::end() ?> | ||
30 | + <?= Html::a('Вернуться', ['rg-grup/index'], ['class' => 'btn btn-primary', 'name' => 'Return',]) ?> | ||
31 | + | ||
32 | +</div> | ||
0 | \ No newline at end of file | 33 | \ No newline at end of file |
1 | +<?php | ||
2 | +/** | ||
3 | + * Created by PhpStorm. | ||
4 | + * User: Tsurkanov | ||
5 | + * Date: 20.10.2015 | ||
6 | + * Time: 14:42 | ||
7 | + */ | ||
8 | + | ||
9 | +namespace common\components; | ||
10 | + | ||
11 | + | ||
12 | +class CustomArrayHelper extends \yii\helpers\ArrayHelper { | ||
13 | + | ||
14 | + /** | ||
15 | + * @param $value_arr - двумерный массив значений, которому нужно присвоить ключи | ||
16 | + * @param $key_array - ключи для вложенного массива | ||
17 | + * @return array - таблица с проименованными колонками | ||
18 | + */ | ||
19 | + | ||
20 | + public static function createAssocArray(array $value_arr, array $key_array, $key_prefix = '') | ||
21 | + { | ||
22 | + // очистка служебного префикса в массиве заголовков | ||
23 | + if ($key_prefix) { | ||
24 | + // @todo оптимизировать - два переворота массива - избыточно | ||
25 | + $key_array = array_flip($key_array); | ||
26 | + | ||
27 | + array_walk($key_array, function (&$value, $key, $key_prefix) { | ||
28 | + $value = str_replace($key_prefix, '', $value); | ||
29 | + }, $key_prefix); | ||
30 | + | ||
31 | + $key_array = array_flip($key_array); | ||
32 | + //уберем пустые элементы | ||
33 | + $key_array = array_filter($key_array, function ($value) { | ||
34 | + return $value !== ''; | ||
35 | + }); | ||
36 | + } | ||
37 | + array_walk( $value_arr, | ||
38 | + | ||
39 | + function (&$value, $key, $key_array) { | ||
40 | + $res = $value; | ||
41 | + foreach ($res as $sub_key => $sub_value) { | ||
42 | + if (isset($key_array[$sub_key])) { | ||
43 | + // если такой ключ в базовом массиве (массиве ключей) есть, то заменим новым, иначе просто удалим | ||
44 | + $new_key = $key_array[$sub_key]; | ||
45 | + if (!array_key_exists($new_key, $res)) { | ||
46 | + $res[$new_key] = $value[$sub_key]; | ||
47 | + } | ||
48 | + } | ||
49 | + unset($res[$sub_key]); | ||
50 | + $value = $res; | ||
51 | + } | ||
52 | + | ||
53 | + }, | ||
54 | + | ||
55 | + $key_array ); | ||
56 | + | ||
57 | + return $value_arr; | ||
58 | + } | ||
59 | + | ||
60 | + /** | ||
61 | + * @param $value_arr - двумерный массив к которому нужно добавить колонки | ||
62 | + * @param $add_array - массив с колонками (ключи) и значениями колонок | ||
63 | + * @return mixed | ||
64 | + */ | ||
65 | + public static function addColumns(array $value_arr, array $add_array) | ||
66 | + { | ||
67 | + $i = 0; | ||
68 | + while ($i < count($value_arr)) { | ||
69 | + foreach ($add_array as $add_key => $add_value) { | ||
70 | + $value_arr[$i][$add_key] = $add_value; | ||
71 | + } | ||
72 | + $i++; | ||
73 | + } | ||
74 | + return $value_arr; | ||
75 | + } | ||
76 | +} | ||
0 | \ No newline at end of file | 77 | \ No newline at end of file |
common/components/PriceWriter.php
@@ -62,20 +62,20 @@ class PriceWriter | @@ -62,20 +62,20 @@ class PriceWriter | ||
62 | // преобразуем числовые значения | 62 | // преобразуем числовые значения |
63 | foreach ($this->data as &$row) { | 63 | foreach ($this->data as &$row) { |
64 | 64 | ||
65 | - $row['PRICE'] = \Yii::$app->multiparser->convertToFloat($row['PRICE']); | ||
66 | - $row['BOX'] = \Yii::$app->multiparser->convertToInteger($row['BOX']); | 65 | + $row['PRICE'] = \Yii::$app->converter->convertTo('float',$row['PRICE']); |
66 | + $row['BOX'] = \Yii::$app->converter->convertTo('integer',$row['BOX']); | ||
67 | // присвоим полный артикул | 67 | // присвоим полный артикул |
68 | 68 | ||
69 | $row['FULL_ARTICLE'] = $row['ARTICLE']; | 69 | $row['FULL_ARTICLE'] = $row['ARTICLE']; |
70 | if ((int)$this->configuration['delete_prefix']) { | 70 | if ((int)$this->configuration['delete_prefix']) { |
71 | - $row = \Yii::$app->multiparser->convertToArticle( $row, $this->configuration['importer_id'] ); | 71 | + $row = \Yii::$app->converter->convertTo( 'Article', $row, ['importer_id' => $this->configuration['importer_id']] ); |
72 | } else { | 72 | } else { |
73 | - $row['ARTICLE'] = \Yii::$app->multiparser->convertToArticle( $row['ARTICLE'] ); | 73 | + $row['ARTICLE'] = \Yii::$app->converter->convertTo( 'Article', $row['ARTICLE'] ); |
74 | } | 74 | } |
75 | 75 | ||
76 | 76 | ||
77 | if (isset($row['ADD_BOX'])) | 77 | if (isset($row['ADD_BOX'])) |
78 | - $row['ADD_BOX'] = \Yii::$app->multiparser->convertToInteger($row['ADD_BOX']); | 78 | + $row['ADD_BOX'] = \Yii::$app->converter->convertTo( 'integer', $row['ADD_BOX'] ); |
79 | 79 | ||
80 | // проверим все ли обязательные колонки были указаны пользователем | 80 | // проверим все ли обязательные колонки были указаны пользователем |
81 | $details_model->load(['Details' => $row]); | 81 | $details_model->load(['Details' => $row]); |
@@ -87,11 +87,11 @@ class PriceWriter | @@ -87,11 +87,11 @@ class PriceWriter | ||
87 | } | 87 | } |
88 | 88 | ||
89 | // дополним данные значением импортера и даты обновления цены | 89 | // дополним данные значением импортера и даты обновления цены |
90 | - $this->data = \Yii::$app->multiparser->addColumns($this->data, ['IMPORT_ID' => $this->configuration['importer_id'], 'timestamp' => $update_date]); | 90 | + $this->data = CustomArrayHelper::addColumns( $this->data, ['IMPORT_ID' => $this->configuration['importer_id'], 'timestamp' => $update_date] ); |
91 | try { | 91 | try { |
92 | //@todo add transaction | 92 | //@todo add transaction |
93 | 93 | ||
94 | - if ((int)$this->configuration['delete_price']) { | 94 | + if ( isset($this->configuration['delete_price']) && (int)$this->configuration['delete_price'] ) { |
95 | $details_model->delete_price = true; | 95 | $details_model->delete_price = true; |
96 | } | 96 | } |
97 | //2. попытаемся вставить данные в БД с апдейтом по ключам | 97 | //2. попытаемся вставить данные в БД с апдейтом по ключам |
1 | +<?php | ||
2 | +/** | ||
3 | + * Created by PhpStorm. | ||
4 | + * User: Tsurkanov | ||
5 | + * Date: 03.11.2015 | ||
6 | + * Time: 14:51 | ||
7 | + */ | ||
8 | + | ||
9 | +namespace common\components\archives; | ||
10 | + | ||
11 | + | ||
12 | +class ArchiveCreator { | ||
13 | + | ||
14 | + protected $handleExtension = ['rar', 'zip']; | ||
15 | + | ||
16 | + public function create( $file, $ext ){ | ||
17 | +// if ( $this->isHandleableExtension( $ext )) { | ||
18 | +// $arh_class = ucfirst( $ext ) . 'ArchiveReader'; | ||
19 | +// if ( class_exists( $arh_class ) ) { | ||
20 | +// | ||
21 | +// $arh_reader = new $arh_class(); | ||
22 | +// | ||
23 | +// if ($arh_reader instanceof ArchiveReader ) { | ||
24 | +// $arh_reader->open($file); | ||
25 | +// return $arh_reader; | ||
26 | +// } | ||
27 | +// | ||
28 | +// } | ||
29 | +// | ||
30 | +// } | ||
31 | + if ( $ext = 'zip' ) { | ||
32 | + $arh_reader = new ZipArchiveReader(); | ||
33 | + }else{ | ||
34 | + $arh_reader = new RarArchiveReader(); | ||
35 | + } | ||
36 | + | ||
37 | + $arh_reader->open($file); | ||
38 | + return $arh_reader; | ||
39 | + // не найден подходящий обработчик | ||
40 | + throw new \Exception( "Для расширения {$ext} не найден подходящий распаковщик" ); | ||
41 | + } | ||
42 | + | ||
43 | + protected function isHandleableExtension( $ext ){ | ||
44 | + | ||
45 | + // $this->setHandleExtension( ); | ||
46 | + return (bool) array_search( $ext, $this->handleExtension); | ||
47 | + } | ||
48 | + | ||
49 | +// protected function setHandleExtension( ){ | ||
50 | +// if ( !$this->handleExtension ) { | ||
51 | +// foreach (get_declared_classes() as $class) { | ||
52 | +// if (is_subclass_of( $class, ArchiveReader::class )) | ||
53 | +// | ||
54 | +// $this->handleExtension[] = $class::getExtension(); | ||
55 | +// | ||
56 | +// } | ||
57 | +// } | ||
58 | +// } | ||
59 | + | ||
60 | + public function getHandleExtension( ){ | ||
61 | + | ||
62 | + // $this->setHandleExtension( ); | ||
63 | + return $this->handleExtension; | ||
64 | + | ||
65 | + } | ||
66 | + | ||
67 | + | ||
68 | +} | ||
0 | \ No newline at end of file | 69 | \ No newline at end of file |
1 | +<?php | ||
2 | +/** | ||
3 | + * Created by PhpStorm. | ||
4 | + * User: Tsurkanov | ||
5 | + * Date: 03.11.2015 | ||
6 | + * Time: 14:48 | ||
7 | + */ | ||
8 | +namespace common\components\archives; | ||
9 | +abstract class ArchiveReader | ||
10 | +{ | ||
11 | + | ||
12 | + protected $extracted_files = []; | ||
13 | + | ||
14 | + public abstract function open( $file, $password = ''); | ||
15 | + | ||
16 | + public abstract function extractTo($destination); | ||
17 | + | ||
18 | + public static abstract function getExtension(); | ||
19 | + | ||
20 | + public function getExtractedFiles(){ | ||
21 | + return $this->extracted_files; | ||
22 | + } | ||
23 | + public function setExtractedFiles($name, $ext){ | ||
24 | + $this->extracted_files[$name] = $ext; | ||
25 | + } | ||
26 | + | ||
27 | +} | ||
0 | \ No newline at end of file | 28 | \ No newline at end of file |
1 | +<?php | ||
2 | +/** | ||
3 | + * Created by PhpStorm. | ||
4 | + * User: Tsurkanov | ||
5 | + * Date: 03.11.2015 | ||
6 | + * Time: 15:12 | ||
7 | + */ | ||
8 | + | ||
9 | +namespace common\components\archives; | ||
10 | + | ||
11 | + | ||
12 | +class RarArchiveReader extends ArchiveReader { | ||
13 | + | ||
14 | + protected $resource; | ||
15 | + public function open( $file, $password = '' ){ | ||
16 | + | ||
17 | + $this->resource = rar_open( $file, $password ); | ||
18 | + if ($this->resource === FALSE) | ||
19 | + throw new \Exception("Failed opening rar file"); | ||
20 | + } | ||
21 | + | ||
22 | + public function extractTo( $destination){ | ||
23 | + $list = rar_list($this->resource); | ||
24 | + | ||
25 | + foreach($list as $file) { | ||
26 | + $entry = rar_entry_get($this->resource, $file); | ||
27 | + $entry->extract($destination); | ||
28 | + | ||
29 | + $this->setExtractedFiles($entry->getName(), pathinfo($entry->getName(), PATHINFO_EXTENSION)); | ||
30 | + | ||
31 | + } | ||
32 | + | ||
33 | + rar_close($this->resource); | ||
34 | + } | ||
35 | + public static function getExtension(){ | ||
36 | + return 'rar'; | ||
37 | + } | ||
38 | + | ||
39 | + | ||
40 | + | ||
41 | + | ||
42 | +} | ||
0 | \ No newline at end of file | 43 | \ No newline at end of file |
1 | +<?php | ||
2 | +/** | ||
3 | + * Created by PhpStorm. | ||
4 | + * User: Tsurkanov | ||
5 | + * Date: 03.11.2015 | ||
6 | + * Time: 15:12 | ||
7 | + */ | ||
8 | + | ||
9 | +namespace common\components\archives; | ||
10 | + | ||
11 | + | ||
12 | +class ZipArchiveReader extends ArchiveReader { | ||
13 | + | ||
14 | + protected $resource; | ||
15 | + public function open( $file, $password = '' ){ | ||
16 | + $zip = new \ZipArchive; | ||
17 | + $this->resource = $zip->open( $file ); | ||
18 | + if ($this->resource === FALSE) | ||
19 | + throw new \Exception("Failed opening zip file"); | ||
20 | + } | ||
21 | + | ||
22 | + public function extractTo( $destination){ | ||
23 | + | ||
24 | + $this->resource->extractTo($destination); | ||
25 | + | ||
26 | + for ($i = 0; $i < $this->resource->numFiles; $i++) { | ||
27 | + $filename = $this->resource->getNameIndex($i); | ||
28 | + $this->setExtractedFiles($filename, pathinfo($filename, PATHINFO_EXTENSION)); | ||
29 | + } | ||
30 | + | ||
31 | + $this->resource->close(); | ||
32 | + } | ||
33 | + public static function getExtension(){ | ||
34 | + return 'rar'; | ||
35 | + } | ||
36 | + | ||
37 | + | ||
38 | + | ||
39 | + | ||
40 | +} | ||
0 | \ No newline at end of file | 41 | \ No newline at end of file |
1 | +<?php | ||
2 | +/** | ||
3 | + * Created by PhpStorm. | ||
4 | + * User: Tsurkanov | ||
5 | + * Date: 02.11.2015 | ||
6 | + * Time: 16:56 | ||
7 | + */ | ||
8 | + | ||
9 | +namespace common\components\mail; | ||
10 | + | ||
11 | + | ||
12 | +class ImapMailReader extends MailReader { | ||
13 | + | ||
14 | + function __construct( $hostname, $username, $password ) | ||
15 | + { | ||
16 | + parent::__construct($hostname, $username, $password); | ||
17 | + $this->connection = imap_open($hostname, $username, $password); | ||
18 | + | ||
19 | + if ($this->connection === false) | ||
20 | + throw new \Exception('Cannot connect to mail: ' . imap_last_error()); | ||
21 | + | ||
22 | + } | ||
23 | + | ||
24 | + public function getEmails( $flag ) | ||
25 | + { | ||
26 | + return imap_search( $this->connection, $flag ); | ||
27 | + } | ||
28 | + | ||
29 | + public function getEmailBody( $email_number, $section ) | ||
30 | + { | ||
31 | + return imap_fetchbody($this->connection, $email_number, $section ); | ||
32 | + } | ||
33 | + | ||
34 | + /** | ||
35 | + * @return mixed | ||
36 | + */ | ||
37 | + public function getListMailboxes() | ||
38 | + { | ||
39 | + return imap_list($this->connection, $this->hostname, "*"); | ||
40 | + } | ||
41 | + | ||
42 | + public function getCurrentEmailStructure( $email_number ) | ||
43 | + { | ||
44 | + return imap_fetchstructure($this->connection, $email_number); | ||
45 | + } | ||
46 | + | ||
47 | + public function reOpen( $hostname ) | ||
48 | + { | ||
49 | + imap_reopen( $this->connection, $hostname ); | ||
50 | + } | ||
51 | + | ||
52 | + function __destruct() | ||
53 | + { | ||
54 | + /* close the connection */ | ||
55 | + imap_close( $this->connection ); | ||
56 | + } | ||
57 | + | ||
58 | + | ||
59 | +} | ||
0 | \ No newline at end of file | 60 | \ No newline at end of file |
1 | +<?php | ||
2 | +/** | ||
3 | + * Created by PhpStorm. | ||
4 | + * User: Cibermag | ||
5 | + * Date: 01.09.2015 | ||
6 | + * Time: 10:53 | ||
7 | + */ | ||
8 | + | ||
9 | +namespace common\components\mail; | ||
10 | + | ||
11 | + | ||
12 | +use common\components\CustomVarDamp; | ||
13 | + | ||
14 | +/** | ||
15 | + * Class MailAttachmentsSaver | ||
16 | + * @package common\components\mail | ||
17 | + * сохраняет вложения в указанную папку по полученому соединению к ящику, | ||
18 | + * а также хранит имена сохраненных файлов | ||
19 | + */ | ||
20 | +class MailAttachmentsSaver | ||
21 | +{ | ||
22 | + | ||
23 | + /** | ||
24 | + * @var соединение с ящиком - экземляр класса - MailReader | ||
25 | + */ | ||
26 | + protected $mail_reader; | ||
27 | + | ||
28 | + /** | ||
29 | + * @var - string, тип сообщений - например UNSEEN. Значения можно перечислять разделяя запятой. | ||
30 | + */ | ||
31 | + protected $massage_type; | ||
32 | + | ||
33 | + /** | ||
34 | + * @var array - после сохранения будет содержать сохраненные файлы, ключ - путь к файлу, значение - расширение | ||
35 | + */ | ||
36 | + protected $saved_files_arr; | ||
37 | + | ||
38 | + /** | ||
39 | + * @var - префикс который будет прибавлен к оригинальному имени сохраняемого файла | ||
40 | + */ | ||
41 | + protected $file_name_prefix; | ||
42 | + | ||
43 | + | ||
44 | + | ||
45 | + public function __construct(MailReader $mail_reader) | ||
46 | + { | ||
47 | + $this->mail_reader = $mail_reader; | ||
48 | + | ||
49 | + $this->saved_files_arr = []; | ||
50 | + | ||
51 | + } | ||
52 | + | ||
53 | + /** | ||
54 | + * @param mixed $file_name_prefix | ||
55 | + */ | ||
56 | + public function setFileNamePrefix($file_name_prefix) | ||
57 | + { | ||
58 | + $this->file_name_prefix = $file_name_prefix; | ||
59 | + } | ||
60 | + | ||
61 | + public function saveAttachmentsTo( $destination, $massage_type ) | ||
62 | + { | ||
63 | + $this->massage_type = $massage_type; | ||
64 | + $emails = $this->mail_reader->getEmails($this->massage_type); | ||
65 | + | ||
66 | + /* if emails are returned, cycle through each... */ | ||
67 | + $result = false; | ||
68 | + if ($emails) { | ||
69 | + | ||
70 | + /* begin output var */ | ||
71 | + $output = ''; | ||
72 | + | ||
73 | + /* put the newest emails on top */ | ||
74 | + rsort($emails); | ||
75 | + // CustomVarDamp::dump($emails); | ||
76 | + foreach ($emails as $email_number) { | ||
77 | + | ||
78 | + $structure = $this->mail_reader->getCurrentEmailStructure($email_number); | ||
79 | + $attachments = array(); | ||
80 | + if (isset($structure->parts) && count($structure->parts)) { | ||
81 | + for ($i = 0; $i < count($structure->parts); $i++) { | ||
82 | + $attachments[$i] = array( | ||
83 | + 'is_attachment' => false, | ||
84 | + 'filename' => '', | ||
85 | + 'name' => '', | ||
86 | + 'attachment' => ''); | ||
87 | + | ||
88 | + if ($structure->parts[$i]->ifdparameters) { | ||
89 | + foreach ($structure->parts[$i]->dparameters as $object) { | ||
90 | + if (strtolower($object->attribute) == 'filename') { | ||
91 | + $attachments[$i]['is_attachment'] = true; | ||
92 | + $attachments[$i]['filename'] = $object->value; | ||
93 | + } | ||
94 | + } | ||
95 | + } | ||
96 | + | ||
97 | + if ($structure->parts[$i]->ifparameters) { | ||
98 | + foreach ($structure->parts[$i]->parameters as $object) { | ||
99 | + if (strtolower($object->attribute) == 'name') { | ||
100 | + $attachments[$i]['is_attachment'] = true; | ||
101 | + $attachments[$i]['name'] = $object->value; | ||
102 | + } | ||
103 | + } | ||
104 | + } | ||
105 | + | ||
106 | + if ($attachments[$i]['is_attachment']) { | ||
107 | + $attachments[$i]['attachment'] = $this->mail_reader->getEmailBody($email_number, $i + 1); | ||
108 | + if ($structure->parts[$i]->encoding == 3) { // 3 = BASE64 | ||
109 | + $attachments[$i]['attachment'] = base64_decode($attachments[$i]['attachment']); | ||
110 | + } elseif ($structure->parts[$i]->encoding == 4) { // 4 = QUOTED-PRINTABLE | ||
111 | + $attachments[$i]['attachment'] = quoted_printable_decode($attachments[$i]['attachment']); | ||
112 | + } | ||
113 | + } | ||
114 | + } | ||
115 | + | ||
116 | + if (count($attachments) != 0) { | ||
117 | + | ||
118 | + foreach ($attachments as $key => &$val) { | ||
119 | + if ($val['is_attachment'] == 1) { | ||
120 | + if (isset($this->file_name_prefix)) { | ||
121 | + $name = $destination . '/' . $this->file_name_prefix . mb_decode_mimeheader($val['name']); | ||
122 | + } else { | ||
123 | + $name = $destination . '/' . mb_decode_mimeheader($val['name']); | ||
124 | + } | ||
125 | + $ext = pathinfo($name, PATHINFO_EXTENSION); | ||
126 | + mb_internal_encoding("UTF-8"); | ||
127 | + file_put_contents($name, $val['attachment']); | ||
128 | + $this->setSavedFile( $name , $ext ); | ||
129 | + $result = true; | ||
130 | + } | ||
131 | + | ||
132 | + } | ||
133 | + } | ||
134 | + | ||
135 | + } | ||
136 | + | ||
137 | + } | ||
138 | + | ||
139 | + } | ||
140 | + | ||
141 | + return $result; | ||
142 | + } | ||
143 | + | ||
144 | + /** | ||
145 | + * @return array | ||
146 | + */ | ||
147 | + public function getSavedFilesArr() | ||
148 | + { | ||
149 | + return $this->saved_files_arr; | ||
150 | + } | ||
151 | + | ||
152 | + /** | ||
153 | + * @param array $saved_files_arr | ||
154 | + */ | ||
155 | + public function setSavedFile($saved_file, $saved_file_ext) | ||
156 | + { | ||
157 | + $this->saved_files_arr[$saved_file] = $saved_file_ext; | ||
158 | + } | ||
159 | + | ||
160 | + | ||
161 | +} | ||
0 | \ No newline at end of file | 162 | \ No newline at end of file |
1 | +<?php | ||
2 | +/** | ||
3 | + * Created by PhpStorm. | ||
4 | + * User: Tsurkanov | ||
5 | + * Date: 02.11.2015 | ||
6 | + * Time: 16:47 | ||
7 | + */ | ||
8 | + | ||
9 | +namespace common\components\mail; | ||
10 | + | ||
11 | + | ||
12 | +abstract class MailReader { | ||
13 | + | ||
14 | + public $connection; | ||
15 | + protected $hostname; | ||
16 | + protected $username; | ||
17 | + protected $password; | ||
18 | + | ||
19 | + /* get information specific to this email */ | ||
20 | +// $overview = imap_fetch_overview($inbox, $email_number, 0); | ||
21 | +// $message = imap_fetchbody($inbox, $email_number, 2); | ||
22 | + | ||
23 | + function __construct( $hostname, $username, $password ) | ||
24 | + { | ||
25 | + $this->hostname = $hostname; | ||
26 | + $this->username = $username; | ||
27 | + $this->password = $password; | ||
28 | + } | ||
29 | + | ||
30 | + /** | ||
31 | + * @return mixed | ||
32 | + */ | ||
33 | + public function getHostname() | ||
34 | + { | ||
35 | + return $this->hostname; | ||
36 | + } | ||
37 | + | ||
38 | + public abstract function getListMailboxes(); | ||
39 | + | ||
40 | + public abstract function getEmails( $flag ); | ||
41 | + | ||
42 | + public abstract function getEmailBody( $email_number, $section ); | ||
43 | + | ||
44 | + public abstract function getCurrentEmailStructure( $email ); | ||
45 | + | ||
46 | + public abstract function reOpen( $hostname ); | ||
47 | + | ||
48 | + | ||
49 | + | ||
50 | +} | ||
0 | \ No newline at end of file | 51 | \ No newline at end of file |
common/components/parsers/CustomConverter.php
@@ -10,71 +10,11 @@ use backend\models\ImportersPrefix; | @@ -10,71 +10,11 @@ use backend\models\ImportersPrefix; | ||
10 | class CustomConverter extends Converter | 10 | class CustomConverter extends Converter |
11 | { | 11 | { |
12 | 12 | ||
13 | - /** | ||
14 | - * @param $value_arr - двумерный массив значений, которому нужно присвоить ключи | ||
15 | - * @param $key_array - ключи для вложенного массива | ||
16 | - * @return array - таблица с проименованными колонками | ||
17 | - */ | ||
18 | public static $sign; | 13 | public static $sign; |
19 | public static $multiplier; | 14 | public static $multiplier; |
20 | public static $importer_id; | 15 | public static $importer_id; |
21 | public static $brand; | 16 | public static $brand; |
22 | 17 | ||
23 | - public static function convertToAssocArray(array $value_arr, array $key_array, $key_prefix = '') | ||
24 | - { | ||
25 | - // очистка служебного префикса в массиве заголовков | ||
26 | - if ($key_prefix) { | ||
27 | - // @todo оптимизировать - два переворота массива - избыточно | ||
28 | - $key_array = array_flip($key_array); | ||
29 | - | ||
30 | - array_walk($key_array, function (&$value, $key, $key_prefix) { | ||
31 | - $value = str_replace($key_prefix, '', $value); | ||
32 | - }, $key_prefix); | ||
33 | - | ||
34 | - $key_array = array_flip($key_array); | ||
35 | - //уберем пустые элементы | ||
36 | - $key_array = array_filter($key_array, function ($value) { | ||
37 | - return $value !== ''; | ||
38 | - }); | ||
39 | - } | ||
40 | - | ||
41 | - array_walk($value_arr, | ||
42 | - function (&$value, $key, $key_array) { | ||
43 | - $res = $value; | ||
44 | - foreach ($res as $sub_key => $sub_value) { | ||
45 | - if (isset($key_array[$sub_key])) { | ||
46 | - // если такой ключ в базовом массиве (массиве ключей) есть, то заменим новым, иначе просто удалим | ||
47 | - $new_key = $key_array[$sub_key]; | ||
48 | - if (!array_key_exists($new_key, $res)) { | ||
49 | - $res[$new_key] = $value[$sub_key]; | ||
50 | - } | ||
51 | - } | ||
52 | - unset($res[$sub_key]); | ||
53 | - $value = $res; | ||
54 | - } | ||
55 | - | ||
56 | - }, | ||
57 | - $key_array); | ||
58 | - | ||
59 | - return $value_arr; | ||
60 | - } | ||
61 | - | ||
62 | - /** | ||
63 | - * @param $value_arr - двумерный массив к которому нужно добавить колонки | ||
64 | - * @param $add_array - массив с колонками (ключи) и значениями колонок | ||
65 | - * @return mixed | ||
66 | - */ | ||
67 | - public function addColumns(array $value_arr, array $add_array) | ||
68 | - { | ||
69 | - $i = 0; | ||
70 | - while ($i < count($value_arr)) { | ||
71 | - foreach ($add_array as $add_key => $add_value) { | ||
72 | - $value_arr[$i][$add_key] = $add_value; | ||
73 | - } | ||
74 | - $i++; | ||
75 | - } | ||
76 | - return $value_arr; | ||
77 | - } | ||
78 | 18 | ||
79 | public static function convertToDetails(array $row) | 19 | public static function convertToDetails(array $row) |
80 | { | 20 | { |
@@ -143,11 +83,8 @@ class CustomConverter extends Converter | @@ -143,11 +83,8 @@ class CustomConverter extends Converter | ||
143 | 83 | ||
144 | } | 84 | } |
145 | 85 | ||
146 | - public static function convertToArticle( $value, $importer_id = '' ) | 86 | + public static function convertToArticle( $value ) |
147 | { | 87 | { |
148 | - if(isset( $importer_id )){ | ||
149 | - self::$importer_id = $importer_id; | ||
150 | - } | ||
151 | 88 | ||
152 | if (is_array($value)) { | 89 | if (is_array($value)) { |
153 | 90 | ||
@@ -189,7 +126,7 @@ class CustomConverter extends Converter | @@ -189,7 +126,7 @@ class CustomConverter extends Converter | ||
189 | 126 | ||
190 | public static function convertToBrand($value) | 127 | public static function convertToBrand($value) |
191 | { | 128 | { |
192 | - $res = parent::convertToEncode($value);; | 129 | + $res = self::convertToEncode($value);; |
193 | $res = trim(strtoupper($res)); | 130 | $res = trim(strtoupper($res)); |
194 | $res = str_replace("Ä", "A", str_replace("Ö", "O", str_replace("Ü", "U", str_replace("Ë", "E", str_replace("Ò", "O", $res))))); | 131 | $res = str_replace("Ä", "A", str_replace("Ö", "O", str_replace("Ü", "U", str_replace("Ë", "E", str_replace("Ò", "O", $res))))); |
195 | $res = str_replace(array('@', '#', '~', '"', "'", "?", "!"), '', $res); | 132 | $res = str_replace(array('@', '#', '~', '"', "'", "?", "!"), '', $res); |
@@ -197,12 +134,5 @@ class CustomConverter extends Converter | @@ -197,12 +134,5 @@ class CustomConverter extends Converter | ||
197 | return $res; | 134 | return $res; |
198 | } | 135 | } |
199 | 136 | ||
200 | - public static function convertToString($value) | ||
201 | - { | ||
202 | - $value = parent::convertToEncode($value); | ||
203 | - | ||
204 | - return str_replace(array('!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+', '=', '-', '~', '`', '"', "'", ' ', '№', '%', ';', ':', '[', ']', '{', '}', '*', '?', '/', '\'', '|', '.', ',', '<', '>', '\\'), '', $value); | ||
205 | - } | ||
206 | - | ||
207 | 137 | ||
208 | } | 138 | } |
209 | \ No newline at end of file | 139 | \ No newline at end of file |
common/components/parsers/CustomCsvParser.php
@@ -19,31 +19,19 @@ class CustomCsvParser extends \yii\multiparser\CsvParser { | @@ -19,31 +19,19 @@ class CustomCsvParser extends \yii\multiparser\CsvParser { | ||
19 | public $last_line = 100; | 19 | public $last_line = 100; |
20 | //public $hasHeaderRow = true; | 20 | //public $hasHeaderRow = true; |
21 | // public $keys = ['first','second', 'third', 'forth', 'fifth']; | 21 | // public $keys = ['first','second', 'third', 'forth', 'fifth']; |
22 | - public function setupConverter() | ||
23 | - { | ||
24 | - if (!count($this->converter_conf)) { | ||
25 | - if ($this->hasHeaderRow) { | ||
26 | - // если у файла есть заголовок, то в результате имеем ассоциативный массив | ||
27 | - $this->converter_conf['hasKey'] = 1; | ||
28 | - | ||
29 | - } | ||
30 | - | ||
31 | - } | ||
32 | -// $this->converter = \Yii::createObject( $this->converter_conf ); | ||
33 | -// CustomVarDamp::dumpAndDie($this->converter); | ||
34 | - } | ||
35 | - | ||
36 | - /** | ||
37 | - * @param $arr | ||
38 | - * @return mixed | ||
39 | - * преобразовует значения прочитанного массива в нужные типы, согласно конфигурации конвертера | ||
40 | - */ | ||
41 | - protected function convert($arr) | ||
42 | - { | ||
43 | - $arr = \Yii::$app->multiparser->convertByConfiguration( $arr, $this->converter_conf ); | ||
44 | - | ||
45 | - return $arr; | ||
46 | - | ||
47 | - } | 22 | +// public function setupConverter() |
23 | +// { | ||
24 | +// if (!count($this->converter_conf)) { | ||
25 | +// if ($this->hasHeaderRow) { | ||
26 | +// // если у файла есть заголовок, то в результате имеем ассоциативный массив | ||
27 | +// $this->converter_conf['hasKey'] = 1; | ||
28 | +// | ||
29 | +// } | ||
30 | +// | ||
31 | +// } | ||
32 | +//// $this->converter = \Yii::createObject( $this->converter_conf ); | ||
33 | +// } | ||
34 | + | ||
35 | + | ||
48 | 36 | ||
49 | } | 37 | } |
50 | \ No newline at end of file | 38 | \ No newline at end of file |
common/components/parsers/MailParser.php deleted
1 | -<?php | ||
2 | -/** | ||
3 | - * Created by PhpStorm. | ||
4 | - * User: Cibermag | ||
5 | - * Date: 01.09.2015 | ||
6 | - * Time: 10:53 | ||
7 | - */ | ||
8 | - | ||
9 | -namespace common\components\parsers; | ||
10 | - | ||
11 | - | ||
12 | -class MailParser { | ||
13 | - public static function requestAction(){ | ||
14 | - $hostname = '{imap.gmail.com:993/imap/ssl/novalidate-cert/norsh}Inbox'; | ||
15 | - $username = 'сюда твой логин'; | ||
16 | - $password = 'сюда твой пароль'; | ||
17 | - | ||
18 | - /* try to connect */ | ||
19 | - $inbox = imap_open($hostname,$username,$password) or die('Cannot connect to Gmail: ' . imap_last_error()); | ||
20 | - | ||
21 | - | ||
22 | - $emails = imap_search($inbox,'FROM forallthings'); | ||
23 | - | ||
24 | - /* if emails are returned, cycle through each... */ | ||
25 | - /* if emails are returned, cycle through each... */ | ||
26 | - if($emails) { | ||
27 | - | ||
28 | - /* begin output var */ | ||
29 | - $output = ''; | ||
30 | - | ||
31 | - /* put the newest emails on top */ | ||
32 | - rsort($emails); | ||
33 | - | ||
34 | - | ||
35 | - foreach ($emails as $email_number) { | ||
36 | - | ||
37 | - /* get information specific to this email */ | ||
38 | - $overview = imap_fetch_overview($inbox, $email_number, 0); | ||
39 | - $message = imap_fetchbody($inbox, $email_number, 2); | ||
40 | - $structure = imap_fetchstructure($inbox, $email_number); | ||
41 | - | ||
42 | - | ||
43 | - | ||
44 | - | ||
45 | - $attachments = array(); | ||
46 | - if (isset($structure->parts) && count($structure->parts)) { | ||
47 | - for ($i = 0; $i < count($structure->parts); $i++) { | ||
48 | - $attachments[$i] = array( | ||
49 | - 'is_attachment' => false, | ||
50 | - 'filename' => '', | ||
51 | - 'name' => '', | ||
52 | - 'attachment' => ''); | ||
53 | - | ||
54 | - if ($structure->parts[$i]->ifdparameters) { | ||
55 | - foreach ($structure->parts[$i]->dparameters as $object) { | ||
56 | - if (strtolower($object->attribute) == 'filename') { | ||
57 | - $attachments[$i]['is_attachment'] = true; | ||
58 | - $attachments[$i]['filename'] = $object->value; | ||
59 | - } | ||
60 | - } | ||
61 | - } | ||
62 | - | ||
63 | - if ($structure->parts[$i]->ifparameters) { | ||
64 | - foreach ($structure->parts[$i]->parameters as $object) { | ||
65 | - if (strtolower($object->attribute) == 'name') { | ||
66 | - $attachments[$i]['is_attachment'] = true; | ||
67 | - $attachments[$i]['name'] = $object->value; | ||
68 | - } | ||
69 | - } | ||
70 | - } | ||
71 | - | ||
72 | - if ($attachments[$i]['is_attachment']) { | ||
73 | - $attachments[$i]['attachment'] = imap_fetchbody($inbox, $email_number, $i + 1); | ||
74 | - if ($structure->parts[$i]->encoding == 3) { // 3 = BASE64 | ||
75 | - $attachments[$i]['attachment'] = base64_decode($attachments[$i]['attachment']); | ||
76 | - } elseif ($structure->parts[$i]->encoding == 4) { // 4 = QUOTED-PRINTABLE | ||
77 | - $attachments[$i]['attachment'] = quoted_printable_decode($attachments[$i]['attachment']); | ||
78 | - } | ||
79 | - } | ||
80 | - } // for($i = 0; $i < count($structure->parts); $i++) | ||
81 | - } // if(isset($structure->parts) && count($structure->parts)) | ||
82 | - | ||
83 | - | ||
84 | - if (count($attachments) != 0) { | ||
85 | - | ||
86 | - | ||
87 | - foreach ($attachments as $at) { | ||
88 | - | ||
89 | - if ($at['is_attachment'] == 1) { | ||
90 | - //die(__DIR__); | ||
91 | - file_put_contents('test.csv', $at['attachment']); | ||
92 | - | ||
93 | - } | ||
94 | - } | ||
95 | - | ||
96 | - } | ||
97 | - | ||
98 | - } | ||
99 | - | ||
100 | - // echo $output; | ||
101 | - } | ||
102 | - /* close the connection */ | ||
103 | - imap_close($inbox); | ||
104 | - } | ||
105 | -} | ||
106 | \ No newline at end of file | 0 | \ No newline at end of file |
common/components/parsers/config.php
@@ -5,23 +5,23 @@ | @@ -5,23 +5,23 @@ | ||
5 | ['class' => 'common\components\parsers\CustomCsvParser', | 5 | ['class' => 'common\components\parsers\CustomCsvParser', |
6 | 'auto_detect_first_line' => true, | 6 | 'auto_detect_first_line' => true, |
7 | 'converter_conf' => [ | 7 | 'converter_conf' => [ |
8 | - //'class' => ' common\components\parsers\CustomConverter', // @todo переделать на компонент | 8 | + 'class' => 'common\components\parsers\CustomConverter', |
9 | 'configuration' => ["encode" => 'DESCR'],] | 9 | 'configuration' => ["encode" => 'DESCR'],] |
10 | ], | 10 | ], |
11 | 'console' => | 11 | 'console' => |
12 | ['class' => 'common\components\parsers\CustomCsvParser', | 12 | ['class' => 'common\components\parsers\CustomCsvParser', |
13 | 'auto_detect_first_line' => true, | 13 | 'auto_detect_first_line' => true, |
14 | - 'hasHeaderRow' => true, | ||
15 | 'converter_conf' => [ | 14 | 'converter_conf' => [ |
16 | - //'class' => ' common\components\parsers\CustomConverter', | ||
17 | - 'hasKey' => 1, | ||
18 | - 'configuration' => ["string" => 'DESCR', | 15 | + 'class' => ' common\components\parsers\CustomConverter', |
16 | + 'configuration' => ["encode" => 'DESCR', | ||
17 | + "string" => 'DESCR', | ||
19 | "float" => 'PRICE', | 18 | "float" => 'PRICE', |
20 | "brand" => 'BRAND', | 19 | "brand" => 'BRAND', |
21 | "integer" => ['BOX','ADD_BOX'], | 20 | "integer" => ['BOX','ADD_BOX'], |
22 | "multiply" => [], | 21 | "multiply" => [], |
23 | "article" => [], | 22 | "article" => [], |
24 | "details" => [] | 23 | "details" => [] |
24 | + | ||
25 | ] | 25 | ] |
26 | ],], | 26 | ],], |
27 | 27 | ||
@@ -39,11 +39,9 @@ | @@ -39,11 +39,9 @@ | ||
39 | 'crosses' => ['class' => 'common\components\parsers\CustomCsvParser', | 39 | 'crosses' => ['class' => 'common\components\parsers\CustomCsvParser', |
40 | 'auto_detect_first_line' => true, | 40 | 'auto_detect_first_line' => true, |
41 | 'min_column_quantity' => 4, | 41 | 'min_column_quantity' => 4, |
42 | - 'hasHeaderRow' => true, | ||
43 | 'keys' =>['ARTICLE', 'CROSS_ARTICLE', 'BRAND', 'CROSS_BRAND'], | 42 | 'keys' =>['ARTICLE', 'CROSS_ARTICLE', 'BRAND', 'CROSS_BRAND'], |
44 | 'converter_conf' => [ | 43 | 'converter_conf' => [ |
45 | - //'class' => ' common\components\parsers\CustomConverter', | ||
46 | - 'hasKey' => 1, | 44 | + 'class' => ' common\components\parsers\CustomConverter', |
47 | 'configuration' => [ | 45 | 'configuration' => [ |
48 | "brand" => ['BRAND', 'CROSS_BRAND'], | 46 | "brand" => ['BRAND', 'CROSS_BRAND'], |
49 | "crosses" => [], | 47 | "crosses" => [], |
@@ -54,21 +52,33 @@ | @@ -54,21 +52,33 @@ | ||
54 | ['console' => | 52 | ['console' => |
55 | ['class' => 'yii\multiparser\XmlParser', | 53 | ['class' => 'yii\multiparser\XmlParser', |
56 | 'node' => 'Товар', | 54 | 'node' => 'Товар', |
55 | + 'has_header_row' => true, | ||
56 | + 'keys' => [ | ||
57 | + "BRAND" => 'Производитель', | ||
58 | + "ARTICLE"=> 'Код', | ||
59 | + "PRICE" => 'Розница', | ||
60 | + "DESCR" => 'Наименование', | ||
61 | + "BOX" => 'Колво', | ||
62 | + "ADD_BOX"=> 'Ожидаемое', | ||
63 | + "GROUP" => 'Группа' | ||
64 | + ], | ||
57 | 'converter_conf' => [ | 65 | 'converter_conf' => [ |
58 | - //'class' => ' common\components\parsers\CustomConverter', | ||
59 | - 'hasKey' => 1, | 66 | + 'class' => 'common\components\parsers\CustomConverter', |
60 | 'configuration' => ["details" => [] | 67 | 'configuration' => ["details" => [] |
61 | ],], | 68 | ],], |
62 | ], | 69 | ], |
63 | - 'basic_column' => [ | ||
64 | - "BRAND" => 'Производитель', | ||
65 | - "ARTICLE"=> 'Код', | ||
66 | - "PRICE" => 'Розница', | ||
67 | - "DESCR" => 'Наименование', | ||
68 | - "BOX" => 'Колво', | ||
69 | - "ADD_BOX"=> 'Ожидаемое', | ||
70 | - "GROUP" => 'Группа' | ||
71 | - ], | ||
72 | ], | 70 | ], |
71 | + 'xlsx' => | ||
72 | + ['web' => | ||
73 | + ['class' => 'yii\multiparser\XlsxParser', | ||
74 | + 'path_for_extract_files' => \Yii::getAlias('@temp_upload') . '/xlsx/', | ||
75 | + // 'has_header_row' => true, | ||
76 | + 'active_sheet' => 1, | ||
77 | + 'converter_conf' => [ | ||
78 | + 'class' => 'common\components\parsers\CustomConverter', | ||
79 | + 'configuration' => ["string" => []], | ||
80 | + ] | ||
81 | + ], | ||
82 | + ] | ||
73 | ]; | 83 | ]; |
74 | 84 |
common/config/main.php
@@ -15,14 +15,15 @@ return [ | @@ -15,14 +15,15 @@ return [ | ||
15 | ] | 15 | ] |
16 | ], | 16 | ], |
17 | 'multiparser'=>[ | 17 | 'multiparser'=>[ |
18 | - | ||
19 | 'class' => 'yii\multiparser\YiiMultiparser', | 18 | 'class' => 'yii\multiparser\YiiMultiparser', |
20 | 'configuration' => $mp_configuration, | 19 | 'configuration' => $mp_configuration, |
21 | - 'as behavior' => [ | ||
22 | - 'class' => 'common\components\parsers\CustomConverter', | 20 | + ], |
21 | + 'converter'=>[ | ||
22 | + 'class' => 'yii\multiparser\YiiConverter', | ||
23 | + 'configuration' => [ | ||
24 | + 'class' => 'common\components\parsers\CustomConverter' | ||
25 | + ], | ||
23 | ], | 26 | ], |
24 | 27 | ||
25 | ], | 28 | ], |
26 | - ], | ||
27 | - | ||
28 | ]; | 29 | ]; |
1 | +<?php | ||
2 | + | ||
3 | +namespace common\models; | ||
4 | + | ||
5 | +use Yii; | ||
6 | + | ||
7 | +/** | ||
8 | + * This is the model class for table "{{%cart}}". | ||
9 | + * | ||
10 | + * @property string $bill_id | ||
11 | + * @property string $account_id | ||
12 | + * @property string $count | ||
13 | + * @property double $price | ||
14 | + * @property double $price_purchase | ||
15 | + * @property integer $status | ||
16 | + * @property string $article | ||
17 | + * @property string $brand | ||
18 | + * @property string $descr | ||
19 | + * @property string $import_id | ||
20 | + * @property string $timestamp | ||
21 | + */ | ||
22 | +class Cart extends \backend\components\base\BaseActiveRecord | ||
23 | +{ | ||
24 | + /** | ||
25 | + * @inheritdoc | ||
26 | + */ | ||
27 | + public static function tableName() | ||
28 | + { | ||
29 | + return '{{%cart}}'; | ||
30 | + } | ||
31 | + | ||
32 | + /** | ||
33 | + * @inheritdoc | ||
34 | + */ | ||
35 | + public function rules() | ||
36 | + { | ||
37 | + return [ | ||
38 | + [['bill_id', 'account_id', 'count', 'price', 'price_purchase', 'article', 'brand', 'descr', 'import_id'], 'required'], | ||
39 | + [['bill_id', 'account_id', 'count', 'status', 'import_id'], 'integer'], | ||
40 | + [['price', 'price_purchase'], 'number'], | ||
41 | + [['timestamp'], 'safe'], | ||
42 | + [['article', 'brand'], 'string', 'max' => 100], | ||
43 | + [['descr'], 'string', 'max' => 254] | ||
44 | + ]; | ||
45 | + } | ||
46 | + | ||
47 | + /** | ||
48 | + * @inheritdoc | ||
49 | + */ | ||
50 | + public function attributeLabels() | ||
51 | + { | ||
52 | + return [ | ||
53 | + 'bill_id' => Yii::t('app', 'Bill ID'), | ||
54 | + 'account_id' => Yii::t('app', 'Account ID'), | ||
55 | + 'count' => Yii::t('app', 'Count'), | ||
56 | + 'price' => Yii::t('app', 'Price'), | ||
57 | + 'price_purchase' => Yii::t('app', 'Price Purchase'), | ||
58 | + 'status' => Yii::t('app', 'Status'), | ||
59 | + 'article' => Yii::t('app', 'Article'), | ||
60 | + 'brand' => Yii::t('app', 'Brand'), | ||
61 | + 'descr' => Yii::t('app', 'Descr'), | ||
62 | + 'import_id' => Yii::t('app', 'Import ID'), | ||
63 | + 'timestamp' => Yii::t('app', 'Timestamp'), | ||
64 | + ]; | ||
65 | + } | ||
66 | +} |
1 | +<?php | ||
2 | + | ||
3 | +namespace common\models; | ||
4 | + | ||
5 | +use Yii; | ||
6 | + | ||
7 | +/** | ||
8 | + * This is the model class for table "{{%cart_bills}}". | ||
9 | + * | ||
10 | + * @property string $id | ||
11 | + * @property string $account_id | ||
12 | + * @property string $manager_id | ||
13 | + * @property string $office_id | ||
14 | + * @property string $status | ||
15 | + * @property string $f1 | ||
16 | + * @property string $f2 | ||
17 | + * @property string $f3 | ||
18 | + * @property string $message | ||
19 | + * @property integer $safe_bill | ||
20 | + * @property string $delivery | ||
21 | + * @property double $delivery_price | ||
22 | + * @property string $timestamp | ||
23 | + */ | ||
24 | +class CartBills extends \backend\components\base\BaseActiveRecord | ||
25 | +{ | ||
26 | + /** | ||
27 | + * @inheritdoc | ||
28 | + */ | ||
29 | + public static function tableName() | ||
30 | + { | ||
31 | + return '{{%cart_bills}}'; | ||
32 | + } | ||
33 | + | ||
34 | + /** | ||
35 | + * @inheritdoc | ||
36 | + */ | ||
37 | + public function rules() | ||
38 | + { | ||
39 | + return [ | ||
40 | + [['account_id', 'office_id', 'f1', 'f2', 'f3', 'message', 'delivery'], 'required'], | ||
41 | + [['account_id', 'manager_id', 'office_id', 'status', 'safe_bill'], 'integer'], | ||
42 | + [['message'], 'string'], | ||
43 | + [['delivery_price'], 'number'], | ||
44 | + [['timestamp'], 'safe'], | ||
45 | + [['f1', 'f3'], 'string', 'max' => 150], | ||
46 | + [['f2'], 'string', 'max' => 50], | ||
47 | + [['delivery'], 'string', 'max' => 100] | ||
48 | + ]; | ||
49 | + } | ||
50 | + | ||
51 | + /** | ||
52 | + * @inheritdoc | ||
53 | + */ | ||
54 | + public function attributeLabels() | ||
55 | + { | ||
56 | + return [ | ||
57 | + 'id' => Yii::t('app', 'ID'), | ||
58 | + 'account_id' => Yii::t('app', 'Account ID'), | ||
59 | + 'manager_id' => Yii::t('app', 'Manager ID'), | ||
60 | + 'office_id' => Yii::t('app', 'Office ID'), | ||
61 | + 'status' => Yii::t('app', 'Status'), | ||
62 | + 'f1' => Yii::t('app', 'F1'), | ||
63 | + 'f2' => Yii::t('app', 'F2'), | ||
64 | + 'f3' => Yii::t('app', 'F3'), | ||
65 | + 'message' => Yii::t('app', 'Message'), | ||
66 | + 'safe_bill' => Yii::t('app', 'Safe Bill'), | ||
67 | + 'delivery' => Yii::t('app', 'Delivery'), | ||
68 | + 'delivery_price' => Yii::t('app', 'Delivery Price'), | ||
69 | + 'timestamp' => Yii::t('app', 'Timestamp'), | ||
70 | + ]; | ||
71 | + } | ||
72 | +} |
1 | +<?php | ||
2 | + | ||
3 | +namespace common\models; | ||
4 | + | ||
5 | +use common\components\CustomVarDamp; | ||
6 | +use Yii; | ||
7 | +use yii\base\Model; | ||
8 | +use yii\data\ActiveDataProvider; | ||
9 | +use common\models\CartBillsView; | ||
10 | + | ||
11 | +/** | ||
12 | + * CartBillsSearch represents the model behind the search form about `common\models\CartBills`. | ||
13 | + */ | ||
14 | +class CartBillsSearch extends CartBillsView | ||
15 | +{ | ||
16 | + public $date_to; | ||
17 | + /** | ||
18 | + * @inheritdoc | ||
19 | + */ | ||
20 | + public function rules() | ||
21 | + { | ||
22 | + return [ | ||
23 | + [['id', 'account_id', 'status'], 'integer'], | ||
24 | + [['dt', 'date_to'], 'string', 'max' => 10], | ||
25 | + ]; | ||
26 | + } | ||
27 | + | ||
28 | + /** | ||
29 | + * @inheritdoc | ||
30 | + */ | ||
31 | + public function scenarios() | ||
32 | + { | ||
33 | + // bypass scenarios() implementation in the parent class | ||
34 | + return Model::scenarios(); | ||
35 | + } | ||
36 | + | ||
37 | + /** | ||
38 | + * Creates data provider instance with search query applied | ||
39 | + * | ||
40 | + * @param array $params | ||
41 | + * | ||
42 | + * @return ActiveDataProvider | ||
43 | + */ | ||
44 | + public function search($params) | ||
45 | + { | ||
46 | + $query = CartBillsView::find(); | ||
47 | + | ||
48 | + $dataProvider = new ActiveDataProvider([ | ||
49 | + 'query' => $query, | ||
50 | + ]); | ||
51 | + | ||
52 | + $this->load($params); | ||
53 | + | ||
54 | + if (!$this->validate()) { | ||
55 | + // uncomment the following line if you do not want to return any records when validation fails | ||
56 | + // $query->where('0=1'); | ||
57 | + return $dataProvider; | ||
58 | + } | ||
59 | + | ||
60 | + $query->andFilterWhere([ | ||
61 | + 'id' => $this->id, | ||
62 | + 'account_id' => $this->account_id, | ||
63 | + 'status_id' => $this->status, | ||
64 | + ]); | ||
65 | + | ||
66 | + if($this->dt !== null || $this->date_to !== null){ | ||
67 | + $date_from = mktime(0,0,0,(int)substr($this->dt,4,2),(int)substr($this->dt,1,2),(int)substr($this->dt,7,4)); | ||
68 | + $date_to = mktime(23,59,59,(int)substr($this->date_to,4,2),(int)substr($this->date_to,1,2),(int)substr($this->date_to,7,4)); | ||
69 | + | ||
70 | + $query->andFilterWhere([ | ||
71 | + 'between', 'dt', $date_from, $date_to | ||
72 | + ]); | ||
73 | + } | ||
74 | + | ||
75 | + | ||
76 | + | ||
77 | +// $query->andFilterWhere(['like', 'f1', $this->f1]) | ||
78 | +// ->andFilterWhere(['like', 'f2', $this->f2]) | ||
79 | +// ->andFilterWhere(['like', 'f3', $this->f3]) | ||
80 | +// ->andFilterWhere(['like', 'message', $this->message]) | ||
81 | +// ->andFilterWhere(['like', 'delivery', $this->delivery]); | ||
82 | + | ||
83 | + return $dataProvider; | ||
84 | + } | ||
85 | + | ||
86 | + public static function findById($id){ | ||
87 | + | ||
88 | + return CartBillsView::find()->where(['id' => $id])->one(); | ||
89 | + } | ||
90 | +} |
1 | +<?php | ||
2 | + | ||
3 | +namespace common\models; | ||
4 | + | ||
5 | +use Yii; | ||
6 | + | ||
7 | +/** | ||
8 | + * This is the model class for table "w_cart_bills_view". | ||
9 | + * | ||
10 | + * @property string $id | ||
11 | + * @property string $account_id | ||
12 | + * @property string $manager_name | ||
13 | + * @property string $dt | ||
14 | + * @property string $name | ||
15 | + * @property string $phone | ||
16 | + * @property string $email | ||
17 | + * @property string $delivery | ||
18 | + * @property string $status_id | ||
19 | + * @property string $status | ||
20 | + * @property string $message | ||
21 | + * @property integer $safe_bill | ||
22 | + * @property string $sum | ||
23 | + * @property string $scode | ||
24 | + */ | ||
25 | +class CartBillsView extends \backend\components\base\BaseActiveRecord | ||
26 | +{ | ||
27 | + /** | ||
28 | + * @inheritdoc | ||
29 | + */ | ||
30 | + public static function tableName() | ||
31 | + { | ||
32 | + return 'w_cart_bills_view'; | ||
33 | + } | ||
34 | + | ||
35 | + /** | ||
36 | + * @inheritdoc | ||
37 | + */ | ||
38 | + public function rules() | ||
39 | + { | ||
40 | + return [ | ||
41 | + [['id', 'account_id', 'dt', 'status_id', 'safe_bill', 'scode'], 'integer'], | ||
42 | + [['account_id', 'name', 'phone', 'email', 'delivery', 'status', 'message'], 'required'], | ||
43 | + [['message'], 'string'], | ||
44 | + [['sum'], 'number'], | ||
45 | + [['manager_name'], 'string', 'max' => 255], | ||
46 | + [['name', 'email'], 'string', 'max' => 150], | ||
47 | + [['phone', 'status'], 'string', 'max' => 50], | ||
48 | + [['delivery'], 'string', 'max' => 100] | ||
49 | + ]; | ||
50 | + } | ||
51 | + | ||
52 | + /** | ||
53 | + * @inheritdoc | ||
54 | + */ | ||
55 | + public function attributeLabels() | ||
56 | + { | ||
57 | + return [ | ||
58 | + 'id' => Yii::t('app', '№ заказа'), | ||
59 | + 'account_id' => Yii::t('app', '№ клиента'), | ||
60 | + 'manager_name' => Yii::t('app', 'Менеджер'), | ||
61 | + 'dt' => Yii::t('app', 'Дата'), | ||
62 | + 'name' => Yii::t('app', 'Name'), | ||
63 | + 'phone' => Yii::t('app', 'Phone'), | ||
64 | + 'email' => Yii::t('app', 'Email'), | ||
65 | + 'delivery' => Yii::t('app', 'Delivery'), | ||
66 | + 'status_id' => Yii::t('app', 'Status ID'), | ||
67 | + 'status' => Yii::t('app', 'Статус'), | ||
68 | + 'message' => Yii::t('app', 'Message'), | ||
69 | + 'safe_bill' => Yii::t('app', 'Safe Bill'), | ||
70 | + 'sum' => Yii::t('app', 'Сумма'), | ||
71 | + 'scode' => Yii::t('app', 'Scode'), | ||
72 | + ]; | ||
73 | + } | ||
74 | + | ||
75 | + public static function findById($id){ | ||
76 | + | ||
77 | + } | ||
78 | +} |
1 | +<?php | ||
2 | + | ||
3 | +namespace common\models; | ||
4 | + | ||
5 | +use Yii; | ||
6 | + | ||
7 | +/** | ||
8 | + * This is the model class for table "{{%cart_view}}". | ||
9 | + * | ||
10 | + * @property string $id | ||
11 | + * @property string $account_id | ||
12 | + * @property string $dt | ||
13 | + * @property string $user_name | ||
14 | + * @property string $user_mail | ||
15 | + * @property integer $status_id | ||
16 | + * @property string $status | ||
17 | + * @property string $article | ||
18 | + * @property string $brand | ||
19 | + * @property string $descr | ||
20 | + * @property string $importer | ||
21 | + * @property string $count | ||
22 | + * @property double $price | ||
23 | + * @property string $import_id | ||
24 | + */ | ||
25 | +class CartView extends \backend\components\base\BaseActiveRecord | ||
26 | +{ | ||
27 | + /** | ||
28 | + * @inheritdoc | ||
29 | + */ | ||
30 | + public static function tableName() | ||
31 | + { | ||
32 | + return '{{%cart_view}}'; | ||
33 | + } | ||
34 | + | ||
35 | + /** | ||
36 | + * @inheritdoc | ||
37 | + */ | ||
38 | + public function rules() | ||
39 | + { | ||
40 | + return [ | ||
41 | + [['id', 'account_id', 'dt', 'status_id', 'count', 'import_id'], 'integer'], | ||
42 | + [['account_id', 'user_name', 'user_mail', 'status', 'article', 'brand', 'descr', 'importer', 'count', 'price', 'import_id'], 'required'], | ||
43 | + [['price'], 'number'], | ||
44 | + [['user_name', 'user_mail'], 'string', 'max' => 150], | ||
45 | + [['status'], 'string', 'max' => 50], | ||
46 | + [['article', 'brand'], 'string', 'max' => 100], | ||
47 | + [['descr', 'importer'], 'string', 'max' => 254] | ||
48 | + ]; | ||
49 | + } | ||
50 | + | ||
51 | + /** | ||
52 | + * @inheritdoc | ||
53 | + */ | ||
54 | + public function attributeLabels() | ||
55 | + { | ||
56 | + return [ | ||
57 | + 'id' => Yii::t('app', 'ID'), | ||
58 | + 'account_id' => Yii::t('app', 'Account ID'), | ||
59 | + 'dt' => Yii::t('app', 'Dt'), | ||
60 | + 'user_name' => Yii::t('app', 'User Name'), | ||
61 | + 'user_mail' => Yii::t('app', 'User Mail'), | ||
62 | + 'status_id' => Yii::t('app', 'Status ID'), | ||
63 | + 'status' => Yii::t('app', 'Status'), | ||
64 | + 'article' => Yii::t('app', 'Article'), | ||
65 | + 'brand' => Yii::t('app', 'Brand'), | ||
66 | + 'descr' => Yii::t('app', 'Descr'), | ||
67 | + 'importer' => Yii::t('app', 'Importer'), | ||
68 | + 'count' => Yii::t('app', 'Count'), | ||
69 | + 'price' => Yii::t('app', 'Price'), | ||
70 | + 'import_id' => Yii::t('app', 'Import ID'), | ||
71 | + ]; | ||
72 | + } | ||
73 | +} |
common/models/DetailsCurrency.php
@@ -6,7 +6,7 @@ use Yii; | @@ -6,7 +6,7 @@ use Yii; | ||
6 | 6 | ||
7 | /** | 7 | /** |
8 | * This is the model class for table "{{%details_currency}}". | 8 | * This is the model class for table "{{%details_currency}}". |
9 | - * | 9 | + * w_details_currency - СПЕЦИАЛЬНО СОЗАДННАЯ ВЬЮШКА ДЛЯ ДОСТУПА К СПИСКУ ТОВАРОВ С ВАЛЮТАМИ И ИХ КУРСАМИ |
10 | * @property string $ID | 10 | * @property string $ID |
11 | * @property string $IMPORT_ID | 11 | * @property string $IMPORT_ID |
12 | * @property string $BRAND | 12 | * @property string $BRAND |
common/models/Margins.php
@@ -45,4 +45,22 @@ class Margins extends \yii\db\ActiveRecord | @@ -45,4 +45,22 @@ class Margins extends \yii\db\ActiveRecord | ||
45 | 'koef' => 'Коэффициент', | 45 | 'koef' => 'Коэффициент', |
46 | ]; | 46 | ]; |
47 | } | 47 | } |
48 | + | ||
49 | + // возвращает массив для выбора в динамических формах (конструкторах) | ||
50 | + public static function getHeader() | ||
51 | + { | ||
52 | + $header_array = self::find()->asArray()->all(); | ||
53 | + | ||
54 | + $id_arr = array_column($header_array,'id'); | ||
55 | + $name_arr = array_column($header_array,'name'); | ||
56 | + $header_array = array_combine( $id_arr, $name_arr ); | ||
57 | + $header_array['_null'] = null; // первая колонка пустая | ||
58 | + $header_array['group'] = 'Группа RG'; | ||
59 | + ksort($header_array); | ||
60 | + | ||
61 | + return $header_array; | ||
62 | + } | ||
63 | + | ||
64 | + | ||
65 | + | ||
48 | } | 66 | } |
common/models/MarginsGroups.php
@@ -74,4 +74,42 @@ class MarginsGroups extends \yii\db\ActiveRecord | @@ -74,4 +74,42 @@ class MarginsGroups extends \yii\db\ActiveRecord | ||
74 | { | 74 | { |
75 | return $this->hasOne(Margins::className(), ['id' => 'margin_id']); | 75 | return $this->hasOne(Margins::className(), ['id' => 'margin_id']); |
76 | } | 76 | } |
77 | + | ||
78 | + /** | ||
79 | + * вставка данных с апдейтом прямым запросом SQL | ||
80 | + * @param $data - массив вставляемых данный, вставка будет прозводится пакетами размером указанным в константе BATCH | ||
81 | + * @throws \yii\db\Exception | ||
82 | + */ | ||
83 | + //@todo - вынести все ручные инсерты в отдельный класс | ||
84 | + public static function ManualInsertWithUpdate($data, $keys) | ||
85 | + { | ||
86 | + // \common\components\CustomVarDamp::dumpAndDie($data); | ||
87 | + $table_name = self::tableName(); | ||
88 | + $keys_arr = array_keys($data[0]); | ||
89 | + // найдем те поля которые не являются ключами. Их нужно будет при дубляже апдейтить | ||
90 | + $fields_arr_to_update = array_diff( $keys_arr, $keys ); | ||
91 | + | ||
92 | + $query_update = ' on duplicate key update '; | ||
93 | + foreach ($fields_arr_to_update as $field) { | ||
94 | + $query_update .= "[[{$field}]] = values([[{$field}]]),"; | ||
95 | + } | ||
96 | + // удалим последнюю запятую | ||
97 | + $query_update = substr($query_update, 0, strlen($query_update) - 1); | ||
98 | + | ||
99 | + // запросы будем выполнять пакетами | ||
100 | + // размер пакета установлен в константе | ||
101 | + // разобъем массив на пакеты и будем их проходить | ||
102 | + $data = array_chunk($data, 20); | ||
103 | + foreach ($data as $current_batch_array) { | ||
104 | + | ||
105 | + //воспользуемся пакетной вставкой от фреймворка | ||
106 | + $query_insert = Yii::$app->db->createCommand()->batchInsert($table_name, $keys_arr, $current_batch_array)->sql; | ||
107 | + | ||
108 | + // добавим фрагмент с апдейтом при дубляже | ||
109 | + $query = "{$query_insert} {$query_update}"; | ||
110 | + // \common\components\CustomVarDamp::dumpAndDie($query); | ||
111 | + Yii::$app->db->createCommand($query)->execute(); | ||
112 | + | ||
113 | + } | ||
114 | + } | ||
77 | } | 115 | } |
composer.json
@@ -18,7 +18,11 @@ | @@ -18,7 +18,11 @@ | ||
18 | "yiisoft/yii2": ">=2.0.6", | 18 | "yiisoft/yii2": ">=2.0.6", |
19 | "yiisoft/yii2-bootstrap": "*", | 19 | "yiisoft/yii2-bootstrap": "*", |
20 | "yiisoft/yii2-swiftmailer": "*", | 20 | "yiisoft/yii2-swiftmailer": "*", |
21 | - "yiisoft/yii2-imagine": "*" | 21 | + "artweb/yii2-multiparser": "dev-master", |
22 | + "yiisoft/yii2-imagine": "*", | ||
23 | + "kartik-v/yii2-widget-datepicker": "^1.3", | ||
24 | + "kartik-v/yii2-field-range": "^1.3", | ||
25 | + "kartik-v/yii2-datecontrol": "dev-master" | ||
22 | }, | 26 | }, |
23 | "require-dev": { | 27 | "require-dev": { |
24 | "yiisoft/yii2-codeception": "*", | 28 | "yiisoft/yii2-codeception": "*", |
composer.lock
@@ -4,9 +4,55 @@ | @@ -4,9 +4,55 @@ | ||
4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", | 4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", |
5 | "This file is @generated automatically" | 5 | "This file is @generated automatically" |
6 | ], | 6 | ], |
7 | - "hash": "8580bd82955b1fbb80d47024e184056e", | 7 | + "hash": "2d5c03f681f1c72d09f36e10af144465", |
8 | + "content-hash": "4c8b69eb2733ca32596e438952d2f182", | ||
8 | "packages": [ | 9 | "packages": [ |
9 | { | 10 | { |
11 | + "name": "artweb/yii2-multiparser", | ||
12 | + "version": "dev-master", | ||
13 | + "source": { | ||
14 | + "type": "git", | ||
15 | + "url": "https://github.com/tsurkanovm/yii-multiparser.git", | ||
16 | + "reference": "0c6fd004d8739f106a58f584661e1e5327958b34" | ||
17 | + }, | ||
18 | + "dist": { | ||
19 | + "type": "zip", | ||
20 | + "url": "https://api.github.com/repos/tsurkanovm/yii-multiparser/zipball/0c6fd004d8739f106a58f584661e1e5327958b34", | ||
21 | + "reference": "0c6fd004d8739f106a58f584661e1e5327958b34", | ||
22 | + "shasum": "" | ||
23 | + }, | ||
24 | + "require": { | ||
25 | + "yiisoft/yii2": "*" | ||
26 | + }, | ||
27 | + "type": "library", | ||
28 | + "autoload": { | ||
29 | + "psr-4": { | ||
30 | + "yii\\multiparser\\": "lib\\" | ||
31 | + } | ||
32 | + }, | ||
33 | + "notification-url": "https://packagist.org/downloads/", | ||
34 | + "license": [ | ||
35 | + "MIT" | ||
36 | + ], | ||
37 | + "authors": [ | ||
38 | + { | ||
39 | + "name": "Mihail Tsurkanov", | ||
40 | + "email": "tsurkanovm@gmail.com", | ||
41 | + "role": "Developer" | ||
42 | + } | ||
43 | + ], | ||
44 | + "description": "This extension provides a Multiparser solution for Yii framework 2.0.", | ||
45 | + "homepage": "https://github.com/tsurkanovm/yii-multiparser.git", | ||
46 | + "keywords": [ | ||
47 | + "csv", | ||
48 | + "parser", | ||
49 | + "xlsx", | ||
50 | + "xml", | ||
51 | + "yii2" | ||
52 | + ], | ||
53 | + "time": "2015-10-28 09:28:22" | ||
54 | + }, | ||
55 | + { | ||
10 | "name": "bower-asset/bootstrap", | 56 | "name": "bower-asset/bootstrap", |
11 | "version": "v3.3.5", | 57 | "version": "v3.3.5", |
12 | "source": { | 58 | "source": { |
@@ -317,6 +363,296 @@ | @@ -317,6 +363,296 @@ | ||
317 | "time": "2013-11-30 08:25:19" | 363 | "time": "2013-11-30 08:25:19" |
318 | }, | 364 | }, |
319 | { | 365 | { |
366 | + "name": "imagine/imagine", | ||
367 | + "version": "v0.5.0", | ||
368 | + "source": { | ||
369 | + "type": "git", | ||
370 | + "url": "https://github.com/avalanche123/Imagine.git", | ||
371 | + "reference": "f64ec666baaa800edcbf237db41121a569230709" | ||
372 | + }, | ||
373 | + "dist": { | ||
374 | + "type": "zip", | ||
375 | + "url": "https://api.github.com/repos/avalanche123/Imagine/zipball/f64ec666baaa800edcbf237db41121a569230709", | ||
376 | + "reference": "f64ec666baaa800edcbf237db41121a569230709", | ||
377 | + "shasum": "" | ||
378 | + }, | ||
379 | + "require": { | ||
380 | + "php": ">=5.3.2" | ||
381 | + }, | ||
382 | + "require-dev": { | ||
383 | + "sami/sami": "dev-master" | ||
384 | + }, | ||
385 | + "suggest": { | ||
386 | + "ext-gd": "to use the GD implementation", | ||
387 | + "ext-gmagick": "to use the Gmagick implementation", | ||
388 | + "ext-imagick": "to use the Imagick implementation" | ||
389 | + }, | ||
390 | + "type": "library", | ||
391 | + "autoload": { | ||
392 | + "psr-0": { | ||
393 | + "Imagine": "lib/" | ||
394 | + } | ||
395 | + }, | ||
396 | + "notification-url": "https://packagist.org/downloads/", | ||
397 | + "license": [ | ||
398 | + "MIT" | ||
399 | + ], | ||
400 | + "authors": [ | ||
401 | + { | ||
402 | + "name": "Bulat Shakirzyanov", | ||
403 | + "email": "mallluhuct@gmail.com", | ||
404 | + "homepage": "http://avalanche123.com" | ||
405 | + } | ||
406 | + ], | ||
407 | + "description": "Image processing for PHP 5.3", | ||
408 | + "homepage": "http://imagine.readthedocs.org/", | ||
409 | + "keywords": [ | ||
410 | + "drawing", | ||
411 | + "graphics", | ||
412 | + "image manipulation", | ||
413 | + "image processing" | ||
414 | + ], | ||
415 | + "time": "2013-07-10 17:25:36" | ||
416 | + }, | ||
417 | + { | ||
418 | + "name": "kartik-v/php-date-formatter", | ||
419 | + "version": "v1.3.1", | ||
420 | + "source": { | ||
421 | + "type": "git", | ||
422 | + "url": "https://github.com/kartik-v/php-date-formatter.git", | ||
423 | + "reference": "7d3dc3495dd10bd1909c0dfdecd673967019cc21" | ||
424 | + }, | ||
425 | + "dist": { | ||
426 | + "type": "zip", | ||
427 | + "url": "https://api.github.com/repos/kartik-v/php-date-formatter/zipball/7d3dc3495dd10bd1909c0dfdecd673967019cc21", | ||
428 | + "reference": "7d3dc3495dd10bd1909c0dfdecd673967019cc21", | ||
429 | + "shasum": "" | ||
430 | + }, | ||
431 | + "type": "library", | ||
432 | + "autoload": { | ||
433 | + "psr-4": { | ||
434 | + "kartik\\plugins\\dateformatter\\": "" | ||
435 | + } | ||
436 | + }, | ||
437 | + "notification-url": "https://packagist.org/downloads/", | ||
438 | + "license": [ | ||
439 | + "BSD-3-Clause" | ||
440 | + ], | ||
441 | + "authors": [ | ||
442 | + { | ||
443 | + "name": "Kartik Visweswaran", | ||
444 | + "email": "kartikv2@gmail.com", | ||
445 | + "homepage": "http://www.krajee.com/" | ||
446 | + } | ||
447 | + ], | ||
448 | + "description": "A JQuery datetime formatting and manipulation library using PHP date-time formats in javascript.", | ||
449 | + "homepage": "https://github.com/kartik-v/php-date-formatter", | ||
450 | + "keywords": [ | ||
451 | + "date", | ||
452 | + "datetime", | ||
453 | + "formatter", | ||
454 | + "javascript", | ||
455 | + "jquery", | ||
456 | + "php", | ||
457 | + "php-date-formatter.js", | ||
458 | + "time" | ||
459 | + ], | ||
460 | + "time": "2015-06-18 15:14:51" | ||
461 | + }, | ||
462 | + { | ||
463 | + "name": "kartik-v/yii2-datecontrol", | ||
464 | + "version": "dev-master", | ||
465 | + "source": { | ||
466 | + "type": "git", | ||
467 | + "url": "https://github.com/kartik-v/yii2-datecontrol.git", | ||
468 | + "reference": "4e858b5cd38130c37739b2f582b66a044f77c95c" | ||
469 | + }, | ||
470 | + "dist": { | ||
471 | + "type": "zip", | ||
472 | + "url": "https://api.github.com/repos/kartik-v/yii2-datecontrol/zipball/4e858b5cd38130c37739b2f582b66a044f77c95c", | ||
473 | + "reference": "4e858b5cd38130c37739b2f582b66a044f77c95c", | ||
474 | + "shasum": "" | ||
475 | + }, | ||
476 | + "require": { | ||
477 | + "kartik-v/php-date-formatter": ">1.3", | ||
478 | + "kartik-v/yii2-krajee-base": "~1.7" | ||
479 | + }, | ||
480 | + "type": "yii2-extension", | ||
481 | + "autoload": { | ||
482 | + "psr-4": { | ||
483 | + "kartik\\datecontrol\\": "" | ||
484 | + } | ||
485 | + }, | ||
486 | + "notification-url": "https://packagist.org/downloads/", | ||
487 | + "license": [ | ||
488 | + "BSD-3-Clause" | ||
489 | + ], | ||
490 | + "authors": [ | ||
491 | + { | ||
492 | + "name": "Kartik Visweswaran", | ||
493 | + "email": "kartikv2@gmail.com", | ||
494 | + "homepage": "http://www.krajee.com/" | ||
495 | + } | ||
496 | + ], | ||
497 | + "description": "Date control module allowing separation of formats for View and Model for Yii Framework 2.0", | ||
498 | + "homepage": "https://github.com/kartik-v/yii2-datecontrol", | ||
499 | + "keywords": [ | ||
500 | + "control", | ||
501 | + "date", | ||
502 | + "extension", | ||
503 | + "format", | ||
504 | + "yii", | ||
505 | + "yii2" | ||
506 | + ], | ||
507 | + "time": "2015-07-30 18:30:18" | ||
508 | + }, | ||
509 | + { | ||
510 | + "name": "kartik-v/yii2-field-range", | ||
511 | + "version": "v1.3.0", | ||
512 | + "source": { | ||
513 | + "type": "git", | ||
514 | + "url": "https://github.com/kartik-v/yii2-field-range.git", | ||
515 | + "reference": "095d260eecb86ff2e78a70775011cec00a75df98" | ||
516 | + }, | ||
517 | + "dist": { | ||
518 | + "type": "zip", | ||
519 | + "url": "https://api.github.com/repos/kartik-v/yii2-field-range/zipball/095d260eecb86ff2e78a70775011cec00a75df98", | ||
520 | + "reference": "095d260eecb86ff2e78a70775011cec00a75df98", | ||
521 | + "shasum": "" | ||
522 | + }, | ||
523 | + "require": { | ||
524 | + "kartik-v/yii2-krajee-base": "*" | ||
525 | + }, | ||
526 | + "type": "yii2-extension", | ||
527 | + "autoload": { | ||
528 | + "psr-4": { | ||
529 | + "kartik\\field\\": "" | ||
530 | + } | ||
531 | + }, | ||
532 | + "notification-url": "https://packagist.org/downloads/", | ||
533 | + "license": [ | ||
534 | + "BSD 3-Clause" | ||
535 | + ], | ||
536 | + "authors": [ | ||
537 | + { | ||
538 | + "name": "Kartik Visweswaran", | ||
539 | + "email": "kartikv2@gmail.com", | ||
540 | + "homepage": "http://www.krajee.com/" | ||
541 | + } | ||
542 | + ], | ||
543 | + "description": "Easily manage Yii 2 ActiveField ranges (from/to) with Bootstrap 3 addons markup and more", | ||
544 | + "homepage": "https://github.com/kartik-v/yii2-field-range", | ||
545 | + "keywords": [ | ||
546 | + "addon", | ||
547 | + "bootstrap", | ||
548 | + "bootstrap 3", | ||
549 | + "date", | ||
550 | + "extension", | ||
551 | + "field-range", | ||
552 | + "from", | ||
553 | + "range", | ||
554 | + "to", | ||
555 | + "widget", | ||
556 | + "yii2" | ||
557 | + ], | ||
558 | + "time": "2014-11-25 08:52:00" | ||
559 | + }, | ||
560 | + { | ||
561 | + "name": "kartik-v/yii2-krajee-base", | ||
562 | + "version": "v1.7.7", | ||
563 | + "source": { | ||
564 | + "type": "git", | ||
565 | + "url": "https://github.com/kartik-v/yii2-krajee-base.git", | ||
566 | + "reference": "c0adff9d9762f4fd3bf0e7cd0000fcab0bf00f19" | ||
567 | + }, | ||
568 | + "dist": { | ||
569 | + "type": "zip", | ||
570 | + "url": "https://api.github.com/repos/kartik-v/yii2-krajee-base/zipball/c0adff9d9762f4fd3bf0e7cd0000fcab0bf00f19", | ||
571 | + "reference": "c0adff9d9762f4fd3bf0e7cd0000fcab0bf00f19", | ||
572 | + "shasum": "" | ||
573 | + }, | ||
574 | + "require": { | ||
575 | + "yiisoft/yii2-bootstrap": "@dev" | ||
576 | + }, | ||
577 | + "type": "yii2-extension", | ||
578 | + "autoload": { | ||
579 | + "psr-4": { | ||
580 | + "kartik\\base\\": "" | ||
581 | + } | ||
582 | + }, | ||
583 | + "notification-url": "https://packagist.org/downloads/", | ||
584 | + "license": [ | ||
585 | + "BSD-3-Clause" | ||
586 | + ], | ||
587 | + "authors": [ | ||
588 | + { | ||
589 | + "name": "Kartik Visweswaran", | ||
590 | + "email": "kartikv2@gmail.com", | ||
591 | + "homepage": "http://www.krajee.com/" | ||
592 | + } | ||
593 | + ], | ||
594 | + "description": "Base library and foundation components for all Yii2 Krajee extensions.", | ||
595 | + "homepage": "https://github.com/kartik-v/yii2-krajee-base", | ||
596 | + "keywords": [ | ||
597 | + "base", | ||
598 | + "extension", | ||
599 | + "foundation", | ||
600 | + "krajee", | ||
601 | + "widget", | ||
602 | + "yii2" | ||
603 | + ], | ||
604 | + "time": "2015-06-16 05:19:57" | ||
605 | + }, | ||
606 | + { | ||
607 | + "name": "kartik-v/yii2-widget-datepicker", | ||
608 | + "version": "v1.3.3", | ||
609 | + "source": { | ||
610 | + "type": "git", | ||
611 | + "url": "https://github.com/kartik-v/yii2-widget-datepicker.git", | ||
612 | + "reference": "368b181ef658c05707fe41dd16eee4d9ffd9da38" | ||
613 | + }, | ||
614 | + "dist": { | ||
615 | + "type": "zip", | ||
616 | + "url": "https://api.github.com/repos/kartik-v/yii2-widget-datepicker/zipball/368b181ef658c05707fe41dd16eee4d9ffd9da38", | ||
617 | + "reference": "368b181ef658c05707fe41dd16eee4d9ffd9da38", | ||
618 | + "shasum": "" | ||
619 | + }, | ||
620 | + "require": { | ||
621 | + "kartik-v/yii2-krajee-base": "~1.7" | ||
622 | + }, | ||
623 | + "type": "yii2-extension", | ||
624 | + "autoload": { | ||
625 | + "psr-4": { | ||
626 | + "kartik\\date\\": "" | ||
627 | + } | ||
628 | + }, | ||
629 | + "notification-url": "https://packagist.org/downloads/", | ||
630 | + "license": [ | ||
631 | + "BSD-3-Clause" | ||
632 | + ], | ||
633 | + "authors": [ | ||
634 | + { | ||
635 | + "name": "Kartik Visweswaran", | ||
636 | + "email": "kartikv2@gmail.com", | ||
637 | + "homepage": "http://www.krajee.com/" | ||
638 | + } | ||
639 | + ], | ||
640 | + "description": "Enhanced Yii2 wrapper for the bootstrap datepicker plugin (sub repo split from yii2-widgets).", | ||
641 | + "homepage": "https://github.com/kartik-v/yii2-widget-datepicker", | ||
642 | + "keywords": [ | ||
643 | + "date", | ||
644 | + "extension", | ||
645 | + "form", | ||
646 | + "jquery", | ||
647 | + "picker", | ||
648 | + "plugin", | ||
649 | + "select2", | ||
650 | + "widget", | ||
651 | + "yii2" | ||
652 | + ], | ||
653 | + "time": "2015-07-19 04:49:03" | ||
654 | + }, | ||
655 | + { | ||
320 | "name": "swiftmailer/swiftmailer", | 656 | "name": "swiftmailer/swiftmailer", |
321 | "version": "v5.4.1", | 657 | "version": "v5.4.1", |
322 | "source": { | 658 | "source": { |
@@ -459,21 +795,21 @@ | @@ -459,21 +795,21 @@ | ||
459 | }, | 795 | }, |
460 | { | 796 | { |
461 | "name": "yiisoft/yii2-bootstrap", | 797 | "name": "yiisoft/yii2-bootstrap", |
462 | - "version": "2.0.4", | 798 | + "version": "2.0.5", |
463 | "source": { | 799 | "source": { |
464 | "type": "git", | 800 | "type": "git", |
465 | "url": "https://github.com/yiisoft/yii2-bootstrap.git", | 801 | "url": "https://github.com/yiisoft/yii2-bootstrap.git", |
466 | - "reference": "1b6b1e61cf91c3cdd517d6a7e71d30bb212e4af0" | 802 | + "reference": "1464f93834b1d5edb1f5625f7ffd6c3723fa4923" |
467 | }, | 803 | }, |
468 | "dist": { | 804 | "dist": { |
469 | "type": "zip", | 805 | "type": "zip", |
470 | - "url": "https://api.github.com/repos/yiisoft/yii2-bootstrap/zipball/1b6b1e61cf91c3cdd517d6a7e71d30bb212e4af0", | ||
471 | - "reference": "1b6b1e61cf91c3cdd517d6a7e71d30bb212e4af0", | 806 | + "url": "https://api.github.com/repos/yiisoft/yii2-bootstrap/zipball/1464f93834b1d5edb1f5625f7ffd6c3723fa4923", |
807 | + "reference": "1464f93834b1d5edb1f5625f7ffd6c3723fa4923", | ||
472 | "shasum": "" | 808 | "shasum": "" |
473 | }, | 809 | }, |
474 | "require": { | 810 | "require": { |
475 | "bower-asset/bootstrap": "3.3.* | 3.2.* | 3.1.*", | 811 | "bower-asset/bootstrap": "3.3.* | 3.2.* | 3.1.*", |
476 | - "yiisoft/yii2": ">=2.0.4" | 812 | + "yiisoft/yii2": ">=2.0.6" |
477 | }, | 813 | }, |
478 | "type": "yii2-extension", | 814 | "type": "yii2-extension", |
479 | "extra": { | 815 | "extra": { |
@@ -505,7 +841,7 @@ | @@ -505,7 +841,7 @@ | ||
505 | "bootstrap", | 841 | "bootstrap", |
506 | "yii2" | 842 | "yii2" |
507 | ], | 843 | ], |
508 | - "time": "2015-05-10 22:08:17" | 844 | + "time": "2015-09-23 17:48:24" |
509 | }, | 845 | }, |
510 | { | 846 | { |
511 | "name": "yiisoft/yii2-composer", | 847 | "name": "yiisoft/yii2-composer", |
@@ -555,6 +891,54 @@ | @@ -555,6 +891,54 @@ | ||
555 | "time": "2015-03-01 06:22:44" | 891 | "time": "2015-03-01 06:22:44" |
556 | }, | 892 | }, |
557 | { | 893 | { |
894 | + "name": "yiisoft/yii2-imagine", | ||
895 | + "version": "2.0.3", | ||
896 | + "source": { | ||
897 | + "type": "git", | ||
898 | + "url": "https://github.com/yiisoft/yii2-imagine.git", | ||
899 | + "reference": "0961343138b65bba447de84b2b300899617e6acc" | ||
900 | + }, | ||
901 | + "dist": { | ||
902 | + "type": "zip", | ||
903 | + "url": "https://api.github.com/repos/yiisoft/yii2-imagine/zipball/0961343138b65bba447de84b2b300899617e6acc", | ||
904 | + "reference": "0961343138b65bba447de84b2b300899617e6acc", | ||
905 | + "shasum": "" | ||
906 | + }, | ||
907 | + "require": { | ||
908 | + "imagine/imagine": "0.5.*", | ||
909 | + "yiisoft/yii2": "*" | ||
910 | + }, | ||
911 | + "type": "yii2-extension", | ||
912 | + "extra": { | ||
913 | + "branch-alias": { | ||
914 | + "dev-master": "2.0.x-dev" | ||
915 | + } | ||
916 | + }, | ||
917 | + "autoload": { | ||
918 | + "psr-4": { | ||
919 | + "yii\\imagine\\": "" | ||
920 | + } | ||
921 | + }, | ||
922 | + "notification-url": "https://packagist.org/downloads/", | ||
923 | + "license": [ | ||
924 | + "BSD-3-Clause" | ||
925 | + ], | ||
926 | + "authors": [ | ||
927 | + { | ||
928 | + "name": "Antonio Ramirez", | ||
929 | + "email": "amigo.cobos@gmail.com" | ||
930 | + } | ||
931 | + ], | ||
932 | + "description": "The Imagine integration for the Yii framework", | ||
933 | + "keywords": [ | ||
934 | + "helper", | ||
935 | + "image", | ||
936 | + "imagine", | ||
937 | + "yii2" | ||
938 | + ], | ||
939 | + "time": "2015-03-01 06:22:44" | ||
940 | + }, | ||
941 | + { | ||
558 | "name": "yiisoft/yii2-swiftmailer", | 942 | "name": "yiisoft/yii2-swiftmailer", |
559 | "version": "2.0.4", | 943 | "version": "2.0.4", |
560 | "source": { | 944 | "source": { |
@@ -634,101 +1018,6 @@ | @@ -634,101 +1018,6 @@ | ||
634 | } | 1018 | } |
635 | }, | 1019 | }, |
636 | { | 1020 | { |
637 | - "name": "composer/installers", | ||
638 | - "version": "v1.0.21", | ||
639 | - "source": { | ||
640 | - "type": "git", | ||
641 | - "url": "https://github.com/composer/installers.git", | ||
642 | - "reference": "d64e23fce42a4063d63262b19b8e7c0f3b5e4c45" | ||
643 | - }, | ||
644 | - "dist": { | ||
645 | - "type": "zip", | ||
646 | - "url": "https://api.github.com/repos/composer/installers/zipball/d64e23fce42a4063d63262b19b8e7c0f3b5e4c45", | ||
647 | - "reference": "d64e23fce42a4063d63262b19b8e7c0f3b5e4c45", | ||
648 | - "shasum": "" | ||
649 | - }, | ||
650 | - "replace": { | ||
651 | - "roundcube/plugin-installer": "*", | ||
652 | - "shama/baton": "*" | ||
653 | - }, | ||
654 | - "require-dev": { | ||
655 | - "composer/composer": "1.0.*@dev", | ||
656 | - "phpunit/phpunit": "4.1.*" | ||
657 | - }, | ||
658 | - "type": "composer-installer", | ||
659 | - "extra": { | ||
660 | - "class": "Composer\\Installers\\Installer", | ||
661 | - "branch-alias": { | ||
662 | - "dev-master": "1.0-dev" | ||
663 | - } | ||
664 | - }, | ||
665 | - "autoload": { | ||
666 | - "psr-0": { | ||
667 | - "Composer\\Installers\\": "src/" | ||
668 | - } | ||
669 | - }, | ||
670 | - "notification-url": "https://packagist.org/downloads/", | ||
671 | - "license": [ | ||
672 | - "MIT" | ||
673 | - ], | ||
674 | - "authors": [ | ||
675 | - { | ||
676 | - "name": "Kyle Robinson Young", | ||
677 | - "email": "kyle@dontkry.com", | ||
678 | - "homepage": "https://github.com/shama" | ||
679 | - } | ||
680 | - ], | ||
681 | - "description": "A multi-framework Composer library installer", | ||
682 | - "homepage": "http://composer.github.com/installers/", | ||
683 | - "keywords": [ | ||
684 | - "Craft", | ||
685 | - "Dolibarr", | ||
686 | - "Hurad", | ||
687 | - "MODX Evo", | ||
688 | - "OXID", | ||
689 | - "SMF", | ||
690 | - "Thelia", | ||
691 | - "WolfCMS", | ||
692 | - "agl", | ||
693 | - "aimeos", | ||
694 | - "annotatecms", | ||
695 | - "bitrix", | ||
696 | - "cakephp", | ||
697 | - "chef", | ||
698 | - "codeigniter", | ||
699 | - "concrete5", | ||
700 | - "croogo", | ||
701 | - "dokuwiki", | ||
702 | - "drupal", | ||
703 | - "elgg", | ||
704 | - "fuelphp", | ||
705 | - "grav", | ||
706 | - "installer", | ||
707 | - "joomla", | ||
708 | - "kohana", | ||
709 | - "laravel", | ||
710 | - "lithium", | ||
711 | - "magento", | ||
712 | - "mako", | ||
713 | - "mediawiki", | ||
714 | - "modulework", | ||
715 | - "moodle", | ||
716 | - "phpbb", | ||
717 | - "piwik", | ||
718 | - "ppi", | ||
719 | - "puppet", | ||
720 | - "roundcube", | ||
721 | - "shopware", | ||
722 | - "silverstripe", | ||
723 | - "symfony", | ||
724 | - "typo3", | ||
725 | - "wordpress", | ||
726 | - "zend", | ||
727 | - "zikula" | ||
728 | - ], | ||
729 | - "time": "2015-02-18 17:17:01" | ||
730 | - }, | ||
731 | - { | ||
732 | "name": "fzaninotto/faker", | 1021 | "name": "fzaninotto/faker", |
733 | "version": "v1.5.0", | 1022 | "version": "v1.5.0", |
734 | "source": { | 1023 | "source": { |
@@ -815,55 +1104,6 @@ | @@ -815,55 +1104,6 @@ | ||
815 | "time": "2013-11-01 13:02:21" | 1104 | "time": "2013-11-01 13:02:21" |
816 | }, | 1105 | }, |
817 | { | 1106 | { |
818 | - "name": "silverstripe/framework", | ||
819 | - "version": "3.1.13", | ||
820 | - "source": { | ||
821 | - "type": "git", | ||
822 | - "url": "https://github.com/silverstripe/silverstripe-framework.git", | ||
823 | - "reference": "04b803dfc6dc60f2e6a38fa74f957156230b54be" | ||
824 | - }, | ||
825 | - "dist": { | ||
826 | - "type": "zip", | ||
827 | - "url": "https://api.github.com/repos/silverstripe/silverstripe-framework/zipball/04b803dfc6dc60f2e6a38fa74f957156230b54be", | ||
828 | - "reference": "04b803dfc6dc60f2e6a38fa74f957156230b54be", | ||
829 | - "shasum": "" | ||
830 | - }, | ||
831 | - "require": { | ||
832 | - "composer/installers": "*", | ||
833 | - "php": ">=5.3.2" | ||
834 | - }, | ||
835 | - "require-dev": { | ||
836 | - "phpunit/phpunit": "~3.7@stable" | ||
837 | - }, | ||
838 | - "type": "silverstripe-module", | ||
839 | - "autoload": { | ||
840 | - "classmap": [ | ||
841 | - "tests/behat/features/bootstrap" | ||
842 | - ] | ||
843 | - }, | ||
844 | - "notification-url": "https://packagist.org/downloads/", | ||
845 | - "license": [ | ||
846 | - "BSD-3-Clause" | ||
847 | - ], | ||
848 | - "authors": [ | ||
849 | - { | ||
850 | - "name": "SilverStripe", | ||
851 | - "homepage": "http://silverstripe.com" | ||
852 | - }, | ||
853 | - { | ||
854 | - "name": "The SilverStripe Community", | ||
855 | - "homepage": "http://silverstripe.org" | ||
856 | - } | ||
857 | - ], | ||
858 | - "description": "The SilverStripe framework", | ||
859 | - "homepage": "http://silverstripe.org", | ||
860 | - "keywords": [ | ||
861 | - "framework", | ||
862 | - "silverstripe" | ||
863 | - ], | ||
864 | - "time": "2015-05-28 06:59:11" | ||
865 | - }, | ||
866 | - { | ||
867 | "name": "yiisoft/yii2-codeception", | 1107 | "name": "yiisoft/yii2-codeception", |
868 | "version": "2.0.4", | 1108 | "version": "2.0.4", |
869 | "source": { | 1109 | "source": { |
@@ -1058,7 +1298,10 @@ | @@ -1058,7 +1298,10 @@ | ||
1058 | ], | 1298 | ], |
1059 | "aliases": [], | 1299 | "aliases": [], |
1060 | "minimum-stability": "stable", | 1300 | "minimum-stability": "stable", |
1061 | - "stability-flags": [], | 1301 | + "stability-flags": { |
1302 | + "artweb/yii2-multiparser": 20, | ||
1303 | + "kartik-v/yii2-datecontrol": 20 | ||
1304 | + }, | ||
1062 | "prefer-stable": false, | 1305 | "prefer-stable": false, |
1063 | "prefer-lowest": false, | 1306 | "prefer-lowest": false, |
1064 | "platform": { | 1307 | "platform": { |
console/.gitignore
console/controllers/ParserController.php
1 | <?php | 1 | <?php |
2 | namespace console\controllers; | 2 | namespace console\controllers; |
3 | 3 | ||
4 | +use common\components\archive_reader\ArchiveCreator; | ||
4 | use common\components\CustomVarDamp; | 5 | use common\components\CustomVarDamp; |
6 | +use common\components\mail\ImapMailReader; | ||
7 | +use common\components\mail\MailAttachmentsSaver; | ||
5 | use yii\console\Controller; | 8 | use yii\console\Controller; |
6 | use yii\helpers\Console; | 9 | use yii\helpers\Console; |
7 | use common\components\PriceWriter; | 10 | use common\components\PriceWriter; |
@@ -59,8 +62,7 @@ class ParserController extends Controller | @@ -59,8 +62,7 @@ class ParserController extends Controller | ||
59 | } | 62 | } |
60 | $data = \Yii::$app->multiparser->parse( $file_path, $parser_config ); | 63 | $data = \Yii::$app->multiparser->parse( $file_path, $parser_config ); |
61 | if ( ! $data ) { | 64 | if ( ! $data ) { |
62 | - // @todo переделать, что бы ошибка автоматически останавливала сценарий | ||
63 | - return false; | 65 | + throw new ErrorException("Ошибка обработки файла прайса!"); |
64 | } | 66 | } |
65 | 67 | ||
66 | $writer = new PriceWriter(); | 68 | $writer = new PriceWriter(); |
@@ -105,7 +107,7 @@ class ParserController extends Controller | @@ -105,7 +107,7 @@ class ParserController extends Controller | ||
105 | ]; | 107 | ]; |
106 | 108 | ||
107 | if ($this->parseFileConsole($file_path, $config)) { | 109 | if ($this->parseFileConsole($file_path, $config)) { |
108 | - unlink(\Yii::getAlias('@auto_upload') . '/' . $file_name . '.xml'); | 110 | + //unlink(\Yii::getAlias('@auto_upload') . '/' . $file_name . '.xml'); |
109 | \Yii::info("Загрузка файла - $file_path успешно завершена", 'parser'); | 111 | \Yii::info("Загрузка файла - $file_path успешно завершена", 'parser'); |
110 | } else { | 112 | } else { |
111 | \Yii::error("Загрузка файла - $file_path завершена с ошибкой", 'parser'); | 113 | \Yii::error("Загрузка файла - $file_path завершена с ошибкой", 'parser'); |
@@ -115,8 +117,52 @@ class ParserController extends Controller | @@ -115,8 +117,52 @@ class ParserController extends Controller | ||
115 | 117 | ||
116 | public function actionTest() | 118 | public function actionTest() |
117 | { | 119 | { |
118 | - Console::output('It is working '); | 120 | + Console::output('It is working'); |
119 | \Yii::info('2', 'parser'); | 121 | \Yii::info('2', 'parser'); |
120 | 122 | ||
121 | } | 123 | } |
124 | + | ||
125 | + public function actionSaveMailAttachments() | ||
126 | + { | ||
127 | + \Yii::info('Начало сохранения файлов почты', 'mail'); | ||
128 | + | ||
129 | + $mail_reader = new ImapMailReader( '{imap.gmail.com:993/imap/ssl/novalidate-cert}', 'tsurkanovm@gmail.com', 'Wtvr@2000' ); | ||
130 | + $mailboxes = $mail_reader->getListMailboxes(); | ||
131 | + foreach ( $mailboxes as $custom_label ) { | ||
132 | + $words = explode(" ",str_replace( array($mail_reader->getHostname(),"!"),"",imap_utf7_decode($custom_label)) ); | ||
133 | + $importer_id = (int)preg_replace("/[^A-Z0-9]+/","", strtoupper($words[0])); | ||
134 | + | ||
135 | + $mail_reader->reOpen( $custom_label ); | ||
136 | + $saver = new MailAttachmentsSaver( $mail_reader, 'UNSEEN' ); | ||
137 | + $saver->file_name_parefix = $importer_id . '~!~'; | ||
138 | + $saver->saveAttachmentsTo(\Yii::getAlias('@temp_upload')); | ||
139 | + | ||
140 | + } | ||
141 | + | ||
142 | + $files = $saver->getSavedFilesArr(); | ||
143 | + $arch_creator = new ArchiveCreator(); | ||
144 | + $arch_extensions = $arch_creator->getHandleExtension(); | ||
145 | + $files_on_unpack = array_intersect( $files , $arch_extensions ); | ||
146 | + foreach ($files_on_unpack as $arch_ext => $arch_name) { | ||
147 | + $arch_reader = $arch_creator->create( $arch_name, $arch_ext); | ||
148 | + $arch_reader->extractTo(\Yii::getAlias('@temp_upload')); | ||
149 | + unset( $files[$arch_name] ); | ||
150 | + $files = array_merge( $files, $arch_reader->getExtractedFiles()); | ||
151 | + } | ||
152 | + | ||
153 | + foreach ( $files as $name => $ext ) { | ||
154 | + $file_name = ''; | ||
155 | + if( $ext = 'csv' ){ | ||
156 | + $files_model = new ImportersFiles(); | ||
157 | + $files_model->importer_id = $importer_id; | ||
158 | + if ($files_model->save()) { | ||
159 | + $file_name = \Yii::$app->db->getLastInsertID(); | ||
160 | + } // обработчик ошибки !!!!! | ||
161 | + | ||
162 | + } | ||
163 | + | ||
164 | + // переписываем файл в автолоад папку, и переименовываем если указано имя | ||
165 | + } | ||
166 | + | ||
167 | + } | ||
122 | } | 168 | } |
123 | \ No newline at end of file | 169 | \ No newline at end of file |
console/migrations/m151013_062829_deletePrefixFunction.php
console/migrations/m151016_144435_addViewDetailsCurrency.php
console/migrations/m151030_121905_addSumBillFunction.php
0 → 100644
1 | +<?php | ||
2 | + | ||
3 | +use yii\db\Migration; | ||
4 | + | ||
5 | +/** | ||
6 | + * Class m151030_121905_addSumBillFunction | ||
7 | + * добавляем функцию расчета суммы заказа | ||
8 | + */ | ||
9 | +class m151030_121905_addSumBillFunction extends Migration | ||
10 | +{ | ||
11 | + | ||
12 | + public function safeUp() | ||
13 | + { | ||
14 | + $sum_count = <<< MySQL | ||
15 | + CREATE FUNCTION SumBill(p_bill_id int) RETURNS DECIMAL(12,2) | ||
16 | + BEGIN | ||
17 | + DECLARE _sum DECIMAL(12,2); | ||
18 | + | ||
19 | + select round(sum(`count`*`price`),2) into _sum From w_cart where bill_id = p_bill_id; | ||
20 | + | ||
21 | + RETURN (_sum); | ||
22 | + END | ||
23 | +MySQL; | ||
24 | + | ||
25 | + $this->execute($sum_count); | ||
26 | + | ||
27 | + } | ||
28 | + | ||
29 | + public function safedown() | ||
30 | + { | ||
31 | + | ||
32 | + $sum_count = <<< MySQL | ||
33 | + drop FUNCTION SumBill; | ||
34 | +MySQL; | ||
35 | + | ||
36 | + $this->execute($sum_count); | ||
37 | + | ||
38 | + } | ||
39 | + | ||
40 | + | ||
41 | +} | ||
0 | \ No newline at end of file | 42 | \ No newline at end of file |
console/migrations/m151030_123511_addCartBillsView.php
0 → 100644
1 | +<?php | ||
2 | + | ||
3 | +use yii\db\Migration; | ||
4 | + | ||
5 | + | ||
6 | +class m151030_123511_addCartBillsView extends Migration | ||
7 | +{ | ||
8 | + public function up() | ||
9 | + { | ||
10 | + | ||
11 | + $view = <<< MySQL | ||
12 | + create view w_cart_bills_view as | ||
13 | + select `w_cart_bills`.`id` as `id`, | ||
14 | + `w_cart_bills`.`account_id`, | ||
15 | + `w__user`.`name` as `manager_name`, | ||
16 | + unix_timestamp(`w_cart_bills`.`timestamp`) as `dt`, | ||
17 | + `w_cart_bills`.`f1` as `name`, | ||
18 | + `w_cart_bills`.`f2` as `phone`, | ||
19 | + `w_cart_bills`.`f3` as `email`, | ||
20 | + `w_cart_bills`.`delivery`, | ||
21 | + `w_cart_bills`.`status` as `status_id`, | ||
22 | + `w_dic_statuses`.`name` as `status`, | ||
23 | + `w_cart_bills`.`message`,`w_cart_bills`.`safe_bill`, | ||
24 | + SumBill(`w_cart_bills`.`id`) as `sum`, | ||
25 | + `w_accounts`.`scode` | ||
26 | + from `w_cart_bills` | ||
27 | + left join `w_accounts` on `w_accounts`.`id` = `w_cart_bills`.`account_id` | ||
28 | + left join `w__user` on `w__user`.`id` = `w_cart_bills`.`manager_id` | ||
29 | + inner join `w_dic_statuses` on `w_dic_statuses`.`id` = `w_cart_bills`.`status`; | ||
30 | +MySQL; | ||
31 | + | ||
32 | + $this->execute($view); | ||
33 | + | ||
34 | + } | ||
35 | + | ||
36 | + public function down() | ||
37 | + { | ||
38 | + // вернем все как было | ||
39 | + $drop_view = 'drop view if exists w_cart_bills_view'; | ||
40 | + | ||
41 | + $this->execute($drop_view); | ||
42 | + | ||
43 | + } | ||
44 | +} | ||
45 | + | ||
46 | + | ||
47 | + |
1 | +<?php | ||
2 | + | ||
3 | +use yii\db\Migration; | ||
4 | + | ||
5 | +class m151030_133110_addCartView extends Migration | ||
6 | +{ | ||
7 | + public function up() | ||
8 | + { | ||
9 | + | ||
10 | + $view = <<< MySQL | ||
11 | + create view w_cart_view as | ||
12 | + select `w_cart_bills`.`id`, | ||
13 | + `w_cart_bills`.`account_id`, | ||
14 | + unix_timestamp(`w_cart_bills`.`timestamp`) as `dt`, | ||
15 | + `w_cart_bills`.`f1` as `user_name`, | ||
16 | + `w_cart_bills`.`f3` as `user_mail`, | ||
17 | + `w_cart`.`status` as `status_id`, | ||
18 | + `w_dic_statuses`.`name` as `status`, | ||
19 | + `w_cart`.`article`,`w_cart`.`brand`,`w_cart`.`descr`, | ||
20 | + `w_importers`.`name` as `importer`, | ||
21 | + `w_cart`.`count`,`w_cart`.`price`, | ||
22 | + `w_cart`.`import_id` | ||
23 | + from `w_cart` | ||
24 | + inner join `w_importers` on `w_importers`.`id` = `w_cart`.`import_id` | ||
25 | + inner join `w_cart_bills` on `w_cart_bills`.`id` = `w_cart`.`bill_id` | ||
26 | + inner join `w_dic_statuses` on `w_dic_statuses`.`id` = `w_cart`.`status`; | ||
27 | +MySQL; | ||
28 | + | ||
29 | + $this->execute($view); | ||
30 | + | ||
31 | + } | ||
32 | + | ||
33 | + public function down() | ||
34 | + { | ||
35 | + // вернем все как было | ||
36 | + $drop_view = 'drop view if exists w_cart_view'; | ||
37 | + | ||
38 | + $this->execute($drop_view); | ||
39 | + | ||
40 | + } | ||
41 | +} |
console/runtime/.gitignore