$userModule = $this->getUserModule(); | $userModule = $this->getUserModule(); | ||||
$producer = $this->getProducerCurrent(); | $producer = $this->getProducerCurrent(); | ||||
$userSearch = new UserSearch(); | $userSearch = new UserSearch(); | ||||
$usersArray = $userSearch->search()->query->all(); | |||||
$usersArray = $userSearch->search([], $producer)->query->all(); | |||||
$modelAccessUserProducerForm = new AccessUserProducerForm; | $modelAccessUserProducerForm = new AccessUserProducerForm; | ||||
if ($modelAccessUserProducerForm->load(\Yii::$app->request->post()) && $modelAccessUserProducerForm->validate()) { | if ($modelAccessUserProducerForm->load(\Yii::$app->request->post()) && $modelAccessUserProducerForm->validate()) { |
<?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(); | |||||
} | |||||
} | |||||
} |
bool $sectionInactiveUsers = false) | bool $sectionInactiveUsers = false) | ||||
{ | { | ||||
$pointSaleModule = $this->getPointSaleModule(); | $pointSaleModule = $this->getPointSaleModule(); | ||||
$producer = $this->getProducerCurrent(); | |||||
$searchModel = new UserSearch(); | $searchModel = new UserSearch(); | ||||
$dataProvider = $searchModel->search([ | $dataProvider = $searchModel->search([ | ||||
'UserSearch' => array_merge( | 'UserSearch' => array_merge( | ||||
Yii::$app->request->queryParams['UserSearch'] : | Yii::$app->request->queryParams['UserSearch'] : | ||||
[] | [] | ||||
) | ) | ||||
]); | |||||
], $producer); | |||||
$producer = $this->getProducerCurrent(); | $producer = $this->getProducerCurrent(); | ||||
$pointsSaleArray = $pointSaleModule->findPointSales(); | $pointsSaleArray = $pointSaleModule->findPointSales(); |
$versionOpendistribLabel = ''; | $versionOpendistribLabel = ''; | ||||
if ($producer) { | if ($producer) { | ||||
$backgroundLabelVersionOpendistrib = 'black'; | $backgroundLabelVersionOpendistrib = 'black'; | ||||
if(!$producerModule->isUpToDateWithOpendistribVersion($producer)) { | |||||
if (!$producerModule->isUpToDateWithOpendistribVersion($producer)) { | |||||
$backgroundLabelVersionOpendistrib = 'green'; | $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 = ''; | $countTicketsProducerUnreadLabel = ''; | ||||
$countTicketsLabel = '<span class="pull-right-container"><small class="label pull-right bg-green">' . $countTicketsAdminUnread . '</small></span>'; | $countTicketsLabel = '<span class="pull-right-container"><small class="label pull-right bg-green">' . $countTicketsAdminUnread . '</small></span>'; | ||||
} else { | } else { | ||||
$countTicketsAdminOpen = $ticketModule->getRepository()->countTicketsAdminStatusOpen(); | $countTicketsAdminOpen = $ticketModule->getRepository()->countTicketsAdminStatusOpen(); | ||||
if($countTicketsAdminOpen) { | |||||
if ($countTicketsAdminOpen) { | |||||
$countTicketsLabel = '<span class="pull-right-container"><small class="label pull-right bg-blue">' . $countTicketsAdminOpen . '</small></span>'; | $countTicketsLabel = '<span class="pull-right-container"><small class="label pull-right bg-blue">' . $countTicketsAdminOpen . '</small></span>'; | ||||
} | } | ||||
} | } | ||||
$countProducerInvoicesUnpaidLabel = ''; | $countProducerInvoicesUnpaidLabel = ''; | ||||
$countProducerInvoicesUnpaid = $this->getProducerModule()->getDolibarrUtils() | $countProducerInvoicesUnpaid = $this->getProducerModule()->getDolibarrUtils() | ||||
->countDolibarrProducerInvoicesUnpaid($producer); | ->countDolibarrProducerInvoicesUnpaid($producer); | ||||
if($countProducerInvoicesUnpaid > 1) { | |||||
if ($countProducerInvoicesUnpaid > 1) { | |||||
$countProducerInvoicesUnpaidLabelColor = ($countProducerInvoicesUnpaid > 2) ? 'red' : 'orange'; | $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>'; | |||||
} | } | ||||
?> | ?> | ||||
'visible' => $isUserCurrentGrantedAsAdministrator, | 'visible' => $isUserCurrentGrantedAsAdministrator, | ||||
'template' => '<a href="{url}">{icon} {label}' . $countTicketsLabel . '</a>' | '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', | 'label' => 'Statistiques', | ||||
'icon' => 'line-chart', | 'icon' => 'line-chart', |
<?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' | |||||
]); | |||||
} | |||||
} | |||||
], | |||||
], | |||||
], | |||||
]); ?> |
<?php if(!$model->email): ?> | <?php if(!$model->email): ?> | ||||
<?= $form->field($model, 'send_mail_welcome')->checkbox() ?> | <?= $form->field($model, 'send_mail_welcome')->checkbox() ?> | ||||
<?php endif; ?> | <?php endif; ?> | ||||
<?= $form->field($model, 'address')->textarea() ?> | |||||
<?= $form->field($model, 'email_sending_invoicing_documents') | <?= $form->field($model, 'email_sending_invoicing_documents') | ||||
->textInput() | ->textInput() | ||||
->hint("Utilisé pour l'envoi des documents (devis, bons de livraisons et factures)") | ->hint("Utilisé pour l'envoi des documents (devis, bons de livraisons et factures)") | ||||
?> | ?> | ||||
<?= $form->field($model, 'address')->textarea() ?> | |||||
</div> | </div> | ||||
</div> | </div> | ||||
]; | ]; | ||||
} | } | ||||
public function search($params = []) | |||||
public function search($params = [], $producer = null) | |||||
{ | { | ||||
$userModule = UserModule::getInstance(); | $userModule = UserModule::getInstance(); | ||||
$producerModule = ProducerModule::getInstance(); | $producerModule = ProducerModule::getInstance(); | ||||
$producer = GlobalParam::getCurrentProducer(); | |||||
//$producer = GlobalParam::getCurrentProducer(); | |||||
$query = User::find() | $query = User::find() | ||||
->select( | ->select( | ||||
. '`user`.type, ' | . '`user`.type, ' | ||||
. '(SELECT COUNT(*) FROM `order` WHERE `user`.id = `order`.id_user) AS count_orders'); | . '(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([ | $dataProvider = new ActiveDataProvider([ | ||||
'query' => $query, | 'query' => $query, | ||||
'defaultOrder' => ['created_at' => SORT_DESC] | 'defaultOrder' => ['created_at' => SORT_DESC] | ||||
], | ], | ||||
'pagination' => [ | 'pagination' => [ | ||||
'pageSize' => $producerModule->getConfig('option_pagesize_user', $producer), | |||||
'pageSize' => $producer ? $producerModule->getConfig('option_pagesize_user', $producer) : 20, | |||||
], | ], | ||||
]); | ]); | ||||
->findOne(); | ->findOne(); | ||||
} | } | ||||
public function findOneUserProducerById(int $id): ?UserProducer | |||||
{ | |||||
return $this->createQuery() | |||||
->filterById($id) | |||||
->findOne(); | |||||
} | |||||
public function findUserProducersByUser(User $user, bool $active = true, bool $bookmark = true) | public function findUserProducersByUser(User $user, bool $active = true, bool $bookmark = true) | ||||
{ | { | ||||
return $this->createQuery() | return $this->createQuery() |