Browse Source

Ajout du helper GlobalParam #155

dev
Fab 5 years ago
parent
commit
9c3181b554
50 changed files with 4875 additions and 4750 deletions
  1. +2
    -1
      backend/controllers/AccessController.php
  2. +3
    -2
      backend/controllers/DevelopmentController.php
  3. +7
    -6
      backend/controllers/DistributionController.php
  4. +1002
    -1004
      backend/controllers/OrderController.php
  5. +1
    -1
      backend/controllers/PointSaleController.php
  6. +4
    -3
      backend/controllers/ProducerController.php
  7. +3
    -2
      backend/controllers/ProductController.php
  8. +2
    -1
      backend/controllers/ReportController.php
  9. +4
    -3
      backend/controllers/SiteController.php
  10. +4
    -3
      backend/controllers/StatsController.php
  11. +3
    -2
      backend/controllers/SubscriptionController.php
  12. +10
    -9
      backend/controllers/UserController.php
  13. +2
    -1
      backend/models/AccessUserProducerForm.php
  14. +3
    -2
      backend/models/CreditForm.php
  15. +4
    -3
      backend/models/MailForm.php
  16. +164
    -157
      backend/views/development/index.php
  17. +1
    -1
      backend/views/distribution/index.php
  18. +207
    -190
      backend/views/layouts/header.php
  19. +215
    -207
      backend/views/layouts/main-old.php
  20. +3
    -2
      backend/views/product/_form.php
  21. +3
    -3
      backend/views/product/index.php
  22. +3
    -2
      backend/views/subscription/_form.php
  23. +2
    -1
      backend/views/subscription/index.php
  24. +2
    -1
      backend/views/user/credit.php
  25. +194
    -198
      common/components/ActiveRecordCommon.php
  26. +39
    -38
      common/config/params.php
  27. +84
    -0
      common/helpers/GlobalParam.php
  28. +50
    -39
      common/helpers/Price.php
  29. +2
    -1
      common/models/CreditHistorySearch.php
  30. +3
    -1
      common/models/DeliveryNoteSearch.php
  31. +2
    -1
      common/models/Development.php
  32. +332
    -333
      common/models/Distribution.php
  33. +2
    -1
      common/models/InvoiceSearch.php
  34. +703
    -719
      common/models/Order.php
  35. +321
    -320
      common/models/PointSale.php
  36. +2
    -1
      common/models/PointSaleDistribution.php
  37. +2
    -1
      common/models/PointSaleSearch.php
  38. +445
    -479
      common/models/Producer.php
  39. +3
    -2
      common/models/Product.php
  40. +2
    -1
      common/models/ProductSearch.php
  41. +2
    -1
      common/models/QuotationSearch.php
  42. +5
    -4
      common/models/Subscription.php
  43. +2
    -1
      common/models/SubscriptionSearch.php
  44. +6
    -5
      common/models/User.php
  45. +134
    -133
      common/models/UserSearch.php
  46. +627
    -630
      producer/controllers/OrderController.php
  47. +3
    -2
      producer/controllers/SiteController.php
  48. +2
    -1
      producer/controllers/SubscriptionController.php
  49. +252
    -230
      producer/views/layouts/main.php
  50. +2
    -1
      producer/views/subscription/index.php

+ 2
- 1
backend/controllers/AccessController.php View File



namespace backend\controllers; namespace backend\controllers;


use common\helpers\GlobalParam;
use common\models\Producer ; use common\models\Producer ;
use common\models\User ; use common\models\User ;
use common\models\UserSearch ; use common\models\UserSearch ;
$usersAccessArray = User::find() $usersAccessArray = User::find()
->where([ ->where([
'id_producer' => Producer::getId(),
'id_producer' => GlobalParam::getCurrentProducerId(),
'status' => User::STATUS_PRODUCER 'status' => User::STATUS_PRODUCER
]) ])
->all() ; ->all() ;

+ 3
- 2
backend/controllers/DevelopmentController.php View File



namespace backend\controllers; namespace backend\controllers;


use common\helpers\GlobalParam;
use Yii; use Yii;
use common\models\User; use common\models\User;
use common\models\Development; use common\models\Development;


if ($develpmentPriority) { if ($develpmentPriority) {
$develpmentPriority->priority = $priority; $develpmentPriority->priority = $priority;
$develpmentPriority->id_producer = Producer::getId();
$develpmentPriority->id_producer = GlobalParam::getCurrentProducerId();
} else { } else {
$develpmentPriority = new DevelopmentPriority; $develpmentPriority = new DevelopmentPriority;
$develpmentPriority->id_development = $idDevelopment; $develpmentPriority->id_development = $idDevelopment;
$develpmentPriority->priority = $priority; $develpmentPriority->priority = $priority;
$develpmentPriority->id_producer = Producer::getId();
$develpmentPriority->id_producer = GlobalParam::getCurrentProducerId();
} }


$develpmentPriority->save(); $develpmentPriority->save();

+ 7
- 6
backend/controllers/DistributionController.php View File

namespace backend\controllers; namespace backend\controllers;


use backend\controllers\BackendController ; use backend\controllers\BackendController ;
use common\helpers\GlobalParam;
use common\models\Distribution ; use common\models\Distribution ;
use common\models\Product ; use common\models\Product ;
use common\models\Producer ; use common\models\Producer ;
$format = 'Y-m-d' ; $format = 'Y-m-d' ;
$dateObject = DateTime::createFromFormat($format, $date); $dateObject = DateTime::createFromFormat($format, $date);
$producer = Producer::getCurrent() ;
$producer = GlobalParam::getCurrentProducer() ;
$json['producer'] = [ $json['producer'] = [
'credit' => $producer->credit, 'credit' => $producer->credit,
'tiller' => $producer->tiller 'tiller' => $producer->tiller
// products // products
$productsArray = Product::find() $productsArray = Product::find()
->orWhere(['id_producer' => Producer::getId(),])
->orWhere(['id_producer' => GlobalParam::getCurrentProducerId(),])
->joinWith(['productDistribution' => function($query) use($distribution) { ->joinWith(['productDistribution' => function($query) use($distribution) {
$query->andOnCondition('product_distribution.id_distribution = '.$distribution->id) ; $query->andOnCondition('product_distribution.id_distribution = '.$distribution->id) ;
}]) }])
$q->where(['id_distribution' => $distribution->id]); $q->where(['id_distribution' => $distribution->id]);
}]) }])
->where([ ->where([
'id_producer' => Producer::getId(),
'id_producer' => GlobalParam::getCurrentProducerId(),
]) ])
->asArray() ->asArray()
->all(); ->all();


$weekDistribution = Distribution::find() $weekDistribution = Distribution::find()
->andWhere([ ->andWhere([
'id_producer' => Producer::getId(),
'id_producer' => GlobalParam::getCurrentProducerId(),
'active' => 1, 'active' => 1,
]) ])
->andWhere(['or', ->andWhere(['or',
public function actionReport($date = '', $save = false, $idProducer = 0, $type = "pdf") public function actionReport($date = '', $save = false, $idProducer = 0, $type = "pdf")
{ {
if (!Yii::$app->user->isGuest) { if (!Yii::$app->user->isGuest) {
$idProducer = Producer::getId() ;
$idProducer = GlobalParam::getCurrentProducerId() ;
} }
$ordersArray = Order::searchAll([ $ordersArray = Order::searchAll([
$q->where(['id_distribution' => $distribution->id]); $q->where(['id_distribution' => $distribution->id]);
}]) }])
->where([ ->where([
'id_producer' => Producer::getId(),
'id_producer' => GlobalParam::getCurrentProducerId(),
]) ])
->orderBy('order ASC') ->orderBy('order ASC')
->all(); ->all();

+ 1002
- 1004
backend/controllers/OrderController.php
File diff suppressed because it is too large
View File


+ 1
- 1
backend/controllers/PointSaleController.php View File

{ {
$pointSale = $this->findModel($id) ; $pointSale = $this->findModel($id) ;
if($pointSale) { if($pointSale) {
PointSale::updateAll(['default' => 0], 'id_producer = :id_producer', [':id_producer' => Producer::getId()]) ;
PointSale::updateAll(['default' => 0], 'id_producer = :id_producer', [':id_producer' => GlobalParam::getCurrentProducerId()]) ;
if(!$pointSale->default) { if(!$pointSale->default) {
$pointSale->default = 1 ; $pointSale->default = 1 ;
$pointSale->save() ; $pointSale->save() ;

+ 4
- 3
backend/controllers/ProducerController.php View File



namespace backend\controllers; namespace backend\controllers;


use common\helpers\GlobalParam;
use Yii; use Yii;
use common\models\User; use common\models\User;
use backend\models\MailForm; use backend\models\MailForm;
public function actionUpdate() public function actionUpdate()
{ {
$request = Yii::$app->request; $request = Yii::$app->request;
$model = $this->findModel(Producer::getId());
$model = $this->findModel(GlobalParam::getCurrentProducerId());
$model->secret_key_payplug = $model->getSecretKeyPayplug() ; $model->secret_key_payplug = $model->getSecretKeyPayplug() ;
$logoFilenameOld = $model->logo; $logoFilenameOld = $model->logo;
{ {
$datasInvoices = new ActiveDataProvider([ $datasInvoices = new ActiveDataProvider([
'query' => Invoice::find() 'query' => Invoice::find()
->where(['id_producer' => Producer::getId()])
->where(['id_producer' => GlobalParam::getCurrentProducerId()])
->orderBy('reference DESC'), ->orderBy('reference DESC'),
'pagination' => [ 'pagination' => [
'pageSize' => 1000, 'pageSize' => 1000,
], ],
]); ]);


$producer = Producer::findOne(Producer::getId());
$producer = Producer::findOne(GlobalParam::getCurrentProducerId());


if ($producer->load(Yii::$app->request->post())) { if ($producer->load(Yii::$app->request->post())) {
$producer->save(); $producer->save();

+ 3
- 2
backend/controllers/ProductController.php View File



namespace backend\controllers; namespace backend\controllers;


use common\helpers\GlobalParam;
use common\models\ProductDistribution; use common\models\ProductDistribution;
use Yii; use Yii;
use yii\filters\AccessControl; use yii\filters\AccessControl;
{ {
$model = new Product(); $model = new Product();
$model->active = 1; $model->active = 1;
$model->id_producer = Producer::getId();
$model->id_producer = GlobalParam::getCurrentProducerId();






if ($model->load(Yii::$app->request->post()) && $model->save()) { if ($model->load(Yii::$app->request->post()) && $model->save()) {
$lastProductOrder = Product::find()->where('id_producer = :id_producer')->params([':id_producer' => Producer::getId()])->orderBy('order DESC')->one() ;
$lastProductOrder = Product::find()->where('id_producer = :id_producer')->params([':id_producer' => GlobalParam::getCurrentProducerId()])->orderBy('order DESC')->one() ;
if($lastProductOrder) { if($lastProductOrder) {
$model->order = ++ $lastProductOrder->order ; $model->order = ++ $lastProductOrder->order ;
} }

+ 2
- 1
backend/controllers/ReportController.php View File



namespace backend\controllers; namespace backend\controllers;


use common\helpers\GlobalParam;
use Yii; use Yii;
use yii\filters\AccessControl; use yii\filters\AccessControl;
use common\models\User; use common\models\User;
$res = Yii::$app->db->createCommand("SELECT product.name, SUM(product_order.quantity) AS quantity, SUM(product_order.price * product_order.quantity) AS total $res = Yii::$app->db->createCommand("SELECT product.name, SUM(product_order.quantity) AS quantity, SUM(product_order.price * product_order.quantity) AS total
FROM `order`, product_order, product FROM `order`, product_order, product
WHERE `order`.id = product_order.id_order WHERE `order`.id = product_order.id_order
AND product.id_producer = ".((int) Producer::getId())."
AND product.id_producer = ".((int) GlobalParam::getCurrentProducerId()) ."
AND product_order.id_product = product.id AND product_order.id_product = product.id
AND `order`.date_delete IS NULL AND `order`.date_delete IS NULL
".$conditionUsers." ".$conditionUsers."

+ 4
- 3
backend/controllers/SiteController.php View File



namespace backend\controllers; namespace backend\controllers;


use common\helpers\GlobalParam;
use Yii; use Yii;
use yii\filters\AccessControl; use yii\filters\AccessControl;
use yii\web\Controller; use yii\web\Controller;
->with('order') ->with('order')
->where(['>=', 'distribution.date', date('Y-m-d')]) ->where(['>=', 'distribution.date', date('Y-m-d')])
->andWhere([ ->andWhere([
'distribution.id_producer' => Producer::getId(),
'distribution.id_producer' => GlobalParam::getCurrentProducerId(),
'distribution.active' => 1 'distribution.active' => 1
]) ])
->orderBy('date ASC') ->orderBy('date ASC')
->limit(5) ->limit(5)
->all(); ->all();


$usersNegativeCredit = User::findBy(['id_producer' => Producer::getId()])
$usersNegativeCredit = User::findBy(['id_producer' => GlobalParam::getCurrentProducerId()])
->andWhere('user_producer.credit < 0') ->andWhere('user_producer.credit < 0')
->all(); ->all();


// paramètres // paramètres
$producer = Producer::getCurrent();
$producer = GlobalParam::getCurrentProducer();


$productsCount = Product::searchCount() ; $productsCount = Product::searchCount() ;
$pointsSaleCount = PointSale::searchCount() ; $pointsSaleCount = PointSale::searchCount() ;

+ 4
- 3
backend/controllers/StatsController.php View File



namespace backend\controllers; namespace backend\controllers;


use common\helpers\GlobalParam;
use yii\web\Controller; use yii\web\Controller;
use yii\filters\AccessControl; use yii\filters\AccessControl;
use Yii; use Yii;
AND distribution.date >= :date_start AND distribution.date >= :date_start
AND distribution.date <= :date_end AND distribution.date <= :date_end
") ")
->bindValue(':id_producer', Producer::getId())
->bindValue(':id_producer',GlobalParam::getCurrentProducerId())
->bindValue(':date_start', date('Y-m-', $date->getTimestamp()).'01') ->bindValue(':date_start', date('Y-m-', $date->getTimestamp()).'01')
->bindValue(':date_end', date('Y-m-', $date->getTimestamp()).'31' ) ->bindValue(':date_end', date('Y-m-', $date->getTimestamp()).'31' )
->queryOne(); ->queryOne();
// Maximums // Maximums
$resMaximums = Yii::$app->db->createCommand("SELECT product.name, SUM(IF(product_distribution.active, product_distribution.quantity_max,0)) AS total $resMaximums = Yii::$app->db->createCommand("SELECT product.name, SUM(IF(product_distribution.active, product_distribution.quantity_max,0)) AS total
FROM distribution, product_distribution, product FROM distribution, product_distribution, product
WHERE distribution.id_producer = ".Producer::getId()."
WHERE distribution.id_producer = ".GlobalParam::getCurrentProducerId()."
AND distribution.date >= :date_begin AND distribution.date >= :date_begin
AND distribution.date <= :date_end AND distribution.date <= :date_end
AND distribution.id = product_distribution.id_distribution AND distribution.id = product_distribution.id_distribution
$resOrders = Yii::$app->db->createCommand(' $resOrders = Yii::$app->db->createCommand('
SELECT product.name, SUM(product_order.quantity) AS total SELECT product.name, SUM(product_order.quantity) AS total
FROM `distribution`, `order`, `product_order`, `product` FROM `distribution`, `order`, `product_order`, `product`
WHERE distribution.id_producer = '.Producer::getId().'
WHERE distribution.id_producer = '.GlobalParam::getCurrentProducerId().'
AND distribution.date >= :date_begin AND distribution.date >= :date_begin
AND distribution.date <= :date_end AND distribution.date <= :date_end
AND distribution.id = `order`.id_distribution AND distribution.id = `order`.id_distribution

+ 3
- 2
backend/controllers/SubscriptionController.php View File



namespace backend\controllers; namespace backend\controllers;


use common\helpers\GlobalParam;
use common\models\Order ; use common\models\Order ;
use common\models\Product ; use common\models\Product ;
use common\models\SubscriptionSearch ; use common\models\SubscriptionSearch ;
// form // form
$model = new SubscriptionForm; $model = new SubscriptionForm;
$model->isAdmin = true ; $model->isAdmin = true ;
$model->id_producer = Producer::getId();
$model->id_producer = GlobalParam::getCurrentProducerId();


if($idOrder) { if($idOrder) {
$order = Order::searchOne(['id' => $idOrder]); $order = Order::searchOne(['id' => $idOrder]);
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
$productsQuery = Product::find() $productsQuery = Product::find()
->where(['id_producer' => Producer::getId(),]) ;
->where(['id_producer' => GlobalParam::getCurrentProducerId(),]) ;
if($idSubscription) { if($idSubscription) {
$productsQuery->joinWith(['productSubscription' => function($query) use($idSubscription) { $productsQuery->joinWith(['productSubscription' => function($query) use($idSubscription) {

+ 10
- 9
backend/controllers/UserController.php View File



namespace backend\controllers; namespace backend\controllers;


use common\helpers\GlobalParam;
use common\models\User ; use common\models\User ;
use common\models\Producer ; use common\models\Producer ;
use common\models\Distribution ; use common\models\Distribution ;
]) ; ]) ;
$producer = Producer::searchOne([ $producer = Producer::searchOne([
'id' => Producer::getId()
'id' => GlobalParam::getCurrentProducerId()
]) ; ]) ;
$pointsSaleArray = PointSale::searchAll() ; $pointsSaleArray = PointSale::searchAll() ;
// points de vente // points de vente
$pointsSaleArray = PointSale::find() $pointsSaleArray = PointSale::find()
->where([ ->where([
'id_producer' => Producer::getId(),
'id_producer' => GlobalParam::getCurrentProducerId(),
]) ])
->joinWith(['userPointSale' => function($query) use($model) { ->joinWith(['userPointSale' => function($query) use($model) {
if($model->id) { if($model->id) {
// liaison etablissement / user // liaison etablissement / user
$useProducer = new UserProducer(); $useProducer = new UserProducer();
$useProducer->id_user = $model->id; $useProducer->id_user = $model->id;
$useProducer->id_producer = Producer::getId();
$useProducer->id_producer = GlobalParam::getCurrentProducerId();
$useProducer->credit = 0; $useProducer->credit = 0;
$useProducer->active = 1; $useProducer->active = 1;
$useProducer->save(); $useProducer->save();
// Moodification du profil // Moodification du profil
$previousMail = $model->email ; $previousMail = $model->email ;
$user = User::find()->with('userProducer')->where(['id' => $model['id']])->one(); $user = User::find()->with('userProducer')->where(['id' => $model['id']])->one();
$userBelongToProducer = UserProducer::findOne(['id_user' => $id, 'id_producer' => Producer::getId()]);
$userBelongToProducer = UserProducer::findOne(['id_user' => $id, 'id_producer' => GlobalParam::getCurrentProducerId()]);
if (($userBelongToProducer && count($user->userProducer) == 1) || User::getCurrentStatus() == USER::STATUS_ADMIN) { if (($userBelongToProducer && count($user->userProducer) == 1) || User::getCurrentStatus() == USER::STATUS_ADMIN) {
if ($model->load(Yii::$app->request->post()) && $model->save()) { if ($model->load(Yii::$app->request->post()) && $model->save()) {
{ {
$userProducer = UserProducer::findOne([ $userProducer = UserProducer::findOne([
'id_user' => $id, 'id_user' => $id,
'id_producer' => Producer::getId()
'id_producer' => GlobalParam::getCurrentProducerId()
]) ; ]) ;
if($userProducer) { if($userProducer) {
$userProducer->active = 0 ; $userProducer->active = 0 ;
} }
$users = User::findBy([ $users = User::findBy([
'id_producer' => Producer::getId(),
'id_producer' => GlobalParam::getCurrentProducerId(),
'id_point_sale' => $idPointSale, 'id_point_sale' => $idPointSale,
'users_point_sale_link' => $usersPointSaleLink, 'users_point_sale_link' => $usersPointSaleLink,
'users_point_sale_has_order' => $usersPointSaleHasOrder, 'users_point_sale_has_order' => $usersPointSaleHasOrder,
$usersArray[] = $user['email']; $usersArray[] = $user['email'];
} }
$pointsSaleArray = PointSale::find()->where(['id_producer' => Producer::getId()])->all() ;
$pointsSaleArray = PointSale::find()->where(['id_producer' => GlobalParam::getCurrentProducerId()])->all() ;
$pointSale = null ; $pointSale = null ;
if($idPointSale) { if($idPointSale) {
public function actionCredit($id) public function actionCredit($id)
{ {
$user = User::find()->with('userProducer')->where(['id' => $id])->one(); $user = User::find()->with('userProducer')->where(['id' => $id])->one();
$userProducer = UserProducer::findOne(['id_user' => $id, 'id_producer' => Producer::getId()]);
$userProducer = UserProducer::findOne(['id_user' => $id, 'id_producer' => GlobalParam::getCurrentProducerId()]);
if (($userProducer) || User::getCurrentStatus() == User::STATUS_ADMIN) { if (($userProducer) || User::getCurrentStatus() == User::STATUS_ADMIN) {
->with(['order', 'userAction']) ->with(['order', 'userAction'])
->where([ ->where([
'id_user' => $user->id, 'id_user' => $user->id,
'id_producer' => Producer::getId(),
'id_producer' => GlobalParam::getCurrentProducerId(),
]) ])
->orderBy('date DESC') ->orderBy('date DESC')
->all(); ->all();

+ 2
- 1
backend/models/AccessUserProducerForm.php View File



namespace backend\models; namespace backend\models;


use common\helpers\GlobalParam;
use Yii; use Yii;
use yii\base\Model; use yii\base\Model;
use common\models\User ; use common\models\User ;
]) ; ]) ;
if($user) { if($user) {
$user->id_producer = Producer::getId() ;
$user->id_producer = GlobalParam::getCurrentProducerId() ;
if($user->status != User::STATUS_PRODUCER && $user->status != User::STATUS_ADMIN) { if($user->status != User::STATUS_PRODUCER && $user->status != User::STATUS_ADMIN) {
$user->status = User::STATUS_PRODUCER ; $user->status = User::STATUS_PRODUCER ;
} }

+ 3
- 2
backend/models/CreditForm.php View File



namespace backend\models; namespace backend\models;


use common\helpers\GlobalParam;
use Yii; use Yii;
use yii\base\Model; use yii\base\Model;
use common\models\CreditHistory ; use common\models\CreditHistory ;
$creditHistory = new CreditHistory; $creditHistory = new CreditHistory;
$creditHistory->id_user = $this->id_user; $creditHistory->id_user = $this->id_user;
$creditHistory->id_user_action = Yii::$app->user->identity->id; $creditHistory->id_user_action = Yii::$app->user->identity->id;
$creditHistory->id_producer = Producer::getId() ;
$creditHistory->id_producer = GlobalParam::getCurrentProducerId() ;
$creditHistory->type = $this->type ; $creditHistory->type = $this->type ;
$creditHistory->comment = $this->comment ; $creditHistory->comment = $this->comment ;
$creditHistory->amount = $this->amount ; $creditHistory->amount = $this->amount ;
// on prévient l'utilisateur que son compte vient d'être crédité // on prévient l'utilisateur que son compte vient d'être crédité
if($this->send_mail) { if($this->send_mail) {
$user = User::findOne($this->id_user) ; $user = User::findOne($this->id_user) ;
$producer = Producer::getCurrent() ;
$producer = GlobalParam::getCurrentProducer() ;
$userProducer = UserProducer::searchOne([ $userProducer = UserProducer::searchOne([
'id_user' => $this->id_user 'id_user' => $this->id_user
]); ]);

+ 4
- 3
backend/models/MailForm.php View File



namespace backend\models; namespace backend\models;


use common\helpers\GlobalParam;
use Yii; use Yii;
use yii\base\Model; use yii\base\Model;
use common\helpers\Price ; use common\helpers\Price ;
if($distribution) { if($distribution) {
$linkOrder = Yii::$app->urlManagerProducer->createAbsoluteUrl(['order/order','slug_producer' => Producer::getCurrent()->slug, 'date' => $distribution->date]) ;
$linkOrder = Yii::$app->urlManagerProducer->createAbsoluteUrl(['order/order','slug_producer' => GlobalParam::getCurrentProducer()->slug, 'date' => $distribution->date]) ;
$dateOrder = strftime('%A %d %B %Y', strtotime($distribution->date)) ; $dateOrder = strftime('%A %d %B %Y', strtotime($distribution->date)) ;
$messageAutoHtml .= '<a href="'.$linkOrder.'">Passer ma commande du '.$dateOrder.'</a>' ; $messageAutoHtml .= '<a href="'.$linkOrder.'">Passer ma commande du '.$dateOrder.'</a>' ;
$messageAutoText .= 'Suivez ce lien pour passer votre commande du '.$dateOrder.' : $messageAutoText .= 'Suivez ce lien pour passer votre commande du '.$dateOrder.' :
$productsArray = Product::find() $productsArray = Product::find()
->where([ ->where([
'id_producer' => Producer::getId(),
'id_producer' => GlobalParam::getCurrentProducerId(),
]) ])
->innerJoinWith(['productDistribution' => function($query) use($distribution) { ->innerJoinWith(['productDistribution' => function($query) use($distribution) {
$query->andOnCondition([ $query->andOnCondition([
} }
if($fromProducer) { if($fromProducer) {
$producer = Producer::getCurrent() ;
$producer = GlobalParam::getCurrentProducer() ;
$fromEmail = $producer->slug.'@opendistrib.net' ; $fromEmail = $producer->slug.'@opendistrib.net' ;
$fromName = $producer->name ; $fromName = $producer->name ;
} }

+ 164
- 157
backend/views/development/index.php View File

<?php <?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.
*/
/**
* 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\helpers\Html;
use yii\grid\GridView; use yii\grid\GridView;
use common\models\DevelopmentPriority; use common\models\DevelopmentPriority;
use common\models\User; use common\models\User;
use common\helpers\Url; use common\helpers\Url;
use common\helpers\GlobalParam;


$this->setTitle('Développement') ;
$this->addButton(['label' => 'Nouveau développement <span class="glyphicon glyphicon-plus"></span>', 'url' => ['development/create'], 'class' => 'btn btn-primary']) ;
$this->addBreadcrumb($this->getTitle()) ;
$this->setTitle('Développement');
$this->addButton(['label' => 'Nouveau développement <span class="glyphicon glyphicon-plus"></span>', 'url' => ['development/create'], 'class' => 'btn btn-primary']);
$this->addBreadcrumb($this->getTitle());


?> ?>


<div class="development-index">
<div class="development-index">
<div class="well"> <div class="well">
Cette page liste les besoins recencés auprès des producteurs utilisant la plateforme. N'hésitez pas à me <a href="<?= Yii::$app->urlManagerFrontend->createAbsoluteUrl(['site/contact']) ; ?>">contacter</a> pour la faire évoluer. Les remontées de bugs sont également bienvenues.<br />
Afin d'orienter de manière pertinente le développement de la plateforme, je vous invite à définir la priorité des évolutions qui vous intéressent.
Cette page liste les besoins recencés auprès des producteurs utilisant la plateforme. N'hésitez pas à me <a
href="<?= Yii::$app->urlManagerFrontend->createAbsoluteUrl(['site/contact']); ?>">contacter</a> pour la
faire évoluer. Les remontées de bugs sont également bienvenues.<br/>
Afin d'orienter de manière pertinente le développement de la plateforme, je vous invite à définir la priorité
des évolutions qui vous intéressent.
</div> </div>
<ul id="tab-status-developments" class="nav nav-tabs" role="tablist"> <ul id="tab-status-developments" class="nav nav-tabs" role="tablist">
<li role="presentation" class="<?php if($status == Development::STATUS_OPEN): ?>active<?php endif; ?>"><a href="<?= Yii::$app->urlManager->createUrl(['development/index','status' => Development::STATUS_OPEN]); ?>" id="" aria-controls="" role="tab">Ouvert</a></li>
<li role="presentation" class="<?php if($status == Development::STATUS_CLOSED): ?>active<?php endif; ?>"><a href="<?= Yii::$app->urlManager->createUrl(['development/index','status' => Development::STATUS_CLOSED]); ?>" id="" aria-controls="" role="tab">Fermé</a></li>
<li role="presentation" class="<?php if ($status == Development::STATUS_OPEN): ?>active<?php endif; ?>"><a
href="<?= Yii::$app->urlManager->createUrl(['development/index', 'status' => Development::STATUS_OPEN]); ?>"
id="" aria-controls="" role="tab">Ouvert</a></li>
<li role="presentation" class="<?php if ($status == Development::STATUS_CLOSED): ?>active<?php endif; ?>"><a
href="<?= Yii::$app->urlManager->createUrl(['development/index', 'status' => Development::STATUS_CLOSED]); ?>"
id="" aria-controls="" role="tab">Fermé</a></li>
</ul> </ul>
<?php
$columns = [
[
'header' => '#',
'value' => function($model) {
return '#'.$model->id ;
}
],
[
'attribute' => 'type',
'header' => 'Type',
'format' => 'raw',
'value' => function($model) {
if($model->type == Development::TYPE_EVOLUTION) {
return '<span class="label label-success">Évolution</span>' ;
}
else {
return '<span class="label label-danger">Anomalie</span>' ;
}
}
],
[ 'attribute' => 'sujet',
'format' => 'raw',
'value' => function($model) {
$html = '<strong>'.Html::encode($model->subject).'</strong>' ;
if(strlen($model->description))
$html .= '<br />'.nl2br(Html::encode($model->description)) ;
return $html ;
}],
[ 'attribute' => 'estimation_temps',
'header' => 'Estimation',
'format' => 'raw',
'value' => function($model) {
return intval($model->time_estimate).' h' ;
}],
[ 'attribute' => 'avancement',
'format' => 'raw',
'value' => function($model) {
if($model->progress)
return '<div class="progress">
<div class="progress-bar progress-bar-warning" role="progressbar" aria-valuenow="'.intval($model->progress).'" aria-valuemin="0" aria-valuemax="100" style="width: '.intval($model->progress).'%;">
<span class="sr-only">'.intval($model->progress).'% effectué</span>

<?php

$columns = [
[
'header' => '#',
'value' => function ($model) {
return '#' . $model->id;
}
],
[
'attribute' => 'type',
'header' => 'Type',
'format' => 'raw',
'value' => function ($model) {
if ($model->type == Development::TYPE_EVOLUTION) {
return '<span class="label label-success">Évolution</span>';
} else {
return '<span class="label label-danger">Anomalie</span>';
}
}
],
['attribute' => 'sujet',
'format' => 'raw',
'value' => function ($model) {
$html = '<strong>' . Html::encode($model->subject) . '</strong>';
if (strlen($model->description))
$html .= '<br />' . nl2br(Html::encode($model->description));
return $html;
}],
['attribute' => 'estimation_temps',
'header' => 'Estimation',
'format' => 'raw',
'value' => function ($model) {
return intval($model->time_estimate) . ' h';
}],
['attribute' => 'avancement',
'format' => 'raw',
'value' => function ($model) {
if ($model->progress)
return '<div class="progress">
<div class="progress-bar progress-bar-warning" role="progressbar" aria-valuenow="' . intval($model->progress) . '" aria-valuemin="0" aria-valuemax="100" style="width: ' . intval($model->progress) . '%;">
<span class="sr-only">' . intval($model->progress) . '% effectué</span>
</div> </div>
</div> ' ;
else
return '' ;
}],
[ 'attribute' => 'date_delivery',
'format' => 'raw',
'value' => function($model) {
if(strlen($model->date_delivery))
return date('d/m/Y',strtotime($model->date_delivery)) ;
else
return '' ;
}],
] ;
if(User::hasAccessBackend()) {
$columns[] = [
'header' => 'Priorité',
'format' => 'raw',
'value' => function($model) {
$currentPriority = (isset($model->developmentPrioritYCurrentProducer)) ? $model->developmentPriorityCurrentProducer->getStrPriority() : 'Non' ;
$styleButton = (isset($model->developmentPriorityCurrentProducer)) ? $model->developmentPriorityCurrentProducer->getClassCssStyleButton() : 'default' ;
$html = '<div class="btn-group btn-group-priorite">
<button type="button" class="btn btn-priorite btn-sm btn-'.$styleButton.' dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
'.$currentPriority.' <span class="caret"></span>
</div> ';
else
return '';
}],
['attribute' => 'date_delivery',
'format' => 'raw',
'value' => function ($model) {
if (strlen($model->date_delivery))
return date('d/m/Y', strtotime($model->date_delivery));
else
return '';
}],
];
if (User::hasAccessBackend()) {
$columns[] = [
'header' => 'Priorité',
'format' => 'raw',
'value' => function ($model) {
$currentPriority = (isset($model->developmentPrioritYCurrentProducer)) ? $model->developmentPriorityCurrentProducer->getStrPriority() : 'Non';
$styleButton = (isset($model->developmentPriorityCurrentProducer)) ? $model->developmentPriorityCurrentProducer->getClassCssStyleButton() : 'default';
$html = '<div class="btn-group btn-group-priorite">
<button type="button" class="btn btn-priorite btn-sm btn-' . $styleButton . ' dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
' . $currentPriority . ' <span class="caret"></span>
</button> </button>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li><a href="'.Yii::$app->urlManager->createUrl(['development/priority','idDevelopment' => $model->id]).'">Non</a></li>
<li><a href="'.Yii::$app->urlManager->createUrl(['development/priority','idDevelopment' => $model->id, 'priority' => DevelopmentPriority::PRIORITY_LOW]).'">Basse</a></li>
<li><a href="'.Yii::$app->urlManager->createUrl(['development/priority','idDevelopment' => $model->id, 'priority' => DevelopmentPriority::PRIORITY_NORMAL]).'">Normale</a></li>
<li><a href="'.Yii::$app->urlManager->createUrl(['development/priority','idDevelopment' => $model->id, 'priority' => DevelopmentPriority::PRIORITY_HIGH]).'">Haute</a></li>
<li><a href="' . Yii::$app->urlManager->createUrl(['development/priority', 'idDevelopment' => $model->id]) . '">Non</a></li>
<li><a href="' . Yii::$app->urlManager->createUrl(['development/priority', 'idDevelopment' => $model->id, 'priority' => DevelopmentPriority::PRIORITY_LOW]) . '">Basse</a></li>
<li><a href="' . Yii::$app->urlManager->createUrl(['development/priority', 'idDevelopment' => $model->id, 'priority' => DevelopmentPriority::PRIORITY_NORMAL]) . '">Normale</a></li>
<li><a href="' . Yii::$app->urlManager->createUrl(['development/priority', 'idDevelopment' => $model->id, 'priority' => DevelopmentPriority::PRIORITY_HIGH]) . '">Haute</a></li>
</ul> </ul>
</div><br />' ;
if(isset($model->developmentPriority) && count($model->developmentPriority)) {
foreach($model->developmentPriority as $developmentPriority) {
if($developmentPriority->id_producer != Producer::getId())
$html .= '<div class="label label-priorite label-sm label-'.$developmentPriority->getClassCssStyleButton().'">'.Html::encode($developmentPriority->producer->name).'</div> ' ;
</div><br />';

if (isset($model->developmentPriority) && count($model->developmentPriority)) {
foreach ($model->developmentPriority as $developmentPriority) {
if ($developmentPriority->id_producer != GlobalParam::getCurrentProducerId())
$html .= '<div class="label label-priorite label-sm label-' . $developmentPriority->getClassCssStyleButton() . '">' . Html::encode($developmentPriority->producer->name) . '</div> ';
}
}

return $html;
} }
}
return $html ;
}
] ;
];
} }
if(User::getCurrentStatus() == USER::STATUS_ADMIN) {
$columns[] = [
'class' => 'yii\grid\ActionColumn',
'template' => '{update}',
'headerOptions' => ['class' => 'actions'],
'buttons' => [
'update' => function ($url, $model) {
return '<div class="btn-group">
<a href="'.$url.'" class="btn btn-default"><span class="glyphicon glyphicon-pencil"></span> Modifier</a>

if (User::getCurrentStatus() == USER::STATUS_ADMIN) {
$columns[] = [
'class' => 'yii\grid\ActionColumn',
'template' => '{update}',
'headerOptions' => ['class' => 'actions'],
'buttons' => [
'update' => function ($url, $model) {
return '<div class="btn-group">
<a href="' . $url . '" class="btn btn-default"><span class="glyphicon glyphicon-pencil"></span> Modifier</a>
<button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<span class="caret"></span> <span class="caret"></span>
<span class="sr-only">Toggle Dropdown</span> <span class="sr-only">Toggle Dropdown</span>
</button> </button>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li><a href="'.Yii::$app->urlManager->createUrl(['development/delete','id' => $model->id]).'" class=""><span class="glyphicon glyphicon-trash"></span> Supprimer</a></li>
<li><a href="' . Yii::$app->urlManager->createUrl(['development/delete', 'id' => $model->id]) . '" class=""><span class="glyphicon glyphicon-trash"></span> Supprimer</a></li>
</ul> </ul>
</div>' ;
},
],
] ;
}
?>
<?=
GridView::widget([
'id' => 'tab-developments',
'dataProvider' => $dataProvider,
'columns' => $columns
]);
?>
</div>';
},
],
];
}
?>
<?=
GridView::widget([
'id' => 'tab-developments',
'dataProvider' => $dataProvider,
'columns' => $columns
]);
?>
</div> </div>

+ 1
- 1
backend/views/distribution/index.php View File

<div id="summary-ca-weight" class="info-box col-md-4"> <div id="summary-ca-weight" class="info-box col-md-4">
<span class="info-box-icon bg-yellow"><i class="fa fa-euro"></i></span> <span class="info-box-icon bg-yellow"><i class="fa fa-euro"></i></span>
<div class="info-box-content"> <div class="info-box-content">
<span class="info-box-text">CA</span>
<span class="info-box-text">CA (TTC)</span>
<span class="info-box-number">{{ distribution.revenues }} <span class="normal" v-if="distribution.potential_revenues != '0.00 €'">/ {{ distribution.potential_revenues }}</span></span> <span class="info-box-number">{{ distribution.revenues }} <span class="normal" v-if="distribution.potential_revenues != '0.00 €'">/ {{ distribution.potential_revenues }}</span></span>
<span class="info-box-text">Poids</span> <span class="info-box-text">Poids</span>
<span class="info-box-number">{{ distribution.weight }} kg <span class="normal" v-if="distribution.potential_weight > 0">/ {{ distribution.potential_weight }} kg</span></span> <span class="info-box-number">{{ distribution.weight }} kg <span class="normal" v-if="distribution.potential_weight > 0">/ {{ distribution.potential_weight }} kg</span></span>

+ 207
- 190
backend/views/layouts/header.php View File

<?php <?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.
*/
/**
* 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\helpers\Html;
use common\models\Producer; use common\models\Producer;
use common\models\User; use common\models\User;
use yii\widgets\ActiveForm; use yii\widgets\ActiveForm;
use yii\helpers\ArrayHelper; use yii\helpers\ArrayHelper;
use common\helpers\GlobalParam;


/* @var $this \yii\web\View */ /* @var $this \yii\web\View */
/* @var $content string */ /* @var $content string */


$producer = Producer::getCurrent() ;
$producer = GlobalParam::getCurrentProducer();


?> ?>


<header class="main-header"> <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']) ?>


<nav class="navbar navbar-static-top" role="navigation"> <nav class="navbar navbar-static-top" role="navigation">


</a> </a>


<div class="navbar-custom-menu"> <div class="navbar-custom-menu">
<?php
$usersArray = User::findBy(['id_producer' => Producer::getId()])
->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
$pastDistributionsArray = Distribution::find()
->where(['<', 'distribution.date', date('Y-m-d')])
->andWhere([
'distribution.id_producer' => Producer::getId(),
'distribution.active' => 1
])
->orderBy('date DESC')
->limit(3)
->all();
$pastDistributionsArray = array_reverse($pastDistributionsArray) ;
$incomingDistributionsArray = Distribution::find()
->where(['>=', 'distribution.date', date('Y-m-d')])
->andWhere([
'distribution.id_producer' => Producer::getId(),
'distribution.active' => 1
])
->orderBy('date ASC')
->limit(20)
->all();
<?php

$usersArray = User::findBy(['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

$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);

$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"> <li class="dropdown distributions-menu notifications-menu">
<a href="#" class="dropdown-toggle" data-toggle="dropdown"> <a href="#" class="dropdown-toggle" data-toggle="dropdown">
<i class="fa fa-calendar"></i> <i class="fa fa-calendar"></i>
</a> </a>
<ul class="dropdown-menu"> <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): ?>

<?php if (count($pastDistributionsArray)): ?>
<li class="header">3 dernières distributions :</li>
<li> <li>
<a href="<?= Yii::$app->urlManagerBackend->createUrl(['distribution/index','date' => $distribution->date]) ; ?>">
<h5><?= strftime('%A %d %B', strtotime($distribution->date)) ?></h5>
</a>
<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> </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): ?>
<?php endif; ?>

<?php if (count($incomingDistributionsArray)): ?>
<li class="header">Prochaines distributions :</li>
<li> <li>
<a href="<?= Yii::$app->urlManagerBackend->createUrl(['distribution/index','date' => $distribution->date]) ; ?>">
<h5><?= strftime('%A %d %B', strtotime($distribution->date)) ?></h5>
</a>
<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> </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 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> </ul>
</li> </li>
<li class="dropdown users-menu notifications-menu"> <li class="dropdown users-menu notifications-menu">
<a href="#" class="dropdown-toggle" data-toggle="dropdown"> <a href="#" class="dropdown-toggle" data-toggle="dropdown">
<i class="fa fa-user-plus"></i> <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> </a>
<ul class="dropdown-menu"> <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): ?>
<?php if (count($usersArray)): ?>
<li class="header">Inscriptions des 7 derniers jours</li>
<li> <li>
<a href="<?= Yii::$app->urlManagerBackend->createUrl(['user/update','id' => $user['user_id']]) ; ?>">
<h5><?= Html::encode($user['name'].' '.$user['lastname']) ; ?> <small><i class="fa fa-clock-o"></i> <?= date('d/m/Y à H:i',$user['created_at']); ?></small></h5>
</a>
<ul class="menu">
<?php foreach ($usersArray as $user): ?>
<li>
<a href="<?= Yii::$app->urlManagerBackend->createUrl(['user/update', 'id' => $user['user_id']]); ?>">
<h5><?= Html::encode($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> </li>
<?php endforeach; ?>
</ul>
</li>
<?php else: ?>
<li class="header">Aucun nouvel inscrit ces 7 derniers jours.</li>
<?php endif; ?>
<?php else: ?>
<li class="header">Aucun nouvel inscrit ces 7 derniers jours.</li>
<?php endif; ?>
</ul> </ul>
</li> </li>
<?php
$usersNegativeCreditArray = User::findBy(['id_producer' => Producer::getId()])
->andWhere('user_producer.credit < 0')
->orderBy('lastname, name ASC')
->all();


?>
<?php

$usersNegativeCreditArray = User::findBy(['id_producer' => GlobalParam::getCurrentProducerId()])
->andWhere('user_producer.credit < 0')
->orderBy('lastname, name ASC')
->all();

?>

<li class="dropdown users-negative-credit-menu notifications-menu"> <li class="dropdown users-negative-credit-menu notifications-menu">
<a href="#" class="dropdown-toggle" data-toggle="dropdown"> <a href="#" class="dropdown-toggle" data-toggle="dropdown">
<i class="fa fa-euro"></i> <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> </a>
<ul class="dropdown-menu"> <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): ?>
<?php if (count($usersNegativeCreditArray)): ?>
<li class="header">Utilisateurs au crédit négatif</li>
<li> <li>
<a href="<?= Yii::$app->urlManagerBackend->createUrl(['user/credit','id' => $user['user_id']]) ; ?>">
<h5><?= Html::encode($user['name'].' '.$user['lastname']) ; ?> <small><i class="fa fa-euro"></i> <?= Price::format($user['credit']); ?></small></h5>
</a>
<ul class="menu">
<?php foreach ($usersNegativeCreditArray as $user): ?>
<li>
<a href="<?= Yii::$app->urlManagerBackend->createUrl(['user/credit', 'id' => $user['user_id']]); ?>">
<h5><?= Html::encode($user['name'] . ' ' . $user['lastname']); ?>
<small>
<i class="fa fa-euro"></i> <?= Price::format($user['credit']); ?>
</small>
</h5>
</a>
</li>
<?php endforeach; ?>
</ul>
</li> </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 (User::isCurrentProducer() || User::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: ?> <?php else: ?>
<span class="label label-danger">Hors-ligne</span>
<li class="header">Aucun de vos utilisateurs n'a de crédit négatif.</li>
<?php endif; ?> <?php endif; ?>
<span><?= Html::encode(Yii::$app->user->identity->getNameProducer()); ?></span>
<i class="fa fa-caret-down"></i>
</a>
<ul class="dropdown-menu">
<?php if(User::isCurrentAdmin()): ?>
<li>
<a href="<?= Yii::$app->urlManagerProducer->createAbsoluteUrl(['site/index','slug_producer' => Producer::getCurrent()->slug]); ?>">
<i class="fa fa-th-large"></i>
<span class="hidden-xs">Espace du producteur</span>
</a>
</li>
<li class="header">&nbsp;<strong>Autres producteurs</strong></li>
<?php $producersArray = Producer::find()->orderBy('name ASC')->all(); ?>
<?php foreach($producersArray as $producer): ?>
<li><a href="<?= Yii::$app->urlManagerBackend->createUrl(['site/change-producer', 'id' => $producer->id]); ?>"><?= Html::encode($producer->name) ?></a></li>
<?php endforeach; ?>
<?php else: ?>
<li>
<a href="<?= Yii::$app->urlManagerProducer->createAbsoluteUrl(['site/index','slug_producer' => Producer::getCurrent()->slug]); ?>">
<i class="fa fa-th-large"></i>
<span class="hidden-xs">Mon espace</span>
</a>
</li>
<?php endif; ?>
</ul>
</li>
<?php endif; ?>
</ul>

</li>

<?php if (User::isCurrentProducer() || User::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(Yii::$app->user->identity->getNameProducer()); ?></span>
<i class="fa fa-caret-down"></i>
</a>

<ul class="dropdown-menu">
<?php if (User::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>Autres producteurs</strong></li>
<?php $producersArray = Producer::find()->orderBy('name ASC')->all(); ?>
<?php foreach ($producersArray as $producer): ?>
<li>
<a href="<?= Yii::$app->urlManagerBackend->createUrl(['site/change-producer', 'id' => $producer->id]); ?>"><?= Html::encode($producer->name) ?></a>
</li>
<?php endforeach; ?>
<?php else: ?>
<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>
</li>
<?php endif; ?>
</ul>
</li>
<?php endif; ?>

<li class="dropdown user user-menu"> <li class="dropdown user user-menu">
<a href="#" class="dropdown-toggle" data-toggle="dropdown"> <a href="#" class="dropdown-toggle" data-toggle="dropdown">
<i class="fa fa-user"></i> <i class="fa fa-user"></i>
<span class="hidden-xs"><?= Html::encode(User::getCurrent()->name.' '.User::getCurrent()->lastname) ; ?></span>
<span class="hidden-xs"><?= Html::encode(User::getCurrent()->name . ' ' . User::getCurrent()->lastname); ?></span>
<i class="fa fa-caret-down"></i> <i class="fa fa-caret-down"></i>
</a> </a>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li><a href="<?= Yii::$app->urlManagerFrontend->createAbsoluteUrl(['user/update']); ?>"><i class="fa fa-user"></i> Profil</a></li>
<li><a href="<?= Yii::$app->urlManagerBackend->createUrl(['site/logout']); ?>"><i class="fa fa-sign-out"></i> Déconnexion</a></li>
<li><a href="<?= Yii::$app->urlManagerFrontend->createAbsoluteUrl(['user/update']); ?>"><i
class="fa fa-user"></i> Profil</a></li>
<li><a href="<?= Yii::$app->urlManagerBackend->createUrl(['site/logout']); ?>"><i
class="fa fa-sign-out"></i> Déconnexion</a></li>
</ul> </ul>
</li> </li>


<li class="link-control-sidebar"> <li class="link-control-sidebar">
<a href="#" data-toggle="control-sidebar"><i class="fa fa-gears"></i></a> <a href="#" data-toggle="control-sidebar"><i class="fa fa-gears"></i></a>
</li> </li>
</ul> </ul>
</div> </div>
</nav> </nav>

+ 215
- 207
backend/views/layouts/main-old.php View File

<?php <?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.
*/
/**
* 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\helpers\Html;
use yii\bootstrap\Nav; use yii\bootstrap\Nav;
use yii\widgets\ActiveForm; use yii\widgets\ActiveForm;
use yii\helpers\ArrayHelper; use yii\helpers\ArrayHelper;
use common\helpers\Url; use common\helpers\Url;
use common\helpers\GlobalParam;


/* @var $this \yii\web\View */ /* @var $this \yii\web\View */
/* @var $content string */ /* @var $content string */
\common\assets\CommonAsset::register($this); \common\assets\CommonAsset::register($this);
\backend\assets\AppAsset::register($this); \backend\assets\AppAsset::register($this);


$producer = null ;
if(!Yii::$app->user->isGuest) {
$producer = Producer::findOne(Producer::getId()) ;
$producer = null;
if (!Yii::$app->user->isGuest) {
$producer = Producer::findOne(GlobalParam::getCurrentProducerId());
} }


?> ?>
<?php $this->beginPage() ?> <?php $this->beginPage() ?>
<!DOCTYPE html> <!DOCTYPE html>
<html lang="<?= Yii::$app->language ?>"> <html lang="<?= Yii::$app->language ?>">
<head>
<meta charset="<?= Yii::$app->charset ?>">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="baseurl" content="<?= Yii::$app->urlManagerBackend->baseUrl ; ?>">
<meta name="baseurl-absolute" content="<?= Yii::$app->urlManagerBackend->getHostInfo().Yii::$app->urlManagerBackend->baseUrl; ?>">
<link rel="icon" type="image/png" href="<?php echo Yii::$app->urlManager->getBaseUrl(); ?>/img/favicon3.png" />
<head>
<meta charset="<?= Yii::$app->charset ?>">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="baseurl" content="<?= Yii::$app->urlManagerBackend->baseUrl; ?>">
<meta name="baseurl-absolute"
content="<?= Yii::$app->urlManagerBackend->getHostInfo() . Yii::$app->urlManagerBackend->baseUrl; ?>">
<link rel="icon" type="image/png" href="<?php echo Yii::$app->urlManager->getBaseUrl(); ?>/img/favicon3.png"/>
<?= Html::csrfMetaTags() ?> <?= Html::csrfMetaTags() ?>
<title><?= Html::encode($this->title) ?> - distrib</title>
<?php $this->head() ?>
</head>
<body>
<?php $this->beginBody() ?>
<div class="wrap">
<?php
NavBar::begin([
<title><?= Html::encode($this->title) ?> - distrib</title>
<?php $this->head() ?>
</head>
<body>
<?php $this->beginBody() ?>
<div class="wrap">
<?php
NavBar::begin([
'brandLabel' => '<img class="logo" src="' . Yii::$app->urlManager->getBaseUrl() . '/img/laboulange3.png" />', 'brandLabel' => '<img class="logo" src="' . Yii::$app->urlManager->getBaseUrl() . '/img/laboulange3.png" />',
'brandUrl' => Yii::$app->homeUrl, 'brandUrl' => Yii::$app->homeUrl,
'innerContainerOptions' => ['class' => 'container-fluid'], 'innerContainerOptions' => ['class' => 'container-fluid'],
'options' => [ 'options' => [
'class' => 'navbar-inverse navbar-fixed-top nav-header',
'class' => 'navbar-inverse navbar-fixed-top nav-header',
], ],
]);
]);


$menuItems = [
$menuItems = [
[ [
'label' => '<span class="glyphicon glyphicon-home"></span> Tableau de bord',
'url' => ['/site/index'],
'visible' => !Yii::$app->user->isGuest
'label' => '<span class="glyphicon glyphicon-home"></span> Tableau de bord',
'url' => ['/site/index'],
'visible' => !Yii::$app->user->isGuest
], ],
[ [
'label' => '<span class="glyphicon glyphicon-calendar"></span> Commandes',
'url' => ['/order/index'],
'visible' => !Yii::$app->user->isGuest,
'items' => [
[
'label' => '<span class="glyphicon glyphicon-calendar"></span> Toutes les commandes',
'url' => ['/order/index'],
'visible' => !Yii::$app->user->isGuest
],
[
'label' => '<span class="glyphicon glyphicon-repeat"></span> Abonnements',
'url' => ['/subscription/index'],
'visible' => !Yii::$app->user->isGuest
],
]
'label' => '<span class="glyphicon glyphicon-calendar"></span> Commandes',
'url' => ['/order/index'],
'visible' => !Yii::$app->user->isGuest,
'items' => [
[
'label' => '<span class="glyphicon glyphicon-calendar"></span> Toutes les commandes',
'url' => ['/order/index'],
'visible' => !Yii::$app->user->isGuest
],
[
'label' => '<span class="glyphicon glyphicon-repeat"></span> Abonnements',
'url' => ['/subscription/index'],
'visible' => !Yii::$app->user->isGuest
],
]
], ],
[ [
'label' => '<span class="glyphicon glyphicon-grain"></span> Produits',
'url' => ['/product/index'],
'visible' => !Yii::$app->user->isGuest
'label' => '<span class="glyphicon glyphicon-grain"></span> Produits',
'url' => ['/product/index'],
'visible' => !Yii::$app->user->isGuest
], ],
[ [
'label' => '<span class="glyphicon glyphicon-map-marker"></span> Points de vente',
'url' => ['/point-sale/index'],
'visible' => !Yii::$app->user->isGuest
'label' => '<span class="glyphicon glyphicon-map-marker"></span> Points de vente',
'url' => ['/point-sale/index'],
'visible' => !Yii::$app->user->isGuest
], ],
[ [
'label' => '<span class="glyphicon glyphicon-user"></span> Clients',
'url' => ['/user/index'],
'visible' => !Yii::$app->user->isGuest
'label' => '<span class="glyphicon glyphicon-user"></span> Clients',
'url' => ['/user/index'],
'visible' => !Yii::$app->user->isGuest
], ],
[ [
'label' => '<span class="glyphicon glyphicon-plus"></span>',
'url' => ['/producer/update'],
'visible' => !Yii::$app->user->isGuest,
'items' => [
[
'label' => '<span class="glyphicon glyphicon-cog"></span> Paramètres',
'url' => ['/producer/update'],
'visible' => !Yii::$app->user->isGuest
],
[
'label' => '<span class="glyphicon glyphicon-bullhorn"></span> Communiquer',
'url' => ['/communicate/index'],
'visible' => !Yii::$app->user->isGuest
],
[
'label' => '<span class="glyphicon glyphicon-euro"></span> Mon abonnement',
'url' => ['/producer/billing'],
'visible' => !Yii::$app->user->isGuest,
],
[
'label' => '<span class="glyphicon glyphicon-stats"></span> Statistiques',
'url' => ['/stats/index'],
'visible' => !Yii::$app->user->isGuest,
],
[
'label' => '<span class="glyphicon glyphicon-stats"></span> Statistiques produits',
'url' => ['/stats/products'],
'visible' => !Yii::$app->user->isGuest,
],
[
'label' => '<span class="glyphicon glyphicon-wrench"></span> Développement',
'url' => ['/development/index'],
'visible' => !Yii::$app->user->isGuest
'label' => '<span class="glyphicon glyphicon-plus"></span>',
'url' => ['/producer/update'],
'visible' => !Yii::$app->user->isGuest,
'items' => [
[
'label' => '<span class="glyphicon glyphicon-cog"></span> Paramètres',
'url' => ['/producer/update'],
'visible' => !Yii::$app->user->isGuest
],
[
'label' => '<span class="glyphicon glyphicon-bullhorn"></span> Communiquer',
'url' => ['/communicate/index'],
'visible' => !Yii::$app->user->isGuest
],
[
'label' => '<span class="glyphicon glyphicon-euro"></span> Mon abonnement',
'url' => ['/producer/billing'],
'visible' => !Yii::$app->user->isGuest,
],
[
'label' => '<span class="glyphicon glyphicon-stats"></span> Statistiques',
'url' => ['/stats/index'],
'visible' => !Yii::$app->user->isGuest,
],
[
'label' => '<span class="glyphicon glyphicon-stats"></span> Statistiques produits',
'url' => ['/stats/products'],
'visible' => !Yii::$app->user->isGuest,
],
[
'label' => '<span class="glyphicon glyphicon-wrench"></span> Développement',
'url' => ['/development/index'],
'visible' => !Yii::$app->user->isGuest
],
], ],
],
] ]
];
];


if (Yii::$app->user->isGuest) {
if (Yii::$app->user->isGuest) {
$menuItems[] = ['label' => 'Connexion', 'url' => ['/site/login']]; $menuItems[] = ['label' => 'Connexion', 'url' => ['/site/login']];
} else {
} else {


if (Yii::$app->user->identity->status == USER::STATUS_ADMIN) { if (Yii::$app->user->identity->status == USER::STATUS_ADMIN) {
$menuItems[] = [
'label' => '<span class="glyphicon glyphicon-asterisk"></span>',
'url' => '#',
'items' => [
[
'label' => '<span class="glyphicon glyphicon-th-list"></span> Producteurs',
'url' => ['producer-admin/index'],
'visible' => !Yii::$app->user->isGuest,
],
[
'label' => '<span class="glyphicon glyphicon-euro"></span> Facturation',
'url' => ['producer-admin/billing'],
'visible' => false,
],
]
];
$menuItems[] = [
'label' => '<span class="glyphicon glyphicon-asterisk"></span>',
'url' => '#',
'items' => [
[
'label' => '<span class="glyphicon glyphicon-th-list"></span> Producteurs',
'url' => ['producer-admin/index'],
'visible' => !Yii::$app->user->isGuest,
],
[
'label' => '<span class="glyphicon glyphicon-euro"></span> Facturation',
'url' => ['producer-admin/billing'],
'visible' => false,
],
]
];
} }


$menuItems[] = [ $menuItems[] = [
'label' => '<span class="glyphicon glyphicon-off"></span>',
'url' => ['/site/logout'],
'linkOptions' => ['data-method' => 'post', 'title' => 'Déconnexion']
'label' => '<span class="glyphicon glyphicon-off"></span>',
'url' => ['/site/logout'],
'linkOptions' => ['data-method' => 'post', 'title' => 'Déconnexion']
]; ];


$menuItems[] = [ $menuItems[] = [
'label' => '<span class="retour-site">Retour sur le site</span>',
'url' => Yii::$app->urlManagerProducer->createAbsoluteUrl(['site/index','slug_producer' => $producer->slug]),
'label' => '<span class="retour-site">Retour sur le site</span>',
'url' => Yii::$app->urlManagerProducer->createAbsoluteUrl(['site/index', 'slug_producer' => $producer->slug]),
]; ];
}
echo Nav::widget([
}
echo Nav::widget([
'options' => ['class' => 'navbar-nav navbar-right'], 'options' => ['class' => 'navbar-nav navbar-right'],
'items' => $menuItems, 'items' => $menuItems,
'encodeLabels' => false 'encodeLabels' => false
]);
NavBar::end();
?>
]);
NavBar::end();
?>


<div class="container-fluid container-body">
<?php if (YII_ENV == 'dev' || YII_ENV == 'demo'): ?>
<div id="env-dev"><?php if (YII_ENV == 'dev'): ?>Dév.<?php elseif (YII_ENV == 'demo'): ?>Démo<?php endif; ?></div>
<?php endif; ?>
<?php if (!Yii::$app->user->isGuest): ?>
<div class="name-producer">
<div class="container-fluid container-body">
<?php if (YII_ENV == 'dev' || YII_ENV == 'demo'): ?>
<div id="env-dev"><?php if (YII_ENV == 'dev'): ?>Dév.<?php elseif (YII_ENV == 'demo'): ?>Démo<?php endif; ?></div>
<?php endif; ?>
<?php if (!Yii::$app->user->isGuest): ?>
<div class="name-producer">
<?php if (User::getCurrentStatus() == User::STATUS_PRODUCER): ?> <?php if (User::getCurrentStatus() == User::STATUS_PRODUCER): ?>
<span><?= Html::encode(Yii::$app->user->identity->getNameProducer()); ?></span> <span><?= Html::encode(Yii::$app->user->identity->getNameProducer()); ?></span>
<?php elseif (User::getCurrentStatus() == User::STATUS_ADMIN): ?> <?php elseif (User::getCurrentStatus() == User::STATUS_ADMIN): ?>
<?php $form = ActiveForm::begin(['id' => 'select-producer']); ?>
<?=
Html::dropDownList('select_producer', Producer::getId(), ArrayHelper::map(Producer::find()->orderBy('name ASC')->all(), 'id', function($model, $defaultValue) {
return $model->name;
}));
?>
<?php ActiveForm::end(); ?>
<?php $form = ActiveForm::begin(['id' => 'select-producer']); ?>
<?=
Html::dropDownList('select_producer', GlobalParam::getCurrentProducerId(), ArrayHelper::map(Producer::find()->orderBy('name ASC')->all(), 'id', function ($model, $defaultValue) {
return $model->name;
}));
?>
<?php ActiveForm::end(); ?>
<?php endif; ?> <?php endif; ?>


<?php <?php
$producer = Producer::findOne(Producer::getId());
$producer = Producer::findOne(GlobalParam::getCurrentProducerId());
if (!$producer->active): if (!$producer->active):
?>
<span class="label label-danger" data-toggle="tooltip" data-placement="bottom" data-original-title="Activez votre établissement quand vous le souhaitez afin de la rendre visible à vos clients.">
?>
<span class="label label-danger" data-toggle="tooltip" data-placement="bottom"
data-original-title="Activez votre établissement quand vous le souhaitez afin de la rendre visible à vos clients.">
<?= Html::a('Hors-ligne', ['producer/update']); ?> <?= Html::a('Hors-ligne', ['producer/update']); ?>
</span> </span>
<?php endif; ?> <?php endif; ?>


<div class="clr"></div>
</div>
<?php endif; ?>
<div class="clr"></div>
</div>
<?php endif; ?>


<?php if (YII_ENV == 'demo'): ?>
<div id="block-demo">
<div class="container-fluid">
<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>
<?php if (YII_ENV == 'demo'): ?>
<div id="block-demo">
<div class="container-fluid">
<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; ?>
</div>
<?php endif; ?>


<?=
Breadcrumbs::widget([
<?=
Breadcrumbs::widget([
'links' => isset($this->params['breadcrumbs']) ? $this->params['breadcrumbs'] : [], 'links' => isset($this->params['breadcrumbs']) ? $this->params['breadcrumbs'] : [],
])
?>
<?= $content ?>
</div>
</div>
])
?>
<?= $content ?>
</div>
</div>


<div id="alerts-fixed"></div>
<div id="alerts-fixed"></div>


<footer class="footer">
<div class="container-fluid">
<p class="pull-left">
<a href="<?php echo Url::frontend('site/contact'); ?>">Contact</a> &bull;
<a href="<?php echo Url::frontend('site/mentions'); ?>">Mentions légales</a> &bull;
<a href="<?php echo Url::frontend('site/cgv'); ?>">CGS</a>
<a id="code-source" href="https://framagit.org/guillaume-bourgeois/laboiteapain">Code source <img src="<?php echo Yii::$app->urlManager->getBaseUrl(); ?>/img/logo-framagit.png" alt="Hébergé par Framasoft" /> <img src="<?php echo Yii::$app->urlManager->getBaseUrl(); ?>/img/logo-gitlab.png" alt="Propulsé par Gitlab" /></a>
</p>
<p class="pull-right"><?= Yii::powered() ?></p>
</div>
</footer>
<footer class="footer">
<div class="container-fluid">
<p class="pull-left">
<a href="<?php echo Url::frontend('site/contact'); ?>">Contact</a> &bull;
<a href="<?php echo Url::frontend('site/mentions'); ?>">Mentions légales</a> &bull;
<a href="<?php echo Url::frontend('site/cgv'); ?>">CGS</a>
<a id="code-source" href="https://framagit.org/guillaume-bourgeois/laboiteapain">Code source <img
src="<?php echo Yii::$app->urlManager->getBaseUrl(); ?>/img/logo-framagit.png"
alt="Hébergé par Framasoft"/> <img
src="<?php echo Yii::$app->urlManager->getBaseUrl(); ?>/img/logo-gitlab.png"
alt="Propulsé par Gitlab"/></a>
</p>
<p class="pull-right"><?= Yii::powered() ?></p>
</div>
</footer>


<?php $this->endBody() ?> <?php $this->endBody() ?>


<!-- analytics -->
<script>
(function (i, s, o, g, r, a, m) {
i['GoogleAnalyticsObject'] = r;
i[r] = i[r] || function () {
(i[r].q = i[r].q || []).push(arguments)
}, i[r].l = 1 * new Date();
a = s.createElement(o),
m = s.getElementsByTagName(o)[0];
a.async = 1;
a.src = g;
m.parentNode.insertBefore(a, m)
})(window, document, 'script', 'https://www.google-analytics.com/analytics.js', 'ga');
<!-- analytics -->
<script>
(function (i, s, o, g, r, a, m) {
i['GoogleAnalyticsObject'] = r;
i[r] = i[r] || function () {
(i[r].q = i[r].q || []).push(arguments)
}, i[r].l = 1 * new Date();
a = s.createElement(o),
m = s.getElementsByTagName(o)[0];
a.async = 1;
a.src = g;
m.parentNode.insertBefore(a, m)
})(window, document, 'script', 'https://www.google-analytics.com/analytics.js', 'ga');


ga('create', 'UA-86917043-1', 'auto');
ga('send', 'pageview');
</script>
</body>
ga('create', 'UA-86917043-1', 'auto');
ga('send', 'pageview');
</script>
</body>
</html> </html>
<?php $this->endPage() ?> <?php $this->endPage() ?>

+ 3
- 2
backend/views/product/_form.php View File

use yii\helpers\ArrayHelper; use yii\helpers\ArrayHelper;
use common\models\TaxRate; use common\models\TaxRate;
use common\models\Producer; use common\models\Producer;
use common\helpers\GlobalParam;


/* @var $this yii\web\View */ /* @var $this yii\web\View */
/* @var $model app\models\Produit */ /* @var $model app\models\Produit */
<?php <?php


//Récupère la tva par défaut du producteur courant //Récupère la tva par défaut du producteur courant
$producer = Producer::searchOne(['id' => Producer::getId()]);
$taxRateDefault = TaxRate::searchOne(['id' => $producer->id_tax_rate_default]);
$producer = \common\helpers\GlobalParam::getCurrentProducer();
$taxRateDefault = $producer->taxRate;


$taxRateNamesArray = array_merge(array(0 => 'Tva par défaut'), ArrayHelper::map(TaxRate::find()->all(), 'id', function ($model) { $taxRateNamesArray = array_merge(array(0 => 'Tva par défaut'), ArrayHelper::map(TaxRate::find()->all(), 'id', function ($model) {
return $model->name; return $model->name;

+ 3
- 3
backend/views/product/index.php View File

use common\models\Product; use common\models\Product;
use common\models\TaxRate; use common\models\TaxRate;
use common\models\Producer; use common\models\Producer;
use common\helpers\GlobalParam;


$this->setTitle('Produits'); $this->setTitle('Produits');
$this->addBreadcrumb($this->getTitle()); $this->addBreadcrumb($this->getTitle());
if ($model->id_tax_rate == 0 || $model->id_tax_rate == null) { if ($model->id_tax_rate == 0 || $model->id_tax_rate == null) {


//Récupère la tva par défaut du producteur courant //Récupère la tva par défaut du producteur courant
$producer = Producer::searchOne(['id'=> Producer::getId()]);
$taxRate = TaxRate::searchOne(['id'=> $producer->id_tax_rate_default]);
$taxRateDefault = GlobalParam::getCurrentProducer()->taxRate;


$return = $taxRate->name;
$return = $taxRateDefault->name;
} else { } else {


$return = $model->taxRate->name; $return = $model->taxRate->name;

+ 3
- 2
backend/views/subscription/_form.php View File

use yii\helpers\ArrayHelper ; use yii\helpers\ArrayHelper ;
use common\models\User ; use common\models\User ;
use common\models\PointSale ; use common\models\PointSale ;
use common\helpers\GlobalParam ;


\backend\assets\VuejsSubscriptionFormAsset::register($this); \backend\assets\VuejsSubscriptionFormAsset::register($this);


<?= $form->field($model, 'id')->hiddenInput() ?> <?= $form->field($model, 'id')->hiddenInput() ?>
<?php endif; ?> <?php endif; ?>
<div class="col-md-5" id="bloc-select-user"> <div class="col-md-5" id="bloc-select-user">
<?= $form->field($model, 'id_user')->dropDownList( ArrayHelper::map(User::find()->joinWith('userProducer')->where('user_producer.id_producer = '.Producer::getId())->andWhere('user_producer.active = 1')->orderBy('lastname ASC, name ASC')->all(), 'id', function($model, $defaultValue) {
<?= $form->field($model, 'id_user')->dropDownList( ArrayHelper::map(User::find()->joinWith('userProducer')->where('user_producer.id_producer = '.GlobalParam::getCurrentProducerId())->andWhere('user_producer.active = 1')->orderBy('lastname ASC, name ASC')->all(), 'id', function($model, $defaultValue) {
return $model['lastname'].' '.$model['name']; return $model['lastname'].' '.$model['name'];
}), ['prompt' => '--','class' => 'form-control user-id', ]) ?> }), ['prompt' => '--','class' => 'form-control user-id', ]) ?>
</div> </div>
<div class="clr"></div> <div class="clr"></div>
<?= $form->field($model, 'id_producer')->hiddenInput() ?> <?= $form->field($model, 'id_producer')->hiddenInput() ?>
<?= $form->field($model, 'id_point_sale')->dropDownList(ArrayHelper::map(PointSale::find()->where('id_producer = '.Producer::getId())->all(), 'id', function($model, $defaultValue) {
<?= $form->field($model, 'id_point_sale')->dropDownList(ArrayHelper::map(PointSale::find()->where('id_producer = '.GlobalParam::getCurrentProducerId())->all(), 'id', function($model, $defaultValue) {
return $model['name']; return $model['name'];
}), ['prompt' => '--','class' => 'form-control user-id']) ?> }), ['prompt' => '--','class' => 'form-control user-id']) ?>
<?= $form->field($model, 'date_begin') ?> <?= $form->field($model, 'date_begin') ?>

+ 2
- 1
backend/views/subscription/index.php View File

use yii\helpers\Html; use yii\helpers\Html;
use yii\grid\GridView; use yii\grid\GridView;
use common\models\Product ; use common\models\Product ;
use common\helpers\GlobalParam ;




$this->setTitle('Abonnements') ; $this->setTitle('Abonnements') ;
'attribute' => 'id_point_sale', 'attribute' => 'id_point_sale',
'label' => 'Point de vente', 'label' => 'Point de vente',
'format' => 'raw', 'format' => 'raw',
'filter' => ArrayHelper::map(PointSale::find()->where(['id_producer' => Producer::getId()])->asArray()->all(), 'id', 'name'),
'filter' => ArrayHelper::map(PointSale::find()->where(['id_producer' => GlobalParam::getCurrentProducerId()])->asArray()->all(), 'id', 'name'),
'value' => function($model) { 'value' => function($model) {
return Html::encode($model->pointSale->name) ; return Html::encode($model->pointSale->name) ;
} }

+ 2
- 1
backend/views/user/credit.php View File

use yii\widgets\ActiveForm; use yii\widgets\ActiveForm;
use common\models\CreditHistory; use common\models\CreditHistory;
use common\models\Producer; use common\models\Producer;
use common\helpers\GlobalParam;


$this->setTitle('Créditer <small>'.Html::encode($user->lastname.' '.$user->name).'</small>', 'Créditer '.Html::encode($user->lastname.' '.$user->name)) ; $this->setTitle('Créditer <small>'.Html::encode($user->lastname.' '.$user->name).'</small>', 'Créditer '.Html::encode($user->lastname.' '.$user->name)) ;
$this->addBreadcrumb(['label' => 'Utilisateurs', 'url' => ['index']]) ; $this->addBreadcrumb(['label' => 'Utilisateurs', 'url' => ['index']]) ;
<?php <?php
$producer = Producer::searchOne([ $producer = Producer::searchOne([
'id' => Producer::getId()
'id' => GlobalParam::getCurrentProducerId()
]); ]);
if(!$producer->credit) if(!$producer->credit)

+ 194
- 198
common/components/ActiveRecordCommon.php View File

<?php <?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\components ;
/**
* 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\components;

use common\helpers\GlobalParam;


class ActiveRecordCommon extends \yii\db\ActiveRecord class ActiveRecordCommon extends \yii\db\ActiveRecord
{ {
const SEARCH_ALL = 'all' ;
const SEARCH_ONE = 'one' ;
const SEARCH_COUNT = 'count' ;
/**
* Méthode générique de recherche utilisée pour tous les modèles. Elle a
* pour but de construire la requête et de retourner le résultat.
*
* @param array $params
* @param array $options
* @return mixed
* @throws NotFoundHttpException
*/
public static function searchBy($params = [], $options = [])
{
$class = get_called_class() ;
if(is_callable([$class, 'defaultOptionsSearch'])) {
$default_options = $class::defaultOptionsSearch() ;
}
else {
throw new \ErrorException('La méthode "defaultOptionsSearch" n\'est '
. 'pas définie dans la classe "'.$class.'"');
}
$options = array_merge($default_options, $options) ;
$pk = $class::primaryKey() ;
$pk = $class::tableName().'.'.$pk[0] ;
if (isset($options['attribute_id_producer']) && strlen($options['attribute_id_producer'])
&& !isset($params[$options['attribute_id_producer']]) && !Yii::$app->user->isGuest)
const SEARCH_ALL = 'all';
const SEARCH_ONE = 'one';
const SEARCH_COUNT = 'count';

/**
* Méthode générique de recherche utilisée pour tous les modèles. Elle a
* pour but de construire la requête et de retourner le résultat.
*
* @param array $params
* @param array $options
* @return mixed
* @throws NotFoundHttpException
*/
public static function searchBy($params = [], $options = [])
{ {
$params[$options['attribute_id_producer']] = Producer::getId() ;
}
if(!isset($options['type_search'])) {
$options['type_search'] = self::SEARCH_ALL ;
}
$records = $class::find() ;
// With
if(is_array($options['with']) && count($options['with'])) {
$records = $records->with($options['with']) ;
}
// Join with
if(is_array($options['join_with']) && count($options['join_with'])) {
$records = $records->joinWith($options['join_with']) ;
}
// Conditions
if(isset($options['conditions'])) {
if(is_array($options['conditions'])) {
if(count($options['conditions'])) {
foreach($options['conditions'] as $condition) {
$records = $records->andWhere($condition);
}
$class = get_called_class();

if (is_callable([$class, 'defaultOptionsSearch'])) {
$default_options = $class::defaultOptionsSearch();
} else {
throw new \ErrorException('La méthode "defaultOptionsSearch" n\'est '
. 'pas définie dans la classe "' . $class . '"');
}

$options = array_merge($default_options, $options);

$pk = $class::primaryKey();
$pk = $class::tableName() . '.' . $pk[0];

if (isset($options['attribute_id_producer']) && strlen($options['attribute_id_producer'])
&& !isset($params[$options['attribute_id_producer']]) && !Yii::$app->user->isGuest) {
$params[$options['attribute_id_producer']] = GlobalParam::getCurrentProducerId();
} }
}
else {
if(strlen($options['conditions'])) {
$records = $records->andWhere($options['conditions']);

if (!isset($options['type_search'])) {
$options['type_search'] = self::SEARCH_ALL;
} }
}
}
// Params
if(isset($options['params']) && is_array($options['params']) && count($options['params'])) {
$records = $records->params($options['params']) ;
}
// Paramètres
if(is_array($params) && count($params)) {
foreach($params as $key => $val) {
if(strpos($key, '.') === false) {
unset($params[$key]) ;
$key = $class::tableName().'.'.$key ;
$params[$key] = $val ;

$records = $class::find();

// With
if (is_array($options['with']) && count($options['with'])) {
$records = $records->with($options['with']);
} }
$records = $records->andWhere([$key => $val]);
}
}
if(!isset($params[$pk])) {
// Orderby
if (isset($options['orderby']) && strlen($options['orderby'])) {
$records = $records->orderBy($options['orderby']);
}
// Limit
if (isset($options['limit']) && is_numeric($options['limit'])
&& $options['limit'] > 0)
{
$records = $records->limit($options['limit']);
}

// Join with
if (is_array($options['join_with']) && count($options['join_with'])) {
$records = $records->joinWith($options['join_with']);
}

// Conditions
if (isset($options['conditions'])) {
if (is_array($options['conditions'])) {
if (count($options['conditions'])) {
foreach ($options['conditions'] as $condition) {
$records = $records->andWhere($condition);
}
}
} else {
if (strlen($options['conditions'])) {
$records = $records->andWhere($options['conditions']);
}
}
}

// Params
if (isset($options['params']) && is_array($options['params']) && count($options['params'])) {
$records = $records->params($options['params']);
}

// Paramètres
if (is_array($params) && count($params)) {
foreach ($params as $key => $val) {
if (strpos($key, '.') === false) {
unset($params[$key]);
$key = $class::tableName() . '.' . $key;
$params[$key] = $val;
}
$records = $records->andWhere([$key => $val]);
}
}

if (!isset($params[$pk])) {
// Orderby
if (isset($options['orderby']) && strlen($options['orderby'])) {
$records = $records->orderBy($options['orderby']);
}
// Limit
if (isset($options['limit']) && is_numeric($options['limit'])
&& $options['limit'] > 0) {
$records = $records->limit($options['limit']);
}
}

if (isset($options['as_array'])) {
$records = $records->asArray();
}

if ($options['type_search'] == self::SEARCH_ALL) {
return $records->all();
} elseif ($options['type_search'] == self::SEARCH_ONE) {
$record = $records->one();
if ($record) {
return $record;
}
} elseif ($options['type_search'] == self::SEARCH_COUNT) {
return $records->count();
}

return false;
} }
if(isset($options['as_array'])) {
$records = $records->asArray() ;

/**
* Recherche un enregistrement.
*
* @param array $params
* @param array $options
* @return mixed
*/
public static function searchOne($params = [], $options = [])
{
$options['type_search'] = self::SEARCH_ONE;
return self::searchDispatch($params, $options);
} }
if($options['type_search'] == self::SEARCH_ALL) {
return $records->all();

/**
* Recherche tous les enregistrements.
*
* @param array $params
* @param array $options
* @return mixed
*/
public static function searchAll($params = [], $options = [])
{
$options['type_search'] = self::SEARCH_ALL;
return self::searchDispatch($params, $options);
} }
elseif($options['type_search'] == self::SEARCH_ONE) {
$record = $records->one();
if($record) {
return $record ;
}

/**
* Recherche et compte le nombre de résultats.
*
* @param array $params
* @param array $options
* @return integer
*/
public static function searchCount($params = [], $options = [])
{
$options['type_search'] = self::SEARCH_COUNT;
return self::searchDispatch($params, $options);
} }
elseif($options['type_search'] == self::SEARCH_COUNT) {
return $records->count() ;

/**
* Appelle la méthode 'search' de la classe appellante.
*
* @param array $params
* @param array $options
* @return mixed
*/
public static function searchDispatch($params = [], $options = [])
{
$class = get_called_class();
return $class::searchBy($params, $options);
} }
return false ;
}
/**
* Recherche un enregistrement.
*
* @param array $params
* @param array $options
* @return mixed
*/
public static function searchOne($params = [], $options = [])
{
$options['type_search'] = self::SEARCH_ONE ;
return self::searchDispatch($params, $options) ;
}
/**
* Recherche tous les enregistrements.
*
* @param array $params
* @param array $options
* @return mixed
*/
public static function searchAll($params = [], $options = [])
{
$options['type_search'] = self::SEARCH_ALL ;
return self::searchDispatch($params, $options) ;
}
/**
* Recherche et compte le nombre de résultats.
*
* @param array $params
* @param array $options
* @return integer
*/
public static function searchCount($params = [], $options = [])
{
$options['type_search'] = self::SEARCH_COUNT ;
return self::searchDispatch($params, $options) ;
}
/**
* Appelle la méthode 'search' de la classe appellante.
*
* @param array $params
* @param array $options
* @return mixed
*/
public static function searchDispatch($params = [], $options = [])
{
$class = get_called_class() ;
return $class::searchBy($params, $options) ;
}

} }

+ 39
- 38
common/config/params.php View File

<?php <?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.
*/
/**
* 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.
*/


return [ return [
'adminEmail' => 'contact@opendistrib.net',
'supportEmail' => 'contact@opendistrib.net',
'user.passwordResetTokenExpire' => 3600,
'adminEmail' => 'contact@opendistrib.net',
'supportEmail' => 'contact@opendistrib.net',
'user.passwordResetTokenExpire' => 3600,
'producer' => false
]; ];

+ 84
- 0
common/helpers/GlobalParam.php View File

<?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\helpers;

use common\models\Producer;

class GlobalParam
{

public function get($key)
{
if($key == 'producer'){
return $this->getCurrentProducer();
}else{

return \Yii::$app->params[$key];
}
}

public static function getCurrentProducer()
{
if(\Yii::$app->params['producer'] == false){
\Yii::$app->params['producer'] = Producer::searchOne();
}
return \Yii::$app->params['producer'];
}

/**
* Retourne l'ID du producteur courant.
*
* @return integer|boolean
*/
public static function getCurrentProducerId()
{
if(\Yii::$app->controller->module->id == 'app-backend') {
if(!\Yii::$app->user->isGuest) {
return Yii::$app->user->identity->id_producer ;
}
}
else {
return \Yii::$app->controller->getProducer()->id;
}

return false ;
}


}

+ 50
- 39
common/helpers/Price.php View File

<?php <?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

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".
namespace common\helpers;


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.
class Price
{


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é.
public static function format($number)
{
return number_format($number, 2) . ' €';
}


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.
*/
public static function getPrice($priceWithTax, $taxRate)
{
return round(floatval($priceWithTax) / ($taxRate + 1), 2);
}


namespace common\helpers;
public static function getPriceWithTax($priceWithoutTax, $taxRate)
{
return round(floatval($priceWithoutTax) * ($taxRate + 1), 2);
}


class Price {
public static function format($number)
{
return number_format($number, 2).' €' ;
}
} }

+ 2
- 1
common/models/CreditHistorySearch.php View File



namespace common\models ; namespace common\models ;


use common\helpers\GlobalParam;
use common\models\CreditHistory ; use common\models\CreditHistory ;


class CreditHistorySearch extends CreditHistory class CreditHistorySearch extends CreditHistory
$query = CreditHistory::find() $query = CreditHistory::find()
->with($optionsSearch['with']) ->with($optionsSearch['with'])
->innerJoinWith($optionsSearch['join_with'], true) ->innerJoinWith($optionsSearch['join_with'], true)
->where(['credit_history.id_producer' => Producer::getId()])
->where(['credit_history.id_producer' => GlobalParam::getCurrentProducerId()])
->orderBy('id DESC') ->orderBy('id DESC')
; ;

+ 3
- 1
common/models/DeliveryNoteSearch.php View File

namespace common\models ; namespace common\models ;




use common\helpers\GlobalParam;

class DeliveryNoteSearch extends DeliveryNote class DeliveryNoteSearch extends DeliveryNote
{ {
$query = DeliveryNote::find() $query = DeliveryNote::find()
->with($optionsSearch['with']) ->with($optionsSearch['with'])
->joinWith($optionsSearch['join_with'], true) ->joinWith($optionsSearch['join_with'], true)
->where(['distribution.id_producer' => Producer::getId()])
->where(['distribution.id_producer' => GlobalParam::getCurrentProducerId()])
->orderBy('delivery_note.reference DESC') ->orderBy('delivery_note.reference DESC')
; ;

+ 2
- 1
common/models/Development.php View File



namespace common\models; namespace common\models;


use common\helpers\GlobalParam;
use Yii; use Yii;
use common\components\ActiveRecordCommon ; use common\components\ActiveRecordCommon ;
use common\models\DeveloppementPriorite; use common\models\DeveloppementPriorite;
return $this->hasOne( return $this->hasOne(
DevelopmentPriority::className(), DevelopmentPriority::className(),
['id_development' => 'id']) ['id_development' => 'id'])
->where(['id_producer' => Producer::getId()])
->where(['id_producer' => GlobalParam::getCurrentProducerId()])
->with('producer'); ->with('producer');
} }



+ 332
- 333
common/models/Distribution.php View File

<?php <?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.
*/
/**
* 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\models; namespace common\models;


use common\helpers\GlobalParam;
use Yii; use Yii;
use common\components\ActiveRecordCommon ;
use common\components\ActiveRecordCommon;
use common\models\Order; use common\models\Order;
use common\models\Distribution; use common\models\Distribution;


* @property string $date * @property string $date
* @property integer $active * @property integer $active
*/ */
class Distribution extends ActiveRecordCommon
class Distribution extends ActiveRecordCommon
{ {
/**
* @inheritdoc
*/
public static function tableName()
{
return 'distribution';
}

public function getProducer()
{
return $this->hasOne(Producer::className(), ['id' => 'id_producer']);
}

/**
* @inheritdoc
*/
public function rules()
{
return [
[['date'], 'required'],
[['date'], 'safe'],
[['active'], 'integer']
];
}

/**
* @inheritdoc
*/
public function attributeLabels()
{
return [
'id' => 'ID',
'date' => 'Date',
'active' => 'Actif',
];
}

/*
* Relations
*/
public function getOrder()
{
return $this->hasMany(Order::className(), ['id_distribution' => 'id']);
}

public function getProductDistribution()
{
return $this->hasMany(ProductDistribution::className(), ['id_distribution' => 'id']);
}
/**
* Retourne les options de base nécessaires à la fonction de recherche.
*
* @return array
*/
public static function defaultOptionsSearch() {
return [
'with' => [],
'join_with' => [],
'orderby' => 'date ASC',
'attribute_id_producer' => 'distribution.id_producer'
] ;
}

/**
* Retourne si un produit est actif ou non.
*
* @param integer $idProduit
* @return boolean
*/
public function isActiveProduct($idProduit)
{
if ($idProduit &&
isset($this->productDistribution) &&
count($this->productDistribution) > 0)
/**
* @inheritdoc
*/
public static function tableName()
{ {
return 'distribution';
}


foreach ($this->productDistribution as $productDistribution) {
if ($productDistribution['id_product'] == $idProduct &&
$productDistribution['active'])
{
return true;
}
}
public function getProducer()
{
return $this->hasOne(Producer::className(), ['id' => 'id_producer']);
}

/**
* @inheritdoc
*/
public function rules()
{
return [
[['date'], 'required'],
[['date'], 'safe'],
[['active'], 'integer']
];
}

/**
* @inheritdoc
*/
public function attributeLabels()
{
return [
'id' => 'ID',
'date' => 'Date',
'active' => 'Actif',
];
} }


return false;
}
/**
* Initialise un jour de production.
*
* @param string $date
* @return Production
*/
public static function initDistribution($date, $idProducer = 0)
{
$distribution = null ;
if ($date != '') {
$paramsDistribution = [
'date' => $date
] ;
if($idProducer) {
$paramsDistribution['distribution.id_producer'] = (int) $idProducer ;
}
else {
$idProducer = Producer::getId() ;
}
$distribution = Distribution::searchOne($paramsDistribution) ;
if (!$distribution) {
$distribution = new Distribution;
$distribution->date = $date;
$distribution->delivery = 1;
$distribution->id_producer = $idProducer ;
$distribution->save();
}
/*
* Relations
*/

public function getOrder()
{
return $this->hasMany(Order::className(), ['id_distribution' => 'id']);
} }


// point_sale_distribution à définir s'ils ne sont pas initialisés
if ($distribution) {
$countPointSaleDistribution = PointSaleDistribution::searchCount([
'id_distribution' => $distribution->id
]) ;
if (!$countPointSaleDistribution) {
PointSaleDistribution::setAll($distribution->id, true);
}
public function getProductDistribution()
{
return $this->hasMany(ProductDistribution::className(), ['id_distribution' => 'id']);
} }
// init produits sélectionnés pour cette production
$products = Product::searchAll();
if ($distribution) {
$productsDistribution = ProductDistribution::searchAll([
'id_distribution' => $distribution->id
]) ;
if (!count($productsDistribution)) {
foreach ($products as $product) {
$distribution->linkProduct($product) ;

/**
* Retourne les options de base nécessaires à la fonction de recherche.
*
* @return array
*/
public static function defaultOptionsSearch()
{
return [
'with' => [],
'join_with' => [],
'orderby' => 'date ASC',
'attribute_id_producer' => 'distribution.id_producer'
];
}

/**
* Retourne si un produit est actif ou non.
*
* @param integer $idProduit
* @return boolean
*/
public function isActiveProduct($idProduit)
{
if ($idProduit &&
isset($this->productDistribution) &&
count($this->productDistribution) > 0) {

foreach ($this->productDistribution as $productDistribution) {
if ($productDistribution['id_product'] == $idProduit &&
$productDistribution['active']) {
return true;
}
}
} }
}
$distribution->linkProductGift() ;
return false;
} }
return $distribution ;
}
/**
* Retourne les distributions futures.
*
* @return array
*/
public static function getIncomingDistributions()
{
$distributionsArray = Distribution::find()
->where('date > \'' . date('Y-m-d').'\'')
->andWhere([
'id_producer' => Producer::getId(),
'active' => 1
])
->orderBy('date ASC')
->all();
return $distributionsArray ;
}
/**
* Lie un produit aux jours de distribution futurs.
*
* @param Product $product
*/
public static function linkProductIncomingDistributions($product)
{
$distributionsArray = self::getIncomingDistributions() ;
foreach ($distributionsArray as $distribution) {
$distribution->linkProduct($product) ;

/**
* Initialise un jour de production.
*
* @param string $date
* @return Production
*/
public static function initDistribution($date, $idProducer = 0)
{
$distribution = null;
if ($date != '') {

$paramsDistribution = [
'date' => $date
];
if ($idProducer) {
$paramsDistribution['distribution.id_producer'] = (int)$idProducer;
} else {
$idProducer = GlobalParam::getCurrentProducerId();
}

$distribution = Distribution::searchOne($paramsDistribution);

if (!$distribution) {
$distribution = new Distribution;
$distribution->date = $date;
$distribution->delivery = 1;
$distribution->id_producer = $idProducer;
$distribution->save();
}
}

// point_sale_distribution à définir s'ils ne sont pas initialisés
if ($distribution) {

$countPointSaleDistribution = PointSaleDistribution::searchCount([
'id_distribution' => $distribution->id
]);

if (!$countPointSaleDistribution) {
PointSaleDistribution::setAll($distribution->id, true);
}
}

// init produits sélectionnés pour cette production
$products = Product::searchAll();

if ($distribution) {
$productsDistribution = ProductDistribution::searchAll([
'id_distribution' => $distribution->id
]);
if (!count($productsDistribution)) {
foreach ($products as $product) {
$distribution->linkProduct($product);
}
}
$distribution->linkProductGift();
}

return $distribution;
} }
}
/**
* Lie un produit à la distribution.
*
* @param Product $product
*/
public function linkProduct($product)
{
$productDistribution = ProductDistribution::searchOne([
'id_distribution' => $this->id,
'id_product' => $product->id
]) ;

if(!$productDistribution) {
$productDistribution = new ProductDistribution();
$productDistribution->id_distribution = $this->id;
$productDistribution->id_product = $product->id;
/**
* Retourne les distributions futures.
*
* @return array
*/
public static function getIncomingDistributions()
{
$distributionsArray = Distribution::find()
->where('date > \'' . date('Y-m-d') . '\'')
->andWhere([
'id_producer' => GlobalParam::getCurrentProducerId(),
'active' => 1
])
->orderBy('date ASC')
->all();
return $distributionsArray;
} }
$productDistribution->quantity_max = $product->quantity_max;
$dayDistribution = date('N', strtotime($this->date));
$daysArray = [
1 => 'monday',
2 => 'tuesday',
3 => 'wednesday',
4 => 'thursday',
5 => 'friday',
6 => 'saturday',
7 => 'sunday',
] ;
$productDistribution->active = 0;
$day = $daysArray[$dayDistribution] ;
if($product->active && $product->$day) {
$productDistribution->active = 1;

/**
* Lie un produit aux jours de distribution futurs.
*
* @param Product $product
*/
public static function linkProductIncomingDistributions($product)
{
$distributionsArray = self::getIncomingDistributions();
foreach ($distributionsArray as $distribution) {
$distribution->linkProduct($product);
}
} }


$productDistribution->save();
return $productDistribution ;
}
/**
* Lie le produit "Don" à la distribution
*/
public function linkProductGift()
{
$productGift = Product::getProductGift() ;
if($productGift) {
$productDistribution = ProductDistribution::searchOne([
'id_distribution' => $this->id,
'id_product' => $productGift->id
]) ;

if(!$productDistribution) {
$productDistribution = new ProductDistribution();
$productDistribution->id_distribution = $this->id;
$productDistribution->id_product = $productGift->id;
$productDistribution->active = 1;
$productDistribution->save() ;
}
/**
* Lie un produit à la distribution.
*
* @param Product $product
*/
public function linkProduct($product)
{
$productDistribution = ProductDistribution::searchOne([
'id_distribution' => $this->id,
'id_product' => $product->id
]);

if (!$productDistribution) {
$productDistribution = new ProductDistribution();
$productDistribution->id_distribution = $this->id;
$productDistribution->id_product = $product->id;
}

$productDistribution->quantity_max = $product->quantity_max;

$dayDistribution = date('N', strtotime($this->date));
$daysArray = [
1 => 'monday',
2 => 'tuesday',
3 => 'wednesday',
4 => 'thursday',
5 => 'friday',
6 => 'saturday',
7 => 'sunday',
];

$productDistribution->active = 0;
$day = $daysArray[$dayDistribution];
if ($product->active && $product->$day) {
$productDistribution->active = 1;
}

$productDistribution->save();

return $productDistribution;
} }
}
/**
* Lie un point de vente aux jours de distribution futurs.
*
* @param PointSale $pointSale
*/
public static function linkPointSaleIncomingDistributions($pointSale)
{
$distributionsArray = self::getIncomingDistributions() ;
foreach ($distributionsArray as $distribution) {
$distribution->linkPointSale($pointSale) ;

/**
* Lie le produit "Don" à la distribution
*/
public function linkProductGift()
{
$productGift = Product::getProductGift();

if ($productGift) {
$productDistribution = ProductDistribution::searchOne([
'id_distribution' => $this->id,
'id_product' => $productGift->id
]);

if (!$productDistribution) {
$productDistribution = new ProductDistribution();
$productDistribution->id_distribution = $this->id;
$productDistribution->id_product = $productGift->id;
$productDistribution->active = 1;
$productDistribution->save();
}
}
} }
}
/**
*
* @param type $pointSale
*/
public function linkPointSale($pointSale)
{
$pointSaleDistribution = PointSaleDistribution::searchOne([
'id_distribution' => $this->id,
'id_point_sale' => $pointSale->id
]) ;
if(!$pointSaleDistribution) {
$pointSaleDistribution = new PointSaleDistribution();
$pointSaleDistribution->id_distribution = $this->id;
$pointSaleDistribution->id_point_sale = $pointSale->id;

/**
* Lie un point de vente aux jours de distribution futurs.
*
* @param PointSale $pointSale
*/
public static function linkPointSaleIncomingDistributions($pointSale)
{
$distributionsArray = self::getIncomingDistributions();
foreach ($distributionsArray as $distribution) {
$distribution->linkPointSale($pointSale);
}
} }
$dayDistribution = date('N', strtotime($this->date));
$daysArray = [
1 => 'monday',
2 => 'tuesday',
3 => 'wednesday',
4 => 'thursday',
5 => 'friday',
6 => 'saturday',
7 => 'sunday',
] ;
$pointSaleDistribution->delivery = 0 ;
$deliveryDay = 'delivery_'.$daysArray[$dayDistribution] ;
if($pointSale->$deliveryDay) {
$pointSaleDistribution->delivery = 1;

/**
*
* @param type $pointSale
*/
public function linkPointSale($pointSale)
{
$pointSaleDistribution = PointSaleDistribution::searchOne([
'id_distribution' => $this->id,
'id_point_sale' => $pointSale->id
]);

if (!$pointSaleDistribution) {
$pointSaleDistribution = new PointSaleDistribution();
$pointSaleDistribution->id_distribution = $this->id;
$pointSaleDistribution->id_point_sale = $pointSale->id;
}

$dayDistribution = date('N', strtotime($this->date));
$daysArray = [
1 => 'monday',
2 => 'tuesday',
3 => 'wednesday',
4 => 'thursday',
5 => 'friday',
6 => 'saturday',
7 => 'sunday',
];

$pointSaleDistribution->delivery = 0;
$deliveryDay = 'delivery_' . $daysArray[$dayDistribution];
if ($pointSale->$deliveryDay) {
$pointSaleDistribution->delivery = 1;
}

$pointSaleDistribution->save();
} }
$pointSaleDistribution->save() ;
}

/**
* Active ou désactive la distribution.
*/
public function active($active = true)
{
PointSaleDistribution::setAll($this->id, true);
$this->active = (int) $active ;
$this->save() ;

if ($active) {
// ajout des abonnements
Subscription::addAll($this->date);

/**
* Active ou désactive la distribution.
*/
public function active($active = true)
{
PointSaleDistribution::setAll($this->id, true);
$this->active = (int)$active;
$this->save();

if ($active) {
// ajout des abonnements
Subscription::addAll($this->date);
}
} }
}

} }

+ 2
- 1
common/models/InvoiceSearch.php View File



namespace common\models ; namespace common\models ;


use common\helpers\GlobalParam;
use common\models\Invoice ; use common\models\Invoice ;


class InvoiceSearch extends Invoice class InvoiceSearch extends Invoice
$query = Invoice::find() $query = Invoice::find()
->with($optionsSearch['with']) ->with($optionsSearch['with'])
->joinWith($optionsSearch['join_with'], true) ->joinWith($optionsSearch['join_with'], true)
->where(['distribution.id_producer' => Producer::getId()])
->where(['distribution.id_producer' => GlobalParam::getCurrentProducerId()])
->orderBy('invoice.reference DESC') ->orderBy('invoice.reference DESC')
; ;

+ 703
- 719
common/models/Order.php
File diff suppressed because it is too large
View File


+ 321
- 320
common/models/PointSale.php View File

<?php <?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.
*/
/**
* 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\models; namespace common\models;


use common\helpers\GlobalParam;
use Yii; use Yii;
use yii\helpers\Html; use yii\helpers\Html;
use common\models\UserPointSale; use common\models\UserPointSale;
use common\models\PointSaleDistribution ;
use common\components\ActiveRecordCommon ;
use common\models\PointSaleDistribution;
use common\components\ActiveRecordCommon;


/** /**
* This is the model class for table "point_vente". * This is the model class for table "point_vente".
*/ */
class PointSale extends ActiveRecordCommon class PointSale extends ActiveRecordCommon
{ {
var $orders = [];
var $revenues = 0;
var $data_select_orders;
var $data_options_orders;
var $users = [];
var $users_comment = [];
var $orders = [];
var $revenues = 0;
var $data_select_orders;
var $data_options_orders;
var $users = [];
var $users_comment = [];


/**
* @inheritdoc
*/
public static function tableName()
{
return 'point_sale';
}
/**
* @inheritdoc
*/
public static function tableName()
{
return 'point_sale';
}

/**
* @inheritdoc
*/
public function rules()
{
return [
[['name'], 'required'],
[['restricted_access'], 'boolean'],
[['name', 'code'], 'string', 'max' => 255],
[['address', 'locality', 'infos_monday', 'infos_tuesday',
'infos_wednesday', 'infos_thursday', 'infos_friday',
'infos_saturday', 'infos_sunday', 'credit_functioning'], 'string'],
[['point_production', 'credit', 'delivery_monday', 'delivery_tuesday',
'delivery_wednesday', 'delivery_thursday', 'delivery_friday',
'delivery_saturday', 'delivery_sunday', 'default'], 'boolean'],
['point_production', 'default', 'value' => 0],
['id_producer', 'integer'],
['id_producer', 'required'],
[['users', 'users_comment', 'code'], 'safe']
];
}

/**
* @inheritdoc
*/
public function attributeLabels()
{
return [
'id' => 'ID',
'name' => 'Nom',
'address' => 'Adresse',
'locality' => 'Localité',
'point_production' => 'Point de production',
'infos_monday' => 'Lundi',
'infos_tuesday' => 'Mardi',
'infos_wednesday' => 'Mercredi',
'infos_thursday' => 'Jeudi',
'infos_friday' => 'Vendredi',
'infos_saturday' => 'Samedi',
'infos_sunday' => 'Dimanche',
'restricted_access' => 'Accès restreint',
'credit' => 'Activer le Crédit',
'delivery_monday' => 'Lundi',
'delivery_tuesday' => 'Mardi',
'delivery_wednesday' => 'Mercredi',
'delivery_thursday' => 'Jeudi',
'delivery_friday' => 'Vendredi',
'delivery_saturday' => 'Samedi',
'delivery_sunday' => 'Dimanche',
'code' => 'Code',
'credit_functioning' => 'Utilisation du Crédit par l\'utilisateur',
'default' => 'Point de vente par défaut',
];
}


/**
* @inheritdoc
*/
public function rules()
{
return [
[['name'], 'required'],
[['restricted_access'], 'boolean'],
[['name', 'code'], 'string', 'max' => 255],
[['address', 'locality', 'infos_monday', 'infos_tuesday',
'infos_wednesday', 'infos_thursday', 'infos_friday',
'infos_saturday', 'infos_sunday','credit_functioning'], 'string'],
[['point_production', 'credit', 'delivery_monday', 'delivery_tuesday',
'delivery_wednesday', 'delivery_thursday', 'delivery_friday',
'delivery_saturday', 'delivery_sunday','default'], 'boolean'],
['point_production', 'default', 'value' => 0],
['id_producer', 'integer'],
['id_producer', 'required'],
[['users', 'users_comment', 'code'], 'safe']
];
}
/*
* Relations
*/


/**
* @inheritdoc
*/
public function attributeLabels()
{
return [
'id' => 'ID',
'name' => 'Nom',
'address' => 'Adresse',
'locality' => 'Localité',
'point_production' => 'Point de production',
'infos_monday' => 'Lundi',
'infos_tuesday' => 'Mardi',
'infos_wednesday' => 'Mercredi',
'infos_thursday' => 'Jeudi',
'infos_friday' => 'Vendredi',
'infos_saturday' => 'Samedi',
'infos_sunday' => 'Dimanche',
'restricted_access' => 'Accès restreint',
'credit' => 'Activer le Crédit',
'delivery_monday' => 'Lundi',
'delivery_tuesday' => 'Mardi',
'delivery_wednesday' => 'Mercredi',
'delivery_thursday' => 'Jeudi',
'delivery_friday' => 'Vendredi',
'delivery_saturday' => 'Samedi',
'delivery_sunday' => 'Dimanche',
'code' => 'Code',
'credit_functioning' => 'Utilisation du Crédit par l\'utilisateur',
'default' => 'Point de vente par défaut',
];
}
public function getUserPointSale()
{
return $this->hasMany(
UserPointSale::className(),
['id_point_sale' => 'id']
);
}


/*
* Relations
*/
public function getUserPointSale()
{
return $this->hasMany(
UserPointSale::className(),
['id_point_sale' => 'id']
);
}
public function getPointSaleDistribution()
{
return $this->hasMany(
PointSaleDistribution::className(),
['id_point_sale' => 'id']
);
}


public function getPointSaleDistribution()
{
return $this->hasMany(
PointSaleDistribution::className(),
['id_point_sale' => 'id']
);
}
/**
* Retourne les options de base nécessaires à la fonction de recherche.
*
* @return array
*/
public static function defaultOptionsSearch()
{
return [
'with' => [],
'join_with' => [],
'orderby' => '',
'attribute_id_producer' => 'point_sale.id_producer'
];
}


/**
* Retourne les options de base nécessaires à la fonction de recherche.
*
* @return array
*/
public static function defaultOptionsSearch() {
return [
'with' => [],
'join_with' => [],
'orderby' => '',
'attribute_id_producer' => 'point_sale.id_producer'
] ;
}
/**
* Initialise les commandes liées au point de vente.
*
* @param array $ordersArray
*/
public function initOrders($ordersArray)
{
$this->orders = [];
$this->revenues = 0;
/**
* Initialise les commandes liées au point de vente.
*
* @param array $ordersArray
*/
public function initOrders($ordersArray)
{
$this->orders = [];
$this->revenues = 0;


if($ordersArray) {
foreach ($ordersArray as $order) {
if ($this->id == $order->id_point_sale) {
$this->orders[] = $order;
if ($ordersArray) {
foreach ($ordersArray as $order) {
if ($this->id == $order->id_point_sale) {
$this->orders[] = $order;


if(is_null($order->date_delete)) {
$this->revenues += (float) $order->amount;
}
if (is_null($order->date_delete)) {
$this->revenues += (float)$order->amount;
}
}
}
} }
}
} }
}


/**
* Retourne les commandes liées à ce point de vente.
*
* @return array
*/
public function getOrders()
{
return $this->orders;
}
/**
* Enregistre le point de vente.
*
* @param boolean $runValidation
* @param array $attributeNames
* @return type
*/
public function save($runValidation = true, $attributeNames = NULL)
{
$this->id_producer = Producer::getId();
return parent::save($runValidation, $attributeNames);
}
/**
* Retourne les commandes liées à ce point de vente.
*
* @return array
*/
public function getOrders()
{
return $this->orders;
}
/**
* Enregistre le point de vente.
*
* @param boolean $runValidation
* @param array $attributeNames
* @return type
*/
public function save($runValidation = true, $attributeNames = NULL)
{
$this->id_producer = GlobalParam::getCurrentProducerId();
return parent::save($runValidation, $attributeNames);
}


/**
* Traite la mise à jour de l'attribut 'point_production'.
*/
public function processPointProduction()
{
if ($this->point_production) {
PointSale::updateAll(
['point_production' => 0],
['id_producer' => $this->id_producer]
);
$this->point_production = 1;
$this->save();
/**
* Traite la mise à jour de l'attribut 'point_production'.
*/
public function processPointProduction()
{
if ($this->point_production) {
PointSale::updateAll(
['point_production' => 0],
['id_producer' => $this->id_producer]
);
$this->point_production = 1;
$this->save();
}
} }
}


/**
* Traite les accès restreints d'un point de vente.
*/
public function processRestrictedAccess()
{
UserPointSale::deleteAll(['id_point_sale' => $this->id]);
/**
* Traite les accès restreints d'un point de vente.
*/
public function processRestrictedAccess()
{
UserPointSale::deleteAll(['id_point_sale' => $this->id]);


if (is_array($this->users) && count($this->users)) {
foreach ($this->users as $key => $val) {
$user = User::findOne($val);
if ($user) {
$userPointSale = new UserPointSale;
$userPointSale->id_user = $val;
$userPointSale->id_point_sale = $this->id;
if (isset($this->users_comment[$val]) && strlen($this->users_comment[$val])) {
$userPointSale->comment = $this->users_comment[$val];
}
$userPointSale->save();
if (is_array($this->users) && count($this->users)) {
foreach ($this->users as $key => $val) {
$user = User::findOne($val);
if ($user) {
$userPointSale = new UserPointSale;
$userPointSale->id_user = $val;
$userPointSale->id_point_sale = $this->id;
if (isset($this->users_comment[$val]) && strlen($this->users_comment[$val])) {
$userPointSale->comment = $this->users_comment[$val];
}
$userPointSale->save();
}
}
} }
}
} }
}


/**
* Retourne le commentaire de l'utilisateur courant lié au point de vente.
*
* @return string|null
*/
public function getComment()
{
if (isset($this->userPointSale)) {
foreach ($this->userPointSale as $userPointSale) {
if ($userPointSale->id_user == User::getCurrentId()) {
return $userPointSale->comment;
/**
* Retourne le commentaire de l'utilisateur courant lié au point de vente.
*
* @return string|null
*/
public function getComment()
{
if (isset($this->userPointSale)) {
foreach ($this->userPointSale as $userPointSale) {
if ($userPointSale->id_user == User::getCurrentId()) {
return $userPointSale->comment;
}
}
} }
}
return null;
} }
return null ;
}


/**
* Retourne le nombre de points de vente pour l'établissement courant.
*
* @return integer
*/
public static function count()
{
return self::searchCount(['id_producer' => Producer::getId()]) ;
}
/**
* Retourne le nombre de points de vente pour l'établissement courant.
*
* @return integer
*/
public static function count()
{
return self::searchCount(['id_producer' => GlobalParam::getCurrentProducerId()]);
}

/**
* Vérifie le code d'accès à un point de vente.
*
* @param string $code
* @return boolean
*/
public function validateCode($code)
{
if (strlen($this->code)) {
if (trim(strtolower($code)) == trim(strtolower($this->code))) {
return true;
} else {
return false;
}
}


/**
* Vérifie le code d'accès à un point de vente.
*
* @param string $code
* @return boolean
*/
public function validateCode($code)
{
if (strlen($this->code)) {
if (trim(strtolower($code)) == trim(strtolower($this->code))) {
return true; return true;
} else {
return false;
}
} }
return true;
}
/**
* Retourne les jours de livraison du point de vente sous forme d'une chaine
* de caractères.
*
* @return string
*/
public function getStrDeliveryDays()
{
$str = '' ;
if($this->delivery_monday) $str .= 'lundi, ' ;
if($this->delivery_tuesday) $str .= 'mardi, ' ;
if($this->delivery_wednesday) $str .= 'mercredi, ' ;
if($this->delivery_thursday) $str .= 'jeudi, ' ;
if($this->delivery_friday) $str .= 'vendredi, ' ;
if($this->delivery_saturday) $str .= 'samedi, ' ;
if($this->delivery_sunday) $str .= 'dimanche, ' ;


if(strlen($str)) {
return substr($str, 0, strlen($str)-2) ;
/**
* Retourne les jours de livraison du point de vente sous forme d'une chaine
* de caractères.
*
* @return string
*/
public function getStrDeliveryDays()
{
$str = '';

if ($this->delivery_monday) $str .= 'lundi, ';
if ($this->delivery_tuesday) $str .= 'mardi, ';
if ($this->delivery_wednesday) $str .= 'mercredi, ';
if ($this->delivery_thursday) $str .= 'jeudi, ';
if ($this->delivery_friday) $str .= 'vendredi, ';
if ($this->delivery_saturday) $str .= 'samedi, ';
if ($this->delivery_sunday) $str .= 'dimanche, ';

if (strlen($str)) {
return substr($str, 0, strlen($str) - 2);
} else {
return '';
}
} }
else {
return '' ;

/**
* Retourne un commentaire informant l'utilisateur sur les détails de
* livraison d'un point de vente et pour un jour donné.
*
* @param string $jour
* @return string
*/
public function getStrInfos($day)
{
$str = '';
$field = 'infos_' . $day;

if (strlen($this->$field)) {
$str = nl2br(Html::encode($this->$field));
$str = preg_replace('/\[select_previous_day\](.*?)\[\/select_previous_day\]/', '<a href="javascript:void(0);" class="select-previous-day">$1</a>', $str);
}
return $str;
} }
}
/**
* Retourne un commentaire informant l'utilisateur sur les détails de
* livraison d'un point de vente et pour un jour donné.
*
* @param string $jour
* @return string
*/
public function getStrInfos($day)
{
$str = '' ;
$field = 'infos_'.$day ;
if(strlen($this->$field)) {
$str = nl2br(Html::encode($this->$field)) ;
$str = preg_replace('/\[select_previous_day\](.*?)\[\/select_previous_day\]/', '<a href="javascript:void(0);" class="select-previous-day">$1</a>' , $str) ;

/**
* Retourne le mode de fonctionnement du crédit du point de vente.
*
* @return string
*/
public function getCreditFunctioning()
{
return strlen($this->credit_functioning) > 0 ?
$this->credit_functioning :
Producer::getConfig('credit_functioning');
} }
return $str ;
}
/**
* Retourne le mode de fonctionnement du crédit du point de vente.
*
* @return string
*/
public function getCreditFunctioning()
{
return strlen($this->credit_functioning) > 0 ?
$this->credit_functioning :
Producer::getConfig('credit_functioning') ;
}
/**
* Lie un utilisateur au point de vente.
*
* @param integer $idUser
*/
public function linkUser($idUser)
{
if($idUser) {
$userPointSale = UserPointSale::find()
->where([
'id_user' => $idUser,
'id_point_sale' => $this->id
])->one() ;


if(!$userPointSale) {
$userPointSale = new UserPointSale ;
$userPointSale->id_user = $idUser ;
$userPointSale->id_point_sale = $this->id ;
$userPointSale->save() ;
}
/**
* Lie un utilisateur au point de vente.
*
* @param integer $idUser
*/
public function linkUser($idUser)
{
if ($idUser) {
$userPointSale = UserPointSale::find()
->where([
'id_user' => $idUser,
'id_point_sale' => $this->id
])->one();

if (!$userPointSale) {
$userPointSale = new UserPointSale;
$userPointSale->id_user = $idUser;
$userPointSale->id_point_sale = $this->id;
$userPointSale->save();
}
}
} }
}
} }

+ 2
- 1
common/models/PointSaleDistribution.php View File



namespace common\models; namespace common\models;


use common\helpers\GlobalParam;
use Yii; use Yii;
use common\components\ActiveRecordCommon ; use common\components\ActiveRecordCommon ;
use common\models\PointVente; use common\models\PointVente;
$q->where(['id_distribution' => $idDistribution]); $q->where(['id_distribution' => $idDistribution]);
}]) }])
->where([ ->where([
'id_producer' => Producer::getId(),
'id_producer' => GlobalParam::getCurrentProducerId(),
]) ])
->all(); ->all();

+ 2
- 1
common/models/PointSaleSearch.php View File



namespace common\models ; namespace common\models ;


use common\helpers\GlobalParam;
use common\models\PointSale ; use common\models\PointSale ;


class PointSaleSearch extends PointSale class PointSaleSearch extends PointSale
$query = PointSale::find() $query = PointSale::find()
->with($optionsSearch['with']) ->with($optionsSearch['with'])
->innerJoinWith($optionsSearch['join_with'], true) ->innerJoinWith($optionsSearch['join_with'], true)
->where(['point_sale.id_producer' => Producer::getId()])
->where(['point_sale.id_producer' => GlobalParam::getCurrentProducerId()])
; ;
$dataProvider = new ActiveDataProvider([ $dataProvider = new ActiveDataProvider([

+ 445
- 479
common/models/Producer.php View File

<?php <?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.
*/
/**
* 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\models; namespace common\models;


use Yii; use Yii;
use common\components\ActiveRecordCommon ;
use common\components\ActiveRecordCommon;
use common\helpers\Departments; use common\helpers\Departments;
use yii\helpers\Html; use yii\helpers\Html;


* @property boolean use_credit_checked_default * @property boolean use_credit_checked_default
* @property float credit_limit * @property float credit_limit
* @property string background_color_logo * @property string background_color_logo
*
*
*/ */
class Producer extends ActiveRecordCommon
class Producer extends ActiveRecordCommon
{ {
const CREDIT_FUNCTIONING_MANDATORY = 'mandatory' ;
const CREDIT_FUNCTIONING_OPTIONAL = 'optional' ;
const CREDIT_FUNCTIONING_USER = 'user' ;
const HINT_CREDIT_FUNCTIONING = '<ul>'
const CREDIT_FUNCTIONING_MANDATORY = 'mandatory';
const CREDIT_FUNCTIONING_OPTIONAL = 'optional';
const CREDIT_FUNCTIONING_USER = 'user';
const HINT_CREDIT_FUNCTIONING = '<ul>'
. '<li>Optionnelle : l\'utilisateur choisit s\'il utilise son Crédit ou non. Les commandes peuvent être payées ou impayées.</li>' . '<li>Optionnelle : l\'utilisateur choisit s\'il utilise son Crédit ou non. Les commandes peuvent être payées ou impayées.</li>'
. '<li>Obligatoire : toutes les commandes de l\'utilisateur son comptabilisées au niveau du Crédit. Toutes les commandes sont payées.</li>' . '<li>Obligatoire : toutes les commandes de l\'utilisateur son comptabilisées au niveau du Crédit. Toutes les commandes sont payées.</li>'
. '<li>Basée sur l\'utilisateur : Crédit obligatoire si l\'utilisateur a le crédit activé au niveau de son compte, système de Crédit non affiché sinon.</li>' . '<li>Basée sur l\'utilisateur : Crédit obligatoire si l\'utilisateur a le crédit activé au niveau de son compte, système de Crédit non affiché sinon.</li>'
. '</ul>' ;
public static $creditFunctioningArray = [
self::CREDIT_FUNCTIONING_MANDATORY => 'Obligatoire',
self::CREDIT_FUNCTIONING_OPTIONAL => 'Optionnelle',
self::CREDIT_FUNCTIONING_USER => 'Basée sur l\'utilisateur',
];
const BEHAVIOR_DELETE_ORDER_DELETE = 'delete' ;
const BEHAVIOR_DELETE_ORDER_STATUS = 'status' ;
var $secret_key_payplug ;
/**
* @inheritdoc
*/
public static function tableName()
{
return 'producer';
}

/**
* @inheritdoc
*/
public function rules()
{
return [
[['name','type','id_tax_rate_default'], 'required'],
[['tiller_provider_token','tiller_restaurant_token'], 'required', 'when' => function($model) {
return $model->tiller == true ;
}],
[['order_deadline', 'order_delay', 'id_tax_rate_default', 'document_quotation_duration'], 'integer'],
['order_deadline', 'in', 'range' => [8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24]],
['order_delay', 'in', 'range' => [1, 2, 3, 4, 5, 6, 7]],
['code', function($attribute, $params) {
$code = $this->$attribute;
$producer = Producer::findOne(['code' => $code]);
if ($producer && $producer->id != $this->id) {
$this->addError($attribute, 'Ce code est déjà utilisé par un autre producteur.');
}
}],
[['description','mentions','gcs','order_infos','slug','secret_key_payplug','background_color_logo','option_behavior_cancel_order','tiller_provider_token','tiller_restaurant_token','status',
'document_infos_bottom', 'document_infos_quotation', 'document_infos_invoice', 'document_infos_delivery_note'], 'string'],
[['negative_balance', 'credit', 'active','online_payment','user_manage_subscription', 'option_allow_user_gift','use_credit_checked_default','tiller'], 'boolean'],
[['name', 'siret', 'logo', 'photo', 'postcode', 'city', 'code','type','credit_functioning','option_behavior_cancel_order', 'document_quotation_prefix', 'document_quotation_first_reference', 'document_invoice_prefix', 'document_invoice_first_reference', 'document_delivery_note_prefix', 'document_delivery_note_first_reference'], 'string', 'max' => 255],
[['free_price', 'credit_limit_reminder','credit_limit'], 'double'],
['free_price', 'compare', 'compareValue' => 0, 'operator' => '>=', 'type' => 'number', 'message' => 'Prix libre doit être supérieur ou égal à 0'],
];
}

/**
* @inheritdoc
*/
public function attributeLabels()
{
return [
'id' => 'ID',
'name' => 'Nom',
'siret' => 'Siret',
'logo' => 'Logo',
'photo' => 'Photo',
'description' => 'Description',
'postcode' => 'Code postal',
'city' => 'Ville',
'code' => 'Code',
'order_deadline' => 'Heure limite de commande',
'order_delay' => 'Délai de commande',
'negative_balance' => 'Solde négatif',
'credit' => 'Crédit pain',
'active' => 'Actif',
'date_creation' => 'Date de création',
'order_infos' => 'Informations',
'slug' => 'Slug',
'type' => 'Type de producteur',
'credit_limit_reminder' => 'Seuil de crédit limite avant relance',
'online_payment' => 'Activer le paiement en ligne',
'secret_key_payplug' => 'Clé secrète Payplug',
'user_manage_subscription' => 'Autoriser les utilisateurs à gérer leurs abonnements',
'mentions' => 'Mentions légales',
'gcs' => 'Conditions générales de vente',
'option_allow_user_gift' => 'Autoriser les utilisateurs à effectuer un don à la plateforme lors de leur commande',
'credit_functioning' => 'Utilisation du Crédit par l\'utilisateur',
'credit_limit' => 'Crédit limite',
'use_credit_checked_default' => 'Cocher par défaut l\'option "Utiliser mon crédit" lors de la commande de l\'utilisateur',
'background_color_logo' => 'Couleur de fond du logo',
'option_behavior_cancel_order' => 'Comportement lors de la suppression d\'une commande',
'tiller' => 'Tiller',
'tiller_provider_token' => 'Token provider',
'tiller_restaurant_token' => 'Token restaurant',
'status' => 'Statut',
'id_tax_rate_default' => 'Taxe',
'document_quotation_prefix' => 'Préfixe des devis',
'document_quotation_first_reference' => 'Première référence des devis',
'document_quotation_duration' => 'Durée du devis',
'document_invoice_prefix' => 'Préfixe des factures',
'document_invoice_first_reference' => 'Première référence des factures',
'document_delivery_note_prefix' => 'Préfixe des bons de livraison',
'document_delivery_note_first_reference' => 'Première référence des bons de livraison',
'document_infos_bottom' => 'Informations affichées en bas des documents',
'document_infos_quotation' => 'Informations affichées en bas des devis',
'document_infos_invoice' => 'Informations affichées en bas des factures',
'document_infos_delivery_note' => 'Informations affichées en bas des bons de livraison',
. '</ul>';

public static $creditFunctioningArray = [
self::CREDIT_FUNCTIONING_MANDATORY => 'Obligatoire',
self::CREDIT_FUNCTIONING_OPTIONAL => 'Optionnelle',
self::CREDIT_FUNCTIONING_USER => 'Basée sur l\'utilisateur',
]; ];
}

/*
* Relations
*/
public function getUserProducer()
{
return $this->hasMany(
UserProducer::className(),
['id_producer' => 'id']
);
}

public function getUser()
{
return $this->hasMany(User::className(), ['id_producer' => 'id']);
}
public function getContact()
{
return $this->hasMany(User::className(),['id_producer' => 'id'])
->where(['status' => User::STATUS_PRODUCER]);
}
public function getTaxRate()
{
return $this->hasOne(TaxRate::className(), ['id' => 'id_tax_rate_default']) ;
}
/**
* Retourne les options de base nécessaires à la fonction de recherche.
*
* @return array
*/
public static function defaultOptionsSearch() {
return [
'with' => [],
'join_with' => [],
'orderby' => 'name ASC',
'attribute_id_producer' => 'id'
] ;
}

/**
* Retourne la liste des établissements pour l'initialisation d'une liste
* sélective.
*
* @return array
*/
public static function getProducerPopulateDropdown()
{
$producers = Producer::find()
->where([
'active' => true,
])
->orderBy('postcode, city ASC')
->all() ;
$departments = Departments::get();
$dataProducers = [];
$optionsProducers = [];
foreach ($producers as $p) {
if (!key_exists('d' . substr($p->postcode, 0, 2), $dataProducers)) {
$dataProducers['d' . substr($p->postcode, 0, 2)] = '<strong>' . $departments[substr($p->postcode, 0, 2)] . '</strong>';
$optionsProducers['d' . substr($p->postcode, 0, 2)] = ['disabled' => true];
}

$dataProducers[$p->id] = '<span class="glyphicon glyphicon-lock"></span> ' . Html::encode($p->name) . ' - ' . Html::encode($p->postcode) . ' ' . Html::encode($p->city) . ' <span class="glyphicon glyphicon-lock"></span>';

if (strlen($p->code)) {
$optionsProducers[$p->id] = ['class' => 'lock'];
}

const BEHAVIOR_DELETE_ORDER_DELETE = 'delete';
const BEHAVIOR_DELETE_ORDER_STATUS = 'status';

var $secret_key_payplug;

/**
* @inheritdoc
*/
public static function tableName()
{
return 'producer';
} }


return ['data' => $dataProducers, 'options' => $optionsProducers];
}

/**
* Retourne le CA de l'établissement pour un mois donné.
*
* @param string $period
* @param boolean $format
* @return string
*/
public function getTurnover($period = '', $format = false)
{
if (!$period) {
$period = date('Y-m');
/**
* @inheritdoc
*/
public function rules()
{
return [
[['name', 'type', 'id_tax_rate_default'], 'required'],
[['tiller_provider_token', 'tiller_restaurant_token'], 'required', 'when' => function ($model) {
return $model->tiller == true;
}],
[['order_deadline', 'order_delay', 'id_tax_rate_default', 'document_quotation_duration'], 'integer'],
['order_deadline', 'in', 'range' => [8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24]],
['order_delay', 'in', 'range' => [1, 2, 3, 4, 5, 6, 7]],
['code', function ($attribute, $params) {
$code = $this->$attribute;
$producer = Producer::findOne(['code' => $code]);
if ($producer && $producer->id != $this->id) {
$this->addError($attribute, 'Ce code est déjà utilisé par un autre producteur.');
}
}],
[['description', 'mentions', 'gcs', 'order_infos', 'slug', 'secret_key_payplug', 'background_color_logo', 'option_behavior_cancel_order', 'tiller_provider_token', 'tiller_restaurant_token', 'status',
'document_infos_bottom', 'document_infos_quotation', 'document_infos_invoice', 'document_infos_delivery_note'], 'string'],
[['negative_balance', 'credit', 'active', 'online_payment', 'user_manage_subscription', 'option_allow_user_gift', 'use_credit_checked_default', 'tiller'], 'boolean'],
[['name', 'siret', 'logo', 'photo', 'postcode', 'city', 'code', 'type', 'credit_functioning', 'option_behavior_cancel_order', 'document_quotation_prefix', 'document_quotation_first_reference', 'document_invoice_prefix', 'document_invoice_first_reference', 'document_delivery_note_prefix', 'document_delivery_note_first_reference'], 'string', 'max' => 255],
[['free_price', 'credit_limit_reminder', 'credit_limit'], 'double'],
['free_price', 'compare', 'compareValue' => 0, 'operator' => '>=', 'type' => 'number', 'message' => 'Prix libre doit être supérieur ou égal à 0'],
];
} }
$connection = Yii::$app->getDb();
$command = $connection->createCommand('

/**
* @inheritdoc
*/
public function attributeLabels()
{
return [
'id' => 'ID',
'name' => 'Nom',
'siret' => 'Siret',
'logo' => 'Logo',
'photo' => 'Photo',
'description' => 'Description',
'postcode' => 'Code postal',
'city' => 'Ville',
'code' => 'Code',
'order_deadline' => 'Heure limite de commande',
'order_delay' => 'Délai de commande',
'negative_balance' => 'Solde négatif',
'credit' => 'Crédit pain',
'active' => 'Actif',
'date_creation' => 'Date de création',
'order_infos' => 'Informations',
'slug' => 'Slug',
'type' => 'Type de producteur',
'credit_limit_reminder' => 'Seuil de crédit limite avant relance',
'online_payment' => 'Activer le paiement en ligne',
'secret_key_payplug' => 'Clé secrète Payplug',
'user_manage_subscription' => 'Autoriser les utilisateurs à gérer leurs abonnements',
'mentions' => 'Mentions légales',
'gcs' => 'Conditions générales de vente',
'option_allow_user_gift' => 'Autoriser les utilisateurs à effectuer un don à la plateforme lors de leur commande',
'credit_functioning' => 'Utilisation du Crédit par l\'utilisateur',
'credit_limit' => 'Crédit limite',
'use_credit_checked_default' => 'Cocher par défaut l\'option "Utiliser mon crédit" lors de la commande de l\'utilisateur',
'background_color_logo' => 'Couleur de fond du logo',
'option_behavior_cancel_order' => 'Comportement lors de la suppression d\'une commande',
'tiller' => 'Tiller',
'tiller_provider_token' => 'Token provider',
'tiller_restaurant_token' => 'Token restaurant',
'status' => 'Statut',
'id_tax_rate_default' => 'Taxe',
'document_quotation_prefix' => 'Préfixe des devis',
'document_quotation_first_reference' => 'Première référence des devis',
'document_quotation_duration' => 'Durée du devis',
'document_invoice_prefix' => 'Préfixe des factures',
'document_invoice_first_reference' => 'Première référence des factures',
'document_delivery_note_prefix' => 'Préfixe des bons de livraison',
'document_delivery_note_first_reference' => 'Première référence des bons de livraison',
'document_infos_bottom' => 'Informations affichées en bas des documents',
'document_infos_quotation' => 'Informations affichées en bas des devis',
'document_infos_invoice' => 'Informations affichées en bas des factures',
'document_infos_delivery_note' => 'Informations affichées en bas des bons de livraison',
];
}

/*
* Relations
*/

public function getUserProducer()
{
return $this->hasMany(
UserProducer::className(),
['id_producer' => 'id']
);
}

public function getUser()
{
return $this->hasMany(User::className(), ['id_producer' => 'id']);
}

public function getContact()
{
return $this->hasMany(User::className(), ['id_producer' => 'id'])
->where(['status' => User::STATUS_PRODUCER]);
}

public function getTaxRate()
{
return $this->hasOne(TaxRate::className(), ['id' => 'id_tax_rate_default']);
}

/**
* Retourne les options de base nécessaires à la fonction de recherche.
*
* @return array
*/
public static function defaultOptionsSearch()
{
return [
'with' => ['taxRate'],
'join_with' => [],
'orderby' => 'name ASC',
'attribute_id_producer' => 'id'
];
}

/**
* Retourne la liste des établissements pour l'initialisation d'une liste
* sélective.
*
* @return array
*/
public static function getProducerPopulateDropdown()
{
$producers = Producer::find()
->where([
'active' => true,
])
->orderBy('postcode, city ASC')
->all();

$departments = Departments::get();
$dataProducers = [];
$optionsProducers = [];
foreach ($producers as $p) {
if (!key_exists('d' . substr($p->postcode, 0, 2), $dataProducers)) {
$dataProducers['d' . substr($p->postcode, 0, 2)] = '<strong>' . $departments[substr($p->postcode, 0, 2)] . '</strong>';
$optionsProducers['d' . substr($p->postcode, 0, 2)] = ['disabled' => true];
}

$dataProducers[$p->id] = '<span class="glyphicon glyphicon-lock"></span> ' . Html::encode($p->name) . ' - ' . Html::encode($p->postcode) . ' ' . Html::encode($p->city) . ' <span class="glyphicon glyphicon-lock"></span>';

if (strlen($p->code)) {
$optionsProducers[$p->id] = ['class' => 'lock'];
}
}

return ['data' => $dataProducers, 'options' => $optionsProducers];
}

/**
* Retourne le CA de l'établissement pour un mois donné.
*
* @param string $period
* @param boolean $format
* @return string
*/
public function getTurnover($period = '', $format = false)
{
if (!$period) {
$period = date('Y-m');
}

$connection = Yii::$app->getDb();
$command = $connection->createCommand('
SELECT SUM(product_order.price * product_order.quantity) AS turnover SELECT SUM(product_order.price * product_order.quantity) AS turnover
FROM `order`, product_order, distribution, product FROM `order`, product_order, distribution, product
WHERE `order`.id = product_order.id_order WHERE `order`.id = product_order.id_order
AND product_order.id_product = product.id AND product_order.id_product = product.id
AND distribution.date > :date_begin AND distribution.date > :date_begin
AND distribution.date < :date_end', [ AND distribution.date < :date_end', [
':date_begin' => date('Y-m-31', strtotime("-1 month", strtotime($period))),
':date_end' => date('Y-m-01', strtotime("+1 month", strtotime($period))),
':id_producer' => $this->id
]);
':date_begin' => date('Y-m-31', strtotime("-1 month", strtotime($period))),
':date_end' => date('Y-m-01', strtotime("+1 month", strtotime($period))),
':id_producer' => $this->id
]);


$result = $command->queryOne();
$turnover = $result['turnover'];
$result = $command->queryOne();
$turnover = $result['turnover'];


if ($format) {
return number_format($turnover, 2) . ' €';
}
else {
return $turnover;
}
}

/**
* Retourne le montant à facturer pour une période donnée.
*
* @param string $periode
* @param float $ca
* @param boolean $format
* @return string
*/
public function getMAmountBilled($format = false)
{
if ($format) {
return number_format($this->free_price, 2) . ' €' ;
} else {
return $this->free_price ;
if ($format) {
return number_format($turnover, 2) . ' €';
} else {
return $turnover;
}
} }
}

/**
* Retourne la facture d'une période donnée.
*
* @param string $periode
* @return Facture
*/
public function getInvoice($period = '')
{
if (!$period) {
$period = date('Y-m', strtotime('-1 month'));

/**
* Retourne le montant à facturer pour une période donnée.
*
* @param string $periode
* @param float $ca
* @param boolean $format
* @return string
*/
public function getMAmountBilled($format = false)
{
if ($format) {
return number_format($this->free_price, 2) . ' €';
} else {
return $this->free_price;
}
} }
$invoice = Invoice::searchOne(
['id_producer' => $this->id, 'period' => ':period'],
['params' => [':period' => $period]]
) ;

return $facture;
}

/**
* Retourne la facture du mois dernier.
*
* @return Facture
*/
public function getInvoiceLastMonth()
{
return $this->getInvoice(date('Y-m', strtotime('-1 month')));
}

/**
* Retourne une configuration d'un établissement donné.
*
* @param string $config
* @param integer $id_etablissement
* @return mixed
*/
public static function getConfig($config = '', $idProducer = 0)
{
if (strlen($config)) {
if (!$idProducer) {
$idProducer = Producer::getId() ;
}
$producer = self::findOne($idProducer);
if ($producer) {
return $producer->$config;
}

/**
* Retourne la facture d'une période donnée.
*
* @param string $periode
* @return Facture
*/
public function getInvoice($period = '')
{
if (!$period) {
$period = date('Y-m', strtotime('-1 month'));
}

$invoice = Invoice::searchOne(
['id_producer' => $this->id, 'period' => ':period'],
['params' => [':period' => $period]]
);

return $invoice;
} }


return false;
}

/**
* Retourne le montant de l'abonnement à prix libre définit par
* le producteur.
*
* @param boolean $format
* @return mixed
*/
public function getFreePrice($format = true)
{
if (!is_null($this->free_price)) {
if($format) {
return number_format($this->free_price, 2, ',', false) . ' € HT';
}
else {
return $this->free_price;
}
/**
* Retourne la facture du mois dernier.
*
* @return Facture
*/
public function getInvoiceLastMonth()
{
return $this->getInvoice(date('Y-m', strtotime('-1 month')));
} }
}
/**
* Lie un utilisateur à un producteur.
*
* @param integer $id_user
* @param integer $id_producer
* @return UserProducer
*/
public static function addUser($idUser, $idProducer, $bookmark = 1)
{
$userProducer = UserProducer::searchOne([
'user_producer.id_user' => $idUser,
'user_producer.id_producer' => $idProducer
]) ;

if (!$userProducer) {
$newUserProducer = new UserProducer;
$newUserProducer->id_producer = $idProducer;
$newUserProducer->id_user = $idUser;
$newUserProducer->credit = 0;
$newUserProducer->active = 1;
$newUserProducer->bookmark = (int) $bookmark ;
$newUserProducer->save();
} else {
if (!$userProducer->active) {
$userProducer->active = 1;
$userProducer->save();
}

/**
* Retourne une configuration d'un établissement donné.
*
* @param string $config
* @param integer $id_etablissement
* @return mixed
*/
public static function getConfig($config = '', $idProducer = 0)
{
if (strlen($config)) {
if (!$idProducer) {
$idProducer = GlobalParam::getCurrentProducerId();
}

$producer = self::findOne($idProducer);
if ($producer) {
return $producer->$config;
}
}

return false;
} }
return $userProducer ;
}
/**
* Retourne l'ID du producteur courant.
*
* @return integer|boolean
*/
public static function getId()
{
if(Yii::$app->controller->module->id == 'app-backend') {
if(!Yii::$app->user->isGuest) {
return Yii::$app->user->identity->id_producer ;
}

/**
* Retourne le montant de l'abonnement à prix libre définit par
* le producteur.
*
* @param boolean $format
* @return mixed
*/
public function getFreePrice($format = true)
{
if (!is_null($this->free_price)) {
if ($format) {
return number_format($this->free_price, 2, ',', false) . ' € HT';
} else {
return $this->free_price;
}
}
} }
else {
return Yii::$app->controller->getProducer()->id ; ;

/**
* Lie un utilisateur à un producteur.
*
* @param integer $id_user
* @param integer $id_producer
* @return UserProducer
*/
public static function addUser($idUser, $idProducer, $bookmark = 1)
{
$userProducer = UserProducer::searchOne([
'user_producer.id_user' => $idUser,
'user_producer.id_producer' => $idProducer
]);

if (!$userProducer) {
$newUserProducer = new UserProducer;
$newUserProducer->id_producer = $idProducer;
$newUserProducer->id_user = $idUser;
$newUserProducer->credit = 0;
$newUserProducer->active = 1;
$newUserProducer->bookmark = (int)$bookmark;
$newUserProducer->save();
} else {
if (!$userProducer->active) {
$userProducer->active = 1;
$userProducer->save();
}
}

return $userProducer;
} }
return false ;
}
/**
* Retourne le producteur courant.
*
* @return Producer|boolean
*/
public static function getCurrent()
{
if(self::getId()) {
return self::searchOne() ;

/**
* Retourne la date la plus proche où il est possible de commander.
* Attention, cette méthode ne garantit pas qu'une distribution a été initialisée
* à cette date.
*
* @return string
*/
public function getEarliestDateOrder()
{
$deadline = 20;
$earliestDateOrder = date('Y-m-d');

if ($this->order_deadline) {
$deadline = $this->order_deadline;
}
if (date('H') >= $deadline) {
$earliestDateOrder = date('Y-m-d', strtotime(date('Y-m-d')) + ($this->order_delay) * (24 * 60 * 60));
} else {
$earliestDateOrder = date('Y-m-d', strtotime(date('Y-m-d')) + ($this->order_delay - 1) * (24 * 60 * 60));
}

return $earliestDateOrder;
} }
return false ;
}
/**
* Retourne la date la plus proche où il est possible de commander.
* Attention, cette méthode ne garantit pas qu'une distribution a été initialisée
* à cette date.
*
* @return string
*/
public function getEarliestDateOrder()
{
$deadline = 20;
$earliestDateOrder = date('Y-m-d');
if($this->order_deadline) {
$deadline = $this->order_deadline;

/**
* Retourne le chemin vers le fichier contenant la clé secrète d'API de Payplug
*
* @return string
*/
public function getFilenameSecretKeyPayplug()
{
return '../../common/config/payplug/' . $this->id . '.key';
} }
if (date('H') >= $deadline) {
$earliestDateOrder = date('Y-m-d', strtotime(date('Y-m-d')) + ($this->order_delay) * (24 * 60 * 60));
} else {
$earliestDateOrder = date('Y-m-d', strtotime(date('Y-m-d')) + ($this->order_delay - 1) * (24 * 60 * 60));

/**
* Enregistre la clé secrète d'API de Payplug dans un fichier
*/
public function saveSecretKeyPayplug()
{
if ($this->online_payment) {
$handle = fopen($this->getFilenameSecretKeyPayplug(), "w");
fwrite($handle, $this->secret_key_payplug);
fclose($handle);
}
} }
return $earliestDateOrder ;
}
/**
* Retourne le chemin vers le fichier contenant la clé secrète d'API de Payplug
*
* @return string
*/
public function getFilenameSecretKeyPayplug()
{
return '../../common/config/payplug/'.$this->id.'.key' ;
}
/**
* Enregistre la clé secrète d'API de Payplug dans un fichier
*/
public function saveSecretKeyPayplug()
{
if($this->online_payment) {
$handle = fopen($this->getFilenameSecretKeyPayplug(),"w");
fwrite($handle,$this->secret_key_payplug);
fclose($handle);

/**
* Retourne la clé secrète d'API de Payplug.
*
* @return string
*/
public function getSecretKeyPayplug()
{
if (file_exists($this->getFilenameSecretKeyPayplug())) {
$handle = fopen($this->getFilenameSecretKeyPayplug(), "r");
$filesize = filesize($this->getFilenameSecretKeyPayplug());
if ($handle && $filesize) {
$secretKey = fread($handle, $filesize);
fclose($handle);
return $secretKey;
}
}

return '';
} }
}
/**
* Retourne la clé secrète d'API de Payplug.
*
* @return string
*/
public function getSecretKeyPayplug()
{
if(file_exists($this->getFilenameSecretKeyPayplug())) {
$handle = fopen($this->getFilenameSecretKeyPayplug(), "r") ;
$filesize = filesize($this->getFilenameSecretKeyPayplug()) ;
if($handle && $filesize) {
$secretKey = fread($handle, $filesize);
fclose($handle);
return $secretKey ;
}

/**
* Retourne le compte producteur de démonstration.
*
* @return Producer
*/
public static function getDemoAccount()
{
$producer = Producer::find()->where('name LIKE \'Démo\'')->one();
return $producer;
} }
return '' ;
}
/**
* Retourne le compte producteur de démonstration.
*
* @return Producer
*/
public static function getDemoAccount()
{
$producer = Producer::find()->where('name LIKE \'Démo\'')->one() ;
return $producer ;
}
/**
* Retourne true si le compte est un compte de démo.
*
* @return boolean
*/
public function isDemo()
{
if(strpos($this->name, 'Démo') !== false) {
return true ;

/**
* Retourne true si le compte est un compte de démo.
*
* @return boolean
*/
public function isDemo()
{
if (strpos($this->name, 'Démo') !== false) {
return true;
}

return false;
} }
return false ;
}
} }

+ 3
- 2
common/models/Product.php View File



namespace common\models; namespace common\models;


use common\helpers\GlobalParam;
use Yii; use Yii;
use common\components\ActiveRecordCommon; use common\components\ActiveRecordCommon;


*/ */
public function save($runValidation = true, $attributeNames = NULL) public function save($runValidation = true, $attributeNames = NULL)
{ {
$this->id_producer = Producer::getId();
$this->id_producer = GlobalParam::getCurrentProducerId();
return parent::save($runValidation, $attributeNames); return parent::save($runValidation, $attributeNames);
} }


return Product::find() return Product::find()
->leftJoin('product_distribution', 'product.id = product_distribution.id_product') ->leftJoin('product_distribution', 'product.id = product_distribution.id_product')
->where([ ->where([
'id_producer' => Producer::getId(),
'id_producer' => GlobalParam::getCurrentProducerId(),
'product_distribution.id_distribution' => $idDistribution 'product_distribution.id_distribution' => $idDistribution
]) ])
->orderBy('product_distribution.active DESC, product.order ASC') ->orderBy('product_distribution.active DESC, product.order ASC')

+ 2
- 1
common/models/ProductSearch.php View File



namespace common\models ; namespace common\models ;


use common\helpers\GlobalParam;
use common\models\Product ; use common\models\Product ;


class ProductSearch extends Product class ProductSearch extends Product
$query = Product::find() $query = Product::find()
->with($optionsSearch['with']) ->with($optionsSearch['with'])
->innerJoinWith($optionsSearch['join_with'], true) ->innerJoinWith($optionsSearch['join_with'], true)
->where(['product.id_producer' => Producer::getId()])
->where(['product.id_producer' => GlobalParam::getCurrentProducerId()])
->orderBy('product.order ASC') ->orderBy('product.order ASC')
; ;

+ 2
- 1
common/models/QuotationSearch.php View File

namespace common\models ; namespace common\models ;


use common\models\Quotation ; use common\models\Quotation ;
use common\helpers\GlobalParam;


class QuotationSearch extends Quotation class QuotationSearch extends Quotation
{ {
$query = Quotation::find() $query = Quotation::find()
->with($optionsSearch['with']) ->with($optionsSearch['with'])
->joinWith($optionsSearch['join_with'], true) ->joinWith($optionsSearch['join_with'], true)
->where(['distribution.id_producer' => Producer::getId()])
->where(['distribution.id_producer' => GlobalParam::getCurrentProducerId()])
->orderBy('quotation.reference DESC') ->orderBy('quotation.reference DESC')
; ;

+ 5
- 4
common/models/Subscription.php View File



namespace common\models; namespace common\models;


use common\helpers\GlobalParam;
use Yii; use Yii;
use common\components\ActiveRecordCommon ; use common\components\ActiveRecordCommon ;
use common\models\Producer; use common\models\Producer;
{ {
$distribution = Distribution::searchOne([ $distribution = Distribution::searchOne([
'date' => date('Y-m-d', strtotime($date)), 'date' => date('Y-m-d', strtotime($date)),
'id_producer' => Producer::getId(),
'id_producer' => GlobalParam::getCurrentProducerId(),
]) ; ]) ;


if ($distribution) { if ($distribution) {
*/ */
public function searchMatchedIncomingDistributions() public function searchMatchedIncomingDistributions()
{ {
$producer = Producer::getCurrent() ;
$producer = GlobalParam::getCurrentProducer() ;
$params = [ $params = [
':date_earliest_order' => $producer->getEarliestDateOrder(), ':date_earliest_order' => $producer->getEarliestDateOrder(),
':date_begin' => date('Y-m-d', strtotime($this->date_begin)), ':date_begin' => date('Y-m-d', strtotime($this->date_begin)),
':id_producer' => Producer::getId()
':id_producer' => GlobalParam::getCurrentProducerId()
] ; ] ;
$incomingDistributions = Distribution::find() $incomingDistributions = Distribution::find()
public function deleteOrdersIncomingDistributions() public function deleteOrdersIncomingDistributions()
{ {
$params = [ $params = [
':id_producer' => Producer::getId(),
':id_producer' => GlobalParam::getCurrentProducerId(),
':date_today' => date('Y-m-d'), ':date_today' => date('Y-m-d'),
':date_begin' => $this->date_begin, ':date_begin' => $this->date_begin,
':id_subscription' => $this->id ':id_subscription' => $this->id

+ 2
- 1
common/models/SubscriptionSearch.php View File



namespace common\models; namespace common\models;


use common\helpers\GlobalParam;
use common\models\Subscription ; use common\models\Subscription ;


class SubscriptionSearch extends Subscription class SubscriptionSearch extends Subscription
$query = Subscription::find() $query = Subscription::find()
->with($optionsSearch['with']) ->with($optionsSearch['with'])
->joinWith($optionsSearch['join_with'], true) ->joinWith($optionsSearch['join_with'], true)
->where(['subscription.id_producer' => Producer::getId()])
->where(['subscription.id_producer' => GlobalParam::getCurrentProducerId()])
->groupBy('subscription.id') ->groupBy('subscription.id')
; ;

+ 6
- 5
common/models/User.php View File



namespace common\models; namespace common\models;


use common\helpers\GlobalParam;
use yii\web\IdentityInterface; use yii\web\IdentityInterface;
use yii\db\Query ; use yii\db\Query ;
use common\components\ActiveRecordCommon ; use common\components\ActiveRecordCommon ;
public static function findBy($params = []) public static function findBy($params = [])
{ {
if (!isset($params['id_producer'])) { if (!isset($params['id_producer'])) {
$params['id_producer'] = Producer::getId() ;
$params['id_producer'] = GlobalParam::getCurrentProducerId() ;
} }
$query = (new Query()) $query = (new Query())
$query->innerJoin( $query->innerJoin(
'subscription', 'subscription',
'user.id = subscription.id_user AND subscription.id_producer = :id_producer', 'user.id = subscription.id_user AND subscription.id_producer = :id_producer',
[':id_producer' => Producer::getId()]
[':id_producer' => GlobalParam::getCurrentProducerId()]
)->groupBy('user.id') ; )->groupBy('user.id') ;
} }
->innerJoinWith('pointSale', true) ->innerJoinWith('pointSale', true)
->where([ ->where([
'user_point_sale.id_user' => $this->id, 'user_point_sale.id_user' => $this->id,
'point_sale.id_producer' => Producer::getId()
'point_sale.id_producer' => GlobalParam::getCurrentProducerId()
]) ])
->all() ; ->all() ;
else { else {
$lastOrder = Order::find()->innerJoinWith('pointSale', true)->where([ $lastOrder = Order::find()->innerJoinWith('pointSale', true)->where([
'id_user' => $this->id, 'id_user' => $this->id,
'point_sale.id_producer' => Producer::getId()
'point_sale.id_producer' => GlobalParam::getCurrentProducerId()
]) ])
->orderBy('order.id DESC') ->orderBy('order.id DESC')
->one() ; ->one() ;
public function sendMailWelcome($password) public function sendMailWelcome($password)
{ {
if (strlen($this->email)) { if (strlen($this->email)) {
$producer = Producer::findOne(Producer::getId());
$producer = Producer::findOne(GlobalParam::getCurrentProducerId());
Yii::$app->mailer->compose(); Yii::$app->mailer->compose();
$mail = Yii::$app->mailer->compose( $mail = Yii::$app->mailer->compose(
['html' => 'createUserAdmin-html', 'text' => 'createUserAdmin-text'], ['user' => $this, 'producer' => $producer, 'password' => $password] ['html' => 'createUserAdmin-html', 'text' => 'createUserAdmin-text'], ['user' => $this, 'producer' => $producer, 'password' => $password]

+ 134
- 133
common/models/UserSearch.php View File

<?php <?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\models ;

use common\models\User ;
/**
* 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\models;

use common\helpers\GlobalParam;
use common\models\User;


class UserSearch extends User class UserSearch extends User
{ {
var $id_point_sale ;
var $subscribers ;
var $inactive ;
var $username ;
public function rules()
{
return [
[['no_mail', 'mail_distribution_monday', 'mail_distribution_tuesday', 'mail_distribution_wednesday', 'mail_distribution_thursday', 'mail_distribution_friday', 'mail_distribution_saturday', 'mail_distribution_sunday'], 'boolean'],
[['lastname', 'name', 'phone', 'address'], 'string'],
[['id_point_sale', 'inactive', 'subscribers'],'integer'],
[['date_last_connection', 'id_point_sale', 'username'], 'safe'],
];
}

public function search($params = [])
{
$optionsSearch = self::defaultOptionsSearch() ;
$query = User::find()
->select(
'`user`.id, '
.'`user`.username,'
.'`user`.email, '
.'`user`.status, '
.'`user`.created_at, '
.'`user`.updated_at, '
.'`user`.lastname, '
.'`user`.name, '
.'`user`.phone, '
.'`user`.address, '
.'`user`.no_mail, '
.'`user`.mail_distribution_monday, '
.'`user`.mail_distribution_tuesday, '
.'`user`.mail_distribution_wednesday, '
.'`user`.mail_distribution_thursday, '
.'`user`.mail_distribution_friday, '
.'`user`.mail_distribution_saturday, '
.'`user`.mail_distribution_sunday, '
.'`user`.id_producer, '
.'`user`.date_last_connection, '
. '(SELECT COUNT(*) FROM `order` WHERE `user`.id = `order`.id_user) AS count_orders');
$dataProvider = new ActiveDataProvider([
'query' => $query,
'sort' => ['attributes' => ['username','credit','orders']],
'pagination' => [
'pageSize' => 20,
],
]);
$dataProvider->sort->attributes['username'] = [
'asc' => ['user.lastname' => SORT_ASC, 'user.name' => SORT_ASC],
'desc' => ['user.lastname' => SORT_DESC, 'user.name' => SORT_DESC],
];
$dataProvider->sort->attributes['credit'] = [
'asc' => ['user_producer.credit' => SORT_ASC],
'desc' => ['user_producer.credit' => SORT_DESC],
];
$this->load($params);
if (!$this->validate()) {
return $dataProvider;
}
$query->innerJoin('user_producer','user.id = user_producer.id_user AND user_producer.id_producer = :id_producer AND user_producer.active = 1', [':id_producer' => Producer::getId()]) ;
if(isset($this->id_point_sale) && $this->id_point_sale) {
$pointSale = PointSale::findOne(['id' => $this->id_point_sale]) ;
$query->innerJoin('user_point_sale','user.id = user_point_sale.id_user AND user_point_sale.id_point_sale = :id_point_sale',[':id_point_sale' => $this->id_point_sale]) ;
}
if(isset($this->subscribers) && $this->subscribers) {
$query->innerJoin(
'subscription',
'user.id = subscription.id_user AND subscription.id_producer = :id_producer',
[':id_producer' => Producer::getId()]
)->groupBy('user.id') ;
var $id_point_sale;
var $subscribers;
var $inactive;
var $username;

public function rules()
{
return [
[['no_mail', 'mail_distribution_monday', 'mail_distribution_tuesday', 'mail_distribution_wednesday', 'mail_distribution_thursday', 'mail_distribution_friday', 'mail_distribution_saturday', 'mail_distribution_sunday'], 'boolean'],
[['lastname', 'name', 'phone', 'address'], 'string'],
[['id_point_sale', 'inactive', 'subscribers'], 'integer'],
[['date_last_connection', 'id_point_sale', 'username'], 'safe'],
];
} }
if(isset($this->inactive) && $this->inactive) {
$query->having([
'count_orders' => 0
]) ;

public function search($params = [])
{
$optionsSearch = self::defaultOptionsSearch();

$query = User::find()
->select(
'`user`.id, '
. '`user`.username,'
. '`user`.email, '
. '`user`.status, '
. '`user`.created_at, '
. '`user`.updated_at, '
. '`user`.lastname, '
. '`user`.name, '
. '`user`.phone, '
. '`user`.address, '
. '`user`.no_mail, '
. '`user`.mail_distribution_monday, '
. '`user`.mail_distribution_tuesday, '
. '`user`.mail_distribution_wednesday, '
. '`user`.mail_distribution_thursday, '
. '`user`.mail_distribution_friday, '
. '`user`.mail_distribution_saturday, '
. '`user`.mail_distribution_sunday, '
. '`user`.id_producer, '
. '`user`.date_last_connection, '
. '(SELECT COUNT(*) FROM `order` WHERE `user`.id = `order`.id_user) AS count_orders');

$dataProvider = new ActiveDataProvider([
'query' => $query,
'sort' => ['attributes' => ['username', 'credit', 'orders']],
'pagination' => [
'pageSize' => 20,
],
]);

$dataProvider->sort->attributes['username'] = [
'asc' => ['user.lastname' => SORT_ASC, 'user.name' => SORT_ASC],
'desc' => ['user.lastname' => SORT_DESC, 'user.name' => SORT_DESC],
];

$dataProvider->sort->attributes['credit'] = [
'asc' => ['user_producer.credit' => SORT_ASC],
'desc' => ['user_producer.credit' => SORT_DESC],
];

$this->load($params);
if (!$this->validate()) {
return $dataProvider;
}

$query->innerJoin('user_producer', 'user.id = user_producer.id_user AND user_producer.id_producer = :id_producer AND user_producer.active = 1', [':id_producer' => GlobalParam::getCurrentProducerId()]);

if (isset($this->id_point_sale) && $this->id_point_sale) {
$pointSale = PointSale::findOne(['id' => $this->id_point_sale]);
$query->innerJoin('user_point_sale', 'user.id = user_point_sale.id_user AND user_point_sale.id_point_sale = :id_point_sale', [':id_point_sale' => $this->id_point_sale]);
}

if (isset($this->subscribers) && $this->subscribers) {
$query->innerJoin(
'subscription',
'user.id = subscription.id_user AND subscription.id_producer = :id_producer',
[':id_producer' => GlobalParam::getCurrentProducerId()]
)->groupBy('user.id');
}

if (isset($this->inactive) && $this->inactive) {
$query->having([
'count_orders' => 0
]);
}

$query->andFilterWhere([
'or',
['like', 'user.lastname', $this->username],
['like', 'user.name', $this->username]
]);

return $dataProvider;
} }
$query->andFilterWhere([
'or',
['like', 'user.lastname', $this->username],
['like', 'user.name', $this->username]
]);
return $dataProvider;
}

} }

+ 627
- 630
producer/controllers/OrderController.php
File diff suppressed because it is too large
View File


+ 3
- 2
producer/controllers/SiteController.php View File



namespace producer\controllers; namespace producer\controllers;


use common\helpers\GlobalParam;
use common\models\Producer ; use common\models\Producer ;


class SiteController extends ProducerBaseController class SiteController extends ProducerBaseController
*/ */
public function actionMentions() public function actionMentions()
{ {
$producer = Producer::getCurrent() ;
$producer = GlobalParam::getCurrentProducer() ;
if(!strlen($producer->mentions)) { if(!strlen($producer->mentions)) {
throw new \yii\base\UserException('Mentions légales introuvables.') ; throw new \yii\base\UserException('Mentions légales introuvables.') ;
*/ */
public function actionGcs() public function actionGcs()
{ {
$producer = Producer::getCurrent() ;
$producer = GlobalParam::getCurrentProducer() ;
if(!strlen($producer->gcs)) { if(!strlen($producer->gcs)) {
throw new \yii\base\UserException('Conditions générales de vente introuvables.') ; throw new \yii\base\UserException('Conditions générales de vente introuvables.') ;

+ 2
- 1
producer/controllers/SubscriptionController.php View File



namespace producer\controllers; namespace producer\controllers;


use common\helpers\GlobalParam;
use common\models\SubscriptionForm ; use common\models\SubscriptionForm ;
use common\models\SubscriptionSearch ; use common\models\SubscriptionSearch ;
use common\models\Product ; use common\models\Product ;
{ {
// form // form
$model = new SubscriptionForm; $model = new SubscriptionForm;
$model->id_producer = Producer::getId();
$model->id_producer = GlobalParam::getCurrentProducerId();
$model->id_user = User::getCurrentId() ; $model->id_user = User::getCurrentId() ;
$posts = Yii::$app->request->post() ; $posts = Yii::$app->request->post() ;

+ 252
- 230
producer/views/layouts/main.php View File

<?php <?php


/**
Copyright La boîte à pain (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.
*/
/**
* Copyright La boîte à pain (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\bootstrap\Nav; use yii\bootstrap\Nav;
use yii\bootstrap\NavBar; use yii\bootstrap\NavBar;
use common\helpers\Url; use common\helpers\Url;
use common\models\Producer; use common\models\Producer;
use common\models\User; use common\models\User;
use common\helpers\GlobalParam;


\common\assets\CommonAsset::register($this); \common\assets\CommonAsset::register($this);
\producer\assets\AppAsset::register($this); \producer\assets\AppAsset::register($this);


$producer = $this->context->getProducer() ;
if(!Yii::$app->user->isGuest) {
$userProducer = UserProducer::findOne(['id_user' => User::getCurrentId(), 'id_producer' => $producer->id ]) ;
$producer = $this->context->getProducer();
if (!Yii::$app->user->isGuest) {
$userProducer = UserProducer::findOne(['id_user' => User::getCurrentId(), 'id_producer' => $producer->id]);
} }


?> ?>
<title><?= Html::encode($producer->name); ?> | <?= $this->getPageTitle(); ?></title> <title><?= Html::encode($producer->name); ?> | <?= $this->getPageTitle(); ?></title>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="base-url" content="<?= Yii::$app->urlManager->baseUrl ; ?>">
<meta name="slug-producer" content="<?= $producer->slug ; ?>">
<?= Html::csrfMetaTags() ?>
<link rel="icon" type="image/png" href="<?php echo Yii::$app->urlManager->getBaseUrl(); ?>/img/favicon-distrib.png" />
<?php $this->head() ?>
<meta name="base-url" content="<?= Yii::$app->urlManager->baseUrl; ?>">
<meta name="slug-producer" content="<?= $producer->slug; ?>">
<?= Html::csrfMetaTags() ?>
<link rel="icon" type="image/png"
href="<?php echo Yii::$app->urlManager->getBaseUrl(); ?>/img/favicon-distrib.png"/>
<?php $this->head() ?>
</head> </head>
<body class="<?= Yii::$app->controller->id.'-'.Yii::$app->controller->action->id ?>">
<?php $this->beginBody() ?>
<div id="header-bap">
<body class="<?= Yii::$app->controller->id . '-' . Yii::$app->controller->action->id ?>">
<?php $this->beginBody() ?>
<div id="header-bap">
<?php <?php
echo Nav::widget([
echo Nav::widget([
'encodeLabels' => false, 'encodeLabels' => false,
'items' => [ 'items' => [
[
'label' => '<span class="glyphicon glyphicon-menu-hamburger"></span>',
'options' => ['id' => 'label1'],
'url' => '#',
'items' => [
[
'label' => '<span class="glyphicon glyphicon-chevron-left"></span> Retour à l\'accueil',
'url' => Yii::$app->urlManagerFrontend->createAbsoluteUrl(['site/index']),
'visible' => Yii::$app->user->isGuest
],
[
'label' => '<span class="glyphicon glyphicon-user"></span> Inscription',
'url' => Yii::$app->urlManagerFrontend->createAbsoluteUrl(['site/signup']),
'visible' => Yii::$app->user->isGuest
],
[
'label' => '<span class="glyphicon glyphicon-log-in"></span> Connexion',
'url' => Yii::$app->urlManagerFrontend->createAbsoluteUrl(['site/login','return_url' => Yii::$app->urlManager->createAbsoluteUrl(['site/index'])]),
[
'label' => '<span class="glyphicon glyphicon-menu-hamburger"></span>',
'options' => ['id' => 'label1'],
'url' => '#',
'items' => [
[
'label' => '<span class="glyphicon glyphicon-chevron-left"></span> Retour à l\'accueil',
'url' => Yii::$app->urlManagerFrontend->createAbsoluteUrl(['site/index']),
'visible' => Yii::$app->user->isGuest
],
[
'label' => '<span class="glyphicon glyphicon-user"></span> Inscription',
'url' => Yii::$app->urlManagerFrontend->createAbsoluteUrl(['site/signup']),
'visible' => Yii::$app->user->isGuest
],
[
'label' => '<span class="glyphicon glyphicon-log-in"></span> Connexion',
'url' => Yii::$app->urlManagerFrontend->createAbsoluteUrl(['site/login', 'return_url' => Yii::$app->urlManager->createAbsoluteUrl(['site/index'])]),
'visible' => Yii::$app->user->isGuest
],
],
'visible' => Yii::$app->user->isGuest 'visible' => Yii::$app->user->isGuest
],
], ],
'visible' => Yii::$app->user->isGuest
],
[
'label' => '<span class="glyphicon glyphicon-menu-hamburger"></span>',
'options' => ['id' => 'label1'],
'url' => '#',
'items' => [
[
'label' => '<span class="glyphicon glyphicon-chevron-left"></span> Retour à l\'accueil',
'url' => Yii::$app->urlManagerFrontend->createAbsoluteUrl(['site/index']),
],
[
'label' => '<span class="glyphicon glyphicon-user"></span> Profil',
'url' => Yii::$app->urlManagerFrontend->createAbsoluteUrl(['user/update']),
],
[
'label' => '<span class="glyphicon glyphicon-off"></span> Déconnexion<br /><small>'.(!Yii::$app->user->isGuest ? Html::encode(Yii::$app->user->identity->name .' '.strtoupper(substr(Yii::$app->user->identity->lastname, 0, 1))) : '').'.</small>',
'url' => Yii::$app->urlManagerFrontend->createAbsoluteUrl(['site/logout']),
]
[
'label' => '<span class="glyphicon glyphicon-menu-hamburger"></span>',
'options' => ['id' => 'label1'],
'url' => '#',
'items' => [
[
'label' => '<span class="glyphicon glyphicon-chevron-left"></span> Retour à l\'accueil',
'url' => Yii::$app->urlManagerFrontend->createAbsoluteUrl(['site/index']),
],
[
'label' => '<span class="glyphicon glyphicon-user"></span> Profil',
'url' => Yii::$app->urlManagerFrontend->createAbsoluteUrl(['user/update']),
],
[
'label' => '<span class="glyphicon glyphicon-off"></span> Déconnexion<br /><small>' . (!Yii::$app->user->isGuest ? Html::encode(Yii::$app->user->identity->name . ' ' . strtoupper(substr(Yii::$app->user->identity->lastname, 0, 1))) : '') . '.</small>',
'url' => Yii::$app->urlManagerFrontend->createAbsoluteUrl(['site/logout']),
]
],
'visible' => !Yii::$app->user->isGuest
], ],
'visible' => !Yii::$app->user->isGuest
],
], ],
'options' => ['id' =>'nav-bap'],
]);
'options' => ['id' => 'nav-bap'],
]);
?> ?>
</div>
<div class="container">
<div id="left" class="col-md-3">
<div class="fixed">
<?php if(strlen($producer->logo)): ?>
<div id="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; ?>>
<a href="<?= Yii::$app->urlManager->createUrl(['site/index']) ?>">
<img class="img-logo" src="<?= Yii::$app->urlManager->baseUrl; ?>/uploads/<?= $producer->logo; ?>" alt="Logo <?= Html::encode($producer->name) ?>" />
</a>
</div>
</div>

<div class="container">
<div id="left" class="col-md-3">
<div class="fixed">
<?php if (strlen($producer->logo)): ?>
<div id="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; ?>>
<a href="<?= Yii::$app->urlManager->createUrl(['site/index']) ?>">
<img class="img-logo"
src="<?= Yii::$app->urlManager->baseUrl; ?>/uploads/<?= $producer->logo; ?>"
alt="Logo <?= Html::encode($producer->name) ?>"/>
</a>
</div>
<?php endif; ?> <?php endif; ?>
<h1><?= Html::encode($producer->name); ?></h1>
<h2><?= Html::encode($producer->type) ?> à <?= Html::encode($producer->city); ?> (<?= Html::encode($producer->postcode); ?>)</h2>
<h1><?= Html::encode($producer->name); ?></h1>
<h2><?= Html::encode($producer->type) ?> à <?= Html::encode($producer->city); ?>
(<?= Html::encode($producer->postcode); ?>)</h2>


<nav id="main-nav">
<nav id="main-nav">
<?php <?php


$credit = '' ;
if(isset($userProducer) && $userProducer) {
$labelType = $userProducer->credit > 0 ? 'success' : 'danger' ;
$credit = ' <span class="label label-'.$labelType.'">'.number_format($userProducer->credit, 2).' €</span>' ;
}
$credit = '';
if (isset($userProducer) && $userProducer) {
$labelType = $userProducer->credit > 0 ? 'success' : 'danger';
$credit = ' <span class="label label-' . $labelType . '">' . number_format($userProducer->credit, 2) . ' €</span>';
}


$countSubcriptions = Subscription::find()
$countSubcriptions = Subscription::find()
->where([ ->where([
'subscription.id_user' => User::getCurrentId(),
'subscription.id_producer' => Producer::getId(),
])->count() ;
$labelSubscription = $countSubcriptions > 0 ? 'success' : 'default' ;
'subscription.id_user' => User::getCurrentId(),
'subscription.id_producer' => GlobalParam::getCurrentProducerId(),
])->count();
$labelSubscription = $countSubcriptions > 0 ? 'success' : 'default';


$countOrders = Order::find()
$countOrders = Order::find()
->joinWith(['distribution']) ->joinWith(['distribution'])
->where([ ->where([
'id_user' => User::getCurrentId(),
'distribution.id_producer' => Producer::getId()
'id_user' => User::getCurrentId(),
'distribution.id_producer' => GlobalParam::getCurrentProducerId()
]) ])
->params([':date_today' => date('Y-m-d')]) ->params([':date_today' => date('Y-m-d')])
->andWhere('distribution.date >= :date_today') ->andWhere('distribution.date >= :date_today')
->count(); ->count();
$labelOrders = $countOrders > 0 ? 'success' : 'default' ;
$labelOrders = $countOrders > 0 ? 'success' : 'default';




echo Nav::widget([
echo Nav::widget([
'encodeLabels' => false, 'encodeLabels' => false,
'options' => ['class' =>'nav'],
'options' => ['class' => 'nav'],
'items' => [ 'items' => [
[
'label' => '<span class="glyphicon glyphicon-th-large"></span> Accueil',
'url' => Yii::$app->urlManager->createUrl(['site/index']),
'active' => $this->getControllerAction() == 'site/index',
],
[
'label' => '<span class="glyphicon glyphicon-plus"></span> Commander',
'url' => Yii::$app->urlManager->createUrl(['order/order']),
'visible' => !Yii::$app->user->isGuest,
'active' => $this->getControllerAction() == 'order/order',
],
[
'label' => '<span class="glyphicon glyphicon-plus"></span> Commander',
'url' => Yii::$app->urlManagerFrontend->createAbsoluteUrl(['site/producer','id' => $this->context->getProducer()->id,'return_url' => Yii::$app->urlManagerProducer->createAbsoluteUrl(['order/order','slug_producer' => $this->context->getProducer()->slug])]),
'visible' => Yii::$app->user->isGuest,
'active' => $this->getControllerAction() == 'order/order',
],
[
'label' => '<span class="glyphicon glyphicon-folder-open"></span> Mes commandes <span class="label label-'.$labelOrders.'">'.$countOrders.'</span>',
'url' => Yii::$app->urlManager->createUrl(['order/history']),
'visible' => !Yii::$app->user->isGuest,
'active' => $this->getControllerAction() == 'order/history',
],
[
'label' => '<span class="glyphicon glyphicon-repeat"></span> Abonnements <span class="label label-'.$labelSubscription.'">'.$countSubcriptions.'</span>',
'url' => Yii::$app->urlManager->createUrl(['subscription/index']),
'visible' => !Yii::$app->user->isGuest && $producer->user_manage_subscription,
'active' => $this->getControllerAction() == 'subscription/index',
],
[
'label' => '<span class="glyphicon glyphicon-euro"></span> Crédit'.$credit,
'url' => Yii::$app->urlManager->createUrl(['credit/history']),
'visible' => !Yii::$app->user->isGuest && $producer->credit,
'active' => $this->getControllerAction() == 'credit/history',
],
[
'label' => '<span class="glyphicon glyphicon-envelope"></span> Contact',
'url' => Yii::$app->urlManager->createUrl(['site/contact']),
'active' => $this->getControllerAction() == 'site/contact',
],
[
'label' => '<span class="glyphicon glyphicon-cog"></span> Administration',
'url' => Yii::$app->urlManagerBackend->createAbsoluteUrl(['site/index']),
'visible' => isset(Yii::$app->user->identity) && Yii::$app->user->identity->isProducer(),
'options' => ['id' => 'btn-administration']
],
[
'label' => '<span class="glyphicon glyphicon-th-large"></span> Accueil',
'url' => Yii::$app->urlManager->createUrl(['site/index']),
'active' => $this->getControllerAction() == 'site/index',
],
[
'label' => '<span class="glyphicon glyphicon-plus"></span> Commander',
'url' => Yii::$app->urlManager->createUrl(['order/order']),
'visible' => !Yii::$app->user->isGuest,
'active' => $this->getControllerAction() == 'order/order',
],
[
'label' => '<span class="glyphicon glyphicon-plus"></span> Commander',
'url' => Yii::$app->urlManagerFrontend->createAbsoluteUrl(['site/producer', 'id' => $this->context->getProducer()->id, 'return_url' => Yii::$app->urlManagerProducer->createAbsoluteUrl(['order/order', 'slug_producer' => $this->context->getProducer()->slug])]),
'visible' => Yii::$app->user->isGuest,
'active' => $this->getControllerAction() == 'order/order',
],
[
'label' => '<span class="glyphicon glyphicon-folder-open"></span> Mes commandes <span class="label label-' . $labelOrders . '">' . $countOrders . '</span>',
'url' => Yii::$app->urlManager->createUrl(['order/history']),
'visible' => !Yii::$app->user->isGuest,
'active' => $this->getControllerAction() == 'order/history',
],
[
'label' => '<span class="glyphicon glyphicon-repeat"></span> Abonnements <span class="label label-' . $labelSubscription . '">' . $countSubcriptions . '</span>',
'url' => Yii::$app->urlManager->createUrl(['subscription/index']),
'visible' => !Yii::$app->user->isGuest && $producer->user_manage_subscription,
'active' => $this->getControllerAction() == 'subscription/index',
],
[
'label' => '<span class="glyphicon glyphicon-euro"></span> Crédit' . $credit,
'url' => Yii::$app->urlManager->createUrl(['credit/history']),
'visible' => !Yii::$app->user->isGuest && $producer->credit,
'active' => $this->getControllerAction() == 'credit/history',
],
[
'label' => '<span class="glyphicon glyphicon-envelope"></span> Contact',
'url' => Yii::$app->urlManager->createUrl(['site/contact']),
'active' => $this->getControllerAction() == 'site/contact',
],
[
'label' => '<span class="glyphicon glyphicon-cog"></span> Administration',
'url' => Yii::$app->urlManagerBackend->createAbsoluteUrl(['site/index']),
'visible' => isset(Yii::$app->user->identity) && Yii::$app->user->identity->isProducer(),
'options' => ['id' => 'btn-administration']
],
], ],
]);
]);
?> ?>
</nav>
</div>
</nav>
</div> </div>
</div>


<div id="main" class="col-md-9">
<?php if(strlen($producer->photo)): ?>
<div id="img-big">
<img class="img-photo" src="<?= Yii::$app->urlManager->baseUrl; ?>/uploads/<?= $producer->photo; ?>" alt="Photo <?= Html::encode($producer->name) ?>" />
</div>
<div id="main" class="col-md-9">
<?php if (strlen($producer->photo)): ?>
<div id="img-big">
<img class="img-photo" src="<?= Yii::$app->urlManager->baseUrl; ?>/uploads/<?= $producer->photo; ?>"
alt="Photo <?= Html::encode($producer->name) ?>"/>
</div>
<?php endif; ?> <?php endif; ?>
<div id="infos-producer">
<div id="infos-producer">
<span data-toggle="tooltip" data-placement="bottom" title="Heure limite de commande"> <span data-toggle="tooltip" data-placement="bottom" title="Heure limite de commande">
<span class="glyphicon glyphicon-time"></span> Commande avant <span class="glyphicon glyphicon-time"></span> Commande avant
<strong><?php echo Html::encode($producer->order_deadline) ?> h</strong></span>,
<span data-toggle="tooltip" data-placement="bottom" title="Exemple : commande le lundi pour le <?php if($producer->order_delay == 1): ?>mardi<?php elseif($producer->order_delay == 2): ?>mercredi<?php elseif($producer->order_delay == 3): ?>jeudi<?php elseif($producer->order_delay == 4): ?>vendredi<?php elseif($producer->order_delay == 5): ?>samedi<?php elseif($producer->order_delay == 6): ?>dimanche<?php elseif($producer->order_delay == 7): ?>lundi d'après<?php endif; ?>"><strong><?= Html::encode($producer->order_delay) ?> jour<?php if($producer->order_delay > 1): ?>s<?php endif; ?></strong> à l'avance</span>
<strong><?php echo Html::encode($producer->order_deadline) ?> h</strong></span>,
<span data-toggle="tooltip" data-placement="bottom"
title="Exemple : commande le lundi pour le <?php if ($producer->order_delay == 1): ?>mardi<?php elseif ($producer->order_delay == 2): ?>mercredi<?php elseif ($producer->order_delay == 3): ?>jeudi<?php elseif ($producer->order_delay == 4): ?>vendredi<?php elseif ($producer->order_delay == 5): ?>samedi<?php elseif ($producer->order_delay == 6): ?>dimanche<?php elseif ($producer->order_delay == 7): ?>lundi d'après<?php endif; ?>"><strong><?= Html::encode($producer->order_delay) ?> jour<?php if ($producer->order_delay > 1): ?>s<?php endif; ?></strong> à l'avance</span>


<?php if(!Yii::$app->user->isGuest): ?>
<?php if (!Yii::$app->user->isGuest): ?>
<span class="favorite"> <span class="favorite">
<?php if($userProducer && $userProducer->bookmark): ?>
<span class="glyphicon glyphicon-star"></span> <a href="<?= Yii::$app->urlManagerProducer->createUrl(['site/bookmarks','action' => 'delete']); ?>" data-toggle="tooltip" data-placement="bottom" title="Supprimer de mes favoris">Favoris</a>
<?php if ($userProducer && $userProducer->bookmark): ?>
<span class="glyphicon glyphicon-star"></span> <a
href="<?= Yii::$app->urlManagerProducer->createUrl(['site/bookmarks', 'action' => 'delete']); ?>"
data-toggle="tooltip" data-placement="bottom" title="Supprimer de mes favoris">Favoris</a>
<?php else: ?> <?php else: ?>
<span class="glyphicon glyphicon glyphicon-star-empty"></span> <a href="<?= Yii::$app->urlManagerProducer->createUrl(['site/bookmarks','action' => 'add']); ?>" data-toggle="tooltip" data-placement="bottom" title="Ajouter à mes favoris">Favoris</a>
<span class="glyphicon glyphicon glyphicon-star-empty"></span> <a
href="<?= Yii::$app->urlManagerProducer->createUrl(['site/bookmarks', 'action' => 'add']); ?>"
data-toggle="tooltip" data-placement="bottom"
title="Ajouter à mes favoris">Favoris</a>
<?php endif; ?> <?php endif; ?>
</span> </span>
<?php endif; ?> <?php endif; ?>
<div class="clr"></div>
</div>
<?php if(strlen($this->getTitle())): ?>
<h2 id="page-title">
<div class="clr"></div>
</div>
<?php if (strlen($this->getTitle())): ?>
<h2 id="page-title">
<?= $this->getTitle(); ?> <?= $this->getTitle(); ?>
<?php
if(count($this->buttons)): ?>
<?php
if (count($this->buttons)): ?>
<span id="buttons"> <span id="buttons">
<?php foreach($this->buttons as $button) {
echo '<a href="'.Yii::$app->urlManagerProducer->createUrl($button['url']).'" class="'.$button['class'].'">'.$button['label'].'</a>' ;
<?php foreach ($this->buttons as $button) {
echo '<a href="' . Yii::$app->urlManagerProducer->createUrl($button['url']) . '" class="' . $button['class'] . '">' . $button['label'] . '</a>';
} }
?> ?>
</span> </span>
<?php endif; ?>
</h2>
<?php endif; ?>
<?php endif; ?>
</h2>
<?php endif; ?>


<section id="content">
<?php if (Yii::$app->session->hasFlash('error')): ?>
<div class="alert alert-danger" role="alert">
<section id="content">
<?php if (Yii::$app->session->hasFlash('error')): ?>
<div class="alert alert-danger" role="alert">
<?= Yii::$app->session->getFlash('error') ?> <?= Yii::$app->session->getFlash('error') ?>
</div>
<?php endif; ?>
<?php if (Yii::$app->session->hasFlash('success')): ?>
<div class="alert alert-success" role="alert">
</div>
<?php endif; ?>
<?php if (Yii::$app->session->hasFlash('success')): ?>
<div class="alert alert-success" role="alert">
<?= Yii::$app->session->getFlash('success') ?> <?= Yii::$app->session->getFlash('success') ?>
</div>
<?php endif; ?>
</div>
<?php endif; ?>


<?= $content ?>
</section>
<?= $content ?>
</section>


<?php if(strlen($producer->mentions) || strlen($producer->gcs)): ?>
<section id="footer-producer">
<?= Html::encode($producer->name) ?> :
<?php if(strlen($producer->mentions)): ?>
<a href="<?php echo Yii::$app->urlManager->createUrl(['site/mentions']) ; ?>">Mentions légales</a>
<?php if (strlen($producer->mentions) || strlen($producer->gcs)): ?>
<section id="footer-producer">
<?= Html::encode($producer->name) ?> :
<?php if (strlen($producer->mentions)): ?>
<a href="<?php echo Yii::$app->urlManager->createUrl(['site/mentions']); ?>">Mentions
légales</a>
<?php endif; ?> <?php endif; ?>
<?php if(strlen($producer->mentions) && strlen($producer->gcs)): ?>
<?php if (strlen($producer->mentions) && strlen($producer->gcs)): ?>
&bull; &bull;
<?php endif; ?> <?php endif; ?>
<?php if(strlen($producer->gcs)): ?>
<a href="<?php echo Yii::$app->urlManager->createUrl(['site/gcs']) ; ?>">Conditions générales de vente</a>
<?php if (strlen($producer->gcs)): ?>
<a href="<?php echo Yii::$app->urlManager->createUrl(['site/gcs']); ?>">Conditions générales
de vente</a>
<?php endif; ?> <?php endif; ?>
</section>
<?php endif; ?>
</div>
</section>
<?php endif; ?>
</div> </div>
<footer id="footer" class="col-md-9">
<div class="content">
<a href="<?php echo Yii::$app->urlManagerFrontend->createAbsoluteUrl(['site/index']) ; ?>">distrib</a> &bull;
<a href="<?php echo Yii::$app->urlManagerFrontend->createAbsoluteUrl(['site/mentions']) ; ?>">Mentions légales</a> &bull;
<a href="<?php echo Yii::$app->urlManagerFrontend->createAbsoluteUrl(['site/cgv']) ; ?>">CGS</a> &bull;
<a id="code-source" href="https://framagit.org/guillaume-bourgeois/distrib">Code source <img src="<?php echo Yii::$app->urlManager->getBaseUrl(); ?>/img/logo-framagit.png" alt="Hébergé par Framasoft" /> <img src="<?php echo Yii::$app->urlManager->getBaseUrl(); ?>/img/logo-gitlab.png" alt="Propulsé par Gitlab" /></a> &bull;
<a id="social-mastodon" href="https://mastodon.social/@opendistrib">Mastodon <img src="<?php echo Yii::$app->urlManager->getBaseUrl(); ?>/img/logo-mastodon.png" alt="Mastodon" /></a> &bull;
<a id="social-diaspora" href="https://framasphere.org/people/db12d640c64c0137f1d52a0000053625">Diaspora <img src="<?php echo Yii::$app->urlManager->getBaseUrl(); ?>/img/logo-diaspora.png" alt="Diaspora" /></a>
</div>
</footer>
</div>

<footer id="footer" class="col-md-9">
<div class="content">
<a href="<?php echo Yii::$app->urlManagerFrontend->createAbsoluteUrl(['site/index']); ?>">distrib</a> &bull;
<a href="<?php echo Yii::$app->urlManagerFrontend->createAbsoluteUrl(['site/mentions']); ?>">Mentions
légales</a> &bull;
<a href="<?php echo Yii::$app->urlManagerFrontend->createAbsoluteUrl(['site/cgv']); ?>">CGS</a> &bull;
<a id="code-source" href="https://framagit.org/guillaume-bourgeois/distrib">Code source <img
src="<?php echo Yii::$app->urlManager->getBaseUrl(); ?>/img/logo-framagit.png"
alt="Hébergé par Framasoft"/> <img
src="<?php echo Yii::$app->urlManager->getBaseUrl(); ?>/img/logo-gitlab.png"
alt="Propulsé par Gitlab"/></a> &bull;
<a id="social-mastodon" href="https://mastodon.social/@opendistrib">Mastodon <img
src="<?php echo Yii::$app->urlManager->getBaseUrl(); ?>/img/logo-mastodon.png" alt="Mastodon"/></a>
&bull;
<a id="social-diaspora" href="https://framasphere.org/people/db12d640c64c0137f1d52a0000053625">Diaspora <img
src="<?php echo Yii::$app->urlManager->getBaseUrl(); ?>/img/logo-diaspora.png" alt="Diaspora"/></a>
</div>
</footer>


<?php $this->endBody() ?>
<?= $this->render('@common/views/_analytics.php'); ?>
<?php $this->endBody() ?>
<?= $this->render('@common/views/_analytics.php'); ?>
</body> </body>
</html> </html>
<?php $this->endPage() ?> <?php $this->endPage() ?>

+ 2
- 1
producer/views/subscription/index.php View File

use yii\helpers\Html; use yii\helpers\Html;
use yii\grid\GridView; use yii\grid\GridView;
use common\models\Product ; use common\models\Product ;
use common\helpers\GlobalParam;


$this->setTitle('Abonnements') ; $this->setTitle('Abonnements') ;
$this->addButton(['label' => '<span class="glyphicon glyphicon-plus"></span> Ajouter', 'url' => 'subscription/form', 'class' => 'btn btn-primary']) ; $this->addButton(['label' => '<span class="glyphicon glyphicon-plus"></span> Ajouter', 'url' => 'subscription/form', 'class' => 'btn btn-primary']) ;
[ [
'label' => 'Point de vente', 'label' => 'Point de vente',
'format' => 'raw', 'format' => 'raw',
'filter' => ArrayHelper::map(PointSale::find()->where(['id_producer' => Producer::getId()])->asArray()->all(), 'id', 'name'),
'filter' => ArrayHelper::map(PointSale::find()->where(['id_producer' => GlobalParam::getCurrentProducerId()])->asArray()->all(), 'id', 'name'),
'value' => function($model) { 'value' => function($model) {
return Html::encode($model->pointSale->name) ; return Html::encode($model->pointSale->name) ;
} }

Loading…
Cancel
Save