Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

309 lines
11KB

  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\models\Subscription;
  40. use Yii;
  41. use yii\filters\AccessControl;
  42. use yii\web\Controller;
  43. use common\models\LoginForm;
  44. use common\models\User;
  45. use yii\filters\VerbFilter;
  46. use common\models\Product;
  47. use common\models\PointSale;
  48. use common\models\Producer;
  49. use common\models\Distribution;
  50. use common\models\Order;
  51. /**
  52. * Site controller
  53. */
  54. class SiteController extends BackendController
  55. {
  56. /**
  57. * @inheritdoc
  58. */
  59. public function behaviors()
  60. {
  61. return [
  62. 'access' => [
  63. 'class' => AccessControl::className(),
  64. 'rules' => [
  65. [
  66. 'actions' => ['login', 'error'],
  67. 'allow' => true,
  68. ],
  69. [
  70. 'actions' => ['logout', 'index'],
  71. 'allow' => true,
  72. 'roles' => ['@'],
  73. 'matchCallback' => function ($rule, $action) {
  74. return User::hasAccessBackend();
  75. }
  76. ],
  77. [
  78. 'actions' => ['change-producer', 'bug-subscription-payment'],
  79. 'allow' => true,
  80. 'roles' => ['@'],
  81. 'matchCallback' => function ($rule, $action) {
  82. return User::getCurrentStatus() == User::STATUS_ADMIN;
  83. }
  84. ],
  85. ],
  86. ],
  87. 'verbs' => [
  88. 'class' => VerbFilter::className(),
  89. 'actions' => [
  90. ],
  91. ],
  92. ];
  93. }
  94. /**
  95. * @inheritdoc
  96. */
  97. public function actions()
  98. {
  99. return [
  100. 'error' => [
  101. 'class' => 'yii\web\ErrorAction',
  102. ],
  103. ];
  104. }
  105. public function actionBugSubscriptionPayment($fix = 0)
  106. {
  107. $producerArray = Producer::find()->where(['active' => 1])->all();
  108. //print_r($producerArray);
  109. //die();
  110. foreach ($producerArray as $producer) {
  111. $orderArray = Order::searchAll([
  112. 'distribution.id_producer' => $producer->id,
  113. 'origin' => Order::ORIGIN_AUTO,
  114. 'auto_payment' => 0,
  115. ], [
  116. 'conditions' => 'date_delete IS NULL AND point_sale.credit_functioning = \'mandatory\' AND subscription.auto_payment = 1 AND order.date > \'2022-12-01\'',
  117. 'join_with' => ['pointSale', 'subscription', 'distribution'],
  118. ]);
  119. /*$orderArray = Order::searchAll([
  120. 'distribution.id_producer' => $producer->id,
  121. 'origin' => Order::ORIGIN_AUTO,
  122. 'auto_payment' => 0,
  123. ], [
  124. 'conditions' => 'date_delete IS NULL AND point_sale.credit_functioning = \'optional\' AND subscription.auto_payment = 1 AND order.date > \'2022-12-01\'',
  125. 'join_with' => ['pointSale', 'subscription', 'distribution'],
  126. ]);*/
  127. $count = 0;
  128. if($orderArray) {
  129. foreach($orderArray as $order) {
  130. $amountRemaining = $order->getAmount(Order::AMOUNT_REMAINING);
  131. if($amountRemaining >= 0.01) {
  132. $count ++;
  133. }
  134. }
  135. }
  136. if($count) {
  137. echo '<h1>' . $producer->name . '</h1>';
  138. echo '<p>' . $count . ' commandes.</p>';
  139. echo '<ul>';
  140. foreach($orderArray as $order) {
  141. $amountRemaining = $order->getAmount(Order::AMOUNT_REMAINING);
  142. if($amountRemaining) {
  143. echo '<li>#'.$order->id.' : '.$order->distribution->date.' / '.$order->pointSale->name.' / '.$order->getAmount(Order::AMOUNT_REMAINING, true);
  144. if($fix) {
  145. $order->processCredit();
  146. echo ' (payée)';
  147. }
  148. echo '</li>';
  149. }
  150. }
  151. echo '</ul>';
  152. }
  153. }
  154. die();
  155. }
  156. /**
  157. * Affiche le tableau de bord du backend avec les dernières commandes
  158. * réalisée, les dernières inscriptions, la liste des clients ayant un crédit
  159. * négatif etc.
  160. *
  161. * @return mixed
  162. */
  163. public function actionIndex()
  164. {
  165. // commandes
  166. $optionDashboardNumberDistributions = Producer::getConfig('option_dashboard_number_distributions');
  167. $dashboardNumberDistributions = $optionDashboardNumberDistributions ? $optionDashboardNumberDistributions : 3;
  168. $optionDashboardDateStart = Producer::getConfig('option_dashboard_date_start');
  169. $optionDashboardDateEnd = Producer::getConfig('option_dashboard_date_end');
  170. $queryDistributions = Distribution::find()->with('order');
  171. if ($optionDashboardDateStart || $optionDashboardDateEnd) {
  172. if ($optionDashboardDateStart) {
  173. $queryDistributions->andWhere(['>=', 'distribution.date', $optionDashboardDateStart]);
  174. }
  175. if ($optionDashboardDateEnd) {
  176. $queryDistributions->andWhere(['<=', 'distribution.date', $optionDashboardDateEnd]);
  177. }
  178. } else {
  179. $queryDistributions->andWhere(['>=', 'distribution.date', date('Y-m-d')]);
  180. }
  181. $distributionsArray = $queryDistributions->andWhere([
  182. 'distribution.id_producer' => GlobalParam::getCurrentProducerId(),
  183. 'distribution.active' => 1
  184. ])
  185. ->orderBy('date ASC')
  186. ->limit($dashboardNumberDistributions)
  187. ->all();
  188. // dernières commandes
  189. $paramsOrders = [];
  190. if ($optionDashboardDateStart || $optionDashboardDateEnd) {
  191. $conditionsOrders = '';
  192. if ($optionDashboardDateStart) {
  193. $conditionsOrders .= 'distribution.date >= :date_start';
  194. $paramsOrders[':date_start'] = $optionDashboardDateStart;
  195. }
  196. if ($optionDashboardDateEnd) {
  197. if ($optionDashboardDateStart) {
  198. $conditionsOrders .= ' AND ';
  199. }
  200. $conditionsOrders .= 'distribution.date <= :date_end';
  201. $paramsOrders[':date_end'] = $optionDashboardDateEnd;
  202. }
  203. } else {
  204. $conditionsOrders = 'distribution.date >= :date_start';
  205. $paramsOrders[':date_start'] = date('Y-m-d 00:00:00');
  206. }
  207. $ordersArray = Order::searchAll([], [
  208. 'orderby' => 'date DESC',
  209. '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)))',
  210. 'params' => $paramsOrders,
  211. ]);
  212. // clients
  213. $usersArray = User::findBy()
  214. ->orderBy('created_at DESC')
  215. ->limit(5)
  216. ->all();
  217. $usersNegativeCredit = User::findBy(['id_producer' => GlobalParam::getCurrentProducerId()])
  218. ->andWhere('user_producer.credit < 0')
  219. ->all();
  220. // paramètres
  221. $producer = GlobalParam::getCurrentProducer();
  222. $productsCount = Product::searchCount();
  223. $pointsSaleCount = PointSale::searchCount();
  224. return $this->render('index', [
  225. 'distributionsArray' => $distributionsArray,
  226. 'ordersArray' => $ordersArray,
  227. 'usersArray' => $usersArray,
  228. 'usersNegativeCredit' => $usersNegativeCredit,
  229. 'producer' => $producer,
  230. 'productsCount' => $productsCount,
  231. 'pointsSaleCount' => $pointsSaleCount
  232. ]);
  233. }
  234. /**
  235. * Affiche la page de connexion.
  236. *
  237. * @return mixed
  238. */
  239. public function actionLogin()
  240. {
  241. if (!\Yii::$app->user->isGuest) {
  242. return $this->goHome();
  243. }
  244. $model = new LoginForm();
  245. if ($model->load(Yii::$app->request->post()) && $model->login()) {
  246. return $this->goBack();
  247. } else {
  248. return $this->render('login', [
  249. 'model' => $model,
  250. ]);
  251. }
  252. }
  253. /**
  254. * Déconnecte l'utilisateur et le redirige à la page d'accueil.
  255. *
  256. * @return mixed
  257. */
  258. public function actionLogout()
  259. {
  260. Yii::$app->user->logout();
  261. return $this->goHome();
  262. }
  263. /**
  264. * Change le producteur courant de l'utilisateur connecté.
  265. * Permet de passer d'un producteur à un autre en tant qu'administrateur.
  266. *
  267. * @param integer $id
  268. */
  269. public function actionChangeProducer($id)
  270. {
  271. Yii::$app->user->identity->id_producer = $id;
  272. Yii::$app->user->identity->save();
  273. $this->redirect(['site/index']);
  274. }
  275. }