{ | { | ||||
"directory" : "vendor/bower" | |||||
"directory" : "vendor/bower", | |||||
"strict-ssl": false, | |||||
"https-proxy": "" | |||||
} | } |
<?php | <?php | ||||
/** | /** | ||||
Copyright distrib (2018) | |||||
Copyright Souke (2018) | |||||
contact@opendistrib.net | |||||
contact@souke.fr | |||||
Ce logiciel est un programme informatique servant à aider les producteurs | Ce logiciel est un programme informatique servant à aider les producteurs | ||||
à distribuer leur production en circuits courts. | à distribuer leur production en circuits courts. | ||||
* @author Qiang Xue <qiang.xue@gmail.com> | * @author Qiang Xue <qiang.xue@gmail.com> | ||||
* @since 2.0 | * @since 2.0 | ||||
*/ | */ | ||||
class VuejsReportIndexAsset extends \common\components\MyAssetBundle | |||||
class AdminLteAsset extends \common\components\MyAssetBundle | |||||
{ | { | ||||
public $basePath = '@webroot'; | |||||
public $baseUrl = '@web'; | |||||
public $css = []; | |||||
public $js = []; | |||||
public $depends = [ | |||||
'common\assets\CommonAsset' | |||||
]; | |||||
public $sourcePath = '@vendor/almasaeed2010/adminlte/dist'; | |||||
public function __construct() | |||||
{ | |||||
public function __construct() { | |||||
parent::__construct() ; | parent::__construct() ; | ||||
$this->addAsset('js','js/vuejs/report-index.js') ; | |||||
$this->addAsset('css', 'css/AdminLTE.min.css'); | |||||
$this->addAsset('css', 'css/skins/skin-black.min.css'); | |||||
$this->addAsset('js', 'js/adminlte.min.js'); | |||||
} | } | ||||
} | } |
<?php | <?php | ||||
/** | /** | ||||
Copyright distrib (2018) | |||||
Copyright Souke (2018) | |||||
contact@opendistrib.net | |||||
contact@souke.fr | |||||
Ce logiciel est un programme informatique servant à aider les producteurs | Ce logiciel est un programme informatique servant à aider les producteurs | ||||
à distribuer leur production en circuits courts. | à distribuer leur production en circuits courts. | ||||
public $baseUrl = '@web'; | public $baseUrl = '@web'; | ||||
public $css = []; | public $css = []; | ||||
public $js = []; | public $js = []; | ||||
public $depends = []; | |||||
public $depends = [ | |||||
'rmrevin\yii\fontawesome\AssetBundle' | |||||
]; | |||||
public function __construct() { | public function __construct() { | ||||
parent::__construct() ; | parent::__construct() ; | ||||
$dirSelect2 = 'js/select2-4.0.13'; | $dirSelect2 = 'js/select2-4.0.13'; | ||||
// css | // css | ||||
$this->addAsset('css','bootstrap/css/bootstrap.min.css') ; | |||||
$this->addAsset('css',$dirJquery.'/jquery-ui.min.css'); | $this->addAsset('css',$dirJquery.'/jquery-ui.min.css'); | ||||
$this->addAsset('css',$dirJquery.'/jquery-ui.theme.min.css') ; | $this->addAsset('css',$dirJquery.'/jquery-ui.theme.min.css') ; | ||||
$this->addAsset('css',$dirSelect2.'/css/select2.min.css') ; | $this->addAsset('css',$dirSelect2.'/css/select2.min.css') ; | ||||
$this->addAsset('css','css/site.css') ; | $this->addAsset('css','css/site.css') ; | ||||
$this->addAsset('css','css/screen.css') ; | $this->addAsset('css','css/screen.css') ; | ||||
// js | // js | ||||
$this->addAsset('js','bootstrap/js/bootstrap.min.js') ; | |||||
$this->addAsset('js',$dirJquery.'/jquery-ui.min.js') ; | $this->addAsset('js',$dirJquery.'/jquery-ui.min.js') ; | ||||
$this->addAsset('js',$dirSelect2.'/js/select2.min.js') ; | $this->addAsset('js',$dirSelect2.'/js/select2.min.js') ; | ||||
$this->addAsset('js','js/backend.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') ; | |||||
} | } | ||||
} | } |
<?php | <?php | ||||
/** | /** | ||||
Copyright distrib (2018) | |||||
Copyright Souke (2018) | |||||
contact@opendistrib.net | |||||
contact@souke.fr | |||||
Ce logiciel est un programme informatique servant à aider les producteurs | Ce logiciel est un programme informatique servant à aider les producteurs | ||||
à distribuer leur production en circuits courts. | à distribuer leur production en circuits courts. | ||||
* @author Qiang Xue <qiang.xue@gmail.com> | * @author Qiang Xue <qiang.xue@gmail.com> | ||||
* @since 2.0 | * @since 2.0 | ||||
*/ | */ | ||||
class VuejsDistributionIndexAsset extends \common\components\MyAssetBundle | |||||
class CommonAsset extends \common\components\MyAssetBundle | |||||
{ | { | ||||
public $basePath = '@webroot'; | |||||
public $baseUrl = '@web'; | |||||
public $sourcePath = '@common/web/' ; | |||||
public $css = []; | public $css = []; | ||||
public $js = []; | public $js = []; | ||||
public $depends = [ | public $depends = [ | ||||
'common\assets\CommonAsset', | |||||
'backend\assets\AppAsset', | |||||
'yii\web\YiiAsset', | |||||
]; | ]; | ||||
public function __construct() | |||||
{ | |||||
public function __construct() { | |||||
parent::__construct() ; | parent::__construct() ; | ||||
$this->addAsset('js','js/vuejs/distribution-index.js') ; | |||||
// 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') ; | |||||
} | } | ||||
} | } |
<?php | <?php | ||||
/** | /** | ||||
* Copyright distrib (2018) | |||||
* Copyright Souke (2018) | |||||
* | * | ||||
* contact@opendistrib.net | |||||
* contact@souke.fr | |||||
* | * | ||||
* Ce logiciel est un programme informatique servant à aider les producteurs | * Ce logiciel est un programme informatique servant à aider les producteurs | ||||
* à distribuer leur production en circuits courts. | * à distribuer leur production en circuits courts. | ||||
public $css = []; | public $css = []; | ||||
public $js = []; | public $js = []; | ||||
public $depends = [ | public $depends = [ | ||||
'common\assets\CommonAsset' | |||||
//'backend\assets\AppAsset', | |||||
]; | ]; | ||||
public function __construct() | public function __construct() |
<?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') ; | |||||
} | |||||
} |
<?php | <?php | ||||
/** | /** | ||||
Copyright distrib (2018) | |||||
Copyright Souke (2018) | |||||
contact@opendistrib.net | |||||
contact@souke.fr | |||||
Ce logiciel est un programme informatique servant à aider les producteurs | Ce logiciel est un programme informatique servant à aider les producteurs | ||||
à distribuer leur production en circuits courts. | à distribuer leur production en circuits courts. | ||||
'basePath' => dirname(__DIR__), | 'basePath' => dirname(__DIR__), | ||||
'name' => 'distrib', | 'name' => 'distrib', | ||||
'controllerNamespace' => 'backend\controllers', | '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', | 'defaultRoute' => 'dashboard/index', | ||||
'bootstrap' => ['log'], | 'bootstrap' => ['log'], | ||||
'modules' => [], | 'modules' => [], |
<?php | <?php | ||||
/** | /** | ||||
Copyright distrib (2018) | |||||
Copyright Souke (2018) | |||||
contact@opendistrib.net | |||||
contact@souke.fr | |||||
Ce logiciel est un programme informatique servant à aider les producteurs | Ce logiciel est un programme informatique servant à aider les producteurs | ||||
à distribuer leur production en circuits courts. | à distribuer leur production en circuits courts. | ||||
termes. | termes. | ||||
*/ | */ | ||||
return [ | |||||
'adminEmail' => 'contact@opendistrib.net', | |||||
]; | |||||
return []; |
<?php | <?php | ||||
/** | /** | ||||
* Copyright distrib (2018) | |||||
* Copyright Souke (2018) | |||||
* | * | ||||
* contact@opendistrib.net | |||||
* contact@souke.fr | |||||
* | * | ||||
* Ce logiciel est un programme informatique servant à aider les producteurs | * Ce logiciel est un programme informatique servant à aider les producteurs | ||||
* à distribuer leur production en circuits courts. | * à distribuer leur production en circuits courts. | ||||
namespace backend\controllers; | namespace backend\controllers; | ||||
use backend\models\AccessUserProducerForm; | use backend\models\AccessUserProducerForm; | ||||
use common\logic\User\User\Model\UserSearch; | |||||
use domain\User\User\UserSearch; | |||||
use yii\filters\AccessControl; | use yii\filters\AccessControl; | ||||
use yii\filters\VerbFilter; | |||||
/** | /** | ||||
* UserController implements the CRUD actions for User model. | * UserController implements the CRUD actions for User model. | ||||
$userModule = $this->getUserModule(); | $userModule = $this->getUserModule(); | ||||
$producer = $this->getProducerCurrent(); | $producer = $this->getProducerCurrent(); | ||||
$userSearch = new UserSearch(); | $userSearch = new UserSearch(); | ||||
$usersArray = $userSearch->search()->query->all(); | |||||
$usersArray = $userSearch->search([], $producer)->query->all(); | |||||
$modelAccessUserProducerForm = new AccessUserProducerForm; | $modelAccessUserProducerForm = new AccessUserProducerForm; | ||||
if ($modelAccessUserProducerForm->load(\Yii::$app->request->post()) && $modelAccessUserProducerForm->validate()) { | if ($modelAccessUserProducerForm->load(\Yii::$app->request->post()) && $modelAccessUserProducerForm->validate()) { |
<?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; | |||||
} | |||||
} |
<?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é."); | |||||
} | |||||
} | |||||
} |
<?php | <?php | ||||
/** | /** | ||||
* Copyright distrib (2018) | |||||
* Copyright Souke (2018) | |||||
* | * | ||||
* contact@opendistrib.net | |||||
* contact@souke.fr | |||||
* | * | ||||
* Ce logiciel est un programme informatique servant à aider les producteurs | * Ce logiciel est un programme informatique servant à aider les producteurs | ||||
* à distribuer leur production en circuits courts. | * à distribuer leur production en circuits courts. | ||||
namespace backend\controllers; | namespace backend\controllers; | ||||
use common\controllers\CommonController; | 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 | class BackendController extends CommonController | ||||
{ | { | ||||
{ | { | ||||
return $this->redirect(['dashboard/index']); | 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']); | |||||
} | |||||
} | |||||
} | |||||
} | } | ||||
?> | ?> |
<?php | <?php | ||||
/** | /** | ||||
* Copyright distrib (2018) | |||||
* Copyright Souke (2018) | |||||
* | * | ||||
* contact@opendistrib.net | |||||
* contact@souke.fr | |||||
* | * | ||||
* Ce logiciel est un programme informatique servant à aider les producteurs | * Ce logiciel est un programme informatique servant à aider les producteurs | ||||
* à distribuer leur production en circuits courts. | * à distribuer leur production en circuits courts. | ||||
namespace backend\controllers; | 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 kartik\mpdf\Pdf; | ||||
use yii\filters\AccessControl; | use yii\filters\AccessControl; | ||||
use yii\filters\VerbFilter; | use yii\filters\VerbFilter; | ||||
]; | ]; | ||||
} | } | ||||
/** | |||||
* 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(); | $producer = $this->getProducerCurrent(); | ||||
$pointsSaleArray = $this->getPointSaleModule()->findPointSales(); | |||||
return $this->render('index', [ | |||||
return $this->render('paper', [ | |||||
'producer' => $producer, | 'producer' => $producer, | ||||
'pointsSaleArray' => $pointsSaleArray, | |||||
]); | ]); | ||||
} | } | ||||
// return the pdf output as per the destination setting | // return the pdf output as per the destination setting | ||||
return $pdf->render(); | return $pdf->render(); | ||||
} | } | ||||
} | } |
<?php | <?php | ||||
/** | /** | ||||
* Copyright distrib (2018) | |||||
* Copyright Souke (2018) | |||||
* | * | ||||
* contact@opendistrib.net | |||||
* contact@souke.fr | |||||
* | * | ||||
* Ce logiciel est un programme informatique servant à aider les producteurs | * Ce logiciel est un programme informatique servant à aider les producteurs | ||||
* à distribuer leur production en circuits courts. | * à distribuer leur production en circuits courts. |
<?php | <?php | ||||
/** | /** | ||||
* Copyright distrib (2018) | |||||
* Copyright Souke (2018) | |||||
* | * | ||||
* contact@opendistrib.net | |||||
* contact@souke.fr | |||||
* | * | ||||
* Ce logiciel est un programme informatique servant à aider les producteurs | * Ce logiciel est un programme informatique servant à aider les producteurs | ||||
* à distribuer leur production en circuits courts. | * à distribuer leur production en circuits courts. | ||||
namespace backend\controllers; | namespace backend\controllers; | ||||
use common\helpers\GlobalParam; | |||||
use common\helpers\MeanPayment; | 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; | ||||
use yii\filters\VerbFilter; | |||||
use yii\filters\AccessControl; | use yii\filters\AccessControl; | ||||
use yii\filters\VerbFilter; | |||||
/** | /** | ||||
* UserController implements the CRUD actions for User model. | * UserController implements the CRUD actions for User model. | ||||
*/ | */ | ||||
$arrayOrders = Order::searchAll([ | $arrayOrders = Order::searchAll([ | ||||
'distribution.date' => $date, | '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'); | $configCredit = $producerModule->getConfig('credit'); | ||||
'distribution.date' => $date, | 'distribution.date' => $date, | ||||
'distribution.id_producer' => $producer->id | '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', | 'html' => '@common/mail/cronOrdersSummary-html', | ||||
'text' => '@common/mail/cronOrdersSummary-text', | 'text' => '@common/mail/cronOrdersSummary-text', | ||||
'orders' => $arrayOrders | 'orders' => $arrayOrders | ||||
] | ] | ||||
) | ) | ||||
->setFrom([Yii::$app->parameterBag->get('adminEmail') => 'distrib']); | |||||
->setFrom([Yii::$app->parameterBag->get('adminEmail') => 'Souke']); | |||||
if (is_array($arrayOrders) && count($arrayOrders)) { | 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 | // @TODO : envoyer uniquement les exports qui sont activés dans les paramètres du producteur | ||||
$distributionModule->getExportManager()->generate(ExportManager::ORDERS_PDF, $distribution, true); | $distributionModule->getExportManager()->generate(ExportManager::ORDERS_PDF, $distribution, true); | ||||
Yii::getAlias('@app/web/pdf/Commandes-' . $date . '-' . $producer->id . '.pdf') | Yii::getAlias('@app/web/pdf/Commandes-' . $date . '-' . $producer->id . '.pdf') | ||||
); | ); | ||||
} else { | } else { | ||||
$subject = '[Opendistrib] Aucune commande'; | |||||
$subject = '[Souke] Aucune commande'; | |||||
} | } | ||||
$mail->setSubject($subject); | $mail->setSubject($subject); |
<?php | <?php | ||||
/** | /** | ||||
* Copyright distrib (2018) | |||||
* Copyright Souke (2018) | |||||
* | * | ||||
* contact@opendistrib.net | |||||
* contact@souke.fr | |||||
* | * | ||||
* Ce logiciel est un programme informatique servant à aider les producteurs | * Ce logiciel est un programme informatique servant à aider les producteurs | ||||
* à distribuer leur production en circuits courts. | * à distribuer leur production en circuits courts. |
<?php | <?php | ||||
/** | /** | ||||
* Copyright distrib (2018) | |||||
* Copyright Souke (2018) | |||||
* | * | ||||
* contact@opendistrib.net | |||||
* contact@souke.fr | |||||
* | * | ||||
* Ce logiciel est un programme informatique servant à aider les producteurs | * Ce logiciel est un programme informatique servant à aider les producteurs | ||||
* à distribuer leur production en circuits courts. | * à distribuer leur production en circuits courts. | ||||
namespace backend\controllers; | namespace backend\controllers; | ||||
use common\logic\Document\DeliveryNote\Model\DeliveryNoteSearch; | |||||
use Yii; | |||||
use domain\Document\DeliveryNote\DeliveryNoteSearch; | |||||
use yii\filters\AccessControl; | use yii\filters\AccessControl; | ||||
use yii\filters\VerbFilter; | |||||
class DeliveryNoteController extends DocumentController | class DeliveryNoteController extends DocumentController | ||||
{ | { |
<?php | <?php | ||||
/** | /** | ||||
* Copyright distrib (2018) | |||||
* Copyright Souke (2018) | |||||
* | * | ||||
* contact@opendistrib.net | |||||
* contact@souke.fr | |||||
* | * | ||||
* Ce logiciel est un programme informatique servant à aider les producteurs | * Ce logiciel est un programme informatique servant à aider les producteurs | ||||
* à distribuer leur production en circuits courts. | * à distribuer leur production en circuits courts. | ||||
namespace backend\controllers; | namespace backend\controllers; | ||||
use common\helpers\Opendistrib; | |||||
use common\helpers\Souke; | |||||
use yii\filters\AccessControl; | use yii\filters\AccessControl; | ||||
/** | /** | ||||
public function actionIndex() | public function actionIndex() | ||||
{ | { | ||||
$producerModule = $this->getProducerModule(); | $producerModule = $this->getProducerModule(); | ||||
$versionsArray = Opendistrib::getVersions(); | |||||
$versionsArray = Souke::getVersions(); | |||||
$versionsRenderArray = []; | $versionsRenderArray = []; | ||||
foreach ($versionsArray as $version) { | foreach ($versionsArray as $version) { | ||||
$versionsRenderArray[$version] = [ | $versionsRenderArray[$version] = [ | ||||
'versionsArray' => $versionsRenderArray | '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'); | |||||
} | |||||
} | } |
<?php | <?php | ||||
/** | /** | ||||
* Copyright distrib (2018) | |||||
* Copyright Souke (2018) | |||||
* | * | ||||
* contact@opendistrib.net | |||||
* contact@souke.fr | |||||
* | * | ||||
* Ce logiciel est un programme informatique servant à aider les producteurs | * Ce logiciel est un programme informatique servant à aider les producteurs | ||||
* à distribuer leur production en circuits courts. | * à distribuer leur production en circuits courts. | ||||
use common\helpers\GlobalParam; | use common\helpers\GlobalParam; | ||||
use common\helpers\MeanPayment; | use common\helpers\MeanPayment; | ||||
use common\helpers\Price; | 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 DateTime; | ||||
use domain\Product\Product\Product; | |||||
use yii\base\ErrorException; | use yii\base\ErrorException; | ||||
use yii\base\Exception; | use yii\base\Exception; | ||||
use yii\filters\AccessControl; | use yii\filters\AccessControl; | ||||
$distributionModule = $this-> getDistributionModule(); | $distributionModule = $this-> getDistributionModule(); | ||||
$orderModule = $this->getOrderModule(); | $orderModule = $this->getOrderModule(); | ||||
$productModule = $this->getProductModule(); | $productModule = $this->getProductModule(); | ||||
$userModule = $this->getUserModule(); | |||||
$producer = $this->getProducerCurrent(); | $producer = $this->getProducerCurrent(); | ||||
$dateObject = DateTime::createFromFormat('Y-m-d', $date); | $dateObject = DateTime::createFromFormat('Y-m-d', $date); | ||||
$json['means_payment'] = MeanPayment::getAll(); | $json['means_payment'] = MeanPayment::getAll(); | ||||
$json['producer'] = $this->buildAjaxInfosResponseProducer($producer); | $json['producer'] = $this->buildAjaxInfosResponseProducer($producer); | ||||
$json['distributions'] = $this->buildAjaxInfosResponseDistributions($dateObject); | $json['distributions'] = $this->buildAjaxInfosResponseDistributions($dateObject); | ||||
$json['leave_period_dates'] = $this->buildAjaxInfosResponseLeavePeriod($producer); | |||||
$json['units'] = Product::$unitsArray; | $json['units'] = Product::$unitsArray; | ||||
if ($distributionModule->getSolver()->validateDistributionDate($date)) { | if ($distributionModule->getSolver()->validateDistributionDate($date)) { | ||||
$json['points_sale'] = $this->buildAjaxInfosResponsePointsSale($distribution); | $json['points_sale'] = $this->buildAjaxInfosResponsePointsSale($distribution); | ||||
$json['delivery_notes'] = $this->buildAjaxInfosResponseDeliveryNotes($date); | $json['delivery_notes'] = $this->buildAjaxInfosResponseDeliveryNotes($date); | ||||
$json['order_create'] = $this->buildAjaxInfosResponseOrderCreate($distribution, $productsArray); | $json['order_create'] = $this->buildAjaxInfosResponseOrderCreate($distribution, $productsArray); | ||||
$json['users'] = $userModule->findUsers(); | |||||
$json['users'] = $this->buildAjaxInfosResponseUsers(); | |||||
$json['one_distribution_week_active'] = $distributionModule->isOneDistributionWeekActive($date); | $json['one_distribution_week_active'] = $distributionModule->isOneDistributionWeekActive($date); | ||||
$json['tiller_is_synchro'] = $this->buildAjaxInfosResponseTiller($producer, $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); | $json['missing_subscriptions'] = $this->buildAjaxInfosResponseMissingSubscriptions($date, $distribution, $ordersArrayObject); | ||||
} | } | ||||
return $json; | 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) | public function buildAjaxInfosResponsePointsSale(Distribution $distribution) | ||||
{ | { | ||||
$producerModule = $this->getProducerModule(); | $producerModule = $this->getProducerModule(); | ||||
$pointSaleModule = $this->getPointSaleModule(); | $pointSaleModule = $this->getPointSaleModule(); | ||||
$pointSaleDistributionModule = $this->getPointSaleDistributionModule(); | $pointSaleDistributionModule = $this->getPointSaleDistributionModule(); | ||||
$sharedPointSaleModule = $this->getSharedPointSaleModule(); | |||||
$featureModule = $this->getFeatureModule(); | |||||
$pointsSaleArray = $pointSaleModule->findPointSalesByDistributionAsArray($distribution); | $pointsSaleArray = $pointSaleModule->findPointSalesByDistributionAsArray($distribution); | ||||
} | } | ||||
$pointSaleArray['credit_functioning'] = $producerModule->getPointSaleCreditFunctioning($pointSale); | $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; | return $pointsSaleArray; | ||||
} | } | ||||
} | } | ||||
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['quantity_form'] = 0; | ||||
$jsonProduct['accessories'] = []; | |||||
foreach($product->getProductAccessories() as $productAccessory) { | |||||
$jsonProduct['accessories'][] = [ | |||||
'id_accessory' => $productAccessory->getAccessory()->getId(), | |||||
'quantity' => $productAccessory->getQuantity(), | |||||
]; | |||||
} | |||||
if ($product->taxRate) { | if ($product->taxRate) { | ||||
$jsonProduct['taxRate'] = $product->taxRate->getAttributes(); | $jsonProduct['taxRate'] = $product->taxRate->getAttributes(); | ||||
} | } | ||||
return [ | return [ | ||||
'credit' => $producer->credit, | 'credit' => $producer->credit, | ||||
'tiller' => $producer->tiller, | '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) | |||||
]; | ]; | ||||
} | } | ||||
public function buildAjaxInfosResponseDistribution(Distribution $distribution, array $ordersArray, array $productsArray) | public function buildAjaxInfosResponseDistribution(Distribution $distribution, array $ordersArray, array $productsArray) | ||||
{ | { | ||||
$producerModule = $this->getProducerModule(); | |||||
$productModule = $this->getProductModule(); | $productModule = $this->getProductModule(); | ||||
$orderModule = $this->getOrderModule(); | $orderModule = $this->getOrderModule(); | ||||
$distributionModule = $this-> getDistributionModule(); | $distributionModule = $this-> getDistributionModule(); | ||||
'active' => $distribution->active, | 'active' => $distribution->active, | ||||
'exports' => $distributionModule->getExportManager()->getAjaxArray($distribution), | 'exports' => $distributionModule->getExportManager()->getAjaxArray($distribution), | ||||
'url_order' => $distributionModule->getLinkOrder($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 | // montant et poids des commandes | ||||
$revenues = 0; | $revenues = 0; | ||||
$revenuesWithTax = 0; | |||||
$weight = 0; | $weight = 0; | ||||
if ($ordersArray) { | if ($ordersArray) { | ||||
foreach ($ordersArray as $order) { | foreach ($ordersArray as $order) { | ||||
$orderModule->initOrder($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; | $weight += $order->weight; | ||||
} | } | ||||
} | } | ||||
} | } | ||||
$distributionJsonData['revenues'] = Price::format($revenues); | $distributionJsonData['revenues'] = Price::format($revenues); | ||||
$distributionJsonData['revenues_with_tax'] = Price::format($revenuesWithTax); | |||||
$distributionJsonData['weight'] = number_format($weight, 2); | $distributionJsonData['weight'] = number_format($weight, 2); | ||||
$distributionJsonData['potential_revenues'] = Price::format($productModule->getProductDistributionPotentialRevenues($productsArray)); | $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['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; | return $distributionJsonData; | ||||
} | } | ||||
$orderModule = $this->getOrderModule(); | $orderModule = $this->getOrderModule(); | ||||
$paymentManager = $this->getPaymentModule(); | $paymentManager = $this->getPaymentModule(); | ||||
$productOrderModule = $this->getProductOrderModule(); | $productOrderModule = $this->getProductOrderModule(); | ||||
$userProducerModule = $this->getUserProducerModule(); | |||||
if ($ordersArray) { | if ($ordersArray) { | ||||
foreach ($ordersArray as &$order) { | foreach ($ordersArray as &$order) { | ||||
'mean_payment' => $payment->mean_payment, | 'mean_payment' => $payment->mean_payment, | ||||
'wording_mean_payment' => $paymentManager->getStrMeanPayment($payment), | 'wording_mean_payment' => $paymentManager->getStrMeanPayment($payment), | ||||
'date' => date('d/m/Y H:i:s', strtotime($payment->date)), | '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), | 'wording' => $paymentManager->getStrWording($payment, $order), | ||||
'amount' => $paymentManager->getAmount($payment, Order::AMOUNT_TOTAL, true), | '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; | $oneProductUnactivated = false; | ||||
'amount_surplus' => Price::numberTwoDecimals($orderModule->getOrderAmount($order, Order::AMOUNT_SURPLUS)), | 'amount_surplus' => Price::numberTwoDecimals($orderModule->getOrderAmount($order, Order::AMOUNT_SURPLUS)), | ||||
'user' => (isset($order->user)) ? array_merge( | 'user' => (isset($order->user)) ? array_merge( | ||||
$order->user->getAttributes(), | $order->user->getAttributes(), | ||||
$arrayCreditUser | |||||
$arrayDatasUser | |||||
) : null, | ) : null, | ||||
'username_user' => (isset($order->user)) ? $userModule->getSolver()->getUsername($order->user) : '', | |||||
'pointSale' => $order->pointSale ? ['id' => $order->pointSale->id, 'name' => $order->pointSale->name] : null, | 'pointSale' => $order->pointSale ? ['id' => $order->pointSale->id, 'name' => $order->pointSale->name] : null, | ||||
'productOrder' => $productOrderArray, | 'productOrder' => $productOrderArray, | ||||
'paymentsArray' => $paymentArray, | 'paymentsArray' => $paymentArray, | ||||
'oneProductUnactivated' => $oneProductUnactivated, | '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, | '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"), | |||||
]); | ]); | ||||
} | } | ||||
} | } | ||||
return $missingSubscriptionsArray; | return $missingSubscriptionsArray; | ||||
} | } | ||||
public function actionAjaxPointSaleFavorite($idUser) | |||||
public function actionAjaxPointSaleFavorite($idUser, $idDistribution) | |||||
{ | { | ||||
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; | \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; | ||||
$userModule = $this->getUserModule(); | $userModule = $this->getUserModule(); | ||||
$orderModule = $this->getOrderModule(); | $orderModule = $this->getOrderModule(); | ||||
$distributionModule = $this->getDistributionModule(); | |||||
$user = $userModule->findOneUserById($idUser); | $user = $userModule->findOneUserById($idUser); | ||||
$distribution = $distributionModule->getRepository()->findOneDistributionById($idDistribution); | |||||
$idFavoritePointSale = 0; | $idFavoritePointSale = 0; | ||||
if($user) { | if($user) { | ||||
$favoritePointSale = $orderModule->getUserFavoritePointSale($user); | |||||
$favoritePointSale = $orderModule->getUserFavoritePointSale($user, $distribution); | |||||
if ($favoritePointSale) { | if ($favoritePointSale) { | ||||
$idFavoritePointSale = $favoritePointSale->id; | $idFavoritePointSale = $favoritePointSale->id; | ||||
} | } | ||||
$idDistribution, | $idDistribution, | ||||
$idUser = false, | $idUser = false, | ||||
$idPointSale = false, | $idPointSale = false, | ||||
$idOrder = false | |||||
$idOrder = false, | |||||
$productOrderFormArray = '' | |||||
) | ) | ||||
{ | { | ||||
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; | \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; | ||||
$productOrderFormArray = json_decode($productOrderFormArray, true); | |||||
$distributionModule = $this-> getDistributionModule(); | $distributionModule = $this-> getDistributionModule(); | ||||
$orderModule = $this->getOrderModule(); | $orderModule = $this->getOrderModule(); | ||||
$userModule = $this->getUserModule(); | $userModule = $this->getUserModule(); | ||||
if (isset($order->productOrder)) { | if (isset($order->productOrder)) { | ||||
foreach ($order->productOrder as $productOrder) { | foreach ($order->productOrder as $productOrder) { | ||||
if ($productOrder->id_product == $product['id']) { | |||||
if ($productOrder->id_product == $product->id) { | |||||
if ($productOrder->invoice_price) { | if ($productOrder->invoice_price) { | ||||
$invoicePrice = number_format($productOrder->invoice_price, 5); | $invoicePrice = number_format($productOrder->invoice_price, 5); | ||||
} else { | } else { | ||||
} | } | ||||
} | } | ||||
$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, | 'quantity' => $quantity, | ||||
'unit' => $product->unit, | 'unit' => $product->unit, | ||||
'prices' => $priceArray, | 'prices' => $priceArray, | ||||
'active' => $product->productDistribution[0]->active | 'active' => $product->productDistribution[0]->active | ||||
&& (!$pointSale || $productModule->isAvailableOnPointSale($product, $pointSale)), | && (!$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; | return $productOrderArray; | ||||
} | } | ||||
public function actionAjaxProcessProductQuantityMax($idDistribution, $idProduct, $quantityMax) | public function actionAjaxProcessProductQuantityMax($idDistribution, $idProduct, $quantityMax) | ||||
{ | { | ||||
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; | \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; | ||||
$orderModule = $this->getOrderModule(); | |||||
$productDistributionModule = $this->getProductDistributionModule(); | $productDistributionModule = $this->getProductDistributionModule(); | ||||
$productDistribution = $this->getProductDistribution($idProduct, $idDistribution); | $productDistribution = $this->getProductDistribution($idProduct, $idDistribution); | ||||
$productDistributionModule->updateProductDistributionQuantityMax($productDistribution, (float) $quantityMax); | $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) | public function actionAjaxProcessActiveProduct(int $idDistribution, int $idProduct, int $active) | ||||
*/ | */ | ||||
public function actionAjaxProcessAddSubscriptions(string $date) | 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)) { | if($ordersArray && count($ordersArray)) { | ||||
return Ajax::responseSuccess('Les abonnements ont bien été importés.'); | return Ajax::responseSuccess('Les abonnements ont bien été importés.'); | ||||
return $this->getOrderModule()->getTillerManager()->synchronizeDistribution($date); | 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) | public function actionAjaxGenerateDeliveryNotePointSale(string $idOrders) | ||||
{ | { | ||||
if (strlen($idOrders)) { | if (strlen($idOrders)) { | ||||
return Ajax::responseSuccess('Bon de livraison généré'); | 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) | public function actionAjaxGenerateDeliveryNoteEachUser(string $idOrders) | ||||
{ | { | ||||
if (strlen($idOrders)) { | if (strlen($idOrders)) { |
<?php | <?php | ||||
/** | /** | ||||
* Copyright distrib (2018) | |||||
* Copyright Souke (2018) | |||||
* | * | ||||
* contact@opendistrib.net | |||||
* contact@souke.fr | |||||
* | * | ||||
* Ce logiciel est un programme informatique servant à aider les producteurs | * Ce logiciel est un programme informatique servant à aider les producteurs | ||||
* à distribuer leur production en circuits courts. | * à distribuer leur production en circuits courts. | ||||
use common\helpers\GlobalParam; | use common\helpers\GlobalParam; | ||||
use common\helpers\MeanPayment; | use common\helpers\MeanPayment; | ||||
use common\helpers\Price; | 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 kartik\mpdf\Pdf; | ||||
use yii\base\UserException; | |||||
use domain\Product\Product\Product; | |||||
use yii; | use yii; | ||||
use yii\filters\VerbFilter; | |||||
use yii\base\UserException; | |||||
use yii\filters\AccessControl; | use yii\filters\AccessControl; | ||||
use yii\web\NotFoundHttpException; | |||||
use yii\helpers\Html; | use yii\helpers\Html; | ||||
use common\logic\Payment\Model\Payment; | |||||
use yii\web\NotFoundHttpException; | |||||
class DocumentController extends BackendController | class DocumentController extends BackendController | ||||
{ | { | ||||
$documentModule = $this->getDocumentModule(); | $documentModule = $this->getDocumentModule(); | ||||
$class = $this->getClass(); | $class = $this->getClass(); | ||||
$class = 'common\\logic\\Document\\'.$class.'\\Model\\'.$class; | |||||
$class = 'domain\\Document\\'.$class.'\\'.$class; | |||||
$model = new $class(); | $model = new $class(); | ||||
$documentModule->initTaxCalculationMethod($model); | $documentModule->initTaxCalculationMethod($model); | ||||
foreach ($model->ordersOnCreate as $key => $idOrder) { | foreach ($model->ordersOnCreate as $key => $idOrder) { | ||||
$order = $orderModule->findOneOrderById($idOrder); | $order = $orderModule->findOneOrderById($idOrder); | ||||
$orderModule->updateOrderInvoice($order, $model); | $orderModule->updateOrderInvoice($order, $model); | ||||
$orderModule->getBuilder()->updateOrderInvoicePrices($order, | |||||
[ | |||||
'user' => $model->user, | |||||
'user_producer' => $this->getUserProducerModule()->getRepository() | |||||
->findOneUserProducer($model->user), | |||||
'point_sale' => $order->pointSale | |||||
]); | |||||
} | } | ||||
} | } | ||||
} | } | ||||
MeanPayment::TRANSFER, | MeanPayment::TRANSFER, | ||||
null, | null, | ||||
null, | null, | ||||
null, | |||||
$document | $document | ||||
); | ); | ||||
$payment->amount = number_format($payment->amount, 2); | $payment->amount = number_format($payment->amount, 2); | ||||
public function actionExportCsvEvoliz(int $id) | 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(); | $documentModule = $this->getDocumentModule(); | ||||
$productOrderModule = $this->getProductOrderModule(); | $productOrderModule = $this->getProductOrderModule(); | ||||
$documentModule = $this->getDocumentModule(); | $documentModule = $this->getDocumentModule(); | ||||
$orderModule = $this->getOrderModule(); | $orderModule = $this->getOrderModule(); | ||||
$producerModule = $this->getProducerModule(); | $producerModule = $this->getProducerModule(); | ||||
$producerCurrent = $this->getProducerCurrent(); | |||||
$invoiceModule = $this->getInvoiceModule(); | |||||
$deliveryNoteModule = $this->getDeliveryNoteModule(); | |||||
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; | \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; | ||||
]; | ]; | ||||
if ($classDocument == 'Invoice') { | if ($classDocument == 'Invoice') { | ||||
$options = [ | |||||
'orderby' => 'distribution.date ASC', | |||||
'join_with' => ['user AS user_delivery_note', 'orders', 'producer'] | |||||
]; | |||||
$deliveryNotesCreateArray = DeliveryNote::searchAll([ | $deliveryNotesCreateArray = DeliveryNote::searchAll([ | ||||
'id_user' => $user->id, | 'id_user' => $user->id, | ||||
'status' => Document::STATUS_VALID, | 'status' => Document::STATUS_VALID, | ||||
'ignore_when_invoicing' => null | '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_create_array'] = $this->initDeliveryNoteArray('create', $deliveryNotesCreateArray); | ||||
$json['delivery_note_update_array'] = $this->initDeliveryNoteArray('update', $deliveryNotesUpdateArray); | $json['delivery_note_update_array'] = $this->initDeliveryNoteArray('update', $deliveryNotesUpdateArray); | ||||
$json['orders_create_array'] = []; | $json['orders_create_array'] = []; | ||||
$json['orders_update_array'] = []; | $json['orders_update_array'] = []; | ||||
if(!$producerModule->getConfig('option_invoice_only_based_on_delivery_notes')) { | if(!$producerModule->getConfig('option_invoice_only_based_on_delivery_notes')) { | ||||
if ($document) { | if ($document) { | ||||
$ordersArray = []; | $ordersArray = []; | ||||
$productsArray = $productModule->findProducts(false); | |||||
$productsArray = $productModule->getRepository()->findProducts(true); | |||||
foreach ($document->orders as $order) { | foreach ($document->orders as $order) { | ||||
$orderModule->initOrder($order); | $orderModule->initOrder($order); | ||||
foreach ($order->productOrder as $productOrder) { | foreach ($order->productOrder as $productOrder) { | ||||
$productsOrderArray[$productOrder->id] = array_merge($productOrder->getAttributes(), [ | $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]) | 'url_order' => $this->getUrlManagerBackend()->createUrl(['distribution/index', 'idOrderUpdate' => $productOrder->id_order]) | ||||
]); | ]); | ||||
} | } | ||||
public function actionAjaxAddProduct($idDocument, $classDocument, $idProduct, $quantity, $price) | public function actionAjaxAddProduct($idDocument, $classDocument, $idProduct, $quantity, $price) | ||||
{ | { | ||||
$orderModule = $this->getOrderModule(); | |||||
$documentModule = $this->getDocumentModule(); | $documentModule = $this->getDocumentModule(); | ||||
$productModule = $this->getProductModule(); | $productModule = $this->getProductModule(); | ||||
$userCurrent = $this->getUserCurrent(); | |||||
if ($documentModule->isValidClass($classDocument)) { | if ($documentModule->isValidClass($classDocument)) { | ||||
$document = $this->findModel($idDocument, $classDocument); | $document = $this->findModel($idDocument, $classDocument); | ||||
$order->id_user = $document->id_user; | $order->id_user = $document->id_user; | ||||
$order->id_point_sale = null; | $order->id_point_sale = null; | ||||
$order->id_distribution = null; | $order->id_distribution = null; | ||||
$order->status = 'tmp-order'; | |||||
$order->origin = Order::ORIGIN_ADMIN; | $order->origin = Order::ORIGIN_ADMIN; | ||||
$order->date = date('Y-m-d H:i:s'); | $order->date = date('Y-m-d H:i:s'); | ||||
$fieldIdDocument = 'id_' . $classDocumentComplete::tableName(); | $fieldIdDocument = 'id_' . $classDocumentComplete::tableName(); | ||||
$order->$fieldIdDocument = $document->id; | $order->$fieldIdDocument = $document->id; | ||||
$order->save(); | $order->save(); | ||||
$orderModule->getManager()->changeOrderStatus($order, OrderStatus::ALIAS_ORDERED, $userCurrent); | |||||
} else { | } else { | ||||
$order = $document->orders[0]; | $order = $document->orders[0]; | ||||
} | } | ||||
public function actionAjaxDeleteProductOrder($idProductOrder) | public function actionAjaxDeleteProductOrder($idProductOrder) | ||||
{ | { | ||||
$productOrderModule = $this->getProductOrderModule(); | $productOrderModule = $this->getProductOrderModule(); | ||||
$productOrder = $productOrderModule->findOneProductOrderById($idProductOrder); | $productOrder = $productOrderModule->findOneProductOrderById($idProductOrder); | ||||
if ($productOrder) { | if ($productOrder) { | ||||
$productOrderModule->delete($productOrder); | $productOrderModule->delete($productOrder); | ||||
return Ajax::responseSuccess('Produit supprimé'); | return Ajax::responseSuccess('Produit supprimé'); | ||||
} | } | ||||
} | } | ||||
} | } | ||||
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() | public function getClass() | ||||
{ | { | ||||
$class = get_class($this); | $class = get_class($this); |
<?php | <?php | ||||
/** | /** | ||||
* Copyright distrib (2018) | |||||
* Copyright Souke (2018) | |||||
* | * | ||||
* contact@opendistrib.net | |||||
* contact@souke.fr | |||||
* | * | ||||
* Ce logiciel est un programme informatique servant à aider les producteurs | * Ce logiciel est un programme informatique servant à aider les producteurs | ||||
* à distribuer leur production en circuits courts. | * à distribuer leur production en circuits courts. | ||||
namespace backend\controllers; | namespace backend\controllers; | ||||
use common\helpers\Ajax; | 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 | class InvoiceController extends DocumentController | ||||
{ | { | ||||
public function actionAjaxDeleteDeliveryNote($idInvoice, $idDeliveryNote) | public function actionAjaxDeleteDeliveryNote($idInvoice, $idDeliveryNote) | ||||
{ | { | ||||
$orderModule = $this->getOrderModule(); | $orderModule = $this->getOrderModule(); | ||||
$invoiceModule = $this-> getInvoiceModule(); | |||||
$invoiceModule = $this-> getInvoiceModule(); | |||||
$deliveryNoteModule = $this->getDeliveryNoteModule(); | $deliveryNoteModule = $this->getDeliveryNoteModule(); | ||||
$invoice = $invoiceModule->findOneInvoiceById($idInvoice); | $invoice = $invoiceModule->findOneInvoiceById($idInvoice); | ||||
$deliveryNote = $deliveryNoteModule->findOneDeliveryNoteById($idDeliveryNote); | $deliveryNote = $deliveryNoteModule->findOneDeliveryNoteById($idDeliveryNote); |
<?php | <?php | ||||
/** | /** | ||||
* Copyright distrib (2018) | |||||
* Copyright Souke (2018) | |||||
* | * | ||||
* contact@opendistrib.net | |||||
* contact@souke.fr | |||||
* | * | ||||
* Ce logiciel est un programme informatique servant à aider les producteurs | * Ce logiciel est un programme informatique servant à aider les producteurs | ||||
* à distribuer leur production en circuits courts. | * à distribuer leur production en circuits courts. | ||||
use common\helpers\CSV; | use common\helpers\CSV; | ||||
use common\helpers\GlobalParam; | use common\helpers\GlobalParam; | ||||
use common\helpers\Price; | 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\filters\AccessControl; | ||||
use yii\helpers\Html; | use yii\helpers\Html; | ||||
/** | /** | ||||
* Traite le formulaire d'ajout/modification de commande. | * Traite le formulaire d'ajout/modification de commande. | ||||
*/ | */ | ||||
public function processOrderForm( | |||||
/*public function processOrderForm( | |||||
Distribution $distribution, | Distribution $distribution, | ||||
string $date, | string $date, | ||||
array $pointsSale, | array $pointsSale, | ||||
} | } | ||||
} | } | ||||
} | } | ||||
} | |||||
}*/ | |||||
/** | /** | ||||
* Page principale de la gestion des commandes. | * Page principale de la gestion des commandes. | ||||
*/ | */ | ||||
public function actionIndex($date = '', $returnData = false) | |||||
/*public function actionIndex($date = '', $returnData = false) | |||||
{ | { | ||||
$distributionModule = $this-> getDistributionModule(); | $distributionModule = $this-> getDistributionModule(); | ||||
$productModule = $this->getProductModule(); | $productModule = $this->getProductModule(); | ||||
} else { | } else { | ||||
return $this->render('index', $datas); | return $this->render('index', $datas); | ||||
} | } | ||||
} | |||||
}*/ | |||||
/** | /** | ||||
* Génère un fichier d'export des commandes au format CSV. | * Génère un fichier d'export des commandes au format CSV. | ||||
$order = $orderModule->findOneOrderById($idOrder); | $order = $orderModule->findOneOrderById($idOrder); | ||||
if ($order) { | if ($order) { | ||||
$orderModule->deleteOrder($order); | |||||
$orderModule->getManager()->deleteOrder($order, $this->getUserCurrent()); | |||||
} | } | ||||
return ['success']; | return ['success']; | ||||
$orderModule = $this->getOrderModule(); | $orderModule = $this->getOrderModule(); | ||||
$order = $orderModule->findOneOrderById($idOrder); | $order = $orderModule->findOneOrderById($idOrder); | ||||
if ($order) { | if ($order) { | ||||
$orderModule->deleteOrder($order); | |||||
$orderModule->getManager()->deleteOrder($order, $this->getUserCurrent()); | |||||
} | } | ||||
$this->redirect(['index', 'date' => $date]); | $this->redirect(['index', 'date' => $date]); | ||||
$pointSale = $pointSaleModule->findOnePointSaleById($idPointSale); | $pointSale = $pointSaleModule->findOnePointSaleById($idPointSale); | ||||
$distribution = $distributionModule->findOneDistribution($date); | $distribution = $distributionModule->findOneDistribution($date); | ||||
$producerCurrent = $this->getProducerCurrent(); | $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) | 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)) | && ($idUser || strlen($username)) | ||||
$order->id_distribution = $distribution->id; | $order->id_distribution = $distribution->id; | ||||
$order->origin = Order::ORIGIN_ADMIN; | $order->origin = Order::ORIGIN_ADMIN; | ||||
$order->comment = $comment; | $order->comment = $comment; | ||||
$order->status = 'tmp-order'; | |||||
if ($idUser) { | if ($idUser) { | ||||
$order->id_user = $idUser; | $order->id_user = $idUser; | ||||
$order->save(); | $order->save(); | ||||
$orderModule->getManager()->changeOrderStatus($order, OrderStatus::ALIAS_ORDERED, $userCurrent); | |||||
$user = false; | $user = false; | ||||
$userProducer = false; | $userProducer = false; | ||||
if (isset($order->user) && $order->user) { | if (isset($order->user) && $order->user) { | ||||
} | } | ||||
$order->id_point_sale = $idPointSale; | $order->id_point_sale = $idPointSale; | ||||
$order->date_update = date('Y-m-d H:i:s'); | |||||
$order->mean_payment = $meanPayment; | $order->mean_payment = $meanPayment; | ||||
$order->comment = $comment; | $order->comment = $comment; | ||||
$order->save(); | $order->save(); | ||||
$orderModule->getManager()->changeOrderStatus($order, OrderStatus::ALIAS_UPDATED, $this->getUserCurrent()); | |||||
$order = Order::searchOne(['id' => $order->id]); | $order = Order::searchOne(['id' => $order->id]); | ||||
$orderModule->initOrder($order); | $orderModule->initOrder($order); | ||||
if ($order && $orderModule->isCreditAutoPayment($order, $debitCredit)) { | if ($order && $orderModule->isCreditAutoPayment($order, $debitCredit)) { | ||||
} | } | ||||
/** | /** | ||||
* 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) | public function actionPaymentStatus(int $idOrder) | ||||
{ | { | ||||
if (abs($order->amount - $amountPaid) < 0.0001) { | if (abs($order->amount - $amountPaid) < 0.0001) { | ||||
$html .= '<span class="label label-success">Payé</span>'; | $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) { | } elseif ($order->amount > $amountPaid) { | ||||
$amountToPay = $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'; | $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']); | $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) { | } elseif ($order->amount < $amountPaid) { | ||||
$amountToRefund = $amountPaid - $order->amount; | $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">' | $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 | . $buttonsCredit | ||||
. '</span>'; | . '</span>'; | ||||
foreach ($history as $creditHistory) { | foreach ($history as $creditHistory) { | ||||
$html .= '<tr>' | $html .= '<tr>' | ||||
. '<td>' . date('d/m/Y H:i:s', strtotime($paymentManager->getDate($creditHistory))) . '</td>' | . '<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->getStrWording($creditHistory) . '</td>' | ||||
. '<td>' . ($paymentManager->isTypeDebit($creditHistory) ? '- ' . Price::getPriceWithTax($creditHistory->amount) : '') . '</td>' | . '<td>' . ($paymentManager->isTypeDebit($creditHistory) ? '- ' . Price::getPriceWithTax($creditHistory->amount) : '') . '</td>' | ||||
. '<td>' . ($paymentManager->isTypeCredit($creditHistory) ? '+ ' . Price::getPriceWithTax($creditHistory->amount) : '') . '</td>' | . '<td>' . ($paymentManager->isTypeCredit($creditHistory) ? '+ ' . Price::getPriceWithTax($creditHistory->amount) : '') . '</td>' |
<?php | <?php | ||||
/** | /** | ||||
* Copyright distrib (2018) | |||||
* Copyright Souke (2018) | |||||
* | * | ||||
* contact@opendistrib.net | |||||
* contact@souke.fr | |||||
* | * | ||||
* Ce logiciel est un programme informatique servant à aider les producteurs | * Ce logiciel est un programme informatique servant à aider les producteurs | ||||
* à distribuer leur production en circuits courts. | * à distribuer leur production en circuits courts. | ||||
namespace backend\controllers; | namespace backend\controllers; | ||||
use common\helpers\GlobalParam; | 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\filters\AccessControl; | ||||
use yii\web\NotFoundHttpException; | |||||
use yii\filters\VerbFilter; | |||||
use yii\helpers\Html; | use yii\helpers\Html; | ||||
use yii\web\NotFoundHttpException; | |||||
class PointSaleController extends BackendController | class PointSaleController extends BackendController | ||||
{ | { | ||||
if ($pointSale->load(\Yii::$app->request->post()) && $pointSale->save()) { | if ($pointSale->load(\Yii::$app->request->post()) && $pointSale->save()) { | ||||
$pointSaleModule->updatePointSalePointProduction($pointSale); | $pointSaleModule->updatePointSalePointProduction($pointSale); | ||||
$pointSaleModule->processRestrictedAccess($pointSale); | $pointSaleModule->processRestrictedAccess($pointSale); | ||||
$this->initPaymentMethodsByCreditFunctioning($pointSale); | |||||
$distributionModule->addPointSaleIncomingDistributions($pointSale); | $distributionModule->addPointSaleIncomingDistributions($pointSale); | ||||
return $this->redirect(['index']); | |||||
$this->setFlash('success', 'Point de vente créé.'); | |||||
return $this->redirectAfterSave('point-sale', $pointSale->id); | |||||
} else { | } else { | ||||
return $this->render('create', array_merge($this->initForm(), [ | return $this->render('create', array_merge($this->initForm(), [ | ||||
'model' => $pointSale, | 'model' => $pointSale, | ||||
{ | { | ||||
$distributionModule = $this-> getDistributionModule(); | $distributionModule = $this-> getDistributionModule(); | ||||
$pointSaleModule = $this->getPointSaleModule(); | $pointSaleModule = $this->getPointSaleModule(); | ||||
$model = PointSale::find() | |||||
->with('userPointSale') | |||||
->where(['id' => $id]) | |||||
->one(); | |||||
$model = $this->findModel($id); | |||||
foreach ($model->userPointSale as $userPointSale) { | foreach ($model->userPointSale as $userPointSale) { | ||||
$model->users[] = $userPointSale->id_user; | $model->users[] = $userPointSale->id_user; | ||||
$pointSaleModule->updatePointSalePointProduction($model); | $pointSaleModule->updatePointSalePointProduction($model); | ||||
$pointSaleModule->processRestrictedAccess($model); | $pointSaleModule->processRestrictedAccess($model); | ||||
$this->initPaymentMethodsByCreditFunctioning($model); | |||||
$distributionModule->addPointSaleIncomingDistributions($model); | $distributionModule->addPointSaleIncomingDistributions($model); | ||||
$this->setFlash('success', 'Point de vente modifié.'); | $this->setFlash('success', 'Point de vente modifié.'); | ||||
return $this->redirect(['index']); | |||||
return $this->redirectAfterSave('point-sale', $model->id); | |||||
} else { | } else { | ||||
return $this->render('update', array_merge($this->initForm($id), [ | return $this->render('update', array_merge($this->initForm($id), [ | ||||
'model' => $model, | 'model' => $model, | ||||
} | } | ||||
} | } | ||||
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. | * Initialise le formulaire de création/modification. | ||||
*/ | */ | ||||
'id_point_sale' => $id, | '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')] | 'params' => [':today' => date('Y-m-d')] | ||||
] | ] | ||||
); | ); | ||||
if ($ordersArray) { | if ($ordersArray) { | ||||
foreach ($ordersArray as $order) { | foreach ($ordersArray as $order) { | ||||
$orderModule->deleteOrder($order, true); | |||||
$orderModule->getManager()->deleteOrder($order, $this->getUserCurrent(), true); | |||||
} | } | ||||
} | } | ||||
*/ | */ | ||||
protected function findModel(int $id) | 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; | |||||
} | } | ||||
} | } |
<?php | <?php | ||||
/** | /** | ||||
* Copyright distrib (2018) | |||||
* Copyright Souke (2018) | |||||
* | * | ||||
* contact@opendistrib.net | |||||
* contact@souke.fr | |||||
* | * | ||||
* Ce logiciel est un programme informatique servant à aider les producteurs | * Ce logiciel est un programme informatique servant à aider les producteurs | ||||
* à distribuer leur production en circuits courts. | * à distribuer leur production en circuits courts. | ||||
namespace backend\controllers; | namespace backend\controllers; | ||||
use common\helpers\GlobalParam; | 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; | ||||
use yii\data\ActiveDataProvider; | use yii\data\ActiveDataProvider; | ||||
use yii\web\NotFoundHttpException; | |||||
use yii\filters\VerbFilter; | |||||
use yii\filters\AccessControl; | use yii\filters\AccessControl; | ||||
use common\helpers\Upload; | |||||
use yii\filters\VerbFilter; | |||||
use yii\web\NotFoundHttpException; | |||||
use yii\web\UploadedFile; | use yii\web\UploadedFile; | ||||
/** | /** | ||||
$logoFilenameOld = $model->logo; | $logoFilenameOld = $model->logo; | ||||
$photoFilenameOld = $model->photo; | $photoFilenameOld = $model->photo; | ||||
$documentImageBottomFilenameOld = $model->document_image_bottom; | $documentImageBottomFilenameOld = $model->document_image_bottom; | ||||
$producerBuilder->initOptionDashboardDatesDisplay($model); | |||||
$producerBuilder->initOptionsDatesDisplay($model); | |||||
if ($model->load(\Yii::$app->request->post())) { | if ($model->load(\Yii::$app->request->post())) { | ||||
if($model->validate()) { | if($model->validate()) { | ||||
$producerBuilder->initOptionsDatesBeforeSave($model); | |||||
$producerBuilder->processUploadImage($model, 'logo', $logoFilenameOld, $request->post('delete_logo', 0)); | $producerBuilder->processUploadImage($model, 'logo', $logoFilenameOld, $request->post('delete_logo', 0)); | ||||
$producerBuilder->processUploadImage($model, 'photo', $photoFilenameOld, $request->post('delete_photo', 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->processUploadImage($model, 'document_image_bottom', $documentImageBottomFilenameOld, $request->post('delete_document_image_bottom', 0)); | ||||
$producerBuilder->initOptionDashboardDatesBeforeSave($model); | |||||
$producerBuilder->savePrivateKeysStripe($model); | $producerBuilder->savePrivateKeysStripe($model); | ||||
$model->save(); | $model->save(); | ||||
return $this->redirect(\Yii::$app->request->referrer); | 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() | public function actionPagesize() | ||||
{ | { | ||||
$producerCurrent = $this->getProducerCurrent(); | $producerCurrent = $this->getProducerCurrent(); | ||||
$referer = strtok(Yii::$app->request->referrer, "?"); | $referer = strtok(Yii::$app->request->referrer, "?"); | ||||
return $this->redirect($referer); | return $this->redirect($referer); | ||||
} | } | ||||
} | } |
public function actionIndex() | public function actionIndex() | ||||
{ | { | ||||
return $this->render('index', [ | return $this->render('index', [ | ||||
'producer' => $this->getProducerCurrent(), | |||||
'invoicesArray' => $this->getProducerModule() | 'invoicesArray' => $this->getProducerModule() | ||||
->getDolibarrUtils() | ->getDolibarrUtils() | ||||
->getDolibarrProducerInvoices($this->getProducerCurrent()) | ->getDolibarrProducerInvoices($this->getProducerCurrent()) |
<?php | <?php | ||||
/** | /** | ||||
* Copyright distrib (2018) | |||||
* Copyright Souke (2018) | |||||
* | * | ||||
* contact@opendistrib.net | |||||
* contact@souke.fr | |||||
* | * | ||||
* Ce logiciel est un programme informatique servant à aider les producteurs | * Ce logiciel est un programme informatique servant à aider les producteurs | ||||
* à distribuer leur production en circuits courts. | * à distribuer leur production en circuits courts. | ||||
namespace backend\controllers; | 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\data\ActiveDataProvider; | ||||
use yii\filters\AccessControl; | |||||
use yii\web\NotFoundHttpException; | |||||
/** | /** | ||||
* ProducerPriceRangeAdminController implements the CRUD actions for ProducerPriceRange model. | * ProducerPriceRangeAdminController implements the CRUD actions for ProducerPriceRange model. |
<?php | <?php | ||||
/** | /** | ||||
* Copyright distrib (2018) | |||||
* Copyright Souke (2018) | |||||
* | * | ||||
* contact@opendistrib.net | |||||
* contact@souke.fr | |||||
* | * | ||||
* Ce logiciel est un programme informatique servant à aider les producteurs | * Ce logiciel est un programme informatique servant à aider les producteurs | ||||
* à distribuer leur production en circuits courts. | * à distribuer leur production en circuits courts. | ||||
namespace backend\controllers; | namespace backend\controllers; | ||||
use common\helpers\GlobalParam; | 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; | ||||
use yii\filters\AccessControl; | use yii\filters\AccessControl; | ||||
use yii\web\NotFoundHttpException; | |||||
use yii\filters\VerbFilter; | |||||
use yii\helpers\Html; | use yii\helpers\Html; | ||||
use yii\web\NotFoundHttpException; | |||||
/** | /** | ||||
* ProductCategoryController implements the CRUD actions for ProductCategory model. | * ProductCategoryController implements the CRUD actions for ProductCategory model. |
<?php | <?php | ||||
/** | /** | ||||
* Copyright distrib (2018) | |||||
* Copyright Souke (2018) | |||||
* | * | ||||
* contact@opendistrib.net | |||||
* contact@souke.fr | |||||
* | * | ||||
* Ce logiciel est un programme informatique servant à aider les producteurs | * Ce logiciel est un programme informatique servant à aider les producteurs | ||||
* à distribuer leur production en circuits courts. | * à distribuer leur production en circuits courts. | ||||
use backend\forms\ProductPriceUploadForm; | use backend\forms\ProductPriceUploadForm; | ||||
use common\helpers\CSV; | use common\helpers\CSV; | ||||
use common\helpers\GlobalParam; | 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; | ||||
use yii\filters\AccessControl; | use yii\filters\AccessControl; | ||||
use yii\helpers\Html; | use yii\helpers\Html; | ||||
use yii\web\NotFoundHttpException; | use yii\web\NotFoundHttpException; | ||||
use common\helpers\Upload; | |||||
use yii\web\UploadedFile; | use yii\web\UploadedFile; | ||||
/** | /** | ||||
$this->setFlash('success', 'Produit <strong>' . Html::encode($model->name) . '</strong> ajouté'); | $this->setFlash('success', 'Produit <strong>' . Html::encode($model->name) . '</strong> ajouté'); | ||||
return $this->redirect(['index']); | |||||
return $this->redirectAfterSave('product', $model->id); | |||||
} | } | ||||
} | } | ||||
{ | { | ||||
$productModule = $this->getProductModule(); | $productModule = $this->getProductModule(); | ||||
$distributionModule = $this-> getDistributionModule(); | $distributionModule = $this-> getDistributionModule(); | ||||
$subscriptionModule = $this->getSubscriptionModule(); | |||||
$request = Yii::$app->request; | $request = Yii::$app->request; | ||||
$model = $this->findModel($id); | $model = $this->findModel($id); | ||||
} | } | ||||
$this->processAvailabilityPointsSale($model); | $this->processAvailabilityPointsSale($model); | ||||
$productModule->getBuilder()->update($model); | |||||
if ($model->apply_distributions) { | if ($model->apply_distributions) { | ||||
$distributionModule->addProductIncomingDistributions($model); | $distributionModule->addProductIncomingDistributions($model); | ||||
} | } | ||||
$productModule->update($model); | |||||
$this->setFlash('success', 'Produit <strong>' . Html::encode($model->name) . '</strong> modifié'); | $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', [ | return $this->render('update/update', [ | ||||
'model' => $model, | 'model' => $model, | ||||
'action' => 'update', | 'action' => 'update', | ||||
$orderArray = json_decode(stripslashes($array)); | $orderArray = json_decode(stripslashes($array)); | ||||
foreach ($orderArray as $id => $order) { | foreach ($orderArray as $id => $order) { | ||||
$product = $this->findModel($id); | |||||
$product = $this->findModel((int) $id); | |||||
$product->order = $order; | $product->order = $order; | ||||
$product->save(); | $product->save(); | ||||
} | } | ||||
$product->status = (int) $status; | $product->status = (int) $status; | ||||
$product->save(); | $product->save(); | ||||
$distributionModule->addProductIncomingDistributions($product); | |||||
$distributionModule->getBuilder()->addProductIncomingDistributions($product); | |||||
return ['success', 'id' => $id, 'status' => $status]; | return ['success', 'id' => $id, 'status' => $status]; | ||||
} | } |
<?php | <?php | ||||
/** | /** | ||||
* Copyright distrib (2018) | |||||
* Copyright Souke (2018) | |||||
* | * | ||||
* contact@opendistrib.net | |||||
* contact@souke.fr | |||||
* | * | ||||
* Ce logiciel est un programme informatique servant à aider les producteurs | * Ce logiciel est un programme informatique servant à aider les producteurs | ||||
* à distribuer leur production en circuits courts. | * à distribuer leur production en circuits courts. | ||||
namespace backend\controllers; | namespace backend\controllers; | ||||
use common\helpers\GlobalParam; | 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\base\UserException; | ||||
use yii\filters\AccessControl; | use yii\filters\AccessControl; | ||||
use yii\helpers\Html; | use yii\helpers\Html; |
<?php | <?php | ||||
/** | /** | ||||
* Copyright distrib (2018) | |||||
* Copyright Souke (2018) | |||||
* | * | ||||
* contact@opendistrib.net | |||||
* contact@souke.fr | |||||
* | * | ||||
* Ce logiciel est un programme informatique servant à aider les producteurs | * Ce logiciel est un programme informatique servant à aider les producteurs | ||||
* à distribuer leur production en circuits courts. | * à distribuer leur production en circuits courts. | ||||
namespace backend\controllers; | namespace backend\controllers; | ||||
use common\helpers\CSV; | |||||
use common\helpers\GlobalParam; | use common\helpers\GlobalParam; | ||||
use common\helpers\MeanPayment; | |||||
use common\helpers\Price; | use common\helpers\Price; | ||||
use domain\Order\Order\OrderRepositoryQuery; | |||||
use domain\Order\OrderStatus\OrderStatus; | |||||
use backend\forms\ReportPaymentsForm; | |||||
use Yii; | use Yii; | ||||
use yii\filters\AccessControl; | use yii\filters\AccessControl; | ||||
$distributionModule = $this-> getDistributionModule(); | $distributionModule = $this-> getDistributionModule(); | ||||
$usersArray = $userModule->findUsers(); | $usersArray = $userModule->findUsers(); | ||||
foreach($usersArray as $key => $user) { | |||||
$usersArray[$key]['username'] = $userModule->getSolver()->getUsernameFromArray($user, true); | |||||
} | |||||
$pointsSaleArray = $pointSaleModule->findPointSales(); | $pointsSaleArray = $pointSaleModule->findPointSales(); | ||||
$firstDistribution = $distributionModule->findOneFirstDistribution(); | $firstDistribution = $distributionModule->findOneFirstDistribution(); | ||||
$lastDistribution = $distributionModule->findOneLastDistribution(); | $lastDistribution = $distributionModule->findOneLastDistribution(); | ||||
} | } | ||||
$distributionsByMonthArray = []; | $distributionsByMonthArray = []; | ||||
$distributionsArray = $distributionModule->findDistributionsActive(); | |||||
$distributionsArray = $distributionModule->findDistributionsWithOrders(); | |||||
foreach ($distributionsArray as $distribution) { | foreach ($distributionsArray as $distribution) { | ||||
$month = date('Y-m', strtotime($distribution->date)); | $month = date('Y-m', strtotime($distribution->date)); | ||||
if (!isset($distributionsByMonthArray[$month])) { | if (!isset($distributionsByMonthArray[$month])) { | ||||
public function actionAjaxReport() | public function actionAjaxReport() | ||||
{ | { | ||||
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; | |||||
$posts = Yii::$app->request->post(); | $posts = Yii::$app->request->post(); | ||||
$isDownload = $posts['isDownload'] == 1; | |||||
$resArray = []; | $resArray = []; | ||||
$conditionUsers = $this->_generateConditionSqlReport($posts, 'users', 'id_user'); | $conditionUsers = $this->_generateConditionSqlReport($posts, 'users', 'id_user'); | ||||
$conditionPointsSale = $this->_generateConditionSqlReport($posts, 'pointsSale', 'id_point_sale'); | $conditionPointsSale = $this->_generateConditionSqlReport($posts, 'pointsSale', 'id_point_sale'); | ||||
WHERE `order`.id = product_order.id_order | WHERE `order`.id = product_order.id_order | ||||
AND product.id_producer = " . ((int)GlobalParam::getCurrentProducerId()) . " | AND product.id_producer = " . ((int)GlobalParam::getCurrentProducerId()) . " | ||||
AND product_order.id_product = product.id | AND product_order.id_product = product.id | ||||
AND `order`.date_delete IS NULL | |||||
AND ".OrderRepositoryQuery::getSqlFilterIsValid()." | |||||
" . $conditionUsers . " | " . $conditionUsers . " | ||||
" . $conditionPointsSale . " | " . $conditionPointsSale . " | ||||
" . $conditionDistributions . " | " . $conditionDistributions . " | ||||
$totalGlobal = 0; | $totalGlobal = 0; | ||||
foreach ($res as $line) { | 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) { | if ($line['quantity'] > 0) { | ||||
$resArray[] = [ | $resArray[] = [ | ||||
'name' => $line['name'], | 'name' => $line['name'], | ||||
'quantity' => $line['quantity'], | |||||
'quantity' => $quantity, | |||||
'total' => $total, | 'total' => $total, | ||||
]; | ]; | ||||
$totalGlobal += $line['total']; | $totalGlobal += $line['total']; | ||||
} | } | ||||
} | } | ||||
$roundedTotalGlobal = round($totalGlobal, 2); | |||||
$totalGlobalFormat = $isDownload ? $roundedTotalGlobal : Price::format($roundedTotalGlobal).' HT'; | |||||
$resArray[] = [ | $resArray[] = [ | ||||
'name' => '', | 'name' => '', | ||||
'quantity' => '', | '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) | public function _generateConditionSqlReport($posts, $name, $fieldOrder) | ||||
return $condition; | 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 | |||||
]); | |||||
} | |||||
} | } |
<?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; | |||||
} | |||||
} |
<?php | <?php | ||||
/** | /** | ||||
* Copyright distrib (2018) | |||||
* Copyright Souke (2018) | |||||
* | * | ||||
* contact@opendistrib.net | |||||
* contact@souke.fr | |||||
* | * | ||||
* Ce logiciel est un programme informatique servant à aider les producteurs | * Ce logiciel est un programme informatique servant à aider les producteurs | ||||
* à distribuer leur production en circuits courts. | * à distribuer leur production en circuits courts. | ||||
namespace backend\controllers; | namespace backend\controllers; | ||||
use common\logic\User\User\Model\User; | |||||
use common\forms\LoginForm; | |||||
use Yii; | use Yii; | ||||
use yii\filters\AccessControl; | use yii\filters\AccessControl; | ||||
use common\forms\LoginForm; | |||||
use yii\filters\VerbFilter; | use yii\filters\VerbFilter; | ||||
/** | /** | ||||
* Change le producteur courant de l'utilisateur connecté. | * Change le producteur courant de l'utilisateur connecté. | ||||
* Permet de passer d'un producteur à un autre en tant qu'administrateur. | * 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(); | $user = $this->getUserCurrent(); | ||||
$producer = $this->getProducerModule()->getRepository()->findOneProducerById($id); | $producer = $this->getProducerModule()->getRepository()->findOneProducerById($id); | ||||
if($producer) { | if($producer) { | ||||
$this->getUserModule()->getBuilder()->switchProducer($user, $producer); | $this->getUserModule()->getBuilder()->switchProducer($user, $producer); | ||||
if($createTicket) { | |||||
return $this->redirect($this->getUrlManagerBackend()->createUrl(['support/create'])); | |||||
} | |||||
} | } | ||||
else { | else { | ||||
$this->addFlash('error', 'Producteur introuvable.'); | $this->addFlash('error', 'Producteur introuvable.'); |
<?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) | |||||
]); | |||||
} | |||||
} |
<?php | <?php | ||||
/** | /** | ||||
* Copyright distrib (2018) | |||||
* Copyright Souke (2018) | |||||
* | * | ||||
* contact@opendistrib.net | |||||
* contact@souke.fr | |||||
* | * | ||||
* Ce logiciel est un programme informatique servant à aider les producteurs | * Ce logiciel est un programme informatique servant à aider les producteurs | ||||
* à distribuer leur production en circuits courts. | * à distribuer leur production en circuits courts. | ||||
$year = date('Y'); | $year = date('Y'); | ||||
} | } | ||||
$isVatNotApplicable = !$producerCurrent->taxRate->value; | |||||
$yearsWithTurnoverArray = $this->getProducerModule()->getRepository()->getYearsWithTurnover($producerCurrent); | $yearsWithTurnoverArray = $this->getProducerModule()->getRepository()->getYearsWithTurnover($producerCurrent); | ||||
$dataChartTurnover = $this->getProducerModule()->getRepository()->getDatasChartTurnoverStatistics($producerCurrent, $year, $displayBy); | $dataChartTurnover = $this->getProducerModule()->getRepository()->getDatasChartTurnoverStatistics($producerCurrent, $year, $displayBy); | ||||
$dataChartTurnoverWithTax = $this->getProducerModule()->getRepository()->getDatasChartTurnoverStatistics($producerCurrent, $year, $displayBy, true); | |||||
return $this->render('index', [ | return $this->render('index', [ | ||||
'isVatNotApplicable' => $isVatNotApplicable, | |||||
'displayBy' => $displayBy, | 'displayBy' => $displayBy, | ||||
'yearCurrent' => $year, | 'yearCurrent' => $year, | ||||
'dataLabels' => $dataChartTurnover['labels'], | 'dataLabels' => $dataChartTurnover['labels'], | ||||
'data' => $dataChartTurnover['data'], | 'data' => $dataChartTurnover['data'], | ||||
'yearsWithTurnoverArray' => $yearsWithTurnoverArray | |||||
'dataWithTax' => $dataChartTurnoverWithTax['data'], | |||||
'yearsWithTurnoverArray' => $yearsWithTurnoverArray, | |||||
]); | ]); | ||||
} | } | ||||
<?php | <?php | ||||
/** | /** | ||||
* Copyright distrib (2018) | |||||
* Copyright Souke (2018) | |||||
* | * | ||||
* contact@opendistrib.net | |||||
* contact@souke.fr | |||||
* | * | ||||
* Ce logiciel est un programme informatique servant à aider les producteurs | * Ce logiciel est un programme informatique servant à aider les producteurs | ||||
* à distribuer leur production en circuits courts. | * à distribuer leur production en circuits courts. | ||||
use common\forms\SubscriptionForm; | use common\forms\SubscriptionForm; | ||||
use common\helpers\GlobalParam; | 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\filters\AccessControl; | ||||
use yii\web\NotFoundHttpException; | use yii\web\NotFoundHttpException; | ||||
*/ | */ | ||||
public function actionUpdate($id) | public function actionUpdate($id) | ||||
{ | { | ||||
$orderModule = $this->getOrderModule(); | |||||
$subscriptionModule = $this->getSubscriptionModule(); | $subscriptionModule = $this->getSubscriptionModule(); | ||||
$productSubscriptionModule = $this->getProductSubscriptionModule(); | $productSubscriptionModule = $this->getProductSubscriptionModule(); | ||||
$productModule = $this->getProductModule(); | $productModule = $this->getProductModule(); | ||||
$distributionModule = $this-> getDistributionModule(); | $distributionModule = $this-> getDistributionModule(); | ||||
$orderModule = $this->getOrderModule(); | |||||
$model = new SubscriptionForm; | $model = new SubscriptionForm; | ||||
$model->isAdmin = true; | $model->isAdmin = true; | ||||
$messageOrdersDeleted = ''; | $messageOrdersDeleted = ''; | ||||
if ($model->date_end) { | if ($model->date_end) { | ||||
$countOrdersDeleted = $subscriptionModule->getOrderManager() | |||||
->deleteOrdersIncomingDistributionsFromSubscription($subscription, true); | |||||
$countOrdersDeleted = $orderModule->getManager() | |||||
->deleteOrdersIncomingDistributionsFromSubscription($subscription, $this->getUserCurrent(), true); | |||||
if ($countOrdersDeleted) { | if ($countOrdersDeleted) { | ||||
$messageOrdersDeleted = '<br />' . $countOrdersDeleted . ' commandes supprimées'; | $messageOrdersDeleted = '<br />' . $countOrdersDeleted . ' commandes supprimées'; | ||||
} | } | ||||
*/ | */ | ||||
public function actionDelete(int $id) | public function actionDelete(int $id) | ||||
{ | { | ||||
$subscriptionModule = $this->getSubscriptionModule(); | |||||
$orderModule = $this->getOrderModule(); | $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']); | return $this->redirect(['subscription/index']); | ||||
} | } | ||||
public function actionUpdateDistributions(int $idSubscription, bool $generate = false, bool $update = false) | public function actionUpdateDistributions(int $idSubscription, bool $generate = false, bool $update = false) | ||||
{ | { | ||||
$orderModule = $this->getOrderModule(); | |||||
$subscriptionModule = $this->getSubscriptionModule(); | $subscriptionModule = $this->getSubscriptionModule(); | ||||
$distributionModule = $this-> getDistributionModule(); | $distributionModule = $this-> getDistributionModule(); | ||||
$subscription = $subscriptionModule->findOneSubscriptionById($idSubscription); | $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->redirect(['subscription/index']); | ||||
} | } | ||||
return $this->render('update_distributions', [ | |||||
'matchedDistributionsArray' => $matchedDistributionsArray, | |||||
'idSubscription' => $idSubscription, | |||||
'update' => $update | |||||
]); | |||||
} | } | ||||
public function actionAjaxInfos(int $idSubscription = 0) | public function actionAjaxInfos(int $idSubscription = 0) |
<?php | <?php | ||||
/** | /** | ||||
* Copyright distrib (2018) | |||||
* Copyright Souke (2018) | |||||
* | * | ||||
* contact@opendistrib.net | |||||
* contact@souke.fr | |||||
* | * | ||||
* Ce logiciel est un programme informatique servant à aider les producteurs | * Ce logiciel est un programme informatique servant à aider les producteurs | ||||
* à distribuer leur production en circuits courts. | * à distribuer leur production en circuits courts. | ||||
namespace backend\controllers; | 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\filters\AccessControl; | ||||
use yii\helpers\Html; | use yii\helpers\Html; | ||||
use yii\web\NotFoundHttpException; | use yii\web\NotFoundHttpException; |
<?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']); | |||||
} | |||||
} |
<?php | <?php | ||||
/** | /** | ||||
* Copyright distrib (2018) | |||||
* Copyright Souke (2018) | |||||
* | * | ||||
* contact@opendistrib.net | |||||
* contact@souke.fr | |||||
* | * | ||||
* Ce logiciel est un programme informatique servant à aider les producteurs | * Ce logiciel est un programme informatique servant à aider les producteurs | ||||
* à distribuer leur production en circuits courts. | * à distribuer leur production en circuits courts. | ||||
use backend\models\CreditForm; | use backend\models\CreditForm; | ||||
use common\helpers\GlobalParam; | use common\helpers\GlobalParam; | ||||
use backend\models\MailForm; | |||||
use common\helpers\Password; | 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\base\UserException; | ||||
use yii\filters\AccessControl; | use yii\filters\AccessControl; | ||||
use \Yii; | |||||
use yii\helpers\Html; | use yii\helpers\Html; | ||||
use yii\web\NotFoundHttpException; | use yii\web\NotFoundHttpException; | ||||
'allow' => true, | 'allow' => true, | ||||
'roles' => ['@'], | 'roles' => ['@'], | ||||
'matchCallback' => function ($rule, $action) { | '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); | |||||
} | |||||
} | } | ||||
] | |||||
], | |||||
], | ], | ||||
], | ], | ||||
]; | ]; | ||||
bool $sectionInactiveUsers = false) | bool $sectionInactiveUsers = false) | ||||
{ | { | ||||
$pointSaleModule = $this->getPointSaleModule(); | $pointSaleModule = $this->getPointSaleModule(); | ||||
$producer = $this->getProducerCurrent(); | |||||
$searchModel = new UserSearch(); | $searchModel = new UserSearch(); | ||||
$dataProvider = $searchModel->search([ | $dataProvider = $searchModel->search([ | ||||
'UserSearch' => array_merge( | 'UserSearch' => array_merge( | ||||
Yii::$app->request->queryParams['UserSearch'] : | Yii::$app->request->queryParams['UserSearch'] : | ||||
[] | [] | ||||
) | ) | ||||
]); | |||||
], $producer); | |||||
$producer = $this->getProducerCurrent(); | $producer = $this->getProducerCurrent(); | ||||
$pointsSaleArray = $pointSaleModule->findPointSales(); | $pointsSaleArray = $pointSaleModule->findPointSales(); | ||||
]); | ]); | ||||
} | } | ||||
public function actionCreate() | |||||
public function actionCreate(string $redirectUrl = null) | |||||
{ | { | ||||
$userModule = $this->getUserModule(); | $userModule = $this->getUserModule(); | ||||
$producerModule = $this->getProducerModule(); | $producerModule = $this->getProducerModule(); | ||||
$producerCurrent = $this->getProducerCurrent(); | $producerCurrent = $this->getProducerCurrent(); | ||||
$model = $userModule->instanciateUser(); | $model = $userModule->instanciateUser(); | ||||
$model->redirect_url = $redirectUrl; | |||||
$posts = Yii::$app->request->post(); | $posts = Yii::$app->request->post(); | ||||
$userExist = false; | $userExist = false; | ||||
$this->processLinkPointSale($userExist); | $this->processLinkPointSale($userExist); | ||||
$this->processLinkUserGroup($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."); | $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 { | } else { | ||||
if ($model->load(\Yii::$app->request->post()) && $model->validate() && YII_ENV != 'demo') { | if ($model->load(\Yii::$app->request->post()) && $model->validate() && YII_ENV != 'demo') { | ||||
); | ); | ||||
$userCreate->points_sale = $model->points_sale; | $userCreate->points_sale = $model->points_sale; | ||||
$userCreate->user_groups = $model->user_groups; | $userCreate->user_groups = $model->user_groups; | ||||
$userCreate->exclusive_access_selected_points_sale = $model->exclusive_access_selected_points_sale; | |||||
$this->processLinkPointSale($userCreate); | $this->processLinkPointSale($userCreate); | ||||
$this->processLinkUserGroup($userCreate); | $this->processLinkUserGroup($userCreate); | ||||
$this->setFlash('success', 'Utilisateur créé.'); | $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), [ | return $this->render('create', array_merge($this->initForm($model), [ | ||||
'model' => $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) | 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(); | $userModule = $this->getUserModule(); | ||||
$pointSaleModule = $this->getPointSaleModule(); | $pointSaleModule = $this->getPointSaleModule(); | ||||
$model = $this->findModel($id); | $model = $this->findModel($id); | ||||
$previousMail = $model->email; | $previousMail = $model->email; | ||||
$userBelongToProducer = UserProducer::findOne(['id_user' => $id, 'id_producer' => GlobalParam::getCurrentProducerId()]); | $userBelongToProducer = UserProducer::findOne(['id_user' => $id, 'id_producer' => GlobalParam::getCurrentProducerId()]); | ||||
if ($userBelongToProducer) { | if ($userBelongToProducer) { | ||||
$model->newsletter = $userBelongToProducer->newsletter; | $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()) { | if ($model->load(\Yii::$app->request->post()) && $model->save()) { | ||||
// on envoie le mail de bienvenue si le mail vient d'être défini | // on envoie le mail de bienvenue si le mail vient d'être défini | ||||
$this->processLinkUserGroup($model); | $this->processLinkUserGroup($model); | ||||
//$this->processProductPricePercent($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]); | return $this->redirect(['update', 'id' => $model->id]); | ||||
} | } | ||||
} else { | } else { | ||||
])); | ])); | ||||
} | } | ||||
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) | public function initForm($model) | ||||
{ | { | ||||
$userPointSaleModule = $this->getUserPointSaleModule(); | $userPointSaleModule = $this->getUserPointSaleModule(); | ||||
} | } | ||||
} | } | ||||
} | } | ||||
// 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(); | |||||
} | } | ||||
/** | /** | ||||
if ($userProducer) { | if ($userProducer) { | ||||
if ($userProducerModule->hasOutstandingCredit($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 { | } else { | ||||
$userProducerModule->unlinkUserProducer($userProducer); | $userProducerModule->unlinkUserProducer($userProducer); | ||||
$this->setFlash('success', 'L\'utilisateur a bien été supprimé de votre établissement.'); | $this->setFlash('success', 'L\'utilisateur a bien été supprimé de votre établissement.'); | ||||
} | } | ||||
/** | /** | ||||
* 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) | public function actionCredit(int $id) | ||||
{ | { | ||||
if ($creditForm->load(\Yii::$app->request->post()) && $creditForm->validate()) { | 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() | $paymentModule->getManager() | ||||
->creditOrDebitUser( | ->creditOrDebitUser( | ||||
$creditForm->type, | $creditForm->type, | ||||
$creditForm->amount, | $creditForm->amount, | ||||
$creditForm->mean_payment, | $creditForm->mean_payment, | ||||
$this->getUserCurrent(), | $this->getUserCurrent(), | ||||
$creditForm->comment | |||||
$creditForm->comment, | |||||
$dateTransaction | |||||
); | ); | ||||
if ($creditForm->send_mail) { | |||||
if ($creditForm->send_mail && !$this->getProducerCurrent()->isDemoAccount()) { | |||||
$paymentModule->getNotifier() | $paymentModule->getNotifier() | ||||
->notifyUserCreditMovement( | ->notifyUserCreditMovement( | ||||
$user, | $user, | ||||
} | } | ||||
} | } | ||||
$this->addFlash('success', 'Crédit mis à jour.'); | |||||
$this->addFlash('success', 'Cagnotte mise à jour.'); | |||||
return $this->refresh(); | return $this->refresh(); | ||||
} | } | ||||
} | } | ||||
} | } | ||||
/** | |||||
* 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) | public function actionSwitchIdentity(int $id) | ||||
{ | { | ||||
$userModule = $this->getUserModule(); | $userModule = $this->getUserModule(); | ||||
$duration = 0; | $duration = 0; | ||||
Yii::$app->user->switchIdentity($user, $duration); | Yii::$app->user->switchIdentity($user, $duration); | ||||
Yii::$app->session->set('user.idbeforeswitch', $initialId); | Yii::$app->session->set('user.idbeforeswitch', $initialId); | ||||
return $this->redirect(['index']); | |||||
return $this->redirect($this->getUrlManagerFrontend()->createUrl(['site/index'])); | |||||
} | } | ||||
} else { | } else { | ||||
throw new NotFoundHttpException('Page introuvable'); | throw new NotFoundHttpException('Page introuvable'); |
<?php | <?php | ||||
/** | /** | ||||
* Copyright distrib (2018) | |||||
* Copyright Souke (2018) | |||||
* | * | ||||
* contact@opendistrib.net | |||||
* contact@souke.fr | |||||
* | * | ||||
* Ce logiciel est un programme informatique servant à aider les producteurs | * Ce logiciel est un programme informatique servant à aider les producteurs | ||||
* à distribuer leur production en circuits courts. | * à distribuer leur production en circuits courts. | ||||
namespace backend\controllers; | namespace backend\controllers; | ||||
use common\helpers\GlobalParam; | 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\filters\AccessControl; | ||||
use yii\web\NotFoundHttpException; | |||||
use yii\helpers\Html; | use yii\helpers\Html; | ||||
use yii\web\NotFoundHttpException; | |||||
/** | /** | ||||
* PointVenteController implements the CRUD actions for PointVente model. | * PointVenteController implements the CRUD actions for PointVente model. |
<?php | <?php | ||||
/** | /** | ||||
* Copyright distrib (2018) | |||||
* Copyright Souke (2018) | |||||
* | * | ||||
* contact@opendistrib.net | |||||
* contact@souke.fr | |||||
* | * | ||||
* Ce logiciel est un programme informatique servant à aider les producteurs | * Ce logiciel est un programme informatique servant à aider les producteurs | ||||
* à distribuer leur production en circuits courts. | * à distribuer leur production en circuits courts. |
<?php | <?php | ||||
/** | /** | ||||
* Copyright distrib (2018) | |||||
* Copyright Souke (2018) | |||||
* | * | ||||
* contact@opendistrib.net | |||||
* contact@souke.fr | |||||
* | * | ||||
* Ce logiciel est un programme informatique servant à aider les producteurs | * Ce logiciel est un programme informatique servant à aider les producteurs | ||||
* à distribuer leur production en circuits courts. | * à distribuer leur production en circuits courts. | ||||
* termes. | * termes. | ||||
*/ | */ | ||||
namespace backend\controllers; | |||||
namespace backend\controllers\admin; | |||||
use backend\controllers\BackendController; | |||||
use backend\models\MailForm; | use backend\models\MailForm; | ||||
use common\logic\User\User\Model\User; | |||||
use domain\User\User\User; | |||||
use yii\filters\AccessControl; | use yii\filters\AccessControl; | ||||
use yii\filters\VerbFilter; | use yii\filters\VerbFilter; | ||||
use yii\web\NotFoundHttpException; | use yii\web\NotFoundHttpException; |
<?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); | |||||
} | |||||
} |
<?php | <?php | ||||
/** | /** | ||||
* Copyright distrib (2018) | |||||
* Copyright Souke (2018) | |||||
* | * | ||||
* contact@opendistrib.net | |||||
* contact@souke.fr | |||||
* | * | ||||
* Ce logiciel est un programme informatique servant à aider les producteurs | * Ce logiciel est un programme informatique servant à aider les producteurs | ||||
* à distribuer leur production en circuits courts. | * à distribuer leur production en circuits courts. | ||||
* termes. | * termes. | ||||
*/ | */ | ||||
namespace backend\controllers; | |||||
namespace backend\controllers\admin; | |||||
use backend\controllers\BackendController; | |||||
use common\helpers\Ajax; | use common\helpers\Ajax; | ||||
use yii\filters\AccessControl; | use yii\filters\AccessControl; | ||||
use yii\helpers\Html; | use yii\helpers\Html; |
<?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, | |||||
]); | |||||
} | |||||
} |
<?php | <?php | ||||
/** | /** | ||||
* Copyright distrib (2018) | |||||
* Copyright Souke (2018) | |||||
* | * | ||||
* contact@opendistrib.net | |||||
* contact@souke.fr | |||||
* | * | ||||
* Ce logiciel est un programme informatique servant à aider les producteurs | * Ce logiciel est un programme informatique servant à aider les producteurs | ||||
* à distribuer leur production en circuits courts. | * à distribuer leur production en circuits courts. | ||||
* termes. | * termes. | ||||
*/ | */ | ||||
namespace backend\assets; | |||||
namespace backend\controllers\admin; | |||||
use yii\web\AssetBundle; | |||||
use yii; | |||||
use backend\controllers\BackendController; | |||||
use domain\Order\Order\OrderSearch; | |||||
use yii\filters\AccessControl; | |||||
/** | |||||
* @author Qiang Xue <qiang.xue@gmail.com> | |||||
* @since 2.0 | |||||
*/ | |||||
class VuejsDocumentFormAsset extends \common\components\MyAssetBundle | |||||
class OrderAdminController extends BackendController | |||||
{ | { | ||||
public $basePath = '@webroot'; | |||||
public $baseUrl = '@web'; | |||||
public $css = []; | |||||
public $js = []; | |||||
public $depends = [ | |||||
'common\assets\CommonAsset', | |||||
'backend\assets\AppAsset', | |||||
'backend\assets\VuejsAlertsAsset', | |||||
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' | |||||
]); | |||||
public function __construct() | |||||
{ | |||||
parent::__construct(); | |||||
$this->addAsset('js', 'js/vuejs/document-form.js'); | |||||
} | |||||
return $this->render('index', [ | |||||
'searchModel' => $searchModel, | |||||
'dataProvider' => $dataProvider, | |||||
]); | |||||
} | |||||
} | } |
<?php | <?php | ||||
/** | /** | ||||
* Copyright distrib (2018) | |||||
* Copyright Souke (2018) | |||||
* | * | ||||
* contact@opendistrib.net | |||||
* contact@souke.fr | |||||
* | * | ||||
* Ce logiciel est un programme informatique servant à aider les producteurs | * Ce logiciel est un programme informatique servant à aider les producteurs | ||||
* à distribuer leur production en circuits courts. | * à distribuer leur production en circuits courts. | ||||
* termes. | * termes. | ||||
*/ | */ | ||||
namespace backend\controllers; | |||||
namespace backend\controllers\admin; | |||||
use backend\controllers\BackendController; | |||||
use common\helpers\Ajax; | use common\helpers\Ajax; | ||||
use common\helpers\Alwaysdata; | 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 domain\Order\Order\Order; | |||||
use domain\Order\Order\OrderRepositoryQuery; | |||||
use domain\Producer\Producer\Producer; | |||||
use domain\Product\Product\Product; | |||||
use Yii; | use Yii; | ||||
use yii\data\ActiveDataProvider; | |||||
use yii\filters\AccessControl; | |||||
use yii\filters\VerbFilter; | |||||
use yii\helpers\Html; | use yii\helpers\Html; | ||||
use yii\web\NotFoundHttpException; | use yii\web\NotFoundHttpException; | ||||
use yii\filters\VerbFilter; | |||||
use yii\filters\AccessControl; | |||||
use yii\data\ActiveDataProvider; | |||||
class ProducerAdminController extends BackendController | class ProducerAdminController extends BackendController | ||||
{ | { | ||||
*/ | */ | ||||
public function actionIndex() | public function actionIndex() | ||||
{ | { | ||||
$producerModule = $this->getProducerModule(); | |||||
$dataProviderProducer = new ActiveDataProvider([ | $dataProviderProducer = new ActiveDataProvider([ | ||||
'query' => Producer::find() | 'query' => Producer::find() | ||||
->with('userProducer', 'user') | ->with('userProducer', 'user') | ||||
], | ], | ||||
]); | ]); | ||||
$producersArray = $producerModule->findProducersActive(); | |||||
$sumPrices = 0; | |||||
foreach ($producersArray as $producer) { | |||||
$sumPrices += $producerModule->getAmountBilledLastMonth($producer); | |||||
} | |||||
return $this->render('index', [ | return $this->render('index', [ | ||||
'dataProviderProducer' => $dataProviderProducer, | |||||
'sumPrices' => $sumPrices | |||||
'dataProviderProducer' => $dataProviderProducer | |||||
]); | ]); | ||||
} | } | ||||
if ($withOrders) { | if ($withOrders) { | ||||
$countOrders = Order::searchCount([ | $countOrders = Order::searchCount([ | ||||
'id_user' => $idUser, | 'id_user' => $idUser, | ||||
'distribution.id_producer' => $fromProducerId | |||||
], ['conditions' => 'date_delete IS NULL']); | |||||
'distribution.id_producer' => $fromProducerId, | |||||
], [ | |||||
'conditions' => OrderRepositoryQuery::getSqlFilterIsValid() | |||||
]); | |||||
} | } | ||||
if (($withOrders && $countOrders) || !$withOrders) { | if (($withOrders && $countOrders) || !$withOrders) { |
<?php | <?php | ||||
/** | /** | ||||
* Copyright distrib (2018) | |||||
* Copyright Souke (2018) | |||||
* | * | ||||
* contact@opendistrib.net | |||||
* contact@souke.fr | |||||
* | * | ||||
* Ce logiciel est un programme informatique servant à aider les producteurs | * Ce logiciel est un programme informatique servant à aider les producteurs | ||||
* à distribuer leur production en circuits courts. | * à distribuer leur production en circuits courts. | ||||
* termes. | * termes. | ||||
*/ | */ | ||||
namespace backend\controllers; | |||||
namespace backend\controllers\admin; | |||||
use backend\controllers\BackendController; | |||||
use backend\forms\AdminSettingsForm; | use backend\forms\AdminSettingsForm; | ||||
use common\helpers\Ajax; | |||||
use yii\filters\AccessControl; | use yii\filters\AccessControl; | ||||
use yii\helpers\Html; | |||||
use yii\web\NotFoundHttpException; | |||||
/** | /** | ||||
* UserController implements the CRUD actions for User model. | * UserController implements the CRUD actions for User model. |
<?php | <?php | ||||
/** | /** | ||||
* Copyright distrib (2018) | |||||
* Copyright Souke (2018) | |||||
* | * | ||||
* contact@opendistrib.net | |||||
* contact@souke.fr | |||||
* | * | ||||
* Ce logiciel est un programme informatique servant à aider les producteurs | * Ce logiciel est un programme informatique servant à aider les producteurs | ||||
* à distribuer leur production en circuits courts. | * à distribuer leur production en circuits courts. | ||||
* termes. | * termes. | ||||
*/ | */ | ||||
namespace backend\controllers; | |||||
namespace backend\controllers\admin; | |||||
use yii\filters\AccessControl; | |||||
use Yii; | |||||
use DateTime; | |||||
use backend\controllers\BackendController; | |||||
use DateInterval; | use DateInterval; | ||||
use DatePeriod; | use DatePeriod; | ||||
use DateTime; | |||||
use Yii; | |||||
use yii\filters\AccessControl; | |||||
class StatsAdminController extends BackendController | class StatsAdminController extends BackendController | ||||
{ | { |
<?php | <?php | ||||
/** | /** | ||||
* Copyright distrib (2018) | |||||
* Copyright Souke (2018) | |||||
* | * | ||||
* contact@opendistrib.net | |||||
* contact@souke.fr | |||||
* | * | ||||
* Ce logiciel est un programme informatique servant à aider les producteurs | * Ce logiciel est un programme informatique servant à aider les producteurs | ||||
* à distribuer leur production en circuits courts. | * à distribuer leur production en circuits courts. | ||||
* termes. | * termes. | ||||
*/ | */ | ||||
namespace backend\controllers; | |||||
namespace backend\controllers\admin; | |||||
use common\logic\Ticket\Ticket\Model\Ticket; | |||||
use common\logic\Ticket\Ticket\Model\TicketSearch; | |||||
use yii\filters\VerbFilter; | |||||
use backend\controllers\SupportController; | |||||
use domain\Ticket\Ticket\Ticket; | |||||
use domain\Ticket\Ticket\TicketSearch; | |||||
use yii\filters\AccessControl; | use yii\filters\AccessControl; | ||||
/** | /** |
<?php | <?php | ||||
/** | /** | ||||
* Copyright distrib (2018) | |||||
* Copyright Souke (2018) | |||||
* | * | ||||
* contact@opendistrib.net | |||||
* contact@souke.fr | |||||
* | * | ||||
* Ce logiciel est un programme informatique servant à aider les producteurs | * Ce logiciel est un programme informatique servant à aider les producteurs | ||||
* à distribuer leur production en circuits courts. | * à distribuer leur production en circuits courts. | ||||
* termes. | * termes. | ||||
*/ | */ | ||||
namespace backend\controllers; | |||||
namespace backend\controllers\admin; | |||||
use common\logic\Config\TaxRate\Model\TaxRate; | |||||
use yii\web\NotFoundHttpException; | |||||
use yii\filters\VerbFilter; | |||||
use yii\filters\AccessControl; | |||||
use backend\controllers\BackendController; | |||||
use domain\Config\TaxRate\TaxRate; | |||||
use yii\data\ActiveDataProvider; | use yii\data\ActiveDataProvider; | ||||
use yii\filters\AccessControl; | |||||
use yii\filters\VerbFilter; | |||||
use yii\web\NotFoundHttpException; | |||||
/** | /** | ||||
* TaxRateAdminController implements the CRUD actions for TaxRate model. | * TaxRateAdminController implements the CRUD actions for TaxRate model. | ||||
public function actionCreate() | public function actionCreate() | ||||
{ | { | ||||
$model = $this-> getTaxRateModule()->instanciateTaxRate(); | |||||
$model = $this->getTaxRateModule()->getBuilder()->instanciateTaxRate(); | |||||
if ($model->load(\Yii::$app->request->post()) && $model->save()) { | if ($model->load(\Yii::$app->request->post()) && $model->save()) { | ||||
$this->setFlash('success', 'Taxe créée.'); | $this->setFlash('success', 'Taxe créée.'); | ||||
public function actionDelete(int $id) | public function actionDelete(int $id) | ||||
{ | { | ||||
$taxRateModule = $this-> getTaxRateModule(); | |||||
$taxRate = $this->findModel($id); | $taxRate = $this->findModel($id); | ||||
$taxRateModule->delete($taxRate); | |||||
$taxRate->delete(); | |||||
$this->setFlash('success', 'Taxe supprimé'); | $this->setFlash('success', 'Taxe supprimé'); | ||||
return $this->redirect(['tax-rate-admin/index']); | return $this->redirect(['tax-rate-admin/index']); | ||||
} | } | ||||
protected function findModel($id) | protected function findModel($id) | ||||
{ | { | ||||
$taxRateModule = $this-> getTaxRateModule(); | |||||
if (($taxRate = $taxRateModule->findOneTaxRateById($id)) !== null) { | |||||
if (($taxRate = $this->getTaxRateModule()->getRepository()->findOneTaxRateById($id)) !== null) { | |||||
return $taxRate; | return $taxRate; | ||||
} else { | } else { | ||||
throw new NotFoundHttpException('The requested page does not exist.'); | throw new NotFoundHttpException('The requested page does not exist.'); |
<?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"); | |||||
} | |||||
} | |||||
} |
namespace backend\forms; | namespace backend\forms; | ||||
use common\logic\Setting\SettingModule; | |||||
use domain\Setting\SettingModule; | |||||
use yii\base\Model; | use yii\base\Model; | ||||
class AdminSettingsForm extends Model | class AdminSettingsForm extends Model | ||||
$rulesArray = []; | $rulesArray = []; | ||||
$typesArray = [ | $typesArray = [ | ||||
'string' => ['string', 'text'], | 'string' => ['string', 'text'], | ||||
'date' => ['date'], | |||||
'date' => ['safe'], | |||||
'boolean' => ['boolean'], | 'boolean' => ['boolean'], | ||||
'integer' => ['integer'], | 'integer' => ['integer'], | ||||
'double' => ['double', 'float'], | 'double' => ['double', 'float'], |
<?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" | |||||
]; | |||||
} | |||||
} | |||||
?> |
<?php | <?php | ||||
/** | /** | ||||
Copyright distrib (2018) | |||||
Copyright Souke (2018) | |||||
contact@opendistrib.net | |||||
contact@souke.fr | |||||
Ce logiciel est un programme informatique servant à aider les producteurs | Ce logiciel est un programme informatique servant à aider les producteurs | ||||
à distribuer leur production en circuits courts. | à distribuer leur production en circuits courts. | ||||
namespace backend\models; | namespace backend\models; | ||||
use common\helpers\GlobalParam; | use common\helpers\GlobalParam; | ||||
use common\logic\User\User\Model\User; | |||||
use domain\User\User\User; | |||||
use yii\base\Model; | use yii\base\Model; | ||||
/** | /** |
<?php | <?php | ||||
/** | /** | ||||
Copyright distrib (2018) | |||||
Copyright Souke (2018) | |||||
contact@opendistrib.net | |||||
contact@souke.fr | |||||
Ce logiciel est un programme informatique servant à aider les producteurs | Ce logiciel est un programme informatique servant à aider les producteurs | ||||
à distribuer leur production en circuits courts. | à distribuer leur production en circuits courts. | ||||
namespace backend\models; | 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; | use yii\base\Model; | ||||
/** | /** | ||||
*/ | */ | ||||
class CreditForm extends Model | class CreditForm extends Model | ||||
{ | { | ||||
public $id_user ; | public $id_user ; | ||||
public $id_user_action ; | public $id_user_action ; | ||||
public $id_producer ; | public $id_producer ; | ||||
public $mean_payment ; | public $mean_payment ; | ||||
public $comment ; | public $comment ; | ||||
public $send_mail = 1; | public $send_mail = 1; | ||||
public $date_transaction; | |||||
/** | /** | ||||
* @inheritdoc | * @inheritdoc | ||||
return [ | return [ | ||||
[['amount'], 'required'], | [['amount'], 'required'], | ||||
[['id_user', 'id_user_action', 'id_producer'], 'integer'], | [['id_user', 'id_user_action', 'id_producer'], 'integer'], | ||||
[['date','send_mail'], 'safe'], | |||||
[['date', 'send_mail', 'date_transaction'], 'safe'], | |||||
[['amount'], 'double'], | [['amount'], 'double'], | ||||
[['type', 'mean_payment'], 'string', 'max' => 255], | [['type', 'mean_payment'], 'string', 'max' => 255], | ||||
[['comment'], 'string', 'max' => 2048], | [['comment'], 'string', 'max' => 2048], | ||||
'mean_payment' => 'Moyen de paiement', | 'mean_payment' => 'Moyen de paiement', | ||||
'comment' => 'Commentaire', | 'comment' => 'Commentaire', | ||||
'send_mail' => 'Prévenir l\'utilisateur', | '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 | |||||
); | |||||
} | |||||
} | |||||
} | |||||
} | } |
<?php | <?php | ||||
/** | /** | ||||
Copyright distrib (2018) | |||||
Copyright Souke (2018) | |||||
contact@opendistrib.net | |||||
contact@souke.fr | |||||
Ce logiciel est un programme informatique servant à aider les producteurs | Ce logiciel est un programme informatique servant à aider les producteurs | ||||
à distribuer leur production en circuits courts. | à distribuer leur production en circuits courts. | ||||
namespace backend\models; | namespace backend\models; | ||||
use common\helpers\GlobalParam; | 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; | ||||
use yii\base\Model; | use yii\base\Model; | ||||
use common\helpers\Price ; | |||||
use yii\helpers\Html; | |||||
/** | /** | ||||
* ContactForm is the model behind the contact form. | * ContactForm is the model behind the contact form. | ||||
public $id_distribution ; | public $id_distribution ; | ||||
public $subject; | public $subject; | ||||
public $message; | public $message; | ||||
public $integrate_product_list = false; | |||||
public $integrate_product_list; | |||||
/** | /** | ||||
* @inheritdoc | * @inheritdoc | ||||
'integrate_product_list' => 'Intégrer la liste des produits au message' | '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 ; | |||||
} | |||||
} | } |
<?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> |
<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> |
<?php | <?php | ||||
/** | /** | ||||
Copyright distrib (2018) | |||||
Copyright Souke (2018) | |||||
contact@opendistrib.net | |||||
contact@souke.fr | |||||
Ce logiciel est un programme informatique servant à aider les producteurs | Ce logiciel est un programme informatique servant à aider les producteurs | ||||
à distribuer leur production en circuits courts. | à distribuer leur production en circuits courts. | ||||
</tr> | </tr> | ||||
<?php foreach($usersAccessArray as $user): ?> | <?php foreach($usersAccessArray as $user): ?> | ||||
<tr> | <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> | <td><?= Html::a('<span class="glyphicon glyphicon-trash"></span>',['access/delete','idUser' => $user->id], ['class' => 'btn btn-default']); ?></td> | ||||
</tr> | </tr> | ||||
<?php endforeach; ?> | <?php endforeach; ?> |
<?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> |
<?php | <?php | ||||
/** | /** | ||||
Copyright distrib (2018) | |||||
Copyright Souke (2018) | |||||
contact@opendistrib.net | |||||
contact@souke.fr | |||||
Ce logiciel est un programme informatique servant à aider les producteurs | Ce logiciel est un programme informatique servant à aider les producteurs | ||||
à distribuer leur production en circuits courts. | à distribuer leur production en circuits courts. | ||||
termes. | 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') ; | |||||
} | |||||
} | |||||
$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> |
<?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> |
<?php | <?php | ||||
/** | /** | ||||
Copyright distrib (2018) | |||||
Copyright Souke (2018) | |||||
contact@opendistrib.net | |||||
contact@souke.fr | |||||
Ce logiciel est un programme informatique servant à aider les producteurs | Ce logiciel est un programme informatique servant à aider les producteurs | ||||
à distribuer leur production en circuits courts. | à distribuer leur production en circuits courts. | ||||
termes. | 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') ; | |||||
} | |||||
} | |||||
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> |
<?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> |
<?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> |
<?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> |
<?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> |
<?php | <?php | ||||
/** | /** | ||||
Copyright distrib (2018) | |||||
Copyright Souke (2018) | |||||
contact@opendistrib.net | |||||
contact@souke.fr | |||||
Ce logiciel est un programme informatique servant à aider les producteurs | Ce logiciel est un programme informatique servant à aider les producteurs | ||||
à distribuer leur production en circuits courts. | à distribuer leur production en circuits courts. | ||||
use yii\widgets\ActiveForm; | use yii\widgets\ActiveForm; | ||||
$this->setTitle('Envoyer un email') ; | $this->setTitle('Envoyer un email') ; | ||||
$this->addBreadcrumb(['label' => 'Communiquer', 'url' => ['user/index']]) ; | |||||
$this->addBreadcrumb(['label' => 'Communication', 'url' => ['user/index']]) ; | |||||
$this->addBreadcrumb($this->getTitle()) ; | $this->addBreadcrumb($this->getTitle()) ; | ||||
?> | ?> |
<?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> | |||||
<?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> | |||||
<?php | <?php | ||||
/** | /** | ||||
Copyright distrib (2018) | |||||
Copyright Souke (2018) | |||||
contact@opendistrib.net | |||||
contact@souke.fr | |||||
Ce logiciel est un programme informatique servant à aider les producteurs | Ce logiciel est un programme informatique servant à aider les producteurs | ||||
à distribuer leur production en circuits courts. | à distribuer leur production en circuits courts. | ||||
</div> | </div> | ||||
<div class="clr"></div> | <div class="clr"></div> | ||||
<h3>Pour réserver vos produits en ligne :</h3> | <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> | </div> |
<?php | <?php | ||||
/** | /** | ||||
Copyright distrib (2018) | |||||
Copyright Souke (2018) | |||||
contact@opendistrib.net | |||||
contact@souke.fr | |||||
Ce logiciel est un programme informatique servant à aider les producteurs | Ce logiciel est un programme informatique servant à aider les producteurs | ||||
à distribuer leur production en circuits courts. | à distribuer leur production en circuits courts. |
<?php | <?php | ||||
/** | /** | ||||
Copyright distrib (2018) | |||||
Copyright Souke (2018) | |||||
contact@opendistrib.net | |||||
contact@souke.fr | |||||
Ce logiciel est un programme informatique servant à aider les producteurs | Ce logiciel est un programme informatique servant à aider les producteurs | ||||
à distribuer leur production en circuits courts. | à distribuer leur production en circuits courts. | ||||
termes. | termes. | ||||
*/ | */ | ||||
$this->setTitle('Passer une commande') ; | |||||
use yii\helpers\Html ; | |||||
$this->setTitle('Communication par papier') ; | |||||
$this->addBreadcrumb('Communication') ; | |||||
?> | ?> | ||||
<div class="order-create"> | |||||
<?= $this->render('_form', [ | |||||
'model' => $model, | |||||
'pointsSaleArray' => $pointsSaleArray, | |||||
'distributionDaysArray' => $distributionDaysArray, | |||||
'productsArray' => $productsArray, | |||||
'selectedProducts' => $selectedProducts, | |||||
'availableProducts' => $availableProducts, | |||||
'distribution' => $distribution, | |||||
'ordersArray' => $ordersArray, | |||||
'producersArray' => $producersArray, | |||||
'idProducer' => $idProducer, | |||||
'producer' => $producer, | |||||
'credit' => $credit | |||||
]) ?> | |||||
<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> | </div> | ||||
$userModule = $this->getUserModule(); | $userModule = $this->getUserModule(); | ||||
$this->setTitle('Crédit'); | |||||
$this->setTitle('Cagnotte'); | |||||
?> | ?> | ||||
<span class="info-box-icon <?= $sumUserProducerCredits >= 0 ? 'bg-green' : 'bg-red' ?>"><i | <span class="info-box-icon <?= $sumUserProducerCredits >= 0 ? 'bg-green' : 'bg-red' ?>"><i | ||||
class="fa fa-euro"></i></span> | class="fa fa-euro"></i></span> | ||||
<div class="info-box-content"> | <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> | <span class="info-box-number"><?= Price::format($sumUserProducerCredits); ?></span> | ||||
</div> | </div> | ||||
</div> | </div> | ||||
<span class="info-box-icon bg-orange"><i class="fa fa-download"></i></span> | <span class="info-box-icon bg-orange"><i class="fa fa-download"></i></span> | ||||
<div class="info-box-content"> | <div class="info-box-content"> | ||||
<span class="info-box-text">Exports<br /> | <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> | </span> | ||||
</div> | </div> | ||||
</div> | </div> | ||||
</div> | </div> | ||||
</div> | </div> | ||||
<h3>Clients avec un crédit négatif</h3> | |||||
<h3>Clients avec une cagnotte en négatif</h3> | |||||
<?= | <?= | ||||
} | } | ||||
], | ], | ||||
[ | [ | ||||
'label' => 'Crédit', | |||||
'label' => 'Cagnotte', | |||||
'format' => 'raw', | 'format' => 'raw', | ||||
'value' => function ($user) { | 'value' => function ($user) { | ||||
return Price::format($user['credit']); | return Price::format($user['credit']); |
<?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> |
<?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> |
<?php | <?php | ||||
/** | /** | ||||
Copyright distrib (2018) | |||||
Copyright Souke (2018) | |||||
contact@opendistrib.net | |||||
contact@souke.fr | |||||
Ce logiciel est un programme informatique servant à aider les producteurs | Ce logiciel est un programme informatique servant à aider les producteurs | ||||
à distribuer leur production en circuits courts. | à distribuer leur production en circuits courts. | ||||
termes. | 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(); | $distributionModule = DistributionModule::getInstance(); | ||||
$userModule = UserModule::getInstance(); | $userModule = UserModule::getInstance(); | ||||
$producerModule = ProducerModule::getInstance(); | $producerModule = ProducerModule::getInstance(); | ||||
$settingModule = SettingModule::getInstance(); | $settingModule = SettingModule::getInstance(); | ||||
$adminSettingBag = $settingModule->getAdminSettingBag(); | $adminSettingBag = $settingModule->getAdminSettingBag(); | ||||
$featureChecker = FeatureModule::getInstance()->getChecker(); | |||||
$this->setTitle('Tableau de bord'); | $this->setTitle('Tableau de bord'); | ||||
?> | ?> | ||||
<div class="dashboard-index"> | <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')): ?> | <?php if(Yii::$app->request->get('error_products_points_sale')): ?> | ||||
<div class="alert alert-warning"> | <div class="alert alert-warning"> | ||||
Vous devez ajouter <?php if(!$productsCount): ?> des produits<?php endif; ?> | Vous devez ajouter <?php if(!$productsCount): ?> des produits<?php endif; ?> | ||||
<div class="info-box-content"> | <div class="info-box-content"> | ||||
<span class="info-box-text"> | <span class="info-box-text"> | ||||
<?php if(count($distribution->order)): ?> | <?php if(count($distribution->order)): ?> | ||||
<strong><?= count($distribution->order); ?></strong> COMMANDES | |||||
<strong><?= $distribution->countOrders(); ?></strong> COMMANDES | |||||
<?php else: ?> | <?php else: ?> | ||||
AUCUNE COMMANDE | AUCUNE COMMANDE | ||||
<?php endif; ?> | <?php endif; ?> | ||||
<?php endif; ?> | <?php endif; ?> | ||||
</div> | </div> | ||||
<?php if($adminSettingBag->get('forumFlarumUrl')): ?> | |||||
<?php if($featureChecker->isEnabled(Feature::ALIAS_FORUM)): ?> | |||||
<div class="col-md-4"> | <div class="col-md-4"> | ||||
<div class="panel panel-default"> | <div class="panel panel-default"> | ||||
<div class="panel-heading"> | <div class="panel-heading"> | ||||
</h3> | </h3> | ||||
</div> | </div> | ||||
<div class="panel-body"> | <div class="panel-body"> | ||||
<?php //echo print_r($forumDiscussionsArray); ?> | |||||
<?php if($forumDiscussionsArray && count($forumDiscussionsArray['data'])): ?> | <?php if($forumDiscussionsArray && count($forumDiscussionsArray['data'])): ?> | ||||
<table class="table"> | <table class="table"> | ||||
<?php $forumDiscussionsLimitedArray = array_slice($forumDiscussionsArray['data'], 0, min(3, count($forumDiscussionsArray['data']))); ?> | <?php $forumDiscussionsLimitedArray = array_slice($forumDiscussionsArray['data'], 0, min(3, count($forumDiscussionsArray['data']))); ?> | ||||
<?php foreach($forumDiscussionsLimitedArray as $forumDiscussion): ?> | <?php foreach($forumDiscussionsLimitedArray as $forumDiscussion): ?> | ||||
<tr> | <tr> | ||||
<?php //echo print_r($forumDiscussion); ?> | |||||
<td><?= $forumDiscussion['attributes']['title']; ?></td> | <td><?= $forumDiscussion['attributes']['title']; ?></td> | ||||
<td><?= date('d/m à H:i', strtotime($forumDiscussion['attributes']['lastPostedAt'])); ?></td> | <td><?= date('d/m à H:i', strtotime($forumDiscussion['attributes']['lastPostedAt'])); ?></td> | ||||
</tr> | </tr> | ||||
<p>Aucun sujet sur le forum.</p> | <p>Aucun sujet sur le forum.</p> | ||||
<?php endif; ?> | <?php endif; ?> | ||||
<p> | <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> | <span class="fa fa-comments"></span> | ||||
Consulter le forum | Consulter le forum | ||||
</a> | </a> | ||||
<table class="table table-condensed table-bordered"> | <table class="table table-condensed table-bordered"> | ||||
<thead> | <thead> | ||||
<tr> | <tr> | ||||
<th></th> | |||||
<th>Statut</th> | |||||
<th>Origine</th> | |||||
<th>Date</th> | <th>Date</th> | ||||
<th>Client</th> | <th>Client</th> | ||||
<th>Produits</th> | <th>Produits</th> | ||||
<th>Point de vente</th> | <th>Point de vente</th> | ||||
<th>Montant</th> | <th>Montant</th> | ||||
<th>Historique</th> | |||||
</tr> | </tr> | ||||
</thead> | </thead> | ||||
<tbody> | <tbody> | ||||
<?php $orderModule->initOrder($order); ?> | <?php $orderModule->initOrder($order); ?> | ||||
<tr class="<?= $orderModule->getHistoryClass($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"> | <td class="date"> | ||||
<div class="block-date"> | <div class="block-date"> | ||||
<div class="day"><?= strftime('%A', strtotime($order->distribution->date)) ?></div> | <div class="day"><?= strftime('%A', strtotime($order->distribution->date)) ?></div> | ||||
</div> | </div> | ||||
</td> | </td> | ||||
<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 /> | <?= $orderModule->getOrderUsername($order); ?><br /> | ||||
<?php if($order->user): ?></a><?php else: ?></span><?php endif; ?> | |||||
<?php if(strlen($order->comment)): ?> | <?php if(strlen($order->comment)): ?> | ||||
<div class="comment"><span class="glyphicon glyphicon-comment"></span> <?= nl2br(Html::encode($order->comment)) ; ?></div> | <div class="comment"><span class="glyphicon glyphicon-comment"></span> <?= nl2br(Html::encode($order->comment)) ; ?></div> | ||||
<?php endif; ?> | <?php endif; ?> | ||||
<td><?= $orderModule->getCartSummary($order); ?></td> | <td><?= $orderModule->getCartSummary($order); ?></td> | ||||
<td><?= $orderModule->getPointSaleSummary($order) ; ?></td> | <td><?= $orderModule->getPointSaleSummary($order) ; ?></td> | ||||
<td><?= $orderModule->getOrderAmountWithTax($order, Order::AMOUNT_TOTAL, true) ; ?></td> | <td><?= $orderModule->getOrderAmountWithTax($order, Order::AMOUNT_TOTAL, true) ; ?></td> | ||||
<td class="history"><?= $orderModule->getHistorySummary($order) ; ?></td> | |||||
</tr> | </tr> | ||||
<?php endforeach; ?> | <?php endforeach; ?> | ||||
</tbody> | </tbody> |
<?php | <?php | ||||
/** | /** | ||||
* Copyright distrib (2018) | |||||
* Copyright Souke (2018) | |||||
* | * | ||||
* contact@opendistrib.net | |||||
* contact@souke.fr | |||||
* | * | ||||
* Ce logiciel est un programme informatique servant à aider les producteurs | * Ce logiciel est un programme informatique servant à aider les producteurs | ||||
* à distribuer leur production en circuits courts. | * à distribuer leur production en circuits courts. | ||||
* termes. | * 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 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 yii\helpers\ArrayHelper; | ||||
use common\logic\Document\DeliveryNote\Module\DeliveryNoteModule; | |||||
use yii\helpers\Html; | |||||
$deliveryNoteModule = $this->getDeliveryNoteModule(); | $deliveryNoteModule = $this->getDeliveryNoteModule(); | ||||
return $deliveryNoteModule->getAmountWithTax($deliveryNote, Order::INVOICE_AMOUNT_TOTAL, true); | 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', | 'class' => 'yii\grid\ActionColumn', | ||||
'template' => '{validate} {update} {delete} {send} {download}', | 'template' => '{validate} {update} {delete} {send} {download}', |
<?php | <?php | ||||
/** | /** | ||||
Copyright distrib (2018) | |||||
Copyright Souke (2018) | |||||
contact@opendistrib.net | |||||
contact@souke.fr | |||||
Ce logiciel est un programme informatique servant à aider les producteurs | Ce logiciel est un programme informatique servant à aider les producteurs | ||||
à distribuer leur production en circuits courts. | à distribuer leur production en circuits courts. |
<?php | <?php | ||||
/** | /** | ||||
Copyright distrib (2018) | |||||
Copyright Souke (2018) | |||||
contact@opendistrib.net | |||||
contact@souke.fr | |||||
Ce logiciel est un programme informatique servant à aider les producteurs | Ce logiciel est un programme informatique servant à aider les producteurs | ||||
à distribuer leur production en circuits courts. | à distribuer leur production en circuits courts. |
<?php | <?php | ||||
/** | /** | ||||
* Copyright distrib (2018) | |||||
* Copyright Souke (2018) | |||||
* | * | ||||
* contact@opendistrib.net | |||||
* contact@souke.fr | |||||
* | * | ||||
* Ce logiciel est un programme informatique servant à aider les producteurs | * Ce logiciel est un programme informatique servant à aider les producteurs | ||||
* à distribuer leur production en circuits courts. | * à distribuer leur production en circuits courts. |
<?php | <?php | ||||
/** | /** | ||||
* Copyright distrib (2018) | |||||
* Copyright Souke (2018) | |||||
* | * | ||||
* contact@opendistrib.net | |||||
* contact@souke.fr | |||||
* | * | ||||
* Ce logiciel est un programme informatique servant à aider les producteurs | * Ce logiciel est un programme informatique servant à aider les producteurs | ||||
* à distribuer leur production en circuits courts. | * à distribuer leur production en circuits courts. | ||||
$this->setTitle('Développement'); | $this->setTitle('Développement'); | ||||
$this->addBreadcrumb($this->getTitle()); | $this->addBreadcrumb($this->getTitle()); | ||||
$producer = GlobalParam::getCurrentProducer(); | |||||
?> | ?> | ||||
<div class="development-index"> | <div class="development-index"> | ||||
</div> | </div> | ||||
</div> | </div> | ||||
<div class="col-md-4"> | <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 id="panel-participate" class="panel panel-default"> | ||||
<div class="panel-heading"> | <div class="panel-heading"> | ||||
<h3 class="panel-title">Participer</h3> | <h3 class="panel-title">Participer</h3> | ||||
</div> | </div> | ||||
<div class="panel-body"> | <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> | de bugs sont les bienvenues et forment le terreau des versions futures.</p> | ||||
<p> | <p> | ||||
<a class="btn btn-default" href="<?= $this->getUrlManagerBackend()->createUrl(['support/index']); ?>"> | <a class="btn btn-default" href="<?= $this->getUrlManagerBackend()->createUrl(['support/index']); ?>"> |
<?php | <?php | ||||
/** | /** | ||||
Copyright distrib (2018) | |||||
Copyright Souke (2018) | |||||
contact@opendistrib.net | |||||
contact@souke.fr | |||||
Ce logiciel est un programme informatique servant à aider les producteurs | Ce logiciel est un programme informatique servant à aider les producteurs | ||||
à distribuer leur production en circuits courts. | à distribuer leur production en circuits courts. |
<?php | <?php | ||||
/** | /** | ||||
Copyright distrib (2018) | |||||
Copyright Souke (2018) | |||||
contact@opendistrib.net | |||||
contact@souke.fr | |||||
Ce logiciel est un programme informatique servant à aider les producteurs | Ce logiciel est un programme informatique servant à aider les producteurs | ||||
à distribuer leur production en circuits courts. | à distribuer leur production en circuits courts. | ||||
termes. | termes. | ||||
*/ | */ | ||||
\backend\assets\VuejsDistributionIndexAsset::register($this); | |||||
$this->setTitle('Distributions') ; | $this->setTitle('Distributions') ; | ||||
$this->setPageTitle('Distributions') ; | $this->setPageTitle('Distributions') ; | ||||
<span class="info-box-text"> | <span class="info-box-text"> | ||||
<h4> | <h4> | ||||
Distribution du <strong>{{ dateFormat }}</strong> | 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> | </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="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="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="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> | <a @click="activeDistribution" data-active="1" class="btn btn-default" v-else>Activer ce jour</a> | ||||
</span> | </span> | ||||
<td>Actif</td> | <td>Actif</td> | ||||
<td>Nom</td> | <td>Nom</td> | ||||
<td class="quantity-ordered">Commandé</td> | <td class="quantity-ordered">Commandé</td> | ||||
<td class="quantity-remaining">Reste</td> | |||||
<td class="quantity-max">Maximum</td> | <td class="quantity-max">Maximum</td> | ||||
</tr> | </tr> | ||||
</thead> | </thead> | ||||
</td> | </td> | ||||
<td>{{ product.name }}</td> | <td>{{ product.name }}</td> | ||||
<td class="quantity-ordered"> | <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)') : '∅' }} | {{ product.quantity_ordered ? product.quantity_ordered + ' '+ ((product.unit == 'piece') ? ' p.' : ' '+(product.unit == 'g' || product.unit == 'kg') ? 'kg' : 'litre(s)') : '∅' }} | ||||
</td> | </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"> | <td class="quantity-max"> | ||||
<div class="input-group"> | <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" /> | <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> | </div> | ||||
</td> | </td> | ||||
</tr> | </tr> | ||||
<div id="summary-ca-weight" class="info-box col-md-4"> | <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> | <span class="info-box-icon bg-yellow"><i class="fa fa-euro"></i></span> | ||||
<div class="info-box-content"> | <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-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> | <span class="info-box-number">{{ distribution.weight }} kg <span class="normal" v-if="distribution.potential_weight > 0">/ {{ distribution.potential_weight }} kg</span></span> | ||||
</div> | </div> | ||||
v-if="showModalFormOrderCreate" | v-if="showModalFormOrderCreate" | ||||
create="1" | create="1" | ||||
:date="date" | :date="date" | ||||
:distribution="distribution" | |||||
:order="orderCreate" | :order="orderCreate" | ||||
:points-sale="pointsSale" | :points-sale="pointsSale" | ||||
:id-active-point-sale="idActivePointSale" | :id-active-point-sale="idActivePointSale" | ||||
:units="units" | :units="units" | ||||
@close="closeModalOrderForm(true)" | @close="closeModalOrderForm(true)" | ||||
@ordercreatedupdated="orderCreatedUpdated" | @ordercreatedupdated="orderCreatedUpdated" | ||||
@updateproductorderprices="updateProductOrderPrices" | |||||
@updateproductorders="updateProductOrders" | |||||
></order-form> | ></order-form> | ||||
<div id="wrapper-nav-points-sale"> | <div id="wrapper-nav-points-sale"> | ||||
</div> | </div> | ||||
<button id="btn-add-subscriptions" @click="addSubscriptions" class="btn btn-default btn-xs"><span class="glyphicon glyphicon-plus"></span> Importer les abonnements</button> | <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"> | <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"> | <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> | <button id="btn-tiller" class="btn btn-xs btn-default" disabled><span class="glyphicon glyphicon-refresh"></span> Synchroniser avec Tiller</button> | ||||
</span> | </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> | </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> | ||||
<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 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> | <button id="btn-add-order" @click="openModalFormOrderCreate" class="btn btn-xs btn-primary"><span class="glyphicon glyphicon-plus"></span> Ajouter une commande</button> | ||||
Attention, ce jour de distribution n'est pas activé et vous avez quand même des commandes enregistrées. | Attention, ce jour de distribution n'est pas activé et vous avez quand même des commandes enregistrées. | ||||
</div> | </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> | <span class="title">Totaux</span> | ||||
CA TTC : <strong>{{ totalActivePointSale() }} €</strong> / Poids : <strong>{{ weightActivePointSale() }} kg</strong> | CA TTC : <strong>{{ totalActivePointSale() }} €</strong> / Poids : <strong>{{ weightActivePointSale() }} kg</strong> | ||||
</div> | </div> | ||||
<div v-if="producer.credit && pointSaleActive"> | <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-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 == 'user'">Basé sur l'utilisateur</template> | ||||
<template v-else-if="pointSaleActive.credit_functioning == 'optional'">Optionnel</template> | <template v-else-if="pointSaleActive.credit_functioning == 'optional'">Optionnel</template> | ||||
</template> | </template> | ||||
<template v-else>Désactivé</template> | <template v-else>Désactivé</template> | ||||
</div> | </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> | </div> | ||||
<table class="table table-condensed table-bordered table-hover" v-if="countOrdersByPointSale[idActivePointSale] > 0 || (idActivePointSale == 0 && orders.length > 0)"> | <table class="table table-condensed table-bordered table-hover" v-if="countOrdersByPointSale[idActivePointSale] > 0 || (idActivePointSale == 0 && orders.length > 0)"> | ||||
<th class="column-checkbox" v-if="idActivePointSale > 0"> | <th class="column-checkbox" v-if="idActivePointSale > 0"> | ||||
<input type="checkbox" v-model="checkboxSelectAllOrders" @change="selectAllOrdersEvent" /> | <input type="checkbox" v-model="checkboxSelectAllOrders" @change="selectAllOrdersEvent" /> | ||||
</th> | </th> | ||||
<th class="column-state">Statut</th> | |||||
<th class="column-origin">Origine</th> | <th class="column-origin">Origine</th> | ||||
<th class="column-state">État</th> | |||||
<th class="column-user">Utilisateur</th> | <th class="column-user">Utilisateur</th> | ||||
<th class="column-point-sale" v-if="idActivePointSale == 0">Point de vente</th> | <th class="column-point-sale" v-if="idActivePointSale == 0">Point de vente</th> | ||||
<th class="column-amount">Montant</th> | <th class="column-amount">Montant</th> | ||||
<th class="column-state-payment">Paiement</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-actions">Actions</th> | ||||
<th class="column-tiller" v-if="producer && producer.tiller">Tiller</th> | <th class="column-tiller" v-if="producer && producer.tiller">Tiller</th> | ||||
</tr> | </tr> | ||||
<td class="column-checkbox" v-if="idActivePointSale > 0"> | <td class="column-checkbox" v-if="idActivePointSale > 0"> | ||||
<input type="checkbox" v-model="order.selected" /> | <input type="checkbox" v-model="order.selected" /> | ||||
</td> | </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"> | <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> | ||||
<td class="column-origin" v-html="order.labelOrigin"></td> | |||||
<td class="column-user"> | <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.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> | <span v-if="order.delivery_home && order.delivery_address && order.delivery_address.length > 0" class="glyphicon glyphicon-home"></span> | ||||
</td> | </td> | ||||
</div> | </div> | ||||
</td> | </td> | ||||
<td class="column-state-payment"> | <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"> | <a href="javascript:void(0);" @click="orderPaymentModalClick" :data-id-order="order.id"> | ||||
<order-state-payment :order="order" :producer="producer"></order-state-payment> | <order-state-payment :order="order" :producer="producer"></order-state-payment> | ||||
</a> | </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> | </template> | ||||
</td> | </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"> | <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,")+' €' }} | {{ order.user.credit.toFixed(2).replace(/(\d)(?=(\d{3})+(?:\.\d+)?$)/g, "$1,")+' €' }} | ||||
</a> | </a> | ||||
</template> | </template> | ||||
<template v-if="!order.isPaidViaInvoice"> | <template v-if="!order.isPaidViaInvoice"> | ||||
<li v-if="order.isCreditContext"> | <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"> | <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> | </a> | ||||
</li> | </li> | ||||
<template v-if="(!order.isCreditFunctioningMandatory && !order.isCreditFunctioningUser) || !order.id_user"> | <template v-if="(!order.isCreditFunctioningMandatory && !order.isCreditFunctioningUser) || !order.id_user"> | ||||
</button> | </button> | ||||
<ul class="dropdown-menu"> | <ul class="dropdown-menu"> | ||||
<li v-if="!order.id_delivery_note"> | <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 | <span class="glyphicon glyphicon-plus"></span> Générer un bon de livraison | ||||
</a> | </a> | ||||
</li> | </li> | ||||
<li v-if="order.id_quotation"> | <li v-if="order.id_quotation"> | ||||
<a :href="UrlManager.getBaseUrl()+'quotation/update?id='+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> | </a> | ||||
</li> | </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"> | <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> | </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> | ||||
<li v-if="order.id_invoice"> | <li v-if="order.id_invoice"> | ||||
<a :href="UrlManager.getBaseUrl()+'invoice/update?id='+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> | </a> | ||||
</li> | </li> | ||||
</ul> | </ul> | ||||
<span class="caret"></span> | <span class="caret"></span> | ||||
</button> | </button> | ||||
<ul class="dropdown-menu"> | <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-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> | <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> | </ul> | ||||
<order-form | <order-form | ||||
v-if="showModalFormOrderUpdate && idOrderUpdate == order.id" | v-if="showModalFormOrderUpdate && idOrderUpdate == order.id" | ||||
create="0" | create="0" | ||||
:distribution="distribution" | |||||
:date="date" | :date="date" | ||||
:date-format="dateFormat" | :date-format="dateFormat" | ||||
:points-sale="pointsSale" | :points-sale="pointsSale" | ||||
:units="units" | :units="units" | ||||
@close="closeModalOrderForm(false)" | @close="closeModalOrderForm(false)" | ||||
@ordercreatedupdated="orderCreatedUpdated" | @ordercreatedupdated="orderCreatedUpdated" | ||||
@updateproductorderprices="updateProductOrderPrices" | |||||
@updateproductorders="updateProductOrders" | |||||
@updateinvoiceprices="updateInvoicePrices" | @updateinvoiceprices="updateInvoicePrices" | ||||
></order-form> | ></order-form> | ||||
<modal v-if="showModalPayment && idOrderPayment == order.id" class="modal-payment" @close="showModalPayment = false"> | <modal v-if="showModalPayment && idOrderPayment == order.id" class="modal-payment" @close="showModalPayment = false"> | ||||
<h3 slot="header"> | <h3 slot="header"> | ||||
Commande du <strong>{{ dateFormat }}</strong> > | 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> | <span v-else>{{ order.username }}</span></strong> | ||||
</h3> | </h3> | ||||
<div slot="body"> | <div slot="body"> | ||||
<div class="info-box"> | <div class="info-box"> | ||||
<span :class="'info-box-icon ' +((order.user.credit > 0) ? 'bg-green' : 'bg-red')"><i class="fa fa-user"></i></span> | <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"> | <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"> | <span class="info-box-number"> | ||||
{{ order.user.credit.toFixed(2).replace(/(\d)(?=(\d{3})+(?:\.\d+)?$)/g, "$1,")+' €' }} | {{ order.user.credit.toFixed(2).replace(/(\d)(?=(\d{3})+(?:\.\d+)?$)/g, "$1,")+' €' }} | ||||
</span> | </span> | ||||
<strong><span class="glyphicon glyphicon-menu-right"></span> Produits</strong> | <strong><span class="glyphicon glyphicon-menu-right"></span> Produits</strong> | ||||
<ul> | <ul> | ||||
<li v-for="product in products" v-if="getProductDistribution(product) && order.productOrder[product.id].quantity > 0"> | <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> | </li> | ||||
</ul> | </ul> | ||||
<div v-if="order.comment && order.comment.length > 0" class="comment"> | <div v-if="order.comment && order.comment.length > 0" class="comment"> | ||||
<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> | <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"> | <label class="control-label" for="select-id-user"> | ||||
Utilisateur | 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> | <span class="glyphicon glyphicon-plus"></span> | ||||
Créer un utilisateur | Créer un utilisateur | ||||
</a> | </a> | ||||
<select class="form-control select2-order-form" v-model="order.id_user" @change="userChange"> | <select class="form-control select2-order-form" v-model="order.id_user" @change="userChange"> | ||||
<option value="0">--</option> | <option value="0">--</option> | ||||
<option v-for="user in users" :value="user.id_user"> | <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> | </option> | ||||
</select> | </select> | ||||
<input v-model="order.username" type="text" class="form-control" placeholder="Ou saisissez ici le nom de l'utilisateur" /> | <input v-model="order.username" type="text" class="form-control" placeholder="Ou saisissez ici le nom de l'utilisateur" /> | ||||
</div> | </div> | ||||
<div class="form-group" v-if="isPointSaleCreditFunctioningOptional(order.id_point_sale)"> | <div class="form-group" v-if="isPointSaleCreditFunctioningOptional(order.id_point_sale)"> | ||||
<input type="checkbox" id="debit-credit" v-model="order.debitCredit" /> | <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> | </div> | ||||
<div class="col-md-8"> | <div class="col-md-8"> | ||||
<tbody> | <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' : ''"> | <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> | <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> | <span class="label label-danger" v-else>Inactif</span> | ||||
</td> | </td> | ||||
<td> | <td> | ||||
</span> | </span> | ||||
</div> | </div> | ||||
</td> | </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> | ||||
<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> | </tr> | ||||
</tbody> | </tbody> | ||||
</table> | </table> | ||||
<button class="modal-default-button btn btn-primary" @click="submitFormCreate" v-if="!order.id">Créer</button> | <button class="modal-default-button btn btn-primary" @click="submitFormCreate" v-if="!order.id">Créer</button> | ||||
<div class="right"> | <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)"> | <button v-if="order.id" class="modal-default-button btn btn-info btn-update-prices" @click="updateInvoicePrices(true)"> | ||||
Réinitialiser les prix facturés | Réinitialiser les prix facturés | ||||
</button> | </button> |
<?php | <?php | ||||
/** | /** | ||||
Copyright distrib (2018) | |||||
Copyright Souke (2018) | |||||
contact@opendistrib.net | |||||
contact@souke.fr | |||||
Ce logiciel est un programme informatique servant à aider les producteurs | Ce logiciel est un programme informatique servant à aider les producteurs | ||||
à distribuer leur production en circuits courts. | à distribuer leur production en circuits courts. | ||||
*/ | */ | ||||
use common\helpers\Price; | 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(); | $unitModule = UnitModule::getInstance(); | ||||
$productModule = ProductModule::getInstance(); | $productModule = ProductModule::getInstance(); | ||||
} | } | ||||
$html .= '</td>' ; | $html .= '</td>' ; | ||||
if($pointSale->credit) { | |||||
if($pointSale->payment_method_credit) { | |||||
$credit = '' ; | $credit = '' ; | ||||
if(isset($order->user) && $order->user->id) { | if(isset($order->user) && $order->user->id) { | ||||
$strProducts = substr($strProducts, 0, strlen($strProducts) - 6) ; | $strProducts = substr($strProducts, 0, strlen($strProducts) - 6) ; | ||||
$html .= '<td>'.$strProducts.'</td><td></td><td></td><td></td>' ; | $html .= '<td>'.$strProducts.'</td><td></td><td></td><td></td>' ; | ||||
if($pointSale->credit) { | |||||
if($pointSale->payment_method_credit) { | |||||
$html .= '<td></td>' ; | $html .= '<td></td>' ; | ||||
} | } | ||||
$html .= '<td><strong>'.Price::format($pointSale->revenues_with_tax) . '</strong></td>'; | $html .= '<td><strong>'.Price::format($pointSale->revenues_with_tax) . '</strong></td>'; |
<?php | <?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(); | $orderModule = OrderModule::getInstance(); | ||||
<?php | <?php | ||||
use common\logic\Distribution\Distribution\Export\DistributionShoppingCartLabelsPdfGenerator; | |||||
use domain\Distribution\Distribution\Export\DistributionShoppingCartLabelsPdfGenerator; | |||||
$distributionShoppingCartLabelsPdfGenerator = DistributionShoppingCartLabelsPdfGenerator::getInstance(); | $distributionShoppingCartLabelsPdfGenerator = DistributionShoppingCartLabelsPdfGenerator::getInstance(); | ||||
$index = 0; | $index = 0; |
<?php | <?php | ||||
use common\helpers\Price; | use common\helpers\Price; | ||||
use common\logic\Config\Unit\Module\UnitModule; | |||||
use common\logic\Order\ProductOrder\Module\ProductOrderModule; | |||||
use common\logic\Producer\Producer\Module\ProducerModule; | |||||
use common\logic\Product\Product\Model\Product; | |||||
use domain\Config\Unit\UnitModule; | |||||
use domain\Order\ProductOrder\ProductOrderModule; | |||||
use domain\Producer\Producer\ProducerModule; | |||||
use domain\Product\Product\Product; | |||||
use yii\helpers\Html; | use yii\helpers\Html; | ||||
$documentModule = $this->getDocumentModule(); | $documentModule = $this->getDocumentModule(); |
<?php | <?php | ||||
/** | /** | ||||
* Copyright distrib (2018) | |||||
* Copyright Souke (2018) | |||||
* | * | ||||
* contact@opendistrib.net | |||||
* contact@souke.fr | |||||
* | * | ||||
* Ce logiciel est un programme informatique servant à aider les producteurs | * Ce logiciel est un programme informatique servant à aider les producteurs | ||||
* à distribuer leur production en circuits courts. | * à distribuer leur production en circuits courts. | ||||
* termes. | * termes. | ||||
*/ | */ | ||||
use common\helpers\MeanPayment;use common\helpers\Price; | |||||
use common\logic\Document\Document\Module\DocumentModule; | |||||
use common\logic\Document\Invoice\Module\InvoiceModule; | |||||
use common\logic\Payment\Module\PaymentModule; | |||||
use common\logic\Producer\Producer\Module\ProducerModule; | |||||
use common\logic\User\User\Module\UserModule; | |||||
use domain\Document\Document\DocumentModule; | |||||
use domain\Document\Invoice\InvoiceModule; | |||||
use domain\Payment\PaymentModule; | |||||
use domain\Producer\Producer\ProducerModule; | |||||
use domain\User\User\UserModule; | |||||
use yii\helpers\Html; | use yii\helpers\Html; | ||||
use yii\widgets\ActiveForm; | use yii\widgets\ActiveForm; | ||||
\backend\assets\VuejsDocumentFormAsset::register($this); | |||||
$producerModule = ProducerModule::getInstance(); | $producerModule = ProducerModule::getInstance(); | ||||
$documentModule = DocumentModule::getInstance(); | $documentModule = DocumentModule::getInstance(); | ||||
$invoiceModule = InvoiceModule::getInstance(); | |||||
$invoiceModule = InvoiceModule::getInstance(); | |||||
$userModule = UserModule::getInstance(); | $userModule = UserModule::getInstance(); | ||||
$paymentManager = PaymentModule::getInstance(); | $paymentManager = PaymentModule::getInstance(); | ||||
class="table table-bordered"> | class="table table-bordered"> | ||||
<thead> | <thead> | ||||
<tr> | <tr> | ||||
<th></th> | |||||
<th> | |||||
<input type="checkbox" class="check-all-checkboxes" data-selector=".checkbox-delivery-note" /> | |||||
</th> | |||||
<th>Libellé</th> | <th>Libellé</th> | ||||
<th v-if="taxRateProducer != 0">Montant (TTC)</th> | <th v-if="taxRateProducer != 0">Montant (TTC)</th> | ||||
<th v-else>Montant</th> | <th v-else>Montant</th> | ||||
</thead> | </thead> | ||||
<tbody> | <tbody> | ||||
<tr v-for="deliveryNote in deliveryNoteCreateArray"> | <tr v-for="deliveryNote in deliveryNoteCreateArray"> | ||||
<td><input type="checkbox" name="Invoice[deliveryNotes][]" | |||||
:value="deliveryNote.id"/></td> | |||||
<td><input type="checkbox" class="checkbox-delivery-note" name="Invoice[deliveryNotes][]" :value="deliveryNote.id"/></td> | |||||
<td>{{ deliveryNote.name }}</td> | <td>{{ deliveryNote.name }}</td> | ||||
<td>{{ formatPrice(deliveryNote.total) }}</td> | <td>{{ formatPrice(deliveryNote.total) }}</td> | ||||
</tr> | </tr> | ||||
class="btn btn-sm btn-default"><span class="glyphicon glyphicon-download-alt"></span> Télécharger | class="btn btn-sm btn-default"><span class="glyphicon glyphicon-download-alt"></span> Télécharger | ||||
(PDF)</a> | (PDF)</a> | ||||
<?php if ($documentModule->isStatusValid($model)): ?> | |||||
<a href="<?= Yii::$app->urlManager->createUrl([Yii::$app->controller->getControllerUrl() . '/regenerate', 'id' => $model->id]) ?>" | |||||
class="btn btn-sm btn-default"><span class="glyphicon glyphicon-repeat"></span> Regénérer | |||||
(PDF)</a> | |||||
<?php endif; ?> | |||||
<?php if ($documentClass == 'Invoice' && $producerModule->getConfig('option_export_evoliz')): ?> | <?php if ($documentClass == 'Invoice' && $producerModule->getConfig('option_export_evoliz')): ?> | ||||
<a href="<?= Yii::$app->urlManager->createUrl([Yii::$app->controller->getControllerUrl() . '/export-csv-evoliz', 'id' => $model->id]) ?>" | <a href="<?= Yii::$app->urlManager->createUrl([Yii::$app->controller->getControllerUrl() . '/export-csv-evoliz', 'id' => $model->id]) ?>" | ||||
class="btn btn-sm btn-default"><span class="glyphicon glyphicon-save-file"></span> Export Evoliz | class="btn btn-sm btn-default"><span class="glyphicon glyphicon-save-file"></span> Export Evoliz | ||||
<?php endif; ?> | <?php endif; ?> | ||||
</div> | </div> | ||||
</div> | </div> | ||||
<div v-if="document.status == 'draft' || !document.is_sent" class="info-box"> | |||||
<div class="info-box"> | |||||
<span class="info-box-icon bg-red"><i class="fa fa-flash"></i></span> | <span class="info-box-icon bg-red"><i class="fa fa-flash"></i></span> | ||||
<div class="info-box-content"> | <div class="info-box-content"> | ||||
href="<?= Yii::$app->urlManager->createUrl([Yii::$app->controller->getControllerUrl() . '/validate', 'id' => $model->id, 'backUpdateForm' => 1]) ?>" | href="<?= Yii::$app->urlManager->createUrl([Yii::$app->controller->getControllerUrl() . '/validate', 'id' => $model->id, 'backUpdateForm' => 1]) ?>" | ||||
class="btn btn-sm btn-default"><span class="glyphicon glyphicon-ok"></span> Valider le document</a> | class="btn btn-sm btn-default"><span class="glyphicon glyphicon-ok"></span> Valider le document</a> | ||||
<?php if ($documentModule->isStatusValid($model)): ?> | |||||
<a href="<?= Yii::$app->urlManager->createUrl([Yii::$app->controller->getControllerUrl() . '/regenerate', 'id' => $model->id]) ?>" | |||||
class="btn btn-sm btn-default"><span class="glyphicon glyphicon-repeat"></span> Regénérer | |||||
(PDF)</a> | |||||
<?php endif; ?> | |||||
<?php if (isset($model->user) && strlen($model->user->email) > 0): ?> | <?php if (isset($model->user) && strlen($model->user->email) > 0): ?> | ||||
<a v-if="!document.is_sent" | <a v-if="!document.is_sent" | ||||
href="<?= Yii::$app->urlManager->createUrl([Yii::$app->controller->getControllerUrl() . '/send', 'id' => $model->id, 'backUpdateForm' => 1]) ?>" | href="<?= Yii::$app->urlManager->createUrl([Yii::$app->controller->getControllerUrl() . '/send', 'id' => $model->id, 'backUpdateForm' => 1]) ?>" | ||||
<template v-for="order in ordersArray"> | <template v-for="order in ordersArray"> | ||||
<tr v-for="productOrder in order.productOrder"> | <tr v-for="productOrder in order.productOrder"> | ||||
<td class="col-md-4"> | <td class="col-md-4"> | ||||
<div class="product-name">{{ getProductById(productOrder.id_product).name }} | |||||
<div class="product-name"> | |||||
<a :href="productOrder.url_product" target="_blank"> | |||||
{{ getProductById(productOrder.id_product).name }} | |||||
</a> | |||||
</div> | </div> | ||||
<ul class="product-order-meta"> | <ul class="product-order-meta"> | ||||
<li v-if="order.distribution_date">Commande : <a class="btn btn-sm btn-default" | |||||
:href="productOrder.url_order">{{ | |||||
<li v-if="order.distribution_date">Commande : <a :href="productOrder.url_order">{{ | |||||
order.distribution_date }}</a></li> | order.distribution_date }}</a></li> | ||||
<li>Utilisateur : {{ order.username }}</li> | <li>Utilisateur : {{ order.username }}</li> | ||||
<li v-if="order.point_sale_name">Point de vente : {{ order.point_sale_name }}</li> | <li v-if="order.point_sale_name">Point de vente : {{ order.point_sale_name }}</li> | ||||
</ul> | </ul> | ||||
</td> | </td> | ||||
<td class="col-md-2"> | <td class="col-md-2"> | ||||
{{ formatPrice(getProductOrderPrice(productOrder)) }} | |||||
<template v-if="document.status == 'draft'"> | |||||
<div class="input-group input-group-edit-invoice-price"> | |||||
<input type="text" class="form-control" :id="'input-product-order-invoice-price-'+productOrder.id" :value="getProductOrderPrice(productOrder)" :data-id-product-order="productOrder.id" @keyup="showProductOrderInvoicePriceButtonApply" /> | |||||
<span class="input-group-addon">€</span> | |||||
</div> | |||||
<div class="product-order-invoice-price-button-apply" :id="'product-order-invoice-price-button-apply-'+productOrder.id"> | |||||
<button class="btn btn-success" type="button" :data-id-product-order="productOrder.id" @click="updateProductOrderInvoicePrice"> | |||||
<span class="glyphicon glyphicon-ok"></span> | |||||
</button> | |||||
</div> | |||||
</template> | |||||
<template v-else> | |||||
{{ formatPrice(getProductOrderPrice(productOrder)) }} | |||||
</template> | |||||
<template | <template | ||||
v-if="document.status == 'draft' && getProductOrderPrice(productOrder) != getBestProductPrice(productOrder.id_product, productOrder.quantity)"> | v-if="document.status == 'draft' && getProductOrderPrice(productOrder) != getBestProductPrice(productOrder.id_product, productOrder.quantity)"> | ||||
<i class="fa fa-exclamation-triangle" | |||||
title="Prix différent de celui défini au niveau du produit"></i> | |||||
<i class="different-price fa fa-exclamation-triangle" | |||||
:title="'Prix différent de celui défini au niveau du produit ('+getBestProductPrice(productOrder.id_product, productOrder.quantity)+' €)'"></i> | |||||
</template> | </template> | ||||
</td> | </td> | ||||
<td class="col-md-2">{{ productOrder.quantity }}</td> | <td class="col-md-2">{{ productOrder.quantity }}</td> |
<?php | <?php | ||||
/** | /** | ||||
Copyright distrib (2018) | |||||
Copyright Souke (2018) | |||||
contact@opendistrib.net | |||||
contact@souke.fr | |||||
Ce logiciel est un programme informatique servant à aider les producteurs | Ce logiciel est un programme informatique servant à aider les producteurs | ||||
à distribuer leur production en circuits courts. | à distribuer leur production en circuits courts. |
<?php | <?php | ||||
use yii\helpers\Html; | |||||
use common\logic\Order\Order\Model\Order; | |||||
use common\helpers\Price; | use common\helpers\Price; | ||||
use domain\Order\Order\Order; | |||||
use yii\helpers\Html; | |||||
$producerModule = $this->getProducerModule(); | $producerModule = $this->getProducerModule(); | ||||
$userModule = $this->getUserModule(); | $userModule = $this->getUserModule(); | ||||
$documentModule = $this->getDocumentModule(); | $documentModule = $this->getDocumentModule(); | ||||
$orderModule = $this->getOrderModule(); | $orderModule = $this->getOrderModule(); | ||||
$deliveryNoteModule = $this->getDeliveryNoteModule(); | |||||
$isDocumentDeliveryNote = $documentModule->getSolver()->isDocumentDeliveryNote($document); | $isDocumentDeliveryNote = $documentModule->getSolver()->isDocumentDeliveryNote($document); | ||||
$displayPrices = !$isDocumentDeliveryNote || ($isDocumentDeliveryNote && $producerModule->getConfig('document_display_prices_delivery_note')); | $displayPrices = !$isDocumentDeliveryNote || ($isDocumentDeliveryNote && $producerModule->getConfig('document_display_prices_delivery_note')); | ||||
<strong>Libellé : </strong> | <strong>Libellé : </strong> | ||||
<?= $document->name; ?> | <?= $document->name; ?> | ||||
</div> | </div> | ||||
<?php if ($documentModule->getSolver()->isDocumentInvoice($document)): ?> | |||||
<?php $deliveryNotesUpdateArray = $deliveryNoteModule->getRepository()->findDeliveryNotesByInvoice($document); ?> | |||||
<?php if($deliveryNotesUpdateArray && count($deliveryNotesUpdateArray)): ?> | |||||
<strong>Bons de livraison : </strong> | |||||
<?php foreach($deliveryNotesUpdateArray as $key => $deliveryNote): ?> | |||||
<?= $deliveryNote->reference ?><?php if ($key !== array_key_last($deliveryNotesUpdateArray)): ?>, <?php endif; ?> | |||||
<?php endforeach; ?> | |||||
<?php endif; ?> | |||||
<?php endif; ?> | |||||
<?php if (strlen($document->comment)): ?> | <?php if (strlen($document->comment)): ?> | ||||
<div class="comment"> | <div class="comment"> | ||||
<br> | <br> | ||||
</tr> | </tr> | ||||
<?php | <?php | ||||
$taxRateArray = $this-> getTaxRateModule()->findTaxRatesAsArray(); | |||||
$taxRateArray = $this-> getTaxRateModule()->getRepository()->findTaxRatesAsArray(); | |||||
foreach ($documentModule->getTotalVatArray($document, $typeAmount) as $idTaxRate => $totalVat): ?> | foreach ($documentModule->getTotalVatArray($document, $typeAmount) as $idTaxRate => $totalVat): ?> | ||||
<tr> | <tr> | ||||
<td class="align-right" colspan="4"> | <td class="align-right" colspan="4"> |
use common\helpers\MeanPayment; | use common\helpers\MeanPayment; | ||||
use common\helpers\Price; | use common\helpers\Price; | ||||
use common\logic\Document\Document\Module\DocumentModule; | |||||
use common\logic\Document\Invoice\Module\InvoiceModule; | |||||
use common\logic\Payment\Module\PaymentModule; | |||||
use domain\Document\Document\DocumentModule; | |||||
use domain\Document\Invoice\InvoiceModule; | |||||
use domain\Payment\PaymentModule; | |||||
use yii\helpers\Html; | use yii\helpers\Html; | ||||
use yii\widgets\ActiveForm; | use yii\widgets\ActiveForm; | ||||
<?php | <?php | ||||
/** | /** | ||||
Copyright distrib (2018) | |||||
Copyright Souke (2018) | |||||
contact@opendistrib.net | |||||
contact@souke.fr | |||||
Ce logiciel est un programme informatique servant à aider les producteurs | Ce logiciel est un programme informatique servant à aider les producteurs | ||||
à distribuer leur production en circuits courts. | à distribuer leur production en circuits courts. |
<?php | <?php | ||||
/** | /** | ||||
* Copyright distrib (2018) | |||||
* Copyright Souke (2018) | |||||
* | * | ||||
* contact@opendistrib.net | |||||
* contact@souke.fr | |||||
* | * | ||||
* Ce logiciel est un programme informatique servant à aider les producteurs | * Ce logiciel est un programme informatique servant à aider les producteurs | ||||
* à distribuer leur production en circuits courts. | * à distribuer leur production en circuits courts. |
<?php | <?php | ||||
/** | /** | ||||
Copyright distrib (2018) | |||||
Copyright Souke (2018) | |||||
contact@opendistrib.net | |||||
contact@souke.fr | |||||
Ce logiciel est un programme informatique servant à aider les producteurs | Ce logiciel est un programme informatique servant à aider les producteurs | ||||
à distribuer leur production en circuits courts. | à distribuer leur production en circuits courts. |
<?php | <?php | ||||
/** | /** | ||||
* Copyright distrib (2018) | |||||
* Copyright Souke (2018) | |||||
* | * | ||||
* contact@opendistrib.net | |||||
* contact@souke.fr | |||||
* | * | ||||
* Ce logiciel est un programme informatique servant à aider les producteurs | * Ce logiciel est un programme informatique servant à aider les producteurs | ||||
* à distribuer leur production en circuits courts. | * à distribuer leur production en circuits courts. | ||||
* termes. | * termes. | ||||
*/ | */ | ||||
use yii\helpers\Html; | |||||
use domain\Document\Invoice\Invoice; | |||||
use domain\Feature\Feature\Feature; | |||||
use domain\Order\Order\Order; | |||||
use yii\grid\GridView; | use yii\grid\GridView; | ||||
use common\helpers\Url; | |||||
use common\logic\Document\Invoice\Model\Invoice; | |||||
use common\logic\Order\Order\Model\Order; | |||||
use yii\helpers\Html; | |||||
$producerModule = $this->getProducerModule(); | $producerModule = $this->getProducerModule(); | ||||
$invoiceModule = $this-> getInvoiceModule(); | |||||
$invoiceModule = $this-> getInvoiceModule(); | |||||
$userModule = $this->getUserModule(); | $userModule = $this->getUserModule(); | ||||
$featureChecker = $this->getFeatureModule()->getChecker(); | |||||
$this->setTitle('Factures'); | $this->setTitle('Factures'); | ||||
$this->addBreadcrumb($this->getTitle()); | $this->addBreadcrumb($this->getTitle()); | ||||
?> | ?> | ||||
<div class="invoice-index"> | <div class="invoice-index"> | ||||
<?php if (Invoice::searchCount()): ?> | <?php if (Invoice::searchCount()): ?> | ||||
<?= GridView::widget([ | <?= GridView::widget([ | ||||
'filterModel' => $searchModel, | 'filterModel' => $searchModel, | ||||
'name', | 'name', | ||||
[ | [ | ||||
'attribute' => 'username', | 'attribute' => 'username', | ||||
'header' => 'Utilisateur', | |||||
'label' => 'Utilisateur', | |||||
'headerOptions' => ['class' => 'column-hide-on-mobile'], | 'headerOptions' => ['class' => 'column-hide-on-mobile'], | ||||
'filterOptions' => ['class' => 'column-hide-on-mobile'], | 'filterOptions' => ['class' => 'column-hide-on-mobile'], | ||||
'contentOptions' => ['class' => 'column-hide-on-mobile'], | 'contentOptions' => ['class' => 'column-hide-on-mobile'], | ||||
[ | [ | ||||
'attribute' => 'date', | 'attribute' => 'date', | ||||
'header' => 'Date', | 'header' => 'Date', | ||||
'filter' => \yii\jui\DatePicker::widget([ | |||||
'language' => 'fr', | |||||
'dateFormat' => 'dd/MM/yyyy', | |||||
'model' => $searchModel, | |||||
'attribute' => 'date', | |||||
'options' => ['class' => 'form-control'] | |||||
]), | |||||
'headerOptions' => ['class' => 'column-hide-on-mobile'], | 'headerOptions' => ['class' => 'column-hide-on-mobile'], | ||||
'filterOptions' => ['class' => 'column-hide-on-mobile'], | 'filterOptions' => ['class' => 'column-hide-on-mobile'], | ||||
'contentOptions' => ['class' => 'column-hide-on-mobile'], | 'contentOptions' => ['class' => 'column-hide-on-mobile'], | ||||
'header' => 'Montant', | 'header' => 'Montant', | ||||
'format' => 'raw', | 'format' => 'raw', | ||||
'value' => function ($invoice) use ( $invoiceModule) { | 'value' => function ($invoice) use ( $invoiceModule) { | ||||
$amountWithTax = $invoiceModule->getAmountWithTax($invoice, Order::INVOICE_AMOUNT_TOTAL); | |||||
return $invoiceModule->getAmountWithTax($invoice, Order::INVOICE_AMOUNT_TOTAL, true); | return $invoiceModule->getAmountWithTax($invoice, Order::INVOICE_AMOUNT_TOTAL, true); | ||||
} | } | ||||
], | ], | ||||
[ | [ | ||||
'header' => 'Payée', | |||||
'attribute' => 'is_paid', | |||||
'label' => 'Payée', | |||||
'filter' => [ | |||||
0 => 'Non', | |||||
1 => 'Oui', | |||||
], | |||||
'format' => 'raw', | 'format' => 'raw', | ||||
'headerOptions' => ['class' => 'column-hide-on-mobile'], | 'headerOptions' => ['class' => 'column-hide-on-mobile'], | ||||
'filterOptions' => ['class' => 'column-hide-on-mobile'], | 'filterOptions' => ['class' => 'column-hide-on-mobile'], | ||||
'contentOptions' => ['class' => 'column-hide-on-mobile'], | 'contentOptions' => ['class' => 'column-hide-on-mobile'], | ||||
'value' => function ($invoice) use ( $invoiceModule) { | |||||
$amountWithTax = $invoiceModule->getAmountWithTax($invoice, Order::INVOICE_AMOUNT_TOTAL); | |||||
if($amountWithTax && $invoiceModule->isInvoicePaid($invoice)) { | |||||
'value' => function ($invoice) use ($invoiceModule) { | |||||
if($invoiceModule->isInvoicePaid($invoice)) { | |||||
return '<span class="label label-success">Oui</span>'; | return '<span class="label label-success">Oui</span>'; | ||||
} | } | ||||
return '<span class="label label-default">Non</span>'; | return '<span class="label label-default">Non</span>'; | ||||
} | } | ||||
], | ], | ||||
[ | [ | ||||
'attribute' => 'is_sent', | 'attribute' => 'is_sent', | ||||
'header' => 'Envoyée', | 'header' => 'Envoyée', | ||||
'filter' => [ | |||||
0 => 'Non', | |||||
1 => 'Oui', | |||||
], | |||||
'format' => 'raw', | 'format' => 'raw', | ||||
'headerOptions' => ['class' => 'column-hide-on-mobile'], | 'headerOptions' => ['class' => 'column-hide-on-mobile'], | ||||
'filterOptions' => ['class' => 'column-hide-on-mobile'], | 'filterOptions' => ['class' => 'column-hide-on-mobile'], | ||||
'title' => 'Télécharger', 'class' => 'btn btn-default' | 'title' => 'Télécharger', 'class' => 'btn btn-default' | ||||
]); | ]); | ||||
}, | }, | ||||
'export-csv-evoliz' => function ($url, $invoice) use ($producerModule) { | |||||
if ($producerModule->getConfig('option_export_evoliz')) { | |||||
'export-csv-evoliz' => function ($url, $invoice) use ($producerModule, $featureChecker) { | |||||
if($featureChecker->isEnabled(Feature::ALIAS_BRIDGE_EVOLIZ) | |||||
&& $producerModule->getConfig('option_export_evoliz')) { | |||||
return Html::a('<span class="glyphicon glyphicon-save-file"></span> Evoliz', $url, [ | return Html::a('<span class="glyphicon glyphicon-save-file"></span> Evoliz', $url, [ | ||||
'title' => 'Export CSV Evoliz', 'class' => 'btn btn-default' | 'title' => 'Export CSV Evoliz', 'class' => 'btn btn-default' | ||||
]); | ]); | ||||
} | } | ||||
return ''; | return ''; | ||||
}, | }, | ||||
'update' => function ($url, $invoice) { | 'update' => function ($url, $invoice) { |
<?php | <?php | ||||
/** | /** | ||||
Copyright distrib (2018) | |||||
Copyright Souke (2018) | |||||
contact@opendistrib.net | |||||
contact@souke.fr | |||||
Ce logiciel est un programme informatique servant à aider les producteurs | Ce logiciel est un programme informatique servant à aider les producteurs | ||||
à distribuer leur production en circuits courts. | à distribuer leur production en circuits courts. | ||||
termes. | termes. | ||||
*/ | */ | ||||
use yii\helpers\Html; | |||||
use yii\widgets\Breadcrumbs; | use yii\widgets\Breadcrumbs; | ||||
use dmstr\widgets\Alert; | use dmstr\widgets\Alert; | ||||
use common\helpers\GlobalParam; | use common\helpers\GlobalParam; | ||||
$producerModule = $this->getProducerModule(); | $producerModule = $this->getProducerModule(); | ||||
$adminSettingBag = $this->getSettingModule()->getAdminSettingBag(); | |||||
$sharedPointSaleModule = $this->getSharedPointSaleModule(); | |||||
$userModule = $this->getUserModule(); | |||||
$userCurrent = GlobalParam::getCurrentUser(); | |||||
$producer = GlobalParam::getCurrentProducer(); | |||||
?> | ?> | ||||
<div class="content-wrapper"> | <div class="content-wrapper"> | ||||
<section class="content"> | <section class="content"> | ||||
<?php echo $this->renderFile('@common/views/alert_message.php', [ | |||||
'display' => $adminSettingBag->get('adminAlertMessageDisplay') && $producerModule->getResolver()->isAlertMessageDisplayed($producer), | |||||
'type' => $adminSettingBag->get('adminAlertMessageType'), | |||||
'title' => $adminSettingBag->get('adminAlertMessageTitle'), | |||||
'icon' => $adminSettingBag->get('adminAlertMessageIcon'), | |||||
'message' => $adminSettingBag->get('adminAlertMessage'), | |||||
'buttonClose' => true | |||||
]) ?> | |||||
<?php $producer = GlobalParam::getCurrentProducer(); ?> | <?php $producer = GlobalParam::getCurrentProducer(); ?> | ||||
<?php if($producer && !$producerModule->isUpToDateWithOpendistribVersion($producer) && $producer->option_display_message_new_opendistrib_version): ?> | |||||
<div class="alert alert-warning"> | |||||
<p>Opendistrib a été mis à jour vers la version <?= GlobalParam::getOpendistribVersion() ?> ! <a class="alert-link" href="<?= Yii::$app->urlManager->createUrl(['development/index']) ?>">Découvrir les nouveautés</a></p> | |||||
<?php if($producer | |||||
&& !$producerModule->isUpToDateWithOpendistribVersion($producer) | |||||
&& $producer->option_display_message_new_opendistrib_version | |||||
&& !$userModule->getAuthorizationChecker()->isGrantedAsAdministrator($userCurrent)): ?> | |||||
<div class="alert alert-success"> | |||||
<p> | |||||
<i class="icon fa fa-cogs"></i> | |||||
Souke a été mis à jour vers la version <?= GlobalParam::getSoukeVersion() ?> ! <a class="alert-link" href="<?= Yii::$app->urlManager->createUrl(['development/index']) ?>">Découvrir les nouveautés</a> | |||||
</p> | |||||
<a href="<?= Yii::$app->urlManager->createUrl(['producer/update-opendistrib-version']) ?>" class="close"><span aria-hidden="true">×</span></a> | <a href="<?= Yii::$app->urlManager->createUrl(['producer/update-opendistrib-version']) ?>" class="close"><span aria-hidden="true">×</span></a> | ||||
</div> | </div> | ||||
<?php endif; ?> | <?php endif; ?> | ||||
<?= Alert::widget() ?> | |||||
<?php $countSharedPointsSaleRequestsOthers = $sharedPointSaleModule->getResolver()->countSharedPointsSaleRequestsOthers(); ?> | |||||
<?php if($countSharedPointsSaleRequestsOthers && Yii::$app->controller->id != 'shared-point-sale'): ?> | |||||
<div class="alert alert-info"> | |||||
<p> | |||||
<i class="icon fa fa-share-alt"></i> | |||||
Vous avez une demande de partage de point de vente en attente. <a class="alert-link" href="<?= Yii::$app->urlManager->createUrl(['shared-point-sale/index']) ?>">Voir</a> | |||||
</p> | |||||
</div> | |||||
<?php endif; ?> | |||||
<?php | |||||
$flashTypeArray = ['error' => 'ban', 'danger' => 'ban', 'warning' => 'warning', 'info' => 'info', 'success' => 'check']; | |||||
foreach($flashTypeArray as $flashType => $icon) { | |||||
if(Yii::$app->session->hasFlash($flashType)) { | |||||
echo $this->renderFile('@common/views/alert_message.php', [ | |||||
'display' => true, | |||||
'title' => false, | |||||
'type' => $flashType, | |||||
'icon' => $icon, | |||||
'message' => Yii::$app->session->getFlash($flashType), | |||||
]); | |||||
} | |||||
} | |||||
?> | |||||
<?= $content ?> | <?= $content ?> | ||||
<div class="clr"></div> | <div class="clr"></div> | ||||
</section> | </section> | ||||
<footer class="main-footer"> | <footer class="main-footer"> | ||||
<div class="pull-right hidden-xs"> | <div class="pull-right hidden-xs"> | ||||
<strong>Version</strong> <?= GlobalParam::getOpendistribVersion(); ?> | |||||
<strong>Version</strong> <?= GlobalParam::getSoukeVersion(); ?> | |||||
</div> | </div> | ||||
<br /> | <br /> | ||||
<!--<div class="pull-right hidden-xs"> | <!--<div class="pull-right hidden-xs"> |
<?php | <?php | ||||
/** | /** | ||||
* Copyright distrib (2018) | |||||
* Copyright Souke (2018) | |||||
* | * | ||||
* contact@opendistrib.net | |||||
* contact@souke.fr | |||||
* | * | ||||
* Ce logiciel est un programme informatique servant à aider les producteurs | * Ce logiciel est un programme informatique servant à aider les producteurs | ||||
* à distribuer leur production en circuits courts. | * à distribuer leur production en circuits courts. | ||||
* termes. | * termes. | ||||
*/ | */ | ||||
use common\helpers\GlobalParam; | |||||
use common\helpers\Image; | use common\helpers\Image; | ||||
use common\helpers\Price; | use common\helpers\Price; | ||||
use common\logic\Producer\Producer\Module\ProducerModule; | |||||
use common\logic\User\User\Module\UserModule; | |||||
use domain\Distribution\Distribution\Distribution; | |||||
use domain\Feature\Feature\Feature; | |||||
use domain\Feature\Feature\FeatureModule; | |||||
use domain\Producer\Producer\Producer; | |||||
use domain\Producer\Producer\ProducerModule; | |||||
use domain\Setting\AdminSettingBag; | |||||
use domain\User\User\UserModule; | |||||
use common\helpers\Environment; | |||||
use yii\helpers\Html; | use yii\helpers\Html; | ||||
use common\helpers\GlobalParam; | |||||
use common\logic\Distribution\Distribution\Model\Distribution; | |||||
use common\logic\Producer\Producer\Model\Producer; | |||||
$userModule = UserModule::getInstance(); | $userModule = UserModule::getInstance(); | ||||
$producerModule = ProducerModule::getInstance(); | $producerModule = ProducerModule::getInstance(); | ||||
$producer = GlobalParam::getCurrentProducer(); | $producer = GlobalParam::getCurrentProducer(); | ||||
$userCurrent = GlobalParam::getCurrentUser(); | $userCurrent = GlobalParam::getCurrentUser(); | ||||
$featureChecker = FeatureModule::getInstance()->getChecker(); | |||||
$adminSettingBag = AdminSettingBag::getInstance(); | |||||
?> | ?> | ||||
<header class="main-header"> | <header class="main-header"> | ||||
<!-- <?= Html::a('<span class="logo-mini"><img src="' . Yii::$app->urlManagerBackend->getBaseUrl() . '/img/logo-distrib.png" /></span><span class="logo-lg"><img src="' . Yii::$app->urlManagerBackend->getBaseUrl() . '/img/logo-distrib.png" /></span>', Yii::$app->homeUrl, ['class' => 'logo']) ?>--> | |||||
<?= Html::a('Opendistrib', Yii::$app->homeUrl, ['class' => 'logo']); ?> | |||||
<?php $beta = Environment::badgeBeta(); ?> | |||||
<?= Html::a('<span class="logo-mini"><img src="' . Yii::$app->urlManagerBackend->getBaseUrl() . '/img/logo-souke.svg" /></span><span class="logo-lg"><img src="' . Yii::$app->urlManagerBackend->getBaseUrl() . '/img/logo-souke.svg" />'.$beta.'</span>'.$beta, Yii::$app->homeUrl, ['class' => 'logo']) ?> | |||||
<?php /*Html::a( | |||||
'Opendistrib', | |||||
$userModule->getAuthorizationChecker()->isGrantedAsAdministrator($userCurrent) | |||||
? Yii::$app->urlManager->createUrl('dashboard-admin/index') | |||||
: Yii::$app->homeUrl, | |||||
['class' => 'logo'] | |||||
);*/ ?> | |||||
<nav class="navbar navbar-static-top" role="navigation"> | <nav class="navbar navbar-static-top" role="navigation"> | ||||
</span> | </span> | ||||
<?php endif; ?> | <?php endif; ?> | ||||
<div class="title"> | <div class="title"> | ||||
<?php if($userModule->getAuthorizationChecker()->isGrantedAsAdministrator($userCurrent)): ?> | |||||
<a href="<?= Yii::$app->urlManager->createUrl(['producer-admin/update', 'id' => $producer->id]) ?>"> | |||||
<?php endif; ?> | |||||
<?= Html::encode($producer->name) ?> | <?= Html::encode($producer->name) ?> | ||||
<?php if($userModule->getAuthorizationChecker()->isGrantedAsAdministrator($userCurrent)): ?> | |||||
</a> | |||||
<?php endif; ?> | |||||
<?php if ($userModule->getAuthorizationChecker()->isGrantedAsAdministrator($userCurrent)): ?> | |||||
<span class="producer-id">#<?= $producer->id ?></span> | |||||
<?php endif; ?> | |||||
<?php if (!$producer->active): ?> | <?php if (!$producer->active): ?> | ||||
<span class="label label-danger">Hors-ligne</span> | <span class="label label-danger">Hors-ligne</span> | ||||
<?php endif; ?> | <?php endif; ?> | ||||
?> | ?> | ||||
<ul class="nav navbar-nav"> | <ul class="nav navbar-nav"> | ||||
<?php if ($userModule->getAuthorizationChecker()->isGrantedAsAdministrator($userCurrent)): ?> | <?php if ($userModule->getAuthorizationChecker()->isGrantedAsAdministrator($userCurrent)): ?> | ||||
<li class="dropdown producer-menu"> | <li class="dropdown producer-menu"> | ||||
<a href="#" class="dropdown-toggle" data-toggle="dropdown"> | <a href="#" class="dropdown-toggle" data-toggle="dropdown"> | ||||
<span class="glyphicon glyphicon-grain"></span> | |||||
<i class="bi bi-bookmarks"></i> | |||||
<span class="hidden-xs hidden-sm">Producteurs</span> | <span class="hidden-xs hidden-sm">Producteurs</span> | ||||
<i class="fa fa-caret-down"></i> | <i class="fa fa-caret-down"></i> | ||||
</a> | </a> | ||||
</li> | </li> | ||||
<?php $producersArray = Producer::find()->orderBy('name ASC')->all(); ?> | <?php $producersArray = Producer::find()->orderBy('name ASC')->all(); ?> | ||||
<?php foreach ($producersArray as $producer): ?> | <?php foreach ($producersArray as $producer): ?> | ||||
<?php if ($producer->active == 1): ?> | |||||
<?php if ($producer->active == 1 && $producer->is_new): ?> | |||||
<li class="producer"> | <li class="producer"> | ||||
<a href="<?= Yii::$app->urlManagerBackend->createUrl(['site/switch-producer', 'id' => $producer->id]); ?>"><?= Html::encode($producer->name) ?></a> | |||||
<a href="<?= Yii::$app->urlManagerBackend->createUrl(['site/switch-producer', 'id' => $producer->id]); ?>"> | |||||
<label class="label label-info">Nouveau</label> | |||||
<?= Html::encode($producer->name) ?> | |||||
<span class="producer-id">#<?= $producer->id ?></span> | |||||
</a> | |||||
</li> | |||||
<?php endif; ?> | |||||
<?php endforeach; ?> | |||||
<?php foreach ($producersArray as $producer): ?> | |||||
<?php if ($producer->active == 1 && !$producer->is_new): ?> | |||||
<li class="producer"> | |||||
<a href="<?= Yii::$app->urlManagerBackend->createUrl(['site/switch-producer', 'id' => $producer->id]); ?>"> | |||||
<?php if($producer->is_new): ?> <label class="label label-info">Nouveau</label> <?php endif; ?> | |||||
<?= Html::encode($producer->name) ?> | |||||
<span class="producer-id">#<?= $producer->id ?></span> | |||||
</a> | |||||
</li> | </li> | ||||
<?php endif; ?> | <?php endif; ?> | ||||
<?php endforeach; ?> | <?php endforeach; ?> | ||||
<!--<li class="header"><a href="javascript:void(0);" id="link-display-producers-offline">Afficher | |||||
les producteurs hors-ligne</a></li>--> | |||||
<?php foreach ($producersArray as $producer): ?> | <?php foreach ($producersArray as $producer): ?> | ||||
<?php if ($producer->active != 1): ?> | <?php if ($producer->active != 1): ?> | ||||
<li class="producer"> | <li class="producer"> | ||||
<a href="<?= Yii::$app->urlManagerBackend->createUrl(['site/switch-producer', 'id' => $producer->id]); ?>"> | <a href="<?= Yii::$app->urlManagerBackend->createUrl(['site/switch-producer', 'id' => $producer->id]); ?>"> | ||||
<label class="label label-danger">Hors-ligne</label> | <label class="label label-danger">Hors-ligne</label> | ||||
<?= Html::encode($producer->name) ?> | <?= Html::encode($producer->name) ?> | ||||
<span class="producer-id">#<?= $producer->id ?></span> | |||||
</a> | </a> | ||||
</li> | </li> | ||||
<?php endif; ?> | <?php endif; ?> | ||||
<li class="dropdown distributions-menu notifications-menu"> | <li class="dropdown distributions-menu notifications-menu"> | ||||
<a href="#" class="dropdown-toggle" data-toggle="dropdown"> | <a href="#" class="dropdown-toggle" data-toggle="dropdown"> | ||||
<i class="fa fa-calendar"></i> | |||||
<i class="bi bi-calendar"></i> | |||||
<i class="fa fa-caret-down"></i> | |||||
</a> | </a> | ||||
<ul class="dropdown-menu"> | <ul class="dropdown-menu"> | ||||
<li class="dropdown users-menu notifications-menu"> | <li class="dropdown users-menu notifications-menu"> | ||||
<a href="#" class="dropdown-toggle" data-toggle="dropdown"> | <a href="#" class="dropdown-toggle" data-toggle="dropdown"> | ||||
<i class="fa fa-user-plus"></i> | |||||
<i class="bi bi-person-plus"></i> | |||||
<?php if (count($usersArray)): ?><span | <?php if (count($usersArray)): ?><span | ||||
class="label label-success"><?= count($usersArray) ?></span> | class="label label-success"><?= count($usersArray) ?></span> | ||||
<?php else: ?><span class="label label-warning">0</span><?php endif; ?> | <?php else: ?><span class="label label-warning">0</span><?php endif; ?> | ||||
<i class="fa fa-caret-down"></i> | |||||
</a> | </a> | ||||
<ul class="dropdown-menu"> | <ul class="dropdown-menu"> | ||||
<?php if (count($usersArray)): ?> | <?php if (count($usersArray)): ?> | ||||
<li class="dropdown users-negative-credit-menu notifications-menu"> | <li class="dropdown users-negative-credit-menu notifications-menu"> | ||||
<a href="#" class="dropdown-toggle" data-toggle="dropdown"> | <a href="#" class="dropdown-toggle" data-toggle="dropdown"> | ||||
<i class="fa fa-euro"></i> | |||||
<i class="bi bi-currency-euro"></i> | |||||
<?php if (count($usersNegativeCreditArray)): ?><span | <?php if (count($usersNegativeCreditArray)): ?><span | ||||
class="label label-warning"><?= count($usersNegativeCreditArray) ?></span> | class="label label-warning"><?= count($usersNegativeCreditArray) ?></span> | ||||
<?php else: ?><span class="label label-success">0</span><?php endif; ?> | <?php else: ?><span class="label label-success">0</span><?php endif; ?> | ||||
<i class="fa fa-caret-down"></i> | |||||
</a> | </a> | ||||
<ul class="dropdown-menu"> | <ul class="dropdown-menu"> | ||||
<?php if (count($usersNegativeCreditArray)): ?> | <?php if (count($usersNegativeCreditArray)): ?> | ||||
<li class="header"><a href="<?= Yii::$app->urlManager->createUrl(['credit/index']); ?>">Utilisateurs au crédit négatif</a></li> | |||||
<li class="header"><a href="<?= Yii::$app->urlManager->createUrl(['credit/index']); ?>">Utilisateurs avec une cagnotte en négatif</a></li> | |||||
<li> | <li> | ||||
<ul class="menu"> | <ul class="menu"> | ||||
<?php foreach ($usersNegativeCreditArray as $user): ?> | <?php foreach ($usersNegativeCreditArray as $user): ?> | ||||
</ul> | </ul> | ||||
</li> | </li> | ||||
<?php else: ?> | <?php else: ?> | ||||
<li class="header">Aucun de vos utilisateurs n'a de crédit négatif.</li> | |||||
<li class="header">Aucun de vos utilisateurs n'a de cagnotte en négatif.</li> | |||||
<?php endif; ?> | <?php endif; ?> | ||||
</ul> | </ul> | ||||
</li> | </li> | ||||
<li> | |||||
<a href="<?= Yii::$app->urlManagerFrontend->createAbsoluteUrl(['site/index']); ?>"> | |||||
<i class="bi bi-house-door"></i> | |||||
<span class="hidden-xs hidden-sm">Accueil</span> | |||||
</a> | |||||
</li> | |||||
<?php if ($userModule->getAuthorizationChecker()->isGrantedAsProducer($userCurrent)): ?> | <?php if ($userModule->getAuthorizationChecker()->isGrantedAsProducer($userCurrent)): ?> | ||||
<li> | <li> | ||||
<a href="<?= Yii::$app->urlManagerProducer->createAbsoluteUrl(['site/index', 'slug_producer' => GlobalParam::getCurrentProducer()->slug]); ?>"> | <a href="<?= Yii::$app->urlManagerProducer->createAbsoluteUrl(['site/index', 'slug_producer' => GlobalParam::getCurrentProducer()->slug]); ?>"> | ||||
<span class="glyphicon glyphicon-eye-open"></span> | |||||
<span class="hidden-xs hidden-sm">Mon espace producteur</span> | |||||
<i class="bi bi-shop"></i> | |||||
<span class="hidden-xs hidden-sm">Ma boutique</span> | |||||
</a> | |||||
</li> | |||||
<?php endif; ?> | |||||
<?php if($featureChecker->isEnabled(Feature::ALIAS_FORUM)): ?> | |||||
<li> | |||||
<a href="<?= $adminSettingBag->get('forumFlarumUrl') ?>" target="_blank"> | |||||
<i class="bi bi-people"></i> | |||||
<span class="hidden-xs hidden-sm">Forum</span> | |||||
</a> | </a> | ||||
</li> | </li> | ||||
<?php endif; ?> | <?php endif; ?> | ||||
<li class="dropdown user user-menu"> | <li class="dropdown user user-menu"> | ||||
<a href="#" class="dropdown-toggle" data-toggle="dropdown"> | <a href="#" class="dropdown-toggle" data-toggle="dropdown"> | ||||
<i class="fa fa-user"></i> | |||||
<i class="bi bi-person"></i> | |||||
<span class="hidden-xs hidden-sm"><?= Html::encode(GlobalParam::getCurrentUser()->name . ' ' . substr(GlobalParam::getCurrentUser()->lastname, 0, 1) .'.'); ?></span> | <span class="hidden-xs hidden-sm"><?= Html::encode(GlobalParam::getCurrentUser()->name . ' ' . substr(GlobalParam::getCurrentUser()->lastname, 0, 1) .'.'); ?></span> | ||||
<i class="fa fa-caret-down"></i> | <i class="fa fa-caret-down"></i> | ||||
</a> | </a> | ||||
<ul class="dropdown-menu"> | <ul class="dropdown-menu"> | ||||
<li><a href="<?= Yii::$app->urlManagerFrontend->createAbsoluteUrl(['site/index']); ?>"><i | |||||
class="fa fa-home"></i> Retour à l'accueil</a></li> | |||||
<li><a href="<?= Yii::$app->urlManagerFrontend->createAbsoluteUrl(['user/update']); ?>"><i | |||||
class="fa fa-user"></i> Mon profil</a></li> | |||||
<li><a href="<?= Yii::$app->urlManagerBackend->createUrl(['site/logout']); ?>"><i | |||||
class="fa fa-sign-out"></i> Déconnexion</a></li> | |||||
<!--<li><a href="<?= Yii::$app->urlManagerFrontend->createAbsoluteUrl(['site/index']); ?>"> | |||||
<i class="bi bi-house-door"></i> Accueil</a></li>--> | |||||
<li><a href="<?= Yii::$app->urlManagerFrontend->createAbsoluteUrl(['user/update']); ?>"> | |||||
<i class="bi bi-person"></i> Mon profil</a></li> | |||||
<li><a href="<?= Yii::$app->urlManagerBackend->createUrl(['site/logout']); ?>"> | |||||
<i class="bi bi-box-arrow-left"></i> Déconnexion</a></li> | |||||
</ul> | </ul> | ||||
</li> | </li> | ||||
<li class="link-control-sidebar"> | <li class="link-control-sidebar"> |
<?php | <?php | ||||
/** | /** | ||||
* Copyright distrib (2018) | |||||
* Copyright Souke (2018) | |||||
* | * | ||||
* contact@opendistrib.net | |||||
* contact@souke.fr | |||||
* | * | ||||
* Ce logiciel est un programme informatique servant à aider les producteurs | * Ce logiciel est un programme informatique servant à aider les producteurs | ||||
* à distribuer leur production en circuits courts. | * à distribuer leur production en circuits courts. | ||||
*/ | */ | ||||
use common\helpers\GlobalParam; | use common\helpers\GlobalParam; | ||||
use common\logic\Feature\Feature\Feature; | |||||
use common\logic\User\User\Module\UserModule; | |||||
use domain\Feature\Feature\Feature; | |||||
use domain\User\User\UserModule; | |||||
$producerModule = $this->getProducerModule(); | $producerModule = $this->getProducerModule(); | ||||
$userModule = UserModule::getInstance(); | $userModule = UserModule::getInstance(); | ||||
$userProducerModule = $this->getUserProducerModule(); | $userProducerModule = $this->getUserProducerModule(); | ||||
$ticketModule = $this->getTicketModule(); | $ticketModule = $this->getTicketModule(); | ||||
$featureChecker = $this->getFeatureModule()->getChecker(); | $featureChecker = $this->getFeatureModule()->getChecker(); | ||||
$adminSettingBag = $this->getSettingModule()->getAdminSettingBag(); | |||||
$producer = GlobalParam::getCurrentProducer(); | $producer = GlobalParam::getCurrentProducer(); | ||||
$userCurrent = GlobalParam::getCurrentUser(); | $userCurrent = GlobalParam::getCurrentUser(); | ||||
<section class="sidebar"> | <section class="sidebar"> | ||||
<?php | <?php | ||||
$producer = GlobalParam::getCurrentProducer(); | $producer = GlobalParam::getCurrentProducer(); | ||||
$newVersionOpendistribLabel = ''; | |||||
if ($producer && !$producerModule->isUpToDateWithOpendistribVersion($producer)) { | |||||
$newVersionOpendistribLabel = '<span class="pull-right-container"><small class="label pull-right bg-green">'.GlobalParam::getOpendistribVersion().'</small></span>'; | |||||
$versionOpendistribLabel = ''; | |||||
if ($producer) { | |||||
$backgroundLabelVersionOpendistrib = 'black'; | |||||
if (!$producerModule->isUpToDateWithOpendistribVersion($producer)) { | |||||
$backgroundLabelVersionOpendistrib = 'green'; | |||||
} | |||||
$versionOpendistribLabel = '<span class="pull-right-container"><small class="label pull-right bg-' . $backgroundLabelVersionOpendistrib . '">' . GlobalParam::getSoukeVersion() . '</small></span>'; | |||||
} | } | ||||
$countTicketsProducerUnreadLabel = ''; | $countTicketsProducerUnreadLabel = ''; | ||||
$countTicketsProducerUnread = $ticketModule->countTicketsUnreadByUser($this->getUserCurrent()); | $countTicketsProducerUnread = $ticketModule->countTicketsUnreadByUser($this->getUserCurrent()); | ||||
if($countTicketsProducerUnread && !$isUserCurrentGrantedAsAdministrator) { | |||||
$countTicketsProducerUnreadLabel = '<span class="pull-right-container"><small class="label pull-right bg-green">'.$countTicketsProducerUnread.'</small></span>'; | |||||
if ($countTicketsProducerUnread && !$isUserCurrentGrantedAsAdministrator) { | |||||
$countTicketsProducerUnreadLabel = '<small class="label pull-right bg-blue">' . $countTicketsProducerUnread . '</small>'; | |||||
} | } | ||||
$countTicketsAdminUnreadLabel = ''; | |||||
$countTicketsAdminUnread = $ticketModule->countTicketsAdminUnreadByUser($this->getUserCurrent()); | |||||
if($countTicketsAdminUnread && $isUserCurrentGrantedAsAdministrator) { | |||||
$countTicketsAdminUnreadLabel = '<span class="pull-right-container"><small class="label pull-right bg-green">'.$countTicketsAdminUnread.'</small></span>'; | |||||
$developerOnlineLabel = ''; | |||||
if ($adminSettingBag->get('supportOnline')) { | |||||
$developerOnlineLabel = '<small class="label pull-right bg-green"><i class="fa fa-phone"></i></small>'; | |||||
} | |||||
$countTicketsLabel = ''; | |||||
$countTicketsAdminOpen = $ticketModule->getRepository()->countTicketsAdminStatusOpen(); | |||||
$countTicketsAdminUnread = $ticketModule->getRepository()->countTicketsAdminUnreadByUser($this->getUserCurrent()); | |||||
if ($countTicketsAdminUnread && $isUserCurrentGrantedAsAdministrator) { | |||||
$countTicketsLabel = '<span class="pull-right-container"><small class="label pull-right bg-green">' . $countTicketsAdminOpen . '</small></span>'; | |||||
} else { | |||||
if($countTicketsAdminOpen) { | |||||
$countTicketsLabel = '<span class="pull-right-container"><small class="label pull-right bg-blue">' . $countTicketsAdminOpen . '</small></span>'; | |||||
} | |||||
} | } | ||||
$sumUserProducerCredits = $userProducerModule->sumUserProducerCredits(); | $sumUserProducerCredits = $userProducerModule->sumUserProducerCredits(); | ||||
$sumUserProducerCreditsLabel = ''; | $sumUserProducerCreditsLabel = ''; | ||||
//$sumUserProducerCreditsLabel = '<span class="pull-right-container"><small class="label pull-right '.($sumUserProducerCredits >= 0 ? 'bg-green' : 'bg-red') .'">'.number_format($sumUserProducerCredits, 2).' €</small></span>'; | //$sumUserProducerCreditsLabel = '<span class="pull-right-container"><small class="label pull-right '.($sumUserProducerCredits >= 0 ? 'bg-green' : 'bg-red') .'">'.number_format($sumUserProducerCredits, 2).' €</small></span>'; | ||||
$countUsersWithStatusProducerOnline = $userModule->getRepository()->countUsersStatusProducerOnline(); | |||||
$countUsersWithStatusUserOnline = $userModule->getRepository()->countUsersStatusUserOnline(); | |||||
$countUsersProducersOnlineLabel = ''; | |||||
if ($countUsersWithStatusProducerOnline || $countUsersWithStatusUserOnline) { | |||||
$countUsersProducersOnlineLabel = '<span class="pull-right-container"><small class="label pull-right bg-blue">' . ($countUsersWithStatusProducerOnline + $countUsersWithStatusUserOnline) . '</small></span>'; | |||||
} | |||||
$countProducerInvoicesUnpaidLabel = ''; | |||||
$countProducerInvoicesUnpaid = $this->getProducerModule()->getDolibarrUtils() | |||||
->countDolibarrProducerInvoicesUnpaid($producer); | |||||
if ($countProducerInvoicesUnpaid > 1) { | |||||
$countProducerInvoicesUnpaidLabelColor = ($countProducerInvoicesUnpaid > 2) ? 'red' : 'orange'; | |||||
$countProducerInvoicesUnpaidLabel = '<span class="pull-right-container"><small class="label pull-right bg-' . $countProducerInvoicesUnpaidLabelColor . '">' . $countProducerInvoicesUnpaid . '</small></span>'; | |||||
} | |||||
?> | ?> | ||||
<?= dmstr\widgets\Menu::widget( | <?= dmstr\widgets\Menu::widget( | ||||
[ | [ | ||||
'options' => ['class' => 'sidebar-menu tree', 'data-widget' => 'tree'], | 'options' => ['class' => 'sidebar-menu tree', 'data-widget' => 'tree'], | ||||
'items' => [ | 'items' => [ | ||||
// Administration | |||||
['label' => 'Administration', 'options' => ['class' => 'header'], 'visible' => $isUserCurrentGrantedAsAdministrator], | |||||
[ | |||||
'label' => 'Tableau de bord', | |||||
'icon' => 'dashboard', | |||||
'url' => ['dashboard-admin/index'], | |||||
'visible' => $isUserCurrentGrantedAsAdministrator, | |||||
], | |||||
[ | |||||
'label' => 'Support', | |||||
'icon' => 'comments', | |||||
'url' => ['support-admin/index'], | |||||
'visible' => $isUserCurrentGrantedAsAdministrator, | |||||
'template' => '<a href="{url}">{icon} {label}' . $countTicketsLabel . '</a>' | |||||
], | |||||
[ | |||||
'label' => 'Producteurs', | |||||
'icon' => 'bookmark', | |||||
'url' => ['/producer-admin/index'], | |||||
'visible' => $isUserCurrentGrantedAsAdministrator | |||||
], | |||||
[ | |||||
'label' => 'Utilisateurs', | |||||
'icon' => 'users', | |||||
'url' => ['/user-admin/index'], | |||||
'visible' => $isUserCurrentGrantedAsAdministrator | |||||
], | |||||
[ | |||||
'label' => 'Deliverabilité emails', | |||||
'icon' => 'paper-plane', | |||||
'url' => ['/user-admin/email-deliverability'], | |||||
'visible' => $isUserCurrentGrantedAsAdministrator | |||||
], | |||||
[ | |||||
'label' => 'Commandes', | |||||
'icon' => 'calendar', | |||||
'url' => ['order-admin/index'], | |||||
'visible' => $isUserCurrentGrantedAsAdministrator, | |||||
], | |||||
[ | |||||
'label' => 'Fonctionnalités', | |||||
'icon' => 'flag', | |||||
'url' => ['/feature-admin/index'], | |||||
'visible' => $isUserCurrentGrantedAsAdministrator | |||||
], | |||||
[ | |||||
'label' => 'Statistiques', | |||||
'icon' => 'line-chart', | |||||
'url' => ['/stats-admin/turnover'], | |||||
'visible' => $isUserCurrentGrantedAsAdministrator, | |||||
'items' => [ | |||||
['label' => 'Chiffre d\'affaire', 'icon' => 'line-chart', 'url' => ['/stats-admin/turnover'], 'visible' => $isUserCurrentGrantedAsAdministrator], | |||||
['label' => 'Commandes clients', 'icon' => 'line-chart', 'url' => ['/stats-admin/customer-orders'], 'visible' => $isUserCurrentGrantedAsAdministrator], | |||||
[ | |||||
'label' => 'En ligne', | |||||
'icon' => 'wifi', | |||||
'url' => ['online-admin/index'], | |||||
'visible' => $isUserCurrentGrantedAsAdministrator, | |||||
//'template' => '<a href="{url}">{icon} {label}' . $countUsersProducersOnlineLabel . '</a>' | |||||
], | |||||
['label' => 'Matomo', 'icon' => 'line-chart', 'url' => ['/stats-admin/matomo'], 'visible' => $isUserCurrentGrantedAsAdministrator], | |||||
], | |||||
], | |||||
[ | |||||
'label' => 'Configuration', | |||||
'icon' => 'cog', | |||||
'url' => ['/setting-admin/index'], | |||||
'visible' => $isUserCurrentGrantedAsAdministrator, | |||||
'items' => [ | |||||
['label' => 'Paramètres', 'icon' => 'cog', 'url' => ['/setting-admin/index'], 'visible' => $isUserCurrentGrantedAsAdministrator && $featureChecker->isEnabled(Feature::ALIAS_SETTINGS)], | |||||
['label' => 'Tranches de prix', 'icon' => 'eur', 'url' => ['/producer-price-range-admin/index'], 'visible' => $isUserCurrentGrantedAsAdministrator], | |||||
['label' => 'Taxes', 'icon' => 'eur', 'url' => ['/tax-rate-admin/index'], 'visible' => $isUserCurrentGrantedAsAdministrator], | |||||
], | |||||
], | |||||
// Support | |||||
['label' => "Besoin d'aide ?", 'options' => ['class' => 'header'], 'visible' => $isUserCurrentGrantedAsProducer], | ['label' => "Besoin d'aide ?", 'options' => ['class' => 'header'], 'visible' => $isUserCurrentGrantedAsProducer], | ||||
[ | [ | ||||
'label' => 'Support', | |||||
'label' => 'Support', | |||||
'icon' => 'comments', | 'icon' => 'comments', | ||||
'url' => ['support/index'], | 'url' => ['support/index'], | ||||
'visible' => $isUserCurrentGrantedAsProducer, | 'visible' => $isUserCurrentGrantedAsProducer, | ||||
'template' => '<a href="{url}">{icon} {label}' . $countTicketsProducerUnreadLabel . '</a>' | |||||
'template' => '<a href="{url}">{icon} {label} <span class="pull-right-container">' . $developerOnlineLabel . $countTicketsProducerUnreadLabel . '</span></a>' | |||||
], | ], | ||||
// Producteur | |||||
['label' => $producer->name, 'options' => ['class' => 'header'], 'visible' => $isUserCurrentGrantedAsProducer], | ['label' => $producer->name, 'options' => ['class' => 'header'], 'visible' => $isUserCurrentGrantedAsProducer], | ||||
['label' => 'Tableau de bord', 'icon' => 'dashboard', 'url' => ['/dashboard/index'], 'visible' => $isUserCurrentGrantedAsProducer], | ['label' => 'Tableau de bord', 'icon' => 'dashboard', 'url' => ['/dashboard/index'], 'visible' => $isUserCurrentGrantedAsProducer], | ||||
['label' => 'Distributions', 'icon' => 'calendar', 'url' => ['/distribution/index'], 'visible' => $isUserCurrentGrantedAsProducer], | ['label' => 'Distributions', 'icon' => 'calendar', 'url' => ['/distribution/index'], 'visible' => $isUserCurrentGrantedAsProducer], | ||||
'icon' => 'clone', | 'icon' => 'clone', | ||||
'url' => ['/product/index'], | 'url' => ['/product/index'], | ||||
'visible' => $isUserCurrentGrantedAsProducer, | 'visible' => $isUserCurrentGrantedAsProducer, | ||||
'active' => Yii::$app->controller->id == 'product', | |||||
'active' => Yii::$app->controller->id == 'product' || Yii::$app->controller->id == 'product-category' || Yii::$app->controller->id == 'accessory', | |||||
'items' => [ | 'items' => [ | ||||
['label' => 'Liste', 'icon' => 'th-list', 'url' => ['/product/index'], 'visible' => $isUserCurrentGrantedAsProducer], | ['label' => 'Liste', 'icon' => 'th-list', 'url' => ['/product/index'], 'visible' => $isUserCurrentGrantedAsProducer], | ||||
['label' => 'Catégories', 'icon' => 'book', 'url' => ['/product-category/index'], 'visible' => $isUserCurrentGrantedAsProducer], | ['label' => 'Catégories', 'icon' => 'book', 'url' => ['/product-category/index'], 'visible' => $isUserCurrentGrantedAsProducer], | ||||
['label' => 'Accessoires', 'icon' => 'cutlery', 'url' => ['/accessory/index'], 'visible' => $isUserCurrentGrantedAsProducer && $featureChecker->isEnabled(Feature::ALIAS_PRODUCT_ACCESSORY)], | |||||
['label' => 'Import prix', 'icon' => 'upload', 'url' => ['/product/price-import'], 'visible' => $isUserCurrentGrantedAsProducer && $featureChecker->isEnabled(Feature::ALIAS_PRODUCT_PRICE_IMPORT)], | ['label' => 'Import prix', 'icon' => 'upload', 'url' => ['/product/price-import'], 'visible' => $isUserCurrentGrantedAsProducer && $featureChecker->isEnabled(Feature::ALIAS_PRODUCT_PRICE_IMPORT)], | ||||
] | ] | ||||
], | ], | ||||
['label' => 'Points de vente', 'icon' => 'map-marker', 'url' => ['/point-sale/index'], 'visible' => $isUserCurrentGrantedAsProducer, 'active' => Yii::$app->controller->id == 'point-sale'], | |||||
[ | |||||
'label' => 'Points de vente', | |||||
'icon' => 'map-marker', | |||||
'url' => ['/point-sale/index'], | |||||
'visible' => $isUserCurrentGrantedAsProducer, | |||||
'active' => Yii::$app->controller->id == 'point-sale' || Yii::$app->controller->id == 'shared-point-sale', | |||||
'items' => [ | |||||
['label' => 'Liste', 'icon' => 'th-list', 'url' => ['/point-sale/index'], 'visible' => $isUserCurrentGrantedAsProducer], | |||||
['label' => 'Partages', 'icon' => 'share-alt', 'url' => ['/shared-point-sale/index'], 'visible' => $isUserCurrentGrantedAsProducer && $featureChecker->isEnabled(Feature::ALIAS_SHARED_POINT_SALE)], | |||||
] | |||||
], | |||||
[ | [ | ||||
'label' => 'Utilisateurs', | 'label' => 'Utilisateurs', | ||||
'icon' => 'users', | 'icon' => 'users', | ||||
'items' => [ | 'items' => [ | ||||
['label' => 'Liste', 'icon' => 'th-list', 'url' => ['/user/index'], 'visible' => $isUserCurrentGrantedAsProducer], | ['label' => 'Liste', 'icon' => 'th-list', 'url' => ['/user/index'], 'visible' => $isUserCurrentGrantedAsProducer], | ||||
[ | [ | ||||
'label' => 'Crédit', | |||||
'label' => 'Cagnotte', | |||||
'icon' => 'euro', | 'icon' => 'euro', | ||||
'url' => ['/credit/index'], | 'url' => ['/credit/index'], | ||||
'template' => '<a href="{url}">{icon} {label}' . $sumUserProducerCreditsLabel . '</a>', | 'template' => '<a href="{url}">{icon} {label}' . $sumUserProducerCreditsLabel . '</a>', | ||||
], | ], | ||||
], | ], | ||||
['label' => 'Abonnements', 'icon' => 'repeat', 'url' => ['/subscription/index'], 'visible' => $isUserCurrentGrantedAsProducer, 'active' => Yii::$app->controller->id == 'subscription'], | ['label' => 'Abonnements', 'icon' => 'repeat', 'url' => ['/subscription/index'], 'visible' => $isUserCurrentGrantedAsProducer, 'active' => Yii::$app->controller->id == 'subscription'], | ||||
['label' => 'Communiquer', 'icon' => 'bullhorn', 'url' => ['/communicate/index'], 'visible' => $isUserCurrentGrantedAsProducer], | |||||
[ | |||||
'label' => 'Communication', | |||||
'icon' => 'bullhorn', | |||||
'url' => ['/communicate/email'], | |||||
'visible' => $isUserCurrentGrantedAsProducer, | |||||
'items' => [ | |||||
['label' => 'Email', 'icon' => 'paper-plane', 'url' => ['/communicate/email'], 'visible' => $isUserCurrentGrantedAsProducer], | |||||
['label' => 'Email automatique', 'icon' => 'paper-plane-o', 'url' => ['/automatic-email/index'], 'visible' => $isUserCurrentGrantedAsProducer && $featureChecker->isEnabled(Feature::ALIAS_AUTOMATIC_EMAIL)], | |||||
['label' => 'Papier', 'icon' => 'print', 'url' => ['/communicate/paper'], 'visible' => $isUserCurrentGrantedAsProducer], | |||||
] | |||||
], | |||||
[ | [ | ||||
'label' => 'Documents', | 'label' => 'Documents', | ||||
'icon' => 'clone', | 'icon' => 'clone', | ||||
['label' => 'Chiffre d\'affaire', 'icon' => 'line-chart', 'url' => ['/stats/index'], 'visible' => $isUserCurrentGrantedAsProducer], | ['label' => 'Chiffre d\'affaire', 'icon' => 'line-chart', 'url' => ['/stats/index'], 'visible' => $isUserCurrentGrantedAsProducer], | ||||
['label' => 'Rapports', 'icon' => 'pencil-square-o', 'url' => ['/report/index'], 'visible' => $isUserCurrentGrantedAsProducer], | ['label' => 'Rapports', 'icon' => 'pencil-square-o', 'url' => ['/report/index'], 'visible' => $isUserCurrentGrantedAsProducer], | ||||
['label' => 'Produits', 'icon' => 'table', 'url' => ['/stats/products'], 'visible' => $isUserCurrentGrantedAsProducer], | ['label' => 'Produits', 'icon' => 'table', 'url' => ['/stats/products'], 'visible' => $isUserCurrentGrantedAsProducer], | ||||
['label' => 'Export paiements', 'icon' => 'euro', 'url' => ['/report/payments'], 'visible' => $isUserCurrentGrantedAsProducer], | |||||
], | ], | ||||
], | ], | ||||
['label' => 'Paramètres', 'icon' => 'cog', 'url' => ['/producer/update'], 'visible' => $isUserCurrentGrantedAsProducer], | ['label' => 'Paramètres', 'icon' => 'cog', 'url' => ['/producer/update'], 'visible' => $isUserCurrentGrantedAsProducer], | ||||
['label' => 'Accès', 'icon' => 'lock', 'url' => ['/access/index'], 'visible' => $isUserCurrentGrantedAsProducer], | ['label' => 'Accès', 'icon' => 'lock', 'url' => ['/access/index'], 'visible' => $isUserCurrentGrantedAsProducer], | ||||
['label' => "Opendistrib", 'options' => ['class' => 'header'], 'visible' => $isUserCurrentGrantedAsProducer], | |||||
['label' => "Souke", 'options' => ['class' => 'header'], 'visible' => $isUserCurrentGrantedAsProducer], | |||||
[ | [ | ||||
'label' => 'Mes factures', | 'label' => 'Mes factures', | ||||
'icon' => 'clone', | 'icon' => 'clone', | ||||
'url' => ['/producer-invoice/index'], | 'url' => ['/producer-invoice/index'], | ||||
'visible' => $isUserCurrentGrantedAsProducer && Yii::$app->parameterBag->get('dolibarrApiKey'), | 'visible' => $isUserCurrentGrantedAsProducer && Yii::$app->parameterBag->get('dolibarrApiKey'), | ||||
'active' => Yii::$app->controller->id == 'producer-invoice', | 'active' => Yii::$app->controller->id == 'producer-invoice', | ||||
'template' => '<a href="{url}">{icon} {label}' . $countProducerInvoicesUnpaidLabel . '</a>' | |||||
], | ], | ||||
['label' => 'Tarifs & modules', 'icon' => 'euro', 'url' => ['/producer/billing'], 'visible' => $isUserCurrentGrantedAsProducer], | ['label' => 'Tarifs & modules', 'icon' => 'euro', 'url' => ['/producer/billing'], 'visible' => $isUserCurrentGrantedAsProducer], | ||||
[ | |||||
'label' => 'Parrainage', | |||||
'icon' => 'users', | |||||
'url' => ['/sponsorship/index'], | |||||
'visible' => $isUserCurrentGrantedAsProducer && $featureChecker->isEnabled(Feature::ALIAS_SPONSORSHIP), | |||||
'active' => Yii::$app->controller->id == 'sponsorship' | |||||
], | |||||
[ | [ | ||||
'label' => 'Développement', | 'label' => 'Développement', | ||||
'icon' => 'code', | 'icon' => 'code', | ||||
'url' => ['/development/index'], | 'url' => ['/development/index'], | ||||
'visible' => $isUserCurrentGrantedAsProducer, | 'visible' => $isUserCurrentGrantedAsProducer, | ||||
'active' => Yii::$app->controller->id == 'development', | 'active' => Yii::$app->controller->id == 'development', | ||||
'template' => '<a href="{url}">{icon} {label}' . $newVersionOpendistribLabel . '</a>' | |||||
], | |||||
['label' => 'Administration', 'options' => ['class' => 'header'], 'visible' => $isUserCurrentGrantedAsAdministrator], | |||||
[ | |||||
'label' => 'Tickets', | |||||
'icon' => 'comments', | |||||
'url' => ['support-admin/index'], | |||||
'visible' => $isUserCurrentGrantedAsAdministrator, | |||||
'template' => '<a href="{url}">{icon} {label}' . $countTicketsAdminUnreadLabel . '</a>' | |||||
'template' => '<a href="{url}">{icon} {label}' . $versionOpendistribLabel . '</a>' | |||||
], | ], | ||||
['label' => 'Producteurs', 'icon' => 'th-list', 'url' => ['/producer-admin/index'], 'visible' => $isUserCurrentGrantedAsAdministrator], | |||||
[ | |||||
'label' => 'Statistiques', | |||||
'icon' => 'line-chart', | |||||
'url' => ['/stats-admin/matomo'], | |||||
'visible' => $isUserCurrentGrantedAsAdministrator, | |||||
'items' => [ | |||||
['label' => 'Matomo', 'icon' => 'line-chart', 'url' => ['/stats-admin/matomo'], 'visible' => $isUserCurrentGrantedAsAdministrator], | |||||
['label' => 'Chiffre d\'affaire', 'icon' => 'line-chart', 'url' => ['/stats-admin/turnover'], 'visible' => $isUserCurrentGrantedAsAdministrator], | |||||
['label' => 'Commandes clients', 'icon' => 'calendar', 'url' => ['/stats-admin/customer-orders'], 'visible' => $isUserCurrentGrantedAsAdministrator], | |||||
], | |||||
], | |||||
['label' => 'Paramètres', 'icon' => 'cog', 'url' => ['/setting-admin/index'], 'visible' => $isUserCurrentGrantedAsAdministrator && $featureChecker->isEnabled(Feature::ALIAS_SETTINGS)], | |||||
['label' => 'Fonctionnalités', 'icon' => 'flag', 'url' => ['/feature-admin/index'], 'visible' => $isUserCurrentGrantedAsAdministrator], | |||||
['label' => 'Tranches de prix', 'icon' => 'eur', 'url' => ['/producer-price-range-admin/index'], 'visible' => $isUserCurrentGrantedAsAdministrator], | |||||
['label' => 'Taxes', 'icon' => 'eur', 'url' => ['/tax-rate-admin/index'], 'visible' => $isUserCurrentGrantedAsAdministrator], | |||||
['label' => 'Communiquer', 'icon' => 'bullhorn', 'url' => ['/communicate-admin/index'], 'visible' => $isUserCurrentGrantedAsAdministrator], | |||||
//['label' => 'Communiquer', 'icon' => 'bullhorn', 'url' => ['/communicate-admin/index'], 'visible' => $isUserCurrentGrantedAsAdministrator], | |||||
//['label' => 'Outils', 'options' => ['class' => 'header'], 'visible' => $isUserCurrentGrantedAsAdministrator], | //['label' => 'Outils', 'options' => ['class' => 'header'], 'visible' => $isUserCurrentGrantedAsAdministrator], | ||||
//['label' => 'Gii', 'icon' => 'file-code-o', 'url' => ['/gii'], 'visible' => $isUserCurrentGrantedAsAdministrator], | //['label' => 'Gii', 'icon' => 'file-code-o', 'url' => ['/gii'], 'visible' => $isUserCurrentGrantedAsAdministrator], | ||||
//['label' => 'Debug', 'icon' => 'dashboard', 'url' => ['/debug'], 'visible' => $isUserCurrentGrantedAsAdministrator], | //['label' => 'Debug', 'icon' => 'dashboard', 'url' => ['/debug'], 'visible' => $isUserCurrentGrantedAsAdministrator], | ||||
['label' => 'Login', 'url' => ['site/login'], 'visible' => !$userModule->isCurrentConnected()], | |||||
//['label' => 'Login', 'url' => ['site/login'], 'visible' => !$userModule->isCurrentConnected()], | |||||
], | ], | ||||
] | ] | ||||
) ?> | ) ?> | ||||
</section> | </section> | ||||
</aside> | </aside> |
<?php | <?php | ||||
/** | /** | ||||
Copyright distrib (2018) | |||||
Copyright Souke (2018) | |||||
contact@opendistrib.net | |||||
contact@souke.fr | |||||
Ce logiciel est un programme informatique servant à aider les producteurs | Ce logiciel est un programme informatique servant à aider les producteurs | ||||
à distribuer leur production en circuits courts. | à distribuer leur production en circuits courts. |