@@ -132,6 +132,11 @@ class StatsAdminController extends BackendController | |||
'data' => $data, | |||
]); | |||
} | |||
public function actionMatomo() | |||
{ | |||
return $this->render('matomo'); | |||
} | |||
} | |||
?> |
@@ -0,0 +1,87 @@ | |||
<?php | |||
/** | |||
* Copyright distrib (2018) | |||
* | |||
* contact@opendistrib.net | |||
* | |||
* 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 common\logic\Ticket\Ticket\Model\Ticket; | |||
use common\logic\Ticket\Ticket\Model\TicketSearch; | |||
use yii\filters\VerbFilter; | |||
use yii\filters\AccessControl; | |||
/** | |||
* UserController implements the CRUD actions for User model. | |||
*/ | |||
class SupportAdminController extends SupportController | |||
{ | |||
public function behaviors() | |||
{ | |||
return [ | |||
'verbs' => [ | |||
'class' => VerbFilter::class, | |||
'actions' => [], | |||
], | |||
'access' => [ | |||
'class' => AccessControl::class, | |||
'rules' => [ | |||
[ | |||
'allow' => true, | |||
'roles' => ['@'], | |||
'matchCallback' => function ($rule, $action) { | |||
return $this->getUserManager()->isCurrentAdmin(); | |||
} | |||
] | |||
], | |||
], | |||
]; | |||
} | |||
public function actionIndex() | |||
{ | |||
$searchTicket = new TicketSearch(); | |||
$dataProviderTicketOpen = $searchTicket->search('admin', ['TicketSearch' => ['status' => Ticket::STATUS_OPEN]]); | |||
$dataProviderTicketClosed = $searchTicket->search('admin', ['TicketSearch' => ['status' => Ticket::STATUS_CLOSED]]); | |||
return $this->render('@backend/views/support/index', [ | |||
'context' => 'admin', | |||
'searchTicket' => $searchTicket, | |||
'dataProviderTicketOpen' => $dataProviderTicketOpen, | |||
'dataProviderTicketClosed' => $dataProviderTicketClosed | |||
]); | |||
} | |||
} |
@@ -0,0 +1,151 @@ | |||
<?php | |||
/** | |||
* Copyright distrib (2018) | |||
* | |||
* contact@opendistrib.net | |||
* | |||
* 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 common\logic\Ticket\Ticket\Model\Ticket; | |||
use common\logic\Ticket\Ticket\Model\TicketSearch; | |||
use yii\filters\AccessControl; | |||
use yii\filters\VerbFilter; | |||
use yii\helpers\Html; | |||
use yii\web\NotFoundHttpException; | |||
class SupportController extends BackendController | |||
{ | |||
public function behaviors() | |||
{ | |||
return [ | |||
'verbs' => [ | |||
'class' => VerbFilter::class, | |||
'actions' => [ | |||
], | |||
], | |||
'access' => [ | |||
'class' => AccessControl::class, | |||
'rules' => [ | |||
[ | |||
'allow' => true, | |||
'roles' => ['@'], | |||
'matchCallback' => function ($rule, $action) { | |||
return $this->getUserManager()->hasAccessBackend(); | |||
} | |||
] | |||
], | |||
], | |||
]; | |||
} | |||
public function actionIndex() | |||
{ | |||
$searchTicket = new TicketSearch(); | |||
$dataProviderTicketOpen = $searchTicket->search('producer', ['TicketSearch' => ['status' => Ticket::STATUS_OPEN]]); | |||
$dataProviderTicketClosed = $searchTicket->search('producer', ['TicketSearch' => ['status' => Ticket::STATUS_CLOSED]]); | |||
return $this->render('index', [ | |||
'context' => 'producer', | |||
'searchTicket' => $searchTicket, | |||
'dataProviderTicketOpen' => $dataProviderTicketOpen, | |||
'dataProviderTicketClosed' => $dataProviderTicketClosed | |||
]); | |||
} | |||
public function actionCreate() | |||
{ | |||
$userCurrent = $this->getUserCurrent(); | |||
$ticketManager = $this->getTicketManager(); | |||
$ticketMessageManager = $this->getTicketMessageManager(); | |||
$ticket = $ticketManager->instanciateTicket($this->getProducerCurrent(), $userCurrent); | |||
if ($ticket->load(\Yii::$app->request->post()) && $ticketManager->saveCreate($ticket)) { | |||
$ticketMessageManager->createTicketMessage($ticket, $userCurrent, $ticket->message); | |||
$this->setFlash('success', 'Le ticket a bien été créé.'); | |||
return $this->redirect(['view', 'id' => $ticket->id]); | |||
} else { | |||
return $this->render('@backend/views/support/create', [ | |||
'ticket' => $ticket, | |||
]); | |||
} | |||
} | |||
public function actionView(int $id) | |||
{ | |||
$ticketManager = $this->getTicketManager(); | |||
$ticketMessageManager = $this->getTicketMessageManager(); | |||
$ticket = $this->findTicket($id); | |||
$ticketManager->viewTicket($ticket, $this->getUserCurrent()); | |||
$ticketMessage = $ticketMessageManager->instanciateTicketMessage($ticket, $this->getUserCurrent()); | |||
if ($ticketMessage->load(\Yii::$app->request->post()) && $ticketManager->createTicketMessage($ticketMessage)) { | |||
return $this->redirect(['view', 'id' => $ticket->id, '#' => 'bottom']); | |||
} | |||
return $this->render('@backend/views/support/view', [ | |||
'ticket' => $ticket, | |||
'ticketMessageResponse' => $ticketMessage | |||
]); | |||
} | |||
public function actionClose(int $id) | |||
{ | |||
$ticketManager = $this->getTicketManager(); | |||
$ticket = $this->findTicket($id); | |||
$ticketManager->closeTicket($ticket); | |||
$this->addFlash('success', "Le ticket <strong>".Html::encode($ticket->subject)."</strong> a bien été fermé."); | |||
return $this->redirect(['index']); | |||
} | |||
public function actionOpen(int $id) | |||
{ | |||
$ticketManager = $this->getTicketManager(); | |||
$ticket = $this->findTicket($id); | |||
$ticketManager->openTicket($ticket); | |||
$this->addFlash('success', "Le ticket a bien été ouvert."); | |||
return $this->redirect(['index']); | |||
} | |||
public function findTicket(int $id) | |||
{ | |||
$ticketManager = $this->getTicketManager(); | |||
$ticket = $ticketManager->findOneTicketById($id); | |||
if ($ticket && $ticketManager->hasTicketAccess($ticket, $this->getUserCurrent())) { | |||
return $ticket; | |||
} else { | |||
throw new NotFoundHttpException("Le ticket est introuvable."); | |||
} | |||
} | |||
} |
@@ -78,7 +78,7 @@ $this->addBreadcrumb($this->getTitle()); | |||
<ul class="contacts"> | |||
<li> | |||
<span class="glyphicon glyphicon-earphone"></span> | |||
<p><a href="mailto:contact@opendistrib.net?subject=Demande de rappel">Demander à être rappelé</a> en indiquant vos disponibilités.</p> | |||
<p><?= Html::a('Prendre rendez-vous', Yii::$app->params['appointmentUrl'], ['class' => '', 'target' => '_blank']); ?></p> | |||
</li> | |||
<li> | |||
<span class="glyphicon glyphicon-envelope"></span> |
@@ -53,7 +53,9 @@ $producer = GlobalParam::getCurrentProducer(); | |||
<header class="main-header"> | |||
<?= Html::a('<span class="logo-mini"><img src="' . Yii::$app->urlManagerBackend->getBaseUrl() . '/img/logo-distrib.png" /></span><span class="logo-lg"><img src="' . Yii::$app->urlManagerBackend->getBaseUrl() . '/img/logo-distrib.png" /></span>', Yii::$app->homeUrl, ['class' => 'logo']) ?> | |||
<!-- <?= Html::a('<span class="logo-mini"><img src="' . Yii::$app->urlManagerBackend->getBaseUrl() . '/img/logo-distrib.png" /></span><span class="logo-lg"><img src="' . Yii::$app->urlManagerBackend->getBaseUrl() . '/img/logo-distrib.png" /></span>', Yii::$app->homeUrl, ['class' => 'logo']) ?>--> | |||
<?= Html::a('Opendistrib', Yii::$app->homeUrl, ['class' => 'logo']); ?> | |||
<nav class="navbar navbar-static-top" role="navigation"> | |||
@@ -61,42 +63,88 @@ $producer = GlobalParam::getCurrentProducer(); | |||
<span class="sr-only">Toggle navigation</span> | |||
</a> | |||
<span class="producer-panel<?php if(!$producer->logo): ?> without-logo<?php endif; ?>"> | |||
<?php if($producer->logo): ?> | |||
<span class="logo"> | |||
<img class="img-logo" | |||
src="<?= \Yii::$app->urlManagerProducer->baseUrl; ?>/uploads/<?= $producer->logo; ?>" | |||
alt="Logo <?= Html::encode($producer->name) ?>" /> | |||
</span> | |||
<?php endif; ?> | |||
<div class="title"> | |||
<?= Html::encode($producer->name) ?> | |||
<?php if (!$producer->active): ?> | |||
<span class="label label-danger">Hors-ligne</span> | |||
<?php endif; ?> | |||
</div> | |||
</span> | |||
<div class="navbar-custom-menu"> | |||
<?php | |||
<?php | |||
$usersArray = $userManager->queryUsersBy(['id_producer' => GlobalParam::getCurrentProducerId()]) | |||
->andWhere('CAST(FROM_UNIXTIME(user.created_at) AS date) > \'' . date("Y-m-d", strtotime("-7 days")) . '\'') | |||
->orderBy('created_at DESC') | |||
->all(); | |||
$usersArray = $userManager->queryUsersBy(['id_producer' => GlobalParam::getCurrentProducerId()]) | |||
->andWhere('CAST(FROM_UNIXTIME(user.created_at) AS date) > \'' . date("Y-m-d", strtotime("-7 days")) . '\'') | |||
->orderBy('created_at DESC') | |||
->all(); | |||
?> | |||
?> | |||
<ul class="nav navbar-nav"> | |||
<?php | |||
<?php if ($userManager->isCurrentAdmin()): ?> | |||
<li class="dropdown producer-menu"> | |||
<a href="#" class="dropdown-toggle" data-toggle="dropdown"> | |||
<span class="glyphicon glyphicon-grain"></span> | |||
<span class="hidden-xs hidden-sm">Producteurs</span> | |||
<i class="fa fa-caret-down"></i> | |||
</a> | |||
<ul class="dropdown-menu"> | |||
<li class="header"> <strong>Producteurs en ligne</strong></li> | |||
<?php $producersArray = Producer::find()->orderBy('name ASC')->all(); ?> | |||
<?php foreach ($producersArray as $producer): ?> | |||
<?php if ($producer->active == 1): ?> | |||
<li> | |||
<a href="<?= Yii::$app->urlManagerBackend->createUrl(['site/change-producer', 'id' => $producer->id]); ?>"><?= Html::encode($producer->name) ?></a> | |||
</li> | |||
<?php endif; ?> | |||
<?php endforeach; ?> | |||
<li class="header"><a href="javascript:void(0);" id="link-display-producers-offline">Afficher | |||
les producteurs hors-ligne</a></li> | |||
<?php foreach ($producersArray as $producer): ?> | |||
<?php if ($producer->active != 1): ?> | |||
<li class="offline"> | |||
<a href="<?= Yii::$app->urlManagerBackend->createUrl(['site/change-producer', 'id' => $producer->id]); ?>"><?= Html::encode($producer->name) ?></a> | |||
</li> | |||
<?php endif; ?> | |||
<?php endforeach; ?> | |||
</ul> | |||
</li> | |||
<?php endif; ?> | |||
$pastDistributionsArray = Distribution::find() | |||
->where(['<', 'distribution.date', date('Y-m-d')]) | |||
->andWhere([ | |||
'distribution.id_producer' => GlobalParam::getCurrentProducerId(), | |||
'distribution.active' => 1 | |||
]) | |||
->orderBy('date DESC') | |||
->limit(3) | |||
->all(); | |||
<?php | |||
$pastDistributionsArray = Distribution::find() | |||
->where(['<', 'distribution.date', date('Y-m-d')]) | |||
->andWhere([ | |||
'distribution.id_producer' => GlobalParam::getCurrentProducerId(), | |||
'distribution.active' => 1 | |||
]) | |||
->orderBy('date DESC') | |||
->limit(3) | |||
->all(); | |||
$pastDistributionsArray = array_reverse($pastDistributionsArray); | |||
$pastDistributionsArray = array_reverse($pastDistributionsArray); | |||
$incomingDistributionsArray = Distribution::find() | |||
->where(['>=', 'distribution.date', date('Y-m-d')]) | |||
->andWhere([ | |||
'distribution.id_producer' => GlobalParam::getCurrentProducerId(), | |||
'distribution.active' => 1 | |||
]) | |||
->orderBy('date ASC') | |||
->limit(20) | |||
->all(); | |||
?> | |||
$incomingDistributionsArray = Distribution::find() | |||
->where(['>=', 'distribution.date', date('Y-m-d')]) | |||
->andWhere([ | |||
'distribution.id_producer' => GlobalParam::getCurrentProducerId(), | |||
'distribution.active' => 1 | |||
]) | |||
->orderBy('date ASC') | |||
->limit(20) | |||
->all(); | |||
?> | |||
<li class="dropdown distributions-menu notifications-menu"> | |||
<a href="#" class="dropdown-toggle" data-toggle="dropdown"> | |||
@@ -104,177 +152,137 @@ $producer = GlobalParam::getCurrentProducer(); | |||
</a> | |||
<ul class="dropdown-menu"> | |||
<?php if (count($pastDistributionsArray)): ?> | |||
<li class="header">3 dernières distributions :</li> | |||
<li> | |||
<ul class="menu"> | |||
<?php foreach ($pastDistributionsArray as $distribution): ?> | |||
<li> | |||
<a href="<?= Yii::$app->urlManagerBackend->createUrl(['distribution/index', 'date' => $distribution->date]); ?>"> | |||
<h5><?= strftime('%A %d %B', strtotime($distribution->date)) ?></h5> | |||
</a> | |||
</li> | |||
<?php endforeach; ?> | |||
</ul> | |||
</li> | |||
<?php endif; ?> | |||
<?php if (count($pastDistributionsArray)): ?> | |||
<li class="header">3 dernières distributions :</li> | |||
<li> | |||
<ul class="menu"> | |||
<?php foreach ($pastDistributionsArray as $distribution): ?> | |||
<li> | |||
<a href="<?= Yii::$app->urlManagerBackend->createUrl(['distribution/index', 'date' => $distribution->date]); ?>"> | |||
<h5><?= strftime('%A %d %B', strtotime($distribution->date)) ?></h5> | |||
</a> | |||
</li> | |||
<?php endforeach; ?> | |||
</ul> | |||
</li> | |||
<?php endif; ?> | |||
<?php if (count($incomingDistributionsArray)): ?> | |||
<li class="header">Prochaines distributions :</li> | |||
<li> | |||
<ul class="menu"> | |||
<?php foreach ($incomingDistributionsArray as $distribution): ?> | |||
<li> | |||
<a href="<?= Yii::$app->urlManagerBackend->createUrl(['distribution/index', 'date' => $distribution->date]); ?>"> | |||
<h5><?= strftime('%A %d %B', strtotime($distribution->date)) ?></h5> | |||
</a> | |||
</li> | |||
<?php endforeach; ?> | |||
</ul> | |||
</li> | |||
<?php else: ?> | |||
<li class="header"> | |||
Aucune distribution prévue.<br/> | |||
<a class="btn btn-default" | |||
href="<?= Yii::$app->urlManagerBackend->createUrl(['distribution/index']); ?>">Gérer | |||
mes distributions</a> | |||
</li> | |||
<?php endif; ?> | |||
<?php if (count($incomingDistributionsArray)): ?> | |||
<li class="header">Prochaines distributions :</li> | |||
<li> | |||
<ul class="menu"> | |||
<?php foreach ($incomingDistributionsArray as $distribution): ?> | |||
<li> | |||
<a href="<?= Yii::$app->urlManagerBackend->createUrl(['distribution/index', 'date' => $distribution->date]); ?>"> | |||
<h5><?= strftime('%A %d %B', strtotime($distribution->date)) ?></h5> | |||
</a> | |||
</li> | |||
<?php endforeach; ?> | |||
</ul> | |||
</li> | |||
<?php else: ?> | |||
<li class="header"> | |||
Aucune distribution prévue.<br/> | |||
<a class="btn btn-default" | |||
href="<?= Yii::$app->urlManagerBackend->createUrl(['distribution/index']); ?>">Gérer | |||
mes distributions</a> | |||
</li> | |||
<?php endif; ?> | |||
</ul> | |||
</li> | |||
<li class="dropdown users-menu notifications-menu"> | |||
<a href="#" class="dropdown-toggle" data-toggle="dropdown"> | |||
<i class="fa fa-user-plus"></i> | |||
<?php if (count($usersArray)): ?><span | |||
class="label label-success"><?= count($usersArray) ?></span> | |||
<?php else: ?><span class="label label-warning">0</span><?php endif; ?> | |||
<?php if (count($usersArray)): ?><span | |||
class="label label-success"><?= count($usersArray) ?></span> | |||
<?php else: ?><span class="label label-warning">0</span><?php endif; ?> | |||
</a> | |||
<ul class="dropdown-menu"> | |||
<?php if (count($usersArray)): ?> | |||
<li class="header">Inscriptions des 7 derniers jours</li> | |||
<li> | |||
<ul class="menu"> | |||
<?php foreach ($usersArray as $user): ?> | |||
<li> | |||
<a href="<?= Yii::$app->urlManagerBackend->createUrl(['user/update', 'id' => $user['user_id']]); ?>"> | |||
<h5><?= Html::encode((isset($user['name_legal_person']) && strlen($user['name_legal_person'])) ? $user['name_legal_person'] : $user['name'] . ' ' . $user['lastname']); ?> | |||
<small> | |||
<i class="fa fa-clock-o"></i> <?= date('d/m/Y à H:i', $user['created_at']); ?> | |||
</small> | |||
</h5> | |||
</a> | |||
</li> | |||
<?php endforeach; ?> | |||
</ul> | |||
</li> | |||
<?php else: ?> | |||
<li class="header">Aucun nouvel inscrit ces 7 derniers jours.</li> | |||
<?php endif; ?> | |||
<?php if (count($usersArray)): ?> | |||
<li class="header">Inscriptions des 7 derniers jours</li> | |||
<li> | |||
<ul class="menu"> | |||
<?php foreach ($usersArray as $user): ?> | |||
<li> | |||
<a href="<?= Yii::$app->urlManagerBackend->createUrl(['user/update', 'id' => $user['user_id']]); ?>"> | |||
<h5><?= Html::encode((isset($user['name_legal_person']) && strlen($user['name_legal_person'])) ? $user['name_legal_person'] : $user['name'] . ' ' . $user['lastname']); ?> | |||
<small> | |||
<i class="fa fa-clock-o"></i> <?= date('d/m/Y à H:i', $user['created_at']); ?> | |||
</small> | |||
</h5> | |||
</a> | |||
</li> | |||
<?php endforeach; ?> | |||
</ul> | |||
</li> | |||
<?php else: ?> | |||
<li class="header">Aucun nouvel inscrit ces 7 derniers jours.</li> | |||
<?php endif; ?> | |||
</ul> | |||
</li> | |||
<?php | |||
<?php | |||
$usersNegativeCreditArray = $userManager->queryUsersBy(['id_producer' => GlobalParam::getCurrentProducerId()]) | |||
->andWhere('user_producer.credit < 0') | |||
->orderBy('lastname, name ASC') | |||
->all(); | |||
$usersNegativeCreditArray = $userManager->queryUsersBy(['id_producer' => GlobalParam::getCurrentProducerId()]) | |||
->andWhere('user_producer.credit < 0') | |||
->orderBy('lastname, name ASC') | |||
->all(); | |||
?> | |||
?> | |||
<li class="dropdown users-negative-credit-menu notifications-menu"> | |||
<a href="#" class="dropdown-toggle" data-toggle="dropdown"> | |||
<i class="fa fa-euro"></i> | |||
<?php if (count($usersNegativeCreditArray)): ?><span | |||
class="label label-warning"><?= count($usersNegativeCreditArray) ?></span> | |||
<?php else: ?><span class="label label-success">0</span><?php endif; ?> | |||
<?php if (count($usersNegativeCreditArray)): ?><span | |||
class="label label-warning"><?= count($usersNegativeCreditArray) ?></span> | |||
<?php else: ?><span class="label label-success">0</span><?php endif; ?> | |||
</a> | |||
<ul class="dropdown-menu"> | |||
<?php if (count($usersNegativeCreditArray)): ?> | |||
<li class="header">Utilisateurs au crédit négatif</li> | |||
<li> | |||
<ul class="menu"> | |||
<?php foreach ($usersNegativeCreditArray as $user): ?> | |||
<li> | |||
<a href="<?= Yii::$app->urlManagerBackend->createUrl(['user/credit', 'id' => $user['user_id']]); ?>"> | |||
<h5><?= $userManager->getUsernameFromArray($user); ?> | |||
<small> | |||
<i class="fa fa-euro"></i> <?= Price::format($user['credit']); ?> | |||
</small> | |||
</h5> | |||
</a> | |||
</li> | |||
<?php endforeach; ?> | |||
</ul> | |||
</li> | |||
<?php else: ?> | |||
<li class="header">Aucun de vos utilisateurs n'a de crédit négatif.</li> | |||
<?php endif; ?> | |||
</ul> | |||
</li> | |||
<?php if ( $userManager->isCurrentProducer() || $userManager->isCurrentAdmin()): ?> | |||
<li class="dropdown producer-menu"> | |||
<a href="#" class="dropdown-toggle" data-toggle="dropdown"> | |||
<?php if ($producer->active): ?> | |||
<i class="fa fa-home"></i> | |||
<?php else: ?> | |||
<span class="label label-danger">Hors-ligne</span> | |||
<?php endif; ?> | |||
<span><?= Html::encode($producerManager->getNameProducer(Yii::$app->user->identity)); ?></span> | |||
<i class="fa fa-caret-down"></i> | |||
</a> | |||
<ul class="dropdown-menu"> | |||
<?php if ( $userManager->isCurrentAdmin()): ?> | |||
<li> | |||
<a href="<?= Yii::$app->urlManagerProducer->createAbsoluteUrl(['site/index', 'slug_producer' => GlobalParam::getCurrentProducer()->slug]); ?>"> | |||
<i class="fa fa-th-large"></i> | |||
<span class="hidden-xs">Espace du producteur</span> | |||
</a> | |||
</li> | |||
<li class="header"> <strong>Producteurs en ligne</strong></li> | |||
<?php $producersArray = Producer::find()->orderBy('name ASC')->all(); ?> | |||
<?php foreach ($producersArray as $producer): ?> | |||
<?php if($producer->active == 1): ?> | |||
<li> | |||
<a href="<?= Yii::$app->urlManagerBackend->createUrl(['site/change-producer', 'id' => $producer->id]); ?>"><?= Html::encode($producer->name) ?></a> | |||
</li> | |||
<?php endif; ?> | |||
<?php endforeach; ?> | |||
<li class="header"><a href="javascript:void(0);" id="link-display-producers-offline">Afficher les producteurs hors-ligne</a></li> | |||
<?php foreach ($producersArray as $producer): ?> | |||
<?php if($producer->active != 1): ?> | |||
<li class="offline"> | |||
<a href="<?= Yii::$app->urlManagerBackend->createUrl(['site/change-producer', 'id' => $producer->id]); ?>"><?= Html::encode($producer->name) ?></a> | |||
</li> | |||
<?php endif; ?> | |||
<?php endforeach; ?> | |||
<?php else: ?> | |||
<?php if (count($usersNegativeCreditArray)): ?> | |||
<li class="header">Utilisateurs au crédit négatif</li> | |||
<li> | |||
<ul class="menu"> | |||
<?php foreach ($usersNegativeCreditArray as $user): ?> | |||
<li> | |||
<a href="<?= Yii::$app->urlManagerProducer->createAbsoluteUrl(['site/index', 'slug_producer' => GlobalParam::getCurrentProducer()->slug]); ?>"> | |||
<i class="fa fa-th-large"></i> | |||
<span class="hidden-xs">Mon espace</span> | |||
<a href="<?= Yii::$app->urlManagerBackend->createUrl(['user/credit', 'id' => $user['user_id']]); ?>"> | |||
<h5><?= $userManager->getUsernameFromArray($user); ?> | |||
<small> | |||
<i class="fa fa-euro"></i> <?= Price::format($user['credit']); ?> | |||
</small> | |||
</h5> | |||
</a> | |||
</li> | |||
<?php endif; ?> | |||
</ul> | |||
</li> | |||
<?php endif; ?> | |||
<?php endforeach; ?> | |||
</ul> | |||
</li> | |||
<?php else: ?> | |||
<li class="header">Aucun de vos utilisateurs n'a de crédit négatif.</li> | |||
<?php endif; ?> | |||
</ul> | |||
</li> | |||
<?php if ($userManager->isCurrentProducer() || $userManager->isCurrentAdmin()): ?> | |||
<li> | |||
<a href="<?= Yii::$app->urlManagerProducer->createAbsoluteUrl(['site/index', 'slug_producer' => GlobalParam::getCurrentProducer()->slug]); ?>"> | |||
<span class="glyphicon glyphicon-eye-open"></span> | |||
<span class="hidden-xs hidden-sm">Mon espace producteur</span> | |||
</a> | |||
</li> | |||
<?php endif; ?> | |||
<li class="dropdown user user-menu"> | |||
<a href="#" class="dropdown-toggle" data-toggle="dropdown"> | |||
<i class="fa fa-user"></i> | |||
<span class="hidden-xs"><?= Html::encode( GlobalParam::getCurrentUser()->name . ' ' . GlobalParam::getCurrentUser()->lastname); ?></span> | |||
<span class="hidden-xs hidden-sm"><?= Html::encode(GlobalParam::getCurrentUser()->name . ' ' . substr(GlobalParam::getCurrentUser()->lastname, 0, 1) .'.'); ?></span> | |||
<i class="fa fa-caret-down"></i> | |||
</a> | |||
<ul class="dropdown-menu"> | |||
<li><a href="<?= Yii::$app->urlManagerFrontend->createAbsoluteUrl(['site/index']); ?>"><i | |||
class="fa fa-chevron-left"></i> Retour à l'accueil</a></li> | |||
<li><a href="<?= Yii::$app->urlManagerFrontend->createAbsoluteUrl(['user/update']); ?>"><i | |||
class="fa fa-user"></i> Profil</a></li> | |||
class="fa fa-user"></i> Mon profil</a></li> | |||
<li><a href="<?= Yii::$app->urlManagerBackend->createUrl(['site/logout']); ?>"><i | |||
class="fa fa-sign-out"></i> Déconnexion</a></li> | |||
</ul> |
@@ -37,62 +37,88 @@ | |||
*/ | |||
use common\helpers\GlobalParam; | |||
use common\helpers\Opendistrib; | |||
use yii\helpers\Html; | |||
use common\logic\Ticket\Ticket\Wrapper\TicketManager; | |||
$producerManager = $this->getProducerManager(); | |||
$userManager = $this->getUserManager(); | |||
$ticketManager = $this->getTicketManager(); | |||
$producer = GlobalParam::getCurrentProducer(); | |||
?> | |||
<aside class="main-sidebar"> | |||
<section class="sidebar"> | |||
<?php | |||
$producer = GlobalParam::getCurrentProducer(); | |||
$newVersionOpendistribTemplate = ''; | |||
if($producer && !$producerManager->isUpToDateWithOpendistribVersion($producer)) { | |||
$newVersionOpendistribTemplate = '<span class="pull-right-container"><small class="label pull-right bg-orange"> </small></span>'; | |||
} | |||
$producer = GlobalParam::getCurrentProducer(); | |||
$newVersionOpendistribLabel = ''; | |||
if ($producer && !$producerManager->isUpToDateWithOpendistribVersion($producer)) { | |||
$newVersionOpendistribLabel = '<span class="pull-right-container"><small class="label pull-right bg-green">'.GlobalParam::getOpendistribVersion().'</small></span>'; | |||
} | |||
$countTicketsProducerUnreadLabel = ''; | |||
$countTicketsProducerUnread = $ticketManager->countTicketsUnreadByUser($this->getUserCurrent()); | |||
if($countTicketsProducerUnread && !$userManager->isCurrentAdmin()) { | |||
$countTicketsProducerUnreadLabel = '<span class="pull-right-container"><small class="label pull-right bg-green">'.$countTicketsProducerUnread.'</small></span>'; | |||
} | |||
$countTicketsAdminUnreadLabel = ''; | |||
$countTicketsAdminUnread = $ticketManager->countTicketsAdminUnreadByUser($this->getUserCurrent()); | |||
if($countTicketsAdminUnread && $userManager->isCurrentAdmin()) { | |||
$countTicketsAdminUnreadLabel = '<span class="pull-right-container"><small class="label pull-right bg-green">'.$countTicketsAdminUnread.'</small></span>'; | |||
} | |||
?> | |||
<?= dmstr\widgets\Menu::widget( | |||
[ | |||
'options' => ['class' => 'sidebar-menu tree', 'data-widget' => 'tree'], | |||
'items' => [ | |||
['label' => 'Tableau de bord', 'icon' => 'dashboard', 'url' => ['/site/index'], 'visible' => $userManager->isCurrentProducer()], | |||
['label' => 'Distributions', 'icon' => 'calendar', 'url' => ['/distribution/index'], 'visible' => $userManager->isCurrentProducer()], | |||
['label' => "Besoin d'aide ?", 'options' => ['class' => 'header'], 'visible' => $userManager->isCurrentProducer()], | |||
[ | |||
'label' => 'Support', | |||
'icon' => 'comments', | |||
'url' => ['support/index'], | |||
'visible' => $userManager->isCurrentProducer(), | |||
'template' => '<a href="{url}">{icon} {label}' . $countTicketsProducerUnreadLabel . '</a>' | |||
], | |||
['label' => $producer->name, 'options' => ['class' => 'header'], 'visible' => $userManager->isCurrentProducer()], | |||
['label' => 'Tableau de bord', 'icon' => 'dashboard', 'url' => ['/site/index'], 'visible' => $userManager->isCurrentProducer()], | |||
['label' => 'Distributions', 'icon' => 'calendar', 'url' => ['/distribution/index'], 'visible' => $userManager->isCurrentProducer()], | |||
[ | |||
'label' => 'Produits', | |||
'icon' => 'clone', | |||
'url' => ['/product/index'], | |||
'visible' => $userManager->isCurrentProducer(), | |||
'visible' => $userManager->isCurrentProducer(), | |||
'active' => Yii::$app->controller->id == 'product', | |||
'items' => [ | |||
['label' => 'Liste', 'icon' => 'th-list', 'url' => ['/product/index'], 'visible' => $userManager->isCurrentProducer()], | |||
['label' => 'Catégories', 'icon' => 'book', 'url' => ['/product-category/index'], 'visible' => $userManager->isCurrentProducer()], | |||
['label' => 'Import prix', 'icon' => 'upload', 'url' => ['/product/price-import'], 'visible' => $userManager->isCurrentProducer()], | |||
['label' => 'Liste', 'icon' => 'th-list', 'url' => ['/product/index'], 'visible' => $userManager->isCurrentProducer()], | |||
['label' => 'Catégories', 'icon' => 'book', 'url' => ['/product-category/index'], 'visible' => $userManager->isCurrentProducer()], | |||
['label' => 'Import prix', 'icon' => 'upload', 'url' => ['/product/price-import'], 'visible' => $userManager->isCurrentProducer()], | |||
] | |||
], | |||
['label' => 'Points de vente', 'icon' => 'map-marker', 'url' => ['/point-sale/index'], 'visible' => $userManager->isCurrentProducer(), 'active' => Yii::$app->controller->id == 'point-sale'], | |||
['label' => 'Points de vente', 'icon' => 'map-marker', 'url' => ['/point-sale/index'], 'visible' => $userManager->isCurrentProducer(), 'active' => Yii::$app->controller->id == 'point-sale'], | |||
[ | |||
'label' => 'Utilisateurs', | |||
'icon' => 'users', | |||
'url' => ['/user/index'], | |||
'items' => [ | |||
['label' => 'Liste', 'icon' => 'th-list', 'url' => ['/user/index'], 'visible' => $userManager->isCurrentProducer()], | |||
['label' => 'Groupes', 'icon' => 'users', 'url' => ['/user-group/index'], 'visible' => $userManager->isCurrentProducer()], | |||
['label' => 'Liste', 'icon' => 'th-list', 'url' => ['/user/index'], 'visible' => $userManager->isCurrentProducer()], | |||
['label' => 'Groupes', 'icon' => 'users', 'url' => ['/user-group/index'], 'visible' => $userManager->isCurrentProducer()], | |||
], | |||
], | |||
['label' => 'Abonnements', 'icon' => 'repeat', 'url' => ['/subscription/index'], 'visible' => $userManager->isCurrentProducer(), 'active' => Yii::$app->controller->id == 'subscription'], | |||
['label' => 'Communiquer', 'icon' => 'bullhorn', 'url' => ['/communicate/index'], 'visible' => $userManager->isCurrentProducer()], | |||
['label' => 'Abonnements', 'icon' => 'repeat', 'url' => ['/subscription/index'], 'visible' => $userManager->isCurrentProducer(), 'active' => Yii::$app->controller->id == 'subscription'], | |||
['label' => 'Communiquer', 'icon' => 'bullhorn', 'url' => ['/communicate/index'], 'visible' => $userManager->isCurrentProducer()], | |||
[ | |||
'label' => 'Documents', | |||
'icon' => 'clone', | |||
'url' => ['/delivery-note/index'], | |||
'items' => [ | |||
['label' => 'Bons de livraison', 'icon' => 'sticky-note-o', 'url' => ['/delivery-note/index'], 'visible' => $userManager->isCurrentProducer()], | |||
['label' => 'Factures', 'icon' => 'sticky-note-o', 'url' => ['/invoice/index'], 'visible' => $userManager->isCurrentProducer()], | |||
['label' => 'Devis', 'icon' => 'sticky-note-o', 'url' => ['/quotation/index'], 'visible' => $userManager->isCurrentProducer()], | |||
['label' => 'Bons de livraison', 'icon' => 'sticky-note-o', 'url' => ['/delivery-note/index'], 'visible' => $userManager->isCurrentProducer()], | |||
['label' => 'Factures', 'icon' => 'sticky-note-o', 'url' => ['/invoice/index'], 'visible' => $userManager->isCurrentProducer()], | |||
['label' => 'Devis', 'icon' => 'sticky-note-o', 'url' => ['/quotation/index'], 'visible' => $userManager->isCurrentProducer()], | |||
], | |||
], | |||
[ | |||
@@ -100,44 +126,53 @@ $userManager = $this->getUserManager(); | |||
'icon' => 'line-chart', | |||
'url' => ['/stats/index'], | |||
'items' => [ | |||
['label' => 'Chiffre d\'affaire', 'icon' => 'line-chart', 'url' => ['/stats/index'], 'visible' => $userManager->isCurrentProducer()], | |||
['label' => 'Rapports', 'icon' => 'pencil-square-o', 'url' => ['/report/index'], 'visible' => $userManager->isCurrentProducer()], | |||
['label' => 'Produits', 'icon' => 'table', 'url' => ['/stats/products'], 'visible' => $userManager->isCurrentProducer()], | |||
['label' => 'Chiffre d\'affaire', 'icon' => 'line-chart', 'url' => ['/stats/index'], 'visible' => $userManager->isCurrentProducer()], | |||
['label' => 'Rapports', 'icon' => 'pencil-square-o', 'url' => ['/report/index'], 'visible' => $userManager->isCurrentProducer()], | |||
['label' => 'Produits', 'icon' => 'table', 'url' => ['/stats/products'], 'visible' => $userManager->isCurrentProducer()], | |||
], | |||
], | |||
['label' => 'Paramètres', 'icon' => 'cog', 'url' => ['/producer/update'], 'visible' => $userManager->isCurrentProducer()], | |||
['label' => 'Accès', 'icon' => 'lock', 'url' => ['/access/index'], 'visible' => $userManager->isCurrentProducer()], | |||
['label' => 'Paramètres', 'icon' => 'cog', 'url' => ['/producer/update'], 'visible' => $userManager->isCurrentProducer()], | |||
['label' => 'Accès', 'icon' => 'lock', 'url' => ['/access/index'], 'visible' => $userManager->isCurrentProducer()], | |||
['label' => "Opendistrib", 'options' => ['class' => 'header'], 'visible' => $userManager->isCurrentProducer()], | |||
[ | |||
'label' => 'Développement', | |||
'icon' => 'code', | |||
'url' => ['/development/index'], | |||
'visible' => $userManager->isCurrentProducer(), | |||
'active' => Yii::$app->controller->id == 'development', | |||
'template'=>'<a href="{url}">{icon} {label}'.$newVersionOpendistribTemplate.'</a>' | |||
'label' => 'Développement', | |||
'icon' => 'code', | |||
'url' => ['/development/index'], | |||
'visible' => $userManager->isCurrentProducer(), | |||
'active' => Yii::$app->controller->id == 'development', | |||
'template' => '<a href="{url}">{icon} {label}' . $newVersionOpendistribLabel . '</a>' | |||
], | |||
['label' => 'Tarifs', 'icon' => 'euro', 'url' => ['/producer/billing'], 'visible' => $userManager->isCurrentProducer()], | |||
['label' => 'Tarifs', 'icon' => 'euro', 'url' => ['/producer/billing'], 'visible' => $userManager->isCurrentProducer()], | |||
['label' => 'Administration', 'options' => ['class' => 'header'], 'visible' => $userManager->isCurrentAdmin()], | |||
['label' => 'Producteurs', 'icon' => 'th-list', 'url' => ['/producer-admin/index'], 'visible' => $userManager->isCurrentAdmin()], | |||
['label' => 'Administration', 'options' => ['class' => 'header'], 'visible' => $userManager->isCurrentAdmin()], | |||
[ | |||
'label' => 'Tickets', | |||
'icon' => 'comments', | |||
'url' => ['support-admin/index'], | |||
'visible' => $userManager->isCurrentAdmin(), | |||
'template' => '<a href="{url}">{icon} {label}' . $countTicketsAdminUnreadLabel . '</a>' | |||
], | |||
['label' => 'Producteurs', 'icon' => 'th-list', 'url' => ['/producer-admin/index'], 'visible' => $userManager->isCurrentAdmin()], | |||
[ | |||
'label' => 'Statistiques', | |||
'icon' => 'line-chart', | |||
'url' => ['/stats-admin/turnover'], | |||
'url' => ['/stats-admin/matomo'], | |||
'visible' => $userManager->isCurrentAdmin(), | |||
'items' => [ | |||
['label' => 'Matomo', 'icon' => 'line-chart', 'url' => ['/stats-admin/matomo'], 'visible' => $userManager->isCurrentAdmin()], | |||
['label' => 'Chiffre d\'affaire', 'icon' => 'line-chart', 'url' => ['/stats-admin/turnover'], 'visible' => $userManager->isCurrentAdmin()], | |||
['label' => 'Commandes clients', 'icon' => 'calendar', 'url' => ['/stats-admin/customer-orders'], 'visible' => $userManager->isCurrentAdmin()], | |||
], | |||
], | |||
['label' => 'Tranches de prix', 'icon' => 'eur', 'url' => ['/producer-price-range-admin/index'], 'visible' => $userManager->isCurrentAdmin()], | |||
['label' => 'Taxes', 'icon' => 'eur', 'url' => ['/tax-rate-admin/index'], 'visible' => $userManager->isCurrentAdmin()], | |||
['label' => 'Communiquer', 'icon' => 'bullhorn', 'url' => ['/communicate-admin/index'], 'visible' => $userManager->isCurrentAdmin()], | |||
['label' => 'Tranches de prix', 'icon' => 'eur', 'url' => ['/producer-price-range-admin/index'], 'visible' => $userManager->isCurrentAdmin()], | |||
['label' => 'Taxes', 'icon' => 'eur', 'url' => ['/tax-rate-admin/index'], 'visible' => $userManager->isCurrentAdmin()], | |||
['label' => 'Communiquer', 'icon' => 'bullhorn', 'url' => ['/communicate-admin/index'], 'visible' => $userManager->isCurrentAdmin()], | |||
//['label' => 'Outils', 'options' => ['class' => 'header'], 'visible' => $userManager->isCurrentAdmin()], | |||
//['label' => 'Gii', 'icon' => 'file-code-o', 'url' => ['/gii'], 'visible' => $userManager->isCurrentAdmin()], | |||
//['label' => 'Debug', 'icon' => 'dashboard', 'url' => ['/debug'], 'visible' => $userManager->isCurrentAdmin()], | |||
['label' => 'Login', 'url' => ['site/login'], 'visible' => ! $userManager->isCurrentConnected()], | |||
['label' => 'Login', 'url' => ['site/login'], 'visible' => !$userManager->isCurrentConnected()], | |||
], | |||
] | |||
) ?> |
@@ -36,12 +36,9 @@ pris connaissance de la licence CeCILL, et que vous en avez accepté les | |||
termes. | |||
*/ | |||
use backend\assets\AppAsset; | |||
use yii\helpers\Html; | |||
/* @var $this \yii\web\View */ | |||
/* @var $content string */ | |||
\common\assets\CommonAsset::register($this); | |||
if (class_exists('backend\assets\AppAsset')) { | |||
backend\assets\AppAsset::register($this); | |||
} else { |
@@ -49,6 +49,8 @@ use common\logic\Producer\Producer\Model\Producer; | |||
<?= $form->field($model, 'type')->textInput(['placeholder' => 'Boulangerie, brasserie, ferme ...']); ?> | |||
<?= $form->field($model, 'postcode') ?> | |||
<?= $form->field($model, 'city') ?> | |||
<?= $form->field($model, 'latitude') ?> | |||
<?= $form->field($model, 'longitude') ?> | |||
<?= $form->field($model, 'code')->label('Code d\'accès') ?> | |||
<h3>Facturation</h3> |
@@ -75,13 +75,6 @@ $this->addBreadcrumb($this->getTitle()); | |||
<div> | |||
<div v-show="currentSection == 'general'" class="panel panel-default"> | |||
<div class="panel-body"> | |||
<h4>Logiciel</h4> | |||
<?= $form->field($model, 'option_display_message_new_opendistrib_version') | |||
->dropDownList([ | |||
1 => 'Oui', | |||
0 => 'Non' | |||
], []); ?> | |||
<h4>Accès</h4> | |||
<?= $form->field($model, 'active') | |||
->dropDownList([ | |||
@@ -127,6 +120,13 @@ $this->addBreadcrumb($this->getTitle()); | |||
Producer::BEHAVIOR_HOME_POINT_SALE_DAY_LIST_INCOMING_DISTRIBUTIONS => 'Distributions à venir', | |||
]); ?> | |||
<?= $form->field($model, 'option_point_sale_wording') ?> | |||
<h4>Logiciel</h4> | |||
<?= $form->field($model, 'option_display_message_new_opendistrib_version') | |||
->dropDownList([ | |||
1 => 'Oui', | |||
0 => 'Non' | |||
], []); ?> | |||
</div> | |||
</div> | |||
@@ -59,7 +59,7 @@ $fieldOptions2 = [ | |||
<div class="login-box"> | |||
<div class="login-logo"> | |||
<img src="<?= Yii::$app->urlManagerBackend->getBaseUrl(); ?>/img/logo-distrib.png" /> | |||
Opendistrib | |||
</div> | |||
<!-- /.login-logo --> | |||
<div class="login-box-body"> |
@@ -0,0 +1,8 @@ | |||
<?php | |||
$this->setTitle('Statistiques Matomo') ; | |||
$this->addBreadcrumb('Statistiques Matomo') ; | |||
?> | |||
<iframe id="matomoframe" src="<?= Yii::$app->params['matomoWidgetDashbordUrl']; ?>" frameborder="0" marginheight="0" marginwidth="0" width="100%" height="800px"></iframe> |
@@ -0,0 +1,60 @@ | |||
<?php | |||
/** | |||
Copyright distrib (2018) | |||
contact@opendistrib.net | |||
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 yii\helpers\Html; | |||
use yii\widgets\ActiveForm; | |||
$this->setTitle('Créer un ticket') ; | |||
$this->addBreadcrumb(['label' => 'Support', 'url' => ['index']]) ; | |||
$this->addBreadcrumb('Créer un ticket') ; | |||
?> | |||
<div class="ticket-create"> | |||
<div class="box"> | |||
<?php $form = ActiveForm::begin(); ?> | |||
<div class="box-body"> | |||
<?= $form->field($ticket, 'subject'); ?> | |||
<?= $form->field($ticket, 'message')->textarea(['rows' => 6]); ?> | |||
</div> | |||
<div class="box-footer"> | |||
<?= Html::submitButton('Créer', ['class' => 'btn btn-success']) ?> | |||
</div> | |||
<?php ActiveForm::end(); ?> | |||
</div> | |||
</div> |
@@ -0,0 +1,235 @@ | |||
<?php | |||
/** | |||
* Copyright distrib (2018) | |||
* | |||
* contact@opendistrib.net | |||
* | |||
* 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\logic\Ticket\Ticket\Model\Ticket; | |||
use common\logic\Ticket\Ticket\Wrapper\TicketManager; | |||
use yii\helpers\Html; | |||
use yii\grid\GridView; | |||
$ticketManager = TicketManager::getInstance(); | |||
$userCurrent = $this->getUserCurrent(); | |||
$this->setTitle('Support'); | |||
$this->addBreadcrumb($this->getTitle()); | |||
?> | |||
<div class="support-index"> | |||
<?php if($context == 'producer'): ?> | |||
<div> | |||
<div class="col-md-4"> | |||
<div class="info-box"> | |||
<span class="info-box-icon bg-yellow"><i class="fa fa-phone"></i></span> | |||
<div class="info-box-content"> | |||
<span class="info-box-text">Me contacter directement</span> | |||
<span class="info-box-text"> | |||
<br/> | |||
<strong><?= Yii::$app->params['adminPhoneNumber'] ?></strong> | |||
</span> | |||
</div> | |||
</div> | |||
</div> | |||
<div class="col-md-4"> | |||
<div class="info-box"> | |||
<span class="info-box-icon bg-yellow"><i class="fa fa-calendar"></i></span> | |||
<div class="info-box-content"> | |||
<span class="info-box-text"><br/> | |||
<?= Html::a('Prendre rendez-vous', Yii::$app->params['appointmentUrl'], ['class' => 'btn btn-sm btn-default', 'target' => '_blank']); ?> | |||
</span> | |||
</div> | |||
</div> | |||
</div> | |||
<div class="col-md-4"> | |||
<div class="info-box"> | |||
<span class="info-box-icon bg-yellow"><i class="fa fa-comments"></i></span> | |||
<div class="info-box-content"> | |||
<span class="info-box-text"><br/><?= Html::a('Ouvrir un ticket', ['support/create'], ['class' => 'btn btn-sm btn-default']); ?></span> | |||
</div> | |||
</div> | |||
</div> | |||
</div> | |||
<div class="clr"></div> | |||
<?php endif; ?> | |||
<div class="nav-tabs-custom ticket-list"> | |||
<ul class="nav nav-tabs pull-right"> | |||
<li><a href="#tab_2-2" data-toggle="tab">Fermés <span | |||
class="label label-default"><?= $dataProviderTicketClosed->totalCount ?></span></a></li> | |||
<li class="active"><a href="#tab_1-1" data-toggle="tab">Ouverts <span | |||
class="label label-default"><?= $dataProviderTicketOpen->totalCount ?></span></a></li> | |||
<li class="pull-left header"><i class="fa fa-comments"></i> Tickets</li> | |||
</ul> | |||
<div class="tab-content"> | |||
<div class="tab-pane active" id="tab_1-1"> | |||
<?= ticketList($context, $searchTicket, $dataProviderTicketOpen, $userCurrent); ?> | |||
</div> | |||
<div class="tab-pane" id="tab_2-2"> | |||
<?= ticketList($context, $searchTicket, $dataProviderTicketClosed, $userCurrent); ?> | |||
</div> | |||
</div> | |||
</div> | |||
</div> | |||
<?php | |||
function ticketList($context, $searchTicket, $dataProviderTicket, $userCurrent) | |||
{ | |||
$ticketManager = TicketManager::getInstance(); | |||
$columnCreatedAt = [ | |||
'attribute' => 'created_at', | |||
'headerOptions' => ['class' => 'td-created-at column-hide-on-mobile'], | |||
'value' => function ($ticket) { | |||
return date('d/m/Y', strtotime($ticket->created_at)); | |||
} | |||
]; | |||
$columnSubject = [ | |||
'attribute' => 'subject', | |||
'headerOptions' => ['class' => 'td-subject'], | |||
'format' => 'raw', | |||
'value' => function ($ticket) use ($ticketManager, $userCurrent) { | |||
if($ticketManager->isTicketUnread($ticket, $userCurrent)) { | |||
$firstTicketMessageUnread = $ticketManager->getFirstTicketMessageUnread($ticket, $userCurrent); | |||
$link = '<strong>'.Html::a($ticket->subject, ['view', 'id' => $ticket->id, '#' => $firstTicketMessageUnread->id]).'</strong>'; | |||
} | |||
else { | |||
$link = Html::a($ticket->subject, ['view', 'id' => $ticket->id]); | |||
} | |||
return $link; | |||
} | |||
]; | |||
$columnLastMessage = [ | |||
'label' => 'Dernier message', | |||
'headerOptions' => ['class' => 'td-last-message column-hide-on-mobile'], | |||
'value' => function ($ticket) { | |||
$ticketMessages = $ticket->ticketMessages; | |||
if ($ticketMessages && is_array($ticketMessages)) { | |||
$lastTicketMessage = end($ticketMessages); | |||
$origin = date_create(date('Y-m-d', strtotime($lastTicketMessage->created_at))); | |||
$target = date_create(); | |||
$interval = date_diff($origin, $target); | |||
$days = (int)$interval->format('%R%a'); | |||
if ($days == 0) { | |||
return "Aujourd'hui"; | |||
} elseif ($days == 1) { | |||
return "Hier"; | |||
} else { | |||
return $days . ' jours'; | |||
} | |||
} | |||
return ''; | |||
} | |||
]; | |||
$columnMessages = [ | |||
'label' => 'Messages', | |||
'headerOptions' => ['class' => 'td-messages column-hide-on-mobile'], | |||
'value' => function ($ticket) { | |||
return count($ticket->ticketMessages); | |||
} | |||
]; | |||
$columnButtonActions = [ | |||
'class' => 'yii\grid\ActionColumn', | |||
'template' => '{view} {close-open}', | |||
'headerOptions' => ['class' => 'column-actions'], | |||
'contentOptions' => ['class' => 'column-actions'], | |||
'buttons' => [ | |||
'view' => function ($url, $ticket) { | |||
$url = ['view', 'id' => $ticket->id]; | |||
return Html::a('<span class="glyphicon glyphicon-eye-open"></span>', $url, [ | |||
'title' => 'Voir le ticket', 'class' => 'btn btn-default' | |||
]); | |||
}, | |||
'close-open' => function ($url, $ticket) use ($ticketManager) { | |||
if ($ticketManager->isTicketOpen($ticket)) { | |||
$title = 'Fermer'; | |||
$url = ['close', 'id' => $ticket->id]; | |||
$glyphicon = 'glyphicon-folder-close'; | |||
} else { | |||
$title = 'Ré-ouvrir'; | |||
$url = ['open', 'id' => $ticket->id]; | |||
$glyphicon = 'glyphicon-folder-open'; | |||
} | |||
return Html::a('<span class="glyphicon ' . $glyphicon . '"></span>', $url, [ | |||
'title' => $title, 'class' => 'btn btn-default' | |||
]); | |||
} | |||
], | |||
]; | |||
$columnProducer = [ | |||
'attribute' => 'id_producer', | |||
'headerOptions' => ['class' => 'td-producer'], | |||
'value' => function ($ticket) { | |||
return $ticket->producer->name; | |||
} | |||
]; | |||
if($context == 'producer') { | |||
$columns = [ | |||
$columnCreatedAt, | |||
$columnSubject, | |||
$columnLastMessage, | |||
$columnMessages, | |||
$columnButtonActions | |||
]; | |||
} | |||
elseif($context == 'admin') { | |||
$columns = [ | |||
$columnCreatedAt, | |||
$columnProducer, | |||
$columnSubject, | |||
$columnLastMessage, | |||
$columnMessages, | |||
$columnButtonActions | |||
]; | |||
} | |||
$optionsGridView = [ | |||
'summary' => '', | |||
'filterModel' => $searchTicket, | |||
'dataProvider' => $dataProviderTicket, | |||
'columns' => $columns, | |||
]; | |||
return GridView::widget($optionsGridView); | |||
} | |||
?> |
@@ -0,0 +1,89 @@ | |||
<?php | |||
use common\logic\Ticket\Ticket\Wrapper\TicketManager; | |||
use common\logic\User\User\Wrapper\UserManager; | |||
use yii\helpers\Html; | |||
use yii\widgets\ActiveForm; | |||
$ticketManager = TicketManager::getInstance(); | |||
$userManager = UserManager::getInstance(); | |||
$this->setTitle('Voir un ticket'); | |||
$this->addBreadcrumb(['label' => 'Support', 'url' => ['index']]); | |||
$this->addBreadcrumb('Voir un ticket'); | |||
?> | |||
<div class="ticket-view"> | |||
<div class="box box-solid"> | |||
<div class="box-body"> | |||
<table class="table"> | |||
<tbody> | |||
<tr> | |||
<td><strong>Sujet</strong></td> | |||
<td><?= Html::encode($ticket->subject); ?></td> | |||
</tr> | |||
<tr> | |||
<td><strong>Ouverture</strong></td> | |||
<td><?= $ticketManager->getTicketDateCreatedAtFormat($ticket); ?></td> | |||
</tr> | |||
<tr> | |||
<td><strong>Statut</strong></td> | |||
<td><?= $ticketManager->getTicketStatusLabelAsHtml($ticket); ?></td> | |||
</tr> | |||
</tbody> | |||
</table> | |||
</div> | |||
</div> | |||
<ul class="timeline"> | |||
<?php foreach($ticket->ticketMessages as $key => $ticketMessage): ?> | |||
<li> | |||
<?php if ($key === array_key_last($ticket->ticketMessages)): ?> | |||
<a name="bottom"></a> | |||
<?php endif; ?> | |||
<a name="<?= $ticketMessage->id ?>"></a> | |||
<i class="fa fa-user <?= $userManager->isAdmin($ticketMessage->user) ? 'bg-orange' : 'bg-aqua'; ?>"></i> | |||
<div class="timeline-item"> | |||
<span class="time"><i class="fa fa-clock-o"></i> <?= date('d/m/Y à H:i', strtotime($ticketMessage->created_at)) ?></span> | |||
<h3 class="timeline-header"><?= Html::encode($userManager->getUsername($ticketMessage->user)); ?></h3> | |||
<div class="timeline-body"> | |||
<?= nl2br($ticketMessage->message); ?> | |||
</div> | |||
</div> | |||
</li> | |||
<?php endforeach; ?> | |||
</ul> | |||
<div class="box box-success"> | |||
<div class="box-header"> | |||
<h3 class="box-title"><i class="fa fa-comments"></i> Répondre</h3> | |||
</div> | |||
<div class="box-body"> | |||
<?php $form = ActiveForm::begin(); ?> | |||
<?= $form->field($ticketMessageResponse, 'message')->textarea(['rows' => 6]); ?> | |||
<div class="form-group"> | |||
<?= Html::submitButton('Répondre', ['class' => 'btn btn-success btn-sm']) ?> | |||
</div> | |||
<?php ActiveForm::end(); ?> | |||
</div> | |||
</div> | |||
<div class="box <?= $ticketManager->isTicketOpen($ticket) ? 'box-danger' : 'box-success'; ?>"> | |||
<div class="box-header"> | |||
<h3 class="box-title"> | |||
<?php if($ticketManager->isTicketOpen($ticket)): ?> | |||
<i class="fa fa-folder"></i> Cliquez ici si vous souhaitez fermer le ticket | |||
<?php else: ?> | |||
<i class="fa fa-folder-open"></i> Cliquez ici si vous souhaitez rouvrir le ticket | |||
<?php endif; ?> | |||
</h3> | |||
</div> | |||
<div class="box-body"> | |||
<?php if($ticketManager->isTicketOpen($ticket)): ?> | |||
<?= Html::a('Fermer le ticket', ['close', 'id' => $ticket->id], ['class' => 'btn btn-danger btn-sm']) ?> | |||
<?php else: ?> | |||
<?= Html::a('Rouvrir le ticket', ['open', 'id' => $ticket->id], ['class' => 'btn btn-success btn-sm']) ?> | |||
<?php endif; ?> | |||
</div> | |||
</div> | |||
</div> |
@@ -3,8 +3,12 @@ body.skin-black { | |||
.main-header { | |||
.logo { | |||
background-color: white ; | |||
&:hover { | |||
font-family: 'highvoltageregular'; | |||
font-size: 23px; | |||
&:hover, &:focus { | |||
background-color: white ; | |||
text-decoration: none; | |||
} | |||
.logo-lg { | |||
img { | |||
@@ -21,10 +25,63 @@ body.skin-black { | |||
} | |||
.navbar { | |||
background-color: white ; | |||
.producer-panel { | |||
position: relative; | |||
float: left; | |||
padding: 15px; | |||
padding-left: 50px; | |||
margin-left: 7px; | |||
&.without-logo { | |||
padding-left: 10px; | |||
} | |||
.logo { | |||
position: absolute; | |||
top: 5px; | |||
left: 0px; | |||
background-color: white; | |||
width: 40px; | |||
height: 40px; | |||
@include border-radius(50px); | |||
border: solid 1px #e0e0e0; | |||
text-align: center; | |||
overflow: hidden; | |||
.img-logo { | |||
position: absolute; | |||
top: 50%; | |||
left: 50%; | |||
transform: translate(-50%, -50%); | |||
max-width: 35px; | |||
max-height: 35px; | |||
} | |||
} | |||
.title { | |||
position: relative; | |||
top: 2px; | |||
text-transform: uppercase; | |||
} | |||
} | |||
.sidebar-toggle { | |||
color: #333 ; | |||
} | |||
.link-support { | |||
float: left; | |||
padding: 15px 15px; | |||
border-right: solid 1px #e0e0e0; | |||
color: #333; | |||
&:hover { | |||
text-decoration: none; | |||
color: $color1; | |||
} | |||
} | |||
.navbar-custom-menu .navbar-nav > li > a, | |||
.navbar-right > li > a { | |||
border-left: solid 1px #e0e0e0 ; | |||
@@ -34,7 +91,7 @@ body.skin-black { | |||
.nav > li > a:hover, .nav > li > a:active, .nav > li > a:focus, | |||
.nav .open > a, .nav .open > a:hover, .nav .open > a:focus, | |||
.nav > .active > a { | |||
color: #FF7F00 ; | |||
color: $color1 ; | |||
} | |||
.dropdown-menu { | |||
@@ -92,10 +149,31 @@ body.skin-black { | |||
} | |||
} | |||
.sidebar { | |||
.sidebar-menu > li.header { | |||
color: #899397; | |||
} | |||
} | |||
.sidebar-menu > li.active > a { | |||
border-color: $color1 ; | |||
} | |||
section.sidebar { | |||
.user-panel { | |||
text-align: center; | |||
.image { | |||
margin-bottom: 3px; | |||
} | |||
.title { | |||
font-weight: bold; | |||
color: white; | |||
} | |||
} | |||
} | |||
.content-wrapper { | |||
background-color: #f5f5f5 ; | |||
@@ -113,14 +191,13 @@ body.skin-black { | |||
} | |||
h1 { | |||
font-family: 'highvoltageregular' ; | |||
font-family: 'myriadpro-light'; | |||
font-size: 20px; | |||
} | |||
} | |||
a { | |||
color: $color1 ; | |||
color: darken($color1, 5) ; | |||
} | |||
.btn { | |||
@@ -217,7 +294,8 @@ body.login-page { | |||
.login-box { | |||
.login-logo { | |||
text-align: center ; | |||
font-family: 'comfortaalight' ; | |||
font-family: 'highvoltageregular'; | |||
img { | |||
width: 50px ; | |||
} |
@@ -37,10 +37,19 @@ termes. | |||
@media screen and (max-width: 768px) { | |||
.main-header { | |||
.wrapper .main-header { | |||
.logo { | |||
color: #333 !important; | |||
} | |||
.navbar { | |||
border-top: solid 1px #e0e0e0; | |||
border-bottom: solid 1px #e0e0e0; | |||
.producer-panel { | |||
display: none; | |||
} | |||
} | |||
} | |||
@@ -39,7 +39,8 @@ termes. | |||
$dir-fonts: '../fonts/' ; | |||
@import "_fonts.scss" ; | |||
$color1: #FF7F00 ; | |||
//$color1: #FF7F00 ; | |||
$color1: #F39C12; | |||
$color2: white ; | |||
.clr { | |||
@@ -58,6 +59,14 @@ a { | |||
} | |||
} | |||
.float-right { | |||
float: right; | |||
} | |||
.float-left { | |||
float: left; | |||
} | |||
#block-demo { | |||
padding: 10px 0px ; | |||
background-color: $color2 ; | |||
@@ -300,7 +309,7 @@ a.btn, button.btn { | |||
left: 50%; | |||
margin-left: -10px; | |||
font-size: 20px; | |||
color: #FF7F00; | |||
color: $color1; | |||
} | |||
&.btn-primary { | |||
@@ -1521,4 +1530,6 @@ a.btn, button.btn { | |||
@import "document/_form.scss" ; | |||
@import "document/_index.scss" ; | |||
@import "development/_index.scss" ; | |||
@import "support/_index.scss"; | |||
@import "support/_view.scss"; | |||
@import "_responsive.scss" ; |
@@ -0,0 +1,29 @@ | |||
.support-index { | |||
.ticket-list { | |||
.nav-tabs { | |||
.label { | |||
position: relative; | |||
top: -2px; | |||
left: 2px; | |||
padding: 0.3em 0.6em 0.2em 0.6em; | |||
} | |||
} | |||
.table { | |||
.filters { | |||
display: none; | |||
} | |||
.td-created-at, | |||
.td-last-message, | |||
.td-messages { | |||
width: 100px; | |||
} | |||
.td-producer { | |||
width: 200px; | |||
} | |||
} | |||
} | |||
} |
@@ -0,0 +1,19 @@ | |||
.ticket-view { | |||
.table { | |||
tr:first-child td { | |||
border-top: 0px none; | |||
} | |||
} | |||
.timeline { | |||
&::before { | |||
background: transparent none; | |||
} | |||
li, .timeline-item { | |||
margin-right: 0px; | |||
} | |||
} | |||
} |
@@ -65,6 +65,7 @@ class CommonAsset extends \common\components\MyAssetBundle | |||
$this->addAsset('css','css/screen.css') ; | |||
// js | |||
$this->addAsset('js','bootstrap/js/bootstrap.min.js') ; | |||
$this->addAsset('js','js/jquery-ui-1.11.4.custom/jquery-ui.min.js'); | |||
$this->addAsset('js','js/promise-polyfill/promise.min.js'); | |||
$this->addAsset('js','js/axios/axios.min.js'); | |||
@@ -73,6 +74,6 @@ class CommonAsset extends \common\components\MyAssetBundle | |||
// Documentation : https://vcalendar.io/ | |||
$this->addAsset('js','js/vuejs/vcalendar/v-calendar.umd.min.js') ; | |||
$this->addAsset('js','js/utils.js') ; | |||
$this->addAsset('js','js/common.js') ; | |||
} | |||
} |
@@ -28,6 +28,9 @@ class BusinessLogic | |||
$this->getProductOrderContainer(), | |||
$this->getProductPriceContainer(), | |||
$this->getProductSubscriptionContainer(), | |||
$this->getTicketUserContainer(), | |||
$this->getTicketMessageContainer(), | |||
$this->getTicketContainer(), | |||
$this->getQuotationContainer(), | |||
$this->getInvoiceContainer(), | |||
$this->getDeliveryNoteContainer(), |
@@ -44,6 +44,12 @@ use common\logic\Subscription\ProductSubscription\Wrapper\ProductSubscriptionCon | |||
use common\logic\Subscription\ProductSubscription\Wrapper\ProductSubscriptionManager; | |||
use common\logic\Subscription\Subscription\Wrapper\SubscriptionContainer; | |||
use common\logic\Subscription\Subscription\Wrapper\SubscriptionManager; | |||
use common\logic\Ticket\Ticket\Wrapper\TicketContainer; | |||
use common\logic\Ticket\Ticket\Wrapper\TicketManager; | |||
use common\logic\Ticket\TicketMessage\Wrapper\TicketMessageContainer; | |||
use common\logic\Ticket\TicketMessage\Wrapper\TicketMessageManager; | |||
use common\logic\Ticket\TicketUser\Wrapper\TicketUserContainer; | |||
use common\logic\Ticket\TicketUser\Wrapper\TicketUserManager; | |||
use common\logic\User\CreditHistory\Wrapper\CreditHistoryContainer; | |||
use common\logic\User\CreditHistory\Wrapper\CreditHistoryManager; | |||
use common\logic\User\User\Wrapper\UserContainer; | |||
@@ -187,6 +193,21 @@ trait BusinessLogicTrait | |||
return UserUserGroupManager::getInstance(); | |||
} | |||
public function getTicketManager(): TicketManager | |||
{ | |||
return TicketManager::getInstance(); | |||
} | |||
public function getTicketMessageManager(): TicketMessageManager | |||
{ | |||
return TicketMessageManager::getInstance(); | |||
} | |||
public function getTicketUserManager(): TicketUserManager | |||
{ | |||
return TicketUserManager::getInstance(); | |||
} | |||
public function getUserContainer(): UserContainer | |||
{ | |||
return UserContainer::getInstance(); | |||
@@ -316,4 +337,19 @@ trait BusinessLogicTrait | |||
{ | |||
return ProductDistributionContainer::getInstance(); | |||
} | |||
public function getTicketContainer(): TicketContainer | |||
{ | |||
return TicketContainer::getInstance(); | |||
} | |||
public function getTicketMessageContainer(): TicketMessageContainer | |||
{ | |||
return TicketMessageContainer::getInstance(); | |||
} | |||
public function getTicketUserContainer(): TicketUserContainer | |||
{ | |||
return TicketUserContainer::getInstance(); | |||
} | |||
} |
@@ -38,11 +38,14 @@ termes. | |||
namespace common\components ; | |||
use common\logic\User\User\Model\User; | |||
class View extends \yii\web\View | |||
{ | |||
use BusinessLogicTrait; | |||
var $title ; | |||
var $icon; | |||
var $page_title ; | |||
var $buttons ; | |||
@@ -51,6 +54,16 @@ class View extends \yii\web\View | |||
return \Yii::$app->logic; | |||
} | |||
public function setIcon($icon) | |||
{ | |||
$this->icon = $icon; | |||
} | |||
public function getIcon() | |||
{ | |||
return $this->icon; | |||
} | |||
public function setTitle($title, $page_title = '') | |||
{ | |||
$this->title = $title ; | |||
@@ -114,4 +127,9 @@ class View extends \yii\web\View | |||
{ | |||
return \Yii::$app->urlManagerBackend; | |||
} | |||
public function getUserCurrent(): ?User | |||
{ | |||
return \Yii::$app->user->identity; | |||
} | |||
} |
@@ -124,4 +124,5 @@ return [ | |||
} | |||
], | |||
'language' => 'fr-FR', | |||
'timeZone' => 'Europe/Paris', | |||
]; |
@@ -37,7 +37,7 @@ | |||
*/ | |||
return [ | |||
'version' => '23.7.A', | |||
'version' => '23.8.A', | |||
'adminEmail' => 'contact@opendistrib.net', | |||
'supportEmail' => 'contact@opendistrib.net', | |||
'user.passwordResetTokenExpire' => 3600, |
@@ -42,6 +42,7 @@ use common\components\BusinessLogic; | |||
use common\components\BusinessLogicTrait; | |||
use common\logic\User\User\Model\User; | |||
use yii; | |||
use yii\web\Response; | |||
class CommonController extends \yii\web\Controller | |||
{ | |||
@@ -100,6 +101,11 @@ class CommonController extends \yii\web\Controller | |||
{ | |||
Yii::$app->session->addFlash($key, $value, $removeAfterAccess); | |||
} | |||
public function redirectReferer(): Response | |||
{ | |||
return $this->redirect(Yii::$app->request->referrer ?: Yii::$app->homeUrl); | |||
} | |||
} | |||
?> |
@@ -18,6 +18,9 @@ abstract class AbstractRepository extends AbstractService implements RepositoryI | |||
{ | |||
$this->query->createQuery(); | |||
$this->defaultWith(); | |||
$this->defaultJoinWith(); | |||
return $this->query; | |||
} | |||
@@ -25,28 +28,43 @@ abstract class AbstractRepository extends AbstractService implements RepositoryI | |||
{ | |||
$this->createQuery(); | |||
$defaultOptions = $this->getDefaultOptionsSearch(); | |||
$this->defaultWith(); | |||
$this->defaultJoinWith(); | |||
$this->defaultFilterProducerContext(); | |||
$this->defaultOrderBy(); | |||
return $this->query; | |||
} | |||
// with | |||
public function defaultWith(): void | |||
{ | |||
$defaultOptions = $this->getDefaultOptionsSearch(); | |||
if (is_array($defaultOptions['with']) && count($defaultOptions['with'])) { | |||
$this->query->with($defaultOptions['with']); | |||
} | |||
} | |||
// join with | |||
public function defaultJoinWith(): void | |||
{ | |||
$defaultOptions = $this->getDefaultOptionsSearch(); | |||
if (is_array($defaultOptions['join_with']) && count($defaultOptions['join_with'])) { | |||
$this->query->joinWith($defaultOptions['join_with']); | |||
} | |||
} | |||
// id producer contexte | |||
public function defaultFilterProducerContext(): void | |||
{ | |||
$defaultOptions = $this->getDefaultOptionsSearch(); | |||
if(isset($defaultOptions['attribute_id_producer']) && $defaultOptions['attribute_id_producer']) { | |||
$this->query->andWhere([$defaultOptions['attribute_id_producer'] => $this->getProducerContextId()]); | |||
} | |||
} | |||
// order by | |||
public function defaultOrderBy(): void | |||
{ | |||
$defaultOptions = $this->getDefaultOptionsSearch(); | |||
if(isset($defaultOptions['orderby']) && $defaultOptions['orderby']) { | |||
$this->query->orderBy($defaultOptions['orderby']); | |||
} | |||
return $this->query; | |||
} | |||
} |
@@ -0,0 +1,8 @@ | |||
<?php | |||
namespace common\logic; | |||
abstract class AbstractSolver extends AbstractService implements SolverInterface | |||
{ | |||
} |
@@ -83,6 +83,19 @@ class OrderRepository extends AbstractRepository | |||
->count(); | |||
} | |||
public function countGlobalUserOrdersAverageLastSevenDays() | |||
{ | |||
$count = 0; | |||
$date = new \DateTime(); | |||
for($i = 0; $i < 7; $i++) { | |||
$date->modify('-1 day'); | |||
$count += $this->countGlobalOrdersByDateAndOrigin($date); | |||
} | |||
return intval($count / 7); | |||
} | |||
public function findOrdersByDistributionDate(string $date): array | |||
{ | |||
return $this->createDefaultQuery() | |||
@@ -329,4 +342,37 @@ class OrderRepository extends AbstractRepository | |||
return $pointSale; | |||
} | |||
public function getTurnoverByDate(\DateTime $date) | |||
{ | |||
$res = \Yii::$app->db->createCommand("SELECT SUM(product_order.price * product_order.quantity) AS total | |||
FROM `order`, product_order, distribution | |||
WHERE `order`.id_distribution = distribution.id | |||
AND `order`.id = product_order.id_order | |||
AND distribution.date >= :date_start | |||
AND distribution.date <= :date_end | |||
") | |||
->bindValue(':date_start', date('Y-m-', $date->getTimestamp()) . '01') | |||
->bindValue(':date_end', date('Y-m-', $date->getTimestamp()) . '31') | |||
->queryOne(); | |||
if ($res['total']) { | |||
return $res['total']; | |||
} else { | |||
return 0; | |||
} | |||
} | |||
public function getAverageTurnoverLastThreeMonths() | |||
{ | |||
$total = 0; | |||
$date = new \DateTime(); | |||
for($i = 0; $i < 3; $i++) { | |||
$date->modify('-1 month'); | |||
$total += $this->getTurnoverByDate($date); | |||
} | |||
return intval($total / 3); | |||
} | |||
} |
@@ -106,4 +106,24 @@ class PointSaleRepository extends AbstractRepository | |||
->orderBy('name ASC') | |||
->find(); | |||
} | |||
public function countPointSalesActiveLastThreeMonths() | |||
{ | |||
$connection = \Yii::$app->getDb(); | |||
$command = $connection->createCommand( | |||
' | |||
SELECT point_sale.id, COUNT(`order`.id) AS count_orders | |||
FROM `point_sale` | |||
LEFT JOIN `order` ON point_sale.id = `order`.id_point_sale AND `order`.`date` >= :date_limit | |||
GROUP BY point_sale.id | |||
HAVING count_orders > 0;', | |||
[ | |||
':date_limit' => date('Y-m-d', strtotime("-3 month")), | |||
] | |||
); | |||
$results = $command->query(); | |||
return count($results); | |||
} | |||
} |
@@ -282,7 +282,9 @@ class Producer extends ActiveRecordCommon | |||
'free_price', | |||
'credit_limit_reminder', | |||
'credit_limit', | |||
'option_billing_permanent_transfer_amount' | |||
'option_billing_permanent_transfer_amount', | |||
'latitude', | |||
'longitude' | |||
], 'double'], | |||
[ | |||
'free_price', | |||
@@ -401,7 +403,9 @@ class Producer extends ActiveRecordCommon | |||
'option_billing_reduction_percentage' => 'Réduction : pourcentage', | |||
'option_billing_permanent_transfer' => 'Virement permanent', | |||
'option_billing_permanent_transfer_amount' => 'Virement permanent : montant', | |||
'option_point_sale_wording' => 'Libellé points de vente' | |||
'option_point_sale_wording' => 'Libellé points de vente', | |||
'latitude' => 'Latitude', | |||
'longitude' => 'Longitude' | |||
]; | |||
} | |||
@@ -60,7 +60,9 @@ class ProducerRepository extends AbstractRepository | |||
public function queryProducersActive() | |||
{ | |||
return $this->createQuery()->filterIsActive(); | |||
return $this->createQuery() | |||
->filterIsActive() | |||
->orderBy('producer.name ASC'); | |||
} | |||
/** | |||
@@ -148,6 +150,19 @@ class ProducerRepository extends AbstractRepository | |||
} | |||
} | |||
public function getTurnoverByNumberMonths(Producer $producer, $numberMonths = 1) | |||
{ | |||
$totalTurnover = 0; | |||
for($i = 1; $i <= $numberMonths; $i++) { | |||
$timeMonth = strtotime('-' . $i . ' month'); | |||
$month = date('Y-m', $timeMonth); | |||
$totalTurnover += $this->getTurnover($producer, $month); | |||
} | |||
return $totalTurnover; | |||
} | |||
public function getAmountToBeBilledByMonth(Producer $producer, $month, bool $format = false) | |||
{ | |||
$turnover = $this->getTurnover($producer, $month); | |||
@@ -266,6 +281,20 @@ class ProducerRepository extends AbstractRepository | |||
return $this->queryProducersActive()->find(); | |||
} | |||
public function countProducersActiveWithTurnover(): int | |||
{ | |||
$count = 0; | |||
$producersArray = $this->findProducersActive(); | |||
foreach($producersArray as $producer) { | |||
if($this->getTurnoverByNumberMonths($producer, 3)) { | |||
$count ++; | |||
} | |||
} | |||
return $count; | |||
} | |||
public function findProducers() | |||
{ | |||
return $this->createQuery()->find(); |
@@ -3,7 +3,6 @@ | |||
namespace common\logic\Subscription\ProductSubscription\Repository; | |||
use common\logic\AbstractRepository; | |||
use common\logic\Subscription\ProductSubscription\Model\ProductSubscription; | |||
use common\logic\Subscription\Subscription\Model\Subscription; | |||
class ProductSubscriptionRepository extends AbstractRepository |
@@ -3,7 +3,6 @@ | |||
namespace common\logic\Subscription\ProductSubscription\Repository; | |||
use common\logic\AbstractRepositoryQuery; | |||
use common\logic\Subscription\ProductSubscription\Model\ProductSubscription; | |||
use common\logic\Subscription\ProductSubscription\Service\ProductSubscriptionDefinition; | |||
use common\logic\Subscription\Subscription\Model\Subscription; | |||
use yii\db\ActiveQuery; |
@@ -3,19 +3,19 @@ | |||
namespace common\logic\Subscription\ProductSubscription\Wrapper; | |||
use common\logic\AbstractManager; | |||
use common\logic\Subscription\ProductSubscription\Repository\ProductSubscriptionRepository; | |||
use common\logic\Subscription\ProductSubscription\Service\ProductSubscriptionBuilder; | |||
use common\logic\Subscription\ProductSubscription\Service\ProductSubscriptionDefinition; | |||
use common\logic\Subscription\ProductSubscription\Repository\TicketRepository; | |||
use common\logic\Subscription\ProductSubscription\Service\TicketBuilder; | |||
use common\logic\Subscription\ProductSubscription\Service\TicketDefinition; | |||
/** | |||
* @mixin ProductSubscriptionDefinition | |||
* @mixin ProductSubscriptionRepository | |||
* @mixin ProductSubscriptionBuilder | |||
* @mixin TicketDefinition | |||
* @mixin TicketRepository | |||
* @mixin TicketBuilder | |||
*/ | |||
class ProductSubscriptionManager extends AbstractManager | |||
{ | |||
public function getContainerFqcn(): string | |||
{ | |||
return ProductSubscriptionContainer::class; | |||
return TicketContainer::class; | |||
} | |||
} |
@@ -0,0 +1,125 @@ | |||
<?php | |||
/** | |||
* Copyright distrib (2018) | |||
* | |||
* contact@opendistrib.net | |||
* | |||
* 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 common\logic\Ticket\Ticket\Model; | |||
use common\components\ActiveRecordCommon; | |||
use common\logic\Producer\Producer\Model\Producer; | |||
use common\logic\Ticket\TicketMessage\Model\TicketMessage; | |||
use common\logic\Ticket\TicketUser\Model\TicketUser; | |||
use common\logic\User\User\Model\User; | |||
class Ticket extends ActiveRecordCommon | |||
{ | |||
const STATUS_OPEN = 'open'; | |||
const STATUS_CLOSED = 'closed'; | |||
public $message; | |||
/** | |||
* @inheritdoc | |||
*/ | |||
public static function tableName() | |||
{ | |||
return 'ticket'; | |||
} | |||
/** | |||
* @inheritdoc | |||
*/ | |||
public function rules() | |||
{ | |||
return [ | |||
[['id_producer', 'id_user', 'subject', 'status'], 'required'], | |||
[['id_producer', 'id_user'], 'integer'], | |||
[['subject', 'status'], 'string'], | |||
[['created_at', 'message'], 'safe'], | |||
]; | |||
} | |||
/** | |||
* @inheritdoc | |||
*/ | |||
public function attributeLabels() | |||
{ | |||
return [ | |||
'id' => 'ID', | |||
'id_producer' => 'Producteur', | |||
'id_user' => 'Utilisateur', | |||
'subject' => 'Sujet', | |||
'status' => 'Statut', | |||
'created_at' => 'Ouverture', | |||
'updated_at' => 'Modification', | |||
]; | |||
} | |||
/* | |||
* Relations | |||
*/ | |||
public function getProducer() | |||
{ | |||
return $this->hasOne(Producer::class, ['id' => 'id_producer']); | |||
} | |||
public function getUser() | |||
{ | |||
return $this->hasOne(User::class, ['id' => 'id_user']); | |||
} | |||
public function getTicketMessages() | |||
{ | |||
return $this->hasMany(TicketMessage::class, ['id_ticket' => 'id']) | |||
->orderBy(['created_at' => SORT_ASC]); | |||
} | |||
public function getTicketUsers() | |||
{ | |||
return $this->hasMany(TicketUser::class, ['id_ticket' => 'id']); | |||
} | |||
public function populateProducer(Producer $producer): void | |||
{ | |||
$this->populateFieldObject('id_producer', 'producer', $producer); | |||
} | |||
public function populateUser(User $user): void | |||
{ | |||
$this->populateFieldObject('id_user', 'user', $user); | |||
} | |||
} |
@@ -0,0 +1,93 @@ | |||
<?php | |||
/** | |||
* Copyright distrib (2018) | |||
* | |||
* contact@opendistrib.net | |||
* | |||
* 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 common\logic\Ticket\Ticket\Model; | |||
use common\helpers\GlobalParam; | |||
use common\logic\Ticket\Ticket\Repository\TicketRepository; | |||
use yii\data\ActiveDataProvider; | |||
class TicketSearch extends Ticket | |||
{ | |||
public function rules() | |||
{ | |||
return [ | |||
[['subject', 'status'], 'string'], | |||
[['subject', 'status'], 'string', 'max' => 255], | |||
[['id_producer', 'id_user'], 'integer'], | |||
]; | |||
} | |||
public function search($context, $params) | |||
{ | |||
$ticketRepository = TicketRepository::getInstance(); | |||
$optionsSearch = $ticketRepository->getDefaultOptionsSearch(); | |||
$query = Ticket::find() | |||
->with($optionsSearch['with']) | |||
->innerJoinWith($optionsSearch['join_with'], true); | |||
if($context == 'producer') { | |||
$query->where(['ticket.id_producer' => GlobalParam::getCurrentProducerId()]); | |||
} | |||
$dataProvider = new ActiveDataProvider([ | |||
'query' => $query, | |||
'sort' => [ | |||
'attributes' => ['updated_at'], | |||
'defaultOrder' => [ | |||
'updated_at' => SORT_DESC, | |||
] | |||
], | |||
'pagination' => [ | |||
'pageSize' => 20, | |||
], | |||
]); | |||
$this->load($params); | |||
if (!$this->validate()) { | |||
return $dataProvider; | |||
} | |||
$query->andFilterWhere(['like', 'ticket.subject', $this->subject]); | |||
$query->andFilterWhere(['like', 'ticket.status', $this->status]); | |||
return $dataProvider; | |||
} | |||
} |
@@ -0,0 +1,52 @@ | |||
<?php | |||
namespace common\logic\Ticket\Ticket\Repository; | |||
use common\logic\AbstractRepository; | |||
use common\logic\Ticket\Ticket\Model\Ticket; | |||
use common\logic\Ticket\Ticket\Service\TicketSolver; | |||
use common\logic\User\User\Model\User; | |||
class TicketRepository extends AbstractRepository | |||
{ | |||
protected TicketRepositoryQuery $query; | |||
protected TicketSolver $ticketSolver; | |||
public function loadDependencies(): void | |||
{ | |||
$this->loadQuery(TicketRepositoryQuery::class); | |||
$this->ticketSolver = $this->loadService(TicketSolver::class); | |||
} | |||
/** | |||
* Retourne les options de base nécessaires à la fonction de recherche. | |||
*/ | |||
public function getDefaultOptionsSearch(): array | |||
{ | |||
return [ | |||
self::WITH => ['user', 'producer', 'ticketMessages', 'ticketUsers'], | |||
self::JOIN_WITH => [], | |||
self::ORDER_BY => '', | |||
self::ATTRIBUTE_ID_PRODUCER => 'ticket.id_producer' | |||
]; | |||
} | |||
public function findOneTicketById(int $id): ?Ticket | |||
{ | |||
return $this->createQuery() | |||
->filterById($id) | |||
->findOne(); | |||
} | |||
public function countTicketsUnreadByUser(User $user): int | |||
{ | |||
$ticketsArray = $this->createDefaultQuery()->find(); | |||
return $this->ticketSolver->countTicketsUnreadByUserFromArray($ticketsArray, $user); | |||
} | |||
public function countTicketsAdminUnreadByUser(User $user): int | |||
{ | |||
$ticketsArray = $this->createQuery()->find(); | |||
return $this->ticketSolver->countTicketsUnreadByUserFromArray($ticketsArray, $user); | |||
} | |||
} |
@@ -0,0 +1,16 @@ | |||
<?php | |||
namespace common\logic\Ticket\Ticket\Repository; | |||
use common\logic\AbstractRepositoryQuery; | |||
use common\logic\Ticket\Ticket\Service\TicketDefinition; | |||
class TicketRepositoryQuery extends AbstractRepositoryQuery | |||
{ | |||
protected TicketDefinition $definition; | |||
public function loadDependencies(): void | |||
{ | |||
$this->loadDefinition(TicketDefinition::class); | |||
} | |||
} |
@@ -0,0 +1,78 @@ | |||
<?php | |||
namespace common\logic\Ticket\Ticket\Service; | |||
use common\logic\AbstractBuilder; | |||
use common\logic\Producer\Producer\Model\Producer; | |||
use common\logic\Ticket\Ticket\Model\Ticket; | |||
use common\logic\Ticket\TicketMessage\Model\TicketMessage; | |||
use common\logic\Ticket\TicketMessage\Service\TicketMessageBuilder; | |||
use common\logic\Ticket\TicketUser\Service\TicketUserBuilder; | |||
use common\logic\User\User\Model\User; | |||
class TicketBuilder extends AbstractBuilder | |||
{ | |||
protected TicketMessageBuilder $ticketMessageBuilder; | |||
protected TicketUserBuilder $ticketUserBuilder; | |||
public function loadDependencies(): void | |||
{ | |||
$this->ticketMessageBuilder = $this->loadService(TicketMessageBuilder::class); | |||
$this->ticketUserBuilder = $this->loadService(TicketUserBuilder::class); | |||
} | |||
public function instanciateTicket(Producer $producer, User $user): Ticket | |||
{ | |||
$ticket = new Ticket(); | |||
$ticket->status = Ticket::STATUS_OPEN; | |||
$ticket->populateProducer($producer); | |||
$ticket->populateUser($user); | |||
return $ticket; | |||
} | |||
public function createTicket(Producer $producer, User $user): Ticket | |||
{ | |||
$ticket = $this->instanciateTicket($producer, $user); | |||
$this->saveCreate($ticket); | |||
return $ticket; | |||
} | |||
public function updateTicketStatus(Ticket $ticket, string $status) | |||
{ | |||
$ticket->status = $status; | |||
$this->saveUpdate($ticket); | |||
$this->updateTicketUpdatedAt($ticket); | |||
} | |||
public function closeTicket(Ticket $ticket) | |||
{ | |||
$this->updateTicketStatus($ticket, Ticket::STATUS_CLOSED); | |||
} | |||
public function openTicket(Ticket $ticket) | |||
{ | |||
$this->updateTicketStatus($ticket, Ticket::STATUS_OPEN); | |||
} | |||
public function updateTicketUpdatedAt(Ticket $ticket) | |||
{ | |||
$ticket->updated_at = date('Y-m-d H:i:s'); | |||
$this->saveUpdate($ticket); | |||
} | |||
public function createTicketMessage(TicketMessage $ticketMessage) | |||
{ | |||
$this->updateTicketUpdatedAt($ticketMessage->ticket); | |||
return $this->saveCreate($ticketMessage); | |||
} | |||
public function viewTicket(Ticket $ticket, User $user) | |||
{ | |||
$ticketUser = $this->ticketUserBuilder->createTicketUserIfNotExist($ticket, $user); | |||
$this->ticketUserBuilder->updateTicketUserReadAt($ticketUser); | |||
} | |||
} |
@@ -0,0 +1,14 @@ | |||
<?php | |||
namespace common\logic\Ticket\Ticket\Service; | |||
use common\logic\AbstractDefinition; | |||
use common\logic\Ticket\Ticket\Model\Ticket; | |||
class TicketDefinition extends AbstractDefinition | |||
{ | |||
public function getEntityFqcn(): string | |||
{ | |||
return Ticket::class; | |||
} | |||
} |
@@ -0,0 +1,113 @@ | |||
<?php | |||
namespace common\logic\Ticket\Ticket\Service; | |||
use common\logic\AbstractSolver; | |||
use common\logic\Ticket\Ticket\Model\Ticket; | |||
use common\logic\Ticket\TicketMessage\Model\TicketMessage; | |||
use common\logic\Ticket\TicketUser\Model\TicketUser; | |||
use common\logic\User\User\Model\User; | |||
use common\logic\User\User\Service\UserSolver; | |||
class TicketSolver extends AbstractSolver | |||
{ | |||
protected UserSolver $userSolver; | |||
public function loadDependencies(): void | |||
{ | |||
$this->userSolver = $this->loadService(UserSolver::class); | |||
} | |||
public function hasTicketAccess(Ticket $ticket, User $user): string | |||
{ | |||
return $user->id_producer == $ticket->id_producer | |||
|| $this->userSolver->isAdmin($user); | |||
} | |||
public function isTicketOpen(Ticket $ticket) | |||
{ | |||
return $ticket->status == Ticket::STATUS_OPEN; | |||
} | |||
public function isTicketClosed(Ticket $ticket) | |||
{ | |||
return $ticket->status == Ticket::STATUS_CLOSED; | |||
} | |||
public function getTicketDateCreatedAtFormat(Ticket $ticket) | |||
{ | |||
return date('d/m/Y', strtotime($ticket->created_at)); | |||
} | |||
public function getTicketStatusLabelAsHtml(Ticket $ticket) | |||
{ | |||
$classLabel = 'label-success'; | |||
$statusLabel = 'Ouvert'; | |||
if ($this->isTicketClosed($ticket)) { | |||
$classLabel = 'label-danger'; | |||
$statusLabel = 'Fermé'; | |||
} | |||
return '<span class="label ' . $classLabel . '">' . $statusLabel . '</span>'; | |||
} | |||
public function getTicketUser(Ticket $ticket, User $user) | |||
{ | |||
foreach($ticket->ticketUsers as $ticketUser) { | |||
if($ticketUser->id_user == $user->id) { | |||
return $ticketUser; | |||
} | |||
} | |||
return null; | |||
} | |||
public function isTicketMessageUnread(TicketMessage $ticketMessage, TicketUser $ticketUser) | |||
{ | |||
if($ticketMessage->created_at > $ticketUser->read_at) { | |||
return true; | |||
} | |||
return false; | |||
} | |||
public function isTicketUnread(Ticket $ticket, User $user): int | |||
{ | |||
$ticketUser = $this->getTicketUser($ticket, $user); | |||
if($ticketUser) { | |||
foreach($ticket->ticketMessages as $ticketMessage) { | |||
if($this->isTicketMessageUnread($ticketMessage, $ticketUser)) { | |||
return true; | |||
} | |||
} | |||
} | |||
return false; | |||
} | |||
public function getFirstTicketMessageUnread(Ticket $ticket, User $user): ?TicketMessage | |||
{ | |||
$ticketUser = $this->getTicketUser($ticket, $user); | |||
if($ticketUser) { | |||
foreach($ticket->ticketMessages as $ticketMessage) { | |||
if($this->isTicketMessageUnread($ticketMessage, $ticketUser)) { | |||
return $ticketMessage; | |||
} | |||
} | |||
} | |||
return null; | |||
} | |||
public function countTicketsUnreadByUserFromArray(array $ticketsArray, User $user): int | |||
{ | |||
$count = 0; | |||
foreach($ticketsArray as $ticket) { | |||
if($this->isTicketUnread($ticket, $user)) { | |||
$count++; | |||
} | |||
} | |||
return $count; | |||
} | |||
} |
@@ -0,0 +1,42 @@ | |||
<?php | |||
namespace common\logic\Ticket\Ticket\Wrapper; | |||
use common\logic\AbstractContainer; | |||
use common\logic\Ticket\Ticket\Repository\TicketRepository; | |||
use common\logic\Ticket\Ticket\Service\TicketBuilder; | |||
use common\logic\Ticket\Ticket\Service\TicketDefinition; | |||
use common\logic\Ticket\Ticket\Service\TicketSolver; | |||
class TicketContainer extends AbstractContainer | |||
{ | |||
public function getServices(): array | |||
{ | |||
return [ | |||
TicketDefinition::class, | |||
TicketRepository::class, | |||
TicketBuilder::class, | |||
TicketSolver::class, | |||
]; | |||
} | |||
public function getDefinition(): TicketDefinition | |||
{ | |||
return TicketDefinition::getInstance(); | |||
} | |||
public function getRepository(): TicketRepository | |||
{ | |||
return TicketRepository::getInstance(); | |||
} | |||
public function getBuilder(): TicketBuilder | |||
{ | |||
return TicketBuilder::getInstance(); | |||
} | |||
public function getSolver(): TicketSolver | |||
{ | |||
return TicketSolver::getInstance(); | |||
} | |||
} |
@@ -0,0 +1,23 @@ | |||
<?php | |||
namespace common\logic\Ticket\Ticket\Wrapper; | |||
use common\logic\AbstractManager; | |||
use common\logic\Ticket\Ticket\Repository\TicketRepository; | |||
use common\logic\Ticket\Ticket\Service\TicketBuilder; | |||
use common\logic\Ticket\Ticket\Service\TicketDefinition; | |||
use common\logic\Ticket\Ticket\Service\TicketSolver; | |||
/** | |||
* @mixin TicketDefinition | |||
* @mixin TicketRepository | |||
* @mixin TicketBuilder | |||
* @mixin TicketSolver | |||
*/ | |||
class TicketManager extends AbstractManager | |||
{ | |||
public function getContainerFqcn(): string | |||
{ | |||
return TicketContainer::class; | |||
} | |||
} |
@@ -0,0 +1,105 @@ | |||
<?php | |||
/** | |||
* Copyright distrib (2018) | |||
* | |||
* contact@opendistrib.net | |||
* | |||
* 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 common\logic\Ticket\TicketMessage\Model; | |||
use common\components\ActiveRecordCommon; | |||
use common\logic\Ticket\Ticket\Model\Ticket; | |||
use common\logic\User\User\Model\User; | |||
class TicketMessage extends ActiveRecordCommon | |||
{ | |||
/** | |||
* @inheritdoc | |||
*/ | |||
public static function tableName() | |||
{ | |||
return 'ticket_message'; | |||
} | |||
/** | |||
* @inheritdoc | |||
*/ | |||
public function rules() | |||
{ | |||
return [ | |||
[['id_ticket', 'id_user', 'message'], 'required'], | |||
[['id_ticket', 'id_user'], 'integer'], | |||
[['message'], 'string'], | |||
[['created_at'], 'safe'], | |||
]; | |||
} | |||
/** | |||
* @inheritdoc | |||
*/ | |||
public function attributeLabels() | |||
{ | |||
return [ | |||
'id' => 'ID', | |||
'id_ticket' => 'Ticket', | |||
'id_user' => 'Utilisateur', | |||
'message' => 'Message', | |||
'created_at' => 'Date de création', | |||
]; | |||
} | |||
/* | |||
* Relations | |||
*/ | |||
public function getUser() | |||
{ | |||
return $this->hasOne(User::class, ['id' => 'id_user']); | |||
} | |||
public function getTicket() | |||
{ | |||
return $this->hasOne(Ticket::class, ['id' => 'id_ticket']); | |||
} | |||
public function populateUser(User $user): void | |||
{ | |||
$this->populateFieldObject('id_user', 'user', $user); | |||
} | |||
public function populateTicket(Ticket $ticket): void | |||
{ | |||
$this->populateFieldObject('id_ticket', 'ticket', $ticket); | |||
} | |||
} |
@@ -0,0 +1,28 @@ | |||
<?php | |||
namespace common\logic\Ticket\TicketMessage\Repository; | |||
use common\logic\AbstractRepository; | |||
class TicketMessageRepository extends AbstractRepository | |||
{ | |||
protected TicketMessageRepositoryQuery $query; | |||
public function loadDependencies(): void | |||
{ | |||
$this->loadQuery(TicketMessageRepositoryQuery::class); | |||
} | |||
/** | |||
* Retourne les options de base nécessaires à la fonction de recherche. | |||
*/ | |||
public function getDefaultOptionsSearch(): array | |||
{ | |||
return [ | |||
self::WITH => ['user', 'producer', 'ticketMessages'], | |||
self::JOIN_WITH => [], | |||
self::ORDER_BY => '', | |||
self::ATTRIBUTE_ID_PRODUCER => '' | |||
]; | |||
} | |||
} |
@@ -0,0 +1,16 @@ | |||
<?php | |||
namespace common\logic\Ticket\TicketMessage\Repository; | |||
use common\logic\AbstractRepositoryQuery; | |||
use common\logic\Ticket\TicketMessage\Service\TicketMessageDefinition; | |||
class TicketMessageRepositoryQuery extends AbstractRepositoryQuery | |||
{ | |||
protected TicketMessageDefinition $definition; | |||
public function loadDependencies(): void | |||
{ | |||
$this->loadDefinition(TicketMessageDefinition::class); | |||
} | |||
} |
@@ -0,0 +1,30 @@ | |||
<?php | |||
namespace common\logic\Ticket\TicketMessage\Service; | |||
use common\logic\AbstractBuilder; | |||
use common\logic\Ticket\Ticket\Model\Ticket; | |||
use common\logic\Ticket\TicketMessage\Model\TicketMessage; | |||
use common\logic\User\User\Model\User; | |||
class TicketMessageBuilder extends AbstractBuilder | |||
{ | |||
public function instanciateTicketMessage(Ticket $ticket, User $user, string $message = ''): TicketMessage | |||
{ | |||
$ticketMessage = new TicketMessage(); | |||
$ticketMessage->populateTicket($ticket); | |||
$ticketMessage->populateUser($user); | |||
$ticketMessage->message = $message; | |||
return $ticketMessage; | |||
} | |||
public function createTicketMessage(Ticket $ticket, User $user, string $message): TicketMessage | |||
{ | |||
$ticketMessage = $this->instanciateTicketMessage($ticket, $user, $message); | |||
$this->saveCreate($ticketMessage); | |||
return $ticketMessage; | |||
} | |||
} |
@@ -0,0 +1,14 @@ | |||
<?php | |||
namespace common\logic\Ticket\TicketMessage\Service; | |||
use common\logic\AbstractDefinition; | |||
use common\logic\Ticket\TicketMessage\Model\TicketMessage; | |||
class TicketMessageDefinition extends AbstractDefinition | |||
{ | |||
public function getEntityFqcn(): string | |||
{ | |||
return TicketMessage::class; | |||
} | |||
} |
@@ -0,0 +1,35 @@ | |||
<?php | |||
namespace common\logic\Ticket\TicketMessage\Wrapper; | |||
use common\logic\AbstractContainer; | |||
use common\logic\Ticket\TicketMessage\Repository\TicketMessageRepository; | |||
use common\logic\Ticket\TicketMessage\Service\TicketMessageBuilder; | |||
use common\logic\Ticket\TicketMessage\Service\TicketMessageDefinition; | |||
class TicketMessageContainer extends AbstractContainer | |||
{ | |||
public function getServices(): array | |||
{ | |||
return [ | |||
TicketMessageDefinition::class, | |||
TicketMessageRepository::class, | |||
TicketMessageBuilder::class | |||
]; | |||
} | |||
public function getDefinition(): TicketMessageDefinition | |||
{ | |||
return TicketMessageDefinition::getInstance(); | |||
} | |||
public function getRepository(): TicketMessageRepository | |||
{ | |||
return TicketMessageRepository::getInstance(); | |||
} | |||
public function getFactory(): TicketMessageBuilder | |||
{ | |||
return TicketMessageBuilder::getInstance(); | |||
} | |||
} |
@@ -0,0 +1,21 @@ | |||
<?php | |||
namespace common\logic\Ticket\TicketMessage\Wrapper; | |||
use common\logic\AbstractManager; | |||
use common\logic\Ticket\TicketMessage\Repository\TicketMessageRepository; | |||
use common\logic\Ticket\TicketMessage\Service\TicketMessageBuilder; | |||
use common\logic\Ticket\TicketMessage\Service\TicketMessageDefinition; | |||
/** | |||
* @mixin TicketMessageDefinition | |||
* @mixin TicketMessageRepository | |||
* @mixin TicketMessageBuilder | |||
*/ | |||
class TicketMessageManager extends AbstractManager | |||
{ | |||
public function getContainerFqcn(): string | |||
{ | |||
return TicketMessageContainer::class; | |||
} | |||
} |
@@ -0,0 +1,103 @@ | |||
<?php | |||
/** | |||
* Copyright distrib (2018) | |||
* | |||
* contact@opendistrib.net | |||
* | |||
* 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 common\logic\Ticket\TicketUser\Model; | |||
use common\components\ActiveRecordCommon; | |||
use common\logic\Ticket\Ticket\Model\Ticket; | |||
use common\logic\User\User\Model\User; | |||
class TicketUser extends ActiveRecordCommon | |||
{ | |||
/** | |||
* @inheritdoc | |||
*/ | |||
public static function tableName() | |||
{ | |||
return 'ticket_user'; | |||
} | |||
/** | |||
* @inheritdoc | |||
*/ | |||
public function rules() | |||
{ | |||
return [ | |||
[['id_ticket', 'id_user'], 'required'], | |||
[['id_ticket', 'id_user'], 'integer'], | |||
[['read_at'], 'safe'], | |||
]; | |||
} | |||
/** | |||
* @inheritdoc | |||
*/ | |||
public function attributeLabels() | |||
{ | |||
return [ | |||
'id' => 'ID', | |||
'id_ticket' => 'Ticket', | |||
'id_user' => 'Utilisateur', | |||
'read_at' => 'Date de lecture', | |||
]; | |||
} | |||
/* | |||
* Relations | |||
*/ | |||
public function getUser() | |||
{ | |||
return $this->hasOne(User::class, ['id' => 'id_user']); | |||
} | |||
public function getTicket() | |||
{ | |||
return $this->hasOne(Ticket::class, ['id' => 'id_ticket']); | |||
} | |||
public function populateUser(User $user): void | |||
{ | |||
$this->populateFieldObject('id_user', 'user', $user); | |||
} | |||
public function populateTicket(Ticket $ticket): void | |||
{ | |||
$this->populateFieldObject('id_ticket', 'ticket', $ticket); | |||
} | |||
} |
@@ -0,0 +1,39 @@ | |||
<?php | |||
namespace common\logic\Ticket\TicketUser\Repository; | |||
use common\logic\AbstractRepository; | |||
use common\logic\Ticket\Ticket\Model\Ticket; | |||
use common\logic\Ticket\TicketUser\Model\TicketUser; | |||
use common\logic\User\User\Model\User; | |||
class TicketUserRepository extends AbstractRepository | |||
{ | |||
protected TicketUserRepositoryQuery $query; | |||
public function loadDependencies(): void | |||
{ | |||
$this->loadQuery(TicketUserRepositoryQuery::class); | |||
} | |||
/** | |||
* Retourne les options de base nécessaires à la fonction de recherche. | |||
*/ | |||
public function getDefaultOptionsSearch(): array | |||
{ | |||
return [ | |||
self::WITH => ['ticket', 'user'], | |||
self::JOIN_WITH => [], | |||
self::ORDER_BY => '', | |||
self::ATTRIBUTE_ID_PRODUCER => '' | |||
]; | |||
} | |||
public function findOneTicketUser(Ticket $ticket, User $user): ?TicketUser | |||
{ | |||
return $this->createDefaultQuery() | |||
->filterByTicket($ticket) | |||
->filterByUser($user) | |||
->findOne(); | |||
} | |||
} |
@@ -0,0 +1,30 @@ | |||
<?php | |||
namespace common\logic\Ticket\TicketUser\Repository; | |||
use common\logic\AbstractRepositoryQuery; | |||
use common\logic\Ticket\Ticket\Model\Ticket; | |||
use common\logic\Ticket\TicketUser\Service\TicketUserDefinition; | |||
use common\logic\User\User\Model\User; | |||
class TicketUserRepositoryQuery extends AbstractRepositoryQuery | |||
{ | |||
protected TicketUserDefinition $definition; | |||
public function loadDependencies(): void | |||
{ | |||
$this->loadDefinition(TicketUserDefinition::class); | |||
} | |||
public function filterByTicket(Ticket $ticket): self | |||
{ | |||
$this->andWhere(['ticket_user.id_ticket' => $ticket->id]); | |||
return $this; | |||
} | |||
public function filterByUser(User $user): self | |||
{ | |||
$this->andWhere(['ticket_user.id_user' => $user->id]); | |||
return $this; | |||
} | |||
} |
@@ -0,0 +1,49 @@ | |||
<?php | |||
namespace common\logic\Ticket\TicketUser\Service; | |||
use common\logic\AbstractBuilder; | |||
use common\logic\Ticket\Ticket\Model\Ticket; | |||
use common\logic\Ticket\TicketUser\Model\TicketUser; | |||
use common\logic\Ticket\TicketUser\Repository\TicketUserRepository; | |||
use common\logic\User\User\Model\User; | |||
class TicketUserBuilder extends AbstractBuilder | |||
{ | |||
protected TicketUserRepository $ticketUserRepository; | |||
public function loadDependencies(): void | |||
{ | |||
$this->ticketUserRepository = $this->loadService(TicketUserRepository::class); | |||
} | |||
public function instanciateTicketUser(Ticket $ticket, User $user): TicketUser | |||
{ | |||
$ticketUser = new TicketUser(); | |||
$ticketUser->populateTicket($ticket); | |||
$ticketUser->populateUser($user); | |||
return $ticketUser; | |||
} | |||
public function createTicketUser(Ticket $ticket, User $user): TicketUser | |||
{ | |||
$ticketUser = $this->instanciateTicketUser($ticket, $user); | |||
$this->saveCreate($ticketUser); | |||
return $ticketUser; | |||
} | |||
public function createTicketUserIfNotExist(Ticket $ticket, User $user): TicketUser | |||
{ | |||
return $this->ticketUserRepository->findOneTicketUser($ticket, $user) | |||
?? $this->createTicketUser($ticket, $user); | |||
} | |||
public function updateTicketUserReadAt(TicketUser $ticketUser) | |||
{ | |||
$ticketUser->read_at = date('Y-m-d H:i:s'); | |||
$this->saveUpdate($ticketUser); | |||
} | |||
} |
@@ -0,0 +1,14 @@ | |||
<?php | |||
namespace common\logic\Ticket\TicketUser\Service; | |||
use common\logic\AbstractDefinition; | |||
use common\logic\Ticket\TicketUser\Model\TicketUser; | |||
class TicketUserDefinition extends AbstractDefinition | |||
{ | |||
public function getEntityFqcn(): string | |||
{ | |||
return TicketUser::class; | |||
} | |||
} |
@@ -0,0 +1,35 @@ | |||
<?php | |||
namespace common\logic\Ticket\TicketUser\Wrapper; | |||
use common\logic\AbstractContainer; | |||
use common\logic\Ticket\TicketUser\Repository\TicketUserRepository; | |||
use common\logic\Ticket\TicketUser\Service\TicketUserBuilder; | |||
use common\logic\Ticket\TicketUser\Service\TicketUserDefinition; | |||
class TicketUserContainer extends AbstractContainer | |||
{ | |||
public function getServices(): array | |||
{ | |||
return [ | |||
TicketUserDefinition::class, | |||
TicketUserRepository::class, | |||
TicketUserBuilder::class | |||
]; | |||
} | |||
public function getDefinition(): TicketUserDefinition | |||
{ | |||
return TicketUserDefinition::getInstance(); | |||
} | |||
public function getRepository(): TicketUserRepository | |||
{ | |||
return TicketUserRepository::getInstance(); | |||
} | |||
public function getBuilder(): TicketUserBuilder | |||
{ | |||
return TicketUserBuilder::getInstance(); | |||
} | |||
} |
@@ -0,0 +1,21 @@ | |||
<?php | |||
namespace common\logic\Ticket\TicketUser\Wrapper; | |||
use common\logic\AbstractManager; | |||
use common\logic\Ticket\TicketMessage\Repository\TicketMessageRepository; | |||
use common\logic\Ticket\TicketMessage\Service\TicketMessageBuilder; | |||
use common\logic\Ticket\TicketMessage\Service\TicketMessageDefinition; | |||
/** | |||
* @mixin TicketMessageDefinition | |||
* @mixin TicketMessageRepository | |||
* @mixin TicketMessageBuilder | |||
*/ | |||
class TicketUserManager extends AbstractManager | |||
{ | |||
public function getContainerFqcn(): string | |||
{ | |||
return TicketUserContainer::class; | |||
} | |||
} |
@@ -204,4 +204,24 @@ class UserRepository extends AbstractRepository | |||
->filterByStatus($status) | |||
->find(); | |||
} | |||
public function countUsersActiveLastThreeMonths() | |||
{ | |||
$connection = \Yii::$app->getDb(); | |||
$command = $connection->createCommand( | |||
' | |||
SELECT `user`.id, COUNT(`order`.id) AS count_orders | |||
FROM `user` | |||
LEFT JOIN `order` ON `user`.id = `order`.`id_user` AND `order`.`date` >= :date_limit | |||
GROUP BY `user`.id | |||
HAVING count_orders > 0;', | |||
[ | |||
':date_limit' => date('Y-m-d', strtotime("-3 month")), | |||
] | |||
); | |||
$results = $command->query(); | |||
return count($results); | |||
} | |||
} |
@@ -3,6 +3,7 @@ | |||
namespace common\logic\User\User\Service; | |||
use common\helpers\GlobalParam; | |||
use common\helpers\Mailjet; | |||
use common\logic\AbstractService; | |||
use common\logic\Producer\Producer\Model\Producer; | |||
use common\logic\User\User\Model\User; | |||
@@ -10,21 +11,28 @@ use common\logic\UtilsInterface; | |||
class UserUtils extends AbstractService implements UtilsInterface | |||
{ | |||
protected UserSolver $userSolver; | |||
public function loadDependencies(): void | |||
{ | |||
$this->userSolver = $this->loadService(UserSolver::class); | |||
} | |||
public function sendEmailSignup(User $user, Producer $producer) | |||
{ | |||
\Yii::$app->mailer->compose( | |||
[ | |||
'html' => 'signup-html', | |||
'text' => 'signup-text' | |||
], | |||
[ | |||
Mailjet::sendMail([ | |||
'from_email' => \Yii::$app->params['adminEmail'], | |||
'from_name' => 'Opendistrib', | |||
'to_email' => $user->email, | |||
'to_name' => $this->userSolver->getUsername($user), | |||
'subject' => '[Opendistrib] Inscription', | |||
'content_view_text' => '@common/mail/signup-text.php', | |||
'content_view_html' => '@common/mail/signup-html.php', | |||
'content_params' => [ | |||
'user' => $user, | |||
'producer' => $producer | |||
]) | |||
->setTo($user->email) | |||
->setFrom([\Yii::$app->params['adminEmail'] => 'distrib']) | |||
->setSubject('[Opendistrib] Inscription') | |||
->send(); | |||
] | |||
]); | |||
} | |||
/** |
@@ -41,4 +41,10 @@ class UserProducerRepository extends AbstractRepository | |||
->filterByBookmark($bookmark) | |||
->find(); | |||
} | |||
public function isProducerBookmarked(User $user): bool | |||
{ | |||
$userProducer = $this->findOneUserProducer($user); | |||
return $userProducer ? $userProducer->bookmark : false; | |||
} | |||
} |
@@ -138,7 +138,7 @@ class UserProducerBuilder extends AbstractBuilder | |||
&& $newCredit <= $creditLimitReminder; | |||
} | |||
public function updateActive(User $user, Producer $producer, bool $active): void | |||
public function updateActive(User $user, Producer $producer, bool $active): bool | |||
{ | |||
$userProducer = $this->createUserProducerIfNotExist( | |||
$user, | |||
@@ -147,6 +147,24 @@ class UserProducerBuilder extends AbstractBuilder | |||
$userProducer->active = $active; | |||
$this->saveUpdate($userProducer); | |||
return $this->saveUpdate($userProducer); | |||
} | |||
public function updateBookmark(UserProducer $userProducer, bool $bookmark) | |||
{ | |||
$userProducer->bookmark = $bookmark; | |||
return $this->saveUpdate($userProducer); | |||
} | |||
public function addProducerBookmark(User $user) | |||
{ | |||
$userProducer = $this->createUserProducerIfNotExist($user, $this->getProducerContext()); | |||
return $this->updateBookmark($userProducer, true); | |||
} | |||
public function removeProducerBookmark(User $user) | |||
{ | |||
$userProducer = $this->createUserProducerIfNotExist($user, $this->getProducerContext()); | |||
return $this->updateBookmark($userProducer, false); | |||
} | |||
} |
@@ -49,14 +49,15 @@ use common\logic\User\User\Model\User; | |||
<strong><?= Html::encode($user->email) ?></strong></p> | |||
<?php if($user->status == User::STATUS_PRODUCER): ?> | |||
<p>Vous pouvez dès maintenant vous connecter à votre <a href="<?= Yii::$app->urlManagerBackend->createAbsoluteUrl(['site/index']); ?>">Espace producteur</a> pour mettre | |||
en place votre système de réservation.</p> | |||
<p>Vous pouvez dès maintenant vous connecter à l'<a href="<?= Yii::$app->urlManagerBackend->createAbsoluteUrl(['site/index']); ?>">administration</a> pour configurer votre compte producteur.</p> | |||
<p>Si vous avez des questions ou si vous avez besoin d'être accompagné lors de cette étape, n'hésitez pas à me contacter en réponse à ce mail ou directement au <strong><?= Yii::$app->params['adminPhoneNumber'] ?></strong>.</p> | |||
<?php else: ?> | |||
<?php if(!is_null($producer)): ?> | |||
<p>Vous pouvez maintenant <a href="<?= Yii::$app->urlManagerProducer->createAbsoluteUrl(['site/index', 'slug_producer' => $producer->slug]); ?>">passer commande</a> chez votre producteur <strong><?= Html::encode($producer->name); ?></strong>.</p> | |||
<?php else: ?> | |||
<p>Vous pouvez maintenant passer commande chez votre producteur.</p> | |||
<p>Vous pouvez maintenant passer commande chez votre producteur.</p> | |||
<?php endif; ?> | |||
<?php endif; ?> | |||
<p>À bientôt.</p> | |||
<p>À bientôt,<br /> | |||
<?= Yii::$app->params['adminFirstname'] ?></p> |
@@ -48,7 +48,10 @@ Voici votre identifiant de connexion : | |||
<?= $user->email ?> | |||
<?php if($user->status == User::STATUS_PRODUCER): ?> | |||
Vous pouvez dès maintenant vous connecter à votre Espace boulanger pour mettre en place votre système de réservation : | |||
Vous pouvez dès maintenant vous connecter à l'administration pour configurer votre compte : | |||
<?= Yii::$app->urlManagerBackend->createAbsoluteUrl(['site/index']); ?> | |||
Si vous avez des questions ou si vous avez besoin d'être accompagné lors de cette étape, n'hésitez pas à me contacter en réponse à ce mail ou directement au <?= Yii::$app->params['adminPhoneNumber'] ?>. | |||
<?= Yii::$app->urlManagerBackend->createAbsoluteUrl(['site/index']); ?> | |||
<?php else: ?> | |||
<?php if(!is_null($producer)): ?> | |||
@@ -59,4 +62,5 @@ Vous pouvez maintenant passer commande chez votre producteur. | |||
<?php endif; ?> | |||
<?php endif; ?> | |||
À bientôt. | |||
À bientôt, | |||
<?= Yii::$app->params['adminFirstname'] ?> |
@@ -0,0 +1,12 @@ | |||
<h4>Date de sortie</h4> | |||
<ul> | |||
<li>17/08/2023</li> | |||
</ul> | |||
<h4>Évolutions</h4> | |||
<ul> | |||
<li>[Administration] Système de support</li> | |||
<li>[Site] Évolution du contenu et mise en page : carte et liste des producteurs, à propos, fonctionnalités, code source.</li> | |||
<li>[Site] Lien "Je demande une démo"</li> | |||
<li>[Site & espace producteur] Barre de navigation en haut du site</li> | |||
</ul> |
@@ -0,0 +1,154 @@ | |||
<?php | |||
use common\helpers\GlobalParam; | |||
use common\logic\Producer\Producer\Model\Producer; | |||
use common\logic\User\User\Wrapper\UserManager; | |||
use yii\bootstrap\Nav; | |||
use yii\helpers\Html; | |||
$userManager = UserManager::getInstance(); | |||
$producer = null; | |||
if ($userManager->isCurrentProducer()) { | |||
$producer = Producer::searchOne(['id' => \Yii::$app->user->identity->id_producer]); | |||
} | |||
?> | |||
<div class="nav-user-top"> | |||
<nav class="navbar navbar-default"> | |||
<div class="container"> | |||
<?php | |||
$producersArray = Producer::find() | |||
->joinWith(['userProducer user_producer']) | |||
->where([ | |||
'user_producer.id_user' => GlobalParam::getCurrentUserId(), | |||
'user_producer.bookmark' => 1, | |||
]) | |||
->all(); | |||
$itemsProducersArray = []; | |||
if (count($producersArray)) { | |||
$itemsProducersArray[] = [ | |||
'label' => 'Mes favoris', | |||
]; | |||
foreach($producersArray as $producerItem) { | |||
$itemsProducersArray[] = [ | |||
'label' => Html::encode($producerItem->name), | |||
'url' => $this->getUrlManagerProducer()->createAbsoluteUrl(['site/index', 'slug_producer' => $producerItem->slug]), | |||
]; | |||
} | |||
} | |||
else { | |||
$itemsProducersArray[] = [ | |||
'label' => 'Aucun producteur dans vos favoris.', | |||
]; | |||
} | |||
$itemsProducersArray[] = [ | |||
'options' => ['class' => 'divider'], | |||
'label' => '' | |||
]; | |||
$itemsProducersArray[] = [ | |||
'label' => '<span class="glyphicon glyphicon-search"></span> Rechercher un producteur', | |||
'url' => $this->getUrlManagerFrontend()->createAbsoluteUrl(['site/producers']) | |||
]; | |||
// Items du menu | |||
$itemAdministration = [ | |||
'label' => '<span class="glyphicon glyphicon-cog"></span> <span class="link-text">Administration</span>', | |||
'url' => $this->getUrlManagerBackend()->createAbsoluteUrl(['site/index']), | |||
'visible' => $userManager->isCurrentProducer(), | |||
'linkOptions' => ['class' => 'btn btn-default navbar-btn'] | |||
]; | |||
$itemProducerSpace = [ | |||
//'label' => '<span class="glyphicon glyphicon-eye-open"></span> <span class="link-text">'.Html::encode($producer->name).'</span>', | |||
'label' => '<span class="glyphicon glyphicon-eye-open"></span> <span class="link-text">Mon espace producteur</span>', | |||
'url' => $this->getUrlManagerProducer()->createAbsoluteUrl(['site/index', 'slug_producer' => $producer ? $producer->slug : '']), | |||
'visible' => $userManager->isCurrentProducer(), | |||
'linkOptions' => ['class' => 'btn btn-default navbar-btn'] | |||
]; | |||
$itemProducers = [ | |||
'label' => '<span class="glyphicon glyphicon-star"></span> <span class="link-text">Mes producteurs</span>', | |||
'url' => '#', | |||
'items' => $itemsProducersArray, | |||
'linkOptions' => ['class' => 'btn btn-default navbar-btn'], | |||
'visible' => !Yii::$app->user->isGuest | |||
]; | |||
$itemsUserArray = []; | |||
if($context == 'producer') { | |||
$itemsUserArray = [ | |||
[ | |||
'label' => '<span class="glyphicon glyphicon-chevron-left"></span> Retour à l\'accueil', | |||
'url' => $this->getUrlManagerFrontend()->createUrl(['site/index']), | |||
] | |||
]; | |||
} | |||
$itemsUserArray[] = [ | |||
'label' => '<span class="glyphicon glyphicon-user"></span> Mon profil', | |||
'url' => $this->getUrlManagerFrontend()->createUrl(['user/update']), | |||
]; | |||
$itemsUserArray[] = [ | |||
'label' => '<span class="glyphicon glyphicon-off"></span> Déconnexion', | |||
'url' => $this->getUrlManagerFrontend()->createUrl(['site/logout']), | |||
]; | |||
$itemUser = [ | |||
'label' => '<span class="glyphicon glyphicon-user"></span> <span class="link-text">' . | |||
((!Yii::$app->user->isGuest) ? Html::encode(Yii::$app->user->identity->name . ' ' . strtoupper(substr(Yii::$app->user->identity->lastname, 0, 1)).'.') : '') . | |||
//($producer ? ' ('.Html::encode($producer->name).')' : ''). | |||
'</span>', | |||
'options' => ['id' => 'label1'], | |||
'url' => '#', | |||
'linkOptions' => ['class' => 'btn btn-default navbar-btn'], | |||
'items' => $itemsUserArray, | |||
'visible' => !Yii::$app->user->isGuest | |||
]; | |||
$itemConnexion = [ | |||
'label' => '<span class="glyphicon glyphicon-log-in"></span> Connexion', | |||
'url' => $this->getUrlManagerFrontend()->createUrl(['site/login']), | |||
'linkOptions' => ['class' => 'btn btn-default navbar-btn'], | |||
'visible' => \Yii::$app->user->isGuest, | |||
'active' => $this->getControllerAction() == 'site/login' | |||
]; | |||
$itemSignup = [ | |||
'label' => '<span class="glyphicon glyphicon-user"></span> Inscription', | |||
'url' => $this->getUrlManagerFrontend()->createUrl(['site/signup']), | |||
'linkOptions' => ['class' => 'btn btn-default navbar-btn'], | |||
'visible' => \Yii::$app->user->isGuest, | |||
'active' => $this->getControllerAction() == 'site/signup' | |||
]; | |||
if($context == 'frontend') { | |||
$itemsMenu = [ | |||
$itemAdministration, | |||
$itemProducerSpace, | |||
$itemProducers, | |||
$itemUser, | |||
$itemConnexion, | |||
$itemSignup | |||
]; | |||
} | |||
elseif($context == 'producer') { | |||
$itemsMenu = [ | |||
$itemAdministration, | |||
$itemProducers, | |||
$itemUser, | |||
$itemConnexion, | |||
$itemSignup | |||
]; | |||
} | |||
echo Nav::widget([ | |||
'encodeLabels' => false, | |||
'options' => ['class' => 'nav nav-pills navbar-nav navbar-right'], | |||
'items' => $itemsMenu | |||
]); | |||
?> | |||
</div> | |||
</nav> | |||
</div> |
@@ -83,36 +83,97 @@ termes. | |||
font-weight: normal; | |||
font-style: normal; | |||
} | |||
/* line 2, ../sass/_common.scss */ | |||
/* line 3, ../sass/_common.scss */ | |||
.float-left { | |||
float: left; | |||
} | |||
/* line 7, ../sass/_common.scss */ | |||
.float-right { | |||
float: right; | |||
} | |||
/* Navigation utilisateur en haut du site */ | |||
/* line 13, ../sass/_common.scss */ | |||
.nav-user-top .navbar { | |||
-moz-border-radius: 0px; | |||
-webkit-border-radius: 0px; | |||
border-radius: 0px; | |||
border: 0px none; | |||
margin-bottom: 0px; | |||
} | |||
/* line 19, ../sass/_common.scss */ | |||
.nav-user-top .navbar ul li { | |||
padding-left: 5px; | |||
} | |||
/* line 22, ../sass/_common.scss */ | |||
.nav-user-top .navbar ul li a { | |||
padding-left: 10px; | |||
padding-right: 10px; | |||
} | |||
/* line 26, ../sass/_common.scss */ | |||
.nav-user-top .navbar ul li a.navbar-btn { | |||
padding: 5px 10px; | |||
} | |||
/* line 31, ../sass/_common.scss */ | |||
.nav-user-top .navbar ul li ul li a { | |||
padding: 2px 20px; | |||
} | |||
/* line 39, ../sass/_common.scss */ | |||
.nav-user-top .dropdown-menu .divider.dropdown-header { | |||
padding: 0px; | |||
} | |||
@media screen and (max-width: 768px) { | |||
/* line 48, ../sass/_common.scss */ | |||
.nav-user-top .navbar ul { | |||
float: right; | |||
margin-right: 0px; | |||
} | |||
/* line 53, ../sass/_common.scss */ | |||
.nav-user-top .navbar .link-text { | |||
display: none; | |||
} | |||
/* line 57, ../sass/_common.scss */ | |||
.nav-user-top .navbar .dropdown-menu { | |||
position: absolute; | |||
right: 5%; | |||
left: auto; | |||
border: 1px solid #ddd; | |||
background: #fff; | |||
-moz-box-shadow: 0px 0px 4px gray; | |||
-webkit-box-shadow: 0px 0px 4px gray; | |||
box-shadow: 0px 0px 4px gray; | |||
} | |||
/* line 66, ../sass/_common.scss */ | |||
.nav-user-top .navbar .dropdown-menu li a { | |||
padding-left: 15px; | |||
} | |||
} | |||
/* Block de date */ | |||
/* line 76, ../sass/_common.scss */ | |||
.block-date { | |||
margin: 0px auto; | |||
padding-top: 0px; | |||
text-align: center; | |||
} | |||
/* line 7, ../sass/_common.scss */ | |||
/* line 81, ../sass/_common.scss */ | |||
.block-date .day { | |||
text-transform: capitalize; | |||
line-height: 15px; | |||
font-size: 13px; | |||
text-transform: uppercase; | |||
} | |||
/* line 14, ../sass/_common.scss */ | |||
/* line 88, ../sass/_common.scss */ | |||
.block-date .num { | |||
font-size: 30px; | |||
line-height: 35px; | |||
font-weight: bold; | |||
} | |||
/* line 20, ../sass/_common.scss */ | |||
/* line 94, ../sass/_common.scss */ | |||
.block-date .month { | |||
text-transform: uppercase; | |||
line-height: 15px; | |||
font-size: 13px; | |||
color: #e67200; | |||
} | |||
/* line 32, ../sass/_common.scss */ | |||
#footer #code-source img, | |||
#footer #social-mastodon img, | |||
#footer #social-diaspora img { | |||
height: 20px; | |||
color: #e08e0b; | |||
} |
@@ -1,6 +1,17 @@ | |||
/** | |||
* Created by fab on 30/12/17. | |||
*/ | |||
$(document).ready(function() { | |||
opendistrib_dropdown_tooltip(); | |||
}); | |||
function opendistrib_dropdown_tooltip() { | |||
if($('.dropdown-toggle').length) { | |||
$('.dropdown-toggle').dropdown() ; | |||
} | |||
if($('[data-toggle="tooltip"]').length) { | |||
$('[data-toggle="tooltip"]').tooltip() ; | |||
} | |||
} | |||
/** | |||
* Retourne un prix sans taxe sur base du prix avec tax |
@@ -1,36 +1,100 @@ | |||
@import "compass"; | |||
.block-date { | |||
margin: 0px auto ; | |||
padding-top: 0px ; | |||
text-align: center ; | |||
.day { | |||
text-transform: capitalize ; | |||
line-height: 15px ; | |||
font-size: 13px ; | |||
text-transform: uppercase ; | |||
} | |||
.float-left { | |||
float: left; | |||
} | |||
.float-right { | |||
float: right; | |||
} | |||
/* Navigation utilisateur en haut du site */ | |||
.nav-user-top { | |||
.navbar { | |||
@include border-radius(0px); | |||
border: 0px none; | |||
margin-bottom: 0px; | |||
ul { | |||
li { | |||
padding-left: 5px; | |||
a { | |||
padding-left: 10px; | |||
padding-right: 10px; | |||
&.navbar-btn { | |||
padding: 5px 10px; | |||
} | |||
} | |||
.num { | |||
font-size: 30px ; | |||
line-height: 35px ; | |||
font-weight: bold ; | |||
ul li a { | |||
padding: 2px 20px; | |||
} | |||
} | |||
} | |||
} | |||
.month { | |||
text-transform: uppercase ; | |||
line-height: 15px ; | |||
font-size: 13px ; | |||
color: darken($color1, 5) ; | |||
.dropdown-menu { | |||
.divider.dropdown-header { | |||
padding: 0px; | |||
} | |||
} | |||
} | |||
#footer { | |||
#code-source, | |||
#social-mastodon, | |||
#social-diaspora { | |||
img { | |||
height: 20px ; | |||
@media screen and (max-width: 768px) { | |||
.nav-user-top { | |||
.navbar { | |||
ul { | |||
float: right; | |||
margin-right: 0px; | |||
} | |||
.link-text { | |||
display: none; | |||
} | |||
.dropdown-menu { | |||
position: absolute; | |||
right: 5%; | |||
left: auto; | |||
border: 1px solid #ddd; | |||
background: #fff; | |||
@include box-shadow(0px 0px 4px gray); | |||
li { | |||
a { | |||
padding-left: 15px; | |||
} | |||
} | |||
} | |||
} | |||
} | |||
} | |||
/* Block de date */ | |||
.block-date { | |||
margin: 0px auto; | |||
padding-top: 0px; | |||
text-align: center; | |||
.day { | |||
text-transform: capitalize; | |||
line-height: 15px; | |||
font-size: 13px; | |||
text-transform: uppercase; | |||
} | |||
.num { | |||
font-size: 30px; | |||
line-height: 35px; | |||
font-weight: bold; | |||
} | |||
.month { | |||
text-transform: uppercase; | |||
line-height: 15px; | |||
font-size: 13px; | |||
color: darken($color1, 5); | |||
} | |||
} |
@@ -34,7 +34,7 @@ pris connaissance de la licence CeCILL, et que vous en avez accepté les | |||
termes. | |||
*/ | |||
$color1: #FF7F00 ; | |||
$color1: #F39C12 ; | |||
$dir-fonts: '../fonts/' ; | |||
@import "_fonts.scss" ; | |||
@import "_common.scss" ; |
@@ -0,0 +1,52 @@ | |||
<?php | |||
use yii\db\Migration; | |||
use yii\db\Schema; | |||
/** | |||
* Class m230717_120138_module_ticket | |||
*/ | |||
class m230717_120138_module_ticket extends Migration | |||
{ | |||
/** | |||
* {@inheritdoc} | |||
*/ | |||
public function safeUp() | |||
{ | |||
$this->createTable('ticket', [ | |||
'id' => 'pk', | |||
'id_producer' => Schema::TYPE_INTEGER.' NOT NULL', | |||
'id_user' => Schema::TYPE_INTEGER.' NOT NULL', | |||
'subject' => Schema::TYPE_STRING.' NOT NULL', | |||
'status' => Schema::TYPE_STRING.' NOT NULL', | |||
'created_at' => Schema::TYPE_DATETIME.' NOT NULL DEFAULT CURRENT_TIMESTAMP', | |||
'updated_at' => Schema::TYPE_DATETIME.' NOT NULL DEFAULT CURRENT_TIMESTAMP' | |||
]); | |||
$this->createTable('ticket_message', [ | |||
'id' => 'pk', | |||
'id_ticket' => Schema::TYPE_INTEGER.' NOT NULL', | |||
'id_user' => Schema::TYPE_INTEGER.' NOT NULL', | |||
'message' => Schema::TYPE_TEXT.' NOT NULL', | |||
'created_at' => Schema::TYPE_DATETIME.' NOT NULL DEFAULT CURRENT_TIMESTAMP', | |||
'updated_at' => Schema::TYPE_DATETIME.' NOT NULL DEFAULT CURRENT_TIMESTAMP', | |||
]); | |||
$this->createTable('ticket_user', [ | |||
'id' => 'pk', | |||
'id_user' => Schema::TYPE_INTEGER.' NOT NULL', | |||
'id_ticket' => Schema::TYPE_INTEGER.' NOT NULL', | |||
'read_at' => Schema::TYPE_DATETIME.' NOT NULL DEFAULT CURRENT_TIMESTAMP', | |||
]); | |||
} | |||
/** | |||
* {@inheritdoc} | |||
*/ | |||
public function safeDown() | |||
{ | |||
$this->dropTable('ticket'); | |||
$this->dropTable('ticket_message'); | |||
$this->dropTable('ticket_user'); | |||
} | |||
} |
@@ -0,0 +1,28 @@ | |||
<?php | |||
use yii\db\Migration; | |||
use yii\db\Schema; | |||
/** | |||
* Class m230725_072843_producer_add_latitude_longitude | |||
*/ | |||
class m230725_072843_producer_add_latitude_longitude extends Migration | |||
{ | |||
/** | |||
* {@inheritdoc} | |||
*/ | |||
public function safeUp() | |||
{ | |||
$this->addColumn('producer', 'latitude', Schema::TYPE_FLOAT); | |||
$this->addColumn('producer', 'longitude', Schema::TYPE_FLOAT); | |||
} | |||
/** | |||
* {@inheritdoc} | |||
*/ | |||
public function safeDown() | |||
{ | |||
$this->dropColumn('producer', 'latitude'); | |||
$this->dropColumn('producer', 'longitude'); | |||
} | |||
} |
@@ -0,0 +1,28 @@ | |||
<?php | |||
use common\logic\Producer\Producer\Model\Producer; | |||
use yii\db\Migration; | |||
use yii\db\Schema; | |||
/** | |||
* Class m230726_105750_producer_alter_option_display_message_new_opendistrib_version | |||
*/ | |||
class m230726_105750_producer_alter_option_display_message_new_opendistrib_version extends Migration | |||
{ | |||
/** | |||
* {@inheritdoc} | |||
*/ | |||
public function safeUp() | |||
{ | |||
$this->alterColumn('producer', 'option_display_message_new_opendistrib_version', Schema::TYPE_BOOLEAN.' DEFAULT 0'); | |||
Producer::updateAll(['option_display_message_new_opendistrib_version' => 0]); | |||
} | |||
/** | |||
* {@inheritdoc} | |||
*/ | |||
public function safeDown() | |||
{ | |||
$this->alterColumn('producer', 'option_display_message_new_opendistrib_version', Schema::TYPE_BOOLEAN.' DEFAULT 1'); | |||
} | |||
} |
@@ -0,0 +1,28 @@ | |||
<?php | |||
use yii\db\Migration; | |||
use yii\db\Schema; | |||
/** | |||
* Class m230731_073506_producer_latitude_longitude_double | |||
*/ | |||
class m230731_073506_producer_latitude_longitude_double extends Migration | |||
{ | |||
/** | |||
* {@inheritdoc} | |||
*/ | |||
public function safeUp() | |||
{ | |||
$this->alterColumn('producer', 'latitude', Schema::TYPE_DOUBLE); | |||
$this->alterColumn('producer', 'longitude', Schema::TYPE_DOUBLE); | |||
} | |||
/** | |||
* {@inheritdoc} | |||
*/ | |||
public function safeDown() | |||
{ | |||
$this->alterColumn('producer', 'latitude', Schema::TYPE_FLOAT); | |||
$this->alterColumn('producer', 'longitude', Schema::TYPE_FLOAT); | |||
} | |||
} |
@@ -59,9 +59,11 @@ class AppAsset extends \common\components\MyAssetBundle | |||
parent::__construct() ; | |||
// css | |||
$this->addAsset('css','js/leaflet/leaflet-1.9.4.css'); | |||
$this->addAsset('css','css/screen.css'); | |||
// js | |||
$this->addAsset('js','js/leaflet/leaflet-1.9.4.min.js'); | |||
$this->addAsset('js','js/frontend.js'); | |||
} | |||
} |
@@ -0,0 +1,110 @@ | |||
<?php | |||
/** | |||
* Copyright distrib (2018) | |||
* | |||
* contact@opendistrib.net | |||
* | |||
* 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 frontend\controllers; | |||
use yii\helpers\Html; | |||
use yii\filters\VerbFilter; | |||
use yii\filters\AccessControl; | |||
use yii\web\NotFoundHttpException; | |||
class BookmarkController extends FrontendController | |||
{ | |||
/** | |||
* @inheritdoc | |||
*/ | |||
public function behaviors() | |||
{ | |||
return [ | |||
'verbs' => [ | |||
'class' => VerbFilter::class, | |||
'actions' => [ | |||
], | |||
], | |||
'access' => [ | |||
'class' => AccessControl::class, | |||
'rules' => [ | |||
[ | |||
'allow' => true, | |||
'roles' => ['@'], | |||
] | |||
], | |||
], | |||
]; | |||
} | |||
public function actionAdd(int $idProducer) | |||
{ | |||
$userProducerManager = $this->getUserProducerManager(); | |||
$producer = $this->findProducer($idProducer); | |||
$userCurrent = $this->getUserCurrent(); | |||
$this->getLogic()->setProducerContext($producer); | |||
$userProducerManager->addProducerBookmark($userCurrent); | |||
$this->setFlash('success', 'Le producteur <strong>' . Html::encode($producer->name) . '</strong> vient d\'être ajouté à votre liste de producteurs.'); | |||
return $this->redirectReferer(); | |||
} | |||
public function actionRemove(int $idProducer) | |||
{ | |||
$userProducerManager = $this->getUserProducerManager(); | |||
$producer = $this->findProducer($idProducer); | |||
$userCurrent = $this->getUserCurrent(); | |||
$this->getLogic()->setProducerContext($producer); | |||
$userProducerManager->removeProducerBookmark($userCurrent); | |||
$this->setFlash('success', 'Le producteur <strong>' . Html::encode($producer->name) . '</strong> vient d\'être supprimé de votre liste de producteurs.'); | |||
return $this->redirectReferer(); | |||
} | |||
public function findProducer(int $idProducer) | |||
{ | |||
$producerManager = $this->getProducerManager(); | |||
$producer = $producerManager->findOneProducerById($idProducer); | |||
if($producer) { | |||
return $producer; | |||
} | |||
else { | |||
throw new NotFoundHttpException('Producteur introuvable.'); | |||
} | |||
} | |||
} |
@@ -40,6 +40,7 @@ namespace frontend\controllers; | |||
use common\helpers\GlobalParam; | |||
use frontend\forms\ProducerCodeForm; | |||
use GuzzleHttp\Client; | |||
use Yii; | |||
use frontend\forms\PasswordResetRequestForm; | |||
use frontend\forms\ResetPasswordForm; | |||
@@ -47,6 +48,7 @@ use frontend\forms\SignupForm; | |||
use common\forms\ContactForm; | |||
use yii\base\InvalidParamException; | |||
use yii\data\ActiveDataProvider; | |||
use yii\helpers\Html; | |||
use yii\web\BadRequestHttpException; | |||
use yii\filters\VerbFilter; | |||
use yii\filters\AccessControl; | |||
@@ -126,18 +128,13 @@ class SiteController extends FrontendController | |||
*/ | |||
public function actionIndex() | |||
{ | |||
return $this->render('index', [ | |||
'producerDemoAccount' => $this->getProducerManager()->findOneProducerDemoAccount(), | |||
'dataProviderPrices' => $this->getDataProviderPrices() | |||
]); | |||
return $this->render('index'); | |||
} | |||
/** | |||
* Page de présentation des tarifs. | |||
*/ | |||
public function actionPrices() | |||
public function actionService() | |||
{ | |||
return $this->render('prices', [ | |||
return $this->render('service', [ | |||
'producerDemoAccount' => $this->getProducerManager()->findOneProducerDemoAccount(), | |||
'dataProviderPrices' => $this->getDataProviderPrices() | |||
]); | |||
} | |||
@@ -165,10 +162,74 @@ class SiteController extends FrontendController | |||
]); | |||
return $this->render('producers', [ | |||
'dataProviderProducers' => $dataProviderProducers | |||
'dataProviderProducers' => $dataProviderProducers, | |||
'producersArray' => $this->getProducerManager()->findProducersActive() | |||
]); | |||
} | |||
public function actionAbout() | |||
{ | |||
$aboutFewNumbers = Yii::$app->cache->getOrSet('about_few_numbers4', function () { | |||
$producerManager = $this->getProducerManager(); | |||
$pointSaleManager = $this->getPointSaleManager(); | |||
$userManager = $this->getUserManager(); | |||
$orderManager = $this->getOrderManager(); | |||
$countProducersActive = $producerManager->countProducersActiveWithTurnover(); | |||
$countPointSalesActive = $pointSaleManager->countPointSalesActiveLastThreeMonths(); | |||
$countUsersActive = $userManager->countUsersActiveLastThreeMonths(); | |||
$averageOrdersPerDay = $orderManager->countGlobalUserOrdersAverageLastSevenDays(); | |||
$averageTurnover = $orderManager->getAverageTurnoverLastThreeMonths(); | |||
$resultMatomoApiVisitSummary = json_decode(file_get_contents(Yii::$app->params['matomoApiVisitSummaryUrl'])); | |||
$numberVisitsMonth = $resultMatomoApiVisitSummary->nb_uniq_visitors; | |||
return $this->renderPartial('_about_few_numbers', [ | |||
'countProducersActive' => $countProducersActive, | |||
'countPointSalesActive' => $countPointSalesActive, | |||
'countUsersActive' => $countUsersActive, | |||
'averageOrdersPerDay' => $averageOrdersPerDay, | |||
'averageTurnover' => $averageTurnover, | |||
'numberVisitsMonth' => $numberVisitsMonth | |||
]); | |||
}, 60 * 60 * 24); | |||
$producerManager = $this->getProducerManager(); | |||
return $this->render('about', [ | |||
'countProducers' => $producerManager->countProducersActiveWithTurnover(), | |||
'aboutFewNumbers' => $aboutFewNumbers | |||
]); | |||
} | |||
public function actionSourceCode() | |||
{ | |||
return $this->render('source_code'); | |||
} | |||
/** | |||
* Liste les producteurs utilisant la plateforme. | |||
*/ | |||
public function actionAjaxProducers() | |||
{ | |||
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; | |||
$producersArray = $this->getProducerManager()->findProducersActive(); | |||
$producersArrayReturn = []; | |||
foreach($producersArray as $producer) { | |||
$producersArrayReturn[] = [ | |||
'id' => $producer->id, | |||
'name' => Html::encode($producer->name), | |||
'type' => Html::encode($producer->type), | |||
'address' => Html::encode($producer->postcode.' '.$producer->city), | |||
'latitude' => $producer->latitude, | |||
'longitude' => $producer->longitude, | |||
'link' => $this->getUrlManagerProducer()->createAbsoluteUrl(['site/index', 'slug_producer' => $producer->slug]) | |||
]; | |||
} | |||
return $producersArrayReturn; | |||
} | |||
/** | |||
* Affiche la page de connexion et traite le formulaire de connexion. | |||
*/ | |||
@@ -369,6 +430,7 @@ class SiteController extends FrontendController | |||
if ($producerCodeForm->load($this->getRequest()->post()) | |||
&& $producerCodeForm->validate()) { | |||
$this->getLogic()->setProducerContext($producer); | |||
$producerManager->addUser(GlobalParam::getCurrentUser(), $producer); | |||
$this->redirect($this->getUrlManagerProducer()->createAbsoluteUrl(['site/index', 'slug_producer' => $producer->slug])); |
@@ -250,14 +250,11 @@ class SignupForm extends Model | |||
$producer = $producerManager->findOneProducerById($idProducer); | |||
if ($user->save() && $producer) { | |||
// Liaison User / Producer | |||
\Yii::$app->logic->setProducerContext($producer); | |||
$producerManager->addUser($user, $producer); | |||
// Envoi d'un email de bienvenue à l'utilisateur | |||
if ($this->isCustomer()) { | |||
$userManager->sendEmailSignup($user, $producer); | |||
} | |||
$producerManager->addUser($user, $producer); | |||
$userManager->sendEmailSignup($user, $producer); | |||
return $user; | |||
} |
@@ -36,35 +36,35 @@ | |||
* termes. | |||
*/ | |||
use common\helpers\GlobalParam; | |||
use common\logic\User\User\Wrapper\UserManager; | |||
use yii\helpers\Html; | |||
use yii\bootstrap\Nav; | |||
use common\helpers\Url; | |||
use common\logic\Producer\Producer\Model\Producer; | |||
/* @var $this \yii\web\View */ | |||
/* @var $content string */ | |||
$isHome = (Yii::$app->controller->id == 'site' && \Yii::$app->controller->action->id == 'index'); | |||
\common\assets\CommonAsset::register($this); | |||
\frontend\assets\AppAsset::register($this); | |||
$userManager = UserManager::getInstance(); | |||
$isHome = (Yii::$app->controller->id == 'site' && \Yii::$app->controller->action->id == 'index'); | |||
$producer = null; | |||
if (!Yii::$app->user->isGuest && \Yii::$app->user->identity->id_producer > 0) { | |||
if ($userManager->isCurrentProducer()) { | |||
$producer = Producer::searchOne(['id' => \Yii::$app->user->identity->id_producer]); | |||
} | |||
?> | |||
<?php $this->beginPage() ?> | |||
<!DOCTYPE html> | |||
<html lang="fr"> | |||
<head> | |||
<title><?php if ($isHome): ?>Opendistrib | <?= Html::encode($this->title) ?><?php else: ?><?= Html::encode($this->title) ?> | Opendistrib<?php endif; ?></title> | |||
<meta charset="utf-8"> | |||
<meta name="viewport" content="width=device-width, initial-scale=1"> | |||
<meta name="baseurl" content="<?= Yii::$app->urlManagerFrontend->baseUrl; ?>"> | |||
<meta name="baseurl-absolute" | |||
content="<?= Yii::$app->urlManagerFrontend->getHostInfo() . Yii::$app->urlManagerBackend->baseUrl; ?>"> | |||
<?= Html::csrfMetaTags() ?> | |||
<link rel="icon" type="image/png" href="<?= $this->getUrlManager()->getBaseUrl(); ?>/img/favicon-distrib.png"/> | |||
<!--[if IE]><link rel="shortcut icon" type="image/x-icon" href="<?= \Yii::$app->urlManager->getBaseUrl(); ?>/img/favicon.ico" /><![endif]--> | |||
<link rel="icon" type="image/png" href="<?= $this->getUrlManager()->getBaseUrl(); ?>/img/favicon-distrib.png"> | |||
<!--[if IE]><link rel="shortcut icon" type="image/x-icon" href="<?= \Yii::$app->urlManager->getBaseUrl(); ?>/img/favicon.ico"><![endif]--> | |||
<?php $this->head() ?> | |||
<!--[if lt IE 9]> | |||
<script src="<?= $this->getUrlManager()->getBaseUrl(); ?>/js/html5shiv.min.js"></script> | |||
@@ -77,22 +77,19 @@ if (!Yii::$app->user->isGuest && \Yii::$app->user->identity->id_producer > 0) { | |||
</head> | |||
<body class="<?php if ($isHome): echo 'home'; endif; ?><?php if (!Yii::$app->user->isGuest): ?> connected<?php endif; ?>"> | |||
<?php $this->beginBody() ?> | |||
<div id="back"></div> | |||
<?php if (YII_ENV == 'demo'): ?> | |||
<div id="block-demo"> | |||
<div class="container"> | |||
<span class="glyphicon glyphicon-eye-open"></span> <strong>Espace de démonstration</strong> : | |||
Testez la plateforme sans avoir à vous inscrire. Les données sont réinitialisées quotidiennement | |||
• <?= Html::a('Retour', Url::env('prod', 'frontend')) ?> | |||
</div> | |||
</div> | |||
<?php endif; ?> | |||
<?= $this->render('@common/views/nav_user_top', [ | |||
'context' => 'frontend' | |||
]); ?> | |||
<header id="header"> | |||
<nav class="navbar navbar-default"> | |||
<div id="the-header" class="container"> | |||
<div class="navbar-header"> | |||
<a id="link-home" href="<?= $this->getUrlManager()->createUrl('site/index'); ?>"> | |||
<img src="<?php echo $this->getUrlManager()->getBaseUrl(); ?>/img/logo-distrib.png" alt=""/> | |||
<a id="link-home" class="" href="<?= $this->getUrlManager()->createUrl('site/index'); ?>"> | |||
Opendistrib | |||
<!--<img src="<?= $this->getUrlManager()->baseUrl ?>/img/souke.png" alt="Souke" />--> | |||
<!--<span style="position: relative;top: 22px;left: 5px;font-family: 'capsuularegular'">-alpha.fr</span>--> | |||
</a> | |||
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#w0-collapse"><span | |||
class="sr-only">Toggle navigation</span> | |||
@@ -114,16 +111,16 @@ if (!Yii::$app->user->isGuest && \Yii::$app->user->identity->id_producer > 0) { | |||
'options' => ['id' => 'li-home'] | |||
], | |||
[ | |||
'label' => '<span class="glyphicon glyphicon-search"></span> Producteurs', | |||
'label' => '<span class="glyphicon glyphicon-grain"></span> Producteurs', | |||
'url' => $this->getUrlManager()->createUrl(['site/producers']), | |||
'active' => $this->getControllerAction() == 'site/producers', | |||
'options' => ['id' => 'li-producteurs'] | |||
], | |||
[ | |||
'label' => '<span class="glyphicon glyphicon-eur"></span> Tarifs', | |||
'url' => $this->getUrlManager()->createUrl(['site/prices']), | |||
'active' => $this->getControllerAction() == 'site/prices', | |||
'options' => ['id' => 'li-producteurs'] | |||
'label' => '<span class="glyphicon glyphicon-info-sign"></span> À propos', | |||
'url' => $this->getUrlManager()->createUrl(['site/about']), | |||
'active' => $this->getControllerAction() == 'site/about', | |||
'options' => ['id' => 'li-about'] | |||
], | |||
[ | |||
'label' => '<span class="glyphicon glyphicon-envelope"></span> Contact', | |||
@@ -131,49 +128,6 @@ if (!Yii::$app->user->isGuest && \Yii::$app->user->identity->id_producer > 0) { | |||
'active' => $this->getControllerAction() == 'site/contact', | |||
'options' => ['id' => 'li-contact'] | |||
], | |||
[ | |||
'label' => '<span class="glyphicon glyphicon-flag"></span> ' . ($producer ? Html::encode($producer->name) : ''), | |||
'url' => '#', | |||
'items' => [ | |||
[ | |||
'label' => '<span class="glyphicon glyphicon-th-large"></span> Mon espace', | |||
'url' => $this->getUrlManagerProducer()->createAbsoluteUrl(['site/index', 'slug_producer' => $producer ? $producer->slug : '']), | |||
], | |||
[ | |||
'label' => '<span class="glyphicon glyphicon-cog"></span> Administration', | |||
'url' => $this->getUrlManagerBackend()->createAbsoluteUrl(['site/index']), | |||
] | |||
], | |||
'visible' => !Yii::$app->user->isGuest && $producer | |||
], | |||
[ | |||
'label' => '<span class="glyphicon glyphicon-log-in"></span> Connexion', | |||
'url' => $this->getUrlManager()->createUrl(['site/login']), | |||
'visible' => \Yii::$app->user->isGuest, | |||
'active' => $this->getControllerAction() == 'site/login' | |||
], | |||
[ | |||
'label' => '<span class="glyphicon glyphicon-user"></span> Inscription', | |||
'url' => $this->getUrlManager()->createUrl(['site/signup']), | |||
'visible' => \Yii::$app->user->isGuest, | |||
'active' => $this->getControllerAction() == 'site/signup' | |||
], | |||
[ | |||
'label' => '<span class="glyphicon glyphicon-user"></span> ' . ((!Yii::$app->user->isGuest) ? Html::encode(Yii::$app->user->identity->name . ' ' . strtoupper(substr(Yii::$app->user->identity->lastname, 0, 1))) : '') . '. ', | |||
'options' => ['id' => 'label1'], | |||
'url' => '#', | |||
'items' => [ | |||
[ | |||
'label' => '<span class="glyphicon glyphicon-user"></span> Profil', | |||
'url' => $this->getUrlManager()->createUrl(['user/update']), | |||
], | |||
[ | |||
'label' => '<span class="glyphicon glyphicon-off"></span> Déconnexion', | |||
'url' => $this->getUrlManager()->createUrl(['site/logout']), | |||
] | |||
], | |||
'visible' => !Yii::$app->user->isGuest | |||
], | |||
] | |||
]); | |||
?> | |||
@@ -182,42 +136,21 @@ if (!Yii::$app->user->isGuest && \Yii::$app->user->identity->id_producer > 0) { | |||
</nav> | |||
</header> | |||
<?php if (!Yii::$app->user->isGuest): ?> | |||
<section id="bookmarked-producers"> | |||
<div id="main"> | |||
<section id="header-title"> | |||
<div class="container"> | |||
<?php | |||
$producersArray = Producer::find() | |||
->joinWith(['userProducer user_producer']) | |||
->where([ | |||
'user_producer.id_user' => GlobalParam::getCurrentUserId(), | |||
'user_producer.bookmark' => 1, | |||
]) | |||
->all(); | |||
?> | |||
<?php if (count($producersArray)): ?> | |||
<h2>Mes producteurs ></h2> | |||
<div id="producers"> | |||
<?php foreach ($producersArray as $producer): ?> | |||
<a class="btn btn-xs btn-default" | |||
href="<?= \Yii::$app->urlManagerProducer->createAbsoluteUrl(['site/index', 'slug_producer' => $producer->slug]); ?>"><?= Html::encode($producer->name); ?></a> | |||
<?php endforeach; ?> | |||
</div> | |||
<?php else: ?> | |||
<div id="discover"> | |||
<p>Vous n'avez aucun producteur dans vos favoris : </p> | |||
<a class="btn btn-default btn-lg" | |||
href="<?= $this->getUrlManager()->createUrl(['site/producers']); ?>"><span | |||
class="glyphicon glyphicon-grain"></span> Découvrez les producteurs</a> | |||
</div> | |||
<?php endif; ?> | |||
<div class="clr"></div> | |||
<h1> | |||
<?php if ($isHome): ?> | |||
<span class="glyphicon glyphicon-tasks"></span> | |||
Opendistrib, un outil pour organiser des ventes en circuit court | |||
<?php else: ?> | |||
<span class="glyphicon glyphicon-<?= $this->getIcon(); ?>"></span> | |||
<?= $this->getTitle(); ?> | |||
<?php endif; ?> | |||
</h1> | |||
</div> | |||
</section> | |||
<?php endif; ?> | |||
<div id="main"> | |||
<section class="container" id="content"> | |||
<?php if (Yii::$app->session->hasFlash('error')): ?> | |||
<div class="alert alert-danger" role="alert"> | |||
@@ -235,10 +168,10 @@ if (!Yii::$app->user->isGuest && \Yii::$app->user->identity->id_producer > 0) { | |||
</div> | |||
<footer id="footer"> | |||
<div class="container"> | |||
<a href="<?php echo $this->getUrlManager()->createUrl('site/contact'); ?>">Contact</a> • | |||
<a href="<?php echo $this->getUrlManager()->createUrl('site/mentions'); ?>">Mentions légales</a> • | |||
<a href="<?php echo $this->getUrlManager()->createUrl('site/cgv'); ?>">CGS</a> • | |||
<a id="code-source" href="https://forge.laclic.fr/Laclic/Opendistrib">Code source</a> | |||
<a href="<?php echo $this->getUrlManager()->createUrl('site/service'); ?>">Fonctionnalités, services & tarifs</a> <span class="bull">•</span> | |||
<a href="<?php echo $this->getUrlManager()->createUrl('site/mentions'); ?>">Mentions légales</a> <span class="bull">•</span> | |||
<a href="<?php echo $this->getUrlManager()->createUrl('site/cgv'); ?>">Conditions générales de service</a> <span class="bull">•</span> | |||
<a href="<?php echo $this->getUrlManager()->createUrl('site/source-code'); ?>">Code source</a> | |||
</div> | |||
</footer> | |||
@@ -0,0 +1,36 @@ | |||
<div class="panel panel-primary"> | |||
<div class="panel-heading"> | |||
<h2 class="panel-title"> | |||
<span class="glyphicon glyphicon-stats"></span> | |||
<span class="the-title">Opendistrib en quelques chiffres</span> | |||
</h2> | |||
</div> | |||
<div class="panel-body"> | |||
<?= few_numbers_item($countProducersActive, 'Producteurs', 'actifs sur les 3 derniers mois'); ?> | |||
<?= few_numbers_item(few_numbers_format_number($countUsersActive), 'Clients', 'actifs sur les 3 derniers mois'); ?> | |||
<?= few_numbers_item(few_numbers_format_number($countPointSalesActive), 'Points de vente', 'actifs sur les 3 derniers mois'); ?> | |||
<?= few_numbers_item(few_numbers_format_number($averageOrdersPerDay), 'Commandes clients / jour', 'en moyenne sur les 7 derniers jours'); ?> | |||
<?= few_numbers_item(few_numbers_format_number($averageTurnover).' €', 'CA producteurs / mois', 'moyenne sur les 3 derniers mois'); ?> | |||
<?= few_numbers_item(few_numbers_format_number($numberVisitsMonth), 'Visiteurs', 'le mois dernier'); ?> | |||
</div> | |||
</div> | |||
<?php | |||
function few_numbers_item($number, $description, $detail = null) { | |||
$html = '<div class="col-md-6 item"><div class="number">'.$number.'</div><div class="description">'.$description.'</div>'; | |||
if($detail) { | |||
$html .= '<div class="detail">'.$detail.'</div>'; | |||
} | |||
$html .= '</div>'; | |||
return $html; | |||
} | |||
function few_numbers_format_number($number) { | |||
return number_format($number, 0, '', ' '); | |||
} | |||
?> |
@@ -16,7 +16,7 @@ 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, | |||
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. | |||
@@ -38,11 +38,11 @@ termes. | |||
?> | |||
<p>Les présentes Conditions Générales de Service ( ci-après les « <strong>Conditions</strong> ») | |||
font partie intégrante du contrat conclu (le « <strong>Contrat</strong> ») entre <strong>Guillaume BOURGEOIS - Cap'Entreprendre</strong> inscrit en tant que <strong>SCOP SARL</strong> au Registre du Commerce et des Sociétés | |||
de <strong>Sarreguemines</strong>, sous le numéro <strong>47784404700019</strong>, dont le siège social est situé au | |||
<strong>12 PLACE ROBERT SCHUMAN 57600 FORBACH</strong> (ci-après la « <strong>Société</strong> ») et le producteur | |||
souhaitant être référencé sur le site internet de la Société (le « <strong>Producteur</strong> »).</p> | |||
<p>Les présentes Conditions Générales de Service ( ci-après les « <strong>Conditions</strong> ») | |||
font partie intégrante du contrat conclu (le « <strong>Contrat</strong> ») entre <strong>Guillaume BOURGEOIS - Auto-entrepreneur</strong> | |||
(N°SIRET : 51442998400024), dont l'adresse est située au | |||
<strong>6 rue de la Prévoyance 25000 BESANÇON</strong> (ci-après la « <strong>Société</strong> ») et le producteur | |||
souhaitant être référencé sur le site internet de la Société (le « <strong>Producteur</strong> »).</p> | |||
<h2>1. Objet</h2> | |||
<p>La Société édite le site internet <a href="http://www.opendistrib.net">http://www.opendistrib.net</a> | |||
@@ -97,7 +97,7 @@ termes. | |||
<p>Le Site permet, si le Producteur active cette option, de réaliser des transactions | |||
monétaires entre les utilisateurs et les Producteurs. Cette transaction vient | |||
alimenter un crédit disponible sur le Site qui sera ensuite débité à chaque | |||
commande.<br /> | |||
commande.<br> | |||
Pour toutes les commandes non payées via le système de crédit, elles seront à | |||
régler directement auprès du Producteur lors de la réception des produits commandés | |||
par l’Utilisateur. | |||
@@ -105,8 +105,9 @@ termes. | |||
<h2>8. Redevances d'utilisation du Site</h2> | |||
<p>La création d’un compte et l’utilisation de la partie du Site réservée aux Producteurs | |||
implique le paiement mensuel par les Producteurs d'un montant (HT) défini par eux-même dans | |||
la section <em>Mon abonnement</em>. Si ce montant est supérieur à 0€, la Société émettra à l’issue | |||
implique le paiement mensuel par les Producteurs d'un montant (HT) déterminé selon une | |||
<a href="<?= $this->getUrlManagerFrontend()->createAbsoluteUrl(['site/prices']) ?>">grille tarifaire</a> | |||
basé sur le chiffre d'affaire des producteurs. Si ce dernier est supérieur à 100€, la Société émettra à l’issue | |||
de chaque mois une facture au Producteur, payable | |||
par virement bancaire ou par chèque dans les trente (30) jours à compter | |||
de la date d’émission de la facture. Tout défaut ou retard de paiement emportera |
@@ -43,7 +43,8 @@ use yii\grid\GridView; | |||
<div class="alert alert-warning" role="alert"> | |||
Découvrez ci-dessous notre <strong>grille tarifaire</strong> pour l'hébergement de votre circuit court sur Opendistrib. | |||
Le montant qui vous est facturé mensuellement dépend de votre chiffre d’affaire hors taxe réalisé sur le logiciel. | |||
Il sera donc adapté chaque mois en fonction de l’évolution de votre activité. | |||
Il est donc adapté chaque mois en fonction de l’évolution de votre activité.<br> | |||
Le service est <strong>sans engagement</strong>, vous arrêtez quand vous voulez sur simple désactivation de votre compte. | |||
</div> | |||
<?= | |||
@@ -79,7 +80,25 @@ GridView::widget([ | |||
] | |||
]); | |||
?> | |||
<?php if (!isset($noButton)){ ?> | |||
<a class="btn btn-default" href="<?= \Yii::$app->urlManagerFrontend->createUrl(['site/prices']) ?>"><span class="glyphicon glyphicon-eur"></span> En savoir plus sur nos tarifs</a> | |||
<?php } ?> | |||
<table class="table table-striped table-bordered"> | |||
<thead> | |||
<tr> | |||
<th>Module</th> | |||
<th>Activation du module (HT)</th> | |||
</tr> | |||
</thead> | |||
<tbody> | |||
<tr> | |||
<td> | |||
<strong>Paiement en ligne</strong><br> | |||
<p>Le paiement en ligne permet à vos clients d'alimenter leur crédit (compte prépayé en ligne) par carte bancaire.<br> | |||
Le logiciel fonctionne avec la plateforme <a href="https://stripe.com/fr">Stripe</a> pour accepter les paiements.<br> | |||
<a href="https://stripe.com/fr/pricing">Voir les tarifs Stripe</a> | |||
</p> | |||
</td> | |||
<td>120 €</td> | |||
</tr> | |||
</tbody> | |||
</table> | |||
@@ -0,0 +1,89 @@ | |||
<?php | |||
/** | |||
* Copyright distrib (2018) | |||
* | |||
* contact@opendistrib.net | |||
* | |||
* 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 yii\helpers\Html; | |||
use yii\bootstrap\ActiveForm; | |||
use yii\captcha\Captcha; | |||
$this->setTitle('À propos'); | |||
$this->setIcon('info-sign'); | |||
//$this->setMeta('description', 'À propos') ; | |||
?> | |||
<div class="site-about"> | |||
<div class="row"> | |||
<div class="col-md-8"> | |||
<div class="panel panel-primary"> | |||
<div class="panel-body"> | |||
<h2>Présentation</h2> | |||
<p>L'objectif d'Opendistrib est de fournir aux producteurs locaux une solution technique | |||
sur laquelle s'appuyer pour organiser leurs ventes en circuits courts.</p> | |||
<p>Le logiciel répond aux besoins quotidiens des producteurs en leur permettant | |||
de présenter leur activité, communiquer avec leurs clients, gérer les prises de commandes, | |||
comptabiliser les | |||
paiements, générer des bons de livraisons/factures et obtenir des statistiques de vente.</p> | |||
<p>Cet outil est particulièrement adapté à tous les producteurs souhaitant fonctionner | |||
essentiellement sur commande. C'est le choix de cette méthode de travail qui les amène à utiliser | |||
cet | |||
outil. Majoritairement utilisé par des boulangeries produisant du pain au levain naturel, | |||
Opendistrib fonctionne également très bien pour tous types de production locale.</p> | |||
<p>La première version du logiciel est née en 2016 à l'occasion de la création de la boulangerie | |||
Le Chat des Noisettes à Déservillers, en Franche-Comté. Le site a ensuite été progressivement | |||
ouvert à d'autres producteurs un peu partout en France pour arriver à un total de | |||
<?= $countProducers ?> producteurs actifs à l'heure actuelle.</p> | |||
<h2>Qui suis-je ?</h2> | |||
<p>Je m'appelle Guillaume Bourgeois et je vis à Besançon en Franche-Comté. J'exerce en | |||
tant que développeur web depuis 2009 et suis actuellement en micro-entreprise. </p> | |||
<p>Progressivement confronté aux réalités de différents producteurs et distributeurs, | |||
également conscient des enjeux sociétaux et environnementaux actuels, je me suis au fil des années | |||
intéressé et spécialisé dans le développement de logiciels dédiés à la distribution de produits | |||
locaux en circuits courts dont Opendistrib fait partie.</p> | |||
<p>Depuis 2016, j'assure donc le développement, la maintenance et le support d'Opendistrib. | |||
Unique interlocuteur, j'offre aux producteurs une relation directe avec une personne impliquée | |||
ayant une vue globale sur tous les aspects du logiciel. Technicien et pédagogue, j'aime être à | |||
l'écoute des besoins des producteurs et leur apporter des solutions simples et adaptées.</p> | |||
</div> | |||
</div> | |||
</div> | |||
<div class="col-md-4" id="few-numbers"> | |||
<?= $aboutFewNumbers; ?> | |||
</div> | |||
</div> | |||
</div> | |||
</div> |
@@ -36,14 +36,15 @@ termes. | |||
*/ | |||
$this->setTitle('Conditions générales de service') ; | |||
$this->setIcon('align-left'); | |||
$this->setMeta('description', 'Nous vous présentons ici les conditions selon lesquelles nous vous proposons nos offres de service.') ; | |||
?> | |||
<div class="content-text"> | |||
<h1>Conditions générales de service</h1> | |||
<?= $this->render('_cgv_content'); ?> | |||
<div class="panel panel-default"> | |||
<div class="panel-body"> | |||
<?= $this->render('_cgv_content'); ?> | |||
</div> | |||
</div> | |||
</div> |
@@ -43,37 +43,36 @@ use yii\captcha\Captcha; | |||
/* @var $this yii\web\View */ | |||
/* @var $form yii\bootstrap\ActiveForm */ | |||
$this->setTitle('Me contacter'); | |||
$this->setTitle('Contact'); | |||
$this->setIcon('envelope'); | |||
$this->setMeta('description', 'Pour toute remarque ou demande d\'information, nous vous proposons d\'utiliser ce formulaire de contact.') ; | |||
$this->params['breadcrumbs'][] = $this->title; | |||
?> | |||
<div class="site-contact"> | |||
<h1 class="title-system-order"> | |||
<span class="glyphicon glyphicon-envelope"></span> | |||
<?= Html::encode($this->title) ?> | |||
</h1> | |||
<div class="row"> | |||
<div class="col-lg-5"> | |||
<h2>Par email</h2> | |||
<div class="alert alert-info"> | |||
Ce formulaire de contact vous permet de joindre le développeur de la plateforme Opendistrib. | |||
Si vous souhaitez joindre un producteur, merci de le faire directement depuis son espace producteur. | |||
</div> | |||
<?php $form = ActiveForm::begin(['id' => 'contact-form']); ?> | |||
<?= $form->field($model, 'name') ?> | |||
<?= $form->field($model, 'email') ?> | |||
<?= $form->field($model, 'subject') ?> | |||
<?= $form->field($model, 'body')->textArea(['rows' => 6]) ?> | |||
<?= $form->field($model, 'verifyCode')->widget(Captcha::className(), [ | |||
'template' => '<div class="row"><div class="col-lg-3">{image}</div><div class="col-lg-6">{input}</div></div>', | |||
]) ?> | |||
<?= $form->field($model, 'isTest')->hiddenInput() ?> | |||
<div class="form-group"> | |||
<?= Html::submitButton('Envoyer', ['class' => 'btn btn-primary', 'name' => 'contact-button']) ?> | |||
<div class="panel panel-default"> | |||
<div class="panel-body"> | |||
<?php $form = ActiveForm::begin(['id' => 'contact-form']); ?> | |||
<?= $form->field($model, 'name') ?> | |||
<?= $form->field($model, 'email') ?> | |||
<?= $form->field($model, 'subject') ?> | |||
<?= $form->field($model, 'body')->textArea(['rows' => 6]) ?> | |||
<?= $form->field($model, 'verifyCode')->widget(Captcha::className(), [ | |||
'template' => '<div class="row"><div class="col-lg-3">{image}</div><div class="col-lg-6">{input}</div></div>', | |||
]) ?> | |||
<?= $form->field($model, 'isTest')->hiddenInput() ?> | |||
<div class="form-group submit"> | |||
<?= Html::submitButton('Envoyer', ['class' => 'btn btn-primary', 'name' => 'contact-button']) ?> | |||
</div> | |||
<?php ActiveForm::end(); ?> | |||
</div> | |||
<?php ActiveForm::end(); ?> | |||
</div> | |||
</div> | |||
</div> | |||
@@ -42,13 +42,9 @@ $this->setMeta('description','Le producteur que vous recherchez est introuvable. | |||
?> | |||
<div class="site-error"> | |||
<h1>Producteur introuvable</h1> | |||
<div class="alert alert-danger"> | |||
Le producteur que vous recherchez est introuvable. | |||
</div> | |||
<p><?= Html::a("< Retour à l'accueil", ['site/index']) ?> - <?= Html::a("Liste des producteurs", ['site/producers']) ?></p> | |||
</div> |
@@ -1,154 +1,113 @@ | |||
<?php | |||
/** | |||
Copyright distrib (2018) | |||
* Copyright distrib (2018) | |||
* | |||
* contact@opendistrib.net | |||
* | |||
* 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. | |||
*/ | |||
contact@opendistrib.net | |||
use common\helpers\Url; | |||
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\Url ; | |||
$this->setTitle('Logiciel libre de distribution alimentaire en circuit court') ; | |||
$this->setMeta('description', 'Simplifiez la distribution de vos produits en circuit court grâce à des outils web adaptés.') ; | |||
$this->setTitle('Un outil pour organiser des ventes en circuit court'); | |||
$this->setMeta('description', 'Simplifiez la distribution de vos produits en circuit court grâce à des outils web adaptés.'); | |||
?> | |||
<div id="presentation"> | |||
<div id="presentation-distrib"> | |||
<h1><span>Logiciel libre<br /> | |||
de distribution alimentaire<br /> | |||
en circuit court</span></h1> | |||
<p>simple, ouvert et participatif</p> | |||
</div> | |||
<div id="row-users-producers"> | |||
<div class="col-md-6 producer"> | |||
<div class="panel panel-default"> | |||
<div class="panel-heading"> | |||
<h2 class="panel-title"> | |||
<img class="img" src="<?= \Yii::$app->urlManager->getBaseUrl(); ?>/img/cagette.png" id="img-producer" /> | |||
<span class="the-title">Producteurs</span> | |||
</h2> | |||
</div> | |||
<div class="panel-body"> | |||
<p class="presentation">Simplifiez la distribution de vos produits<br /> avec des outils adaptés.</p> | |||
<?php if(Yii::$app->user->isGuest): ?> | |||
<a class="btn btn-primary" href="<?= \Yii::$app->urlManagerFrontend->createUrl(['site/signup']) ; ?>"><span class="glyphicon glyphicon-user"></span> Je crée mon espace</a> | |||
<?php endif; ?> | |||
<a class="btn btn-default" href="<?= \Yii::$app->urlManagerFrontend->createUrl(['site/contact']) ; ?>"><span class="glyphicon glyphicon-info-sign"></span> Demande d'informations</a> | |||
</div> | |||
</div> | |||
</div> | |||
<div class="col-md-6 users"> | |||
<div class="panel panel-default"> | |||
<div class="panel-heading"> | |||
<h2 class="panel-title"> | |||
<img class="img" src="<?= \Yii::$app->urlManager->getBaseUrl(); ?>/img/users.png" id="img-users" /> | |||
<span class="the-title">Clients</span> | |||
</h2> | |||
</div> | |||
<div class="panel-body"> | |||
<p class="presentation">Réservez vos produits en ligne et récupérez votre commande | |||
chez votre producteur ou dans un dépôt près de chez vous.</p> | |||
<?php if(Yii::$app->user->isGuest): ?> | |||
<a class="btn btn-primary" href="<?= \Yii::$app->urlManagerFrontend->createUrl(['site/signup']) ; ?>"><span class="glyphicon glyphicon-user"></span> Je m'inscris</a> | |||
<?php endif; ?> | |||
<a class="btn btn-default" href="<?= \Yii::$app->urlManagerFrontend->createUrl(['site/producers']) ; ?>"><span class="glyphicon glyphicon-search"></span> Je recherche un producteur</a> | |||
</div> | |||
</div> | |||
</div> | |||
<div class="clr"></div> | |||
</div> | |||
<?php if(Yii::$app->user->isGuest && YII_ENV == 'demo'): ?> | |||
<div class="row" id="row-signup"> | |||
<a class="btn btn-primary btn-lg" href="<?= Url::env('prod','frontend'); ?>"><span class="glyphicon glyphicon-circle-arrow-left"></span> Retour sur le site</a> | |||
</div> | |||
<?php endif; ?> | |||
<div id="row-functionalities-rates"> | |||
<div class="panel panel-default" id="block-functionnalities"> | |||
<div class="row" id="row-users-producers"> | |||
<div class="col-sm-12 col-md-6 producer"> | |||
<div class="panel panel-primary"> | |||
<div class="panel-heading"> | |||
<h2 class="panel-title"> | |||
<span class="glyphicon glyphicon-cog"></span> <span class="the-title">Fonctionnalités</span> | |||
<span class="glyphicon glyphicon-grain"></span> | |||
<span class="the-title">Producteurs</span> | |||
</h2> | |||
</div> | |||
<div class="panel-body"> | |||
<div class="block block-order col-md-6"> | |||
<img src="<?= \Yii::$app->urlManager->getBaseUrl(); ?>/img/order.png" /> | |||
<p>Prise de commande en ligne automatisée avec génération d'un récapitulatif par jour de distribution.</p> | |||
<div class="clr"></div> | |||
</div> | |||
<div class="block block-payment col-md-6"> | |||
<img src="<?= \Yii::$app->urlManager->getBaseUrl(); ?>/img/payment.png" /> | |||
<p>Système de crédit permettant la comptabilisation des paiements.</p> | |||
<div class="clr"></div> | |||
</div> | |||
<div class="clr"></div> | |||
<div class="block block-points-sale-products col-md-6"> | |||
<img src="<?= \Yii::$app->urlManager->getBaseUrl(); ?>/img/map-marker.png" /> | |||
<p>Gestion des différents points de vente et produits.</p> | |||
<div class="clr"></div> | |||
</div> | |||
<div class="block block-subscriptions col-md-6"> | |||
<img src="<?= \Yii::$app->urlManager->getBaseUrl(); ?>/img/subscription.png" /> | |||
<p>Gestion des abonnement.</p> | |||
<div class="clr"></div> | |||
<div class="hook"> | |||
Simplifiez la distribution de vos produits<br> | |||
en circuit court avec des outils adaptés. | |||
</div> | |||
<div class="clr"></div> | |||
<div class="block block-communication col-md-6"> | |||
<img src="<?= \Yii::$app->urlManager->getBaseUrl(); ?>/img/megaphone.png" /> | |||
<p>Communication simplifiée avec les clients.</p> | |||
<div class="clr"></div> | |||
</div> | |||
<div class="block block-evolution col-md-6"> | |||
<img src="<?= \Yii::$app->urlManager->getBaseUrl(); ?>/img/idea.png" /> | |||
<p><a href="<?= \Yii::$app->urlManager->createUrl(['site/contact']) ?>">Proposez-nous</a> vos idées afin de faire évoluer l'outil !</p> | |||
<div class="clr"></div> | |||
<div class="links"> | |||
<?php if (Yii::$app->user->isGuest): ?> | |||
<a class="btn btn-primary" | |||
href="<?= \Yii::$app->urlManagerFrontend->createUrl(['site/signup']); ?>"> | |||
<span class="glyphicon glyphicon-user"></span> Je crée mon espace | |||
</a> | |||
<?php endif; ?> | |||
<a class="btn btn-default" | |||
href="<?= \Yii::$app->urlManagerFrontend->createUrl(['site/service']); ?>"> | |||
<span class="glyphicon glyphicon-plus-sign"></span> En savoir plus | |||
</a> | |||
<a class="btn btn-default" href="<?= \Yii::$app->params['appointmentUrl']; ?>" target="_blank"> | |||
<span class="glyphicon glyphicon-education"></span> Je demande une démo | |||
</a> | |||
</div> | |||
</div> | |||
</div> | |||
<div class="panel panel-default" id="block-rates"> | |||
</div> | |||
<div class="col-sm-12 col-md-6 users"> | |||
<div class="panel panel-primary"> | |||
<div class="panel-heading"> | |||
<h2 class="panel-title"> | |||
<span class="glyphicon glyphicon-euro"></span> <span class="the-title">Tarifs</span> | |||
<span class="glyphicon glyphicon-user"></span> | |||
<span class="the-title">Clients</span> | |||
</h2> | |||
</div> | |||
<div class="panel-body"> | |||
<!-- Tarifs --> | |||
<?= $this->render('_prices_producer', ['dataProviderPrices' => $dataProviderPrices]); ?> | |||
<div class="hook"> | |||
Réservez facilement vos produits en ligne<br> | |||
auprès de producteurs locaux. | |||
</div> | |||
<div class="links"> | |||
<?php if (Yii::$app->user->isGuest): ?> | |||
<a class="btn btn-primary" | |||
href="<?= \Yii::$app->urlManagerFrontend->createUrl(['site/signup']); ?>"><span | |||
class="glyphicon glyphicon-user"></span> Je m'inscris</a> | |||
<?php endif; ?> | |||
<a class="btn btn-default" | |||
href="<?= \Yii::$app->urlManagerFrontend->createUrl(['site/producers']); ?>"><span | |||
class="glyphicon glyphicon-search"></span> Je recherche un producteur</a> | |||
</div> | |||
</div> | |||
</div> | |||
</div> | |||
<div class="clr"></div> | |||
</div> | |||
<?php if (Yii::$app->user->isGuest && YII_ENV == 'demo'): ?> | |||
<div class="row" id="row-signup"> | |||
<a class="btn btn-primary btn-lg" href="<?= Url::env('prod', 'frontend'); ?>"><span | |||
class="glyphicon glyphicon-circle-arrow-left"></span> Retour sur le site</a> | |||
</div> | |||
<?php endif; ?> | |||
@@ -40,18 +40,15 @@ use yii\helpers\Html; | |||
use yii\bootstrap\ActiveForm; | |||
$this->setTitle('Connexion') ; | |||
$this->setIcon('log-in'); | |||
$this->setMeta('description', 'Connectez-vous afin d\'accéder à votre compte.') ; | |||
$this->params['breadcrumbs'][] = $this->title; | |||
?> | |||
<div class="site-login"> | |||
<h1 class="title-system-order"><span class="glyphicon glyphicon-log-in"></span> <?= Html::encode($this->title) ?></h1> | |||
<div class="row"> | |||
<div class="col-lg-5"> | |||
<p>Pas encore de compte ? <a class="" href="<?php echo \Yii::$app->urlManager->createUrl('site/signup') ; ?>">Je m'inscris</a></p> | |||
<?php $form = ActiveForm::begin(['id' => 'login-form']); ?> | |||
<?= $form->field($model, 'email') ?> | |||
<?= $form->field($model, 'password')->passwordInput() ?> |
@@ -37,50 +37,78 @@ termes. | |||
*/ | |||
$this->setTitle('Mentions légales'); | |||
$this->setIcon('align-left'); | |||
$this->setMeta('description', 'Prenez connaissance de nos mentions légales.') ; | |||
?> | |||
<div class="container content-text"> | |||
<div class="content-text"> | |||
<div class="content"> | |||
<h1>Mentions légales</h1> | |||
<h2>Éditeur</h2> | |||
<p><strong>Opendistrib</strong><br /> | |||
6 rue de la Prévoyance<br /> | |||
25000 Besançon<br /> | |||
Responsable de publication : Guillaume BOURGEOIS</p> | |||
<p>Micro-entreprise : Guillaume Bourgeois - Développeur web<br /> | |||
Siret : 51442998400024</p> | |||
<h2>Développement</h2> | |||
<p>Guillaume Bourgeois<br /> | |||
6 rue de la Prévoyance, 25000 Besançon | |||
</p> | |||
<h2>Graphisme</h2> | |||
<p>Sébastien Bourgeois</p> | |||
<h2>Hébergement</h2> | |||
<p>La société <strong>Alwaysdata</strong>, SARL au capital de 5.000 € immatriculée au RCS de | |||
Paris sous le numéro 492 893 490 dont le siège social se trouve 62 rue Tiquetonne – 75002 Paris.</p> | |||
<h2>Propriété intellectuelle et Copyright</h2> | |||
<p>Le site est protégé par les lois en vigueur sur la propriété intellectuelle et le droit d’auteur au niveau national et international.<br /> | |||
Toutes les informations disponibles sur le Site sont protégées par un copyright et sont propriété de <strong>distrib</strong>, sous réserve de droits appartenant à des tiers. Les présentes informations ne devront pas être interprétées comme constituant une licence ou un droit d’utilisation portant sur toute image, marque déposée, marque de service ou logo de <strong>distrib</strong>. Le téléchargement ou la copie de tout matériel à partir du Site ne vous confère aucun droit sur les éléments téléchargés ou copiés. <strong>distrib</strong> réserve tous ses droits sur le copyright et la propriété de toute information disponible sur le Site et les fera valoir dans toute l’extension de la loi applicable.</p> | |||
<h2>Limitation de la responsabilité</h2> | |||
<p>Les informations publiées sur ce site sont publiées à titre d’informations générales uniquement. <strong>distrib</strong> est soucieux de diffuser des informations complètes et exactes mais ne peut garantir l’exactitude, la précision ou l’exhaustivité des informations mises à disposition sur le Site et ne saurait en aucun cas être tenu responsable en cas d’erreur ou d’inexactitudes contenues sur son Site et ne saurait garantir que l’utilisation de son Site en porte pas atteinte aux droits de tiers. Toute utilisation du Site est faite aux risques et périls de l’utilisateur.<br /> | |||
Dans les limites autorisées par la loi, notamment en cas de négligence, <strong>distrib</strong> ne pourra être tenu responsable de pertes ou de dommages de quelque nature que ce soit, qu’il s’agisse, notamment mais non exclusivement, de dommages directs, indirects ou consécutifs, liés à l’accès au Site ou à tout autre site ayant un lien avec le Site, à son utilisation, à son exploration ou à son téléchargement.</p> | |||
<h2>Lien hypertextes</h2> | |||
<p>La mise en place d’un lien hypertexte vers le site http://www.opendistrib.net nécessite une autorisation préalable écrite de <strong>distrib</strong>. Si vous souhaitez mettre en place un lien hypertexte vers ce site, vous devez en conséquence prendre contact avec le responsable du site. <strong>distrib</strong> ne peut en aucun cas être tenu pour responsable de la mise à disposition des sites qui font l’objet d’un lien hypertexte à partir du site http://www.opendistrib.net et ne peut supporter aucune responsabilité sur le contenu, les produits, les services, etc. disponibles sur ces sites ou à partir de ces sites.</p> | |||
<h2>Informatique et libertés – Données personnelles</h2> | |||
<p>La collecte et le traitement des données personnelles de l'Internaute par <strong>distrib</strong> ont fait l'objet d'une déclaration auprès de la CNIL (numéro 2018856).<br /> | |||
La finalité du traitement des données personnelles fournies volontairement par l'Internaute sur le Site au travers du module « Contact », est de permettre à l'Internaute d'être contacté rapidement par <strong>distrib</strong>.<br /> | |||
L'Internaute est informé que les données de connexion ou relatives à la navigation de l'Internaute depuis le Site sont collectées (informations de navigation) de manière automatique par un logiciel de statistiques et de mesure d'audience. Ces informations ne sont collectées qu'à des fins d'analyse statistique et d'optimisation interne du Site.<br /> | |||
L'Internaute est également informé qu'en application des articles 39 et 40 de la loi dite « Informatique et Libertés » du 6 janvier 1978, modifiée par la loi 2004-801 du 6 août 2004, l'Internaute dispose d'un droit d'accès, de rectification, de modification et de suppression concernant ses données personnelles.</p> | |||
<div class="panel panel-default"> | |||
<div class="panel-body"> | |||
<h2>Éditeur</h2> | |||
<p><strong>Opendistrib</strong><br> | |||
6 rue de la Prévoyance<br> | |||
25000 Besançon<br> | |||
Responsable de publication : Guillaume BOURGEOIS</p> | |||
<p>Micro-entreprise : Guillaume Bourgeois - Développeur web<br> | |||
Siret : 51442998400024</p> | |||
<h2>Développement</h2> | |||
<p>Guillaume Bourgeois<br> | |||
6 rue de la Prévoyance, 25000 Besançon | |||
</p> | |||
<h2>Hébergement</h2> | |||
<p>La société <strong>Alwaysdata</strong>, SARL au capital de 5.000 € immatriculée au RCS de | |||
Paris sous le numéro 492 893 490 dont le siège social se trouve 62 rue Tiquetonne – 75002 Paris.</p> | |||
<h2>Propriété intellectuelle et Copyright</h2> | |||
<p>Le site est protégé par les lois en vigueur sur la propriété intellectuelle et le droit d’auteur au niveau | |||
national et international.<br> | |||
Toutes les informations disponibles sur le Site sont protégées par un copyright et sont propriété de | |||
<strong>Opendistrib</strong>, sous réserve de droits appartenant à des tiers. Les présentes informations | |||
ne devront pas être interprétées comme constituant une licence ou un droit d’utilisation portant sur toute | |||
image, marque déposée, marque de service ou logo de <strong>Opendistrib</strong>. Le téléchargement ou la | |||
copie de tout matériel à partir du Site ne vous confère aucun droit sur les éléments téléchargés ou copiés. | |||
<strong>Opendistrib</strong> réserve tous ses droits sur le copyright et la propriété de toute information | |||
disponible sur le Site et les fera valoir dans toute l’extension de la loi applicable.</p> | |||
<h2>Limitation de la responsabilité</h2> | |||
<p>Les informations publiées sur ce site sont publiées à titre d’informations générales uniquement. | |||
<strong>Opendistrib</strong> est soucieux de diffuser des informations complètes et exactes mais ne peut | |||
garantir l’exactitude, la précision ou l’exhaustivité des informations mises à disposition sur le Site et | |||
ne saurait en aucun cas être tenu responsable en cas d’erreur ou d’inexactitudes contenues sur son Site et | |||
ne saurait garantir que l’utilisation de son Site en porte pas atteinte aux droits de tiers. Toute utilisation | |||
du Site est faite aux risques et périls de l’utilisateur.<br> | |||
Dans les limites autorisées par la loi, notamment en cas de négligence, <strong>Opendistrib</strong> ne | |||
pourra être tenu responsable de pertes ou de dommages de quelque nature que ce soit, qu’il s’agisse, | |||
notamment mais non exclusivement, de dommages directs, indirects ou consécutifs, liés à l’accès au Site ou à tout | |||
autre site ayant un lien avec le Site, à son utilisation, à son exploration ou à son téléchargement.</p> | |||
<h2>Lien hypertextes</h2> | |||
<p>La mise en place d’un lien hypertexte vers le site http://www.opendistrib.net nécessite une autorisation | |||
préalable écrite de <strong>Opendistrib</strong>. Si vous souhaitez mettre en place un lien hypertexte vers ce | |||
site, vous devez en conséquence prendre contact avec le responsable du site. <strong>Opendistrib</strong> | |||
ne peut en aucun cas être tenu pour responsable de la mise à disposition des sites qui font l’objet d’un | |||
lien hypertexte à partir du site http://www.opendistrib.net et ne peut supporter aucune responsabilité sur | |||
le contenu, les produits, les services, etc. disponibles sur ces sites ou à partir de ces sites.</p> | |||
<h2>Informatique et libertés – Données personnelles</h2> | |||
<p>La collecte et le traitement des données personnelles de l'Internaute par <strong>Opendistrib</strong> ont | |||
fait l'objet d'une déclaration auprès de la CNIL (numéro 2018856).<br> | |||
La finalité du traitement des données personnelles fournies volontairement par l'Internaute sur le Site au | |||
travers du module « Contact », est de permettre à l'Internaute d'être contacté rapidement par | |||
<strong>Opendistrib</strong>.<br> | |||
L'Internaute est informé que les données de connexion ou relatives à la navigation de l'Internaute depuis le | |||
Site sont collectées (informations de navigation) de manière automatique par un logiciel de statistiques | |||
et de mesure d'audience. Ces informations ne sont collectées qu'à des fins d'analyse statistique et | |||
d'optimisation interne du Site.<br> | |||
L'Internaute est également informé qu'en application des articles 39 et 40 de la loi dite « Informatique et | |||
Libertés » du 6 janvier 1978, modifiée par la loi 2004-801 du 6 août 2004, l'Internaute dispose d'un droit | |||
d'accès, de rectification, de modification et de suppression concernant ses données personnelles.</p> | |||
</div> | |||
</div> | |||
</div> | |||
</div> |
@@ -1,160 +0,0 @@ | |||
<?php | |||
/** | |||
* Copyright distrib (2018) | |||
* | |||
* contact@opendistrib.net | |||
* | |||
* 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 yii\helpers\Html; | |||
$this->setTitle('Tarifs'); | |||
$this->setMeta('description', 'Découvrez les tarifs de l\application Opendistrib.'); | |||
?> | |||
<h1 class="title-system-order"><span class="glyphicon glyphicon glyphicon-eur"></span> <?= Html::encode( | |||
$this->title | |||
) ?></h1> | |||
<?= $this->render('_prices_producer', ['dataProviderPrices' => $dataProviderPrices, 'noButton'=> true]); ?> | |||
<div id="site-prices"> | |||
<div class="row equal"> | |||
<div class="col-md-6 col-xs-12 producer"> | |||
<div class="panel panel-default"> | |||
<div class="panel-heading"> | |||
<h2 class="panel-title"> | |||
<span class="the-title">Fonctionnalités</span> | |||
</h2> | |||
</div> | |||
<div class="panel-body"> | |||
<p>Vous avez accès à toutes les fonctionnalités d’Opendistrib quelque soit votre tranche tarifaire (hormis le paiement en ligne). | |||
Ce tarif prend également en compte les mises à jour du logiciel. Les fonctionnalités sont développées en | |||
fonction de vos retours et besoins. | |||
</p> | |||
<p>Pour vos besoins spécifiques, nous pouvons réaliser des développements sur-mesure sur devis | |||
(<a href="<?= \Yii::$app->urlManager->createUrl(['site/contact']) ?>">nous contacter</a>).</p> | |||
</div> | |||
</div> | |||
</div> | |||
<div class="col-md-6 col-xs-12 producer"> | |||
<div class="panel panel-default"> | |||
<div class="panel-heading"> | |||
<h2 class="panel-title"> | |||
<span class="the-title">Support & maintenance</span> | |||
</h2> | |||
</div> | |||
<div class="panel-body"> | |||
<p>Le service comprend l’hébergement, le support et la maintenance. Nous sommes | |||
disponibles pour répondre à vos questions, vous accompagner à l’utilisation du logiciel et corriger | |||
les problèmes que vous ou vos clients pouvez rencontrer.</p> | |||
</div> | |||
</div> | |||
</div> | |||
</div> | |||
<div class="row equal"> | |||
<div class="col-md-6 col-xs-12 producer"> | |||
<div class="panel panel-default"> | |||
<div class="panel-heading"> | |||
<h2 class="panel-title"> | |||
<span class="the-title">Démo & version d'essai</span> | |||
</h2> | |||
</div> | |||
<div class="panel-body"> | |||
<p>Vous avez plusieurs solutions pour découvrir le logiciel : </p> | |||
<ul> | |||
<li> | |||
<a href="<?= \Yii::$app->urlManager->createUrl(['site/contact']) ?>">Nous demander une démo</a> pour | |||
que l'on vous fasse une présentation. | |||
</li> | |||
<li> | |||
Essayer Opendistrib sans inscription via le | |||
<a href="<?= \Yii::$app->urlManager->createUrl(['site/producer', 'id' => 32]) ?>">compte de démonstration</a>. | |||
</li> | |||
<li>Essayer Opendistrib pour votre activité en vous <a href="<?= \Yii::$app->urlManager->createUrl(['site/signup']) ?>">inscrivant en tant que producteur</a>. | |||
Aucun règlement ne vous sera demandé tant que vous n'aurez pas plus de 100 € de chiffre d'affaire enregistré sur le logiciel.</li> | |||
</ul> | |||
</div> | |||
</div> | |||
</div> | |||
<div class="col-md-6 col-xs-12 producer"> | |||
<div class="panel panel-default"> | |||
<div class="panel-heading"> | |||
<h2 class="panel-title"> | |||
<span class="the-title">Formation & accompagnement</span> | |||
</h2> | |||
</div> | |||
<div class="panel-body"> | |||
<p>Si besoin, au moment du lancement de votre circuit court sur Opendistrib, nous pouvons vous proposer | |||
des temps de formation et d'accompagnement au tarif de <strong>40 € HT / heure</strong>. | |||
</p> | |||
</div> | |||
</div> | |||
</div> | |||
</div> | |||
<div class="row equal"> | |||
<div class="col-md-6 col-xs-12 producer"> | |||
<div class="panel panel-default"> | |||
<div class="panel-heading"> | |||
<h2 class="panel-title"> | |||
<span class="the-title">Paiement en ligne</span> | |||
</h2> | |||
</div> | |||
<div class="panel-body"> | |||
<p>Le paiement en ligne permet à vos clients d'alimenter leur crédit (compte prépayé en ligne) par carte bancaire. | |||
Le logiciel fonctionne avec la plateforme <a href="https://stripe.com/fr">Stripe</a> pour accepter les paiements.</p> | |||
<p> | |||
Activation de l'option : <strong>120 € HT</strong><br /> | |||
<a href="https://stripe.com/fr/pricing">Voir les tarifs Stripe</a> | |||
</p> | |||
</div> | |||
</div> | |||
</div> | |||
<div class="col-md-6 col-xs-12 producer"> | |||
<div class="panel panel-default"> | |||
<div class="panel-heading"> | |||
<h2 class="panel-title"> | |||
<span class="the-title">Durée d'engagement</span> | |||
</h2> | |||
</div> | |||
<div class="panel-body "> | |||
<p>Ce service est sans engagement de durée. Si vous souhaitez arrêter, vous aurez simplement à le configurer dans vos | |||
paramètres en mettant hors-ligne votre compte.</p> | |||
</div> | |||
</div> | |||
</div> | |||
</div> | |||
</div> |
@@ -43,66 +43,73 @@ use yii\bootstrap\ActiveForm; | |||
$producerManager = ProducerManager::getInstance(); | |||
$this->setTitle('Producteur '.Html::encode($producer->name)) ; | |||
$this->setIcon('grain'); | |||
$this->setMeta('description', 'Veuillez vous connecter pour réserver les produits de ce producteur.') ; | |||
?> | |||
<div id="page-producer"> | |||
<h1 class="title-system-order"><?= Html::encode($producer->name) ?></h1> | |||
<p class="info"><span class="alert alert-warning">Veuillez vous connecter pour réserver les produits de ce producteur.</span></p> | |||
<?php if(isset($producer->photo) && strlen($producer->photo)): ?> | |||
<!--<img class="img-back" width="200px" height="auto" src="./uploads/<?= $producer->photo ?>" />--> | |||
<?php endif; ?> | |||
<div class="col-md-6"> | |||
<h2>Connexion</h2> | |||
<?php if(isset($producer) && $producerManager->isDemo($producer)) : ?> | |||
<div class="alert alert-warning"> | |||
<p>Merci d'utiliser les identifiants suivants pour vous connecter à l'espace de démonstration :</p> | |||
Identifiant : <strong>demo@opendistrib.net</strong><br /> | |||
Mot de passe : <strong>opendistrib</strong> | |||
<div class="panel panel-primary"> | |||
<div class="panel-heading"> | |||
<h2 class="panel-title"> | |||
<span class="glyphicon glyphicon-log-in"></span> | |||
Connexion | |||
</h2> | |||
</div> | |||
<?php endif; ?> | |||
<?php $form = ActiveForm::begin(['id' => 'login-form','enableClientValidation'=> false]); ?> | |||
<?= $form->field($loginForm, 'email') ?> | |||
<?= $form->field($loginForm, 'password')->passwordInput() ?> | |||
<?= $form->field($loginForm, 'rememberMe')->checkbox() ?> | |||
<p> | |||
Si vous avez oublié votre mot de passe, vous pouvez le <?= Html::a('réinitialiser', ['site/request-password-reset']) ?>. | |||
</p> | |||
<div class="form-group"> | |||
<?= Html::submitButton('Connexion', ['class' => 'btn btn-primary', 'name' => 'login-button']) ?> | |||
<div class="panel-body"> | |||
<?php if(isset($producer) && $producerManager->isDemo($producer)) : ?> | |||
<div class="alert alert-warning"> | |||
<p>Merci d'utiliser les identifiants suivants pour vous connecter à l'espace de démonstration :</p> | |||
Identifiant : <strong>demo@opendistrib.net</strong><br> | |||
Mot de passe : <strong>opendistrib</strong> | |||
</div> | |||
<?php endif; ?> | |||
<?php $form = ActiveForm::begin(['id' => 'login-form','enableClientValidation'=> false]); ?> | |||
<?= $form->field($loginForm, 'email') ?> | |||
<?= $form->field($loginForm, 'password')->passwordInput() ?> | |||
<?= $form->field($loginForm, 'rememberMe')->checkbox() ?> | |||
<p> | |||
Si vous avez oublié votre mot de passe, vous pouvez le <?= Html::a('réinitialiser', ['site/request-password-reset']) ?>. | |||
</p> | |||
<div class="form-group"> | |||
<?= Html::submitButton('Connexion', ['class' => 'btn btn-primary', 'name' => 'login-button']) ?> | |||
</div> | |||
<?php ActiveForm::end(); ?> | |||
</div> | |||
<?php ActiveForm::end(); ?> | |||
</div> | |||
</div> | |||
<div class="col-md-6"> | |||
<h2>Inscription</h2> | |||
<?php $form = ActiveForm::begin(['id' => 'form-signup','enableClientValidation'=> false]); ?> | |||
<?= $form->field($signupForm, 'email') ?> | |||
<?= $form->field($signupForm, 'password')->passwordInput() ?> | |||
<?= $form->field($signupForm, 'lastname') ?> | |||
<?= $form->field($signupForm, 'name') ?> | |||
<?= $form->field($signupForm, 'phone') ?> | |||
<?php if(strlen($producer->code)): ?> | |||
<?= $form->field($signupForm, 'code',[ | |||
'inputTemplate' => '<div class="input-group"><span class="input-group-addon"><span class="glyphicon glyphicon-lock"></span></span>{input}</div>', | |||
]) | |||
<div class="panel panel-primary"> | |||
<div class="panel-heading"> | |||
<h2 class="panel-title"> | |||
<span class="glyphicon glyphicon-user"></span> | |||
Inscription | |||
</h2> | |||
</div> | |||
<div class="panel-body"> | |||
<?php $form = ActiveForm::begin(['id' => 'form-signup','enableClientValidation'=> false]); ?> | |||
<?= $form->field($signupForm, 'email') ?> | |||
<?= $form->field($signupForm, 'password')->passwordInput() ?> | |||
<?= $form->field($signupForm, 'lastname') ?> | |||
<?= $form->field($signupForm, 'name') ?> | |||
<?= $form->field($signupForm, 'phone') ?> | |||
<?php if(strlen($producer->code)): ?> | |||
<?= $form->field($signupForm, 'code',[ | |||
'inputTemplate' => '<div class="input-group"><span class="input-group-addon"><span class="glyphicon glyphicon-lock"></span></span>{input}</div>', | |||
]) | |||
->label('Code du producteur') | |||
->hint('Renseignez-vous auprès de votre producteur pour qu\'il vous fournisse le code d\'accès') ; ?> | |||
<?php endif; ?> | |||
<?= $form->field($signupForm, 'verifyCode')->widget(\yii\captcha\Captcha::className(), [ | |||
<?php endif; ?> | |||
<?= $form->field($signupForm, 'verifyCode')->widget(\yii\captcha\Captcha::className(), [ | |||
'template' => '<div class="row"><div class="col-lg-3">{image}</div><div class="col-lg-6">{input}</div></div>', | |||
]) ?> | |||
<div class="form-group" id="boutons-inscrire"> | |||
<?= Html::submitButton("S'inscrire", ['class' => 'btn btn-primary', 'name' => 'signup-button']) ?> | |||
]) ?> | |||
<div class="form-group" id="boutons-inscrire"> | |||
<?= Html::submitButton("S'inscrire", ['class' => 'btn btn-primary', 'name' => 'signup-button']) ?> | |||
</div> | |||
<?php ActiveForm::end(); ?> | |||
</div> | |||
<?php ActiveForm::end(); ?> | |||
</div> | |||
</div> | |||
</div> |
@@ -36,18 +36,80 @@ pris connaissance de la licence CeCILL, et que vous en avez accepté les | |||
termes. | |||
*/ | |||
use yii\grid\GridView; | |||
use common\helpers\GlobalParam; | |||
use common\logic\User\UserProducer\Wrapper\UserProducerManager; | |||
use yii\helpers\Html; | |||
$userProducerManager = UserProducerManager::getInstance(); | |||
$userCurrent = GlobalParam::getCurrentUser(); | |||
$this->setTitle('Producteurs') ; | |||
$this->setIcon('grain'); | |||
$this->setMeta('description', 'Retrouvez les producteurs présents sur Opendistrib.') ; | |||
?> | |||
<h1 class="title-system-order"><span class="glyphicon glyphicon-search"></span> <?= Html::encode($this->title) ?></h1> | |||
<?= | |||
<div class="site-producers"> | |||
<div class="row"> | |||
<div class="col-md-6 col-sm-12" id="wrapper-producers-list"> | |||
<div id="producers-list"> | |||
<div id="producer-search"> | |||
<div class="form-group has-feedback"> | |||
<input type="text" class="form-control input-lg" placeholder="Recherche par nom, commune ou code postal"> | |||
<span class="glyphicon glyphicon-search form-control-feedback"></span> | |||
</div> | |||
</div> | |||
<div class="alert alert-warning alert-no-results"> | |||
Aucun producteur ne correspond à votre recherche. | |||
</div> | |||
<?php foreach($producersArray as $producer): ?> | |||
<div class="panel panel-default panel-producer"> | |||
<div class="panel-body"> | |||
<div class="<?= $producer->logo ? 'col-md-8 col-sm-8' : 'col-md-12'; ?>"> | |||
<h2><?= Html::encode($producer->name) ?></h2> | |||
<p class="producer-type"><?= Html::encode($producer->type) ?></p> | |||
<p class="producer-location"> | |||
<?php if($producer->latitude && $producer->longitude): ?> | |||
<?= Html::a('<span class="glyphicon glyphicon-map-marker"></span> '.Html::encode($producer->postcode.' '.$producer->city),'javascript:void(0);', ['class' => 'btn btn-default view-producer', 'data-id' => $producer->id]);?> | |||
<?php else: ?> | |||
<span class="glyphicon glyphicon-map-marker"></span> | |||
<span class="location"><?= Html::encode($producer->postcode.' '.$producer->city); ?></span> | |||
<?php endif; ?> | |||
</p> | |||
</div> | |||
<?php if($producer->logo): ?> | |||
<div class="col-md-4 col-sm-4"> | |||
<div class="logo"<?php if (!is_null($producer->background_color_logo) && strlen($producer->background_color_logo)): ?> style="background-color:<?= Html::encode($producer->background_color_logo); ?>"<?php endif; ?>> | |||
<img class="img-logo" | |||
src="<?= \Yii::$app->urlManagerProducer->baseUrl; ?>/uploads/<?= $producer->logo; ?>" | |||
alt="Logo <?= Html::encode($producer->name) ?>"> | |||
</div> | |||
</div> | |||
<?php endif; ?> | |||
</div> | |||
<div class="panel-footer"> | |||
<?= Html::a('Visiter',Yii::$app->urlManagerProducer->createAbsoluteUrl(['site/index', 'slug_producer' => $producer->slug]), ['class'=>'btn btn-primary']) ; ?> | |||
<?php if($userCurrent): ?> | |||
<?php $this->getLogic()->setProducerContext($producer); ?> | |||
<?php if($userProducerManager->isProducerBookmarked($userCurrent)): ?> | |||
<?= Html::a('<span class="glyphicon glyphicon-star"></span>', ['bookmark/remove', 'idProducer' => $producer->id], ['class'=>'btn btn-default float-right', 'data-toggle' => 'tooltip', 'data-placement' => 'bottom', 'data-original-title' => 'Supprimer de ma liste de producteurs']) ; ?> | |||
<?php else: ?> | |||
<?= Html::a('<span class="glyphicon glyphicon-star-empty"></span>', ['bookmark/add', 'idProducer' => $producer->id], ['class'=>'btn btn-default float-right', 'data-toggle' => 'tooltip', 'data-placement' => 'bottom', 'data-original-title' => 'Ajouter à ma liste de producteurs']) ; ?> | |||
<?php endif; ?> | |||
<?php endif; ?> | |||
</div> | |||
</div> | |||
<?php endforeach; ?> | |||
</div> | |||
</div> | |||
<div class="col-md-6 col-sm-12" id="wrapper-producers-map"> | |||
<div id="producers-map"></div> | |||
</div> | |||
</div> | |||
<div class="clr"></div> | |||
<?php | |||
/* | |||
GridView::widget([ | |||
'dataProvider' => $dataProviderProducers, | |||
'summary' => '', | |||
@@ -76,5 +138,7 @@ GridView::widget([ | |||
], | |||
] | |||
]); | |||
?> | |||
*/ | |||
?> | |||
</div> |
@@ -44,23 +44,26 @@ use yii\bootstrap\ActiveForm; | |||
/* @var $model \frontend\models\PasswordResetRequestForm */ | |||
$this->setTitle('Mot de passe oublié') ; | |||
$this->setIcon('question-sign'); | |||
$this->setMeta('description', 'Vous avez oublié votre mot de passe ?'); | |||
$this->params['breadcrumbs'][] = $this->title; | |||
?> | |||
<div class="site-request-password-reset"> | |||
<h1><?= Html::encode($this->title) ?></h1> | |||
<p>Renseignez votre adresse email. Nous vous transmettrons un lien vous permettant de réinitialiser votre mot de passe.</p> | |||
<div class="row"> | |||
<div class="col-lg-5"> | |||
<?php $form = ActiveForm::begin(['id' => 'request-password-reset-form']); ?> | |||
<?= $form->field($model, 'email') ?> | |||
<div class="form-group"> | |||
<?= Html::submitButton('Envoyer', ['class' => 'btn btn-primary']) ?> | |||
<div class="panel panel-default"> | |||
<div class="panel-body"> | |||
<div class="alert alert-warning">Renseignez votre adresse email, nous vous transmettrons un lien vous permettant de réinitialiser votre mot de passe.</div> | |||
<div class="row"> | |||
<div class="col-lg-5"> | |||
<?php $form = ActiveForm::begin(['id' => 'request-password-reset-form']); ?> | |||
<?= $form->field($model, 'email') ?> | |||
<div class="form-group"> | |||
<?= Html::submitButton('Envoyer', ['class' => 'btn btn-primary']) ?> | |||
</div> | |||
<?php ActiveForm::end(); ?> | |||
</div> | |||
<?php ActiveForm::end(); ?> | |||
</div> | |||
</div> | |||
</div> | |||
</div> |
@@ -0,0 +1,191 @@ | |||
<?php | |||
/** | |||
* Copyright distrib (2018) | |||
* | |||
* contact@opendistrib.net | |||
* | |||
* 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 yii\helpers\Html; | |||
$this->setTitle('Fonctionnalités, services & tarifs'); | |||
$this->setIcon('console'); | |||
//$this->setMeta('description', ''); | |||
?> | |||
<div class="site-service"> | |||
<div class="content-text"> | |||
<div id="row-functionalities-rates"> | |||
<div class="panel panel-primary" id="block-functionnalities"> | |||
<div class="panel-heading"> | |||
<h2 class="panel-title"> | |||
<span class="glyphicon glyphicon-cog"></span> | |||
<span class="the-title">Fonctionnalités</span> | |||
</h2> | |||
</div> | |||
<div class="panel-body"> | |||
<?= block_feature('grain', "Un espace producteur dédié accessible aux clients avec un système de prise de commandes, la présentation de l'activité, la liste des produits et des points de vente, un formulaire de contact"); ?> | |||
<?= block_feature("cog", "Une administration complète et intuitive pour configurer finement l'ensemble des aspects de l'activité de producteur"); ?> | |||
<div class="clr"></div> | |||
<?= block_feature("calendar", "Planification des jours de distributions"); ?> | |||
<?= block_feature("download-alt", "Accès à un récapitulatif des commandes par jour de distribution"); ?> | |||
<?= block_feature("cutlery", "Gestion des produits, catégories et prix spécifiques"); ?> | |||
<?= block_feature("map-marker", "Gestion des points de vente avec possibilité d'accès restreint à certains utilisateurs"); ?> | |||
<?= block_feature("repeat", "Gestion des abonnements pour les commandes récurrentes"); ?> | |||
<?= block_feature("user", "Gestion des clients"); ?> | |||
<?= block_feature("euro", "Système de crédit (ou cagnotte) permettant la comptabilisation des paiements"); ?> | |||
<?= block_feature("bullhorn", "Communication facilitée avec les clients via l'envoi d'emails en masse"); ?> | |||
<?= block_feature("folder-open", "Génération de bons de livraison, factures & devis"); ?> | |||
<?= block_feature("stats", "Statistiques et rapports de vente"); ?> | |||
</div> | |||
</div> | |||
<div class="panel panel-primary" id="block-services"> | |||
<div class="panel-heading"> | |||
<h2 class="panel-title"> | |||
<span class="glyphicon glyphicon-wrench"></span> | |||
<span class="the-title">Services</span> | |||
</h2> | |||
</div> | |||
<div class="panel-body"> | |||
<div class="col-md-6"> | |||
<div class="panel panel-default"> | |||
<div class="panel-body"> | |||
<h3>Évolutions régulières</h3> | |||
<p>Les évolutions sont développées en fonction des retours de tous les producteurs | |||
et le | |||
logiciel est régulièrement mis à jour.<br> | |||
Si vous avez un besoin spécifique à votre activité, nous pouvons réaliser des | |||
développements sur-mesure <a | |||
href="<?= \Yii::$app->urlManager->createUrl(['site/contact']) ?>">sur | |||
devis</a>. | |||
</p> | |||
</div> | |||
</div> | |||
<div class="panel panel-default"> | |||
<div class="panel-body"> | |||
<h3>Formation & accompagnement</h3> | |||
<p>Au moment du lancement de votre circuit court sur Opendistrib, ainsi que tout au | |||
long de | |||
votre projet, | |||
nous assurons la formation et l'accompagnement dans l'utilisation du | |||
logiciel.</p> | |||
</div> | |||
</div> | |||
</div> | |||
<div class="col-md-6"> | |||
<div class="panel panel-default"> | |||
<div class="panel-body"> | |||
<h3>Support</h3> | |||
<p>Nous sommes disponibles pour répondre rapidement à toutes vos questions par email | |||
ou par | |||
téléphone.</p> | |||
</div> | |||
</div> | |||
<div class="panel panel-default"> | |||
<div class="panel-body"> | |||
<h3>Maintenance</h3> | |||
<p>Nous travaillons contamment sur la qualité/sécurité du logiciel et | |||
intervenons au plus vite en cas de bug.</p> | |||
</div> | |||
</div> | |||
<div class="panel panel-default"> | |||
<div class="panel-body"> | |||
<h3>Hébergement</h3> | |||
<p>La plateforme est hébergée en France par la société <a | |||
href="https://www.alwaysdata.com/">Alwaysdata</a>.</p> | |||
</div> | |||
</div> | |||
</div> | |||
</div> | |||
</div> | |||
<div class="panel panel-primary" id="block-rates"> | |||
<div class="panel-heading"> | |||
<h2 class="panel-title"> | |||
<span class="glyphicon glyphicon-euro"></span> | |||
<span class="the-title">Tarifs</span> | |||
</h2> | |||
</div> | |||
<div class="panel-body"> | |||
<?= $this->render('_prices_producer', ['dataProviderPrices' => $dataProviderPrices]); ?> | |||
</div> | |||
</div> | |||
<div class="panel panel-primary" id="panel-go-further"> | |||
<div class="panel-heading"> | |||
<h2 class="panel-title"> | |||
<span class="glyphicon glyphicon-plus"></span> | |||
<span class="the-title">Pour aller plus loin</span> | |||
</h2> | |||
</div> | |||
<div class="panel-body"> | |||
<p class="text-center"> | |||
<?php if (Yii::$app->user->isGuest): ?> | |||
<a class="btn btn-default" | |||
href="<?= $this->getUrlManagerFrontend()->createUrl(['site/signup']); ?>"> | |||
<span class="glyphicon glyphicon-user"></span> Je crée un espace producteur | |||
</a> | |||
<?php endif; ?> | |||
<a class="btn btn-default" | |||
href="<?= $this->getUrlManagerFrontend()->createUrl(['site/producer', 'id' => 32]); ?>"> | |||
<span class="glyphicon glyphicon-check"></span> Je teste le logiciel | |||
</a> | |||
<a class="btn btn-default" href="<?= \Yii::$app->params['appointmentUrl']; ?>" | |||
target="_blank"> | |||
<span class="glyphicon glyphicon-education"></span> Je demande une démo | |||
</a> | |||
<a class="btn btn-default" | |||
href="<?= $this->getUrlManagerFrontend()->createUrl(['site/contact']); ?>"> | |||
<span class="glyphicon glyphicon-envelope"></span> Je contacte le développeur | |||
</a> | |||
</p> | |||
</div> | |||
</div> | |||
</div> | |||
<div class="clr"></div> | |||
</div> | |||
</div> | |||
<?php | |||
function block_feature($icon, $description) | |||
{ | |||
return '<div class="block col-md-6"> | |||
<span class="glyphicon glyphicon-' . $icon . '"></span> | |||
<p>' . $description . '</p> | |||
</div>'; | |||
} | |||
?> |
@@ -42,6 +42,7 @@ use yii\bootstrap\ActiveForm; | |||
use yii\helpers\ArrayHelper; | |||
$this->setTitle('Inscription') ; | |||
$this->setIcon('user'); | |||
$this->setMeta('description', 'Inscrivez-vous afin de profiter des fonctionnalités de la plateforme.'); | |||
$this->params['breadcrumbs'][] = $this->title; | |||
@@ -49,8 +50,6 @@ $this->params['breadcrumbs'][] = $this->title; | |||
?> | |||
<div class="site-signup"> | |||
<h1 class="title-system-order"><span class="glyphicon glyphicon-user"></span> <?= Html::encode($this->title) ?></h1> | |||
<div class="row"> | |||
<div class="col-lg-5"> | |||
<?php if(YII_ENV == 'demo'): ?> | |||
@@ -85,7 +84,7 @@ $this->params['breadcrumbs'][] = $this->title; | |||
'prompt' => '--', | |||
]) | |||
->label('TVA à appliquer par défaut'); ?> | |||
<?= $form->field($model, 'cgv')->checkbox()->label('J\'accepte les <a class="btn btn-xs btn-default" data-toggle="modal" data-target="#modal-cgv" href="javascript:void(0);">conditions générales de service</a> et les <a class="btn btn-xs btn-default" data-toggle="modal" data-target="#modal-prices" href="javascript:void(0);">conditions tarifaires</a>.') ?> | |||
<?= $form->field($model, 'cgv')->checkbox()->label('J\'accepte les <button type="button" class="btn btn-xs btn-default btn-modal-cgv" data-toggle="modal" data-target="#modal-cgv">conditions générales de service</button> et les <button type="button" class="btn btn-xs btn-default btn-modal-prices" data-toggle="modal" data-target="#modal-prices">conditions tarifaires</button>.') ?> | |||
</div> | |||
<div id="fields-user"> | |||
<?= $form->field($model, 'id_producer')->dropDownList($dataProducers, ['prompt' => '--','encode' => false,'options' => $optionsProducers]) ?> |
@@ -0,0 +1,68 @@ | |||
<?php | |||
/** | |||
Copyright Opendistrib (2018) | |||
contact@opendistrib.net | |||
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 yii\helpers\Html; | |||
use yii\bootstrap\ActiveForm; | |||
use yii\captcha\Captcha; | |||
$this->setTitle('Code source'); | |||
$this->setIcon('console'); | |||
//$this->setMeta('description', 'Code source') ; | |||
?> | |||
<div class="site-about"> | |||
<div class="row"> | |||
<div class="col-md-12"> | |||
<div class="panel panel-default"> | |||
<div class="panel-body"> | |||
<p>Le logiciel Opendistrib 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 <a href="http://www.cecill.info">http://www.cecill.info</a>.</p> | |||
<p class="text-center"> | |||
<a class="btn btn-primary" href="https://forge.laclic.fr/Laclic/Opendistrib"> | |||
<span class="glyphicon glyphicon-console"></span> | |||
Accéder au code source | |||
</a> | |||
</p> | |||
</div> | |||
</div> | |||
</div> | |||
</div> | |||
</div> |
@@ -39,40 +39,41 @@ termes. | |||
use yii\helpers\Html; | |||
use yii\widgets\ActiveForm; | |||
$this->title = 'Mon profil' ; | |||
$this->setTitle('Mon profil') ; | |||
$this->setIcon('user'); | |||
?> | |||
<div id="profil-user" class="user-update"> | |||
<h1 class="title-system-order"><span class="glyphicon glyphicon-user"></span> Mon profil</h1> | |||
<div class="user-form"> | |||
<?php $form = ActiveForm::begin([ | |||
'enableClientScript' => false | |||
]); ?> | |||
<h2>Informations</h2> | |||
<?= $form->field($model, 'lastname')->textInput() ?> | |||
<?= $form->field($model, 'name')->textInput() ?> | |||
<?= $form->field($model, 'phone')->textInput() ?> | |||
<?= $form->field($model, 'email')->textInput(); ?> | |||
<?= $form->field($model, 'address')->textarea() ?> | |||
<h2>Mot de passe</h2> | |||
<p>Renseignez les champs ci-dessous si vous souhaitez modifier votre mot de passe.</p> | |||
<?= $form->field($model, 'password_old')->passwordInput() ?> | |||
<?= $form->field($model, 'password_new')->passwordInput() ?> | |||
<?= $form->field($model, 'password_new_confirm')->passwordInput() ?> | |||
<div class="clr"></div> | |||
<div class="form-group"> | |||
<?= Html::submitButton($model->isNewRecord ? 'Create' : 'Modifier', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary', 'name' => 'user-profile-button']) ?> | |||
</div> | |||
<?php ActiveForm::end(); ?> | |||
</div> | |||
<div class="panel panel-default"> | |||
<div class="panel-body"> | |||
<div class="user-form"> | |||
<?php $form = ActiveForm::begin([ | |||
'enableClientScript' => false | |||
]); ?> | |||
<h2>Informations</h2> | |||
<?= $form->field($model, 'lastname')->textInput() ?> | |||
<?= $form->field($model, 'name')->textInput() ?> | |||
<?= $form->field($model, 'phone')->textInput() ?> | |||
<?= $form->field($model, 'email')->textInput(); ?> | |||
<?= $form->field($model, 'address')->textarea() ?> | |||
<h2>Mot de passe</h2> | |||
<p>Renseignez les champs ci-dessous si vous souhaitez modifier votre mot de passe.</p> | |||
<?= $form->field($model, 'password_old')->passwordInput() ?> | |||
<?= $form->field($model, 'password_new')->passwordInput() ?> | |||
<?= $form->field($model, 'password_new_confirm')->passwordInput() ?> | |||
<div class="clr"></div> | |||
<div class="form-group"> | |||
<?= Html::submitButton($model->isNewRecord ? 'Create' : 'Modifier', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary', 'name' => 'user-profile-button']) ?> | |||
</div> | |||
<?php ActiveForm::end(); ?> | |||
</div> | |||
</div> | |||
</div> | |||
</div> |