浏览代码

Refactoring services #885

refactoring
Guillaume 1年前
父节点
当前提交
6b8e6e95fe
共有 26 个文件被更改,包括 1634 次插入1639 次删除
  1. +35
    -35
      backend/controllers/BackendController.php
  2. +63
    -66
      backend/controllers/CommunicateAdminController.php
  3. +56
    -55
      backend/controllers/CommunicateController.php
  4. +58
    -58
      backend/controllers/CronController.php
  5. +41
    -41
      backend/controllers/DeliveryNoteController.php
  6. +51
    -50
      backend/controllers/DevelopmentController.php
  7. +42
    -38
      backend/controllers/DistributionController.php
  8. +163
    -167
      backend/controllers/DocumentController.php
  9. +44
    -46
      backend/controllers/InvoiceController.php
  10. +20
    -20
      backend/controllers/OrderController.php
  11. +86
    -89
      backend/controllers/PointSaleController.php
  12. +91
    -91
      backend/controllers/ProducerAdminController.php
  13. +1
    -2
      backend/controllers/ProducerController.php
  14. +96
    -96
      backend/controllers/ProducerPriceRangeAdminController.php
  15. +6
    -6
      backend/controllers/ProductController.php
  16. +58
    -59
      backend/controllers/QuotationController.php
  17. +102
    -102
      backend/controllers/ReportController.php
  18. +215
    -214
      backend/controllers/SiteController.php
  19. +96
    -97
      backend/controllers/StatsController.php
  20. +129
    -133
      backend/controllers/SubscriptionController.php
  21. +18
    -18
      backend/controllers/UserController.php
  22. +109
    -111
      backend/controllers/UserGroupController.php
  23. +4
    -1
      backend/views/layouts/content.php
  24. +14
    -13
      backend/views/layouts/header.php
  25. +35
    -30
      backend/views/layouts/left.php
  26. +1
    -1
      common/logic/Producer/Producer/ProducerRepository.php

+ 35
- 35
backend/controllers/BackendController.php 查看文件

@@ -1,40 +1,40 @@
<?php

/**
Copyright distrib (2018)
contact@opendistrib.net
Ce logiciel est un programme informatique servant à aider les producteurs
à distribuer leur production en circuits courts.
Ce logiciel est régi par la licence CeCILL soumise au droit français et
respectant les principes de diffusion des logiciels libres. Vous pouvez
utiliser, modifier et/ou redistribuer ce programme sous les conditions
de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA
sur le site "http://www.cecill.info".
En contrepartie de l'accessibilité au code source et des droits de copie,
de modification et de redistribution accordés par cette licence, il n'est
offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons,
seule une responsabilité restreinte pèse sur l'auteur du programme, le
titulaire des droits patrimoniaux et les concédants successifs.
A cet égard l'attention de l'utilisateur est attirée sur les risques
associés au chargement, à l'utilisation, à la modification et/ou au
développement et à la reproduction du logiciel par l'utilisateur étant
donné sa spécificité de logiciel libre, qui peut le rendre complexe à
manipuler et qui le réserve donc à des développeurs et des professionnels
avertis possédant des connaissances informatiques approfondies. Les
utilisateurs sont donc invités à charger et tester l'adéquation du
logiciel à leurs besoins dans des conditions permettant d'assurer la
sécurité de leurs systèmes et ou de leurs données et, plus généralement,
à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.
Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
pris connaissance de la licence CeCILL, et que vous en avez accepté les
termes.
*/
/**
* Copyright distrib (2018)
*
* contact@opendistrib.net
*
* Ce logiciel est un programme informatique servant à aider les producteurs
* à distribuer leur production en circuits courts.
*
* Ce logiciel est régi par la licence CeCILL soumise au droit français et
* respectant les principes de diffusion des logiciels libres. Vous pouvez
* utiliser, modifier et/ou redistribuer ce programme sous les conditions
* de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA
* sur le site "http://www.cecill.info".
*
* En contrepartie de l'accessibilité au code source et des droits de copie,
* de modification et de redistribution accordés par cette licence, il n'est
* offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons,
* seule une responsabilité restreinte pèse sur l'auteur du programme, le
* titulaire des droits patrimoniaux et les concédants successifs.
*
* A cet égard l'attention de l'utilisateur est attirée sur les risques
* associés au chargement, à l'utilisation, à la modification et/ou au
* développement et à la reproduction du logiciel par l'utilisateur étant
* donné sa spécificité de logiciel libre, qui peut le rendre complexe à
* manipuler et qui le réserve donc à des développeurs et des professionnels
* avertis possédant des connaissances informatiques approfondies. Les
* utilisateurs sont donc invités à charger et tester l'adéquation du
* logiciel à leurs besoins dans des conditions permettant d'assurer la
* sécurité de leurs systèmes et ou de leurs données et, plus généralement,
* à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.
*
* Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
* pris connaissance de la licence CeCILL, et que vous en avez accepté les
* termes.
*/

namespace backend\controllers;


+ 63
- 66
backend/controllers/CommunicateAdminController.php 查看文件

@@ -1,54 +1,54 @@
<?php

/**
Copyright distrib (2018)
contact@opendistrib.net
Ce logiciel est un programme informatique servant à aider les producteurs
à distribuer leur production en circuits courts.
Ce logiciel est régi par la licence CeCILL soumise au droit français et
respectant les principes de diffusion des logiciels libres. Vous pouvez
utiliser, modifier et/ou redistribuer ce programme sous les conditions
de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA
sur le site "http://www.cecill.info".
En contrepartie de l'accessibilité au code source et des droits de copie,
de modification et de redistribution accordés par cette licence, il n'est
offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons,
seule une responsabilité restreinte pèse sur l'auteur du programme, le
titulaire des droits patrimoniaux et les concédants successifs.
A cet égard l'attention de l'utilisateur est attirée sur les risques
associés au chargement, à l'utilisation, à la modification et/ou au
développement et à la reproduction du logiciel par l'utilisateur étant
donné sa spécificité de logiciel libre, qui peut le rendre complexe à
manipuler et qui le réserve donc à des développeurs et des professionnels
avertis possédant des connaissances informatiques approfondies. Les
utilisateurs sont donc invités à charger et tester l'adéquation du
logiciel à leurs besoins dans des conditions permettant d'assurer la
sécurité de leurs systèmes et ou de leurs données et, plus généralement,
à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.
Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
pris connaissance de la licence CeCILL, et que vous en avez accepté les
termes.
*/
/**
* Copyright distrib (2018)
*
* contact@opendistrib.net
*
* Ce logiciel est un programme informatique servant à aider les producteurs
* à distribuer leur production en circuits courts.
*
* Ce logiciel est régi par la licence CeCILL soumise au droit français et
* respectant les principes de diffusion des logiciels libres. Vous pouvez
* utiliser, modifier et/ou redistribuer ce programme sous les conditions
* de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA
* sur le site "http://www.cecill.info".
*
* En contrepartie de l'accessibilité au code source et des droits de copie,
* de modification et de redistribution accordés par cette licence, il n'est
* offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons,
* seule une responsabilité restreinte pèse sur l'auteur du programme, le
* titulaire des droits patrimoniaux et les concédants successifs.
*
* A cet égard l'attention de l'utilisateur est attirée sur les risques
* associés au chargement, à l'utilisation, à la modification et/ou au
* développement et à la reproduction du logiciel par l'utilisateur étant
* donné sa spécificité de logiciel libre, qui peut le rendre complexe à
* manipuler et qui le réserve donc à des développeurs et des professionnels
* avertis possédant des connaissances informatiques approfondies. Les
* utilisateurs sont donc invités à charger et tester l'adéquation du
* logiciel à leurs besoins dans des conditions permettant d'assurer la
* sécurité de leurs systèmes et ou de leurs données et, plus généralement,
* à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.
*
* Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
* pris connaissance de la licence CeCILL, et que vous en avez accepté les
* termes.
*/

namespace backend\controllers;

use backend\models\MailForm ;
use yii\web\NotFoundHttpException ;
use common\models\ User ;
use backend\models\MailForm;
use yii\web\NotFoundHttpException;
use common\models\ User;

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

public function behaviors()
public function behaviors()
{
return [
'verbs' => [
@@ -64,7 +64,7 @@ class CommunicateAdminController extends BackendController
'allow' => true,
'roles' => ['@'],
'matchCallback' => function ($rule, $action) {
return User::getCurrentStatus() == User::STATUS_ADMIN;
return User::getCurrentStatus() == User::STATUS_ADMIN;
}
]
],
@@ -73,59 +73,56 @@ class CommunicateAdminController extends BackendController
}

/**
*
*
*
*
* @return mixed
*/
public function actionIndex($section = 'producers')
public function actionIndex($section = 'producers')
{
if($section == 'producers') {
$producers = Producer::find()->where(['producer.active' => 1])->with(['contact'])->all() ;
if ($section == 'producers') {
$producers = Producer::find()->where(['producer.active' => 1])->with(['contact'])->all();
$usersArray = [];
$users = [] ;
$users = [];
foreach ($producers as $producer) {
if (isset($producer->contact) && is_array($producer->contact)) {
foreach($producer->contact as $contact) {
$usersArray[] = $contact->email ;
foreach ($producer->contact as $contact) {
$usersArray[] = $contact->email;
$users[] = [
'email' => $contact->email,
'name' => $contact->name,
'lastname' => $contact->lastname,
] ;
];
}
}
}
}
elseif($section == 'users') {
$users = User::find()
} elseif ($section == 'users') {
$users = User::find()
->where([
'user.status' => User::STATUS_ACTIVE
'user.status' => User::STATUS_ACTIVE
])
->all() ;
->all();
$usersArray = [];
foreach ($users as $user) {
if (isset($user['email']) && strlen($user['email'])) {
$usersArray[] = $user['email'];
}
}
}
else {
} else {
throw new NotFoundHttpException('Requête incorrecte.');
}
$mailForm = new MailForm() ;
$mailForm = new MailForm();
if ($mailForm->load(Yii::$app->request->post()) && $mailForm->validate()) {
$resultSendEmail = $mailForm->sendEmail($users, false) ;
if($resultSendEmail) {
$resultSendEmail = $mailForm->sendEmail($users, false);
if ($resultSendEmail) {
Yii::$app->getSession()->setFlash('success', 'Votre email a bien été envoyé.');
}
else {
} else {
Yii::$app->getSession()->setFlash('error', 'Un problème est survenu lors de l\'envoi de votre email.');
}
$mailForm->subject = '' ;
$mailForm->message = '' ;
$mailForm->subject = '';
$mailForm->message = '';
}
return $this->render('index', [
'section' => $section,
'usersArray' => $usersArray,

+ 56
- 55
backend/controllers/CommunicateController.php 查看文件

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

/**
Copyright distrib (2018)
contact@opendistrib.net
Ce logiciel est un programme informatique servant à aider les producteurs
à distribuer leur production en circuits courts.
Ce logiciel est régi par la licence CeCILL soumise au droit français et
respectant les principes de diffusion des logiciels libres. Vous pouvez
utiliser, modifier et/ou redistribuer ce programme sous les conditions
de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA
sur le site "http://www.cecill.info".
En contrepartie de l'accessibilité au code source et des droits de copie,
de modification et de redistribution accordés par cette licence, il n'est
offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons,
seule une responsabilité restreinte pèse sur l'auteur du programme, le
titulaire des droits patrimoniaux et les concédants successifs.
A cet égard l'attention de l'utilisateur est attirée sur les risques
associés au chargement, à l'utilisation, à la modification et/ou au
développement et à la reproduction du logiciel par l'utilisateur étant
donné sa spécificité de logiciel libre, qui peut le rendre complexe à
manipuler et qui le réserve donc à des développeurs et des professionnels
avertis possédant des connaissances informatiques approfondies. Les
utilisateurs sont donc invités à charger et tester l'adéquation du
logiciel à leurs besoins dans des conditions permettant d'assurer la
sécurité de leurs systèmes et ou de leurs données et, plus généralement,
à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.
Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
pris connaissance de la licence CeCILL, et que vous en avez accepté les
termes.
*/
/**
* Copyright distrib (2018)
*
* contact@opendistrib.net
*
* Ce logiciel est un programme informatique servant à aider les producteurs
* à distribuer leur production en circuits courts.
*
* Ce logiciel est régi par la licence CeCILL soumise au droit français et
* respectant les principes de diffusion des logiciels libres. Vous pouvez
* utiliser, modifier et/ou redistribuer ce programme sous les conditions
* de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA
* sur le site "http://www.cecill.info".
*
* En contrepartie de l'accessibilité au code source et des droits de copie,
* de modification et de redistribution accordés par cette licence, il n'est
* offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons,
* seule une responsabilité restreinte pèse sur l'auteur du programme, le
* titulaire des droits patrimoniaux et les concédants successifs.
*
* A cet égard l'attention de l'utilisateur est attirée sur les risques
* associés au chargement, à l'utilisation, à la modification et/ou au
* développement et à la reproduction du logiciel par l'utilisateur étant
* donné sa spécificité de logiciel libre, qui peut le rendre complexe à
* manipuler et qui le réserve donc à des développeurs et des professionnels
* avertis possédant des connaissances informatiques approfondies. Les
* utilisateurs sont donc invités à charger et tester l'adéquation du
* logiciel à leurs besoins dans des conditions permettant d'assurer la
* sécurité de leurs systèmes et ou de leurs données et, plus généralement,
* à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.
*
* Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
* pris connaissance de la licence CeCILL, et que vous en avez accepté les
* termes.
*/

namespace backend\controllers;

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

public function behaviors() {
public function behaviors()
{
return [
'verbs' => [
'class' => VerbFilter::className(),
@@ -70,14 +71,14 @@ class CommunicateController extends BackendController
/**
* Affiche la page d'accueil de la section avec un aperçu du mpde d'emploi
* à imprimer.
*
*
* @return string
*/
public function actionIndex()
public function actionIndex()
{
$producer = Producer::searchOne() ;
$pointsSaleArray = PointSale::searchAll() ;
$producer = Producer::searchOne();
$pointsSaleArray = PointSale::searchAll();
return $this->render('index', [
'producer' => $producer,
'pointsSaleArray' => $pointsSaleArray,
@@ -87,12 +88,12 @@ class CommunicateController extends BackendController
/**
* Génére un PDF contenant le mode d'emploi d'utilisation de la plateforme
* à destination des clients des producteurs.
*
*
* @return string
*/
public function actionInstructions()
public function actionInstructions()
{
$producer = Producer::searchOne() ;
$producer = Producer::searchOne();

// get your HTML raw content without any layouts or scripts
$content = $this->renderPartial('instructions_multi', [
@@ -119,16 +120,16 @@ class CommunicateController extends BackendController
// enhanced bootstrap css built by Krajee for mPDF formatting
//'cssFile' => '@vendor/kartik-v/yii2-mpdf/assets/kv-mpdf-bootstrap.min.css',
'cssFile' => '@app/web/css/screen.css',
// any css to be embedded if required
//'cssInline' => '.kv-heading-1{font-size:18px}',
// set mPDF properties on the fly
//'options' => ['title' => 'Krajee Report Title'],
// call mPDF methods on the fly
/* 'methods' => [
'SetHeader'=>['Commandes du '.$date_str],
'SetFooter'=>['{PAGENO}'],
] */
// any css to be embedded if required
//'cssInline' => '.kv-heading-1{font-size:18px}',
// set mPDF properties on the fly
//'options' => ['title' => 'Krajee Report Title'],
// call mPDF methods on the fly
/* 'methods' => [
'SetHeader'=>['Commandes du '.$date_str],
'SetFooter'=>['{PAGENO}'],
] */
]);

// return the pdf output as per the destination setting

+ 58
- 58
backend/controllers/CronController.php 查看文件

@@ -50,26 +50,26 @@ class CronController extends BackendController
public function behaviors()
{
return [
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
'delete' => ['post'],
],
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
'delete' => ['post'],
],
'access' => [
'class' => AccessControl::className(),
'rules' => [
[
'allow' => true,
'roles' => ['?'],
],
[
'actions' => ['pay-orders'],
'allow' => true,
'roles' => ['@']
],
],
],
'access' => [
'class' => AccessControl::className(),
'rules' => [
[
'allow' => true,
'roles' => ['?'],
],
[
'actions' => ['pay-orders'],
'allow' => true,
'roles' => ['@']
],
],
],
];
}

@@ -114,11 +114,11 @@ class CronController extends BackendController
}

return [
'return' => 'success',
'alert' => [
'type' => 'success',
'message' => 'Commandes payées.'
]
'return' => 'success',
'alert' => [
'type' => 'success',
'message' => 'Commandes payées.'
]
];
}

@@ -165,10 +165,10 @@ class CronController extends BackendController
$mailOrdersSend = false;

$distribution = DistributionModel::findOne([
'date' => $date,
'active' => 1,
'id_producer' => $producer->id,
]);
'date' => $date,
'active' => 1,
'id_producer' => $producer->id,
]);

if ($distribution) {
if ($hour == $producer->order_deadline || strlen($forceDate)) {
@@ -177,11 +177,11 @@ class CronController extends BackendController
*/

$arrayOrders = Order::searchAll([
'distribution.date' => $date,
'distribution.id_producer' => $producer->id
], [
'conditions' => 'date_delete IS NULL'
]);
'distribution.date' => $date,
'distribution.id_producer' => $producer->id
], [
'conditions' => 'date_delete IS NULL'
]);

$configCredit = Producer::getConfig('credit', $producer->id);

@@ -190,11 +190,11 @@ class CronController extends BackendController
if ($order->auto_payment && $configCredit) {
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
CreditHistory::TYPE_PAYMENT,
$order->getAmount(Order::AMOUNT_REMAINING),
$order->distribution->id_producer,
$order->id_user,
User::ID_USER_SYSTEM
);
$countOrders++;
}
@@ -208,20 +208,20 @@ class CronController extends BackendController

if (!strlen($forceDate) && Producer::getConfig('option_notify_producer_order_summary', $producer->id)) {
$arrayOrders = Order::searchAll([
'distribution.date' => $date,
'distribution.id_producer' => $producer->id
], [
'conditions' => 'date_delete IS NULL'
]);
'distribution.date' => $date,
'distribution.id_producer' => $producer->id
], [
'conditions' => 'date_delete IS NULL'
]);

$mail = Yii::$app->mailer->compose(
[
'html' => 'cronOrdersSummary-html',
'text' => 'cronOrdersSummary-text',
], [
'date' => $date,
'orders' => $arrayOrders
]
[
'html' => 'cronOrdersSummary-html',
'text' => 'cronOrdersSummary-text',
], [
'date' => $date,
'orders' => $arrayOrders
]
)
->setFrom([Yii::$app->params['adminEmail'] => 'distrib']);

@@ -230,13 +230,13 @@ class CronController extends BackendController

// génération du pdf de commande
Yii::$app->runAction('distribution/report-cron', [
'date' => $date,
'save' => true,
'idProducer' => $producer->id,
'key' => '64ac0bdab7e9f5e48c4d991ec5201d57'
'date' => $date,
'save' => true,
'idProducer' => $producer->id,
'key' => '64ac0bdab7e9f5e48c4d991ec5201d57'
]);
$mail->attach(
Yii::getAlias('@app/web/pdf/Commandes-' . $date . '-' . $producer->id . '.pdf')
Yii::getAlias('@app/web/pdf/Commandes-' . $date . '-' . $producer->id . '.pdf')
);
} else {
$subject = '[distrib] Aucune commande';
@@ -245,10 +245,10 @@ class CronController extends BackendController
$mail->setSubject($subject);

// envoi des emails à tous les comptes users (statut producer) associés à ce producteur
$userArray = User::searchAll([
'id_producer' => $producer->id,
'status' => User::STATUS_PRODUCER
]);
$userArray = User::searchAll([
'id_producer' => $producer->id,
'status' => User::STATUS_PRODUCER
]);

foreach ($userArray as $user) {
$mail->setTo($user->email)->send();

+ 41
- 41
backend/controllers/DeliveryNoteController.php 查看文件

@@ -1,49 +1,49 @@
<?php

/**
Copyright distrib (2018)
contact@opendistrib.net
Ce logiciel est un programme informatique servant à aider les producteurs
à distribuer leur production en circuits courts.
Ce logiciel est régi par la licence CeCILL soumise au droit français et
respectant les principes de diffusion des logiciels libres. Vous pouvez
utiliser, modifier et/ou redistribuer ce programme sous les conditions
de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA
sur le site "http://www.cecill.info".
En contrepartie de l'accessibilité au code source et des droits de copie,
de modification et de redistribution accordés par cette licence, il n'est
offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons,
seule une responsabilité restreinte pèse sur l'auteur du programme, le
titulaire des droits patrimoniaux et les concédants successifs.
A cet égard l'attention de l'utilisateur est attirée sur les risques
associés au chargement, à l'utilisation, à la modification et/ou au
développement et à la reproduction du logiciel par l'utilisateur étant
donné sa spécificité de logiciel libre, qui peut le rendre complexe à
manipuler et qui le réserve donc à des développeurs et des professionnels
avertis possédant des connaissances informatiques approfondies. Les
utilisateurs sont donc invités à charger et tester l'adéquation du
logiciel à leurs besoins dans des conditions permettant d'assurer la
sécurité de leurs systèmes et ou de leurs données et, plus généralement,
à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.
Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
pris connaissance de la licence CeCILL, et que vous en avez accepté les
termes.
*/
/**
* Copyright distrib (2018)
*
* contact@opendistrib.net
*
* Ce logiciel est un programme informatique servant à aider les producteurs
* à distribuer leur production en circuits courts.
*
* Ce logiciel est régi par la licence CeCILL soumise au droit français et
* respectant les principes de diffusion des logiciels libres. Vous pouvez
* utiliser, modifier et/ou redistribuer ce programme sous les conditions
* de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA
* sur le site "http://www.cecill.info".
*
* En contrepartie de l'accessibilité au code source et des droits de copie,
* de modification et de redistribution accordés par cette licence, il n'est
* offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons,
* seule une responsabilité restreinte pèse sur l'auteur du programme, le
* titulaire des droits patrimoniaux et les concédants successifs.
*
* A cet égard l'attention de l'utilisateur est attirée sur les risques
* associés au chargement, à l'utilisation, à la modification et/ou au
* développement et à la reproduction du logiciel par l'utilisateur étant
* donné sa spécificité de logiciel libre, qui peut le rendre complexe à
* manipuler et qui le réserve donc à des développeurs et des professionnels
* avertis possédant des connaissances informatiques approfondies. Les
* utilisateurs sont donc invités à charger et tester l'adéquation du
* logiciel à leurs besoins dans des conditions permettant d'assurer la
* sécurité de leurs systèmes et ou de leurs données et, plus généralement,
* à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.
*
* Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
* pris connaissance de la licence CeCILL, et que vous en avez accepté les
* termes.
*/

namespace backend\controllers;

use Yii;


class DeliveryNoteController extends DocumentController
class DeliveryNoteController extends DocumentController
{
public function behaviors()
public function behaviors()
{
return [
'verbs' => [
@@ -68,14 +68,14 @@ class DeliveryNoteController extends DocumentController

/**
* Liste les modèles Invoice.
*
*
* @return mixed
*/
public function actionIndex()
public function actionIndex()
{
$searchModel = new DeliveryNoteSearch() ;
$searchModel = new DeliveryNoteSearch();
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);
return $this->render('index', [
'searchModel' => $searchModel,
'dataProvider' => $dataProvider,

+ 51
- 50
backend/controllers/DevelopmentController.php 查看文件

@@ -1,40 +1,40 @@
<?php

/**
Copyright distrib (2018)
contact@opendistrib.net
Ce logiciel est un programme informatique servant à aider les producteurs
à distribuer leur production en circuits courts.
Ce logiciel est régi par la licence CeCILL soumise au droit français et
respectant les principes de diffusion des logiciels libres. Vous pouvez
utiliser, modifier et/ou redistribuer ce programme sous les conditions
de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA
sur le site "http://www.cecill.info".
En contrepartie de l'accessibilité au code source et des droits de copie,
de modification et de redistribution accordés par cette licence, il n'est
offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons,
seule une responsabilité restreinte pèse sur l'auteur du programme, le
titulaire des droits patrimoniaux et les concédants successifs.
A cet égard l'attention de l'utilisateur est attirée sur les risques
associés au chargement, à l'utilisation, à la modification et/ou au
développement et à la reproduction du logiciel par l'utilisateur étant
donné sa spécificité de logiciel libre, qui peut le rendre complexe à
manipuler et qui le réserve donc à des développeurs et des professionnels
avertis possédant des connaissances informatiques approfondies. Les
utilisateurs sont donc invités à charger et tester l'adéquation du
logiciel à leurs besoins dans des conditions permettant d'assurer la
sécurité de leurs systèmes et ou de leurs données et, plus généralement,
à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.
Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
pris connaissance de la licence CeCILL, et que vous en avez accepté les
termes.
*/
/**
* Copyright distrib (2018)
*
* contact@opendistrib.net
*
* Ce logiciel est un programme informatique servant à aider les producteurs
* à distribuer leur production en circuits courts.
*
* Ce logiciel est régi par la licence CeCILL soumise au droit français et
* respectant les principes de diffusion des logiciels libres. Vous pouvez
* utiliser, modifier et/ou redistribuer ce programme sous les conditions
* de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA
* sur le site "http://www.cecill.info".
*
* En contrepartie de l'accessibilité au code source et des droits de copie,
* de modification et de redistribution accordés par cette licence, il n'est
* offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons,
* seule une responsabilité restreinte pèse sur l'auteur du programme, le
* titulaire des droits patrimoniaux et les concédants successifs.
*
* A cet égard l'attention de l'utilisateur est attirée sur les risques
* associés au chargement, à l'utilisation, à la modification et/ou au
* développement et à la reproduction du logiciel par l'utilisateur étant
* donné sa spécificité de logiciel libre, qui peut le rendre complexe à
* manipuler et qui le réserve donc à des développeurs et des professionnels
* avertis possédant des connaissances informatiques approfondies. Les
* utilisateurs sont donc invités à charger et tester l'adéquation du
* logiciel à leurs besoins dans des conditions permettant d'assurer la
* sécurité de leurs systèmes et ou de leurs données et, plus généralement,
* à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.
*
* Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
* pris connaissance de la licence CeCILL, et que vous en avez accepté les
* termes.
*/

namespace backend\controllers;

@@ -49,12 +49,13 @@ use yii\filters\AccessControl;
/**
* DeveloppementController implements the CRUD actions for Developpement model.
*/
class DevelopmentController extends Controller
class DevelopmentController extends Controller
{
/**
* @inheritdoc
*/
public function behaviors() {
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::className(),
@@ -73,17 +74,17 @@ class DevelopmentController extends Controller

/**
* Liste les développements.
*
*
* @return mixed
*/
public function actionIndex()
{
$versionsArray = Opendistrib::getVersions();
$versionsRenderArray = [];
foreach($versionsArray as $version) {
foreach ($versionsArray as $version) {
$versionsRenderArray[$version] = [
'version' => $version,
'content' => $this->renderFile('@common/versions/'.$version.'.php')
'content' => $this->renderFile('@common/versions/' . $version . '.php')
];
}

@@ -117,7 +118,7 @@ class DevelopmentController extends Controller
* If creation is successful, the browser will be redirected to the 'view' page.
* @return mixed
*/
public function actionCreate()
public function actionCreate()
{
$model = new Development();

@@ -138,11 +139,11 @@ class DevelopmentController 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
*/
public function actionUpdate($id)
public function actionUpdate($id)
{
$model = $this->findModel($id);

@@ -165,7 +166,7 @@ class DevelopmentController extends Controller
* @param integer $id
* @return mixed
*/
public function actionDelete($id)
public function actionDelete($id)
{
$this->findModel($id)->delete();
Yii::$app->getSession()->setFlash('success', 'Développement supprimé');
@@ -175,19 +176,19 @@ class DevelopmentController extends Controller

/**
* Définit une priorité pour un développement.
*
*
* @param integer $idDevelopment
* @param string $priorite
*/
public function actionPriority($idDevelopment, $priority = null)
public function actionPriority($idDevelopment, $priority = null)
{
$develpmentPriority = DevelopmentPriorityModel::searchOne([
'id_development' => $idDevelopment,
]) ;
]);

if (in_array($priority, [DevelopmentPriorityModel::PRIORITY_HIGH,
DevelopmentPriorityModel::PRIORITY_NORMAL,
DevelopmentPriorityModel::PRIORITY_LOW])) {
DevelopmentPriorityModel::PRIORITY_NORMAL,
DevelopmentPriorityModel::PRIORITY_LOW])) {

if ($develpmentPriority) {
$develpmentPriority->priority = $priority;
@@ -216,7 +217,7 @@ class DevelopmentController extends Controller
* @return Developpement the loaded model
* @throws NotFoundHttpException if the model cannot be found
*/
protected function findModel($id)
protected function findModel($id)
{
if (($model = DevelopmentModel::findOne($id)) !== null) {
return $model;

+ 42
- 38
backend/controllers/DistributionController.php 查看文件

@@ -39,8 +39,11 @@
namespace backend\controllers;

use common\helpers\GlobalParam;
use common\helpers\MeanPayment;
use common\helpers\Price;
use common\logic\Distribution\Distribution\Distribution;
use DateTime;
use yii\filters\AccessControl;

class DistributionController extends BackendController
{
@@ -49,7 +52,7 @@ class DistributionController extends BackendController
{
return [
'access' => [
'class' => AccessControl::className(),
'class' => AccessControl::class,
'rules' => [
[
'actions' => ['report-cron', 'report-terredepains'],
@@ -60,8 +63,8 @@ class DistributionController extends BackendController
'allow' => true,
'roles' => ['@'],
'matchCallback' => function ($rule, $action) {
return User::getCurrentStatus() == User::STATUS_ADMIN
|| User::getCurrentStatus() == User::STATUS_PRODUCER;
return $this->getUserManager()->getCurrentStatus() == User::STATUS_ADMIN
|| $this->getUserManager()->getCurrentStatus() == User::STATUS_PRODUCER;
}
]
],
@@ -73,6 +76,8 @@ class DistributionController extends BackendController
{
$this->checkProductsPointsSale();

$orderManager = $this->getOrderManager();

$format = 'Y-m-d';
$theDate = '';
$dateObject = DateTime::createFromFormat($format, $date);
@@ -83,7 +88,7 @@ class DistributionController extends BackendController

$orderUpdate = null;
if ($idOrderUpdate) {
$orderUpdate = Order::searchOne(['id' => $idOrderUpdate]);
$orderUpdate = $orderManager->findOneOrderById($idOrderUpdate);
}

return $this->render('index', [
@@ -122,7 +127,7 @@ class DistributionController extends BackendController

$json['means_payment'] = MeanPayment::getAll();

$distributionsArray = DistributionModel::searchAll([
$distributionsArray = Distribution::searchAll([
'active' => 1
], [
'conditions' => [
@@ -148,10 +153,10 @@ class DistributionController extends BackendController
$json['distribution'] = [
'id' => $distribution->id,
'active' => $distribution->active,
'url_report' => Yii::$app->urlManagerBackend->createUrl(
'url_report' => $this->getUrlManagerBackend()->createUrl(
['distribution/report', 'date' => $distribution->date]
),
'url_report_grid' => Yii::$app->urlManagerBackend->createUrl(
'url_report_grid' => $this->getUrlManagerBackend()->createUrl(
['distribution/report-grid', 'date' => $distribution->date]
),
];
@@ -178,7 +183,7 @@ class DistributionController extends BackendController
$json['distribution']['weight'] = number_format($weight, 2);

// products
$productsQuery = Product::find()
$productsQuery = Product::find()
->orWhere(['id_producer' => GlobalParam::getCurrentProducerId(),])
->joinWith([
'taxRate',
@@ -234,7 +239,7 @@ class DistributionController extends BackendController
$productOrderArray = [];
foreach ($order->productOrder as $productOrder) {
$productOrderArray[$productOrder->id_product] = [
'quantity' => $productOrder->quantity * Product::$unitsArray[$productOrder->unit]['coefficient'],
'quantity' => $productOrder->quantity * Product::$unitsArray[$productOrder->unit]['coefficient'],
'unit' => $productOrder->unit,
'price' => number_format($productOrder->price, 3),
'invoice_price' => number_format($productOrder->invoice_price, 2),
@@ -364,7 +369,7 @@ class DistributionController extends BackendController
];

// utilisateurs
$usersArray = User::findBy()->all();
$usersArray = User::findBy()->all();

$json['users'] = $usersArray;

@@ -409,7 +414,7 @@ class DistributionController extends BackendController
}

// abonnements manquants
$arraySubscriptions = Subscription::searchByDate($date);
$arraySubscriptions = Subscription::searchByDate($date);
$json['missing_subscriptions'] = [];
if ($distribution->active) {
foreach ($arraySubscriptions as $subscription) {
@@ -431,7 +436,7 @@ class DistributionController extends BackendController
{
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;

$user = User::findOne(['id' => $idUser]);
$user = User::findOne(['id' => $idUser]);
$favoritePointSale = $user->getFavoritePointSale();
$idFavoritePointSale = 0;
if ($favoritePointSale) {
@@ -454,10 +459,10 @@ class DistributionController extends BackendController

$order = Order::searchOne(['id' => $idOrder]);
$distribution = DistributionModel::findOne($idDistribution);
$user = User::findOne($idUser);
$user = User::findOne($idUser);
$pointSale = PointSale::findOne($idPointSale);

$productsArray = Product::find()
$productsArray = Product::find()
->where([
'id_producer' => GlobalParam::getCurrentProducerId(),
])->joinWith([
@@ -474,7 +479,7 @@ class DistributionController extends BackendController
$quantity = 0;
$invoicePrice = null;

if(isset($order->productOrder)) {
if (isset($order->productOrder)) {
foreach ($order->productOrder as $productOrder) {
if ($productOrder->id_product == $product['id']) {
if ($productOrder->invoice_price) {
@@ -490,7 +495,7 @@ class DistributionController extends BackendController
$productOrderArray[$product['id']] = [
'quantity' => $quantity,
'unit' => $product->unit,
'unit_coefficient' => Product::$unitsArray[$product->unit]['coefficient'],
'unit_coefficient' => Product::$unitsArray[$product->unit]['coefficient'],
'prices' => $priceArray,
'active' => $product->productDistribution[0]->active
&& (!$pointSale || $product->isAvailableOnPointSale($pointSale)),
@@ -510,7 +515,7 @@ class DistributionController extends BackendController
if ($order && $order->distribution->id_producer == GlobalParam::getCurrentProducerId()) {
$userProducer = null;
if ($order->id_user) {
$userProducer = UserProducer::searchOne([
$userProducer = UserProducer::searchOne([
'id_user' => $order->id_user,
'id_producer' => GlobalParam::getCurrentProducerId()
]);
@@ -525,8 +530,7 @@ class DistributionController extends BackendController

if ($invoicePrice != $productOrder->price) {
$productOrder->invoice_price = $invoicePrice;
}
else {
} else {
$productOrder->invoice_price = null;
}
$productOrder->save();
@@ -595,7 +599,7 @@ class DistributionController extends BackendController
}

// produits
$productsArray = Product::find()
$productsArray = Product::find()
->joinWith([
'productDistribution' => function ($q) use ($distribution) {
$q->where(['id_distribution' => $distribution->id]);
@@ -703,7 +707,7 @@ class DistributionController extends BackendController
$cpt = 2;
foreach ($productsArray as $product) {
$productsHasQuantity[$product->id] = 0;
foreach ( Product::$unitsArray as $unit => $dataUnit) {
foreach (Product::$unitsArray as $unit => $dataUnit) {
$quantity = Order::getProductQuantity($product->id, $ordersArray, true, $unit);
if ($quantity) {
$productsHasQuantity[$product->id] += $quantity;
@@ -718,7 +722,7 @@ class DistributionController extends BackendController
$productUnit = $product->unit;
}

$productName .= ' (' . Product::strUnit($productUnit, 'wording_short', true) . ')';
$productName .= ' (' . Product::strUnit($productUnit, 'wording_short', true) . ')';

$productsNameArray[] = $productName;
$productsIndexArray[$product->id] = $cpt++;
@@ -752,7 +756,7 @@ class DistributionController extends BackendController
}
$orderLine[$productsIndexArray[$productOrder->id_product]] .= $productOrder->quantity;
if ($productOrder->product->unit != $productOrder->unit) {
$orderLine[$productsIndexArray[$productOrder->id_product]] .= Product::strUnit(
$orderLine[$productsIndexArray[$productOrder->id_product]] .= Product::strUnit(
$productOrder->unit,
'wording_short',
true
@@ -876,14 +880,14 @@ class DistributionController extends BackendController
}

// catégories
$categoriesArray = ProductCategory::searchAll(
$categoriesArray = ProductCategory::searchAll(
['id_producer' => $idProducer],
['orderby' => 'product_category.position ASC']
);
array_unshift($categoriesArray, null);

// produits
$productsArray = Product::find()
$productsArray = Product::find()
->joinWith([
'productDistribution' => function ($q) use ($distribution) {
$q->where(['id_distribution' => $distribution->id]);
@@ -1049,7 +1053,7 @@ class DistributionController extends BackendController
}

// produits
$productsArray = Product::find()
$productsArray = Product::find()
->joinWith([
'productDistribution' => function ($q) use ($distribution) {
$q->where(['id_distribution' => $distribution->id]);
@@ -1069,7 +1073,7 @@ class DistributionController extends BackendController
$productsHasQuantity = [];
$cpt = 1;
foreach ($productsArray as $product) {
$theUnit = Product::strUnit($product->unit, 'wording_short', true);
$theUnit = Product::strUnit($product->unit, 'wording_short', true);
$theUnit = ($theUnit == 'p.') ? '' : ' (' . $theUnit . ')';
$productsNameArray[] = $product->name . $theUnit;
$productsIndexArray[$product->id] = $cpt++;
@@ -1136,7 +1140,7 @@ class DistributionController extends BackendController
{
$totalsPointSaleArray = [$label];
foreach ($productsArray as $product) {
foreach ( Product::$unitsArray as $unit => $dataUnit) {
foreach (Product::$unitsArray as $unit => $dataUnit) {
$quantity = Order::getProductQuantity($product->id, $ordersArray, false, $unit);
if ($quantity) {
$index = $productsIndexArray[$product->id];
@@ -1151,7 +1155,7 @@ class DistributionController extends BackendController
$totalsPointSaleArray[$index] .= $quantity;

if ($product->unit != $unit) {
$totalsPointSaleArray[$index] .= '' . Product::strUnit($unit, 'wording_short', true);
$totalsPointSaleArray[$index] .= '' . Product::strUnit($unit, 'wording_short', true);
}
}
}
@@ -1165,7 +1169,7 @@ class DistributionController extends BackendController

foreach ($productsArray as $product) {
$quantity = 0;
foreach ( Product::$unitsArray as $unit => $dataUnit) {
foreach (Product::$unitsArray as $unit => $dataUnit) {
$quantityProduct = Order::getProductQuantity($product->id, $ordersArray, false, $unit);

if ($unit == 'piece') {
@@ -1372,7 +1376,7 @@ class DistributionController extends BackendController
public function actionAjaxProcessAddSubscriptions($date)
{
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
Subscription::addAll($date, true);
Subscription::addAll($date, true);
return ['success'];
}

@@ -1556,10 +1560,10 @@ class DistributionController extends BackendController
$order->save();

// init invoice prices
$user = User::searchOne([
$user = User::searchOne([
'id' => $deliveryNote->id_user
]);
$userProducer = UserProducer::searchOne([
$userProducer = UserProducer::searchOne([
'id_user' => $deliveryNote->id_user,
'id_producer' => GlobalParam::getCurrentProducerId()
]);
@@ -1648,16 +1652,16 @@ class DistributionController extends BackendController

if ($firstOrder->pointSale->id_user) {
$deliveryNote->id_user = $firstOrder->pointSale->id_user;
$user = User::searchOne([
$user = User::searchOne([
'id' => $deliveryNote->id_user
]);
$userProducer = UserProducer::searchOne([
$userProducer = UserProducer::searchOne([
'id_user' => $deliveryNote->id_user,
'id_producer' => GlobalParam::getCurrentProducerId()
]);
} else {
$user = new User;
$user->type = User::TYPE_LEGAL_PERSON;
$user->type = User::TYPE_LEGAL_PERSON;
$user->name_legal_person = $firstOrder->pointSale->name;
$user->address = $firstOrder->pointSale->address;
$user->id_producer = 0;
@@ -1694,10 +1698,10 @@ class DistributionController extends BackendController
}

if (!isset($user) || !$user) {
$user = User::searchOne([
$user = User::searchOne([
'id' => $deliveryNote->id_user
]);
$userProducer = UserProducer::searchOne([
$userProducer = UserProducer::searchOne([
'id_user' => $deliveryNote->id_user,
'id_producer' => GlobalParam::getCurrentProducerId()
]);

+ 163
- 167
backend/controllers/DocumentController.php 查看文件

@@ -57,23 +57,23 @@ class DocumentController extends BackendController
public function behaviors()
{
return [
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
],
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
],
'access' => [
'class' => AccessControl::className(),
'rules' => [
[
'allow' => true,
'roles' => ['@'],
'matchCallback' => function ($rule, $action) {
return $this->getUserManager()->hasAccessBackend();
}
]
],
],
'access' => [
'class' => AccessControl::className(),
'rules' => [
[
'allow' => true,
'roles' => ['@'],
'matchCallback' => function ($rule, $action) {
return $this->getUserManager()->hasAccessBackend();
}
]
],
],
];
}

@@ -87,8 +87,8 @@ class DocumentController extends BackendController
Invoice::find()->where(['status' => Document::STATUS_VALID])->all()
);

foreach($validatedDocumentsArray as $document) {
if(!file_exists($document->getFilenameComplete())) {
foreach ($validatedDocumentsArray as $document) {
if (!file_exists($document->getFilenameComplete())) {
$document->generatePdf(Pdf::DEST_FILE);
}
}
@@ -114,9 +114,9 @@ class DocumentController extends BackendController
}

return $this->render('/document/create', [
'title' => $this->getTitle('Ajouter'),
'typeDocument' => $this->getDocumentType(),
'model' => $model,
'title' => $this->getTitle('Ajouter'),
'typeDocument' => $this->getDocumentType(),
'model' => $model,
]);
}

@@ -126,10 +126,10 @@ class DocumentController extends BackendController
if ($model->deliveryNotes && is_array($model->deliveryNotes) && count($model->deliveryNotes)) {
foreach ($model->deliveryNotes as $key => $idDeliveryNote) {
Order::updateAll([
'id_invoice' => $model->id
], [
'id_delivery_note' => $idDeliveryNote
]);
'id_invoice' => $model->id
], [
'id_delivery_note' => $idDeliveryNote
]);
}
}
}
@@ -155,9 +155,9 @@ class DocumentController extends BackendController
}

return $this->render('/document/update', [
'title' => $this->getTitle('Modifier'),
'typeDocument' => $this->getDocumentType(),
'model' => $model,
'title' => $this->getTitle('Modifier'),
'typeDocument' => $this->getDocumentType(),
'model' => $model,
]);
}

@@ -173,26 +173,26 @@ class DocumentController extends BackendController

if ($this->getClass() == 'DeliveryNote') {
Order::updateAll([
'order.id_delivery_note' => null
], [
'order.id_delivery_note' => $id
]);
'order.id_delivery_note' => null
], [
'order.id_delivery_note' => $id
]);
}

if ($this->getClass() == 'Quotation') {
Order::updateAll([
'order.id_quotation' => null
], [
'order.id_quotation' => $id
]);
'order.id_quotation' => null
], [
'order.id_quotation' => $id
]);
}

if ($this->getClass() == 'Invoice') {
Order::updateAll([
'order.id_invoice' => null
], [
'order.id_invoice' => $id
]);
'order.id_invoice' => null
], [
'order.id_invoice' => $id
]);
}

Yii::$app->getSession()->setFlash('success', $this->getFlashMessage('delete', $model));
@@ -244,12 +244,12 @@ class DocumentController extends BackendController
'Créateur',
];

foreach($document->getProductsOrders() as $productOrderArray) {
foreach($productOrderArray as $productOrder) {
foreach ($document->getProductsOrders() as $productOrderArray) {
foreach ($productOrderArray as $productOrder) {

$price = $productOrder->getPrice() ;
if($document->isInvoicePrice() && $productOrder->getInvoicePrice()) {
$price = $productOrder->getInvoicePrice() ;
$price = $productOrder->getPrice();
if ($document->isInvoicePrice() && $productOrder->getInvoicePrice()) {
$price = $productOrder->getInvoicePrice();
}

$datas[] = [
@@ -295,17 +295,17 @@ class DocumentController extends BackendController

// nom fichier
$reference = $document->id;
if($document->reference && strlen($document->reference)) {
if ($document->reference && strlen($document->reference)) {
$reference = $document->reference;
}

// status
$status = '';
if($document->isStatusDraft()) {
if ($document->isStatusDraft()) {
$status = 'brouillon_';
}

CSV::downloadSendHeaders(strtolower($this->getDocumentType()).'_' . $status . $reference . '.csv');
CSV::downloadSendHeaders(strtolower($this->getDocumentType()) . '_' . $status . $reference . '.csv');
echo CSV::array2csv($datas);
die();
}
@@ -336,10 +336,9 @@ class DocumentController extends BackendController
Yii::$app->getSession()->setFlash('danger', $this->getFlashMessage('send', $document));
}

if($backUpdateForm) {
if ($backUpdateForm) {
return $this->redirect([$this->getControllerUrl() . '/update', 'id' => $id]);
}
else {
} else {
return $this->redirect([$this->getControllerUrl() . '/index']);
}
}
@@ -349,17 +348,17 @@ class DocumentController extends BackendController
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;

if ($idUser > 0) {
$user = User::searchOne([
'id' => $idUser
]);
$user = User::searchOne([
'id' => $idUser
]);

if ($user) {
$document = null;
if (Document::isValidClass($classDocument)) {
$document = $classDocument::searchOne([
'id' => $idDocument,
'id_user' => $idUser
]);
'id' => $idDocument,
'id_user' => $idUser
]);
}

if ($document && $document->id_user == $user->id) {
@@ -369,8 +368,8 @@ class DocumentController extends BackendController
}

$json = [
'return' => 'success',
'address' => $address
'return' => 'success',
'address' => $address
];

if ($classDocument == 'Invoice') {
@@ -379,14 +378,14 @@ class DocumentController extends BackendController
'join_with' => ['user AS user_delivery_note', 'orders', 'producer']
];
$deliveryNotesCreateArray = DeliveryNote::searchAll([
'id_user' => $user->id,
'status' => Document::STATUS_VALID
], $options);
'id_user' => $user->id,
'status' => Document::STATUS_VALID
], $options);
$deliveryNotesUpdateArray = DeliveryNote::searchAll([
'id_user' => $user->id,
'status' => Document::STATUS_VALID,
'order.id_invoice' => $idDocument
], $options);
'id_user' => $user->id,
'status' => Document::STATUS_VALID,
'order.id_invoice' => $idDocument
], $options);
$json['delivery_note_create_array'] = $this->initDeliveryNoteArray('create', $deliveryNotesCreateArray);
$json['delivery_note_update_array'] = $this->initDeliveryNoteArray('update', $deliveryNotesUpdateArray);
}
@@ -402,14 +401,14 @@ class DocumentController extends BackendController
{
$deliveryNoteArray = [];
$isCreate = false;
if($type == 'create') {
if ($type == 'create') {
$isCreate = true;
}

if($deliveryNoteArrayResults) {
if ($deliveryNoteArrayResults) {
foreach ($deliveryNoteArrayResults as $deliveryNote) {
$deliveryNoteData = $this->addDeliveryNoteToArray($deliveryNote, $isCreate);
if($deliveryNoteData) {
if ($deliveryNoteData) {
$deliveryNoteArray[] = $deliveryNoteData;
}
}
@@ -441,8 +440,8 @@ class DocumentController extends BackendController

if ($id > 0 && Document::isValidClass($classDocument)) {
$document = $classDocument::searchOne([
'id' => $id
]);
'id' => $id
]);

if ($document) {
$document->changeStatus(Document::STATUS_VALID);
@@ -453,10 +452,9 @@ class DocumentController extends BackendController

Yii::$app->getSession()->setFlash('success', $this->getFlashMessage('validate', $document));

if($backUpdateForm) {
if ($backUpdateForm) {
return $this->redirect([$this->getControllerUrl() . '/update', 'id' => $id]);
}
else {
} else {
return $this->redirect([$this->getControllerUrl() . '/index']);
}
}
@@ -472,28 +470,28 @@ class DocumentController extends BackendController

if ($idDocument > 0 && Document::isValidClass($classDocument)) {
$document = $classDocument::searchOne([
'id' => $idDocument
]);
'id' => $idDocument
]);

if ($document) {
$document->changeStatus(Document::STATUS_VALID);
$document->save();
return [
'return' => 'success',
'alert' => [
'type' => 'success',
'message' => 'Document validé'
]
'return' => 'success',
'alert' => [
'type' => 'success',
'message' => 'Document validé'
]
];
}
}

return [
'return' => 'error',
'alert' => [
'type' => 'danger',
'message' => 'Une erreur est survenue lors de la validation du document.'
]
'return' => 'error',
'alert' => [
'type' => 'danger',
'message' => 'Une erreur est survenue lors de la validation du document.'
]
];
}

@@ -503,12 +501,12 @@ class DocumentController extends BackendController

if ($idDocument > 0 && Document::isValidClass($classDocument)) {
$document = $classDocument::searchOne([
'id' => $idDocument
]);
'id' => $idDocument
]);

if ($document) {
$productsArray = Product::searchAll([], [
'orderby' => 'product.order ASC'
$productsArray = Product::searchAll([], [
'orderby' => 'product.order ASC'
]);

$ordersArray = [];
@@ -521,61 +519,59 @@ class DocumentController extends BackendController
]);
}
$ordersArray[$order->id] = array_merge(
$order->getAttributes(),
[
'username' => $order->getUsername(),
'distribution_date' => isset($order->distribution) ? date(
'd/m/Y',
strtotime(
$order->distribution->date
)
) : null,
'point_sale_name' => isset($order->pointSale) ? $order->pointSale->name : null,
'productOrder' => $productsOrderArray,
]
$order->getAttributes(),
[
'username' => $order->getUsername(),
'distribution_date' => isset($order->distribution) ? date(
'd/m/Y',
strtotime(
$order->distribution->date
)
) : null,
'point_sale_name' => isset($order->pointSale) ? $order->pointSale->name : null,
'productOrder' => $productsOrderArray,
]
);
}

$userProducer = UserProducer::searchOne([
'id_user' => $document->user->id,
'id_producer' => GlobalParam::getCurrentProducerId()
]);
$userProducer = UserProducer::searchOne([
'id_user' => $document->user->id,
'id_producer' => GlobalParam::getCurrentProducerId()
]);
$pointSale = PointSale::searchOne([
'id_user' => $document->user->id
]);
'id_user' => $document->user->id
]);

$productsArray = yii\helpers\ArrayHelper::map(
$productsArray,
'order',
function ($product) use ($document, $userProducer, $pointSale) {
return array_merge($product->getAttributes(), [
'unit_coefficient' => Product::$unitsArray[$product->unit]['coefficient'],
'prices' => $product->getPriceArray($userProducer->user, $pointSale),
'wording_unit' => $product->wording_unit,
'tax_rate' => $product->taxRate->value
]);
}
$productsArray,
'order',
function ($product) use ($document, $userProducer, $pointSale) {
return array_merge($product->getAttributes(), [
'unit_coefficient' => Product::$unitsArray[$product->unit]['coefficient'],
'prices' => $product->getPriceArray($userProducer->user, $pointSale),
'wording_unit' => $product->wording_unit,
'tax_rate' => $product->taxRate->value
]);
}
);

return [
'return' => 'success',
'tax_rate_producer' => GlobalParam::getCurrentProducer()->taxRate->value,
'document' => array_merge($document->getAttributes(), [
'html_label' => $document->getHtmlLabel(),
'class' => $document->getClass()
]),
'id_user' => $document->user->id,
'products' => $productsArray,
'orders' => $ordersArray,
'total' => ($document->getClass() == 'Invoice' || $document->getClass(
) == 'DeliveryNote') ? $document->getAmount(
Order::INVOICE_AMOUNT_TOTAL
) : $document->getAmount(Order::AMOUNT_TOTAL),
'total_with_tax' => ($document->getClass() == 'Invoice' || $document->getClass(
) == 'DeliveryNote') ? $document->getAmountWithTax(
Order::INVOICE_AMOUNT_TOTAL
) : $document->getAmountWithTax(Order::AMOUNT_TOTAL),
'invoice_url' => ($document->getClass() == 'DeliveryNote' && $document->getInvoice()) ? Yii::$app->urlManager->createUrl(['invoice/update', 'id' => $document->getInvoice()->id]) : null
'return' => 'success',
'tax_rate_producer' => GlobalParam::getCurrentProducer()->taxRate->value,
'document' => array_merge($document->getAttributes(), [
'html_label' => $document->getHtmlLabel(),
'class' => $document->getClass()
]),
'id_user' => $document->user->id,
'products' => $productsArray,
'orders' => $ordersArray,
'total' => ($document->getClass() == 'Invoice' || $document->getClass() == 'DeliveryNote') ? $document->getAmount(
Order::INVOICE_AMOUNT_TOTAL
) : $document->getAmount(Order::AMOUNT_TOTAL),
'total_with_tax' => ($document->getClass() == 'Invoice' || $document->getClass() == 'DeliveryNote') ? $document->getAmountWithTax(
Order::INVOICE_AMOUNT_TOTAL
) : $document->getAmountWithTax(Order::AMOUNT_TOTAL),
'invoice_url' => ($document->getClass() == 'DeliveryNote' && $document->getInvoice()) ? Yii::$app->urlManager->createUrl(['invoice/update', 'id' => $document->getInvoice()->id]) : null
];
}
}
@@ -589,11 +585,11 @@ class DocumentController extends BackendController

if (Document::isValidClass($classDocument)) {
$document = $classDocument::searchOne([
'id' => $idDocument
]);
$product = Product::searchOne([
'id' => $idProduct
]);
'id' => $idDocument
]);
$product = Product::searchOne([
'id' => $idProduct
]);

if ($document && $product) {
if (count($document->orders) == 0) {
@@ -615,7 +611,7 @@ class DocumentController extends BackendController
$productOrder = new ProductOrder;
$productOrder->id_order = $order->id;
$productOrder->id_product = $idProduct;
$quantity = $quantity / Product::$unitsArray[$product->unit]['coefficient'];
$quantity = $quantity / Product::$unitsArray[$product->unit]['coefficient'];
$productOrder->quantity = $quantity;
$productOrder->price = (float)$price;
$productOrder->unit = $product->unit;
@@ -624,22 +620,22 @@ class DocumentController extends BackendController
$productOrder->save();

return [
'return' => 'success',
'alert' => [
'type' => 'success',
'message' => 'Produit ajouté'
]
'return' => 'success',
'alert' => [
'type' => 'success',
'message' => 'Produit ajouté'
]
];
}
}
}

return [
'return' => 'error',
'alert' => [
'type' => 'danger',
'message' => 'Une erreur est survenue lors de la suppression du produit.'
]
'return' => 'error',
'alert' => [
'type' => 'danger',
'message' => 'Une erreur est survenue lors de la suppression du produit.'
]
];
}

@@ -648,27 +644,27 @@ class DocumentController extends BackendController
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;

$productOrder = ProductOrder::searchOne([
'id' => $idProductOrder
]);
'id' => $idProductOrder
]);

if ($productOrder) {
$productOrder->delete();

return [
'return' => 'success',
'alert' => [
'type' => 'danger',
'message' => 'Produit supprimé'
]
'return' => 'success',
'alert' => [
'type' => 'danger',
'message' => 'Produit supprimé'
]
];
}

return [
'return' => 'error',
'alert' => [
'type' => 'danger',
'message' => 'Une erreur est survenue lors de la suppression du produit.'
]
'return' => 'error',
'alert' => [
'type' => 'danger',
'message' => 'Une erreur est survenue lors de la suppression du produit.'
]
];
}

@@ -763,10 +759,10 @@ class DocumentController extends BackendController
$class = $this->getClass();

$model = $class::searchOne([
'id' => $id
], [
'orderby' => 'teshtygjhtyt'
]);
'id' => $id
], [
'orderby' => 'teshtygjhtyt'
]);

if ($model) {
return $model;

+ 44
- 46
backend/controllers/InvoiceController.php 查看文件

@@ -1,57 +1,57 @@
<?php

/**
Copyright distrib (2018)
contact@opendistrib.net
Ce logiciel est un programme informatique servant à aider les producteurs
à distribuer leur production en circuits courts.
Ce logiciel est régi par la licence CeCILL soumise au droit français et
respectant les principes de diffusion des logiciels libres. Vous pouvez
utiliser, modifier et/ou redistribuer ce programme sous les conditions
de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA
sur le site "http://www.cecill.info".
En contrepartie de l'accessibilité au code source et des droits de copie,
de modification et de redistribution accordés par cette licence, il n'est
offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons,
seule une responsabilité restreinte pèse sur l'auteur du programme, le
titulaire des droits patrimoniaux et les concédants successifs.
A cet égard l'attention de l'utilisateur est attirée sur les risques
associés au chargement, à l'utilisation, à la modification et/ou au
développement et à la reproduction du logiciel par l'utilisateur étant
donné sa spécificité de logiciel libre, qui peut le rendre complexe à
manipuler et qui le réserve donc à des développeurs et des professionnels
avertis possédant des connaissances informatiques approfondies. Les
utilisateurs sont donc invités à charger et tester l'adéquation du
logiciel à leurs besoins dans des conditions permettant d'assurer la
sécurité de leurs systèmes et ou de leurs données et, plus généralement,
à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.
Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
pris connaissance de la licence CeCILL, et que vous en avez accepté les
termes.
*/
/**
* Copyright distrib (2018)
*
* contact@opendistrib.net
*
* Ce logiciel est un programme informatique servant à aider les producteurs
* à distribuer leur production en circuits courts.
*
* Ce logiciel est régi par la licence CeCILL soumise au droit français et
* respectant les principes de diffusion des logiciels libres. Vous pouvez
* utiliser, modifier et/ou redistribuer ce programme sous les conditions
* de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA
* sur le site "http://www.cecill.info".
*
* En contrepartie de l'accessibilité au code source et des droits de copie,
* de modification et de redistribution accordés par cette licence, il n'est
* offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons,
* seule une responsabilité restreinte pèse sur l'auteur du programme, le
* titulaire des droits patrimoniaux et les concédants successifs.
*
* A cet égard l'attention de l'utilisateur est attirée sur les risques
* associés au chargement, à l'utilisation, à la modification et/ou au
* développement et à la reproduction du logiciel par l'utilisateur étant
* donné sa spécificité de logiciel libre, qui peut le rendre complexe à
* manipuler et qui le réserve donc à des développeurs et des professionnels
* avertis possédant des connaissances informatiques approfondies. Les
* utilisateurs sont donc invités à charger et tester l'adéquation du
* logiciel à leurs besoins dans des conditions permettant d'assurer la
* sécurité de leurs systèmes et ou de leurs données et, plus généralement,
* à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.
*
* Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
* pris connaissance de la licence CeCILL, et que vous en avez accepté les
* termes.
*/

namespace backend\controllers;

use Yii;

class InvoiceController extends DocumentController
class InvoiceController extends DocumentController
{
/**
* Liste les modèles Invoice.
*
*
* @return mixed
*/
public function actionIndex()
public function actionIndex()
{
$searchModel = new InvoiceSearch() ;
$searchModel = new InvoiceSearch();
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);
return $this->render('index', [
'searchModel' => $searchModel,
'dataProvider' => $dataProvider,
@@ -64,7 +64,7 @@ class InvoiceController extends DocumentController

$invoice = Invoice::searchOne(['id' => $idInvoice]);

if($invoice && $invoice->isStatusDraft()) {
if ($invoice && $invoice->isStatusDraft()) {
Order::updateAll([
'id_invoice' => null
], [
@@ -77,8 +77,7 @@ class InvoiceController extends DocumentController
'message' => 'Bon de livraison supprimé de la facture.'
]
];
}
else {
} else {
return [
'alert' => [
'type' => 'error',
@@ -95,7 +94,7 @@ class InvoiceController extends DocumentController
$invoice = Invoice::searchOne(['id' => $idInvoice]);
$deliveryNote = DeliveryNote::searchOne(['id' => $idDeliveryNote]);

if($invoice && $invoice->isStatusDraft() && $deliveryNote) {
if ($invoice && $invoice->isStatusDraft() && $deliveryNote) {
Order::updateAll([
'id_invoice' => $idInvoice
], [
@@ -108,8 +107,7 @@ class InvoiceController extends DocumentController
'message' => 'Bon de livraison ajouté à la facture.'
]
];
}
else {
} else {
return [
'alert' => [
'type' => 'error',

+ 20
- 20
backend/controllers/OrderController.php 查看文件

@@ -54,8 +54,8 @@ class OrderController extends BackendController
'allow' => true,
'roles' => ['@'],
'matchCallback' => function ($rule, $action) {
return User::getCurrentStatus() == User::STATUS_ADMIN
|| User::getCurrentStatus() == User::STATUS_PRODUCER;
return User::getCurrentStatus() == User::STATUS_ADMIN
|| User::getCurrentStatus() == User::STATUS_PRODUCER;
}
]
],
@@ -159,7 +159,7 @@ class OrderController extends BackendController
*/
public function actionIndex($date = '', $returnData = false)
{
if (! Product::searchCount() || !PointSale::searchCount()) {
if (!Product::searchCount() || !PointSale::searchCount()) {
$this->redirect(['site/index', 'error_products_points_sale' => 1]);
}

@@ -167,7 +167,7 @@ class OrderController extends BackendController

// users
$arrayUsers = [0 => '--'];
$users = User::searchAll([], ['orderby' => 'lastname, name ASC']);
$users = User::searchAll([], ['orderby' => 'lastname, name ASC']);

foreach ($users as $user) {
$arrayUsers[$user->id] = $user->name . ' ' . $user->lastname;
@@ -191,7 +191,7 @@ class OrderController extends BackendController
}

// produits
$arrayProducts = Product::searchAll();
$arrayProducts = Product::searchAll();

// gestion des commandes
$this->processOrderForm($distribution, $date, $arrayPointsSale, $arrayProducts, $users);
@@ -302,7 +302,7 @@ class OrderController extends BackendController

// produits
if ($distribution) {
$arrayProducts = Product::searchByDistribution($distribution->id);
$arrayProducts = Product::searchByDistribution($distribution->id);
}

// poids total de la production et CA potentiel
@@ -431,7 +431,7 @@ class OrderController extends BackendController
}

// produits
$productsArray = Product::find()->orderBy('order ASC')->all();
$productsArray = Product::find()->orderBy('order ASC')->all();

$distribution = DistributionModel::find()
->where('date LIKE \':date\'')
@@ -683,7 +683,7 @@ class OrderController extends BackendController

if ($active) {
// add commandes automatiques
Subscription::addAll($date);
Subscription::addAll($date);
}

if ($redirect) {
@@ -778,7 +778,7 @@ class OrderController extends BackendController
// remboursement de la commande
if ($order->id_user && $order->getAmount(Order::AMOUNT_PAID) && Producer::getConfig('credit')) {
$order->saveCreditHistory(
CreditHistory::TYPE_REFUND,
CreditHistory::TYPE_REFUND,
$order->getAmount(Order::AMOUNT_PAID),
$order->distribution->id_producer,
$order->id_user,
@@ -853,15 +853,15 @@ class OrderController extends BackendController
$userProducer = false;
if (isset($order->user) && $order->user) {
$user = $order->user;
$userProducer = UserProducer::searchOne([
$userProducer = UserProducer::searchOne([
'id_user' => $user->id,
'id_producer' => $order->distribution->id_producer
]);
}

foreach ($products as $key => $dataProductOrder) {
$product = Product::findOne($key);
$quantity = $dataProductOrder->quantity / Product::$unitsArray[$dataProductOrder->unit]['coefficient'];
$product = Product::findOne($key);
$quantity = $dataProductOrder->quantity / Product::$unitsArray[$dataProductOrder->unit]['coefficient'];
if ($product && $quantity) {
$productOrder = new ProductOrder;
$productOrder->id_order = $order->id;
@@ -951,10 +951,10 @@ class OrderController extends BackendController
$order->id_user = 0;
}

$user = User::searchOne(['id' => $order->id_user]);
$user = User::searchOne(['id' => $order->id_user]);
$userProducer = false;
if ($user) {
$userProducer = UserProducer::searchOne([
$userProducer = UserProducer::searchOne([
'id_user' => $user->id,
'id_producer' => $order->distribution->id_producer
]);
@@ -968,14 +968,14 @@ class OrderController extends BackendController
]);

$quantity = $dataProductOrder->quantity
/ Product::$unitsArray[$dataProductOrder->unit]['coefficient'];
/ Product::$unitsArray[$dataProductOrder->unit]['coefficient'];

if ($quantity) {
if ($productOrder) {
$productOrder->quantity = $quantity;
$productOrder->price = $dataProductOrder->price;
} else {
$product = Product::findOne($key);
$product = Product::findOne($key);

if ($product) {
$productOrder = new ProductOrder;
@@ -1018,9 +1018,9 @@ class OrderController extends BackendController
if ($order && $processCredit) {
// Si changement d'user : on rembourse l'ancien user
$amountPaid = $order->getAmount(Order::AMOUNT_PAID);
if($oldIdUser != $idUser && $amountPaid > 0) {
if ($oldIdUser != $idUser && $amountPaid > 0) {
$order->saveCreditHistory(
CreditHistory::TYPE_REFUND,
CreditHistory::TYPE_REFUND,
$amountPaid,
GlobalParam::getCurrentProducerId(),
$oldIdUser,
@@ -1049,7 +1049,7 @@ class OrderController extends BackendController
$html = '';

if ($order->id_user) {
$userProducer = UserProducer::find()
$userProducer = UserProducer::find()
->where([
'id_user' => $order->id_user,
'id_producer' => $order->distribution->id_producer
@@ -1077,7 +1077,7 @@ class OrderController extends BackendController
. '</span>';

// historique
$history = CreditHistory::find()
$history = CreditHistory::find()
->with('userAction')
->where(['id_order' => $idOrder])
->all();

+ 86
- 89
backend/controllers/PointSaleController.php 查看文件

@@ -1,40 +1,40 @@
<?php

/**
Copyright distrib (2018)
contact@opendistrib.net
Ce logiciel est un programme informatique servant à aider les producteurs
à distribuer leur production en circuits courts.
Ce logiciel est régi par la licence CeCILL soumise au droit français et
respectant les principes de diffusion des logiciels libres. Vous pouvez
utiliser, modifier et/ou redistribuer ce programme sous les conditions
de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA
sur le site "http://www.cecill.info".
En contrepartie de l'accessibilité au code source et des droits de copie,
de modification et de redistribution accordés par cette licence, il n'est
offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons,
seule une responsabilité restreinte pèse sur l'auteur du programme, le
titulaire des droits patrimoniaux et les concédants successifs.
A cet égard l'attention de l'utilisateur est attirée sur les risques
associés au chargement, à l'utilisation, à la modification et/ou au
développement et à la reproduction du logiciel par l'utilisateur étant
donné sa spécificité de logiciel libre, qui peut le rendre complexe à
manipuler et qui le réserve donc à des développeurs et des professionnels
avertis possédant des connaissances informatiques approfondies. Les
utilisateurs sont donc invités à charger et tester l'adéquation du
logiciel à leurs besoins dans des conditions permettant d'assurer la
sécurité de leurs systèmes et ou de leurs données et, plus généralement,
à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.
Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
pris connaissance de la licence CeCILL, et que vous en avez accepté les
termes.
*/
/**
* Copyright distrib (2018)
*
* contact@opendistrib.net
*
* Ce logiciel est un programme informatique servant à aider les producteurs
* à distribuer leur production en circuits courts.
*
* Ce logiciel est régi par la licence CeCILL soumise au droit français et
* respectant les principes de diffusion des logiciels libres. Vous pouvez
* utiliser, modifier et/ou redistribuer ce programme sous les conditions
* de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA
* sur le site "http://www.cecill.info".
*
* En contrepartie de l'accessibilité au code source et des droits de copie,
* de modification et de redistribution accordés par cette licence, il n'est
* offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons,
* seule une responsabilité restreinte pèse sur l'auteur du programme, le
* titulaire des droits patrimoniaux et les concédants successifs.
*
* A cet égard l'attention de l'utilisateur est attirée sur les risques
* associés au chargement, à l'utilisation, à la modification et/ou au
* développement et à la reproduction du logiciel par l'utilisateur étant
* donné sa spécificité de logiciel libre, qui peut le rendre complexe à
* manipuler et qui le réserve donc à des développeurs et des professionnels
* avertis possédant des connaissances informatiques approfondies. Les
* utilisateurs sont donc invités à charger et tester l'adéquation du
* logiciel à leurs besoins dans des conditions permettant d'assurer la
* sécurité de leurs systèmes et ou de leurs données et, plus généralement,
* à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.
*
* Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
* pris connaissance de la licence CeCILL, et que vous en avez accepté les
* termes.
*/

namespace backend\controllers;

@@ -47,10 +47,10 @@ use yii\helpers\Html;
/**
* PointVenteController implements the CRUD actions for PointVente model.
*/
class PointSaleController extends BackendController
class PointSaleController extends BackendController
{

public function behaviors()
public function behaviors()
{
return [
'verbs' => [
@@ -75,33 +75,33 @@ class PointSaleController extends BackendController

/**
* Liste les points de vente.
*
*
* @return mixed
*/
public function actionIndex()
{
$searchModel = new PointSaleSearch() ;
public function actionIndex()
{
$searchModel = new PointSaleSearch();
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);

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

/**
* Crée un point de vente.
*
*
* @return mixed
*/
public function actionCreate()
public function actionCreate()
{
$model = new PointSale();

if ($model->load(Yii::$app->request->post()) && $model->save()) {
$model->processPointProduction();
$model->processRestrictedAccess();
DistributionModel::linkPointSaleIncomingDistributions($model) ;
DistributionModel::linkPointSaleIncomingDistributions($model);
return $this->redirect(['index']);
} else {
return $this->render('create', array_merge($this->initForm(), [
@@ -112,16 +112,16 @@ class PointSaleController extends BackendController

/**
* Modifie un point de vente.
*
*
* @param integer $id
* @return mixed
*/
public function actionUpdate($id)
public function actionUpdate($id)
{
$model = PointSale::find()
->with('userPointSale')
->where(['id' => $id])
->one();
->with('userPointSale')
->where(['id' => $id])
->one();

foreach ($model->userPointSale as $userPointSale) {
$model->users[] = $userPointSale->id_user;
@@ -131,7 +131,7 @@ class PointSaleController extends BackendController
if ($model->load(Yii::$app->request->post()) && $model->save()) {
$model->processPointProduction();
$model->processRestrictedAccess();
DistributionModel::linkPointSaleIncomingDistributions($model) ;
DistributionModel::linkPointSaleIncomingDistributions($model);
Yii::$app->getSession()->setFlash('success', 'Point de vente modifié.');
return $this->redirect(['index']);
} else {
@@ -143,17 +143,17 @@ class PointSaleController extends BackendController

/**
* Initialise le formulaire de création/modification.
*
*
* @param integer $id
* @return mixed
*/
public function initForm($id = 0)
public function initForm($id = 0)
{
$users = User::findBy()
->leftJoin('user_point_sale', 'user_point_sale.id_user = user.id AND user_point_sale.id_point_sale = :id_point_sale',[':id_point_sale' => $id])
$users = User::findBy()
->leftJoin('user_point_sale', 'user_point_sale.id_user = user.id AND user_point_sale.id_point_sale = :id_point_sale', [':id_point_sale' => $id])
->orderBy('user_point_sale.id_point_sale DESC, lastname ASC, name ASC')
->all();
return [
'users' => $users
];
@@ -161,15 +161,15 @@ class PointSaleController extends BackendController

/**
* Supprime un point de vente et redirige vers la liste des points de vente.
*
*
* @param integer $id
* @return mixed
*/
public function actionDelete($id, $confirm = false)
{
$pointSale = $this->findModel($id) ;
if($confirm) {
public function actionDelete($id, $confirm = false)
{
$pointSale = $this->findModel($id);
if ($confirm) {
$pointSale->status = -1;
$pointSale->save();

@@ -193,58 +193,55 @@ class PointSaleController extends BackendController
]
);

if($ordersArray) {
foreach($ordersArray as $order) {
if ($ordersArray) {
foreach ($ordersArray as $order) {
$order->delete(true);
}
}

Yii::$app->getSession()->setFlash('success', 'Point de vente <strong>'.Html::encode($pointSale->name).'</strong> supprimé.');
}
else {
Yii::$app->getSession()->setFlash('info', 'Souhaitez-vous vraiment supprimer le point de vente <strong>'.Html::encode($pointSale->name).'</strong> ? '
. Html::a('Oui',['point-sale/delete','id' => $id, 'confirm' => 1], ['class' => 'btn btn-default']).' '.Html::a('Non', ['point-sale/index'], ['class' => 'btn btn-default']));
Yii::$app->getSession()->setFlash('success', 'Point de vente <strong>' . Html::encode($pointSale->name) . '</strong> supprimé.');
} else {
Yii::$app->getSession()->setFlash('info', 'Souhaitez-vous vraiment supprimer le point de vente <strong>' . Html::encode($pointSale->name) . '</strong> ? '
. Html::a('Oui', ['point-sale/delete', 'id' => $id, 'confirm' => 1], ['class' => 'btn btn-default']) . ' ' . Html::a('Non', ['point-sale/index'], ['class' => 'btn btn-default']));
}
return $this->redirect(['index']);
}
/**
* Définit un point de vente par défaut.
*
*
* @param integer $id
*/
public function actionDefault($id)
public function actionDefault($id)
{
$pointSale = $this->findModel($id) ;
if($pointSale) {
PointSale::updateAll(['default' => 0], 'id_producer = :id_producer', [':id_producer' => GlobalParam::getCurrentProducerId()]) ;
if(!$pointSale->default) {
$pointSale->default = 1 ;
$pointSale->save() ;
Yii::$app->getSession()->setFlash('success', 'Point de vente <strong>'.Html::encode($pointSale->name).'</strong> défini par défaut.') ;
}
else {
Yii::$app->getSession()->setFlash('success', 'Aucun point de vente défini par défaut') ;
$pointSale = $this->findModel($id);
if ($pointSale) {
PointSale::updateAll(['default' => 0], 'id_producer = :id_producer', [':id_producer' => GlobalParam::getCurrentProducerId()]);
if (!$pointSale->default) {
$pointSale->default = 1;
$pointSale->save();
Yii::$app->getSession()->setFlash('success', 'Point de vente <strong>' . Html::encode($pointSale->name) . '</strong> défini par défaut.');
} else {
Yii::$app->getSession()->setFlash('success', 'Aucun point de vente défini par défaut');
}
}
return $this->redirect(['index']);
}

/**
* Recherche un point de vente en fonction de son ID.
*
*
* @param integer $id
* @return PointVente
* @return PointVente
* @throws NotFoundHttpException si le modèle n'est pas trouvé
*/
protected function findModel($id)
protected function findModel($id)
{
if (($model = PointSale::findOne($id)) !== null) {
return $model;
}
else {
} else {
throw new NotFoundHttpException('The requested page does not exist.');
}
}

+ 91
- 91
backend/controllers/ProducerAdminController.php 查看文件

@@ -1,40 +1,40 @@
<?php

/**
Copyright distrib (2018)
contact@opendistrib.net
Ce logiciel est un programme informatique servant à aider les producteurs
à distribuer leur production en circuits courts.
Ce logiciel est régi par la licence CeCILL soumise au droit français et
respectant les principes de diffusion des logiciels libres. Vous pouvez
utiliser, modifier et/ou redistribuer ce programme sous les conditions
de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA
sur le site "http://www.cecill.info".
En contrepartie de l'accessibilité au code source et des droits de copie,
de modification et de redistribution accordés par cette licence, il n'est
offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons,
seule une responsabilité restreinte pèse sur l'auteur du programme, le
titulaire des droits patrimoniaux et les concédants successifs.
A cet égard l'attention de l'utilisateur est attirée sur les risques
associés au chargement, à l'utilisation, à la modification et/ou au
développement et à la reproduction du logiciel par l'utilisateur étant
donné sa spécificité de logiciel libre, qui peut le rendre complexe à
manipuler et qui le réserve donc à des développeurs et des professionnels
avertis possédant des connaissances informatiques approfondies. Les
utilisateurs sont donc invités à charger et tester l'adéquation du
logiciel à leurs besoins dans des conditions permettant d'assurer la
sécurité de leurs systèmes et ou de leurs données et, plus généralement,
à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.
Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
pris connaissance de la licence CeCILL, et que vous en avez accepté les
termes.
*/
/**
* Copyright distrib (2018)
*
* contact@opendistrib.net
*
* Ce logiciel est un programme informatique servant à aider les producteurs
* à distribuer leur production en circuits courts.
*
* Ce logiciel est régi par la licence CeCILL soumise au droit français et
* respectant les principes de diffusion des logiciels libres. Vous pouvez
* utiliser, modifier et/ou redistribuer ce programme sous les conditions
* de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA
* sur le site "http://www.cecill.info".
*
* En contrepartie de l'accessibilité au code source et des droits de copie,
* de modification et de redistribution accordés par cette licence, il n'est
* offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons,
* seule une responsabilité restreinte pèse sur l'auteur du programme, le
* titulaire des droits patrimoniaux et les concédants successifs.
*
* A cet égard l'attention de l'utilisateur est attirée sur les risques
* associés au chargement, à l'utilisation, à la modification et/ou au
* développement et à la reproduction du logiciel par l'utilisateur étant
* donné sa spécificité de logiciel libre, qui peut le rendre complexe à
* manipuler et qui le réserve donc à des développeurs et des professionnels
* avertis possédant des connaissances informatiques approfondies. Les
* utilisateurs sont donc invités à charger et tester l'adéquation du
* logiciel à leurs besoins dans des conditions permettant d'assurer la
* sécurité de leurs systèmes et ou de leurs données et, plus généralement,
* à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.
*
* Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
* pris connaissance de la licence CeCILL, et que vous en avez accepté les
* termes.
*/

namespace backend\controllers;

@@ -49,10 +49,10 @@ use yii\data\ActiveDataProvider;
/**
* UserController implements the CRUD actions for User model.
*/
class ProducerAdminController extends BackendController
class ProducerAdminController extends BackendController
{

public function behaviors()
public function behaviors()
{
return [
'verbs' => [
@@ -68,7 +68,7 @@ class ProducerAdminController extends BackendController
'allow' => true,
'roles' => ['@'],
'matchCallback' => function ($rule, $action) {
return User::getCurrentStatus() == User::STATUS_ADMIN;
return User::getCurrentStatus() == User::STATUS_ADMIN;
}
]
],
@@ -78,15 +78,15 @@ class ProducerAdminController extends BackendController

/**
* Liste les producteurs.
*
*
* @return mixed
*/
public function actionIndex()
public function actionIndex()
{
$dataProviderProducer = new ActiveDataProvider([
'query' => Producer::find()
->with('userProducer', 'user')
->orderBy('active DESC, free_price DESC'),
->with('userProducer', 'user')
->orderBy('active DESC, free_price DESC'),
'pagination' => [
'pageSize' => 1000,
],
@@ -95,8 +95,8 @@ class ProducerAdminController extends BackendController
$producersArray = Producer::find()->where('active = 1')->all();

$sumPrices = 0;
foreach($producersArray as $producer) {
$sumPrices += $producer->getAmountBilledLastMonth();
foreach ($producersArray as $producer) {
$sumPrices += $producer->getAmountBilledLastMonth();
}

return $this->render('index', [
@@ -104,13 +104,13 @@ class ProducerAdminController extends BackendController
'sumPrices' => $sumPrices
]);
}
/**
* Crée un producteur.
*
*
* @return mixed
*/
public function actionCreate()
public function actionCreate()
{
$model = new Producer();

@@ -145,32 +145,31 @@ class ProducerAdminController extends BackendController

public function actionUserTransfer($fromProducerId, $toProducerId, $withOrders = 1)
{
$fromProducerId = (int) $fromProducerId;
$toProducerId = (int) $toProducerId;
$fromProducerId = (int)$fromProducerId;
$toProducerId = (int)$toProducerId;
$count = 0;
$usersArray = User::findBy(['id_producer' => $fromProducerId])->all();
$usersArray = User::findBy(['id_producer' => $fromProducerId])->all();

foreach($usersArray as $user) {
foreach ($usersArray as $user) {
$idUser = $user['user_id'];

$countOrders = 0;
if($withOrders) {
if ($withOrders) {
$countOrders = Order::searchCount([
'id_user' => $idUser,
'distribution.id_producer' => $fromProducerId
], ['conditions' => 'date_delete IS NULL']);
}

if(($withOrders && $countOrders) || !$withOrders) {
if (($withOrders && $countOrders) || !$withOrders) {
Producer::addUser($idUser, $toProducerId);
$count ++;
$count++;
}
}

if($count) {
Yii::$app->getSession()->setFlash('success', $count.' clients importés du producteur #'.$fromProducerId.' vers le producteur #'.$toProducerId.'.');
}
else {
if ($count) {
Yii::$app->getSession()->setFlash('success', $count . ' clients importés du producteur #' . $fromProducerId . ' vers le producteur #' . $toProducerId . '.');
} else {
Yii::$app->getSession()->setFlash('error', 'Aucun client à importer.');
}

@@ -179,22 +178,22 @@ class ProducerAdminController extends BackendController

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

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

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

@@ -203,10 +202,10 @@ class ProducerAdminController extends BackendController
$invoice->date = date('Y-m-d H:i:s');
$invoice->reference = $reference;
$invoice->turnover = $producer->getTurnover($period);
$invoice->amount_ht = $producer->getFreePrice() ;
$invoice->amount_ht = $producer->getFreePrice();
$invoice->wording = 'Facture ' . date('m/Y', strtotime('-1 month'));
$invoice->text = 'Utilisation de la plateforme <strong>distrib</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>.';
. 'Chiffre d\'affaire réalisé sur la plateforme : <strong>' . number_format($facture->ca, 2) . ' €</strong> commissionné à <strong>1%</strong>.';
$invoice->paid = 0;
$invoice->period = $period;
$invoice->save();
@@ -217,15 +216,15 @@ class ProducerAdminController extends BackendController

/**
* Liste les factures des producteurs.
*
*
* @return mxied
*/
public function actionBilling()
public function actionBilling()
{
$dataProviderInvoice = new ActiveDataProvider([
'query' => Invoice::find()
->with('producer')
->orderBy('reference DESC'),
->with('producer')
->orderBy('reference DESC'),
'pagination' => [
'pageSize' => 1000,
],
@@ -235,45 +234,46 @@ class ProducerAdminController extends BackendController
'dataProviderInvoice' => $dataProviderInvoice,
]);
}
public function actionProducerInstallTaxUpdatePrices($idProducer)
{
// product
$productsArray = Product::searchAll([
'id_producer' => $idProducer
]) ;
$connection = Yii::$app->getDb();
foreach($productsArray as $product) {
$product->price = round($product->price / (1 + $product->taxRate->value), 2) ;
$product->save() ;
$command = $connection->createCommand("
// product
$productsArray = Product::searchAll([
'id_producer' => $idProducer
]);
$connection = Yii::$app->getDb();
foreach ($productsArray as $product) {
$product->price = round($product->price / (1 + $product->taxRate->value), 2);
$product->save();
$command = $connection->createCommand("
UPDATE `product_order`
SET price = ROUND(price / (1 + :tax_value), 2),
id_tax_rate = :id_tax_rate
WHERE id_product = :id_product",
[
':id_product' => $product->id,
':tax_value' => $product->taxRate->value,
':id_tax_rate' => $product->taxRate->id,
]);
[
':id_product' => $product->id,
':tax_value' => $product->taxRate->value,
':id_tax_rate' => $product->taxRate->id,
]);

$result = $command->query();
}
$result = $command->query();
}

echo 'ok' ;
echo 'ok';
}

/**
* Recherche un établissement.
*
*
* @param integer $id
* @return Etablissement
* @throws NotFoundHttpException
*/
protected function findModel($id) {
protected function findModel($id)
{
if (($model = Producer::findOne($id)) !== null) {
return $model;
} else {

+ 1
- 2
backend/controllers/ProducerController.php 查看文件

@@ -51,7 +51,6 @@ use common\helpers\Upload;
*/
class ProducerController extends BackendController
{

public $enableCsrfValidation = false;

public function behaviors()
@@ -176,7 +175,7 @@ class ProducerController extends BackendController
}

$dataProviderPrices = new ActiveDataProvider([
'query' => ProducerPriceRange::find()
'query' => ProducerPriceRange::find()
->orderBy('id ASC'),
'pagination' => [
'pageSize' => 100,

+ 96
- 96
backend/controllers/ProducerPriceRangeAdminController.php 查看文件

@@ -50,112 +50,112 @@ use yii\data\ActiveDataProvider;
class ProducerPriceRangeAdminController extends BackendController
{

public function behaviors()
{
return [
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
],
],
'access' => [
'class' => AccessControl::className(),
'rules' => [
[
'allow' => true,
'roles' => ['@'],
'matchCallback' => function ($rule, $action) {
return User::getCurrentStatus() == User::STATUS_ADMIN;
}
]
],
],
];
}
public function behaviors()
{
return [
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
],
],
'access' => [
'class' => AccessControl::className(),
'rules' => [
[
'allow' => true,
'roles' => ['@'],
'matchCallback' => function ($rule, $action) {
return User::getCurrentStatus() == User::STATUS_ADMIN;
}
]
],
],
];
}

/**
* Liste les tranches de prix.
*
* @return mixed
*/
public function actionIndex()
{
$dataProvider = new ActiveDataProvider([
'query' => ProducerPriceRange::find()->orderBy('range_begin ASC')
]);
/**
* Liste les tranches de prix.
*
* @return mixed
*/
public function actionIndex()
{
$dataProvider = new ActiveDataProvider([
'query' => ProducerPriceRange::find()->orderBy('range_begin ASC')
]);

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

/**
* Crée une tranche de prix.
*
* @return mixed
*/
public function actionCreate()
{
$model = new ProducerPriceRange();
/**
* Crée une tranche de prix.
*
* @return mixed
*/
public function actionCreate()
{
$model = new ProducerPriceRange();

if ($model->load(Yii::$app->request->post()) && $model->save()) {
Yii::$app->getSession()->setFlash('success', 'Tranche de prix créée.');
return $this->redirect(['index']);
} else {
return $this->render('create', [
'model' => $model,
]);
}
if ($model->load(Yii::$app->request->post()) && $model->save()) {
Yii::$app->getSession()->setFlash('success', 'Tranche de prix créée.');
return $this->redirect(['index']);
} else {
return $this->render('create', [
'model' => $model,
]);
}
}

/**
* Édition d'une tranche de prix.
*
* @return mixed
*/
public function actionUpdate($id)
{
$model = $this->findModel($id);
/**
* Édition d'une tranche de prix.
*
* @return mixed
*/
public function actionUpdate($id)
{
$model = $this->findModel($id);

if ($model->load(Yii::$app->request->post()) && $model->save()) {
Yii::$app->getSession()->setFlash('success', 'Tranche de prix éditée.');
return $this->redirect(['index']);
} else {
return $this->render('update', [
'model' => $model,
]);
}
if ($model->load(Yii::$app->request->post()) && $model->save()) {
Yii::$app->getSession()->setFlash('success', 'Tranche de prix éditée.');
return $this->redirect(['index']);
} else {
return $this->render('update', [
'model' => $model,
]);
}
}

/**
* Supprime une tranche de prix.
*
* @param integer $id
*/
public function actionDelete($id)
{
$producerPriceRange = ProducerPriceRange::searchOne([
'id' => $id
]) ;
$producerPriceRange->delete();
/**
* Supprime une tranche de prix.
*
* @param integer $id
*/
public function actionDelete($id)
{
$producerPriceRange = ProducerPriceRange::searchOne([
'id' => $id
]);
$producerPriceRange->delete();

Yii::$app->getSession()->setFlash('success', 'Tranche de prix supprimée.');
return $this->redirect(['producer-price-range-admin/index']);
}
Yii::$app->getSession()->setFlash('success', 'Tranche de prix supprimée.');
return $this->redirect(['producer-price-range-admin/index']);
}

/**
* Finds the Developpement model based on its primary key value.
* If the model is not found, a 404 HTTP exception will be thrown.
* @param integer $id
* @return ProducerPriceRange the loaded model
* @throws NotFoundHttpException if the model cannot be found
*/
protected function findModel($id)
{
if (($model = ProducerPriceRange::findOne($id)) !== null) {
return $model;
} else {
throw new NotFoundHttpException('The requested page does not exist.');
}
/**
* Finds the Developpement model based on its primary key value.
* If the model is not found, a 404 HTTP exception will be thrown.
* @param integer $id
* @return ProducerPriceRange the loaded model
* @throws NotFoundHttpException if the model cannot be found
*/
protected function findModel($id)
{
if (($model = ProducerPriceRange::findOne($id)) !== null) {
return $model;
} else {
throw new NotFoundHttpException('The requested page does not exist.');
}
}
}

+ 6
- 6
backend/controllers/ProductController.php 查看文件

@@ -126,7 +126,7 @@ class ProductController extends BackendController

if ($model->load(Yii::$app->request->post()) && $model->save()) {

$lastProductOrder = Product::find()->where('id_producer = :id_producer')->params([':id_producer' => GlobalParam::getCurrentProducerId()])->orderBy('order DESC')->one();
$lastProductOrder = Product::find()->where('id_producer = :id_producer')->params([':id_producer' => GlobalParam::getCurrentProducerId()])->orderBy('order DESC')->one();
if ($lastProductOrder) {
$model->order = ++$lastProductOrder->order;
}
@@ -230,7 +230,7 @@ class ProductController extends BackendController
'id_product' => $id
]));

$userProducerWithProductPercent = UserProducer::searchAll([], [
$userProducerWithProductPercent = UserProducer::searchAll([], [
'join_with' => ['user'],
'conditions' => 'user_producer.product_price_percent != 0',
]);
@@ -265,7 +265,7 @@ class ProductController extends BackendController
'from_quantity' => $model->from_quantity ? $model->from_quantity : null,
];

$productPriceExist = ProductPrice::findOne($conditionsProductPriceExist);
$productPriceExist = ProductPrice::findOne($conditionsProductPriceExist);

if ($productPriceExist) {
$productPriceExist->delete();
@@ -356,7 +356,7 @@ class ProductController extends BackendController
{
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
$product = $this->findModel($id);
$product->active = (int) $active;
$product->active = (int)$active;
$product->save();

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

protected function findModelProductPrice($id)
{
if (($model = ProductPrice::findOne($id)) !== null) {
if (($model = ProductPrice::findOne($id)) !== null) {
return $model;
} else {
throw new NotFoundHttpException('The requested page does not exist.');

+ 58
- 59
backend/controllers/QuotationController.php 查看文件

@@ -45,71 +45,70 @@ use yii\base\UserException;

class QuotationController extends DocumentController
{
public function behaviors()
{
return [
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
],
],
'access' => [
'class' => AccessControl::className(),
'rules' => [
[
'allow' => true,
'roles' => ['@'],
'matchCallback' => function ($rule, $action) {
return $this->getUserManager()->hasAccessBackend();
}
]
],
],
];
}
public function behaviors()
{
return [
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
],
],
'access' => [
'class' => AccessControl::className(),
'rules' => [
[
'allow' => true,
'roles' => ['@'],
'matchCallback' => function ($rule, $action) {
return $this->getUserManager()->hasAccessBackend();
}
]
],
],
];
}

/**
* Liste les modèles Invoice.
*
* @return mixed
*/
public function actionIndex()
{
$searchModel = new QuotationSearch();
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);
/**
* Liste les modèles Invoice.
*
* @return mixed
*/
public function actionIndex()
{
$searchModel = new QuotationSearch();
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);

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

public function actionTransform($id)
{
$quotation = $this->findModel($id) ;
if($quotation->isStatusValid()) {
public function actionTransform($id)
{
$quotation = $this->findModel($id);
if ($quotation->isStatusValid()) {

$invoice = new Invoice ;
$invoice->initTaxCalculationMethod();
$invoice->id_producer = GlobalParam::getCurrentProducerId();
$invoice->id_user = $quotation->id_user ;
$invoice->address = $quotation->address ;
$invoice->comment = $quotation->comment ;
$invoice->name = str_replace(['Devis', 'devis'], 'Facture', $quotation->name);
$invoice->save() ;
$invoice = new Invoice;
$invoice->initTaxCalculationMethod();
$invoice->id_producer = GlobalParam::getCurrentProducerId();
$invoice->id_user = $quotation->id_user;
$invoice->address = $quotation->address;
$invoice->comment = $quotation->comment;
$invoice->name = str_replace(['Devis', 'devis'], 'Facture', $quotation->name);
$invoice->save();

Order::updateAll([
'order.id_invoice' => $invoice->id
], [
'order.id_quotation' => $id
]) ;
Order::updateAll([
'order.id_invoice' => $invoice->id
], [
'order.id_quotation' => $id
]);

Yii::$app->getSession()->setFlash('success', 'Le devis <strong>'.Html::encode($quotation->name).'</strong> a bien été transformé en facture.');
return $this->redirect(['/' . $this->getControllerUrl() . '/index']);
}
else {
throw new UserException('Vous ne pouvez pas transformer en facture un devis non validé.');
}
Yii::$app->getSession()->setFlash('success', 'Le devis <strong>' . Html::encode($quotation->name) . '</strong> a bien été transformé en facture.');
return $this->redirect(['/' . $this->getControllerUrl() . '/index']);
} else {
throw new UserException('Vous ne pouvez pas transformer en facture un devis non validé.');
}
}

}

+ 102
- 102
backend/controllers/ReportController.php 查看文件

@@ -1,40 +1,40 @@
<?php

/**
Copyright distrib (2018)
contact@opendistrib.net
Ce logiciel est un programme informatique servant à aider les producteurs
à distribuer leur production en circuits courts.
Ce logiciel est régi par la licence CeCILL soumise au droit français et
respectant les principes de diffusion des logiciels libres. Vous pouvez
utiliser, modifier et/ou redistribuer ce programme sous les conditions
de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA
sur le site "http://www.cecill.info".
En contrepartie de l'accessibilité au code source et des droits de copie,
de modification et de redistribution accordés par cette licence, il n'est
offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons,
seule une responsabilité restreinte pèse sur l'auteur du programme, le
titulaire des droits patrimoniaux et les concédants successifs.
A cet égard l'attention de l'utilisateur est attirée sur les risques
associés au chargement, à l'utilisation, à la modification et/ou au
développement et à la reproduction du logiciel par l'utilisateur étant
donné sa spécificité de logiciel libre, qui peut le rendre complexe à
manipuler et qui le réserve donc à des développeurs et des professionnels
avertis possédant des connaissances informatiques approfondies. Les
utilisateurs sont donc invités à charger et tester l'adéquation du
logiciel à leurs besoins dans des conditions permettant d'assurer la
sécurité de leurs systèmes et ou de leurs données et, plus généralement,
à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.
Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
pris connaissance de la licence CeCILL, et que vous en avez accepté les
termes.
*/
/**
* Copyright distrib (2018)
*
* contact@opendistrib.net
*
* Ce logiciel est un programme informatique servant à aider les producteurs
* à distribuer leur production en circuits courts.
*
* Ce logiciel est régi par la licence CeCILL soumise au droit français et
* respectant les principes de diffusion des logiciels libres. Vous pouvez
* utiliser, modifier et/ou redistribuer ce programme sous les conditions
* de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA
* sur le site "http://www.cecill.info".
*
* En contrepartie de l'accessibilité au code source et des droits de copie,
* de modification et de redistribution accordés par cette licence, il n'est
* offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons,
* seule une responsabilité restreinte pèse sur l'auteur du programme, le
* titulaire des droits patrimoniaux et les concédants successifs.
*
* A cet égard l'attention de l'utilisateur est attirée sur les risques
* associés au chargement, à l'utilisation, à la modification et/ou au
* développement et à la reproduction du logiciel par l'utilisateur étant
* donné sa spécificité de logiciel libre, qui peut le rendre complexe à
* manipuler et qui le réserve donc à des développeurs et des professionnels
* avertis possédant des connaissances informatiques approfondies. Les
* utilisateurs sont donc invités à charger et tester l'adéquation du
* logiciel à leurs besoins dans des conditions permettant d'assurer la
* sécurité de leurs systèmes et ou de leurs données et, plus généralement,
* à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.
*
* Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
* pris connaissance de la licence CeCILL, et que vous en avez accepté les
* termes.
*/

namespace backend\controllers;

@@ -42,11 +42,11 @@ use common\helpers\GlobalParam;
use Yii;
use yii\filters\AccessControl;

class ReportController extends BackendController
class ReportController extends BackendController
{
var $enableCsrfValidation = false;

public function behaviors()
public function behaviors()
{
return [
'access' => [
@@ -63,121 +63,121 @@ class ReportController extends BackendController
],
];
}
public function actionIndex()
public function actionIndex()
{
$this->checkProductsPointsSale() ;
return $this->render('index') ;
$this->checkProductsPointsSale();
return $this->render('index');
}
public function actionAjaxInit()
public function actionAjaxInit()
{
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
$usersArray = User::findBy()->all() ;
$pointsSaleArray = PointSale::searchAll() ;
$usersArray = User::findBy()->all();
$pointsSaleArray = PointSale::searchAll();
// distributions
$firstDistribution = DistributionModel::searchOne([], [
'orderby' => 'date ASC'
]) ;
]);
$lastDistribution = DistributionModel::searchOne([], [
'orderby' => 'date DESC'
]) ;
$firstYear = date('Y',strtotime($firstDistribution->date)) ;
$lastYear = date('Y',strtotime($lastDistribution->date)) ;
$distributionYearsArray = [] ;
for($year = $firstYear; $year <= $lastYear; $year ++) {
$distributionYearsArray[] = $year ;
]);
$firstYear = date('Y', strtotime($firstDistribution->date));
$lastYear = date('Y', strtotime($lastDistribution->date));
$distributionYearsArray = [];
for ($year = $firstYear; $year <= $lastYear; $year++) {
$distributionYearsArray[] = $year;
}
$distributionsArray = DistributionModel::searchAll([
'distribution.active' => 1
], [
'orderby' => 'date ASC',
]) ;
$distributionsByMonthArray = [] ;
foreach($distributionsArray as $distribution) {
$month = date('Y-m', strtotime($distribution->date)) ;
if(!isset($distributionsByMonthArray[$month])) {
]);
$distributionsByMonthArray = [];
foreach ($distributionsArray as $distribution) {
$month = date('Y-m', strtotime($distribution->date));
if (!isset($distributionsByMonthArray[$month])) {
$distributionsByMonthArray[$month] = [
'display' => 0,
'year' => date('Y',strtotime($distribution->date)),
'year' => date('Y', strtotime($distribution->date)),
'month' => strftime('%B', strtotime($distribution->date)),
'distributions' => []
] ;
];
}
$distribution->date = strftime('%A %d %B %Y', strtotime($distribution->date)) ;
$distributionsByMonthArray[$month]['distributions'][] = $distribution ;
$distribution->date = strftime('%A %d %B %Y', strtotime($distribution->date));
$distributionsByMonthArray[$month]['distributions'][] = $distribution;
}
return [
return [
'usersArray' => $usersArray,
'pointsSaleArray' => $pointsSaleArray,
'distributionYearsArray' => $distributionYearsArray,
'distributionsByMonthArray' => $distributionsByMonthArray
] ;
];
}
public function actionAjaxReport()
public function actionAjaxReport()
{
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
$posts = Yii::$app->request->post();
$resArray = [] ;

$conditionUsers = $this->_generateConditionSqlReport($posts, 'users', 'id_user') ;
$conditionPointsSale = $this->_generateConditionSqlReport($posts, 'pointsSale', 'id_point_sale') ;
$conditionDistributions = $this->_generateConditionSqlReport($posts, 'distributions', 'id_distribution') ;
$resArray = [];

$conditionUsers = $this->_generateConditionSqlReport($posts, 'users', 'id_user');
$conditionPointsSale = $this->_generateConditionSqlReport($posts, 'pointsSale', 'id_point_sale');
$conditionDistributions = $this->_generateConditionSqlReport($posts, 'distributions', 'id_distribution');

$res = Yii::$app->db->createCommand("SELECT product.name, SUM(product_order.quantity) AS quantity, SUM(product_order.price * product_order.quantity) AS total
FROM `order`, product_order, product
WHERE `order`.id = product_order.id_order
AND product.id_producer = ".((int) GlobalParam::getCurrentProducerId()) ."
AND product.id_producer = " . ((int)GlobalParam::getCurrentProducerId()) . "
AND product_order.id_product = product.id
AND `order`.date_delete IS NULL
".$conditionUsers."
".$conditionPointsSale."
".$conditionDistributions."
" . $conditionUsers . "
" . $conditionPointsSale . "
" . $conditionDistributions . "
GROUP BY product.id
ORDER BY product.order ASC
")
->queryAll();
->queryAll();

$totalGlobal = 0 ;
foreach($res as $line) {
$total = Price::format(round($line['total'], 2)) ;
if($line['quantity'] > 0) {
$totalGlobal = 0;
foreach ($res as $line) {
$total = Price::format(round($line['total'], 2));
if ($line['quantity'] > 0) {
$resArray[] = [
'name' => $line['name'],
'quantity' => $line['quantity'],
'total' => $total,
] ;
$totalGlobal += $line['total'] ;
];
$totalGlobal += $line['total'];
}
}
$resArray[] = [
'name' => '',
'quantity' => '',
'total' => '<strong>'.Price::format(round($totalGlobal, 2)).'</strong>',
] ;
return $resArray ;
'total' => '<strong>' . Price::format(round($totalGlobal, 2)) . '</strong>',
];
return $resArray;
}
public function _generateConditionSqlReport($posts, $name, $fieldOrder)
public function _generateConditionSqlReport($posts, $name, $fieldOrder)
{
$condition = '' ;
if(isset($posts[$name]) && strlen($posts[$name])) {
$idsArray = explode(',', $posts[$name]) ;
for($i = 0; $i < count($idsArray); $i++) {
$idsArray[$i] = (int) $idsArray[$i] ;
$condition = '';
if (isset($posts[$name]) && strlen($posts[$name])) {
$idsArray = explode(',', $posts[$name]);
for ($i = 0; $i < count($idsArray); $i++) {
$idsArray[$i] = (int)$idsArray[$i];
}
$condition = 'AND `order`.'.$fieldOrder.' IN ('.implode(',',$idsArray).') ' ;
$condition = 'AND `order`.' . $fieldOrder . ' IN (' . implode(',', $idsArray) . ') ';
}
return $condition ;
return $condition;
}
}

+ 215
- 214
backend/controllers/SiteController.php 查看文件

@@ -1,44 +1,49 @@
<?php

/**
Copyright distrib (2018)
contact@opendistrib.net
Ce logiciel est un programme informatique servant à aider les producteurs
à distribuer leur production en circuits courts.
Ce logiciel est régi par la licence CeCILL soumise au droit français et
respectant les principes de diffusion des logiciels libres. Vous pouvez
utiliser, modifier et/ou redistribuer ce programme sous les conditions
de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA
sur le site "http://www.cecill.info".
En contrepartie de l'accessibilité au code source et des droits de copie,
de modification et de redistribution accordés par cette licence, il n'est
offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons,
seule une responsabilité restreinte pèse sur l'auteur du programme, le
titulaire des droits patrimoniaux et les concédants successifs.
A cet égard l'attention de l'utilisateur est attirée sur les risques
associés au chargement, à l'utilisation, à la modification et/ou au
développement et à la reproduction du logiciel par l'utilisateur étant
donné sa spécificité de logiciel libre, qui peut le rendre complexe à
manipuler et qui le réserve donc à des développeurs et des professionnels
avertis possédant des connaissances informatiques approfondies. Les
utilisateurs sont donc invités à charger et tester l'adéquation du
logiciel à leurs besoins dans des conditions permettant d'assurer la
sécurité de leurs systèmes et ou de leurs données et, plus généralement,
à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.
Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
pris connaissance de la licence CeCILL, et que vous en avez accepté les
termes.
* Copyright distrib (2018)
*
* contact@opendistrib.net
*
* Ce logiciel est un programme informatique servant à aider les producteurs
* à distribuer leur production en circuits courts.
*
* Ce logiciel est régi par la licence CeCILL soumise au droit français et
* respectant les principes de diffusion des logiciels libres. Vous pouvez
* utiliser, modifier et/ou redistribuer ce programme sous les conditions
* de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA
* sur le site "http://www.cecill.info".
*
* En contrepartie de l'accessibilité au code source et des droits de copie,
* de modification et de redistribution accordés par cette licence, il n'est
* offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons,
* seule une responsabilité restreinte pèse sur l'auteur du programme, le
* titulaire des droits patrimoniaux et les concédants successifs.
*
* A cet égard l'attention de l'utilisateur est attirée sur les risques
* associés au chargement, à l'utilisation, à la modification et/ou au
* développement et à la reproduction du logiciel par l'utilisateur étant
* donné sa spécificité de logiciel libre, qui peut le rendre complexe à
* manipuler et qui le réserve donc à des développeurs et des professionnels
* avertis possédant des connaissances informatiques approfondies. Les
* utilisateurs sont donc invités à charger et tester l'adéquation du
* logiciel à leurs besoins dans des conditions permettant d'assurer la
* sécurité de leurs systèmes et ou de leurs données et, plus généralement,
* à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.
*
* Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
* pris connaissance de la licence CeCILL, et que vous en avez accepté les
* termes.
*/

namespace backend\controllers;

use common\helpers\GlobalParam;
use common\logic\Distribution\Distribution\Distribution;
use common\logic\Order\Order\Order;
use common\logic\PointSale\PointSale\PointSale;
use common\logic\Product\Product\Product;
use common\logic\User\User\User;
use Yii;
use yii\filters\AccessControl;
use common\forms\LoginForm;
@@ -49,196 +54,192 @@ use yii\filters\VerbFilter;
*/
class SiteController extends BackendController
{

/**
* @inheritdoc
*/
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::className(),
'rules' => [
[
'actions' => ['login', 'error'],
'allow' => true,
],
[
'actions' => ['logout', 'index'],
'allow' => true,
'roles' => ['@'],
'matchCallback' => function ($rule, $action) {
return $this->getUserManager()->hasAccessBackend();
}
],
[
'actions' => ['change-producer'],
'allow' => true,
'roles' => ['@'],
'matchCallback' => function ($rule, $action) {
return User::getCurrentStatus() == User::STATUS_ADMIN ;
}
],
],
],
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
],
],
];
}

/**
* @inheritdoc
*/
public function actions()
{
return [
'error' => [
'class' => 'yii\web\ErrorAction',
],
];
}

/**
* Affiche le tableau de bord du backend avec les dernières commandes
* réalisée, les dernières inscriptions, la liste des clients ayant un crédit
* négatif etc.
*
* @return mixed
*/
public function actionIndex()
{

// commandes
$optionDashboardNumberDistributions = Producer::getConfig('option_dashboard_number_distributions') ;
$dashboardNumberDistributions = $optionDashboardNumberDistributions ? $optionDashboardNumberDistributions : 3 ;

$optionDashboardDateStart = Producer::getConfig('option_dashboard_date_start') ;
$optionDashboardDateEnd = Producer::getConfig('option_dashboard_date_end') ;

$queryDistributions = DistributionModel::find()->with('order') ;

if($optionDashboardDateStart || $optionDashboardDateEnd) {
if($optionDashboardDateStart) {
$queryDistributions->andWhere(['>=', 'distribution.date', $optionDashboardDateStart]) ;
/**
* @inheritdoc
*/
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::class,
'rules' => [
[
'actions' => ['login', 'error'],
'allow' => true,
],
[
'actions' => ['logout', 'index'],
'allow' => true,
'roles' => ['@'],
'matchCallback' => function ($rule, $action) {
return $this->getUserManager()->hasAccessBackend();
}
if($optionDashboardDateEnd) {
$queryDistributions->andWhere(['<=', 'distribution.date', $optionDashboardDateEnd]) ;
],
[
'actions' => ['change-producer'],
'allow' => true,
'roles' => ['@'],
'matchCallback' => function ($rule, $action) {
return $this->getUserManager()->getCurrentStatus() == User::STATUS_ADMIN;
}
}
else {
$queryDistributions->andWhere(['>=', 'distribution.date', date('Y-m-d')]) ;
}


$distributionsArray = $queryDistributions->andWhere([
'distribution.id_producer' => GlobalParam::getCurrentProducerId(),
'distribution.active' => 1
])
->orderBy('date ASC')
->limit($dashboardNumberDistributions)
->all();

// dernières commandes
$paramsOrders = [] ;
if($optionDashboardDateStart || $optionDashboardDateEnd) {
$conditionsOrders = '' ;
if($optionDashboardDateStart) {
$conditionsOrders .= 'distribution.date >= :date_start' ;
$paramsOrders[':date_start'] = $optionDashboardDateStart;
}
if($optionDashboardDateEnd) {
if($optionDashboardDateStart) {
$conditionsOrders .= ' AND ' ;
}
$conditionsOrders .= 'distribution.date <= :date_end' ;
$paramsOrders[':date_end'] = $optionDashboardDateEnd ;
}
}
else {
$conditionsOrders = 'distribution.date >= :date_start' ;
$paramsOrders[':date_start'] = date('Y-m-d 00:00:00') ;
}

$ordersArray = Order::searchAll([],[
'orderby' => 'date DESC',
'conditions' => $conditionsOrders.' 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' => $paramsOrders,
]);

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

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

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

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

return $this->render('index', [
'distributionsArray' => $distributionsArray,
'ordersArray' => $ordersArray,
'usersArray' => $usersArray,
'usersNegativeCredit' => $usersNegativeCredit,
'producer' => $producer,
'productsCount' => $productsCount,
'pointsSaleCount' => $pointsSaleCount
]);
],
],
],
'verbs' => [
'class' => VerbFilter::class,
'actions' => [
],
],
];
}

/**
* @inheritdoc
*/
public function actions()
{
return [
'error' => [
'class' => 'yii\web\ErrorAction',
],
];
}

/**
* Affiche le tableau de bord du backend avec les dernières commandes
* réalisée, les dernières inscriptions, la liste des clients ayant un crédit
* négatif etc.
*
* @return mixed
*/
public function actionIndex()
{
$userManager = $this->getUserManager();
$producerManager = $this->getProducerManager();

// commandes
$optionDashboardNumberDistributions = $producerManager->getConfig('option_dashboard_number_distributions');
$dashboardNumberDistributions = $optionDashboardNumberDistributions ? $optionDashboardNumberDistributions : 3;

$optionDashboardDateStart = $producerManager->getConfig('option_dashboard_date_start');
$optionDashboardDateEnd = $producerManager->getConfig('option_dashboard_date_end');

$queryDistributions = Distribution::find()->with('order');

if ($optionDashboardDateStart || $optionDashboardDateEnd) {
if ($optionDashboardDateStart) {
$queryDistributions->andWhere(['>=', 'distribution.date', $optionDashboardDateStart]);
}
if ($optionDashboardDateEnd) {
$queryDistributions->andWhere(['<=', 'distribution.date', $optionDashboardDateEnd]);
}
} else {
$queryDistributions->andWhere(['>=', 'distribution.date', date('Y-m-d')]);
}

/**
* Affiche la page de connexion.
*
* @return mixed
*/
public function actionLogin()
{
if (!\Yii::$app->user->isGuest) {
return $this->goHome();
}

$model = new LoginForm();
if ($model->load(Yii::$app->request->post()) && $model->login()) {
return $this->goBack();
} else {
return $this->render('login', [
'model' => $model,
]);
$distributionsArray = $queryDistributions->andWhere([
'distribution.id_producer' => GlobalParam::getCurrentProducerId(),
'distribution.active' => 1
])
->orderBy('date ASC')
->limit($dashboardNumberDistributions)
->all();

// dernières commandes
$paramsOrders = [];
if ($optionDashboardDateStart || $optionDashboardDateEnd) {
$conditionsOrders = '';
if ($optionDashboardDateStart) {
$conditionsOrders .= 'distribution.date >= :date_start';
$paramsOrders[':date_start'] = $optionDashboardDateStart;
}
if ($optionDashboardDateEnd) {
if ($optionDashboardDateStart) {
$conditionsOrders .= ' AND ';
}
$conditionsOrders .= 'distribution.date <= :date_end';
$paramsOrders[':date_end'] = $optionDashboardDateEnd;
}
} else {
$conditionsOrders = 'distribution.date >= :date_start';
$paramsOrders[':date_start'] = date('Y-m-d 00:00:00');
}

/**
* Déconnecte l'utilisateur et le redirige à la page d'accueil.
*
* @return mixed
*/
public function actionLogout()
{
Yii::$app->user->logout();

return $this->goHome();
$ordersArray = Order::searchAll([], [
'orderby' => 'date DESC',
'conditions' => $conditionsOrders . ' 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' => $paramsOrders,
]);

// clients
$usersArray = $userManager->queryUsersBy()
->orderBy('created_at DESC')
->limit(5)
->all();

$usersNegativeCredit = $userManager->queryUsersBy(['id_producer' => GlobalParam::getCurrentProducerId()])
->andWhere('user_producer.credit < 0')
->all();

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

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

return $this->render('index', [
'distributionsArray' => $distributionsArray,
'ordersArray' => $ordersArray,
'usersArray' => $usersArray,
'usersNegativeCredit' => $usersNegativeCredit,
'producer' => $producer,
'productsCount' => $productsCount,
'pointsSaleCount' => $pointsSaleCount
]);
}

/**
* Affiche la page de connexion.
*/
public function actionLogin()
{
if (!\Yii::$app->user->isGuest) {
return $this->goHome();
}

/**
* Change le producteur courant de l'utilisateur connecté.
* Permet de passer d'un producteur à un autre en tant qu'administrateur.
*
* @param integer $id
*/
public function actionChangeProducer($id)
{
Yii::$app->user->identity->id_producer = $id;
Yii::$app->user->identity->save();
$this->redirect(['site/index']);
$model = new LoginForm();
if ($model->load(Yii::$app->request->post()) && $model->login()) {
return $this->goBack();
} else {
return $this->render('login', [
'model' => $model,
]);
}

}

/**
* Déconnecte l'utilisateur et le redirige à la page d'accueil.
*
* @return mixed
*/
public function actionLogout()
{
Yii::$app->user->logout();

return $this->goHome();
}

/**
* Change le producteur courant de l'utilisateur connecté.
* Permet de passer d'un producteur à un autre en tant qu'administrateur.
*
* @param integer $id
*/
public function actionChangeProducer($id)
{
Yii::$app->user->identity->id_producer = $id;
Yii::$app->user->identity->save();
$this->redirect(['site/index']);
}
}

+ 96
- 97
backend/controllers/StatsController.php 查看文件

@@ -1,40 +1,40 @@
<?php

/**
Copyright distrib (2018)
contact@opendistrib.net
Ce logiciel est un programme informatique servant à aider les producteurs
à distribuer leur production en circuits courts.
Ce logiciel est régi par la licence CeCILL soumise au droit français et
respectant les principes de diffusion des logiciels libres. Vous pouvez
utiliser, modifier et/ou redistribuer ce programme sous les conditions
de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA
sur le site "http://www.cecill.info".
En contrepartie de l'accessibilité au code source et des droits de copie,
de modification et de redistribution accordés par cette licence, il n'est
offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons,
seule une responsabilité restreinte pèse sur l'auteur du programme, le
titulaire des droits patrimoniaux et les concédants successifs.
A cet égard l'attention de l'utilisateur est attirée sur les risques
associés au chargement, à l'utilisation, à la modification et/ou au
développement et à la reproduction du logiciel par l'utilisateur étant
donné sa spécificité de logiciel libre, qui peut le rendre complexe à
manipuler et qui le réserve donc à des développeurs et des professionnels
avertis possédant des connaissances informatiques approfondies. Les
utilisateurs sont donc invités à charger et tester l'adéquation du
logiciel à leurs besoins dans des conditions permettant d'assurer la
sécurité de leurs systèmes et ou de leurs données et, plus généralement,
à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.
Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
pris connaissance de la licence CeCILL, et que vous en avez accepté les
termes.
*/
/**
* Copyright distrib (2018)
*
* contact@opendistrib.net
*
* Ce logiciel est un programme informatique servant à aider les producteurs
* à distribuer leur production en circuits courts.
*
* Ce logiciel est régi par la licence CeCILL soumise au droit français et
* respectant les principes de diffusion des logiciels libres. Vous pouvez
* utiliser, modifier et/ou redistribuer ce programme sous les conditions
* de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA
* sur le site "http://www.cecill.info".
*
* En contrepartie de l'accessibilité au code source et des droits de copie,
* de modification et de redistribution accordés par cette licence, il n'est
* offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons,
* seule une responsabilité restreinte pèse sur l'auteur du programme, le
* titulaire des droits patrimoniaux et les concédants successifs.
*
* A cet égard l'attention de l'utilisateur est attirée sur les risques
* associés au chargement, à l'utilisation, à la modification et/ou au
* développement et à la reproduction du logiciel par l'utilisateur étant
* donné sa spécificité de logiciel libre, qui peut le rendre complexe à
* manipuler et qui le réserve donc à des développeurs et des professionnels
* avertis possédant des connaissances informatiques approfondies. Les
* utilisateurs sont donc invités à charger et tester l'adéquation du
* logiciel à leurs besoins dans des conditions permettant d'assurer la
* sécurité de leurs systèmes et ou de leurs données et, plus généralement,
* à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.
*
* Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
* pris connaissance de la licence CeCILL, et que vous en avez accepté les
* termes.
*/

namespace backend\controllers;

@@ -45,10 +45,10 @@ use DateTime;
use DateInterval;
use DatePeriod;

class StatsController extends BackendController
class StatsController extends BackendController
{

public function behaviors()
public function behaviors()
{
return [
'access' => [
@@ -68,10 +68,10 @@ class StatsController extends BackendController

/**
* Affiche les statistiques de l'année avec le CA réalisé par mois.
*
*
* @return mixed
*/
public function actionIndex()
public function actionIndex()
{
/*
* Volume de commande de l'année passée (par mois)
@@ -103,15 +103,14 @@ class StatsController extends BackendController
AND distribution.date >= :date_start
AND distribution.date <= :date_end
")
->bindValue(':id_producer',GlobalParam::getCurrentProducerId())
->bindValue(':date_start', date('Y-m-', $date->getTimestamp()).'01')
->bindValue(':date_end', date('Y-m-', $date->getTimestamp()).'31' )
->bindValue(':id_producer', GlobalParam::getCurrentProducerId())
->bindValue(':date_start', date('Y-m-', $date->getTimestamp()) . '01')
->bindValue(':date_end', date('Y-m-', $date->getTimestamp()) . '31')
->queryOne();

if($res['total']) {
if ($res['total']) {
$data[$month] = $res['total'];
}
else {
} else {
$data[$month] = 0;
}

@@ -128,67 +127,67 @@ class StatsController extends BackendController
'data' => $dataNoIndex,
]);
}
const TOTALS = 13 ;
const TOTALS = 13;
/**
* Affiche un tableau avec les totaux (maximums, commandés) de chaque produit
* par mois d'une année donnée.
*
*
* @param integer $year
* @return mixed
*/
public function actionProducts($year = 0, $section = 1)
public function actionProducts($year = 0, $section = 1)
{
if(!$year) $year = date('Y') ;
$productsArray = Product::searchAll() ;
$dataProducts = [] ;
$dataProducts[self::TOTALS] = ['max' => [], 'orders' => []] ;
foreach($productsArray as $product) {
$dataProducts[self::TOTALS]['max'][$product['name']] = 0 ;
$dataProducts[self::TOTALS]['orders'][$product['name']] = 0 ;
if (!$year) $year = date('Y');
$productsArray = Product::searchAll();
$dataProducts = [];
$dataProducts[self::TOTALS] = ['max' => [], 'orders' => []];
foreach ($productsArray as $product) {
$dataProducts[self::TOTALS]['max'][$product['name']] = 0;
$dataProducts[self::TOTALS]['orders'][$product['name']] = 0;
}
if(!in_array($section, [1, 2, 3, 4])) {
$section = 1 ;
if (!in_array($section, [1, 2, 3, 4])) {
$section = 1;
}
$iStart = (3 * ($section - 1)) + 1 ;
$iEnd = 3 * $section ;
$empty = true ;
for($i = $iStart; $i <= $iEnd; $i++) {
$iStart = (3 * ($section - 1)) + 1;
$iEnd = 3 * $section;
$empty = true;
for ($i = $iStart; $i <= $iEnd; $i++) {
// Maximums
$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 = ".GlobalParam::getCurrentProducerId()."
WHERE distribution.id_producer = " . GlobalParam::getCurrentProducerId() . "
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();
$dataProducts[$i]['max'] = $resMaximums ;
if(count($resMaximums)) $empty = false ;
foreach($resMaximums as $productMax) {
if(!isset($dataProducts[self::TOTALS]['max'][$productMax['name']])) {
$dataProducts[self::TOTALS]['max'][$productMax['name']] = 0 ;
->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();
$dataProducts[$i]['max'] = $resMaximums;
if (count($resMaximums)) $empty = false;
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'] ;
$dataProducts[self::TOTALS]['max'][$productMax['name']] += $productMax['total'];
}

// Commandés
$resOrders = Yii::$app->db->createCommand('
SELECT product.name, SUM(product_order.quantity) AS total
FROM `distribution`, `order`, `product_order`, `product`
WHERE distribution.id_producer = '.GlobalParam::getCurrentProducerId().'
WHERE distribution.id_producer = ' . GlobalParam::getCurrentProducerId() . '
AND distribution.date >= :date_begin
AND distribution.date <= :date_end
AND distribution.id = `order`.id_distribution
@@ -196,26 +195,26 @@ class StatsController extends BackendController
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();
->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();
$dataProducts[$i]['orders'] = $resOrders;
if(count($resOrders)) $empty = false ;
foreach($resOrders as $productOrder) {
if(!isset($dataProducts[self::TOTALS]['orders'][$productOrder['name']])) {
$dataProducts[self::TOTALS]['orders'][$productOrder['name']] = 0 ;
if (count($resOrders)) $empty = false;
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'] ;
$dataProducts[self::TOTALS]['orders'][$productOrder['name']] += $productOrder['total'];
}
}
ksort($dataProducts) ;
$monthArray = ['Janvier','Février','Mars','Avril','Mai','Juin','Juillet','Août','Septembre','Octobre','Novembre','Décembre','Totaux'] ;
ksort($dataProducts);
$monthArray = ['Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre', 'Totaux'];
return $this->render('products', [
'year' => $year,
'monthArray' => $monthArray,

+ 129
- 133
backend/controllers/SubscriptionController.php 查看文件

@@ -1,49 +1,49 @@
<?php
/**
Copyright distrib (2018)
contact@opendistrib.net
Ce logiciel est un programme informatique servant à aider les producteurs
à distribuer leur production en circuits courts.
Ce logiciel est régi par la licence CeCILL soumise au droit français et
respectant les principes de diffusion des logiciels libres. Vous pouvez
utiliser, modifier et/ou redistribuer ce programme sous les conditions
de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA
sur le site "http://www.cecill.info".
En contrepartie de l'accessibilité au code source et des droits de copie,
de modification et de redistribution accordés par cette licence, il n'est
offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons,
seule une responsabilité restreinte pèse sur l'auteur du programme, le
titulaire des droits patrimoniaux et les concédants successifs.
A cet égard l'attention de l'utilisateur est attirée sur les risques
associés au chargement, à l'utilisation, à la modification et/ou au
développement et à la reproduction du logiciel par l'utilisateur étant
donné sa spécificité de logiciel libre, qui peut le rendre complexe à
manipuler et qui le réserve donc à des développeurs et des professionnels
avertis possédant des connaissances informatiques approfondies. Les
utilisateurs sont donc invités à charger et tester l'adéquation du
logiciel à leurs besoins dans des conditions permettant d'assurer la
sécurité de leurs systèmes et ou de leurs données et, plus généralement,
à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.
Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
pris connaissance de la licence CeCILL, et que vous en avez accepté les
termes.
*/
/**
* Copyright distrib (2018)
*
* contact@opendistrib.net
*
* Ce logiciel est un programme informatique servant à aider les producteurs
* à distribuer leur production en circuits courts.
*
* Ce logiciel est régi par la licence CeCILL soumise au droit français et
* respectant les principes de diffusion des logiciels libres. Vous pouvez
* utiliser, modifier et/ou redistribuer ce programme sous les conditions
* de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA
* sur le site "http://www.cecill.info".
*
* En contrepartie de l'accessibilité au code source et des droits de copie,
* de modification et de redistribution accordés par cette licence, il n'est
* offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons,
* seule une responsabilité restreinte pèse sur l'auteur du programme, le
* titulaire des droits patrimoniaux et les concédants successifs.
*
* A cet égard l'attention de l'utilisateur est attirée sur les risques
* associés au chargement, à l'utilisation, à la modification et/ou au
* développement et à la reproduction du logiciel par l'utilisateur étant
* donné sa spécificité de logiciel libre, qui peut le rendre complexe à
* manipuler et qui le réserve donc à des développeurs et des professionnels
* avertis possédant des connaissances informatiques approfondies. Les
* utilisateurs sont donc invités à charger et tester l'adéquation du
* logiciel à leurs besoins dans des conditions permettant d'assurer la
* sécurité de leurs systèmes et ou de leurs données et, plus généralement,
* à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.
*
* Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
* pris connaissance de la licence CeCILL, et que vous en avez accepté les
* termes.
*/

namespace backend\controllers;

use common\helpers\GlobalParam;

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

public function behaviors()
public function behaviors()
{
return [
'access' => [
@@ -63,16 +63,16 @@ class SubscriptionController extends BackendController

/**
* Liste les commandes récurrente du producteur.
*
*
* @return string
*/
public function actionIndex()
public function actionIndex()
{
$this->checkProductsPointsSale() ;
$searchModel = new SubscriptionSearch ;
$this->checkProductsPointsSale();
$searchModel = new SubscriptionSearch;
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);
return $this->render('index', [
'searchModel' => $searchModel,
'dataProvider' => $dataProvider
@@ -81,30 +81,30 @@ class SubscriptionController extends BackendController

/**
* Crée un abonnement.
*
*
* @return string
*/
public function actionCreate($idOrder = 0)
{
public function actionCreate($idOrder = 0)
{
// form
$model = new SubscriptionForm;
$model->isAdmin = true ;
$model->isAdmin = true;
$model->id_producer = GlobalParam::getCurrentProducerId();

if($idOrder) {
if ($idOrder) {
$order = Order::searchOne(['id' => $idOrder]);
if ($order) {
$model->id_user = $order->id_user;
$model->username = $order->username;
$model->id_point_sale = $order->id_point_sale;
$model->date_begin = date('d/m/Y') ;
$dateDay = strtolower(date('l',strtotime($order->distribution->date))) ;
$model->$dateDay = 1 ;
$model->week_frequency = 1 ;
if($model->id_user && Producer::getConfig('credit')) {
$model->auto_payment = 1 ;
$model->date_begin = date('d/m/Y');
$dateDay = strtolower(date('l', strtotime($order->distribution->date)));
$model->$dateDay = 1;
$model->week_frequency = 1;
if ($model->id_user && Producer::getConfig('credit')) {
$model->auto_payment = 1;
}
// produits
foreach ($order->productOrder as $productOrder) {
$model->products['product_' . $productOrder->id_product] = $productOrder->quantity;
@@ -113,23 +113,21 @@ class SubscriptionController extends BackendController
throw new NotFoundHttpException('La commande est introuvable.', 404);
}
}
// produits
$productsArray = Product::searchAll([], [
$productsArray = Product::searchAll([], [
'orderby' => 'product.order ASC'
]) ;
if ($model->load(Yii::$app->request->post()) && $model->validate()
&& $model->save())
{
]);

if ($model->load(Yii::$app->request->post()) && $model->validate()
&& $model->save()) {
Yii::$app->getSession()->setFlash('success', 'Abonnement ajouté');
$subscription = Subscription::findOne($model->id) ;
$matchedDistributionsArray = $subscription->searchMatchedIncomingDistributions() ;
if(count($matchedDistributionsArray)) {
$subscription = Subscription::findOne($model->id);
$matchedDistributionsArray = $subscription->searchMatchedIncomingDistributions();
if (count($matchedDistributionsArray)) {
return $this->redirect(['subscription/update-distributions', 'idSubscription' => $subscription->id]);
}
else {
} else {
return $this->redirect(['subscription/index']);
}
}
@@ -142,18 +140,18 @@ class SubscriptionController extends BackendController

/**
* Modifie un abonnement.
*
*
* @param integer $id
* @return string
* @throws NotFoundHttpException
*/
public function actionUpdate($id)
public function actionUpdate($id)
{
// form
$model = new SubscriptionForm;
$model->isAdmin = true ;
$subscription = Subscription::findOne($id);
$model->isAdmin = true;
$subscription = Subscription::findOne($id);
if ($subscription) {
$model->id = $id;
$model->id_producer = $subscription->id_producer;
@@ -175,15 +173,15 @@ class SubscriptionController extends BackendController
$model->date_end = date('d/m/Y', strtotime($subscription->date_end));
}

if(strlen($subscription->comment)) {
$model->comment = $subscription->comment ;
if (strlen($subscription->comment)) {
$model->comment = $subscription->comment;
}

// produits
$arrayProductsSubscription = ProductSubscription::searchAll([
$arrayProductsSubscription = ProductSubscription::searchAll([
'id_subscription' => $model->id
]) ;
]);
foreach ($arrayProductsSubscription as $productSubscription) {
$model->products['product_' . $productSubscription->id_product] = $productSubscription->quantity;
}
@@ -192,9 +190,9 @@ class SubscriptionController extends BackendController
}

// produits
$productsArray = Product::searchAll([], [
$productsArray = Product::searchAll([], [
'orderby' => 'product.order ASC'
]) ;
]);

if ($model->load(Yii::$app->request->post()) && $model->validate()) {

@@ -204,24 +202,23 @@ class SubscriptionController extends BackendController

if ($model->save()) {

$subscription = Subscription::findOne($model->id) ;
$subscription = Subscription::findOne($model->id);

$messageOrdersDeleted = '';
if($model->date_end) {
if ($model->date_end) {
$countOrdersDeleted = $subscription->deleteOrdersIncomingDistributions(true);

if($countOrdersDeleted) {
$messageOrdersDeleted = '<br />'.$countOrdersDeleted.' commandes supprimées';
if ($countOrdersDeleted) {
$messageOrdersDeleted = '<br />' . $countOrdersDeleted . ' commandes supprimées';
}
}

Yii::$app->getSession()->setFlash('success', 'Abonnement modifié'.$messageOrdersDeleted);
Yii::$app->getSession()->setFlash('success', 'Abonnement modifié' . $messageOrdersDeleted);

$matchedDistributionsArray = $subscription->searchMatchedIncomingDistributions() ;
if(count($matchedDistributionsArray)) {
return $this->redirect(['subscription/update-distributions', 'idSubscription' => $subscription->id,'update' => true]);
}
else {
$matchedDistributionsArray = $subscription->searchMatchedIncomingDistributions();
if (count($matchedDistributionsArray)) {
return $this->redirect(['subscription/update-distributions', 'idSubscription' => $subscription->id, 'update' => true]);
} else {
return $this->redirect(['subscription/index']);
}
}
@@ -235,60 +232,60 @@ class SubscriptionController extends BackendController

/**
* Supprime une commande récurrente.
*
*
* @param integer $id
*/
public function actionDelete($id)
public function actionDelete($id)
{
$subscription = Subscription::searchOne([
$subscription = Subscription::searchOne([
'subscription.id' => $id
]) ;
$subscription->deleteOrdersIncomingDistributions() ;
]);
$subscription->deleteOrdersIncomingDistributions();
$subscription->delete();
ProductSubscription::deleteAll(['id_subscription' => $id]);
ProductSubscription::deleteAll(['id_subscription' => $id]);
Yii::$app->getSession()->setFlash('success', 'Abonnement supprimé');
return $this->redirect(['subscription/index']);
}

public function actionUpdateDistributions($idSubscription, $generate = false, $update = false)
public function actionUpdateDistributions($idSubscription, $generate = false, $update = false)
{
$subscription = Subscription::findOne($idSubscription) ;
$matchedDistributionsArray = $subscription->searchMatchedIncomingDistributions() ;
if($generate) {
if($update) {
$subscription->deleteOrdersIncomingDistributions() ;
$subscription = Subscription::findOne($idSubscription);
$matchedDistributionsArray = $subscription->searchMatchedIncomingDistributions();
if ($generate) {
if ($update) {
$subscription->deleteOrdersIncomingDistributions();
}
foreach($matchedDistributionsArray as $distribution) {
$subscription->add($distribution->date) ;
foreach ($matchedDistributionsArray as $distribution) {
$subscription->add($distribution->date);
}
Yii::$app->getSession()->setFlash('success', 'Commandes '.($update ? 're-' : '').'générées dans les distributions futures.');
return $this->redirect(['subscription/index']) ;
Yii::$app->getSession()->setFlash('success', 'Commandes ' . ($update ? 're-' : '') . 'générées dans les distributions futures.');
return $this->redirect(['subscription/index']);
}
return $this->render('update_distributions',[
return $this->render('update_distributions', [
'matchedDistributionsArray' => $matchedDistributionsArray,
'idSubscription' => $idSubscription,
'update' => $update
]) ;
]);
}
public function actionAjaxInfos($idSubscription = 0)
public function actionAjaxInfos($idSubscription = 0)
{
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
$productsQuery = Product::find()
->where(['id_producer' => GlobalParam::getCurrentProducerId(),]) ;
if($idSubscription) {
$productsQuery->joinWith(['productSubscription' => function($query) use($idSubscription) {
$query->andOnCondition('product_subscription.id_subscription = '.((int) $idSubscription)) ;
}]) ;
$productsQuery = Product::find()
->where(['id_producer' => GlobalParam::getCurrentProducerId(),]);
if ($idSubscription) {
$productsQuery->joinWith(['productSubscription' => function ($query) use ($idSubscription) {
$query->andOnCondition('product_subscription.id_subscription = ' . ((int)$idSubscription));
}]);
}
$productsArray = $productsQuery->asArray()->orderBy('order ASC')->all() ;
$productsArray = $productsQuery->asArray()->orderBy('order ASC')->all();
/*Debug::dump($productsArray);*/
foreach($productsArray as &$theProduct) {
foreach ($productsArray as &$theProduct) {
/*$theProduct['unit_save'] = $theProduct['unit'] ;
$theProduct['units'] = [] ;
$theProduct['units'][] = [
@@ -298,9 +295,9 @@ class SubscriptionController extends BackendController
'price' => $theProduct['price']
] ;*/

$theProduct['wording_unit'] = Product::strUnit($theProduct['unit'], 'wording_short');
$theProduct['wording_unit'] = Product::strUnit($theProduct['unit'], 'wording_short');

if(isset($theProduct['productSubscription'][0])) {
if (isset($theProduct['productSubscription'][0])) {
/*if($theProduct['productSubscription'][0]['unit'] != $theProduct['unit']) {
$theProduct['units'][] = [
'unit' => $theProduct['productSubscription'][0]['unit'],
@@ -312,17 +309,16 @@ class SubscriptionController extends BackendController
$theProduct['step'] = $theProduct['productSubscription'][0]['step'] ;
$theProduct['price'] = $theProduct['productSubscription'][0]['price'] ;
}*/
$theProduct['quantity'] = $theProduct['productSubscription'][0]['quantity'] * Product::$unitsArray[$theProduct['unit']]['coefficient'] ;
}
else {
$theProduct['quantity'] = '' ;
$theProduct['quantity'] = $theProduct['productSubscription'][0]['quantity'] * Product::$unitsArray[$theProduct['unit']]['coefficient'];
} else {
$theProduct['quantity'] = '';
}
}
return [
'products' => $productsArray
] ;
];
}
}

+ 18
- 18
backend/controllers/UserController.php 查看文件

@@ -153,7 +153,7 @@ class UserController extends BackendController
}

// product price percent
$userProducer = UserProducer::searchOne([
$userProducer = UserProducer::searchOne([
'id_producer' => GlobalParam::getCurrentProducerId(),
'id_user' => $model->id
]);
@@ -174,7 +174,7 @@ class UserController extends BackendController
->all();

// groupes d'utilisateurs
$userGroupsArray = UserGroup::find()
$userGroupsArray = UserGroup::find()
->where([
'id_producer' => GlobalParam::getCurrentProducerId(),
])
@@ -199,7 +199,7 @@ class UserController extends BackendController
$posts = Yii::$app->request->post();

if ($posts && isset($posts['User']['email']) && strlen($posts['User']['email']) > 0) {
$userExist = User::searchOne([
$userExist = User::searchOne([
'email' => $posts['User']['email']
]);
}
@@ -259,8 +259,8 @@ class UserController extends BackendController

// Moodification du profil
$previousMail = $model->email;
$user = User::find()->with('userProducer')->where(['id' => $model['id']])->one();
$userBelongToProducer = UserProducer::findOne(['id_user' => $id, 'id_producer' => GlobalParam::getCurrentProducerId()]);
$user = User::find()->with('userProducer')->where(['id' => $model['id']])->one();
$userBelongToProducer = UserProducer::findOne(['id_user' => $id, 'id_producer' => GlobalParam::getCurrentProducerId()]);
if ($userBelongToProducer) {
if ($model->load(Yii::$app->request->post()) && $model->save()) {

@@ -315,7 +315,7 @@ class UserController extends BackendController
/**
* Lie un utilisateur aux points de vente sélectionnés.
*
* @param User $modelUser
* @param User $modelUser
*/
public function processLinkPointSale($modelUser)
{
@@ -343,7 +343,7 @@ class UserController extends BackendController
/**
* Lie un utilisateur aux groupes d'utilisateurs sélectionnés.
*
* @param User $modelUser
* @param User $modelUser
*/
public function processLinkUserGroup($modelUser)
{
@@ -372,7 +372,7 @@ class UserController extends BackendController

public function processProductPricePercent($model)
{
$userProducer = UserProducer::searchOne([
$userProducer = UserProducer::searchOne([
'id_producer' => GlobalParam::getCurrentProducerId(),
'id_user' => $model->id
]);
@@ -388,7 +388,7 @@ class UserController extends BackendController
*/
public function actionDelete($id)
{
$userProducer = UserProducer::findOne([
$userProducer = UserProducer::findOne([
'id_user' => $id,
'id_producer' => GlobalParam::getCurrentProducerId()
]);
@@ -425,7 +425,7 @@ class UserController extends BackendController
$usersPointSaleLink = 1;
}

$users = User::findBy([
$users = User::findBy([
'id_producer' => GlobalParam::getCurrentProducerId(),
'id_point_sale' => $idPointSale,
'users_point_sale_link' => $usersPointSaleLink,
@@ -456,7 +456,7 @@ class UserController extends BackendController
$bodyResponseSendMail = $responseSendMail->getBody();
$emailsErrorArray = [];

if(isset($bodyResponseSendMail['Messages'])) {
if (isset($bodyResponseSendMail['Messages'])) {
foreach ($bodyResponseSendMail['Messages'] as $message) {
if ($message['Status'] != 'success') {
$emailsErrorArray[] = $message['To']['Email'];
@@ -504,10 +504,10 @@ class UserController extends BackendController
*/
public function actionCredit($id)
{
$user = User::find()->with('userProducer')->where(['id' => $id])->one();
$userProducer = UserProducer::findOne(['id_user' => $id, 'id_producer' => GlobalParam::getCurrentProducerId()]);
$user = User::find()->with('userProducer')->where(['id' => $id])->one();
$userProducer = UserProducer::findOne(['id_user' => $id, 'id_producer' => GlobalParam::getCurrentProducerId()]);

if (($userProducer) || User::getCurrentStatus() == User::STATUS_ADMIN) {
if (($userProducer) || User::getCurrentStatus() == User::STATUS_ADMIN) {

$creditForm = new CreditForm();
if ($creditForm->load(Yii::$app->request->post()) && $creditForm->validate()) {
@@ -517,7 +517,7 @@ class UserController extends BackendController
$creditForm = new CreditForm;
}

$history = CreditHistory::find()
$history = CreditHistory::find()
->with(['order', 'userAction'])
->where([
'id_user' => $user->id,
@@ -545,7 +545,7 @@ class UserController extends BackendController
*/
public function actionOrders($id)
{
$user = User::findOne($id);
$user = User::findOne($id);
$searchModel = new OrderSearch();
$dataProvider = $searchModel->search(array_merge(Yii::$app->request->queryParams, ['id_user' => $id]));

@@ -565,7 +565,7 @@ class UserController extends BackendController
*/
public function actionStateCredit($idUser, $state)
{
$userProducer = UserProducer::searchOne([
$userProducer = UserProducer::searchOne([
'id_user' => $idUser
]);

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

+ 109
- 111
backend/controllers/UserGroupController.php 查看文件

@@ -51,119 +51,117 @@ use yii\helpers\Html;
class UserGroupController extends BackendController
{

public function behaviors()
{
return [
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
],
],
'access' => [
'class' => AccessControl::className(),
'rules' => [
[
'allow' => true,
'roles' => ['@'],
'matchCallback' => function ($rule, $action) {
return $this->getUserManager()->hasAccessBackend();
}
],
],
],
];
public function behaviors()
{
return [
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
],
],
'access' => [
'class' => AccessControl::className(),
'rules' => [
[
'allow' => true,
'roles' => ['@'],
'matchCallback' => function ($rule, $action) {
return $this->getUserManager()->hasAccessBackend();
}
],
],
],
];
}

/**
* Liste les points de vente.
*
* @return mixed
*/
public function actionIndex()
{
$searchModel = new UserGroupSearch();
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);

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

/**
* Crée un groupe d'utilisateur.
*
* @return mixed
*/
public function actionCreate()
{
$model = new UserGroup();

$model->id_producer = GlobalParam::getCurrentProducerId();

if ($model->load(Yii::$app->request->post()) && $model->save()) {
Yii::$app->getSession()->setFlash('success', "Groupe d'utilisateur ajouté.");
return $this->redirect(['index']);
} else {
return $this->render('create', [
'model' => $model,
]);
}

/**
* Liste les points de vente.
*
* @return mixed
*/
public function actionIndex()
{
$searchModel = new UserGroupSearch();
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);

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

/**
* Crée un groupe d'utilisateur.
*
* @return mixed
*/
public function actionCreate()
{
$model = new UserGroup();

$model->id_producer = GlobalParam::getCurrentProducerId() ;

if ($model->load(Yii::$app->request->post()) && $model->save()) {
Yii::$app->getSession()->setFlash('success', "Groupe d'utilisateur ajouté.");
return $this->redirect(['index']);
}
else {
return $this->render('create', [
'model' => $model,
]);
}
}

/**
* Modifie un groupe d'utilisateur.
*
* @param integer $id
* @return mixed
*/
public function actionUpdate($id)
{
$model = $this->findModel($id);

if ($model->load(Yii::$app->request->post()) && $model->save()) {
Yii::$app->getSession()->setFlash('success', "Groupe d'utilisateur modifié.");
return $this->redirect(['index']);
}
else {
return $this->render('update', [
'model' => $model,
]);
}
}

/**
* Supprime un groupe d'utilisateur.
*
* @param integer $id
* @return mixed
*/
public function actionDelete($id)
{
$userGroup = $this->findModel($id);

$userGroup->delete();
UserUserGroup::deleteAll(['id_user_group' => $id]);
Yii::$app->getSession()->setFlash('success', 'Groupe d\'utilisateur <strong>' . Html::encode($userGroup->name) . '</strong> supprimé.');

return $this->redirect(['index']);
}

/**
* Modifie un groupe d'utilisateur.
*
* @param integer $id
* @return mixed
*/
public function actionUpdate($id)
{
$model = $this->findModel($id);

if ($model->load(Yii::$app->request->post()) && $model->save()) {
Yii::$app->getSession()->setFlash('success', "Groupe d'utilisateur modifié.");
return $this->redirect(['index']);
} else {
return $this->render('update', [
'model' => $model,
]);
}

/**
* Recherche un groupe d'utilisateur en fonction de son ID.
*
* @param integer $id
* @return UserGroup
* @throws NotFoundHttpException si le modèle n'est pas trouvé
*/
protected function findModel($id)
{
if (($model = UserGroup::findOne($id)) !== null) {
return $model;
} else {
throw new NotFoundHttpException('The requested page does not exist.');
}
}

/**
* Supprime un groupe d'utilisateur.
*
* @param integer $id
* @return mixed
*/
public function actionDelete($id)
{
$userGroup = $this->findModel($id);

$userGroup->delete();
UserUserGroup::deleteAll(['id_user_group' => $id]);
Yii::$app->getSession()->setFlash('success', 'Groupe d\'utilisateur <strong>' . Html::encode($userGroup->name) . '</strong> supprimé.');

return $this->redirect(['index']);
}

/**
* Recherche un groupe d'utilisateur en fonction de son ID.
*
* @param integer $id
* @return UserGroup
* @throws NotFoundHttpException si le modèle n'est pas trouvé
*/
protected function findModel($id)
{
if (($model = UserGroup::findOne($id)) !== null) {
return $model;
} else {
throw new NotFoundHttpException('The requested page does not exist.');
}
}

}

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

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

use yii\widgets\Breadcrumbs;
use dmstr\widgets\Alert;
use common\helpers\GlobalParam;

$producerManager = $this->getProducerManager();

?>
<div class="content-wrapper">
@@ -77,7 +80,7 @@ use dmstr\widgets\Alert;
<section class="content">

<?php $producer = GlobalParam::getCurrentProducer(); ?>
<?php if(!$producer->isUpToDateWithOpendistribVersion() && $producer->option_display_message_new_opendistrib_version): ?>
<?php if(!$producerManager->isUpToDateWithOpendistribVersion($producer) && $producer->option_display_message_new_opendistrib_version): ?>
<div class="alert alert-warning">
<p>Opendistrib a été mis à jour vers la version <?= GlobalParam::getOpendistribVersion() ?> ! <a class="alert-link" href="<?= Yii::$app->urlManager->createUrl(['development/index']) ?>">Découvrir les nouveautés</a></p>
<a href="<?= Yii::$app->urlManager->createUrl(['producer/update-opendistrib-version']) ?>" class="close"><span aria-hidden="true">&times;</span></a>

+ 14
- 13
backend/views/layouts/header.php 查看文件

@@ -39,9 +39,12 @@
use yii\helpers\Html;
use common\helpers\GlobalParam;

/* @var $this \yii\web\View */
/* @var $content string */
use common\logic\Distribution\Distribution\Distribution;
use common\logic\Producer\Producer\Producer;
use common\logic\User\User\User;

$userManager = $this->getUserManager();
$producerManager = $this->getProducerManager();
$producer = GlobalParam::getCurrentProducer();

?>
@@ -59,7 +62,7 @@ $producer = GlobalParam::getCurrentProducer();
<div class="navbar-custom-menu">
<?php

$usersArray = User::findBy(['id_producer' => GlobalParam::getCurrentProducerId()])
$usersArray = $userManager->queryUsersBy(['id_producer' => GlobalParam::getCurrentProducerId()])
->andWhere('CAST(FROM_UNIXTIME(user.created_at) AS date) > \'' . date("Y-m-d", strtotime("-7 days")) . '\'')
->orderBy('created_at DESC')
->all();
@@ -70,7 +73,7 @@ $producer = GlobalParam::getCurrentProducer();

<?php

$pastDistributionsArray = DistributionModel::find()
$pastDistributionsArray = Distribution::find()
->where(['<', 'distribution.date', date('Y-m-d')])
->andWhere([
'distribution.id_producer' => GlobalParam::getCurrentProducerId(),
@@ -82,7 +85,7 @@ $producer = GlobalParam::getCurrentProducer();

$pastDistributionsArray = array_reverse($pastDistributionsArray);

$incomingDistributionsArray = DistributionModel::find()
$incomingDistributionsArray = Distribution::find()
->where(['>=', 'distribution.date', date('Y-m-d')])
->andWhere([
'distribution.id_producer' => GlobalParam::getCurrentProducerId(),
@@ -171,7 +174,7 @@ $producer = GlobalParam::getCurrentProducer();

<?php

$usersNegativeCreditArray = User::findBy(['id_producer' => GlobalParam::getCurrentProducerId()])
$usersNegativeCreditArray = $userManager->queryUsersBy(['id_producer' => GlobalParam::getCurrentProducerId()])
->andWhere('user_producer.credit < 0')
->orderBy('lastname, name ASC')
->all();
@@ -194,7 +197,7 @@ $producer = GlobalParam::getCurrentProducer();
<?php foreach ($usersNegativeCreditArray as $user): ?>
<li>
<a href="<?= Yii::$app->urlManagerBackend->createUrl(['user/credit', 'id' => $user['user_id']]); ?>">
<h5><?= User::getUsernameFromArray($user); ?>
<h5><?= $userManager->getUsernameFromArray($user); ?>
<small>
<i class="fa fa-euro"></i> <?= Price::format($user['credit']); ?>
</small>
@@ -211,7 +214,7 @@ $producer = GlobalParam::getCurrentProducer();

</li>

<?php if ( User::isCurrentProducer() || User::isCurrentAdmin()): ?>
<?php if ( $userManager->isCurrentProducer() || $userManager->isCurrentAdmin()): ?>
<li class="dropdown producer-menu">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">

@@ -220,12 +223,12 @@ $producer = GlobalParam::getCurrentProducer();
<?php else: ?>
<span class="label label-danger">Hors-ligne</span>
<?php endif; ?>
<span><?= Html::encode(Yii::$app->user->identity->getNameProducer()); ?></span>
<span><?= Html::encode($producerManager->getNameProducer(Yii::$app->user->identity)); ?></span>
<i class="fa fa-caret-down"></i>
</a>

<ul class="dropdown-menu">
<?php if ( User::isCurrentAdmin()): ?>
<?php if ( $userManager->isCurrentAdmin()): ?>
<li>
<a href="<?= Yii::$app->urlManagerProducer->createAbsoluteUrl(['site/index', 'slug_producer' => GlobalParam::getCurrentProducer()->slug]); ?>">
<i class="fa fa-th-large"></i>
@@ -254,7 +257,7 @@ $producer = GlobalParam::getCurrentProducer();
<li class="dropdown user user-menu">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">
<i class="fa fa-user"></i>
<span class="hidden-xs"><?= Html::encode( User::getCurrent()->name . ' ' . User::getCurrent()->lastname); ?></span>
<span class="hidden-xs"><?= Html::encode( GlobalParam::getCurrentUser()->name . ' ' . GlobalParam::getCurrentUser()->lastname); ?></span>
<i class="fa fa-caret-down"></i>
</a>
<ul class="dropdown-menu">
@@ -264,11 +267,9 @@ $producer = GlobalParam::getCurrentProducer();
class="fa fa-sign-out"></i> Déconnexion</a></li>
</ul>
</li>

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

</ul>
</div>
</nav>

+ 35
- 30
backend/views/layouts/left.php 查看文件

@@ -36,6 +36,11 @@
* termes.
*/

use common\helpers\GlobalParam;

$producerManager = $this->getProducerManager();
$userManager = $this->getUserManager();

?>

<aside class="main-sidebar">
@@ -45,7 +50,7 @@
<?php
$producer = GlobalParam::getCurrentProducer();
$newVersionOpendistribTemplate = '';
if(!$producer->isUpToDateWithOpendistribVersion()) {
if(!$producerManager->isUpToDateWithOpendistribVersion($producer)) {
$newVersionOpendistribTemplate = '<span class="pull-right-container"><small class="label pull-right bg-orange">&nbsp;</small></span>';
}
?>
@@ -54,39 +59,39 @@
[
'options' => ['class' => 'sidebar-menu tree', 'data-widget' => 'tree'],
'items' => [
['label' => 'Tableau de bord', 'icon' => 'dashboard', 'url' => ['/site/index'], 'visible' => User::isCurrentProducer()],
['label' => 'Distributions', 'icon' => 'calendar', 'url' => ['/distribution/index'], 'visible' => User::isCurrentProducer()],
['label' => 'Tableau de bord', 'icon' => 'dashboard', 'url' => ['/site/index'], 'visible' => $userManager->isCurrentProducer()],
['label' => 'Distributions', 'icon' => 'calendar', 'url' => ['/distribution/index'], 'visible' => $userManager->isCurrentProducer()],
[
'label' => 'Produits',
'icon' => 'clone',
'url' => ['/product/index'],
'visible' => User::isCurrentProducer(),
'visible' => $userManager->isCurrentProducer(),
'active' => Yii::$app->controller->id == 'product',
'items' => [
['label' => 'Liste', 'icon' => 'th-list', 'url' => ['/product/index'], 'visible' => User::isCurrentProducer()],
['label' => 'Catégories', 'icon' => 'book', 'url' => ['/product-category/index'], 'visible' => User::isCurrentProducer()],
['label' => 'Liste', 'icon' => 'th-list', 'url' => ['/product/index'], 'visible' => $userManager->isCurrentProducer()],
['label' => 'Catégories', 'icon' => 'book', 'url' => ['/product-category/index'], 'visible' => $userManager->isCurrentProducer()],
]
],
['label' => 'Points de vente', 'icon' => 'map-marker', 'url' => ['/point-sale/index'], 'visible' => User::isCurrentProducer(), 'active' => Yii::$app->controller->id == 'point-sale'],
['label' => 'Points de vente', 'icon' => 'map-marker', 'url' => ['/point-sale/index'], 'visible' => $userManager->isCurrentProducer(), 'active' => Yii::$app->controller->id == 'point-sale'],
[
'label' => 'Utilisateurs',
'icon' => 'users',
'url' => ['/user/index'],
'items' => [
['label' => 'Liste', 'icon' => 'th-list', 'url' => ['/user/index'], 'visible' => User::isCurrentProducer()],
['label' => 'Groupes', 'icon' => 'users', 'url' => ['/user-group/index'], 'visible' => User::isCurrentProducer()],
['label' => 'Liste', 'icon' => 'th-list', 'url' => ['/user/index'], 'visible' => $userManager->isCurrentProducer()],
['label' => 'Groupes', 'icon' => 'users', 'url' => ['/user-group/index'], 'visible' => $userManager->isCurrentProducer()],
],
],
['label' => 'Abonnements', 'icon' => 'repeat', 'url' => ['/subscription/index'], 'visible' => User::isCurrentProducer(), 'active' => Yii::$app->controller->id == 'subscription'],
['label' => 'Communiquer', 'icon' => 'bullhorn', 'url' => ['/communicate/index'], 'visible' => User::isCurrentProducer()],
['label' => 'Abonnements', 'icon' => 'repeat', 'url' => ['/subscription/index'], 'visible' => $userManager->isCurrentProducer(), 'active' => Yii::$app->controller->id == 'subscription'],
['label' => 'Communiquer', 'icon' => 'bullhorn', 'url' => ['/communicate/index'], 'visible' => $userManager->isCurrentProducer()],
[
'label' => 'Documents',
'icon' => 'clone',
'url' => ['/delivery-note/index'],
'items' => [
['label' => 'Bons de livraison', 'icon' => 'sticky-note-o', 'url' => ['/delivery-note/index'], 'visible' => User::isCurrentProducer()],
['label' => 'Factures', 'icon' => 'sticky-note-o', 'url' => ['/invoice/index'], 'visible' => User::isCurrentProducer()],
['label' => 'Devis', 'icon' => 'sticky-note-o', 'url' => ['/quotation/index'], 'visible' => User::isCurrentProducer()],
['label' => 'Bons de livraison', 'icon' => 'sticky-note-o', 'url' => ['/delivery-note/index'], 'visible' => $userManager->isCurrentProducer()],
['label' => 'Factures', 'icon' => 'sticky-note-o', 'url' => ['/invoice/index'], 'visible' => $userManager->isCurrentProducer()],
['label' => 'Devis', 'icon' => 'sticky-note-o', 'url' => ['/quotation/index'], 'visible' => $userManager->isCurrentProducer()],
],
],
[
@@ -94,33 +99,33 @@
'icon' => 'line-chart',
'url' => ['/stats/index'],
'items' => [
['label' => 'Chiffre d\'affaire', 'icon' => 'line-chart', 'url' => ['/stats/index'], 'visible' => User::isCurrentProducer()],
['label' => 'Rapports', 'icon' => 'pencil-square-o', 'url' => ['/report/index'], 'visible' => User::isCurrentProducer()],
['label' => 'Produits', 'icon' => 'table', 'url' => ['/stats/products'], 'visible' => User::isCurrentProducer()],
['label' => 'Chiffre d\'affaire', 'icon' => 'line-chart', 'url' => ['/stats/index'], 'visible' => $userManager->isCurrentProducer()],
['label' => 'Rapports', 'icon' => 'pencil-square-o', 'url' => ['/report/index'], 'visible' => $userManager->isCurrentProducer()],
['label' => 'Produits', 'icon' => 'table', 'url' => ['/stats/products'], 'visible' => $userManager->isCurrentProducer()],
],
],
['label' => 'Paramètres', 'icon' => 'cog', 'url' => ['/producer/update'], 'visible' => User::isCurrentProducer()],
['label' => 'Accès', 'icon' => 'lock', 'url' => ['/access/index'], 'visible' => User::isCurrentProducer()],
['label' => 'Paramètres', 'icon' => 'cog', 'url' => ['/producer/update'], 'visible' => $userManager->isCurrentProducer()],
['label' => 'Accès', 'icon' => 'lock', 'url' => ['/access/index'], 'visible' => $userManager->isCurrentProducer()],
[
'label' => 'Développement',
'icon' => 'code',
'url' => ['/development/index'],
'visible' => User::isCurrentProducer(),
'visible' => $userManager->isCurrentProducer(),
'active' => Yii::$app->controller->id == 'development',
'template'=>'<a href="{url}">{icon} {label}'.$newVersionOpendistribTemplate.'</a>'
],
['label' => 'Tarifs', 'icon' => 'euro', 'url' => ['/producer/billing'], 'visible' => User::isCurrentProducer()],
['label' => 'Tarifs', 'icon' => 'euro', 'url' => ['/producer/billing'], 'visible' => $userManager->isCurrentProducer()],

['label' => 'Administration', 'options' => ['class' => 'header'], 'visible' => User::isCurrentAdmin()],
['label' => 'Producteurs', 'icon' => 'th-list', 'url' => ['/producer-admin/index'], 'visible' => User::isCurrentAdmin()],
['label' => 'Tranches de prix', 'icon' => 'eur', 'url' => ['/producer-price-range-admin/index'], 'visible' => User::isCurrentAdmin()],
['label' => 'Taxes', 'icon' => 'eur', 'url' => ['/tax-rate-admin/index'], 'visible' => User::isCurrentAdmin()],
['label' => 'Communiquer', 'icon' => 'bullhorn', 'url' => ['/communicate-admin/index'], 'visible' => User::isCurrentAdmin()],
['label' => 'Administration', 'options' => ['class' => 'header'], 'visible' => $userManager->isCurrentAdmin()],
['label' => 'Producteurs', 'icon' => 'th-list', 'url' => ['/producer-admin/index'], 'visible' => $userManager->isCurrentAdmin()],
['label' => 'Tranches de prix', 'icon' => 'eur', 'url' => ['/producer-price-range-admin/index'], 'visible' => $userManager->isCurrentAdmin()],
['label' => 'Taxes', 'icon' => 'eur', 'url' => ['/tax-rate-admin/index'], 'visible' => $userManager->isCurrentAdmin()],
['label' => 'Communiquer', 'icon' => 'bullhorn', 'url' => ['/communicate-admin/index'], 'visible' => $userManager->isCurrentAdmin()],

['label' => 'Outils', 'options' => ['class' => 'header'], 'visible' => User::isCurrentAdmin()],
['label' => 'Gii', 'icon' => 'file-code-o', 'url' => ['/gii'], 'visible' => User::isCurrentAdmin()],
['label' => 'Debug', 'icon' => 'dashboard', 'url' => ['/debug'], 'visible' => User::isCurrentAdmin()],
['label' => 'Login', 'url' => ['site/login'], 'visible' => ! User::isCurrentConnected()],
['label' => 'Outils', 'options' => ['class' => 'header'], 'visible' => $userManager->isCurrentAdmin()],
['label' => 'Gii', 'icon' => 'file-code-o', 'url' => ['/gii'], 'visible' => $userManager->isCurrentAdmin()],
['label' => 'Debug', 'icon' => 'dashboard', 'url' => ['/debug'], 'visible' => $userManager->isCurrentAdmin()],
['label' => 'Login', 'url' => ['site/login'], 'visible' => ! $userManager->isCurrentConnected()],
],
]
) ?>

+ 1
- 1
common/logic/Producer/Producer/ProducerRepository.php 查看文件

@@ -247,7 +247,7 @@ class ProducerRepository extends BaseService implements RepositoryInterface
public function getNameProducer(User $user): string
{
$producer = $this->findOneProducerById($user->id_producer);
return $producer->getName();
return $producer->name;
}

public function isDocumentDisplayOrders(DocumentInterface $document): bool

正在加载...
取消
保存