@@ -1,3 +1,5 @@ | |||
{ | |||
"directory" : "vendor/bower" | |||
"directory" : "vendor/bower", | |||
"strict-ssl": false, | |||
"https-proxy": "" | |||
} |
@@ -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'); | |||
} | |||
} |
@@ -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') ; | |||
} | |||
} |
@@ -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') ; | |||
} | |||
} |
@@ -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() |
@@ -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') ; | |||
} | |||
} |
@@ -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'); | |||
} | |||
} |
@@ -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') ; | |||
} | |||
} |
@@ -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') ; | |||
} | |||
} |
@@ -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') ; | |||
} | |||
} |
@@ -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') ; | |||
} | |||
} |
@@ -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') ; | |||
} | |||
} |
@@ -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' => [], |
@@ -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 []; |
@@ -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()) { |
@@ -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; | |||
} | |||
} |
@@ -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é."); | |||
} | |||
} | |||
} |
@@ -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']); | |||
} | |||
} | |||
} | |||
} | |||
?> |
@@ -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, | |||
]); | |||
} | |||
} |
@@ -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(); | |||
} | |||
} |
@@ -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. |
@@ -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); |
@@ -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. |
@@ -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 | |||
{ |
@@ -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'); | |||
} | |||
} |
@@ -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)) { |
@@ -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); |
@@ -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.'); | |||
} | |||
} | |||
} |
@@ -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); |
@@ -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>' |
@@ -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; | |||
} | |||
} |
@@ -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.'); | |||
} | |||
} | |||
} |
@@ -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); | |||
} | |||
} |
@@ -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()) |
@@ -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. |
@@ -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. |
@@ -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]; | |||
} |
@@ -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; |
@@ -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 | |||
]); | |||
} | |||
} |
@@ -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 | |||
]); | |||
} | |||
} |
@@ -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; | |||
} | |||
} |
@@ -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.'); |
@@ -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) | |||
]); | |||
} | |||
} |
@@ -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'); | |||
} | |||
} | |||
?> |
@@ -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, | |||
]); | |||
} | |||
@@ -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) |
@@ -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 | |||
]); | |||
} | |||
} |
@@ -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; |
@@ -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.'); | |||
} | |||
} | |||
} |
@@ -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']); | |||
} | |||
} |
@@ -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'); |
@@ -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. |
@@ -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. |
@@ -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, | |||
]); | |||
} | |||
} |
@@ -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); | |||
} | |||
} |
@@ -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.'); | |||
} | |||
} | |||
} |
@@ -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, | |||
]); | |||
} | |||
} |
@@ -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, | |||
]); | |||
} | |||
} |
@@ -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.'); | |||
} | |||
} | |||
} |
@@ -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 | |||
]); | |||
} | |||
} |
@@ -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'); | |||
} | |||
} | |||
?> |
@@ -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 | |||
]); | |||
} | |||
} |
@@ -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.'); | |||
} | |||
} | |||
} |
@@ -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,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'], |
@@ -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" | |||
]; | |||
} | |||
} | |||
?> |
@@ -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; | |||
/** |
@@ -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 | |||
); | |||
} | |||
} | |||
} | |||
} |
@@ -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 ; | |||
} | |||
} |
@@ -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> |
@@ -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"> </div> | |||
<?php endif; ?> | |||
</div> |
@@ -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; ?> |
@@ -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> |
@@ -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> |
@@ -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> '; | |||
} | |||
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> |
@@ -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> |
@@ -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> |
@@ -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> |
@@ -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> |
@@ -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> |
@@ -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()) ; | |||
?> |
@@ -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> | |||
@@ -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> | |||
@@ -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> |
@@ -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. |
@@ -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> | |||
@@ -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']); |
@@ -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> |
@@ -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> |
@@ -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> |
@@ -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}', |
@@ -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. |
@@ -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. |
@@ -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. |
@@ -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']); ?>"> |
@@ -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. |
@@ -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)') : '∅' }} | |||
</td> | |||
<td class="quantity-remaining"> | |||
<span class="infinite" v-if="(getProductQuantityRemainingGlobal(product) === null)">∞</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="∞" :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,")+' €' }} | |||
</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> > | |||
<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,")+' €' }}</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">∞</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">∞</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> |
@@ -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>'; |
@@ -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,6 +1,6 @@ | |||
<?php | |||
use common\logic\Distribution\Distribution\Export\DistributionShoppingCartLabelsPdfGenerator; | |||
use domain\Distribution\Distribution\Export\DistributionShoppingCartLabelsPdfGenerator; | |||
$distributionShoppingCartLabelsPdfGenerator = DistributionShoppingCartLabelsPdfGenerator::getInstance(); | |||
$index = 0; |