@@ -77,7 +77,7 @@ class AccessController extends BackendController | |||
$userModule = $this->getUserModule(); | |||
$producer = $this->getProducerCurrent(); | |||
$userSearch = new UserSearch(); | |||
$usersArray = $userSearch->search()->query->all(); | |||
$usersArray = $userSearch->search([], $producer)->query->all(); | |||
$modelAccessUserProducerForm = new AccessUserProducerForm; | |||
if ($modelAccessUserProducerForm->load(\Yii::$app->request->post()) && $modelAccessUserProducerForm->validate()) { |
@@ -0,0 +1,99 @@ | |||
<?php | |||
/** | |||
* Copyright Souke (2018) | |||
* | |||
* contact@souke.fr | |||
* | |||
* Ce logiciel est un programme informatique servant à aider les producteurs | |||
* à distribuer leur production en circuits courts. | |||
* | |||
* Ce logiciel est régi par la licence CeCILL soumise au droit français et | |||
* respectant les principes de diffusion des logiciels libres. Vous pouvez | |||
* utiliser, modifier et/ou redistribuer ce programme sous les conditions | |||
* de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA | |||
* sur le site "http://www.cecill.info". | |||
* | |||
* En contrepartie de l'accessibilité au code source et des droits de copie, | |||
* de modification et de redistribution accordés par cette licence, il n'est | |||
* offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons, | |||
* seule une responsabilité restreinte pèse sur l'auteur du programme, le | |||
* titulaire des droits patrimoniaux et les concédants successifs. | |||
* | |||
* A cet égard l'attention de l'utilisateur est attirée sur les risques | |||
* associés au chargement, à l'utilisation, à la modification et/ou au | |||
* développement et à la reproduction du logiciel par l'utilisateur étant | |||
* donné sa spécificité de logiciel libre, qui peut le rendre complexe à | |||
* manipuler et qui le réserve donc à des développeurs et des professionnels | |||
* avertis possédant des connaissances informatiques approfondies. Les | |||
* utilisateurs sont donc invités à charger et tester l'adéquation du | |||
* logiciel à leurs besoins dans des conditions permettant d'assurer la | |||
* sécurité de leurs systèmes et ou de leurs données et, plus généralement, | |||
* à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. | |||
* | |||
* Le fait que vous puissiez accéder à cet en-tête signifie que vous avez | |||
* pris connaissance de la licence CeCILL, et que vous en avez accepté les | |||
* termes. | |||
*/ | |||
namespace backend\controllers; | |||
use domain\User\User\UserSearch; | |||
use Yii; | |||
use yii\filters\AccessControl; | |||
class UserAdminController extends BackendController | |||
{ | |||
public function behaviors() | |||
{ | |||
return [ | |||
'access' => [ | |||
'class' => AccessControl::class, | |||
'rules' => [ | |||
[ | |||
'allow' => true, | |||
'roles' => ['@'], | |||
'matchCallback' => function ($rule, $action) { | |||
return $this->getUserModule() | |||
->getAuthorizationChecker() | |||
->isGrantedAsAdministrator($this->getUserCurrent()); | |||
} | |||
] | |||
], | |||
], | |||
]; | |||
} | |||
/** | |||
* Liste les utilisateurs. | |||
*/ | |||
public function actionIndex() | |||
{ | |||
$searchModel = new UserSearch(); | |||
$dataProvider = $searchModel->search([ | |||
'UserSearch' => isset(\Yii::$app->request->queryParams['UserSearch']) ? | |||
Yii::$app->request->queryParams['UserSearch'] : [] | |||
]); | |||
return $this->render('index', [ | |||
'searchModel' => $searchModel, | |||
'dataProvider' => $dataProvider | |||
]); | |||
} | |||
public function actionRedirectView(int $idUserProducer) | |||
{ | |||
$userCurrent = $this->getUserCurrent(); | |||
$userProducer = $this->getUserProducerModule()->getRepository()->findOneUserProducerById($idUserProducer); | |||
if($userProducer) { | |||
$user = $userProducer->user; | |||
$producer = $userProducer->producer; | |||
$this->getUserModule()->getBuilder()->switchProducer($userCurrent, $producer); | |||
return $this->redirect(['user/view', 'id' => $user->id]); | |||
} | |||
else { | |||
$this->addFlash('error', "L'utilisateur n'a pas été trouvé."); | |||
return $this->redirectReferer(); | |||
} | |||
} | |||
} |
@@ -88,7 +88,7 @@ class UserController extends BackendController | |||
bool $sectionInactiveUsers = false) | |||
{ | |||
$pointSaleModule = $this->getPointSaleModule(); | |||
$producer = $this->getProducerCurrent(); | |||
$searchModel = new UserSearch(); | |||
$dataProvider = $searchModel->search([ | |||
'UserSearch' => array_merge( | |||
@@ -101,7 +101,7 @@ class UserController extends BackendController | |||
Yii::$app->request->queryParams['UserSearch'] : | |||
[] | |||
) | |||
]); | |||
], $producer); | |||
$producer = $this->getProducerCurrent(); | |||
$pointsSaleArray = $pointSaleModule->findPointSales(); |
@@ -63,10 +63,10 @@ $isUserCurrentGrantedAsProducer = $userModule->getAuthorizationChecker()->isGran | |||
$versionOpendistribLabel = ''; | |||
if ($producer) { | |||
$backgroundLabelVersionOpendistrib = 'black'; | |||
if(!$producerModule->isUpToDateWithOpendistribVersion($producer)) { | |||
if (!$producerModule->isUpToDateWithOpendistribVersion($producer)) { | |||
$backgroundLabelVersionOpendistrib = 'green'; | |||
} | |||
$versionOpendistribLabel = '<span class="pull-right-container"><small class="label pull-right bg-'.$backgroundLabelVersionOpendistrib.'">' . GlobalParam::getSoukeVersion() . '</small></span>'; | |||
$versionOpendistribLabel = '<span class="pull-right-container"><small class="label pull-right bg-' . $backgroundLabelVersionOpendistrib . '">' . GlobalParam::getSoukeVersion() . '</small></span>'; | |||
} | |||
$countTicketsProducerUnreadLabel = ''; | |||
@@ -86,7 +86,7 @@ $isUserCurrentGrantedAsProducer = $userModule->getAuthorizationChecker()->isGran | |||
$countTicketsLabel = '<span class="pull-right-container"><small class="label pull-right bg-green">' . $countTicketsAdminUnread . '</small></span>'; | |||
} else { | |||
$countTicketsAdminOpen = $ticketModule->getRepository()->countTicketsAdminStatusOpen(); | |||
if($countTicketsAdminOpen) { | |||
if ($countTicketsAdminOpen) { | |||
$countTicketsLabel = '<span class="pull-right-container"><small class="label pull-right bg-blue">' . $countTicketsAdminOpen . '</small></span>'; | |||
} | |||
} | |||
@@ -106,9 +106,9 @@ $isUserCurrentGrantedAsProducer = $userModule->getAuthorizationChecker()->isGran | |||
$countProducerInvoicesUnpaidLabel = ''; | |||
$countProducerInvoicesUnpaid = $this->getProducerModule()->getDolibarrUtils() | |||
->countDolibarrProducerInvoicesUnpaid($producer); | |||
if($countProducerInvoicesUnpaid > 1) { | |||
if ($countProducerInvoicesUnpaid > 1) { | |||
$countProducerInvoicesUnpaidLabelColor = ($countProducerInvoicesUnpaid > 2) ? 'red' : 'orange'; | |||
$countProducerInvoicesUnpaidLabel = '<span class="pull-right-container"><small class="label pull-right bg-'.$countProducerInvoicesUnpaidLabelColor.'">' . $countProducerInvoicesUnpaid . '</small></span>'; | |||
$countProducerInvoicesUnpaidLabel = '<span class="pull-right-container"><small class="label pull-right bg-' . $countProducerInvoicesUnpaidLabelColor . '">' . $countProducerInvoicesUnpaid . '</small></span>'; | |||
} | |||
?> | |||
@@ -133,7 +133,18 @@ $isUserCurrentGrantedAsProducer = $userModule->getAuthorizationChecker()->isGran | |||
'visible' => $isUserCurrentGrantedAsAdministrator, | |||
'template' => '<a href="{url}">{icon} {label}' . $countTicketsLabel . '</a>' | |||
], | |||
['label' => 'Producteurs', 'icon' => 'th-list', 'url' => ['/producer-admin/index'], 'visible' => $isUserCurrentGrantedAsAdministrator], | |||
[ | |||
'label' => 'Producteurs', | |||
'icon' => 'th-list', | |||
'url' => ['/producer-admin/index'], | |||
'visible' => $isUserCurrentGrantedAsAdministrator | |||
], | |||
[ | |||
'label' => 'Utilisateurs', | |||
'icon' => 'users', | |||
'url' => ['/user-admin/index'], | |||
'visible' => $isUserCurrentGrantedAsAdministrator | |||
], | |||
[ | |||
'label' => 'Statistiques', | |||
'icon' => 'line-chart', |
@@ -0,0 +1,158 @@ | |||
<?php | |||
/** | |||
* Copyright Souke (2018) | |||
* | |||
* contact@souke.fr | |||
* | |||
* Ce logiciel est un programme informatique servant à aider les producteurs | |||
* à distribuer leur production en circuits courts. | |||
* | |||
* Ce logiciel est régi par la licence CeCILL soumise au droit français et | |||
* respectant les principes de diffusion des logiciels libres. Vous pouvez | |||
* utiliser, modifier et/ou redistribuer ce programme sous les conditions | |||
* de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA | |||
* sur le site "http://www.cecill.info". | |||
* | |||
* En contrepartie de l'accessibilité au code source et des droits de copie, | |||
* de modification et de redistribution accordés par cette licence, il n'est | |||
* offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons, | |||
* seule une responsabilité restreinte pèse sur l'auteur du programme, le | |||
* titulaire des droits patrimoniaux et les concédants successifs. | |||
* | |||
* A cet égard l'attention de l'utilisateur est attirée sur les risques | |||
* associés au chargement, à l'utilisation, à la modification et/ou au | |||
* développement et à la reproduction du logiciel par l'utilisateur étant | |||
* donné sa spécificité de logiciel libre, qui peut le rendre complexe à | |||
* manipuler et qui le réserve donc à des développeurs et des professionnels | |||
* avertis possédant des connaissances informatiques approfondies. Les | |||
* utilisateurs sont donc invités à charger et tester l'adéquation du | |||
* logiciel à leurs besoins dans des conditions permettant d'assurer la | |||
* sécurité de leurs systèmes et ou de leurs données et, plus généralement, | |||
* à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. | |||
* | |||
* Le fait que vous puissiez accéder à cet en-tête signifie que vous avez | |||
* pris connaissance de la licence CeCILL, et que vous en avez accepté les | |||
* termes. | |||
*/ | |||
use common\helpers\GlobalParam; | |||
use common\helpers\Price; | |||
use domain\Order\Order\Order; | |||
use domain\Producer\Producer\ProducerModule; | |||
use domain\User\User\User; | |||
use domain\User\User\UserModule; | |||
use domain\User\UserProducer\UserProducer; | |||
use domain\User\UserProducer\UserProducerModule; | |||
use yii\grid\GridView; | |||
use yii\helpers\Html; | |||
use domain\User\UserGroup\UserGroupModule; | |||
$userModule = UserModule::getInstance(); | |||
$producerModule = ProducerModule::getInstance(); | |||
$userCurrent = GlobalParam::getCurrentUser(); | |||
$userGroupModule = UserGroupModule::getInstance(); | |||
$userProducerModule = UserProducerModule::getInstance(); | |||
$this->setTitle('Utilisateurs'); | |||
$this->addBreadcrumb($this->getTitle()); | |||
?> | |||
<?= GridView::widget([ | |||
'dataProvider' => $dataProvider, | |||
'filterModel' => $searchModel, | |||
'summary' => | |||
'Affichage de <b>{begin, number}-{end, number}</b> sur <b>{totalCount, number}</b> {totalCount, plural, one{élément} other{éléments}}.', | |||
'columns' => [ | |||
[ | |||
'attribute' => 'username', | |||
'label' => 'Nom', | |||
'value' => function ($user) use ($userModule) { | |||
return $userModule->getUsername($user); | |||
} | |||
], | |||
[ | |||
'attribute' => 'type', | |||
'label' => 'Type', | |||
'headerOptions' => ['class' => 'column-hide-on-mobile'], | |||
'filterOptions' => ['class' => 'column-hide-on-mobile'], | |||
'contentOptions' => ['class' => 'column-hide-on-mobile'], | |||
'filter' => $userModule->getTypeChoicesArray(), | |||
'value' => function ($user) use ($userModule) { | |||
return $userModule->getTypeLabel($user['type']); | |||
} | |||
], | |||
[ | |||
'attribute' => 'contacts', | |||
'header' => 'Contacts', | |||
'format' => 'raw', | |||
'headerOptions' => ['class' => 'column-hide-on-mobile'], | |||
'filterOptions' => ['class' => 'column-hide-on-mobile'], | |||
'contentOptions' => ['class' => 'column-hide-on-mobile'], | |||
'value' => function ($user) { | |||
$html = ''; | |||
if (strlen($user['phone'])) { | |||
$html .= $user['phone']; | |||
} | |||
if (strlen($user['phone']) && strlen($user['email'])) { | |||
$html .= '<br />'; | |||
} | |||
if (strlen($user['email'])) { | |||
$html .= $user['email']; | |||
} | |||
return $html; | |||
} | |||
], | |||
[ | |||
'attribute' => 'producers', | |||
'label' => 'Producteurs', | |||
'format' => 'raw', | |||
'contentOptions' => ['class' => 'column-hide-on-mobile align-center'], | |||
'value' => function ($user) use ($userProducerModule) { | |||
$html = ''; | |||
$userProducersArray = $userProducerModule->getRepository()->findUserProducersByUser($user); | |||
foreach($userProducersArray as $userProducer) { | |||
$html .= '<a href="'.Yii::$app->urlManager->createUrl(['user-admin/redirect-view', 'idUserProducer' => $userProducer->id]).'" class="btn btn-default"><span class="glyphicon glyphicon-eye-open"></span> '.$userProducer->producer->name.'</a> '; | |||
} | |||
return $html; | |||
} | |||
], | |||
[ | |||
'class' => 'yii\grid\ActionColumn', | |||
'template' => '{switch} ', | |||
'headerOptions' => ['class' => 'column-actions'], | |||
'contentOptions' => ['class' => 'column-actions'], | |||
'buttons' => [ | |||
'view' => function ($url, $user) { | |||
return Html::a('<span class="glyphicon glyphicon-eye-open"></span>', | |||
Yii::$app->urlManager->createUrl(['user/view', 'id' => $user->id]), | |||
[ | |||
'title' => 'Voir', | |||
'class' => 'btn btn-default' | |||
]); | |||
}, | |||
'update' => function ($url, $user) { | |||
return Html::a('<span class="glyphicon glyphicon-pencil"></span>', | |||
Yii::$app->urlManager->createUrl(['user/update', 'id' => $user->id]), | |||
[ | |||
'title' => 'Modifier', | |||
'class' => 'btn btn-default' | |||
]); | |||
}, | |||
'switch' => function($url, $model) use ($userModule, $userCurrent) { | |||
if($userModule->getAuthorizationChecker()->isGrantedAsAdministrator($userCurrent)) { | |||
return Html::a('<i class="fa fa-fw fa-user-secret"></i>', | |||
Yii::$app->urlManager->createUrl(['user/switch-identity', 'id' => $model->id]), | |||
[ | |||
'title' => 'Prendre la main', | |||
'class' => 'btn btn-default' | |||
]); | |||
} | |||
} | |||
], | |||
], | |||
], | |||
]); ?> |
@@ -78,11 +78,11 @@ $distributionModule = DistributionModule::getInstance(); | |||
<?php if(!$model->email): ?> | |||
<?= $form->field($model, 'send_mail_welcome')->checkbox() ?> | |||
<?php endif; ?> | |||
<?= $form->field($model, 'address')->textarea() ?> | |||
<?= $form->field($model, 'email_sending_invoicing_documents') | |||
->textInput() | |||
->hint("Utilisé pour l'envoi des documents (devis, bons de livraisons et factures)") | |||
?> | |||
<?= $form->field($model, 'address')->textarea() ?> | |||
</div> | |||
</div> | |||
@@ -61,11 +61,11 @@ class UserSearch extends User | |||
]; | |||
} | |||
public function search($params = []) | |||
public function search($params = [], $producer = null) | |||
{ | |||
$userModule = UserModule::getInstance(); | |||
$producerModule = ProducerModule::getInstance(); | |||
$producer = GlobalParam::getCurrentProducer(); | |||
//$producer = GlobalParam::getCurrentProducer(); | |||
$query = User::find() | |||
->select( | |||
@@ -93,7 +93,9 @@ class UserSearch extends User | |||
. '`user`.type, ' | |||
. '(SELECT COUNT(*) FROM `order` WHERE `user`.id = `order`.id_user) AS count_orders'); | |||
$query->innerJoin('user_producer', 'user.id = user_producer.id_user AND user_producer.id_producer = :id_producer AND user_producer.active = 1', [':id_producer' => $producer->id]); | |||
if($producer) { | |||
$query->innerJoin('user_producer', 'user.id = user_producer.id_user AND user_producer.id_producer = :id_producer AND user_producer.active = 1', [':id_producer' => $producer->id]); | |||
} | |||
$dataProvider = new ActiveDataProvider([ | |||
'query' => $query, | |||
@@ -102,7 +104,7 @@ class UserSearch extends User | |||
'defaultOrder' => ['created_at' => SORT_DESC] | |||
], | |||
'pagination' => [ | |||
'pageSize' => $producerModule->getConfig('option_pagesize_user', $producer), | |||
'pageSize' => $producer ? $producerModule->getConfig('option_pagesize_user', $producer) : 20, | |||
], | |||
]); | |||
@@ -31,6 +31,13 @@ class UserProducerRepository extends AbstractRepository | |||
->findOne(); | |||
} | |||
public function findOneUserProducerById(int $id): ?UserProducer | |||
{ | |||
return $this->createQuery() | |||
->filterById($id) | |||
->findOne(); | |||
} | |||
public function findUserProducersByUser(User $user, bool $active = true, bool $bookmark = true) | |||
{ | |||
return $this->createQuery() |