Sfoglia il codice sorgente

Merge branch 'develop'

master
Guillaume Bourgeois 1 anno fa
parent
commit
fad3023149
100 ha cambiato i file con 5008 aggiunte e 1544 eliminazioni
  1. +5
    -0
      backend/controllers/StatsAdminController.php
  2. +87
    -0
      backend/controllers/SupportAdminController.php
  3. +151
    -0
      backend/controllers/SupportController.php
  4. +1
    -1
      backend/views/development/index.php
  5. +175
    -167
      backend/views/layouts/header.php
  6. +74
    -39
      backend/views/layouts/left.php
  7. +1
    -4
      backend/views/layouts/main-login.php
  8. +2
    -0
      backend/views/producer-admin/_form.php
  9. +7
    -7
      backend/views/producer/update.php
  10. +1
    -1
      backend/views/site/login.php
  11. +8
    -0
      backend/views/stats-admin/matomo.php
  12. +60
    -0
      backend/views/support/create.php
  13. +235
    -0
      backend/views/support/index.php
  14. +89
    -0
      backend/views/support/view.php
  15. +478
    -350
      backend/web/css/screen.css
  16. +88
    -10
      backend/web/sass/_adminlte.scss
  17. +10
    -1
      backend/web/sass/_responsive.scss
  18. +13
    -2
      backend/web/sass/screen.scss
  19. +29
    -0
      backend/web/sass/support/_index.scss
  20. +19
    -0
      backend/web/sass/support/_view.scss
  21. +2
    -1
      common/assets/CommonAsset.php
  22. +3
    -0
      common/components/BusinessLogic.php
  23. +36
    -0
      common/components/BusinessLogicTrait.php
  24. +18
    -0
      common/components/View.php
  25. +1
    -0
      common/config/main.php
  26. +1
    -1
      common/config/params.php
  27. +6
    -0
      common/controllers/CommonController.php
  28. +25
    -7
      common/logic/AbstractRepository.php
  29. +8
    -0
      common/logic/AbstractSolver.php
  30. +46
    -0
      common/logic/Order/Order/Repository/OrderRepository.php
  31. +20
    -0
      common/logic/PointSale/PointSale/Repository/PointSaleRepository.php
  32. +6
    -2
      common/logic/Producer/Producer/Model/Producer.php
  33. +30
    -1
      common/logic/Producer/Producer/Repository/ProducerRepository.php
  34. +0
    -1
      common/logic/Subscription/ProductSubscription/Repository/ProductSubscriptionRepository.php
  35. +0
    -1
      common/logic/Subscription/ProductSubscription/Repository/ProductSubscriptionRepositoryQuery.php
  36. +7
    -7
      common/logic/Subscription/ProductSubscription/Wrapper/ProductSubscriptionManager.php
  37. +125
    -0
      common/logic/Ticket/Ticket/Model/Ticket.php
  38. +93
    -0
      common/logic/Ticket/Ticket/Model/TicketSearch.php
  39. +52
    -0
      common/logic/Ticket/Ticket/Repository/TicketRepository.php
  40. +16
    -0
      common/logic/Ticket/Ticket/Repository/TicketRepositoryQuery.php
  41. +78
    -0
      common/logic/Ticket/Ticket/Service/TicketBuilder.php
  42. +14
    -0
      common/logic/Ticket/Ticket/Service/TicketDefinition.php
  43. +113
    -0
      common/logic/Ticket/Ticket/Service/TicketSolver.php
  44. +42
    -0
      common/logic/Ticket/Ticket/Wrapper/TicketContainer.php
  45. +23
    -0
      common/logic/Ticket/Ticket/Wrapper/TicketManager.php
  46. +105
    -0
      common/logic/Ticket/TicketMessage/Model/TicketMessage.php
  47. +28
    -0
      common/logic/Ticket/TicketMessage/Repository/TicketMessageRepository.php
  48. +16
    -0
      common/logic/Ticket/TicketMessage/Repository/TicketMessageRepositoryQuery.php
  49. +30
    -0
      common/logic/Ticket/TicketMessage/Service/TicketMessageBuilder.php
  50. +14
    -0
      common/logic/Ticket/TicketMessage/Service/TicketMessageDefinition.php
  51. +35
    -0
      common/logic/Ticket/TicketMessage/Wrapper/TicketMessageContainer.php
  52. +21
    -0
      common/logic/Ticket/TicketMessage/Wrapper/TicketMessageManager.php
  53. +103
    -0
      common/logic/Ticket/TicketUser/Model/TicketUser.php
  54. +39
    -0
      common/logic/Ticket/TicketUser/Repository/TicketUserRepository.php
  55. +30
    -0
      common/logic/Ticket/TicketUser/Repository/TicketUserRepositoryQuery.php
  56. +49
    -0
      common/logic/Ticket/TicketUser/Service/TicketUserBuilder.php
  57. +14
    -0
      common/logic/Ticket/TicketUser/Service/TicketUserDefinition.php
  58. +35
    -0
      common/logic/Ticket/TicketUser/Wrapper/TicketUserContainer.php
  59. +21
    -0
      common/logic/Ticket/TicketUser/Wrapper/TicketUserManager.php
  60. +20
    -0
      common/logic/User/User/Repository/UserRepository.php
  61. +19
    -11
      common/logic/User/User/Service/UserUtils.php
  62. +6
    -0
      common/logic/User/UserProducer/Repository/UserProducerRepository.php
  63. +20
    -2
      common/logic/User/UserProducer/Service/UserProducerBuilder.php
  64. +5
    -4
      common/mail/signup-html.php
  65. +6
    -2
      common/mail/signup-text.php
  66. +12
    -0
      common/versions/23.8.A.php
  67. +154
    -0
      common/views/nav_user_top.php
  68. +73
    -12
      common/web/css/screen.css
  69. +14
    -3
      common/web/js/common.js
  70. +90
    -26
      common/web/sass/_common.scss
  71. +1
    -1
      common/web/sass/screen.scss
  72. +52
    -0
      console/migrations/m230717_120138_module_ticket.php
  73. +28
    -0
      console/migrations/m230725_072843_producer_add_latitude_longitude.php
  74. +28
    -0
      console/migrations/m230726_105750_producer_alter_option_display_message_new_opendistrib_version.php
  75. +28
    -0
      console/migrations/m230731_073506_producer_latitude_longitude_double.php
  76. +2
    -0
      frontend/assets/AppAsset.php
  77. +110
    -0
      frontend/controllers/BookmarkController.php
  78. +72
    -10
      frontend/controllers/SiteController.php
  79. +3
    -6
      frontend/forms/SignupForm.php
  80. +39
    -106
      frontend/views/layouts/main.php
  81. +36
    -0
      frontend/views/site/_about_few_numbers.php
  82. +10
    -9
      frontend/views/site/_cgv_content.php
  83. +23
    -4
      frontend/views/site/_prices_producer.php
  84. +89
    -0
      frontend/views/site/about.php
  85. +6
    -5
      frontend/views/site/cgv.php
  86. +18
    -19
      frontend/views/site/contact.php
  87. +0
    -4
      frontend/views/site/error-404-producer.php
  88. +84
    -125
      frontend/views/site/index.php
  89. +1
    -4
      frontend/views/site/login.php
  90. +68
    -40
      frontend/views/site/mentions.php
  91. +0
    -160
      frontend/views/site/prices.php
  92. +53
    -46
      frontend/views/site/producer.php
  93. +70
    -6
      frontend/views/site/producers.php
  94. +13
    -10
      frontend/views/site/requestPasswordResetToken.php
  95. +191
    -0
      frontend/views/site/service.php
  96. +2
    -3
      frontend/views/site/signup.php
  97. +68
    -0
      frontend/views/site/source_code.php
  98. +31
    -30
      frontend/views/user/update.php
  99. +625
    -293
      frontend/web/css/screen.css
  100. BIN
      frontend/web/img/souke.png

+ 5
- 0
backend/controllers/StatsAdminController.php Vedi File

@@ -132,6 +132,11 @@ class StatsAdminController extends BackendController
'data' => $data,
]);
}

public function actionMatomo()
{
return $this->render('matomo');
}
}

?>

+ 87
- 0
backend/controllers/SupportAdminController.php Vedi File

@@ -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
]);
}

}

+ 151
- 0
backend/controllers/SupportController.php Vedi File

@@ -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.");
}
}
}

+ 1
- 1
backend/views/development/index.php Vedi File

@@ -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>

+ 175
- 167
backend/views/layouts/header.php Vedi File

@@ -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">&nbsp;<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">&nbsp;<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>

+ 74
- 39
backend/views/layouts/left.php Vedi File

@@ -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">&nbsp;</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()],
],
]
) ?>

+ 1
- 4
backend/views/layouts/main-login.php Vedi File

@@ -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 {

+ 2
- 0
backend/views/producer-admin/_form.php Vedi File

@@ -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>

+ 7
- 7
backend/views/producer/update.php Vedi File

@@ -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>


+ 1
- 1
backend/views/site/login.php Vedi File

@@ -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">

+ 8
- 0
backend/views/stats-admin/matomo.php Vedi File

@@ -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>

+ 60
- 0
backend/views/support/create.php Vedi File

@@ -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>

+ 235
- 0
backend/views/support/index.php Vedi File

@@ -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);
}

?>

+ 89
- 0
backend/views/support/view.php Vedi File

@@ -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>

+ 478
- 350
backend/web/css/screen.css
File diff soppresso perché troppo grande
Vedi File


+ 88
- 10
backend/web/sass/_adminlte.scss Vedi File

@@ -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 ;
}

+ 10
- 1
backend/web/sass/_responsive.scss Vedi File

@@ -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;
}
}
}


+ 13
- 2
backend/web/sass/screen.scss Vedi File

@@ -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" ;

+ 29
- 0
backend/web/sass/support/_index.scss Vedi File

@@ -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;
}
}
}
}

+ 19
- 0
backend/web/sass/support/_view.scss Vedi File

@@ -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;
}
}
}

+ 2
- 1
common/assets/CommonAsset.php Vedi File

@@ -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') ;
}
}

+ 3
- 0
common/components/BusinessLogic.php Vedi File

@@ -28,6 +28,9 @@ class BusinessLogic
$this->getProductOrderContainer(),
$this->getProductPriceContainer(),
$this->getProductSubscriptionContainer(),
$this->getTicketUserContainer(),
$this->getTicketMessageContainer(),
$this->getTicketContainer(),
$this->getQuotationContainer(),
$this->getInvoiceContainer(),
$this->getDeliveryNoteContainer(),

+ 36
- 0
common/components/BusinessLogicTrait.php Vedi File

@@ -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();
}
}

+ 18
- 0
common/components/View.php Vedi File

@@ -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;
}
}

+ 1
- 0
common/config/main.php Vedi File

@@ -124,4 +124,5 @@ return [
}
],
'language' => 'fr-FR',
'timeZone' => 'Europe/Paris',
];

+ 1
- 1
common/config/params.php Vedi File

@@ -37,7 +37,7 @@
*/

return [
'version' => '23.7.A',
'version' => '23.8.A',
'adminEmail' => 'contact@opendistrib.net',
'supportEmail' => 'contact@opendistrib.net',
'user.passwordResetTokenExpire' => 3600,

+ 6
- 0
common/controllers/CommonController.php Vedi File

@@ -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);
}
}

?>

+ 25
- 7
common/logic/AbstractRepository.php Vedi File

@@ -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;
}
}

+ 8
- 0
common/logic/AbstractSolver.php Vedi File

@@ -0,0 +1,8 @@
<?php

namespace common\logic;

abstract class AbstractSolver extends AbstractService implements SolverInterface
{

}

+ 46
- 0
common/logic/Order/Order/Repository/OrderRepository.php Vedi File

@@ -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);
}
}

+ 20
- 0
common/logic/PointSale/PointSale/Repository/PointSaleRepository.php Vedi File

@@ -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);
}
}

+ 6
- 2
common/logic/Producer/Producer/Model/Producer.php Vedi File

@@ -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'
];
}


+ 30
- 1
common/logic/Producer/Producer/Repository/ProducerRepository.php Vedi File

@@ -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();

+ 0
- 1
common/logic/Subscription/ProductSubscription/Repository/ProductSubscriptionRepository.php Vedi File

@@ -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

+ 0
- 1
common/logic/Subscription/ProductSubscription/Repository/ProductSubscriptionRepositoryQuery.php Vedi File

@@ -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;

+ 7
- 7
common/logic/Subscription/ProductSubscription/Wrapper/ProductSubscriptionManager.php Vedi File

@@ -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;
}
}

+ 125
- 0
common/logic/Ticket/Ticket/Model/Ticket.php Vedi File

@@ -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);
}
}

+ 93
- 0
common/logic/Ticket/Ticket/Model/TicketSearch.php Vedi File

@@ -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;
}
}

+ 52
- 0
common/logic/Ticket/Ticket/Repository/TicketRepository.php Vedi File

@@ -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);
}
}

+ 16
- 0
common/logic/Ticket/Ticket/Repository/TicketRepositoryQuery.php Vedi File

@@ -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);
}
}

+ 78
- 0
common/logic/Ticket/Ticket/Service/TicketBuilder.php Vedi File

@@ -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);
}
}

+ 14
- 0
common/logic/Ticket/Ticket/Service/TicketDefinition.php Vedi File

@@ -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;
}
}

+ 113
- 0
common/logic/Ticket/Ticket/Service/TicketSolver.php Vedi File

@@ -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;
}
}

+ 42
- 0
common/logic/Ticket/Ticket/Wrapper/TicketContainer.php Vedi File

@@ -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();
}
}

+ 23
- 0
common/logic/Ticket/Ticket/Wrapper/TicketManager.php Vedi File

@@ -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;
}
}

+ 105
- 0
common/logic/Ticket/TicketMessage/Model/TicketMessage.php Vedi File

@@ -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);
}
}

+ 28
- 0
common/logic/Ticket/TicketMessage/Repository/TicketMessageRepository.php Vedi File

@@ -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 => ''
];
}
}

+ 16
- 0
common/logic/Ticket/TicketMessage/Repository/TicketMessageRepositoryQuery.php Vedi File

@@ -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);
}
}

+ 30
- 0
common/logic/Ticket/TicketMessage/Service/TicketMessageBuilder.php Vedi File

@@ -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;
}
}

+ 14
- 0
common/logic/Ticket/TicketMessage/Service/TicketMessageDefinition.php Vedi File

@@ -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;
}
}

+ 35
- 0
common/logic/Ticket/TicketMessage/Wrapper/TicketMessageContainer.php Vedi File

@@ -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();
}
}

+ 21
- 0
common/logic/Ticket/TicketMessage/Wrapper/TicketMessageManager.php Vedi File

@@ -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;
}
}

+ 103
- 0
common/logic/Ticket/TicketUser/Model/TicketUser.php Vedi File

@@ -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);
}
}

+ 39
- 0
common/logic/Ticket/TicketUser/Repository/TicketUserRepository.php Vedi File

@@ -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();
}
}

+ 30
- 0
common/logic/Ticket/TicketUser/Repository/TicketUserRepositoryQuery.php Vedi File

@@ -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;
}
}

+ 49
- 0
common/logic/Ticket/TicketUser/Service/TicketUserBuilder.php Vedi File

@@ -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);
}
}

+ 14
- 0
common/logic/Ticket/TicketUser/Service/TicketUserDefinition.php Vedi File

@@ -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;
}
}

+ 35
- 0
common/logic/Ticket/TicketUser/Wrapper/TicketUserContainer.php Vedi File

@@ -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();
}
}

+ 21
- 0
common/logic/Ticket/TicketUser/Wrapper/TicketUserManager.php Vedi File

@@ -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;
}
}

+ 20
- 0
common/logic/User/User/Repository/UserRepository.php Vedi File

@@ -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);
}
}

+ 19
- 11
common/logic/User/User/Service/UserUtils.php Vedi File

@@ -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();
]
]);
}

/**

+ 6
- 0
common/logic/User/UserProducer/Repository/UserProducerRepository.php Vedi File

@@ -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;
}
}

+ 20
- 2
common/logic/User/UserProducer/Service/UserProducerBuilder.php Vedi File

@@ -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);
}
}

+ 5
- 4
common/mail/signup-html.php Vedi File

@@ -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>

+ 6
- 2
common/mail/signup-text.php Vedi File

@@ -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'] ?>

+ 12
- 0
common/versions/23.8.A.php Vedi File

@@ -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>

+ 154
- 0
common/views/nav_user_top.php Vedi File

@@ -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>

+ 73
- 12
common/web/css/screen.css Vedi File

@@ -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;
}

common/web/js/utils.js → common/web/js/common.js Vedi File

@@ -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

+ 90
- 26
common/web/sass/_common.scss Vedi File

@@ -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);
}
}

+ 1
- 1
common/web/sass/screen.scss Vedi File

@@ -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" ;

+ 52
- 0
console/migrations/m230717_120138_module_ticket.php Vedi File

@@ -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');
}
}

+ 28
- 0
console/migrations/m230725_072843_producer_add_latitude_longitude.php Vedi File

@@ -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');
}
}

+ 28
- 0
console/migrations/m230726_105750_producer_alter_option_display_message_new_opendistrib_version.php Vedi File

@@ -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');
}
}

+ 28
- 0
console/migrations/m230731_073506_producer_latitude_longitude_double.php Vedi File

@@ -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);
}
}

+ 2
- 0
frontend/assets/AppAsset.php Vedi File

@@ -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');
}
}

+ 110
- 0
frontend/controllers/BookmarkController.php Vedi File

@@ -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.');
}
}
}

+ 72
- 10
frontend/controllers/SiteController.php Vedi File

@@ -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]));

+ 3
- 6
frontend/forms/SignupForm.php Vedi File

@@ -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;
}

+ 39
- 106
frontend/views/layouts/main.php Vedi File

@@ -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
&bull; <?= 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 &gt;</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> &bull;
<a href="<?php echo $this->getUrlManager()->createUrl('site/mentions'); ?>">Mentions légales</a> &bull;
<a href="<?php echo $this->getUrlManager()->createUrl('site/cgv'); ?>">CGS</a> &bull;
<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">&bull;</span>
<a href="<?php echo $this->getUrlManager()->createUrl('site/mentions'); ?>">Mentions légales</a> <span class="bull">&bull;</span>
<a href="<?php echo $this->getUrlManager()->createUrl('site/cgv'); ?>">Conditions générales de service</a> <span class="bull">&bull;</span>
<a href="<?php echo $this->getUrlManager()->createUrl('site/source-code'); ?>">Code source</a>
</div>
</footer>


+ 36
- 0
frontend/views/site/_about_few_numbers.php Vedi File

@@ -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, '', ' ');
}

?>

+ 10
- 9
frontend/views/site/_cgv_content.php Vedi File

@@ -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

+ 23
- 4
frontend/views/site/_prices_producer.php Vedi File

@@ -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>


+ 89
- 0
frontend/views/site/about.php Vedi File

@@ -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>

+ 6
- 5
frontend/views/site/cgv.php Vedi File

@@ -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>

+ 18
- 19
frontend/views/site/contact.php Vedi File

@@ -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>


+ 0
- 4
frontend/views/site/error-404-producer.php Vedi File

@@ -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("&lt; Retour à l'accueil", ['site/index']) ?> - <?= Html::a("Liste des producteurs", ['site/producers']) ?></p>
</div>

+ 84
- 125
frontend/views/site/index.php Vedi File

@@ -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; ?>



+ 1
- 4
frontend/views/site/login.php Vedi File

@@ -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> &nbsp;&nbsp;<?= 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() ?>

+ 68
- 40
frontend/views/site/mentions.php Vedi File

@@ -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>

+ 0
- 160
frontend/views/site/prices.php Vedi File

@@ -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>&nbsp;&nbsp;<?= 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&nbsp;€&nbsp;HT&nbsp;/&nbsp;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>

+ 53
- 46
frontend/views/site/producer.php Vedi File

@@ -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>

+ 70
- 6
frontend/views/site/producers.php Vedi File

@@ -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>&nbsp;&nbsp;<?= 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>

+ 13
- 10
frontend/views/site/requestPasswordResetToken.php Vedi File

@@ -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>

+ 191
- 0
frontend/views/site/service.php Vedi File

@@ -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>';
}

?>

+ 2
- 3
frontend/views/site/signup.php Vedi File

@@ -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>&nbsp;&nbsp;<?= 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]) ?>

+ 68
- 0
frontend/views/site/source_code.php Vedi File

@@ -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>

+ 31
- 30
frontend/views/user/update.php Vedi File

@@ -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>

+ 625
- 293
frontend/web/css/screen.css
File diff soppresso perché troppo grande
Vedi File


BIN
frontend/web/img/souke.png Vedi File

Before After
Width: 303  |  Height: 150  |  Size: 12KB

Dato che sono stati cambiati molti file in questo diff, alcuni di essi non verranno mostrati

Loading…
Annulla
Salva