[ 'class' => AccessControl::class, 'rules' => [ [ 'allow' => true, 'roles' => ['@'], 'matchCallback' => function ($rule, $action) { return $this->getUserModule() ->getAuthorizationChecker() ->isGrantedAsProducer($this->getUserCurrent()); } ] ], ], ]; } /** * Liste les utilisateurs. */ public function actionIndex( int $idPointSale = 0, bool $sectionSubscribers = false, bool $sectionInactiveUsers = false) { $pointSaleManager = $this->getPointSaleManager(); $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 = $this->getProducerCurrent(); $pointsSaleArray = $pointSaleManager->findPointSales(); return $this->render('index', [ 'searchModel' => $searchModel, 'dataProvider' => $dataProvider, 'producer' => $producer, 'idPointSaleActive' => $idPointSale, 'pointsSaleArray' => $pointsSaleArray, 'sectionInactiveUsers' => $sectionInactiveUsers, 'sectionSubscribers' => $sectionSubscribers, ]); } public function actionCreate() { $userModule = $this->getUserModule(); $producerManager = $this->getProducerManager(); $producerCurrent = $this->getProducerCurrent(); $model = $userModule->instanciateUser(); $posts = Yii::$app->request->post(); $userExist = false; if ($posts && isset($posts['User']['email']) && strlen($posts['User']['email']) > 0) { $userExist = $userModule->findOneUserByEmail($posts['User']['email']); } if ($userExist) { $producerManager->addUser($userExist, $producerCurrent); $this->processLinkPointSale($userExist); $this->processLinkUserGroup($userExist); $this->setFlash('success', "L'utilisateur que vous souhaitez créer possède déjà un compte sur la plateforme. Il vient d'être lié à votre établissement."); } else { if ($model->load(\Yii::$app->request->post()) && $model->validate() && YII_ENV != 'demo') { $model->id_producer = 0; $password = Password::generate(); $userModule->setPassword($model, $password); $userModule->generateAuthKey($model); $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 = GlobalParam::getCurrentProducerId(); $useProducer->credit = 0; $useProducer->active = 1; $useProducer->newsletter = $model->newsletter; $useProducer->save(); $userModule->sendMailWelcome($model, $password); $this->processLinkPointSale($model); $this->processLinkUserGroup($model); $this->processProductPricePercent($model); $this->setFlash('success', 'Utilisateur créé.'); $model = $userModule->instanciateUser(); } } return $this->render('create', array_merge($this->initForm($model), [ 'model' => $model, ])); } public function actionUpdate($id) { $userModule = $this->getUserModule(); $pointSaleManager = $this->getPointSaleManager(); $model = $this->findModel($id); $previousMail = $model->email; $user = User::find()->with('userProducer')->where(['id' => $model['id']])->one(); $userBelongToProducer = UserProducer::findOne(['id_user' => $id, 'id_producer' => GlobalParam::getCurrentProducerId()]); if ($userBelongToProducer) { $model->newsletter = $userBelongToProducer->newsletter; 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(); $userModule->setPassword($model, $password); $model->username = $model->email; $userModule->sendMailWelcome($model, $password); } $this->processLinkPointSale($model); $this->processLinkUserGroup($model); $this->processProductPricePercent($model); if($model->newsletter) { $userModule->subscribeUserNewsletter($model); } else { $userModule->unsubscribeUserNewsletter($model); } $this->setFlash('success', 'Utilisateur '.Html::encode($userModule->getUsername($model)).' modifié.'); return $this->redirect(['index']); } } else { throw new UserException("Vous ne pouvez pas modifier cet utilisateur."); } // Nouveau mot de passe $newPassword = Yii::$app->request->post('submit_new_password'); if ($newPassword) { $password = Password::generate(); $userModule->setPassword($model, $password); $model->save(); $producer = $this->getProducerCurrent(); \Yii::$app->mailerService->sendFromProducer( 'Nouveau mot de passe', 'newPasswordUserAdmin', [ 'user' => $user, 'producer' => $producer, 'password' => $password, ], $model->email, $producer ); $this->setFlash('success', 'Nouveau mot de passe envoyé à '.Html::encode($userModule->getUsername($model)).'.'); return $this->redirect(['index']); } return $this->render('update', array_merge($this->initForm($model), [ 'model' => $model, 'pointSaleBillingArray' => $pointSaleManager->findByBillingUser($model) ])); } public function initForm($model) { $userPointSaleManager = $this->getUserPointSaleManager(); $userUserGroupManager = $this->getUserUserGroupManager(); $userProducerManager = $this->getUserProducerManager(); $userGroupManager = $this->getUserGroupManager(); if ($model->id) { $userPointSaleArray = $userPointSaleManager->findUserPointSalesByUser($model); if ($userPointSaleArray && count($userPointSaleArray) > 0) { foreach ($userPointSaleArray as $userPointSale) { $model->points_sale[] = $userPointSale->id_point_sale; } } $userUserGroupsArray = $userUserGroupManager->findUserUserGroupsByUser($model); if ($userUserGroupsArray && count($userUserGroupsArray) > 0) { foreach ($userUserGroupsArray as $userUserGroup) { $model->user_groups[] = $userUserGroup->id_user_group; } } $userProducer = $userProducerManager->findOneUserProducer($model); $model->product_price_percent = $userProducer->product_price_percent; } $pointsSaleArray = PointSale::find() ->where([ 'id_producer' => GlobalParam::getCurrentProducerId(), 'status' => 1 ]) ->joinWith(['userPointSale' => function ($query) use ($model) { if ($model->id) { $query->andOnCondition('user_point_sale.id_user = ' . $model->id); } }]) ->all(); $userGroupsArray = $userGroupManager->findUserGroups(); return [ 'pointsSaleArray' => $pointsSaleArray, 'userGroupsArray' => $userGroupsArray, ]; } /** * Lie un utilisateur aux points de vente sélectionnés. */ public function processLinkPointSale(User $modelUser) { $posts = Yii::$app->request->post(); $userPointSaleManager = $this->getUserPointSaleManager(); $pointSaleManager = $this->getPointSaleManager(); UserPointSale::deleteAll([ 'id_user' => $modelUser->id ]); if (is_array($modelUser->points_sale) && count($modelUser->points_sale) > 0) { foreach ($modelUser->points_sale as $pointSaleId) { $pointSale = $pointSaleManager->findOnePointSaleById($pointSaleId); $userPointSale = $userPointSaleManager->findOneUserPointSale($modelUser, $pointSale); 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(); } } } } /** * Lie un utilisateur aux groupes d'utilisateurs sélectionnés. */ public function processLinkUserGroup($modelUser) { UserUserGroup::deleteAll([ 'id_user' => $modelUser->id ]); if (is_array($modelUser->user_groups) && count($modelUser->user_groups) > 0) { foreach ($modelUser->user_groups as $userGroupId) { $userUserGroup = UserUserGroup::searchOne([ 'id_user' => $modelUser->id, 'id_user_group' => $userGroupId ]); if (!$userUserGroup) { $userUserGroup = new UserUserGroup(); $userUserGroup->id_user = $modelUser->id; $userUserGroup->id_user_group = $userGroupId; $userUserGroup->save(); } } } } public function processProductPricePercent($model) { $userProducer = UserProducer::searchOne([ 'id_producer' => GlobalParam::getCurrentProducerId(), 'id_user' => $model->id ]); $userProducer->product_price_percent = $model->product_price_percent; $userProducer->save(); } /** * Désactive l'utilisateur de l'établissement. */ public function actionDelete(int $id) { $userModule = $this->getUserModule(); $userProducerManager = $this->getUserProducerManager(); $user = $userModule->findOneUserById($id); $userProducer = $userProducerManager->findOneUserProducer($user); if ($userProducer) { if($userProducerManager->hasOutstandingCredit($userProducer)) { $this->setFlash('error', "Vous ne pouvez pas supprimer cet utilisateur car il a toujours du crédit en cours."); } else { $userProducerManager->unlinkUserProducer($userProducer); $this->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 les données liées au crédit d'un utilisateur (formulaire, historique). */ public function actionCredit(int $id) { $userModule = $this->getUserModule(); $paymentContainer = $this->getPaymentContainer(); $userProducerContainer = $this->getUserProducerContainer(); $user = $userModule->findOneUserById($id); $userProducer = $userProducerContainer->getRepository()->findOneUserProducer($user); if ($userProducer) { $creditForm = new CreditForm(); if ($creditForm->load(\Yii::$app->request->post()) && $creditForm->validate()) { $paymentContainer->getUtils() ->creditOrDebitUser($creditForm->type, $user, $creditForm->amount, $creditForm->mean_payment, $this->getUserCurrent(), $creditForm->comment); if($creditForm->send_mail) { $paymentContainer->getNotifier() ->notifyUserCreditMovement($user, $creditForm->type, $creditForm->amount); if(!$user->email) { $this->addFlash('error', "L'utilisateur n'a pas pu être prévenu car son adresse email n'est pas définie."); } } $this->addFlash('success', 'Crédit mis à jour.'); return $this->refresh(); } return $this->render('credit', [ 'user' => $user, 'userProducer' => $userProducer, 'creditForm' => $creditForm, 'dataProvider' => $paymentContainer->getRepository() ->queryPaymentsCreditHistoryByUser($user)->getDataProvider(20), ]); } else { throw new UserException("Utilisateur introuvable."); } } /** * Modifie l'option "credit_active" d'un utilisateur pour le producteur courant. * Redirige vers la page de crédit de l'utilisateur. */ public function actionStateCredit($idUser, $state) { $userModule = $this->getUserModule(); $userProducerManager = $this->getUserProducerManager(); $user = $userModule->findOneUserById($idUser); $userProducer = $userProducerManager->findOneUserProducer($user); if ($userProducer) { $userProducer->credit_active = $state; $userProducer->save(); } return $this->redirect(['user/credit', 'id' => $idUser]); } /** * Affiche les commandes d'un utilisateur. * * @param integer $id * @return mixed */ public function actionOrders($id) { $userModule = $this->getUserModule(); $user = $userModule->findOneUserById($id); $searchModel = new OrderSearch(); $dataProvider = $searchModel->search(array_merge(\Yii::$app->request->queryParams, ['id_user' => $id])); return $this->render('orders', [ 'user' => $user, 'searchModel' => $searchModel, 'dataProvider' => $dataProvider, ]); } /** * Finds the User model based on its primary key value. * If the model is not found, a 404 HTTP exception will be thrown. */ protected function findModel($id) { $userModule = $this->getUserModule(); if (($user = $userModule->findOneUserById($id)) !== null) { return $user; } else { throw new NotFoundHttpException("Utilisateur introuvable"); } } /** * Affiche la liste des emails des utilisateurs liés à un point de vente donné. */ public function actionMail( $idPointSale = 0, $sectionSubscribers = 0, $sectionInactiveUsers = 0, $usersPointSaleLink = 0, $usersPointSaleHasOrder = 0) { $userModule = $this->getUserModule(); $distributionManager = $this->getDistributionManager(); if ($idPointSale && !$usersPointSaleLink && !$usersPointSaleHasOrder) { $usersPointSaleLink = 1; } $users = $userModule->queryUsersBy([ 'id_producer' => GlobalParam::getCurrentProducerId(), 'id_point_sale' => $idPointSale, 'users_point_sale_link' => $usersPointSaleLink, 'users_point_sale_has_order' => $usersPointSaleHasOrder, 'subscribers' => $sectionSubscribers, 'inactive' => $sectionInactiveUsers, 'newsletter' => true ])->all(); $usersArray = []; foreach ($users as $key => $user) { if (isset($user['email']) && strlen($user['email']) > 0) { $usersArray[] = $user['email']; } else { unset($users[$key]); } } $pointsSaleArray = PointSale::find()->where(['id_producer' => GlobalParam::getCurrentProducerId()])->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()) { $this->setFlash('success', 'Votre email a bien été envoyé.'); } else { $bodyResponseSendMail = $responseSendMail->getBody(); $emailsErrorArray = []; if (isset($bodyResponseSendMail['Messages'])) { foreach ($bodyResponseSendMail['Messages'] as $message) { if ($message['Status'] != 'success') { $emailsErrorArray[] = $message['Errors'][0]['ErrorMessage']; } } } $messageError = 'Un problème est survenu lors de l\'envoi de votre email.'; if (count($emailsErrorArray) > 0) { $messageError .= '
Problème détecté : ' . implode(',', $emailsErrorArray); } $this->setFlash('error', $messageError); } return $this->redirect(['mail', 'idPointSale' => $idPointSale]); } $incomingDistributions = $distributionManager->findDistributionsIncoming(); $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, ]); } public function actionSwitchIdentity(int $id) { $userModule = $this->getUserModule(); if($this->isUserCurrentAdmin()) { $initialId = Yii::$app->user->getId(); if($initialId != $id) { $user = $userModule->findOneUserById($id); $duration = 0; Yii::$app->user->switchIdentity($user, $duration); Yii::$app->session->set('user.idbeforeswitch',$initialId); return $this->redirect(['index']); } } else { throw new NotFoundHttpException('Page introuvable'); } } }