Browse Source

Merge branch 'refactoring' into dev

# Conflicts:
#	backend/controllers/CommandeController.php
#	backend/web/js/lechatdesnoisettes.js
#	common/models/Commande.php
#	producer/controllers/CommandeController.php
#	producer/views/commande/_form.php
#	producer/views/order/history.php
refactoring
Guillaume Bourgeois 5 years ago
parent
commit
50705f4d01
100 changed files with 5387 additions and 5947 deletions
  1. +0
    -1426
      backend/controllers/CommandeController.php
  2. +11
    -9
      backend/controllers/CommunicateController.php
  3. +87
    -97
      backend/controllers/CronController.php
  4. +35
    -33
      backend/controllers/DevelopmentController.php
  5. +1316
    -0
      backend/controllers/OrderController.php
  6. +23
    -24
      backend/controllers/PointSaleController.php
  7. +35
    -35
      backend/controllers/ProducerAdminController.php
  8. +30
    -30
      backend/controllers/ProducerController.php
  9. +39
    -52
      backend/controllers/ProductController.php
  10. +28
    -31
      backend/controllers/SiteController.php
  11. +73
    -77
      backend/controllers/StatsController.php
  12. +50
    -52
      backend/controllers/SubscriptionController.php
  13. +76
    -82
      backend/controllers/UserController.php
  14. +31
    -30
      backend/models/CreditForm.php
  15. +1
    -1
      backend/models/MailForm.php
  16. +2
    -2
      backend/views/communicate/index.php
  17. +5
    -5
      backend/views/communicate/instructions.php
  18. +2
    -2
      backend/views/communicate/instructions_multi.php
  19. +0
    -42
      backend/views/communiquer/affiche.php
  20. +10
    -14
      backend/views/development/_form.php
  21. +1
    -1
      backend/views/development/create.php
  22. +31
    -33
      backend/views/development/index.php
  23. +1
    -1
      backend/views/development/update.php
  24. +32
    -31
      backend/views/layouts/main.php
  25. +24
    -22
      backend/views/order/_total_orders.php
  26. +69
    -78
      backend/views/order/index.php
  27. +65
    -73
      backend/views/order/report.php
  28. +0
    -51
      backend/views/paiement/index.php
  29. +0
    -42
      backend/views/paiement/succes.php
  30. +30
    -30
      backend/views/point-sale/_form.php
  31. +1
    -1
      backend/views/point-sale/create.php
  32. +13
    -11
      backend/views/point-sale/index.php
  33. +2
    -2
      backend/views/point-sale/update.php
  34. +7
    -7
      backend/views/producer-admin/billing.php
  35. +29
    -38
      backend/views/producer-admin/index.php
  36. +7
    -54
      backend/views/producer/billing.php
  37. +13
    -13
      backend/views/producer/update.php
  38. +18
    -28
      backend/views/product/_form.php
  39. +1
    -1
      backend/views/product/create.php
  40. +7
    -7
      backend/views/product/index.php
  41. +2
    -2
      backend/views/product/update.php
  42. +51
    -67
      backend/views/site/index.php
  43. +1
    -1
      backend/views/site/login.php
  44. +2
    -2
      backend/views/stats/index.php
  45. +36
    -33
      backend/views/stats/products.php
  46. +25
    -25
      backend/views/subscription/_form.php
  47. +5
    -5
      backend/views/subscription/create.php
  48. +29
    -28
      backend/views/subscription/index.php
  49. +4
    -4
      backend/views/subscription/update.php
  50. +4
    -4
      backend/views/user/_form.php
  51. +34
    -33
      backend/views/user/credit.php
  52. +8
    -8
      backend/views/user/emails.php
  53. +36
    -40
      backend/views/user/index.php
  54. +0
    -78
      backend/views/user/mail.php
  55. +6
    -6
      backend/views/user/orders.php
  56. +1
    -1
      backend/views/user/update.php
  57. +0
    -83
      backend/views/user/view.php
  58. BIN
      backend/web/.sass-cache/2a0ffb00578c9d5a537db16d14c734a22b18f35c/screen.scssc
  59. +378
    -415
      backend/web/css/screen.css
  60. +63
    -76
      backend/web/js/lechatdesnoisettes.js
  61. +80
    -132
      backend/web/sass/screen.scss
  62. +214
    -0
      common/components/ActiveRecordCommon.php
  63. +1
    -1
      common/controllers/CommonController.php
  64. +1
    -1
      common/helpers/Departments.php
  65. +1
    -1
      common/mail/contact-html.php
  66. +1
    -1
      common/mail/contact-text.php
  67. +2
    -2
      common/mail/createUserAdmin-html.php
  68. +2
    -2
      common/mail/createUserAdmin-text.php
  69. +4
    -4
      common/mail/creditUser-html.php
  70. +3
    -3
      common/mail/creditUser-text.php
  71. +0
    -0
      common/mail/cronOrdersSummary-html.php
  72. +0
    -0
      common/mail/cronOrdersSummary-text.php
  73. +0
    -41
      common/mail/new-boulanger-text.php
  74. +1
    -1
      common/mail/new-producer-html.php
  75. +1
    -2
      common/mail/new-producer-text.php
  76. +1
    -1
      common/mail/passwordResetToken-html.php
  77. +1
    -1
      common/mail/passwordResetToken-text.php
  78. +5
    -5
      common/mail/signup-html.php
  79. +6
    -6
      common/mail/signup-text.php
  80. +0
    -622
      common/models/Commande.php
  81. +0
    -283
      common/models/CommandeAuto.php
  82. +0
    -171
      common/models/CommandeAutoForm.php
  83. +1
    -1
      common/models/ContactForm.php
  84. +104
    -73
      common/models/CreditHistory.php
  85. +57
    -33
      common/models/Development.php
  86. +49
    -31
      common/models/DevelopmentPriority.php
  87. +228
    -0
      common/models/Distribution.php
  88. +0
    -355
      common/models/Etablissement.php
  89. +42
    -28
      common/models/Invoice.php
  90. +15
    -15
      common/models/LoginForm.php
  91. +618
    -0
      common/models/Order.php
  92. +334
    -0
      common/models/PointSale.php
  93. +171
    -0
      common/models/PointSaleDistribution.php
  94. +0
    -308
      common/models/PointVente.php
  95. +379
    -0
      common/models/Producer.php
  96. +63
    -69
      common/models/Product.php
  97. +54
    -41
      common/models/ProductDistribution.php
  98. +29
    -14
      common/models/ProductOrder.php
  99. +29
    -14
      common/models/ProductSubscription.php
  100. +0
    -206
      common/models/Production.php

+ 0
- 1426
backend/controllers/CommandeController.php
File diff suppressed because it is too large
View File


backend/controllers/CommuniquerController.php → backend/controllers/CommunicateController.php View File

@@ -38,10 +38,13 @@ termes.

namespace backend\controllers;

use common\models\Producer ;
use common\models\User ;

/**
* UserController implements the CRUD actions for User model.
*/
class CommuniquerController extends BackendController
class CommunicateController extends BackendController
{

public function behaviors() {
@@ -59,7 +62,7 @@ class CommuniquerController extends BackendController
'allow' => true,
'roles' => ['@'],
'matchCallback' => function ($rule, $action) {
return Yii::$app->user->identity->status == USER::STATUS_ADMIN || Yii::$app->user->identity->status == USER::STATUS_BOULANGER;
return User::hasAccessBackend();
}
]
],
@@ -75,10 +78,10 @@ class CommuniquerController extends BackendController
*/
public function actionIndex()
{
$etablissement = Etablissement::findOne(['id' => Yii::$app->user->identity->id_etablissement]);
$producer = Producer::searchOne() ;

return $this->render('index', [
'etablissement' => $etablissement,
'producer' => $producer,
]);
}

@@ -88,15 +91,14 @@ class CommuniquerController extends BackendController
*
* @return string
*/
public function actionModeemploi()
public function actionInstructions()
{

$etablissement = Etablissement::findOne(['id' => Yii::$app->user->identity->id_etablissement]);
$producer = Producer::searchOne() ;

// get your HTML raw content without any layouts or scripts
$content = $this->renderPartial('mode_emploi_multi', [
$content = $this->renderPartial('instructions_multi', [
'pdf' => true,
'etablissement' => $etablissement
'producer' => $producer
]);

$pdf = new Pdf([

+ 87
- 97
backend/controllers/CronController.php View File

@@ -46,17 +46,17 @@ use yii\web\NotFoundHttpException;
use yii\filters\VerbFilter;
use yii\filters\AccessControl;
use kartik\mpdf\Pdf;
use common\models\Etablissement;
use common\models\Commande;
use common\models\CommandeAuto;
use common\models\Production;
use common\models\Producer;
use common\models\Order;
use common\models\Subscription;
use common\models\Distribution;
use common\models\CreditHistory ;

/**
* UserController implements the CRUD actions for User model.
*/
class CronController extends BackendController
{

public function behaviors()
{
return [
@@ -84,11 +84,11 @@ class CronController extends BackendController
*
* @param string $key
*/
public function actionInitBddDemo($key = '')
public function actionInitDatabaseDemo($key = '')
{
if ($key == '45432df6e842ac71aa0b5bb6b9f25d44' && YII_ENV == 'demo') {

$arr_noms = [
$arrayLastnames = [
'Martin', 'Bernard', 'Thomas', 'Petit', 'Robert', 'Richard', 'Durand', 'Dubois',
'Moreau', 'Laurent', 'Simon', 'Michel', 'Lefebvre', 'Leroy', 'Roux', 'David',
'Bertrand', 'Morel', 'Fournier', 'Girard', 'Bonnet', 'Dupont', 'Lambert', 'Fontaine',
@@ -110,7 +110,7 @@ class CronController extends BackendController
'Poulain', 'Girondin', 'Gillet', 'Guichard'
];

$arr_prenoms = [
$arrayNames = [
'Adel', 'Antonin', 'Armand', 'Arnaud', 'Aymeric', 'Baptiste', 'Barnabé', 'Bernard', 'Brice', 'Baudouin',
'Camille', 'Cassandre', 'Célestin', 'Christian', 'Clément', 'Cyril', 'Claude', 'Damien', 'Daniel', 'David',
'Delphin', 'Denis', 'Didier', 'Dimitri', 'Dorothée', 'Désiré', 'Edgard', 'Etienne', 'Eugène', 'Eudes', 'Eric',
@@ -129,31 +129,30 @@ class CronController extends BackendController
'Rose', 'Roseline', 'Renée', 'Sabine', 'Sophie', 'Suzanne', 'Sylvie', 'Thérèse',
];

$arr_noms_checked = [];
$arr_prenoms_checked = [];
$arrayNamesChecked = [];
$arrayLastnameschecked = [];

$users = User::find()
->joinWith('userEtablissement')
->where('user_etablissement.id_etablissement = 1')
->all();
$users = User::searchAll([
'user_etablissement.id_etablissement' => 1
]) ;

foreach ($users as $u) {
if ($u->email != 'boulanger@laboiteapain.net') {
do {
$i_nom = rand(0, count($arr_noms) - 1);
$i_prenom = rand(0, count($arr_prenoms) - 1);
} while (isset($arr_noms_checked[$i_nom]) || isset($arr_prenoms_checked[$i_prenom]));
$indexLastname = rand(0, count($arrayLastnames) - 1);
$indexName = rand(0, count($arrayNames) - 1);
} while (isset($arrayLastnameschecked[$i_nom]) || isset($arrayNamesChecked[$i_prenom]));

$arr_noms_checked[$i_nom] = true;
$arr_prenoms_checked[$i_prenom] = true;
$arrayLastnameschecked[$i_nom] = true;
$arrayNamesChecked[$i_prenom] = true;

$nom = $arr_noms[$i_nom];
$prenom = $arr_prenoms[$i_prenom];
$lastname = $arrayLastnameschecked[$indexLastname];
$name = $arrayNamesChecked[$indexName];

$u->nom = $nom;
$u->prenom = $prenom;
$u->name = $name;
$u->lastname = $lastname;

$email = strtolower($prenom) . '.' . strtolower($nom) . '@yopmail.com';
$email = strtolower($name) . '.' . strtolower($lastname) . '@yopmail.com';
$email = htmlentities($email, ENT_NOQUOTES, 'utf-8');
$email = preg_replace('#&([A-za-z])(?:acute|cedil|caron|circ|grave|orn|ring|slash|th|tilde|uml);#', '\1', $email);
$email = preg_replace('#&([A-za-z]{2})(?:lig);#', '\1', $email); // pour les ligatures e.g. 'œ'
@@ -175,29 +174,27 @@ class CronController extends BackendController
$u->save();
}

$commandes = Commande::find()
$arrayOrders = Order::find()
->where('username IS NOT NULL')
->all();

foreach ($commandes as $c) {
$nom = $arr_noms[rand(0, count($arr_noms) - 1)];
$prenom = $arr_prenoms[rand(0, count($arr_prenoms) - 1)];
foreach ($arrayOrders as $order) {
$lastname = $arrayLastnames[rand(0, count($arrayLastnames) - 1)];
$name = $arrayNames[rand(0, count($arrayNames) - 1)];

$c->username = $prenom . ' ' . $nom;
$c->username = $name . ' ' . $lastname;

$c->save();
}

$commandes_auto = CommandeAuto::find()
->where('username IS NOT NULL')
->all();

foreach ($commandes_auto as $c) {
$nom = $arr_noms[rand(0, count($arr_noms) - 1)];
$prenom = $arr_prenoms[rand(0, count($arr_prenoms) - 1)];

$c->username = $prenom . ' ' . $nom;
$arraySubscription = Subscription::find()
->where('username IS NOT NULL')
->all();

foreach ($arraySubscription as $subscription) {
$lastname = $arrayLastnames[rand(0, count($arrayLastnames) - 1)];
$name = $arrayNames[rand(0, count($arrayNames) - 1)];
$c->username = $name . ' ' . $lastname;
$c->save();
}
}
@@ -210,55 +207,51 @@ class CronController extends BackendController
* @param string $key
* @param string $force_date
*/
public function actionProcessCommandes($key = '', $force_date = '')
public function actionProcessOrders($key = '', $forceDate = '')
{
if ($key == '64ac0bdab7e9f5e48c4d991ec5201d57') {
if(strlen($force_date)) {
$date = $force_date ;
if(strlen($forceDate)) {
$date = $forceDate ;
}
else {
$heure = date('H');
$hour = date('H');

if ($heure == '00') {
if ($hour == '00') {
$date = date('Y-m-d');
} else {
$date = date('Y-m-d', time() + 24 * 60 * 60);
}
}

$etablissements = Etablissement::find()->all();
$arrayProducers = Producer::searchAll() ;

foreach ($etablissements as $e) {
$production = Production::findOne([
'date' => $date,
'actif' => 1,
'id_etablissement' => $e['id'],
]);
foreach ($arrayProducers as $producer) {
$distribution = Distribution::findOne([
'date' => $date,
'active' => 1,
'id_producer' => $producer['id'],
]);

if ($production && ($heure == $e['heure_limite_commande'] || strlen($force_date))) {
if ($distribution && ($hour == $producer['order_deadline'] || strlen($forceDate))) {
/*
* Paiement des commandes (paiement automatique)
*/
$commandes = Commande::find()
->with('commandeProduits', 'user')
->joinWith('production')
->where(['production.date' => $date])
->orderBy('date ASC')
->all();

foreach($commandes as $c) {
if($c->paiement_automatique && Etablissement::getConfig('credit_pain', $c->production->id_etablissement)) {
$c->init() ;

if ($c->getMontantRestant() > 0) {
$c->creditHistorique(
CreditHistorique::TYPE_PAIEMENT,
$c->getMontantRestant(),
$c->production->id_etablissement,
$c->id_user,
$arrayOrders = Order::searchAll([
'distribution.date' => $date
]) ;

foreach($arrayOrders as $order) {
if($order->payment_auto && Producer::getConfig('credit', $order->distribution->id_producer)) {
if ($order->getAmount(Order::AMOUNT_REMAINING) > 0) {
$order->saveCreditHistory(
CreditHistory::TYPE_PAYMENT,
$order->getAmount(Order::AMOUNT_REMAINING),
$order->distribution->id_producer,
$order->id_user,
User::ID_USER_SYSTEM
);
}
@@ -268,43 +261,40 @@ class CronController extends BackendController
/*
* Envoi des commandes par email au producteur
*/
if(!strlen($force_date)) {
$commandes = Commande::find()
->with('commandeProduits', 'user')
->joinWith('production')
->where(['production.date' => $date])
->andWhere(['production.id_etablissement' => $e['id']])
->orderBy('date ASC')
->all();

$user = User::findOne([
'id_etablissement' => $e['id'],
'status' => User::STATUS_BOULANGER
]);
if(!strlen($forceDate)) {
$arrayOrders = Order::searchAll([
'distribution.date' => $date,
'distribution.id_producer' => $producer['id']
]) ;
$user = User::searchOne([
'id_producer' => $producer['id'],
'status' => User::STATUS_PRODUCER
]);

$mail = Yii::$app->mailer->compose(
[
'html' => 'cronRecapCommandes-html',
'text' => 'cronRecapCommandes-text',
], [
'date' => $date,
'commandes' => $commandes
]
)
->setTo($user->email)
->setFrom([Yii::$app->params['adminEmail'] => 'La boîte à pain']);
if (count($commandes)) {
$sujet = '[La boîte à pain] Commandes du ' . date('d/m', strtotime($date));
[
'html' => 'cronOrdersSummary-html',
'text' => 'cronOrdersSummary-text',
], [
'date' => $date,
'orders' => $arrayOrders
]
)
->setTo($user->email)
->setFrom([Yii::$app->params['adminEmail'] => 'La boîte à pain']);
if (count($arrayOrders)) {
$subject = '[La boîte à pain] Commandes du ' . date('d/m', strtotime($date));

// génération du pdf de commande
Yii::$app->runAction('commande/report-cron', [
Yii::$app->runAction('order/report-cron', [
'date' => $date,
'save' => true,
'id_etablissement' => $e['id'],
'id_producer' => $producer['id'],
'key' => '64ac0bdab7e9f5e48c4d991ec5201d57'
]);
$mail->attach(Yii::getAlias('@app/web/pdf/Commandes-' . $date . '-' . $e['id'] . '.pdf'));
$mail->attach(Yii::getAlias('@app/web/pdf/Orders-' . $date . '-' . $producer['id'] . '.pdf'));
} else {
$sujet = '[La boîte à pain] Aucune commande';
}

backend/controllers/DeveloppementController.php → backend/controllers/DevelopmentController.php View File

@@ -40,8 +40,8 @@ namespace backend\controllers;

use Yii;
use common\models\User;
use common\models\Developpement;
use common\models\DeveloppementPriorite;
use common\models\Development;
use common\models\DevelopmentPriority;
use yii\data\ActiveDataProvider;
use yii\web\Controller;
use yii\web\NotFoundHttpException;
@@ -51,9 +51,8 @@ use yii\filters\AccessControl;
/**
* DeveloppementController implements the CRUD actions for Developpement model.
*/
class DeveloppementController extends Controller
class DevelopmentController extends Controller
{

/**
* @inheritdoc
*/
@@ -66,7 +65,7 @@ class DeveloppementController extends Controller
'allow' => true,
'roles' => ['@'],
'matchCallback' => function ($rule, $action) {
return Yii::$app->user->identity->status == USER::STATUS_ADMIN || Yii::$app->user->identity->status == USER::STATUS_BOULANGER;
return User::hasAccessBackend() ;
}
]
],
@@ -79,15 +78,18 @@ class DeveloppementController extends Controller
*
* @return mixed
*/
public function actionIndex($statut = Developpement::STATUT_OPEN)
public function actionIndex($status = Development::STATUS_OPEN)
{
$dataProvider = new ActiveDataProvider([
'query' => Developpement::find()->with(['developpementPriorite', 'developpementPrioriteCurrentEtablissement'])->where(['statut' => $statut])->orderBy('date DESC'),
'query' => Development::find()
->with(['developmentPriority', 'developmentPriorityCurrentProducer'])
->where(['status' => $status])
->orderBy('date DESC'),
]);

return $this->render('index', [
'dataProvider' => $dataProvider,
'statut' => $statut
'status' => $status
]);
}

@@ -98,18 +100,18 @@ class DeveloppementController extends Controller
*/
public function actionCreate()
{
$model = new Developpement();
$model = new Development();

if ($model->load(Yii::$app->request->post())) {
$model->date = date('Y-m-d H:i:s');
$model->setDateLivraison();
$model->setDateDelivery();
if ($model->save()) {
Yii::$app->getSession()->setFlash('success', 'Développement ajouté');
return $this->redirect(['index']);
}
} else {
return $this->render('create', [
'model' => $model,
'model' => $model,
]);
}
}
@@ -117,6 +119,7 @@ class DeveloppementController extends Controller
/**
* Updates an existing Developpement model.
* If update is successful, the browser will be redirected to the 'view' page.
*
* @param integer $id
* @return mixed
*/
@@ -125,14 +128,14 @@ class DeveloppementController extends Controller
$model = $this->findModel($id);

if ($model->load(Yii::$app->request->post())) {
$model->setDateLivraison();
$model->setDateDelivery();
if ($model->save()) {
Yii::$app->getSession()->setFlash('success', 'Développement modifié');
return $this->redirect(['index']);
}
} else {
return $this->render('update', [
'model' => $model,
'model' => $model,
]);
}
}
@@ -154,34 +157,33 @@ class DeveloppementController extends Controller
/**
* Définit une priorité pour un développement.
*
* @param integer $id_developpement
* @param integer $idDevelopment
* @param string $priorite
*/
public function actionPriorite($id_developpement, $priorite = null)
public function actionPriority($idDevelopment, $priority = null)
{
$develpmentPriority = DevelopmentPriority::searchOne([
'id_development' => $idDevelopment,
]) ;

$developpement_priorite = DeveloppementPriorite::find()
->where(['id_developpement' => $id_developpement, 'id_etablissement' => Yii::$app->user->identity->id_etablissement])
->one();

if (in_array($priorite, [DeveloppementPriorite::PRIORITE_HAUTE,
DeveloppementPriorite::PRIORITE_NORMALE,
DeveloppementPriorite::PRIORITE_BASSE])) {
if (in_array($priority, [DevelopmentPriority::PRIORITY_HIGH,
DevelopmentPriority::PRIORITY_NORMAL,
DevelopmentPriority::PRIORITY_LOW])) {

if ($developpement_priorite) {
$developpement_priorite->priorite = $priorite;
$developpement_priorite->id_etablissement = Yii::$app->user->identity->id_etablissement;
if ($develpmentPriority) {
$develpmentPriority->priority = $priority;
$develpmentPriority->id_producer = Producer::getId();
} else {
$developpement_priorite = new DeveloppementPriorite;
$developpement_priorite->id_developpement = $id_developpement;
$developpement_priorite->priorite = $priorite;
$developpement_priorite->id_etablissement = Yii::$app->user->identity->id_etablissement;
$develpmentPriority = new DevelopmentPriority;
$develpmentPriority->id_development = $idDevelopment;
$develpmentPriority->priority = $priority;
$develpmentPriority->id_producer = Producer::getId();
}

$developpement_priorite->save();
$develpmentPriority->save();
} else {
if ($developpement_priorite) {
$developpement_priorite->delete();
if ($develpmentPriority) {
$develpmentPriority->delete();
}
}

@@ -197,7 +199,7 @@ class DeveloppementController extends Controller
*/
protected function findModel($id)
{
if (($model = Developpement::findOne($id)) !== null) {
if (($model = Development::findOne($id)) !== null) {
return $model;
} else {
throw new NotFoundHttpException('The requested page does not exist.');

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


backend/controllers/PointVenteController.php → backend/controllers/PointSaleController.php View File

@@ -40,18 +40,18 @@ namespace backend\controllers;

use Yii;
use yii\filters\AccessControl;
use common\models\PointVente;
use common\models\PointSale;
use yii\data\ActiveDataProvider;
use yii\web\Controller;
use yii\web\NotFoundHttpException;
use yii\filters\VerbFilter;
use common\models\User;
use common\models\PointVenteUser;
use common\models\UserPointSale;

/**
* PointVenteController implements the CRUD actions for PointVente model.
*/
class PointVenteController extends BackendController
class PointSaleController extends BackendController
{

public function behaviors()
@@ -69,8 +69,7 @@ class PointVenteController extends BackendController
'allow' => true,
'roles' => ['@'],
'matchCallback' => function ($rule, $action) {
return Yii::$app->user->identity->status == USER::STATUS_ADMIN
|| Yii::$app->user->identity->status == USER::STATUS_BOULANGER;
return User::hasAccessBackend();
}
],
],
@@ -86,11 +85,11 @@ class PointVenteController extends BackendController
public function actionIndex()
{
$dataProvider = new ActiveDataProvider([
'query' => PointVente::find()->where(['id_etablissement' => Yii::$app->user->identity->id_etablissement])
'query' => PointSale::find()->where(['id_producer' => Producer::getId()])
]);

return $this->render('index', [
'dataProvider' => $dataProvider,
'dataProvider' => $dataProvider,
]);
}

@@ -101,15 +100,15 @@ class PointVenteController extends BackendController
*/
public function actionCreate()
{
$model = new PointVente();
$model = new PointSale();

if ($model->load(Yii::$app->request->post()) && $model->save()) {
$model->gestionPointFabrication();
$model->gestionAccesRestreint();
$model->processPointProduction();
$model->processRestrictedAccess();
return $this->redirect(['index']);
} else {
return $this->render('update', array_merge($this->initForm(), [
'model' => $model,
'model' => $model,
]));
}
}
@@ -122,23 +121,23 @@ class PointVenteController extends BackendController
*/
public function actionUpdate($id)
{
$model = PointVente::find()
->with('pointVenteUser')
$model = PointSale::find()
->with('userPointSale')
->where(['id' => $id])
->one();

foreach ($model->pointVenteUser as $u) {
$model->users[] = $u->id_user;
$model->users_commentaire[$u->id_user] = $u->commentaire;
foreach ($model->userPointSale as $userPointSale) {
$model->users[] = $userPointSale->id_user;
$model->users_comment[$userPointSale->id_user] = $userPointSale->comment;
}

if ($model->load(Yii::$app->request->post()) && $model->save()) {
$model->gestionPointFabrication();
$model->gestionAccesRestreint();
$model->processPointProduction();
$model->processRestrictedAccess();
return $this->redirect(['index']);
} else {
return $this->render('update', array_merge($this->initForm($id), [
'model' => $model,
'model' => $model,
]));
}
}
@@ -152,8 +151,8 @@ class PointVenteController extends BackendController
public function initForm($id = 0)
{
$users = User::findBy()
->orderBy('nom ASC')
->all();
->orderBy('name ASC')
->all();
return [
'users' => $users
];
@@ -168,8 +167,8 @@ class PointVenteController extends BackendController
public function actionDelete($id)
{
$this->findModel($id)->delete();
PointVenteUser::deleteAll(['id_point_vente' => $id]);
ProductionPointVente::deleteAll(['id_point_vente' => $id]) ;
UserPointSale::deleteAll(['id_point_sale' => $id]);
PointSaleDistribution::deleteAll(['id_point_sale' => $id]) ;
return $this->redirect(['index']);
}

@@ -182,7 +181,7 @@ class PointVenteController extends BackendController
*/
protected function findModel($id)
{
if (($model = PointVente::findOne($id)) !== null) {
if (($model = PointSale::findOne($id)) !== null) {
return $model;
} else {
throw new NotFoundHttpException('The requested page does not exist.');

backend/controllers/EtablissementAdminController.php → backend/controllers/ProducerAdminController.php View File

@@ -44,14 +44,14 @@ use yii\web\NotFoundHttpException;
use yii\filters\VerbFilter;
use yii\filters\AccessControl;
use common\helpers\Upload;
use common\models\Etablissement;
use common\models\Producer;
use yii\data\ActiveDataProvider;
use common\models\Facture;
use common\models\Invoice;

/**
* UserController implements the CRUD actions for User model.
*/
class EtablissementAdminController extends BackendController
class ProducerAdminController extends BackendController
{

public function behaviors()
@@ -70,7 +70,7 @@ class EtablissementAdminController extends BackendController
'allow' => true,
'roles' => ['@'],
'matchCallback' => function ($rule, $action) {
return Yii::$app->user->identity->status == USER::STATUS_ADMIN;
return User::getCurrentStatus() == USER::STATUS_ADMIN;
}
]
],
@@ -85,9 +85,9 @@ class EtablissementAdminController extends BackendController
*/
public function actionIndex()
{
$datas_etablissements = new ActiveDataProvider([
'query' => Etablissement::find()
->with('userEtablissement', 'user')
$dataProviderProducer = new ActiveDataProvider([
'query' => Producer::find()
->with('userProducer', 'user')
->orderBy('date_creation DESC'),
'pagination' => [
'pageSize' => 1000,
@@ -95,46 +95,46 @@ class EtablissementAdminController extends BackendController
]);

return $this->render('index', [
'datas_etablissements' => $datas_etablissements,
'dataProviderProducer' => $dataProviderProducer,
]);
}

/**
* Génère la facture mensuelle d'un producteur.
*
* @param integer $id_etablissement
* @param integer $idProducer
*/
public function actionFacturer($id_etablissement)
public function actionBill($idProducer)
{
$etablissement = Etablissement::findOne($id_etablissement);
$producer = Producer::findOne($idProducer);

if ($etablissement) {
$periode = date('Y-m', strtotime('-1 month'));
if ($producer) {
$period = date('Y-m', strtotime('-1 month'));

$last_facture = Facture::getLastFacture();
if (!$last_facture) {
$last_invoice = Invoice::getLastInvoice() ;
if (!$last_invoice) {
$reference = 'BAP000001';
} else {
$reference = str_replace('BAP', '', $last_facture->reference);
$reference = str_replace('BAP', '', $last_invoice->reference);
$reference ++;
$reference = 'BAP' . $reference;
}

$facture = new Facture;
$facture->id_etablissement = $id_etablissement;
$facture->date = date('Y-m-d H:i:s');
$facture->reference = $reference;
$facture->ca = $etablissement->getCA($periode);
$facture->montant_ht = $etablissement->getMontantFacturer($periode);
$facture->libelle = 'Facture ' . date('m/Y', strtotime('-1 month'));
$facture->texte = 'Utilisation de la plateforme <strong>La boîte à pain</strong> pour le mois : ' . date('m/Y', strtotime('-1 month')) . '<br />'
$invoice = new Invoice;
$invoice->id_producer = $idProducer;
$invoice->date = date('Y-m-d H:i:s');
$invoice->reference = $reference;
$invoice->turnover = $producer->getTurnover($period);
$invoice->amount_ht = $producer->getFreePrice() ;
$invoice->wording = 'Facture ' . date('m/Y', strtotime('-1 month'));
$invoice->text = 'Utilisation de la plateforme <strong>La boîte à pain</strong> pour le mois : ' . date('m/Y', strtotime('-1 month')) . '<br />'
. 'Chiffre d\'affaire réalisé sur la plateforme : <strong>' . number_format($facture->ca, 2) . ' €</strong> commissionné à <strong>1%</strong>.';
$facture->paye = 0;
$facture->periode = $periode;
$facture->save();
$invoice->paid = 0;
$invoice->period = $period;
$invoice->save();
}

$this->redirect(['etablissement-admin/index']);
$this->redirect(['producer-admin/index']);
}

/**
@@ -142,19 +142,19 @@ class EtablissementAdminController extends BackendController
*
* @return mxied
*/
public function actionFacturation()
public function actionBilling()
{
$datas_factures = new ActiveDataProvider([
'query' => Facture::find()
->with('etablissement')
$dataProviderInvoice = new ActiveDataProvider([
'query' => Invoice::find()
->with('producer')
->orderBy('reference DESC'),
'pagination' => [
'pageSize' => 1000,
],
]);

return $this->render('facturation', [
'datas_factures' => $datas_factures,
return $this->render('billing', [
'dataProviderInvoice' => $dataProviderInvoice,
]);
}

@@ -166,7 +166,7 @@ class EtablissementAdminController extends BackendController
* @throws NotFoundHttpException
*/
protected function findModel($id) {
if (($model = Etablissement::findOne($id)) !== null) {
if (($model = Producer::findOne($id)) !== null) {
return $model;
} else {
throw new NotFoundHttpException('The requested page does not exist.');

backend/controllers/EtablissementController.php → backend/controllers/ProducerController.php View File

@@ -47,13 +47,13 @@ use yii\web\NotFoundHttpException;
use yii\filters\VerbFilter;
use yii\filters\AccessControl;
use common\helpers\Upload;
use common\models\Etablissement;
use common\models\Facture;
use common\models\Producer;
use common\models\Invoice;

/**
* UserController implements the CRUD actions for User model.
*/
class EtablissementController extends BackendController
class ProducerController extends BackendController
{

public $enableCsrfValidation = false;
@@ -74,8 +74,7 @@ class EtablissementController extends BackendController
'allow' => true,
'roles' => ['@'],
'matchCallback' => function ($rule, $action) {
return Yii::$app->user->identity->status == USER::STATUS_ADMIN
|| Yii::$app->user->identity->status == USER::STATUS_BOULANGER;
return User::hasAccessBackend();
}
]
],
@@ -84,29 +83,29 @@ class EtablissementController extends BackendController
}

/**
* Modifie un établissement.
* Modifie un producteur.
*
* @return mixed
*/
public function actionUpdate()
{
$request = Yii::$app->request;
$model = $this->findModel(Yii::$app->user->identity->id_etablissement);
$logo_filename_old = $model->logo;
$photo_filename_old = $model->photo;
$model = $this->findModel(Producer::getId());
$logoFilenameOld = $model->logo;
$photoFilenameOld = $model->photo;

if ($model->load(Yii::$app->request->post()) && $model->save()) {
Upload::uploadFile($model, 'logo', $logo_filename_old);
Upload::uploadFile($model, 'photo', $photo_filename_old);
Upload::uploadFile($model, 'logo', $logoFilenameOld);
Upload::uploadFile($model, 'photo', $photoFilenameOld);

$delete_logo = $request->post('delete_logo', 0);
if ($delete_logo) {
$deleteLogo = $request->post('delete_logo', 0);
if ($deleteLogo) {
$model->logo = '';
$model->save();
}

$delete_photo = $request->post('delete_photo', 0);
if ($delete_photo) {
$deletePhoto = $request->post('delete_photo', 0);
if ($deletePhoto) {
$model->photo = '';
$model->save();
}
@@ -114,7 +113,7 @@ class EtablissementController extends BackendController
return $this->redirect(['update', 'id' => $model->id, 'edit_ok' => true]);
} else {
return $this->render('update', [
'model' => $model,
'model' => $model,
]);
}
}
@@ -125,30 +124,31 @@ class EtablissementController extends BackendController
*
* @return mixed
*/
public function actionFacturation()
public function actionBilling()
{
$datas_factures = new ActiveDataProvider([
'query' => Facture::find()
->where(['id_etablissement' => Yii::$app->user->identity->id_etablissement])
$datasInvoices = new ActiveDataProvider([
'query' => Invoice::find()
->where(['id_producer' => Producer::getId()])
->orderBy('reference DESC'),
'pagination' => [
'pageSize' => 1000,
],
]);

$etablissement = Etablissement::findOne(Yii::$app->user->identity->id_etablissement);
$producer = Producer::findOne(Producer::getId());

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

if (!is_null($etablissement->prix_libre))
$alert_prix_libre = true;
if (!is_null($producer->free_price)) {
$alertFreeprice = true;
}
}

return $this->render('facturation', [
'datas_factures' => $datas_factures,
'etablissement' => $etablissement,
'alert_prix_libre' => (isset($alert_prix_libre)) ? true : false
return $this->render('billing', [
'datasInvoices' => $datasInvoices,
'producer' => $producer,
'alertFreePrice' => (isset($alertFreeprice)) ? true : false
]);
}

@@ -161,7 +161,7 @@ class EtablissementController extends BackendController
*/
protected function findModel($id)
{
if (($model = Etablissement::findOne($id)) !== null) {
if (($model = Producer::findOne($id)) !== null) {
return $model;
} else {
throw new NotFoundHttpException('The requested page does not exist.');

backend/controllers/ProduitController.php → backend/controllers/ProductController.php View File

@@ -38,13 +38,13 @@ termes.

namespace backend\controllers;

use common\models\ProductionProduit;
use common\models\ProductDistribution;
use Yii;
use yii\filters\AccessControl;
use common\models\Produit;
use common\models\Production;
use common\models\Product;
use common\models\Distribution;
use common\models\User;
use common\models\UserBoulangerie;
use common\models\UserProducer;
use yii\data\ActiveDataProvider;
use yii\web\Controller;
use yii\web\NotFoundHttpException;
@@ -55,7 +55,7 @@ use common\helpers\Upload;
/**
* ProduitController implements the CRUD actions for Produit model.
*/
class ProduitController extends BackendController
class ProductController extends BackendController
{
var $enableCsrfValidation = false;

@@ -74,8 +74,7 @@ class ProduitController extends BackendController
'allow' => true,
'roles' => ['@'],
'matchCallback' => function ($rule, $action) {
return Yii::$app->user->identity->status == USER::STATUS_ADMIN
|| Yii::$app->user->identity->status == USER::STATUS_BOULANGER;
return User::hasAccessBackend();
}
]
],
@@ -91,9 +90,8 @@ class ProduitController extends BackendController
public function actionIndex()
{
$dataProvider = new ActiveDataProvider([
'query' => Produit::find()
->where('(vrac IS NULL OR vrac = 0)')
->andWhere(['id_etablissement' => Yii::$app->user->identity->id_etablissement])
'query' => Product::find()
->where(['id_producer' => Producer::getId()])
->orderBy('order ASC'),
'pagination' => [
'pageSize' => 1000,
@@ -101,7 +99,7 @@ class ProduitController extends BackendController
]);

return $this->render('index', [
'dataProvider' => $dataProvider,
'dataProvider' => $dataProvider,
]);
}

@@ -113,33 +111,33 @@ class ProduitController extends BackendController
*/
public function actionCreate()
{
$model = new Produit();
$model->actif = 1;
$model->id_etablissement = Yii::$app->user->identity->id_etablissement;
$model->saison = 'all';
$model = new Product();
$model->active = 1;
$model->id_producer = Producer::getId();

if ($model->load(Yii::$app->request->post()) && $model->save()) {
Upload::uploadFile($model, 'illustration');
Upload::uploadFile($model, 'photo');
$model->save();

// on ajoute un enregistrement ProductionProduit pour chaque production
$productions = Production::find()
$distributionsArray = Distribution::find()
->where('date > ' . date('Y-m-d'))
->andWhere(['id_etablissement' => Yii::$app->user->identity->id_etablissement])
->andWhere(['id_producer' => Producer::getId()])
->all();
foreach ($productions as $prod) {
$production_produit = new ProductionProduit;
$production_produit->id_production = $prod->id;
$production_produit->id_produit = $model->id;
$production_produit->actif = 0;
$production_produit->save();
foreach ($distributionsArray as $distribution) {
$productDistribution = new ProductDistribution;
$productDistribution->id_distribution = $distribution->id;
$productDistribution->id_product = $model->id;
$productDistribution->active = 0;
$productDistribution->save();
}

return $this->redirect(['index']);
} else {
return $this->render('create', [
'model' => $model,
'model' => $model,
]);
}
}
@@ -156,21 +154,14 @@ class ProduitController extends BackendController
$request = Yii::$app->request;

$model = $this->findModel($id);
$illustration_filename_old = $model->illustration;
$photo_filename_old = $model->photo;
$photoFilenameOld = $model->photo;

if ($model->load(Yii::$app->request->post()) && $model->save()) {
Upload::uploadFile($model, 'illustration', $illustration_filename_old);
Upload::uploadFile($model, 'photo', $photo_filename_old);
Upload::uploadFile($model, 'photo', $photoFilenameOld);

$delete_illustration = $request->post('delete_illustration', 0);
if ($delete_illustration) {
$model->illustration = '';
$model->save();
}

$delete_photo = $request->post('delete_photo', 0);
if ($delete_photo) {
$deletePhoto = $request->post('delete_photo', 0);
if ($deletePhoto) {
$model->photo = '';
$model->save();
}
@@ -178,7 +169,7 @@ class ProduitController extends BackendController
return $this->redirect(['index']);
} else {
return $this->render('update', [
'model' => $model,
'model' => $model,
]);
}
}
@@ -194,28 +185,24 @@ class ProduitController extends BackendController
public function actionDelete($id)
{
$this->findModel($id)->delete();

$productions_produits = ProductionProduit::find()->where(['id_produit' => $id])->all();
foreach ($productions_produits as $pp) {
$pp->delete();
}

ProductDistribution::deleteAll(['id_product' => $id]) ;
return $this->redirect(['index']);
}

/**
* Modifie l'ordre des produits.
*
* @param array $tab
* @param array $array
*/
public function actionOrdre($tab)
public function actionOrder($array)
{
$tab_ordre = json_decode(stripslashes($tab));
$orderArray = json_decode(stripslashes($array));

foreach ($tab_ordre as $id => $o) {
$produit = $this->findModel($id);
$produit->order = $o;
$produit->save();
foreach($orderArray as $id => $order) {
$product = $this->findModel($id);
$product->order = $order;
$product->save();
}
}

@@ -228,7 +215,7 @@ class ProduitController extends BackendController
*/
protected function findModel($id)
{
if (($model = Produit::findOne($id)) !== null) {
if (($model = Product::findOne($id)) !== null) {
return $model;
} else {
throw new NotFoundHttpException('The requested page does not exist.');

+ 28
- 31
backend/controllers/SiteController.php View File

@@ -44,11 +44,11 @@ use yii\web\Controller;
use common\models\LoginForm;
use common\models\User;
use yii\filters\VerbFilter;
use common\models\Produit;
use common\models\PointVente;
use common\models\Etablissement;
use common\models\Production;
use common\models\Commande;
use common\models\Product;
use common\models\PointSale;
use common\models\Producer;
use common\models\Distribution;
use common\models\Order;

/**
* Site controller
@@ -74,8 +74,7 @@ class SiteController extends BackendController
'allow' => true,
'roles' => ['@'],
'matchCallback' => function ($rule, $action) {
return Yii::$app->user->identity->status == USER::STATUS_ADMIN
|| Yii::$app->user->identity->status == USER::STATUS_BOULANGER;
return User::hasAccessBackend() ;
}
],
[
@@ -83,7 +82,7 @@ class SiteController extends BackendController
'allow' => true,
'roles' => ['@'],
'matchCallback' => function ($rule, $action) {
return Yii::$app->user->identity->status == USER::STATUS_ADMIN;
return User::getCurrentStatus() == User::STATUS_ADMIN ;
}
],
],
@@ -119,48 +118,46 @@ class SiteController extends BackendController
public function actionIndex()
{
// commandes
$productions = Production::find()
->with('commande')
->where(['>=', 'production.date', date('Y-m-d')])
$distributions = Distribution::find()
->with('order')
->where(['>=', 'distribution.date', date('Y-m-d')])
->andWhere([
'production.id_etablissement' => Yii::$app->user->identity->id_etablissement,
'production.actif' => 1
'distribution.id_producer' => Producer::getId(),
'distribution.active' => 1
])
->orderBy('date ASC')
->limit(5)
->all();

// dernières commandes
$commandes = Commande::findBy([
$ordersArray = Order::searchAll([],[
'orderby' => 'date DESC',
'condition' => 'production.date > \'' . date('Y-m-d 00:00:00') . '\' AND (type = \'' . Commande::TYPE_USER . '\' OR type = \'' . Commande::TYPE_ADMIN . '\' OR (type = \'' . Commande::TYPE_AUTO . '\' AND (date_update IS NOT NULL OR date_delete IS NOT NULL)))'
'conditions' => 'distribution.date > :date AND (origin = \'' . Order::ORIGIN_USER . '\' OR origin = \'' . Order::ORIGIN_ADMIN . '\' OR (origin = \'' . Order::ORIGIN_AUTO . '\' AND (date_update IS NOT NULL OR date_delete IS NOT NULL)))',
'params' => [':date' => date('Y-m-d 00:00:00')],
]);

foreach ($commandes as $c)
$c->init();

// clients
$nb_clients = User::findBy()->count();
$nbUsers = User::searchCount();

$clients = User::findBy()
$usersArray = User::findBy()
->orderBy('created_at DESC')
->limit(5)
->all();

$clients_credit_pain_negatif = User::findBy(['id_etablissement' => Yii::$app->user->identity->id_etablissement])
->andWhere('user_etablissement.credit < 0')
$usersNegativeCredit = User::findBy(['id_producer' => Producer::getId()])
->andWhere('user_producer.credit < 0')
->all();

// paramètres
$etablissement = Etablissement::findOne(Yii::$app->user->identity->id_etablissement);
$producer = Producer::get();

return $this->render('index', [
'productions' => $productions,
'commandes' => $commandes,
'clients' => $clients,
'nb_clients' => $nb_clients,
'clients_credit_pain_negatif' => $clients_credit_pain_negatif,
'etablissement' => $etablissement,
'distributionsArray' => $distributions,
'ordersArray' => $ordersArray,
'usersArray' => $usersArray,
'nbUsers' => $nbUsers,
'usersNegativeCredit' => $usersNegativeCredit,
'producer' => $producer,
]);
}

@@ -203,9 +200,9 @@ class SiteController extends BackendController
*
* @param integer $id
*/
public function actionChangeEtablissement($id)
public function actionChangeProducer($id)
{
Yii::$app->user->identity->id_etablissement = $id;
Yii::$app->user->identity->id_producer = $id;
Yii::$app->user->identity->save();
$this->redirect(['site/index']);
}

+ 73
- 77
backend/controllers/StatsController.php View File

@@ -42,7 +42,7 @@ use yii\web\Controller;
use yii\filters\AccessControl;
use Yii;
use common\models\User;
use common\models\Commande;
use common\models\Order;
use DateTime;
use DateInterval;
use DatePeriod;
@@ -60,8 +60,7 @@ class StatsController extends BackendController
'allow' => true,
'roles' => ['@'],
'matchCallback' => function ($rule, $action) {
return Yii::$app->user->identity->status == USER::STATUS_ADMIN
|| Yii::$app->user->identity->status == USER::STATUS_BOULANGER;
return User::hasAccessBackend() ;
}
]
],
@@ -80,55 +79,52 @@ class StatsController extends BackendController
* Volume de commande de l'année passée (par mois)
*/

$date_start = date('Y-m-d', time() - 60 * 60 * 24 * 365);
$date_end = date('Y-m-d');
$dateStart = date('Y-m-d', time() - 60 * 60 * 24 * 365);
$dateEnd = date('Y-m-d');

$data_pain = [];
$data = [];

// labels
$data_labels = [];
$dataLabels = [];

$start = new DateTime($date_start);
$start = new DateTime($dateStart);
$interval = new DateInterval('P1M');
$end = new DateTime($date_end);
$end = new DateTime($dateEnd);

$period = new DatePeriod($start, $interval, $end);

foreach ($period as $date) {
$mois = date('m/Y', $date->getTimestamp());
$data_labels[] = $mois;
$data_pain[$mois] = 0;
$month = date('m/Y', $date->getTimestamp());
$dataLabels[] = $month;
$data[$month] = 0;
}

// commandes
$commandes = Commande::find()
->with('commandeProduits')
->joinWith('production')
->where('production.date > ' . $date_start)
->andWhere('production.id_etablissement = ' . Yii::$app->user->identity->id_etablissement)
->all();

foreach ($commandes as $c) {
$c->init();
$mois = date('m/Y', strtotime($c->production->date));
if (isset($data_pain[$mois])) {
$data_pain[$mois] += $c->montant;
$ordersArray = Order::searchAll([],[
'conditions' => 'distribution.date > :date',
'params' => [':date' => $dateStart]
]) ;

foreach ($ordersArray as $order) {
$month = date('m/Y', strtotime($order->distribution->date));
if (isset($data[$month])) {
$data[$month] += $order->amount;
}
}

// création d'un tableau sans index car chart.js n'accepte pas les index
$data_pain_noindex = [];
foreach ($data_pain as $key => $val) {
$data_pain_noindex[] = $val;
$dataNoIndex = [];
foreach ($data as $key => $val) {
$dataNoIndex[] = $val;
}

return $this->render('index', [
'data_labels' => $data_labels,
'data_pain' => $data_pain_noindex,
'dataLabels' => $dataLabels,
'data' => $dataNoIndex,
]);
}
const TOTAUX = 13 ;
const TOTALS = 13 ;
/**
* Affiche un tableau avec les totaux (maximums, commandés) de chaque produit
@@ -137,83 +133,83 @@ class StatsController extends BackendController
* @param integer $year
* @return mixed
*/
public function actionProduits($year = 0)
public function actionProducts($year = 0)
{
if(!$year) $year = date('Y') ;
$produits = Produit::find()
->where('(vrac IS NULL OR vrac = 0)')
->andWhere(['id_etablissement' => Yii::$app->user->identity->id_etablissement])
->orderBy('order ASC')
->all() ;
$productsArray = Product::searchAll() ;
$arr_produits = [] ;
$dataProducts = [] ;
$arr_produits[self::TOTAUX] = ['max' => [], 'commandes' => []] ;
foreach($produits as $p) {
$arr_produits[self::TOTAUX]['max'][$p['nom']] = 0 ;
$arr_produits[self::TOTAUX]['commandes'][$p['nom']] = 0 ;
$dataProducts[self::TOTALS] = ['max' => [], 'orders' => []] ;
foreach($productsArray as $product) {
$dataProducts[self::TOTALS]['max'][$product['name']] = 0 ;
$dataProducts[self::TOTALS]['orders'][$product['name']] = 0 ;
}
$empty = true ;
for($i = 1; $i <= 12; $i++) {
// Maximums
$res_maximums = Yii::$app->db->createCommand("SELECT produit.nom, SUM(IF(production_produit.actif,production_produit.quantite_max,0)) AS total
FROM production, production_produit, produit
WHERE production.id_etablissement = ".Yii::$app->user->identity->id_etablissement."
AND production.date >= :date_begin
AND production.date <= :date_end
AND production.id = production_produit.id_production
AND production_produit.id_produit = produit.id
GROUP BY produit.id
ORDER BY produit.nom")
$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
WHERE distribution.id_producer = ".Producer::getId()."
AND distribution.date >= :date_begin
AND distribution.date <= :date_end
AND distribution.id = product_distribution.id_distribution
AND product_distribution.id_product = product.id
GROUP BY product.id
ORDER BY product.name")
->bindValue(':date_begin', date($year.'-'.str_pad($i, 2, 0, STR_PAD_LEFT).'-01'))
->bindValue(':date_end', date($year.'-'.str_pad($i, 2, 0, STR_PAD_LEFT).'-31'))
->queryAll();
$arr_produits[$i]['max'] = $res_maximums ;
if(count($res_maximums)) $empty = false ;
$dataProducts[$i]['max'] = $resMaximums ;
if(count($resMaximums)) $empty = false ;
foreach($res_maximums as $produit_max) {
if(!isset($arr_produits[self::TOTAUX]['max'][$produit_max['nom']])) $arr_produits[self::TOTAUX]['max'][$produit_max['nom']] = 0 ;
$arr_produits[self::TOTAUX]['max'][$produit_max['nom']] += $produit_max['total'] ;
foreach($resMaximums as $productMax) {
if(!isset($dataProducts[self::TOTALS]['max'][$productMax['name']])) {
$dataProducts[self::TOTALS]['max'][$productMax['name']] = 0 ;
}
$dataProducts[self::TOTALS]['max'][$productMax['name']] += $productMax['total'] ;
}

// Commandés
$res_commandes = Yii::$app->db->createCommand("SELECT produit.nom, SUM(commande_produit.quantite) AS total
FROM production, commande, commande_produit, produit
WHERE production.id_etablissement = ".Yii::$app->user->identity->id_etablissement."
AND production.date >= :date_begin
AND production.date <= :date_end
AND production.id = commande.id_production
AND commande.id = commande_produit.id_commande
AND commande_produit.id_produit = produit.id
GROUP BY produit.id
ORDER BY produit.nom")
$resOrders = Yii::$app->db->createCommand('
SELECT product.name, SUM(product_order.quantity) AS total
FROM `distribution`, `order`, `product_order`, `product`
WHERE distribution.id_producer = '.Producer::getId().'
AND distribution.date >= :date_begin
AND distribution.date <= :date_end
AND distribution.id = `order`.id_distribution
AND `order`.id = product_order.id_order
AND product_order.id_product = product.id
GROUP BY product.id
ORDER BY product.name')
->bindValue(':date_begin', date($year.'-'.str_pad($i, 2, 0, STR_PAD_LEFT).'-01'))
->bindValue(':date_end', date($year.'-'.str_pad($i, 2, 0, STR_PAD_LEFT).'-31'))
->queryAll();
$arr_produits[$i]['commandes'] = $res_commandes ;
if(count($res_commandes)) $empty = false ;
$dataProducts[$i]['orders'] = $resOrders;
if(count($resOrders)) $empty = false ;
foreach($res_commandes as $produit_commandes) {
if(!isset($arr_produits[self::TOTAUX]['commandes'][$produit_commandes['nom']])) $arr_produits[self::TOTAUX]['commandes'][$produit_commandes['nom']] = 0 ;
$arr_produits[self::TOTAUX]['commandes'][$produit_commandes['nom']] += $produit_commandes['total'] ;
foreach($resOrders as $productOrder) {
if(!isset($dataProducts[self::TOTALS]['orders'][$productOrder['name']])) {
$dataProducts[self::TOTALS]['orders'][$productOrder['name']] = 0 ;
}
$dataProducts[self::TOTALS]['orders'][$productOrder['name']] += $productOrder['total'] ;
}
}
ksort($arr_produits) ;
ksort($dataProducts) ;
$arr_mois = ['Janvier','Février','Mars','Avril','Mai','Juin','Juillet','Août','Septembre','Octobre','Novembre','Décembre','Totaux'] ;
$monthArray = ['Janvier','Février','Mars','Avril','Mai','Juin','Juillet','Août','Septembre','Octobre','Novembre','Décembre','Totaux'] ;
return $this->render('produits', [
return $this->render('products', [
'year' => $year,
'arr_mois' => $arr_mois,
'produits' => $produits,
'arr_produits' => $arr_produits,
'monthArray' => $monthArray,
'productsArray' => $productsArray,
'dataProducts' => $dataProducts,
'empty' => $empty
]);
}

backend/controllers/CommandeautoController.php → backend/controllers/SubscriptionController.php View File

@@ -73,7 +73,7 @@ termes.

namespace backend\controllers;

class CommandeautoController extends BackendController
class SubscriptionController extends BackendController
{
var $enableCsrfValidation = false;

@@ -87,7 +87,7 @@ class CommandeautoController extends BackendController
'allow' => true,
'roles' => ['@'],
'matchCallback' => function ($rule, $action) {
return Yii::$app->user->identity->status == USER::STATUS_ADMIN || Yii::$app->user->identity->status == USER::STATUS_BOULANGER;
return User::hasAccessBackend() ;
}
]
],
@@ -103,11 +103,11 @@ class CommandeautoController extends BackendController
public function actionIndex()
{
$dataProvider = new ActiveDataProvider([
'query' => CommandeAuto::find()
->with(['user', 'etablissement', 'pointVente', 'commandeAutoProduit'])
'query' => Subscription::find()
->with(['user', 'producer', 'pointSale', 'productSubscription'])
->joinWith(['user'])
->where(['commande_auto.id_etablissement' => Yii::$app->user->identity->id_etablissement])
->orderBy('commande_auto.id_point_vente ASC, CASE `commande_auto`.`username` WHEN "" THEN `user`.`nom` ELSE `commande_auto`.`username` END ASC'),
->where(['subscription.id_producer' => Producer::getId()])
->orderBy('subscription.id_point_sale ASC, CASE `subscription`.`username` WHEN "" THEN `user`.`name` ELSE `subscription`.`username` END ASC'),
'pagination' => [
'pageSize' => 1000,
],
@@ -126,25 +126,22 @@ class CommandeautoController extends BackendController
public function actionCreate()
{
// form
$model = new CommandeAutoForm;
$model->id_etablissement = Yii::$app->user->identity->id_etablissement;
$model = new SubscriptionForm;
$model->id_producer = Producer::getId();

// produits
$produits = Produit::find()
->where(['id_etablissement' => $model->id_etablissement])
->orderBy('order ASC')
->all();

$productsArray = Product::searchAll() ;
if ($model->load(Yii::$app->request->post()) && $model->validate()
&& $model->save())
{
$this->redirect(['commandeauto/index']);
$this->redirect(['subscription/index']);
}

return $this->render('create', [
'model' => $model,
'produits' => $produits
]);
'model' => $model,
'productsArray' => $productsArray
]);
}

/**
@@ -157,56 +154,57 @@ class CommandeautoController extends BackendController
public function actionUpdate($id)
{
// form
$model = new CommandeAutoForm;
$commandeauto = CommandeAuto::findOne($id);
if ($commandeauto) {
$model = new SubscriptionForm;
$subscription = Subscription::findOne($id);
if ($subscription) {
$model->id = $id;
$model->id_etablissement = $commandeauto->id_etablissement;
$model->id_user = $commandeauto->id_user;
$model->username = $commandeauto->username;
$model->id_point_vente = $commandeauto->id_point_vente;
$model->date_debut = date('d/m/Y', strtotime($commandeauto->date_debut));
if (strlen($commandeauto->date_fin))
$model->date_fin = date('d/m/Y', strtotime($commandeauto->date_fin));
$model->lundi = $commandeauto->lundi;
$model->lundi = $commandeauto->lundi;
$model->mardi = $commandeauto->mardi;
$model->mercredi = $commandeauto->mercredi;
$model->jeudi = $commandeauto->jeudi;
$model->vendredi = $commandeauto->vendredi;
$model->samedi = $commandeauto->samedi;
$model->dimanche = $commandeauto->dimanche;
$model->paiement_automatique = $commandeauto->paiement_automatique;
$model->periodicite_semaine = $commandeauto->periodicite_semaine;
$model->id_producer = $subscription->id_producer;
$model->id_user = $subscription->id_user;
$model->username = $subscription->username;
$model->id_point_sale = $subscription->id_point_sale;
$model->date_begin = date('d/m/Y', strtotime($subscription->date_begin));
if (strlen($subscription->date_end)) {
$model->date_end = date('d/m/Y', strtotime($subscription->date_end));
}
$model->monday = $subscription->monday;
$model->tuesday = $subscription->tuesday;
$model->wednesday = $subscription->wednesday;
$model->thursday = $subscription->thursday;
$model->friday = $subscription->friday;
$model->saturday = $subscription->saturday;
$model->sunday = $subscription->sunday;
$model->auto_payment = $subscription->auto_payment;
$model->week_frequency = $subscription->week_frequency;


// produits
$commandeauto_produits = CommandeAutoProduit::find()->where(['id_commande_auto' => $model->id])->all();
foreach ($commandeauto_produits as $commandeauto_produit) {
$model->produits['produit_' . $commandeauto_produit->id_produit] = $commandeauto_produit->quantite;
$arrayProductsSubscription = ProductSubscription::searchAll([
'id_subscription' => $model->id
]) ;
foreach ($arrayProductsSubscription as $productSubscription) {
$model->products['product_' . $productSubscription->id_product] = $productSubscription->quantity;
}
} else {
throw new NotFoundHttpException('La commande récurrente est introuvable.', 404);
throw new NotFoundHttpException('L\'abonnement est introuvable.', 404);
}

// produits
$produits = Produit::find()
->where(['id_etablissement' => $model->id_etablissement])
->orderBy('order ASC')
->all();
$productsArray = Product::searchAll() ;

if ($model->load(Yii::$app->request->post()) && $model->validate()) {
if (!strlen($model->date_fin)) {
$model->date_fin = null;
if (!strlen($model->date_end)) {
$model->date_end = null;
}
if ($model->save()) {
$this->redirect(['commandeauto/index']);
$this->redirect(['subscription/index']);
}
}

return $this->render('update', [
'model' => $model,
'produits' => $produits
'productsArray' => $productsArray
]);
}

@@ -217,9 +215,9 @@ class CommandeautoController extends BackendController
*/
public function actionDelete($id)
{
CommandeAutoProduit::deleteAll(['id_commande_auto' => $id]);
CommandeAuto::findOne($id)->delete();
$this->redirect(['commandeauto/index']);
ProductSubscription::deleteAll(['id_subscription' => $id]);
Subscription::findOne($id)->delete();
$this->redirect(['subscription/index']);
}

}

+ 76
- 82
backend/controllers/UserController.php View File

@@ -38,6 +38,8 @@ termes.

namespace backend\controllers;

use common\models\User ;

/**
* UserController implements the CRUD actions for User model.
*/
@@ -59,8 +61,7 @@ class UserController extends BackendController
'allow' => true,
'roles' => ['@'],
'matchCallback' => function ($rule, $action) {
return Yii::$app->user->identity->status == USER::STATUS_ADMIN
|| Yii::$app->user->identity->status == USER::STATUS_BOULANGER;
return User::hasAccessBackend();
}
]
],
@@ -74,32 +75,35 @@ class UserController extends BackendController
* @return mixed
*/
public function actionIndex(
$id_point_vente = 0, $section_clients_inactifs = false)
$idPointSale = 0, $sectionInactiveUsers = false)
{
$params = Yii::$app->request->queryParams;
if($id_point_vente)
$params['id_point_vente'] = $id_point_vente ;
if($section_clients_inactifs)
$params['inactifs'] = true ;
if($idPointSale) {
$params['id_point_sale'] = $idPointSale ;
}
if($sectionInactiveUsers) {
$params['inactive'] = true ;
}
$query = User::findBy($params);
$dataProvider = new ActiveDataProvider([
'query' => $query,
'sort' => ['attributes' => ['nom','prenom']],
'sort' => ['attributes' => ['lastname','name']],
]);
$etablissement = Etablissement::find()
->where(['id' => Yii::$app->user->identity->id_etablissement])
->one();
$producer = Producer::searchOne([
'id' => Producer::getId()
]) ;
$points_vente = PointVente::find()->where(['id_etablissement' => $etablissement->id])->all() ;
$pointsSaleArray = PointSale::searchAll() ;

return $this->render('index', [
'dataProvider' => $dataProvider,
'etablissement' => $etablissement,
'id_point_vente_active' => $id_point_vente,
'points_vente' => $points_vente,
'section_clients_inactifs' => $section_clients_inactifs,
'producer' => $producer,
'idPointSaleActive' => $idPointSale,
'pointsSaleArray' => $pointsSaleArray,
'sectionInactiveUsers' => $sectionInactiveUsers,
]);
}
@@ -119,19 +123,19 @@ class UserController extends BackendController
$model->setPassword($password);
$model->generateAuthKey();
$model->username = $model->email;
$model->confiance = 1;
if (!strlen($model->email))
if (!strlen($model->email)) {
$model->username = 'inconnu@laboiteapain.net';

}
$model->save();

// liaison etablissement / user
$user_etablissement = new UserEtablissement();
$user_etablissement->id_user = $model->id;
$user_etablissement->id_etablissement = Yii::$app->user->identity->id_etablissement;
$user_etablissement->credit = 0;
$user_etablissement->actif = 1;
$user_etablissement->save();
$useProducer = new UserProducer();
$useProducer->id_user = $model->id;
$useProducer->id_producer = Producer::getId();
$useProducer->credit = 0;
$useProducer->active = 1;
$useProducer->save();

$model->sendMailWelcome($password) ;

@@ -153,15 +157,15 @@ class UserController extends BackendController
{
$model = $this->findModel($id);

$previous_mail = $model->email ;
$previousMail = $model->email ;
$user = User::find()->with('userEtablissement')->where(['id' => $model['id']])->one();
$user_appartient_etablissement = UserEtablissement::findOne(['id_user' => $id, 'id_etablissement' => Yii::$app->user->identity->id_etablissement]);
if (($user_appartient_etablissement && count($user->userEtablissement) == 1) || Yii::$app->user->identity->status == USER::STATUS_ADMIN) {
$user = User::find()->with('userProducer')->where(['id' => $model['id']])->one();
$userBelongToProducer = UserProducer::findOne(['id_user' => $id, 'id_producer' => Producer::getId()]);
if (($userBelongToProducer && count($user->userProducer) == 1) || User::getCurrentStatus() == USER::STATUS_ADMIN) {
if ($model->load(Yii::$app->request->post()) && $model->save()) {
// on envoie le mail de bienvenue si le mail vient d'être défini
if(!strlen($previous_mail) && strlen($model->email)) {
if(!strlen($previousMail) && strlen($model->email)) {
$password = Password::generate();
$model->setPassword($password);
$model->username = $model->email;
@@ -186,17 +190,17 @@ class UserController extends BackendController
*/
public function actionDelete($id)
{
$user_etablissement = UserEtablissement::findOne([
$userProducer = UserProducer::findOne([
'id_user' => $id,
'id_etablissement' => Yii::$app->user->identity->id_etablissement
'id_producer' => Producer::getId()
]) ;
if($user_etablissement) {
$user_etablissement->actif = 0 ;
$user_etablissement->favoris = 0 ;
$user_etablissement->save() ;
if($userProducer) {
$userProducer->active = 0 ;
$userProducer->bookmark = 0 ;
$userProducer->save() ;
}
else {
throw new \yii\web\NotFoundHttpException('L\'enregistrement UserEtablissement est introuvable', 404) ;
throw new \yii\web\NotFoundHttpException('L\'enregistrement UserProducer est introuvable', 404) ;
}
$params = Yii::$app->getRequest()->getQueryParams() ;
@@ -209,33 +213,33 @@ class UserController extends BackendController
* Affiche la liste des emails des utilisateurs liés à un point de vente
* donné.
*
* @param integer $id_point_vente
* @param integer $idPointSale
* @return mixed
*/
public function actionMail($id_point_vente = 0)
public function actionMail($idPointSale = 0)
{
$users = User::findBy([
'id_etablissement' => Yii::$app->user->identity->id_etablissement,
'id_point_vente' => $id_point_vente
'id_producer' => Producer::getId(),
'id_point_sale' => $idPointSale
])->all() ;

$arr_users = [];
foreach ($users as $u) {
if (isset($u['email']) && strlen($u['email']))
$arr_users[] = $u['email'];
$usersArray = [];
foreach ($usersArray as $user) {
if (isset($user['email']) && strlen($user['email']))
$usersArray[] = $user['email'];
}
$points_vente = PointVente::find()->where(['id_etablissement' => Yii::$app->user->identity->id_etablissement])->all() ;
$pointsSaleArray = PointSale::find()->where(['id_producer' => Producer::getId()])->all() ;
$point_vente = null ;
if($id_point_vente) {
$point_vente = PointVente::findOne(['id' => $id_point_vente, 'id_etablissement' => Yii::$app->user->identity->id_etablissement]) ;
$pointSale = null ;
if($idPointSale) {
$pointSale = PointSale::findOne(['id' => $idPointSale, 'id_producer' => Producer::getId()]) ;
}

return $this->render('liste_mails', [
'users' => $arr_users,
'points_vente' => $points_vente,
'point_vente' => $point_vente
return $this->render('emails', [
'usersArray' => $usersArray,
'pointsSaleArray' => $pointsSaleArray,
'pointSale' => $pointSale
]);
}

@@ -249,31 +253,31 @@ class UserController extends BackendController
*/
public function actionCredit($id)
{
$user = User::find()->with('userEtablissement')->where(['id' => $id])->one();
$user_etablissement = UserEtablissement::findOne(['id_user' => $id, 'id_etablissement' => Yii::$app->user->identity->id_etablissement]);
$user = User::find()->with('userProducer')->where(['id' => $id])->one();
$userProducer = UserProducer::findOne(['id_user' => $id, 'id_producer' => Producer::getId()]);
if (($user_etablissement) || Yii::$app->user->identity->status == USER::STATUS_ADMIN) {
if (($userProducer) || User::getCurrentStatus() == User::STATUS_ADMIN) {
$credit_form = new CreditForm;
if ($credit_form->load(Yii::$app->request->post()) && $credit_form->validate()) {
$credit_form->id_user = $id ;
$credit_form->save();
$credit_form = new CreditForm;
$creditForm = new CreditForm;
if ($creditForm->load(Yii::$app->request->post()) && $creditForm->validate()) {
$creditForm->id_user = $id ;
$creditForm->save();
$creditForm = new CreditForm;
}

$historique = CreditHistorique::find()
->with(['commande', 'userAction'])
$history = CreditHistory::find()
->with(['order', 'userAction'])
->where([
'id_user' => $user->id,
'id_etablissement' => Yii::$app->user->identity->id_etablissement,
'id_producer' => Producer::getId(),
])
->orderBy('date DESC')
->all();

return $this->render('credit', [
'user' => $user,
'credit_form' => $credit_form,
'historique' => $historique
'creditForm' => $creditForm,
'history' => $history
]);
}
else {
@@ -287,26 +291,16 @@ class UserController extends BackendController
* @param integer $id
* @return mixed
*/
public function actionCommandes($id)
public function actionOrders($id)
{

$user = User::findOne($id);

$commandes = Commande::find()
->with('commandeProduits', 'pointVente', 'creditHistorique')
->joinWith('production', 'production.etablissement')
->where([
'id_user' => $id,
'production.id_etablissement' => Yii::$app->user->identity->id_etablissement
])
->orderBy('production.date DESC')
->all();

foreach ($commandes as $c)
$c->init();
$orders = Order::searchAll([
'id_user' => $id
], ['orderby' => 'distribution.date DESC']) ;

return $this->render('commandes', [
'commandes' => $commandes,
'ordersArray' => $ordersArray,
'user' => $user
]);
}

+ 31
- 30
backend/models/CreditForm.php View File

@@ -40,10 +40,10 @@ namespace backend\models;

use Yii;
use yii\base\Model;
use common\models\CreditHistorique ;
use common\models\CreditHistory ;
use common\models\User ;
use common\models\Etablissement ;
use common\models\UserEtablissement ;
use common\models\Prtoducer ;
use common\models\UserProducer ;
use common\helpers\Mail ;

/**
@@ -54,11 +54,11 @@ class CreditForm extends Model

public $id_user ;
public $id_user_action ;
public $id_etablissement ;
public $id_producer ;
public $type ;
public $montant ;
public $moyen_paiement ;
public $commentaire ;
public $amount ;
public $means_payment ;
public $comment ;
public $send_mail ;

/**
@@ -67,11 +67,11 @@ class CreditForm extends Model
public function rules()
{
return [
[['montant'], 'required'],
[['id_user', 'id_user_action', 'id_etablissement'], 'integer'],
[['amount'], 'required'],
[['id_user', 'id_user_action', 'id_producer'], 'integer'],
[['date','send_mail'], 'safe'],
[['montant'], 'double'],
[['type', 'moyen_paiement', 'commentaire'], 'string', 'max' => 255],
[['amount'], 'double'],
[['type', 'means_payment', 'comment'], 'string', 'max' => 255],
];
}

@@ -84,11 +84,11 @@ class CreditForm extends Model
'id_user' => 'Utilisateur',
'id_user_action' => 'Utilisateur',
'date' => 'Date',
'montant' => 'Montant',
'amount' => 'Montant',
'type' => 'Type',
'id_etablissement' => 'Établissement',
'moyen_paiement' => 'Moyen de paiement',
'commentaire' => 'Commentaire',
'id_producer' => 'Producteur',
'means_payment' => 'Moyen de paiement',
'comment' => 'Commentaire',
'send_mail' => 'Prévenir l\'utilisateur',
];
}
@@ -99,27 +99,28 @@ class CreditForm extends Model
public function save()
{
if ($this->validate()) {
$credit_historique = new CreditHistorique ;
$credit_historique->id_user = $this->id_user;
$credit_historique->id_user_action = Yii::$app->user->identity->id;
$credit_historique->id_etablissement = Yii::$app->user->identity->id_etablissement;
$credit_historique->type = $this->type ;
$credit_historique->commentaire = $this->commentaire ;
$credit_historique->montant = $this->montant ;
$credit_historique->moyen_paiement = $this->moyen_paiement ;
$credit_historique->save();
$creditHistory = new CreditHistory;
$creditHistory->id_user = $this->id_user;
$creditHistory->id_user_action = Yii::$app->user->identity->id;
$creditHistory->id_producer = Producer::getId() ;
$creditHistory->type = $this->type ;
$creditHistory->comment = $this->comment ;
$creditHistory->amount = $this->amount ;
$creditHistory->means_payment = $this->means_payment ;
$creditHistory->save();
// on prévient l'utilisateur que son compte vient d'être crédité
if($this->send_mail) {
$user = User::findOne($this->id_user) ;
$etablissement = Etablissement::findOne(Yii::$app->user->identity->id_etablissement) ;
$user_etablissement = UserEtablissement::findOne(['id_user' => $this->id_user, 'id_etablissement' => Yii::$app->user->identity->id_etablissement]);
$producer = Producer::get() ;
$userProducer = UserProducer::searchOne([
'id_user' => $this->id_user
]);
Mail::send($user->email, 'Votre compte vient d\'être crédité','creditUser', [
'user' => $user,
'etablissement' => $etablissement,
'user_etablissement' => $user_etablissement,
'credit_form' => $this
'producer' => $producer,
'userProducer' => $userProducer,
'creditForm' => $this
]) ;
}
}

+ 1
- 1
backend/models/MailForm.php View File

@@ -82,7 +82,7 @@ class MailForm extends Model
{
return Yii::$app->mailer->compose()
->setTo($email)
->setFrom(['matthieu@lechatdesnoisettes.com' => 'Le Chat des Noisettes'])
->setFrom(['contact@laboiteapain.net' => 'Laboîte à pain'])
->setSubject($this->subject)
->setTextBody($this->body)
->send();

backend/views/communiquer/index.php → backend/views/communicate/index.php View File

@@ -51,6 +51,6 @@ $this->title = 'Communiquer' ;
<h1><?= Html::encode($this->title) ; ?></h1>

<p>Imprimez ce petit encart pour expliquer à vos clients comment passer leurs commandes.</p>
<?php echo $this->render('mode_emploi', ['etablissement' => $etablissement]) ; ?>
<p><?php echo Html::a('<span class="glyphicon glyphicon-download-alt"></span> Télécharger', ['communiquer/modeemploi'], ['class'=>'btn btn-primary']) ?></p>
<?php echo $this->render('instructions', ['producer' => $producer]) ; ?>
<p><?php echo Html::a('<span class="glyphicon glyphicon-download-alt"></span> Télécharger', ['communicate/instructions'], ['class'=>'btn btn-primary']) ?></p>


backend/views/communiquer/mode_emploi.php → backend/views/communicate/instructions.php View File

@@ -40,10 +40,10 @@ use yii\helpers\Html ;

?>

<div class="communiquer-mode-emploi<?php if(isset($pdf) && $pdf): ?> communiquer-mode-emploi-pdf<?php endif; ?><?php if(!isset($pdf)): ?> communiquer-mode-emploi-encart<?php endif; ?>">
<div class="communicate-instructions<?php if(isset($pdf) && $pdf): ?> communicate-instructions-pdf<?php endif; ?><?php if(!isset($pdf)): ?> communicate-instructions-inset<?php endif; ?>">
<div class="header">
<div class="logo">
<img src="./img/laboulange4.png" alt="Logo" />
<img src="../img/laboulange4.png" alt="Logo" />
</div>
<h1>La boîte à pain</h1>
<h2>Plateforme de réservation de pain</h2>
@@ -54,10 +54,10 @@ use yii\helpers\Html ;
<ol>
<li>Inscrivez-vous sur <strong>www.laboiteapain.net</strong></li>
<?php if(strlen($etablissement->code)): ?>
<li>Ajoutez le producteur <strong><?= Html::encode($etablissement->nom); ?></strong><br />grâce au code : <span class="code"><strong><?= Html::encode($etablissement->code) ?></strong> <?php if(!isset($pdf)): echo Html::a('<span class="glyphicon glyphicon-pencil"></span>', ['etablissement/update'], ['class'=> 'btn btn-default btn-xs']); endif; ?></span></li>
<?php if(strlen($producer->code)): ?>
<li>Ajoutez le producteur <strong><?= Html::encode($producer->name); ?></strong><br />grâce au code : <span class="code"><strong><?= Html::encode($producer->code) ?></strong> <?php if(!isset($pdf)): echo Html::a('<span class="glyphicon glyphicon-pencil"></span>', ['producer/update'], ['class'=> 'btn btn-default btn-xs']); endif; ?></span></li>
<?php else: ?>
<li>Ajoutez la producteur <strong><?= Html::encode($etablissement->nom); ?></strong></li>
<li>Ajoutez le producteur <strong><?= Html::encode($producer->name); ?></strong></li>
<?php endif; ?>
<li>Passez votre commande</li>
</ol>

backend/views/communiquer/mode_emploi_multi.php → backend/views/communicate/instructions_multi.php View File

@@ -39,7 +39,7 @@ termes.
?>

<?php for($i = 0; $i < 8; $i++): ?>
<div class="bloc-mode-emploi-pdf<?php if($i%2 == 0): ?> bloc-mode-emploi-border<?php endif; ?><?php if($i == 6 || $i == 7): ?> bloc-mode-emploi-bottom<?php endif; ?>">
<?php echo $this->render('mode_emploi',['pdf' => true, 'etablissement' => $etablissement]) ; ?>
<div class="block-instructions-pdf<?php if($i%2 == 0): ?> block-instructions-border<?php endif; ?><?php if($i == 6 || $i == 7): ?> block-instructions-bottom<?php endif; ?>">
<?php echo $this->render('instructions',['pdf' => true, 'producer' => $producer]) ; ?>
</div>
<?php endfor; ?>

+ 0
- 42
backend/views/communiquer/affiche.php View File

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

/**
Copyright La boîte à pain (2018)

contact@laboiteapain.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.
*/


?>

<h1>Affiche</h1>

backend/views/developpement/_form.php → backend/views/development/_form.php View File

@@ -45,29 +45,25 @@ use common\models\Developpement ;
/* @var $form yii\widgets\ActiveForm */
?>

<div class="developpement-form">
<div class="development-form">

<?php $form = ActiveForm::begin(); ?>
<?= $form->field($model, 'type')->dropDownList([
Developpement::TYPE_EVOLUTION => 'Évolution',
Developpement::TYPE_BUG => 'Anomalie',
Development::TYPE_EVOLUTION => 'Évolution',
Development::TYPE_BUG => 'Anomalie',
]) ?>
<?= $form->field($model, 'statut')->dropDownList([
Developpement::STATUT_OPEN => 'Ouvert',
Developpement::STATUT_CLOSED => 'Fermé',
<?= $form->field($model, 'status')->dropDownList([
Development::STATUS_OPEN => 'Ouvert',
Development::STATUS_CLOSED => 'Fermé',
]) ?>
<?= $form->field($model, 'objet')->textInput(['maxlength' => true]) ?>

<?= $form->field($model, 'subject')->textInput(['maxlength' => true]) ?>
<?= $form->field($model, 'description')->textarea(['rows' => 6]) ?>

<?= $form->field($model, 'estimation_temps')->textInput() ?>

<?= $form->field($model, 'avancement')->textInput() ?>
<?= $form->field($model, 'date_livraison')->textInput() ?>
<?= $form->field($model, 'time_estimate')->textInput() ?>
<?= $form->field($model, 'progress')->textInput() ?>
<?= $form->field($model, 'date_delivery')->textInput() ?>

<div class="form-group">
<?= Html::submitButton($model->isNewRecord ? 'Ajouter' : 'Modifier', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>

backend/views/developpement/create.php → backend/views/development/create.php View File

@@ -46,7 +46,7 @@ $this->title = 'Ajouter un développement';
$this->params['breadcrumbs'][] = ['label' => 'Développement', 'url' => ['index']];
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="developpement-create">
<div class="development-create">

<h1><?= Html::encode($this->title) ?></h1>


backend/views/developpement/index.php → backend/views/development/index.php View File

@@ -38,8 +38,8 @@ termes.

use yii\helpers\Html;
use yii\grid\GridView;
use common\models\Developpement;
use common\models\DeveloppementPriorite;
use common\models\Development;
use common\models\DevelopmentPriority;
use common\models\User;
use common\helpers\Url;

@@ -49,7 +49,7 @@ use common\helpers\Url;
$this->title = 'Développement';
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="developpement-index">
<div class="development-index">

<h1><?= Html::encode($this->title) ?> <?= Html::a('Ajouter', ['create'], ['class' => 'btn btn-success']) ?></h1>
@@ -64,9 +64,9 @@ $this->params['breadcrumbs'][] = $this->title;
}
?>
<ul id="tabs-statuts-developpements" class="nav nav-tabs" role="tablist">
<li role="presentation" class="<?php if($statut == Developpement::STATUT_OPEN): ?>active<?php endif; ?>"><a href="<?= Yii::$app->urlManager->createUrl(['developpement/index','statut' => Developpement::STATUT_OPEN]); ?>" id="" aria-controls="" role="tab">Ouvert</a></li>
<li role="presentation" class="<?php if($statut == Developpement::STATUT_CLOSED): ?>active<?php endif; ?>"><a href="<?= Yii::$app->urlManager->createUrl(['developpement/index','statut' => Developpement::STATUT_CLOSED]); ?>" id="" aria-controls="" role="tab">Fermé</a></li>
<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>
</ul>
<?php
@@ -83,7 +83,7 @@ $this->params['breadcrumbs'][] = $this->title;
'header' => 'Type',
'format' => 'raw',
'value' => function($model) {
if($model->type == Developpement::TYPE_EVOLUTION) {
if($model->type == Development::TYPE_EVOLUTION) {
return '<span class="label label-success">Évolution</span>' ;
}
else {
@@ -94,7 +94,7 @@ $this->params['breadcrumbs'][] = $this->title;
[ 'attribute' => 'sujet',
'format' => 'raw',
'value' => function($model) {
$html = '<strong>'.Html::encode($model->objet).'</strong>' ;
$html = '<strong>'.Html::encode($model->subject).'</strong>' ;
if(strlen($model->description))
$html .= '<br />'.nl2br(Html::encode($model->description)) ;
return $html ;
@@ -103,59 +103,57 @@ $this->params['breadcrumbs'][] = $this->title;
'header' => 'Estimation',
'format' => 'raw',
'value' => function($model) {
return intval($model->estimation_temps).' h' ;
return intval($model->time_estimate).' h' ;
}],
[ 'attribute' => 'avancement',
'format' => 'raw',
'value' => function($model) {
if($model->avancement)
if($model->progress)
return '<div class="progress">
<div class="progress-bar progress-bar-warning" role="progressbar" aria-valuenow="'.intval($model->avancement).'" aria-valuemin="0" aria-valuemax="100" style="width: '.intval($model->avancement).'%;">
<span class="sr-only">'.intval($model->avancement).'% effectué</span>
<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> ' ;
else
return '' ;
}],
[ 'attribute' => 'date_livraison',
[ 'attribute' => 'date_delivery',
'format' => 'raw',
'value' => function($model) {
if(strlen($model->date_livraison))
return date('d/m/Y',strtotime($model->date_livraison)) ;
if(strlen($model->date_delivery))
return date('d/m/Y',strtotime($model->date_delivery)) ;
else
return '' ;
}],
] ;
if(Yii::$app->user->identity->status == USER::STATUS_ADMIN
|| Yii::$app->user->identity->status == USER::STATUS_BOULANGER) {
if(User::hasAccessBackend()) {
$columns[] = [
'header' => 'Priorité',
'format' => 'raw',
'value' => function($model) {

$current_priorite = (isset($model->developpementPrioriteCurrentEtablissement)) ? $model->developpementPrioriteCurrentEtablissement->getStrPriorite() : 'Non' ;
$style_bouton = (isset($model->developpementPrioriteCurrentEtablissement)) ? $model->developpementPrioriteCurrentEtablissement->getClassCssStyleBouton() : 'default' ;
$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-'.$style_bouton.' dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
'.$current_priorite.' <span class="caret"></span>
<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>
<ul class="dropdown-menu">
<li><a href="'.Yii::$app->urlManager->createUrl(['developpement/priorite','id_developpement'=>$model->id]).'">Non</a></li>
<li><a href="'.Yii::$app->urlManager->createUrl(['developpement/priorite','id_developpement'=>$model->id, 'priorite' => DeveloppementPriorite::PRIORITE_BASSE]).'">Basse</a></li>
<li><a href="'.Yii::$app->urlManager->createUrl(['developpement/priorite','id_developpement'=>$model->id, 'priorite' => DeveloppementPriorite::PRIORITE_NORMALE]).'">Normale</a></li>
<li><a href="'.Yii::$app->urlManager->createUrl(['developpement/priorite','id_developpement'=>$model->id, 'priorite' => DeveloppementPriorite::PRIORITE_HAUTE]).'">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>
</div><br />' ;
if(isset($model->developpementPriorite) && count($model->developpementPriorite)) {
foreach($model->developpementPriorite as $developpement_priorite) {
if($developpement_priorite->id_etablissement != Yii::$app->user->identity->id_etablissement)
$html .= '<div class="label label-priorite label-sm label-'.$developpement_priorite->getClassCssStyleBouton().'">'.Html::encode($developpement_priorite->etablissement->nom).'</div> ' ;
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> ' ;
}
}
@@ -164,7 +162,7 @@ $this->params['breadcrumbs'][] = $this->title;
] ;
}
if(Yii::$app->user->identity->status == USER::STATUS_ADMIN) {
if(User::getCurrentStatus() == USER::STATUS_ADMIN) {
$columns[] = [
'class' => 'yii\grid\ActionColumn',
'template' => '{update}',
@@ -178,7 +176,7 @@ $this->params['breadcrumbs'][] = $this->title;
<span class="sr-only">Toggle Dropdown</span>
</button>
<ul class="dropdown-menu">
<li><a href="'.Yii::$app->urlManager->createUrl(['developpement/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>
</div>' ;
},
@@ -190,7 +188,7 @@ $this->params['breadcrumbs'][] = $this->title;
<?=
GridView::widget([
'id' => 'tab-developpements',
'id' => 'tab-developments',
'dataProvider' => $dataProvider,
'columns' => $columns
]);

backend/views/developpement/update.php → backend/views/development/update.php View File

@@ -46,7 +46,7 @@ $this->params['breadcrumbs'][] = ['label' => 'Développement', 'url' => ['index'
$this->params['breadcrumbs'][] = ['label' => '#'.$model->id, 'url' => ['update', 'id' => $model->id]];
$this->params['breadcrumbs'][] = 'Modifier';
?>
<div class="developpement-update">
<div class="development-update">

<h1><?= Html::encode($this->title) ?></h1>


+ 32
- 31
backend/views/layouts/main.php View File

@@ -40,7 +40,7 @@ use yii\helpers\Html;
use yii\bootstrap\Nav;
use yii\bootstrap\NavBar;
use yii\widgets\Breadcrumbs;
use common\models\Etablissement;
use common\models\Producer;
use common\models\User;
use yii\widgets\ActiveForm;
use yii\helpers\ArrayHelper;
@@ -53,8 +53,9 @@ use common\helpers\Url;
\backend\assets\AppAsset::register($this);

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

?>
<?php $this->beginPage() ?>
@@ -91,29 +92,29 @@ if(!Yii::$app->user->isGuest)
],
[
'label' => '<span class="glyphicon glyphicon-calendar"></span> Commandes',
'url' => ['/commande/index'],
'url' => ['/order/index'],
'visible' => !Yii::$app->user->isGuest,
'items' => [
[
'label' => '<span class="glyphicon glyphicon-calendar"></span> Toutes les commandes',
'url' => ['/commande/index'],
'url' => ['/order/index'],
'visible' => !Yii::$app->user->isGuest
],
[
'label' => '<span class="glyphicon glyphicon-repeat"></span> Commandes récurrentes',
'url' => ['/commandeauto/index'],
'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' => ['/produit/index'],
'url' => ['/product/index'],
'visible' => !Yii::$app->user->isGuest
],
[
'label' => '<span class="glyphicon glyphicon-map-marker"></span> Points de vente',
'url' => ['/point-vente/index'],
'url' => ['/point-sale/index'],
'visible' => !Yii::$app->user->isGuest
],
[
@@ -123,22 +124,22 @@ if(!Yii::$app->user->isGuest)
],
[
'label' => '<span class="glyphicon glyphicon-plus"></span>',
'url' => ['/etablissement/update'],
'url' => ['/producer/update'],
'visible' => !Yii::$app->user->isGuest,
'items' => [
[
'label' => '<span class="glyphicon glyphicon-cog"></span> Paramètres',
'url' => ['/etablissement/update'],
'url' => ['/producer/update'],
'visible' => !Yii::$app->user->isGuest
],
[
'label' => '<span class="glyphicon glyphicon-bullhorn"></span> Communiquer',
'url' => ['/communiquer/index'],
'url' => ['/communicate/index'],
'visible' => !Yii::$app->user->isGuest
],
[
'label' => '<span class="glyphicon glyphicon-euro"></span> Mon abonnement',
'url' => ['/etablissement/facturation'],
'url' => ['/producer/billing'],
'visible' => !Yii::$app->user->isGuest,
],
[
@@ -148,12 +149,12 @@ if(!Yii::$app->user->isGuest)
],
[
'label' => '<span class="glyphicon glyphicon-stats"></span> Statistiques produits',
'url' => ['/stats/produits'],
'url' => ['/stats/products'],
'visible' => !Yii::$app->user->isGuest,
],
[
'label' => '<span class="glyphicon glyphicon-wrench"></span> Développement',
'url' => ['/developpement/index'],
'url' => ['/development/index'],
'visible' => !Yii::$app->user->isGuest
],
],
@@ -171,13 +172,13 @@ if(!Yii::$app->user->isGuest)
'items' => [
[
'label' => '<span class="glyphicon glyphicon-th-list"></span> Producteurs',
'url' => ['etablissement-admin/index'],
'url' => ['producer-admin/index'],
'visible' => !Yii::$app->user->isGuest,
],
[
'label' => '<span class="glyphicon glyphicon-euro"></span> Facturation',
'url' => ['etablissement-admin/facturation'],
'visible' => !Yii::$app->user->isGuest,
'url' => ['producer-admin/billing'],
'visible' => false,
],
]
];
@@ -207,27 +208,27 @@ if(!Yii::$app->user->isGuest)
<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="nom-boulange">
<?php if (Yii::$app->user->identity->status == User::STATUS_BOULANGER): ?>
<span><?= Html::encode(Yii::$app->user->identity->getNomMagasin()); ?></span>
<?php elseif (Yii::$app->user->identity->status == User::STATUS_ADMIN): ?>
<?php $form = ActiveForm::begin(['id' => 'select-etablissement']); ?>
<div class="name-producer">
<?php if (User::getCurrentStatus() == User::STATUS_PRODUCER): ?>
<span><?= Html::encode(Yii::$app->user->identity->getNameProducer()); ?></span>
<?php elseif (User::getCurrentStatus() == User::STATUS_ADMIN): ?>
<?php $form = ActiveForm::begin(['id' => 'select-producer']); ?>
<?=
Html::dropDownList('select_etablissement', Yii::$app->user->identity->id_etablissement, ArrayHelper::map(Etablissement::find()->orderBy('nom ASC')->all(), 'id', function($model, $defaultValue) {
return $model->nom;
}));
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 endif; ?>

<?php
$etablissement = Etablissement::findOne(Yii::$app->user->identity->id_etablissement);
if (!$etablissement->actif):
$producer = Producer::findOne(Producer::getId());
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.">
<?= Html::a('Hors-ligne', ['etablissement/update']); ?>
<?= Html::a('Hors-ligne', ['producer/update']); ?>
</span>
<?php endif; ?>
<?php endif; ?>

<div class="clr"></div>
</div>
@@ -247,7 +248,7 @@ if(!Yii::$app->user->isGuest)
'links' => isset($this->params['breadcrumbs']) ? $this->params['breadcrumbs'] : [],
])
?>
<?= $content ?>
<?= $content ?>
</div>
</div>


backend/views/commande/_total_commandes.php → backend/views/order/_total_orders.php View File

@@ -35,7 +35,7 @@ pris connaissance de la licence CeCILL, et que vous en avez accepté les
termes.
*/

use common\models\Commande ;
use common\models\Order ;
use yii\helpers\Html ;

?>
@@ -48,45 +48,47 @@ use yii\helpers\Html ;
</div>
<div class="panel-body">
<div class="alert alert-warning">
<strong>Potentiel :</strong> <?= number_format($ca_potentiel,2); ?> € (<?= $poids_total ?> kg) &bull;
<strong>Commandé :</strong> <?= number_format($recettes,2); ?> € (<?= $poids ?> kg)
<strong>Potentiel :</strong> <?= number_format($potentialTurnover,2); ?> € (<?= $totalWeight ?> kg) &bull;
<strong>Commandé :</strong> <?= number_format($revenues,2); ?> € (<?= $weight ?> kg)
</div>

<table class="table table-bordered tab-content table-produits table-header-rotated">
<tbody>
<tr>
<?php
foreach ($produits as $p) {
if ((isset($produits_selec[$p->id]['actif']) && $produits_selec[$p->id]['actif']) ||
(!$produits_selec[$p->id]['actif'] && Commande::getQuantiteProduit($p->id, $commandes)))
foreach ($arrayProducts as $p) {
if ((isset($arrayProductsSelected[$p->id]['active']) && $arrayProductsSelected[$p->id]['active']) ||
(!$arrayProductsSelected[$p->id]['active'] && Order::getProductQuantity($p->id, $arrayOrders)))
{
(!$produits_selec[$p->id]['actif']) ? $class_disabled = 'disabled' : $class_disabled = '' ;
(!$arrayProductsSelected[$p->id]['active']) ? $class_disabled = 'disabled' : $class_disabled = '' ;
echo '<th class="rotate-45 '.$class_disabled.'"><div><span>'.Html::encode($p->getLibelleAdmin()).'</span></div></th>' ;
echo '<th class="rotate-45 '.$class_disabled.'"><div><span>'.Html::encode($p->getStrWordingAdmin()).'</span></div></th>' ;
}
}
?>
</tr>
<tr>
<?php
foreach ($produits as $p) {
$quantite = Commande::getQuantiteProduit($p->id, $commandes);
if ((isset($produits_selec[$p->id]['actif']) && $produits_selec[$p->id]['actif']) || $quantite)
foreach ($arrayProducts as $p) {
$quantity = Order::getProductQuantity($p->id, $arrayOrders);
if ((isset($arrayProductsSelected[$p->id]['active']) && $arrayProductsSelected[$p->id]['active']) || $quantity)
{
$str_quantite = '';
if ($quantite)
$str_quantite = $quantite;

$classe = 'total';
if ($str_quantite > $produits_selec[$p->id]['quantite_max'] && !$produits_selec[$p->id]['vrac'])
$strQuantity = '';
if ($quantity) {
$strQuantity = $quantity ;
}
$class = 'total';
if ($strQuantity > $arrayProductsSelected[$p->id]['quantity_max'])
{
$classe .= ' depasse';
$class .= ' depasse';
}
echo '<td class="' . $classe . '"><strong>' . $str_quantite . '</strong> ';
echo '<td class="' . $class . '"><strong>' . $strQuantity . '</strong> ';

if ($produits_selec[$p->id]['quantite_max'] && $str_quantite)
echo '<br /><span>' . $produits_selec[$p->id]['quantite_max'] . '</span>';
if ($arrayProductsSelected[$p->id]['quantity_max'] && $strQuantity) {
echo '<br /><span>' . $arrayProductsSelected[$p->id]['quantity_max'] . '</span>';
}
echo '</td>' ;
}

backend/views/commande/index.php → backend/views/order/index.php View File

@@ -37,24 +37,16 @@ termes.
*/

use yii\helpers\Html;
use common\models\Commande;
use common\models\Order;
use common\models\User ;
use yii\helpers\ArrayHelper ;
use yii\widgets\ActiveForm;

$this->title = 'Commande';

$cpt_non_vrac = 0;
foreach ($produits as $p) {
if (isset($produits_selec[$p->id]['actif']) && $produits_selec[$p->id]['actif']) {
if (!$p->vrac) {
$cpt_non_vrac ++;
}
}
}
?>

<div id="page-commande">
<div id="page-order">
<div class="col-md-3" id="col-left">
<div class="panel panel-default">
@@ -76,7 +68,7 @@ foreach ($produits as $p) {
éditer un jour de production.
</div>
<?php else: ?>
<a class="btn btn-sm btn-default btn-active-week" href="<?= Yii::$app->urlManager->createUrl(['commande/change-state-semaine', 'date' => $date, 'actif' => !$production_semaine_active, ]); ?>"><span class="glyphicon glyphicon-<?= $production_semaine_active ? 'remove' : 'ok' ?>"></span> <?= $production_semaine_active ? 'Désactiver' : 'Activer' ?> cette semaine de production</a>
<a class="btn btn-sm btn-default btn-active-week" href="<?= Yii::$app->urlManager->createUrl(['order/change-state-week', 'date' => $date, 'active' => !$oneDistributionWeekActive, ]); ?>"><span class="glyphicon glyphicon-<?= $oneDistributionWeekActive ? 'remove' : 'ok' ?>"></span> <?= $oneDistributionWeekActive ? 'Désactiver' : 'Activer' ?> cette semaine de production</a>
<?php endif; ?>
</div>
</div>
@@ -84,34 +76,34 @@ foreach ($produits as $p) {
<?php if ($date != ''): ?>
<div id="bloc-production">
<input type="hidden" id="date-production" value="<?= $date ?>" />
<input type="hidden" id="id-production" value="<?= $production->id ?>" />
<input type="hidden" id="id-production" value="<?= $distribution->id ?>" />
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">Production du <strong><?php echo date('d/m/Y', strtotime($date)); ?></strong></h3>
<h3 class="panel-title">Distribution du <strong><?php echo date('d/m/Y', strtotime($date)); ?></strong></h3>
</div>
<div class="panel-body">
<strong>Production</strong><br />
<strong>Distribution</strong><br />
<div class="btn-group" role="group">
<a class="btn btn-default<?php if ($production->actif): ?> btn-success<?php endif; ?>" href="<?php echo Yii::$app->urlManager->createUrl(['commande/change-state', 'date' => $date, 'actif' => 1]); ?>">Activé</a>
<a class="btn btn-default<?php if (!$production->actif): ?> btn-danger<?php endif; ?>" href="<?php echo Yii::$app->urlManager->createUrl(['commande/change-state', 'date' => $date, 'actif' => 0]); ?>">Désactivé</a>
<a class="btn btn-default<?php if ($distribution->active): ?> btn-success<?php endif; ?>" href="<?php echo Yii::$app->urlManager->createUrl(['order/change-state', 'date' => $date, 'active' => 1]); ?>">Activé</a>
<a class="btn btn-default<?php if (!$distribution->active): ?> btn-danger<?php endif; ?>" href="<?php echo Yii::$app->urlManager->createUrl(['order/change-state', 'date' => $date, 'active' => 0]); ?>">Désactivé</a>
</div>
<br />
<br />
<?php if (!$production->actif): ?>
<?php if (!$distribution->active): ?>
<div class="alert alert-info">
<span class="glyphicon glyphicon-share-alt"></span> Activez ici la production pour qu'elle soit visible au client.
<span class="glyphicon glyphicon-share-alt"></span> Activez ici la distribution pour qu'elle soit visible au client.
</div>
<?php endif; ?>

<?php if($production->livraison && count($arr_productions_point_vente)): ?>
<?php if($distribution->delivery && count($arrayPointsSaleDistribution)): ?>
<div id="productions-point-vente">
<strong>Points de vente : </strong>
<div class="checkbox-list">
<?= Html::activeCheckboxList(
$production_point_vente,
'productions_point_vente',
$arr_productions_point_vente ,
$pointSaleDistribution,
'points_sale_distribution',
$arrayPointsSaleDistribution ,
['encode' => false, 'class' => '']) ?>
</div>
</div>
@@ -121,31 +113,30 @@ foreach ($produits as $p) {
</div>
<?php endif; ?>
<?php if ($production): ?>
<?php if ($distribution): ?>
<div id="bloc-produits">

<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">Produits</h3>
</div>
<div class="panel-body">
<!-- produits sélectionnés -->
<form id="produits-production" action="<?php echo Yii::$app->urlManager->createUrl(['commande/index', 'date' => $date]); ?>" method="post">
<form id="produits-production" action="<?php echo Yii::$app->urlManager->createUrl(['order/index', 'date' => $date]); ?>" method="post">
<div class="overflow">
<table class="table table-condensed">
<thead>
<tr>
<th class="td-actif">Actif</th>
<th class="td-active">Actif</th>
<th class="td-produit">Produit</th>
<th class="td-max">Max. <span class="glyphicon glyphicon-info-sign" data-toggle="tooltip" data-placement="top" data-original-title="Quantité disponible à la commande. Laisser vide si vous ne souhaitez pas avoir de limite de commande. La valeur par défaut est configurable dans vos produits."></span></th>
</tr>
</thead>
<tbody>
<?php foreach ($produits as $p): ?>
<tr<?php if ($p->vrac): ?> style="display:none;"<?php endif; ?> <?php if (isset($produits_selec[$p->id]['actif']) && $produits_selec[$p->id]['actif']): ?>class="active"<?php endif; ?>>
<td class="td-actif"><input id="produit-<?php echo $p->id; ?>" name="Produit[<?php echo $p->id; ?>][actif]" type="checkbox" <?php if (isset($produits_selec[$p->id]['actif']) && $produits_selec[$p->id]['actif']): ?>checked="checked"<?php endif; ?> /></td>
<td class="td-produit"><label for="produit-<?php echo $p->id; ?>"><?= Html::encode($p->nom) ?></label></td>
<td class="td-max"><input class="quantite-max" name="Produit[<?php echo $p->id; ?>][quantite_max]" type="text" value="<?php if (isset($produits_selec[$p->id])) echo $produits_selec[$p->id]['quantite_max']; ?>" /></td>
<?php foreach ($arrayProducts as $p): ?>
<tr <?php if (isset($selectedProducts[$p->id]['active']) && $selectedProducts[$p->id]['active']): ?>class="active"<?php endif; ?>>
<td class="td-active"><input id="product-<?php echo $p->id; ?>" name="Product[<?php echo $p->id; ?>][active]" type="checkbox" <?php if (isset($selectedProducts[$p->id]['active']) && $selectedProducts[$p->id]['active']): ?>checked="checked"<?php endif; ?> /></td>
<td class="td-produit"><label for="product-<?php echo $p->id; ?>"><?= Html::encode($p->name) ?></label></td>
<td class="td-max"><input class="quantity-max" name="Product[<?php echo $p->id; ?>][quantity_max]" type="text" value="<?php if (isset($selectedProducts[$p->id])) echo $selectedProducts[$p->id]['quantity_max']; ?>" /></td>
</tr>
<?php endforeach; ?>
</tbody>
@@ -163,21 +154,21 @@ foreach ($produits as $p) {
<div class="col-md-9" id="col-right">
<input type="hidden" value="<?php echo $date; ?>" id="current-date" />
<ul id="jours-production">
<?php foreach ($jours_production as $j) : ?>
<li><?php echo $j->date; ?></li>
<?php foreach ($arrayDistributionDays as $distributionDay) : ?>
<li><?php echo $distributionDay->date; ?></li>
<?php endforeach; ?>
</ul>
<?php if ($date != ''): ?>
<div id="bloc-totaux">
<?= $this->render('_total_commandes.php',[
'produits' => $produits,
'commandes' => $commandes,
'produits_selec' => $produits_selec,
'recettes' => $recettes,
'poids' => $poids,
'ca_potentiel' => $ca_potentiel,
'poids_total' => $poids_total,
<?= $this->render('_total_orders.php',[
'arrayProducts' => $arrayProducts,
'arrayOrders' => $arrayOrders,
'arrayProductsSelected' => $selectedProducts,
'revenues' => $revenues,
'weight' => $weight,
'potentialTurnover' => $potentialTurnover,
'totalWeight' => $totalWeight,
]); ?>
</div>
@@ -192,20 +183,20 @@ foreach ($produits as $p) {
<div class="panel-heading">
<h3 class="panel-title">
Commandes
<?php if (!count($commandes)): ?><span class="label label-danger">0</span>
<?php else: ?><span class="label label-success"><?= count($commandes) ?></span>
<?php if (!count($arrayOrders)): ?><span class="label label-danger">0</span>
<?php else: ?><span class="label label-success"><?= count($arrayOrders) ?></span>
<?php endif; ?>
<?php if (count($commandes)): ?>
<a id="btn-export-commandes" class="btn btn-primary" href="<?php echo Yii::$app->urlManager->createUrl(['commande/report', 'date' => $date, 'id_point_vente' => 0, 'global' => 1]); ?>"><span class="glyphicon glyphicon-download-alt"></span> Exporter</a>
<?php if (count($arrayOrders)): ?>
<a id="btn-export-commandes" class="btn btn-primary" href="<?php echo Yii::$app->urlManager->createUrl(['order/report', 'date' => $date, 'idPointSale' => 0, 'global' => 1]); ?>"><span class="glyphicon glyphicon-download-alt"></span> Exporter</a>
<?php endif; ?>
<div id="btn-commandes-auto" class="btn-group">
<button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<span class="glyphicon glyphicon-repeat"></span> Commandes récurrentes <span class="caret"></span>
<span class="glyphicon glyphicon-repeat"></span> Abonnements <span class="caret"></span>
</button>
<ul class="dropdown-menu">
<li><a href="<?= Yii::$app->urlManager->createUrl(['commande/add-commandes-auto', 'date' => $date]); ?>">Importer toutes les commandes</a></li>
<li><a href="<?= Yii::$app->urlManager->createUrl(['order/add-subscriptions', 'date' => $date]); ?>">Importer toutes les commandes</a></li>
</ul>
</div>
@@ -219,65 +210,65 @@ foreach ($produits as $p) {
<!-- Nav tabs -->
<ul id="tabs-points-vente" class="nav nav-tabs" role="tablist">
<?php foreach($points_vente as $pv): ?>
<li role="presentation" class="<?php if($pv->point_fabrication): ?>active<?php endif; ?>">
<a href="#point-vente-<?= $pv->id ?>" id="btn-point-vente-<?= $pv->id ?>" aria-controls="point-vente-<?= $pv->id ?>" role="tab" data-toggle="tab"><?= Html::encode($pv->nom) ?> <span class="badge badge-<?php if(count($pv->commandes)): ?>success<?php else: ?>danger<?php endif; ?>"><?php echo count($pv->commandes); ?></span></a>
<?php foreach($arrayPointsSale as $pointSale): ?>
<li role="presentation" class="<?php if($pointSale->point_production): ?>active<?php endif; ?>">
<a href="#point-vente-<?= $pointSale->id ?>" id="btn-point-vente-<?= $pointSale->id ?>" aria-controls="point-sale-<?= $pointSale->id ?>" role="tab" data-toggle="tab"><?= Html::encode($pointSale->name) ?> <span class="badge badge-<?php if(count($pointSale->orders)): ?>success<?php else: ?>danger<?php endif; ?>"><?php echo count($pointSale->orders); ?></span></a>
</li>
<?php endforeach; ?>
</ul>

<!-- Tab panes -->
<div class="tab-content" id="commandes-points-vente">
<?php foreach($points_vente as $pv): ?>
<div role="tabpanel" data-id-pv="<?= $pv->id ?>" class="bloc-point-vente tab-pane <?php if($pv->point_fabrication): ?> active<?php endif; ?>" id="point-vente-<?= $pv->id ?>">
<?php foreach($arrayPointsSale as $pointSale): ?>
<div role="tabpanel" data-id-pv="<?= $pointSale->id ?>" class="bloc-point-vente tab-pane <?php if($pointSale->point_production): ?> active<?php endif; ?>" id="point-vente-<?= $pointSale->id ?>">
<div class="col-md-12">
<div class="alert alert-warning recap-pv <?php if(!count($pv->commandes)): ?>no-commande<?php endif; ?>">
<?php if(count($pv->commandes)): ?>
<strong class="commandes"><?= count($pv->commandes) ?> commande<?php if(count($pv->commandes) > 1): ?>s<?php endif; ?></strong>
<span class="recettes"><?= number_format($pv->recettes, 2) ?> €</span>
<div class="alert alert-warning recap-pv <?php if(!count($pointSale->orders)): ?>no-order<?php endif; ?>">
<?php if(count($pointSale->orders)): ?>
<strong class="commandes"><?= count($pointSale->orders) ?> commande<?php if(count($pointSale->orders) > 1): ?>s<?php endif; ?></strong>
<span class="recettes"><?= number_format($pointSale->revenues, 2) ?> €</span>
<?php else: ?>
<strong class="commandes">Aucune commande</strong>
<span class="recettes"></span>
<?php endif; ?>
</div>
<ul class="liste-commandes btn-group-vertical<?php if(!count($pv->commandes)): ?> no-commande<?php endif; ?>">
<?php foreach($pv->commandes as $c): ?>
<ul class="liste-commandes btn-group-vertical<?php if(!count($pointSale->orders)): ?> no-order<?php endif; ?>">
<?php foreach($pointSale->orders as $order): ?>
<li>
<a href="javascript:void(0);" class="btn btn-default" data-pv-id="<?= $pv->id ?>" data-id-commande="<?= $c->id ?>" data-commande='<?= $pv->data_options_commandes[$c->id]['data-commande'] ?>' data-commentaire="<?= Html::encode($c->commentaire) ?>" data-date="<?= date('d/m à H:i',strtotime($c->date)); ?>">
<span class="montant <?php if(number_format($c->montant_paye,2) >= number_format($c->montant,2)): ?>paye<?php endif; ?>">
<?= Html::encode(number_format($c->montant, 2)); ?> €
<?php if($c->montant_paye - $c->montant > 0.01): ?><span class="glyphicon glyphicon-warning-sign"></span><?php endif; ?>
<a href="javascript:void(0);" class="btn btn-default" data-pv-id="<?= $pointSale->id ?>" data-id-commande="<?= $order->id ?>" data-commande='<?= $pointSale->data_options_orders[$order->id]['data-order'] ?>' data-commentaire="<?= Html::encode($order->comment) ?>" data-date="<?= date('d/m à H:i',strtotime($order->date)); ?>">
<span class="montant <?php if(number_format($order->paid_amount,2) >= number_format($order->amount,2)): ?>paye<?php endif; ?>">
<?= Html::encode(number_format($order->amount, 2)); ?> €
<?php if($order->paid_amount - $order->amount > 0.01): ?><span class="glyphicon glyphicon-warning-sign"></span><?php endif; ?>
</span>
<span class="user">
<?php if($c->type): ?>
<?php if($c->type == Commande::TYPE_ADMIN): ?>
<?php if($order->origin): ?>
<?php if($order->origin == Order::ORIGIN_ADMIN): ?>
<span class="label label-warning">vous</span>
<?php elseif($c->type == Commande::TYPE_AUTO): ?>
<?php elseif($order->origin == Order::ORIGIN_AUTO): ?>
<span class="label label-default">auto</span>
<?php elseif($c->type == Commande::TYPE_USER): ?>
<?php elseif($order->origin == Order::ORIGIN_USER): ?>
<span class="label label-success">client</span>
<?php endif; ?>
<?php endif; ?>
<?php if(isset($c->user)): ?>
<?= Html::encode($c->user->nom.' '.$c->user->prenom); ?>
<?php if(isset($order->user)): ?>
<?= Html::encode($order->user->lastname.' '.$order->user->name); ?>
<?php else: ?>
<?= Html::encode($c->username); ?>
<?= Html::encode($order->username); ?>
<?php endif; ?>
<?php if(!is_null($c->date_delete)): ?>
<?php if(!is_null($order->date_delete)): ?>
(<span class="glyphicon glyphicon-remove"></span> Annulée)
<?php endif; ?>
</span>
<?php if (strlen($c->commentaire)): ?>
<?php if (strlen($order->comment)): ?>
<span class="glyphicon glyphicon-comment"></span>
<?php endif; ?>
</a>
</li>
<?php endforeach; ?>
</ul>
<?= Html::a('<span class="glyphicon glyphicon-plus"></span> Créer une commande', 'javascript:void(0);', ['class' => 'btn btn-default creer-commande', 'data-pv-id' => $pv->id]) ?>
<?= Html::a('<span class="glyphicon glyphicon-plus"></span> Créer une commande', 'javascript:void(0);', ['class' => 'btn btn-default creer-commande', 'data-pv-id' => $pointSale->id]) ?>
</div>
<div class="col-md-12 bloc-commande">
@@ -292,21 +283,21 @@ foreach ($produits as $p) {
</span>
<span class="the-title"></span>
<span class="choix-user">
<?= Html::activeDropDownList(new User, 'id', ArrayHelper::map(User::find()->joinWith('userEtablissement')->where('user_etablissement.id_etablissement = '.Yii::$app->user->identity->id_etablissement)->andWhere('user_etablissement.actif = 1')->orderBy('user.nom ASC, user.prenom ASC')->all(), 'id', function($model, $defaultValue) {
return $model['nom'].' '.$model['prenom'];
<?= Html::activeDropDownList(new User, 'id', ArrayHelper::map(User::find()->joinWith('userProducer')->where('user_producer.id_producer = '.Producer::getId())->andWhere('user_producer.active = 1')->orderBy('user.lastname ASC, user.name ASC')->all(), 'id', function($model, $defaultValue) {
return $model['lastname'].' '.$model['name'];
}), ['prompt' => '--','class' => 'form-control user-id']) ?>
OU <input type="text" class="form-control username" placeholder="Choisissez un nom" />
</span>
</h2>
<div class="commentaire alert alert-info">
</div>
<textarea name="commentaire" class="form-control textarea-commentaire" placeholder="Commentaire"></textarea>
<textarea name="comment" class="form-control textarea-commentaire" placeholder="Commentaire"></textarea>
<table class="table table-bordered table-condensed tab-content table-produits">
<tbody>
<?php foreach ($produits as $p): ?>
<tr class="produit-<?= $p->id ?> <?php if(!$produits_selec[$p->id]['actif']): ?> disabled<?php endif; ?>" data-id-produit="<?= $p->id ?>">
<?php foreach ($arrayProducts as $p): ?>
<tr class="produit-<?= $p->id ?> <?php if(!$selectedProducts[$p->id]['active']): ?> disabled<?php endif; ?>" data-id-produit="<?= $p->id ?>">
<td class="td-commande"></td>
<td class="td-produit"><?php echo Html::encode($p->getLibelleAdmin()); ?></td>
<td class="td-produit"><?php echo Html::encode($p->getStrWordingAdmin()); ?></td>
</tr>
<?php endforeach; ?>
<tr class="tr-total">

backend/views/commande/report.php → backend/views/order/report.php View File

@@ -36,24 +36,20 @@ pris connaissance de la licence CeCILL, et que vous en avez accepté les
termes.
*/

use common\models\Commande ;
use common\models\Order ;

$num_jour_semaine = date('w', strtotime($date));
$arr_jour_semaine = [0 => 'dimanche', 1 => 'lundi', 2 => 'mardi', 3 => 'mercredi', 4 => 'jeudi', 5 => 'vendredi', 6 => 'samedi'];
$champs_horaires_point_vente = 'horaires_' . $arr_jour_semaine[$num_jour_semaine];
$dayWeek = date('w', strtotime($date));
$dayWeekArray = [0 => 'sunday', 1 => 'monday', 2 => 'tuesday', 3 => 'wednesday', 4 => 'thursday', 5 => 'friday', 6 => 'saturday'];
$fieldInfosPointSale = 'infos_' . $dayWeekArray[$dayWeek];

$html = '' ;

// par point de vente
foreach ($points_vente as $pv) {
if (count($pv->commandes) && strlen($pv->$champs_horaires_point_vente)) {
foreach ($pointsSaleArray as $pointSale) {
if (count($pointSale->orders) && strlen($pointSale->$fieldInfosPointSale)) {
$html .= '<h3>'.$pv->nom.'</h3>' ;

$col_credit_pain = '' ;
if($pv->credit_pain) {
$col_credit_pain = '<th>Rappel crédit</th>' ;
}
$html .= '<h3>'.$pointSale->name.'</h3>' ;
$colCredit = ($pointSale->credit) ? '<th>Rappel crédit</th>' : '' ;
$html .= '<table class="table table-bordered">'
. '<thead>'
@@ -61,70 +57,70 @@ foreach ($points_vente as $pv) {
. '<th>Client</th>'
. '<th>Produits</th>'
. '<th>Commentaire</th>'
. $col_credit_pain
. $colCredit
. '<th>Montant</th>'
. '</tr>'
. '<tbody>';
foreach ($pv->commandes as $c) {
foreach ($pointSale->orders as $order) {
$html .= '<tr>' ;
$str_user = '';
$strUser = '';

// username
if ($c->user) {
$str_user = $c->user->prenom . " " . $c->user->nom; //.' - '.date('d/m', strtotime($c->date)) ;
if ($order->user) {
$strUser = $order->user->name . " " . $order->user->lastname;
} else {
$str_user = $c->username; //.' - '.date('d/m', strtotime($c->date)) ;
$strUser = $order->username;
}
if(strlen($c->commentaire_point_vente))
if(strlen($order->comment_point_sale))
{
$str_user .= '<br /><em>'.$c->commentaire_point_vente.'</em>' ;
$strUser .= '<br /><em>'.$order->comment_point_sale.'</em>' ;
}
// téléphone
if (isset($c->user) && strlen($c->user->telephone)) {
$str_user .= '<br />' . $c->user->telephone . '';
if (isset($order->user) && strlen($order->user->phone)) {
$strUser .= '<br />' . $order->user->phone . '';
}

$html .= '<td>'.$str_user.'</td>';
$html .= '<td>'.$strUser.'</td>';
// produits
$str_produits = '';
foreach ($produits as $p) {
$strProducts = '';
foreach ($productsArray as $product) {
$add = false;
foreach ($c->commandeProduits as $cp) {
if ($p->id == $cp->id_produit) {
$str_produits .= $cp->quantite . '&nbsp;' . $p->nom . ', ';
foreach ($order->productOrder as $productOrder) {
if ($product->id == $productOrder->id_product) {
$strProducts .= $productOrder->quantity . '&nbsp;' . $product->name . ', ';
$add = true;
}
}
}
$html .= '<td>'.substr($str_produits, 0, strlen($str_produits) - 2).'</td>';
$html .= '<td>'.$c->commentaire.'</td>';
$html .= '<td>'.substr($strProducts, 0, strlen($strProducts) - 2).'</td>';
$html .= '<td>'.$order->comment.'</td>';
if($pv->credit_pain) {
if($pointSale->credit) {
$credit = '' ;
if(isset($c->user) && isset($c->user->userEtablissement)) {
$credit = number_format($c->user->userEtablissement[0]->credit,2).' €' ;
if(isset($order->user) && isset($order->user->userProducer)) {
$credit = number_format($order->user->userProducer[0]->credit,2).' €' ;
}
$html .= '<td>'.$credit.'</td>' ;
}
$html .= '<td><strong>'.number_format($c->montant, 2) . ' € ';
$html .= '<td><strong>'.number_format($order->amount, 2) . ' € ';

if($c->getStatutPaiement() == Commande::STATUT_PAYEE)
if($order->getPaymentStatus() == Order::PAYMENT_PAID)
{
$html .= '(payé)' ;
}
elseif($c->getStatutPaiement() == Commande::STATUT_IMPAYEE && $c->getMontantPaye())
elseif($order->getPaymentStatus() == Order::PAYMENT_UNPAID && $order->getAmount(Order::AMOUNT_PAID))
{
$html .= '(reste '.$c->getMontantRestant(true).' à payer)' ;
$html .= '(reste '.$order->getAmount(Order::AMOUNT_REMAINING, true).' à payer)' ;
}
elseif($c->getStatutPaiement() == Commande::STATUT_SURPLUS)
elseif($order->getPaymentStatus() == Order::PAYMENT_SURPLUS)
{
$html .= '(surplus : '.$c->getMontantSurplus(true).' à rembourser)' ;
$html .= '(surplus : '.$order->getAmount(Order::PAYMENT_SURPLUS, true).' à rembourser)' ;
}
$html .= '</strong></td>' ;
@@ -135,25 +131,23 @@ foreach ($points_vente as $pv) {

$html .= '<tr><td><strong>Total</strong></td>' ;
$str_produits = '';
foreach ($produits as $p) {
if (!$p->vrac) {
$quantite = Commande::getQuantiteProduit($p->id, $pv->commandes);
$str_quantite = '';
if ($quantite) {
$str_quantite = $quantite;
$str_produits .= $str_quantite .'&nbsp;'. $p->nom . ', ';
}
$strProducts = '';
foreach ($productsArray as $product) {
$quantity = Order::getProductQuantity($product->id, $pointSale->orders);
$strQuantity = '';
if ($quantity) {
$strQuantity = $quantity;
$strProducts .= $strQuantity .'&nbsp;'. $product->name . ', ';
}
}
$str_produits = substr($str_produits, 0, strlen($str_produits) - 2) ;
$strProducts = substr($strProducts, 0, strlen($strProducts) - 2) ;
$html .= '<td>'.$str_produits.'</td><td></td>' ;
if($pv->credit_pain) {
$html .= '<td>'.$strProducts.'</td><td></td>' ;
if($pointSale->credit) {
$html .= '<td></td>' ;
}
$html .= '<td><strong>'.number_format($pv->recettes, 2) . ' €</strong></td>';
$html .= '<td><strong>'.number_format($pointSale->revenues, 2) . ' €</strong></td>';
$html .= '</tbody></table><pagebreak>' ;
}
@@ -170,43 +164,41 @@ $html .= '<table class="table table-bordered">'
. '</tr>'
. '<tbody>';

$recettes = 0 ;
foreach ($points_vente as $pv)
$revenues = 0 ;
foreach ($pointsSaleArray as $pointSale)
{
if (count($pv->commandes) && strlen($pv->$champs_horaires_point_vente))
if (count($pointSale->orders) && strlen($pointSale->$fieldInfosPointSale))
{
$html .= '<tr><td>'.$pv->nom.'</td><td>' ;
foreach ($produits as $p) {
$quantite = Commande::getQuantiteProduit($p->id, $pv->commandes);
$str_quantite = '';

if (!$p->vrac) {
if ($quantite)
$str_quantite = $quantite;
$html .= '<tr><td>'.$pointSale->name.'</td><td>' ;
foreach ($productsArray as $product) {
$quantity = Order::getProductQuantity($product->id, $pointSale->orders);
$strQuantity = ($quantity) ? $quantity : '' ;
if(strlen($strQuantity)) {
$html .= $strQuantity . '&nbsp;'.$product->name.', ' ;
}

if(strlen($str_quantite))
$html .= $str_quantite . '&nbsp;'.$p->nom.', ' ;
}
$html = substr($html, 0, strlen($html) - 2) ;
$html .= '</td><td>'.number_format($pv->recettes, 2).' €</td></tr>' ;
$recettes += $pv->recettes ;
$html .= '</td><td>'.number_format($pointSale->revenues, 2).' €</td></tr>' ;
$revenues += $pointSale->revenues ;
}
}

// total
$html .= '<tr><td><strong>Total</strong></td><td>' ;
foreach ($produits as $p) {
$quantite = Commande::getQuantiteProduit($p->id, $commandes);
if(!$p->vrac && $quantite)
$html .= $quantite . '&nbsp;'.$p->nom.', ' ;
foreach ($productsArray as $product) {
$quantity = Order::getProductQuantity($product->id, $ordersArray);
if($quantity) {
$html .= $quantity . '&nbsp;'.$product->name.', ' ;
}
}

$html = substr($html, 0, strlen($html) - 2) ;

$html .= '</td><td><strong>'.number_format($recettes, 2).' €</strong></td></tr>' ;
$html .= '</td><td><strong>'.number_format($revenues, 2).' €</strong></td></tr>' ;

$html .= '</tbody></table>' ;


+ 0
- 51
backend/views/paiement/index.php View File

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

/**
Copyright La boîte à pain (2018)

contact@laboiteapain.net

Ce logiciel est un programme informatique servant à aider les producteurs
à distribuer leur production en circuits courts.

Ce logiciel est régi par la licence CeCILL soumise au droit français et
respectant les principes de diffusion des logiciels libres. Vous pouvez
utiliser, modifier et/ou redistribuer ce programme sous les conditions
de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA
sur le site "http://www.cecill.info".

En contrepartie de l'accessibilité au code source et des droits de copie,
de modification et de redistribution accordés par cette licence, il n'est
offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons,
seule une responsabilité restreinte pèse sur l'auteur du programme, le
titulaire des droits patrimoniaux et les concédants successifs.

A cet égard l'attention de l'utilisateur est attirée sur les risques
associés au chargement, à l'utilisation, à la modification et/ou au
développement et à la reproduction du logiciel par l'utilisateur étant
donné sa spécificité de logiciel libre, qui peut le rendre complexe à
manipuler et qui le réserve donc à des développeurs et des professionnels
avertis possédant des connaissances informatiques approfondies. Les
utilisateurs sont donc invités à charger et tester l'adéquation du
logiciel à leurs besoins dans des conditions permettant d'assurer la
sécurité de leurs systèmes et ou de leurs données et, plus généralement,
à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.

Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
pris connaissance de la licence CeCILL, et que vous en avez accepté les
termes.
*/

use common\models\Etablissement ;

/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/

$this->title = 'Paiement';

?>

<h1>Paiement</h1>

+ 0
- 42
backend/views/paiement/succes.php View File

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

/**
Copyright La boîte à pain (2018)

contact@laboiteapain.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.
*/

?>

<h1>Paiement validé</h1>


backend/views/point-vente/_form.php → backend/views/point-sale/_form.php View File

@@ -39,60 +39,60 @@ termes.
use yii\helpers\Html;
use yii\widgets\ActiveForm;
use yii\helpers\ArrayHelper ;
use common\models\Etablissement ;
use common\models\Producer ;

/* @var $this yii\web\View */
/* @var $model backend\models\PointVente */
/* @var $form yii\widgets\ActiveForm */
?>

<div class="point-vente-form">
<div class="point-sale-form">

<?php $form = ActiveForm::begin(); ?>

<div class="col-md-8">
<?= $form->field($model, 'nom')->textInput(['maxlength' => 255]) ?>
<?= $form->field($model, 'localite')->textInput(['maxlength' => 255]) ?>
<?= $form->field($model, 'adresse')->textarea(['rows' => 6]) ?>
<?= $form->field($model, 'name')->textInput(['maxlength' => 255]) ?>
<?= $form->field($model, 'locality')->textInput(['maxlength' => 255]) ?>
<?= $form->field($model, 'address')->textarea(['rows' => 6]) ?>

<?= $form->field($model, 'point_fabrication')
<?= $form->field($model, 'point_production')
->checkbox()
->hint('Cochez cette case si ce point de vente correspond à votre lieu de production.') ?>

<?php
$add_hint_credit_pain = '' ;
if(!Etablissement::getConfig('credit_pain')):
$add_hint_credit_pain = '<br /><strong>Attention, le système de Crédit Pain est désactivé au niveau des '.Html::a('paramètres globaux',['etablissement/update']).'.</strong>' ;
$addHintCredit = '' ;
if(!Producer::getConfig('credit')):
$addHintCredit = '<br /><strong>Attention, le système de Crédit est désactivé au niveau des '.Html::a('paramètres globaux',['producer/update']).'.</strong>' ;
endif;
echo $form->field($model, 'credit_pain')
echo $form->field($model, 'credit')
->checkbox()
->hint('Cochez cette case si le client peut régler ses commandes via son compte Crédit Pain pour ce point de vente.'
.$add_hint_credit_pain);
.$addHintCredit);
?>

<div id="jours-livraison">
<div id="delivery-days">
<h2>Jours de livraison</h2>
<?= $form->field($model, 'livraison_lundi')->checkbox() ?>
<?= $form->field($model, 'livraison_mardi')->checkbox() ?>
<?= $form->field($model, 'livraison_mercredi')->checkbox() ?>
<?= $form->field($model, 'livraison_jeudi')->checkbox() ?>
<?= $form->field($model, 'livraison_vendredi')->checkbox() ?>
<?= $form->field($model, 'livraison_samedi')->checkbox() ?>
<?= $form->field($model, 'livraison_dimanche')->checkbox() ?>
<?= $form->field($model, 'delivery_monday')->checkbox() ?>
<?= $form->field($model, 'delivery_tuesday')->checkbox() ?>
<?= $form->field($model, 'delivery_wednesday')->checkbox() ?>
<?= $form->field($model, 'delivery_thursday')->checkbox() ?>
<?= $form->field($model, 'delivery_friday')->checkbox() ?>
<?= $form->field($model, 'delivery_saturday')->checkbox() ?>
<?= $form->field($model, 'delivery_sunday')->checkbox() ?>
</div>
<div class="clr"></div>
<h2>Informations</h2>
<?= $form->field($model, 'horaires_lundi')->textarea(['rows' => 3]) ?>
<?= $form->field($model, 'horaires_mardi')->textarea(['rows' => 3]) ?>
<?= $form->field($model, 'horaires_mercredi')->textarea(['rows' => 3]) ?>
<?= $form->field($model, 'horaires_jeudi')->textarea(['rows' => 3]) ?>
<?= $form->field($model, 'horaires_vendredi')->textarea(['rows' => 3]) ?>
<?= $form->field($model, 'horaires_samedi')->textarea(['rows' => 3]) ?>
<?= $form->field($model, 'horaires_dimanche')->textarea(['rows' => 3]) ?>
<?= $form->field($model, 'infos_monday')->textarea(['rows' => 3]) ?>
<?= $form->field($model, 'infos_tuesday')->textarea(['rows' => 3]) ?>
<?= $form->field($model, 'infos_wednesday')->textarea(['rows' => 3]) ?>
<?= $form->field($model, 'infos_thursday')->textarea(['rows' => 3]) ?>
<?= $form->field($model, 'infos_friday')->textarea(['rows' => 3]) ?>
<?= $form->field($model, 'infos_saturday')->textarea(['rows' => 3]) ?>
<?= $form->field($model, 'infos_sunday')->textarea(['rows' => 3]) ?>
</div>
<div class="col-md-4">
@@ -102,20 +102,20 @@ use common\models\Etablissement ;
?>
<?= $form->field($model, 'acces_restreint')
<?= $form->field($model, 'restricted_access')
->checkbox()
->hint('Cochez cette case si seulement un groupe restreint d\'utilisateurs peuvent accéder à ce point de vente.<br />'
. 'Dans le cas des boîtes à pain, il vous est possible de spécifier un commentaire pour chaque utilisateur sélectionné afin de lui renseigner son numéro de boîte ou son code.') ?>
<div id="users">
<?= Html::activeCheckboxList($model, 'users', ArrayHelper::map($users, 'user_id', function($model_user, $defaultValue) use ($model) {
return Html::encode($model_user['nom'].' '.$model_user['prenom']).'<br />'
return Html::encode($model_user['lastname'].' '.$model_user['name']).'<br />'
.Html::activeTextInput(
$model,
'users_commentaire['.$model_user['user_id'].']',
'users_comment['.$model_user['user_id'].']',
[
'class' => 'form-control commentaire',
'placeholder' => 'Commentaire',
'value' => (isset($model->users_commentaire[$model_user['user_id']])) ? Html::encode($model->users_commentaire[$model_user['user_id']]) : ''
'value' => (isset($model->users_comment[$model_user['user_id']])) ? Html::encode($model->users_comment[$model_user['user_id']]) : ''
]);
} ), ['encode' => false, 'class' => '']) ?>
</div>

backend/views/point-vente/create.php → backend/views/point-sale/create.php View File

@@ -46,7 +46,7 @@ $this->title = 'Ajouter un point de vente';
$this->params['breadcrumbs'][] = ['label' => 'Points de vente', 'url' => ['index']];
$this->params['breadcrumbs'][] = 'Ajouter';
?>
<div class="point-vente-create">
<div class="point-sale-create">

<h1><?= Html::encode($this->title) ?></h1>


backend/views/point-vente/index.php → backend/views/point-sale/index.php View File

@@ -46,20 +46,20 @@ use common\models\PointVenteUser ;
$this->title = 'Points de vente';
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="point-vente-index">
<div class="point-sale-index">

<h1><?= Html::encode($this->title) ?> <?= Html::a('Ajouter', ['create'], ['class' => 'btn btn-success']) ?></h1>

<?= GridView::widget([
'dataProvider' => $dataProvider,
'columns' => [
'nom',
'localite',
'name',
'locality',
[
'attribute' => 'point_fabrication',
'attribute' => 'point_production',
'format' => 'raw',
'value' => function($model) {
if($model->point_fabrication)
if($model->point_production)
{
return '<span class="label label-success">Oui</span>' ;
}
@@ -72,16 +72,16 @@ $this->params['breadcrumbs'][] = $this->title;
[
'label' => 'Livraison',
'value' => function($model) {
return $model->strJoursLivraison() ;
return $model->getStrDeliveryDays() ;
}
],
[
'attribute' => 'acces_restreint',
'format' => 'raw',
'value' => function($model) {
$count = PointVenteUser::find()->where(['id_point_vente' => $model->id])->count();
$count = UserPointSale::find()->where(['id_point_sale' => $model->id])->count();
$html = '' ;
if($model->acces_restreint)
if($model->restricted_access)
{
$html .= '<span class="glyphicon glyphicon-lock"></span> ' ;
if($count == 1)
@@ -104,12 +104,14 @@ $this->params['breadcrumbs'][] = $this->title;
}
],
[
'attribute' => 'credit_pain',
'label' => 'Crédit pain',
'attribute' => 'credit',
'label' => 'Crédit',
'format' => 'raw',
'value' => function($model) {
if($model->credit_pain)
if($model->credit) {
return '<span class="glyphicon glyphicon-euro"></span>' ;
}
return '' ;
}
],

backend/views/point-vente/update.php → backend/views/point-sale/update.php View File

@@ -43,10 +43,10 @@ use yii\helpers\Html;

$this->title = 'Modifier un point de vente';
$this->params['breadcrumbs'][] = ['label' => 'Points de vente', 'url' => ['index']];
$this->params['breadcrumbs'][] = ['label' => Html::encode($model->nom), 'url' => ['update', 'id' => $model->id]];
$this->params['breadcrumbs'][] = ['label' => Html::encode($model->name), 'url' => ['update', 'id' => $model->id]];
$this->params['breadcrumbs'][] = 'Modifier';
?>
<div class="point-vente-update">
<div class="point-sale-update">

<h1><?= Html::encode($this->title) ?></h1>


backend/views/etablissement-admin/facturation.php → backend/views/producer-admin/billing.php View File

@@ -57,26 +57,26 @@ $this->params['breadcrumbs'][] = $this->title;
'label' => 'Référence',
],
[
'attribute' => 'id_etablissement',
'label' => 'Établissement',
'attribute' => 'id_producer',
'label' => 'Producteur',
'value' => function($model) {
return Html::encode($model->etablissement->nom) ;
return Html::encode($model->producer->name) ;
}
],
'libelle',
[
'attribute' => 'montant_ht',
'attribute' => 'amount_ht',
'label' => 'Montant',
'value' => function($model) {
return number_format($model->montant_ht,2).' €' ;
return number_format($model->amount_ht,2).' €' ;
}
],
[
'attribute' => 'paye',
'attribute' => 'paid',
'label' => 'Payé',
'format' => 'raw',
'value' => function($model) {
if($model->paye)
if($model->paid)
{
return '<span class="label label-success">Oui</span>' ;
}

backend/views/etablissement-admin/index.php → backend/views/producer-admin/index.php View File

@@ -39,7 +39,7 @@ termes.
use yii\helpers\Html;
use yii\grid\GridView;
use common\models\User ;
use common\models\Etablissement ;
use common\models\Producer ;

$this->title = 'Producteurs';
$this->params['breadcrumbs'][] = 'Administration' ;
@@ -50,9 +50,9 @@ $this->params['breadcrumbs'][] = $this->title;
<h1>Producteurs</h1>

<?= GridView::widget([
'dataProvider' => $datas_etablissements,
'dataProvider' => $dataProviderProducer,
'columns' => [
'nom',
'name',
[
'attribute' => 'date_creation',
'format' => 'raw',
@@ -64,22 +64,23 @@ $this->params['breadcrumbs'][] = $this->title;
'attribute' => 'Lieu',
'format' => 'raw',
'value' => function($model) {
return Html::encode($model->ville.' ('.$model->code_postal.')') ;
return Html::encode($model->city.' ('.$model->postcode.')') ;
}
],
[
'attribute' => 'Clients',
'attribute' => 'Utilisateurs',
'format' => 'raw',
'value' => function($model) {
if(!$model->userEtablissement || !count($model->userEtablissement))
if(!$model->userProducer || !count($model->userProducer))
{
return 'Aucun client' ;
return 'Aucun utilisateur' ;
}
else {
$clients = count($model->userEtablissement).' client' ;
if(count($model->userEtablissement) > 1)
$clients .= 's' ;
return $clients ;
$users = count($model->userProducer).' client' ;
if(count($model->userProducer) > 1) {
$users .= 's' ;
}
return $users ;
}
}
@@ -95,11 +96,11 @@ $this->params['breadcrumbs'][] = $this->title;
else {
foreach($model->user as $u)
{
if($u->status == User::STATUS_BOULANGER)
if($u->status == User::STATUS_PRODUCER)
{
return Html::encode($u->prenom.' '.$u->nom)
return Html::encode($u->lastname.' '.$u->name)
.'<br />'.Html::encode($u->email)
.'<br />'.Html::encode($u->telephone) ;
.'<br />'.Html::encode($u->phone) ;
}
}
@@ -107,15 +108,17 @@ $this->params['breadcrumbs'][] = $this->title;
}
],
[
'attribute' => 'actif',
'attribute' => 'active',
'format' => 'raw',
'value' => function($model) {
$html = '' ;
if($model->actif)
if($model->active) {
$html .= '<span class="label label-success">En ligne</span>' ;
else
}
else {
$html .= '<span class="label label-danger">Hors-ligne</span>' ;
}
if(strlen($model->code))
{
$html .= ' <span class="glyphicon glyphicon-lock" data-toggle="tooltip" data-placement="bottom" data-original-title="'.Html::encode($model->code).'"></span>' ;
@@ -124,25 +127,18 @@ $this->params['breadcrumbs'][] = $this->title;
return $html ;
}
],
[
'attribute' => 'Gratuit',
'format' => 'raw',
'value' => function($model) {
if($model->gratuit)
return '<span class="label label-success">Compte gratuit</span>' ;
else
return '' ;
}
],
[
'attribute' => 'Prix libre',
'label' => 'Prix libre',
'format' => 'raw',
'value' => function($model) {
if(is_null($model->prix_libre))
if(is_null($model->free_price)) {
return '' ;
else
return $model->getPrixLibre() ;
}
else {
return $model->getFreePrice() ;
}
}
],
[
@@ -150,13 +146,8 @@ $this->params['breadcrumbs'][] = $this->title;
'label' => 'CA mois en cours',
'format' => 'raw',
'value' => function($model) {
$ca = $model->getCA(date('Y-m')) ;
$html = '' ;
$html .= 'CA : '.number_format($ca,2).' €<br />' ;
return $html ;
$turnover = $model->getTurnover(date('Y-m')) ;
return 'CA : '.number_format($turnover,2).' €<br />' ;
}
],
],

backend/views/etablissement/facturation.php → backend/views/producer/billing.php View File

@@ -39,7 +39,7 @@ termes.
use yii\helpers\Html;
use yii\grid\GridView;
use common\models\User ;
use common\models\Etablissement ;
use common\models\Producer ;
use yii\bootstrap\ActiveForm;

$this->title = 'Mon abonnement';
@@ -55,21 +55,18 @@ $this->params['breadcrumbs'][] = $this->title;
C'est pourquoi le modèle économique est basé sur un prix libre facturé mensuellement.<br />
</p>

<div id="estimation-facture" class="">
<div id="free-price" class="">
<?php if($alert_prix_libre): ?>
<?php if($alertFreePrice): ?>
<div class="alert alert-success">
Le montant de votre abonnement a bien été mis à jour.
<?php if($etablissement->prix_libre != 0): ?>
Vos prochaines factures mensuelles auront un montant de <strong><?= number_format(Html::encode($etablissement->prix_libre),2).' € HT' ; ?></strong>.
<?php if($producer->free_price != 0): ?>
Vos prochaines factures mensuelles auront un montant de <strong><?= number_format(Html::encode($producer->free_price),2).' € HT' ; ?></strong>.
<?php endif; ?>
</div>
<?php endif; ?>
<?php $form = ActiveForm::begin([
//'layout' => 'vertical',
'fieldConfig' => [
'template' => "{label}\n{beginWrapper}\n{input}\n{hint}\n{error}\n{endWrapper}",
'horizontalCssClasses' => [
@@ -78,13 +75,12 @@ $this->params['breadcrumbs'][] = $this->title;
],
]); ?>
<?= $form->field($etablissement, 'prix_libre',[
<?= $form->field($producer, 'free_price',[
'inputTemplate' => '<div class="input-group">{input}<span class="input-group-addon"><span class="glyphicon glyphicon-euro"></span> HT / mois</span></div>',
])
->label('Prix libre'); ?>
<div class="form-group field-user-prix_libre">
<label class="control-label col-sm-2" for=""></label>
<div class="col-sm-6">
<?= Html::submitButton('Valider', ['class' => 'btn btn-primary']) ?>
</div>
@@ -92,47 +88,4 @@ $this->params['breadcrumbs'][] = $this->title;

<?php ActiveForm::end(); ?>
<div class="clr"></div>
</div>


<!--
<h2>Dernières factures</h2>
<?= GridView::widget([
'dataProvider' => $datas_factures,
'columns' => [
[
'attribute' => 'reference',
'label' => 'Référence',
],
[
'attribute' => 'date',
'value' => function($model) {
return date('d/m/Y', strtotime($model->date)) ;
}
],
'libelle',
[
'attribute' => 'montant_ht',
'label' => 'Montant',
'value' => function($model) {
return number_format($model->montant_ht,2).' €' ;
}
],
[
'attribute' => 'paye',
'label' => 'Payé',
'format' => 'raw',
'value' => function($model) {
if($model->paye)
{
return '<span class="label label-success">Oui</span>' ;
}
else {
return '<span class="label label-danger">Non</span>' ;
}
}
]
],
]); ?>

-->
</div>

backend/views/etablissement/update.php → backend/views/producer/update.php View File

@@ -51,26 +51,26 @@ $this->params['breadcrumbs'][] = 'Paramètres';
<div class="user-form">
<?php $form = ActiveForm::begin(); ?>
<div class="">
<?= $form->field($model, 'actif')
<?= $form->field($model, 'active')
->dropDownList([
0 => 'Non',
1 => 'Oui'
], [])
->label('Activer le producteur')
->hint('Activez cette option pour rendre votre établissement visible à vos clients.') ; ?>
<?= $form->field($model, 'nom') ?>
<?= $form->field($model, 'name') ?>
<?= $form->field($model, 'type') ?>
<?= $form->field($model, 'description')
->textarea(['rows' => 6])
->hint('Affiché sur la page d\'accueil') ?>
<?= $form->field($model, 'code_postal') ?>
<?= $form->field($model, 'ville') ?>
<?= $form->field($model, 'postcode') ?>
<?= $form->field($model, 'city') ?>
<?= $form->field($model, 'code')->hint("Saisissez ce champs si vous souhaitez protéger l'accès à votre boutique par un code, sinon laissez-le vide.<br />"
. "Ce code est à communiquer à vos client pour qu'ils puissent ajouter votre établissement à leur tableau de bord.<br />"
. "<a href=\"".Yii::$app->urlManager->createUrl(['communiquer/index'])."\">Cliquez ici</a> pour télécharger un mode d'emploi comprenant ce code à distribuer à vos clients.") ?>
. "<a href=\"".Yii::$app->urlManager->createUrl(['communicate/index'])."\">Cliquez ici</a> pour télécharger un mode d'emploi comprenant ce code à distribuer à vos clients.") ?>

<?= $form->field($model, 'delai_commande')
<?= $form->field($model, 'order_delay')
->dropDownList([
1 => '1 jour',
2 => '2 jours',
@@ -82,7 +82,7 @@ $this->params['breadcrumbs'][] = 'Paramètres';
], [])
->hint('Si <strong>1 jour</strong> est sélectionné, le client pourra commander jusqu\'à la veille de la production.<br />'
. 'Si <strong>2 jours</strong> est sélectionné, le client pourra commander jusqu\'à l\'avant-veille de la production, etc.') ; ?>
<?= $form->field($model, 'heure_limite_commande')
<?= $form->field($model, 'order_deadline')
->dropDownList([
24 => 'Minuit',
23 => '23h',
@@ -106,15 +106,15 @@ $this->params['breadcrumbs'][] = 'Paramètres';
. 'Par exemple, si <strong>2 jours</strong> est sélectionné dans le délai de commande, le client devra commander l\'avant-veille de la production avant l\'heure précisée ici.') ; ?>
<?= $form->field($model, 'credit_pain')
<?= $form->field($model, 'credit')
->dropDownList([
0 => 'Non',
1 => 'Oui',
], [])
->label('Activer le système de Crédit Pain')
->hint('Le système de Crédit Pain permet à vos clients d\'avoir un compte prépayé sur le site <em>La boîte à pain</em>.<br />'
. 'Ils créditent leur compte en vous donnant la somme de leur choix et c\'est ensuite à vous de '.Html::a('mettre à jour', ['user/index']).' leur compte Crédit Pain en ligne.<br />'
. 'Ceci fait, les clients paient leur commande directement via leur compte Crédit Pain.') ; ?>
->label('Activer le système de Crédit')
->hint('Le système de Crédit permet à vos clients d\'avoir un compte prépayé sur le site <em>La boîte à pain</em>.<br />'
. 'Ils créditent leur compte en vous donnant la somme de leur choix et c\'est ensuite à vous de '.Html::a('mettre à jour', ['user/index']).' leur Crédit en ligne.<br />'
. 'Ceci fait, les clients paient leur commande directement via leur Crédit.') ; ?>
<?= $form->field($model, 'photo')->fileInput() ?>
<?php
@@ -125,7 +125,7 @@ $this->params['breadcrumbs'][] = 'Paramètres';
}
?>
<?= $form->field($model, 'infos_commande')
<?= $form->field($model, 'order_infos')
->textarea(['rows' => 6])
->hint('Affichées au client lors de sa commande')?>

backend/views/produit/_form.php → backend/views/product/_form.php View File

@@ -44,51 +44,41 @@ use yii\widgets\ActiveForm;
/* @var $form yii\widgets\ActiveForm */
?>

<div class="produit-form">
<div class="product-form">

<?php $form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']]); ?>

<?= $form->field($model, 'actif')->radioList([1 => 'Oui',0 => 'Non' ]) ?>
<?= $form->field($model, 'nom')->textInput(['maxlength' => 255]) ?>
<?= $form->field($model, 'active')->radioList([1 => 'Oui',0 => 'Non' ]) ?>
<?= $form->field($model, 'name')->textInput(['maxlength' => 255]) ?>
<?= $form->field($model, 'description')->textInput(['maxlength' => 255]) ?>
<?= $form->field($model, 'recette')->textarea() ?>
<?= $form->field($model, 'prix')->textInput() ?>
<?= $form->field($model, 'poids')->textInput() ?>
<?= $form->field($model, 'quantite_max')
<?= $form->field($model, 'recipe')->textarea() ?>
<?= $form->field($model, 'price')->textInput() ?>
<?= $form->field($model, 'weight')->textInput() ?>
<?= $form->field($model, 'quantity_max')
->hint('Renseignez ce champs si vous souhaitez limiter la quantité commandable pour ce produit.')
->textInput() ?>
<?= $form->field($model, 'photo')->fileInput() ?>
<?php
if(strlen($model->photo)) {
echo '<img src="../../frontend/web/uploads/'.$model->photo.'" width="200px" /><br />' ;
echo '<input type="checkbox" name="delete_photo" id="delete_photo" /> <label for="delete_photo">Supprimer la photo</label><br /><br />' ;
echo '<img src="'.Yii::$app->urlManagerProducer->getBaseUrl().'/uploads/'.$model->photo.'" width="200px" /><br />' ;
echo '<input type="checkbox" name="delete_photo" id="delete_photo" /> <label for="delete_photo">Supprimer la photo</label><br /><br />' ;
}
?>
<?php if(Yii::$app->user->identity->id_etablissement == 1): ?>
<?= $form->field($model, 'illustration')->fileInput() ?>
<?php
if(strlen($model->illustration)) {
echo '<img src="../../frontend/web/uploads/'.$model->illustration.'" width="200px" /><br />' ;
echo '<input type="checkbox" name="delete_illustration" id="delete_illustration" /> <label for="delete_illustration">Supprimer l\'illustration</label><br /><br />' ;
}
?>
<?php endif; ?>
<h2>Jours de production</h2>
<div id="jours-production">
<?= $form->field($model, 'lundi')->checkbox() ?>
<?= $form->field($model, 'mardi')->checkbox() ?>
<?= $form->field($model, 'mercredi')->checkbox() ?>
<?= $form->field($model, 'jeudi')->checkbox() ?>
<?= $form->field($model, 'vendredi')->checkbox() ?>
<?= $form->field($model, 'samedi')->checkbox() ?>
<?= $form->field($model, 'dimanche')->checkbox() ?>
<div id="days-production">
<?= $form->field($model, 'monday')->checkbox() ?>
<?= $form->field($model, 'tuesday')->checkbox() ?>
<?= $form->field($model, 'wednesday')->checkbox() ?>
<?= $form->field($model, 'thursday')->checkbox() ?>
<?= $form->field($model, 'friday')->checkbox() ?>
<?= $form->field($model, 'saturday')->checkbox() ?>
<?= $form->field($model, 'sunday')->checkbox() ?>
</div>
<div class="clr"></div>
<?= $form->field($model, 'id_etablissement')->hiddenInput()->label('') ?>
<?= $form->field($model, 'id_producer')->hiddenInput()->label('') ?>
<div class="form-group">
<?= Html::submitButton($model->isNewRecord ? 'Ajouter' : 'Modifier', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>

backend/views/produit/create.php → backend/views/product/create.php View File

@@ -46,7 +46,7 @@ $this->title = 'Ajouter un produit';
$this->params['breadcrumbs'][] = ['label' => 'Produits', 'url' => ['index']];
$this->params['breadcrumbs'][] = 'Ajouter';
?>
<div class="produit-create">
<div class="product-create">

<h1><?= Html::encode($this->title) ?></h1>


backend/views/produit/index.php → backend/views/product/index.php View File

@@ -46,7 +46,7 @@ use common\helpers\Url ;
$this->title = 'Produits';
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="produit-index">
<div class="product-index">

<h1><?= Html::encode($this->title) ?> <?= Html::a('Ajouter', ['create'], ['class' => 'btn btn-success']) ?></h1>

@@ -67,21 +67,21 @@ $this->params['breadcrumbs'][] = $this->title;
'headerOptions' => ['class' => 'td-photo'],
'value' => function($model) {
if(strlen($model->photo)) {
$url = Url::frontend() ;
return '<img class="photo-produit" src="'.$url.'uploads/'.$model->photo.'" />' ;
$url = Yii::$app->urlManagerProducer->getBaseUrl() ;
return '<img class="photo-product" src="'.$url.'/uploads/'.$model->photo.'" />' ;
}
return '' ;
}
],
'nom',
'name',
'description',
[
'attribute' => 'actif',
'headerOptions' => ['class' => 'actif'],
'attribute' => 'active',
'headerOptions' => ['class' => 'active'],
'contentOptions' => ['class' => 'center'],
'format' => 'raw',
'value' => function($model) {
if($model->actif)
if($model->active)
{
return '<span class="label label-success">oui</span>' ;
}

backend/views/produit/update.php → backend/views/product/update.php View File

@@ -43,10 +43,10 @@ use yii\helpers\Html;

$this->title = 'Modifier un produit';
$this->params['breadcrumbs'][] = ['label' => 'Produits', 'url' => ['index']];
$this->params['breadcrumbs'][] = ['label' => $model->nom, 'url' => ['update', 'id' => $model->id]];
$this->params['breadcrumbs'][] = ['label' => $model->name, 'url' => ['update', 'id' => $model->id]];
$this->params['breadcrumbs'][] = 'Modifier';
?>
<div class="produit-update">
<div class="product-update">

<h1><?= Html::encode($this->title) ?></h1>


+ 51
- 67
backend/views/site/index.php View File

@@ -39,10 +39,11 @@ termes.
use yii\helpers\Html ;

$this->title = 'Tableau de bord';

?>
<div class="site-index">
<?php if(Yii::$app->request->get('erreur_produits_points_vente')): ?>
<?php if(Yii::$app->request->get('error_products_points_sale')): ?>
<div class="alert alert-danger">Vous devez saisir vos produits et vos points de vente
avant d'initialiser vos jours de production.</div>
<?php endif; ?>
@@ -54,12 +55,12 @@ $this->title = 'Tableau de bord';
<div class="panel-heading">
<h3 class="panel-title">
Commandes
<?= Html::a('Voir', ['commande/index'], ['class' => 'btn btn-default btn-xs']) ; ?>
<?= Html::a('Voir', ['order/index'], ['class' => 'btn btn-default btn-xs']) ; ?>
</h3>
</div>
<div class="panel-body">
<?php if(count($productions)): ?>
<p>Prochaines productions : </p>
<?php if(count($distributionsArray)): ?>
<p>Prochaines distributions : </p>
<table class="table table-bordered table-condensed">
<thead>
<tr>
@@ -69,13 +70,13 @@ $this->title = 'Tableau de bord';
</tr>
</thead>
<tbody>
<?php foreach($productions as $p): ?>
<?php foreach($distributionsArray as $distribution): ?>
<tr>
<td><?= date('d/m/Y',strtotime($p['date'])); ?></td>
<td><?= count($p->commande); ?></td>
<td><?= date('d/m/Y',strtotime($distribution['date'])); ?></td>
<td><?= count($distribution->order); ?></td>
<td>
<?= Html::a('<span class="glyphicon glyphicon-eye-open"></span>', ['commande/index','date' => $p['date']], ['class' => 'btn btn-default btn-xs']) ; ?>
<?php if(count($p->commande)): ?><?= Html::a('<span class="glyphicon glyphicon-download-alt"></span>', ['commande/report','date' => $p['date'],'global' => 1], ['class' => 'btn btn-default btn-xs']) ; ?><?php endif; ?>
<?= Html::a('<span class="glyphicon glyphicon-eye-open"></span>', ['order/index','date' => $distribution['date']], ['class' => 'btn btn-default btn-xs']) ; ?>
<?php if(count($distribution->order)): ?><?= Html::a('<span class="glyphicon glyphicon-download-alt"></span>', ['order/report','date' => $distribution['date'],'global' => 1], ['class' => 'btn btn-default btn-xs']) ; ?><?php endif; ?>
</td>
</tr>
<?php endforeach; ?>
@@ -93,13 +94,13 @@ $this->title = 'Tableau de bord';
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">
<?= $nb_clients; ?> client<?php if($nb_clients > 1): ?>s<?php endif; ?>
<?= $nbUsers; ?> client<?php if($nbUsers > 1): ?>s<?php endif; ?>
<?= Html::a('Ajouter',['user/create'],['class' => 'btn btn-success btn-xs margin-left']) ; ?>
<?= Html::a('Liste', ['user/index'], ['class' => 'btn btn-default btn-xs']) ; ?>
</h3>
</div>
<div class="panel-body">
<?php if($nb_clients): ?>
<?php if($nbUsers): ?>
<p>Dernières inscriptions :</p>
<table class="table table-bordered table-condensed">
<thead>
@@ -110,11 +111,11 @@ $this->title = 'Tableau de bord';
</tr>
</thead>
<tbody>
<?php foreach($clients as $c): ?>
<?php foreach($usersArray as $user): ?>
<tr>
<td><?= Html::encode($c['prenom'].' '.$c['nom']) ?></td>
<td><?= date('d/m/Y', $c['created_at']); ?></td>
<td><?= Html::a('<span class="glyphicon glyphicon-pencil"></span>', ['user/update','id' => $c['user_id']], ['class' => 'btn btn-default btn-xs']) ; ?></td>
<td><?= Html::encode($user['lastname'].' '.$user['name']) ?></td>
<td><?= date('d/m/Y', $user['created_at']); ?></td>
<td><?= Html::a('<span class="glyphicon glyphicon-pencil"></span>', ['user/update','id' => $user['user_id']], ['class' => 'btn btn-default btn-xs']) ; ?></td>
</tr>
<?php endforeach; ?>
</tbody>
@@ -127,7 +128,7 @@ $this->title = 'Tableau de bord';
</div>
<!-- Clients crédit pain négatif -->
<!-- Clients crédit négatif -->
<div class="">
<div class="panel panel-default">
<div class="panel-heading">
@@ -136,7 +137,7 @@ $this->title = 'Tableau de bord';
</h3>
</div>
<div class="panel-body">
<?php if(count($clients_credit_pain_negatif)): ?>
<?php if(count($usersNegativeCredit)): ?>
<table class="table table-bordered table-condensed">
<thead>
<tr>
@@ -145,11 +146,11 @@ $this->title = 'Tableau de bord';
</tr>
</thead>
<tbody>
<?php foreach($clients_credit_pain_negatif as $c): ?>
<?php foreach($usersNegativeCredit as $user): ?>
<tr>
<td><?= Html::encode($c['prenom'].' '.$c['nom']) ?></td>
<td><?= number_format($c['credit'],2) ?></td>
<td><?= Html::a('<span class="glyphicon glyphicon-euro"></span>', ['user/credit','id' => $c['user_id']], ['class' => 'btn btn-default btn-xs']) ; ?></td>
<td><?= Html::encode($user['lastname'].' '.$user['name']) ?></td>
<td><?= number_format($user['credit'],2) ?></td>
<td><?= Html::a('<span class="glyphicon glyphicon-euro"></span>', ['user/credit','id' => $user['user_id']], ['class' => 'btn btn-default btn-xs']) ; ?></td>
</tr>
<?php endforeach; ?>
</tbody>
@@ -167,7 +168,7 @@ $this->title = 'Tableau de bord';
<div class="panel-heading">
<h3 class="panel-title">
Paramètres
<?= Html::a('Configurer',['etablissement/update'],['class' => 'btn btn-default btn-xs']) ; ?>
<?= Html::a('Configurer',['producer/update'],['class' => 'btn btn-default btn-xs']) ; ?>
</h3>
</div>
<div class="panel-body">
@@ -180,9 +181,9 @@ $this->title = 'Tableau de bord';
</thead>
<tbody>
<tr>
<td>Établissement activé</td>
<td>Producteur activé</td>
<td>
<?php if($etablissement->actif): ?>
<?php if($producer->active): ?>
<span class="label label-success">Active</span>
<?php else: ?>
<span class="label label-danger">Hors-ligne</span>
@@ -190,11 +191,11 @@ $this->title = 'Tableau de bord';
</td>
</tr>
<tr>
<td>Établissement protégé par un code</td>
<td>Producteur protégé par un code</td>
<td>
<?php if(strlen($etablissement->code)): ?>
<?php if(strlen($producer->code)): ?>
<span class="label label-success">Oui</span><br />
<strong><?= Html::encode($etablissement->code) ?></strong>
<strong><?= Html::encode($producer->code) ?></strong>
<?php else: ?>
<span class="label label-danger">Non</span>
<?php endif; ?>
@@ -202,16 +203,16 @@ $this->title = 'Tableau de bord';
</tr>
<tr>
<td>Délai de commande</td>
<td><?= $etablissement->delai_commande ?> jour<?php if($etablissement->delai_commande > 1): ?>s<?php endif; ?></td>
<td><?= $producer->order_delay ?> jour<?php if($producer->order_delay > 1): ?>s<?php endif; ?></td>
</tr>
<tr>
<td>Heure limite de commande</td>
<td><?= $etablissement->heure_limite_commande ?>h</td>
<td><?= $producer->order_deadline ?>h</td>
</tr>
<tr>
<td>Système de Crédit Pain activé</td>
<td>Système de Crédit activé</td>
<td>
<?php if($etablissement->credit_pain): ?>
<?php if($producer->credit): ?>
<span class="label label-success">Oui</span><br />
<?php else: ?>
<span class="label label-danger">Non</span>
@@ -225,36 +226,23 @@ $this->title = 'Tableau de bord';
</div>

<!-- Mon abonnement -->
<div class="" id="facturation">
<div class="" id="billing">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">
Mon abonnement
<?= Html::a('Voir',['etablissement/facturation'],['class' => 'btn btn-default btn-xs']) ; ?>
<?= Html::a('Voir',['producer/billing'],['class' => 'btn btn-default btn-xs']) ; ?>
</h3>
</div>
<div class="panel-body">
<div class="col-md-12">
<?php if(is_null($etablissement->prix_libre)): ?>
<?php if(is_null($producer->free_price)): ?>
<h2>Prix libre</h2>
<p>Le modèle économique de <em>La boîte à pain</em> est basé sur un système de prix libre. <?= Html::a('En savoir plus',['etablissement/facturation']); ?></p>
<p>Le modèle économique de <em>La boîte à pain</em> est basé sur un système de prix libre. <?= Html::a('En savoir plus',['producer/billing']); ?></p>
<?php else: ?>
<h2><?= $etablissement->getPrixLibre() ?> / mois <?= Html::a('Modifier',['etablissement/facturation'],['class' => 'btn btn-xs btn-primary']) ?></h2>
<h2><?= $producer->getFreePrice() ?> / mois <?= Html::a('Modifier',['producer/billing'],['class' => 'btn btn-xs btn-primary']) ?></h2>
<?php endif; ?>
</div>
<!--<div class="col-md-6 mois-en-cours">
<h2>Chiffre d'affaire<br />du mois en cours</h2>
<div class="montant"><span><?= number_format($etablissement->getCA(date('Y-m')), 2); ?> €</span></div>
</div>

<div class="col-md-6">
<?php $montant = $etablissement->getMontantFacturer(date('Y-m'), 0); ?>
<h2>Participation<br /><em>La boîte à pain</em> (2%)</h2>
<div class="montant"><span><?php if($montant): echo number_format($montant,2).' €' ; else: echo 'Gratuit' ; endif; ?></span></div>
</div>
<div class="clr"></div>-->
</div>
</div>
</div>
@@ -263,7 +251,7 @@ $this->title = 'Tableau de bord';
<div class="col-md-8">
<!-- dernières commandes -->
<div id="dernieres-commandes" class="">
<div id="last-orders" class="">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">
@@ -271,7 +259,7 @@ $this->title = 'Tableau de bord';
</h3>
</div>
<div class="panel-body">
<?php if(count($commandes)): ?>
<?php if(count($ordersArray)): ?>
<table class="table table-condensed table-bordered">
<thead>
<tr>
@@ -285,23 +273,23 @@ $this->title = 'Tableau de bord';
</tr>
</thead>
<tbody>
<?php foreach($commandes as $c): ?>
<tr class="<?= $c->getClassHistorique() ; ?>">
<td class="infos"><?= $c->getStrType(true); ?></td>
<?php foreach($ordersArray as $order): ?>
<tr class="<?= $order->getClassHistory() ; ?>">
<td class="infos"><?= $order->getStrOrigin(true); ?></td>
<td class="date">
<div class="bloc-date">
<div class="jour"><?= strftime('%A', strtotime($c->production->date)) ?></div>
<div class="num"><?= date('d', strtotime($c->production->date)) ?></div>
<div class="mois"><?= strftime('%B', strtotime($c->production->date)) ?></div>
<div class="block-date">
<div class="day"><?= strftime('%A', strtotime($order->distribution->date)) ?></div>
<div class="num"><?= date('d', strtotime($order->distribution->date)) ?></div>
<div class="month"><?= strftime('%B', strtotime($order->distribution->date)) ?></div>
</div>
</td>
<td>
<?= $c->getStrUser(); ?><br />
<?= $order->getStrUser(); ?><br />
</td>
<td class="historique"><?= $c->getStrHistorique() ; ?></td>
<td><?= $c->getResumePanier() ; ?></td>
<td><?= $c->getResumePointVente() ; ?></td>
<td><?= $c->getMontant(true) ; ?></td>
<td class="history"><?= $order->getStrHistory() ; ?></td>
<td><?= $order->getCartSummary() ; ?></td>
<td><?= $order->getPointSaleSummary() ; ?></td>
<td><?= $order->getAmount(Order::AMOUNT_TOTAL, true) ; ?></td>
</tr>
<?php endforeach; ?>
</tbody>
@@ -312,9 +300,5 @@ $this->title = 'Tableau de bord';
</div>
</div>
</div>

</div>
</div>

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

@@ -53,7 +53,7 @@ $this->params['breadcrumbs'][] = $this->title;
<div class="col-lg-5">
<?php if(YII_ENV == 'demo') : ?>
<div class="alert alert-warning">
Identifiant : <strong>boulanger@laboiteapain.net</strong><br />
Identifiant : <strong>producteur@laboiteapain.net</strong><br />
Mot de passe : <strong>laboiteapain</strong>
</div>
<?php endif; ?>

+ 2
- 2
backend/views/stats/index.php View File

@@ -53,7 +53,7 @@ $this->params['breadcrumbs'][] = 'Statistiques';
'width' => 1100
],
'data' => [
'labels' => $data_labels,
'labels' => $dataLabels,
'datasets' => [
[
'label' => 'Recettes commandes',
@@ -61,7 +61,7 @@ $this->params['breadcrumbs'][] = 'Statistiques';
'borderColor' => "rgb(187,135,87,1)",
'pointBackgroundColor' => "rgb(187,135,87,1)",
'pointStrokeColor' => "#fff",
'data' => $data_pain
'data' => $data
]
]
]

backend/views/stats/produits.php → backend/views/stats/products.php View File

@@ -42,12 +42,12 @@ $this->title = 'Statistiques produits' ;
$this->params['breadcrumbs'][] = 'Statistiques produits';

?>
<div class="stats-produits">
<div class="stats-products">
<h1>Statistiques produits <?= $year ?>
<div id="nav-year">
<a class="btn btn-default" href="<?= Yii::$app->urlManager->createUrl(['stats/produits','year' => $year - 1]); ?>">&lt; <?= ($year - 1) ?></a>
<a class="btn btn-default" href="<?= Yii::$app->urlManager->createUrl(['stats/produits','year' => $year + 1]); ?>"><?= ($year + 1) ?> &gt;</a>
<a class="btn btn-default" href="<?= Yii::$app->urlManager->createUrl(['stats/products','year' => $year - 1]); ?>">&lt; <?= ($year - 1) ?></a>
<a class="btn btn-default" href="<?= Yii::$app->urlManager->createUrl(['stats/products','year' => $year + 1]); ?>"><?= ($year + 1) ?> &gt;</a>
</div>
</h1>
@@ -55,12 +55,12 @@ $this->params['breadcrumbs'][] = 'Statistiques produits';
<div class="alert alert-warning">Aucune statistique disponible pour cette période</div>
<?php else: ?>
<table id="table-stats-produits" class="table table-bordered table-hover header-fixed">
<table id="table-stats-products" class="table table-bordered table-hover header-fixed">
<thead>
<tr class="mois">
<th></th>
<?php foreach($arr_mois as $m): ?>
<th colspan="2"><?= $m; ?></th>
<?php foreach($monthArray as $month): ?>
<th colspan="2"><?= $month; ?></th>
<?php endforeach; ?>
</tr>
<tr class="sub-head">
@@ -72,64 +72,67 @@ $this->params['breadcrumbs'][] = 'Statistiques produits';
</tr>
</thead>
<tbody>
<?php foreach($produits as $produit_current): ?>
<?php foreach($productsArray as $currentProduct): ?>
<tr>
<td class="nom"><?= Html::encode($produit_current['nom']) ?></td>
<?php foreach($arr_produits as $mois => $arr_produit_mois):
$find_max = false ;
$find_commandes = false ;
<td class="name"><?= Html::encode($currentProduct['name']) ?></td>
<?php foreach($dataProducts as $month => $productsMonthArray):
$findMax = false ;
$findOrders = false ;
?>
<?php if($mois != StatsController::TOTAUX): ?>
<?php if($month != StatsController::TOTALS): ?>
<!-- max -->
<?php foreach($arr_produit_mois['max'] as $produit):
$tooltip = 'data-toggle="tooltip" data-placement="top" data-original-title="'.Html::encode($produit_current['nom']).' / '.$arr_mois[$mois - 1] .' '. $year.' / Maximum"' ;
<?php
$tooltip = 'data-toggle="tooltip" data-placement="top" data-original-title="'.Html::encode($currentProduct['name']).' / '.$monthArray[$month - 1] .' '. $year.' / Maximum"' ;
foreach($productsMonthArray['max'] as $product):
?>
<?php if($produit['nom'] == $produit_current['nom']):
$find_max = true ;
<?php if($product['name'] == $currentProduct['name']):
$findMax = true ;
?>
<td class="align-center">
<div <?= $tooltip; ?>><?= $produit['total'] ?></div>
<div <?= $tooltip; ?>><?= $product['total'] ?></div>
</td>
<?php endif; ?>
<?php endforeach; ?>
<?php if(!$find_max): ?><td class="align-center"><div <?= $tooltip; ?>>0</div></td><?php endif; ?>
<?php if(!$findMax): ?><td class="align-center"><div <?= $tooltip; ?>>0</div></td><?php endif; ?>

<!-- commandes -->
<?php foreach($arr_produit_mois['commandes'] as $produit):
$tooltip = 'data-toggle="tooltip" data-placement="top" data-original-title="'.Html::encode($produit_current['nom']).' / '. $arr_mois[$mois - 1] . ' '. $year .' / Commandés"' ;
<?php
$tooltip = 'data-toggle="tooltip" data-placement="top" data-original-title="'.Html::encode($currentProduct['name']).' / '. $monthArray[$month - 1] . ' '. $year .' / Commandés"' ;
foreach($productsMonthArray['orders'] as $product):
?>
<?php if($produit['nom'] == $produit_current['nom']):
$find_commandes = true ;
<?php if($product['name'] == $currentProduct['name']):
$findOrders = true ;
?>
<td class="align-center">
<div <?= $tooltip ?> ><?= $produit['total'] ?></div>
<div <?= $tooltip ?> ><?= $product['total'] ?></div>
</td>
<?php endif; ?>
<?php endforeach; ?>
<?php if(!$find_commandes): ?><td class="align-center"><div <?= $tooltip ?> >0</div></td><?php endif; ?>
<?php if(!$findOrders): ?><td class="align-center"><div <?= $tooltip ?> >0</div></td><?php endif; ?>

<?php else: ?>
<!-- totaux max -->
<?php foreach($arr_produits[StatsController::TOTAUX]['max'] as $nom_produit => $total_max):
$tooltip = 'data-toggle="tooltip" data-placement="top" data-original-title="'.Html::encode($produit_current['nom']).' / Total '. $year .' / Maximums"' ;
<?php
$tooltip = 'data-toggle="tooltip" data-placement="top" data-original-title="'.Html::encode($currentProduct['name']).' / Total '. $year .' / Maximums"' ;
foreach($dataProducts[StatsController::TOTALS]['max'] as $productName => $totalMax):
?>
<?php if($nom_produit == $produit_current['nom']): ?>
<?php if($productName == $currentProduct['name']): ?>
<td class="align-center">
<div <?= $tooltip ?> ><?= $total_max ?></div>
<div <?= $tooltip ?> ><?= $totalMax ?></div>
</td>
<?php endif; ?>
<?php endforeach; ?>

<!-- totaux commandés -->
<?php foreach($arr_produits[StatsController::TOTAUX]['commandes'] as $nom_produit => $total_commandes):
$tooltip = 'data-toggle="tooltip" data-placement="top" data-original-title="'.Html::encode($produit_current['nom']).' / Total '. $year .' / Commandés"' ;
<?php
$tooltip = 'data-toggle="tooltip" data-placement="top" data-original-title="'.Html::encode($currentProduct['name']).' / Total '. $year .' / Commandés"' ;
foreach($dataProducts[StatsController::TOTALS]['orders'] as $productName => $totalOrders):
?>
<?php if($nom_produit == $produit_current['nom']): ?>
<?php if($productName == $currentProduct['name']): ?>
<td class="align-center">
<div <?= $tooltip ?> ><?= $total_commandes ?></div>
<div <?= $tooltip ?> ><?= $totalOrders ?></div>
</td>
<?php endif; ?>
<?php endforeach; ?>

backend/views/commandeauto/_form.php → backend/views/subscription/_form.php View File

@@ -40,15 +40,15 @@ use yii\helpers\Html;
use yii\widgets\ActiveForm;
use yii\helpers\ArrayHelper ;
use common\models\User ;
use common\models\PointVente ;
use common\models\PointSale ;

?>

<div class="commandeauto-form">
<div class="subscription-form">
<?php $form = ActiveForm::begin(['enableClientValidation' => false]); ?>
<div class="col-md-5" id="bloc-select-user">
<?= $form->field($model, 'id_user')->dropDownList( ArrayHelper::map(User::find()->joinWith('userEtablissement')->where('user_etablissement.id_etablissement = '.Yii::$app->user->identity->id_etablissement)->andWhere('user_etablissement.actif = 1')->orderBy('nom ASC, prenom ASC')->all(), 'id', function($model, $defaultValue) {
return $model['nom'].' '.$model['prenom'];
<?= $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) {
return $model['lastname'].' '.$model['name'];
}), ['prompt' => '--','class' => 'form-control user-id', ]) ?>
</div>
<div class="col-md-1" id="or-user">
@@ -59,47 +59,47 @@ use common\models\PointVente ;
</div>
<div class="clr"></div>
<?= $form->field($model, 'id_etablissement')->hiddenInput() ?>
<?= $form->field($model, 'id_point_vente')->dropDownList( ArrayHelper::map(PointVente::find()->where('id_etablissement = '.Yii::$app->user->identity->id_etablissement)->all(), 'id', function($model, $defaultValue) {
return $model['nom'];
<?= $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) {
return $model['name'];
}), ['prompt' => '--','class' => 'form-control user-id']) ?>
<?= $form->field($model, 'date_debut') ?>
<?= $form->field($model, 'date_fin')->hint('Laisser vide pour une durée indéterminée') ?>
<div class="jours">
<?= $form->field($model, 'date_begin') ?>
<?= $form->field($model, 'date_end')->hint('Laisser vide pour une durée indéterminée') ?>
<div class="days">
<h2>Jours</h2>
<?= $form->field($model, 'lundi')->checkbox() ?>
<?= $form->field($model, 'mardi')->checkbox() ?>
<?= $form->field($model, 'mercredi')->checkbox() ?>
<?= $form->field($model, 'jeudi')->checkbox() ?>
<?= $form->field($model, 'vendredi')->checkbox() ?>
<?= $form->field($model, 'samedi')->checkbox() ?>
<?= $form->field($model, 'dimanche')->checkbox() ?>
<?= $form->field($model, 'monday')->checkbox() ?>
<?= $form->field($model, 'tuesday')->checkbox() ?>
<?= $form->field($model, 'wednesday')->checkbox() ?>
<?= $form->field($model, 'thursday')->checkbox() ?>
<?= $form->field($model, 'friday')->checkbox() ?>
<?= $form->field($model, 'saturday')->checkbox() ?>
<?= $form->field($model, 'sunday')->checkbox() ?>
</div>
<div class="clr"></div>
<?= $form->field($model, 'periodicite_semaine')->dropDownList([1=>1, 2=>2, 3=>3, 4=>4]) ?>
<?= $form->field($model, 'week_frequency')->dropDownList([1=>1, 2=>2, 3=>3, 4=>4]) ?>

<?= $form->field($model, 'paiement_automatique')
<?= $form->field($model, 'auto_payment')
->checkbox()
->hint('Cochez cette case si vous souhaitez que le crédit pain du client soit automatiquement débité lors de la création de la commande.<br />'
. 'Attention, un compte client existant doit être spécifié en haut de ce formulaire.') ?>
<div class="produits">
<div class="products">
<h2>Produits</h2>
<?php if(isset($model->errors['produits']) && count($model->errors['produits']))
<?php if(isset($model->errors['products']) && count($model->errors['products']))
{
echo '<div class="alert alert-danger">'.$model->errors['produits'][0].'</div>' ;
echo '<div class="alert alert-danger">'.$model->errors['products'][0].'</div>' ;
}
?>
<table class="table table-bordered table-condensed table-hover">
<?php foreach ($produits as $p) : ?>
<?php foreach ($productsArray as $p) : ?>
<tr>
<td><?= Html::encode($p->nom) ?></td>
<td><?= Html::encode($p->name) ?></td>
<td>
<div class="input-group">
<span class="input-group-btn">
<button class="btn btn-default btn-moins" type="button"><span class="glyphicon glyphicon-minus"></span></button>
</span>
<?= Html::input('text', 'CommandeAutoForm[produits][produit_'.$p->id.']', (isset($model->produits['produit_'.$p->id])) ? $model->produits['produit_'.$p->id] : '', ['class' => 'form-control quantite']) ?>
<?= Html::input('text', 'SubscriptionForm[products][product_'.$p->id.']', (isset($model->products['product_'.$p->id])) ? $model->products['product_'.$p->id] : '', ['class' => 'form-control quantity']) ?>
<span class="input-group-btn">
<button class="btn btn-default btn-plus" type="button"><span class="glyphicon glyphicon-plus"></span></button>
</span>

backend/views/commandeauto/create.php → backend/views/subscription/create.php View File

@@ -41,17 +41,17 @@ use yii\helpers\Html;
/* @var $this yii\web\View */
/* @var $model app\models\Produit */

$this->title = 'Ajouter une commande automatique';
$this->params['breadcrumbs'][] = ['label' => 'Commandes automatiques', 'url' => ['index']];
$this->title = 'Ajouter un abonnement';
$this->params['breadcrumbs'][] = ['label' => 'Abonnements', 'url' => ['index']];
$this->params['breadcrumbs'][] = 'Ajouter';
?>
<div class="commandeauto-create">
<div class="subscription-create">
<h1><?= Html::encode($this->title) ?></h1>

<?= $this->render('_form', [
'model' => $model,
'produits' => $produits
'productsArray' => $productsArray
]) ?>

</div>

backend/views/commandeauto/index.php → backend/views/subscription/index.php View File

@@ -42,10 +42,10 @@ use yii\grid\GridView;
/* @var $this yii\web\View */
/* @var $dataProvider yii\data\ActiveDataProvider */

$this->title = 'Commandes récurrentes';
$this->title = 'Abonnements';
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="commande-auto-index">
<div class="subscription-index">

<h1><?= Html::encode($this->title) ?> <?= Html::a('Ajouter', ['create'], ['class' => 'btn btn-success']) ?></h1>

@@ -61,30 +61,31 @@ $this->params['breadcrumbs'][] = $this->title;
return Html::encode($model->username) ;
}
else {
if(isset($model->user))
return Html::encode($model->user->nom.' '.$model->user->prenom) ;
if(isset($model->user)) {
return Html::encode($model->user->lastname.' '.$model->user->name) ;
}
}
}
],
[
'attribute' => 'id_point_vente',
'attribute' => 'id_point_sale',
'format' => 'raw',
'value' => function($model) {
return Html::encode($model->pointVente->nom) ;
return Html::encode($model->pointSale->name) ;
}
],
[
'attribute' => 'produits',
'attribute' => 'products',
'format' => 'raw',
'value' => function($model) {
$html = '' ;
foreach($model->commandeAutoProduit as $commande_produit)
foreach($model->productSubscription as $productSubscription)
{
$html .= $commande_produit->quantite . ' x '.Html::encode($commande_produit->produit->nom).'<br />' ;
$html .= $productSubscription->quantity . ' x '.Html::encode($productSubscription->product->name).'<br />' ;
}
// aucun produit
if(!count($model->commandeAutoProduit))
if(!count($model->productSubscription))
{
$html .= '<span class="glyphicon glyphicon-warning-sign"></span> Aucun produit' ;
}
@@ -93,39 +94,39 @@ $this->params['breadcrumbs'][] = $this->title;
}
],
[
'attribute' => 'date_debut',
'attribute' => 'date_begin',
'value' => function($model) {
return date('d/m/Y',strtotime($model->date_debut)) ;
return date('d/m/Y',strtotime($model->date_begin)) ;
}
],
[
'attribute' => 'date_fin',
'attribute' => 'date_end',
'value' => function($model) {
if($model->date_fin)
return date('d/m/Y',strtotime($model->date_fin)) ;
if($model->date_end)
return date('d/m/Y',strtotime($model->date_end)) ;
else
return 'indéterminée' ;
}
],
[
'attribute' => 'lundi',
'attribute' => 'monday',
'label' => 'Jours',
'format' => 'raw',
'value' => function($model) {
$html = '' ;
if($model->lundi)
if($model->monday)
$html .= 'lundi, ' ;
if($model->mardi)
if($model->tuesday)
$html .= 'mardi, ' ;
if($model->mercredi)
if($model->wednesday)
$html .= 'mercredi, ' ;
if($model->jeudi)
if($model->thursday)
$html .= 'jeudi, ' ;
if($model->vendredi)
if($model->friday)
$html .= 'vendredi, ' ;
if($model->samedi)
if($model->saturday)
$html .= 'samedi, ' ;
if($model->dimanche)
if($model->sunday)
$html .= 'dimanche, ' ;
if(strlen($html))
@@ -135,19 +136,19 @@ $this->params['breadcrumbs'][] = $this->title;
}
],
[
'attribute' => 'periodicite_semaine',
'attribute' => 'week_frequency',
'value' => function($model) {
if($model->periodicite_semaine == 1)
if($model->week_frequency == 1)
return 'Toutes les semaines' ;
else
return 'Toutes les '.$model->periodicite_semaine.' semaines' ;
return 'Toutes les '.$model->week_frequency.' semaines' ;
}
],
[
'attribute' => 'paiement_automatique',
'attribute' => 'auto_payment',
'format' => 'raw',
'value' => function($model) {
if($model->paiement_automatique)
if($model->auto_payment)
return '<span class="label label-success">Oui</span>' ;
else
return '<span class="label label-danger">Non</span>' ;

backend/views/commandeauto/update.php → backend/views/subscription/update.php View File

@@ -41,15 +41,15 @@ use yii\helpers\Html;
/* @var $this yii\web\View */
/* @var $model app\models\Produit */

$this->title = 'Modifier une commande récurrente';
$this->params['breadcrumbs'][] = ['label' => 'Commandes récurrentes', 'url' => ['index']];
$this->title = 'Modifier un abonnement';
$this->params['breadcrumbs'][] = ['label' => 'Abonnements', 'url' => ['index']];
$this->params['breadcrumbs'][] = 'Modifier';
?>
<div class="commandeauto-update">
<div class="subscription-update">
<h1><?= Html::encode($this->title) ?></h1>

<?= $this->render('_form', [
'model' => $model,
'produits' => $produits
'productsArray' => $productsArray
]) ?>
</div>

+ 4
- 4
backend/views/user/_form.php View File

@@ -48,11 +48,11 @@ use yii\widgets\ActiveForm;

<?php $form = ActiveForm::begin(); ?>
<?= $form->field($model, 'nom')->textInput() ?>
<?= $form->field($model, 'prenom')->textInput() ?>
<?= $form->field($model, 'telephone')->textInput() ?>
<?= $form->field($model, 'lastname')->textInput() ?>
<?= $form->field($model, 'name')->textInput() ?>
<?= $form->field($model, 'phone')->textInput() ?>
<?= $form->field($model, 'email')->textInput() ?>
<?= $form->field($model, 'adresse')->textarea() ?>
<?= $form->field($model, 'address')->textarea() ?>
<div class="form-group">
<?= Html::submitButton($model->isNewRecord ? 'Ajouter' : 'Modifier', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>

+ 34
- 33
backend/views/user/credit.php View File

@@ -38,12 +38,12 @@ termes.

use yii\helpers\Html;
use yii\widgets\ActiveForm;
use common\models\CreditHistorique;
use common\models\Etablissement;
use common\models\CreditHistory;
use common\models\Producer;

$this->title = 'Créditer <small>'.Html::encode($user->nom.' '.$user->prenom).'</small>';
$this->title = 'Créditer <small>'.Html::encode($user->lastname.' '.$user->name).'</small>';
$this->params['breadcrumbs'][] = ['label' => 'Clients', 'url' => ['index']];
$this->params['breadcrumbs'][] = ['label' => Html::encode($user->nom.' '.$user->prenom)];
$this->params['breadcrumbs'][] = ['label' => Html::encode($user->lastname.' '.$user->name)];
$this->params['breadcrumbs'][] = 'Créditer';

?>
@@ -51,12 +51,13 @@ $this->params['breadcrumbs'][] = 'Créditer';
<div class="user-credit">
<?php
$etablissement = Etablissement::find()
->where(['id' => Yii::$app->user->identity->id_etablissement])
->one() ;
if(!$etablissement->credit_pain)
$producer = Producer::searchOne([
'id' => Producer::getId()
]);
if(!$producer->credit)
{
echo '<div class="alert alert-warning">Attention, la fonctionnalité <strong>Crédit Pain</strong> est désactivée dans vos <a href="'.Yii::$app->urlManager->createurl(['etablissement/update']).'">paramètres</a>.'
echo '<div class="alert alert-warning">Attention, la fonctionnalité <strong>Crédit</strong> est désactivée dans vos <a href="'.Yii::$app->urlManager->createurl(['producer/update']).'">paramètres</a>.'
. ' Pensez à l\'activer si vous souhaitez qu\'elle soit visible de vos clients.</div>' ;
}
?>
@@ -64,19 +65,19 @@ $this->params['breadcrumbs'][] = 'Créditer';
<div class="col-md-12">
<h1><?= $this->title ?></h1>
<?php $form = ActiveForm::begin(); ?>
<?= $form->field($credit_form, 'type')->dropDownList([
CreditHistorique::TYPE_CREDIT => 'Crédit',
CreditHistorique::TYPE_DEBIT => 'Débit',
<?= $form->field($creditForm, 'type')->dropDownList([
CreditHistory::TYPE_CREDIT => 'Crédit',
CreditHistory::TYPE_DEBIT => 'Débit',
]) ?>
<?= $form->field($credit_form, 'montant')->textInput() ?>
<?= $form->field($credit_form, 'moyen_paiement')->dropDownList([
CreditHistorique::MOYEN_ESPECES => 'Espèces',
CreditHistorique::MOYEN_CB => 'Carte bancaire',
CreditHistorique::MOYEN_CHEQUE => 'Chèque',
CreditHistorique::MOYEN_AUTRE => 'Autre',
<?= $form->field($creditForm, 'amount')->textInput() ?>
<?= $form->field($creditForm, 'mean_payment')->dropDownList([
CreditHistory::MEAN_PAYMENT_MONEYS => CreditHistory::getStrMeanPaymentBy(CreditHistory::MEAN_PAYMENT_MONEYS),
CreditHistory::MOYEN_CB => CreditHistory::getStrMeanPaymentBy(CreditHistory::MOYEN_CB),
CreditHistory::MOYEN_CHEQUE => CreditHistory::getStrMeanPaymentBy(CreditHistory::MOYEN_CHEQUE),
CreditHistory::MOYEN_AUTRE => CreditHistory::getStrMeanPaymentBy(CreditHistory::MOYEN_AUTRE),
]) ?>
<?= $form->field($credit_form, 'commentaire')->textarea() ?>
<?= $form->field($credit_form, 'send_mail')->checkbox() ?>
<?= $form->field($creditForm, 'comment')->textarea() ?>
<?= $form->field($creditForm, 'sendMail')->checkbox() ?>
<div class="form-group">
<?= Html::submitButton( 'Créditer', ['class' => 'btn btn-primary']) ?>
@@ -85,7 +86,7 @@ $this->params['breadcrumbs'][] = 'Créditer';
</div>
<div class="col-md-12">
<h2>Historique <span class="the-credit"><?= number_format($user->getCredit($etablissement->id), 2); ?> €</span></h2>
<h2>Historique <span class="the-credit"><?= number_format($user->getCredit($producer->id), 2); ?> €</span></h2>
<table class="table table-bordered">
<thead>
<tr>
@@ -99,28 +100,28 @@ $this->params['breadcrumbs'][] = 'Créditer';
</tr>
</thead>
<tbody>
<?php if(count($historique)): ?>
<?php foreach($historique as $ch): ?>
<?php if(count($history)): ?>
<?php foreach($history as $creditHistory): ?>
<tr>
<td><?= $ch->getDate(true) ; ?></td>
<td><?= Html::encode($ch->strUserAction()); ?></td>
<td><?= $ch->getStrLibelle(); ?></td>
<td><?= $creditHistory->getDate(true) ; ?></td>
<td><?= Html::encode($creditHistory->strUserAction()); ?></td>
<td><?= $creditHistory->getStrWording(); ?></td>
<td>
<?php if($ch->isTypeDebit()): ?>
- <?= $ch->getMontant(true); ?>
<?php if($creditHistory->isTypeDebit()): ?>
- <?= $creditHistory->getAmount(true); ?>
<?php endif; ?>
</td>
<td>
<?php if($ch->isTypeCredit()): ?>
+ <?= $ch->getMontant(true); ?>
<?php if($creditHistory->isTypeCredit()): ?>
+ <?= $creditHistory->getAmount(true); ?>
<?php endif; ?>
</td>
<td>
<?= $ch->getStrMoyenPaiement() ?>
<?= $creditHistory->getStrMeanPayment() ?>
</td>
<td>
<?php if(strlen($ch->commentaire)): ?>
<?= nl2br($ch->commentaire) ; ?>
<?php if(strlen($creditHistory->comment)): ?>
<?= nl2br($creditHistory->comment) ; ?>
<?php endif; ?>
</td>
</tr>

backend/views/user/liste_mails.php → backend/views/user/emails.php View File

@@ -39,24 +39,24 @@ termes.
use yii\helpers\Html ;

$this->title = 'Liste des emails';
$this->params['breadcrumbs'][] = ['label' => 'Clients',
$this->params['breadcrumbs'][] = ['label' => 'Utilisateurs',
'url' => ['user/index']] ;
$this->params['breadcrumbs'][] = $this->title;

?>

<h1><?php if(isset($point_vente) && $point_vente): echo Html::encode($point_vente->nom).' : '; endif; ?><?= count($users); ?> clients</h1>
<h1><?php if(isset($pointSale) && $pointSale): echo Html::encode($pointSale->name).' : '; endif; ?><?= count($usersArray); ?> utilisateurs</h1>

<ul id="tabs-points-vente" class="nav nav-tabs" role="tablist">
<li class="<?php if(!isset($point_vente)): ?>active<?php endif; ?>">
<ul id="tabs-points-sale" class="nav nav-tabs" role="tablist">
<li class="<?php if(!isset($pointSale)): ?>active<?php endif; ?>">
<a href="<?= Yii::$app->urlManager->createUrl(['user/mail']); ?>">Tous</a>
</li>
<?php foreach($points_vente as $pv): ?>
<li class="<?php if(isset($point_vente) && $point_vente->id == $pv->id): ?>active<?php endif; ?>">
<a href="<?= Yii::$app->urlManager->createUrl(['user/mail','id_point_vente'=>$pv->id]); ?>"><?= Html::encode($pv->nom) ?></a>
<?php foreach($pointsSaleArray as $pointSale): ?>
<li class="<?php if(isset($pointSale) && $pointSale->id == $pointSale->id): ?>active<?php endif; ?>">
<a href="<?= Yii::$app->urlManager->createUrl(['user/mail','idPointSale'=>$pointSale->id]); ?>"><?= Html::encode($pointSale->name) ?></a>
</li>
<?php endforeach; ?>
</ul>

<?= implode(', ', $users); ?>
<?= implode(', ', $usersArray); ?>


+ 36
- 40
backend/views/user/index.php View File

@@ -39,12 +39,12 @@ termes.
use yii\helpers\Html;
use yii\grid\GridView;
use common\models\User ;
use common\models\Commande ;
use common\models\Order ;

/* @var $this yii\web\View */
/* @var $dataProvider yii\data\ActiveDataProvider */

$this->title = 'Clients';
$this->title = 'Utilisateurs';
$this->params['breadcrumbs'][] = $this->title;
?>

@@ -56,49 +56,49 @@ $this->params['breadcrumbs'][] = $this->title;
</h1>
<ul id="tabs-points-vente" class="nav nav-tabs" role="tablist">
<li class="<?php if(!$id_point_vente_active && !$section_clients_inactifs): ?>active<?php endif; ?>">
<li class="<?php if(!$idPointSaleActive && !$sectionInactiveUsers): ?>active<?php endif; ?>">
<a href="<?= Yii::$app->urlManager->createUrl(['user/index']); ?>">Tous</a>
</li>
<?php foreach($points_vente as $pv): ?>
<li class="<?php if($id_point_vente_active == $pv->id): ?>active<?php endif; ?>">
<a href="<?= Yii::$app->urlManager->createUrl(['user/index','id_point_vente'=>$pv->id]); ?>"><?= Html::encode($pv->nom) ?></a>
<?php foreach($pointsSaleArray as $pointSale): ?>
<li class="<?php if($idPointSaleActive == $pointSale->id): ?>active<?php endif; ?>">
<a href="<?= Yii::$app->urlManager->createUrl(['user/index','idPointSale' => $pointSale->id]); ?>"><?= Html::encode($pointSale->name) ?></a>
</li>
<?php endforeach; ?>
<li class="<?php if($section_clients_inactifs): ?>active<?php endif; ?>">
<a href="<?= Yii::$app->urlManager->createUrl(['user/index','section_clients_inactifs' => 1]); ?>">Inactifs</a>
<li class="<?php if($sectionInactiveUsers): ?>active<?php endif; ?>">
<a href="<?= Yii::$app->urlManager->createUrl(['user/index','sectionInactiveUsers' => 1]); ?>">Inactifs</a>
</li>
</ul>

<?= Html::a('<span class="glyphicon glyphicon-envelope"></span> Liste des emails', ['mail', 'id_point_vente' => $id_point_vente_active], ['class' => 'btn btn-default btn-liste-emails']) ?>
<?= Html::a('<span class="glyphicon glyphicon-envelope"></span> Liste des emails', ['mail', 'idPointSale' => $idPointSaleActive], ['class' => 'btn btn-default btn-liste-emails']) ?>
<?= GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => true,
'columns' => [
[
'attribute' => 'nom',
'attribute' => 'lastname',
'filter' => Html::input(
'string',
'nom',
isset(Yii::$app->request->queryParams['nom']) ? Html::encode(Yii::$app->request->queryParams['nom']) : '',
'lastname',
isset(Yii::$app->request->queryParams['lastname']) ? Html::encode(Yii::$app->request->queryParams['lastname']) : '',
[ 'class' => 'form-control']
)
],
[
'attribute' => 'prenom',
'attribute' => 'name',
'filter' => Html::input(
'string',
'prenom',
isset(Yii::$app->request->queryParams['prenom']) ? Html::encode(Yii::$app->request->queryParams['prenom']) : '',
'name',
isset(Yii::$app->request->queryParams['name']) ? Html::encode(Yii::$app->request->queryParams['name']) : '',
['class' => 'form-control']
)
],
[
'attribute' => 'telephone',
'attribute' => 'phone',
'filter' => Html::input(
'string',
'telephone',
isset(Yii::$app->request->queryParams['telephone']) ? Html::encode(Yii::$app->request->queryParams['telephone']) : '',
'phone',
isset(Yii::$app->request->queryParams['phone']) ? Html::encode(Yii::$app->request->queryParams['phone']) : '',
['class' => 'form-control']
)
],
@@ -120,35 +120,31 @@ $this->params['breadcrumbs'][] = $this->title;
}
],
[
'attribute' => 'date_derniere_connexion',
'attribute' => 'date_last_connection',
'label' => 'Dernière connexion',
'value' => function($model) {
if(isset($model['date_derniere_connexion']))
return date('d/m/Y à H:i', strtotime($model['date_derniere_connexion']));
if(isset($model['date_last_connection']))
return date('d/m/Y à H:i', strtotime($model['date_last_connection']));
else
return '' ;
}
],
[
'class' => 'yii\grid\ActionColumn',
'template' => '{commandes}',
'template' => '{orders}',
'headerOptions' => ['class' => 'actions'],
'buttons' => [
'commandes' => function ($url, $model) {
$url = Yii::$app->urlManager->createUrl(['user/commandes','id' => $model['user_id']]) ;
$count_commandes = Commande::find()
->joinWith('production')
->where([
'id_user' => $model['user_id'],
'production.id_etablissement' => Yii::$app->user->identity->id_etablissement])
->andWhere('date_delete IS NULL')
->count() ;
'orders' => function ($url, $model) {
$url = Yii::$app->urlManager->createUrl(['user/orders','id' => $model['user_id']]) ;
$countOrders = Order::searchCount([
'id_user' => $model['user_id']
], ['conditions' => 'date_delete IS NULL']) ;
$html = '' ;
if($count_commandes)
{
if($countOrders) {
$s = '' ;
if($count_commandes > 1) $s = 's' ;
$html .= Html::a('<span class="glyphicon glyphicon-eye-open"></span> '.$count_commandes.' commande'.$s, $url, [
if($countOrders > 1) $s = 's' ;
$html .= Html::a('<span class="glyphicon glyphicon-eye-open"></span> '.$countOrders.' commande'.$s, $url, [
'title' => Yii::t('app', 'Commandes'), 'class' => 'btn btn-default '
]); ;
}
@@ -163,11 +159,11 @@ $this->params['breadcrumbs'][] = $this->title;
[
'attribute' => 'credit',
'format' => 'raw',
'value' => function($model) use($etablissement) {
'value' => function($model) use($producer) {
if(!isset($model['credit'])) $model['credit'] = 0 ;
$user = User::findOne($model['user_id']) ;
$html = '<div class="input-group">
<input type="text" class="form-control input-credit" readonly="readonly" value="'.number_format($user->getCredit($etablissement->id),2).' €" placeholder="">
<input type="text" class="form-control input-credit" readonly="readonly" value="'.number_format($user->getCredit($producer->id),2).' €" placeholder="">
<span class="input-group-btn">
'.Html::a(
'<span class="glyphicon glyphicon-euro"></span> Crédit',
@@ -189,8 +185,8 @@ $this->params['breadcrumbs'][] = $this->title;
'buttons' => [
'update' => function ($url, $model) {
$url = Yii::$app->urlManager->createUrl(['user/update','id' => $model['user_id']]) ;
$user = User::find()->with('userEtablissement')->where(['id' => $model['user_id']])->one() ;
if(count($user->userEtablissement) <= 1)
$user = User::find()->with('userProducer')->where(['id' => $model['user_id']])->one() ;
if(count($user->userProducer) <= 1)
{
return Html::a('<span class="glyphicon glyphicon-pencil"></span> Modifier', $url, [
'title' => Yii::t('app', 'Modifier'), 'class' => 'btn btn-default'
@@ -201,7 +197,7 @@ $this->params['breadcrumbs'][] = $this->title;
}
},
'delete' => function($url, $model) {
if($model['actif']) {
if($model['active']) {
return Html::a('<span class="glyphicon glyphicon-trash"></span> Supprimer', Yii::$app->urlManager->createUrl(array_merge(['user/delete','id' => $model['user_id']], Yii::$app->getRequest()->getQueryParams())), [
'title' => Yii::t('app', 'Supprimer'), 'class' => 'btn btn-default'
]);

+ 0
- 78
backend/views/user/mail.php View File

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

/**
Copyright La boîte à pain (2018)

contact@laboiteapain.net

Ce logiciel est un programme informatique servant à aider les producteurs
à distribuer leur production en circuits courts.

Ce logiciel est régi par la licence CeCILL soumise au droit français et
respectant les principes de diffusion des logiciels libres. Vous pouvez
utiliser, modifier et/ou redistribuer ce programme sous les conditions
de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA
sur le site "http://www.cecill.info".

En contrepartie de l'accessibilité au code source et des droits de copie,
de modification et de redistribution accordés par cette licence, il n'est
offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons,
seule une responsabilité restreinte pèse sur l'auteur du programme, le
titulaire des droits patrimoniaux et les concédants successifs.

A cet égard l'attention de l'utilisateur est attirée sur les risques
associés au chargement, à l'utilisation, à la modification et/ou au
développement et à la reproduction du logiciel par l'utilisateur étant
donné sa spécificité de logiciel libre, qui peut le rendre complexe à
manipuler et qui le réserve donc à des développeurs et des professionnels
avertis possédant des connaissances informatiques approfondies. Les
utilisateurs sont donc invités à charger et tester l'adéquation du
logiciel à leurs besoins dans des conditions permettant d'assurer la
sécurité de leurs systèmes et ou de leurs données et, plus généralement,
à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.

Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
pris connaissance de la licence CeCILL, et que vous en avez accepté les
termes.
*/

use yii\helpers\Html;
use yii\bootstrap\ActiveForm;

/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/

$this->title = 'Envoi d\'un email à tous les utilisateurs';

?>

<h1><?= Html::encode($this->title) ?></h1>

<?php

$form = ActiveForm::begin(['id' => 'email-masse-form','enableClientValidation' => false]); ?>
<?= $form->field($model, 'subject') ?>
<?= $form->field($model, 'body')->textArea(['rows' => 6]) ?>

<div class="form-group">
<label class="control-label">Envoyer à</label>
<p>Cliquer sur les utilisateurs pour modifier leur état.<br />
Légende : <span class="label label-default">à envoyer</span> <span class="label label-danger">ne pas envoyer</span> <span class="label label-success">envoyé</span></p>
<div id="ids-users">
<?php foreach($users as $u): ?>
<a href="javascript:void(0);" class="label <?php if($u->no_mail): ?>label-danger<?php else: ?>label-default<?php endif; ?>" data-send="0" data-id="<?php echo $u->id; ?>"><?php echo Html::encode($u->prenom.' '.$u->nom); ?></a>
<?php endforeach; ?>
</div>
<input name="id_user" type="hidden" value="" />
</div>
<br />

<div class="form-group">
<?= Html::submitButton('Envoyer', ['class' => 'btn btn-default', 'name' => 'email-masse-button']) ?>
</div>
<?php ActiveForm::end(); ?>



backend/views/user/commandes.php → backend/views/user/orders.php View File

@@ -38,18 +38,18 @@ termes.

use yii\helpers\Html;
use yii\widgets\ActiveForm;
use common\models\CreditHistorique;
use common\models\Etablissement;
use common\models\Commande;
use common\models\CreditHistory;
use common\models\Producer;
use common\models\Order;

$this->title = 'Commandes <small>'.Html::encode($user->nom.' '.$user->prenom).'</small>';
$this->title = 'Commandes <small>'.Html::encode($user->lastname.' '.$user->name).'</small>';
$this->params['breadcrumbs'][] = ['label' => 'Clients', 'url' => ['index']];
$this->params['breadcrumbs'][] = ['label' => Html::encode($user->nom.' '.$user->prenom)];
$this->params['breadcrumbs'][] = ['label' => Html::encode($user->lastname.' '.$user->name)];
$this->params['breadcrumbs'][] = 'Créditer';

?>

<div class="user-commandes">
<div class="user-orders">
<h1><?= $this->title ?> </h1>

+ 1
- 1
backend/views/user/update.php View File

@@ -43,7 +43,7 @@ use yii\helpers\Html;

$this->title = 'Modifier un client' ;
$this->params['breadcrumbs'][] = ['label' => 'Clients', 'url' => ['index']];
$this->params['breadcrumbs'][] = ['label' => Html::encode($model->nom.' '.$model->prenom)];
$this->params['breadcrumbs'][] = ['label' => Html::encode($model->lastname.' '.$model->name)];
$this->params['breadcrumbs'][] = 'Modifier';
?>
<div class="user-update">

+ 0
- 83
backend/views/user/view.php View File

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

/**
Copyright La boîte à pain (2018)

contact@laboiteapain.net

Ce logiciel est un programme informatique servant à aider les producteurs
à distribuer leur production en circuits courts.

Ce logiciel est régi par la licence CeCILL soumise au droit français et
respectant les principes de diffusion des logiciels libres. Vous pouvez
utiliser, modifier et/ou redistribuer ce programme sous les conditions
de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA
sur le site "http://www.cecill.info".

En contrepartie de l'accessibilité au code source et des droits de copie,
de modification et de redistribution accordés par cette licence, il n'est
offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons,
seule une responsabilité restreinte pèse sur l'auteur du programme, le
titulaire des droits patrimoniaux et les concédants successifs.

A cet égard l'attention de l'utilisateur est attirée sur les risques
associés au chargement, à l'utilisation, à la modification et/ou au
développement et à la reproduction du logiciel par l'utilisateur étant
donné sa spécificité de logiciel libre, qui peut le rendre complexe à
manipuler et qui le réserve donc à des développeurs et des professionnels
avertis possédant des connaissances informatiques approfondies. Les
utilisateurs sont donc invités à charger et tester l'adéquation du
logiciel à leurs besoins dans des conditions permettant d'assurer la
sécurité de leurs systèmes et ou de leurs données et, plus généralement,
à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.

Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
pris connaissance de la licence CeCILL, et que vous en avez accepté les
termes.
*/

use yii\helpers\Html;
use yii\widgets\DetailView;

/* @var $this yii\web\View */
/* @var $model common\models\User */

$this->title = $model->id;
$this->params['breadcrumbs'][] = ['label' => 'Clients', 'url' => ['index']];
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="user-view">

<h1><?= Html::encode($this->title) ?></h1>

<p>
<?= Html::a('Update', ['update', 'id' => $model->id], ['class' => 'btn btn-primary']) ?>
<?= Html::a('Delete', ['delete', 'id' => $model->id], [
'class' => 'btn btn-danger',
'data' => [
'confirm' => 'Are you sure you want to delete this item?',
'method' => 'post',
],
]) ?>
</p>

<?= DetailView::widget([
'model' => $model,
'attributes' => [
'id',
'username',
'auth_key',
'password_hash',
'password_reset_token',
'email:email',
'status',
'created_at',
'updated_at',
'nom',
'prenom',
'telephone',
'confiance',
],
]) ?>

</div>

BIN
backend/web/.sass-cache/2a0ffb00578c9d5a537db16d14c734a22b18f35c/screen.scssc View File


+ 378
- 415
backend/web/css/screen.css
File diff suppressed because it is too large
View File


+ 63
- 76
backend/web/js/lechatdesnoisettes.js View File

@@ -75,9 +75,9 @@ function chat_nl2br(str, is_xhtml) {

function chat_index_commandes_points_vente_livraison() {
$('#productionpointvente-productions_point_vente input[type=checkbox]').change(function() {
$('#pointsaledistribution-points_sale_distribution input[type=checkbox]').change(function() {
var nb = $('#productionpointvente-productions_point_vente input[type=checkbox]:checked').size() ;
var nb = $('#pointsaledistribution-points_sale_distribution input[type=checkbox]:checked').size() ;
if(nb == 0) {
$(this).prop('checked',true) ;
@@ -91,10 +91,10 @@ function chat_index_commandes_points_vente_livraison() {
if($(this).prop('checked'))
livraison = 1 ;

$.get(UrlManager.getBaseUrl()+'commande/ajax-point-vente-livraison',{
id_production: arr_val[0],
id_point_vente: arr_val[1],
bool_livraison: livraison
$.get(UrlManager.getBaseUrl()+'order/ajax-point-sale-delivery',{
idDistribution: arr_val[0],
idPointSale: arr_val[1],
boolDelivery: livraison
}, function(data) {
chat_alert('success','Point de vente modifié') ;
}) ;
@@ -108,7 +108,7 @@ function chat_index_commandes_points_vente_livraison() {
function chat_index_commandes_maj_points_vente() {
if($('#productions-point-vente').size()) {
var nb = $('#productionpointvente-productions_point_vente input[type=checkbox]:checked').size() ;
var nb = $('#pointsaledistribution-points_sale_distribution input[type=checkbox]:checked').size() ;
if(nb == 0)
{
$('#panel-commandes #tabs-points-vente, #panel-commandes #commandes-points-vente').hide() ;
@@ -123,10 +123,11 @@ function chat_index_commandes_maj_points_vente() {
var id_production = $('#id-production').val() ;
if(id_production) {
$('#tabs-points-vente li').each(function() {
var id_point_vente = $(this).find('a').attr('id').replace('btn-point-vente-','') ;
var nb_commandes = parseInt($(this).find('.badge-success').html()) ;
var checked = $('#productionpointvente-productions_point_vente input[value='+id_production+'-'+id_point_vente+']').prop('checked') ;
var checked = $('#pointsaledistribution-points_sale_distribution input[value='+id_production+'-'+id_point_vente+']').prop('checked') ;
if(checked || nb_commandes > 0)
{
$(this).show() ;
@@ -159,20 +160,20 @@ function chat_points_vente_jours_livraison_event() {

function chat_points_vente_acces() {
// affichage du bloc acces restreint
$('#pointvente-acces_restreint').change(function() {
$('#pointsale-restricted_access').change(function() {
chat_points_vente_acces_event() ;
}) ;
chat_points_vente_acces_event() ;
// affichage du champs commentaire
$('#pointvente-users input[type=checkbox]').change(function() {
$('#pointsale-users input[type=checkbox]').change(function() {
chat_points_vente_commentaire_event() ;
}) ;
chat_points_vente_commentaire_event() ;
}

function chat_points_vente_commentaire_event() {
$('#pointvente-users input[type=checkbox]').each(function() {
$('#pointsale-users input[type=checkbox]').each(function() {
if($(this).prop('checked')) {
$(this).parent().find('.commentaire').fadeIn() ;
}
@@ -183,24 +184,24 @@ function chat_points_vente_commentaire_event() {
}

function chat_points_vente_acces_event() {
if($('#pointvente-acces_restreint').prop('checked')) {
$('#pointvente-users').fadeIn() ;
if($('#pointsale-restricted_access').prop('checked')) {
$('#pointsale-users').fadeIn() ;
}
else {
$('#pointvente-users').hide() ;
$('#pointsale-users').hide() ;
}
}

function chat_select_etablissement() {
$('select[name="select_etablissement"]').change(function() {
window.location.href = UrlManager.getBaseUrlAbsolute()+'/site/change-etablissement?id='+$(this).val() ;
$('select[name="select_producer"]').change(function() {
window.location.href = UrlManager.getBaseUrlAbsolute()+'/site/change-producer?id='+$(this).val() ;
}) ;
}

function chat_commandeauto() {
// dates
$('#commandeautoform-date_debut, #commandeautoform-date_fin').datepicker() ;
$('#subscriptionform-date_begin, #subscriptionform-date_end').datepicker() ;
}

@@ -235,9 +236,9 @@ function chat_index_commandes_points_vente() {
var id_commande = $(this).data('id-commande') ;
$(this).attr('disabled', 'disabled') ;

$.get(UrlManager.getBaseUrl()+'commande/ajax-delete',{
$.get(UrlManager.getBaseUrl()+'order/ajax-delete',{
date: $('#date-production').val(),
id_commande: id_commande
idOrder: id_commande
}, function(data) {
$('#point-vente-'+id_pv+' .btn-remove').removeAttr('disabled') ;

@@ -260,7 +261,7 @@ function chat_index_commandes_points_vente() {
$('#point-vente-'+id_pv+' .creer-commande').trigger('click') ;
}
}
chat_index_commandes_maj_recap_pv(id_pv, data.total_pv) ;
chat_index_commandes_maj_recap_pv(id_pv, data.total_point_sale) ;
chat_index_commandes_maj_total_commandes() ;
chat_alert('success','Commande supprimée') ;
}, 'json') ;
@@ -293,22 +294,22 @@ function chat_index_commandes_points_vente() {

$(this).attr('disabled', 'disabled') ;

$.get(UrlManager.getBaseUrl()+'commande/ajax-create',{
$.get(UrlManager.getBaseUrl()+'order/ajax-create',{
date: $('#date-production').val(),
id_pv: id_pv,
id_user: $('#point-vente-'+id_pv+' .user-id').val(),
idPointSale: id_pv,
idUser: $('#point-vente-'+id_pv+' .user-id').val(),
username: $('#point-vente-'+id_pv+' .username').val(),
produits: JSON.stringify(tab_produits),
commentaire: $('#point-vente-'+id_pv+' .textarea-commentaire').val()
products: JSON.stringify(tab_produits),
comment: $('#point-vente-'+id_pv+' .textarea-commentaire').val()
}, function(data) {
$('#point-vente-'+id_pv+' .btn-save').removeAttr('disabled') ;
$('#point-vente-'+id_pv+' .btn-save').removeClass('is-create') ;

$('#point-vente-'+id_pv+' .liste-commandes').append(data.commande) ;
$('#point-vente-'+id_pv+' .liste-commandes').append(data.order) ;

chat_index_commandes_points_vente() ;

chat_index_commandes_maj_recap_pv(id_pv, data.total_pv) ;
chat_index_commandes_maj_recap_pv(id_pv, data.total_point_sale) ;

$('#point-vente-'+id_pv+' .buttons-edit-remove').show() ;
$('#point-vente-'+id_pv+' .buttons-save-cancel').hide() ;
@@ -329,20 +330,20 @@ function chat_index_commandes_points_vente() {
var id_commande = $(this).data('id-commande') ;

$(this).attr('disabled', 'disabled') ;
$.get(UrlManager.getBaseUrl()+'commande/ajax-update',{
id_commande: id_commande,
produits: JSON.stringify(tab_produits),
$.get(UrlManager.getBaseUrl()+'order/ajax-update',{
idOrder: id_commande,
products: JSON.stringify(tab_produits),
date: $('#date-production').val(),
commentaire: $('#point-vente-'+id_pv+' .textarea-commentaire').val()
comment: $('#point-vente-'+id_pv+' .textarea-commentaire').val()
}, function(data) {
$('#point-vente-'+id_pv+' .btn-save').removeAttr('disabled') ;
$('#point-vente-'+id_pv+' a[data-id-commande='+id_commande+']').attr('data-commande',data.json_commande);
$('#point-vente-'+id_pv+' a[data-id-commande='+id_commande+'] .montant').html(data.json_commande.str_montant) ;
$('#point-vente-'+id_pv+' a[data-id-commande='+id_commande+']').attr('data-commande',data.json_order);
$('#point-vente-'+id_pv+' a[data-id-commande='+id_commande+'] .montant').html(data.json_order.str_amount) ;
chat_index_commandes_affiche_commande(id_pv, id_commande) ;
chat_index_commandes_maj_recap_pv(id_pv, data.total_pv) ;
chat_index_commandes_maj_recap_pv(id_pv, data.total_point_sale) ;

$('#point-vente-'+id_pv+' .buttons-edit-remove').show() ;
$('#point-vente-'+id_pv+' .buttons-save-cancel').hide() ;
@@ -361,6 +362,7 @@ function chat_index_commandes_points_vente() {

// create
$('.creer-commande').unbind('click').click(function() {
var id_pv = $(this).data('pv-id') ;
$('#point-vente-'+id_pv+' .bloc-commande').fadeIn() ;
$('#point-vente-'+id_pv+' .liste-commandes a.active').removeClass('active') ;
@@ -373,12 +375,6 @@ function chat_index_commandes_points_vente() {
$('#point-vente-'+id_pv+' .choix-user .username').val('') ;
$('#point-vente-'+id_pv+' .commentaire').hide() ;
$('#point-vente-'+id_pv+' .btn-save').addClass('is-create');

/*if(!$('#point-vente-'+id_pv+' .btn-cancel').data('id-commande') &&
$('#point-vente-'+id_pv+' .liste-commandes li').size()) {
$('#point-vente-'+id_pv+' .btn-cancel').data('id-commande',$('#point-vente-'+id_pv+' .liste-commandes li:first a').data('id-commande')) ;
}*/

$('#point-vente-'+id_pv+' .btn-save').data('id-commande',0) ;

chat_index_commandes_inputs_commande(id_pv, false) ;
@@ -395,10 +391,10 @@ function chat_index_commandes_points_vente() {
}

function chat_index_commandes_maj_total_commandes() {
$.get(UrlManager.getBaseUrl()+'commande/ajax-total-commandes',{
$.get(UrlManager.getBaseUrl()+'order/ajax-total-orders',{
date: $('#date-production').val()
}, function(data) {
$('#bloc-totaux').html(data.html_totaux) ;
$('#bloc-totaux').html(data.html_totals) ;
}, 'json') ;
}

@@ -517,22 +513,21 @@ function chat_index_commandes_affiche_commande(id_pv, id_commande) {
$('#point-vente-'+id_pv+' a[data-id-commande='+id_commande+'] .montant .glyphicon').remove() ;
$('#point-vente-'+id_pv+' a[data-id-commande='+id_commande+'] .montant').html() ;

$('#point-vente-'+id_pv+' a[data-id-commande='+id_commande+'] .montant').html(commande.str_montant) ;
if(commande.montant_paye >= commande.montant) {
$('#point-vente-'+id_pv+' a[data-id-commande='+id_commande+'] .montant').html(commande.str_amount) ;
if(commande.paid_amount >= commande.amount) {
$('#point-vente-'+id_pv+' a[data-id-commande='+id_commande+'] .montant').addClass('paye') ;

if(commande.montant_paye > commande.montant) {
if(commande.paid_amount > commande.amount) {
$('#point-vente-'+id_pv+' a[data-id-commande='+id_commande+'] .montant').append(' <span class="glyphicon glyphicon-warning-sign"></span>') ;
}
}
// commentaire
if(commande.commentaire && commande.commentaire.length) {
if(commande.comment && commande.comment.length) {
if(!$('#point-vente-'+id_pv+' a[data-id-commande='+id_commande+'] .glyphicon-comment').size()) {
$('#point-vente-'+id_pv+' a[data-id-commande='+id_commande+']').append(' <span class="glyphicon glyphicon-comment"></span>') ;
}
console.log(id_pv+' '+commande.commentaire) ;
$('#point-vente-'+id_pv+' .commentaire').html(chat_nl2br(commande.commentaire)).show() ;
$('#point-vente-'+id_pv+' .commentaire').html(chat_nl2br(commande.comment)).show() ;
}
else {
$('#point-vente-'+id_pv+' a[data-id-commande='+id_commande+'] .glyphicon-comment').remove() ;
@@ -558,21 +553,13 @@ function chat_index_commandes_affiche_commande(id_pv, id_commande) {
$('#point-vente-'+id_pv+' .td-total').html('') ;
$('#point-vente-'+id_pv+' tr').removeClass('active') ;

$.each(commande.produits, function(i, item) {
$.each(commande.products, function(i, item) {
$('#point-vente-'+id_pv+' .produit-'+i+' .td-commande').html(item) ;
$('#point-vente-'+id_pv+' .produit-'+i).addClass('active') ;
}) ;
$('#point-vente-'+id_pv+' .td-total').html('<span>'+commande.str_montant+'</span>') ;
$('#point-vente-'+id_pv+' .td-total').html('<span>'+commande.str_amount+'</span>') ;
$('#point-vente-'+id_pv+' .tr-total').show() ;

/*var commentaire = link.data('commentaire') ;
if(commentaire) {
$('#point-vente-'+id_pv+' .commentaire').html(commentaire).show() ;
}
else {
$('#point-vente-'+id_pv+' .commentaire').hide() ;
}*/

$('#point-vente-'+id_pv+' .title-user span.the-title').html(link.find('.user').html()+" <small>"+link.data('date')+"</small>") ;

$('#point-vente-'+id_pv+' .bloc-commande').fadeIn() ;
@@ -580,11 +567,11 @@ function chat_index_commandes_affiche_commande(id_pv, id_commande) {
$('#point-vente-'+id_pv+' .tr-total').show() ;

// paiement
$.get(UrlManager.getBaseUrl()+'commande/statut-paiement',{
id_commande: id_commande
$.get(UrlManager.getBaseUrl()+'order/payment-status',{
idOrder: id_commande
}, function(data) {
$('#point-vente-'+id_pv+' .bloc-commande .td-paiement').html(data.html_statut_paiement) ;
$('#point-vente-'+id_pv+' a[data-id-commande='+id_commande+']').attr('data-commande',data.json_commande) ;
$('#point-vente-'+id_pv+' .bloc-commande .td-paiement').html(data.html_payment_status) ;
$('#point-vente-'+id_pv+' a[data-id-commande='+id_commande+']').attr('data-commande',data.json_order) ;
chat_index_commandes_boutons_paiement(id_pv, id_commande) ;
},'json') ;
}
@@ -596,17 +583,17 @@ function chat_index_commandes_affiche_commande(id_pv, id_commande) {
function chat_index_commandes_boutons_paiement(id_pv, id_commande) {
// boutons paiement/remboursement
$('#point-vente-'+id_pv+' .payer, #point-vente-'+id_pv+' .rembourser').click(function() {
$(this).attr('disabled','disabled') ;
$.get(UrlManager.getBaseUrl()+'commande/paiement',{
id_commande: id_commande,
type: $(this).data('type'),
montant: $(this).data('montant')
}, function(data) {
$('#point-vente-'+id_pv+' .bloc-commande .td-paiement').html(data.html_statut_paiement) ;
$('#point-vente-'+id_pv+' a[data-id-commande='+id_commande+']').attr('data-commande',data.json_commande) ;
chat_index_commandes_affiche_commande(id_pv, id_commande) ;
chat_index_commandes_boutons_paiement(id_pv, id_commande) ;
}, 'json') ;
$(this).attr('disabled','disabled') ;
$.get(UrlManager.getBaseUrl()+'order/payment',{
idOrder: id_commande,
type: $(this).data('type'),
amount: $(this).data('montant')
}, function(data) {
$('#point-vente-'+id_pv+' .bloc-commande .td-paiement').html(data.html_payment_status) ;
$('#point-vente-'+id_pv+' a[data-id-commande='+id_commande+']').attr('data-commande',data.json_order) ;
chat_index_commandes_affiche_commande(id_pv, id_commande) ;
chat_index_commandes_boutons_paiement(id_pv, id_commande) ;
}, 'json') ;
}) ;
}

@@ -723,7 +710,7 @@ function chat_datepicker() {

function chat_calendar() {
if($('#page-commande').size()) {
if($('#page-order').size()) {
var events = new Array ;
$('ul#jours-production li').each(function() {
var date = $(this).html() ;
@@ -749,7 +736,7 @@ function chat_calendar() {
dayClick: function(date, jsEvent, view) {
var url = $(location).attr('href') ;
var tab_url = url.split('?') ;
$(location).attr('href',tab_url[0]+'?r=commande/index&date='+date.format());
$(location).attr('href',tab_url[0]+'?r=order/index&date='+date.format());
},
eventRender: function (event, element) {
var dataToFind = moment(event.start).format('YYYY-MM-DD');

+ 80
- 132
backend/web/sass/screen.scss View File

@@ -209,7 +209,7 @@ a {
}
}

.nom-boulange {
.name-producer {
//font-family: 'Georgia' ;
margin-bottom: 15px ;
text-align: left ;
@@ -228,23 +228,7 @@ a {
border-bottom: solid 1px #e0e0e0 ;
@include box-shadow(0px 0px 5px gray) ;
#etat-paiement-etablissement {
float: right ;
text-align: right ;
color: darken($color1,15) ;
font-size: 16px ;
.strong {
background-color: white ;
color: $color1 ;
@include border-radius(10px) ;
padding: 0px 10px ;
}
.btn {
padding: 2px 5px ;
}
}
#select-etablissement {
#select-producer {
float: left ;
font-size: 15px ;
}
@@ -289,7 +273,6 @@ a {
a {
margin-right: 5px ;
margin-left: 5px ;
//text-transform: uppercase ;
color: gray ;
}
}
@@ -303,9 +286,9 @@ a {

// liste de commandes
.site-index, .user-commandes {
#dernieres-commandes, #historique-commandes {
#last-orders, #history-orders {

tr.commande-update {
tr.order-update {
td {
background-color: $color2 ;
}
@@ -314,7 +297,7 @@ a {
}
}
tr.commande-delete {
tr.order-delete {
td {
background-color: lighten(#C9302C, 40);
}
@@ -323,42 +306,34 @@ a {
}
}
td.historique {
td.history {
min-width: 170px ;
.small {
margin-bottom: 7px ;
}
strong {
//margin-left: 15px ;
}
/*.label {
color: gray ;
border: solid 1px gray ;
}*/
}

.small, .localite {
.small, .locality {
font-size: 12px ;
color: gray ;
}
.commentaire {
.comment {
font-size: 12px ;
}

.date {
text-align: center ;

.bloc-date {
.block-date {
width: 50% ;
margin: 0px auto ;
padding-top: 0px ;
}



.jour {
.day {
text-transform: capitalize ;
line-height: 13px ;
font-size: 10px ;
@@ -371,7 +346,7 @@ a {
font-weight: bold ;
}

.mois {
.month {
text-transform: uppercase ;
line-height: 13px ;
font-size: 15px ;
@@ -404,21 +379,21 @@ a {
}
}
#facturation {
#billing {
h2 {
font-size: 25px ;
text-align: center ;
}
.mois-en-cours {
.montant span {
.current-month {
.amount span {
background-color: white ;
color: #333 ;
border: solid 1px gray ;
}
}
.montant {
.amount {
margin-top: 35px ;
text-align: center ;
span {
@@ -434,16 +409,16 @@ a {
}

#page-commande {
#page-order {

#row2 {
}
h1 {
.btn-group {
float: right ;
}
.btn-group {
float: right ;
}
}
#col-left, #col-right {
@@ -459,7 +434,6 @@ a {
}
#calendar {
h2 {
font-size: 20px ;
position: relative ;
@@ -542,8 +516,6 @@ a {
#produits-production {
.overflow {
//max-height: 400px ;
//overflow-y: scroll ;
table {
width: 100%;
@@ -561,7 +533,6 @@ a {
thead th {
height: 30px;

/*text-align: left;*/
}

tbody {
@@ -585,19 +556,19 @@ a {
.td-produit {
width: 60% ;
}
.td-actif, .td-max {
.td-active, .td-max {
width: 20% ;
text-align: center ;
}
thead {
.td-produit {
.td-product {
width: 57% ;
}
}
}
input.quantite-max {
input.quantity-max {
background-color: white;
border: 1px solid #e0e0e0;
text-align: center;
@@ -638,7 +609,7 @@ a {
}
#bloc-totaux {
.table-produits {
.table-products {
.depasse {
color: #b32815 ;
}
@@ -663,12 +634,11 @@ a {
display: none;
}
}
.recettes {
float: right ;
color: $color1 ;
//background-color: $color1 ;
border: solid 1px $color1 ;
padding: 4px 10px ;
@include border-radius(10px) ;
font-weight: bold ;
@@ -677,7 +647,7 @@ a {
}
}
.alert.commentaire {
.alert.comment {
display: none ;
}
@@ -686,7 +656,6 @@ a {
list-style-type: none ;
height: 100% ;
max-height: 400px ;
//border: solid 1px #e0e0e0 ;
margin-left: 0 ;
padding-left: 0 ;
margin-top: 0px ;
@@ -705,7 +674,6 @@ a {
@include border-radius(0px) ;
display: block ;
padding: 7px ;
//border-bottom: solid 1px #e0e0e0 ;
color: #333 ;
.montant {
@@ -725,10 +693,7 @@ a {
&:hover, &:active, &.active {
text-decoration: none ;
//background-color: #F5F5F5 ;
//background-color: lighten($color2,5) ;
background-color: #FCF8E3 ;
//border-right: solid 3px $color1 ;
outline: none ;
border-color: #ccc ;
@include transition(all 0.1s) ;
@@ -781,16 +746,15 @@ a {
}
table.table-produits {
.td-commande {
.td-order {
text-align: center ;
}
input.form-control {
//width: 100px ;
text-align: center ;
}
tr.disabled {
.td-produit {
.td-product {
color: gray ;
}
}
@@ -834,14 +798,14 @@ a {
}
}
.panel-commande-automatique {
.field-commandeautoform-id_user,
.field-commandeautoform-id_etablissement
.panel-commande-auto {
.field-subscriptionform-id_user,
.field-subscriptionform-id_producer
{
display: none ;
}
.jours {
.days {
.form-group {
float: left ;
margin-right: 10px ;
@@ -863,7 +827,7 @@ a {
border-bottom: solid 1px #e0e0e0 ;
}
.title-point-vente {
.title-point-sale {
background-color: lighten(#fdd44b, 30) ;
border-left: solid 3px $color1 ;
font-weight: bold ;
@@ -871,7 +835,7 @@ a {
padding: 10px ;
}
.title-totaux {
.title-totals {
text-align: center ;
}
@@ -883,19 +847,18 @@ a {
border-right: solid 1px #e0e0e0 ;
}
input.quantite {
//width: 50px ;
input.quantity {
width: 30px ;
background-color: white ;
border: solid 1px #e0e0e0 ;
text-align: center ;
}
.td-produit {
.td-product {
text-align: center ;
}
.submit-pv {
.submit-point-sale {
float: right ;
}
@@ -904,7 +867,7 @@ a {
border: solid 1px #e0e0e0 ;
}
.date-commande {
.date-order {
font-size: 12px ;
}
@@ -920,8 +883,6 @@ a {
text-align: center ;
}
.depasse {
color: #b32815 ;
}
@@ -930,15 +891,11 @@ a {
font-weight: normal ;
font-size: 13px ;
}
.vrac {
display: none ;
}
td.client {

td.user {
text-align: left ;
padding: 3px ;
.date-commande {
.date-order {
color: gray ;
}
}
@@ -1023,18 +980,8 @@ a {
}


#email-masse-form {
#ids-users {
line-height: 30px ;
.label {
text-transform: capitalize ;
}
}
}

.produit-create, .produit-update {
#jours-production {
.product-create, .product-update {
#days-distribution {
.form-group {
float: left ;
margin-right: 15px ;
@@ -1044,7 +991,7 @@ a {
}
}
}
.field-produit-id_etablissement {
.field-product-id_producer {
display: none;
}
}
@@ -1053,12 +1000,12 @@ a {
background-color: white ;
}

.wrap .produit-index {
.wrap .product-index {
.td-photo {
max-width: 100px ;
width: 100px ;
}
.photo-produit {
.photo-product {
max-width: 100px ;
}
@@ -1070,7 +1017,8 @@ a {

/* communiquer */

.communiquer-mode-emploi {
.communicate-instructions {
border: solid 1px #e0e0e0 ;
padding: 10px ;
@include border-radius(10px) ;
@@ -1079,6 +1027,7 @@ a {
.header {
.logo {
display: none ;
float: left ;
width: 75px ;
padding-right: 20px ;
@@ -1086,7 +1035,6 @@ a {
img {
width: 75px ;
}
}
@@ -1112,14 +1060,14 @@ a {
h3 {
font-family: 'comfortaalight' ;
font-family: 'myriadpro-regular' ;
font-size: 25px ;
font-size: 20px ;
color: $color1 ;
margin-top: 0px ;
margin-bottom: 0px ;
}
}

.communiquer-mode-emploi-encart {
.communicate-instructions-inset {
width: 420px ;
margin-top: 20px ;
.header {
@@ -1149,18 +1097,18 @@ a {
}
}

.bloc-mode-emploi-pdf {
.block-instructions-pdf {
width: 49.9% ;
float: left;
border-bottom: dotted 1px gray ;
}

.bloc-mode-emploi-border {
.block-instructions-border {
border-right: dotted 1px gray ;
border-bottom: dotted 1px gray ;
}

.communiquer-mode-emploi-pdf {
.communicate-instructions-pdf {
border: 0px none ;
//border-bottom: dotted 1px gray ;
@include border-radius(0px) ;
@@ -1191,17 +1139,17 @@ a {
}
}

.bloc-mode-emploi-bottom {
.block-instructions-bottom {
border-bottom: 0px none ;
border-bottom: solid 1px white;
}


/* commandes auto */
/* abonnements */

.commandeauto-form {
.subscription-form {
#bloc-select-user {
#block-select-user {
padding-left: 0px ;
}
@@ -1214,21 +1162,21 @@ a {
}
}
.field-commandeautoform-id_etablissement {
.field-subscriptionform-id_producer {
display: none ;
}
.jours {
.days {
.form-group {
float: left;
margin-right: 20px ;
}
}
.produits {
.products {
.table {
width: 500px ;
}
.quantite {
.quantity {
text-align: center ;
}
}
@@ -1236,8 +1184,8 @@ a {

/* points de vente */

.point-vente-form {
#pointvente-users {
.point-sale-form {
#pointsale-users {
display: none ;
height: 500px ;
overflow-y: scroll ;
@@ -1245,14 +1193,14 @@ a {
font-weight: normal ;
display: block ;
}
.commentaire {
.comment {
display: none ;
margin-left: 17px ;
width: 200px ;
}
}
#jours-livraison {
#delivery-days {
.form-group {
float: left ;
margin-right: 15px ;
@@ -1275,7 +1223,7 @@ a {
}
}
#tabs-points-vente {
#tabs-points-sale {
margin-bottom: 20px ;
}
@@ -1302,14 +1250,14 @@ a {

/* facturation */

#estimation-facture {
#free-price {
padding: 20px ;
background-color: #F9F9F9 ;

h2 {
font-family: 'myriadpro-it' ;
}
.montant {
.amount {
span {
font-size: 25px ;
color: white ;
@@ -1331,19 +1279,19 @@ a {
}
}
.field-etablissement-prix_libre {
.field-producer-free_price {
.input-group {
width: 200px ;
}
}
.field-user-prix_libre {
.field-user-free_price {
label {
display: none ;
}
}
#etablissement-prix_libre {
#producer-free_price {
width: 100px ;
height: 60px ;
font-size: 30px ;
@@ -1352,8 +1300,8 @@ a {
}
}

.developpement-index {
ul#tabs-statuts-developpements {
.development-index {
ul#tabs-status-developments {
margin-bottom: 30px ;
border-bottom: solid 3px $color1 ;
@@ -1370,19 +1318,19 @@ a {
}
}
#tab-developpements {
.btn-group-priorite {
#tab-developments {
.btn-group-priority {
width: 100% ;
margin-bottom: 5px ;

.btn-priorite {
.btn-priority {
display: block ;
float: none ;
width: 100% ;
}
}
.label-priorite {
.label-priority {
display: block ;
width: 100% ;
margin-bottom: 2px ;
@@ -1393,13 +1341,13 @@ a {

/* stats */

.stats-produits {
.stats-products {
#nav-year {
float: right ;
}
tr.mois {
tr.month {
th {
text-align: center ;
}
@@ -1411,7 +1359,7 @@ a {
}
}
td.nom {
td.name {
text-transform: uppercase ;
}

+ 214
- 0
common/components/ActiveRecordCommon.php View File

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

/**
Copyright La boîte à pain (2018)

contact@laboiteapain.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 ;

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 search($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)
{
if(Yii::$app->controller->module->id == 'app-producer') {
$params[$options['attribute_id_producer']] = Yii::$app->controller->getProducer()->id ;
}
else {
$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);
}
}
}
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($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 ;
}
/**
* 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::search($params, $options) ;
}
}

+ 1
- 1
common/controllers/CommonController.php View File

@@ -46,7 +46,7 @@ class CommonController extends \yii\web\Controller
public function beforeAction($event)
{
if (!Yii::$app->user->isGuest) {
Yii::$app->user->identity->updateDerniereConnexion();
Yii::$app->user->identity->updateLastConnection();
}

return parent::beforeAction($event);

common/helpers/Departements.php → common/helpers/Departments.php View File

@@ -38,7 +38,7 @@ termes.

namespace common\helpers;

class Departements {
class Departments {

public static function get()
{

+ 1
- 1
common/mail/contact-html.php View File

@@ -40,6 +40,6 @@ use yii\helpers\Html;

?>

<p>Message de <strong><?= Html::encode($nom) ?></strong> :</p>
<p>Message de <strong><?= Html::encode($name) ?></strong> :</p>

<?= nl2br(Html::encode($content)); ?>

+ 1
- 1
common/mail/contact-text.php View File

@@ -38,6 +38,6 @@ termes.

?>

Message de <?= $nom ?> :
Message de <?= $name ?> :

<?= $content; ?>

+ 2
- 2
common/mail/createUserAdmin-html.php View File

@@ -40,9 +40,9 @@ use yii\helpers\Html;

?>

<p>Bonjour <?= Html::encode($user->prenom); ?>,</p>
<p>Bonjour <?= Html::encode($user->name); ?>,</p>

<p>Votre producteur <strong><?= Html::encode($etablissement->nom); ?></strong> vient
<p>Votre producteur <strong><?= Html::encode($producer->name); ?></strong> vient
de créer un compte pour vous sur le site <a href="http://www.laboiteapain.net/">La boîte à pain</a>.</p>

<p><strong>Ce compte vous permet de passer vos commandes dans cet établissement.</strong></p>

+ 2
- 2
common/mail/createUserAdmin-text.php View File

@@ -38,9 +38,9 @@ termes.

?>

Bonjour <?= $user->prenom ?>,
Bonjour <?= $user->name ?>,

Votre producteur "<?= $etablissement->nom ?>" vient
Votre producteur "<?= $producer->name ?>" vient
de créer un compte pour vous sur le site http://www.laboiteapain.net/.

Ce compte vous permet de passer vos commandes dans cet établissement.

+ 4
- 4
common/mail/creditUser-html.php View File

@@ -42,11 +42,11 @@ use common\models\CreditHistorique;

?>

<p>Bonjour <?= Html::encode($user->prenom); ?>,</p>
<p>Bonjour <?= Html::encode($user->name); ?>,</p>

<p>Votre producteur <strong><?= Html::encode($etablissement->nom); ?></strong> vient
de <?php if($credit_form->type == CreditHistorique::TYPE_CREDIT): ?>créditer<?php else: ?>débiter<?php endif; ?> votre compte de <strong><?= Price::format($credit_form->montant); ?></strong> sur le site <a href="http://www.laboiteapain.net/">La boîte à pain</a>.</p>
<p>Votre producteur <strong><?= Html::encode($producer->name); ?></strong> vient
de <?php if($creditForm->type == CreditHistory::TYPE_CREDIT): ?>créditer<?php else: ?>débiter<?php endif; ?> votre compte de <strong><?= Price::format($creditForm->amount); ?></strong> sur le site <a href="http://www.laboiteapain.net/">La boîte à pain</a>.</p>

<p>Votre compte est désormais à <strong><?= Price::format($user_etablissement->credit); ?></strong></p>
<p>Votre compte est désormais à <strong><?= Price::format($userProducer->credit); ?></strong></p>

<p>À bientôt.</p>

+ 3
- 3
common/mail/creditUser-text.php View File

@@ -40,10 +40,10 @@ use common\helpers\Price ;
use common\models\CreditHistorique;

?>
Bonjour <?= $user->prenom; ?>,</p>
Bonjour <?= $user->name; ?>,</p>

Votre producteur <?= $etablissement->nom; ?> vient de <?php if($credit_form->type == CreditHistorique::TYPE_CREDIT): ?>créditer<?php else: ?>débiter<?php endif; ?> votre compte de <?= Price::format($credit_form->montant); ?> sur le site http://www.laboiteapain.net/
Votre producteur <?= $producer->name; ?> vient de <?php if($creditForm->type == CreditHistory::TYPE_CREDIT): ?>créditer<?php else: ?>débiter<?php endif; ?> votre compte de <?= Price::format($creditForm->amount); ?> sur le site http://www.laboiteapain.net/

Votre compte est désormais à : <?= Price::format($user_etablissement->credit); ?>.
Votre compte est désormais à : <?= Price::format($userProducer->credit); ?>.

À bientôt

common/mail/cronRecapCommandes-html.php → common/mail/cronOrdersSummary-html.php View File


common/mail/cronRecapCommandes-text.php → common/mail/cronOrdersSummary-text.php View File


+ 0
- 41
common/mail/new-boulanger-text.php View File

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

/**
Copyright La boîte à pain (2018)

contact@laboiteapain.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.
*/

?>

Un nouveau producteur vient de s'inscrire : <?= $etablissement->nom; ?>.

common/mail/new-boulanger-html.php → common/mail/new-producer-html.php View File

@@ -40,6 +40,6 @@ use yii\helpers\Html;

?>

<p>Un nouveau producteur vient de s'inscrire : <strong><?= Html::encode($etablissement->nom) ?></strong>.</p>
<p>Un nouveau producteur vient de s'inscrire : <strong><?= Html::encode($producer->name) ?></strong>.</p>



backend/views/paiement/annuler.php → common/mail/new-producer-text.php View File

@@ -38,5 +38,4 @@ termes.

?>

<h1>Paiement annulé</h1>

Un nouveau producteur vient de s'inscrire : <?= $producer->name; ?>.

+ 1
- 1
common/mail/passwordResetToken-html.php View File

@@ -44,7 +44,7 @@ use yii\helpers\Html;
$resetLink = Yii::$app->urlManager->createAbsoluteUrl(['site/reset-password', 'token' => $user->password_reset_token]);
?>
<div class="password-reset">
<p>Bonjour <?= Html::encode($user->prenom) ?>,</p>
<p>Bonjour <?= Html::encode($user->name) ?>,</p>

<p>Suivez le lien suivant pour réinitialiser votre mot de passe :</p>


+ 1
- 1
common/mail/passwordResetToken-text.php View File

@@ -41,7 +41,7 @@ termes.

$resetLink = Yii::$app->urlManager->createAbsoluteUrl(['site/reset-password', 'token' => $user->password_reset_token]);
?>
Bonjour <?= $user->prenom ?>,
Bonjour <?= $user->name ?>,

Suivez le lien suivant pour réinitialiser votre mot de passe :


+ 5
- 5
common/mail/signup-html.php View File

@@ -42,19 +42,19 @@ use common\helpers\Url ;

?>

<p>Bonjour <?= Html::encode($user->prenom) ?>,</p>
<p>Bonjour <?= Html::encode($user->name) ?>,</p>

<p>Votre inscription sur <strong>La boîte à pain</strong> a bien été prise en compte.</p>

<p>Voici votre identifiant de connexion : <br />
<strong><?= Html::encode($user->email) ?></strong></p>

<?php if($user->status == User::STATUS_BOULANGER): ?>
<p>Vous pouvez dès maintenant vous connecter à votre <a href="<?= Url::backend(); ?>">Espace boulanger</a> pour mettre
<?php if($user->status == User::STATUS_PRODUCER): ?>
<p>Vous pouvez dès maintenant vous connecter à votre <a href="<?= Yii::$app->urlManagerBackend->createAbsoluteUrl(['site/index']); ?>">Espace producteur</a> pour mettre
en place votre système de réservation.</p>
<?php else: ?>
<?php if(!is_null($etablissement)): ?>
<p>Vous pouvez maintenant <a href="<?= Url::frontend().'index.php?r=commande/create&id_etablissement='.$etablissement->id ?>">passer commande</a> chez votre producteur <strong><?= Html::encode($etablissement->nom); ?></strong>.</p>
<?php if(!is_null($producer)): ?>
<p>Vous pouvez maintenant <a href="<?= Yii::$app->urlManagerProducer->createAbsoluteUrl(['site/index', 'slug_producer' => $producer->slug]); ?>">passer commande</a> chez votre producteur <strong><?= Html::encode($producer->name); ?></strong>.</p>
<?php else: ?>
<p>Vous pouvez maintenant passer commande chez votre producteur.</p>
<?php endif; ?>

+ 6
- 6
common/mail/signup-text.php View File

@@ -41,20 +41,20 @@ use common\helpers\Url ;

?>

Bonjour <?= $user->prenom ?>,
Bonjour <?= $user->name ?>,

Votre inscription sur La boîte à pain a bien été prise en compte.

Voici votre identifiant de connexion :
<?= $user->email ?>

<?php if($user->status == User::STATUS_BOULANGER): ?>
<?php if($user->status == User::STATUS_PRODUCER): ?>
Vous pouvez dès maintenant vous connecter à votre Espace boulanger pour mettre en place votre système de réservation :
<?= Url::backend(); ?>
<?= Yii::$app->urlManagerBackend->createAbsoluteUrl(['site/index']); ?>
<?php else: ?>
<?php if(!is_null($etablissement)): ?>
Vous pouvez maintenant passer commande chez votre producteur "<?= $etablissement->nom ?>" :
<?= Url::frontend().'index.php?r=commande/create&id_etablissement='.$etablissement->id ?>
<?php if(!is_null($producer)): ?>
Vous pouvez maintenant passer commande chez votre producteur "<?= $producer->name ?>" :
<?= Yii::$app->urlManagerProducer->createAbsoluteUrl(['site/index', 'slug_producer' => $producer->slug]) ; ?>
<?php else: ?>
Vous pouvez maintenant passer commande chez votre producteur.
<?php endif; ?>

+ 0
- 622
common/models/Commande.php View File

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

/**
Copyright La boîte à pain (2018)

contact@laboiteapain.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 Yii;
use yii\helpers\Html;
use common\models\Etablissement;

/**
* This is the model class for table "commande".
*
* @property integer $id
* @property integer $id_user
* @property string $date
* @property string $date_update
* @property integer $id_point_vente
* @property integer $id_production
* @property boolean $paiement_automatique
*/
class Commande extends \yii\db\ActiveRecord
{

var $montant = 0 ;
var $montant_paye = 0 ;
var $poids = 0 ;
const TYPE_AUTO = 'auto';
const TYPE_USER = 'user';
const TYPE_ADMIN = 'admin';
const STATUT_PAYEE = 'payee';
const STATUT_IMPAYEE = 'impayee';
const STATUT_SURPLUS = 'surplus';
const ETAT_MODIFIABLE = 'ouverte';
const ETAT_PREPARATION = 'preparation';
const ETAT_LIVREE = 'livree';

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

/*
* relations
*/

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

public function getCommandeProduits()
{
return $this->hasMany(CommandeProduit::className(),['id_commande' => 'id'])
->with('produit');
}

public function getProduction()
{
return $this->hasOne(Production::className(), ['id' => 'id_production'])
->with('etablissement');
}

public function getPointVente()
{
return $this->hasOne(PointVente::className(), ['id' => 'id_point_vente'])
->with('pointVenteUser');
}

public function getCreditHistorique()
{
return $this->hasMany(CreditHistorique::className(), ['id_commande' => 'id']);
}

/**
* @inheritdoc
*/
public function rules()
{
return [
[['id_user', 'date', 'id_point_vente', 'id_production'], 'required', 'message' => ''],
[['id_user', 'id_point_vente', 'id_production'], 'integer'],
[['paiement_automatique'], 'boolean'],
[['date', 'date_update', 'commentaire', 'commentaire_point_vente'], 'safe']
];
}

/**
* @inheritdoc
*/
public function attributeLabels()
{
return [
'id' => 'ID',
'id_user' => 'Id User',
'date' => 'Date',
'date_update' => 'Date Update',
'id_point_vente' => 'Point de vente',
'id_production' => 'Date de production',
];
}
/**
* Initialise le montant total, le montant déjà payé et le poids de la
* commande
*/
public function init()
{
// Montant
if (isset($this->commandeProduits)) {
foreach ($this->commandeProduits as $p) {
if ($p->mode_vente == 'unite') {
$this->montant += $p->prix * $p->quantite;
if(isset($p->produit)) {
$this->poids += ($p->quantite * $p->produit->poids) / 1000 ;
}
}
elseif ($p->mode_vente == 'poids') {
$this->montant += $p->prix * $p->quantite / 1000;
}
}
}
// Montant payé
if (isset($this->creditHistorique) && !$this->montant_paye) {
foreach ($this->creditHistorique as $ch) {
if ($ch->type == CreditHistorique::TYPE_PAIEMENT) {
$this->montant_paye += $ch->montant;
}
elseif ($ch->type == CreditHistorique::TYPE_REMBOURSEMENT) {
$this->montant_paye -= $ch->montant;
}
}
}
}
/**
* Retourne la quantité d'un produit donné de plusieurs commandes.
*
* @param integer $id_produit
* @param array $commandes
*
* @return integer
*/
public static function getQuantiteProduit($id_produit, $commandes)
{
$quantite = 0;
if (isset($commandes) && is_array($commandes) && count($commandes)) {
foreach ($commandes as $c) {
if(is_null($c->date_delete)) {
foreach ($c->commandeProduits as $cp) {
if ($cp->id_produit == $id_produit) {
$quantite += $cp->quantite;
}
}
}
}
}

return $quantite;
}
/**
* Retourne le montant payé de la commande.
*
* @return float
*/
public function getMontantPaye()
{
if ($this->montant_paye) {
return $this->montant_paye;
}
else {
$historique = CreditHistorique::find()
->where(['id_commande' => $this->id])
->all();

$montant = 0;

foreach ($historique as $ch) {
if ($ch->type == CreditHistorique::TYPE_PAIEMENT) {
$montant += $ch->montant;
}
elseif ($ch->type == CreditHistorique::TYPE_REMBOURSEMENT) {
$montant -= $ch->montant;
}
}

return $montant;
}
}

/**
* Retourne le montant de la commande.
*
* @param boolean $format
* @return float
*/
public function getMontant($format = false)
{
if ($format) {
return number_format($this->getMontant(), 2) . ' €';
}
else {
return $this->montant;
}
}

/**
* Retourne le montant restant à payer.
*
* @param boolean $format
* @return float
*/
public function getMontantRestant($format = false)
{
$montant_restant = $this->getMontant() - $this->getMontantPaye();
if ($format) {
return number_format($montant_restant, 2) . ' €';
}
else {
return $montant_restant;
}
}

/**
* Retourne le montant payé en surplus.
*
* @param boolean $format
* @return float
*/
public function getMontantSurplus($format = false)
{
$montant_surplus = $this->getMontantPaye() - $this->getMontant();
if ($format) {
return number_format($montant_surplus, 2) . ' €';
}
else {
return $montant_surplus;
}
}

/**
* Retourne les informations relatives à la commande au format JSON.
*
* @return string
*/
public function getDataJson()
{
$commande = Commande::find()->with('commandeProduits')->where(['id' => $this->id])->one();
$commande->init();

$json_commande = [
'produits' => [],
'montant' => $commande->montant,
'str_montant' => $commande->getMontant(true),
'montant_paye' => $commande->getMontantPaye(),
'commentaire' => $commande->commentaire,
];

foreach ($commande->commandeProduits as $commande_produit) {
$json_commande['produits'][$commande_produit->id_produit] = $commande_produit->quantite;
}

return json_encode($json_commande);
}

/**
* Enregistre un modèle de type CreditHistorique.
*
* @param string $type
* @param float $montant
* @param integer $id_etablissement
* @param integer $id_user
* @param integer $id_user_action
*/
public function creditHistorique($type, $montant, $id_etablissement, $id_user, $id_user_action)
{
$credit_historique = new CreditHistorique;
$credit_historique->id_user = $this->id_user;
$credit_historique->id_commande = $this->id;
$credit_historique->montant = $montant;
$credit_historique->type = $type;
$credit_historique->id_etablissement = $id_etablissement;
$credit_historique->id_user_action = $id_user_action;
$credit_historique->populateRelation('commande', $this) ;
$credit_historique->populateRelation('user', User::find()->where(['id' => $this->id_user])->one()) ;
$credit_historique->save();
}

/**
* Retourne le statut de paiement de la commande (payée, surplus, ou impayée).
*
* @return string
*/
public function getStatutPaiement()
{
// payé
if ($this->getMontant() - $this->getMontantPaye() < 0.01 &&
$this->getMontant() - $this->getMontantPaye() >= 0)
{
return self::STATUT_PAYEE;
}
// à rembourser
elseif ($this->getMontant() - $this->getMontantPaye() <= -0.01) {
return self::STATUT_SURPLUS;
}
// reste à payer
elseif ($this->getMontant() - $this->getMontantPaye() >= 0.01) {
return self::STATUT_IMPAYEE;
}
}
/**
* Retourne le résumé du panier au format HTML.
*
* @return string
*/
public function getResumePanier()
{
if (!isset($this->commandeProduits)) {
$this->commandeProduits = CommandeProduit::find()->where(['id_commande' => $this->id])->all();
}
$html = '';
$count = count($this->commandeProduits);
$i = 0;
foreach ($this->commandeProduits as $p) {
if (isset($p->produit)) {
$html .= $p->quantite . ' x ' . Html::encode($p->produit->nom);
if (++$i != $count) {
$html .= '<br />';
}
}
}
return $html;
}

/**
* Retourne le résumé du point de vente lié à la commande au format HTML.
*
* @return string
*/
public function getResumePointVente()
{
$html = '';

if (isset($this->pointVente)) {
$html .= '<span class="nom-point-vente">' . Html::encode($this->pointVente->nom) . '</span>'
. '<br /><span class="localite">' . Html::encode($this->pointVente->localite) . '</span>';
if (strlen($this->commentaire_point_vente)) {
$html .= '<div class="commentaire"><span>' . Html::encode($this->commentaire_point_vente) . '</span></div>';
}
} else {
$html .= 'Point de vente supprimé';
}

return $html;
}

/**
* Retourne le résumé du paiement (montant, statut).
*
* @return string
*/
public function getResumeMontant()
{
$html = '';

$html .= $this->getMontant(true) . '<br />';

if ($this->montant_paye) {
if ($this->getStatutPaiement() == Commande::STATUT_PAYEE) {
$html .= '<span class="label label-success">Payée</span>';
} elseif ($this->getStatutPaiement() == Commande::STATUT_IMPAYEE) {
$html .= '<span class="label label-danger">Non payée</span><br />
Reste <strong>' . $this->getMontantRestant(true) . '</strong> à payer';
} elseif ($this->getStatutPaiement() == Commande::STATUT_SURPLUS) {
$html .= '<span class="label label-success">Payée</span>';
}
}
else {
$html .= '<span class="label label-default">À régler sur place</span>';
}

return $html;
}

/**
* Retourne une chaine de caractère décrivant l'utilisateur lié à la commande.
*
* @return string
*/
public function getStrUser()
{
if (isset($this->user)) {
return Html::encode($this->user->prenom . ' ' . $this->user->nom);
} elseif (strlen($this->username)) {
return Html::encode($this->username);
} else {
return 'Client introuvable';
}
}

/**
* Recherche dans les commandes suivant les paramètres suivants :
* - id_etablissement
* - condition
* - date
* - type
* - orderby
* - limit
*
* @param array $params
* @return array
*/
public static function findBy($params = [])
{
if (!isset($params['id_etablissement']))
$params['id_etablissement'] = Yii::$app->user->identity->id_etablissement;

$commandes = Commande::find()
->with('commandeProduits', 'creditHistorique', 'pointVente')
->joinWith(['production', 'user','user.userEtablissement'])
->where(['production.id_etablissement' => $params['id_etablissement']]);

if (isset($params['condition']))
$commandes = $commandes->andWhere($params['condition']);

if (isset($params['date']))
$commandes = $commandes->andWhere(['production.date' => $params['date']]);
if (isset($params['date_delete'])) {
if($params['date_delete'] == 'NULL') {
$commandes = $commandes->andWhere('commande.date_delete IS NULL');
}
else {
$commandes = $commandes->andWhere(['commande.date_delete' => $params['date_delete']]);
}
}
if (isset($params['date_update'])) {
if($params['date_update'] == 'NULL') {
$commandes = $commandes->andWhere('commande.date_update IS NULL');
}
else {
$commandes = $commandes->andWhere(['commande.date_update' => $params['date_update']]);
}
}

if (isset($params['type']))
$commandes = $commandes->andWhere(['commande.type' => $params['type']]);


if (isset($params['orderby']))
$commandes = $commandes->orderBy($params['orderby']);
else
$commandes = $commandes->orderBy('date ASC');

if (isset($params['limit']))
$commandes = $commandes->limit($params['limit']);

$commandes = $commandes->all();
return $commandes;
}

/**
* Retourne l'état de la commande (livrée, modifiable ou en préparation)
*
* @return string
*/
public function getEtat()
{
$delai_commande = Etablissement::getConfig('delai_commande', $this->production->id_etablissement);
$heure_limite = Etablissement::getConfig('heure_limite_commande', $this->production->id_etablissement);

$date_commande = strtotime($this->production->date);
$date_today = strtotime(date('Y-m-d'));
$heure_today = date('G');

$nb_jours = (int) (($date_commande - $date_today) / (24 * 60 * 60));

if ($nb_jours <= 0) {
return self::ETAT_LIVREE;
}
elseif ($nb_jours >= $delai_commande &&
($nb_jours != $delai_commande ||
($nb_jours == $delai_commande && $heure_today < $heure_limite)))
{
return self::ETAT_MODIFIABLE;
}

return self::ETAT_PREPARATION;
}

/**
* Retourne le type de la commande (client, automatique ou admin) sous forme
* texte ou HTML.
*
* @param boolean $with_label
* @return string
*/
public function getStrType($with_label = false) {
$class_label = '';
$str = '';

if ($this->type == self::TYPE_USER) {
$class_label = 'success';
$str = 'Client';
} elseif ($this->type == self::TYPE_AUTO) {
$class_label = 'default';
$str = 'Auto';
} elseif ($this->type == self::TYPE_ADMIN) {
$class_label = 'warning';
$str = 'Vous';
}

if ($with_label)
return '<span class="label label-' . $class_label . '">' . $str . '</span>';
else
return $str;
}

/**
* Retourne l'historique de la commande (ajoutée, modifiée, supprimée) au format
* HTML.
*
* @return string
*/
public function getStrHistorique()
{
$arr = [
'class' => 'create',
'glyphicon' => 'plus',
'str' => 'Ajoutée',
'date' => $this->date
] ;
if(!is_null($this->date_update)) {
$arr = [
'class' => 'update',
'glyphicon' => 'pencil',
'str' => 'Modifiée',
'date' => $this->date_update
] ;
}
if(!is_null($this->date_delete)) {
$arr = [
'class' => 'delete',
'glyphicon' => 'remove',
'str' => 'Annulée',
'date' => $this->date_delete
] ;
}
$html = '<div class="small"><span class="'.$arr['class'].'"><span class="glyphicon glyphicon-'.$arr['glyphicon'].'"></span> '.$arr['str'].'</span> le <strong>'.date('d/m/Y à G\hi', strtotime($arr['date'])).'</strong></div>' ;
return $html ;
}
/**
* Retourne une classe identifiant l'historique de la commande (ajoutée,
* modifiée, supprimée).
*
* @return string
*/
public function getClassHistorique()
{
if(!is_null($this->date_delete)) {
return 'commande-delete' ;
}
if(!is_null($this->date_update)) {
return 'commande-update' ;
}
return 'commande-create' ;
}
}

+ 0
- 283
common/models/CommandeAuto.php View File

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

/**
Copyright La boîte à pain (2018)

contact@laboiteapain.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 Yii;
use common\models\Etablissement;
use common\models\PointVente;
use common\models\PointVenteUser;
use common\models\Commande;
use common\models\CommandeProduit;

/**
* This is the model class for table "commande_auto".
*
* @property integer $id
* @property integer $id_user
* @property integer $id_etablissement
* @property integer $id_point_vente
* @property string $date_debut
* @property string $date_fin
* @property integer $lundi
* @property integer $mardi
* @property integer $mercredi
* @property integer $jeudi
* @property integer $vendredi
* @property integer $samedi
* @property integer $dimanche
* @property integer $periodicite_semaine
* @property string $username
* @property string $paiement_automatique
*/
class CommandeAuto extends \yii\db\ActiveRecord
{

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

/**
* @inheritdoc
*/
public function rules()
{
return [
[['id_etablissement', 'id_point_vente'], 'required'],
[['id_user', 'id_etablissement', 'id_point_vente', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi', 'dimanche', 'periodicite_semaine'], 'integer'],
[['paiement_automatique'], 'boolean'],
[['date_debut', 'date_fin', 'username'], 'safe'],
];
}

/**
* @inheritdoc
*/
public function attributeLabels()
{
return [
'id' => 'ID',
'id_user' => 'Utilisateur',
'id_etablissement' => 'Etablissement',
'id_point_vente' => 'Point de vente',
'date_debut' => 'Date de début',
'date_fin' => 'Date de fin',
'lundi' => 'Lundi',
'mardi' => 'Mardi',
'mercredi' => 'Mercredi',
'jeudi' => 'Jeudi',
'vendredi' => 'Vendredi',
'samedi' => 'Samedi',
'dimanche' => 'Dimanche',
'periodicite_semaine' => 'Périodicité',
'paiement_automatique' => 'Paiement automatique'
];
}

/*
* Relations
*/
public function getUser()
{
return $this->hasOne(User::className(), ['id' => 'id_user']);
}

public function getEtablissement()
{
return $this->hasOne(Etablissement::className(), ['id' => 'id_etablissement']);
}

public function getPointVente()
{
return $this->hasOne(PointVente::className(), ['id' => 'id_point_vente']);
}

public function getCommandeAutoProduit()
{
return $this->hasMany(CommandeAutoProduit::className(), ['id_commande_auto' => 'id'])->with('produit');
}

/**
* Retourne les commandes récurrentes pour une date donnée.
*
* @param string $date
* @return array
*/
public static function getAll($date)
{
$date = date('Y-m-d', strtotime($date));

// commandes auto
$commandes_auto = self::find()
->with('commandeAutoProduit')
->where(['id_etablissement' => Yii::$app->user->identity->id_etablissement])
->all();

$arr_commandes_auto = [];

foreach ($commandes_auto as $c) {
// vérif dates
if ($date >= $c->date_debut &&
(!$c->date_fin || $date <= $c->date_fin))
{
// périodicite
$nb_jours = (strtotime($date) - strtotime($c->date_debut)) / (24 * 60 * 60);
if ($nb_jours % ($c->periodicite_semaine * 7) < 7) {
// jour de la semaine
$jour = date('N', strtotime($date));
switch ($jour) {
case 1 : $jour = 'lundi';
break;
case 2 : $jour = 'mardi';
break;
case 3 : $jour = 'mercredi';
break;
case 4 : $jour = 'jeudi';
break;
case 5 : $jour = 'vendredi';
break;
case 6 : $jour = 'samedi';
break;
case 7 : $jour = 'dimanche';
break;
}

if ($c->$jour) {
$arr_commandes_auto[] = $c;
}
}
}
}

return $arr_commandes_auto;
}

/**
* Ajoute les commandes pour une date donnée à partir des commnandes
* récurrentes.
*
* @param string $date
* @param boolean $force
*/
public static function addAll($date, $force = false)
{
// production
$production = Production::findOne([
'date' => date('Y-m-d', strtotime($date)),
'id_etablissement' => Yii::$app->user->identity->id_etablissement
]);

if ($production) {
$count_commandes_prod = Commande::find()
->where(['id_production' => $production->id])
->count();

if (!$count_commandes_prod || $force) {
$commandes_auto = self::getAll($date);
foreach ($commandes_auto as $c) {
$c->add($date);
}
}
}
}

/**
* Ajoute la commande récurrente pour une date donnée.
*
* @param string $date
*/
public function add($date)
{
// production
$production = Production::find()
->where([
'date' => date('Y-m-d', strtotime($date)),
'id_etablissement' => Yii::$app->user->identity->id_etablissement
])
->with('productionProduit')
->one();

if ($production && count($this->commandeAutoProduit)) {
// commande
$commande = new Commande;
if (strlen($this->username)) {
$commande->username = $this->username;
$commande->id_user = 0;
} else {
$commande->id_user = $this->id_user;
}
$commande->date = date('Y-m-d H:i:s');
$commande->type = Commande::TYPE_AUTO;
$commande->id_point_vente = $this->id_point_vente;
$commande->id_production = $production->id;
$commande->paiement_automatique = $this->paiement_automatique ;
$point_vente_user = PointVenteUser::find()
->where(['id_point_vente' => $this->id_point_vente, 'id_user' => $this->id_user])
->one();

if ($point_vente_user && strlen($point_vente_user->commentaire)) {
$commande->commentaire_point_vente = $point_vente_user->commentaire;
}

$commande->save();

// produits
$montant_total = 0;
$produits_add = false;
foreach ($this->commandeAutoProduit as $commande_auto_produit) {
$commande_produit = new CommandeProduit;
$commande_produit->id_commande = $commande->id;
$commande_produit->id_produit = $commande_auto_produit->produit->id;
$commande_produit->quantite = $commande_auto_produit->quantite;
$commande_produit->prix = $commande_auto_produit->produit->prix;
$commande_produit->save();
$produits_add = true;
}

if (!$produits_add) {
$commande->delete();
}
}
}
}

+ 0
- 171
common/models/CommandeAutoForm.php View File

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

/**
Copyright La boîte à pain (2018)

contact@laboiteapain.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 Yii;
use yii\base\Model;
use common\models\CommandeAuto;
use common\models\CommandeAutoProduit;

/**
* Login form
*/
class CommandeAutoForm extends Model
{

public $id;
public $id_user;
public $username;
public $id_etablissement;
public $id_point_vente;
public $date_debut;
public $date_fin;
public $lundi;
public $mardi;
public $mercredi;
public $jeudi;
public $vendredi;
public $samedi;
public $dimanche;
public $periodicite_semaine;
public $produits;
public $paiement_automatique;

/**
* @inheritdoc
*/
public function rules()
{
return [
[['id_etablissement', 'periodicite_semaine', 'id_point_vente'], 'integer'],
[['date_debut', 'date_fin'], 'date', 'format' => 'php:d/m/Y'],
[['lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi', 'dimanche', 'paiement_automatique'], 'boolean'],
[['id_point_vente', 'id_etablissement', 'date_debut'], 'required', 'message' => 'Champs obligatoire'],
[['produits', 'id_user', 'username'], 'safe'],
['id_user', function ($attribute, $params) {
if (!$this->id_user && !strlen($this->username)) {
$this->addError($attribute, 'Vous devez sélectionner ou saisir un utilisateur.');
}
}, 'skipOnEmpty' => false],
];
}

public function attributeLabels()
{
return [
'id' => 'ID',
'id_user' => 'Utilisateur',
'id_etablissement' => 'ID Etablissement',
'id_point_vente' => 'Point de vente',
'date_debut' => 'Date de début',
'date_fin' => 'Date de fin',
'lundi' => 'Lundi',
'mardi' => 'Mardi',
'mercredi' => 'Mercredi',
'jeudi' => 'Jeudi',
'vendredi' => 'Vendredi',
'samedi' => 'Samedi',
'dimanche' => 'Dimanche',
'periodicite_semaine' => 'Périodicité (semaines)',
'username' => 'Nom d\'utilisateur',
'paiement_automatique' => 'Paiement automatique'
];
}

/**
* Enregistre la CommandeAuto.
*
* @return boolean
*/
public function save()
{
if ($this->id) {
$commandeauto = CommandeAuto::findOne($this->id);
}
else {
$commandeauto = new CommandeAuto;
}

if ($commandeauto) {
$commandeauto->id_user = $this->id_user;
$commandeauto->username = $this->username;
$commandeauto->id_etablissement = $this->id_etablissement;
$commandeauto->id_point_vente = $this->id_point_vente;
$commandeauto->date_debut = date(
'Y-m-d',
strtotime(str_replace('/', '-', $this->date_debut)
));
if (strlen($this->date_fin)) {
$commandeauto->date_fin = date(
'Y-m-d',
strtotime(str_replace('/', '-', $this->date_fin)
));
}
$commandeauto->lundi = $this->lundi;
$commandeauto->mardi = $this->mardi;
$commandeauto->mercredi = $this->mercredi;
$commandeauto->jeudi = $this->jeudi;
$commandeauto->vendredi = $this->vendredi;
$commandeauto->samedi = $this->samedi;
$commandeauto->dimanche = $this->dimanche;
$commandeauto->periodicite_semaine = $this->periodicite_semaine;
$commandeauto->paiement_automatique = $this->paiement_automatique;

$commandeauto->save();

// produits
if ($this->id) {
CommandeAutoProduit::deleteAll(['id_commande_auto' => $this->id]);
}

foreach ($this->produits as $name_input => $quantite) {
if ($quantite) {
$id_produit = str_replace('produit_', '', $name_input);
$commandeauto_produit = new CommandeAutoProduit;
$commandeauto_produit->id_commande_auto = $commandeauto->id;
$commandeauto_produit->id_produit = $id_produit;
$commandeauto_produit->quantite = $quantite;
$commandeauto_produit->save();
}
}
}
return true;
}

}

+ 1
- 1
common/models/ContactForm.php View File

@@ -94,7 +94,7 @@ class ContactForm extends Model
return Yii::$app->mailer->compose([
'html' => 'contact-html',
'text' => 'contact-text'], [ 'content' => $this->body,
'nom' => $this->name
'name' => $this->name
])
->setTo($email)
->setFrom([$this->email => $this->name])

common/models/CreditHistorique.php → common/models/CreditHistory.php View File

@@ -39,9 +39,10 @@ termes.
namespace common\models;

use Yii;
use common\components\ActiveRecordCommon ;
use yii\db\ActiveRecord;
use common\models\User;
use common\models\Commande;
use common\models\Order;
use yii\helpers\Html;

/**
@@ -49,33 +50,33 @@ use yii\helpers\Html;
*
* @property integer $id
* @property integer $id_user
* @property integer $id_commande
* @property integer $id_order
* @property string $date
* @property double $montant
* @property double $amount
* @property string $type
* @property integer $id_etablissement
* @property string $moyen_paiement
* @property integer $id_producer
* @property string $mean_payement
*/
class CreditHistorique extends ActiveRecord
class CreditHistory extends ActiveRecordCommon
{

const TYPE_CREDIT_INITIAL = 'credit-initial';
const TYPE_CREDIT = 'credit';
const TYPE_PAIEMENT = 'paiement';
const TYPE_REMBOURSEMENT = 'remboursement';
const TYPE_DEBIT = 'debit';
const TYPE_INITIAL_CREDIT = 'initial-credit';
const TYPE_CREDIT = 'credit';
const TYPE_PAYMENT = 'payment';
const TYPE_REFUND = 'refund';
const TYPE_DEBIT = 'debit';
const MOYEN_CB = 'cb';
const MOYEN_ESPECES = 'especes';
const MOYEN_CHEQUE = 'cheque';
const MOYEN_AUTRE = 'autre';
const MEAN_PAYMENT_CREDIT_CARD = 'credit-card';
const MEAN_PAYMENT_MONEY = 'money';
const MEAN_PAYMENT_CHEQUE = 'cheque';
const MEAN_PAYMENT_OTHER = 'other';
/**
* @inheritdoc
*/
public static function tableName()
{
return 'credit_historique';
return 'credit_history';
}

/**
@@ -84,11 +85,11 @@ class CreditHistorique extends ActiveRecord
public function rules()
{
return [
[['montant'], 'required'],
[['id_user', 'id_user_action', 'id_commande', 'id_etablissement'], 'integer'],
[['amount'], 'required'],
[['id_user', 'id_user_action', 'id_order', 'id_producer'], 'integer'],
[['date'], 'safe'],
[['montant'], 'double'],
[['type', 'moyen_paiement', 'commentaire'], 'string', 'max' => 255],
[['amount'], 'double'],
[['type', 'mean_payment', 'comment'], 'string', 'max' => 255],
];
}

@@ -101,15 +102,17 @@ class CreditHistorique extends ActiveRecord
'id' => 'ID',
'id_user' => 'Utilisateur',
'id_user_action' => 'Utilisateur',
'id_commande' => 'Commande',
'id_order' => 'Commande',
'date' => 'Date',
'montant' => 'Montant',
'amount' => 'Montant',
'type' => 'Type',
'id_etablissement' => 'Établissement',
'moyen_paiement' => 'Moyen de paiement',
'commentaire' => 'Commentaire',
'id_producer' => 'Producteur',
'mean_payment' => 'Moyen de paiement',
'comment' => 'Commentaire',
];
}

/*
* Relations
@@ -125,9 +128,23 @@ class CreditHistorique extends ActiveRecord
return $this->hasOne(User::className(), ['id' => 'id_user_action']);
}

public function getCommande()
public function getOrder()
{
return $this->hasOne(Commande::className(), ['id' => 'id_commande']);
return $this->hasOne(Order::className(), ['id' => 'id_order']);
}
/**
* Retourne les options de base nécessaires à la fonction de recherche.
*
* @return array
*/
public static function defaultOptionsSearch() {
return [
'with' => [],
'join_with' => [],
'orderby' => self::tableName().'.date ASc',
'attribute_id_producer' => self::tableName().'.id_producer'
] ;
}

/**
@@ -135,16 +152,16 @@ class CreditHistorique extends ActiveRecord
*
* @return string
*/
public function getLibelleType()
public function getStrType()
{
switch ($this->type) {
case 'paiement':
case self::TYPE_PAYMENT:
return 'Paiement';
break;
case 'remboursement':
case self::TYPE_REFUND:
return 'Remboursement';
break;
case 'debit':
case self::TYPE_DEBIT:
return 'Débit';
break;
}
@@ -159,22 +176,23 @@ class CreditHistorique extends ActiveRecord
public function save($runValidation = true, $attributeNames = NULL)
{
// initialisation du commentaire avant sauvegarde
$this->commentaire .= $this->getStrCommentaire() ;
$this->comment .= $this->getStrComment() ;
parent::save($runValidation, $attributeNames);

// mise à jour du crédit au niveau de UserEtablissement
$user_etablissement = UserEtablissement::findOne([
'id_user' => $this->id_user,
'id_etablissement' => $this->id_etablissement
]);
if ($user_etablissement) {
// mise à jour du crédit au niveau de UserProducer
$userProducer = UserProducer::searchOne([
'id_user' => $this->id_user,
'id_producer' => $this->id_producer
]) ;
if ($userProducer) {
if ($this->isTypeCredit()) {
$user_etablissement->credit += $this->montant;
$userProducer->credit += $this->amount;
} elseif ($this->isTypeDebit()) {
$user_etablissement->credit -= $this->montant;
$userProducer->credit -= $this->amount;
}
$user_etablissement->save();
$userProducer->save();
}
}
@@ -187,7 +205,7 @@ class CreditHistorique extends ActiveRecord
{
return in_array($this->type, [
self::TYPE_DEBIT,
self::TYPE_PAIEMENT,
self::TYPE_PAYMENT,
]) ;
}
@@ -200,8 +218,8 @@ class CreditHistorique extends ActiveRecord
{
return in_array($this->type, [
self::TYPE_CREDIT,
self::TYPE_CREDIT_INITIAL,
self::TYPE_REMBOURSEMENT
self::TYPE_INITIAL_CREDIT,
self::TYPE_REFUND
]) ;
}
@@ -211,43 +229,45 @@ class CreditHistorique extends ActiveRecord
* @param boolean $format
* @return float
*/
public function getMontant($format = false)
public function getAmount($format = false)
{
if($format)
return number_format($this->montant,2) .' €' ;
else
return $this->montant ;
if($format) {
return number_format($this->amount,2) .' €' ;
}
else {
return $this->amount ;
}
}
/**
* Retourne le libellé du CreditHistorique informant de son type et
* Retourne le libellé du CreditHistory informant de son type et
* éventuellement de la date de sa commande associée.
*
* @return string
*/
public function getStrLibelle()
public function getStrWording()
{
$str = '' ;
if($this->type == self::TYPE_CREDIT_INITIAL) {
if($this->type == self::TYPE_INITIAL_CREDIT) {
$str = 'Crédit initial' ;
}
elseif($this->type == self::TYPE_CREDIT) {
$str = 'Crédit' ;
}
elseif($this->type == self::TYPE_PAIEMENT) {
elseif($this->type == self::TYPE_PAYMENT) {
$str = 'Paiement' ;
}
elseif($this->type == self::TYPE_REMBOURSEMENT) {
elseif($this->type == self::TYPE_REFUND) {
$str = 'Remboursement' ;
}
elseif($this->type == self::TYPE_DEBIT) {
$str = 'Débit' ;
}
if($this->type == self::TYPE_PAIEMENT || $this->type == self::TYPE_REMBOURSEMENT) {
if(isset($this->commande)) {
$str .= '<br />Commande : '.date('d/m/Y',strtotime($this->commande->production->date)) ;
if($this->type == self::TYPE_PAYMENT || $this->type == self::TYPE_REFUND) {
if(isset($this->order)) {
$str .= '<br />Commande : '.date('d/m/Y',strtotime($this->order->distribution->date)) ;
}
else {
$str .= '<br />Commande supprimée' ;
@@ -264,21 +284,21 @@ class CreditHistorique extends ActiveRecord
*
* @return string
*/
public function getStrCommentaire()
public function getStrComment()
{
$str = '' ;
if(strlen($this->commentaire)) {
if(strlen($this->comment)) {
$str .= '<br />' ;
}
$str .= $this->getStrLibelle() ;
if(isset($this->commande)) {
$str .= '<br />Montant de la commande : '.$this->commande->getMontant(true) ;
$str .= $this->getStrWording() ;
if(isset($this->order)) {
$str .= '<br />Montant de la commande : '.$this->order->getAmount(Order::AMOUNT_TOTAL, true) ;
}
if(isset($this->user)) {
$str .= '<br />Client : '.Html::encode($this->user->nom. ' '.$this->user->prenom) ;
$str .= '<br />Client : '.Html::encode($this->user->name. ' '.$this->user->lastname) ;
}
if(isset($this->userAction)) {
$str .= '<br />Action : '.Html::encode($this->userAction->nom. ' '.$this->userAction->prenom) ;
$str .= '<br />Action : '.Html::encode($this->userAction->name. ' '.$this->userAction->lastname) ;
}
return $str ;
@@ -299,18 +319,29 @@ class CreditHistorique extends ActiveRecord
}
/**
* Retourne le moyen de paiement.
* Retourne le libellé du moyen de paiement du CreditHistory courant.
*
* @return string
*/
public function getStrMeanPayment()
{
self::getStrMeanPaymentBy($this->mean_payement) ;
}
/**
* Retourne le libellé du moyen de paiement.
*
* @param string $meanPayment
* @return string
*/
public function getStrMoyenPaiement()
public static function getStrMeanPaymentBy($meanPayment)
{
switch($this->moyen_paiement) {
case CreditHistorique::MOYEN_ESPECES : return 'Espèces' ;
case CreditHistorique::MOYEN_CHEQUE : return 'Chèque' ;
case CreditHistorique::MOYEN_CB : return 'Carte bancaire' ;
case CreditHistorique::MOYEN_AUTRE : return 'Autre' ;
default: return 'Crédit pain' ;
switch($meanPayment) {
case CreditHistory::MEAN_PAYMENT_MONEY : return 'Espèces' ;
case CreditHistory::MEAN_PAYMENT_CHEQUE : return 'Chèque' ;
case CreditHistory::MEAN_PAYMENT_CREDIT_CARD : return 'Carte bancaire' ;
case CreditHistory::MEAN_PAYMENT_OTHER : return 'Autre' ;
default: return 'Crédit' ;
}
}
@@ -322,7 +353,7 @@ class CreditHistorique extends ActiveRecord
public function strUserAction()
{
if($this->userAction) {
return $this->userAction->nom . ' ' . $this->userAction->prenom ;
return $this->userAction->name . ' ' . $this->userAction->lastname ;
}
else {
return 'Système' ;

common/models/Developpement.php → common/models/Development.php View File

@@ -39,33 +39,34 @@ termes.
namespace common\models;

use Yii;
use common\components\ActiveRecordCommon ;
use common\models\DeveloppementPriorite;

/**
* This is the model class for table "developpement".
* This is the model class for table "development".
*
* @property integer $id
* @property string $objet
* @property string $subject
* @property string $description
* @property string $date
* @property integer $avancement
* @property string $statut
* @property double $estimation_temps
* @property integer $progress
* @property string $status
* @property double $time_estimate
*/
class Developpement extends \yii\db\ActiveRecord
class Development extends ActiveRecordCommon
{
const STATUT_OPEN = 'open';
const STATUT_CLOSED = 'closed';
const TYPE_EVOLUTION = 'evolution';
const TYPE_BUG = 'bug';
const STATUS_OPEN = 'open';
const STATUS_CLOSED = 'closed';
const TYPE_EVOLUTION = 'evolution';
const TYPE_BUG = 'bug';

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

/**
@@ -74,12 +75,12 @@ class Developpement extends \yii\db\ActiveRecord
public function rules()
{
return [
[['objet', 'date'], 'required'],
[['id', 'avancement'], 'integer'],
[['subject', 'date'], 'required'],
[['id', 'progress'], 'integer'],
[['description'], 'string'],
[['date', 'date_livraison'], 'safe'],
[['estimation_temps'], 'number'],
[['objet', 'statut', 'type'], 'string', 'max' => 255],
[['date', 'date_delivery'], 'safe'],
[['time_estimate'], 'number'],
[['subject', 'status', 'type'], 'string', 'max' => 255],
];
}

@@ -87,14 +88,21 @@ class Developpement extends \yii\db\ActiveRecord
* Relations
*/
public function getDeveloppementPriorite()
public function getDevelopmentPriority()
{
return $this->hasMany(DeveloppementPriorite::className(), ['id_developpement' => 'id'])->with('etablissement');
return $this->hasMany(
DevelopmentPriority::className(),
['id_development' => 'id'])
->with('producer');
}

public function getDeveloppementPrioriteCurrentEtablissement()
public function getDevelopmentPriorityCurrentProducer()
{
return $this->hasOne(DeveloppementPriorite::className(), ['id_developpement' => 'id'])->where(['id_etablissement' => Yii::$app->user->identity->id_etablissement])->with('etablissement');
return $this->hasOne(
DevelopmentPriority::className(),
['id_development' => 'id'])
->where(['id_producer' => Producer::getId()])
->with('producer');
}

/**
@@ -104,29 +112,45 @@ class Developpement extends \yii\db\ActiveRecord
{
return [
'id' => 'ID',
'objet' => 'Sujet',
'subject' => 'Sujet',
'description' => 'Description',
'date' => 'Date',
'avancement' => 'Avancement',
'statut' => 'Statut',
'estimation_temps' => 'Estimation temps',
'progress' => 'Avancement',
'status' => 'Statut',
'time_estimate' => 'Estimation temps',
'type' => 'Type',
'date_livraison' => 'Date de livraison'
'date_delivery' => 'Date de livraison'
];
}
/**
* Retourne les options de base nécessaires à la fonction de recherche.
*
* @return array
*/
public static function defaultOptionsSearch() {
return [
'with' => ['developmentPriority', 'developmentPriorityCurrentProducer'],
'join_with' => [],
'orderby' => 'date DESC',
'attribute_id_producer' => ''
] ;
}
/**
* Définit une date de livraison.
*
* @param string $date
*/
public function setDateLivraison($date = '') {

if (strlen($date))
$this->date_livraison = $date;

if (strlen($this->date_livraison))
$this->date_livraison = date('Y-m-d', strtotime($this->date_livraison));
public function setDateDelivery($date = '')
{
if (strlen($date)) {
$this->date_delivery = $date;
}
if (strlen($this->date_delivery)) {
$this->date_delivery = date('Y-m-d', strtotime($this->date_delivery));
}
}

}

common/models/DeveloppementPriorite.php → common/models/DevelopmentPriority.php View File

@@ -39,27 +39,28 @@ termes.
namespace common\models;

use Yii;
use common\models\Etablissement;
use common\components\ActiveRecordCommon ;
use common\models\Producer;

/**
* This is the model class for table "developpement_priorite".
* This is the model class for table "development_priority".
*
* @property integer $id_user
* @property integer $id_developpement
* @property integer $id_development
*/
class DeveloppementPriorite extends \yii\db\ActiveRecord
class DevelopmentPriority extends ActiveRecordCommon
{

const PRIORITE_HAUTE = 'haute';
const PRIORITE_NORMALE = 'normale';
const PRIORITE_BASSE = 'basse';
const PRIORITY_HIGH = 'high';
const PRIORITY_NORMAL = 'normal';
const PRIORITY_LOW = 'low';

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

/**
@@ -68,9 +69,9 @@ class DeveloppementPriorite extends \yii\db\ActiveRecord
public function rules()
{
return [
[['id_etablissement', 'id_developpement'], 'required'],
[['id_etablissement', 'id_developpement'], 'integer'],
[['priorite'], 'string'],
[['id_producer', 'id_development'], 'required'],
[['id_producer', 'id_development'], 'integer'],
[['priority'], 'string'],
];
}
@@ -78,9 +79,9 @@ class DeveloppementPriorite extends \yii\db\ActiveRecord
* Relations
*/

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

/**
@@ -89,25 +90,39 @@ class DeveloppementPriorite extends \yii\db\ActiveRecord
public function attributeLabels()
{
return [
'id_etablissement' => 'Établissement',
'id_developpement' => 'Développement',
'priorite' => 'Priorité'
'id_producer' => 'Producteur',
'id_producer' => 'Développement',
'priority' => 'Priorité'
];
}
/**
* 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' => 'development_priority.id_producer'
] ;
}

/**
* Retourne la priorité.
*
* @return string
*/
public function getStrPriorite()
public function getStrPriority()
{
switch ($this->priorite) {
case self::PRIORITE_BASSE : return 'Basse';
switch ($this->priority) {
case self::PRIORITY_LOW : return 'Basse';
break;
case self::PRIORITE_NORMALE : return 'Normale';
case self::PRIORITY_NORMAL : return 'Normale';
break;
case self::PRIORITE_HAUTE : return 'Haute';
case self::PRIORITY_HIGH : return 'Haute';
break;
default: return 'Non définie';
break;
@@ -119,17 +134,20 @@ class DeveloppementPriorite extends \yii\db\ActiveRecord
*
* @return string
*/
public function getClassCssStyleBouton()
public function getClassCssStyleButton()
{
$style_bouton = 'default';
if ($this->priorite == DeveloppementPriorite::PRIORITE_BASSE)
$style_bouton = 'info';
elseif ($this->priorite == DeveloppementPriorite::PRIORITE_NORMALE)
$style_bouton = 'warning';
elseif ($this->priorite == DeveloppementPriorite::PRIORITE_HAUTE)
$style_bouton = 'danger';

return $style_bouton;
$styleButton = 'default';
if ($this->priority == DevelopmentPriority::PRIORITY_LOW) {
$styleButton = 'info';
}
elseif ($this->priority == DevelopmentPriority::PRIORITY_NORMAL) {
$styleButton = 'warning';
}
elseif ($this->priority == DevelopmentPriority::PRIORITY_HIGH) {
$styleButton = 'danger';
}
return $styleButton;
}

}

+ 228
- 0
common/models/Distribution.php View File

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

/**
Copyright La boîte à pain (2018)

contact@laboiteapain.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 Yii;
use common\components\ActiveRecordCommon ;
use common\models\Order;
use common\models\Distribution;

/**
* This is the model class for table "production".
*
* @property integer $id
* @property string $date
* @property integer $actif
*/
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)
{

foreach ($this->productDistribution as $productDistribution) {
if ($productDistribution['id_product'] == $idProduct &&
$productDistribution['active'])
{
return true;
}
}
}

return false;
}
/**
* Initialise un jour de production.
*
* @param string $date
* @return Production
*/
public static function initDistribution($date)
{
$distribution = null ;
if ($date != '') {
$distribution = Distribution::find()
->where(['date' => $date])
->one() ;
if (!$distribution) {
$distribution = new Distribution;
$distribution->date = $date;
$distribution->delivery = 1;
$distribution->id_producer = Producer::getId();
$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) {
$dayDistribution = date('N', strtotime($distribution->date));
$productsDistribution = ProductDistribution::searchAll([
'id_distribution' => $distribution->id
]) ;

if (!count($productsDistribution)) {
foreach ($products as $product) {
$productDistribution = new ProductDistribution();
$productDistribution->id_distribution = $distribution->id;
$productDistribution->id_product = $product->id;

$productDistribution->active = 0;
if ($product->active && $dayDistribution == 1 && $product->monday) {
$productDistribution->active = 1;
}
if ($product->active && $dayDistribution == 2 && $product->tuesday) {
$productDistribution->active = 1;
}
if ($product->active && $dayDistribution == 3 && $product->wednesday) {
$productDistribution->active = 1;
}
if ($product->active && $dayDistribution == 4 && $product->thursday) {
$productDistribution->active = 1;
}
if ($product->active && $dayDistribution == 5 && $product->friday) {
$productDistribution->active = 1;
}
if ($product->active && $dayDistribution == 6 && $product->saturday) {
$productDistribution->active = 1;
}
if ($product->active && $dayDistribution == 7 && $product->sunday) {
$productDistribution->active = 1;
}
$productDistribution->quantity_max = $product->quantity_max;

$productDistribution->save();
}
}
}
return $distribution ;
}

}

+ 0
- 355
common/models/Etablissement.php View File

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

/**
Copyright La boîte à pain (2018)

contact@laboiteapain.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 Yii;
use common\helpers\Departements;
use yii\helpers\Html;

/**
* This is the model class for table "etablissement".
*
* @property integer $id
* @property string $nom
* @property string $siret
* @property string $logo
* @property string $photo
* @property string $description
* @property string $code_postal
* @property string $ville
*/
class Etablissement extends \yii\db\ActiveRecord
{

const PAIEMENT_OK = 'ok';
const PAIEMENT_ESSAI = 'essai';
const PAIEMENT_ESSAI_TERMINE = 'essai-terminee';
const PAIEMENT_RETARD = 'retard-paiement';

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

/**
* @inheritdoc
*/
public function rules()
{
return [
[['nom', 'siret', 'heure_limite_commande', 'delai_commande','type'], 'required'],
[['heure_limite_commande', 'delai_commande'], 'integer'],
['heure_limite_commande', 'in', 'range' => [8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24]],
['delai_commande', 'in', 'range' => [1, 2, 3, 4, 5, 6, 7]],
['code', function($attribute, $params) {
$code = $this->$attribute;

$etablissement = Etablissement::findOne(['code' => $code]);

if ($etablissement && $etablissement->id != $this->id) {
$this->addError($attribute, 'Ce code est déjà utilisé par un autre producteur.');
}
}],
[['description', 'infos_commande','slug'], 'string'],
[['solde_negatif', 'credit_pain', 'actif'], 'boolean'],
[['nom', 'siret', 'logo', 'photo', 'code_postal', 'ville', 'code','type'], 'string', 'max' => 255],
['prix_libre', 'double'],
['prix_libre', 'compare', 'compareValue' => 0, 'operator' => '>=', 'type' => 'number', 'message' => 'Prix libre doit être supérieur ou égal à 0'],
];
}

/**
* @inheritdoc
*/
public function attributeLabels()
{
return [
'id' => 'ID',
'nom' => 'Nom',
'siret' => 'Siret',
'logo' => 'Logo',
'photo' => 'Photo',
'description' => 'Description',
'code_postal' => 'Code postal',
'ville' => 'Ville',
'code' => 'Code',
'heure_limite_commande' => 'Heure limite de commande',
'delai_commande' => 'Délai de commande',
'solde_negatif' => 'Solde négatif',
'credit_pain' => 'Crédit pain',
'actif' => 'Actif',
'date_creation' => 'Date de création',
'infos_commande' => 'Informations',
'slug' => 'Slug',
'type' => 'Type d\'établissement'
];
}

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

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

/**
* Retourne la liste des établissements pour l'initialisation d'une liste
* sélective.
*
* @return array
*/
public static function getEtablissementsPopulateDropdown()
{
$etablissements_dispos = Etablissement::find()
->where(['actif' => 1])
->orderby('code_postal, ville ASC')
->all();

$departements = Departements::get();
$data_etablissements_dispos = [];
$options_etablissements_dispos = [];
foreach ($etablissements_dispos as $e) {
if (!key_exists('d' . substr($e->code_postal, 0, 2), $data_etablissements_dispos)) {
$data_etablissements_dispos['d' . substr($e->code_postal, 0, 2)] = '<strong>' . $departements[substr($e->code_postal, 0, 2)] . '</strong>';
$options_etablissements_dispos['d' . substr($e->code_postal, 0, 2)] = ['disabled' => true];
}

$data_etablissements_dispos[$e->id] = '<span class="glyphicon glyphicon-lock"></span> ' . Html::encode($e->nom) . ' - ' . Html::encode($e->code_postal) . ' ' . Html::encode($e->ville) . ' <span class="glyphicon glyphicon-lock"></span>';

if (strlen($e->code))
$options_etablissements_dispos[$e->id] = ['class' => 'lock'];
}

return ['data' => $data_etablissements_dispos, 'options' => $options_etablissements_dispos];
}

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

$connection = Yii::$app->getDb();
$command = $connection->createCommand('
SELECT SUM(IF(produit.vrac,0,commande_produit.prix * commande_produit.quantite)) AS CA
FROM commande, commande_produit, production, produit
WHERE commande.id = commande_produit.id_commande
AND production.id_etablissement = :id_etablissement
AND commande.id_production = production.id
AND commande_produit.id_produit = produit.id
AND production.date > :date_debut
AND production.date < :date_fin', [
':date_debut' => date('Y-m-31', strtotime("-1 month", strtotime($periode))),
':date_fin' => date('Y-m-01', strtotime("+1 month", strtotime($periode))),
':id_etablissement' => $this->id
]);

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

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

/**
* Retourne le montant à facturer pour une période donnée.
*
* @param string $periode
* @param float $ca
* @param boolean $format
* @return string
*/
public function getMontantFacturer($periode = '', $ca = 0, $format = false)
{
if (!$periode)
$periode = date('Y-m');

if (!$ca)
$ca = $this->getCA($periode);

if ($ca < 500) {
$montant = 0;
} else {
$montant = $ca * 0.02;
}

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

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

$facture = Facture::find()
->where('id_etablissement = :id_etablissement')
->andWhere('periode = :periode')
->addParams([
':id_etablissement' => $this->id,
':periode' => $periode,
])
->one();

return $facture;
}

/**
* Retourne la facture du mois dernier.
*
* @return Facture
*/
public function factureMoisDernier()
{
return $this->getFacture(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 = '', $id_etablissement = 0)
{
if (strlen($config)) {
if (!$id_etablissement) {
$id_etablissement = Yii::$app->user->identity->id_etablissement;
}
$etablissement = self::findOne($id_etablissement);
if ($etablissement) {
return $etablissement->$config;
}
}

return false;
}

/**
* Retourne le montant de l'abonnement à prix libre définit par
* l'établissement
*
* @param boolean $format
* @return mixed
*/
public function getPrixLibre($format = true)
{
if (!is_null($this->prix_libre)) {
if($format) {
return number_format($this->prix_libre, 2, ',', false) . ' € HT';
}
else {
return $this->prix_libre;
}
}
}
/**
* Lie un utilisateur à un producteur.
*
* @param integer $id_user
* @param integer $id_producer
* @return UserProducer
*/
public static function addUser($id_user, $id_producer)
{
$user_producer = UserEtablissement::find()
->where([
'id_user' => $id_user,
'id_etablissement' => $id_producer
])->one();

if (!$user_producer) {
$new_user_producer = new UserEtablissement;
$new_user_producer->id_etablissement = $id_producer;
$new_user_producer->id_user = $id_user;
$new_user_producer->credit = 0;
$new_user_producer->actif = 1;
$new_user_producer->favoris = 1;
$new_user_producer->save();
} else {
if (!$user_producer->actif) {
$user_producer->actif = 1;
$user_producer->save();
}
}
return $user_producer ;
}

}

common/models/Facture.php → common/models/Invoice.php View File

@@ -39,22 +39,23 @@ termes.
namespace common\models;

use Yii;
use common\components\ActiveRecordCommon ;

/**
* This is the model class for table "facture".
*
* @property integer $id
* @property integer $id_etablissement
* @property integer $id_producer
* @property string $date
* @property string $reference
* @property string $libelle
* @property string $texte
* @property double $montant_ht
* @property integer $paye
* @property string $date_paiement
* @property string $methode_paiement
* @property string $wording
* @property string $text
* @property double $amount_without_tax
* @property integer $paid
* @property string $date_payment
* @property string $mean_payment
*/
class Facture extends \yii\db\ActiveRecord
class Invoice extends ActiveRecordCommon
{

/**
@@ -62,7 +63,7 @@ class Facture extends \yii\db\ActiveRecord
*/
public static function tableName()
{
return 'facture';
return 'invoice';
}

/**
@@ -71,11 +72,11 @@ class Facture extends \yii\db\ActiveRecord
public function rules()
{
return [
[['id_etablissement', 'paye'], 'integer'],
[['date', 'date_paiement'], 'safe'],
[['id_producer', 'paye'], 'integer'],
[['date', 'date_payment'], 'safe'],
[['texte'], 'string'],
[['montant_ht', 'ca'], 'number'],
[['reference', 'libelle', 'methode_paiement'], 'string', 'max' => 255],
[['amount_without_tax', 'ca'], 'number'],
[['reference', 'wording', 'mean_payment'], 'string', 'max' => 255],
];
}

@@ -83,9 +84,9 @@ class Facture extends \yii\db\ActiveRecord
* Relations
*/
public function getEtablissement()
public function getProducer()
{
return $this->hasOne(Etablissement::className(), ['id' => 'id_etablissement']);
return $this->hasOne(Producer::className(), ['id' => 'id_producer']);
}

/**
@@ -95,29 +96,42 @@ class Facture extends \yii\db\ActiveRecord
{
return [
'id' => 'ID',
'id_etablissement' => 'Id Etablissement',
'id_producer' => 'Producteur',
'date' => 'Date',
'reference' => 'Reference',
'libelle' => 'Libelle',
'texte' => 'Texte',
'montant_ht' => 'Montant Ht',
'paye' => 'Paye',
'date_paiement' => 'Date Paiement',
'methode_paiement' => 'Methode Paiement',
'ca' => 'CA'
'wording' => 'Libellé',
'text' => 'Texte',
'amount_without_tax' => 'Montant Ht',
'paid' => 'Paye',
'date_payment' => 'Date de paiement',
'means_payment' => 'Méthode payment',
'turnover' => 'CA'
];
}

/**
* Retourne les options de base nécessaires à la fonction de recherche.
*
* @return array
*/
public static function defaultOptionsSearch()
{
return [
'with' => [],
'join_with' => [],
'orderby' => self::tableName().'.date ASc',
'attribute_id_producer' => self::tableName().'.id_producer'
] ;
}
/**
* Retourne la dernière facture émise.
*
* @return Facture
*/
public static function getLastFacture()
public static function getLastInvoice()
{
return Facture::find()
->orderBy('reference DESC')
->one();
return self::searchOne([],['orderby'=>'reference DESC']) ;
}

}

+ 15
- 15
common/models/LoginForm.php View File

@@ -46,14 +46,13 @@ use yii\base\Model;
*/
class LoginForm extends Model
{

public $username;
public $password;
public $rememberMe = true;
public $email;
private $_user = false;
public $code ;
public $id_etablissement ;
public $id_producer ;

/**
* @inheritdoc
@@ -72,26 +71,26 @@ class LoginForm extends Model
// password is validated by validatePassword()
['password', 'validatePassword'],
['code', 'required', 'message' => 'Champs obligatoire', 'when' => function($model) {
$etablissement = Etablissement::findOne($this->id_etablissement);
if ($etablissement) {
return strlen($etablissement->code);
$producer = Producer::findOne($this->id_producer);
if ($producer) {
return strlen($producer->code);
} else {
return false;
}
}],
['code', function($attribute, $params) {
$code = $this->$attribute;
$etablissement = Etablissement::findOne($this->id_etablissement);
$producer = Producer::findOne($this->id_producer);

if ($etablissement && strtolower(trim($code)) != strtolower(trim($etablissement->code))) {
if ($producer && strtolower(trim($code)) != strtolower(trim($producer->code))) {
$this->addError($attribute, 'Code incorrect');
}
}],
['id_etablissement', 'integer'],
['id_etablissement', function($attribute, $params) {
if ($this->id_etablissement) {
$etablissement = Etablissement::findOne($this->id_etablissement);
if (!$etablissement) {
['id_producer', 'integer'],
['id_producer', function($attribute, $params) {
if ($this->id_producer) {
$producer = Producer::findOne($this->id_producer);
if (!$producer) {
$this->addError($attribute, 'Ce producteur n\'existe pas.');
}
}
@@ -124,7 +123,7 @@ class LoginForm extends Model
public function login()
{
if ($this->validate()) {
$this->updateDerniereConnexion();
$this->updateLastConnection();
return Yii::$app->user->login($this->getUser(), $this->rememberMe ? 3600 * 24 * 30 : 0);
} else {
return false;
@@ -153,16 +152,17 @@ class LoginForm extends Model
'password' => 'Mot de passe',
'rememberMe' => 'Se souvenir de moi',
'email' => 'Email',
'id_producer' => 'Producteur'
];
}

/**
* Met à jour la date de dernière connexion de l'utilisateur.
*/
public function updateDerniereConnexion()
public function updateLastConnection()
{
$user = $this->getUser();
$user->date_derniere_connexion = date('Y-m-d H:i:s');
$user->date_last_connection = date('Y-m-d H:i:s');
$user->save();
}


+ 618
- 0
common/models/Order.php View File

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

/**
Copyright La boîte à pain (2018)

contact@laboiteapain.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 Yii;
use yii\helpers\Html;
use common\models\Producer;
use common\components\ActiveRecordCommon ;

/**
* This is the model class for table "order".
*
* @property integer $id
* @property integer $id_user
* @property string $date
* @property string $date_update
* @property integer $id_point_sale
* @property integer $id_distribution
* @property boolean $auto_payment
*/
class Order extends ActiveRecordCommon
{
var $amount = 0 ;
var $paid_amount = 0 ;
var $weight = 0 ;
const ORIGIN_AUTO = 'auto';
const ORIGIN_USER = 'user';
const ORIGIN_ADMIN = 'admin';
const PAYMENT_PAID = 'paid';
const PAYMENT_UNPAID = 'unpaid';
const PAYMENT_SURPLUS = 'surplus';
const AMOUNT_TOTAL = 'total' ;
const AMOUNT_PAID = 'paid' ;
const AMOUNT_REMAINING = 'remaining' ;
const AMOUNT_SURPLUS = 'surplus' ;
const STATE_OPEN = 'open';
const STATE_PREPARATION = 'preparation';
const STATE_DELIVERED = 'delivered';
/**
* @inheritdoc
*/
public static function tableName()
{
return 'order';
}
/**
* @inheritdoc
*/
public function rules()
{
return [
[['id_user', 'date', 'id_point_sale', 'id_distribution'], 'required', 'message' => ''],
[['id_user', 'id_point_sale', 'id_distribution'], 'integer'],
[['auto_payment'], 'boolean'],
[['date', 'date_update', 'comment', 'comment_point_sale'], 'safe']
];
}

/**
* @inheritdoc
*/
public function attributeLabels()
{
return [
'id' => 'ID',
'id_user' => 'Id User',
'date' => 'Date',
'date_update' => 'Date de modification',
'id_point_sale' => 'Point de vente',
'id_distribution' => 'Date de distribution',
];
}

/*
* Relations
*/

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

public function getProductOrder()
{
return $this->hasMany(ProductOrder::className(),['id_order' => 'id'])
->with('product');
}

public function getDistribution()
{
return $this->hasOne(Distribution::className(), ['id' => 'id_distribution'])
->with('producer');
}

public function getPointSale()
{
return $this->hasOne(PointSale::className(), ['id' => 'id_point_sale'])
->with('userPointSale');
}

public function getCreditHistory()
{
return $this->hasMany(CreditHistory::className(), ['id_order' => 'id']);
}

/**
* Retourne les options de base nécessaires à la fonction de recherche.
*
* @return array
*/
public static function defaultOptionsSearch() {
return [
'with' => ['productOrder', 'creditHistory', 'pointSale'],
'join_with' => ['distribution', 'user', 'user.userProducer'],
'orderby' => 'order.date ASC',
'attribute_id_producer' => 'distribution.id_producer'
] ;
}
/**
* Initialise le montant total, le montant déjà payé et le poids de la
* commande.
*/
public function init()
{
$this->initAmount() ;
$this->initPaidAmount() ;
return $this ;
}
/**
* Initialise le montant de la commande.
*
*/
public function initAmount() {
if (isset($this->productOrder)) {
foreach ($this->productOrder as $productOrder) {
if ($productOrder->sale_mode == Product::SALE_MODE_UNIT) {
$this->amount += $productOrder->price * $productOrder->quantity ;
if(isset($productOrder->product)) {
$this->weight += ($productOrder->quantity * $productOrder->product->weight) / 1000 ;
}
}
elseif ($productOrder->sale_mode == Product::SALE_MODE_WEIGHT) {
$this->amount += $productOrder->price * $productOrder->quantity / 1000;
}
}
}
}
/**
* Initialise le montant payé de la commande et le retourne.
*
* @return float
*/
public function initPaidAmount()
{
$history = CreditHistory::find()
->where(['id_order' => $this->id])
->all();

$this->paid_amount = 0 ;

if(count($history)) {
foreach ($history as $ch) {
if ($ch->type == CreditHistory::TYPE_PAYMENT) {
$this->paid_amount += $ch->amount;
}
elseif ($ch->type == CreditHistory::TYPE_REFUND) {
$this->paid_amount -= $ch->amount;
}
}
}
}
/**
* Retourne le montant de la commande (total, payé, restant, ou en surplus).
*
* @param boolean $format
* @return float
*/
public function getAmount($type = self::AMOUNT_TOTAL, $format = false)
{
switch($type) {
case self::AMOUNT_TOTAL :
$amount = $this->amount ;
break ;
case self::AMOUNT_PAID :
$this->initPaidAmount() ;
$amount = $this->paid_amount ;
break ;
case self::AMOUNT_REMAINING :
$amount = $this->getAmount(self::AMOUNT_TOTAL)
- $this->getAmount(self::AMOUNT_PAID) ;
break ;
case self::AMOUNT_EXCESS :
$amount = $this->getAmount(self::AMOUNT_PAID)
- $this->getAmount(self::AMOUNT_TOTAL) ;
break ;
}
if ($format) {
return number_format($amount, 2) . ' €';
}
else {
return $amount;
}
}

/**
* Retourne les informations relatives à la commande au format JSON.
*
* @return string
*/
public function getDataJson()
{
$order = Order::searchOne(['order.id' => $this->id]) ;

$jsonOrder = [] ;
if($order) {
$jsonOrder = [
'products' => [],
'amount' => $order->amount,
'str_amount' => $order->getAmount(self::AMOUNT_TOTAL, true),
'paid_amount' => $order->getAmount(self::AMOUNT_PAID),
'comment' => $order->comment,
];

foreach ($order->productOrder as $productOrder) {
$jsonOrder['products'][$productOrder->id_product] = $productOrder->quantity;
}
}

return json_encode($jsonOrder);
}

/**
* Enregistre un modèle de type CreditHistory.
*
* @param string $type
* @param float $montant
* @param integer $idProducer
* @param integer $idUser
* @param integer $idUserAction
*/
public function saveCreditHistory($type, $amount, $idProducer, $idUser, $idUserAction)
{
$creditHistory = new CreditHistory;
$creditHistory->id_user = $this->id_user;
$creditHistory->id_order = $this->id;
$creditHistory->amount = $amount;
$creditHistory->type = $type;
$creditHistory->id_producer = $idProducer;
$creditHistory->id_user_action = $idUserAction;
$creditHistory->populateRelation('order', $this) ;
$creditHistory->populateRelation('user', User::find()->where(['id' => $this->id_user])->one()) ;
$creditHistory->save();
}

/**
* Retourne le statut de paiement de la commande (payée, surplus, ou impayée).
*
* @return string
*/
public function getPaymentStatus()
{
// payé
if ($this->getAmount() - $this->getAmount(self::AMOUNT_PAID) < 0.01 &&
$this->getAmount() - $this->getAmount(self::AMOUNT_PAID) >= 0)
{
return self::PAYMENT_PAID ;
}
// à rembourser
elseif ($this->getAmount() - $this->getAmount(self::AMOUNT_PAID) <= -0.01) {
return self::PAYMENT_SURPLUS ;
}
// reste à payer
elseif ($this->getAmount() - $this->getAmount(self::AMOUNT_PAID) >= 0.01) {
return self::PAYMENT_UNPAID ;
}
}
/**
* Retourne le résumé du panier au format HTML.
*
* @return string
*/
public function getCartSummary()
{
if (!isset($this->productOrder)) {
$this->productOrder = productOrder::find()->where(['id_order' => $this->id])->all();
}
$html = '';
$count = count($this->productOrder);
$i = 0;
foreach ($this->productOrder as $p) {
if (isset($p->product)) {
$html .= $p->quantity . ' x ' . Html::encode($p->product->name);
if (++$i != $count) {
$html .= '<br />';
}
}
}
return $html;
}

/**
* Retourne le résumé du point de vente lié à la commande au format HTML.
*
* @return string
*/
public function getPointSaleSummary()
{
$html = '';

if (isset($this->pointSale)) {
$html .= '<span class="name-point-sale">' .
Html::encode($this->pointSale->name) .
'</span>' .
'<br /><span class="locality">'
. Html::encode($this->pointSale->locality)
. '</span>';
if (strlen($this->comment_point_sale)) {
$html .= '<div class="comment"><span>'
. Html::encode($this->comment_point_sale)
. '</span></div>';
}
} else {
$html .= 'Point de vente supprimé';
}

return $html;
}

/**
* Retourne le résumé du paiement (montant, statut).
*
* @return string
*/
public function getAmountSummary()
{
$html = '';

$html .= $this->getAmount(self::AMOUNT_TOTAL, true) . '<br />';

if ($this->paid_amount) {
if ($this->getPaymentStatus() == Order::PAYMENT_PAID) {
$html .= '<span class="label label-success">Payée</span>';
} elseif ($this->getPaymentStatus() == Order::PAYMENT_UNPAID) {
$html .= '<span class="label label-danger">Non payée</span><br />
Reste <strong>' . $this->getRemainingAmount(true) . '</strong> à payer';
} elseif ($this->getPaymentStatus() == Order::PAYMENT_SURPLUS) {
$html .= '<span class="label label-success">Payée</span>';
}
}
else {
$html .= '<span class="label label-default">À régler sur place</span>';
}

return $html;
}

/**
* Retourne une chaine de caractère décrivant l'utilisateur lié à la commande.
*
* @return string
*/
public function getStrUser()
{
if (isset($this->user)) {
return Html::encode($this->user->name . ' ' . $this->user->lastname);
} elseif (strlen($this->username)) {
return Html::encode($this->username);
} else {
return 'Client introuvable';
}
}

/**
* Retourne l'état de la commande (livrée, modifiable ou en préparation)
*
* @return string
*/
public function getState()
{
$orderDelay = Producer::getConfig(
'order_delay',
$this->distribution->id_producer
);
$orderDeadline = Producer::getConfig(
'order_deadline',
$this->distribution->id_producer
);

$orderDate = strtotime($this->distribution->date);
$today = strtotime(date('Y-m-d'));
$todayHour = date('G');

$nbDays = (int) (($orderDate - $today) / (24 * 60 * 60));

if ($nbDays <= 0) {
return self::STATE_DELIVERED;
}
elseif ($nbDays >= $orderDelay &&
($nbDays != $orderDelay ||
($nbDays == $orderDelay && $todayHour < $orderDeadline)))
{
return self::STATE_OPEN;
}
return self::STATE_PREPARATION ;
}

/**
* Retourne l'origine de la commande (client, automatique ou admin) sous forme
* texte ou HTML.
*
* @param boolean $with_label
* @return string
*/
public function getStrOrigin($withLabel = false)
{
$classLabel = '';
$str = '';

if ($this->origin == self::ORIGIN_USER) {
$classLabel = 'success';
$str = 'Client';
}
elseif ($this->origin == self::ORIGIN_AUTO) {
$classLabel = 'default';
$str = 'Auto';
}
elseif ($this->origin == self::ORIGIN_ADMIN) {
$classLabel = 'warning';
$str = 'Vous';
}

if ($withLabel) {
return '<span class="label label-' . $classLabel . '">'
. $str . '</span>';
}
else {
return $str;
}
}

/**
* Retourne l'historique de la commande (ajoutée, modifiée, supprimée) au
* format HTML.
*
* @return string
*/
public function getStrHistory()
{
$arr = [
'class' => 'create',
'glyphicon' => 'plus',
'str' => 'Ajoutée',
'date' => $this->date
] ;
if(!is_null($this->date_update)) {
$arr = [
'class' => 'update',
'glyphicon' => 'pencil',
'str' => 'Modifiée',
'date' => $this->date_update
] ;
}
if(!is_null($this->date_delete)) {
$arr = [
'class' => 'delete',
'glyphicon' => 'remove',
'str' => 'Annulée',
'date' => $this->date_delete
] ;
}
$html = '<div class="small"><span class="'.$arr['class'].'">'
. '<span class="glyphicon glyphicon-'.$arr['glyphicon'].'"></span> '
. $arr['str'].'</span> le <strong>'
. date('d/m/Y à G\hi', strtotime($arr['date'])).'</strong></div>' ;
return $html ;
}
/**
* Retourne une classe identifiant l'historique de la commande (ajoutée,
* modifiée, supprimée).
*
* @return string
*/
public function getClassHistory()
{
if(!is_null($this->date_delete)) {
return 'commande-delete' ;
}
if(!is_null($this->date_update)) {
return 'commande-update' ;
}
return 'commande-create' ;
}
/**
* Retourne la quantité d'un produit donné de plusieurs commandes.
*
* @param integer $idProduct
* @param array $orders
*
* @return integer
*/
public static function getProductQuantity($idProduct, $orders)
{
$quantity = 0;
if (isset($orders) && is_array($orders) && count($orders)) {
foreach ($orders as $c) {
if(is_null($c->date_delete)) {
foreach ($c->productOrder as $po) {
if ($po->id_product == $idProduct) {
$quantity += $po->quantity ;
}
}
}
}
}

return $quantity ;
}
/**
* Recherche et initialise des commandes.
*
* @param array $params
* @param array $conditions
* @param string $orderby
* @param integer $limit
* @return array
*/
public static function search($params = [], $options = [])
{
$orders = parent::search($params, $options) ;
/*
* Initialisation des commandes
*/
if(is_array($orders)) {
if(count($orders)) {
foreach($orders as $order) {
$order->init() ;
}
return $orders ;
}
}
else {
$order = $orders ;
if(is_a($order, 'common\models\Order')) {
return $order->init() ;
}
// count
else {
return $order ;
}
}
return false ;
}
}

+ 334
- 0
common/models/PointSale.php View File

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

/**
Copyright La boîte à pain (2018)

contact@laboiteapain.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 Yii;
use yii\helpers\Html;
use common\models\UserPointSale;
use common\models\PointSaleDistribution ;
use common\components\ActiveRecordCommon ;

/**
* This is the model class for table "point_vente".
*
* @property integer $id
* @property string $name
* @property string $address
* @property integer $id_producer
*/
class PointSale extends ActiveRecordCommon
{
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 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'], 'string'],
[['point_production', 'credit', 'delivery_monday', 'delivery_tuesday',
'delivery_wednesday', 'delivery_thursday', 'delivery_friday',
'delivery_saturday', 'delivery_sunday'], '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 Pain',
'delivery_monday' => 'Lundi',
'delivery_tuesday' => 'Mardi',
'delivery_wednesday' => 'Mercredi',
'delivery_thursday' => 'Jeudi',
'delivery_friday' => 'Vendredi',
'delivery_saturday' => 'Samedi',
'delivery_sunday' => 'Dimanche',
'code' => 'Code',
];
}

/*
* 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']
);
}

/**
* 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;

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

/**
* 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);
}

/**
* 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]);

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

/**
* 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;
}
}
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) ;
}
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 ;
}

}

+ 171
- 0
common/models/PointSaleDistribution.php View File

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

/**
Copyright La boîte à pain (2018)

contact@laboiteapain.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 Yii;
use common\components\ActiveRecordCommon ;
use common\models\PointVente;
use common\models\Production;

/**
* This is the model class for table "production_point_vente".
*
* @property integer $id_production
* @property integer $id_point_vente
* @property integer $livraison
*/
class PointSaleDistribution extends ActiveRecordCommon
{

var $points_sale_distribution;

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

/**
* @inheritdoc
*/
public function rules()
{
return [
[['id_distribution', 'id_point_sale'], 'required'],
[['id_distribution', 'id_point_sale', 'delivery'], 'integer'],
];
}

/**
* @inheritdoc
*/
public function attributeLabels()
{
return [
'id_distribution' => 'Distribution',
'id_point_sale' => 'Point de vente',
'delivery' => 'Livraison',
];
}

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

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

/**
* Définit les jours de livraisons des points de vente pour un jour de
* production donné.
*
* @param integer $id_production
* @param boolean $bool_livraison
*/
public static function setAll($idDistribution, $boolDelivery)
{
$countPointSaleDistribution = self::searchCount([
'id_distribution' => $idDistribution
]) ;

if (!$countPointSaleDistribution) {
$arrPointsSale = PointSale::searchAll() ;
foreach ($arrPointsSale as $pointSale) {
$pointSaleDistribution = new PointSaleDistribution();
$pointSaleDistribution->id_distribution = $idDistribution;
$pointSaleDistribution->id_point_sale = $pointSale->id;
$pointSaleDistribution->save();
}
}

$distribution = Distribution::findOne($idDistribution);

if ($distribution) {
$day = date('N', strtotime($distribution->date));

$arrPointsSaleDistribution = self::searchAll([
'id_distribution' => $idDistribution
]) ;
foreach ($arrPointsSaleDistribution as $pointSaleDistribution) {
if ($boolDelivery &&
(($day == 1 && $pointSaleDistribution->pointSale->delivery_monday) ||
($day == 2 && $pointSaleDistribution->pointSale->delivery_tuesday) ||
($day == 3 && $pointSaleDistribution->pointSale->delivery_wednesday) ||
($day == 4 && $pointSaleDistribution->pointSale->delivery_thursday) ||
($day == 5 && $pointSaleDistribution->pointSale->delivery_friday) ||
($day == 6 && $pointSaleDistribution->pointSale->delivery_saturday) ||
($day == 7 && $pointSaleDistribution->pointSale->delivery_sunday) ||
$pointSaleDistribution->pointSale->point_production
)) {
$pointSaleDistribution->delivery = 1;
} else {
$pointSaleDistribution->delivery = 0;
}

$pointSaleDistribution->save();
}
}
}

}

+ 0
- 308
common/models/PointVente.php View File

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

/**
Copyright La boîte à pain (2018)

contact@laboiteapain.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 Yii;
use yii\helpers\Html;
use common\models\PointVenteUser;
use common\models\ProductionPointVente;

/**
* This is the model class for table "point_vente".
*
* @property integer $id
* @property string $nom
* @property string $adresse
* @property integer $id_boulangerie
*/
class PointVente extends \yii\db\ActiveRecord
{
var $commandes = [];
var $recettes = 0;
var $data_select_commandes;
var $data_options_commandes;
var $users = [];
var $users_commentaire = [];

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

/**
* @inheritdoc
*/
public function rules()
{
return [
[['nom'], 'required'],
[['acces_restreint'], 'boolean'],
[['nom', 'code'], 'string', 'max' => 255],
[['adresse', 'localite', 'horaires_lundi', 'horaires_mardi', 'horaires_mercredi', 'horaires_jeudi', 'horaires_vendredi', 'horaires_samedi', 'horaires_dimanche'], 'string'],
[['point_fabrication', 'vrac', 'pain', 'credit_pain', 'livraison_lundi', 'livraison_mardi', 'livraison_mercredi', 'livraison_jeudi', 'livraison_vendredi', 'livraison_samedi', 'livraison_dimanche'], 'boolean'],
['point_fabrication', 'default', 'value' => 0],
['id_etablissement', 'integer'],
['id_etablissement', 'required'],
[['users', 'users_commentaire', 'code'], 'safe']
];
}

/**
* @inheritdoc
*/
public function attributeLabels()
{
return [
'id' => 'ID',
'nom' => 'Nom',
'adresse' => 'Adresse',
'localite' => 'Localité',
'point_fabrication' => 'Point de fabrication',
'horaires_lundi' => 'Lundi',
'horaires_mardi' => 'Mardi',
'horaires_mercredi' => 'Mercredi',
'horaires_jeudi' => 'Jeudi',
'horaires_vendredi' => 'Vendredi',
'horaires_samedi' => 'Samedi',
'horaires_dimanche' => 'Dimanche',
'vrac' => 'Livraison de vrac',
'pain' => 'Livraison de pain',
'acces_restreint' => 'Accès restreint',
'credit_pain' => 'Activer le Crédit Pain',
'livraison_lundi' => 'Lundi',
'livraison_mardi' => 'Mardi',
'livraison_mercredi' => 'Mercredi',
'livraison_jeudi' => 'Jeudi',
'livraison_vendredi' => 'Vendredi',
'livraison_samedi' => 'Samedi',
'livraison_dimanche' => 'Dimanche',
'code' => 'Code',
];
}

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

public function getProductionPointVente()
{
return $this->hasMany(ProductionPointVente::className(), ['id_point_vente' => 'id']);
}

/**
* Initialise les commandes liées au point de vente.
*
* @param array $commandes
*/
public function initCommandes($commandes)
{
$this->commandes = [];
$this->recettes = 0;

foreach ($commandes as $c) {
if ($this->id == $c->id_point_vente) {
$this->commandes[] = $c;

if(is_null($c->date_delete)) {
$this->recettes += (float) $c->montant;
}
}
}
}

/**
* Retourne les commandes liées à ce point de vente.
*
* @return array
*/
public function getCommandes()
{
return $this->commandes;
}
/**
* Enregistre le point de vente.
*
* @param boolean $runValidation
* @param array $attributeNames
* @return type
*/
public function save($runValidation = true, $attributeNames = NULL)
{
$this->id_etablissement = Yii::$app->user->identity->id_etablissement;
$this->pain = 1;
return parent::save($runValidation, $attributeNames);
}

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

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

if (is_array($this->users) && count($this->users)) {
foreach ($this->users as $key => $val) {
$user = User::findOne($val);
if ($user) {
$point_vente_user = new PointVenteUser;
$point_vente_user->id_user = $val;
$point_vente_user->id_point_vente = $this->id;
if (isset($this->users_commentaire[$val]) && strlen($this->users_commentaire[$val])) {
$point_vente_user->commentaire = $this->users_commentaire[$val];
}
$point_vente_user->save();
}
}
}
}

/**
* Retourne le commentaire de l'utilisateur courant lié au point de vente.
*
* @return string|null
*/
public function getCommentaire()
{
if (isset($this->pointVenteUser)) {
foreach ($this->pointVenteUser as $pvu) {
if ($pvu->id_user == Yii::$app->user->identity->id) {
return $pvu->commentaire;
}
}
}
return null ;
}

/**
* Retourne le nombre de points de vente pour l'établissement courant.
*
* @return integer
*/
public static function count()
{
return PointVente::find()
->where([
'id_etablissement' => Yii::$app->user->identity->id_etablissement
])
->count();
}

/**
* Vérifie le code d'accès à un point de vente.
*
* @param string $code
* @return boolean
*/
public function verifCode($code)
{
if (strlen($this->code)) {
if (trim(strtolower($code)) == trim(strtolower($this->code))) {
return true;
} else {
return false;
}
} else {
return true;
}
}
/**
* Retourne les jours de livraison du point de vente sous forme d'une chaine
* de caractères.
*
* @return string
*/
public function strJoursLivraison() {
$str = '' ;
if($this->livraison_lundi) $str .= 'lundi, ' ;
if($this->livraison_mardi) $str .= 'mardi, ' ;
if($this->livraison_mercredi) $str .= 'mercredi, ' ;
if($this->livraison_jeudi) $str .= 'jeudi, ' ;
if($this->livraison_vendredi) $str .= 'vendredi, ' ;
if($this->livraison_samedi) $str .= 'samedi, ' ;
if($this->livraison_dimanche) $str .= 'dimanche, ' ;

if(strlen($str))
return substr($str, 0, strlen($str)-2) ;
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 strInfos($jour) {
$str = '' ;
$champs = 'horaires_'.$jour ;
if(strlen($this->$champs)) {
$str = nl2br(Html::encode($this->$champs)) ;
$str = preg_replace('/\[select_previous_day\](.*?)\[\/select_previous_day\]/', '<a href="javascript:void(0);" class="select-previous-day">$1</a>' , $str) ;
}
return $str ;
}

}

+ 379
- 0
common/models/Producer.php View File

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

/**
Copyright La boîte à pain (2018)

contact@laboiteapain.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 Yii;
use common\components\ActiveRecordCommon ;
use common\helpers\Departments;
use yii\helpers\Html;

/**
* This is the model class for table "etablissement".
*
* @property integer $id
* @property string $name
* @property string $siret
* @property string $logo
* @property string $photo
* @property string $description
* @property string $postcode
* @property string $city
*/
class Producer extends ActiveRecordCommon
{
/**
* @inheritdoc
*/
public static function tableName()
{
return 'producer';
}

/**
* @inheritdoc
*/
public function rules()
{
return [
[['name', 'siret', 'order_deadline', 'order_delay','type'], 'required'],
[['order_deadline', 'order_delay'], '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', 'order_infos','slug'], 'string'],
[['negative_balance', 'credit', 'active'], 'boolean'],
[['name', 'siret', 'logo', 'photo', 'postcode', 'city', 'code','type'], 'string', 'max' => 255],
['free_price', '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'
];
}

/*
* 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]);
}
/**
* 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::searchAll(
['active' => 1],
['orderby' => 'postcode, city ASC']
) ;
$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
FROM `order`, product_order, distribution, product
WHERE `order`.id = product_order.id_order
AND distribution.id_producer = :id_producer
AND `order`.id_distribution = distribution.id
AND product_order.id_product = product.id
AND distribution.date > :date_begin
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
]);

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

/**
* 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 $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;
}
}

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;
}
}
}
/**
* Lie un utilisateur à un producteur.
*
* @param integer $id_user
* @param integer $id_producer
* @return UserProducer
*/
public static function addUser($idUser, $idProducer)
{
$userProducer = UserProducer::searchOne([
'id_user' => $idUser,
'id_producer' => $idProducer
]) ;

if (!$userProducer) {
$newUserProducer = new UserProducer;
$newUserProducer->id_producer = $idProducer;
$newUserProducer->id_user = $idUser;
$newUserProducer->credit = 0;
$newUserProducer->active = 1;
$newUserProducer->bookmark = 1;
$newUserProducer->save();
} else {
if (!$userProducer->active) {
$userProducer->active = 1;
$userProducer->save();
}
}
return $userProducer ;
}
/**
* Retourne le producteur courant (le producteur auquel l'utilisateur
* connecté est rattaché).
*
* @return integer|boolean
*/
public static function getId()
{
if(!Yii::$app->user->isGuest) {
return Yii::$app->user->identity->id_producer ;
}
return false ;
}
/**
* Retourne le producteur courant.
*
* @return Producer|boolean
*/
public static function get()
{
if(self::getId()) {
return self::searchOne() ;
}
return false ;
}

}

common/models/Produit.php → common/models/Product.php View File

@@ -39,32 +39,33 @@ termes.
namespace common\models;

use Yii;
use common\components\ActiveRecordCommon ;

/**
* This is the model class for table "produit".
* This is the model class for table "product".
*
* @property integer $id
* @property string $nom
* @property string $name
* @property string $description
* @property integer $actif
* @property string $illustration
* @property integer $active
* @property string $photo
* @property string $saison
* @property double $prix
* @property double $poids
* @property string $recette
* @property double $price
* @property double $pweight
* @property string $recipe
*/
class Produit extends \yii\db\ActiveRecord
class Product extends ActiveRecordCommon
{
var $total = 0;

var $total = 0;

const SALE_MODE_UNIT = 'unit' ;
const SALE_MODE_WEIGHT = 'weight' ;
/**
* @inheritdoc
*/
public static function tableName()
{
return 'produit';
return 'product';
}

/**
@@ -73,13 +74,13 @@ class Produit extends \yii\db\ActiveRecord
public function rules()
{
return [
[['nom', 'id_etablissement'], 'required'],
[['actif', 'order', 'quantite_max', 'id_etablissement'], 'integer'],
[['lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi', 'dimanche', 'epuise'], 'boolean'],
[['prix', 'poids'], 'number'],
[['illustration', 'photo'], 'file'],
[['nom', 'description', 'illustration', 'photo', 'saison', 'diminutif'], 'string', 'max' => 255],
[['recette'], 'string', 'max' => 1000],
[['name', 'id_producer'], 'required'],
[['active', 'order', 'quantity_max', 'id_producer'], 'integer'],
[['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday', 'unavailable'], 'boolean'],
[['price', 'weight'], 'number'],
[[ 'photo'], 'file'],
[['name', 'description', 'photo'], 'string', 'max' => 255],
[['recipe'], 'string', 'max' => 1000],
];
}

@@ -90,27 +91,39 @@ class Produit extends \yii\db\ActiveRecord
{
return [
'id' => 'ID',
'nom' => 'Nom',
'name' => 'Nom',
'description' => 'Description',
'actif' => 'Actif',
'illustration' => 'Illustration',
'active' => 'Actif',
'photo' => 'Photo',
'saison' => 'Saison',
'prix' => 'Prix',
'poids' => 'Poids (g)',
'recette' => 'Recette',
'lundi' => 'Lundi',
'mardi' => 'Mardi',
'mercredi' => 'Mercredi',
'jeudi' => 'Jeudi',
'vendredi' => 'Vendredi',
'samedi' => 'Samedi',
'dimanche' => 'Dimanche',
'price' => 'Prix',
'weight' => 'Poids (g)',
'recipe' => 'Recette',
'monday' => 'Lundi',
'tuesday' => 'Mardi',
'wednesday' => 'Mercredi',
'thursday' => 'Jeudi',
'friday' => 'Vendredi',
'saturday' => 'Samedi',
'sunday' => 'Dimanche',
'order' => 'Ordre',
'quantite_max' => 'Quantité max par défaut',
'epuise' => 'Épuisé',
'quantity_max' => 'Quantité max par défaut',
'unavailable' => 'Épuisé',
];
}
/**
* Retourne les options de base nécessaires à la fonction de recherche.
*
* @return array
*/
public static function defaultOptionsSearch() {
return [
'with' => [],
'join_with' => [],
'orderby' => 'order ASC',
'attribute_id_producer' => 'product.id_producer'
] ;
}

/**
* Retourne la description du produit.
@@ -120,11 +133,11 @@ class Produit extends \yii\db\ActiveRecord
public function getDescription()
{
$description = $this->description;
if (isset($this->poids) && is_numeric($this->poids) && $this->poids > 0) {
if ($this->poids >= 1000) {
$description .= ' (' . ($this->poids / 1000) . 'kg)';
if (isset($this->weight) && is_numeric($this->weight) && $this->weight > 0) {
if ($this->weight >= 1000) {
$description .= ' (' . ($this->weight / 1000) . 'kg)';
} else {
$description .= ' (' . $this->poids . 'g)';
$description .= ' (' . $this->weight . 'g)';
}
}
return $description;
@@ -134,9 +147,9 @@ class Produit extends \yii\db\ActiveRecord
* Retourne le libellé (admin) du produit.
* @return type
*/
public function getLibelleAdmin()
public function getStrWordingAdmin()
{
return $this->nom;
return $this->name;
}

/**
@@ -148,40 +161,25 @@ class Produit extends \yii\db\ActiveRecord
*/
public function save($runValidation = true, $attributeNames = NULL)
{
$this->id_etablissement = Yii::$app->user->identity->id_etablissement;
$this->id_producer = Producer::getId();
return parent::save($runValidation, $attributeNames);
}

/**
* Retourne les produits de l'établissement courant.
*
* @return array
*/
public function getAll()
{
return Produit::find()
->where([
'id_etablissement' => Yii::$app->user->identity->id_etablissement,
])
->orderBy('order ASC')
->all();
}

/**
* Retourne les produits d'une production donnée.
*
* @param integer $id_production
* @param integer $idDistribution
* @return array
*/
public function getByProduction($id_production)
public static function searchByDistribution($idDistribution)
{
return Produit::find()
->leftJoin('production_produit', 'produit.id = production_produit.id_produit')
return Product::find()
->leftJoin('product_distribution', 'product.id = product_distribution.id_product')
->where([
'id_etablissement' => Yii::$app->user->identity->id_etablissement,
'production_produit.id_production' => $id_production
'id_producer' => Producer::getId(),
'product_distribution.id_distribution' => $idDistribution
])
->orderBy('production_produit.actif DESC, produit.order ASC')
->orderBy('product_distribution.active DESC, product.order ASC')
->all();
}

@@ -192,11 +190,7 @@ class Produit extends \yii\db\ActiveRecord
*/
public static function count()
{
return Produit::find()
->where([
'id_etablissement' => Yii::$app->user->identity->id_etablissement
])
->count();
return self::searchCount() ;
}

}

common/models/ProductionProduit.php → common/models/ProductDistribution.php View File

@@ -38,18 +38,19 @@ termes.

namespace common\models;

use Yii ;
use yii\base\Object;
use Yii;
use common\components\ActiveRecordCommon ;

/**
* This is the model class for table "production_produit".
*
* @property integer $id
* @property integer $id_production
* @property integer $id_produit
* @property integer $actif
* @property integer $id_distribution
* @property integer $id_product
* @property integer $active
*/
class ProductionProduit extends \yii\db\ActiveRecord
class ProductDistribution extends ActiveRecordCommon
{

/**
@@ -57,7 +58,7 @@ class ProductionProduit extends \yii\db\ActiveRecord
*/
public static function tableName()
{
return 'production_produit';
return 'product_distribution';
}

/**
@@ -66,7 +67,7 @@ class ProductionProduit extends \yii\db\ActiveRecord
public function rules()
{
return [
[['id_production', 'id_produit', 'actif', 'quantite_max'], 'integer']
[['id_distribution', 'id_product', 'active', 'quantity_max'], 'integer']
];
}

@@ -74,9 +75,14 @@ class ProductionProduit extends \yii\db\ActiveRecord
* Relations
*/
public function getProduit()
public function getProduct()
{
return $this->hasOne(Produit::className(), ['id' => 'id_produit']);
return $this->hasOne(Product::className(), ['id' => 'id_product']);
}
public function getDistribution()
{
return $this->hasOne(Distribution::className(), ['id' => 'id_distribution']);
}

/**
@@ -86,49 +92,56 @@ class ProductionProduit extends \yii\db\ActiveRecord
{
return [
'id' => 'ID',
'id_production' => 'Id Production',
'id_produit' => 'Id Produit',
'actif' => 'Actif',
'quantite_max' => 'Quantité max',
'id_distribution' => 'Distribution',
'id_product' => 'Produit',
'active' => 'Actif',
'quantity_max' => 'Quantité max',
];
}
/**
* Retourne les options de base nécessaires à la fonction de recherche.
*
* @return array
*/
public static function defaultOptionsSearch() {
return [
'with' => ['product','distribution'],
'join_with' => [],
'orderby' => '',
'attribute_id_producer' => ''
] ;
}

/**
* Recherche les enregistrement ProductionProduit liés à une production.
*
* @param integer $id_production
* @param integer $idDistribution
* @return array
*/
public static function findProduits($id_production) {

$production_produits = ProductionProduit::find()
->with('produit')
->where(['id_production' => $id_production])
->all();

$arr_production_produits = [];

$commandes = Commande::find()
->with('commandeProduits', 'user')
->joinWith('production')
->where(['production.id' => $id_production])
->orderBy('date ASC')
->all();

foreach ($production_produits as $pp) {
if (isset($pp->produit)) {
$arr_production_produits[$pp->id_produit] = [
'actif' => (int) $pp->actif,
'epuise' => (int) $pp->produit->epuise,
'vrac' => (int) $pp->produit->vrac,
'quantite_max' => $pp->quantite_max,
'quantite_commandee' => Commande::getQuantiteProduit($pp->id_produit, $commandes),
'quantite_restante' => $pp->quantite_max - Commande::getQuantiteProduit($pp->id_produit, $commandes)
];
public static function searchByDistribution($idDistribution)
{
$arrayProductsDistribution = ProductDistribution::searchAll([
'id_distribution' => $idDistribution
]) ;
$orders = Order::searchAll([
'distribution.id' => $idDistribution
]) ;

foreach ($arrayProductsDistribution as $productDistribution) {
if (isset($productDistribution->product)) {
$arrayProductsDistribution[$productDistribution->id_product] = [
'active' => (int) $productDistribution->active,
'unavailable' => (int) $productDistribution->product->unavailable,
'quantity_max' => $productDistribution->quantity_max,
'quantity_order' => Order::getProductQuantity($productDistribution->id_product, $orders),
'quantity_remaining' => $productDistribution->quantity_max - Order::getProductQuantity($productDistribution->id_product, $orders)
];
}
}

return $arr_production_produits;
return $arrayProductsDistribution;
}

}

common/models/CommandeProduit.php → common/models/ProductOrder.php View File

@@ -39,16 +39,17 @@ termes.
namespace common\models;

use Yii;
use common\components\ActiveRecordCommon ;

/**
* This is the model class for table "commande_produit".
* This is the model class for table "product_order".
*
* @property integer $id
* @property integer $id_commande
* @property integer $id_produit
* @property double $quantite
* @property integer $id_order
* @property integer $id_product
* @property double $quantity
*/
class CommandeProduit extends \yii\db\ActiveRecord
class ProductOrder extends ActiveRecordCommon
{

/**
@@ -56,16 +57,16 @@ class CommandeProduit extends \yii\db\ActiveRecord
*/
public static function tableName()
{
return 'commande_produit';
return 'product_order';
}

/*
* Relations
*/

public function getProduit()
public function getProduct()
{
return $this->hasOne(Produit::className(), ['id' => 'id_produit']);
return $this->hasOne(Product::className(), ['id' => 'id_product']);
}

/**
@@ -74,9 +75,9 @@ class CommandeProduit extends \yii\db\ActiveRecord
public function rules()
{
return [
[['id_commande', 'id_produit', 'quantite'], 'required'],
[['id_commande', 'id_produit'], 'integer'],
[['quantite'], 'number', 'min' => 0]
[['id_order', 'id_product', 'quantity'], 'required'],
[['id_order', 'id_product'], 'integer'],
[['quantity'], 'number', 'min' => 0]
];
}

@@ -87,10 +88,24 @@ class CommandeProduit extends \yii\db\ActiveRecord
{
return [
'id' => 'ID',
'id_commande' => 'Id Commande',
'id_produit' => 'Id Produit',
'quantite' => 'Quantite',
'id_order' => 'Commande',
'id_product' => 'Product',
'quantity' => 'Quantité',
];
}
/**
* 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' => ''
] ;
}

}

common/models/CommandeAutoProduit.php → common/models/ProductSubscription.php View File

@@ -39,17 +39,18 @@ termes.
namespace common\models;

use Yii;
use common\models\Produit;
use common\models\Product;
use common\components\ActiveRecordCommon ;

/**
* This is the model class for table "commande_auto_produit".
*
* @property integer $id
* @property integer $id_commande_auto
* @property integer $id_produit
* @property double $quantite
* @property integer $id_subscription
* @property integer $id_product
* @property double $quantity
*/
class CommandeAutoProduit extends \yii\db\ActiveRecord
class ProductSubscription extends ActiveRecordCommon
{

/**
@@ -57,7 +58,7 @@ class CommandeAutoProduit extends \yii\db\ActiveRecord
*/
public static function tableName()
{
return 'commande_auto_produit';
return 'product_subscription';
}

/**
@@ -66,9 +67,9 @@ class CommandeAutoProduit extends \yii\db\ActiveRecord
public function rules()
{
return [
[['id_commande_auto', 'id_produit'], 'required'],
[['id_commande_auto', 'id_produit'], 'integer'],
[['quantite'], 'number'],
[['id_subscription', 'id_product'], 'required'],
[['id_subscription', 'id_product'], 'integer'],
[['quantity'], 'number'],
];
}

@@ -79,9 +80,9 @@ class CommandeAutoProduit extends \yii\db\ActiveRecord
{
return [
'id' => 'ID',
'id_commande_auto' => 'Id Commande Auto',
'id_produit' => 'Id Produit',
'quantite' => 'Quantite',
'id_subscription' => 'Abonnement',
'id_product' => 'Produit',
'quantity' => 'Quantité',
];
}

@@ -89,9 +90,23 @@ class CommandeAutoProduit extends \yii\db\ActiveRecord
* Relations
*/
public function getProduit()
public function getProduct()
{
return $this->hasOne(Produit::className(), ['id' => 'id_produit']);
return $this->hasOne(Product::className(), ['id' => 'id_product']);
}
/**
* Retourne les options de base nécessaires à la fonction de recherche.
*
* @return array
*/
public static function defaultOptionsSearch() {
return [
'with' => ['product'],
'join_with' => [],
'orderby' => '',
'attribute_id_producer' => ''
] ;
}

}

+ 0
- 206
common/models/Production.php View File

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

/**
Copyright La boîte à pain (2018)

contact@laboiteapain.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 Yii;
use common\models\Commande;
use common\models\Production;

/**
* This is the model class for table "production".
*
* @property integer $id
* @property string $date
* @property integer $actif
*/
class Production extends \yii\db\ActiveRecord
{

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

public function getEtablissement()
{
return $this->hasOne(Etablissement::className(), ['id' => 'id_etablissement']);
}

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

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

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

public function getProductionProduit()
{
return $this->hasMany(ProductionProduit::className(), ['id_production' => 'id']);
}

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

foreach ($this->productionProduit as $production_produit) {
if ($production_produit['id_produit'] == $id_produit &&
$production_produit['actif'])
{
return true;
}
}
}

return false;
}
/**
* Initialise un jour de production.
*
* @param string $date
* @return Production
*/
public static function initProduction($date)
{
$production = null ;
if ($date != '') {
$production = Production::find()
->where(['date' => $date])
->andWhere(['id_etablissement' => Yii::$app->user->identity->id_etablissement])
->one();
if (!$production) {
$production = new Production;
$production->date = $date;
$production->livraison = 1;
$production->id_etablissement = Yii::$app->user->identity->id_etablissement;
$production->save();
}
}

// production_point_vente à définir s'ils ne sont pas initialisés
if ($production) {
$count_productions_point_vente = ProductionPointVente::find()->
where([
'id_production' => $production->id
])
->count();

if (!$count_productions_point_vente) {
ProductionPointVente::setAll($production->id, true);
}
}
// init produits sélectionnés pour cette production
$produits = Produit::getAll();
if ($production) {
$day_production = date('N', strtotime($production->date));
$produits_production = ProductionProduit::find()->where(['id_production' => $production->id])->all();

if (!count($produits_production)) {
foreach ($produits as $p) {
$pp = new ProductionProduit();
$pp->id_production = $production->id;
$pp->id_produit = $p->id;

$pp->actif = 0;
if ($p->actif && $day_production == 1 && $p->lundi)
$pp->actif = 1;
if ($p->actif && $day_production == 2 && $p->mardi)
$pp->actif = 1;
if ($p->actif && $day_production == 3 && $p->mercredi)
$pp->actif = 1;
if ($p->actif && $day_production == 4 && $p->jeudi)
$pp->actif = 1;
if ($p->actif && $day_production == 5 && $p->vendredi)
$pp->actif = 1;
if ($p->actif && $day_production == 6 && $p->samedi)
$pp->actif = 1;
if ($p->actif && $day_production == 7 && $p->dimanche)
$pp->actif = 1;

$pp->quantite_max = $p->quantite_max;

$pp->save();
}
}
}
return $production ;
}

}

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save