Guillaume 4 months ago
parent
commit
3b4fe3d594
100 changed files with 4303 additions and 2294 deletions
  1. +3
    -1
      .bowerrc
  2. +58
    -0
      backend/assets/AdminLteAsset.php
  3. +17
    -4
      backend/assets/AppAsset.php
  4. +72
    -0
      backend/assets/CommonAsset.php
  5. +3
    -3
      backend/assets/VuejsAlertsAsset.php
  6. +0
    -63
      backend/assets/VuejsDistributionIndexAsset.php
  7. +0
    -64
      backend/assets/VuejsDocumentFormAsset.php
  8. +0
    -62
      backend/assets/VuejsProducerUpdateAsset.php
  9. +0
    -62
      backend/assets/VuejsReportIndexAsset.php
  10. +0
    -58
      backend/assets/VuejsSettingFormAsset.php
  11. +0
    -62
      backend/assets/VuejsSubscriptionFormAsset.php
  12. +0
    -63
      backend/assets/VuejsUserFormAsset.php
  13. +15
    -2
      backend/config/main.php
  14. +3
    -5
      backend/config/params.php
  15. +4
    -5
      backend/controllers/AccessController.php
  16. +162
    -0
      backend/controllers/AccessoryController.php
  17. +137
    -0
      backend/controllers/AutomaticEmailController.php
  18. +21
    -5
      backend/controllers/BackendController.php
  19. +0
    -131
      backend/controllers/CommunicateAdminController.php
  20. +92
    -11
      backend/controllers/CommunicateController.php
  21. +2
    -2
      backend/controllers/CreditController.php
  22. +15
    -14
      backend/controllers/CronController.php
  23. +2
    -2
      backend/controllers/DashboardController.php
  24. +3
    -5
      backend/controllers/DeliveryNoteController.php
  25. +12
    -4
      backend/controllers/DevelopmentController.php
  26. +158
    -43
      backend/controllers/DistributionController.php
  27. +55
    -31
      backend/controllers/DocumentController.php
  28. +0
    -152
      backend/controllers/FeatureAdminController.php
  29. +4
    -5
      backend/controllers/InvoiceController.php
  30. +30
    -26
      backend/controllers/OrderController.php
  31. +37
    -24
      backend/controllers/PointSaleController.php
  32. +0
    -267
      backend/controllers/ProducerAdminController.php
  33. +14
    -10
      backend/controllers/ProducerController.php
  34. +1
    -0
      backend/controllers/ProducerInvoiceController.php
  35. +5
    -7
      backend/controllers/ProducerPriceRangeAdminController.php
  36. +5
    -6
      backend/controllers/ProductCategoryController.php
  37. +24
    -16
      backend/controllers/ProductController.php
  38. +4
    -4
      backend/controllers/QuotationController.php
  39. +127
    -10
      backend/controllers/ReportController.php
  40. +0
    -86
      backend/controllers/SettingAdminController.php
  41. +159
    -0
      backend/controllers/SharedPointSaleController.php
  42. +7
    -5
      backend/controllers/SiteController.php
  43. +42
    -0
      backend/controllers/SponsorshipController.php
  44. +0
    -144
      backend/controllers/StatsAdminController.php
  45. +8
    -3
      backend/controllers/StatsController.php
  46. +39
    -28
      backend/controllers/SubscriptionController.php
  47. +0
    -85
      backend/controllers/SupportAdminController.php
  48. +4
    -4
      backend/controllers/SupportController.php
  49. +0
    -138
      backend/controllers/TaxRateAdminController.php
  50. +91
    -0
      backend/controllers/TillerController.php
  51. +181
    -136
      backend/controllers/UserController.php
  52. +5
    -5
      backend/controllers/UserGroupController.php
  53. +2
    -2
      backend/controllers/UserImportController.php
  54. +132
    -0
      backend/controllers/admin/CommunicateAdminController.php
  55. +119
    -0
      backend/controllers/admin/DashboardAdminController.php
  56. +153
    -0
      backend/controllers/admin/FeatureAdminController.php
  57. +80
    -0
      backend/controllers/admin/OnlineAdminController.php
  58. +79
    -0
      backend/controllers/admin/OrderAdminController.php
  59. +262
    -0
      backend/controllers/admin/ProducerAdminController.php
  60. +84
    -0
      backend/controllers/admin/SettingAdminController.php
  61. +145
    -0
      backend/controllers/admin/StatsAdminController.php
  62. +85
    -0
      backend/controllers/admin/SupportAdminController.php
  63. +135
    -0
      backend/controllers/admin/TaxRateAdminController.php
  64. +139
    -0
      backend/controllers/admin/UserAdminController.php
  65. +2
    -2
      backend/forms/AdminSettingsForm.php
  66. +35
    -0
      backend/forms/ReportPaymentsForm.php
  67. +3
    -3
      backend/models/AccessUserProducerForm.php
  68. +5
    -44
      backend/models/CreditForm.php
  69. +5
    -160
      backend/models/MailForm.php
  70. +14
    -0
      backend/views/_include/form_actions.php
  71. +17
    -0
      backend/views/_include/small_box.php
  72. +3
    -3
      backend/views/access/index.php
  73. +78
    -0
      backend/views/accessory/_form.php
  74. +50
    -0
      backend/views/accessory/create.php
  75. +91
    -0
      backend/views/accessory/index.php
  76. +53
    -0
      backend/views/accessory/update.php
  77. +92
    -0
      backend/views/automatic-email/_form.php
  78. +49
    -0
      backend/views/automatic-email/create.php
  79. +109
    -0
      backend/views/automatic-email/index.php
  80. +52
    -0
      backend/views/automatic-email/update.php
  81. +3
    -3
      backend/views/communicate-admin/index.php
  82. +129
    -0
      backend/views/communicate/email.php
  83. +0
    -77
      backend/views/communicate/index.php
  84. +3
    -3
      backend/views/communicate/instructions.php
  85. +2
    -2
      backend/views/communicate/instructions_multi.php
  86. +56
    -0
      backend/views/communicate/paper.php
  87. +6
    -6
      backend/views/credit/index.php
  88. +94
    -0
      backend/views/dashboard-admin/_statistics.php
  89. +94
    -0
      backend/views/dashboard-admin/index.php
  90. +32
    -22
      backend/views/dashboard/index.php
  91. +44
    -7
      backend/views/delivery-note/index.php
  92. +2
    -2
      backend/views/development/_form.php
  93. +2
    -2
      backend/views/development/create.php
  94. +2
    -2
      backend/views/development/development.php
  95. +21
    -3
      backend/views/development/index.php
  96. +2
    -2
      backend/views/development/update.php
  97. +103
    -72
      backend/views/distribution/index.php
  98. +10
    -10
      backend/views/distribution/report-bourlingue.php
  99. +3
    -3
      backend/views/distribution/report-grid.php
  100. +1
    -1
      backend/views/distribution/shopping-cart-labels.php

+ 3
- 1
.bowerrc View File

@@ -1,3 +1,5 @@
{
"directory" : "vendor/bower"
"directory" : "vendor/bower",
"strict-ssl": false,
"https-proxy": ""
}

+ 58
- 0
backend/assets/AdminLteAsset.php View File

@@ -0,0 +1,58 @@
<?php
/**
Copyright Souke (2018)

contact@souke.fr

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\assets;

use yii\web\AssetBundle;
use yii ;

/**
* @author Qiang Xue <qiang.xue@gmail.com>
* @since 2.0
*/
class AdminLteAsset extends \common\components\MyAssetBundle
{
public $sourcePath = '@vendor/almasaeed2010/adminlte/dist';
public function __construct() {
parent::__construct() ;

$this->addAsset('css', 'css/AdminLTE.min.css');
$this->addAsset('css', 'css/skins/skin-black.min.css');
$this->addAsset('js', 'js/adminlte.min.js');
}
}

+ 17
- 4
backend/assets/AppAsset.php View File

@@ -1,8 +1,8 @@
<?php
/**
Copyright distrib (2018)
Copyright Souke (2018)

contact@opendistrib.net
contact@souke.fr

Ce logiciel est un programme informatique servant à aider les producteurs
à distribuer leur production en circuits courts.
@@ -50,7 +50,9 @@ class AppAsset extends \common\components\MyAssetBundle
public $baseUrl = '@web';
public $css = [];
public $js = [];
public $depends = [];
public $depends = [
'rmrevin\yii\fontawesome\AssetBundle'
];
public function __construct() {
parent::__construct() ;
@@ -59,15 +61,26 @@ class AppAsset extends \common\components\MyAssetBundle
$dirSelect2 = 'js/select2-4.0.13';

// css
$this->addAsset('css','bootstrap/css/bootstrap.min.css') ;
$this->addAsset('css',$dirJquery.'/jquery-ui.min.css');
$this->addAsset('css',$dirJquery.'/jquery-ui.theme.min.css') ;
$this->addAsset('css',$dirSelect2.'/css/select2.min.css') ;
$this->addAsset('css','css/site.css') ;
$this->addAsset('css','css/screen.css') ;
// js
$this->addAsset('js','bootstrap/js/bootstrap.min.js') ;
$this->addAsset('js',$dirJquery.'/jquery-ui.min.js') ;
$this->addAsset('js',$dirSelect2.'/js/select2.min.js') ;
$this->addAsset('js','js/backend.js') ;

// js spécifique
$this->addAsset('js','js/vuejs/user-form.js') ;
$this->addAsset('js','js/vuejs/distribution-index.js') ;
$this->addAsset('js','js/vuejs/subscription-form.js') ;
$this->addAsset('js', 'js/vuejs/document-form.js');
$this->addAsset('js','js/vuejs/producer-update.js') ;
$this->addAsset('js','js/vuejs/report-index.js') ;
$this->addAsset('js','js/vuejs/setting-form.js') ;
}
}

+ 72
- 0
backend/assets/CommonAsset.php View File

@@ -0,0 +1,72 @@
<?php
/**
Copyright Souke (2018)

contact@souke.fr

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\assets;

use yii\web\AssetBundle;
use yii ;

/**
* @author Qiang Xue <qiang.xue@gmail.com>
* @since 2.0
*/
class CommonAsset extends \common\components\MyAssetBundle
{
public $sourcePath = '@common/web/' ;
public $css = [];
public $js = [];
public $depends = [
'yii\web\YiiAsset',
];
public function __construct() {
parent::__construct() ;
// css
$this->addAsset('css','bootstrap-icons/font/bootstrap-icons.min.css') ;
$this->addAsset('css','css/screen.css') ;
// js
$this->addAsset('js','js/jquery-ui-1.11.4.custom/jquery-ui.min.js');
$this->addAsset('js','js/promise-polyfill/promise.min.js');
$this->addAsset('js','js/axios/axios.min.js');
$this->addAsset('js','js/simple-lightbox/simpleLightbox.min.js') ;
$this->addAsset('js','js/vuejs/vue.js');
$this->addAsset('js','js/vuejs/vcalendar/v-calendar.umd.min.js') ;
$this->addAsset('js','js/common.js') ;
}
}

+ 3
- 3
backend/assets/VuejsAlertsAsset.php View File

@@ -1,8 +1,8 @@
<?php
/**
* Copyright distrib (2018)
* Copyright Souke (2018)
*
* contact@opendistrib.net
* contact@souke.fr
*
* Ce logiciel est un programme informatique servant à aider les producteurs
* à distribuer leur production en circuits courts.
@@ -48,7 +48,7 @@ class VuejsAlertsAsset extends \common\components\MyAssetBundle
public $css = [];
public $js = [];
public $depends = [
'common\assets\CommonAsset'
//'backend\assets\AppAsset',
];

public function __construct()

+ 0
- 63
backend/assets/VuejsDistributionIndexAsset.php View File

@@ -1,63 +0,0 @@
<?php
/**
Copyright distrib (2018)

contact@opendistrib.net

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

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

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

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

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

namespace backend\assets;

use yii\web\AssetBundle;
use yii ;

/**
* @author Qiang Xue <qiang.xue@gmail.com>
* @since 2.0
*/
class VuejsDistributionIndexAsset extends \common\components\MyAssetBundle
{
public $basePath = '@webroot';
public $baseUrl = '@web';
public $css = [];
public $js = [];
public $depends = [
'common\assets\CommonAsset',
'backend\assets\AppAsset',
];
public function __construct()
{
parent::__construct() ;
$this->addAsset('js','js/vuejs/distribution-index.js') ;
}
}

+ 0
- 64
backend/assets/VuejsDocumentFormAsset.php View File

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

namespace backend\assets;

use yii\web\AssetBundle;
use yii;

/**
* @author Qiang Xue <qiang.xue@gmail.com>
* @since 2.0
*/
class VuejsDocumentFormAsset extends \common\components\MyAssetBundle
{
public $basePath = '@webroot';
public $baseUrl = '@web';
public $css = [];
public $js = [];
public $depends = [
'common\assets\CommonAsset',
'backend\assets\AppAsset',
'backend\assets\VuejsAlertsAsset',
];

public function __construct()
{
parent::__construct();
$this->addAsset('js', 'js/vuejs/document-form.js');
}
}

+ 0
- 62
backend/assets/VuejsProducerUpdateAsset.php View File

@@ -1,62 +0,0 @@
<?php
/**
Copyright distrib (2018)

contact@opendistrib.net

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

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

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

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

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

namespace backend\assets;

use yii\web\AssetBundle;
use yii ;

/**
* @author Qiang Xue <qiang.xue@gmail.com>
* @since 2.0
*/
class VuejsProducerUpdateAsset extends \common\components\MyAssetBundle
{
public $basePath = '@webroot';
public $baseUrl = '@web';
public $css = [];
public $js = [];
public $depends = [
'common\assets\CommonAsset'
];
public function __construct()
{
parent::__construct() ;
$this->addAsset('js','js/vuejs/producer-update.js') ;
}
}

+ 0
- 62
backend/assets/VuejsReportIndexAsset.php View File

@@ -1,62 +0,0 @@
<?php
/**
Copyright distrib (2018)

contact@opendistrib.net

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

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

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

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

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

namespace backend\assets;

use yii\web\AssetBundle;
use yii ;

/**
* @author Qiang Xue <qiang.xue@gmail.com>
* @since 2.0
*/
class VuejsReportIndexAsset extends \common\components\MyAssetBundle
{
public $basePath = '@webroot';
public $baseUrl = '@web';
public $css = [];
public $js = [];
public $depends = [
'common\assets\CommonAsset'
];
public function __construct()
{
parent::__construct() ;
$this->addAsset('js','js/vuejs/report-index.js') ;
}
}

+ 0
- 58
backend/assets/VuejsSettingFormAsset.php View File

@@ -1,58 +0,0 @@
<?php
/**
Copyright distrib (2018)

contact@opendistrib.net

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

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

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

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

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

namespace backend\assets;

use yii\web\AssetBundle;
use yii ;

class VuejsSettingFormAsset extends \common\components\MyAssetBundle
{
public $basePath = '@webroot';
public $baseUrl = '@web';
public $css = [];
public $js = [];
public $depends = [
'common\assets\CommonAsset'
];
public function __construct()
{
parent::__construct() ;
$this->addAsset('js','js/vuejs/setting-form.js') ;
}
}

+ 0
- 62
backend/assets/VuejsSubscriptionFormAsset.php View File

@@ -1,62 +0,0 @@
<?php
/**
Copyright distrib (2018)

contact@opendistrib.net

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

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

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

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

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

namespace backend\assets;

use yii\web\AssetBundle;
use yii ;

/**
* @author Qiang Xue <qiang.xue@gmail.com>
* @since 2.0
*/
class VuejsSubscriptionFormAsset extends \common\components\MyAssetBundle
{
public $basePath = '@webroot';
public $baseUrl = '@web';
public $css = [];
public $js = [];
public $depends = [
'common\assets\CommonAsset'
];
public function __construct()
{
parent::__construct() ;
$this->addAsset('js','js/vuejs/subscription-form.js') ;
}
}

+ 0
- 63
backend/assets/VuejsUserFormAsset.php View File

@@ -1,63 +0,0 @@
<?php
/**
Copyright distrib (2018)

contact@opendistrib.net

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

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

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

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

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

namespace backend\assets;

use yii\web\AssetBundle;
use yii ;

/**
* @author Qiang Xue <qiang.xue@gmail.com>
* @since 2.0
*/
class VuejsUserFormAsset extends \common\components\MyAssetBundle
{
public $basePath = '@webroot';
public $baseUrl = '@web';
public $css = [];
public $js = [];
public $depends = [
'common\assets\CommonAsset',
'backend\assets\AppAsset',
];
public function __construct()
{
parent::__construct() ;
$this->addAsset('js','js/vuejs/user-form.js') ;
}
}

+ 15
- 2
backend/config/main.php View File

@@ -1,8 +1,8 @@
<?php
/**
Copyright distrib (2018)
Copyright Souke (2018)

contact@opendistrib.net
contact@souke.fr

Ce logiciel est un programme informatique servant à aider les producteurs
à distribuer leur production en circuits courts.
@@ -49,6 +49,19 @@ return [
'basePath' => dirname(__DIR__),
'name' => 'distrib',
'controllerNamespace' => 'backend\controllers',
'controllerMap' => [
'dashboard-admin' => 'backend\controllers\admin\DashboardAdminController',
'communicate-admin' => 'backend\controllers\admin\CommunicatedAdminController',
'feature-admin' => 'backend\controllers\admin\FeatureAdminController',
'online-admin' => 'backend\controllers\admin\OnlineAdminController',
'producer-admin' => 'backend\controllers\admin\ProducerAdminController',
'setting-admin' => 'backend\controllers\admin\SettingAdminController',
'stats-admin' => 'backend\controllers\admin\StatsAdminController',
'support-admin' => 'backend\controllers\admin\SupportAdminController',
'tax-rate-admin' => 'backend\controllers\admin\TaxRateAdminController',
'user-admin' => 'backend\controllers\admin\UserAdminController',
'order-admin' => 'backend\controllers\admin\OrderAdminController',
],
'defaultRoute' => 'dashboard/index',
'bootstrap' => ['log'],
'modules' => [],

+ 3
- 5
backend/config/params.php View File

@@ -1,8 +1,8 @@
<?php
/**
Copyright distrib (2018)
Copyright Souke (2018)

contact@opendistrib.net
contact@souke.fr

Ce logiciel est un programme informatique servant à aider les producteurs
à distribuer leur production en circuits courts.
@@ -35,6 +35,4 @@ pris connaissance de la licence CeCILL, et que vous en avez accepté les
termes.
*/

return [
'adminEmail' => 'contact@opendistrib.net',
];
return [];

+ 4
- 5
backend/controllers/AccessController.php View File

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

/**
* Copyright distrib (2018)
* Copyright Souke (2018)
*
* contact@opendistrib.net
* contact@souke.fr
*
* Ce logiciel est un programme informatique servant à aider les producteurs
* à distribuer leur production en circuits courts.
@@ -39,9 +39,8 @@
namespace backend\controllers;

use backend\models\AccessUserProducerForm;
use common\logic\User\User\Model\UserSearch;
use domain\User\User\UserSearch;
use yii\filters\AccessControl;
use yii\filters\VerbFilter;

/**
* UserController implements the CRUD actions for User model.
@@ -78,7 +77,7 @@ class AccessController extends BackendController
$userModule = $this->getUserModule();
$producer = $this->getProducerCurrent();
$userSearch = new UserSearch();
$usersArray = $userSearch->search()->query->all();
$usersArray = $userSearch->search([], $producer)->query->all();

$modelAccessUserProducerForm = new AccessUserProducerForm;
if ($modelAccessUserProducerForm->load(\Yii::$app->request->post()) && $modelAccessUserProducerForm->validate()) {

+ 162
- 0
backend/controllers/AccessoryController.php View File

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

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

namespace backend\controllers;

use domain\Product\Accessory\Accessory;
use yii\base\Response;
use yii\db\StaleObjectException;
use yii\filters\AccessControl;
use yii\web\NotFoundHttpException;

class AccessoryController extends BackendController
{
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::class,
'rules' => [
[
'allow' => true,
'roles' => ['@'],
'matchCallback' => function ($rule, $action) {
return $this->getUserModule()
->getAuthorizationChecker()
->isGrantedAsProducer($this->getUserCurrent());
}
]
],
],
];
}

public function actionIndex()
{
return $this->render('index', [
'dataProvider' => $this->getAccessoryModule()->getRepository()
->queryAccessories()->getDataProvider(20),
]);
}

public function actionCreate()
{
$accessoryModule = $this->getAccessoryModule();
$accessoryModel = $accessoryModule->getBuilder()->instanciateAccessory($this->getProducerCurrent());

if ($accessoryModel->load(\Yii::$app->request->post()) && $accessoryModel->validate()) {
$accessory = $accessoryModule->getManager()->createAccessory(
$this->getProducerCurrent(),
$accessoryModel->getName(),
$accessoryModel->getQuantity()
);
$this->afterSave($accessory, $accessoryModel->getSelectedProductsIds());
$this->setFlash('success', "Accessoire ajouté");
return $this->redirectAfterSave('accessory', $accessory->getId());
}

return $this->render('create', [
'accessory' => $this->initFormModel($accessoryModel),
'productsArray' => $this->findProducts()
]);
}

/**
* @throws NotFoundHttpException
*/
public function actionUpdate(int $id)
{
$accessory = $this->findAccessory($id);

if ($accessory->load(\Yii::$app->request->post()) && $accessory->validate() && $accessory->save()) {
$this->afterSave($accessory, $accessory->getSelectedProductsIds());
return $this->redirectAfterSave('accessory', $accessory->getId());
}

return $this->render('update', [
'accessory' => $this->initFormModel($accessory),
'productsArray' => $this->findProducts()
]);
}

/**
* @throws \Throwable
* @throws StaleObjectException
* @throws NotFoundHttpException
*/
public function actionDelete(int $id): Response
{
$accessory = $this->findAccessory($id);
if($this->getAccessoryModule()->getManager()->deleteAccessory($accessory)) {
$this->setFlash('success', "Accessoire supprimé");
}

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

public function afterSave(Accessory $accessory, $selectedProductsIdsArray): void
{
if(!is_array($selectedProductsIdsArray)) {
$selectedProductsIdsArray = [];
}
$this->getAccessoryModule()->getManager()->manageProducts($accessory, $selectedProductsIdsArray);
}

public function findProducts(): array
{
return $this->getProductModule()->getRepository()->findProducts(true);
}

/**
* @throws NotFoundHttpException
*/
protected function findAccessory($id): Accessory
{
if (($accessory = $this->getAccessoryModule()->getRepository()->findOneAccessoryById($id)) !== null) {
return $accessory;
} else {
throw new NotFoundHttpException("L'accessoire n'a pas été trouvé.");
}
}

public function initFormModel(Accessory $accessoryModel)
{
$this->getAccessoryModule()->getBuilder()->initSelectedProductsIds($accessoryModel);
return $accessoryModel;
}
}

+ 137
- 0
backend/controllers/AutomaticEmailController.php View File

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

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

namespace backend\controllers;

use backend\controllers\BackendController;
use domain\Communication\AutomaticEmail\AutomaticEmail;
use domain\Feature\Feature\Feature;
use domain\Product\Accessory\Accessory;
use yii\base\Response;
use yii\db\StaleObjectException;
use yii\filters\AccessControl;
use yii\web\NotFoundHttpException;

class AutomaticEmailController extends BackendController
{
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::class,
'rules' => [
[
'allow' => true,
'roles' => ['@'],
'matchCallback' => function ($rule, $action) {
return $this->getUserModule()->getAuthorizationChecker()
->isGrantedAsProducer($this->getUserCurrent())
&& $this->getFeatureModule()->getChecker()
->isEnabled(Feature::ALIAS_AUTOMATIC_EMAIL);
}
]
],
],
];
}

public function actionIndex()
{
return $this->render('index', [
'dataProvider' => $this->getAutomaticEmailModule()->getRepository()
->queryAutomaticEmails()->getDataProvider(20),
]);
}

public function actionCreate()
{
$automaticEmailModule = $this->getAutomaticEmailModule();
$automaticEmailModel = $automaticEmailModule->getBuilder()->instanciateAutomaticEmail($this->getProducerCurrent());

if ($automaticEmailModel->load(\Yii::$app->request->post()) && $automaticEmailModel->validate()) {
$automaticEmail = $automaticEmailModule->getManager()->createAutomaticEmail(
$this->getProducerCurrent(),
$automaticEmailModel->getDay(),
$automaticEmailModel->getDelayBeforeDistribution(),
$automaticEmailModel->getSubject(),
$automaticEmailModel->getMessage(),
$automaticEmailModel->getIntegrateProductList()
);
$this->setFlash('success', "Email automatique ajouté");
return $this->redirectAfterSave('automatic-email', $automaticEmail->getId());
}

return $this->render('create', [
'automaticEmail' => $automaticEmailModel
]);
}

public function actionUpdate(int $id)
{
$automaticEmail = $this->findAutomaticEmail($id);

if ($automaticEmail->load(\Yii::$app->request->post()) && $automaticEmail->validate() && $automaticEmail->save()) {
$this->setFlash('success', "Email automatique modifié");
return $this->redirectAfterSave('automatic-email', $automaticEmail->getId());
}

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

public function actionDelete(int $id): Response
{
$automaticEmail = $this->findAutomaticEmail($id);

if($automaticEmail->delete()) {
$this->setFlash('success', "Email automatique supprimé");
}

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

protected function findAutomaticEmail($id): AutomaticEmail
{
if (($automaticEmail = $this->getAutomaticEmailModule()->getRepository()->findOneAutomaticEmailById($id)) !== null) {
return $automaticEmail;
} else {
throw new NotFoundHttpException("L'email automatique n'a pas été trouvé.");
}
}
}

+ 21
- 5
backend/controllers/BackendController.php View File

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

/**
* Copyright distrib (2018)
* Copyright Souke (2018)
*
* contact@opendistrib.net
* contact@souke.fr
*
* Ce logiciel est un programme informatique servant à aider les producteurs
* à distribuer leur production en circuits courts.
@@ -39,9 +39,9 @@
namespace backend\controllers;

use common\controllers\CommonController;
use common\logic\PointSale\PointSale\Model\PointSale;
use common\logic\Producer\Producer\Model\Producer;
use common\logic\Product\Product\Model\Product;
use domain\PointSale\PointSale\PointSale;
use domain\Producer\Producer\Producer;
use domain\Product\Product\Product;

class BackendController extends CommonController
{
@@ -81,6 +81,22 @@ class BackendController extends CommonController
{
return $this->redirect(['dashboard/index']);
}

public function redirectAfterSave(string $baseRoute, int $id, string $redirectUrl = null)
{
$postParams = \Yii::$app->request->post();
if(isset($postParams['save-stay'])) {
return $this->redirect([$baseRoute.'/update', 'id' => $id]);
}
else {
if($redirectUrl) {
return $this->redirect($redirectUrl);
}
else {
return $this->redirect(['index']);
}
}
}
}

?>

+ 0
- 131
backend/controllers/CommunicateAdminController.php View File

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

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

namespace backend\controllers;

use backend\models\MailForm;
use common\logic\User\User\Model\User;
use yii\filters\AccessControl;
use yii\filters\VerbFilter;
use yii\web\NotFoundHttpException;

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

public function behaviors()
{
return [
'verbs' => [
'class' => VerbFilter::class,
'actions' => [
'delete' => ['post'],
],
],
'access' => [
'class' => AccessControl::class,
'rules' => [
[
'allow' => true,
'roles' => ['@'],
'matchCallback' => function ($rule, $action) {
return $this->getUserModule()
->getAuthorizationChecker()
->isGrantedAsAdministrator($this->getUserCurrent());
}
]
],
],
];
}

public function actionIndex($section = 'producers')
{
$producerModule = $this->getProducerModule();
$userModule = $this->getUserModule();

if ($section == 'producers') {
$producers = $producerModule->findProducersActive();
$usersArray = [];
$users = [];
foreach ($producers as $producer) {
if (isset($producer->contact) && is_array($producer->contact)) {
foreach ($producer->contact as $contact) {
$usersArray[] = $contact->email;
$users[] = [
'email' => $contact->email,
'name' => $contact->name,
'lastname' => $contact->lastname,
];
}
}
}
} elseif ($section == 'users') {
$users = $userModule->findUsersByStatus(User::STATUS_ACTIVE);
$usersArray = [];
foreach ($users as $user) {
if (isset($user['email']) && strlen($user['email'])) {
$usersArray[] = $user['email'];
}
}
} else {
throw new NotFoundHttpException('Requête incorrecte.');
}

$mailForm = new MailForm();
if ($mailForm->load(\Yii::$app->request->post()) && $mailForm->validate()) {
$resultSendEmail = $mailForm->sendEmail($users, false);
if ($resultSendEmail) {
$this->setFlash('success', 'Votre email a bien été envoyé.');
} else {
$this->setFlash('error', 'Un problème est survenu lors de l\'envoi de votre email.');
}
$mailForm->subject = '';
$mailForm->message = '';
}

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

}

+ 92
- 11
backend/controllers/CommunicateController.php View File

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

/**
* Copyright distrib (2018)
* Copyright Souke (2018)
*
* contact@opendistrib.net
* contact@souke.fr
*
* Ce logiciel est un programme informatique servant à aider les producteurs
* à distribuer leur production en circuits courts.
@@ -38,6 +38,12 @@

namespace backend\controllers;

use backend\models\MailForm;
use common\helpers\GlobalParam;
use domain\Communication\Email\ContactListResolver;
use domain\Communication\Email\Email;
use domain\Communication\Email\EmailGenerator;
use domain\PointSale\PointSale\PointSale;
use kartik\mpdf\Pdf;
use yii\filters\AccessControl;
use yii\filters\VerbFilter;
@@ -73,18 +79,94 @@ class CommunicateController extends BackendController
];
}

/**
* Affiche la page d'accueil de la section avec un aperçu du mode d'emploi
* à imprimer.
*/
public function actionIndex()
public function actionEmail(
$idPointSale = 0,
$sectionSubscribers = 0,
$sectionInactiveUsers = 0,
$usersPointSaleLink = 0,
$usersPointSaleHasOrder = 0,
$idDistribution = 0,
$newsletterType = null
) {
$emailModule = $this->getEmailModule();

$mailForm = new MailForm();
// Sujet et message par défaut
$mailForm->subject = $this->getProducerModule()->getSolver()->getConfig('option_communicate_email_default_subject');
$mailForm->message = $this->getProducerModule()->getSolver()->getConfig('option_communicate_email_default_message');

$pointSale = $idPointSale ? $this->getPointSaleModule()->getRepository()->findOnePointSaleById($idPointSale) : null;
$distribution = $idDistribution ? $this->getDistributionModule()->getRepository()->findOneDistributionById($idDistribution) : null;
if($distribution) {
$mailForm->id_distribution = $distribution->id;
}

$usersArray = $emailModule->getContactListResolver()->search(
$this->getProducerCurrent(),
$newsletterType,
$distribution,
$pointSale,
$usersPointSaleLink,
$usersPointSaleHasOrder,
$sectionSubscribers,
$sectionInactiveUsers
);

if ($mailForm->load(\Yii::$app->request->post()) && $mailForm->validate()) {
if($this->getProducerCurrent()->isDemoAccount()) {
$this->setFlash('error', "Fonctionnalité désactivée sur le compte de démo.");
}
else {
$distribution = $mailForm->id_distribution
? $this->getDistributionModule()->getRepository()->findOneDistributionById($mailForm->id_distribution)
: null;

$email = $emailModule->getGenerator()->createEmail(
$mailForm->subject,
$mailForm->message,
(bool) $mailForm->integrate_product_list,
$this->getProducerCurrent(),
$distribution
);
$emailModule->getBulkMailer()->sendEmail($email, $usersArray);

$this->setFlash('success', 'Votre email a bien été envoyé.');
}

return $this->redirect(['email', 'idPointSale' => $idPointSale]);
}

$pointsSaleArray = PointSale::find()->where(['id_producer' => GlobalParam::getCurrentProducerId(), 'status' => 1])->all();

$incomingDistributionsArray = $this->getDistributionModule()->getRepository()->findDistributionsIncoming();
$incomingDistributionsDatesArray = ['0' => '--'];
foreach ($incomingDistributionsArray as $distribution) {
$incomingDistributionsDatesArray[$distribution->id] = strftime('%A %d %B %Y', strtotime($distribution->date));
}

return $this->render('email', [
'usersArray' => $usersArray,
'pointsSaleArray' => $pointsSaleArray,
'pointSale' => $pointSale,
'mailForm' => $mailForm,
'idPointSaleActive' => $idPointSale,
'idDistributionActive' => $idDistribution,
'incomingDistributionsArray' => $incomingDistributionsArray,
'incomingDistributionsDatesArray' => $incomingDistributionsDatesArray,
'sectionSubscribers' => $sectionSubscribers,
'sectionInactiveUsers' => $sectionInactiveUsers,
'usersPointSaleLink' => $usersPointSaleLink,
'usersPointSaleHasOrder' => $usersPointSaleHasOrder,
'newsletterType' => $newsletterType,
]);
}

public function actionPaper()
{
$producer = $this->getProducerCurrent();
$pointsSaleArray = $this->getPointSaleModule()->findPointSales();

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

@@ -138,5 +220,4 @@ class CommunicateController extends BackendController
// return the pdf output as per the destination setting
return $pdf->render();
}

}

+ 2
- 2
backend/controllers/CreditController.php View File

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

/**
* Copyright distrib (2018)
* Copyright Souke (2018)
*
* contact@opendistrib.net
* contact@souke.fr
*
* Ce logiciel est un programme informatique servant à aider les producteurs
* à distribuer leur production en circuits courts.

+ 15
- 14
backend/controllers/CronController.php View File

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

/**
* Copyright distrib (2018)
* Copyright Souke (2018)
*
* contact@opendistrib.net
* contact@souke.fr
*
* Ce logiciel est un programme informatique servant à aider les producteurs
* à distribuer leur production en circuits courts.
@@ -38,14 +38,15 @@

namespace backend\controllers;

use common\helpers\GlobalParam;
use common\helpers\MeanPayment;
use common\logic\Distribution\Distribution\Service\ExportManager;
use common\logic\Order\Order\Model\Order;
use common\logic\User\User\Model\User;
use domain\Distribution\Distribution\ExportManager;
use domain\Order\Order\Order;
use domain\Order\Order\OrderRepositoryQuery;
use domain\Order\OrderStatus\OrderStatus;
use domain\User\User\User;
use Yii;
use yii\filters\VerbFilter;
use yii\filters\AccessControl;
use yii\filters\VerbFilter;

/**
* UserController implements the CRUD actions for User model.
@@ -150,9 +151,9 @@ class CronController extends BackendController
*/
$arrayOrders = Order::searchAll([
'distribution.date' => $date,
'distribution.id_producer' => $producer->id
'distribution.id_producer' => $producer->id,
], [
'conditions' => 'date_delete IS NULL'
'conditions' => OrderRepositoryQuery::getSqlFilterIsValid()
]);

$configCredit = $producerModule->getConfig('credit');
@@ -177,10 +178,10 @@ class CronController extends BackendController
'distribution.date' => $date,
'distribution.id_producer' => $producer->id
], [
'conditions' => 'date_delete IS NULL'
'conditions' => OrderRepositoryQuery::getSqlFilterIsValid()
]);

$mail = Yii::$app->mailer->compose(
$mail = Yii::$app->mailerService->getMailer()->compose(
[
'html' => '@common/mail/cronOrdersSummary-html',
'text' => '@common/mail/cronOrdersSummary-text',
@@ -189,10 +190,10 @@ class CronController extends BackendController
'orders' => $arrayOrders
]
)
->setFrom([Yii::$app->parameterBag->get('adminEmail') => 'distrib']);
->setFrom([Yii::$app->parameterBag->get('adminEmail') => 'Souke']);

if (is_array($arrayOrders) && count($arrayOrders)) {
$subject = '[Opendistrib] Commandes du ' . date('d/m', strtotime($date));
$subject = '[Souke] Commandes du ' . date('d/m', strtotime($date));

// @TODO : envoyer uniquement les exports qui sont activés dans les paramètres du producteur
$distributionModule->getExportManager()->generate(ExportManager::ORDERS_PDF, $distribution, true);
@@ -201,7 +202,7 @@ class CronController extends BackendController
Yii::getAlias('@app/web/pdf/Commandes-' . $date . '-' . $producer->id . '.pdf')
);
} else {
$subject = '[Opendistrib] Aucune commande';
$subject = '[Souke] Aucune commande';
}

$mail->setSubject($subject);

+ 2
- 2
backend/controllers/DashboardController.php View File

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

/**
* Copyright distrib (2018)
* Copyright Souke (2018)
*
* contact@opendistrib.net
* contact@souke.fr
*
* Ce logiciel est un programme informatique servant à aider les producteurs
* à distribuer leur production en circuits courts.

+ 3
- 5
backend/controllers/DeliveryNoteController.php View File

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

/**
* Copyright distrib (2018)
* Copyright Souke (2018)
*
* contact@opendistrib.net
* contact@souke.fr
*
* Ce logiciel est un programme informatique servant à aider les producteurs
* à distribuer leur production en circuits courts.
@@ -38,10 +38,8 @@

namespace backend\controllers;

use common\logic\Document\DeliveryNote\Model\DeliveryNoteSearch;
use Yii;
use domain\Document\DeliveryNote\DeliveryNoteSearch;
use yii\filters\AccessControl;
use yii\filters\VerbFilter;

class DeliveryNoteController extends DocumentController
{

+ 12
- 4
backend/controllers/DevelopmentController.php View File

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

/**
* Copyright distrib (2018)
* Copyright Souke (2018)
*
* contact@opendistrib.net
* contact@souke.fr
*
* Ce logiciel est un programme informatique servant à aider les producteurs
* à distribuer leur production en circuits courts.
@@ -38,7 +38,7 @@

namespace backend\controllers;

use common\helpers\Opendistrib;
use common\helpers\Souke;
use yii\filters\AccessControl;

/**
@@ -75,7 +75,7 @@ class DevelopmentController extends BackendController
public function actionIndex()
{
$producerModule = $this->getProducerModule();
$versionsArray = Opendistrib::getVersions();
$versionsArray = Souke::getVersions();
$versionsRenderArray = [];
foreach ($versionsArray as $version) {
$versionsRenderArray[$version] = [
@@ -92,4 +92,12 @@ class DevelopmentController extends BackendController
'versionsArray' => $versionsRenderArray
]);
}

public function actionUpdateDisplayMessageNewSoukeVersion(int $displayMessage)
{
$producer = $this->getProducerCurrent();
$producer->option_display_message_new_opendistrib_version = (bool) $displayMessage;
$producer->save();
return $this->redirect('index');
}
}

+ 158
- 43
backend/controllers/DistributionController.php View File

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

/**
* Copyright distrib (2018)
* Copyright Souke (2018)
*
* contact@opendistrib.net
* contact@souke.fr
*
* Ce logiciel est un programme informatique servant à aider les producteurs
* à distribuer leur production en circuits courts.
@@ -42,13 +42,13 @@ use common\helpers\Ajax;
use common\helpers\GlobalParam;
use common\helpers\MeanPayment;
use common\helpers\Price;
use common\logic\Distribution\Distribution\Model\Distribution;
use common\logic\Distribution\Distribution\Service\ExportManager;
use common\logic\Document\DeliveryNote\Model\DeliveryNote;
use common\logic\Order\Order\Model\Order;
use common\logic\Producer\Producer\Model\Producer;
use common\logic\Product\Product\Model\Product;
use domain\Distribution\Distribution\Distribution;
use domain\Document\DeliveryNote\DeliveryNote;
use domain\Feature\Feature\Feature;
use domain\Order\Order\Order;
use domain\Producer\Producer\Producer;
use DateTime;
use domain\Product\Product\Product;
use yii\base\ErrorException;
use yii\base\Exception;
use yii\filters\AccessControl;
@@ -107,7 +107,6 @@ class DistributionController extends BackendController
$distributionModule = $this-> getDistributionModule();
$orderModule = $this->getOrderModule();
$productModule = $this->getProductModule();
$userModule = $this->getUserModule();

$producer = $this->getProducerCurrent();
$dateObject = DateTime::createFromFormat('Y-m-d', $date);
@@ -115,6 +114,7 @@ class DistributionController extends BackendController
$json['means_payment'] = MeanPayment::getAll();
$json['producer'] = $this->buildAjaxInfosResponseProducer($producer);
$json['distributions'] = $this->buildAjaxInfosResponseDistributions($dateObject);
$json['leave_period_dates'] = $this->buildAjaxInfosResponseLeavePeriod($producer);
$json['units'] = Product::$unitsArray;

if ($distributionModule->getSolver()->validateDistributionDate($date)) {
@@ -129,20 +129,48 @@ class DistributionController extends BackendController
$json['points_sale'] = $this->buildAjaxInfosResponsePointsSale($distribution);
$json['delivery_notes'] = $this->buildAjaxInfosResponseDeliveryNotes($date);
$json['order_create'] = $this->buildAjaxInfosResponseOrderCreate($distribution, $productsArray);
$json['users'] = $userModule->findUsers();
$json['users'] = $this->buildAjaxInfosResponseUsers();
$json['one_distribution_week_active'] = $distributionModule->isOneDistributionWeekActive($date);
$json['tiller_is_synchro'] = $this->buildAjaxInfosResponseTiller($producer, $date);
$json['tiller_is_authenticated'] = $this->getOrderModule()->getTillerManager()->isAuthenticated();
$json['tiller_url_authorize_code'] = $this->getOrderModule()->getTillerManager()->getUrlAuthorizeCode();
$json['missing_subscriptions'] = $this->buildAjaxInfosResponseMissingSubscriptions($date, $distribution, $ordersArrayObject);
}

return $json;
}

public function buildAjaxInfosResponseUsers()
{
$usersArray = $this->getUserModule()->getRepository()->findUsers();
foreach($usersArray as $key => $user) {
$usersArray[$key]['username'] = $this->getUserModule()->getSolver()->getUsernameFromArray($user, true);
}
return $usersArray;
}

public function buildAjaxInfosResponseLeavePeriod(Producer $producer)
{
$producerModule = $this->getProducerModule();
$leavePeriodDatesArray = [];
if($producerModule->getSolver()->hasLeavePeriodDefined($producer)) {
$leavePeriodStart = $producerModule->getSolver()->getLeavePeriodStartDateTime($producer);
$leavePeriodEnd = $producerModule->getSolver()->getLeavePeriodEndDateTime($producer);
for($date = $leavePeriodStart; $date <= $leavePeriodEnd; $date->modify('+1 day')) {
$leavePeriodDatesArray[] = $date->format('Y-m-d');
}
}

return $leavePeriodDatesArray;
}

public function buildAjaxInfosResponsePointsSale(Distribution $distribution)
{
$producerModule = $this->getProducerModule();
$pointSaleModule = $this->getPointSaleModule();
$pointSaleDistributionModule = $this->getPointSaleDistributionModule();
$sharedPointSaleModule = $this->getSharedPointSaleModule();
$featureModule = $this->getFeatureModule();

$pointsSaleArray = $pointSaleModule->findPointSalesByDistributionAsArray($distribution);

@@ -162,6 +190,11 @@ class DistributionController extends BackendController
}

$pointSaleArray['credit_functioning'] = $producerModule->getPointSaleCreditFunctioning($pointSale);

$pointSaleArray['producers_sharing_point_sale_as_string'] = false;
if($featureModule->getChecker()->isEnabled(Feature::ALIAS_SHARED_POINT_SALE)) {
$pointSaleArray['producers_sharing_point_sale_as_string'] = $sharedPointSaleModule->getResolver()->getProducersSharingPointSaleAsString($pointSale, $distribution);
}
}

return $pointsSaleArray;
@@ -191,14 +224,19 @@ class DistributionController extends BackendController
}
}

if (!isset($product->productDistribution[0]) || !is_numeric($product->productDistribution[0]->quantity_max)) {
$jsonProduct['quantity_remaining'] = null;
} else {
$jsonProduct['quantity_remaining'] = $product->productDistribution[0]->quantity_max - $quantityOrder;
}
$jsonProduct['quantity_max'] = $orderModule->getResolver()->getProductQuantityMax($product, $distribution);
$jsonProduct['quantity_remaining'] = $orderModule->getResolver()->getProductQuantityRemaining($product, $distribution);

$jsonProduct['quantity_form'] = 0;

$jsonProduct['accessories'] = [];
foreach($product->getProductAccessories() as $productAccessory) {
$jsonProduct['accessories'][] = [
'id_accessory' => $productAccessory->getAccessory()->getId(),
'quantity' => $productAccessory->getQuantity(),
];
}

if ($product->taxRate) {
$jsonProduct['taxRate'] = $product->taxRate->getAttributes();
}
@@ -217,7 +255,8 @@ class DistributionController extends BackendController
return [
'credit' => $producer->credit,
'tiller' => $producer->tiller,
'option_distribution_export_orders_grid_pdf' => $producer->option_distribution_export_orders_grid_pdf
'option_distribution_export_orders_grid_pdf' => $producer->option_distribution_export_orders_grid_pdf,
'feature_product_accessory_enabled' => $this->getFeatureModule()->getChecker()->isEnabled(Feature::ALIAS_PRODUCT_ACCESSORY)
];
}

@@ -255,6 +294,7 @@ class DistributionController extends BackendController

public function buildAjaxInfosResponseDistribution(Distribution $distribution, array $ordersArray, array $productsArray)
{
$producerModule = $this->getProducerModule();
$productModule = $this->getProductModule();
$orderModule = $this->getOrderModule();
$distributionModule = $this-> getDistributionModule();
@@ -264,24 +304,37 @@ class DistributionController extends BackendController
'active' => $distribution->active,
'exports' => $distributionModule->getExportManager()->getAjaxArray($distribution),
'url_order' => $distributionModule->getLinkOrder($distribution),
'is_leave_period' => $producerModule->getSolver()->isOnLeavePeriod($distribution->producer, DateTime::createFromFormat('Y-m-d', $distribution->date))
];

// montant et poids des commandes
$revenues = 0;
$revenuesWithTax = 0;
$weight = 0;
if ($ordersArray) {
foreach ($ordersArray as $order) {
$orderModule->initOrder($order);
if (is_null($order->date_delete)) {
$revenues += $orderModule->getOrderAmountWithTax($order);
if($order->isOrderStatusValid()) {
$revenues += $orderModule->getOrderAmount($order);
$revenuesWithTax += $orderModule->getOrderAmountWithTax($order);
$weight += $order->weight;
}
}
}
$distributionJsonData['revenues'] = Price::format($revenues);
$distributionJsonData['revenues_with_tax'] = Price::format($revenuesWithTax);
$distributionJsonData['weight'] = number_format($weight, 2);
$distributionJsonData['potential_revenues'] = Price::format($productModule->getProductDistributionPotentialRevenues($productsArray));
$distributionJsonData['potential_revenues_with_tax'] = Price::format($productModule->getProductDistributionPotentialRevenues($productsArray, true));
$distributionJsonData['potential_weight'] = number_format($productModule->getProductDistributionPotentialWeight($productsArray), 2);
$distributionJsonData['user_create_href'] = \Yii::$app->urlManager->createUrl([
'user/create',
'redirectUrl' => \Yii::$app->urlManager->createAbsoluteUrl([
'distribution/index',
'date' => $distribution->date,
'displayFormOrderCreate' => 1
])
]);

return $distributionJsonData;
}
@@ -292,6 +345,7 @@ class DistributionController extends BackendController
$orderModule = $this->getOrderModule();
$paymentManager = $this->getPaymentModule();
$productOrderModule = $this->getProductOrderModule();
$userProducerModule = $this->getUserProducerModule();

if ($ordersArray) {
foreach ($ordersArray as &$order) {
@@ -329,17 +383,21 @@ class DistributionController extends BackendController
'mean_payment' => $payment->mean_payment,
'wording_mean_payment' => $paymentManager->getStrMeanPayment($payment),
'date' => date('d/m/Y H:i:s', strtotime($payment->date)),
'user' => $payment->getUserObject() ? $userModule->getUsername($payment->getUserObject()) : '',
'user_action' => $paymentManager->getStrUserAction($payment),
'user' => $payment->getUserObject() ? $userModule->getSolver()->getUsername($payment->getUserObject()) : '',
'user_action' => $userModule->getSolver()->getPaymentUsernameUserAction($payment),
'wording' => $paymentManager->getStrWording($payment, $order),
'amount' => $paymentManager->getAmount($payment, Order::AMOUNT_TOTAL, true),
];
}

$arrayCreditUser = [];
if(isset($order->user)) {
$arrayCreditUser['credit'] = $userModule->getCredit($order->user);
$arrayCreditUser['credit_active'] = $userModule->getCreditActive($order->user);
$arrayDatasUser = [];
if(isset($order->user) && $order->user) {
$arrayDatasUser['credit'] = $userModule->getCredit($order->user);
$arrayDatasUser['credit_active'] = $userModule->getCreditActive($order->user);

$userProducer = $userProducerModule->getRepository()->findOneUserProducer($order->user);
$arrayDatasUser['trust_alert'] = $userProducer->trust_alert;
$arrayDatasUser['trust_alert_comment'] = $userProducer->trust_alert_comment;
}

$oneProductUnactivated = false;
@@ -360,22 +418,27 @@ class DistributionController extends BackendController
'amount_surplus' => Price::numberTwoDecimals($orderModule->getOrderAmount($order, Order::AMOUNT_SURPLUS)),
'user' => (isset($order->user)) ? array_merge(
$order->user->getAttributes(),
$arrayCreditUser
$arrayDatasUser
) : null,
'username_user' => (isset($order->user)) ? $userModule->getSolver()->getUsername($order->user) : '',
'pointSale' => $order->pointSale ? ['id' => $order->pointSale->id, 'name' => $order->pointSale->name] : null,
'productOrder' => $productOrderArray,
'paymentsArray' => $paymentArray,
'oneProductUnactivated' => $oneProductUnactivated,
'isLinkedToValidDocument' => $orderModule->isLinkedToValidDocument($order),
'isLinkedToValidInvoice' => $orderModule->isLinkedToValidInvoice($order),
'isCreditAutoPayment' => $orderModule->isCreditAutoPayment($order),
'isCreditContext' => $orderModule->isCreditContext($order),
'isPaid' => $orderModule->isOrderPaid($order),
'isPaidViaInvoice' => $orderModule->isOrderPaidViaInvoice($order),
'paymentLabelShort' => $orderModule->getPaymentLabelShort($order),
'isCreditFunctioningMandatory' => $orderModule->isOrderCreditFunctioningMandatory($order),
'isCreditFunctioningUser' => $orderModule->isOrderCreditFunctioningUser($order),
'isLinkedToValidDocument' => $orderModule->getSolver()->isLinkedToValidDocument($order),
'isLinkedToValidInvoice' => $orderModule->getSolver()->isLinkedToValidInvoice($order),
'isCreditAutoPayment' => $orderModule->getRepository()->isCreditAutoPayment($order),
'isCreditContext' => $orderModule->getRepository()->isCreditContext($order),
'isPaid' => $orderModule->getRepository()->isOrderPaid($order),
'isPaidViaInvoice' => $orderModule->getRepository()->isOrderPaidViaInvoice($order),
'paymentLabelShort' => $orderModule->getRepository()->getPaymentLabelShort($order),
'isCreditFunctioningMandatory' => $orderModule->getRepository()->isOrderCreditFunctioningMandatory($order),
'isCreditFunctioningUser' => $orderModule->getRepository()->isOrderCreditFunctioningUser($order),
'debitCredit' => false,
'deliveryNote' => $order->deliveryNote ? $order->deliveryNote->getAttributes() : null,
'labelDeleteAction' => $orderModule->getSolver()->getLabelDeleteAction($order),
'labelOrigin' => $orderModule->getSolver()->getLabelOrigin($order, true),
'orderStatusHistorySummaryTitleTag' => $orderModule->getSolver()->getOrderStatusHistorySummaryTitleTag($order, "\n"),
]);
}
}
@@ -449,17 +512,19 @@ class DistributionController extends BackendController
return $missingSubscriptionsArray;
}

public function actionAjaxPointSaleFavorite($idUser)
public function actionAjaxPointSaleFavorite($idUser, $idDistribution)
{
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
$userModule = $this->getUserModule();
$orderModule = $this->getOrderModule();
$distributionModule = $this->getDistributionModule();

$user = $userModule->findOneUserById($idUser);
$distribution = $distributionModule->getRepository()->findOneDistributionById($idDistribution);
$idFavoritePointSale = 0;

if($user) {
$favoritePointSale = $orderModule->getUserFavoritePointSale($user);
$favoritePointSale = $orderModule->getUserFavoritePointSale($user, $distribution);
if ($favoritePointSale) {
$idFavoritePointSale = $favoritePointSale->id;
}
@@ -474,11 +539,14 @@ class DistributionController extends BackendController
$idDistribution,
$idUser = false,
$idPointSale = false,
$idOrder = false
$idOrder = false,
$productOrderFormArray = ''
)
{
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;

$productOrderFormArray = json_decode($productOrderFormArray, true);

$distributionModule = $this-> getDistributionModule();
$orderModule = $this->getOrderModule();
$userModule = $this->getUserModule();
@@ -509,7 +577,7 @@ class DistributionController extends BackendController

if (isset($order->productOrder)) {
foreach ($order->productOrder as $productOrder) {
if ($productOrder->id_product == $product['id']) {
if ($productOrder->id_product == $product->id) {
if ($productOrder->invoice_price) {
$invoicePrice = number_format($productOrder->invoice_price, 5);
} else {
@@ -520,16 +588,30 @@ class DistributionController extends BackendController
}
}

$productOrderArray[$product['id']] = [
// Quantité définie dans le formulaire
if(isset($productOrderFormArray[$product->id]['quantity']) && $productOrderFormArray[$product->id]['quantity']) {
$quantity = $productOrderFormArray[$product->id]['quantity'] / $productModule->getSolver()->getUnitCoefficient($product);
}

$productOrderArray[$product->id] = [
'quantity' => $quantity,
'unit' => $product->unit,
'prices' => $priceArray,
'active' => $product->productDistribution[0]->active
&& (!$pointSale || $productModule->isAvailableOnPointSale($product, $pointSale)),
'invoice_price' => $invoicePrice
'invoice_price' => $invoicePrice,
];
}

// construction de $orderOverride
$orderOverride = $orderModule->getBuilder()->instanciateOrderFromProductOrdersArray($productOrderArray, $order);
foreach($productOrderArray as $idProduct => $productOrder) {
$product = $productModule->getRepository()->findOneProductById($idProduct);
if($product) {
$productOrderArray[$idProduct]['quantity_remaining'] = $orderModule->getResolver()->getProductQuantityRemaining($product, $distribution, $orderOverride);
}
}

return $productOrderArray;
}

@@ -587,10 +669,22 @@ class DistributionController extends BackendController
public function actionAjaxProcessProductQuantityMax($idDistribution, $idProduct, $quantityMax)
{
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
$orderModule = $this->getOrderModule();
$productDistributionModule = $this->getProductDistributionModule();
$productDistribution = $this->getProductDistribution($idProduct, $idDistribution);
$productDistributionModule->updateProductDistributionQuantityMax($productDistribution, (float) $quantityMax);
return ['success'];
return [
'quantity_max' => $orderModule->getResolver()
->getProductQuantityMax(
$productDistribution->product,
$productDistribution->distribution
),
'quantity_remaining' => $orderModule->getResolver()
->getProductQuantityRemaining(
$productDistribution->product,
$productDistribution->distribution
)
];
}

public function actionAjaxProcessActiveProduct(int $idDistribution, int $idProduct, int $active)
@@ -671,8 +765,8 @@ class DistributionController extends BackendController
*/
public function actionAjaxProcessAddSubscriptions(string $date)
{
$ordersArray = $this->getSubscriptionModule()->getOrderManager()
->createAllOrdersFromSubscriptions($date, true);
$ordersArray = $this->getOrderModule()->getManager()
->createAllOrdersFromSubscriptions($date, $this->getUserCurrent(), true);

if($ordersArray && count($ordersArray)) {
return Ajax::responseSuccess('Les abonnements ont bien été importés.');
@@ -690,6 +784,13 @@ class DistributionController extends BackendController
return $this->getOrderModule()->getTillerManager()->synchronizeDistribution($date);
}

public function actionAjaxForceSynchronizeOrderTiller(int $idOrder)
{
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
$order = $this->getOrderModule()->getRepository()->findOneOrderById($idOrder);
return $this->getOrderModule()->getTillerManager()->synchronizeOrder($order, true);
}

public function actionAjaxGenerateDeliveryNotePointSale(string $idOrders)
{
if (strlen($idOrders)) {
@@ -717,6 +818,20 @@ class DistributionController extends BackendController
return Ajax::responseSuccess('Bon de livraison généré');
}

public function actionAjaxSendDeliveryNote(int $idOrder)
{
$orderModule = $this->getOrderModule();
$documentModule = $this->getDocumentModule();
$order = $orderModule->getRepository()->findOneOrderById($idOrder);

if($order->deliveryNote) {
$documentModule->getManager()->sendDocument($order->deliveryNote);
return Ajax::responseSuccess('Bon de livraison envoyé');
}

return Ajax::responseSuccess('Une erreur est survenue lors de l\'envoi du bon de livraison.');
}

public function actionAjaxGenerateDeliveryNoteEachUser(string $idOrders)
{
if (strlen($idOrders)) {

+ 55
- 31
backend/controllers/DocumentController.php View File

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

/**
* Copyright distrib (2018)
* Copyright Souke (2018)
*
* contact@opendistrib.net
* contact@souke.fr
*
* Ce logiciel est un programme informatique servant à aider les producteurs
* à distribuer leur production en circuits courts.
@@ -43,21 +43,22 @@ use common\helpers\CSV;
use common\helpers\GlobalParam;
use common\helpers\MeanPayment;
use common\helpers\Price;
use common\logic\Document\DeliveryNote\Model\DeliveryNote;
use common\logic\Document\Document\Model\Document;
use common\logic\Document\Invoice\Model\Invoice;
use common\logic\Document\Quotation\Model\Quotation;
use common\logic\Order\Order\Model\Order;
use common\logic\Order\ProductOrder\Model\ProductOrder;
use common\logic\Product\Product\Model\Product;
use domain\Document\DeliveryNote\DeliveryNote;
use domain\Document\Document\Document;
use domain\Document\Invoice\Invoice;
use domain\Document\Quotation\Quotation;
use domain\Feature\Feature\Feature;
use domain\Order\Order\Order;
use domain\Order\OrderStatus\OrderStatus;
use domain\Order\ProductOrder\ProductOrder;
use domain\Payment\Payment;
use kartik\mpdf\Pdf;
use yii\base\UserException;
use domain\Product\Product\Product;
use yii;
use yii\filters\VerbFilter;
use yii\base\UserException;
use yii\filters\AccessControl;
use yii\web\NotFoundHttpException;
use yii\helpers\Html;
use common\logic\Payment\Model\Payment;
use yii\web\NotFoundHttpException;

class DocumentController extends BackendController
{
@@ -103,7 +104,7 @@ class DocumentController extends BackendController
$documentModule = $this->getDocumentModule();

$class = $this->getClass();
$class = 'common\\logic\\Document\\'.$class.'\\Model\\'.$class;
$class = 'domain\\Document\\'.$class.'\\'.$class;
$model = new $class();

$documentModule->initTaxCalculationMethod($model);
@@ -153,6 +154,13 @@ class DocumentController extends BackendController
foreach ($model->ordersOnCreate as $key => $idOrder) {
$order = $orderModule->findOneOrderById($idOrder);
$orderModule->updateOrderInvoice($order, $model);
$orderModule->getBuilder()->updateOrderInvoicePrices($order,
[
'user' => $model->user,
'user_producer' => $this->getUserProducerModule()->getRepository()
->findOneUserProducer($model->user),
'point_sale' => $order->pointSale
]);
}
}
}
@@ -183,6 +191,7 @@ class DocumentController extends BackendController
MeanPayment::TRANSFER,
null,
null,
null,
$document
);
$payment->amount = number_format($payment->amount, 2);
@@ -253,6 +262,10 @@ class DocumentController extends BackendController

public function actionExportCsvEvoliz(int $id)
{
if(!$this->getFeatureModule()->getChecker()->isEnabled(Feature::ALIAS_BRIDGE_EVOLIZ)) {
throw new yii\web\UnauthorizedHttpException("Vous n'êtes pas autorisé à effectuer cette action.");
}

$documentModule = $this->getDocumentModule();
$productOrderModule = $this->getProductOrderModule();

@@ -416,7 +429,8 @@ class DocumentController extends BackendController
$documentModule = $this->getDocumentModule();
$orderModule = $this->getOrderModule();
$producerModule = $this->getProducerModule();
$producerCurrent = $this->getProducerCurrent();
$invoiceModule = $this->getInvoiceModule();
$deliveryNoteModule = $this->getDeliveryNoteModule();

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

@@ -441,25 +455,19 @@ class DocumentController extends BackendController
];

if ($classDocument == 'Invoice') {
$options = [
'orderby' => 'distribution.date ASC',
'join_with' => ['user AS user_delivery_note', 'orders', 'producer']
];
$deliveryNotesCreateArray = DeliveryNote::searchAll([
'id_user' => $user->id,
'status' => Document::STATUS_VALID,
'ignore_when_invoicing' => null
], $options);
$deliveryNotesUpdateArray = DeliveryNote::searchAll([
'id_user' => $user->id,
'status' => Document::STATUS_VALID,
'order.id_invoice' => $idDocument,
'ignore_when_invoicing' => null
], $options);
], [
'orderby' => 'distribution.date ASC',
'join_with' => ['user AS user_delivery_note', 'orders', 'producer']
]);
$invoice = $idDocument ? $invoiceModule->getRepository()->findOneInvoiceById($idDocument) : null;
$deliveryNotesUpdateArray = $invoice ? $deliveryNoteModule->getRepository()->findDeliveryNotesByInvoice($invoice) : null;
$json['delivery_note_create_array'] = $this->initDeliveryNoteArray('create', $deliveryNotesCreateArray);
$json['delivery_note_update_array'] = $this->initDeliveryNoteArray('update', $deliveryNotesUpdateArray);


$json['orders_create_array'] = [];
$json['orders_update_array'] = [];
if(!$producerModule->getConfig('option_invoice_only_based_on_delivery_notes')) {
@@ -583,7 +591,7 @@ class DocumentController extends BackendController

if ($document) {
$ordersArray = [];
$productsArray = $productModule->findProducts(false);
$productsArray = $productModule->getRepository()->findProducts(true);

foreach ($document->orders as $order) {
$orderModule->initOrder($order);
@@ -591,6 +599,7 @@ class DocumentController extends BackendController

foreach ($order->productOrder as $productOrder) {
$productsOrderArray[$productOrder->id] = array_merge($productOrder->getAttributes(), [
'url_product' => $this->getUrlManagerBackend()->createUrl(['product/update', 'id' => $productOrder->id_product]),
'url_order' => $this->getUrlManagerBackend()->createUrl(['distribution/index', 'idOrderUpdate' => $productOrder->id_order])
]);
}
@@ -654,8 +663,10 @@ class DocumentController extends BackendController

public function actionAjaxAddProduct($idDocument, $classDocument, $idProduct, $quantity, $price)
{
$orderModule = $this->getOrderModule();
$documentModule = $this->getDocumentModule();
$productModule = $this->getProductModule();
$userCurrent = $this->getUserCurrent();

if ($documentModule->isValidClass($classDocument)) {
$document = $this->findModel($idDocument, $classDocument);
@@ -668,12 +679,13 @@ class DocumentController extends BackendController
$order->id_user = $document->id_user;
$order->id_point_sale = null;
$order->id_distribution = null;
$order->status = 'tmp-order';
$order->origin = Order::ORIGIN_ADMIN;
$order->date = date('Y-m-d H:i:s');
$fieldIdDocument = 'id_' . $classDocumentComplete::tableName();
$order->$fieldIdDocument = $document->id;
$order->save();
$orderModule->getManager()->changeOrderStatus($order, OrderStatus::ALIAS_ORDERED, $userCurrent);

} else {
$order = $document->orders[0];
}
@@ -701,12 +713,10 @@ class DocumentController extends BackendController
public function actionAjaxDeleteProductOrder($idProductOrder)
{
$productOrderModule = $this->getProductOrderModule();

$productOrder = $productOrderModule->findOneProductOrderById($idProductOrder);

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

return Ajax::responseSuccess('Produit supprimé');
}

@@ -771,6 +781,20 @@ class DocumentController extends BackendController
}
}

public function actionAjaxUpdateProductOrderInvoicePrice($idProductOrder, $invoicePrice)
{
$productOrderModule = $this->getProductOrderModule();
$productOrder = $productOrderModule->getRepository()->findOneProductOrderById((int) $idProductOrder);
if($productOrder) {
$productOrderModule->getBuilder()->updateProductOrderInvoicePriceByValue($productOrder, (float) $invoicePrice);
return Ajax::responseSuccess("Prix mis à jour", [
'invoice_price' => $productOrder->invoice_price
]);
}

return Ajax::responseError("Une erreur est survenue.");
}

public function getClass()
{
$class = get_class($this);

+ 0
- 152
backend/controllers/FeatureAdminController.php View File

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

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

namespace backend\controllers;

use common\helpers\Ajax;
use yii\filters\AccessControl;
use yii\helpers\Html;
use yii\web\NotFoundHttpException;

/**
* UserController implements the CRUD actions for User model.
*/
class FeatureAdminController extends BackendController
{
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::class,
'rules' => [
[
'allow' => true,
'roles' => ['@'],
'matchCallback' => function ($rule, $action) {
return $this->getUserModule()
->getAuthorizationChecker()
->isGrantedAsAdministrator($this->getUserCurrent());
}
]
],
],
];
}

public function actionIndex()
{
$featureModule = $this->getFeatureModule();
$dataProviderFeatures = $featureModule->getRepository()->queryDefaultAll()->getDataProvider(100);

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

public function actionAjaxToggleStatus($id, $status)
{
$featureManager = $this->getFeatureModule()->getManager();
$feature = $this->findModel($id);

if($status) {
$featureManager->enableFeature($feature);
$messageResponse = 'La fonctionnalité "'.Html::encode($feature->name).'" a bien été activée';
}
else {
$featureManager->disableFeature($feature);
$messageResponse = 'La fonctionnalité "'.Html::encode($feature->name).'" a bien été désactivée';
}

return Ajax::responseSuccess($messageResponse);
}

public function actionToggleStatusFeatureProducer(int $id, int $status = null)
{
$featureManager = $this->getFeatureModule()->getManager();
$feature = $this->findModel($id);

if(is_null($status)) {
$featureManager->defaultFeatureForProducer($feature);
}
elseif($status == 0) {
$featureManager->disableFeatureForProducer($feature);
}
elseif($status == 1) {
$featureManager->enableFeatureForProducer($feature);
}

return $this->redirectReferer();
}

public function actionUpdate($id)
{
$model = $this->findModel($id);

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

public function actionPosition()
{
$array = \Yii::$app->request->post('array');
$positionArray = json_decode(stripslashes($array));

foreach ($positionArray as $id => $position) {
$feature = $this->findModel($id);
$feature->position = $position;
$feature->save();
}
}

protected function findModel($id)
{
$featureModule = $this->getFeatureModule();
if (($feature = $featureModule->getRepository()->findOneFeatureById($id)) !== null) {
return $feature;
} else {
throw new NotFoundHttpException('La fonctionnalité demandée est introuvable.');
}
}
}

+ 4
- 5
backend/controllers/InvoiceController.php View File

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

/**
* Copyright distrib (2018)
* Copyright Souke (2018)
*
* contact@opendistrib.net
* contact@souke.fr
*
* Ce logiciel est un programme informatique servant à aider les producteurs
* à distribuer leur production en circuits courts.
@@ -39,8 +39,7 @@
namespace backend\controllers;

use common\helpers\Ajax;
use common\logic\Document\Invoice\Model\InvoiceSearch;
use common\logic\Order\Order\Model\Order;
use domain\Document\Invoice\InvoiceSearch;

class InvoiceController extends DocumentController
{
@@ -61,7 +60,7 @@ class InvoiceController extends DocumentController
public function actionAjaxDeleteDeliveryNote($idInvoice, $idDeliveryNote)
{
$orderModule = $this->getOrderModule();
$invoiceModule = $this-> getInvoiceModule();
$invoiceModule = $this-> getInvoiceModule();
$deliveryNoteModule = $this->getDeliveryNoteModule();
$invoice = $invoiceModule->findOneInvoiceById($idInvoice);
$deliveryNote = $deliveryNoteModule->findOneDeliveryNoteById($idDeliveryNote);

+ 30
- 26
backend/controllers/OrderController.php View File

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

/**
* Copyright distrib (2018)
* Copyright Souke (2018)
*
* contact@opendistrib.net
* contact@souke.fr
*
* Ce logiciel est un programme informatique servant à aider les producteurs
* à distribuer leur production en circuits courts.
@@ -42,16 +42,17 @@ use common\forms\SubscriptionForm;
use common\helpers\CSV;
use common\helpers\GlobalParam;
use common\helpers\Price;
use common\logic\Distribution\Distribution\Model\Distribution;
use common\logic\Distribution\PointSaleDistribution\Model\PointSaleDistribution;
use common\logic\Distribution\ProductDistribution\Model\ProductDistribution;
use common\logic\Order\Order\Model\Order;
use common\logic\Order\ProductOrder\Model\ProductOrder;
use common\logic\PointSale\PointSale\Model\PointSale;
use common\logic\Product\Product\Model\Product;
use common\logic\Payment\Model\Payment;
use common\logic\User\User\Model\User;
use common\logic\User\UserProducer\Model\UserProducer;
use domain\Distribution\Distribution\Distribution;
use domain\Distribution\PointSaleDistribution\PointSaleDistribution;
use domain\Distribution\ProductDistribution\ProductDistribution;
use domain\Order\Order\Order;
use domain\Order\OrderStatus\OrderStatus;
use domain\Order\ProductOrder\ProductOrder;
use domain\Payment\Payment;
use domain\PointSale\PointSale\PointSale;
use domain\Product\Product\Product;
use domain\User\User\User;
use domain\User\UserProducer\UserProducer;
use yii\filters\AccessControl;
use yii\helpers\Html;

@@ -82,7 +83,7 @@ class OrderController extends BackendController
/**
* Traite le formulaire d'ajout/modification de commande.
*/
public function processOrderForm(
/*public function processOrderForm(
Distribution $distribution,
string $date,
array $pointsSale,
@@ -163,12 +164,12 @@ class OrderController extends BackendController
}
}
}
}
}*/

/**
* Page principale de la gestion des commandes.
*/
public function actionIndex($date = '', $returnData = false)
/*public function actionIndex($date = '', $returnData = false)
{
$distributionModule = $this-> getDistributionModule();
$productModule = $this->getProductModule();
@@ -406,7 +407,7 @@ class OrderController extends BackendController
} else {
return $this->render('index', $datas);
}
}
}*/

/**
* Génère un fichier d'export des commandes au format CSV.
@@ -735,7 +736,7 @@ class OrderController extends BackendController

$order = $orderModule->findOneOrderById($idOrder);
if ($order) {
$orderModule->deleteOrder($order);
$orderModule->getManager()->deleteOrder($order, $this->getUserCurrent());
}

return ['success'];
@@ -750,7 +751,7 @@ class OrderController extends BackendController
$orderModule = $this->getOrderModule();
$order = $orderModule->findOneOrderById($idOrder);
if ($order) {
$orderModule->deleteOrder($order);
$orderModule->getManager()->deleteOrder($order, $this->getUserCurrent());
}

$this->redirect(['index', 'date' => $date]);
@@ -784,6 +785,7 @@ class OrderController extends BackendController
$pointSale = $pointSaleModule->findOnePointSaleById($idPointSale);
$distribution = $distributionModule->findOneDistribution($date);
$producerCurrent = $this->getProducerCurrent();
$userCurrent = $this->getUserCurrent();

if (preg_match("/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/", $date)
&& ($idUser || strlen($username))
@@ -798,7 +800,6 @@ class OrderController extends BackendController
$order->id_distribution = $distribution->id;
$order->origin = Order::ORIGIN_ADMIN;
$order->comment = $comment;
$order->status = 'tmp-order';

if ($idUser) {
$order->id_user = $idUser;
@@ -816,6 +817,8 @@ class OrderController extends BackendController

$order->save();

$orderModule->getManager()->changeOrderStatus($order, OrderStatus::ALIAS_ORDERED, $userCurrent);

$user = false;
$userProducer = false;
if (isset($order->user) && $order->user) {
@@ -996,12 +999,13 @@ class OrderController extends BackendController
}

$order->id_point_sale = $idPointSale;
$order->date_update = date('Y-m-d H:i:s');
$order->mean_payment = $meanPayment;
$order->comment = $comment;

$order->save();

$orderModule->getManager()->changeOrderStatus($order, OrderStatus::ALIAS_UPDATED, $this->getUserCurrent());

$order = Order::searchOne(['id' => $order->id]);
$orderModule->initOrder($order);
if ($order && $orderModule->isCreditAutoPayment($order, $debitCredit)) {
@@ -1011,7 +1015,7 @@ class OrderController extends BackendController
}

/**
* Retourne l'état du paiement (historique, crédit) d'une commande donnée.
* Retourne l'état du paiement (historique, cagnotte) d'une commande donnée.
*/
public function actionPaymentStatus(int $idOrder)
{
@@ -1035,19 +1039,19 @@ class OrderController extends BackendController

if (abs($order->amount - $amountPaid) < 0.0001) {
$html .= '<span class="label label-success">Payé</span>';
$buttonsCredit = Html::a('Recréditer ' . $orderModule->getOrderAmountWithTax($order, Order::AMOUNT_TOTAL, true), 'javascript:void(0);', ['class' => 'btn btn-default btn-xs rembourser', 'data-montant' => $order->amount, 'data-type' => 'refund']);
$buttonsCredit = Html::a('Rembourser ' . $orderModule->getOrderAmountWithTax($order, Order::AMOUNT_TOTAL, true), 'javascript:void(0);', ['class' => 'btn btn-default btn-xs rembourser', 'data-montant' => $order->amount, 'data-type' => 'refund']);
} elseif ($order->amount > $amountPaid) {
$amountToPay = $order->amount - $amountPaid;
$html .= '<span class="label label-danger">Non payé</span> reste <strong>' . number_format($amountToPay, 2) . ' €</strong> à débiter';
$buttonsCredit = Html::a('Débiter ' . number_format($amountToPay, 2) . ' €', 'javascript:void(0);', ['class' => 'btn btn-default btn-xs payer', 'data-montant' => $amountToPay, 'data-type' => 'payment']);
} elseif ($order->amount < $amountPaid) {
$amountToRefund = $amountPaid - $order->amount;
$html .= ' <span class="label label-success">Payé</span> <strong>' . number_format($amountToRefund, 2) . ' €</strong> à recréditer';
$buttonsCredit = Html::a('Recréditer ' . number_format($amountToRefund, 2) . ' €', 'javascript:void(0);', ['class' => 'btn btn-default btn-xs rembourser', 'data-montant' => $amountToRefund, 'data-type' => 'refund']);
$html .= ' <span class="label label-success">Payé</span> <strong>' . number_format($amountToRefund, 2) . ' €</strong> à rembourser';
$buttonsCredit = Html::a('Rembourser ' . number_format($amountToRefund, 2) . ' €', 'javascript:void(0);', ['class' => 'btn btn-default btn-xs rembourser', 'data-montant' => $amountToRefund, 'data-type' => 'refund']);
}

$html .= '<span class="buttons-credit">'
. 'Crédit : <strong>' . number_format($userProducer->credit, 2) . ' €</strong><br />'
. 'Cagnotte : <strong>' . number_format($userProducer->credit, 2) . ' €</strong><br />'
. $buttonsCredit
. '</span>';

@@ -1065,7 +1069,7 @@ class OrderController extends BackendController
foreach ($history as $creditHistory) {
$html .= '<tr>'
. '<td>' . date('d/m/Y H:i:s', strtotime($paymentManager->getDate($creditHistory))) . '</td>'
. '<td>' . Html::encode($paymentManager->getStrUserAction($creditHistory)) . '</td>'
. '<td>' . Html::encode($this->getUserModule()->getSolver()->getPaymentUsernameUserAction($creditHistory)) . '</td>'
. '<td>' . $paymentManager->getStrWording($creditHistory) . '</td>'
. '<td>' . ($paymentManager->isTypeDebit($creditHistory) ? '- ' . Price::getPriceWithTax($creditHistory->amount) : '') . '</td>'
. '<td>' . ($paymentManager->isTypeCredit($creditHistory) ? '+ ' . Price::getPriceWithTax($creditHistory->amount) : '') . '</td>'

+ 37
- 24
backend/controllers/PointSaleController.php View File

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

/**
* Copyright distrib (2018)
* Copyright Souke (2018)
*
* contact@opendistrib.net
* contact@souke.fr
*
* Ce logiciel est un programme informatique servant à aider les producteurs
* à distribuer leur production en circuits courts.
@@ -39,16 +39,16 @@
namespace backend\controllers;

use common\helpers\GlobalParam;
use common\logic\Distribution\PointSaleDistribution\Model\PointSaleDistribution;
use common\logic\Order\Order\Model\Order;
use common\logic\PointSale\PointSale\Model\PointSale;
use common\logic\PointSale\PointSale\Model\PointSaleSearch;
use common\logic\PointSale\UserPointSale\Model\UserPointSale;
use Yii;
use domain\Distribution\PointSaleDistribution\PointSaleDistribution;
use domain\Order\Order\Order;
use domain\Order\Order\OrderRepositoryQuery;
use domain\Order\OrderStatus\OrderStatus;
use domain\PointSale\PointSale\PointSale;
use domain\PointSale\PointSale\PointSaleSearch;
use domain\PointSale\UserPointSale\UserPointSale;
use yii\filters\AccessControl;
use yii\web\NotFoundHttpException;
use yii\filters\VerbFilter;
use yii\helpers\Html;
use yii\web\NotFoundHttpException;

class PointSaleController extends BackendController
{
@@ -101,9 +101,11 @@ class PointSaleController extends BackendController
if ($pointSale->load(\Yii::$app->request->post()) && $pointSale->save()) {
$pointSaleModule->updatePointSalePointProduction($pointSale);
$pointSaleModule->processRestrictedAccess($pointSale);
$this->initPaymentMethodsByCreditFunctioning($pointSale);
$distributionModule->addPointSaleIncomingDistributions($pointSale);

return $this->redirect(['index']);
$this->setFlash('success', 'Point de vente créé.');
return $this->redirectAfterSave('point-sale', $pointSale->id);
} else {
return $this->render('create', array_merge($this->initForm(), [
'model' => $pointSale,
@@ -118,11 +120,7 @@ class PointSaleController extends BackendController
{
$distributionModule = $this-> getDistributionModule();
$pointSaleModule = $this->getPointSaleModule();

$model = PointSale::find()
->with('userPointSale')
->where(['id' => $id])
->one();
$model = $this->findModel($id);

foreach ($model->userPointSale as $userPointSale) {
$model->users[] = $userPointSale->id_user;
@@ -133,11 +131,11 @@ class PointSaleController extends BackendController

$pointSaleModule->updatePointSalePointProduction($model);
$pointSaleModule->processRestrictedAccess($model);
$this->initPaymentMethodsByCreditFunctioning($model);
$distributionModule->addPointSaleIncomingDistributions($model);

$this->setFlash('success', 'Point de vente modifié.');

return $this->redirect(['index']);
return $this->redirectAfterSave('point-sale', $model->id);
} else {
return $this->render('update', array_merge($this->initForm($id), [
'model' => $model,
@@ -145,6 +143,13 @@ class PointSaleController extends BackendController
}
}

public function initPaymentMethodsByCreditFunctioning(PointSale $pointSale)
{
if($this->getPointSaleModule()->getBuilder()->initPaymentMethodsByCreditFunctioning($pointSale)) {
$this->addFlash('info', 'Le paiement sur place a été ajusté par rapport au fonctionnement de la cagnotte.');
}
}

/**
* Initialise le formulaire de création/modification.
*/
@@ -191,14 +196,17 @@ class PointSaleController extends BackendController
'id_point_sale' => $id,
],
[
'conditions' => 'date_delete IS NULL AND distribution.date > :today',
'conditions' => [
'distribution.date > :today',
OrderRepositoryQuery::getSqlFilterIsValid()
],
'params' => [':today' => date('Y-m-d')]
]
);

if ($ordersArray) {
foreach ($ordersArray as $order) {
$orderModule->deleteOrder($order, true);
$orderModule->getManager()->deleteOrder($order, $this->getUserCurrent(), true);
}
}

@@ -240,10 +248,15 @@ class PointSaleController extends BackendController
*/
protected function findModel(int $id)
{
if (($model = PointSale::findOne($id)) !== null) {
return $model;
} else {
throw new NotFoundHttpException('The requested page does not exist.');
$model = PointSale::find()
->with('userPointSale')
->where(['id' => $id])
->one();

if(!$model || $model->id_producer != $this->getProducerCurrent()->id) {
throw new NotFoundHttpException('Le point de vente demandé est introuvable.');
}

return $model;
}
}

+ 0
- 267
backend/controllers/ProducerAdminController.php View File

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

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

namespace backend\controllers;

use common\helpers\Ajax;
use common\helpers\Alwaysdata;
use common\logic\Order\Order\Model\Order;
use common\logic\Producer\Producer\Model\Producer;
use common\logic\Product\Product\Model\Product;
use Yii;
use yii\helpers\Html;
use yii\web\NotFoundHttpException;
use yii\filters\VerbFilter;
use yii\filters\AccessControl;
use yii\data\ActiveDataProvider;

class ProducerAdminController extends BackendController
{
public function behaviors()
{
return [
'verbs' => [
'class' => VerbFilter::class,
'actions' => [
'delete' => ['post'],
],
],
'access' => [
'class' => AccessControl::class,
'rules' => [
[
'allow' => true,
'roles' => ['@'],
'matchCallback' => function ($rule, $action) {
return $this->getUserModule()
->getAuthorizationChecker()
->isGrantedAsAdministrator($this->getUserCurrent());
}
]
],
],
];
}

/**
* Liste les producteurs.
*
* @return mixed
*/
public function actionIndex()
{
$producerModule = $this->getProducerModule();

$dataProviderProducer = new ActiveDataProvider([
'query' => Producer::find()
->with('userProducer', 'user')
->orderBy('active DESC, free_price DESC'),
'pagination' => [
'pageSize' => 1000,
],
]);

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

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

/**
* Crée un producteur.
*/
public function actionCreate()
{
$producerModule = $this->getProducerModule();
$producer = $producerModule->instanciateProducer();

if ($producer->load(\Yii::$app->request->post()) && $producerModule->saveCreate($producer)) {
$this->setFlash('success', 'Producteur créé.');
return $this->redirect(['index']);
} else {
return $this->render('create', [
'model' => $producer,
]);
}
}

/**
* Modification d'un producteur.
*/
public function actionUpdate(int $id)
{
$producerModule = $this->getProducerModule();
$producer = $this->findProducer($id);

if ($producer->load(\Yii::$app->request->post()) && $producerModule->saveCreate($producer)) {
$this->setFlash('success', 'Producteur modifié.');
return $this->redirect(['index']);
} else {
return $this->render('update', [
'model' => $producer,
]);
}
}

/**
* Facturation producteur.
*/
public function actionBilling(int $id)
{
$producer = $this->findProducer($id);

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

public function actionAlwaysdata(int $id)
{
$producer = $this->findProducer($id);

if($producer->contact_email) {
Yii::$app->alwaysdataClient->initRedirections($producer);
return Ajax::responseSuccess('Redirections initialisées chez Alwaysdata');
}
else {
return Ajax::responseError("L'adresse email de contact du producteur n'est pas définie");
}
}

public function actionDolibarr(int $id)
{
$producerModule = $this->getProducerModule();
$producer = $this->findProducer($id);
if($producer->dolibarr_socid) {
$producerModule->generateDolibarrProducerInvoice($producer);
return Ajax::responseSuccess("Facture générée sur Dolibarr pour le producteur \"".Html::encode($producer->name)."\"");
}
else {
return Ajax::responseError("Dolibarr : l'id user du producteur doit être défini");
}
}

public function actionUserTransfer($fromProducerId, $toProducerId, $withOrders = 1)
{
$producerModule = $this->getProducerModule();
$userModule = $this->getUserModule();

$fromProducerId = (int)$fromProducerId;
$toProducerId = (int)$toProducerId;
$count = 0;
$usersArray = $userModule->queryUsersBy(['id_producer' => $fromProducerId])->all();

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

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

if (($withOrders && $countOrders) || !$withOrders) {
$producerModule->addUser(
$userModule->findOneUserById($idUser),
$producerModule->findOneProducerById($toProducerId)
);
$count++;
}
}

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

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

public function actionProducerInstallTaxUpdatePrices($idProducer)
{
$productsArray = Product::searchAll([
'id_producer' => $idProducer
]);

$connection = Yii::$app->getDb();

foreach ($productsArray as $product) {
$product->price = round($product->price / (1 + $product->taxRate->value), 2);
$product->save();

$command = $connection->createCommand("
UPDATE `product_order`
SET price = ROUND(price / (1 + :tax_value), 2),
id_tax_rate = :id_tax_rate
WHERE id_product = :id_product",
[
':id_product' => $product->id,
':tax_value' => $product->taxRate->value,
':id_tax_rate' => $product->taxRate->id,
]);

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

echo 'ok';
}

/**
* Recherche un producteur.
*/
protected function findProducer(int $id)
{
$producerModule = $this->getProducerModule();

if (($model = $producerModule->findOneProducerById($id)) !== null) {
return $model;
} else {
throw new NotFoundHttpException('Producteur introuvable.');
}
}

}

+ 14
- 10
backend/controllers/ProducerController.php View File

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

/**
* Copyright distrib (2018)
* Copyright Souke (2018)
*
* contact@opendistrib.net
* contact@souke.fr
*
* Ce logiciel est un programme informatique servant à aider les producteurs
* à distribuer leur production en circuits courts.
@@ -39,14 +39,13 @@
namespace backend\controllers;

use common\helpers\GlobalParam;
use common\logic\Producer\Producer\Model\Producer;
use common\logic\Producer\ProducerPriceRange\Model\ProducerPriceRange;
use domain\Producer\ProducerPriceRange\ProducerPriceRange;
use domain\Producer\Producer\Producer;
use Yii;
use yii\data\ActiveDataProvider;
use yii\web\NotFoundHttpException;
use yii\filters\VerbFilter;
use yii\filters\AccessControl;
use common\helpers\Upload;
use yii\filters\VerbFilter;
use yii\web\NotFoundHttpException;
use yii\web\UploadedFile;

/**
@@ -95,7 +94,7 @@ class ProducerController extends BackendController
$logoFilenameOld = $model->logo;
$photoFilenameOld = $model->photo;
$documentImageBottomFilenameOld = $model->document_image_bottom;
$producerBuilder->initOptionDashboardDatesDisplay($model);
$producerBuilder->initOptionsDatesDisplay($model);

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

@@ -105,10 +104,10 @@ class ProducerController extends BackendController

if($model->validate()) {

$producerBuilder->initOptionsDatesBeforeSave($model);
$producerBuilder->processUploadImage($model, 'logo', $logoFilenameOld, $request->post('delete_logo', 0));
$producerBuilder->processUploadImage($model, 'photo', $photoFilenameOld, $request->post('delete_photo', 0));
$producerBuilder->processUploadImage($model, 'document_image_bottom', $documentImageBottomFilenameOld, $request->post('delete_document_image_bottom', 0));
$producerBuilder->initOptionDashboardDatesBeforeSave($model);
$producerBuilder->savePrivateKeysStripe($model);
$model->save();

@@ -178,6 +177,12 @@ class ProducerController extends BackendController
return $this->redirect(\Yii::$app->request->referrer);
}

public function actionUpdateAlertMessageReadAt()
{
$this->getProducerModule()->getManager()->readAlertMessage($this->getProducerCurrent());
return $this->redirect(\Yii::$app->request->referrer);
}

public function actionPagesize()
{
$producerCurrent = $this->getProducerCurrent();
@@ -194,5 +199,4 @@ class ProducerController extends BackendController
$referer = strtok(Yii::$app->request->referrer, "?");
return $this->redirect($referer);
}

}

+ 1
- 0
backend/controllers/ProducerInvoiceController.php View File

@@ -31,6 +31,7 @@ class ProducerInvoiceController extends BackendController
public function actionIndex()
{
return $this->render('index', [
'producer' => $this->getProducerCurrent(),
'invoicesArray' => $this->getProducerModule()
->getDolibarrUtils()
->getDolibarrProducerInvoices($this->getProducerCurrent())

+ 5
- 7
backend/controllers/ProducerPriceRangeAdminController.php View File

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

/**
* Copyright distrib (2018)
* Copyright Souke (2018)
*
* contact@opendistrib.net
* contact@souke.fr
*
* Ce logiciel est un programme informatique servant à aider les producteurs
* à distribuer leur production en circuits courts.
@@ -38,12 +38,10 @@

namespace backend\controllers;

use common\logic\Producer\ProducerPriceRange\Model\ProducerPriceRange;
use Yii;
use yii\web\NotFoundHttpException;
use yii\filters\VerbFilter;
use yii\filters\AccessControl;
use domain\Producer\ProducerPriceRange\ProducerPriceRange;
use yii\data\ActiveDataProvider;
use yii\filters\AccessControl;
use yii\web\NotFoundHttpException;

/**
* ProducerPriceRangeAdminController implements the CRUD actions for ProducerPriceRange model.

+ 5
- 6
backend/controllers/ProductCategoryController.php View File

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

/**
* Copyright distrib (2018)
* Copyright Souke (2018)
*
* contact@opendistrib.net
* contact@souke.fr
*
* Ce logiciel est un programme informatique servant à aider les producteurs
* à distribuer leur production en circuits courts.
@@ -39,13 +39,12 @@
namespace backend\controllers;

use common\helpers\GlobalParam;
use common\logic\Product\Product\Model\Product;
use common\logic\Product\ProductCategory\Model\ProductCategorySearch;
use domain\Product\Product\Product;
use domain\Product\ProductCategory\ProductCategorySearch;
use Yii;
use yii\filters\AccessControl;
use yii\web\NotFoundHttpException;
use yii\filters\VerbFilter;
use yii\helpers\Html;
use yii\web\NotFoundHttpException;

/**
* ProductCategoryController implements the CRUD actions for ProductCategory model.

+ 24
- 16
backend/controllers/ProductController.php View File

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

/**
* Copyright distrib (2018)
* Copyright Souke (2018)
*
* contact@opendistrib.net
* contact@souke.fr
*
* Ce logiciel est un programme informatique servant à aider les producteurs
* à distribuer leur production en circuits courts.
@@ -41,19 +41,19 @@ namespace backend\controllers;
use backend\forms\ProductPriceUploadForm;
use common\helpers\CSV;
use common\helpers\GlobalParam;
use common\logic\Feature\Feature\Feature;
use common\logic\PointSale\PointSale\Model\PointSale;
use common\logic\Product\Product\Model\Product;
use common\logic\Product\Product\Model\ProductSearch;
use common\logic\Product\ProductPointSale\Model\ProductPointSale;
use common\logic\Product\ProductPrice\Model\ProductPrice;
use common\logic\Product\ProductPrice\Model\ProductPriceSearch;
use common\logic\User\UserProducer\Model\UserProducer;
use common\helpers\Upload;
use domain\Feature\Feature\Feature;
use domain\PointSale\PointSale\PointSale;
use domain\Product\Product\Product;
use domain\Product\Product\ProductSearch;
use domain\Product\ProductPointSale\ProductPointSale;
use domain\Product\ProductPrice\Model\ProductPrice;
use domain\Product\ProductPrice\Model\ProductPriceSearch;
use domain\User\UserProducer\UserProducer;
use Yii;
use yii\filters\AccessControl;
use yii\helpers\Html;
use yii\web\NotFoundHttpException;
use common\helpers\Upload;
use yii\web\UploadedFile;

/**
@@ -140,7 +140,7 @@ class ProductController extends BackendController

$this->setFlash('success', 'Produit <strong>' . Html::encode($model->name) . '</strong> ajouté');

return $this->redirect(['index']);
return $this->redirectAfterSave('product', $model->id);
}
}

@@ -156,6 +156,7 @@ class ProductController extends BackendController
{
$productModule = $this->getProductModule();
$distributionModule = $this-> getDistributionModule();
$subscriptionModule = $this->getSubscriptionModule();

$request = Yii::$app->request;
$model = $this->findModel($id);
@@ -182,16 +183,23 @@ class ProductController extends BackendController
}

$this->processAvailabilityPointsSale($model);
$productModule->getBuilder()->update($model);

if ($model->apply_distributions) {
$distributionModule->addProductIncomingDistributions($model);
}
$productModule->update($model);

$this->setFlash('success', 'Produit <strong>' . Html::encode($model->name) . '</strong> modifié');
return $this->redirect(['index']);

return $this->redirectAfterSave('product', $model->id);
}
}

$subscriptionsWithProductArray = $subscriptionModule->getRepository()->findSubscriptionsWithProduct($model);
if(!$model->is_available_for_subscriptions && count($subscriptionsWithProductArray)) {
$this->addFlash('warning', 'Attention, le produit est encore présent dans les abonnements suivants : '.$subscriptionModule->getSolver()->getSubscriptionsListAsHtml($subscriptionsWithProductArray));
}

return $this->render('update/update', [
'model' => $model,
'action' => 'update',
@@ -343,7 +351,7 @@ class ProductController extends BackendController
$orderArray = json_decode(stripslashes($array));

foreach ($orderArray as $id => $order) {
$product = $this->findModel($id);
$product = $this->findModel((int) $id);
$product->order = $order;
$product->save();
}
@@ -359,7 +367,7 @@ class ProductController extends BackendController
$product->status = (int) $status;
$product->save();

$distributionModule->addProductIncomingDistributions($product);
$distributionModule->getBuilder()->addProductIncomingDistributions($product);

return ['success', 'id' => $id, 'status' => $status];
}

+ 4
- 4
backend/controllers/QuotationController.php View File

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

/**
* Copyright distrib (2018)
* Copyright Souke (2018)
*
* contact@opendistrib.net
* contact@souke.fr
*
* Ce logiciel est un programme informatique servant à aider les producteurs
* à distribuer leur production en circuits courts.
@@ -39,8 +39,8 @@
namespace backend\controllers;

use common\helpers\GlobalParam;
use common\logic\Document\Quotation\Model\QuotationSearch;
use common\logic\Order\Order\Model\Order;
use domain\Document\Quotation\QuotationSearch;
use domain\Order\Order\Order;
use yii\base\UserException;
use yii\filters\AccessControl;
use yii\helpers\Html;

+ 127
- 10
backend/controllers/ReportController.php View File

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

/**
* Copyright distrib (2018)
* Copyright Souke (2018)
*
* contact@opendistrib.net
* contact@souke.fr
*
* Ce logiciel est un programme informatique servant à aider les producteurs
* à distribuer leur production en circuits courts.
@@ -38,8 +38,13 @@

namespace backend\controllers;

use common\helpers\CSV;
use common\helpers\GlobalParam;
use common\helpers\MeanPayment;
use common\helpers\Price;
use domain\Order\Order\OrderRepositoryQuery;
use domain\Order\OrderStatus\OrderStatus;
use backend\forms\ReportPaymentsForm;
use Yii;
use yii\filters\AccessControl;

@@ -82,6 +87,9 @@ class ReportController extends BackendController
$distributionModule = $this-> getDistributionModule();

$usersArray = $userModule->findUsers();
foreach($usersArray as $key => $user) {
$usersArray[$key]['username'] = $userModule->getSolver()->getUsernameFromArray($user, true);
}
$pointsSaleArray = $pointSaleModule->findPointSales();
$firstDistribution = $distributionModule->findOneFirstDistribution();
$lastDistribution = $distributionModule->findOneLastDistribution();
@@ -94,7 +102,7 @@ class ReportController extends BackendController
}

$distributionsByMonthArray = [];
$distributionsArray = $distributionModule->findDistributionsActive();
$distributionsArray = $distributionModule->findDistributionsWithOrders();
foreach ($distributionsArray as $distribution) {
$month = date('Y-m', strtotime($distribution->date));
if (!isset($distributionsByMonthArray[$month])) {
@@ -119,9 +127,8 @@ class ReportController extends BackendController

public function actionAjaxReport()
{
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;

$posts = Yii::$app->request->post();
$isDownload = $posts['isDownload'] == 1;
$resArray = [];
$conditionUsers = $this->_generateConditionSqlReport($posts, 'users', 'id_user');
$conditionPointsSale = $this->_generateConditionSqlReport($posts, 'pointsSale', 'id_point_sale');
@@ -132,7 +139,7 @@ class ReportController extends BackendController
WHERE `order`.id = product_order.id_order
AND product.id_producer = " . ((int)GlobalParam::getCurrentProducerId()) . "
AND product_order.id_product = product.id
AND `order`.date_delete IS NULL
AND ".OrderRepositoryQuery::getSqlFilterIsValid()."
" . $conditionUsers . "
" . $conditionPointsSale . "
" . $conditionDistributions . "
@@ -143,24 +150,40 @@ class ReportController extends BackendController

$totalGlobal = 0;
foreach ($res as $line) {
$total = Price::format(round($line['total'], 2));
$roundedTotal = round($line['total'], 2);
$total = $isDownload ? $roundedTotal : Price::format($roundedTotal);

$quantity = $line['quantity'];
if((int) $quantity != $quantity) {
$quantity = round($quantity, 3);
}

if ($line['quantity'] > 0) {
$resArray[] = [
'name' => $line['name'],
'quantity' => $line['quantity'],
'quantity' => $quantity,
'total' => $total,
];
$totalGlobal += $line['total'];
}
}

$roundedTotalGlobal = round($totalGlobal, 2);
$totalGlobalFormat = $isDownload ? $roundedTotalGlobal : Price::format($roundedTotalGlobal).' HT';

$resArray[] = [
'name' => '',
'quantity' => '',
'total' => '<strong>' . Price::format(round($totalGlobal, 2)) . '</strong>',
'total' => $totalGlobalFormat,
];

return $resArray;
if($isDownload) {
CSV::send('rapport.csv', $resArray);
}
else {
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
return $resArray;
}
}

public function _generateConditionSqlReport($posts, $name, $fieldOrder)
@@ -176,4 +199,98 @@ class ReportController extends BackendController
return $condition;
}

public function actionPayments()
{
$dateStart = $dateEnd = null;
$reportPaymentsForm = new ReportPaymentsForm();
if($reportPaymentsForm->load(Yii::$app->request->post()) && $reportPaymentsForm->validate()) {
$dateStart = date('Y-m-d', strtotime(str_replace('/', '-', $reportPaymentsForm->date_start)));
$dateEnd = date('Y-m-d', strtotime(str_replace('/', '-', $reportPaymentsForm->date_end)));
}

if($dateStart && $dateEnd) {
$orderModule = $this->getOrderModule();
$ordersArray = $orderModule->getRepository()
->findOrdersByPeriod(
new \DateTime($dateStart),
new \DateTime($dateEnd)
);

$datas = [
[
'Date',
'Client',
'Montant',
'Facture',
'Crédit',
'Espèce',
'Chèque',
'Virement',
'Carte bancaire',
'Total'
]
];

$sumAmountTotalSpentByCredit = 0;
$sumAmountTotalSpentByMoney = 0;
$sumAmountTotalSpentByCheque = 0;
$sumAmountTotalSpentByTransfer = 0;
$sumAmountTotalSpentByCreditCard = 0;

foreach($ordersArray as $order) {
$orderModule->getBuilder()->initOrder($order);

$hasInvoice = false;
$referenceInvoice = 'Non';
if($order->invoice) {
$hasInvoice = true;
$referenceInvoice = $order->invoice->reference."";
}

$amountTotalSpentByCredit = $orderModule->getSolver()->getAmountTotalSpentByMeanPayment($order, MeanPayment::CREDIT);
$sumAmountTotalSpentByCredit += $amountTotalSpentByCredit;
$amountTotalSpentByMoney = $orderModule->getSolver()->getAmountTotalSpentByMeanPayment($order, MeanPayment::MONEY);
$sumAmountTotalSpentByMoney += $amountTotalSpentByMoney;
$amountTotalSpentByCheque = $orderModule->getSolver()->getAmountTotalSpentByMeanPayment($order, MeanPayment::CHEQUE);
$sumAmountTotalSpentByCheque += $amountTotalSpentByCheque;
$amountTotalSpentByTransfer = $orderModule->getSolver()->getAmountTotalSpentByMeanPayment($order, MeanPayment::TRANSFER);
$sumAmountTotalSpentByTransfer += $amountTotalSpentByTransfer;
$amountTotalSpentByCreditCard = $orderModule->getSolver()->getAmountTotalSpentByMeanPayment($order, MeanPayment::CREDIT_CARD);
$sumAmountTotalSpentByCreditCard += $amountTotalSpentByCreditCard;

$datas[] = [
$order->distribution->date,
$orderModule->getSolver()->getOrderUsername($order),
CSV::formatNumber($orderModule->getSolver()->getOrderAmountWithTax($order)),
$referenceInvoice,
$hasInvoice ? '' : CSV::formatNumber($amountTotalSpentByCredit),
$hasInvoice ? '' : CSV::formatNumber($amountTotalSpentByMoney),
$hasInvoice ? '' : CSV::formatNumber($amountTotalSpentByCheque),
$hasInvoice ? '' : CSV::formatNumber($amountTotalSpentByTransfer),
$hasInvoice ? '' : CSV::formatNumber($amountTotalSpentByCreditCard)
];
}

$datas[] = [
'',
'',
'',
'Totaux paiements',
CSV::formatNumber($sumAmountTotalSpentByCredit),
CSV::formatNumber($sumAmountTotalSpentByMoney),
CSV::formatNumber($sumAmountTotalSpentByCheque),
CSV::formatNumber($sumAmountTotalSpentByTransfer),
CSV::formatNumber($sumAmountTotalSpentByCreditCard),
CSV::formatNumber($sumAmountTotalSpentByCredit + $sumAmountTotalSpentByMoney + $sumAmountTotalSpentByCheque +
$sumAmountTotalSpentByTransfer + $sumAmountTotalSpentByCreditCard)
];

CSV::send('commandes.csv', $datas);
}

return $this->render('payments', [
'reportPaymentsForm' => $reportPaymentsForm
]);
}

}

+ 0
- 86
backend/controllers/SettingAdminController.php View File

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

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

namespace backend\controllers;

use backend\forms\AdminSettingsForm;
use common\helpers\Ajax;
use yii\filters\AccessControl;
use yii\helpers\Html;
use yii\web\NotFoundHttpException;

/**
* UserController implements the CRUD actions for User model.
*/
class SettingAdminController extends BackendController
{
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::class,
'rules' => [
[
'allow' => true,
'roles' => ['@'],
'matchCallback' => function ($rule, $action) {
return $this->getUserModule()
->getAuthorizationChecker()
->isGrantedAsAdministrator($this->getUserCurrent());
}
]
],
],
];
}

public function actionIndex()
{
$settingModule = $this->getSettingModule();
$model = new AdminSettingsForm();
if($model->load(\Yii::$app->request->post()) && $model->validate()) {
foreach($settingModule->getAdminSettingDefinition()->getSettingDetailsFlat() as $settingDetail) {
$settingModule->getAdminSettingBag()->set($settingDetail->getName(), $model->{$settingDetail->getName()});
}
}

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

+ 159
- 0
backend/controllers/SharedPointSaleController.php View File

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

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

namespace backend\controllers;

use domain\PointSale\SharedPointSale\SharedPointSale;
use domain\Feature\Feature\Feature;
use yii\filters\AccessControl;
use yii\web\NotFoundHttpException;

/**
* UserController implements the CRUD actions for User model.
*/
class SharedPointSaleController extends BackendController
{
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::class,
'rules' => [
[
'allow' => true,
'roles' => ['@'],
'matchCallback' => function ($rule, $action) {
$authorizationChecker = $this->getUserModule()->getAuthorizationChecker();
$featureChecker = $this->getFeatureModule()->getChecker();

return $authorizationChecker->isGrantedAsProducer($this->getUserCurrent())
&& $featureChecker->isEnabled(Feature::ALIAS_SHARED_POINT_SALE);
}
]
],
],
];
}

public function actionIndex()
{
$sharedPointSaleRepository = $this->getSharedPointSaleModule()->getRepository();

return $this->render('index', [
'sharedPointsSaleRequestOfMe' => $sharedPointSaleRepository->findSharedPointsSaleRequestsOfMe(),
'sharedPointsSaleRequestOthers' => $sharedPointSaleRepository->findSharedPointsSaleRequestsOthers(),
'pointsSaleArray' => $this->getPointSaleModule()->getRepository()->findPointSales()
]);
}

public function actionCreate()
{
$sharedPointSaleModule = $this->getSharedPointSaleModule();
$sharedPointSaleModel = $sharedPointSaleModule->getBuilder()->instanciateSharedPointSale(null, null, $this->getUserCurrent());
$sharedPointSaleModel->scenario = SharedPointSale::SCENARIO_CREATE;
if($sharedPointSaleModel->load(\Yii::$app->request->post()) && $sharedPointSaleModel->validate()) {
$sharedPointSaleModule->getManager()->createSharedPointSale(
$sharedPointSaleModel->getPointSale(),
$sharedPointSaleModel->getProducerWithSharing(),
$this->getUserCurrent()
);
$this->setFlash('success', "La demande de partage a bien été créée");
return $this->redirect(['index']);
}

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

public function actionConfirm(int $id)
{
$sharedPointSale = $this->findSharedPointSale($id);
$sharedPointSale->scenario = SharedPointSale::SCENARIO_CONFIRM;
$sharedPointSale->producerCurrent = $this->getProducerCurrent();

if($sharedPointSale->load(\Yii::$app->request->post()) && $sharedPointSale->validate()) {
$pointSaleWithSharing = $sharedPointSale->getPointSaleWithSharing();
if($this->getSharedPointSaleModule()->getManager()->confirmSharedPointSale($sharedPointSale, $pointSaleWithSharing, $this->getUserCurrent())) {
$this->addFlash('success', "Le partage de point de vente a bien été confirmé");
}
else {
$this->addFlash('error', "Une erreur est survenue lors de la confirmation du partage");
}
}
else {
foreach($sharedPointSale->getErrors() as $errorArray) {
foreach($errorArray as $errorMessage) {
$this->addFlash('error', $errorMessage);
}
}
}

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

public function actionDecline(int $id)
{
$sharedPointSale = $this->findSharedPointSale($id);

if(!in_array($this->getProducerCurrent()->id, [$sharedPointSale->getProducerWithSharing()->id, $sharedPointSale->getPointSale()->id_producer])) {
$this->addFlash('error', "Vous ne pouvez pas refuser cette demande de partage.");
}
else {
if($this->getSharedPointSaleModule()->getManager()->declineSharedPointSale($sharedPointSale, $this->getUserCurrent())) {
$this->addFlash('success', "La demande de partage de point de vente a bien été annulée.");
}
else {
$this->addFlash('error', "Une erreur est survenue lors de l'annulation de la demande de partage.");
}
}

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

public function findSharedPointSale(int $id)
{
$sharedPointSale = $this->getSharedPointSaleModule()->getRepository()->findOneSharedPointSaleById($id);

if(!$sharedPointSale) {
throw new NotFoundHttpException("La demande de point de vente partagé n'a pas été trouvée.");
}

return $sharedPointSale;
}
}

+ 7
- 5
backend/controllers/SiteController.php View File

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

/**
* Copyright distrib (2018)
* Copyright Souke (2018)
*
* contact@opendistrib.net
* contact@souke.fr
*
* Ce logiciel est un programme informatique servant à aider les producteurs
* à distribuer leur production en circuits courts.
@@ -38,10 +38,9 @@

namespace backend\controllers;

use common\logic\User\User\Model\User;
use common\forms\LoginForm;
use Yii;
use yii\filters\AccessControl;
use common\forms\LoginForm;
use yii\filters\VerbFilter;

/**
@@ -137,13 +136,16 @@ class SiteController extends BackendController
* Change le producteur courant de l'utilisateur connecté.
* Permet de passer d'un producteur à un autre en tant qu'administrateur.
*/
public function actionSwitchProducer(int $id)
public function actionSwitchProducer(int $id, bool $createTicket = false)
{
$user = $this->getUserCurrent();
$producer = $this->getProducerModule()->getRepository()->findOneProducerById($id);

if($producer) {
$this->getUserModule()->getBuilder()->switchProducer($user, $producer);
if($createTicket) {
return $this->redirect($this->getUrlManagerBackend()->createUrl(['support/create']));
}
}
else {
$this->addFlash('error', 'Producteur introuvable.');

+ 42
- 0
backend/controllers/SponsorshipController.php View File

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

namespace backend\controllers;

use backend\controllers\BackendController;
use domain\Feature\Feature\Feature;
use yii\filters\AccessControl;

class SponsorshipController extends BackendController
{
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::class,
'rules' => [
[
'allow' => true,
'roles' => ['@'],
'matchCallback' => function ($rule, $action) {
return
$this->getFeatureModule()->getChecker()->isEnabled(Feature::ALIAS_SPONSORSHIP)
&& $this->getUserModule()
->getAuthorizationChecker()
->isGrantedAsProducer($this->getUserCurrent());
}
],
],
],
];
}

public function actionIndex()
{
$producerCurrent = $this->getProducerCurrent();

return $this->render('index', [
'producer' => $producerCurrent,
'producersGodsonsArray' => $this->getProducerModule()->getRepository()->findProducersSponsorshipGodsons($producerCurrent)
]);
}
}

+ 0
- 144
backend/controllers/StatsAdminController.php View File

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

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

namespace backend\controllers;

use yii\filters\AccessControl;
use Yii;
use DateTime;
use DateInterval;
use DatePeriod;

class StatsAdminController extends BackendController
{
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::class,
'rules' => [
[
'allow' => true,
'roles' => ['@'],
'matchCallback' => function ($rule, $action) {
return $this->getUserModule()
->getAuthorizationChecker()
->isGrantedAsAdministrator($this->getUserCurrent());
}
]
],
],
];
}

public function actionTurnover()
{
$data = [];
$dataLabels = [];
$dateStart = date('Y-m-d', time() - 60 * 60 * 24 * 365);
$dateEnd = date('Y-m-d', time() + 60 * 60 * 24 * 31);
$start = new DateTime($dateStart);
$interval = new DateInterval('P1M');
$end = new DateTime($dateEnd);
$period = new DatePeriod($start, $interval, $end);

foreach ($period as $date) {
$month = date('m/Y', $date->getTimestamp());
$dataLabels[] = $month;

$res = Yii::$app->db->createCommand("SELECT SUM(product_order.price * product_order.quantity) AS total
FROM `order`, product_order, distribution
WHERE `order`.id_distribution = distribution.id
AND `order`.id = product_order.id_order
AND distribution.date >= :date_start
AND distribution.date <= :date_end
")
->bindValue(':date_start', date('Y-m-', $date->getTimestamp()) . '01')
->bindValue(':date_end', date('Y-m-', $date->getTimestamp()) . '31')
->queryOne();

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

}

$dataNoIndex = [];
foreach ($data as $key => $val) {
$dataNoIndex[] = round($val, 2);
}

return $this->render('turnover', [
'dataLabels' => $dataLabels,
'data' => $dataNoIndex,
]);
}

public function actionCustomerOrders()
{
$orderModule = $this->getOrderModule();
$data = [];
$dataLabels = [];
$dateStart = date('Y-m-d', time() - 60 * 60 * 24 * 30);
$dateEnd = date('Y-m-d', time() + 60 * 60 * 24);
$start = new DateTime($dateStart);
$interval = new DateInterval('P1D');
$end = new DateTime($dateEnd);
$period = new DatePeriod($start, $interval, $end);

foreach ($period as $date) {
$dateFormat = date('d/m/Y', $date->getTimestamp());
$dataLabels[] = $dateFormat;
$data[] = $orderModule->countGlobalOrdersByDateAndOrigin($date);
}

return $this->render('customer_orders', [
'dataLabels' => $dataLabels,
'data' => $data,
]);
}

public function actionMatomo()
{
return $this->render('matomo');
}
}

?>

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

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

/**
* Copyright distrib (2018)
* Copyright Souke (2018)
*
* contact@opendistrib.net
* contact@souke.fr
*
* Ce logiciel est un programme informatique servant à aider les producteurs
* à distribuer leur production en circuits courts.
@@ -74,15 +74,20 @@ class StatsController extends BackendController
$year = date('Y');
}

$isVatNotApplicable = !$producerCurrent->taxRate->value;
$yearsWithTurnoverArray = $this->getProducerModule()->getRepository()->getYearsWithTurnover($producerCurrent);
$dataChartTurnover = $this->getProducerModule()->getRepository()->getDatasChartTurnoverStatistics($producerCurrent, $year, $displayBy);
$dataChartTurnoverWithTax = $this->getProducerModule()->getRepository()->getDatasChartTurnoverStatistics($producerCurrent, $year, $displayBy, true);


return $this->render('index', [
'isVatNotApplicable' => $isVatNotApplicable,
'displayBy' => $displayBy,
'yearCurrent' => $year,
'dataLabels' => $dataChartTurnover['labels'],
'data' => $dataChartTurnover['data'],
'yearsWithTurnoverArray' => $yearsWithTurnoverArray
'dataWithTax' => $dataChartTurnoverWithTax['data'],
'yearsWithTurnoverArray' => $yearsWithTurnoverArray,
]);
}


+ 39
- 28
backend/controllers/SubscriptionController.php View File

@@ -1,8 +1,8 @@
<?php
/**
* Copyright distrib (2018)
* Copyright Souke (2018)
*
* contact@opendistrib.net
* contact@souke.fr
*
* Ce logiciel est un programme informatique servant à aider les producteurs
* à distribuer leur production en circuits courts.
@@ -39,9 +39,8 @@ namespace backend\controllers;

use common\forms\SubscriptionForm;
use common\helpers\GlobalParam;
use common\logic\Config\Unit\Service\UnitDefinition;
use common\logic\Product\Product\Model\Product;
use common\logic\Subscription\Subscription\Model\SubscriptionSearch;
use domain\Product\Product\Product;
use domain\Subscription\Subscription\SubscriptionSearch;
use yii\filters\AccessControl;
use yii\web\NotFoundHttpException;

@@ -152,11 +151,11 @@ class SubscriptionController extends BackendController
*/
public function actionUpdate($id)
{
$orderModule = $this->getOrderModule();
$subscriptionModule = $this->getSubscriptionModule();
$productSubscriptionModule = $this->getProductSubscriptionModule();
$productModule = $this->getProductModule();
$distributionModule = $this-> getDistributionModule();
$orderModule = $this->getOrderModule();

$model = new SubscriptionForm;
$model->isAdmin = true;
@@ -210,8 +209,8 @@ class SubscriptionController extends BackendController
$messageOrdersDeleted = '';

if ($model->date_end) {
$countOrdersDeleted = $subscriptionModule->getOrderManager()
->deleteOrdersIncomingDistributionsFromSubscription($subscription, true);
$countOrdersDeleted = $orderModule->getManager()
->deleteOrdersIncomingDistributionsFromSubscription($subscription, $this->getUserCurrent(), true);
if ($countOrdersDeleted) {
$messageOrdersDeleted = '<br />' . $countOrdersDeleted . ' commandes supprimées';
}
@@ -239,42 +238,54 @@ class SubscriptionController extends BackendController
*/
public function actionDelete(int $id)
{
$subscriptionModule = $this->getSubscriptionModule();
$orderModule = $this->getOrderModule();
$subscriptionModule = $this->getSubscriptionModule();

$subscription = $subscriptionModule->findOneSubscriptionById($id);
$subscriptionModule->getOrderManager()->deleteOrdersIncomingDistributionsFromSubscription($subscription);
$subscriptionModule->deleteSubscription($subscription);
$subscription = $subscriptionModule->getRepository()->findOneSubscriptionById($id);

$this->setFlash('success', 'Abonnement supprimé');
if($subscription) {
$orderModule->getManager()->deleteOrdersIncomingDistributionsFromSubscription($subscription, $this->getUserCurrent());
$subscriptionModule->deleteSubscription($subscription);
$this->setFlash('success', 'Abonnement supprimé');
}
else {
$this->setFlash('danger', 'Abonnement introuvable');
}

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

public function actionUpdateDistributions(int $idSubscription, bool $generate = false, bool $update = false)
{
$orderModule = $this->getOrderModule();
$subscriptionModule = $this->getSubscriptionModule();
$distributionModule = $this-> getDistributionModule();
$subscription = $subscriptionModule->findOneSubscriptionById($idSubscription);
$matchedDistributionsArray = $distributionModule->findDistributionsIncomingMatchWithSubscrtiption($subscription, true);
if($subscription) {
$matchedDistributionsArray = $distributionModule->findDistributionsIncomingMatchWithSubscrtiption($subscription, true);

if ($generate) {
if ($update) {
$subscriptionModule->getOrderManager()
->deleteOrdersIncomingDistributionsFromSubscription($subscription);
}
foreach ($matchedDistributionsArray as $distribution) {
$subscriptionModule->createOrderFromSubscription($subscription, $distribution->date);
if ($generate) {
if ($update) {
$orderModule->getManager()
->deleteOrdersIncomingDistributionsFromSubscription($subscription, $this->getUserCurrent());
}
foreach ($matchedDistributionsArray as $distribution) {
$orderModule->getManager()->createOrderFromSubscription($subscription, $distribution->date, $this->getUserCurrent());
}
$this->setFlash('success', 'Commandes ' . ($update ? 're-' : '') . 'générées dans les distributions futures.');
return $this->redirect(['subscription/index']);
}
$this->setFlash('success', 'Commandes ' . ($update ? 're-' : '') . 'générées dans les distributions futures.');

return $this->render('update_distributions', [
'matchedDistributionsArray' => $matchedDistributionsArray,
'idSubscription' => $idSubscription,
'update' => $update
]);
}
else {
$this->setFlash('error', 'Abonnement introuvable');
return $this->redirect(['subscription/index']);
}

return $this->render('update_distributions', [
'matchedDistributionsArray' => $matchedDistributionsArray,
'idSubscription' => $idSubscription,
'update' => $update
]);
}

public function actionAjaxInfos(int $idSubscription = 0)

+ 0
- 85
backend/controllers/SupportAdminController.php View File

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

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

namespace backend\controllers;

use common\logic\Ticket\Ticket\Model\Ticket;
use common\logic\Ticket\Ticket\Model\TicketSearch;
use yii\filters\VerbFilter;
use yii\filters\AccessControl;

/**
* UserController implements the CRUD actions for User model.
*/
class SupportAdminController extends SupportController
{
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::class,
'rules' => [
[
'allow' => true,
'roles' => ['@'],
'matchCallback' => function ($rule, $action) {
return $this->getUserModule()
->getAuthorizationChecker()
->isGrantedAsAdministrator($this->getUserCurrent());
}
]
],
],
];
}

public function actionIndex()
{
$searchTicket = new TicketSearch();
$dataProviderTicketOpen = $searchTicket->search('admin', ['TicketSearch' => ['status' => Ticket::STATUS_OPEN]]);
$dataProviderTicketClosed = $searchTicket->search('admin', ['TicketSearch' => ['status' => Ticket::STATUS_CLOSED]]);

return $this->render('@backend/views/support/index', [
'context' => 'admin',
'searchTicket' => $searchTicket,
'dataProviderTicketOpen' => $dataProviderTicketOpen,
'dataProviderTicketClosed' => $dataProviderTicketClosed
]);
}

}

+ 4
- 4
backend/controllers/SupportController.php View File

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

/**
* Copyright distrib (2018)
* Copyright Souke (2018)
*
* contact@opendistrib.net
* contact@souke.fr
*
* Ce logiciel est un programme informatique servant à aider les producteurs
* à distribuer leur production en circuits courts.
@@ -38,8 +38,8 @@

namespace backend\controllers;

use common\logic\Ticket\Ticket\Model\Ticket;
use common\logic\Ticket\Ticket\Model\TicketSearch;
use domain\Ticket\Ticket\Ticket;
use domain\Ticket\Ticket\TicketSearch;
use yii\filters\AccessControl;
use yii\helpers\Html;
use yii\web\NotFoundHttpException;

+ 0
- 138
backend/controllers/TaxRateAdminController.php View File

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

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

namespace backend\controllers;

use common\logic\Config\TaxRate\Model\TaxRate;
use yii\web\NotFoundHttpException;
use yii\filters\VerbFilter;
use yii\filters\AccessControl;
use yii\data\ActiveDataProvider;

/**
* TaxRateAdminController implements the CRUD actions for TaxRate model.
*/
class TaxRateAdminController extends BackendController
{
public function behaviors()
{
return [
'verbs' => [
'class' => VerbFilter::class,
'actions' => [
'delete' => ['post'],
],
],
'access' => [
'class' => AccessControl::class,
'rules' => [
[
'allow' => true,
'roles' => ['@'],
'matchCallback' => function ($rule, $action) {
return $this->getUserModule()
->getAuthorizationChecker()
->isGrantedAsAdministrator($this->getUserCurrent());
}
]
],
],
];
}

public function actionIndex()
{
$dataProviderTaxRate = new ActiveDataProvider([
'query' => TaxRate::find()
]);

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

public function actionCreate()
{
$model = $this-> getTaxRateModule()->instanciateTaxRate();

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

public function actionUpdate($id)
{
$model = $this->findModel($id);

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

public function actionDelete(int $id)
{
$taxRateModule = $this-> getTaxRateModule();
$taxRate = $this->findModel($id);
$taxRateModule->delete($taxRate);

$this->setFlash('success', 'Taxe supprimé');

return $this->redirect(['tax-rate-admin/index']);
}

protected function findModel($id)
{
$taxRateModule = $this-> getTaxRateModule();
if (($taxRate = $taxRateModule->findOneTaxRateById($id)) !== null) {
return $taxRate;
} else {
throw new NotFoundHttpException('The requested page does not exist.');
}
}

}

+ 91
- 0
backend/controllers/TillerController.php View File

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

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

namespace backend\controllers;

use yii\filters\AccessControl;
use linslin\yii2\curl;

class TillerController extends BackendController
{
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::class,
'rules' => [
[
'allow' => true,
'roles' => ['@'],
'matchCallback' => function ($rule, $action) {
return $this->getUserModule()
->getAuthorizationChecker()
->isGrantedAsProducer($this->getUserCurrent());
}
]
],
],
];
}

public function actionOauth(string $code)
{
$producerModule = $this->getProducerModule();
$curl = new curl\Curl();

$redirectUri = $producerModule->getSolver()->getConfig('tiller_redirect_uri');
$clientId = $producerModule->getSolver()->getConfig('tiller_client_id');
$clientSecret = $producerModule->getSolver()->getConfig('tiller_client_secret');
$url = "https://oauth.api.tiller.systems/oauth2/token?grant_type=authorization_code&redirect_uri=$redirectUri&client_id=$clientId&client_secret=$clientSecret&code=$code";

$response = $curl
->setHeaders(['Content-type' => 'application/x-www-form-urlencoded'])
->post($url);

$datasResponse = json_decode($response);
$accessToken = $datasResponse->access_token;
$refreshToken = $datasResponse->refresh_token;

$producer = $this->getProducerCurrent();
$producer->tiller_access_token = $accessToken;
$producer->tiller_refresh_token = $refreshToken;
$producer->save();

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

+ 181
- 136
backend/controllers/UserController.php View File

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

/**
* Copyright distrib (2018)
* Copyright Souke (2018)
*
* contact@opendistrib.net
* contact@souke.fr
*
* Ce logiciel est un programme informatique servant à aider les producteurs
* à distribuer leur production en circuits courts.
@@ -40,18 +40,17 @@ namespace backend\controllers;

use backend\models\CreditForm;
use common\helpers\GlobalParam;
use backend\models\MailForm;
use common\helpers\Password;
use common\logic\Order\Order\Model\OrderSearch;
use common\logic\PointSale\PointSale\Model\PointSale;
use common\logic\PointSale\UserPointSale\Model\UserPointSale;
use common\logic\User\User\Model\User;
use common\logic\User\User\Model\UserSearch;
use common\logic\User\UserProducer\Model\UserProducer;
use common\logic\User\UserUserGroup\Model\UserUserGroup;
use domain\Order\Order\OrderSearch;
use domain\PointSale\PointSale\PointSale;
use domain\PointSale\UserPointSale\UserPointSale;
use domain\User\User\User;
use domain\User\User\UserSearch;
use domain\User\UserProducer\UserProducer;
use domain\User\UserUserGroup\UserUserGroup;
use Yii;
use yii\base\UserException;
use yii\filters\AccessControl;
use \Yii;
use yii\helpers\Html;
use yii\web\NotFoundHttpException;

@@ -70,11 +69,16 @@ class UserController extends BackendController
'allow' => true,
'roles' => ['@'],
'matchCallback' => function ($rule, $action) {
return $this->getUserModule()
->getAuthorizationChecker()
->isGrantedAsProducer($this->getUserCurrent());
$userCurrent = $this->getUserCurrent();
$authorizationChecker = $this->getUserModule()->getAuthorizationChecker();
if(in_array($action->id, ['messages', 'message-delete'])) {
return $authorizationChecker->isGrantedAsAdministrator($userCurrent);
}
else {
return $authorizationChecker->isGrantedAsProducer($userCurrent);
}
}
]
],
],
],
];
@@ -89,7 +93,7 @@ class UserController extends BackendController
bool $sectionInactiveUsers = false)
{
$pointSaleModule = $this->getPointSaleModule();
$producer = $this->getProducerCurrent();
$searchModel = new UserSearch();
$dataProvider = $searchModel->search([
'UserSearch' => array_merge(
@@ -102,7 +106,7 @@ class UserController extends BackendController
Yii::$app->request->queryParams['UserSearch'] :
[]
)
]);
], $producer);

$producer = $this->getProducerCurrent();
$pointsSaleArray = $pointSaleModule->findPointSales();
@@ -118,12 +122,13 @@ class UserController extends BackendController
]);
}

public function actionCreate()
public function actionCreate(string $redirectUrl = null)
{
$userModule = $this->getUserModule();
$producerModule = $this->getProducerModule();
$producerCurrent = $this->getProducerCurrent();
$model = $userModule->instanciateUser();
$model->redirect_url = $redirectUrl;
$posts = Yii::$app->request->post();
$userExist = false;

@@ -136,6 +141,7 @@ class UserController extends BackendController
$this->processLinkPointSale($userExist);
$this->processLinkUserGroup($userExist);
$this->setFlash('success', "L'utilisateur que vous souhaitez créer possède déjà un compte sur la plateforme. Il vient d'être lié à votre établissement.");
return $this->redirectAfterSave('user', $userExist->id);
} else {
if ($model->load(\Yii::$app->request->post()) && $model->validate() && YII_ENV != 'demo') {

@@ -153,6 +159,7 @@ class UserController extends BackendController
);
$userCreate->points_sale = $model->points_sale;
$userCreate->user_groups = $model->user_groups;
$userCreate->exclusive_access_selected_points_sale = $model->exclusive_access_selected_points_sale;

$this->processLinkPointSale($userCreate);
$this->processLinkUserGroup($userCreate);
@@ -160,26 +167,63 @@ class UserController extends BackendController

$this->setFlash('success', 'Utilisateur créé.');

return $this->refresh();
return $this->redirectAfterSave('user', $userCreate->id, $model->redirect_url);
}
}

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

public function actionView($id)
{
$userModule = $this->getUserModule();
$pointSaleModule = $this->getPointSaleModule();
$model = $this->findModel($id);

// Email de bienvenue
$mailWelcome = Yii::$app->request->post('submit_mail_welcome');
if ($mailWelcome) {
$this->getUserModule()->getManager()->welcome($model);
$this->setFlash('success', 'Email de bienvenue envoyé à <strong>' . Html::encode($userModule->getSolver()->getUsername($model)) . '</strong>.');
return $this->redirect(['view', 'id' => $model->id]);
}

// Mot de passe oublié
$newPassword = Yii::$app->request->post('submit_new_password');
if ($newPassword) {
$this->getUserModule()->getManager()->newPassword($model);
$this->setFlash('success', 'Nouveau mot de passe envoyé à <strong>' . Html::encode($userModule->getSolver()->getUsername($model)) . '</strong>.');
return $this->redirect(['view', 'id' => $model->id]);
}

return $this->render('view', [
'model' => $model,
'pointSaleBillingArray' => $pointSaleModule->findByBillingUser($model),
'subscriptionsArray' => $this->getSubscriptionModule()->getRepository()->findSubscriptionsByUser($model)
]);
}

public function actionUpdate($id)
{
if($this->getProducerCurrent()->isDemoAccount()) {
$this->addFlash('error', "Fonctionnalité non disponible sur le compte de démo.");
return $this->redirect(['view', 'id' => $id]);
}

$userModule = $this->getUserModule();
$pointSaleModule = $this->getPointSaleModule();

$model = $this->findModel($id);
$previousMail = $model->email;
$userBelongToProducer = UserProducer::findOne(['id_user' => $id, 'id_producer' => GlobalParam::getCurrentProducerId()]);
if ($userBelongToProducer) {
$model->newsletter = $userBelongToProducer->newsletter;
$model->newsletter_order_taking = $userBelongToProducer->newsletter_order_taking;
$model->trust_alert = $userBelongToProducer->trust_alert;
$model->trust_alert_comment = $userBelongToProducer->trust_alert_comment;
$model->exclusive_access_selected_points_sale = $userBelongToProducer->exclusive_access_selected_points_sale;

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

// on envoie le mail de bienvenue si le mail vient d'être défini
@@ -193,29 +237,28 @@ class UserController extends BackendController
$this->processLinkUserGroup($model);
//$this->processProductPricePercent($model);

if ($model->newsletter) {
$userModule->getNewsletterManager()->subscribeUserNewsletter($model);
} else {
$userModule->getNewsletterManager()->unsubscribeUserNewsletter($model);
}
// Newsletter
$userModule->getNewsletterManager()->manageUserNewsletter(
$model,
$model->newsletter,
$model->newsletter_order_taking
);

$this->setFlash('success', 'Utilisateur <strong>' . Html::encode($userModule->getUsername($model)) . '</strong> modifié.');
return $this->redirect(['index']);
}
// Alerte confiance
$userBelongToProducer->trust_alert = $model->trust_alert;
$userBelongToProducer->trust_alert_comment = $model->trust_alert_comment;
$userBelongToProducer->save();

// Email de bienvenue
$mailWelcome = Yii::$app->request->post('submit_mail_welcome');
if ($mailWelcome) {
$this->getUserModule()->getManager()->welcome($model);
$this->setFlash('success', 'Email de bienvenue envoyé à <strong>' . Html::encode($userModule->getSolver()->getUsername($model)) . '</strong>.');
return $this->redirect(['update', 'id' => $model->id]);
}
// Mot de passe
if($this->getUserModule()->getAuthorizationChecker()->isGrantedAsAdministrator($this->getUserCurrent())
&& $model->password_new
&& strlen($model->password_new)) {

$this->getUserModule()->getBuilder()->initPassword($model, $model->password_new);
$model->save();
}

// Mot de passe oublié
$newPassword = Yii::$app->request->post('submit_new_password');
if ($newPassword) {
$this->getUserModule()->getManager()->newPassword($model);
$this->setFlash('success', 'Nouveau mot de passe envoyé à <strong>' . Html::encode($userModule->getSolver()->getUsername($model)) . '</strong>.');
$this->setFlash('success', 'Utilisateur <strong>' . Html::encode($userModule->getUsername($model)) . '</strong> modifié.');
return $this->redirect(['update', 'id' => $model->id]);
}
} else {
@@ -228,6 +271,87 @@ class UserController extends BackendController
]));
}

public function actionMessages(int $id, int $idUserMessage = null)
{
$userMessageModule = $this->getUserMessageModule();
$user = $this->findModel($id);
$isUpdate = false;

if($idUserMessage) {
$isUpdate = true;
$userMessageModel = $this->findUserMessage($idUserMessage);
}
else {
$userMessageModel = $userMessageModule->getBuilder()->instanciateUserMessage(
$user,
$this->getUserCurrent()
);
}

if($userMessageModel->load(\Yii::$app->request->post()) && $userMessageModel->validate()) {
if($isUpdate) {
$userMessageModel->save();
$this->setFlash('success', "Le message a bien été modifié.");
}
else {
$userMessageModule->getManager()->createUserMessage(
$user,
$userMessageModel->getMessage(),
$this->getUserCurrent()
);
$this->setFlash('success', "Le message a bien été envoyé à l'utilisateur.");
}

return $this->redirect(['messages', 'id' => $id]);
}

return $this->render('messages', [
'user' => $user,
'userMessageModel' => $userMessageModel,
'userMessagesDataProvider' => $userMessageModule->getRepository()
->queryUserMessagesByUser($user)
->getDataProvider(20)
]);
}

public function actionMessageDelete(int $idUser, int $idUserMessage)
{
$userMessageModule = $this->getUserMessageModule();
$userMessage = $this->findUserMessage($idUserMessage);
if($userMessageModule->getManager()->deleteUserMessage($userMessage)) {
$this->setFlash('success', "Le message a bien été supprimé.");
}
else {
$this->setFlash('error', "Une erreur est survenue pendant la suppression du message.");
}
return $this->redirect(['messages', 'id' => $idUser]);
}

public function findUserMessage(int $idUserMessage)
{
$userMessage = $this->getUserMessageModule()->getRepository()->findOneUserMessageById($idUserMessage);

if(!$userMessage) {
throw new NotFoundHttpException("Le message utilisateur n'a pas été trouvé.");
}

return $userMessage;
}

public function actionReportProblemReceivingEmails(int $id)
{
$user = $this->findModel($id);

if($this->getUserModule()->getManager()->reportProblemReceivingEmails($user)) {
$this->setFlash('success', "L'utilisateur <strong>".$this->getUserModule()->getSolver()->getUsername($user)."</strong> a bien été signalé comme ayant des problèmes dans la réception de vos emails. L'administrateur débloquera la situation dès que possible et préviendra l'utilisateur.");
}
else {
$this->setFlash('error', "Une erreur est survenue.");
}

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

public function initForm($model)
{
$userPointSaleModule = $this->getUserPointSaleModule();
@@ -299,6 +423,11 @@ class UserController extends BackendController
}
}
}

// Accès exclusif aux points de vente sélectionnés
$userProducer = UserProducer::findOne(['id_user' => $modelUser->id, 'id_producer' => GlobalParam::getCurrentProducerId()]);
$userProducer->setExclusiveAccessSelectedPointsSale($modelUser->exclusive_access_selected_points_sale);
$userProducer->save();
}

/**
@@ -352,7 +481,7 @@ class UserController extends BackendController

if ($userProducer) {
if ($userProducerModule->hasOutstandingCredit($userProducer)) {
$this->setFlash('error', "Vous ne pouvez pas supprimer cet utilisateur car il a toujours du crédit en cours.");
$this->setFlash('error', "Vous ne pouvez pas supprimer cet utilisateur car il a toujours de l'argent dans sa cagnotte.");
} else {
$userProducerModule->unlinkUserProducer($userProducer);
$this->setFlash('success', 'L\'utilisateur a bien été supprimé de votre établissement.');
@@ -368,7 +497,7 @@ class UserController extends BackendController
}

/**
* Affiche les données liées au crédit d'un utilisateur (formulaire, historique).
* Affiche les données liées à la cagnotte d'un utilisateur (formulaire, historique).
*/
public function actionCredit(int $id)
{
@@ -386,6 +515,11 @@ class UserController extends BackendController

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

$dateTransaction = null;
if($creditForm->date_transaction) {
$dateTransaction = date('Y-m-d', strtotime(str_replace('/', '-', $creditForm->date_transaction)));
}

$paymentModule->getManager()
->creditOrDebitUser(
$creditForm->type,
@@ -393,10 +527,11 @@ class UserController extends BackendController
$creditForm->amount,
$creditForm->mean_payment,
$this->getUserCurrent(),
$creditForm->comment
$creditForm->comment,
$dateTransaction
);

if ($creditForm->send_mail) {
if ($creditForm->send_mail && !$this->getProducerCurrent()->isDemoAccount()) {
$paymentModule->getNotifier()
->notifyUserCreditMovement(
$user,
@@ -408,7 +543,7 @@ class UserController extends BackendController
}
}

$this->addFlash('success', 'Crédit mis à jour.');
$this->addFlash('success', 'Cagnotte mise à jour.');

return $this->refresh();
}
@@ -481,96 +616,6 @@ class UserController extends BackendController
}
}

/**
* Affiche la liste des emails des utilisateurs liés à un point de vente donné.
*/
public function actionMail(
$idPointSale = 0,
$sectionSubscribers = 0,
$sectionInactiveUsers = 0,
$usersPointSaleLink = 0,
$usersPointSaleHasOrder = 0)
{
$userModule = $this->getUserModule();
$distributionModule = $this->getDistributionModule();

if ($idPointSale && !$usersPointSaleLink && !$usersPointSaleHasOrder) {
$usersPointSaleLink = 1;
}

$users = $userModule->queryUsersBy([
'id_producer' => GlobalParam::getCurrentProducerId(),
'id_point_sale' => $idPointSale,
'users_point_sale_link' => $usersPointSaleLink,
'users_point_sale_has_order' => $usersPointSaleHasOrder,
'subscribers' => $sectionSubscribers,
'inactive' => $sectionInactiveUsers,
'newsletter' => true
])->all();

$usersArray = [];
foreach ($users as $key => $user) {
if (isset($user['email']) && strlen($user['email']) > 0) {
$usersArray[] = $user['email'];
} else {
unset($users[$key]);
}
}

$pointsSaleArray = PointSale::find()->where(['id_producer' => GlobalParam::getCurrentProducerId(), 'status' => 1])->all();

$pointSale = null;
if ($idPointSale) {
$pointSale = PointSale::findOne(['id' => $idPointSale]);
}

$mailForm = new MailForm();
if ($mailForm->load(\Yii::$app->request->post()) && $mailForm->validate()) {
$responseSendMail = $mailForm->sendEmail($users);
if ($responseSendMail->success()) {
$this->setFlash('success', 'Votre email a bien été envoyé.');
} else {
$bodyResponseSendMail = $responseSendMail->getBody();
$emailsErrorArray = [];

if (isset($bodyResponseSendMail['Messages'])) {
foreach ($bodyResponseSendMail['Messages'] as $message) {
if ($message['Status'] != 'success') {
$emailsErrorArray[] = $message['Errors'][0]['ErrorMessage'];
}
}
}

$messageError = 'Un problème est survenu lors de l\'envoi de votre email.';
if (count($emailsErrorArray) > 0) {
$messageError .= '<br />Problème détecté : ' . implode(',', $emailsErrorArray);
}
$this->setFlash('error', $messageError);
}

return $this->redirect(['mail', 'idPointSale' => $idPointSale]);
}

$incomingDistributions = $distributionModule->findDistributionsIncoming();
$incomingDistributionsArray = ['0' => '--'];
foreach ($incomingDistributions as $distribution) {
$incomingDistributionsArray[$distribution->id] = strftime('%A %d %B %Y', strtotime($distribution->date));
}

return $this->render('emails', [
'usersArray' => $usersArray,
'pointsSaleArray' => $pointsSaleArray,
'pointSale' => $pointSale,
'mailForm' => $mailForm,
'idPointSaleActive' => $idPointSale,
'incomingDistributionsArray' => $incomingDistributionsArray,
'sectionSubscribers' => $sectionSubscribers,
'sectionInactiveUsers' => $sectionInactiveUsers,
'usersPointSaleLink' => $usersPointSaleLink,
'usersPointSaleHasOrder' => $usersPointSaleHasOrder,
]);
}

public function actionSwitchIdentity(int $id)
{
$userModule = $this->getUserModule();
@@ -581,7 +626,7 @@ class UserController extends BackendController
$duration = 0;
Yii::$app->user->switchIdentity($user, $duration);
Yii::$app->session->set('user.idbeforeswitch', $initialId);
return $this->redirect(['index']);
return $this->redirect($this->getUrlManagerFrontend()->createUrl(['site/index']));
}
} else {
throw new NotFoundHttpException('Page introuvable');

+ 5
- 5
backend/controllers/UserGroupController.php View File

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

/**
* Copyright distrib (2018)
* Copyright Souke (2018)
*
* contact@opendistrib.net
* contact@souke.fr
*
* Ce logiciel est un programme informatique servant à aider les producteurs
* à distribuer leur production en circuits courts.
@@ -39,11 +39,11 @@
namespace backend\controllers;

use common\helpers\GlobalParam;
use common\logic\User\UserGroup\Model\UserGroupSearch;
use common\logic\User\UserUserGroup\Model\UserUserGroup;
use domain\User\UserGroup\UserGroupSearch;
use domain\User\UserUserGroup\UserUserGroup;
use yii\filters\AccessControl;
use yii\web\NotFoundHttpException;
use yii\helpers\Html;
use yii\web\NotFoundHttpException;

/**
* PointVenteController implements the CRUD actions for PointVente model.

+ 2
- 2
backend/controllers/UserImportController.php View File

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

/**
* Copyright distrib (2018)
* Copyright Souke (2018)
*
* contact@opendistrib.net
* contact@souke.fr
*
* Ce logiciel est un programme informatique servant à aider les producteurs
* à distribuer leur production en circuits courts.

+ 132
- 0
backend/controllers/admin/CommunicateAdminController.php View File

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

/**
* Copyright Souke (2018)
*
* contact@souke.fr
*
* 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\admin;

use backend\controllers\BackendController;
use backend\models\MailForm;
use domain\User\User\User;
use yii\filters\AccessControl;
use yii\filters\VerbFilter;
use yii\web\NotFoundHttpException;

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

public function behaviors()
{
return [
'verbs' => [
'class' => VerbFilter::class,
'actions' => [
'delete' => ['post'],
],
],
'access' => [
'class' => AccessControl::class,
'rules' => [
[
'allow' => true,
'roles' => ['@'],
'matchCallback' => function ($rule, $action) {
return $this->getUserModule()
->getAuthorizationChecker()
->isGrantedAsAdministrator($this->getUserCurrent());
}
]
],
],
];
}

public function actionIndex($section = 'producers')
{
$producerModule = $this->getProducerModule();
$userModule = $this->getUserModule();

if ($section == 'producers') {
$producers = $producerModule->findProducersActive();
$usersArray = [];
$users = [];
foreach ($producers as $producer) {
if (isset($producer->contact) && is_array($producer->contact)) {
foreach ($producer->contact as $contact) {
$usersArray[] = $contact->email;
$users[] = [
'email' => $contact->email,
'name' => $contact->name,
'lastname' => $contact->lastname,
];
}
}
}
} elseif ($section == 'users') {
$users = $userModule->findUsersByStatus(User::STATUS_ACTIVE);
$usersArray = [];
foreach ($users as $user) {
if (isset($user['email']) && strlen($user['email'])) {
$usersArray[] = $user['email'];
}
}
} else {
throw new NotFoundHttpException('Requête incorrecte.');
}

$mailForm = new MailForm();
if ($mailForm->load(\Yii::$app->request->post()) && $mailForm->validate()) {
$resultSendEmail = $mailForm->sendEmail($users, false);
if ($resultSendEmail) {
$this->setFlash('success', 'Votre email a bien été envoyé.');
} else {
$this->setFlash('error', 'Un problème est survenu lors de l\'envoi de votre email.');
}
$mailForm->subject = '';
$mailForm->message = '';
}

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

}

+ 119
- 0
backend/controllers/admin/DashboardAdminController.php View File

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

/**
* Copyright Souke (2018)
*
* contact@souke.fr
*
* 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\admin;

use backend\controllers\BackendController;
use yii\filters\AccessControl;

class DashboardAdminController extends BackendController
{
/**
* @inheritdoc
*/
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::class,
'rules' => [
[
'allow' => true,
'roles' => ['@'],
'matchCallback' => function ($rule, $action) {
return $this->getUserModule()
->getAuthorizationChecker()
->isGrantedAsAdministrator($this->getUserCurrent());
}
],
],
],
];
}

public function actionIndex()
{
return $this->render('index', [
'supportOnline' => $this->getSettingModule()->getAdminSettingBag()->get('supportOnline'),
'countUsersOnline' => $this->getUserModule()->getRepository()->countUsersOnline(),
'countTicketsAdminOpen' => $this->getTicketModule()->getRepository()->countTicketsAdminStatusOpen(),
'countTicketsAdminUnread' => $this->getTicketModule()->getRepository()->countTicketsAdminUnreadByUser($this->getUserCurrent()),
'usersWithStatusProducerOnlineArray' => $this->getUserModule()->getRepository()->findUsersWithStatusProducerAndOnline()
//'statisticsCacheHtml' => \Yii::$app->cache->get('dashboard_statistics12') ?: '',
]);
}

public function actionSupportOnlineToggle(int $active)
{
$this->getSettingModule()->getAdminSettingBag()->set('supportOnline', $active);
return $this->redirect('index');
}

public function actionAjaxStatisticsHtml()
{
return \Yii::$app->cache->getOrSet('dashboard_statistics14', function () {
$producerModule = $this->getProducerModule();
$pointSaleModule = $this->getPointSaleModule();
$userModule = $this->getUserModule();
$orderModule = $this->getOrderModule();

$countProducersActive = $producerModule->getRepository()->countProducersActiveWithTurnover();
$countPointSalesActive = $pointSaleModule->countPointSalesActiveLastThreeMonths();
$countUsersActive = $userModule->countUsersActiveLastThreeMonths();
$averageOrdersPerDay = $orderModule->countGlobalUserOrdersAverageLastSevenDays();
$turnoverLastThirtyDays = $orderModule->getRepository()->getTurnoverLastThirtyDays();
$resultMatomoApiVisitSummary = json_decode(file_get_contents(\Yii::$app->parameterBag->get('matomoApiVisitSummaryUrl')));
$numberVisitsDay = intval($resultMatomoApiVisitSummary->nb_uniq_visitors / 30);
$amountBilledLastMonth = $producerModule->getRepository()->getAmountBilledLastMonth();
$amountToBillCurrentMonth = $producerModule->getRepository()->getAmountToBillCurrentMonth();
$amountProducerUnpaidInvoices = $producerModule->getDolibarrUtils()->getAmountProducerInvoicesUnpaid();

return $this->renderPartial('_statistics', [
'amountBilledLastMonth' => $amountBilledLastMonth,
'amountToBillCurrentMonth' => $amountToBillCurrentMonth,
'amountProducerUnpaidInvoices' => $amountProducerUnpaidInvoices,
'countProducersActive' => $countProducersActive,
'countPointSalesActive' => $countPointSalesActive,
'countUsersActive' => $countUsersActive,
'averageOrdersPerDay' => $averageOrdersPerDay,
'turnoverLastThirtyDays' => $turnoverLastThirtyDays,
'numberVisitsDay' => $numberVisitsDay
]);
}, 60 * 60 * 24);
}
}

+ 153
- 0
backend/controllers/admin/FeatureAdminController.php View File

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

/**
* Copyright Souke (2018)
*
* contact@souke.fr
*
* 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\admin;

use backend\controllers\BackendController;
use common\helpers\Ajax;
use yii\filters\AccessControl;
use yii\helpers\Html;
use yii\web\NotFoundHttpException;

/**
* UserController implements the CRUD actions for User model.
*/
class FeatureAdminController extends BackendController
{
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::class,
'rules' => [
[
'allow' => true,
'roles' => ['@'],
'matchCallback' => function ($rule, $action) {
return $this->getUserModule()
->getAuthorizationChecker()
->isGrantedAsAdministrator($this->getUserCurrent());
}
]
],
],
];
}

public function actionIndex()
{
$featureModule = $this->getFeatureModule();
$dataProviderFeatures = $featureModule->getRepository()->queryDefaultAll()->getDataProvider(100);

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

public function actionAjaxToggleStatus($id, $status)
{
$featureManager = $this->getFeatureModule()->getManager();
$feature = $this->findModel($id);

if($status) {
$featureManager->enableFeature($feature);
$messageResponse = 'La fonctionnalité "'.Html::encode($feature->name).'" a bien été activée';
}
else {
$featureManager->disableFeature($feature);
$messageResponse = 'La fonctionnalité "'.Html::encode($feature->name).'" a bien été désactivée';
}

return Ajax::responseSuccess($messageResponse);
}

public function actionToggleStatusFeatureProducer(int $id, int $status = null)
{
$featureManager = $this->getFeatureModule()->getManager();
$feature = $this->findModel($id);

if(is_null($status)) {
$featureManager->defaultFeatureForProducer($feature);
}
elseif($status == 0) {
$featureManager->disableFeatureForProducer($feature);
}
elseif($status == 1) {
$featureManager->enableFeatureForProducer($feature);
}

return $this->redirectReferer();
}

public function actionUpdate($id)
{
$model = $this->findModel($id);

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

public function actionPosition()
{
$array = \Yii::$app->request->post('array');
$positionArray = json_decode(stripslashes($array));

foreach ($positionArray as $id => $position) {
$feature = $this->findModel($id);
$feature->position = $position;
$feature->save();
}
}

protected function findModel($id)
{
$featureModule = $this->getFeatureModule();
if (($feature = $featureModule->getRepository()->findOneFeatureById($id)) !== null) {
return $feature;
} else {
throw new NotFoundHttpException('La fonctionnalité demandée est introuvable.');
}
}
}

+ 80
- 0
backend/controllers/admin/OnlineAdminController.php View File

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

/**
* Copyright Souke (2018)
*
* contact@souke.fr
*
* 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\admin;

use backend\controllers\BackendController;
use yii\filters\AccessControl;
use yii\filters\VerbFilter;

class OnlineAdminController extends BackendController
{
public function behaviors()
{
return [
'verbs' => [
'class' => VerbFilter::class,
],
'access' => [
'class' => AccessControl::class,
'rules' => [
[
'allow' => true,
'roles' => ['@'],
'matchCallback' => function ($rule, $action) {
return $this->getUserModule()
->getAuthorizationChecker()
->isGrantedAsAdministrator($this->getUserCurrent());
}
]
],
],
];
}

public function actionIndex()
{
$usersWithStatusProducerOnlineArray = $this->getUserModule()->getRepository()->findUsersWithStatusProducerAndOnline();
$usersWithStatusUserOnlineArray = $this->getUserModule()->getRepository()->findUsersWithStatusUserAndOnline();

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

+ 79
- 0
backend/controllers/admin/OrderAdminController.php View File

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

/**
* Copyright Souke (2018)
*
* contact@souke.fr
*
* 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\admin;

use backend\controllers\BackendController;
use domain\Order\Order\OrderSearch;
use yii\filters\AccessControl;

class OrderAdminController extends BackendController
{
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::class,
'rules' => [
[
'allow' => true,
'roles' => ['@'],
'matchCallback' => function ($rule, $action) {
return $this->getUserModule()
->getAuthorizationChecker()
->isGrantedAsAdministrator($this->getUserCurrent());
}
]
],
],
];
}

public function actionIndex()
{
$searchModel = new OrderSearch();
$dataProvider = $searchModel->search([
'order_by' => 'IF(ISNULL(date_update), `order`.`date`, `order`.`date_update`) DESC'
]);

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

+ 262
- 0
backend/controllers/admin/ProducerAdminController.php View File

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

/**
* Copyright Souke (2018)
*
* contact@souke.fr
*
* 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\admin;

use backend\controllers\BackendController;
use common\helpers\Ajax;
use common\helpers\Alwaysdata;
use domain\Order\Order\Order;
use domain\Order\Order\OrderRepositoryQuery;
use domain\Producer\Producer\Producer;
use domain\Product\Product\Product;
use Yii;
use yii\data\ActiveDataProvider;
use yii\filters\AccessControl;
use yii\filters\VerbFilter;
use yii\helpers\Html;
use yii\web\NotFoundHttpException;

class ProducerAdminController extends BackendController
{
public function behaviors()
{
return [
'verbs' => [
'class' => VerbFilter::class,
'actions' => [
'delete' => ['post'],
],
],
'access' => [
'class' => AccessControl::class,
'rules' => [
[
'allow' => true,
'roles' => ['@'],
'matchCallback' => function ($rule, $action) {
return $this->getUserModule()
->getAuthorizationChecker()
->isGrantedAsAdministrator($this->getUserCurrent());
}
]
],
],
];
}

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

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

/**
* Crée un producteur.
*/
public function actionCreate()
{
$producerModule = $this->getProducerModule();
$producer = $producerModule->instanciateProducer();

if ($producer->load(\Yii::$app->request->post()) && $producerModule->saveCreate($producer)) {
$this->setFlash('success', 'Producteur créé.');
return $this->redirect(['index']);
} else {
return $this->render('create', [
'model' => $producer,
]);
}
}

/**
* Modification d'un producteur.
*/
public function actionUpdate(int $id)
{
$producerModule = $this->getProducerModule();
$producer = $this->findProducer($id);

if ($producer->load(\Yii::$app->request->post()) && $producerModule->saveCreate($producer)) {
$this->setFlash('success', 'Producteur modifié.');
return $this->redirect(['index']);
} else {
return $this->render('update', [
'model' => $producer,
]);
}
}

/**
* Facturation producteur.
*/
public function actionBilling(int $id)
{
$producer = $this->findProducer($id);

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

public function actionAlwaysdata(int $id)
{
$producer = $this->findProducer($id);

if($producer->contact_email) {
Yii::$app->alwaysdataClient->initRedirections($producer);
return Ajax::responseSuccess('Redirections initialisées chez Alwaysdata');
}
else {
return Ajax::responseError("L'adresse email de contact du producteur n'est pas définie");
}
}

public function actionDolibarr(int $id)
{
$producerModule = $this->getProducerModule();
$producer = $this->findProducer($id);
if($producer->dolibarr_socid) {
$producerModule->generateDolibarrProducerInvoice($producer);
return Ajax::responseSuccess("Facture générée sur Dolibarr pour le producteur \"".Html::encode($producer->name)."\"");
}
else {
return Ajax::responseError("Dolibarr : l'id user du producteur doit être défini");
}
}

public function actionUserTransfer($fromProducerId, $toProducerId, $withOrders = 1)
{
$producerModule = $this->getProducerModule();
$userModule = $this->getUserModule();

$fromProducerId = (int)$fromProducerId;
$toProducerId = (int)$toProducerId;
$count = 0;
$usersArray = $userModule->queryUsersBy(['id_producer' => $fromProducerId])->all();

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

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

if (($withOrders && $countOrders) || !$withOrders) {
$producerModule->addUser(
$userModule->findOneUserById($idUser),
$producerModule->findOneProducerById($toProducerId)
);
$count++;
}
}

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

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

public function actionProducerInstallTaxUpdatePrices($idProducer)
{
$productsArray = Product::searchAll([
'id_producer' => $idProducer
]);

$connection = Yii::$app->getDb();

foreach ($productsArray as $product) {
$product->price = round($product->price / (1 + $product->taxRate->value), 2);
$product->save();

$command = $connection->createCommand("
UPDATE `product_order`
SET price = ROUND(price / (1 + :tax_value), 2),
id_tax_rate = :id_tax_rate
WHERE id_product = :id_product",
[
':id_product' => $product->id,
':tax_value' => $product->taxRate->value,
':id_tax_rate' => $product->taxRate->id,
]);

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

echo 'ok';
}

/**
* Recherche un producteur.
*/
protected function findProducer(int $id)
{
$producerModule = $this->getProducerModule();

if (($model = $producerModule->findOneProducerById($id)) !== null) {
return $model;
} else {
throw new NotFoundHttpException('Producteur introuvable.');
}
}

}

+ 84
- 0
backend/controllers/admin/SettingAdminController.php View File

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

/**
* Copyright Souke (2018)
*
* contact@souke.fr
*
* 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\admin;

use backend\controllers\BackendController;
use backend\forms\AdminSettingsForm;
use yii\filters\AccessControl;

/**
* UserController implements the CRUD actions for User model.
*/
class SettingAdminController extends BackendController
{
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::class,
'rules' => [
[
'allow' => true,
'roles' => ['@'],
'matchCallback' => function ($rule, $action) {
return $this->getUserModule()
->getAuthorizationChecker()
->isGrantedAsAdministrator($this->getUserCurrent());
}
]
],
],
];
}

public function actionIndex()
{
$settingModule = $this->getSettingModule();
$model = new AdminSettingsForm();
if($model->load(\Yii::$app->request->post()) && $model->validate()) {
foreach($settingModule->getAdminSettingDefinition()->getSettingDetailsFlat() as $settingDetail) {
$settingModule->getAdminSettingBag()->set($settingDetail->getName(), $model->{$settingDetail->getName()});
}
}

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

+ 145
- 0
backend/controllers/admin/StatsAdminController.php View File

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

/**
* Copyright Souke (2018)
*
* contact@souke.fr
*
* 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\admin;

use backend\controllers\BackendController;
use DateInterval;
use DatePeriod;
use DateTime;
use Yii;
use yii\filters\AccessControl;

class StatsAdminController extends BackendController
{
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::class,
'rules' => [
[
'allow' => true,
'roles' => ['@'],
'matchCallback' => function ($rule, $action) {
return $this->getUserModule()
->getAuthorizationChecker()
->isGrantedAsAdministrator($this->getUserCurrent());
}
]
],
],
];
}

public function actionTurnover()
{
$data = [];
$dataLabels = [];
$dateStart = date('Y-m-d', time() - 60 * 60 * 24 * 365);
$dateEnd = date('Y-m-d', time() + 60 * 60 * 24 * 31);
$start = new DateTime($dateStart);
$interval = new DateInterval('P1M');
$end = new DateTime($dateEnd);
$period = new DatePeriod($start, $interval, $end);

foreach ($period as $date) {
$month = date('m/Y', $date->getTimestamp());
$dataLabels[] = $month;

$res = Yii::$app->db->createCommand("SELECT SUM(product_order.price * product_order.quantity) AS total
FROM `order`, product_order, distribution
WHERE `order`.id_distribution = distribution.id
AND `order`.id = product_order.id_order
AND distribution.date >= :date_start
AND distribution.date <= :date_end
")
->bindValue(':date_start', date('Y-m-', $date->getTimestamp()) . '01')
->bindValue(':date_end', date('Y-m-', $date->getTimestamp()) . '31')
->queryOne();

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

}

$dataNoIndex = [];
foreach ($data as $key => $val) {
$dataNoIndex[] = round($val, 2);
}

return $this->render('turnover', [
'dataLabels' => $dataLabels,
'data' => $dataNoIndex,
]);
}

public function actionCustomerOrders()
{
$orderModule = $this->getOrderModule();
$data = [];
$dataLabels = [];
$dateStart = date('Y-m-d', time() - 60 * 60 * 24 * 30);
$dateEnd = date('Y-m-d', time() + 60 * 60 * 24);
$start = new DateTime($dateStart);
$interval = new DateInterval('P1D');
$end = new DateTime($dateEnd);
$period = new DatePeriod($start, $interval, $end);

foreach ($period as $date) {
$dateFormat = date('d/m/Y', $date->getTimestamp());
$dataLabels[] = $dateFormat;
$data[] = $orderModule->countGlobalOrdersByDateAndOrigin($date);
}

return $this->render('customer_orders', [
'dataLabels' => $dataLabels,
'data' => $data,
]);
}

public function actionMatomo()
{
return $this->render('matomo');
}
}

?>

+ 85
- 0
backend/controllers/admin/SupportAdminController.php View File

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

/**
* Copyright Souke (2018)
*
* contact@souke.fr
*
* 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\admin;

use backend\controllers\SupportController;
use domain\Ticket\Ticket\Ticket;
use domain\Ticket\Ticket\TicketSearch;
use yii\filters\AccessControl;

/**
* UserController implements the CRUD actions for User model.
*/
class SupportAdminController extends SupportController
{
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::class,
'rules' => [
[
'allow' => true,
'roles' => ['@'],
'matchCallback' => function ($rule, $action) {
return $this->getUserModule()
->getAuthorizationChecker()
->isGrantedAsAdministrator($this->getUserCurrent());
}
]
],
],
];
}

public function actionIndex()
{
$searchTicket = new TicketSearch();
$dataProviderTicketOpen = $searchTicket->search('admin', ['TicketSearch' => ['status' => Ticket::STATUS_OPEN]]);
$dataProviderTicketClosed = $searchTicket->search('admin', ['TicketSearch' => ['status' => Ticket::STATUS_CLOSED]]);

return $this->render('@backend/views/support/index', [
'context' => 'admin',
'searchTicket' => $searchTicket,
'dataProviderTicketOpen' => $dataProviderTicketOpen,
'dataProviderTicketClosed' => $dataProviderTicketClosed
]);
}

}

+ 135
- 0
backend/controllers/admin/TaxRateAdminController.php View File

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

/**
* Copyright Souke (2018)
*
* contact@souke.fr
*
* 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\admin;

use backend\controllers\BackendController;
use domain\Config\TaxRate\TaxRate;
use yii\data\ActiveDataProvider;
use yii\filters\AccessControl;
use yii\filters\VerbFilter;
use yii\web\NotFoundHttpException;

/**
* TaxRateAdminController implements the CRUD actions for TaxRate model.
*/
class TaxRateAdminController extends BackendController
{
public function behaviors()
{
return [
'verbs' => [
'class' => VerbFilter::class,
'actions' => [
'delete' => ['post'],
],
],
'access' => [
'class' => AccessControl::class,
'rules' => [
[
'allow' => true,
'roles' => ['@'],
'matchCallback' => function ($rule, $action) {
return $this->getUserModule()
->getAuthorizationChecker()
->isGrantedAsAdministrator($this->getUserCurrent());
}
]
],
],
];
}

public function actionIndex()
{
$dataProviderTaxRate = new ActiveDataProvider([
'query' => TaxRate::find()
]);

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

public function actionCreate()
{
$model = $this->getTaxRateModule()->getBuilder()->instanciateTaxRate();

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

public function actionUpdate($id)
{
$model = $this->findModel($id);

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

public function actionDelete(int $id)
{
$taxRate = $this->findModel($id);
$taxRate->delete();
$this->setFlash('success', 'Taxe supprimé');
return $this->redirect(['tax-rate-admin/index']);
}

protected function findModel($id)
{
if (($taxRate = $this->getTaxRateModule()->getRepository()->findOneTaxRateById($id)) !== null) {
return $taxRate;
} else {
throw new NotFoundHttpException('The requested page does not exist.');
}
}

}

+ 139
- 0
backend/controllers/admin/UserAdminController.php View File

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

/**
* Copyright Souke (2018)
*
* contact@souke.fr
*
* 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\admin;

use backend\controllers\BackendController;
use domain\User\User\UserSearch;
use Yii;
use yii\filters\AccessControl;
use yii\web\NotFoundHttpException;

class UserAdminController extends BackendController
{
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::class,
'rules' => [
[
'allow' => true,
'roles' => ['@'],
'matchCallback' => function ($rule, $action) {
return $this->getUserModule()
->getAuthorizationChecker()
->isGrantedAsAdministrator($this->getUserCurrent());
}
]
],
],
];
}

/**
* Liste les utilisateurs.
*/
public function actionIndex()
{
$searchModel = new UserSearch();
$dataProvider = $searchModel->search([
'UserSearch' => isset(\Yii::$app->request->queryParams['UserSearch']) ?
Yii::$app->request->queryParams['UserSearch'] : []
]);

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

public function actionEmailDeliverability()
{
$searchModel = new UserSearch();
$searchModel->problem_receiving_emails = true;
$dataProvider = $searchModel->search([
'UserSearch' => isset(\Yii::$app->request->queryParams['UserSearch']) ?
Yii::$app->request->queryParams['UserSearch'] : []
]);

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

public function actionReportProblemReceivingEmails(int $id)
{
$user = $this->findModel($id);

if($this->getUserModule()->getManager()->reportProblemReceivingEmails($user)) {
$this->setFlash('success', "L'utilisateur <strong>".$this->getUserModule()->getSolver()->getUsername($user)."</strong> a bien été signalé comme ayant des problèmes dans la réception de vos emails. L'administrateur débloquera la situation dès que possible et préviendra l'utilisateur.");
}
else {
$this->setFlash('error', "Une erreur est survenue.");
}

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

public function actionRedirectUpdate(int $idUserProducer)
{
$userCurrent = $this->getUserCurrent();
$userProducer = $this->getUserProducerModule()->getRepository()->findOneUserProducerById($idUserProducer);
if($userProducer) {
$user = $userProducer->user;
$producer = $userProducer->producer;
$this->getUserModule()->getBuilder()->switchProducer($userCurrent, $producer);
return $this->redirect(['user/update', 'id' => $user->id]);
}
else {
$this->addFlash('error', "L'utilisateur n'a pas été trouvé.");
return $this->redirectReferer();
}
}

protected function findModel($id)
{
if (($user = $this->getUserModule()->findOneUserById($id)) !== null) {
return $user;
} else {
throw new NotFoundHttpException("Utilisateur introuvable");
}
}
}

+ 2
- 2
backend/forms/AdminSettingsForm.php View File

@@ -2,7 +2,7 @@

namespace backend\forms;

use common\logic\Setting\SettingModule;
use domain\Setting\SettingModule;
use yii\base\Model;

class AdminSettingsForm extends Model
@@ -22,7 +22,7 @@ class AdminSettingsForm extends Model
$rulesArray = [];
$typesArray = [
'string' => ['string', 'text'],
'date' => ['date'],
'date' => ['safe'],
'boolean' => ['boolean'],
'integer' => ['integer'],
'double' => ['double', 'float'],

+ 35
- 0
backend/forms/ReportPaymentsForm.php View File

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

namespace backend\forms;

use yii\base\Model;

/**
* UploadForm is the model behind the upload form.
*/
class ReportPaymentsForm extends Model
{
var $date_start;
var $date_end;

/**
* @return array the validation rules.
*/
public function rules()
{
return [
[['date_start', 'date_end'], 'required'],
[['date_start', 'date_end'], 'safe'],
];
}

public function attributeLabels()
{
return [
'date_start' => "Date de début",
'date_end' => "Date de fin"
];
}
}

?>

+ 3
- 3
backend/models/AccessUserProducerForm.php View File

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

/**
Copyright distrib (2018)
Copyright Souke (2018)

contact@opendistrib.net
contact@souke.fr

Ce logiciel est un programme informatique servant à aider les producteurs
à distribuer leur production en circuits courts.
@@ -39,7 +39,7 @@ termes.
namespace backend\models;

use common\helpers\GlobalParam;
use common\logic\User\User\Model\User;
use domain\User\User\User;
use yii\base\Model;

/**

+ 5
- 44
backend/models/CreditForm.php View File

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

/**
Copyright distrib (2018)
Copyright Souke (2018)

contact@opendistrib.net
contact@souke.fr

Ce logiciel est un programme informatique servant à aider les producteurs
à distribuer leur production en circuits courts.
@@ -38,11 +38,6 @@ termes.

namespace backend\models;

use common\helpers\GlobalParam;
use common\logic\Payment\Module\PaymentModule;
use common\logic\Producer\Producer\Module\ProducerModule;
use common\logic\User\User\Module\UserModule;
use common\logic\User\UserProducer\Module\UserProducerModule;
use yii\base\Model;

/**
@@ -50,7 +45,6 @@ use yii\base\Model;
*/
class CreditForm extends Model
{

public $id_user ;
public $id_user_action ;
public $id_producer ;
@@ -59,6 +53,7 @@ class CreditForm extends Model
public $mean_payment ;
public $comment ;
public $send_mail = 1;
public $date_transaction;

/**
* @inheritdoc
@@ -68,7 +63,7 @@ class CreditForm extends Model
return [
[['amount'], 'required'],
[['id_user', 'id_user_action', 'id_producer'], 'integer'],
[['date','send_mail'], 'safe'],
[['date', 'send_mail', 'date_transaction'], 'safe'],
[['amount'], 'double'],
[['type', 'mean_payment'], 'string', 'max' => 255],
[['comment'], 'string', 'max' => 2048],
@@ -90,41 +85,7 @@ class CreditForm extends Model
'mean_payment' => 'Moyen de paiement',
'comment' => 'Commentaire',
'send_mail' => 'Prévenir l\'utilisateur',
'date_transaction' => 'Date de transaction'
];
}
/**
* Enregistre un modèle CreditHistorique.
*/
public function save()
{
$userModule = UserModule::getInstance();
$userProducerModule = UserProducerModule::getInstance();
$paymentManager = PaymentModule::getInstance();

if ($this->validate()) {
$user = $userModule->findOneUserById($this->id_user);
$paymentManager->creditOrDebitUser($this->type, $user, $this->amount, $this->mean_payment, $userModule->getCurrent(), $this->comment);
// on prévient l'utilisateur que son compte vient d'être crédité
if($this->send_mail) {
$producer = GlobalParam::getCurrentProducer() ;
$userProducer = $userProducerModule->findOneUserProducer($user);

\Yii::$app->mailerService->sendFromProducer(
'Mouvement de crédit',
'creditUser',
[
'user' => $user,
'producer' => $producer,
'userProducer' => $userProducer,
'creditForm' => $this
],
$user->email,
$producer
);
}
}
}

}

+ 5
- 160
backend/models/MailForm.php View File

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

/**
Copyright distrib (2018)
Copyright Souke (2018)

contact@opendistrib.net
contact@souke.fr

Ce logiciel est un programme informatique servant à aider les producteurs
à distribuer leur production en circuits courts.
@@ -39,17 +39,10 @@ termes.
namespace backend\models;

use common\helpers\GlobalParam;
use common\helpers\Mailjet;
use common\logic\Config\Unit\Service\UnitDefinition;
use common\logic\Distribution\Distribution\Model\Distribution;
use common\logic\Distribution\Distribution\Module\DistributionModule;
use common\logic\Producer\Producer\Module\ProducerModule;
use common\logic\Product\Product\Model\Product;
use common\logic\Product\Product\Module\ProductModule;
use domain\Communication\Email\EmailGenerator;
use domain\Distribution\Distribution\DistributionModule;
use Yii;
use yii\base\Model;
use common\helpers\Price ;
use yii\helpers\Html;

/**
* ContactForm is the model behind the contact form.
@@ -59,7 +52,7 @@ class MailForm extends Model
public $id_distribution ;
public $subject;
public $message;
public $integrate_product_list = false;
public $integrate_product_list;

/**
* @inheritdoc
@@ -85,152 +78,4 @@ class MailForm extends Model
'integrate_product_list' => 'Intégrer la liste des produits au message'
];
}

/**
* Envoie un email aux utilisateurs définis en paramètre.
*
* @param array $usersArray
* @param boolean $fromProducer
*/
public function sendEmail($usersArray, $fromProducer = true)
{
$productModule = ProductModule::getInstance();
$producerModule = ProducerModule::getInstance();
$distributionModule =DistributionModule::getInstance();

$mj = new \Mailjet\Client(
Mailjet::getApiKey('public'),
Mailjet::getApiKey('private'),
true,
['version' => 'v3.1']
);

$body = ['Messages' => []] ;
$messageAutoText = '' ;
$messageAutoHtml = '' ;
if($this->id_distribution) {
$messageAutoText = '

' ;
$messageAutoHtml = '<br /><br />' ;
$distribution = Distribution::searchOne(['id' => $this->id_distribution]) ;
if($distribution) {
$linkOrder = $distributionModule->getLinkOrder($distribution);
$dateOrder = strftime('%A %d %B %Y', strtotime($distribution->date)) ;
$messageAutoHtml .= '<a href="'.$linkOrder.'">Passer ma commande du '.$dateOrder.'</a>' ;
$messageAutoText .= 'Suivez ce lien pour passer votre commande du '.$dateOrder.' :
'.$linkOrder ;

if($this->integrate_product_list) {
$productsArray = Product::find()
->where([
'id_producer' => GlobalParam::getCurrentProducerId(),
])
->andWhere('status >= :status')
->addParams(['status' => Product::STATUS_OFFLINE])
->innerJoinWith(['productDistribution' => function($query) use($distribution) {
$query->andOnCondition([
'product_distribution.id_distribution' => $distribution->id,
'product_distribution.active' => 1
]);
}])
->orderBy('product.name ASC')
->all();

if(count($productsArray) > 1) {
$messageAutoHtml .= '<br /><br />Produits disponibles : <br /><ul>' ;
$messageAutoText .= '

Produits disponibles :
' ;
foreach($productsArray as $product) {

$productDescription = $product->name ;
if(strlen($product->description)) {
$productDescription .= ' / '.$product->description ;
}
if($product->price) {
$productDescription .= ' / '.Price::format($productModule->getPriceWithTax($product)) ;
$productDescription .= ' ('. $productModule->getSolver()->strUnit($product, UnitDefinition::WORDING_UNIT).')' ;
}

$messageAutoText .= '- '.$productDescription.'
' ;
$messageAutoHtml .= '<li>'.Html::encode($productDescription).'</li>' ;
}
$messageAutoHtml .= '</ul>' ;
}
}
}
}

if($fromProducer) {
$producer = GlobalParam::getCurrentProducer() ;
$fromEmail = $producerModule->getEmailOpendistrib($producer) ;
$fromName = $producer->name ;

$linkProducer = 'https://'.$producer->slug.'.opendistrib.net';
$linkUnsubscribe = Yii::$app->urlManagerProducer->createAbsoluteUrl(['newsletter/unsubscribe', 'slug_producer' => $producer->slug]);

// Message inscription newsletter
$messageAutoText .= "

--
Boutique : ".$linkProducer."
Me désinscrire : ".$linkUnsubscribe;

$messageAutoHtml .= "<br /><br />--<br>";
$messageAutoHtml .= "Boutique : <a href=\"".$linkProducer."\">".$linkProducer."</a><br>";
$messageAutoHtml .= "Me désinscrire : <a href=\"".$linkUnsubscribe."\">".$linkUnsubscribe."</a>";
}
else {
$fromEmail = 'contact@opendistrib.net' ;
$fromName = 'Opendistrib' ;
}

// Tests
/*$usersArray = [
['email' => 'contact@guillaumebourgeois.fr', 'name' => '', 'lastname' => '']
];*/

foreach($usersArray as $user) {
$body['Messages'][] = [
'From' => [
'Email' => $fromEmail,
'Name' => $fromName
],
'To' => [
[
'Email' => $user['email'],
'Name' => $user['name'].' '.$user['lastname']
]
],
'Subject' => $this->subject,
'TextPart' => $this->message.$messageAutoText,
'HTMLPart' => nl2br($this->message).$messageAutoHtml
] ;

if(count($body['Messages']) == 50) {
$response = $mj->post(\Mailjet\Resources::$Email, ['body' => $body]);
$body['Messages'] = [] ;
}
}

if(count($body['Messages']) > 0) {
$response = $mj->post(\Mailjet\Resources::$Email, ['body' => $body]);
}
$success = $response->success() ;
if(!$success) {
Yii::error($response->getBody(), 'Mailjet');
}
return $response ;
}
}

+ 14
- 0
backend/views/_include/form_actions.php View File

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

use yii\helpers\Html;

?>

<div class="form-group form-actions">
<?php if(isset($form)): ?>
<?= $form->field($model, 'redirect_url', ['options' => ['class' => 'field-redirect-url']])->hiddenInput() ?>
<?php endif; ?>
<?= Html::a('Retour', ['index'], ['class' => 'btn btn-default']) ?>
<?= Html::submitButton($model->isNewRecord ? 'Créer' : 'Modifier', ['class' => 'btn btn-primary', 'name' => 'save']) ?>
<?= Html::submitButton($model->isNewRecord ? 'Créer et rester' : 'Modifier et rester', ['class' => 'btn btn-primary', 'name' => 'save-stay']) ?>
</div>

+ 17
- 0
backend/views/_include/small_box.php View File

@@ -0,0 +1,17 @@

<div class="small-box bg-<?= $backgroundColor ?>">
<div class="inner">
<h3><?= $title ?></h3>
<p><?= $description ?></p>
</div>
<div class="icon">
<i class="fa fa-<?= $icon ?>"></i>
</div>
<?php if(isset($footerLinkUrl) && $footerLinkUrl): ?>
<a href="<?= $footerLinkUrl ?>" class="small-box-footer">
<?= $footerLinkLabel ?> <i class="fa fa-<?= $footerLinkIcon ?>"></i>
</a>
<?php else: ?>
<div class="small-box-footer">&nbsp;</div>
<?php endif; ?>
</div>

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

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

/**
Copyright distrib (2018)
Copyright Souke (2018)

contact@opendistrib.net
contact@souke.fr

Ce logiciel est un programme informatique servant à aider les producteurs
à distribuer leur production en circuits courts.
@@ -73,7 +73,7 @@ $this->setTitle('Accès') ;
</tr>
<?php foreach($usersAccessArray as $user): ?>
<tr>
<td><?= Html::encode($user->lastname.' '.$user->name) ?></td>
<td><?= Html::encode($userModule->getSolver()->getUsername($user)) ?></td>
<td><?= Html::a('<span class="glyphicon glyphicon-trash"></span>',['access/delete','idUser' => $user->id], ['class' => 'btn btn-default']); ?></td>
</tr>
<?php endforeach; ?>

+ 78
- 0
backend/views/accessory/_form.php View File

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

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

use yii\helpers\ArrayHelper;
use yii\helpers\Html;
use yii\widgets\ActiveForm;

?>

<div class="accessory-form">
<?php $form = ActiveForm::begin(); ?>
<div class="col-md-8">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">
<i class="fa fa-th-list"></i>
Général
</h3>
</div>
<div class="panel-body">
<?= $form->field($accessory, 'name')->textInput() ?>
<?= $form->field($accessory, 'quantity')->textInput() ?>
</div>
</div>
<div class="panel panel-default" id="panel-products">
<div class="panel-heading">
<h3 class="panel-title">
<i class="fa fa-clone"></i>
Produits
</h3>
</div>
<div class="panel-body">
<?= Html::activeCheckboxList($accessory, 'selected_products_ids', ArrayHelper::map($productsArray, 'id', function ($product, $defaultValue) {
return Html::encode($product->name);
}), ['encode' => false, 'class' => '']) ?>
</div>
</div>
</div>
<?= $this->render('@backend/views/_include/form_actions.php',[
'model' => $accessory,
]); ?>
<?php ActiveForm::end(); ?>
</div>

+ 50
- 0
backend/views/accessory/create.php View File

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

/**
Copyright Souke (2018)

contact@souke.fr

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

$this->setTitle("Ajouter un accessoire") ;
$this->addBreadcrumb(['label' => "Accessoires", 'url' => ['index']]) ;
$this->addBreadcrumb('Ajouter') ;

?>

<div class="accessory-create">
<?= $this->render('_form', [
'accessory' => $accessory,
'productsArray' => $productsArray
]) ?>
</div>

+ 91
- 0
backend/views/accessory/index.php View File

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

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

use common\components\View;
use yii\helpers\Html;
use yii\grid\GridView;

/**
* @var View $this
*/

$this->setTitle('Accessoires');
$this->addBreadcrumb($this->getTitle());
$this->addButton(['label' => 'Nouvel accessoire <span class="glyphicon glyphicon-plus"></span>', 'url' => 'accessory/create', 'class' => 'btn btn-primary']);

?>

<div class="accessory-index">
<?= GridView::widget([
'dataProvider' => $dataProvider,
'columns' => [
'name',
'quantity',
[
'label' => 'Produits',
'format' => 'raw',
'value' => function($accessory) {
$html = '';
foreach($accessory->getProductAccessories() as $productAccessory) {
$html .= '<span class="label label-default">'.Html::encode($productAccessory->getProduct()->name).'</span>&nbsp;';
}

return $html;
}
],
[
'class' => 'yii\grid\ActionColumn',
'template' => '{update} {delete}',
'headerOptions' => ['class' => 'column-actions'],
'contentOptions' => ['class' => 'column-actions'],
'buttons' => [
'update' => function ($url, $model) {
return Html::a('<span class="glyphicon glyphicon-pencil"></span>', $url, [
'title' => 'Modifier', 'class' => 'btn btn-default'
]);
},
'delete' => function ($url, $model) {
return Html::a('<span class="glyphicon glyphicon-trash"></span>', $url, [
'title' => 'Supprimer', 'class' => 'btn btn-default'
]);
}
],
],
],
]); ?>
</div>

+ 53
- 0
backend/views/accessory/update.php View File

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

/**
Copyright Souke (2018)

contact@souke.fr

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

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

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

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

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

use yii\helpers\Html;

$this->setTitle("Modifier un accessoire") ;
$this->addBreadcrumb(['label' => "Accessoires", 'url' => ['index']]) ;
$this->addBreadcrumb(['label' => Html::encode($accessory->getName()), 'url' => ['update', 'id' => $accessory->getId()]]) ;
$this->addBreadcrumb('Modifier') ;

?>

<div class="accessory-update">
<?= $this->render('_form', [
'accessory' => $accessory,
'productsArray' => $productsArray
]) ?>
</div>

+ 92
- 0
backend/views/automatic-email/_form.php View File

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

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

use common\components\Date;
use common\helpers\Dropdown;
use lo\widgets\Toggle;
use yii\widgets\ActiveForm;

?>

<div class="automatic-email-form">
<?php $form = ActiveForm::begin(['enableClientValidation' => false]); ?>
<div class="col-md-8">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">
<i class="fa fa-th-list"></i>
Général
</h3>
</div>
<div class="panel-body">
<?= $form->field($automaticEmail, 'status')->widget(Toggle::class,
[
'options' => [
'data-id' => $automaticEmail->id,
'data-on' => 'Activé',
'data-off' => 'Désactivé'
],
]);
?>
<?= $form->field($automaticEmail, 'day')->dropDownList(Date::getDaysOfWeekArray()) ?>
<?= $form->field($automaticEmail, 'delay_before_distribution')->dropDownList(Dropdown::numberChoices(1, 7, false, ' jour(s) avant')); ?>
<?= $form->field($automaticEmail, 'subject')->textInput() ?>
<?= $form->field($automaticEmail, 'message')->widget(letyii\tinymce\Tinymce::class, [
'configs' => [
'plugins' => Yii::$app->parameterBag->get('tinyMcePlugins'),
]
]); ?>
<?= $form->field($automaticEmail, 'integrate_product_list')->widget(Toggle::class,
[
'options' => [
'data-id' => $automaticEmail->id,
'data-on' => 'Oui',
'data-off' => 'Non',
'data-offstyle' => 'default',
],
]);
?>
</div>
</div>
</div>

<?= $this->render('@backend/views/_include/form_actions.php',[
'model' => $automaticEmail,
]); ?>
<?php ActiveForm::end(); ?>
</div>

+ 49
- 0
backend/views/automatic-email/create.php View File

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

/**
Copyright Souke (2018)

contact@souke.fr

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

$this->setTitle("Ajouter un email automatique") ;
$this->addBreadcrumb(['label' => "Emails automatiques", 'url' => ['index']]) ;
$this->addBreadcrumb('Ajouter') ;

?>

<div class="automatic-email-create">
<?= $this->render('_form', [
'automaticEmail' => $automaticEmail,
]) ?>
</div>

+ 109
- 0
backend/views/automatic-email/index.php View File

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

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

use common\components\View;
use domain\Communication\AutomaticEmail\AutomaticEmail;
use yii\helpers\Html;
use yii\grid\GridView;

/**
* @var View $this
*/

$this->setTitle('Emails automatiques');
$this->addBreadcrumb($this->getTitle());
$this->addButton(['label' => 'Nouvel email automatique <span class="glyphicon glyphicon-plus"></span>', 'url' => 'automatic-email/create', 'class' => 'btn btn-primary']);

?>

<div class="callout callout-info">
<p>
<i class="icon fa fa-info-circle"></i>
L'heure d'envoi des emails automatiques est programmée à 7h
</p>
</div>

<div class="automatic-email-index">
<?= GridView::widget([
'dataProvider' => $dataProvider,
'columns' => [
[
'attribute' => 'day',
'value' => function(AutomaticEmail $automaticEmail) {
return $automaticEmail->getDayAsString();
}
],
[
'attribute' => 'delay_before_distribution',
'value' => function(AutomaticEmail $automaticEmail) {
return $automaticEmail->getDelayBeforeDistributionAsString();
}
],
'subject',
[
'attribute' => 'message',
'format' => 'raw',
],
[
'attribute' => 'status',
'format' => 'raw',
'value' => function(AutomaticEmail $automaticEmail) {
return $automaticEmail->getStatusAsHtml();
}
],
[
'class' => 'yii\grid\ActionColumn',
'template' => '{update} {delete}',
'headerOptions' => ['class' => 'column-actions'],
'contentOptions' => ['class' => 'column-actions'],
'buttons' => [
'update' => function ($url, $model) {
return Html::a('<span class="glyphicon glyphicon-pencil"></span>', $url, [
'title' => 'Modifier', 'class' => 'btn btn-default'
]);
},
'delete' => function ($url, $model) {
return Html::a('<span class="glyphicon glyphicon-trash"></span>', $url, [
'title' => 'Supprimer', 'class' => 'btn btn-default'
]);
}
],
],
],
]); ?>
</div>

+ 52
- 0
backend/views/automatic-email/update.php View File

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

/**
Copyright Souke (2018)

contact@souke.fr

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

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

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

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

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

use yii\helpers\Html;

$this->setTitle("Modifier un email automatique") ;
$this->addBreadcrumb(['label' => "Emails automatiques", 'url' => ['index']]) ;
$this->addBreadcrumb(['label' => Html::encode($automaticEmail->getSubject()), 'url' => ['update', 'id' => $automaticEmail->getId()]]) ;
$this->addBreadcrumb('Modifier') ;

?>

<div class="automatic-email-update">
<?= $this->render('_form', [
'automaticEmail' => $automaticEmail,
]) ?>
</div>

+ 3
- 3
backend/views/communicate-admin/index.php View File

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

/**
Copyright distrib (2018)
Copyright Souke (2018)

contact@opendistrib.net
contact@souke.fr

Ce logiciel est un programme informatique servant à aider les producteurs
à distribuer leur production en circuits courts.
@@ -40,7 +40,7 @@ use yii\helpers\Html ;
use yii\widgets\ActiveForm;

$this->setTitle('Envoyer un email') ;
$this->addBreadcrumb(['label' => 'Communiquer', 'url' => ['user/index']]) ;
$this->addBreadcrumb(['label' => 'Communication', 'url' => ['user/index']]) ;
$this->addBreadcrumb($this->getTitle()) ;

?>

+ 129
- 0
backend/views/communicate/email.php View File

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

/**
Copyright Souke (2018)

contact@souke.fr

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

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

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

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

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

use domain\Communication\Email\Email;
use yii\helpers\Html ;
use yii\widgets\ActiveForm;

$this->setTitle('Envoyer un email') ;
$this->addBreadcrumb(['label' => 'Utilisateurs', 'url' => ['user/index']]) ;
$this->addBreadcrumb($this->getTitle()) ;

?>

<?=

$this->render('@backend/views/user/_menu_filter.php',[
'section' => 'email',
'idPointSaleActive' => $idPointSaleActive,
'sectionInactiveUsers' => isset($sectionInactiveUsers) ? $sectionInactiveUsers : null,
'sectionSubscribers' => isset($sectionSubscribers) ? $sectionSubscribers: null,
'pointsSaleArray' => $pointsSaleArray,
'idDistributionActive' => $idDistributionActive,
'incomingDistributionsArray' => $incomingDistributionsArray,
'incomingDistributionsDatesArray' => $incomingDistributionsDatesArray,
]) ;

?>

<div class="communication-email row">
<div class="col-md-8">
<div id="panel-mail-form" class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">Envoyer un email</h3>
</div>
<div class="panel-body">
<div class="newsletter-type">
<strong>Type d'email</strong>
<div>
<?php $linkParamsArray = ['idPointSale' => $idPointSaleActive, 'idDistribution' => $idDistributionActive, 'usersPointSaleLink' => $usersPointSaleLink, 'usersPointSaleHasOrder' => $usersPointSaleHasOrder, 'sectionSubscribers' => $sectionSubscribers, 'sectionInactiveUsers' => $sectionInactiveUsers]; ?>
<a class="btn <?= ($newsletterType == Email::TYPE_ORDER_TAKING) ? 'btn-primary' : 'btn-default'; ?>" href="<?= Yii::$app->urlManager->createUrl(['communicate/email', 'newsletterType' => Email::TYPE_ORDER_TAKING] + $linkParamsArray) ?>">Prise de commande</a>
<a class="btn <?= ($newsletterType == Email::TYPE_NEWSLETTER) ? 'btn-primary' : 'btn-default'; ?>" href="<?= Yii::$app->urlManager->createUrl(['communicate/email', 'newsletterType' => Email::TYPE_NEWSLETTER] + $linkParamsArray) ?>">Actualité</a>
</div>
</div>

<?php if($newsletterType): ?>
<?php $form = ActiveForm::begin(['enableClientValidation' => false]); ?>
<?php if($newsletterType == Email::TYPE_ORDER_TAKING): ?>
<?= $form->field($mailForm, 'id_distribution')->dropDownList($incomingDistributionsDatesArray)
->hint("Sélectionnez une distribution pour ajouter automatiquement au message un lien vers la prise de commande de cette distribution"); ?>
<?php endif; ?>
<?= $form->field($mailForm, 'subject')->textInput() ; ?>
<?= $form->field($mailForm, 'message')->widget(letyii\tinymce\Tinymce::class, [
'configs' => [
'plugins' => Yii::$app->parameterBag->get('tinyMcePlugins')
],
]); ?>
<?php if($newsletterType == Email::TYPE_ORDER_TAKING): ?>
<?= $form->field($mailForm, 'integrate_product_list')->checkbox() ; ?>
<?php endif; ?>
<div class="form-group form-buttons">
<?= Html::submitButton( 'Envoyer', ['class' => 'btn btn-primary']) ?>
</div>
<?php ActiveForm::end(); ?>
<?php endif; ?>
</div>
</div>
</div>
<div class="col-md-4">
<?php if($newsletterType): ?>
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">
Liste des emails <span class="label label-default"><?= count($usersArray); ?></span>
</h3>
</div>
<div class="panel-body">

<?php if($idPointSaleActive): ?>
<a class="btn btn-xs <?php if($usersPointSaleLink): ?>btn-primary<?php else: ?>btn-default<?php endif; ?>" href="<?= Yii::$app->urlManager->createUrl(['communicate/email','idPointSale' => $idPointSaleActive, 'idDistribution' => $idDistributionActive, 'usersPointSaleLink' => 1, 'newsletterType' => $newsletterType]); ?>">Liés au point de vente</a>
<a class="btn btn-xs <?php if($usersPointSaleHasOrder): ?>btn-primary<?php else: ?>btn-default<?php endif; ?>" href="<?= Yii::$app->urlManager->createUrl(['communicate/email','idPointSale' => $idPointSaleActive, 'idDistribution' => $idDistributionActive, 'usersPointSaleHasOrder' => 1, 'newsletterType' => $newsletterType]); ?>">Déjà commandés dans ce point de vente</a>
<br /><br />
<?php endif; ?>

<?= implode(', ', array_map(function($user) {
return $user['email'];
}, $usersArray)); ?>
</div>
</div>
<?php endif; ?>
</div>
<div class="clr"></div>
</div>



+ 0
- 77
backend/views/communicate/index.php View File

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

/**
Copyright distrib (2018)

contact@opendistrib.net

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

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

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

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

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

use yii\helpers\Html ;

$this->setTitle('Communiquer') ;
$this->addBreadcrumb('Communiquer') ;

?>

<div class="col-md-6">
<div id="email" class="panel panel-default" v-if="date">
<div class="panel-heading">
<h3 class="panel-title">Envoyer un email</h3>
</div>
<div class="panel-body">
<p>Choisissez à quels utilisateurs vous souhaitez envoyer un email :</p>
<div>
<?= Html::a('<span class="glyphicon glyphicon-th-list"></span> Tous',['user/mail', 'idPointSale' => 0], ['class' => 'btn btn-default btn-point-sale']); ?>
<?= Html::a('<span class="glyphicon glyphicon-repeat"></span> Abonnés',['user/mail', 'sectionSubscribers' => 1], ['class' => 'btn btn-default btn-point-sale']); ?>
<?= Html::a('<span class="glyphicon glyphicon-time"></span> Inactifs',['user/mail', 'sectionInactiveUsers' => 1], ['class' => 'btn btn-default btn-point-sale']); ?>
<?php foreach($pointsSaleArray as $pointSale): ?>
<?= Html::a('<span class="glyphicon glyphicon-map-marker"></span> '.Html::encode($pointSale->name), ['user/mail', 'idPointSale' => $pointSale->id], ['class' => 'btn btn-default btn-point-sale']); ?>
<?php endforeach; ?>
</div>
</div>
</div>
</div>

<div class="col-md-6">
<div id="paper" class="panel panel-default" v-if="date">
<div class="panel-heading">
<h3 class="panel-title">Communiquer par papier</h3>
</div>
<div class="panel-body">
<p>Imprimez ce petit encart pour indiquer à vos clients l'adresse internet leur permettant de passer leurs commandes.</p>
<?php echo $this->render('instructions', ['producer' => $producer]) ; ?>
<p><?php echo Html::a('<span class="glyphicon glyphicon-download-alt"></span> Télécharger', ['communicate/instructions'], ['class'=>'btn btn-primary']) ?></p>
</div>
</div>
</div>


+ 3
- 3
backend/views/communicate/instructions.php View File

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

/**
Copyright distrib (2018)
Copyright Souke (2018)

contact@opendistrib.net
contact@souke.fr

Ce logiciel est un programme informatique servant à aider les producteurs
à distribuer leur production en circuits courts.
@@ -47,5 +47,5 @@ use yii\helpers\Html ;
</div>
<div class="clr"></div>
<h3>Pour réserver vos produits en ligne :</h3>
<h4><span><?= Html::encode($producer->slug).'.opendistrib.net' ?></span></h4>
<h4><span><?= Html::encode($producer->slug).'.souke.fr' ?></span></h4>
</div>

+ 2
- 2
backend/views/communicate/instructions_multi.php View File

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

/**
Copyright distrib (2018)
Copyright Souke (2018)

contact@opendistrib.net
contact@souke.fr

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

+ 56
- 0
backend/views/communicate/paper.php View File

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

/**
Copyright Souke (2018)

contact@souke.fr

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

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

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

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

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

use yii\helpers\Html ;

$this->setTitle('Communication par papier') ;
$this->addBreadcrumb('Communication') ;

?>

<div id="paper" class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">Encart à imprimer</h3>
</div>
<div class="panel-body">
<p>Imprimez cet encart pour indiquer à vos clients l'adresse internet leur permettant de passer leurs commandes.</p>
<?php echo $this->render('instructions', ['producer' => $producer]) ; ?>
<p><?php echo Html::a('<span class="glyphicon glyphicon-download-alt"></span> Télécharger', ['communicate/instructions'], ['class'=>'btn btn-primary']) ?></p>
</div>
</div>


+ 6
- 6
backend/views/credit/index.php View File

@@ -5,7 +5,7 @@ use yii\grid\GridView;

$userModule = $this->getUserModule();

$this->setTitle('Crédit');
$this->setTitle('Cagnotte');

?>

@@ -15,7 +15,7 @@ $this->setTitle('Crédit');
<span class="info-box-icon <?= $sumUserProducerCredits >= 0 ? 'bg-green' : 'bg-red' ?>"><i
class="fa fa-euro"></i></span>
<div class="info-box-content">
<span class="info-box-text">Somme totale en crédit</span>
<span class="info-box-text">Somme totale en cagnotte</span>
<span class="info-box-number"><?= Price::format($sumUserProducerCredits); ?></span>
</div>
</div>
@@ -25,15 +25,15 @@ $this->setTitle('Crédit');
<span class="info-box-icon bg-orange"><i class="fa fa-download"></i></span>
<div class="info-box-content">
<span class="info-box-text">Exports<br />
<a class="btn btn-default btn-sm" href="<?= Yii::$app->urlManager->createUrl(['credit/export-users', 'type' => 'negative']); ?>">Clients au crédit négatif (CSV)</a>
<a class="btn btn-default btn-sm" href="<?= Yii::$app->urlManager->createUrl(['credit/export-users', 'type' => 'positive']); ?>">Clients au crédit positif (CSV)</a>
<a class="btn btn-default btn-sm" href="<?= Yii::$app->urlManager->createUrl(['credit/export-users', 'type' => 'negative']); ?>">Clients en négatif (CSV)</a>
<a class="btn btn-default btn-sm" href="<?= Yii::$app->urlManager->createUrl(['credit/export-users', 'type' => 'positive']); ?>">Clients en positif (CSV)</a>
</span>
</div>
</div>
</div>
</div>

<h3>Clients avec un crédit négatif</h3>
<h3>Clients avec une cagnotte en négatif</h3>

<?=

@@ -68,7 +68,7 @@ GridView::widget([
}
],
[
'label' => 'Crédit',
'label' => 'Cagnotte',
'format' => 'raw',
'value' => function ($user) {
return Price::format($user['credit']);

+ 94
- 0
backend/views/dashboard-admin/_statistics.php View File

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

use common\helpers\AdminLTE;
use common\helpers\Price;

?>

<div class="row">
<div class="col-lg-6 col-xs-6">
<?= AdminLTE::smallBox(
$countProducersActive,
'Producteurs actifs sur les 3 derniers mois',
'aqua',
'user'
) ?>
</div>
<div class="col-lg-6 col-xs-6">
<?= AdminLTE::smallBox(
$countUsersActive,
'Clients actifs sur les 3 derniers mois',
'aqua',
'users'
) ?>
</div>
</div>
<div class="row">
<div class="col-lg-6 col-xs-6">
<?= AdminLTE::smallBox(
$countPointSalesActive,
'Points de vente actifs sur les 3 derniers mois',
'aqua',
'map-marker'
) ?>
</div>
<div class="col-lg-6 col-xs-6">
<?= AdminLTE::smallBox(
$averageOrdersPerDay,
'Commandes clients / jour sur les 7 derniers jours',
'aqua',
'shopping-cart',
Yii::$app->urlManager->createUrl('stats-admin/turnover')
) ?>
</div>
</div>
<div class="row">
<div class="col-lg-6 col-xs-6">
<?= AdminLTE::smallBox(
$numberVisitsDay,
'Visites / jour en moyenne sur les 30 derniers jours',
'aqua',
'eye'
) ?>
</div>
<div class="col-lg-6 col-xs-6">
<?= AdminLTE::smallBox(
Price::format($turnoverLastThirtyDays, 0),
'CA total producteurs sur les 30 derniers jours',
'aqua',
'line-chart',
Yii::$app->urlManager->createUrl('stats-admin/turnover')
) ?>
</div>
</div>
<div class="row">
<div class="col-lg-6 col-xs-6">
<?= AdminLTE::smallBox(
Price::format($amountToBillCurrentMonth, 0),
'Total factures producteurs mois en cours',
'green',
'euro',
Yii::$app->urlManager->createUrl('producer-admin/index')
) ?>
</div>
<div class="col-lg-6 col-xs-6">
<?= AdminLTE::smallBox(
Price::format($amountBilledLastMonth, 0),
'Total factures producteurs du mois dernier',
'green',
'euro',
Yii::$app->urlManager->createUrl('producer-admin/index')
) ?>
</div>
</div>
<div class="row">
<div class="col-lg-6 col-xs-6">
<?= AdminLTE::smallBox(
Price::format($amountProducerUnpaidInvoices, 0),
'Montant factures producteurs impayées',
'red',
'euro',
Yii::$app->parameterBag->get('dolibarrUrl') . 'compta/facture/list.php?leftmenu=customers_bills_notpaid&search_status=1'
) ?>
</div>
</div>

+ 94
- 0
backend/views/dashboard-admin/index.php View File

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

use common\helpers\AdminLTE;
use common\helpers\Image;
use yii\helpers\Html;

$this->setTitle('Tableau de bord');
$this->setMetaRefresh(true);

?>

<div class="dashboard-admin-index">

<div id="producers-online" class="box box-solid">
<div class="box-header with-border">
<i class="fa fa-bookmark"></i>
<h3 class="box-title">Producteurs en ligne</h3>
</div>
<div class="box-body">
<?php if($usersWithStatusProducerOnlineArray && count($usersWithStatusProducerOnlineArray) > 0): ?>
<?php foreach ($usersWithStatusProducerOnlineArray as $userWithStatusProducerOnline): ?>
<?php $producer = $userWithStatusProducerOnline->producer; ?>
<?php if($producer): ?>
<a class="btn btn-default" title="Aller sur le compte de ce producteur" href="<?= $this->getUrlManagerBackend()->createUrl(['site/switch-producer', 'id' => $producer->id]); ?>">
<?= $producer->name; ?>
</a>
<?php endif; ?>
<?php endforeach; ?>
<div class="clr"></div>
<?php else: ?>
<p><em>Aucun producteur en ligne actuellement.</em></p>
<?php endif; ?>
</div>
</div>

<div class="row">
<div class="col-lg-6 col-xs-6">
<?= AdminLTE::smallBox(
$countUsersOnline,
'Utilisateurs en ligne',
$countUsersOnline ? 'green' : 'blue',
'wifi',
Yii::$app->urlManager->createUrl('online-admin/index')
) ?>
</div>
<div class="col-lg-6 col-xs-6">
<?php $countUsersWithProblemReceivingEmails = $this->getUserModule()->getRepository()->countUsersWithProblemReceivingEmails(); ?>
<?= AdminLTE::smallBox(
$countUsersWithProblemReceivingEmails,
'Problèmes réception emails',
$countUsersWithProblemReceivingEmails ? 'red' : 'green',
'send',
Yii::$app->urlManager->createUrl('user-admin/email-deliverability')
) ?>
</div>
</div>
<div class="row">
<div class="col-lg-6 col-xs-6">
<?= AdminLTE::smallBox(
$supportOnline ? 'Oui' : 'Non',
'Support activé',
$supportOnline ? 'green' : 'blue',
'phone',
Yii::$app->urlManager->createUrl(['dashboard-admin/support-online-toggle', 'active' => $supportOnline ? 0 : 1]),
$supportOnline ? 'Désactiver' : 'Activer'
) ?>
</div>
<div class="col-lg-6 col-xs-6">
<?php
$colorBoxTicket = 'blue';
if($countTicketsAdminOpen == 0) {
$colorBoxTicket = 'green';
}
elseif($countTicketsAdminUnread == 0) {
$colorBoxTicket = 'blue';
}
elseif($countTicketsAdminUnread > 0) {
$colorBoxTicket = 'red';
}
?>
<?= AdminLTE::smallBox(
$countTicketsAdminOpen,
'Tickets',
$colorBoxTicket,
'comments',
Yii::$app->urlManager->createUrl('support-admin/index')
) ?>
</div>
</div>

<div id="dashboard-admin-statistics-html">
<a class="btn btn-default btn-load" href="javascript:void(0);">Charger les statistiques</a>
</div>
</div>

+ 32
- 22
backend/views/dashboard/index.php View File

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

/**
Copyright distrib (2018)
Copyright Souke (2018)

contact@opendistrib.net
contact@souke.fr

Ce logiciel est un programme informatique servant à aider les producteurs
à distribuer leur production en circuits courts.
@@ -36,15 +36,16 @@ pris connaissance de la licence CeCILL, et que vous en avez accepté les
termes.
*/

use common\helpers\GlobalParam;
use common\logic\Distribution\Distribution\Module\DistributionModule;
use common\logic\Order\Order\Model\Order;
use common\logic\Order\Order\Module\OrderModule;
use common\logic\Producer\Producer\Module\ProducerModule;
use common\logic\Setting\SettingModule;
use common\logic\Subscription\Subscription\Module\SubscriptionModule;
use common\logic\User\User\Module\UserModule;
use yii\helpers\Html ;
use domain\Distribution\Distribution\DistributionModule;
use domain\Feature\Feature\Feature;
use domain\Feature\Feature\FeatureModule;
use domain\Order\Order\Order;
use domain\Order\Order\OrderModule;
use domain\Producer\Producer\ProducerModule;
use domain\Setting\SettingModule;
use domain\Subscription\Subscription\SubscriptionModule;
use domain\User\User\UserModule;
use yii\helpers\Html;

$distributionModule = DistributionModule::getInstance();
$userModule = UserModule::getInstance();
@@ -53,13 +54,13 @@ $subscriptionModule = SubscriptionModule::getInstance();
$producerModule = ProducerModule::getInstance();
$settingModule = SettingModule::getInstance();
$adminSettingBag = $settingModule->getAdminSettingBag();
$featureChecker = FeatureModule::getInstance()->getChecker();

$this->setTitle('Tableau de bord');

?>
<div class="dashboard-index">

<div <?php if($adminSettingBag->get('forumFlarumUrl')): ?>class="col-md-8"<?php endif; ?>>
<div <?php if($featureChecker->isEnabled(Feature::ALIAS_FORUM)): ?>class="col-md-8"<?php endif; ?>>
<?php if(Yii::$app->request->get('error_products_points_sale')): ?>
<div class="alert alert-warning">
Vous devez ajouter <?php if(!$productsCount): ?> des produits<?php endif; ?>
@@ -117,7 +118,7 @@ $this->setTitle('Tableau de bord');
<div class="info-box-content">
<span class="info-box-text">
<?php if(count($distribution->order)): ?>
<strong><?= count($distribution->order); ?></strong> COMMANDES
<strong><?= $distribution->countOrders(); ?></strong> COMMANDES
<?php else: ?>
AUCUNE COMMANDE
<?php endif; ?>
@@ -144,7 +145,7 @@ $this->setTitle('Tableau de bord');
<?php endif; ?>
</div>

<?php if($adminSettingBag->get('forumFlarumUrl')): ?>
<?php if($featureChecker->isEnabled(Feature::ALIAS_FORUM)): ?>
<div class="col-md-4">
<div class="panel panel-default">
<div class="panel-heading">
@@ -153,13 +154,11 @@ $this->setTitle('Tableau de bord');
</h3>
</div>
<div class="panel-body">
<?php //echo print_r($forumDiscussionsArray); ?>
<?php if($forumDiscussionsArray && count($forumDiscussionsArray['data'])): ?>
<table class="table">
<?php $forumDiscussionsLimitedArray = array_slice($forumDiscussionsArray['data'], 0, min(3, count($forumDiscussionsArray['data']))); ?>
<?php foreach($forumDiscussionsLimitedArray as $forumDiscussion): ?>
<tr>
<?php //echo print_r($forumDiscussion); ?>
<td><?= $forumDiscussion['attributes']['title']; ?></td>
<td><?= date('d/m à H:i', strtotime($forumDiscussion['attributes']['lastPostedAt'])); ?></td>
</tr>
@@ -169,7 +168,7 @@ $this->setTitle('Tableau de bord');
<p>Aucun sujet sur le forum.</p>
<?php endif; ?>
<p>
<a href="<?= $settingModule->getAdminSettingBag()->get('forumFlarumUrl'); ?>" class="btn btn-default">
<a href="<?= $settingModule->getAdminSettingBag()->get('forumFlarumUrl'); ?>" class="btn btn-default" target="_blank">
<span class="fa fa-comments"></span>
Consulter le forum
</a>
@@ -240,13 +239,13 @@ $this->setTitle('Tableau de bord');
<table class="table table-condensed table-bordered">
<thead>
<tr>
<th></th>
<th>Statut</th>
<th>Origine</th>
<th>Date</th>
<th>Client</th>
<th>Produits</th>
<th>Point de vente</th>
<th>Montant</th>
<th>Historique</th>
</tr>
</thead>
<tbody>
@@ -254,7 +253,12 @@ $this->setTitle('Tableau de bord');
<?php $orderModule->initOrder($order); ?>

<tr class="<?= $orderModule->getHistoryClass($order) ; ?>">
<td class="infos"><?= $orderModule->getLabelOrigin($order, true); ?></td>
<td class="history">
<?= $orderModule->getSolver()->getLabelOrderStatus($order, true); ?>
</td>
<td class="infos">
<?= $orderModule->getSolver()->getLabelOrigin($order, true); ?>
</td>
<td class="date">
<div class="block-date">
<div class="day"><?= strftime('%A', strtotime($order->distribution->date)) ?></div>
@@ -263,7 +267,14 @@ $this->setTitle('Tableau de bord');
</div>
</td>
<td>
<?php if($order->user): ?>
<a href="<?= Yii::$app->urlManager->createUrl(['user/view', 'id' => $order->user->id]) ?>" target="_blank">
<?php else: ?>
<span class="user-without-account">
<?php endif; ?>
<?= $orderModule->getOrderUsername($order); ?><br />
<?php if($order->user): ?></a><?php else: ?></span><?php endif; ?>

<?php if(strlen($order->comment)): ?>
<div class="comment"><span class="glyphicon glyphicon-comment"></span> <?= nl2br(Html::encode($order->comment)) ; ?></div>
<?php endif; ?>
@@ -271,7 +282,6 @@ $this->setTitle('Tableau de bord');
<td><?= $orderModule->getCartSummary($order); ?></td>
<td><?= $orderModule->getPointSaleSummary($order) ; ?></td>
<td><?= $orderModule->getOrderAmountWithTax($order, Order::AMOUNT_TOTAL, true) ; ?></td>
<td class="history"><?= $orderModule->getHistorySummary($order) ; ?></td>
</tr>
<?php endforeach; ?>
</tbody>

+ 44
- 7
backend/views/delivery-note/index.php View File

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

/**
* Copyright distrib (2018)
* Copyright Souke (2018)
*
* contact@opendistrib.net
* contact@souke.fr
*
* Ce logiciel est un programme informatique servant à aider les producteurs
* à distribuer leur production en circuits courts.
@@ -36,13 +36,12 @@
* termes.
*/

use common\logic\Document\DeliveryNote\Model\DeliveryNote;
use domain\Document\DeliveryNote\DeliveryNote;
use domain\Order\Order\Order;
use domain\PointSale\PointSale\PointSale;
use yii\grid\GridView;
use common\logic\PointSale\PointSale\Model\PointSale;
use common\logic\Order\Order\Model\Order;
use yii\helpers\Html;
use yii\helpers\ArrayHelper;
use common\logic\Document\DeliveryNote\Module\DeliveryNoteModule;
use yii\helpers\Html;

$deliveryNoteModule = $this->getDeliveryNoteModule();

@@ -118,6 +117,44 @@ $this->addButton(['label' => 'Nouveau bon de livraison <span class="glyphicon gl
return $deliveryNoteModule->getAmountWithTax($deliveryNote, Order::INVOICE_AMOUNT_TOTAL, true);
}
],
[
'attribute' => 'with_invoice',
'header' => 'Facture',
'filter' => [
0 => 'Non',
1 => 'Oui',
],
'format' => 'raw',
'headerOptions' => ['class' => 'column-hide-on-mobile'],
'filterOptions' => ['class' => 'column-hide-on-mobile'],
'contentOptions' => ['class' => 'column-hide-on-mobile'],
'value' => function ($deliveryNote) use ($deliveryNoteModule) {
$invoice = $deliveryNoteModule->getSolver()->getInvoice($deliveryNote);
if($invoice) {
return Html::a($invoice->reference, ['invoice/update', 'id' => $invoice->id], ['class' => 'btn btn-xs btn-default']);
}
return '';
}
],
[
'attribute' => 'is_sent',
'header' => 'Envoyé',
'filter' => [
0 => 'Non',
1 => 'Oui',
],
'format' => 'raw',
'headerOptions' => ['class' => 'column-hide-on-mobile'],
'filterOptions' => ['class' => 'column-hide-on-mobile'],
'contentOptions' => ['class' => 'column-hide-on-mobile'],
'value' => function ($model) {
if ($model->is_sent) {
return '<span class="label label-success">Oui</span>';
} else {
return '<span class="label label-default">Non</span>';
}
}
],
[
'class' => 'yii\grid\ActionColumn',
'template' => '{validate} {update} {delete} {send} {download}',

+ 2
- 2
backend/views/development/_form.php View File

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

/**
Copyright distrib (2018)
Copyright Souke (2018)

contact@opendistrib.net
contact@souke.fr

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

+ 2
- 2
backend/views/development/create.php View File

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

/**
Copyright distrib (2018)
Copyright Souke (2018)

contact@opendistrib.net
contact@souke.fr

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

+ 2
- 2
backend/views/development/development.php View File

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

/**
* Copyright distrib (2018)
* Copyright Souke (2018)
*
* contact@opendistrib.net
* contact@souke.fr
*
* Ce logiciel est un programme informatique servant à aider les producteurs
* à distribuer leur production en circuits courts.

+ 21
- 3
backend/views/development/index.php View File

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

/**
* Copyright distrib (2018)
* Copyright Souke (2018)
*
* contact@opendistrib.net
* contact@souke.fr
*
* Ce logiciel est un programme informatique servant à aider les producteurs
* à distribuer leur production en circuits courts.
@@ -47,6 +47,8 @@ use common\helpers\GlobalParam;
$this->setTitle('Développement');
$this->addBreadcrumb($this->getTitle());

$producer = GlobalParam::getCurrentProducer();

?>

<div class="development-index">
@@ -69,12 +71,28 @@ $this->addBreadcrumb($this->getTitle());
</div>
</div>
<div class="col-md-4">

<div id="panel-participate" class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">Être prévenu des mises à jour</h3>
</div>
<div class="panel-body">
<p>
Afficher un message d'alerte quand une nouvelle version de <em>Souke</em> est mise en ligne.
</p>
<div class="btn-group" role="group">
<a href="<?= Yii::$app->urlManager->createUrl(['development/update-display-message-new-souke-version', 'displayMessage' => 1]) ?>" class="btn <?= $producer->option_display_message_new_opendistrib_version ? 'btn-success' : 'btn-default' ?>">Oui</a>
<a href="<?= Yii::$app->urlManager->createUrl(['development/update-display-message-new-souke-version', 'displayMessage' => 0]) ?>" class="btn <?= $producer->option_display_message_new_opendistrib_version ? 'btn-default' : 'btn-danger' ?>">Non</a>
</div>
</div>
</div>

<div id="panel-participate" class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">Participer</h3>
</div>
<div class="panel-body">
<p>Le logiciel Opendistrib se construit pour et avec vous. Toutes vos remarques, suggestions et remontées
<p>Le logiciel Souke se construit pour et avec vous. Toutes vos remarques, suggestions et remontées
de bugs sont les bienvenues et forment le terreau des versions futures.</p>
<p>
<a class="btn btn-default" href="<?= $this->getUrlManagerBackend()->createUrl(['support/index']); ?>">

+ 2
- 2
backend/views/development/update.php View File

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

/**
Copyright distrib (2018)
Copyright Souke (2018)

contact@opendistrib.net
contact@souke.fr

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

+ 103
- 72
backend/views/distribution/index.php View File

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

/**
Copyright distrib (2018)
Copyright Souke (2018)

contact@opendistrib.net
contact@souke.fr

Ce logiciel est un programme informatique servant à aider les producteurs
à distribuer leur production en circuits courts.
@@ -37,8 +37,6 @@ pris connaissance de la licence CeCILL, et que vous en avez accepté les
termes.
*/

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

$this->setTitle('Distributions') ;
$this->setPageTitle('Distributions') ;

@@ -92,11 +90,16 @@ $this->setPageTitle('Distributions') ;
<span class="info-box-text">
<h4>
Distribution du <strong>{{ dateFormat }}</strong>
<a class="btn btn-default" :href="distribution.url_order" @click="copyLinkOrder($event, distribution.url_order)"><span class="glyphicon glyphicon-link"></span></a>
<a v-if="distribution.active" class="btn btn-default" :href="distribution.url_order" @click="copyLinkOrder($event, distribution.url_order)"><span class="glyphicon glyphicon-link"></span></a>
<span v-if="distribution.is_leave_period" class="label label-default">
<span class="glyphicon glyphicon-info-sign"></span>
Congés
</span>
</h4>

<a @click="activeWeekDistribution" data-active="0" class="btn btn-default btn-active-week" v-if="oneDistributionWeekActive">Désactiver cette semaine</a>
<a @click="activeWeekDistribution" data-active="1" class="btn btn-default btn-active-week" v-else>Activer cette semaine</a>
<a @click="activeDistribution" data-active="0" class="btn btn-default" v-if="distribution.active">Désactiver ce jour</a>
<a @click="activeDistribution" data-active="1" class="btn btn-default" v-else>Activer ce jour</a>
</span>
@@ -127,6 +130,7 @@ $this->setPageTitle('Distributions') ;
<td>Actif</td>
<td>Nom</td>
<td class="quantity-ordered">Commandé</td>
<td class="quantity-remaining">Reste</td>
<td class="quantity-max">Maximum</td>
</tr>
</thead>
@@ -140,13 +144,26 @@ $this->setPageTitle('Distributions') ;
</td>
<td>{{ product.name }}</td>
<td class="quantity-ordered">
<span v-if="isProductMaximumQuantityExceeded(product)" class="glyphicon glyphicon-alert"></span>
{{ product.quantity_ordered ? product.quantity_ordered + ' '+ ((product.unit == 'piece') ? ' p.' : ' '+(product.unit == 'g' || product.unit == 'kg') ? 'kg' : 'litre(s)') : '&empty;' }}
</td>

<td class="quantity-remaining">
<span class="infinite" v-if="(getProductQuantityRemainingGlobal(product) === null)">&infin;</span>
<span class="negative" v-else-if="getProductQuantityRemainingGlobal(product) <= 0">
{{ getProductQuantityRemainingGlobal(product) }} {{ product.unit == 'piece' ? ' p.' : ' '+(product.unit == 'g' || product.unit == 'kg') ? 'kg' : 'litre(s)' }}
<span class="glyphicon glyphicon-alert" v-if="getProductQuantityRemainingGlobal(product) < 0"></span>
</span>
<span class="has-quantity" v-else>{{ getProductQuantityRemainingGlobal(product) }} {{ product.unit == 'piece' ? ' p.' : ' '+(product.unit == 'g' || product.unit == 'kg') ? 'kg' : 'litre(s)' }}</span>
</td>

<td class="quantity-max">
<div class="input-group">
<input type="text" class="form-control quantity-max" placeholder="&infin;" :data-id-product="product.id" v-model="getProductDistribution(product).quantity_max" @keyup="productQuantityMaxChange" />
<span class="input-group-addon">{{ (product.unit == 'piece') ? 'p.' : ' '+((product.unit == 'g' || product.unit == 'kg') ? 'kg' : 'litre(s)') }}</span>
<span class="input-group-addon">{{ labelUnitReference(product.unit) }}</span>
</div>
<div class="limit-quantity-accessories" v-if="producer.feature_product_accessory_enabled && !showLoading && product.quantity_max && (getProductDistribution(product).quantity_max > product.quantity_max || !getProductDistribution(product).quantity_max)">
<span class="glyphicon glyphicon-warning-sign"></span> Limitation accessoires :
<strong>{{ product.quantity_max }} {{ labelUnitReference(product.unit) }}</strong>
</div>
</td>
</tr>
@@ -200,8 +217,11 @@ $this->setPageTitle('Distributions') ;
<div id="summary-ca-weight" class="info-box col-md-4">
<span class="info-box-icon bg-yellow"><i class="fa fa-euro"></i></span>
<div class="info-box-content">
<span class="info-box-text">CA (TTC)</span>
<span class="info-box-number">{{ distribution.revenues }} <span class="normal" v-if="distribution.potential_revenues != '0,00 €'">/ {{ distribution.potential_revenues }}</span></span>
<span class="info-box-text">CA réel / potentiel (HT)</span>
<span class="info-box-number">
<span data-toggle="tooltip" data-placement="bottom" :data-original-title="distribution.revenues_with_tax+' TTC'">{{ distribution.revenues }}</span>
<span class="normal" v-if="distribution.potential_revenues != '0,00 €'">/ <span data-toggle="tooltip" data-placement="bottom" :data-original-title="distribution.potential_revenues_with_tax+' TTC'">{{ distribution.potential_revenues }}</span></span>
</span>
<span class="info-box-text">Poids</span>
<span class="info-box-number">{{ distribution.weight }} kg <span class="normal" v-if="distribution.potential_weight > 0">/ {{ distribution.potential_weight }} kg</span></span>
</div>
@@ -249,6 +269,7 @@ $this->setPageTitle('Distributions') ;
v-if="showModalFormOrderCreate"
create="1"
:date="date"
:distribution="distribution"
:order="orderCreate"
:points-sale="pointsSale"
:id-active-point-sale="idActivePointSale"
@@ -261,7 +282,7 @@ $this->setPageTitle('Distributions') ;
:units="units"
@close="closeModalOrderForm(true)"
@ordercreatedupdated="orderCreatedUpdated"
@updateproductorderprices="updateProductOrderPrices"
@updateproductorders="updateProductOrders"
></order-form>

<div id="wrapper-nav-points-sale">
@@ -293,13 +314,18 @@ $this->setPageTitle('Distributions') ;
</div>
<button id="btn-add-subscriptions" @click="addSubscriptions" class="btn btn-default btn-xs"><span class="glyphicon glyphicon-plus"></span> Importer les abonnements</button>
<template v-if="producer && producer.tiller == true">
<button v-if="tillerIsSynchro" id="btn-tiller" class="btn btn-success btn-xs" disabled><span class="glyphicon glyphicon-refresh"></span> Synchronisé avec Tiller</button>
<template v-else-if="!isDistributionToday()">
<template v-if="tillerIsAuthenticated">
<button v-if="tillerIsSynchro" id="btn-tiller" class="btn btn-success btn-xs" disabled><span class="glyphicon glyphicon-refresh"></span> Synchronisé avec Tiller</button>
<template v-else-if="!isDistributionToday()">
<span data-toggle="tooltip" data-placement="top" data-original-title="Synchronisation possible uniquement le jour de la distribution">
<button id="btn-tiller" class="btn btn-xs btn-default" disabled><span class="glyphicon glyphicon-refresh"></span> Synchroniser avec Tiller</button>
</span>
</template>
<button v-else id="btn-tiller" class="btn btn-xs btn-default" @click="synchroTiller"><span class="glyphicon glyphicon-refresh"></span> Synchroniser avec Tiller</button>
</template>
<template v-else>
<a :href="tillerUrlAuthorizeCode" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-refresh"></span> Connexion Tiller</a>
</template>
<button v-else id="btn-tiller" class="btn btn-xs btn-default" @click="synchroTiller"><span class="glyphicon glyphicon-refresh"></span> Synchroniser avec Tiller</button>
</template>
<button v-if="producer && producer.credit" id="btn-pay-orders" class="btn btn-default btn-xs" @click="payOrders"><span class="glyphicon glyphicon-euro"></span> Débiter les commandes</button>
<button id="btn-add-order" @click="openModalFormOrderCreate" class="btn btn-xs btn-primary"><span class="glyphicon glyphicon-plus"></span> Ajouter une commande</button>
@@ -322,20 +348,24 @@ $this->setPageTitle('Distributions') ;
Attention, ce jour de distribution n'est pas activé et vous avez quand même des commandes enregistrées.
</div>

<div v-if="idActivePointSale > 0 && (totalActivePointSale() > 0 || weightActivePointSale() > 0)" class="point-sale-totals">
<div>
<div v-if="idActivePointSale > 0 && (totalActivePointSale() > 0 || weightActivePointSale() > 0 || pointSaleActive.producers_sharing_point_sale_as_string)" class="point-sale-totals">
<div v-if="totalActivePointSale() > 0 || weightActivePointSale() > 0">
<span class="title">Totaux</span>
CA TTC : <strong>{{ totalActivePointSale() }} €</strong> / Poids : <strong>{{ weightActivePointSale() }} kg</strong>
</div>
<div v-if="producer.credit && pointSaleActive">
<span class="title">Crédit</span>
<template v-if="pointSaleActive.credit && pointSaleActive.credit == 1">
<span class="title">Cagnotte</span>
<template v-if="pointSaleActive.payment_method_credit && pointSaleActive.payment_method_credit == 1">
<template v-if="pointSaleActive.credit_functioning == 'mandatory'">Obligatoire</template>
<template v-else-if="pointSaleActive.credit_functioning == 'user'">Basé sur l'utilisateur</template>
<template v-else-if="pointSaleActive.credit_functioning == 'optional'">Optionnel</template>
</template>
<template v-else>Désactivé</template>
</div>
<div v-if="pointSaleActive.producers_sharing_point_sale_as_string">
<span class="title">Point de vente partagé</span>
<i class="fa fa-share-alt"></i> {{ pointSaleActive.producers_sharing_point_sale_as_string }}
</div>
</div>

<table class="table table-condensed table-bordered table-hover" v-if="countOrdersByPointSale[idActivePointSale] > 0 || (idActivePointSale == 0 && orders.length > 0)">
@@ -344,13 +374,13 @@ $this->setPageTitle('Distributions') ;
<th class="column-checkbox" v-if="idActivePointSale > 0">
<input type="checkbox" v-model="checkboxSelectAllOrders" @change="selectAllOrdersEvent" />
</th>
<th class="column-state">Statut</th>
<th class="column-origin">Origine</th>
<th class="column-state">État</th>
<th class="column-user">Utilisateur</th>
<th class="column-point-sale" v-if="idActivePointSale == 0">Point de vente</th>
<th class="column-amount">Montant</th>
<th class="column-state-payment">Paiement</th>
<th class="column-credit" v-if="!idActivePointSale || (pointSaleActive && pointSaleActive.credit == 1)">Crédit</th>
<th class="column-credit" v-if="!idActivePointSale || (pointSaleActive && pointSaleActive.payment_method_credit == 1)">Cagnotte</th>
<th class="column-actions">Actions</th>
<th class="column-tiller" v-if="producer && producer.tiller">Tiller</th>
</tr>
@@ -361,31 +391,19 @@ $this->setPageTitle('Distributions') ;
<td class="column-checkbox" v-if="idActivePointSale > 0">
<input type="checkbox" v-model="order.selected" />
</td>
<td class="column-origin">
<label class="label label-success" v-if="order.origin == 'user'">client</label>
<label class="label label-default" v-else-if="order.origin == 'auto'">auto</label>
<label class="label label-warning" v-else>admin</label>
</td>
<td class="column-state">
<span class="label label-danger" v-if="order.date_delete"><span class="glyphicon glyphicon-trash"></span></span>
<span class="label label-warning" v-if="order.date_update"><span class="glyphicon glyphicon-pencil"></span></span>
<span class="label label-success" v-if="!order.date_update && !order.date_delete"><span class="glyphicon glyphicon-check"></span></span>
<span v-if="order.order_status_alias == 'canceled'" class="label label-danger" :title="order.orderStatusHistorySummaryTitleTag"><span class="glyphicon glyphicon-trash"></span></span>
<span v-if="order.order_status_alias == 'updated'" class="label label-warning" :title="order.orderStatusHistorySummaryTitleTag"><span class="glyphicon glyphicon-pencil"></span></span>
<span v-if="order.order_status_alias == 'ordered'" class="label label-success" :title="order.orderStatusHistorySummaryTitleTag"><span class="glyphicon glyphicon-check"></span></span>

<span v-if="containUnactiveProduct(order)" class="glyphicon glyphicon-warning-sign" title="Cette commande contient un produit qui n'est pas activé"></span>
</td>
<td class="column-origin" v-html="order.labelOrigin"></td>
<td class="column-user">
<span v-if="order.user">
<template v-if="order.user.name_legal_person && order.user.name_legal_person.length">
{{ order.user.name_legal_person }}
</template>
<template v-else>
{{ order.user.lastname+' '+order.user.name }}
</template>
<span class="shortcuts btn-group" role="group">
<a :class="order.user.credit_active ? 'btn btn-success btn-sm' : 'btn btn-default btn-sm'" :href="baseUrl+'/user/credit?id='+order.id_user" data-toggle="popover" data-trigger="hover" data-placement="bottom" :data-content="order.user.credit.toFixed(2)+' €'"><span class="glyphicon glyphicon-euro"></span></a>
<a class="btn btn-default btn-sm" :href="baseUrl+'/user/update?id='+order.id_user" data-toggle="popover" data-trigger="hover" data-placement="bottom" data-content="Modifier"><span class="glyphicon glyphicon-user"></span></a>
<a class="btn btn-default btn-sm" :href="baseUrl+'/user/orders?id='+order.id_user" data-toggle="popover" data-trigger="hover" data-placement="bottom" data-content="Voir les commandes"><span class="glyphicon glyphicon-eye-open"></span></a>
</span>
</span>
<span v-else class="no-user">{{ order.username }}</span>
<a v-if="order.user" :href="baseUrl+'/user/view?id='+order.id_user" target="_blank" :class="order.user.trust_alert ? 'user-trust-alert' : ''" :title="order.user.trust_alert ? order.user.trust_alert_comment : ''">
{{ order.username_user }}
</a>
<span v-else class="user-without-account">{{ order.username }}</span>
<span v-if="order.comment && order.comment.length > 0" class="glyphicon glyphicon-comment"></span>
<span v-if="order.delivery_home && order.delivery_address && order.delivery_address.length > 0" class="glyphicon glyphicon-home"></span>
</td>
@@ -401,16 +419,16 @@ $this->setPageTitle('Distributions') ;
</div>
</td>
<td class="column-state-payment">
<template v-if="!order.date_delete">
<template v-if="order.order_status_alias == 'ordered' || order.order_status_alias == 'updated'">
<a href="javascript:void(0);" @click="orderPaymentModalClick" :data-id-order="order.id">
<order-state-payment :order="order" :producer="producer"></order-state-payment>
</a>
<span class="glyphicon glyphicon-time" title="Débit automatique du crédit la veille de la distribution" v-if="order.amount != 0 && order.isCreditAutoPayment && (order.amount_paid == 0 || order.amount_paid < order.amount)"></span>
<span class="glyphicon glyphicon-time" title="Débit automatique de la cagnotte la veille de la distribution" v-if="order.amount != 0 && order.isCreditAutoPayment && (order.amount_paid == 0 || order.amount_paid < order.amount)"></span>
</template>
</td>
<td class="column-credit" v-if="!idActivePointSale || (pointSaleActive && pointSaleActive.credit == 1)">
<td class="column-credit" v-if="!idActivePointSale || (pointSaleActive && pointSaleActive.payment_method_credit == 1)">
<template v-if="order.isCreditContext">
<a :href="baseUrl+'/user/credit?id='+order.id_user" :class="order.user.credit >= 0 ? 'positive' : 'negative'">
<a :href="baseUrl+'/user/credit?id='+order.id_user" target="_blank" :class="order.user.credit >= 0 ? 'positive' : 'negative'">
{{ order.user.credit.toFixed(2).replace(/(\d)(?=(\d{3})+(?:\.\d+)?$)/g, "$1,")+'&nbsp;€' }}
</a>
</template>
@@ -429,7 +447,7 @@ $this->setPageTitle('Distributions') ;
<template v-if="!order.isPaidViaInvoice">
<li v-if="order.isCreditContext">
<a href="javascript:void(0);" @click="orderPaymentClick" :data-id-order="order.id" :data-type="getTypePayment(order)" data-mean-payment="credit">
<span class="glyphicon glyphicon-piggy-bank"></span> {{ getLabelPaymentRefund(order, 'Débiter', 'Recréditer', 'le crédit') }}
<span class="glyphicon glyphicon-piggy-bank"></span> {{ getLabelPaymentRefund(order, 'Débiter', 'Recréditer', 'la cagnotte') }}
</a>
</li>
<template v-if="(!order.isCreditFunctioningMandatory && !order.isCreditFunctioningUser) || !order.id_user">
@@ -469,23 +487,31 @@ $this->setPageTitle('Distributions') ;
</button>
<ul class="dropdown-menu">
<li v-if="!order.id_delivery_note">
<a href="javascript:void(0);" class="" :data-id-order="order.id" @click="generateDeliveryNote">
<a href="javascript:void(0);" :data-id-order="order.id" @click="generateDeliveryNote">
<span class="glyphicon glyphicon-plus"></span> Générer un bon de livraison
</a>
</li>
<li v-if="order.id_quotation">
<a :href="UrlManager.getBaseUrl()+'quotation/update?id='+order.id_quotation">
<span class="glyphicon glyphicon-file"></span> Devis
<span class="glyphicon glyphicon-file"></span> Modifier le devis
</a>
</li>
<li v-if="order.id_delivery_note">
<li v-if="order.id_delivery_note && order.deliveryNote">
<a :href="UrlManager.getBaseUrl()+'delivery-note/update?id='+order.id_delivery_note">
<span class="glyphicon glyphicon-file"></span> Bon de livraison
<span class="glyphicon glyphicon-file"></span> Modifier le bon de livraison
</a>
<template v-if="order.deliveryNote.status == 'valid'">
<a v-if="!order.deliveryNote.is_sent" href="javascript:void(0);" :data-id-order="order.id" @click="sendDeliveryNote">
<span class="glyphicon glyphicon-send"></span> Envoyer le bon de livraison
</a>
<a v-else class="text-success disable" href="#">
<span class="glyphicon glyphicon-ok"></span> Bon de livraison envoyé
</a>
</template>
</li>
<li v-if="order.id_invoice">
<a :href="UrlManager.getBaseUrl()+'invoice/update?id='+order.id_invoice">
<span class="glyphicon glyphicon-file"></span> Facture
<span class="glyphicon glyphicon-file"></span> Modifier la facture
</a>
</li>
</ul>
@@ -496,7 +522,8 @@ $this->setPageTitle('Distributions') ;
<span class="caret"></span>
</button>
<ul class="dropdown-menu">
<li><a href="javascript:void(0);" class="" :data-id-order="order.id" @click="deleteOrderClick"><span class="glyphicon glyphicon-trash"></span> Supprimer</a></li>
<li><a href="javascript:void(0);" class="" :data-id-order="order.id" @click="deleteOrderClick"><span class="glyphicon glyphicon-trash"></span> {{ order.labelDeleteAction }}</a></li>
<li v-if="producer && producer.tiller"><a href="javascript:void(0);" @click="forceSynchronizeOrderTiller(order.id)"><span class="glyphicon glyphicon-transfer"></span> Synchroniser avec Tiller</a></li>
<li v-if="order.id_subscription > 0"><a class="" :href="baseUrl+'/subscription/update?id='+order.id_subscription"><span class="glyphicon glyphicon-repeat"></span> Modifier l'abonnement lié</a></li>
<li v-else><a class="add-subscription" :href="baseUrl+'/subscription/create?idOrder='+order.id"><span class="glyphicon glyphicon-plus"></span><span class="glyphicon glyphicon-repeat"></span>Créer un abonnement</a></li>
</ul>
@@ -505,6 +532,7 @@ $this->setPageTitle('Distributions') ;
<order-form
v-if="showModalFormOrderUpdate && idOrderUpdate == order.id"
create="0"
:distribution="distribution"
:date="date"
:date-format="dateFormat"
:points-sale="pointsSale"
@@ -519,14 +547,14 @@ $this->setPageTitle('Distributions') ;
:units="units"
@close="closeModalOrderForm(false)"
@ordercreatedupdated="orderCreatedUpdated"
@updateproductorderprices="updateProductOrderPrices"
@updateproductorders="updateProductOrders"
@updateinvoiceprices="updateInvoicePrices"
></order-form>

<modal v-if="showModalPayment && idOrderPayment == order.id" class="modal-payment" @close="showModalPayment = false">
<h3 slot="header">
Commande du <strong>{{ dateFormat }}</strong> &gt;
<strong><span v-if="order.user">{{ order.user.name +' '+order.user.lastname }}</span>
<strong><span v-if="order.user">{{ order.username_user }}</span>
<span v-else>{{ order.username }}</span></strong>
</h3>
<div slot="body">
@@ -546,7 +574,7 @@ $this->setPageTitle('Distributions') ;
<div class="info-box">
<span :class="'info-box-icon ' +((order.user.credit > 0) ? 'bg-green' : 'bg-red')"><i class="fa fa-user"></i></span>
<div class="info-box-content">
<span class="info-box-text">Crédit utilisateur</span>
<span class="info-box-text">Cagnotte</span>
<span class="info-box-number">
{{ order.user.credit.toFixed(2).replace(/(\d)(?=(\d{3})+(?:\.\d+)?$)/g, "$1,")+' €' }}
</span>
@@ -601,7 +629,8 @@ $this->setPageTitle('Distributions') ;
<strong><span class="glyphicon glyphicon-menu-right"></span> Produits</strong>
<ul>
<li v-for="product in products" v-if="getProductDistribution(product) && order.productOrder[product.id].quantity > 0">
{{ product.name }} : {{ order.productOrder[product.id].quantity }} {{ order.productOrder[product.id].unit == 'piece' ? ' pièce(s)' : ' '+order.productOrder[product.id].unit }} <span v-if="getProductDistribution(product).active == 0" class="glyphicon glyphicon-warning-sign" title="Ce produit n'est pas activé"></span>
{{ product.name }} : {{ order.productOrder[product.id].quantity }} {{ order.productOrder[product.id].unit == 'piece' ? ' pièce(s)' : ' '+order.productOrder[product.id].unit }}
<span v-if="getProductDistribution(product).active == 0" class="glyphicon glyphicon-warning-sign" title="Ce produit n'est pas activé"></span>
</li>
</ul>
<div v-if="order.comment && order.comment.length > 0" class="comment">
@@ -649,7 +678,7 @@ $this->setPageTitle('Distributions') ;
<a v-if="producer && producer.credit && order.id_user > 0 && user.id_user == order.id_user" class="btn btn-xs btn-primary btn-credit" :href="baseUrl+'/user/credit?id='+user.id_user" v-for="user in users">{{ parseFloat(user.credit).toFixed(2).replace(/(\d)(?=(\d{3})+(?:\.\d+)?$)/g, "$1,")+'&nbsp;€' }}</a>
<label class="control-label" for="select-id-user">
Utilisateur
<a v-if="!order.id_user || order.id_user == 0" class="btn btn-default btn-xs" href="<?= Yii::$app->urlManager->createUrl('user/create'); ?>">
<a v-if="!order.id_user || order.id_user == 0" class="btn btn-default btn-xs" :href="distribution.user_create_href">
<span class="glyphicon glyphicon-plus"></span>
Créer un utilisateur
</a>
@@ -657,12 +686,7 @@ $this->setPageTitle('Distributions') ;
<select class="form-control select2-order-form" v-model="order.id_user" @change="userChange">
<option value="0">--</option>
<option v-for="user in users" :value="user.id_user">
<template v-if="user.name_legal_person && user.name_legal_person.length">
{{ user.name_legal_person }} (personne morale)
</template>
<template v-else>
{{ user.lastname +' '+ user.name }}
</template>
{{ user.username }}
</option>
</select>
<input v-model="order.username" type="text" class="form-control" placeholder="Ou saisissez ici le nom de l'utilisateur" />
@@ -680,7 +704,7 @@ $this->setPageTitle('Distributions') ;
</div>
<div class="form-group" v-if="isPointSaleCreditFunctioningOptional(order.id_point_sale)">
<input type="checkbox" id="debit-credit" v-model="order.debitCredit" />
<label class="control-label" for="debit-credit">Débiter le crédit</label>
<label class="control-label" for="debit-credit">Débiter la cagnotte</label>
</div>
</div>
<div class="col-md-8">
@@ -698,7 +722,7 @@ $this->setPageTitle('Distributions') ;
<tbody>
<tr v-for="product in products" v-if="product.status >= 0 || order.productOrder[product.id].quantity > 0" :class="(order.productOrder[product.id].quantity > 0) ? 'product-ordered' : ''">
<td>
<span class="label label-success" v-if="loadingUpdateProductOrder || order.productOrder[product.id].active">Actif</span>
<span class="label label-success" v-if="order.productOrder[product.id].active">Actif</span>
<span class="label label-danger" v-else>Inactif</span>
</td>
<td>
@@ -734,12 +758,19 @@ $this->setPageTitle('Distributions') ;
</span>
</div>
</td>
<td class="quantity-remaining infinite" v-if="product.quantity_remaining === null || order.productOrder[product.id].unit != product.unit">&infin;</td>
<td class="quantity-remaining negative" v-else-if="getProductQuantityRemaining(product) <= 0">
{{ getProductQuantityRemaining(product) }} {{ order.productOrder[product.id].unit == 'piece' ? ' p.' : ' '+(order.productOrder[product.id].unit == 'g' || order.productOrder[product.id].unit == 'kg') ? 'kg' : 'litre(s)' }}
<span class="glyphicon glyphicon-alert" v-if="getProductQuantityRemaining(product) < 0"></span>
<td class="quantity-remaining">
<template v-if="loadingUpdateProductOrder">
--
</template>
<template v-else>
<span class="infinite" v-if="(getProductQuantityRemaining(order, product) === null) || order.productOrder[product.id].unit != product.unit">&infin;</span>
<span class="negative" v-else-if="getProductQuantityRemaining(order, product) <= 0">
{{ getProductQuantityRemaining(order, product) }} {{ labelUnitReference(order.productOrder[product.id].unit) }}
<span class="glyphicon glyphicon-alert" v-if="getProductQuantityRemaining(order, product) < 0"></span>
</span>
<span class="has-quantity" v-else>{{ getProductQuantityRemaining(order, product) }} {{ labelUnitReference(order.productOrder[product.id].unit) }}</span>
</template>
</td>
<td class="quantity-remaining has-quantity" v-else>{{ getProductQuantityRemaining(product) }} {{ order.productOrder[product.id].unit == 'piece' ? ' p.' : ' '+(order.productOrder[product.id].unit == 'g' || order.productOrder[product.id].unit == 'kg') ? 'kg' : 'litre(s)' }}</td>
</tr>
</tbody>
</table>
@@ -753,7 +784,7 @@ $this->setPageTitle('Distributions') ;
<button class="modal-default-button btn btn-primary" @click="submitFormCreate" v-if="!order.id">Créer</button>

<div class="right">
<button class="modal-default-button btn btn-info btn-update-prices" @click="updateProductOrderPrices(true)">Recharger les prix</button>
<button class="modal-default-button btn btn-info btn-update-prices" @click="updateProductOrders(true)">Recharger les prix</button>
<button v-if="order.id" class="modal-default-button btn btn-info btn-update-prices" @click="updateInvoicePrices(true)">
Réinitialiser les prix facturés
</button>

+ 10
- 10
backend/views/distribution/report-bourlingue.php View File

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

/**
Copyright distrib (2018)
Copyright Souke (2018)

contact@opendistrib.net
contact@souke.fr

Ce logiciel est un programme informatique servant à aider les producteurs
à distribuer leur production en circuits courts.
@@ -37,12 +37,12 @@ termes.
*/

use common\helpers\Price;
use common\logic\Config\Unit\Module\UnitModule;
use common\logic\Config\Unit\Service\UnitDefinition;
use common\logic\Order\Order\Module\OrderModule;
use common\logic\Product\Product\Model\Product;
use common\logic\Product\Product\Module\ProductModule;
use common\logic\User\UserProducer\Model\UserProducer;
use domain\Config\Unit\UnitDefinition;
use domain\Config\Unit\UnitModule;
use domain\Order\Order\OrderModule;
use domain\Product\Product\Product;
use domain\Product\Product\ProductModule;
use domain\User\UserProducer\UserProducer;

$unitModule = UnitModule::getInstance();
$productModule = ProductModule::getInstance();
@@ -142,7 +142,7 @@ foreach ($pointsSaleArray as $pointSale) {
}
$html .= '</td>' ;

if($pointSale->credit) {
if($pointSale->payment_method_credit) {
$credit = '' ;

if(isset($order->user) && $order->user->id) {
@@ -188,7 +188,7 @@ foreach ($pointsSaleArray as $pointSale) {
$strProducts = substr($strProducts, 0, strlen($strProducts) - 6) ;
$html .= '<td>'.$strProducts.'</td><td></td><td></td><td></td>' ;
if($pointSale->credit) {
if($pointSale->payment_method_credit) {
$html .= '<td></td>' ;
}
$html .= '<td><strong>'.Price::format($pointSale->revenues_with_tax) . '</strong></td>';

+ 3
- 3
backend/views/distribution/report-grid.php View File

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

use common\logic\Order\Order\Module\OrderModule;
use common\logic\Producer\Producer\Model\Producer;
use common\logic\Product\Product\Module\ProductModule;
use domain\Order\Order\OrderModule;
use domain\Producer\Producer\Producer;
use domain\Product\Product\ProductModule;

$orderModule = OrderModule::getInstance();


+ 1
- 1
backend/views/distribution/shopping-cart-labels.php View File

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

use common\logic\Distribution\Distribution\Export\DistributionShoppingCartLabelsPdfGenerator;
use domain\Distribution\Distribution\Export\DistributionShoppingCartLabelsPdfGenerator;

$distributionShoppingCartLabelsPdfGenerator = DistributionShoppingCartLabelsPdfGenerator::getInstance();
$index = 0;

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save