[
'class' => AccessControl::class,
'rules' => [
[
'allow' => true,
'roles' => ['@'],
'matchCallback' => function ($rule, $action) {
$userCurrent = $this->getUserCurrent();
$authorizationChecker = $this->getUserModule()->getAuthorizationChecker();
if(in_array($action->id, ['messages', 'message-delete'])) {
return $authorizationChecker->isGrantedAsAdministrator($userCurrent);
}
else {
return $authorizationChecker->isGrantedAsProducer($userCurrent);
}
}
],
],
],
];
}
/**
* Liste les utilisateurs.
*/
public function actionIndex(
int $idPointSale = 0,
bool $sectionSubscribers = false,
bool $sectionInactiveUsers = false)
{
$pointSaleModule = $this->getPointSaleModule();
$producer = $this->getProducerCurrent();
$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 = $this->getProducerCurrent();
$pointsSaleArray = $pointSaleModule->findPointSales();
return $this->render('index', [
'searchModel' => $searchModel,
'dataProvider' => $dataProvider,
'producer' => $producer,
'idPointSaleActive' => $idPointSale,
'pointsSaleArray' => $pointsSaleArray,
'sectionInactiveUsers' => $sectionInactiveUsers,
'sectionSubscribers' => $sectionSubscribers,
]);
}
public function actionCreate(string $redirectUrl = null)
{
$userModule = $this->getUserModule();
$producerModule = $this->getProducerModule();
$producerCurrent = $this->getProducerCurrent();
$model = $userModule->instanciateUser();
$model->redirect_url = $redirectUrl;
$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) {
$producerModule->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.");
return $this->redirectAfterSave('user', $userExist->id);
} else {
if ($model->load(\Yii::$app->request->post()) && $model->validate() && YII_ENV != 'demo') {
$userCreate = $userModule->getBuilder()->createUser(
$model->type,
$model->email,
$model->name,
$model->lastname,
$model->name_legal_person,
$model->phone,
$model->address,
$model->newsletter,
Password::generate(),
(bool)$model->send_mail_welcome
);
$userCreate->points_sale = $model->points_sale;
$userCreate->user_groups = $model->user_groups;
$userCreate->exclusive_access_selected_points_sale = $model->exclusive_access_selected_points_sale;
$this->processLinkPointSale($userCreate);
$this->processLinkUserGroup($userCreate);
//$this->processProductPricePercent($model);
$this->setFlash('success', 'Utilisateur créé.');
return $this->redirectAfterSave('user', $userCreate->id, $model->redirect_url);
}
}
return $this->render('create', array_merge($this->initForm($model), [
'model' => $model,
]));
}
public function actionView($id)
{
$userModule = $this->getUserModule();
$pointSaleModule = $this->getPointSaleModule();
$model = $this->findModel($id);
// Email de bienvenue
$mailWelcome = Yii::$app->request->post('submit_mail_welcome');
if ($mailWelcome) {
$this->getUserModule()->getManager()->welcome($model);
$this->setFlash('success', 'Email de bienvenue envoyé à ' . Html::encode($userModule->getSolver()->getUsername($model)) . '.');
return $this->redirect(['view', 'id' => $model->id]);
}
// Mot de passe oublié
$newPassword = Yii::$app->request->post('submit_new_password');
if ($newPassword) {
$this->getUserModule()->getManager()->newPassword($model);
$this->setFlash('success', 'Nouveau mot de passe envoyé à ' . Html::encode($userModule->getSolver()->getUsername($model)) . '.');
return $this->redirect(['view', 'id' => $model->id]);
}
return $this->render('view', [
'model' => $model,
'pointSaleBillingArray' => $pointSaleModule->findByBillingUser($model),
'subscriptionsArray' => $this->getSubscriptionModule()->getRepository()->findSubscriptionsByUser($model)
]);
}
public function actionUpdate($id)
{
if($this->getProducerCurrent()->isDemoAccount()) {
$this->addFlash('error', "Fonctionnalité non disponible sur le compte de démo.");
return $this->redirect(['view', 'id' => $id]);
}
$userModule = $this->getUserModule();
$pointSaleModule = $this->getPointSaleModule();
$model = $this->findModel($id);
$previousMail = $model->email;
$userBelongToProducer = UserProducer::findOne(['id_user' => $id, 'id_producer' => GlobalParam::getCurrentProducerId()]);
if ($userBelongToProducer) {
$model->newsletter = $userBelongToProducer->newsletter;
$model->newsletter_order_taking = $userBelongToProducer->newsletter_order_taking;
$model->trust_alert = $userBelongToProducer->trust_alert;
$model->trust_alert_comment = $userBelongToProducer->trust_alert_comment;
$model->exclusive_access_selected_points_sale = $userBelongToProducer->exclusive_access_selected_points_sale;
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) && $model->send_mail_welcome) {
$password = Password::generate();
$userModule->setPassword($model, $password);
$model->username = $model->email;
$userModule->sendMailWelcome($model, $password);
}
$this->processLinkPointSale($model);
$this->processLinkUserGroup($model);
//$this->processProductPricePercent($model);
// Newsletter
$userModule->getNewsletterManager()->manageUserNewsletter(
$model,
$model->newsletter,
$model->newsletter_order_taking
);
// Alerte confiance
$userBelongToProducer->trust_alert = $model->trust_alert;
$userBelongToProducer->trust_alert_comment = $model->trust_alert_comment;
$userBelongToProducer->save();
// Mot de passe
if($this->getUserModule()->getAuthorizationChecker()->isGrantedAsAdministrator($this->getUserCurrent())
&& $model->password_new
&& strlen($model->password_new)) {
$this->getUserModule()->getBuilder()->initPassword($model, $model->password_new);
$model->save();
}
$this->setFlash('success', 'Utilisateur ' . Html::encode($userModule->getUsername($model)) . ' modifié.');
return $this->redirect(['update', 'id' => $model->id]);
}
} else {
throw new UserException("Vous ne pouvez pas modifier cet utilisateur.");
}
return $this->render('update', array_merge($this->initForm($model), [
'model' => $model,
'pointSaleBillingArray' => $pointSaleModule->findByBillingUser($model)
]));
}
public function actionMessages(int $id, int $idUserMessage = null)
{
$userMessageModule = $this->getUserMessageModule();
$user = $this->findModel($id);
$isUpdate = false;
if($idUserMessage) {
$isUpdate = true;
$userMessageModel = $this->findUserMessage($idUserMessage);
}
else {
$userMessageModel = $userMessageModule->getBuilder()->instanciateUserMessage(
$user,
$this->getUserCurrent()
);
}
if($userMessageModel->load(\Yii::$app->request->post()) && $userMessageModel->validate()) {
if($isUpdate) {
$userMessageModel->save();
$this->setFlash('success', "Le message a bien été modifié.");
}
else {
$userMessageModule->getManager()->createUserMessage(
$user,
$userMessageModel->getMessage(),
$this->getUserCurrent()
);
$this->setFlash('success', "Le message a bien été envoyé à l'utilisateur.");
}
return $this->redirect(['messages', 'id' => $id]);
}
return $this->render('messages', [
'user' => $user,
'userMessageModel' => $userMessageModel,
'userMessagesDataProvider' => $userMessageModule->getRepository()
->queryUserMessagesByUser($user)
->getDataProvider(20)
]);
}
public function actionMessageDelete(int $idUser, int $idUserMessage)
{
$userMessageModule = $this->getUserMessageModule();
$userMessage = $this->findUserMessage($idUserMessage);
if($userMessageModule->getManager()->deleteUserMessage($userMessage)) {
$this->setFlash('success', "Le message a bien été supprimé.");
}
else {
$this->setFlash('error', "Une erreur est survenue pendant la suppression du message.");
}
return $this->redirect(['messages', 'id' => $idUser]);
}
public function findUserMessage(int $idUserMessage)
{
$userMessage = $this->getUserMessageModule()->getRepository()->findOneUserMessageById($idUserMessage);
if(!$userMessage) {
throw new NotFoundHttpException("Le message utilisateur n'a pas été trouvé.");
}
return $userMessage;
}
public function actionReportProblemReceivingEmails(int $id)
{
$user = $this->findModel($id);
if($this->getUserModule()->getManager()->reportProblemReceivingEmails($user)) {
$this->setFlash('success', "L'utilisateur ".$this->getUserModule()->getSolver()->getUsername($user)." a bien été signalé comme ayant des problèmes dans la réception de vos emails. L'administrateur débloquera la situation dès que possible et préviendra l'utilisateur.");
}
else {
$this->setFlash('error', "Une erreur est survenue.");
}
return $this->redirect('index');
}
public function initForm($model)
{
$userPointSaleModule = $this->getUserPointSaleModule();
$userUserGroupModule = $this->getUserUserGroupModule();
$userProducerModule = $this->getUserProducerModule();
$userGroupModule = $this->getUserGroupModule();
if ($model->id) {
$userPointSaleArray = $userPointSaleModule->findUserPointSalesByUser($model);
if ($userPointSaleArray && count($userPointSaleArray) > 0) {
foreach ($userPointSaleArray as $userPointSale) {
$model->points_sale[] = $userPointSale->id_point_sale;
}
}
$userUserGroupsArray = $userUserGroupModule->findUserUserGroupsByUser($model);
if ($userUserGroupsArray && count($userUserGroupsArray) > 0) {
foreach ($userUserGroupsArray as $userUserGroup) {
$model->user_groups[] = $userUserGroup->id_user_group;
}
}
$userProducer = $userProducerModule->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 = $userGroupModule->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();
$userPointSaleModule = $this->getUserPointSaleModule();
$pointSaleModule = $this->getPointSaleModule();
UserPointSale::deleteAll([
'id_user' => $modelUser->id
]);
if (is_array($modelUser->points_sale) && count($modelUser->points_sale) > 0) {
foreach ($modelUser->points_sale as $pointSaleId) {
$pointSale = $pointSaleModule->findOnePointSaleById($pointSaleId);
$userPointSale = $userPointSaleModule->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();
}
}
}
// Accès exclusif aux points de vente sélectionnés
$userProducer = UserProducer::findOne(['id_user' => $modelUser->id, 'id_producer' => GlobalParam::getCurrentProducerId()]);
$userProducer->setExclusiveAccessSelectedPointsSale($modelUser->exclusive_access_selected_points_sale);
$userProducer->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();
$userProducerModule = $this->getUserProducerModule();
$user = $userModule->findOneUserById($id);
$userProducer = $userProducerModule->findOneUserProducer($user);
if ($userProducer) {
if ($userProducerModule->hasOutstandingCredit($userProducer)) {
$this->setFlash('error', "Vous ne pouvez pas supprimer cet utilisateur car il a toujours de l'argent dans sa cagnotte.");
} else {
$userProducerModule->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 à la cagnotte d'un utilisateur (formulaire, historique).
*/
public function actionCredit(int $id)
{
$producerModule = $this->getProducerModule();
$userModule = $this->getUserModule();
$paymentModule = $this->getPaymentModule();
$userProducerModule = $this->getUserProducerModule();
$user = $userModule->findOneUserById($id);
$userProducer = $userProducerModule->getRepository()->findOneUserProducer($user);
if ($userProducer) {
$creditForm = new CreditForm();
$creditForm->send_mail = $producerModule->getSolver()->getConfig('option_check_by_default_prevent_user_credit');
if ($creditForm->load(\Yii::$app->request->post()) && $creditForm->validate()) {
$dateTransaction = null;
if($creditForm->date_transaction) {
$dateTransaction = date('Y-m-d', strtotime(str_replace('/', '-', $creditForm->date_transaction)));
}
$paymentModule->getManager()
->creditOrDebitUser(
$creditForm->type,
$user,
$creditForm->amount,
$creditForm->mean_payment,
$this->getUserCurrent(),
$creditForm->comment,
$dateTransaction
);
if ($creditForm->send_mail && !$this->getProducerCurrent()->isDemoAccount()) {
$paymentModule->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', 'Cagnotte mise à jour.');
return $this->refresh();
}
return $this->render('credit', [
'user' => $user,
'userProducer' => $userProducer,
'creditForm' => $creditForm,
'dataProvider' => $paymentModule->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();
$userProducerModule = $this->getUserProducerModule();
$user = $userModule->findOneUserById($idUser);
$userProducer = $userProducerModule->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");
}
}
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($this->getUrlManagerFrontend()->createUrl(['site/index']));
}
} else {
throw new NotFoundHttpException('Page introuvable');
}
}
}