You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

ProductController.php 13KB

8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377
  1. <?php
  2. /**
  3. * Copyright distrib (2018)
  4. *
  5. * contact@opendistrib.net
  6. *
  7. * Ce logiciel est un programme informatique servant à aider les producteurs
  8. * à distribuer leur production en circuits courts.
  9. *
  10. * Ce logiciel est régi par la licence CeCILL soumise au droit français et
  11. * respectant les principes de diffusion des logiciels libres. Vous pouvez
  12. * utiliser, modifier et/ou redistribuer ce programme sous les conditions
  13. * de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA
  14. * sur le site "http://www.cecill.info".
  15. *
  16. * En contrepartie de l'accessibilité au code source et des droits de copie,
  17. * de modification et de redistribution accordés par cette licence, il n'est
  18. * offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons,
  19. * seule une responsabilité restreinte pèse sur l'auteur du programme, le
  20. * titulaire des droits patrimoniaux et les concédants successifs.
  21. *
  22. * A cet égard l'attention de l'utilisateur est attirée sur les risques
  23. * associés au chargement, à l'utilisation, à la modification et/ou au
  24. * développement et à la reproduction du logiciel par l'utilisateur étant
  25. * donné sa spécificité de logiciel libre, qui peut le rendre complexe à
  26. * manipuler et qui le réserve donc à des développeurs et des professionnels
  27. * avertis possédant des connaissances informatiques approfondies. Les
  28. * utilisateurs sont donc invités à charger et tester l'adéquation du
  29. * logiciel à leurs besoins dans des conditions permettant d'assurer la
  30. * sécurité de leurs systèmes et ou de leurs données et, plus généralement,
  31. * à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.
  32. *
  33. * Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
  34. * pris connaissance de la licence CeCILL, et que vous en avez accepté les
  35. * termes.
  36. */
  37. namespace backend\controllers;
  38. use common\helpers\GlobalParam;
  39. use common\logic\Distribution\ProductDistribution\Model\ProductDistribution;
  40. use common\logic\PointSale\PointSale\Model\PointSale;
  41. use common\logic\Product\Product\Model\Product;
  42. use common\logic\Product\Product\Model\ProductSearch;
  43. use common\logic\Product\ProductPointSale\Model\ProductPointSale;
  44. use common\logic\Product\ProductPrice\Model\ProductPrice;
  45. use common\logic\Product\ProductPrice\Model\ProductPriceSearch;
  46. use common\logic\User\UserProducer\Model\UserProducer;
  47. use Yii;
  48. use yii\filters\AccessControl;
  49. use yii\helpers\Html;
  50. use yii\web\NotFoundHttpException;
  51. use yii\filters\VerbFilter;
  52. use common\helpers\Upload;
  53. /**
  54. * ProduitController implements the CRUD actions for Produit model.
  55. */
  56. class ProductController extends BackendController
  57. {
  58. var $enableCsrfValidation = false;
  59. public function behaviors()
  60. {
  61. return [
  62. 'verbs' => [
  63. 'class' => VerbFilter::class,
  64. 'actions' => [
  65. ],
  66. ],
  67. 'access' => [
  68. 'class' => AccessControl::class,
  69. 'rules' => [
  70. [
  71. 'allow' => true,
  72. 'roles' => ['@'],
  73. 'matchCallback' => function ($rule, $action) {
  74. return $this->getUserManager()->hasAccessBackend();
  75. }
  76. ]
  77. ],
  78. ],
  79. ];
  80. }
  81. /**
  82. * Liste les modèles Produit.
  83. *
  84. * @return mixed
  85. */
  86. public function actionIndex()
  87. {
  88. $searchModel = new ProductSearch();
  89. $dataProvider = $searchModel->search(\Yii::$app->request->queryParams);
  90. return $this->render('index', [
  91. 'searchModel' => $searchModel,
  92. 'dataProvider' => $dataProvider,
  93. ]);
  94. }
  95. /**
  96. * Crée un Product.
  97. */
  98. public function actionCreate()
  99. {
  100. $productManager = $this->getProductManager();
  101. $distributionManager = $this->getDistributionManager();
  102. $model = $productManager->instanciateProduct();
  103. $model->active = 1;
  104. $model->id_producer = GlobalParam::getCurrentProducerId();
  105. $model->monday = 1;
  106. $model->tuesday = 1;
  107. $model->wednesday = 1;
  108. $model->thursday = 1;
  109. $model->friday = 1;
  110. $model->saturday = 1;
  111. $model->sunday = 1;
  112. $model->available_on_points_sale = 1;
  113. if ($model->load(\Yii::$app->request->post()) && $productManager->saveCreate($model)) {
  114. $lastProductOrder = Product::find()->where('id_producer = :id_producer')->params([':id_producer' => GlobalParam::getCurrentProducerId()])->orderBy('order DESC')->one();
  115. if ($lastProductOrder) {
  116. $model->order = ++$lastProductOrder->order;
  117. }
  118. Upload::uploadFile($model, 'photo');
  119. $productManager->saveUpdate($model);
  120. $this->processAvailabilityPointsSale($model);
  121. $distributionManager->addProductIncomingDistributions($model);
  122. $this->setFlash('success', 'Produit <strong>' . Html::encode($model->name) . '</strong> ajouté');
  123. return $this->redirect(['index']);
  124. } else {
  125. return $this->render('create', [
  126. 'model' => $model,
  127. ]);
  128. }
  129. }
  130. /**
  131. * Modifie un Product.
  132. */
  133. public function actionUpdate($id)
  134. {
  135. $productManager = $this->getProductManager();
  136. $distributionManager = $this->getDistributionManager();
  137. $request = Yii::$app->request;
  138. $model = $this->findModel($id);
  139. foreach ($model->productPointSale as $productPointSale) {
  140. $model->pointsSale[] = $productPointSale->id_point_sale;
  141. }
  142. $photoFilenameOld = $model->photo;
  143. if ($model->load(\Yii::$app->request->post()) && $productManager->saveUpdate($model)) {
  144. Upload::uploadFile($model, 'photo', $photoFilenameOld);
  145. $deletePhoto = $request->post('delete_photo', 0);
  146. if ($deletePhoto) {
  147. $model->photo = '';
  148. $model->save();
  149. }
  150. $this->processAvailabilityPointsSale($model);
  151. if ($model->apply_distributions) {
  152. $distributionManager->addProductIncomingDistributions($model);
  153. }
  154. $this->setFlash('success', 'Produit <strong>' . Html::encode($model->name) . '</strong> modifié');
  155. return $this->redirect(['index']);
  156. }
  157. return $this->render('update/update', [
  158. 'model' => $model,
  159. 'action' => 'update',
  160. ]);
  161. }
  162. /**
  163. * Traite les accès restreints d'un point de vente.
  164. */
  165. public function processAvailabilityPointsSale($product)
  166. {
  167. $pointSaleManager = $this->getPointSaleManager();
  168. $productPointSaleManager = $this->getProductPointSaleManager();
  169. ProductPointSale::deleteAll(['id_product' => $product->id]);
  170. if (is_array($product->pointsSale) && count($product->pointsSale)) {
  171. foreach ($product->pointsSale as $key => $idPointSale) {
  172. $pointSale = $pointSaleManager->findOnePointSaleById($idPointSale);
  173. if ($pointSale) {
  174. $productPointSaleManager->createProductPointSale(
  175. $product,
  176. $pointSale,
  177. ($product->available_on_points_sale) ? false : true
  178. );
  179. }
  180. }
  181. }
  182. }
  183. public function actionPricesList(int $id)
  184. {
  185. $model = $this->findModel($id);
  186. $searchModel = new ProductPriceSearch();
  187. $searchModel->id_product = $id;
  188. $dataProvider = $searchModel->search(array_merge(\Yii::$app->request->queryParams, [
  189. 'id_product' => $id
  190. ]));
  191. $userProducerWithProductPercent = UserProducer::searchAll([], [
  192. 'join_with' => ['user'],
  193. 'conditions' => 'user_producer.product_price_percent != 0',
  194. ]);
  195. $pointSaleWithProductPercent = PointSale::searchAll([], [
  196. 'conditions' => 'point_sale.product_price_percent != 0'
  197. ]);
  198. return $this->render('update/prices/list', [
  199. 'model' => $model,
  200. 'action' => 'prices-list',
  201. 'searchModel' => $searchModel,
  202. 'dataProvider' => $dataProvider,
  203. 'userProducerWithProductPercent' => $userProducerWithProductPercent,
  204. 'pointSaleWithProductPercent' => $pointSaleWithProductPercent,
  205. ]);
  206. }
  207. public function actionPricesCreate($idProduct)
  208. {
  209. $model = new ProductPrice();
  210. $model->id_product = $idProduct;
  211. $modelProduct = $this->findModel($idProduct);
  212. if ($model->load(\Yii::$app->request->post())) {
  213. $conditionsProductPriceExist = [
  214. 'id_product' => $idProduct,
  215. 'id_user' => $model->id_user ?? null,
  216. 'id_user_group' => $model->id_user_group ?? null,
  217. 'id_point_sale' => $model->id_point_sale ?? null,
  218. 'from_quantity' => $model->from_quantity ?? null,
  219. ];
  220. $productPriceExist = ProductPrice::findOne($conditionsProductPriceExist);
  221. if ($productPriceExist) {
  222. $productPriceExist->delete();
  223. $this->setFlash('warning', 'Un prix existait déjà pour cet utilisateur / point de vente, il a été supprimé.');
  224. }
  225. if ($model->save()) {
  226. $this->setFlash('success', 'Le prix a bien été ajouté.');
  227. return $this->redirect(['product/prices-list', 'id' => $idProduct]);
  228. }
  229. }
  230. return $this->render('update/prices/create', [
  231. 'model' => $model,
  232. 'modelProduct' => $modelProduct,
  233. ]);
  234. }
  235. public function actionPricesUpdate($id)
  236. {
  237. $model = $this->findModelProductPrice($id);
  238. $modelProduct = $this->findModel($model->id_product);
  239. if ($model->load(\Yii::$app->request->post()) && $model->save()) {
  240. $this->setFlash('success', 'Prix modifié');
  241. return $this->redirect(['product/prices-list', 'id' => $model->id_product]);
  242. }
  243. return $this->render('update/prices/update', [
  244. 'model' => $model,
  245. 'modelProduct' => $modelProduct,
  246. 'action' => 'prices-update',
  247. ]);
  248. }
  249. public function actionPricesDelete($id)
  250. {
  251. $productPrice = $this->findModelProductPrice($id);
  252. $productPrice->delete();
  253. $this->setFlash('success', 'Prix supprimé');
  254. return $this->redirect(['product/prices-list', 'id' => $productPrice->id_product]);
  255. }
  256. /**
  257. * Supprime un Product.
  258. */
  259. public function actionDelete(int $id, bool $confirm = false)
  260. {
  261. $product = $this->findModel($id);
  262. if ($confirm) {
  263. $product->delete();
  264. ProductDistribution::deleteAll(['id_product' => $id]);
  265. $this->setFlash('success', 'Produit <strong>' . Html::encode($product->name) . '</strong> supprimé');
  266. } else {
  267. $this->setFlash('info', 'Souhaitez-vous vraiment supprimer le produit <strong>' . Html::encode($product->name) . '</strong> ? '
  268. . Html::a('Oui', ['product/delete', 'id' => $id, 'confirm' => 1], ['class' => 'btn btn-default']) . ' ' . Html::a('Non', ['product/index'], ['class' => 'btn btn-default']));
  269. }
  270. return $this->redirect(['index']);
  271. }
  272. /**
  273. * Modifie l'ordre des produits.
  274. */
  275. public function actionOrder()
  276. {
  277. $array = Yii::$app->request->post('array');
  278. $orderArray = json_decode(stripslashes($array));
  279. foreach ($orderArray as $id => $order) {
  280. $product = $this->findModel($id);
  281. $product->order = $order;
  282. $product->save();
  283. }
  284. }
  285. public function actionAjaxToggleActive($id, $active)
  286. {
  287. \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
  288. $distributionManager = $this->getDistributionManager();
  289. $product = $this->findModel($id);
  290. $product->active = (int) $active;
  291. $product->save();
  292. $distributionManager->addProductIncomingDistributions($product);
  293. return ['success', 'id' => $id, 'active' => $active];
  294. }
  295. /**
  296. * Recherche un produit en fonction de son ID.
  297. */
  298. protected function findModel(int $id)
  299. {
  300. $productManager = $this->getProductManager();
  301. if (($product = $productManager->findOneProductById($id)) !== null) {
  302. return $product;
  303. } else {
  304. throw new NotFoundHttpException('The requested page does not exist.');
  305. }
  306. }
  307. protected function findModelProductPrice($id)
  308. {
  309. $productPriceManager = $this->getProductPriceManager();
  310. if (($productPrice = $productPriceManager->findOneProductPriceById($id)) !== null) {
  311. return $productPrice;
  312. } else {
  313. throw new NotFoundHttpException('The requested page does not exist.');
  314. }
  315. }
  316. }