PageRenderTime 27ms CodeModel.GetById 11ms RepoModel.GetById 1ms app.codeStats 0ms

/protected/models/Stocks.php

https://gitlab.com/ilyales/vigma
PHP | 416 lines | 285 code | 62 blank | 69 comment | 41 complexity | 33031a22695da95972a606dca165ee81 MD5 | raw file
  1. <?php
  2. /**
  3. * This is the model class for table "stocks".
  4. *
  5. * The followings are the available columns in table 'stocks':
  6. * @property integer $id
  7. * @property string $chodname
  8. * @property integer $product_id
  9. * @property integer $stockcity_id
  10. * @property integer $val1
  11. * @property integer $val2
  12. * @property integer $val3
  13. * @property string $price1
  14. * @property string $price2
  15. * @property string $price3
  16. * @property integer $tmpInFileCheck
  17. */
  18. class Stocks extends CActiveRecord
  19. {
  20. /**
  21. * @return string the associated database table name
  22. */
  23. public function tableName()
  24. {
  25. return 'stocks';
  26. }
  27. /**
  28. * @return array validation rules for model attributes.
  29. */
  30. public function rules()
  31. {
  32. // NOTE: you should only define rules for those attributes that
  33. // will receive user inputs.
  34. return array(
  35. array('product_id, stockcity_id', 'required'),
  36. array('product_id, stockcity_id, val1, val2, val3, tmpInFileCheck', 'numerical', 'integerOnly'=>true),
  37. array('chodname', 'length', 'max'=>255),
  38. array('price1, price2, price3', 'length', 'max'=>12),
  39. // The following rule is used by search().
  40. // @todo Please remove those attributes that should not be searched.
  41. array('id, chodname, product_id, stockcity_id, val1, val2, val3, price1, price2, price3, tmpInFileCheck', 'safe', 'on'=>'search'),
  42. );
  43. }
  44. /**
  45. * @return array relational rules.
  46. */
  47. public function relations()
  48. {
  49. // NOTE: you may need to adjust the relation name and the related
  50. // class name for the relations automatically generated below.
  51. return array(
  52. );
  53. }
  54. /**
  55. * @return array customized attribute labels (name=>label)
  56. */
  57. public function attributeLabels()
  58. {
  59. return array(
  60. 'id' => 'ID',
  61. 'chodname' => 'Chodname',
  62. 'product_id' => 'Product',
  63. 'stockcity_id' => 'Stockcity',
  64. 'val1' => 'Val1',
  65. 'val2' => 'Val2',
  66. 'val3' => 'Val3',
  67. 'price1' => 'Price1',
  68. 'price2' => 'Price2',
  69. 'price3' => 'Price3',
  70. 'tmpInFileCheck' => 'Tmp In File Check',
  71. );
  72. }
  73. public static function clearCityTemplate($stockCityId)
  74. {
  75. $criteria = new CDbCriteria;
  76. $criteria->condition = "stockcity_id=:stockcity_id";
  77. $criteria->params = array(':stockcity_id'=>$stockCityId,
  78. );
  79. try
  80. {
  81. $res=$stocks = Stocks::model()->deleteAll($criteria);
  82. return true;
  83. } catch (Exception $e) {
  84. return false;
  85. }
  86. }
  87. public static function countForCity($stockCityId)
  88. {
  89. $criteria = new CDbCriteria;
  90. $criteria->condition = "stockcity_id=:stockcity_id";
  91. $criteria->params = array(':stockcity_id'=>$stockCityId,
  92. );
  93. $count = Stocks::model()->count($criteria);
  94. return $count;
  95. }
  96. //обнуляет tmpInFileCheck, что бы помечать при импорте выявить какие товары исчезли из файла-остатков для импортируемого города
  97. //исчезнувшие из файла остатков значаения удаляем из БД
  98. public static function clearFileInCheck()
  99. {
  100. $sql = "update stocks s SET s.tmpInFileCheck=0";
  101. $connection=Yii::app()->db;
  102. $command=$connection->createCommand($sql);
  103. $res=$command->execute();
  104. return true;
  105. }
  106. public static function import($filePath,$stockcity_id,$stockCityTemplate)
  107. {
  108. require_once Yii::app()->basePath . '/extensions/phpexcel/PHPExcel.php';
  109. require_once Yii::app()->basePath . '/extensions/phpexcel/PHPExcel/IOFactory.php';
  110. $startRow = intval($stockCityTemplate['startrownum']);
  111. $chodNameClm = intval($stockCityTemplate['chodnameclm']);
  112. $val1Clm = intval($stockCityTemplate['val1clm']);
  113. $val2Clm = intval($stockCityTemplate['val2clm']);
  114. $val3Clm = intval($stockCityTemplate['val3clm']);
  115. $price1Clm = intval($stockCityTemplate['price1clm']);
  116. $price2Clm = intval($stockCityTemplate['price2clm']);
  117. $price3Clm = intval($stockCityTemplate['price3clm']);
  118. Stocks::model()->clearFileInCheck();
  119. /** Identify the type of $inputFileName **/
  120. $inputFileType = PHPExcel_IOFactory::identify($filePath);
  121. /** Create a new Reader of the type that has been identified **/
  122. $objReader = PHPExcel_IOFactory::createReader($inputFileType);
  123. /** Load $inputFileName to a PHPExcel Object **/
  124. $objPHPExcel = $objReader->load($filePath);
  125. $objWorksheet = $objPHPExcel->getActiveSheet();
  126. // Get the highest row and column numbers referenced in the worksheet
  127. $highestRow = $objWorksheet->getHighestRow(); // e.g. 10
  128. $highestColumn = $objWorksheet->getHighestColumn(); // e.g 'F'
  129. $highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn); // e.g. 5
  130. $result = array('updateProds'=>array(),
  131. 'oneProds'=>array(),
  132. 'severalProds'=>array(),
  133. 'notFoundProds'=>array(),
  134. );
  135. $result['oneProds']['fileRows'] = array();
  136. $result['updateProds']['fileRows'] = array();
  137. $result['notNeedUpdateProds']['fileRows'] = array();
  138. $result['severalProds']['fileRows'] = array();
  139. $result['notFoundProds']['fileRows'] = array();
  140. $result['notInFile']['rows'] = array();
  141. $k=0;
  142. for ($row = $startRow; $row <= $highestRow; $row++) {
  143. $chodname = $objWorksheet->getCellByColumnAndRow($chodNameClm, $row)->getValue();
  144. // $chodname= mb_convert_encoding($chodname,"CP1252", 'UTF8');
  145. // $chodname= mb_convert_encoding($chodname,'UTF8', "CP1251");
  146. if ($chodname==null || $chodname=="") continue;
  147. if ($val1Clm!=null) $val1 = $objWorksheet->getCellByColumnAndRow($val1Clm, $row)->getValue();
  148. else $val1 = null;
  149. if ($val2Clm!=null) $val2 = $objWorksheet->getCellByColumnAndRow($val2Clm, $row)->getValue();
  150. else $val2= null;
  151. if ($val3Clm!=null) $val3 = $objWorksheet->getCellByColumnAndRow($val3Clm, $row)->getValue();
  152. else $val13= null;
  153. if ($price1Clm!=null )$price1 = $objWorksheet->getCellByColumnAndRow($price1Clm, $row)->getValue();
  154. else $price1=0;
  155. if ($price2Clm!=null )$price2 = $objWorksheet->getCellByColumnAndRow($price2Clm, $row)->getValue();
  156. else $price2=0;
  157. if ($price3Clm!=null )$price3 = $objWorksheet->getCellByColumnAndRow($price3Clm, $row)->getValue();
  158. else $price3=0;
  159. $val1 = intval(trim($val1));
  160. $val2 = intval(trim($val2));
  161. $val3 = intval(trim($val3));
  162. $price1 = floatval(trim($price1));
  163. $price2 = floatval(trim($price2));
  164. $price3 = floatval(trim($price3));
  165. if ($val1!=null && $val1!=0 && $price1!=0) $price1 = number_format(floatval(trim($price1))/$val1, 2, '.', '');
  166. if ($val2!=null && $val2!=0 && $price2!=0) $price2 = number_format(floatval(trim($price2))/$val2, 2, '.', '');
  167. if ($val3!=null && $val3!=0 && $price3!=0) $price3 = number_format(floatval(trim($price3))/$val3, 2, '.', '');
  168. //выделим из chodname ЧОД - всё что до первого пробела
  169. $words=preg_split("/[\s]+/", $chodname);
  170. $chod = $words[0];
  171. $fileRow = array('chodname'=>$chodname,
  172. 'chod'=>$chod,
  173. 'val1'=>$val1,
  174. 'val2'=>$val2,
  175. 'val3'=>$val3,
  176. 'price1'=>$price1,
  177. 'price2'=>$price2,
  178. 'price3'=>$price3,
  179. );
  180. $res = Stocks::model()->importRow($stockcity_id,$fileRow,$result);
  181. $k++;
  182. if ($res==false)
  183. {
  184. return false;
  185. }
  186. //if ($row==10) break;
  187. }
  188. //var_dump($k);
  189. // найдем исчезнувшие из файла отстаков товары, это те у которых tmpInFileCheck остался равен нулю для импортируемого города
  190. $criteria = new CDbCriteria;
  191. $criteria->condition = "tmpInFileCheck=0 AND stockcity_id=:stockcity_id";
  192. $criteria->params = array(':stockcity_id'=>$stockcity_id,
  193. );
  194. $stocks = Stocks::model()->findAll($criteria);
  195. foreach ($stocks as $stock)
  196. {
  197. $row = array('chodname'=>$stock->chodname,
  198. );
  199. $row['product'] = Products::model()->getProductWithFullInfo($stock->product_id); //для карточки товара
  200. $result['notInFile']['fileRows'][] = $row;
  201. $stock->val1 = 0;
  202. $stock->val2 = 0;
  203. $stock->val3 = 0;
  204. $stock->price1 = 0;
  205. $stock->price2 =0;
  206. $stock->price3 = 0;
  207. $stock->update();
  208. }
  209. $result['count'] = Stocks::model()->countForCity($stockcity_id);
  210. return $result;
  211. }
  212. private static function importRow($stockcity_id,$fileRow,&$result)
  213. {
  214. //проверим есть ли для $fileRow['chodname'] запись в таблице Stocks
  215. $criteria = new CDbCriteria;
  216. $criteria->condition = "chodname=:chodname AND stockcity_id=:stockcity_id";
  217. $criteria->params = array(':chodname'=>$fileRow['chodname'],
  218. ':stockcity_id'=>$stockcity_id,
  219. );
  220. $stock = Stocks::model()->find($criteria);
  221. //если нашелся,то в случае необходимости - обновим
  222. if ($stock!=null)
  223. {
  224. if ($stock->val1!=$fileRow['val1'] || $stock->val2!=$fileRow['val2'] || $stock->val3!=$fileRow['val3'] || $stock->price1!=$fileRow['price1'] || $stock->price2!=$fileRow['price2'] || $stock->price3!=$fileRow['price3'])
  225. {
  226. $stock->val1 = $fileRow['val1'];
  227. $stock->val2 = $fileRow['val2'];
  228. $stock->val3 = $fileRow['val3'];
  229. $stock->price1 = $fileRow['price1'];
  230. $stock->price2 = $fileRow['price2'];
  231. $stock->price3 = $fileRow['price3'];
  232. $stock->tmpInFileCheck = 1;
  233. $stock->update();
  234. $fileRow['product'] = Products::model()->getProductWithFullInfo($stock->product_id); //для карточки товара
  235. $result['updateProds']['fileRows'][] = $fileRow;
  236. }
  237. else
  238. {
  239. $stock->tmpInFileCheck = 1;
  240. $stock->update();
  241. $fileRow['product'] = Products::model()->getProductWithFullInfo($stock->product_id); //для карточки товара
  242. $result['notNeedUpdateProds']['fileRows'][] = $fileRow;
  243. }
  244. }
  245. //если не нашелся, выделим ЧОД из chodname и сделаем поиск по ЧОД в inputRequest
  246. else
  247. {
  248. $products = Products::model()->findProductsByStocksChod($fileRow['chod']);
  249. if (count($products)>1)
  250. {
  251. $result['severalProds']['fileRows'][] = $fileRow;
  252. }
  253. else if (count($products)==1)
  254. {
  255. $fileRow['original_name'] = $products[0]['original_name'];
  256. $fileRow['chod_display'] = $products[0]['chod_display'];
  257. $fileRow['product_id'] = $products[0]['id'];
  258. $result['oneProds']['fileRows'][] = $fileRow;
  259. }
  260. else if (count($products)==0)
  261. {
  262. $result['notFoundProds']['fileRows'][] = $fileRow;
  263. }
  264. }
  265. return true;
  266. }
  267. public static function newStock($data)
  268. {
  269. $result = array('status'=>"",
  270. 'info'=>array(),
  271. );
  272. //проверим если есть ли в таблице stock запись с таикм же product_id и stockcity_id
  273. $criteria = new CDbCriteria;
  274. $criteria->condition = "product_id=:product_id AND stockcity_id=:stockcity_id";
  275. $criteria->params = array(':product_id'=>$data->product_id,
  276. ':stockcity_id'=>$data->stockcity_id,
  277. );
  278. $stock = Stocks::model()->find($criteria);
  279. if ($stock!=null)
  280. {
  281. $product = Products::model()->findByPk($data->product_id);
  282. $result['status'] = "alreadyHaveThisCityStock";
  283. $result['info'] = array('prodcut_namechod'=>$product->original_name." ".$product->chod_display);
  284. return $result;
  285. }
  286. $stock = new Stocks;
  287. $stock->product_id = $data->product_id;
  288. $stock->stockcity_id = $data->stockcity_id;
  289. $stock->chodname = $data->chodname;
  290. $stock->val1 = $data->val1;
  291. $stock->val2 = $data->val2;
  292. $stock->val3 = $data->val3;
  293. $stock->price1 = $data->price1;
  294. $stock->price2 = $data->price2;
  295. $stock->price3 = $data->price3;
  296. $res = $stock->save();
  297. if ($res==false)
  298. {
  299. $result['status'] = "error";
  300. return $result;
  301. }
  302. $result['status'] = "ok";
  303. return $result;
  304. }
  305. public static function updateChodname($id,$chodname)
  306. {
  307. $stock = Stocks::model()->findByPk($id);
  308. if ($stock == null) return false;
  309. $stock->chodname = $chodname;
  310. $res = $stock->update();
  311. return $res;
  312. }
  313. /**
  314. * Retrieves a list of models based on the current search/filter conditions.
  315. *
  316. * Typical usecase:
  317. * - Initialize the model fields with values from filter form.
  318. * - Execute this method to get CActiveDataProvider instance which will filter
  319. * models according to data in model fields.
  320. * - Pass data provider to CGridView, CListView or any similar widget.
  321. *
  322. * @return CActiveDataProvider the data provider that can return the models
  323. * based on the search/filter conditions.
  324. */
  325. public function search()
  326. {
  327. // @todo Please modify the following code to remove attributes that should not be searched.
  328. $criteria=new CDbCriteria;
  329. $criteria->compare('id',$this->id);
  330. $criteria->compare('chodname',$this->chodname,true);
  331. $criteria->compare('product_id',$this->product_id);
  332. $criteria->compare('stockcity_id',$this->stockcity_id);
  333. $criteria->compare('val1',$this->val1);
  334. $criteria->compare('val2',$this->val2);
  335. $criteria->compare('val3',$this->val3);
  336. $criteria->compare('price1',$this->price1,true);
  337. $criteria->compare('price2',$this->price2,true);
  338. $criteria->compare('price3',$this->price3,true);
  339. $criteria->compare('tmpInFileCheck',$this->tmpInFileCheck);
  340. return new CActiveDataProvider($this, array(
  341. 'criteria'=>$criteria,
  342. ));
  343. }
  344. /**
  345. * Returns the static model of the specified AR class.
  346. * Please note that you should have this exact method in all your CActiveRecord descendants!
  347. * @param string $className active record class name.
  348. * @return Stocks the static model class
  349. */
  350. public static function model($className=__CLASS__)
  351. {
  352. return parent::model($className);
  353. }
  354. }