Browse Source

Refactoring services #885

refactoring
Guillaume 1 year ago
parent
commit
6b8e6e95fe
26 changed files with 1634 additions and 1639 deletions
  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 View File

<?php <?php


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


namespace backend\controllers; namespace backend\controllers;



+ 63
- 66
backend/controllers/CommunicateAdminController.php View File

<?php <?php


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


namespace backend\controllers; 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. * UserController implements the CRUD actions for User model.
*/ */
class CommunicateAdminController extends BackendController
class CommunicateAdminController extends BackendController
{ {


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


/** /**
*
*
*
*
* @return mixed * @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 = []; $usersArray = [];
$users = [] ;
$users = [];
foreach ($producers as $producer) { foreach ($producers as $producer) {
if (isset($producer->contact) && is_array($producer->contact)) { 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[] = [ $users[] = [
'email' => $contact->email, 'email' => $contact->email,
'name' => $contact->name, 'name' => $contact->name,
'lastname' => $contact->lastname, 'lastname' => $contact->lastname,
] ;
];
} }
} }
} }
}
elseif($section == 'users') {
$users = User::find()
} elseif ($section == 'users') {
$users = User::find()
->where([ ->where([
'user.status' => User::STATUS_ACTIVE
'user.status' => User::STATUS_ACTIVE
]) ])
->all() ;
->all();
$usersArray = []; $usersArray = [];
foreach ($users as $user) { foreach ($users as $user) {
if (isset($user['email']) && strlen($user['email'])) { if (isset($user['email']) && strlen($user['email'])) {
$usersArray[] = $user['email']; $usersArray[] = $user['email'];
} }
} }
}
else {
} else {
throw new NotFoundHttpException('Requête incorrecte.'); throw new NotFoundHttpException('Requête incorrecte.');
} }
$mailForm = new MailForm() ;
$mailForm = new MailForm();
if ($mailForm->load(Yii::$app->request->post()) && $mailForm->validate()) { 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é.'); 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.'); 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', [ return $this->render('index', [
'section' => $section, 'section' => $section,
'usersArray' => $usersArray, 'usersArray' => $usersArray,

+ 56
- 55
backend/controllers/CommunicateController.php View File

<?php <?php


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


namespace backend\controllers; namespace backend\controllers;


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


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


// get your HTML raw content without any layouts or scripts // get your HTML raw content without any layouts or scripts
$content = $this->renderPartial('instructions_multi', [ $content = $this->renderPartial('instructions_multi', [
// enhanced bootstrap css built by Krajee for mPDF formatting // enhanced bootstrap css built by Krajee for mPDF formatting
//'cssFile' => '@vendor/kartik-v/yii2-mpdf/assets/kv-mpdf-bootstrap.min.css', //'cssFile' => '@vendor/kartik-v/yii2-mpdf/assets/kv-mpdf-bootstrap.min.css',
'cssFile' => '@app/web/css/screen.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 // return the pdf output as per the destination setting

+ 58
- 58
backend/controllers/CronController.php View File

public function behaviors() public function behaviors()
{ {
return [ 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' => ['@']
],
], ],
],
]; ];
} }


} }


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


$mailOrdersSend = false; $mailOrdersSend = false;


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


if ($distribution) { if ($distribution) {
if ($hour == $producer->order_deadline || strlen($forceDate)) { if ($hour == $producer->order_deadline || strlen($forceDate)) {
*/ */


$arrayOrders = Order::searchAll([ $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); $configCredit = Producer::getConfig('credit', $producer->id);


if ($order->auto_payment && $configCredit) { if ($order->auto_payment && $configCredit) {
if ($order->getAmount(Order::AMOUNT_REMAINING) > 0) { if ($order->getAmount(Order::AMOUNT_REMAINING) > 0) {
$order->saveCreditHistory( $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++; $countOrders++;
} }


if (!strlen($forceDate) && Producer::getConfig('option_notify_producer_order_summary', $producer->id)) { if (!strlen($forceDate) && Producer::getConfig('option_notify_producer_order_summary', $producer->id)) {
$arrayOrders = Order::searchAll([ $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( $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']); ->setFrom([Yii::$app->params['adminEmail'] => 'distrib']);




// génération du pdf de commande // génération du pdf de commande
Yii::$app->runAction('distribution/report-cron', [ 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( $mail->attach(
Yii::getAlias('@app/web/pdf/Commandes-' . $date . '-' . $producer->id . '.pdf')
Yii::getAlias('@app/web/pdf/Commandes-' . $date . '-' . $producer->id . '.pdf')
); );
} else { } else {
$subject = '[distrib] Aucune commande'; $subject = '[distrib] Aucune commande';
$mail->setSubject($subject); $mail->setSubject($subject);


// envoi des emails à tous les comptes users (statut producer) associés à ce producteur // 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) { foreach ($userArray as $user) {
$mail->setTo($user->email)->send(); $mail->setTo($user->email)->send();

+ 41
- 41
backend/controllers/DeliveryNoteController.php View File

<?php <?php


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


namespace backend\controllers; namespace backend\controllers;


use Yii; use Yii;




class DeliveryNoteController extends DocumentController
class DeliveryNoteController extends DocumentController
{ {
public function behaviors()
public function behaviors()
{ {
return [ return [
'verbs' => [ 'verbs' => [


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

+ 51
- 50
backend/controllers/DevelopmentController.php View File

<?php <?php


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


namespace backend\controllers; namespace backend\controllers;


/** /**
* DeveloppementController implements the CRUD actions for Developpement model. * DeveloppementController implements the CRUD actions for Developpement model.
*/ */
class DevelopmentController extends Controller
class DevelopmentController extends Controller
{ {
/** /**
* @inheritdoc * @inheritdoc
*/ */
public function behaviors() {
public function behaviors()
{
return [ return [
'access' => [ 'access' => [
'class' => AccessControl::className(), 'class' => AccessControl::className(),


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


* If creation is successful, the browser will be redirected to the 'view' page. * If creation is successful, the browser will be redirected to the 'view' page.
* @return mixed * @return mixed
*/ */
public function actionCreate()
public function actionCreate()
{ {
$model = new Development(); $model = new Development();


/** /**
* Updates an existing Developpement model. * Updates an existing Developpement model.
* If update is successful, the browser will be redirected to the 'view' page. * If update is successful, the browser will be redirected to the 'view' page.
*
*
* @param integer $id * @param integer $id
* @return mixed * @return mixed
*/ */
public function actionUpdate($id)
public function actionUpdate($id)
{ {
$model = $this->findModel($id); $model = $this->findModel($id);


* @param integer $id * @param integer $id
* @return mixed * @return mixed
*/ */
public function actionDelete($id)
public function actionDelete($id)
{ {
$this->findModel($id)->delete(); $this->findModel($id)->delete();
Yii::$app->getSession()->setFlash('success', 'Développement supprimé'); Yii::$app->getSession()->setFlash('success', 'Développement supprimé');


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


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


if ($develpmentPriority) { if ($develpmentPriority) {
$develpmentPriority->priority = $priority; $develpmentPriority->priority = $priority;
* @return Developpement the loaded model * @return Developpement the loaded model
* @throws NotFoundHttpException if the model cannot be found * @throws NotFoundHttpException if the model cannot be found
*/ */
protected function findModel($id)
protected function findModel($id)
{ {
if (($model = DevelopmentModel::findOne($id)) !== null) { if (($model = DevelopmentModel::findOne($id)) !== null) {
return $model; return $model;

+ 42
- 38
backend/controllers/DistributionController.php View File

namespace backend\controllers; namespace backend\controllers;


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


class DistributionController extends BackendController class DistributionController extends BackendController
{ {
{ {
return [ return [
'access' => [ 'access' => [
'class' => AccessControl::className(),
'class' => AccessControl::class,
'rules' => [ 'rules' => [
[ [
'actions' => ['report-cron', 'report-terredepains'], 'actions' => ['report-cron', 'report-terredepains'],
'allow' => true, 'allow' => true,
'roles' => ['@'], 'roles' => ['@'],
'matchCallback' => function ($rule, $action) { '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;
} }
] ]
], ],
{ {
$this->checkProductsPointsSale(); $this->checkProductsPointsSale();


$orderManager = $this->getOrderManager();

$format = 'Y-m-d'; $format = 'Y-m-d';
$theDate = ''; $theDate = '';
$dateObject = DateTime::createFromFormat($format, $date); $dateObject = DateTime::createFromFormat($format, $date);


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


return $this->render('index', [ return $this->render('index', [


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


$distributionsArray = DistributionModel::searchAll([
$distributionsArray = Distribution::searchAll([
'active' => 1 'active' => 1
], [ ], [
'conditions' => [ 'conditions' => [
$json['distribution'] = [ $json['distribution'] = [
'id' => $distribution->id, 'id' => $distribution->id,
'active' => $distribution->active, 'active' => $distribution->active,
'url_report' => Yii::$app->urlManagerBackend->createUrl(
'url_report' => $this->getUrlManagerBackend()->createUrl(
['distribution/report', 'date' => $distribution->date] ['distribution/report', 'date' => $distribution->date]
), ),
'url_report_grid' => Yii::$app->urlManagerBackend->createUrl(
'url_report_grid' => $this->getUrlManagerBackend()->createUrl(
['distribution/report-grid', 'date' => $distribution->date] ['distribution/report-grid', 'date' => $distribution->date]
), ),
]; ];
$json['distribution']['weight'] = number_format($weight, 2); $json['distribution']['weight'] = number_format($weight, 2);


// products // products
$productsQuery = Product::find()
$productsQuery = Product::find()
->orWhere(['id_producer' => GlobalParam::getCurrentProducerId(),]) ->orWhere(['id_producer' => GlobalParam::getCurrentProducerId(),])
->joinWith([ ->joinWith([
'taxRate', 'taxRate',
$productOrderArray = []; $productOrderArray = [];
foreach ($order->productOrder as $productOrder) { foreach ($order->productOrder as $productOrder) {
$productOrderArray[$productOrder->id_product] = [ $productOrderArray[$productOrder->id_product] = [
'quantity' => $productOrder->quantity * Product::$unitsArray[$productOrder->unit]['coefficient'],
'quantity' => $productOrder->quantity * Product::$unitsArray[$productOrder->unit]['coefficient'],
'unit' => $productOrder->unit, 'unit' => $productOrder->unit,
'price' => number_format($productOrder->price, 3), 'price' => number_format($productOrder->price, 3),
'invoice_price' => number_format($productOrder->invoice_price, 2), 'invoice_price' => number_format($productOrder->invoice_price, 2),
]; ];


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


$json['users'] = $usersArray; $json['users'] = $usersArray;


} }


// abonnements manquants // abonnements manquants
$arraySubscriptions = Subscription::searchByDate($date);
$arraySubscriptions = Subscription::searchByDate($date);
$json['missing_subscriptions'] = []; $json['missing_subscriptions'] = [];
if ($distribution->active) { if ($distribution->active) {
foreach ($arraySubscriptions as $subscription) { foreach ($arraySubscriptions as $subscription) {
{ {
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;


$user = User::findOne(['id' => $idUser]);
$user = User::findOne(['id' => $idUser]);
$favoritePointSale = $user->getFavoritePointSale(); $favoritePointSale = $user->getFavoritePointSale();
$idFavoritePointSale = 0; $idFavoritePointSale = 0;
if ($favoritePointSale) { if ($favoritePointSale) {


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


$productsArray = Product::find()
$productsArray = Product::find()
->where([ ->where([
'id_producer' => GlobalParam::getCurrentProducerId(), 'id_producer' => GlobalParam::getCurrentProducerId(),
])->joinWith([ ])->joinWith([
$quantity = 0; $quantity = 0;
$invoicePrice = null; $invoicePrice = null;


if(isset($order->productOrder)) {
if (isset($order->productOrder)) {
foreach ($order->productOrder as $productOrder) { foreach ($order->productOrder as $productOrder) {
if ($productOrder->id_product == $product['id']) { if ($productOrder->id_product == $product['id']) {
if ($productOrder->invoice_price) { if ($productOrder->invoice_price) {
$productOrderArray[$product['id']] = [ $productOrderArray[$product['id']] = [
'quantity' => $quantity, 'quantity' => $quantity,
'unit' => $product->unit, 'unit' => $product->unit,
'unit_coefficient' => Product::$unitsArray[$product->unit]['coefficient'],
'unit_coefficient' => Product::$unitsArray[$product->unit]['coefficient'],
'prices' => $priceArray, 'prices' => $priceArray,
'active' => $product->productDistribution[0]->active 'active' => $product->productDistribution[0]->active
&& (!$pointSale || $product->isAvailableOnPointSale($pointSale)), && (!$pointSale || $product->isAvailableOnPointSale($pointSale)),
if ($order && $order->distribution->id_producer == GlobalParam::getCurrentProducerId()) { if ($order && $order->distribution->id_producer == GlobalParam::getCurrentProducerId()) {
$userProducer = null; $userProducer = null;
if ($order->id_user) { if ($order->id_user) {
$userProducer = UserProducer::searchOne([
$userProducer = UserProducer::searchOne([
'id_user' => $order->id_user, 'id_user' => $order->id_user,
'id_producer' => GlobalParam::getCurrentProducerId() 'id_producer' => GlobalParam::getCurrentProducerId()
]); ]);


if ($invoicePrice != $productOrder->price) { if ($invoicePrice != $productOrder->price) {
$productOrder->invoice_price = $invoicePrice; $productOrder->invoice_price = $invoicePrice;
}
else {
} else {
$productOrder->invoice_price = null; $productOrder->invoice_price = null;
} }
$productOrder->save(); $productOrder->save();
} }


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


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


$productsNameArray[] = $productName; $productsNameArray[] = $productName;
$productsIndexArray[$product->id] = $cpt++; $productsIndexArray[$product->id] = $cpt++;
} }
$orderLine[$productsIndexArray[$productOrder->id_product]] .= $productOrder->quantity; $orderLine[$productsIndexArray[$productOrder->id_product]] .= $productOrder->quantity;
if ($productOrder->product->unit != $productOrder->unit) { if ($productOrder->product->unit != $productOrder->unit) {
$orderLine[$productsIndexArray[$productOrder->id_product]] .= Product::strUnit(
$orderLine[$productsIndexArray[$productOrder->id_product]] .= Product::strUnit(
$productOrder->unit, $productOrder->unit,
'wording_short', 'wording_short',
true true
} }


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


// produits // produits
$productsArray = Product::find()
$productsArray = Product::find()
->joinWith([ ->joinWith([
'productDistribution' => function ($q) use ($distribution) { 'productDistribution' => function ($q) use ($distribution) {
$q->where(['id_distribution' => $distribution->id]); $q->where(['id_distribution' => $distribution->id]);
} }


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


if ($product->unit != $unit) { if ($product->unit != $unit) {
$totalsPointSaleArray[$index] .= '' . Product::strUnit($unit, 'wording_short', true);
$totalsPointSaleArray[$index] .= '' . Product::strUnit($unit, 'wording_short', true);
} }
} }
} }


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


if ($unit == 'piece') { if ($unit == 'piece') {
public function actionAjaxProcessAddSubscriptions($date) public function actionAjaxProcessAddSubscriptions($date)
{ {
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
Subscription::addAll($date, true);
Subscription::addAll($date, true);
return ['success']; return ['success'];
} }


$order->save(); $order->save();


// init invoice prices // init invoice prices
$user = User::searchOne([
$user = User::searchOne([
'id' => $deliveryNote->id_user 'id' => $deliveryNote->id_user
]); ]);
$userProducer = UserProducer::searchOne([
$userProducer = UserProducer::searchOne([
'id_user' => $deliveryNote->id_user, 'id_user' => $deliveryNote->id_user,
'id_producer' => GlobalParam::getCurrentProducerId() 'id_producer' => GlobalParam::getCurrentProducerId()
]); ]);


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


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

+ 163
- 167
backend/controllers/DocumentController.php View File

public function behaviors() public function behaviors()
{ {
return [ 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();
}
]
], ],
],
]; ];
} }


Invoice::find()->where(['status' => Document::STATUS_VALID])->all() 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); $document->generatePdf(Pdf::DEST_FILE);
} }
} }
} }


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


if ($model->deliveryNotes && is_array($model->deliveryNotes) && count($model->deliveryNotes)) { if ($model->deliveryNotes && is_array($model->deliveryNotes) && count($model->deliveryNotes)) {
foreach ($model->deliveryNotes as $key => $idDeliveryNote) { foreach ($model->deliveryNotes as $key => $idDeliveryNote) {
Order::updateAll([ Order::updateAll([
'id_invoice' => $model->id
], [
'id_delivery_note' => $idDeliveryNote
]);
'id_invoice' => $model->id
], [
'id_delivery_note' => $idDeliveryNote
]);
} }
} }
} }
} }


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




if ($this->getClass() == 'DeliveryNote') { if ($this->getClass() == 'DeliveryNote') {
Order::updateAll([ 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') { if ($this->getClass() == 'Quotation') {
Order::updateAll([ Order::updateAll([
'order.id_quotation' => null
], [
'order.id_quotation' => $id
]);
'order.id_quotation' => null
], [
'order.id_quotation' => $id
]);
} }


if ($this->getClass() == 'Invoice') { if ($this->getClass() == 'Invoice') {
Order::updateAll([ 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)); Yii::$app->getSession()->setFlash('success', $this->getFlashMessage('delete', $model));
'Créateur', '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[] = [ $datas[] = [


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


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


CSV::downloadSendHeaders(strtolower($this->getDocumentType()).'_' . $status . $reference . '.csv');
CSV::downloadSendHeaders(strtolower($this->getDocumentType()) . '_' . $status . $reference . '.csv');
echo CSV::array2csv($datas); echo CSV::array2csv($datas);
die(); die();
} }
Yii::$app->getSession()->setFlash('danger', $this->getFlashMessage('send', $document)); Yii::$app->getSession()->setFlash('danger', $this->getFlashMessage('send', $document));
} }


if($backUpdateForm) {
if ($backUpdateForm) {
return $this->redirect([$this->getControllerUrl() . '/update', 'id' => $id]); return $this->redirect([$this->getControllerUrl() . '/update', 'id' => $id]);
}
else {
} else {
return $this->redirect([$this->getControllerUrl() . '/index']); return $this->redirect([$this->getControllerUrl() . '/index']);
} }
} }
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;


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


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


if ($document && $document->id_user == $user->id) { if ($document && $document->id_user == $user->id) {
} }


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


if ($classDocument == 'Invoice') { if ($classDocument == 'Invoice') {
'join_with' => ['user AS user_delivery_note', 'orders', 'producer'] 'join_with' => ['user AS user_delivery_note', 'orders', 'producer']
]; ];
$deliveryNotesCreateArray = DeliveryNote::searchAll([ $deliveryNotesCreateArray = DeliveryNote::searchAll([
'id_user' => $user->id,
'status' => Document::STATUS_VALID
], $options);
'id_user' => $user->id,
'status' => Document::STATUS_VALID
], $options);
$deliveryNotesUpdateArray = DeliveryNote::searchAll([ $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_create_array'] = $this->initDeliveryNoteArray('create', $deliveryNotesCreateArray);
$json['delivery_note_update_array'] = $this->initDeliveryNoteArray('update', $deliveryNotesUpdateArray); $json['delivery_note_update_array'] = $this->initDeliveryNoteArray('update', $deliveryNotesUpdateArray);
} }
{ {
$deliveryNoteArray = []; $deliveryNoteArray = [];
$isCreate = false; $isCreate = false;
if($type == 'create') {
if ($type == 'create') {
$isCreate = true; $isCreate = true;
} }


if($deliveryNoteArrayResults) {
if ($deliveryNoteArrayResults) {
foreach ($deliveryNoteArrayResults as $deliveryNote) { foreach ($deliveryNoteArrayResults as $deliveryNote) {
$deliveryNoteData = $this->addDeliveryNoteToArray($deliveryNote, $isCreate); $deliveryNoteData = $this->addDeliveryNoteToArray($deliveryNote, $isCreate);
if($deliveryNoteData) {
if ($deliveryNoteData) {
$deliveryNoteArray[] = $deliveryNoteData; $deliveryNoteArray[] = $deliveryNoteData;
} }
} }


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


if ($document) { if ($document) {
$document->changeStatus(Document::STATUS_VALID); $document->changeStatus(Document::STATUS_VALID);


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


if($backUpdateForm) {
if ($backUpdateForm) {
return $this->redirect([$this->getControllerUrl() . '/update', 'id' => $id]); return $this->redirect([$this->getControllerUrl() . '/update', 'id' => $id]);
}
else {
} else {
return $this->redirect([$this->getControllerUrl() . '/index']); return $this->redirect([$this->getControllerUrl() . '/index']);
} }
} }


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


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


return [ 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.'
]
]; ];
} }




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


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


$ordersArray = []; $ordersArray = [];
]); ]);
} }
$ordersArray[$order->id] = array_merge( $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([ $pointSale = PointSale::searchOne([
'id_user' => $document->user->id
]);
'id_user' => $document->user->id
]);


$productsArray = yii\helpers\ArrayHelper::map( $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 [
'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
]; ];
} }
} }


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


if ($document && $product) { if ($document && $product) {
if (count($document->orders) == 0) { if (count($document->orders) == 0) {
$productOrder = new ProductOrder; $productOrder = new ProductOrder;
$productOrder->id_order = $order->id; $productOrder->id_order = $order->id;
$productOrder->id_product = $idProduct; $productOrder->id_product = $idProduct;
$quantity = $quantity / Product::$unitsArray[$product->unit]['coefficient'];
$quantity = $quantity / Product::$unitsArray[$product->unit]['coefficient'];
$productOrder->quantity = $quantity; $productOrder->quantity = $quantity;
$productOrder->price = (float)$price; $productOrder->price = (float)$price;
$productOrder->unit = $product->unit; $productOrder->unit = $product->unit;
$productOrder->save(); $productOrder->save();


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


return [ 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.'
]
]; ];
} }


\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;


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


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


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


return [ 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.'
]
]; ];
} }


$class = $this->getClass(); $class = $this->getClass();


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


if ($model) { if ($model) {
return $model; return $model;

+ 44
- 46
backend/controllers/InvoiceController.php View File

<?php <?php


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


namespace backend\controllers; namespace backend\controllers;


use Yii; use Yii;


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


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


if($invoice && $invoice->isStatusDraft()) {
if ($invoice && $invoice->isStatusDraft()) {
Order::updateAll([ Order::updateAll([
'id_invoice' => null 'id_invoice' => null
], [ ], [
'message' => 'Bon de livraison supprimé de la facture.' 'message' => 'Bon de livraison supprimé de la facture.'
] ]
]; ];
}
else {
} else {
return [ return [
'alert' => [ 'alert' => [
'type' => 'error', 'type' => 'error',
$invoice = Invoice::searchOne(['id' => $idInvoice]); $invoice = Invoice::searchOne(['id' => $idInvoice]);
$deliveryNote = DeliveryNote::searchOne(['id' => $idDeliveryNote]); $deliveryNote = DeliveryNote::searchOne(['id' => $idDeliveryNote]);


if($invoice && $invoice->isStatusDraft() && $deliveryNote) {
if ($invoice && $invoice->isStatusDraft() && $deliveryNote) {
Order::updateAll([ Order::updateAll([
'id_invoice' => $idInvoice 'id_invoice' => $idInvoice
], [ ], [
'message' => 'Bon de livraison ajouté à la facture.' 'message' => 'Bon de livraison ajouté à la facture.'
] ]
]; ];
}
else {
} else {
return [ return [
'alert' => [ 'alert' => [
'type' => 'error', 'type' => 'error',

+ 20
- 20
backend/controllers/OrderController.php View File

'allow' => true, 'allow' => true,
'roles' => ['@'], 'roles' => ['@'],
'matchCallback' => function ($rule, $action) { '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;
} }
] ]
], ],
*/ */
public function actionIndex($date = '', $returnData = false) 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]); $this->redirect(['site/index', 'error_products_points_sale' => 1]);
} }




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


foreach ($users as $user) { foreach ($users as $user) {
$arrayUsers[$user->id] = $user->name . ' ' . $user->lastname; $arrayUsers[$user->id] = $user->name . ' ' . $user->lastname;
} }


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


// gestion des commandes // gestion des commandes
$this->processOrderForm($distribution, $date, $arrayPointsSale, $arrayProducts, $users); $this->processOrderForm($distribution, $date, $arrayPointsSale, $arrayProducts, $users);


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


// poids total de la production et CA potentiel // poids total de la production et CA potentiel
} }


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


$distribution = DistributionModel::find() $distribution = DistributionModel::find()
->where('date LIKE \':date\'') ->where('date LIKE \':date\'')


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


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


foreach ($products as $key => $dataProductOrder) { 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) { if ($product && $quantity) {
$productOrder = new ProductOrder; $productOrder = new ProductOrder;
$productOrder->id_order = $order->id; $productOrder->id_order = $order->id;
$order->id_user = 0; $order->id_user = 0;
} }


$user = User::searchOne(['id' => $order->id_user]);
$user = User::searchOne(['id' => $order->id_user]);
$userProducer = false; $userProducer = false;
if ($user) { if ($user) {
$userProducer = UserProducer::searchOne([
$userProducer = UserProducer::searchOne([
'id_user' => $user->id, 'id_user' => $user->id,
'id_producer' => $order->distribution->id_producer 'id_producer' => $order->distribution->id_producer
]); ]);
]); ]);


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


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


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


if ($order->id_user) { if ($order->id_user) {
$userProducer = UserProducer::find()
$userProducer = UserProducer::find()
->where([ ->where([
'id_user' => $order->id_user, 'id_user' => $order->id_user,
'id_producer' => $order->distribution->id_producer 'id_producer' => $order->distribution->id_producer
. '</span>'; . '</span>';


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

+ 86
- 89
backend/controllers/PointSaleController.php View File

<?php <?php


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


namespace backend\controllers; namespace backend\controllers;


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


public function behaviors()
public function behaviors()
{ {
return [ return [
'verbs' => [ 'verbs' => [


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


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


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


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


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


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


/** /**
* Initialise le formulaire de création/modification. * Initialise le formulaire de création/modification.
*
*
* @param integer $id * @param integer $id
* @return mixed * @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') ->orderBy('user_point_sale.id_point_sale DESC, lastname ASC, name ASC')
->all(); ->all();
return [ return [
'users' => $users 'users' => $users
]; ];


/** /**
* Supprime un point de vente et redirige vers la liste des points de vente. * Supprime un point de vente et redirige vers la liste des points de vente.
*
*
* @param integer $id * @param integer $id
* @return mixed * @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->status = -1;
$pointSale->save(); $pointSale->save();


] ]
); );


if($ordersArray) {
foreach($ordersArray as $order) {
if ($ordersArray) {
foreach ($ordersArray as $order) {
$order->delete(true); $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']); return $this->redirect(['index']);
} }
/** /**
* Définit un point de vente par défaut. * Définit un point de vente par défaut.
*
*
* @param integer $id * @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']); return $this->redirect(['index']);
} }


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

+ 91
- 91
backend/controllers/ProducerAdminController.php View File

<?php <?php


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


namespace backend\controllers; namespace backend\controllers;


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


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


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


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


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




public function actionUserTransfer($fromProducerId, $toProducerId, $withOrders = 1) public function actionUserTransfer($fromProducerId, $toProducerId, $withOrders = 1)
{ {
$fromProducerId = (int) $fromProducerId;
$toProducerId = (int) $toProducerId;
$fromProducerId = (int)$fromProducerId;
$toProducerId = (int)$toProducerId;
$count = 0; $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']; $idUser = $user['user_id'];


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


if(($withOrders && $countOrders) || !$withOrders) {
if (($withOrders && $countOrders) || !$withOrders) {
Producer::addUser($idUser, $toProducerId); 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.'); Yii::$app->getSession()->setFlash('error', 'Aucun client à importer.');
} }




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


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


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


$invoice->date = date('Y-m-d H:i:s'); $invoice->date = date('Y-m-d H:i:s');
$invoice->reference = $reference; $invoice->reference = $reference;
$invoice->turnover = $producer->getTurnover($period); $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->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 />' $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->paid = 0;
$invoice->period = $period; $invoice->period = $period;
$invoice->save(); $invoice->save();


/** /**
* Liste les factures des producteurs. * Liste les factures des producteurs.
*
*
* @return mxied * @return mxied
*/ */
public function actionBilling()
public function actionBilling()
{ {
$dataProviderInvoice = new ActiveDataProvider([ $dataProviderInvoice = new ActiveDataProvider([
'query' => Invoice::find() 'query' => Invoice::find()
->with('producer')
->orderBy('reference DESC'),
->with('producer')
->orderBy('reference DESC'),
'pagination' => [ 'pagination' => [
'pageSize' => 1000, 'pageSize' => 1000,
], ],
'dataProviderInvoice' => $dataProviderInvoice, 'dataProviderInvoice' => $dataProviderInvoice,
]); ]);
} }
public function actionProducerInstallTaxUpdatePrices($idProducer) 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` UPDATE `product_order`
SET price = ROUND(price / (1 + :tax_value), 2), SET price = ROUND(price / (1 + :tax_value), 2),
id_tax_rate = :id_tax_rate id_tax_rate = :id_tax_rate
WHERE id_product = :id_product", 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. * Recherche un établissement.
*
*
* @param integer $id * @param integer $id
* @return Etablissement * @return Etablissement
* @throws NotFoundHttpException * @throws NotFoundHttpException
*/ */
protected function findModel($id) {
protected function findModel($id)
{
if (($model = Producer::findOne($id)) !== null) { if (($model = Producer::findOne($id)) !== null) {
return $model; return $model;
} else { } else {

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

*/ */
class ProducerController extends BackendController class ProducerController extends BackendController
{ {

public $enableCsrfValidation = false; public $enableCsrfValidation = false;


public function behaviors() public function behaviors()
} }


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

+ 96
- 96
backend/controllers/ProducerPriceRangeAdminController.php View File

class ProducerPriceRangeAdminController extends BackendController 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 View File



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


$lastProductOrder = Product::find()->where('id_producer = :id_producer')->params([':id_producer' => 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) { if ($lastProductOrder) {
$model->order = ++$lastProductOrder->order; $model->order = ++$lastProductOrder->order;
} }
'id_product' => $id 'id_product' => $id
])); ]));


$userProducerWithProductPercent = UserProducer::searchAll([], [
$userProducerWithProductPercent = UserProducer::searchAll([], [
'join_with' => ['user'], 'join_with' => ['user'],
'conditions' => 'user_producer.product_price_percent != 0', 'conditions' => 'user_producer.product_price_percent != 0',
]); ]);
'from_quantity' => $model->from_quantity ? $model->from_quantity : null, 'from_quantity' => $model->from_quantity ? $model->from_quantity : null,
]; ];


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


if ($productPriceExist) { if ($productPriceExist) {
$productPriceExist->delete(); $productPriceExist->delete();
{ {
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
$product = $this->findModel($id); $product = $this->findModel($id);
$product->active = (int) $active;
$product->active = (int)$active;
$product->save(); $product->save();


DistributionModel::linkProductIncomingDistributions($product); DistributionModel::linkProductIncomingDistributions($product);
*/ */
protected function findModel($id) protected function findModel($id)
{ {
if (($model = Product::findOne($id)) !== null) {
if (($model = Product::findOne($id)) !== null) {
return $model; return $model;
} else { } else {
throw new NotFoundHttpException('The requested page does not exist.'); throw new NotFoundHttpException('The requested page does not exist.');


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

+ 58
- 59
backend/controllers/QuotationController.php View File



class QuotationController extends DocumentController 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 View File

<?php <?php


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


namespace backend\controllers; namespace backend\controllers;


use Yii; use Yii;
use yii\filters\AccessControl; use yii\filters\AccessControl;


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


public function behaviors()
public function behaviors()
{ {
return [ return [
'access' => [ 'access' => [
], ],
]; ];
} }
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; \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
$usersArray = User::findBy()->all() ;
$pointsSaleArray = PointSale::searchAll() ;
$usersArray = User::findBy()->all();
$pointsSaleArray = PointSale::searchAll();
// distributions // distributions
$firstDistribution = DistributionModel::searchOne([], [ $firstDistribution = DistributionModel::searchOne([], [
'orderby' => 'date ASC' 'orderby' => 'date ASC'
]) ;
]);
$lastDistribution = DistributionModel::searchOne([], [ $lastDistribution = DistributionModel::searchOne([], [
'orderby' => 'date DESC' '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([ $distributionsArray = DistributionModel::searchAll([
'distribution.active' => 1 'distribution.active' => 1
], [ ], [
'orderby' => 'date ASC', '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] = [ $distributionsByMonthArray[$month] = [
'display' => 0, 'display' => 0,
'year' => date('Y',strtotime($distribution->date)),
'year' => date('Y', strtotime($distribution->date)),
'month' => strftime('%B', strtotime($distribution->date)), 'month' => strftime('%B', strtotime($distribution->date)),
'distributions' => [] '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, 'usersArray' => $usersArray,
'pointsSaleArray' => $pointsSaleArray, 'pointsSaleArray' => $pointsSaleArray,
'distributionYearsArray' => $distributionYearsArray, 'distributionYearsArray' => $distributionYearsArray,
'distributionsByMonthArray' => $distributionsByMonthArray 'distributionsByMonthArray' => $distributionsByMonthArray
] ;
];
} }
public function actionAjaxReport()
public function actionAjaxReport()
{ {
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
$posts = Yii::$app->request->post(); $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 $res = Yii::$app->db->createCommand("SELECT product.name, SUM(product_order.quantity) AS quantity, SUM(product_order.price * product_order.quantity) AS total
FROM `order`, product_order, product FROM `order`, product_order, product
WHERE `order`.id = product_order.id_order WHERE `order`.id = product_order.id_order
AND product.id_producer = ".((int) GlobalParam::getCurrentProducerId()) ."
AND product.id_producer = " . ((int)GlobalParam::getCurrentProducerId()) . "
AND product_order.id_product = product.id AND product_order.id_product = product.id
AND `order`.date_delete IS NULL AND `order`.date_delete IS NULL
".$conditionUsers."
".$conditionPointsSale."
".$conditionDistributions."
" . $conditionUsers . "
" . $conditionPointsSale . "
" . $conditionDistributions . "
GROUP BY product.id GROUP BY product.id
ORDER BY product.order ASC 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[] = [ $resArray[] = [
'name' => $line['name'], 'name' => $line['name'],
'quantity' => $line['quantity'], 'quantity' => $line['quantity'],
'total' => $total, 'total' => $total,
] ;
$totalGlobal += $line['total'] ;
];
$totalGlobal += $line['total'];
} }
} }
$resArray[] = [ $resArray[] = [
'name' => '', 'name' => '',
'quantity' => '', '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 View File

<?php <?php


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


namespace backend\controllers; namespace backend\controllers;


use common\helpers\GlobalParam; 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;
use yii\filters\AccessControl; use yii\filters\AccessControl;
use common\forms\LoginForm; use common\forms\LoginForm;
*/ */
class SiteController extends BackendController 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 View File

<?php <?php


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


namespace backend\controllers; namespace backend\controllers;


use DateInterval; use DateInterval;
use DatePeriod; use DatePeriod;


class StatsController extends BackendController
class StatsController extends BackendController
{ {


public function behaviors()
public function behaviors()
{ {
return [ return [
'access' => [ 'access' => [


/** /**
* Affiche les statistiques de l'année avec le CA réalisé par mois. * Affiche les statistiques de l'année avec le CA réalisé par mois.
*
*
* @return mixed * @return mixed
*/ */
public function actionIndex()
public function actionIndex()
{ {
/* /*
* Volume de commande de l'année passée (par mois) * Volume de commande de l'année passée (par mois)
AND distribution.date >= :date_start AND distribution.date >= :date_start
AND distribution.date <= :date_end 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(); ->queryOne();


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


'data' => $dataNoIndex, 'data' => $dataNoIndex,
]); ]);
} }
const TOTALS = 13 ;
const TOTALS = 13;
/** /**
* Affiche un tableau avec les totaux (maximums, commandés) de chaque produit * Affiche un tableau avec les totaux (maximums, commandés) de chaque produit
* par mois d'une année donnée. * par mois d'une année donnée.
*
*
* @param integer $year * @param integer $year
* @return mixed * @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 // Maximums
$resMaximums = Yii::$app->db->createCommand("SELECT product.name, SUM(IF(product_distribution.active, product_distribution.quantity_max,0)) AS total $resMaximums = Yii::$app->db->createCommand("SELECT product.name, SUM(IF(product_distribution.active, product_distribution.quantity_max,0)) AS total
FROM distribution, product_distribution, product FROM distribution, product_distribution, product
WHERE distribution.id_producer = ".GlobalParam::getCurrentProducerId()."
WHERE distribution.id_producer = " . GlobalParam::getCurrentProducerId() . "
AND distribution.date >= :date_begin AND distribution.date >= :date_begin
AND distribution.date <= :date_end AND distribution.date <= :date_end
AND distribution.id = product_distribution.id_distribution AND distribution.id = product_distribution.id_distribution
AND product_distribution.id_product = product.id AND product_distribution.id_product = product.id
GROUP BY product.id GROUP BY product.id
ORDER BY product.name") 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 // Commandés
$resOrders = Yii::$app->db->createCommand(' $resOrders = Yii::$app->db->createCommand('
SELECT product.name, SUM(product_order.quantity) AS total SELECT product.name, SUM(product_order.quantity) AS total
FROM `distribution`, `order`, `product_order`, `product` FROM `distribution`, `order`, `product_order`, `product`
WHERE distribution.id_producer = '.GlobalParam::getCurrentProducerId().'
WHERE distribution.id_producer = ' . GlobalParam::getCurrentProducerId() . '
AND distribution.date >= :date_begin AND distribution.date >= :date_begin
AND distribution.date <= :date_end AND distribution.date <= :date_end
AND distribution.id = `order`.id_distribution AND distribution.id = `order`.id_distribution
AND product_order.id_product = product.id AND product_order.id_product = product.id
GROUP BY product.id GROUP BY product.id
ORDER BY product.name') 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; $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', [ return $this->render('products', [
'year' => $year, 'year' => $year,
'monthArray' => $monthArray, 'monthArray' => $monthArray,

+ 129
- 133
backend/controllers/SubscriptionController.php View File

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


namespace backend\controllers; namespace backend\controllers;


use common\helpers\GlobalParam; use common\helpers\GlobalParam;


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


public function behaviors()
public function behaviors()
{ {
return [ return [
'access' => [ 'access' => [


/** /**
* Liste les commandes récurrente du producteur. * Liste les commandes récurrente du producteur.
*
*
* @return string * @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); $dataProvider = $searchModel->search(Yii::$app->request->queryParams);
return $this->render('index', [ return $this->render('index', [
'searchModel' => $searchModel, 'searchModel' => $searchModel,
'dataProvider' => $dataProvider 'dataProvider' => $dataProvider


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


if($idOrder) {
if ($idOrder) {
$order = Order::searchOne(['id' => $idOrder]); $order = Order::searchOne(['id' => $idOrder]);
if ($order) { if ($order) {
$model->id_user = $order->id_user; $model->id_user = $order->id_user;
$model->username = $order->username; $model->username = $order->username;
$model->id_point_sale = $order->id_point_sale; $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 // produits
foreach ($order->productOrder as $productOrder) { foreach ($order->productOrder as $productOrder) {
$model->products['product_' . $productOrder->id_product] = $productOrder->quantity; $model->products['product_' . $productOrder->id_product] = $productOrder->quantity;
throw new NotFoundHttpException('La commande est introuvable.', 404); throw new NotFoundHttpException('La commande est introuvable.', 404);
} }
} }
// produits // produits
$productsArray = Product::searchAll([], [
$productsArray = Product::searchAll([], [
'orderby' => 'product.order ASC' '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é'); 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]); return $this->redirect(['subscription/update-distributions', 'idSubscription' => $subscription->id]);
}
else {
} else {
return $this->redirect(['subscription/index']); return $this->redirect(['subscription/index']);
} }
} }


/** /**
* Modifie un abonnement. * Modifie un abonnement.
*
*
* @param integer $id * @param integer $id
* @return string * @return string
* @throws NotFoundHttpException * @throws NotFoundHttpException
*/ */
public function actionUpdate($id)
public function actionUpdate($id)
{ {
// form // form
$model = new SubscriptionForm; $model = new SubscriptionForm;
$model->isAdmin = true ;
$subscription = Subscription::findOne($id);
$model->isAdmin = true;
$subscription = Subscription::findOne($id);
if ($subscription) { if ($subscription) {
$model->id = $id; $model->id = $id;
$model->id_producer = $subscription->id_producer; $model->id_producer = $subscription->id_producer;
$model->date_end = date('d/m/Y', strtotime($subscription->date_end)); $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 // produits
$arrayProductsSubscription = ProductSubscription::searchAll([
$arrayProductsSubscription = ProductSubscription::searchAll([
'id_subscription' => $model->id 'id_subscription' => $model->id
]) ;
]);
foreach ($arrayProductsSubscription as $productSubscription) { foreach ($arrayProductsSubscription as $productSubscription) {
$model->products['product_' . $productSubscription->id_product] = $productSubscription->quantity; $model->products['product_' . $productSubscription->id_product] = $productSubscription->quantity;
} }
} }


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


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




if ($model->save()) { if ($model->save()) {


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


$messageOrdersDeleted = ''; $messageOrdersDeleted = '';
if($model->date_end) {
if ($model->date_end) {
$countOrdersDeleted = $subscription->deleteOrdersIncomingDistributions(true); $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']); return $this->redirect(['subscription/index']);
} }
} }


/** /**
* Supprime une commande récurrente. * Supprime une commande récurrente.
*
*
* @param integer $id * @param integer $id
*/ */
public function actionDelete($id)
public function actionDelete($id)
{ {
$subscription = Subscription::searchOne([
$subscription = Subscription::searchOne([
'subscription.id' => $id 'subscription.id' => $id
]) ;
$subscription->deleteOrdersIncomingDistributions() ;
]);
$subscription->deleteOrdersIncomingDistributions();
$subscription->delete(); $subscription->delete();
ProductSubscription::deleteAll(['id_subscription' => $id]);
ProductSubscription::deleteAll(['id_subscription' => $id]);
Yii::$app->getSession()->setFlash('success', 'Abonnement supprimé'); Yii::$app->getSession()->setFlash('success', 'Abonnement supprimé');
return $this->redirect(['subscription/index']); 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, 'matchedDistributionsArray' => $matchedDistributionsArray,
'idSubscription' => $idSubscription, 'idSubscription' => $idSubscription,
'update' => $update 'update' => $update
]) ;
]);
} }
public function actionAjaxInfos($idSubscription = 0)
public function actionAjaxInfos($idSubscription = 0)
{ {
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; \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);*/ /*Debug::dump($productsArray);*/
foreach($productsArray as &$theProduct) {
foreach ($productsArray as &$theProduct) {
/*$theProduct['unit_save'] = $theProduct['unit'] ; /*$theProduct['unit_save'] = $theProduct['unit'] ;
$theProduct['units'] = [] ; $theProduct['units'] = [] ;
$theProduct['units'][] = [ $theProduct['units'][] = [
'price' => $theProduct['price'] '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']) { /*if($theProduct['productSubscription'][0]['unit'] != $theProduct['unit']) {
$theProduct['units'][] = [ $theProduct['units'][] = [
'unit' => $theProduct['productSubscription'][0]['unit'], 'unit' => $theProduct['productSubscription'][0]['unit'],
$theProduct['step'] = $theProduct['productSubscription'][0]['step'] ; $theProduct['step'] = $theProduct['productSubscription'][0]['step'] ;
$theProduct['price'] = $theProduct['productSubscription'][0]['price'] ; $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 [ return [
'products' => $productsArray 'products' => $productsArray
] ;
];
} }
} }

+ 18
- 18
backend/controllers/UserController.php View File

} }


// product price percent // product price percent
$userProducer = UserProducer::searchOne([
$userProducer = UserProducer::searchOne([
'id_producer' => GlobalParam::getCurrentProducerId(), 'id_producer' => GlobalParam::getCurrentProducerId(),
'id_user' => $model->id 'id_user' => $model->id
]); ]);
->all(); ->all();


// groupes d'utilisateurs // groupes d'utilisateurs
$userGroupsArray = UserGroup::find()
$userGroupsArray = UserGroup::find()
->where([ ->where([
'id_producer' => GlobalParam::getCurrentProducerId(), 'id_producer' => GlobalParam::getCurrentProducerId(),
]) ])
$posts = Yii::$app->request->post(); $posts = Yii::$app->request->post();


if ($posts && isset($posts['User']['email']) && strlen($posts['User']['email']) > 0) { if ($posts && isset($posts['User']['email']) && strlen($posts['User']['email']) > 0) {
$userExist = User::searchOne([
$userExist = User::searchOne([
'email' => $posts['User']['email'] 'email' => $posts['User']['email']
]); ]);
} }


// Moodification du profil // Moodification du profil
$previousMail = $model->email; $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 ($userBelongToProducer) {
if ($model->load(Yii::$app->request->post()) && $model->save()) { if ($model->load(Yii::$app->request->post()) && $model->save()) {


/** /**
* Lie un utilisateur aux points de vente sélectionnés. * Lie un utilisateur aux points de vente sélectionnés.
* *
* @param User $modelUser
* @param User $modelUser
*/ */
public function processLinkPointSale($modelUser) public function processLinkPointSale($modelUser)
{ {
/** /**
* Lie un utilisateur aux groupes d'utilisateurs sélectionnés. * Lie un utilisateur aux groupes d'utilisateurs sélectionnés.
* *
* @param User $modelUser
* @param User $modelUser
*/ */
public function processLinkUserGroup($modelUser) public function processLinkUserGroup($modelUser)
{ {


public function processProductPricePercent($model) public function processProductPricePercent($model)
{ {
$userProducer = UserProducer::searchOne([
$userProducer = UserProducer::searchOne([
'id_producer' => GlobalParam::getCurrentProducerId(), 'id_producer' => GlobalParam::getCurrentProducerId(),
'id_user' => $model->id 'id_user' => $model->id
]); ]);
*/ */
public function actionDelete($id) public function actionDelete($id)
{ {
$userProducer = UserProducer::findOne([
$userProducer = UserProducer::findOne([
'id_user' => $id, 'id_user' => $id,
'id_producer' => GlobalParam::getCurrentProducerId() 'id_producer' => GlobalParam::getCurrentProducerId()
]); ]);
$usersPointSaleLink = 1; $usersPointSaleLink = 1;
} }


$users = User::findBy([
$users = User::findBy([
'id_producer' => GlobalParam::getCurrentProducerId(), 'id_producer' => GlobalParam::getCurrentProducerId(),
'id_point_sale' => $idPointSale, 'id_point_sale' => $idPointSale,
'users_point_sale_link' => $usersPointSaleLink, 'users_point_sale_link' => $usersPointSaleLink,
$bodyResponseSendMail = $responseSendMail->getBody(); $bodyResponseSendMail = $responseSendMail->getBody();
$emailsErrorArray = []; $emailsErrorArray = [];


if(isset($bodyResponseSendMail['Messages'])) {
if (isset($bodyResponseSendMail['Messages'])) {
foreach ($bodyResponseSendMail['Messages'] as $message) { foreach ($bodyResponseSendMail['Messages'] as $message) {
if ($message['Status'] != 'success') { if ($message['Status'] != 'success') {
$emailsErrorArray[] = $message['To']['Email']; $emailsErrorArray[] = $message['To']['Email'];
*/ */
public function actionCredit($id) 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(); $creditForm = new CreditForm();
if ($creditForm->load(Yii::$app->request->post()) && $creditForm->validate()) { if ($creditForm->load(Yii::$app->request->post()) && $creditForm->validate()) {
$creditForm = new CreditForm; $creditForm = new CreditForm;
} }


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


*/ */
public function actionStateCredit($idUser, $state) public function actionStateCredit($idUser, $state)
{ {
$userProducer = UserProducer::searchOne([
$userProducer = UserProducer::searchOne([
'id_user' => $idUser 'id_user' => $idUser
]); ]);


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

+ 109
- 111
backend/controllers/UserGroupController.php View File

class UserGroupController extends BackendController 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 View File



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

$producerManager = $this->getProducerManager();


?> ?>
<div class="content-wrapper"> <div class="content-wrapper">
<section class="content"> <section class="content">


<?php $producer = GlobalParam::getCurrentProducer(); ?> <?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"> <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> <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> <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 View File

use yii\helpers\Html; use yii\helpers\Html;
use common\helpers\GlobalParam; 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(); $producer = GlobalParam::getCurrentProducer();


?> ?>
<div class="navbar-custom-menu"> <div class="navbar-custom-menu">
<?php <?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")) . '\'') ->andWhere('CAST(FROM_UNIXTIME(user.created_at) AS date) > \'' . date("Y-m-d", strtotime("-7 days")) . '\'')
->orderBy('created_at DESC') ->orderBy('created_at DESC')
->all(); ->all();


<?php <?php


$pastDistributionsArray = DistributionModel::find()
$pastDistributionsArray = Distribution::find()
->where(['<', 'distribution.date', date('Y-m-d')]) ->where(['<', 'distribution.date', date('Y-m-d')])
->andWhere([ ->andWhere([
'distribution.id_producer' => GlobalParam::getCurrentProducerId(), 'distribution.id_producer' => GlobalParam::getCurrentProducerId(),


$pastDistributionsArray = array_reverse($pastDistributionsArray); $pastDistributionsArray = array_reverse($pastDistributionsArray);


$incomingDistributionsArray = DistributionModel::find()
$incomingDistributionsArray = Distribution::find()
->where(['>=', 'distribution.date', date('Y-m-d')]) ->where(['>=', 'distribution.date', date('Y-m-d')])
->andWhere([ ->andWhere([
'distribution.id_producer' => GlobalParam::getCurrentProducerId(), 'distribution.id_producer' => GlobalParam::getCurrentProducerId(),


<?php <?php


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


</li> </li>


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


<?php else: ?> <?php else: ?>
<span class="label label-danger">Hors-ligne</span> <span class="label label-danger">Hors-ligne</span>
<?php endif; ?> <?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> <i class="fa fa-caret-down"></i>
</a> </a>


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

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

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

+ 35
- 30
backend/views/layouts/left.php View File

* termes. * termes.
*/ */


use common\helpers\GlobalParam;

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

?> ?>


<aside class="main-sidebar"> <aside class="main-sidebar">
<?php <?php
$producer = GlobalParam::getCurrentProducer(); $producer = GlobalParam::getCurrentProducer();
$newVersionOpendistribTemplate = ''; $newVersionOpendistribTemplate = '';
if(!$producer->isUpToDateWithOpendistribVersion()) {
if(!$producerManager->isUpToDateWithOpendistribVersion($producer)) {
$newVersionOpendistribTemplate = '<span class="pull-right-container"><small class="label pull-right bg-orange">&nbsp;</small></span>'; $newVersionOpendistribTemplate = '<span class="pull-right-container"><small class="label pull-right bg-orange">&nbsp;</small></span>';
} }
?> ?>
[ [
'options' => ['class' => 'sidebar-menu tree', 'data-widget' => 'tree'], 'options' => ['class' => 'sidebar-menu tree', 'data-widget' => 'tree'],
'items' => [ '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', 'label' => 'Produits',
'icon' => 'clone', 'icon' => 'clone',
'url' => ['/product/index'], 'url' => ['/product/index'],
'visible' => User::isCurrentProducer(),
'visible' => $userManager->isCurrentProducer(),
'active' => Yii::$app->controller->id == 'product', 'active' => Yii::$app->controller->id == 'product',
'items' => [ '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', 'label' => 'Utilisateurs',
'icon' => 'users', 'icon' => 'users',
'url' => ['/user/index'], 'url' => ['/user/index'],
'items' => [ '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', 'label' => 'Documents',
'icon' => 'clone', 'icon' => 'clone',
'url' => ['/delivery-note/index'], 'url' => ['/delivery-note/index'],
'items' => [ '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()],
], ],
], ],
[ [
'icon' => 'line-chart', 'icon' => 'line-chart',
'url' => ['/stats/index'], 'url' => ['/stats/index'],
'items' => [ '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', 'label' => 'Développement',
'icon' => 'code', 'icon' => 'code',
'url' => ['/development/index'], 'url' => ['/development/index'],
'visible' => User::isCurrentProducer(),
'visible' => $userManager->isCurrentProducer(),
'active' => Yii::$app->controller->id == 'development', 'active' => Yii::$app->controller->id == 'development',
'template'=>'<a href="{url}">{icon} {label}'.$newVersionOpendistribTemplate.'</a>' '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 View File

public function getNameProducer(User $user): string public function getNameProducer(User $user): string
{ {
$producer = $this->findOneProducerById($user->id_producer); $producer = $this->findOneProducerById($user->id_producer);
return $producer->getName();
return $producer->name;
} }


public function isDocumentDisplayOrders(DocumentInterface $document): bool public function isDocumentDisplayOrders(DocumentInterface $document): bool

Loading…
Cancel
Save