[ 'class' => VerbFilter::className(), 'actions' => [ ], ], 'access' => [ 'class' => AccessControl::className(), 'rules' => [ [ 'allow' => true, 'roles' => ['@'], 'matchCallback' => function ($rule, $action) { return User::hasAccessBackend(); } ] ], ], ]; } /** * Liste les utilisateurs. * * @return mixed */ public function actionIndex( $idPointSale = 0, $sectionSubscribers = false, $sectionInactiveUsers = false) { $searchModel = new UserSearch ; $dataProvider = $searchModel->search([ 'UserSearch' => array_merge( [ 'id_point_sale' => $idPointSale, 'inactive' => (int) $sectionInactiveUsers, 'subscribers' => (int) $sectionSubscribers ], isset(Yii::$app->request->queryParams['UserSearch']) ? Yii::$app->request->queryParams['UserSearch'] : [] ) ]) ; $producer = Producer::searchOne([ 'id' => Producer::getId() ]) ; $pointsSaleArray = PointSale::searchAll() ; return $this->render('index', [ 'searchModel' => $searchModel, 'dataProvider' => $dataProvider, 'producer' => $producer, 'idPointSaleActive' => $idPointSale, 'pointsSaleArray' => $pointsSaleArray, 'sectionInactiveUsers' => $sectionInactiveUsers, 'sectionSubscribers' => $sectionSubscribers, ]); } public function initForm($model) { // init points de vente sélectionnés if($model->id) { $userPointSaleArray = UserPointSale::searchAll([ 'id_user' => $model->id ]) ; if($userPointSaleArray && count($userPointSaleArray) > 0) { foreach($userPointSaleArray as $userPointSaleArray) { $model->points_sale[] = $userPointSaleArray->id_point_sale ; } } } // points de vente $pointsSaleArray = PointSale::find() ->where([ 'id_producer' => Producer::getId(), ]) ->joinWith(['userPointSale' => function($query) use($model) { if($model->id) { $query->andOnCondition('user_point_sale.id_user = '.$model->id) ; } }]) ->all(); return [ 'pointsSaleArray' => $pointsSaleArray ] ; } /** * Creates a new User model. * If creation is successful, the browser will be redirected to the 'view' page. * @return mixed */ public function actionCreate() { $model = new User(); if ($model->load(Yii::$app->request->post()) && $model->validate() && YII_ENV != 'demo') { // save use $password = Password::generate(); $model->setPassword($password); $model->generateAuthKey(); $model->username = $model->email; if (!strlen($model->email)) { $model->username = 'inconnu@opendistrib.net'; } $model->save(); // liaison etablissement / user $useProducer = new UserProducer(); $useProducer->id_user = $model->id; $useProducer->id_producer = Producer::getId(); $useProducer->credit = 0; $useProducer->active = 1; $useProducer->save(); $model->sendMailWelcome($password) ; $this->processLinkPointSale($model) ; Yii::$app->getSession()->setFlash('success', 'Utilisateur créé.'); $model = new User(); } return $this->render('create', array_merge($this->initForm($model),[ 'model' => $model, ])); } /** * Updates an existing User model. * If update is successful, the browser will be redirected to the 'view' page. * @param integer $id * @return mixed */ public function actionUpdate($id) { $model = $this->findModel($id); // Moodification du profil $previousMail = $model->email ; $user = User::find()->with('userProducer')->where(['id' => $model['id']])->one(); $userBelongToProducer = UserProducer::findOne(['id_user' => $id, 'id_producer' => Producer::getId()]); if (($userBelongToProducer && count($user->userProducer) == 1) || User::getCurrentStatus() == USER::STATUS_ADMIN) { if ($model->load(Yii::$app->request->post()) && $model->save()) { // on envoie le mail de bienvenue si le mail vient d'être défini if(!strlen($previousMail) && strlen($model->email)) { $password = Password::generate(); $model->setPassword($password); $model->username = $model->email; $model->sendMailWelcome($password) ; } $this->processLinkPointSale($model) ; Yii::$app->getSession()->setFlash('success', 'Utilisateur modifié.'); } } else { throw new UserException("Vous ne pouvez pas modifier cet utilisateur, soit parce qu'il appartient à plusieurs établissements, soit parce qu'il n'est pas lié au votre."); } // Nouveau mot de passe $newPassword = Yii::$app->request->post('submit_new_password'); if($newPassword) { $password = Password::generate(); $model->setPassword($password); $model->save() ; $producer = Producer::getCurrent(); Yii::$app->mailer->compose(); $mail = Yii::$app->mailer->compose( ['html' => 'newPasswordUserAdmin-html', 'text' => 'newPasswordUserAdmin-text'], ['user' => $model, 'producer' => $producer, 'password' => $password] ) ->setTo($model->email) ->setFrom(['contact@opendistrib.net' => 'Opendistrib']) ->setSubject('[Opendistrib] Nouveau mot de passe') ->send(); Yii::$app->getSession()->setFlash('success', 'Nouveau mot de passe envoyé.'); } return $this->render('update', array_merge($this->initForm($model),[ 'model' => $model, ])); } /** * Lie un utilisateur aux points de vente sélectionnés. * * @param User $modelUser */ public function processLinkPointSale($modelUser) { $posts = Yii::$app->request->post() ; UserPointSale::deleteAll([ 'id_user' => $modelUser->id ]) ; if(is_array($modelUser->points_sale) && count($modelUser->points_sale) > 0) { foreach($modelUser->points_sale as $pointSaleId) { $userPointSale = UserPointSale::searchOne([ 'id_user' => $modelUser->id, 'id_point_sale' => $pointSaleId ]) ; if(!$userPointSale) { $userPointSale = new UserPointSale ; $userPointSale->id_user = $modelUser->id ; $userPointSale->id_point_sale = $pointSaleId ; $userPointSale->comment = isset($posts['User']['comment_point_sale_'.$pointSaleId]) ? $posts['User']['comment_point_sale_'.$pointSaleId] : '' ; $userPointSale->save() ; } } } } /** * Désactive l'utilisateur de l'établissement. * * @param integer $id ID de l'utilisateur */ public function actionDelete($id) { $userProducer = UserProducer::findOne([ 'id_user' => $id, 'id_producer' => Producer::getId() ]) ; if($userProducer) { $userProducer->active = 0 ; $userProducer->bookmark = 0 ; $userProducer->save() ; Yii::$app->getSession()->setFlash('success', 'L\'utilisateur a bien été supprimé de votre établissement.'); } else { throw new \yii\web\NotFoundHttpException('L\'enregistrement UserProducer est introuvable', 404) ; } $params = Yii::$app->getRequest()->getQueryParams() ; unset($params['id']) ; $this->redirect(array_merge(['index'],$params)); } /** * Affiche la liste des emails des utilisateurs liés à un point de vente * donné. * * @param integer $idPointSale * @return mixed */ public function actionMail( $idPointSale = 0, $sectionSubscribers = 0, $sectionInactiveUsers = 0, $usersPointSaleLink = 0, $usersPointSaleHasOrder = 0) { if($idPointSale && !$usersPointSaleLink && !$usersPointSaleHasOrder) { $usersPointSaleLink = 1 ; } $users = User::findBy([ 'id_producer' => Producer::getId(), 'id_point_sale' => $idPointSale, 'users_point_sale_link' => $usersPointSaleLink, 'users_point_sale_has_order' => $usersPointSaleHasOrder, 'subscribers' => $sectionSubscribers, 'inactive' => $sectionInactiveUsers, ])->all() ; $usersArray = []; foreach ($users as $user) { if (isset($user['email']) && strlen($user['email'])) $usersArray[] = $user['email']; } $pointsSaleArray = PointSale::find()->where(['id_producer' => Producer::getId()])->all() ; $pointSale = null ; if($idPointSale) { $pointSale = PointSale::findOne(['id' => $idPointSale]) ; } $mailForm = new MailForm() ; if ($mailForm->load(Yii::$app->request->post()) && $mailForm->validate()) { $responseSendMail = $mailForm->sendEmail($users) ; if($responseSendMail->success()) { Yii::$app->getSession()->setFlash('success', 'Votre email a bien été envoyé.'); } else { $bodyResponseSendMail = $responseSendMail->getBody() ; $emailsErrorArray = [] ; foreach($bodyResponseSendMail['Messages'] as $message) { if($message['Status'] != 'success') { $emailsErrorArray[] = $message['To']['Email'] ; } } $messageError = 'Un problème est survenu lors de l\'envoi de votre email.' ; if(count($emailsErrorArray) > 0) { $messageError .= '
Problème détecté sur les adresses suivantes : '. implode(',', $emailsErrorArray) ; } Yii::$app->getSession()->setFlash('error', $messageError); } return $this->redirect(['mail','idPointSale' => $idPointSale]); } $incomingDistributions = Distribution::getIncomingDistributions() ; $incomingDistributionsArray = ['0' => '--'] ; foreach($incomingDistributions as $distribution) { $incomingDistributionsArray[$distribution->id] = strftime('%A %d %B %Y', strtotime($distribution->date)) ; } return $this->render('emails', [ 'usersArray' => $usersArray, 'pointsSaleArray' => $pointsSaleArray, 'pointSale' => $pointSale, 'mailForm' => $mailForm, 'idPointSaleActive' => $idPointSale, 'incomingDistributionsArray' => $incomingDistributionsArray, 'sectionSubscribers' => $sectionSubscribers, 'sectionInactiveUsers' => $sectionInactiveUsers, 'usersPointSaleLink' => $usersPointSaleLink, 'usersPointSaleHasOrder' => $usersPointSaleHasOrder, ]); } /** * Affiche les données liées au crédit d'un utilisateur (formulaire, * historique). * * @param integer $id * @return mixed * @throws UserException */ public function actionCredit($id) { $user = User::find()->with('userProducer')->where(['id' => $id])->one(); $userProducer = UserProducer::findOne(['id_user' => $id, 'id_producer' => Producer::getId()]); if (($userProducer) || User::getCurrentStatus() == User::STATUS_ADMIN) { $creditForm = new CreditForm; if ($creditForm->load(Yii::$app->request->post()) && $creditForm->validate()) { $creditForm->id_user = $id ; $creditForm->save(); $creditForm = new CreditForm; } $history = CreditHistory::find() ->with(['order', 'userAction']) ->where([ 'id_user' => $user->id, 'id_producer' => Producer::getId(), ]) ->orderBy('date DESC') ->all(); return $this->render('credit', [ 'user' => $user, 'userProducer' => $userProducer, 'creditForm' => $creditForm, 'history' => $history ]); } else { throw new UserException("Vous ne pouvez pas créditer un utilisateur qui n'est pas associé à votre établissement."); } } /** * Affiche les commandes d'un utilisateur. * * @param integer $id * @return mixed */ public function actionOrders($id) { $user = User::findOne($id); $ordersArray = Order::searchAll([ 'id_user' => $id ], ['orderby' => 'distribution.date DESC']) ; return $this->render('orders', [ 'ordersArray' => $ordersArray, 'user' => $user ]); } /** * Modifie l'option "credit_active" d'un utilisateur pour le producteur courant. * Redirige vers la page de crédit de l'utilisateur. * * @param integer $idUser * @param boolean $state */ public function actionStateCredit($idUser, $state) { $userProducer = UserProducer::searchOne([ 'id_user' => $idUser ]) ; if($userProducer) { $userProducer->credit_active = $state ; $userProducer->save() ; } return $this->redirect(['user/credit','id' => $idUser]) ; } /** * Finds the User model based on its primary key value. * If the model is not found, a 404 HTTP exception will be thrown. * @param integer $id * @return User the loaded model * @throws NotFoundHttpException if the model cannot be found */ protected function findModel($id) { if (($model = User::findOne($id)) !== null) { return $model; } else { throw new NotFoundHttpException('The requested page does not exist.'); } } }