private function profileDefault($mode = 'run', $priceType = null) { if ($mode == 'info') { return ['name' => 'Базовый', 'description' => 'Профиль по умолчанию']; } if ($mode == 'run') { $offers = \app\models\Offers::find()->all(); $arCsv = ['Название;Поставщик;Исходная цена;Посчитанная цена;Количество']; $providers = \app\models\Providers::find()->all(); $arProviders = []; foreach ($providers as $value) { $arProviders[$value->id] = $value->name; } foreach ($offers as $offer) { $name = \app\components\Goods::getName($offer->goods_id); $provider = $arProviders[$offer->providers_id]; $price = $offer->price; $quantity = $offer->quantity; // print $name; $calcPrice = $price * \app\components\CalculationDiscount::calc($offer->goods_id, $offer->providers_id, $priceType); // $calcPrice = \app\components\CalculationDiscount::calc($offer); $arCsv[] = "{$name};{$provider};{$price};{$calcPrice};{$quantity}"; } $csv = implode(chr(10), $arCsv); $this->_unloadStr('prise.csv', iconv('utf-8', 'windows-1251', $csv)); } }
public function run() { // Ключ кеша $key = $this->providerId . '_' . $this->filename . '_' . filectime(Yii::$app->params['uploadFolder'] . $this->filename); if (Yii::$app->cache->exists($key)) { $arRes = Yii::$app->cache->get($key); } else { // Удалить старые предложения поставщика \app\models\Offers::deleteAll('providers_id = :providers_id', [':providers_id' => $this->providerId]); // Сохранить дату последней загрузки прайса $provider = \app\models\Providers::findOne($this->providerId); $provider->date_last_down = time(); $provider->save(); // Получить файл $arrCSV = file(Yii::$app->params['uploadFolder'] . $this->filename); // Обработка каждой строки файла $arrToAccord = []; foreach ($arrCSV as $k => $strCSV) { // Строку в массив $arStrCSV = str_getcsv($strCSV, ';'); // Пропустить неполные строки if (strlen(trim($arStrCSV[$this->arrAccords['name']])) == 0 || strlen(trim($arStrCSV[$this->arrAccords['price']])) == 0 || strlen(trim($arStrCSV[$this->arrAccords['quantity']])) == 0) { continue; } // Нормализовать массив строки от текущего поставщика $arResRow = $this->normalizeStrOfPrice($arStrCSV); // Получить тип товара $arResRow = $this->getGoodType($arResRow); if (isset($this->arrAccords['identifier'])) { // Задан артикул $res = $this->getAccordsByIdentifier($arResRow); } else { // Не задан артикул $res = $this->getAccordsByName($arResRow); } if ($res instanceof Accords) { // Есть соответствие // Пишем в таблицу предложений $offer = new \app\models\Offers(); $offer->quantity = $arResRow['quantity']; $offer->price = $arResRow['price']; $offer->goods_id = $res->goods_id; $offer->providers_id = $res->providers_id; $offer->save(); } else { // Нет соответствия // Вывести на согласование $arResRow['k'] = $k; $arrToAccord[$k] = $arResRow; } // if ($k > 10) // break; // break; } // Сохранить полученные данные в кеш $arRes = ['arrToAccord' => $arrToAccord, 'arGoodTypes' => $this->arGoodTypes, 'providerId' => $this->providerId, 'key' => $key]; Yii::$app->cache->set($key, $arRes); } return $arRes; }
/** * Creates data provider instance with search query applied * * @param array $params * * @return ActiveDataProvider */ public function search($params) { $query = Offers::find(); $dataProvider = new ActiveDataProvider(['query' => $query]); $this->load($params); if (!$this->validate()) { // uncomment the following line if you do not want to return any records when validation fails // $query->where('0=1'); return $dataProvider; } $query->andFilterWhere(['id' => $this->id, 'quantity' => $this->quantity, 'fix_price' => $this->fix_price, 'providers_id' => $this->providers_id, 'goods_id' => $this->goods_id, 'price' => $this->price]); return $dataProvider; }
/** * @return \yii\db\ActiveQuery */ public function getOffers() { return $this->hasMany(Offers::className(), ['goods_id' => 'id']); }