瀏覽代碼

[Frontend] Améliorations diverses

feature/souke
Guillaume Bourgeois 1 年之前
父節點
當前提交
0170d48e4d
共有 21 個文件被更改,包括 639 次插入581 次删除
  1. +1
    -4
      backend/views/layouts/main-login.php
  2. +1
    -1
      backend/views/site/login.php
  3. +6
    -6
      backend/web/css/screen.css
  4. +2
    -1
      backend/web/sass/_adminlte.scss
  5. +28
    -0
      console/migrations/m230731_073506_producer_latitude_longitude_double.php
  6. +32
    -35
      frontend/controllers/SiteController.php
  7. +2
    -2
      frontend/views/layouts/main.php
  8. +37
    -0
      frontend/views/site/_about_few_numbers.php
  9. +6
    -6
      frontend/views/site/_cgv_content.php
  10. +35
    -57
      frontend/views/site/about.php
  11. +0
    -4
      frontend/views/site/error-404-producer.php
  12. +1
    -1
      frontend/views/site/index.php
  13. +0
    -132
      frontend/views/site/prices.php
  14. +54
    -45
      frontend/views/site/producer.php
  15. +13
    -10
      frontend/views/site/requestPasswordResetToken.php
  16. +54
    -27
      frontend/views/site/service.php
  17. +1
    -1
      frontend/views/site/signup.php
  18. +68
    -0
      frontend/views/site/source_code.php
  19. +218
    -199
      frontend/web/css/screen.css
  20. +47
    -33
      frontend/web/js/frontend.js
  21. +33
    -17
      frontend/web/sass/screen.scss

+ 1
- 4
backend/views/layouts/main-login.php 查看文件

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

+ 1
- 1
backend/views/site/login.php 查看文件

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

+ 6
- 6
backend/web/css/screen.css 查看文件

@@ -1790,28 +1790,28 @@ body.login-page {
/* line 276, ../sass/_adminlte.scss */
body.login-page .login-box .login-logo {
text-align: center;
font-family: "comfortaalight";
font-family: "highvoltageregular";
}
/* line 279, ../sass/_adminlte.scss */
/* line 280, ../sass/_adminlte.scss */
body.login-page .login-box .login-logo img {
width: 50px;
}
/* line 284, ../sass/_adminlte.scss */
/* line 285, ../sass/_adminlte.scss */
body.login-page .login-box .login-box-body .btn-primary {
background-color: #F39C12;
border-color: #F39C12;
padding: 5px 10px;
}
/* line 289, ../sass/_adminlte.scss */
/* line 290, ../sass/_adminlte.scss */
body.login-page .login-box .login-box-body .btn-primary:active {
background-color: #f4a62a;
border-color: #F39C12;
}
/* line 295, ../sass/_adminlte.scss */
/* line 296, ../sass/_adminlte.scss */
body.login-page .login-box .login-box-body a {
color: #F39C12;
}
/* line 297, ../sass/_adminlte.scss */
/* line 298, ../sass/_adminlte.scss */
body.login-page .login-box .login-box-body a:hover {
color: #f4a62a;
}

+ 2
- 1
backend/web/sass/_adminlte.scss 查看文件

@@ -275,7 +275,8 @@ body.login-page {
.login-box {
.login-logo {
text-align: center ;
font-family: 'comfortaalight' ;
font-family: 'highvoltageregular';

img {
width: 50px ;
}

+ 28
- 0
console/migrations/m230731_073506_producer_latitude_longitude_double.php 查看文件

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

+ 32
- 35
frontend/controllers/SiteController.php 查看文件

@@ -131,24 +131,14 @@ class SiteController extends FrontendController
return $this->render('index');
}

public function actionSoftware()
public function actionService()
{
return $this->render('software', [
return $this->render('service', [
'producerDemoAccount' => $this->getProducerManager()->findOneProducerDemoAccount(),
'dataProviderPrices' => $this->getDataProviderPrices()
]);
}

/**
* Page de présentation des tarifs.
*/
public function actionPrices()
{
return $this->render('prices', [
'dataProviderPrices' => $this->getDataProviderPrices()
]);
}

public function getDataProviderPrices()
{
return new ActiveDataProvider([
@@ -179,34 +169,40 @@ class SiteController extends FrontendController

public function actionAbout()
{
$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;

/*
-- Nombre de clients actifs (sur les 3 derniers mois)

*/
$aboutFewNumbers = Yii::$app->cache->getOrSet('about_few_numbers2', 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);

return $this->render('about', [
'countProducersActive' => $countProducersActive,
'countPointSalesActive' => $countPointSalesActive,
'countUsersActive' => $countUsersActive,
'averageOrdersPerDay' => $averageOrdersPerDay,
'averageTurnover' => $averageTurnover,
'numberVisitsMonth' => $numberVisitsMonth
'aboutFewNumbers' => $aboutFewNumbers
]);
}

public function actionSourceCode()
{
return $this->render('source_code');
}

/**
* Liste les producteurs utilisant la plateforme.
*/
@@ -431,6 +427,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]));

+ 2
- 2
frontend/views/layouts/main.php 查看文件

@@ -167,10 +167,10 @@ if ($userManager->isCurrentProducer()) {
</div>
<footer id="footer">
<div class="container">
<a href="<?php echo $this->getUrlManager()->createUrl('site/software'); ?>">Fonctionnalités, services & tarifs</a> &bull;
<a href="<?php echo $this->getUrlManager()->createUrl('site/service'); ?>">Fonctionnalités, services & tarifs</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'); ?>">Conditions générales de service</a> &bull;
<a id="code-source" href="https://forge.laclic.fr/Laclic/Opendistrib">Code source</a>
<a href="<?php echo $this->getUrlManager()->createUrl('site/source-code'); ?>">Code source</a>
</div>
</footer>


+ 37
- 0
frontend/views/site/_about_few_numbers.php 查看文件

@@ -0,0 +1,37 @@
<div class="panel panel-primary" id="few-numbers">
<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 / mois', 'moyenne sur les 3 derniers mois'); ?>
<?= few_numbers_item(few_numbers_format_number($numberVisitsMonth), 'Visiteurs', 'le mois dernier'); ?>
<?php //few_numbers_item('4', 'Heures gagnées / semaine'); ?>
</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, '', ' ');
}

?>

+ 6
- 6
frontend/views/site/_cgv_content.php 查看文件

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

+ 35
- 57
frontend/views/site/about.php 查看文件

@@ -46,66 +46,44 @@ $this->setIcon('info-sign');

?>
<div class="site-about">
<!--
<h1 class="title-system-order">
<span class="glyphicon glyphicon-info-sign"></span>
<?= Html::encode($this->title) ?>
</h1>-->

<div class="row">
<div class="col-md-12">
<div class="panel panel-default">
<div class="col-md-8">
<div class="panel panel-primary">
<div class="panel-body">
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean volutpat justo ac augue volutpat
lobortis. Nulla facilisi. Cras sed justo et libero lobortis faucibus sed ac metus. Nulla lacinia
sagittis maximus. In id euismod sapien, sed facilisis quam. Phasellus consectetur libero at
dolor consequat, rutrum fermentum est laoreet. Quisque pellentesque risus nec augue bibendum
venenatis.</p>
<p>Vestibulum magna magna, sollicitudin sed urna ac, vulputate pharetra velit. Sed dictum enim in
sodales finibus. Sed luctus porta turpis, at pulvinar dui tempus a. Proin dictum vitae erat
quis dapibus. Praesent felis justo, bibendum nec turpis nec, scelerisque dignissim justo. Etiam
vel mauris non ipsum feugiat laoreet. Nulla facilisi. Aliquam pellentesque, mauris et pretium
pellentesque, diam neque hendrerit augue, auctor luctus turpis urna quis purus.</p>
</div>
</div>
<div class="panel panel-primary" id="few-numbers">
<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 / mois', 'moyenne sur les 3 derniers mois'); ?>
<?= few_numbers_item(few_numbers_format_number($numberVisitsMonth), 'Visiteurs', 'le mois dernier'); ?>
<?php //few_numbers_item('4', 'Heures gagnées / semaine'); ?>
<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 de manière libre et autonome.</p>

<h2>Fonctionnalités proposées</h2>
<p>Voici les fonctionnalités principales disponibles sur Opendistrib : automatiser les prises de
commandes en ligne, présenter son activité, communiquer avec ses clients,
gérer les paiements, générer des bons de livraison et des factures, obtenir des statistiques
de vente.</p>

<h2>Producteurs</h2>
<p>Opendistrib est particulièrement adapté aux boulangeries proposant du pain au levain naturel
car ils ont besoin de connaitre les quantités avant de lancer leurs productions. Néanmoins, le logiciel
fonctionne également très bien pour tous type de producteurs souhaitant fonctionner sur commande,
que ce soit pour gagner du temps ou limiter le gaspillage.</p>

<h2>Historique</h2>
<p>La première version du logiciel est née en 2015 à l'occasion de la création de la boulangerie
Le Chat des Noisettes à Déservillers. Le site a ensuite été ouvert à d'autres producteurs pour arriver
à un total de 35 producteurs actifs à l'heure actuelle.</p>

<h2>Le développeur</h2>
<p>La plateforme est actuellement maintenue et développée par Guillaume Bourgeois, développeur web
depuis 2009. </p>

<h2>Logiciel libre</h2>
<p>Lorem ipsum.</p>

<h2>Objectifs</h2>
<p>Lorem ipsum.</p>
</div>
</div>
</div>
<div class="col-md-4">
<?= $aboutFewNumbers; ?>
</div>
</div>
</div>


<?php

function few_numbers_item($number, $description, $detail = null) {
$html = '<div class="col-md-4 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, '', ' ');
}

?>
</div>

+ 0
- 4
frontend/views/site/error-404-producer.php 查看文件

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

+ 1
- 1
frontend/views/site/index.php 查看文件

@@ -66,7 +66,7 @@ $this->setMeta('description', 'Simplifiez la distribution de vos produits en cir
</a>
<?php endif; ?>
<a class="btn btn-default"
href="<?= \Yii::$app->urlManagerFrontend->createUrl(['site/software']); ?>">
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">

+ 0
- 132
frontend/views/site/prices.php 查看文件

@@ -1,132 +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>Hormis le paiement en ligne, vous avez accès à toutes les fonctionnalités d’Opendistrib quelque soit votre tranche tarifaire.
Les évolutions sont développées en fonction des retours de tous les producteurs.
</p>
<p>Si vous avez un besoin spécifique à votre activité, 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 & hébergement</span>
</h2>
</div>
<div class="panel-body">
<p>Le service comprend :</p>
<ul>
<li><strong>Le support</strong> : nous sommes disponibles pour répondre rapidement à toutes vos questions par email ou par téléphone.</li>
<li><strong>La maintenance</strong> : nous travaillons contamment sur la qualité/sécurité du logiciel et
intervenons immédiatement en cas de bug.</li>
<li><strong>L'hébergement</strong> : la plateforme est hébergée en France par la société <a href="https://www.alwaysdata.com/">Alwaysdata</a>.</li>
</ul>
</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->params['appointmentUrl']; ?>" target="_blank">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>Au moment du lancement de votre circuit court sur Opendistrib, ainsi que tout au long de votre projet,
la formation et l'accompagnement sont compris dans l'abonnement mensuel.</p>
</p>
</div>
</div>
</div>
</div>
</div>
-->

+ 54
- 45
frontend/views/site/producer.php 查看文件

@@ -43,66 +43,75 @@ 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; ?>
<!--<p class="info"><span class="alert alert-warning">Veuillez vous connecter pour réserver les produits de ce producteur.</span></p>-->
<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>

+ 13
- 10
frontend/views/site/requestPasswordResetToken.php 查看文件

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

frontend/views/site/software.php → frontend/views/site/service.php 查看文件

@@ -53,33 +53,19 @@ $this->setIcon('console');
</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 abonnements</p>
<div class="clr"></div>
</div>
<?= 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>
<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>
<?= 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"); ?>
<?= 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>

@@ -150,7 +136,48 @@ $this->setIcon('console');
<?= $this->render('_prices_producer', ['dataProviderPrices' => $dataProviderPrices]); ?>
</div>
</div>

<div class="panel panel-primary">
<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>

<?php

function block_feature($icon, $description) {
return '<div class="block col-md-6">
<span class="glyphicon glyphicon-'.$icon.'"></span>
<p>'.$description.'</p>
</div>';
}

</div>
?>

+ 1
- 1
frontend/views/site/signup.php 查看文件

@@ -84,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 查看文件

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

+ 218
- 199
frontend/web/css/screen.css
文件差異過大導致無法顯示
查看文件


+ 47
- 33
frontend/web/js/frontend.js 查看文件

@@ -60,21 +60,23 @@ var producersModule = {
},
initMap: function() {
var app = this;
app.map = L.map('producers-map').setView([46.5471789, 2.534168], 6);
L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', {
maxZoom: 19,
attribution: '© OpenStreetMap'
}).addTo(app.map);

$.get(UrlManager.getBaseUrl() + 'site/ajax-producers', {}, function(producers) {
for(var i = 0; i < producers.length ; i++) {
if(producers[i].latitude && producers[i].longitude) {
app.mapMarkers[producers[i].id] = L.marker([producers[i].latitude, producers[i].longitude])
.bindPopup('<div class="popup-producer"><div class="name">'+producers[i].name+'</div><div class="type">'+producers[i].type+'</div><div class="address"><span class="glyphicon glyphicon-map-marker"></span>'+producers[i].address+'</div><div class="link"><a href="'+producers[i].link+'" class="btn btn-primary btn-sm">Visiter</a></div></div>')
.addTo(app.map);
if($('#producers-map').length > 0) {
app.map = L.map('producers-map').setView([46.5471789, 2.534168], 6);
L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', {
maxZoom: 19,
attribution: '© OpenStreetMap'
}).addTo(app.map);

$.get(UrlManager.getBaseUrl() + 'site/ajax-producers', {}, function(producers) {
for(var i = 0; i < producers.length ; i++) {
if(producers[i].latitude && producers[i].longitude) {
app.mapMarkers[producers[i].id] = L.marker([producers[i].latitude, producers[i].longitude])
.bindPopup('<div class="popup-producer"><div class="name">'+producers[i].name+'</div><div class="type">'+producers[i].type+'</div><div class="address"><span class="glyphicon glyphicon-map-marker"></span>'+producers[i].address+'</div><div class="link"><a href="'+producers[i].link+'" class="btn btn-primary btn-sm">Visiter</a></div></div>')
.addTo(app.map);
}
}
}
});
});
}
},
initEventViewProducer: function() {
var app = this;
@@ -96,30 +98,32 @@ var producersModule = {
initMapPositionFixed: function() {

var $map = $('#producers-map');
var $wrapperProducerMap = $('#wrapper-producers-map');
if($map.length > 0) {
var $wrapperProducerMap = $('#wrapper-producers-map');

$map.width($wrapperProducerMap.width());
$(window).resize(function(){
$map.width($wrapperProducerMap.width());
});

$(window).scroll(function(){
if($(window).width() > 768) {
var wrapperProducersMapOffsetTop = $wrapperProducerMap.offset().top;
var currentScrollTop = $(this).scrollTop();

if(currentScrollTop >= wrapperProducersMapOffsetTop) {
if(!$map.hasClass('fixed')) {
$map.addClass('fixed');
$(window).resize(function(){
$map.width($wrapperProducerMap.width());
});

$(window).scroll(function(){
if($(window).width() > 768) {
var wrapperProducersMapOffsetTop = $wrapperProducerMap.offset().top;
var currentScrollTop = $(this).scrollTop();

if(currentScrollTop >= wrapperProducersMapOffsetTop) {
if(!$map.hasClass('fixed')) {
$map.addClass('fixed');
}
}
}
else {
if($map.hasClass('fixed')) {
$map.removeClass('fixed');
else {
if($map.hasClass('fixed')) {
$map.removeClass('fixed');
}
}
}
}
});
});
}
},
initSearch: function() {
$('#producer-search input').keyup(function() {
@@ -166,6 +170,16 @@ function opendistrib_signup() {
$('#signupform-id_producer').change(function () {
opendistrib_signup_code_producer();
});

// modals
$('.btn-modal-cgv').click(function() {
$('#modal-cgv').modal();
return false;
});
$('.btn-modal-prices').click(function() {
$('#modal-prices').modal();
return false;
});
}
}


+ 33
- 17
frontend/web/sass/screen.scss 查看文件

@@ -74,6 +74,10 @@ strong {
background-color: white;
}

.help-block {
padding-bottom: 5px;
}

#main {
padding-bottom: 50px;
min-height: 800px;
@@ -518,6 +522,10 @@ section#header-title {
.panel-body {
background-color: white;
@include border-radius(0px 0px 5px 5px) ;

p {
padding-bottom: 10px;
}
}

&.panel-primary {
@@ -629,18 +637,21 @@ section#header-title {

#row-functionalities-rates {
.block {
margin-bottom: 10px;
position: relative;
margin-bottom: 25px;
padding-left: 70px;
min-height: 50px;

.glyphicon {
font-size: 40px;
position: absolute;
left: 0px;
top: 0px;
}

p {
font-family: 'capsuularegular';
font-size: 18px;
margin-left: 70px;
}

img {
float: left;
width: 50px;
height: auto;
}

a {
@@ -674,13 +685,9 @@ section#header-title {
#block-rates {
table {
th {
font-family: 'capsuularegular';
font-weight: normal;
font-size: 23px;
}

th, td {
//text-align: center ;
//font-family: 'capsuularegular';
font-weight: bold;
font-size: 14px;
}
}
}
@@ -924,6 +931,15 @@ section#header-title {
}
}
.panel-body {

h2 {
font-size: 20px;
text-transform: none;
margin-bottom: 7px;
padding-bottom: 0px;
margin-top: 0px;
}

p:last-child {
margin-bottom: 0px;
padding-bottom: 5px;
@@ -940,11 +956,11 @@ section#header-title {
.number {
font-family: 'highvoltageregular';
font-weight: bold;
font-size: 50px;
font-size: 35px;
}

.description {
font-size: 18px;
font-size: 16px;
}

.detail {

Loading…
取消
儲存