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.

239 lines
8.5KB

  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\Alwaysdata;
  39. use common\helpers\GlobalParam;
  40. use common\logic\Distribution\Distribution\Model\Distribution;
  41. use common\logic\Order\Order\Model\Order;
  42. use common\logic\PointSale\PointSale\Model\PointSale;
  43. use common\logic\Product\Product\Model\Product;
  44. use common\logic\User\User\Model\User;
  45. use Yii;
  46. use yii\filters\AccessControl;
  47. use common\forms\LoginForm;
  48. use yii\filters\VerbFilter;
  49. /**
  50. * Site controller
  51. */
  52. class SiteController extends BackendController
  53. {
  54. /**
  55. * @inheritdoc
  56. */
  57. public function behaviors()
  58. {
  59. return [
  60. 'access' => [
  61. 'class' => AccessControl::class,
  62. 'rules' => [
  63. [
  64. 'actions' => ['login', 'error'],
  65. 'allow' => true,
  66. ],
  67. [
  68. 'actions' => ['logout', 'index'],
  69. 'allow' => true,
  70. 'roles' => ['@'],
  71. 'matchCallback' => function ($rule, $action) {
  72. return $this->getUserManager()->hasAccessBackend();
  73. }
  74. ],
  75. [
  76. 'actions' => ['change-producer'],
  77. 'allow' => true,
  78. 'roles' => ['@'],
  79. 'matchCallback' => function ($rule, $action) {
  80. return $this->getUserManager()->getCurrentStatus() == User::STATUS_ADMIN;
  81. }
  82. ],
  83. ],
  84. ],
  85. 'verbs' => [
  86. 'class' => VerbFilter::class,
  87. 'actions' => [
  88. ],
  89. ],
  90. ];
  91. }
  92. /**
  93. * @inheritdoc
  94. */
  95. public function actions()
  96. {
  97. return [
  98. 'error' => [
  99. 'class' => 'yii\web\ErrorAction',
  100. ],
  101. ];
  102. }
  103. /**
  104. * Affiche le tableau de bord du backend avec les dernières commandes
  105. * réalisées, les dernières inscriptions, la liste des clients ayant un crédit
  106. * négatif etc.
  107. *
  108. * @return mixed
  109. */
  110. public function actionIndex()
  111. {
  112. $userManager = $this->getUserManager();
  113. $producerManager = $this->getProducerManager();
  114. $optionDashboardNumberDistributions = $producerManager->getConfig('option_dashboard_number_distributions');
  115. $dashboardNumberDistributions = $optionDashboardNumberDistributions ? $optionDashboardNumberDistributions : 3;
  116. $optionDashboardDateStart = $producerManager->getConfig('option_dashboard_date_start');
  117. $optionDashboardDateEnd = $producerManager->getConfig('option_dashboard_date_end');
  118. $queryDistributions = Distribution::find()->with('order');
  119. if ($optionDashboardDateStart || $optionDashboardDateEnd) {
  120. if ($optionDashboardDateStart) {
  121. $queryDistributions->andWhere(['>=', 'distribution.date', $optionDashboardDateStart]);
  122. }
  123. if ($optionDashboardDateEnd) {
  124. $queryDistributions->andWhere(['<=', 'distribution.date', $optionDashboardDateEnd]);
  125. }
  126. } else {
  127. $queryDistributions->andWhere(['>=', 'distribution.date', date('Y-m-d')]);
  128. }
  129. $distributionsArray = $queryDistributions->andWhere([
  130. 'distribution.id_producer' => GlobalParam::getCurrentProducerId(),
  131. 'distribution.active' => 1
  132. ])
  133. ->orderBy('date ASC')
  134. ->limit($dashboardNumberDistributions)
  135. ->all();
  136. // dernières commandes
  137. $paramsOrders = [];
  138. if ($optionDashboardDateStart || $optionDashboardDateEnd) {
  139. $conditionsOrders = '';
  140. if ($optionDashboardDateStart) {
  141. $conditionsOrders .= 'distribution.date >= :date_start';
  142. $paramsOrders[':date_start'] = $optionDashboardDateStart;
  143. }
  144. if ($optionDashboardDateEnd) {
  145. if ($optionDashboardDateStart) {
  146. $conditionsOrders .= ' AND ';
  147. }
  148. $conditionsOrders .= 'distribution.date <= :date_end';
  149. $paramsOrders[':date_end'] = $optionDashboardDateEnd;
  150. }
  151. } else {
  152. $conditionsOrders = 'distribution.date >= :date_start';
  153. $paramsOrders[':date_start'] = date('Y-m-d 00:00:00');
  154. }
  155. $ordersArray = Order::searchAll([], [
  156. 'orderby' => 'date DESC',
  157. 'conditions' => $conditionsOrders . ' AND (origin = \'' . Order::ORIGIN_USER . '\' OR origin = \'' . Order::ORIGIN_ADMIN . '\' OR (origin = \'' . Order::ORIGIN_AUTO . '\' AND (date_update IS NOT NULL OR date_delete IS NOT NULL)))',
  158. 'params' => $paramsOrders,
  159. ]);
  160. // clients
  161. $usersArray = $userManager->queryUsersBy()
  162. ->orderBy('created_at DESC')
  163. ->limit(5)
  164. ->all();
  165. $usersNegativeCredit = $userManager->queryUsersBy(['id_producer' => GlobalParam::getCurrentProducerId()])
  166. ->andWhere('user_producer.credit < 0')
  167. ->all();
  168. $producerCurrent = GlobalParam::getCurrentProducer();
  169. $productsCount = Product::searchCount();
  170. $pointsSaleCount = PointSale::searchCount();
  171. return $this->render('index', [
  172. 'distributionsArray' => $distributionsArray,
  173. 'ordersArray' => $ordersArray,
  174. 'usersArray' => $usersArray,
  175. 'usersNegativeCredit' => $usersNegativeCredit,
  176. 'producer' => $producerCurrent,
  177. 'productsCount' => $productsCount,
  178. 'pointsSaleCount' => $pointsSaleCount
  179. ]);
  180. }
  181. /**
  182. * Affiche la page de connexion.
  183. */
  184. public function actionLogin()
  185. {
  186. if (!\Yii::$app->user->isGuest) {
  187. return $this->goHome();
  188. }
  189. $model = new LoginForm();
  190. if ($model->load(\Yii::$app->request->post()) && $model->login()) {
  191. return $this->goBack();
  192. } else {
  193. return $this->render('login', [
  194. 'model' => $model,
  195. ]);
  196. }
  197. }
  198. /**
  199. * Déconnecte l'utilisateur et le redirige à la page d'accueil.
  200. */
  201. public function actionLogout()
  202. {
  203. Yii::$app->user->logout();
  204. return $this->goHome();
  205. }
  206. /**
  207. * Change le producteur courant de l'utilisateur connecté.
  208. * Permet de passer d'un producteur à un autre en tant qu'administrateur.
  209. */
  210. public function actionChangeProducer(int $id)
  211. {
  212. Yii::$app->user->identity->id_producer = $id;
  213. Yii::$app->user->identity->save();
  214. $this->redirect(['site/index']);
  215. }
  216. }