<?php | <?php | ||||
/** | /** | ||||
Copyright La boîte à pain (2018) | |||||
Copyright distrib (2018) | |||||
contact@laboiteapain.net | |||||
contact@opendistrib.net | |||||
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 | |||||
/** | |||||
Copyright distrib (2018) | |||||
contact@opendistrib.net | |||||
Ce logiciel est un programme informatique servant à aider les producteurs | |||||
à distribuer leur production en circuits courts. | |||||
Ce logiciel est régi par la licence CeCILL soumise au droit français et | |||||
respectant les principes de diffusion des logiciels libres. Vous pouvez | |||||
utiliser, modifier et/ou redistribuer ce programme sous les conditions | |||||
de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA | |||||
sur le site "http://www.cecill.info". | |||||
En contrepartie de l'accessibilité au code source et des droits de copie, | |||||
de modification et de redistribution accordés par cette licence, il n'est | |||||
offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons, | |||||
seule une responsabilité restreinte pèse sur l'auteur du programme, le | |||||
titulaire des droits patrimoniaux et les concédants successifs. | |||||
A cet égard l'attention de l'utilisateur est attirée sur les risques | |||||
associés au chargement, à l'utilisation, à la modification et/ou au | |||||
développement et à la reproduction du logiciel par l'utilisateur étant | |||||
donné sa spécificité de logiciel libre, qui peut le rendre complexe à | |||||
manipuler et qui le réserve donc à des développeurs et des professionnels | |||||
avertis possédant des connaissances informatiques approfondies. Les | |||||
utilisateurs sont donc invités à charger et tester l'adéquation du | |||||
logiciel à leurs besoins dans des conditions permettant d'assurer la | |||||
sécurité de leurs systèmes et ou de leurs données et, plus généralement, | |||||
à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. | |||||
Le fait que vous puissiez accéder à cet en-tête signifie que vous avez | |||||
pris connaissance de la licence CeCILL, et que vous en avez accepté les | |||||
termes. | |||||
*/ | |||||
namespace backend\assets; | |||||
use yii\web\AssetBundle; | |||||
use yii ; | |||||
/** | |||||
* @author Qiang Xue <qiang.xue@gmail.com> | |||||
* @since 2.0 | |||||
*/ | |||||
class VuejsDistributionIndexAsset extends \common\components\MyAssetBundle | |||||
{ | |||||
public $basePath = '@webroot'; | |||||
public $baseUrl = '@web'; | |||||
public $css = []; | |||||
public $js = []; | |||||
public $depends = [ | |||||
'common\assets\CommonAsset' | |||||
]; | |||||
public function __construct() | |||||
{ | |||||
parent::__construct() ; | |||||
$this->addAsset('js','js/vuejs/distribution-index.js') ; | |||||
} | |||||
} |
<?php | |||||
/** | |||||
Copyright distrib (2018) | |||||
contact@opendistrib.net | |||||
Ce logiciel est un programme informatique servant à aider les producteurs | |||||
à distribuer leur production en circuits courts. | |||||
Ce logiciel est régi par la licence CeCILL soumise au droit français et | |||||
respectant les principes de diffusion des logiciels libres. Vous pouvez | |||||
utiliser, modifier et/ou redistribuer ce programme sous les conditions | |||||
de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA | |||||
sur le site "http://www.cecill.info". | |||||
En contrepartie de l'accessibilité au code source et des droits de copie, | |||||
de modification et de redistribution accordés par cette licence, il n'est | |||||
offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons, | |||||
seule une responsabilité restreinte pèse sur l'auteur du programme, le | |||||
titulaire des droits patrimoniaux et les concédants successifs. | |||||
A cet égard l'attention de l'utilisateur est attirée sur les risques | |||||
associés au chargement, à l'utilisation, à la modification et/ou au | |||||
développement et à la reproduction du logiciel par l'utilisateur étant | |||||
donné sa spécificité de logiciel libre, qui peut le rendre complexe à | |||||
manipuler et qui le réserve donc à des développeurs et des professionnels | |||||
avertis possédant des connaissances informatiques approfondies. Les | |||||
utilisateurs sont donc invités à charger et tester l'adéquation du | |||||
logiciel à leurs besoins dans des conditions permettant d'assurer la | |||||
sécurité de leurs systèmes et ou de leurs données et, plus généralement, | |||||
à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. | |||||
Le fait que vous puissiez accéder à cet en-tête signifie que vous avez | |||||
pris connaissance de la licence CeCILL, et que vous en avez accepté les | |||||
termes. | |||||
*/ | |||||
namespace backend\assets; | |||||
use yii\web\AssetBundle; | |||||
use yii ; | |||||
/** | |||||
* @author Qiang Xue <qiang.xue@gmail.com> | |||||
* @since 2.0 | |||||
*/ | |||||
class VuejsProducerUpdateAsset extends \common\components\MyAssetBundle | |||||
{ | |||||
public $basePath = '@webroot'; | |||||
public $baseUrl = '@web'; | |||||
public $css = []; | |||||
public $js = []; | |||||
public $depends = [ | |||||
'common\assets\CommonAsset' | |||||
]; | |||||
public function __construct() | |||||
{ | |||||
parent::__construct() ; | |||||
$this->addAsset('js','js/vuejs/producer-update.js') ; | |||||
} | |||||
} |
<?php | <?php | ||||
/** | /** | ||||
Copyright La boîte à pain (2018) | |||||
Copyright distrib (2018) | |||||
contact@laboiteapain.net | |||||
contact@opendistrib.net | |||||
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. | ||||
return [ | return [ | ||||
'id' => 'app-backend', | 'id' => 'app-backend', | ||||
'name' => 'distrib', | |||||
'basePath' => dirname(__DIR__), | 'basePath' => dirname(__DIR__), | ||||
'controllerNamespace' => 'backend\controllers', | 'controllerNamespace' => 'backend\controllers', | ||||
'defaultRoute' => 'site/index', | 'defaultRoute' => 'site/index', | ||||
'errorAction' => 'site/error', | 'errorAction' => 'site/error', | ||||
], | ], | ||||
'urlManager' => $common_config_main['components']['urlManagerBackend'], | 'urlManager' => $common_config_main['components']['urlManagerBackend'], | ||||
'assetManager' => [ | |||||
'bundles' => [ | |||||
'dmstr\web\AdminLteAsset' => [ | |||||
'skin' => 'skin-black', | |||||
], | |||||
], | |||||
], | |||||
'view' => [ | |||||
'class' => 'common\components\MyView', | |||||
], | |||||
], | ], | ||||
'params' => $params, | 'params' => $params, | ||||
]; | ]; |
<?php | <?php | ||||
/** | /** | ||||
Copyright La boîte à pain (2018) | |||||
Copyright distrib (2018) | |||||
contact@laboiteapain.net | |||||
contact@opendistrib.net | |||||
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. | ||||
*/ | */ | ||||
return [ | return [ | ||||
'adminEmail' => 'contact@laboiteapain.net', | |||||
'adminEmail' => 'contact@opendistrib.net', | |||||
]; | ]; |
<?php | <?php | ||||
/** | /** | ||||
Copyright La boîte à pain (2018) | |||||
Copyright distrib (2018) | |||||
contact@laboiteapain.net | |||||
contact@opendistrib.net | |||||
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\models\Producer ; | |||||
class BackendController extends \common\controllers\CommonController | class BackendController extends \common\controllers\CommonController | ||||
{ | { | ||||
} | } | ||||
?> | ?> |
<?php | |||||
/** | |||||
Copyright La boîte à pain (2018) | |||||
contact@laboiteapain.net | |||||
Ce logiciel est un programme informatique servant à aider les producteurs | |||||
à distribuer leur production en circuits courts. | |||||
Ce logiciel est régi par la licence CeCILL soumise au droit français et | |||||
respectant les principes de diffusion des logiciels libres. Vous pouvez | |||||
utiliser, modifier et/ou redistribuer ce programme sous les conditions | |||||
de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA | |||||
sur le site "http://www.cecill.info". | |||||
En contrepartie de l'accessibilité au code source et des droits de copie, | |||||
de modification et de redistribution accordés par cette licence, il n'est | |||||
offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons, | |||||
seule une responsabilité restreinte pèse sur l'auteur du programme, le | |||||
titulaire des droits patrimoniaux et les concédants successifs. | |||||
A cet égard l'attention de l'utilisateur est attirée sur les risques | |||||
associés au chargement, à l'utilisation, à la modification et/ou au | |||||
développement et à la reproduction du logiciel par l'utilisateur étant | |||||
donné sa spécificité de logiciel libre, qui peut le rendre complexe à | |||||
manipuler et qui le réserve donc à des développeurs et des professionnels | |||||
avertis possédant des connaissances informatiques approfondies. Les | |||||
utilisateurs sont donc invités à charger et tester l'adéquation du | |||||
logiciel à leurs besoins dans des conditions permettant d'assurer la | |||||
sécurité de leurs systèmes et ou de leurs données et, plus généralement, | |||||
à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. | |||||
Le fait que vous puissiez accéder à cet en-tête signifie que vous avez | |||||
pris connaissance de la licence CeCILL, et que vous en avez accepté les | |||||
termes. | |||||
*/ | |||||
/** | |||||
Copyright La boîte à pain (2018) | |||||
contact@laboiteapain.net | |||||
Ce logiciel est un programme informatique servant à aider les producteurs | |||||
à distribuer leur production en circuits courts. | |||||
Ce logiciel est régi par la licence CeCILL soumise au droit français et | |||||
respectant les principes de diffusion des logiciels libres. Vous pouvez | |||||
utiliser, modifier et/ou redistribuer ce programme sous les conditions | |||||
de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA | |||||
sur le site "http://www.cecill.info". | |||||
En contrepartie de l'accessibilité au code source et des droits de copie, | |||||
de modification et de redistribution accordés par cette licence, il n'est | |||||
offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons, | |||||
seule une responsabilité restreinte pèse sur l'auteur du programme, le | |||||
titulaire des droits patrimoniaux et les concédants successifs. | |||||
A cet égard l'attention de l'utilisateur est attirée sur les risques | |||||
associés au chargement, à l'utilisation, à la modification et/ou au | |||||
développement et à la reproduction du logiciel par l'utilisateur étant | |||||
donné sa spécificité de logiciel libre, qui peut le rendre complexe à | |||||
manipuler et qui le réserve donc à des développeurs et des professionnels | |||||
avertis possédant des connaissances informatiques approfondies. Les | |||||
utilisateurs sont donc invités à charger et tester l'adéquation du | |||||
logiciel à leurs besoins dans des conditions permettant d'assurer la | |||||
sécurité de leurs systèmes et ou de leurs données et, plus généralement, | |||||
à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. | |||||
Le fait que vous puissiez accéder à cet en-tête signifie que vous avez | |||||
pris connaissance de la licence CeCILL, et que vous en avez accepté les | |||||
termes. | |||||
*/ | |||||
namespace backend\controllers; | |||||
class CommandeautoController extends BackendController | |||||
{ | |||||
var $enableCsrfValidation = false; | |||||
public function behaviors() | |||||
{ | |||||
return [ | |||||
'access' => [ | |||||
'class' => AccessControl::className(), | |||||
'rules' => [ | |||||
[ | |||||
'allow' => true, | |||||
'roles' => ['@'], | |||||
'matchCallback' => function ($rule, $action) { | |||||
return Yii::$app->user->identity->status == USER::STATUS_ADMIN || Yii::$app->user->identity->status == USER::STATUS_BOULANGER; | |||||
} | |||||
] | |||||
], | |||||
], | |||||
]; | |||||
} | |||||
/** | |||||
* Liste les commandes récurrente du producteur. | |||||
* | |||||
* @return string | |||||
*/ | |||||
public function actionIndex() | |||||
{ | |||||
$dataProvider = new ActiveDataProvider([ | |||||
'query' => CommandeAuto::find() | |||||
->with(['user', 'etablissement', 'pointVente', 'commandeAutoProduit']) | |||||
->joinWith(['user']) | |||||
->where(['commande_auto.id_etablissement' => Yii::$app->user->identity->id_etablissement]) | |||||
->orderBy('commande_auto.id_point_vente ASC, CASE `commande_auto`.`username` WHEN "" THEN `user`.`nom` ELSE `commande_auto`.`username` END ASC'), | |||||
'pagination' => [ | |||||
'pageSize' => 1000, | |||||
], | |||||
]); | |||||
return $this->render('index', [ | |||||
'dataProvider' => $dataProvider | |||||
]); | |||||
} | |||||
/** | |||||
* Crée une commande récurrente. | |||||
* | |||||
* @return string | |||||
*/ | |||||
public function actionCreate() | |||||
{ | |||||
// form | |||||
$model = new CommandeAutoForm; | |||||
$model->id_etablissement = Yii::$app->user->identity->id_etablissement; | |||||
// produits | |||||
$produits = Produit::find() | |||||
->where(['id_etablissement' => $model->id_etablissement]) | |||||
->orderBy('order ASC') | |||||
->all(); | |||||
if ($model->load(Yii::$app->request->post()) && $model->validate() | |||||
&& $model->save()) | |||||
{ | |||||
$this->redirect(['commandeauto/index']); | |||||
} | |||||
return $this->render('create', [ | |||||
'model' => $model, | |||||
'produits' => $produits | |||||
]); | |||||
} | |||||
/** | |||||
* Modifie une commande récurrente. | |||||
* | |||||
* @param integer $id | |||||
* @return string | |||||
* @throws NotFoundHttpException | |||||
*/ | |||||
public function actionUpdate($id) | |||||
{ | |||||
// form | |||||
$model = new CommandeAutoForm; | |||||
$commandeauto = CommandeAuto::findOne($id); | |||||
if ($commandeauto) { | |||||
$model->id = $id; | |||||
$model->id_etablissement = $commandeauto->id_etablissement; | |||||
$model->id_user = $commandeauto->id_user; | |||||
$model->username = $commandeauto->username; | |||||
$model->id_point_vente = $commandeauto->id_point_vente; | |||||
$model->date_debut = date('d/m/Y', strtotime($commandeauto->date_debut)); | |||||
if (strlen($commandeauto->date_fin)) | |||||
$model->date_fin = date('d/m/Y', strtotime($commandeauto->date_fin)); | |||||
$model->lundi = $commandeauto->lundi; | |||||
$model->lundi = $commandeauto->lundi; | |||||
$model->mardi = $commandeauto->mardi; | |||||
$model->mercredi = $commandeauto->mercredi; | |||||
$model->jeudi = $commandeauto->jeudi; | |||||
$model->vendredi = $commandeauto->vendredi; | |||||
$model->samedi = $commandeauto->samedi; | |||||
$model->dimanche = $commandeauto->dimanche; | |||||
$model->paiement_automatique = $commandeauto->paiement_automatique; | |||||
$model->periodicite_semaine = $commandeauto->periodicite_semaine; | |||||
// produits | |||||
$commandeauto_produits = CommandeAutoProduit::find()->where(['id_commande_auto' => $model->id])->all(); | |||||
foreach ($commandeauto_produits as $commandeauto_produit) { | |||||
$model->produits['produit_' . $commandeauto_produit->id_produit] = $commandeauto_produit->quantite; | |||||
} | |||||
} else { | |||||
throw new NotFoundHttpException('La commande récurrente est introuvable.', 404); | |||||
} | |||||
// produits | |||||
$produits = Produit::find() | |||||
->where(['id_etablissement' => $model->id_etablissement]) | |||||
->orderBy('order ASC') | |||||
->all(); | |||||
if ($model->load(Yii::$app->request->post()) && $model->validate()) { | |||||
if (!strlen($model->date_fin)) { | |||||
$model->date_fin = null; | |||||
} | |||||
if ($model->save()) { | |||||
$this->redirect(['commandeauto/index']); | |||||
} | |||||
} | |||||
return $this->render('update', [ | |||||
'model' => $model, | |||||
'produits' => $produits | |||||
]); | |||||
} | |||||
/** | |||||
* Supprime une commande récurrente. | |||||
* | |||||
* @param integer $id | |||||
*/ | |||||
public function actionDelete($id) | |||||
{ | |||||
CommandeAutoProduit::deleteAll(['id_commande_auto' => $id]); | |||||
CommandeAuto::findOne($id)->delete(); | |||||
$this->redirect(['commandeauto/index']); | |||||
} | |||||
} |
<?php | <?php | ||||
/** | /** | ||||
Copyright La boîte à pain (2018) | |||||
Copyright distrib (2018) | |||||
contact@laboiteapain.net | |||||
contact@opendistrib.net | |||||
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\models\Producer ; | |||||
use common\models\User ; | |||||
/** | /** | ||||
* UserController implements the CRUD actions for User model. | * UserController implements the CRUD actions for User model. | ||||
*/ | */ | ||||
class CommuniquerController extends BackendController | |||||
class CommunicateController extends BackendController | |||||
{ | { | ||||
public function behaviors() { | public function behaviors() { | ||||
'allow' => true, | 'allow' => true, | ||||
'roles' => ['@'], | 'roles' => ['@'], | ||||
'matchCallback' => function ($rule, $action) { | 'matchCallback' => function ($rule, $action) { | ||||
return Yii::$app->user->identity->status == USER::STATUS_ADMIN || Yii::$app->user->identity->status == USER::STATUS_BOULANGER; | |||||
return User::hasAccessBackend(); | |||||
} | } | ||||
] | ] | ||||
], | ], | ||||
*/ | */ | ||||
public function actionIndex() | public function actionIndex() | ||||
{ | { | ||||
$etablissement = Etablissement::findOne(['id' => Yii::$app->user->identity->id_etablissement]); | |||||
$producer = Producer::searchOne() ; | |||||
return $this->render('index', [ | return $this->render('index', [ | ||||
'etablissement' => $etablissement, | |||||
'producer' => $producer, | |||||
]); | ]); | ||||
} | } | ||||
* | * | ||||
* @return string | * @return string | ||||
*/ | */ | ||||
public function actionModeemploi() | |||||
public function actionInstructions() | |||||
{ | { | ||||
$etablissement = Etablissement::findOne(['id' => Yii::$app->user->identity->id_etablissement]); | |||||
$producer = Producer::searchOne() ; | |||||
// get your HTML raw content without any layouts or scripts | // get your HTML raw content without any layouts or scripts | ||||
$content = $this->renderPartial('mode_emploi_multi', [ | |||||
$content = $this->renderPartial('instructions_multi', [ | |||||
'pdf' => true, | 'pdf' => true, | ||||
'etablissement' => $etablissement | |||||
'producer' => $producer | |||||
]); | ]); | ||||
$pdf = new Pdf([ | $pdf = new Pdf([ |
<?php | <?php | ||||
/** | /** | ||||
Copyright La boîte à pain (2018) | |||||
Copyright distrib (2018) | |||||
contact@laboiteapain.net | |||||
contact@opendistrib.net | |||||
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\filters\VerbFilter; | use yii\filters\VerbFilter; | ||||
use yii\filters\AccessControl; | use yii\filters\AccessControl; | ||||
use kartik\mpdf\Pdf; | use kartik\mpdf\Pdf; | ||||
use common\models\Etablissement; | |||||
use common\models\Commande; | |||||
use common\models\CommandeAuto; | |||||
use common\models\Production; | |||||
use common\models\Producer; | |||||
use common\models\Order; | |||||
use common\models\Subscription; | |||||
use common\models\Distribution; | |||||
use common\models\CreditHistory ; | |||||
/** | /** | ||||
* UserController implements the CRUD actions for User model. | * UserController implements the CRUD actions for User model. | ||||
*/ | */ | ||||
class CronController extends BackendController | class CronController extends BackendController | ||||
{ | { | ||||
public function behaviors() | public function behaviors() | ||||
{ | { | ||||
return [ | return [ | ||||
* | * | ||||
* @param string $key | * @param string $key | ||||
*/ | */ | ||||
public function actionInitBddDemo($key = '') | |||||
public function actionInitDatabaseDemo($key = '') | |||||
{ | { | ||||
if ($key == '45432df6e842ac71aa0b5bb6b9f25d44' && YII_ENV == 'demo') { | if ($key == '45432df6e842ac71aa0b5bb6b9f25d44' && YII_ENV == 'demo') { | ||||
$arr_noms = [ | |||||
$arrayLastnames = [ | |||||
'Martin', 'Bernard', 'Thomas', 'Petit', 'Robert', 'Richard', 'Durand', 'Dubois', | 'Martin', 'Bernard', 'Thomas', 'Petit', 'Robert', 'Richard', 'Durand', 'Dubois', | ||||
'Moreau', 'Laurent', 'Simon', 'Michel', 'Lefebvre', 'Leroy', 'Roux', 'David', | 'Moreau', 'Laurent', 'Simon', 'Michel', 'Lefebvre', 'Leroy', 'Roux', 'David', | ||||
'Bertrand', 'Morel', 'Fournier', 'Girard', 'Bonnet', 'Dupont', 'Lambert', 'Fontaine', | 'Bertrand', 'Morel', 'Fournier', 'Girard', 'Bonnet', 'Dupont', 'Lambert', 'Fontaine', | ||||
'Poulain', 'Girondin', 'Gillet', 'Guichard' | 'Poulain', 'Girondin', 'Gillet', 'Guichard' | ||||
]; | ]; | ||||
$arr_prenoms = [ | |||||
$arrayNames = [ | |||||
'Adel', 'Antonin', 'Armand', 'Arnaud', 'Aymeric', 'Baptiste', 'Barnabé', 'Bernard', 'Brice', 'Baudouin', | 'Adel', 'Antonin', 'Armand', 'Arnaud', 'Aymeric', 'Baptiste', 'Barnabé', 'Bernard', 'Brice', 'Baudouin', | ||||
'Camille', 'Cassandre', 'Célestin', 'Christian', 'Clément', 'Cyril', 'Claude', 'Damien', 'Daniel', 'David', | 'Camille', 'Cassandre', 'Célestin', 'Christian', 'Clément', 'Cyril', 'Claude', 'Damien', 'Daniel', 'David', | ||||
'Delphin', 'Denis', 'Didier', 'Dimitri', 'Dorothée', 'Désiré', 'Edgard', 'Etienne', 'Eugène', 'Eudes', 'Eric', | 'Delphin', 'Denis', 'Didier', 'Dimitri', 'Dorothée', 'Désiré', 'Edgard', 'Etienne', 'Eugène', 'Eudes', 'Eric', | ||||
'Rose', 'Roseline', 'Renée', 'Sabine', 'Sophie', 'Suzanne', 'Sylvie', 'Thérèse', | 'Rose', 'Roseline', 'Renée', 'Sabine', 'Sophie', 'Suzanne', 'Sylvie', 'Thérèse', | ||||
]; | ]; | ||||
$arr_noms_checked = []; | |||||
$arr_prenoms_checked = []; | |||||
$arrayNamesChecked = []; | |||||
$arrayLastnameschecked = []; | |||||
$users = User::find() | |||||
->joinWith('userEtablissement') | |||||
->where('user_etablissement.id_etablissement = 1') | |||||
->all(); | |||||
$users = User::searchAll([ | |||||
'user_producer.id_producer' => 1 | |||||
]) ; | |||||
foreach ($users as $u) { | foreach ($users as $u) { | ||||
if ($u->email != 'boulanger@laboiteapain.net') { | |||||
if ($u->email != 'producer@opendistrib.net') { | |||||
do { | do { | ||||
$i_nom = rand(0, count($arr_noms) - 1); | |||||
$i_prenom = rand(0, count($arr_prenoms) - 1); | |||||
} while (isset($arr_noms_checked[$i_nom]) || isset($arr_prenoms_checked[$i_prenom])); | |||||
$indexLastname = rand(0, count($arrayLastnames) - 1); | |||||
$indexName = rand(0, count($arrayNames) - 1); | |||||
} while (isset($arrayLastnameschecked[$i_nom]) || isset($arrayNamesChecked[$i_prenom])); | |||||
$arr_noms_checked[$i_nom] = true; | |||||
$arr_prenoms_checked[$i_prenom] = true; | |||||
$arrayLastnameschecked[$i_nom] = true; | |||||
$arrayNamesChecked[$i_prenom] = true; | |||||
$nom = $arr_noms[$i_nom]; | |||||
$prenom = $arr_prenoms[$i_prenom]; | |||||
$lastname = $arrayLastnameschecked[$indexLastname]; | |||||
$name = $arrayNamesChecked[$indexName]; | |||||
$u->nom = $nom; | |||||
$u->prenom = $prenom; | |||||
$u->name = $name; | |||||
$u->lastname = $lastname; | |||||
$email = strtolower($prenom) . '.' . strtolower($nom) . '@yopmail.com'; | |||||
$email = strtolower($name) . '.' . strtolower($lastname) . '@yopmail.com'; | |||||
$email = htmlentities($email, ENT_NOQUOTES, 'utf-8'); | $email = htmlentities($email, ENT_NOQUOTES, 'utf-8'); | ||||
$email = preg_replace('#&([A-za-z])(?:acute|cedil|caron|circ|grave|orn|ring|slash|th|tilde|uml);#', '\1', $email); | $email = preg_replace('#&([A-za-z])(?:acute|cedil|caron|circ|grave|orn|ring|slash|th|tilde|uml);#', '\1', $email); | ||||
$email = preg_replace('#&([A-za-z]{2})(?:lig);#', '\1', $email); // pour les ligatures e.g. 'œ' | $email = preg_replace('#&([A-za-z]{2})(?:lig);#', '\1', $email); // pour les ligatures e.g. 'œ' | ||||
$u->save(); | $u->save(); | ||||
} | } | ||||
$commandes = Commande::find() | |||||
$arrayOrders = Order::find() | |||||
->where('username IS NOT NULL') | ->where('username IS NOT NULL') | ||||
->all(); | ->all(); | ||||
foreach ($commandes as $c) { | |||||
$nom = $arr_noms[rand(0, count($arr_noms) - 1)]; | |||||
$prenom = $arr_prenoms[rand(0, count($arr_prenoms) - 1)]; | |||||
foreach ($arrayOrders as $order) { | |||||
$lastname = $arrayLastnames[rand(0, count($arrayLastnames) - 1)]; | |||||
$name = $arrayNames[rand(0, count($arrayNames) - 1)]; | |||||
$c->username = $prenom . ' ' . $nom; | |||||
$c->username = $name . ' ' . $lastname; | |||||
$c->save(); | $c->save(); | ||||
} | } | ||||
$commandes_auto = CommandeAuto::find() | |||||
->where('username IS NOT NULL') | |||||
->all(); | |||||
foreach ($commandes_auto as $c) { | |||||
$nom = $arr_noms[rand(0, count($arr_noms) - 1)]; | |||||
$prenom = $arr_prenoms[rand(0, count($arr_prenoms) - 1)]; | |||||
$c->username = $prenom . ' ' . $nom; | |||||
$arraySubscription = Subscription::find() | |||||
->where('username IS NOT NULL') | |||||
->all(); | |||||
foreach ($arraySubscription as $subscription) { | |||||
$lastname = $arrayLastnames[rand(0, count($arrayLastnames) - 1)]; | |||||
$name = $arrayNames[rand(0, count($arrayNames) - 1)]; | |||||
$c->username = $name . ' ' . $lastname; | |||||
$c->save(); | $c->save(); | ||||
} | } | ||||
} | } | ||||
* @param string $key | * @param string $key | ||||
* @param string $force_date | * @param string $force_date | ||||
*/ | */ | ||||
public function actionProcessCommandes($key = '', $force_date = '') | |||||
public function actionProcessOrders($key = '', $forceDate = '') | |||||
{ | { | ||||
if ($key == '64ac0bdab7e9f5e48c4d991ec5201d57') { | if ($key == '64ac0bdab7e9f5e48c4d991ec5201d57') { | ||||
if(strlen($force_date)) { | |||||
$date = $force_date ; | |||||
if(strlen($forceDate)) { | |||||
$date = $forceDate ; | |||||
} | } | ||||
else { | else { | ||||
$heure = date('H'); | |||||
$hour = date('H'); | |||||
if ($heure == '00') { | |||||
if ($hour == '00') { | |||||
$date = date('Y-m-d'); | $date = date('Y-m-d'); | ||||
} else { | } else { | ||||
$date = date('Y-m-d', time() + 24 * 60 * 60); | $date = date('Y-m-d', time() + 24 * 60 * 60); | ||||
} | } | ||||
} | } | ||||
$etablissements = Etablissement::find()->all(); | |||||
$arrayProducers = Producer::searchAll() ; | |||||
foreach ($etablissements as $e) { | |||||
$production = Production::findOne([ | |||||
'date' => $date, | |||||
'actif' => 1, | |||||
'id_etablissement' => $e['id'], | |||||
]); | |||||
foreach ($arrayProducers as $producer) { | |||||
$distribution = Distribution::findOne([ | |||||
'date' => $date, | |||||
'active' => 1, | |||||
'id_producer' => $producer['id'], | |||||
]); | |||||
if ($production && ($heure == $e['heure_limite_commande'] || strlen($force_date))) { | |||||
if ($distribution && ($hour == $producer['order_deadline'] || strlen($forceDate))) { | |||||
/* | /* | ||||
* Paiement des commandes (paiement automatique) | * Paiement des commandes (paiement automatique) | ||||
*/ | */ | ||||
$commandes = Commande::find() | |||||
->with('commandeProduits', 'user') | |||||
->joinWith('production') | |||||
->where(['production.date' => $date]) | |||||
->orderBy('date ASC') | |||||
->all(); | |||||
foreach($commandes as $c) { | |||||
if($c->paiement_automatique && Etablissement::getConfig('credit_pain', $c->production->id_etablissement)) { | |||||
$c->init() ; | |||||
if ($c->getMontantRestant() > 0) { | |||||
$c->creditHistorique( | |||||
CreditHistorique::TYPE_PAIEMENT, | |||||
$c->getMontantRestant(), | |||||
$c->production->id_etablissement, | |||||
$c->id_user, | |||||
$arrayOrders = Order::searchAll([ | |||||
'distribution.date' => $date, | |||||
'distribution.id_producer' => $producer['id'] | |||||
], [ | |||||
'conditions' => 'date_delete IS NULL' | |||||
]) ; | |||||
$configCredit = Producer::getConfig('credit', $producer['id']) ; | |||||
foreach($arrayOrders as $order) { | |||||
if($order->payment_auto && $configCredit) { | |||||
if ($order->getAmount(Order::AMOUNT_REMAINING) > 0) { | |||||
$order->saveCreditHistory( | |||||
CreditHistory::TYPE_PAYMENT, | |||||
$order->getAmount(Order::AMOUNT_REMAINING), | |||||
$order->distribution->id_producer, | |||||
$order->id_user, | |||||
User::ID_USER_SYSTEM | User::ID_USER_SYSTEM | ||||
); | ); | ||||
} | } | ||||
/* | /* | ||||
* Envoi des commandes par email au producteur | * Envoi des commandes par email au producteur | ||||
*/ | */ | ||||
if(!strlen($force_date)) { | |||||
$commandes = Commande::find() | |||||
->with('commandeProduits', 'user') | |||||
->joinWith('production') | |||||
->where(['production.date' => $date]) | |||||
->andWhere(['production.id_etablissement' => $e['id']]) | |||||
->orderBy('date ASC') | |||||
->all(); | |||||
$user = User::findOne([ | |||||
'id_etablissement' => $e['id'], | |||||
'status' => User::STATUS_BOULANGER | |||||
]); | |||||
if(!strlen($forceDate)) { | |||||
$arrayOrders = Order::searchAll([ | |||||
'distribution.date' => $date, | |||||
'distribution.id_producer' => $producer['id'] | |||||
], [ | |||||
'conditions' => 'date_delete IS NULL' | |||||
]) ; | |||||
$user = User::searchOne([ | |||||
'id_producer' => $producer['id'], | |||||
'status' => User::STATUS_PRODUCER | |||||
]); | |||||
$mail = Yii::$app->mailer->compose( | $mail = Yii::$app->mailer->compose( | ||||
[ | |||||
'html' => 'cronRecapCommandes-html', | |||||
'text' => 'cronRecapCommandes-text', | |||||
], [ | |||||
'date' => $date, | |||||
'commandes' => $commandes | |||||
] | |||||
) | |||||
->setTo($user->email) | |||||
->setFrom([Yii::$app->params['adminEmail'] => 'La boîte à pain']); | |||||
if (count($commandes)) { | |||||
$sujet = '[La boîte à pain] Commandes du ' . date('d/m', strtotime($date)); | |||||
[ | |||||
'html' => 'cronOrdersSummary-html', | |||||
'text' => 'cronOrdersSummary-text', | |||||
], [ | |||||
'date' => $date, | |||||
'orders' => $arrayOrders | |||||
] | |||||
) | |||||
->setTo($user->email) | |||||
->setFrom([Yii::$app->params['adminEmail'] => 'distrib']); | |||||
if (count($arrayOrders)) { | |||||
$subject = '[distrib] Commandes du ' . date('d/m', strtotime($date)); | |||||
// génération du pdf de commande | // génération du pdf de commande | ||||
Yii::$app->runAction('commande/report-cron', [ | |||||
Yii::$app->runAction('order/report-cron', [ | |||||
'date' => $date, | 'date' => $date, | ||||
'save' => true, | 'save' => true, | ||||
'id_etablissement' => $e['id'], | |||||
'id_producer' => $producer['id'], | |||||
'key' => '64ac0bdab7e9f5e48c4d991ec5201d57' | 'key' => '64ac0bdab7e9f5e48c4d991ec5201d57' | ||||
]); | ]); | ||||
$mail->attach(Yii::getAlias('@app/web/pdf/Commandes-' . $date . '-' . $e['id'] . '.pdf')); | |||||
$mail->attach(Yii::getAlias('@app/web/pdf/Orders-' . $date . '-' . $producer['id'] . '.pdf')); | |||||
} else { | } else { | ||||
$sujet = '[La boîte à pain] Aucune commande'; | |||||
$sujet = '[distrib] Aucune commande'; | |||||
} | } | ||||
$mail->setSubject($sujet) | $mail->setSubject($sujet) |
<?php | <?php | ||||
/** | /** | ||||
Copyright La boîte à pain (2018) | |||||
Copyright distrib (2018) | |||||
contact@laboiteapain.net | |||||
contact@opendistrib.net | |||||
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; | use Yii; | ||||
use common\models\User; | use common\models\User; | ||||
use common\models\Developpement; | |||||
use common\models\DeveloppementPriorite; | |||||
use common\models\Development; | |||||
use common\models\DevelopmentPriority; | |||||
use yii\data\ActiveDataProvider; | use yii\data\ActiveDataProvider; | ||||
use yii\web\Controller; | use yii\web\Controller; | ||||
use yii\web\NotFoundHttpException; | use yii\web\NotFoundHttpException; | ||||
/** | /** | ||||
* DeveloppementController implements the CRUD actions for Developpement model. | * DeveloppementController implements the CRUD actions for Developpement model. | ||||
*/ | */ | ||||
class DeveloppementController extends Controller | |||||
class DevelopmentController extends Controller | |||||
{ | { | ||||
/** | /** | ||||
* @inheritdoc | * @inheritdoc | ||||
*/ | */ | ||||
'allow' => true, | 'allow' => true, | ||||
'roles' => ['@'], | 'roles' => ['@'], | ||||
'matchCallback' => function ($rule, $action) { | 'matchCallback' => function ($rule, $action) { | ||||
return Yii::$app->user->identity->status == USER::STATUS_ADMIN || Yii::$app->user->identity->status == USER::STATUS_BOULANGER; | |||||
return User::hasAccessBackend() ; | |||||
} | } | ||||
] | ] | ||||
], | ], | ||||
* | * | ||||
* @return mixed | * @return mixed | ||||
*/ | */ | ||||
public function actionIndex($statut = Developpement::STATUT_OPEN) | |||||
public function actionIndex($status = Development::STATUS_OPEN) | |||||
{ | { | ||||
$dataProvider = new ActiveDataProvider([ | $dataProvider = new ActiveDataProvider([ | ||||
'query' => Developpement::find()->with(['developpementPriorite', 'developpementPrioriteCurrentEtablissement'])->where(['statut' => $statut])->orderBy('date DESC'), | |||||
'query' => Development::find() | |||||
->with(['developmentPriority', 'developmentPriorityCurrentProducer']) | |||||
->where(['status' => $status]) | |||||
->orderBy('date DESC'), | |||||
]); | ]); | ||||
return $this->render('index', [ | return $this->render('index', [ | ||||
'dataProvider' => $dataProvider, | 'dataProvider' => $dataProvider, | ||||
'statut' => $statut | |||||
'status' => $status | |||||
]); | ]); | ||||
} | } | ||||
*/ | */ | ||||
public function actionCreate() | public function actionCreate() | ||||
{ | { | ||||
$model = new Developpement(); | |||||
$model = new Development(); | |||||
if ($model->load(Yii::$app->request->post())) { | if ($model->load(Yii::$app->request->post())) { | ||||
$model->date = date('Y-m-d H:i:s'); | $model->date = date('Y-m-d H:i:s'); | ||||
$model->setDateLivraison(); | |||||
$model->setDateDelivery(); | |||||
if ($model->save()) { | if ($model->save()) { | ||||
Yii::$app->getSession()->setFlash('success', 'Développement ajouté'); | Yii::$app->getSession()->setFlash('success', 'Développement ajouté'); | ||||
return $this->redirect(['index']); | return $this->redirect(['index']); | ||||
} | } | ||||
} else { | } else { | ||||
return $this->render('create', [ | return $this->render('create', [ | ||||
'model' => $model, | |||||
'model' => $model, | |||||
]); | ]); | ||||
} | } | ||||
} | } | ||||
/** | /** | ||||
* Updates an existing Developpement model. | * Updates an existing Developpement model. | ||||
* If update is successful, the browser will be redirected to the 'view' page. | * If update is successful, the browser will be redirected to the 'view' page. | ||||
* | |||||
* @param integer $id | * @param integer $id | ||||
* @return mixed | * @return mixed | ||||
*/ | */ | ||||
$model = $this->findModel($id); | $model = $this->findModel($id); | ||||
if ($model->load(Yii::$app->request->post())) { | if ($model->load(Yii::$app->request->post())) { | ||||
$model->setDateLivraison(); | |||||
$model->setDateDelivery(); | |||||
if ($model->save()) { | if ($model->save()) { | ||||
Yii::$app->getSession()->setFlash('success', 'Développement modifié'); | Yii::$app->getSession()->setFlash('success', 'Développement modifié'); | ||||
return $this->redirect(['index']); | return $this->redirect(['index']); | ||||
} | } | ||||
} else { | } else { | ||||
return $this->render('update', [ | return $this->render('update', [ | ||||
'model' => $model, | |||||
'model' => $model, | |||||
]); | ]); | ||||
} | } | ||||
} | } | ||||
/** | /** | ||||
* Définit une priorité pour un développement. | * Définit une priorité pour un développement. | ||||
* | * | ||||
* @param integer $id_developpement | |||||
* @param integer $idDevelopment | |||||
* @param string $priorite | * @param string $priorite | ||||
*/ | */ | ||||
public function actionPriorite($id_developpement, $priorite = null) | |||||
public function actionPriority($idDevelopment, $priority = null) | |||||
{ | { | ||||
$develpmentPriority = DevelopmentPriority::searchOne([ | |||||
'id_development' => $idDevelopment, | |||||
]) ; | |||||
$developpement_priorite = DeveloppementPriorite::find() | |||||
->where(['id_developpement' => $id_developpement, 'id_etablissement' => Yii::$app->user->identity->id_etablissement]) | |||||
->one(); | |||||
if (in_array($priorite, [DeveloppementPriorite::PRIORITE_HAUTE, | |||||
DeveloppementPriorite::PRIORITE_NORMALE, | |||||
DeveloppementPriorite::PRIORITE_BASSE])) { | |||||
if (in_array($priority, [DevelopmentPriority::PRIORITY_HIGH, | |||||
DevelopmentPriority::PRIORITY_NORMAL, | |||||
DevelopmentPriority::PRIORITY_LOW])) { | |||||
if ($developpement_priorite) { | |||||
$developpement_priorite->priorite = $priorite; | |||||
$developpement_priorite->id_etablissement = Yii::$app->user->identity->id_etablissement; | |||||
if ($develpmentPriority) { | |||||
$develpmentPriority->priority = $priority; | |||||
$develpmentPriority->id_producer = Producer::getId(); | |||||
} else { | } else { | ||||
$developpement_priorite = new DeveloppementPriorite; | |||||
$developpement_priorite->id_developpement = $id_developpement; | |||||
$developpement_priorite->priorite = $priorite; | |||||
$developpement_priorite->id_etablissement = Yii::$app->user->identity->id_etablissement; | |||||
$develpmentPriority = new DevelopmentPriority; | |||||
$develpmentPriority->id_development = $idDevelopment; | |||||
$develpmentPriority->priority = $priority; | |||||
$develpmentPriority->id_producer = Producer::getId(); | |||||
} | } | ||||
$developpement_priorite->save(); | |||||
$develpmentPriority->save(); | |||||
} else { | } else { | ||||
if ($developpement_priorite) { | |||||
$developpement_priorite->delete(); | |||||
if ($develpmentPriority) { | |||||
$develpmentPriority->delete(); | |||||
} | } | ||||
} | } | ||||
*/ | */ | ||||
protected function findModel($id) | protected function findModel($id) | ||||
{ | { | ||||
if (($model = Developpement::findOne($id)) !== null) { | |||||
if (($model = Development::findOne($id)) !== null) { | |||||
return $model; | return $model; | ||||
} else { | } else { | ||||
throw new NotFoundHttpException('The requested page does not exist.'); | throw new NotFoundHttpException('The requested page does not exist.'); |
<?php | |||||
/** | |||||
Copyright distrib (2018) | |||||
contact@opendistrib.net | |||||
Ce logiciel est un programme informatique servant à aider les producteurs | |||||
à distribuer leur production en circuits courts. | |||||
Ce logiciel est régi par la licence CeCILL soumise au droit français et | |||||
respectant les principes de diffusion des logiciels libres. Vous pouvez | |||||
utiliser, modifier et/ou redistribuer ce programme sous les conditions | |||||
de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA | |||||
sur le site "http://www.cecill.info". | |||||
En contrepartie de l'accessibilité au code source et des droits de copie, | |||||
de modification et de redistribution accordés par cette licence, il n'est | |||||
offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons, | |||||
seule une responsabilité restreinte pèse sur l'auteur du programme, le | |||||
titulaire des droits patrimoniaux et les concédants successifs. | |||||
A cet égard l'attention de l'utilisateur est attirée sur les risques | |||||
associés au chargement, à l'utilisation, à la modification et/ou au | |||||
développement et à la reproduction du logiciel par l'utilisateur étant | |||||
donné sa spécificité de logiciel libre, qui peut le rendre complexe à | |||||
manipuler et qui le réserve donc à des développeurs et des professionnels | |||||
avertis possédant des connaissances informatiques approfondies. Les | |||||
utilisateurs sont donc invités à charger et tester l'adéquation du | |||||
logiciel à leurs besoins dans des conditions permettant d'assurer la | |||||
sécurité de leurs systèmes et ou de leurs données et, plus généralement, | |||||
à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. | |||||
Le fait que vous puissiez accéder à cet en-tête signifie que vous avez | |||||
pris connaissance de la licence CeCILL, et que vous en avez accepté les | |||||
termes. | |||||
*/ | |||||
namespace backend\controllers; | |||||
use backend\controllers\BackendController ; | |||||
use common\models\Distribution ; | |||||
use common\models\Product ; | |||||
use common\models\Producer ; | |||||
use common\models\Order ; | |||||
use common\models\User ; | |||||
use common\models\Subscription ; | |||||
use DateTime; | |||||
class DistributionController extends BackendController | |||||
{ | |||||
public function actionIndex($date = '') | |||||
{ | |||||
$format = 'Y-m-d' ; | |||||
$theDate = '' ; | |||||
$dateObject = DateTime::createFromFormat($format, $date); | |||||
if($dateObject && $dateObject->format($format) === $date) { | |||||
$theDate = $date ; | |||||
} | |||||
return $this->render('index', [ | |||||
'date' => $theDate | |||||
]) ; | |||||
} | |||||
public function actionAjaxInfos($date = '') | |||||
{ | |||||
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; | |||||
$json = [ | |||||
'distribution' => [], | |||||
'products' => [] | |||||
] ; | |||||
$format = 'Y-m-d' ; | |||||
$dateObject = DateTime::createFromFormat($format, $date); | |||||
$distributionsArray = Distribution::searchAll([ | |||||
'active' => 1 | |||||
], [ | |||||
'conditions' => ['date > :date_begin','date < :date_end'], | |||||
'params' => [':date_begin' => date('Y-m-d', strtotime('-1 month')), ':date_end' => date('Y-m-d', strtotime('+3 month')), ], | |||||
]) ; | |||||
$json['distributions'] = $distributionsArray ; | |||||
if($dateObject && $dateObject->format($format) === $date) { | |||||
// distribution | |||||
$distribution = Distribution::initDistribution($date) ; | |||||
$json['distribution'] = [ | |||||
'id' => $distribution->id, | |||||
'active' => $distribution->active, | |||||
'url_report' => Yii::$app->urlManagerBackend->createUrl(['distribution/report','date' => $distribution->date]) | |||||
] ; | |||||
// commandes | |||||
$ordersArray = Order::searchAll([ | |||||
'distribution.date' => $date, | |||||
]); | |||||
// montant et poids des commandes | |||||
$revenues = 0; | |||||
$weight = 0 ; | |||||
if($ordersArray) { | |||||
foreach ($ordersArray as $order) { | |||||
if(is_null($order->date_delete)) { | |||||
$revenues += $order->amount; | |||||
$weight += $order->weight; | |||||
} | |||||
} | |||||
} | |||||
$json['distribution']['revenues'] = number_format($revenues, 2); | |||||
$json['distribution']['weight'] = number_format($weight, 2); | |||||
// products | |||||
$productsArray = Product::find() | |||||
->orWhere(['id_producer' => Producer::getId(),]) | |||||
->orWhere(['id_producer' => 0,]) // produit "Don" | |||||
->joinWith(['productDistribution' => function($query) use($distribution) { | |||||
$query->andOnCondition('product_distribution.id_distribution = '.$distribution->id) ; | |||||
}]) | |||||
->orderBy('product_distribution.active DESC, order ASC') | |||||
->asArray() | |||||
->all(); | |||||
$potentialRevenues = 0; | |||||
$potentialWeight = 0; | |||||
foreach($productsArray as &$product) { | |||||
$quantityOrder = Order::getProductQuantity($product['id'], $ordersArray) ; | |||||
$product['quantity_ordered'] = $quantityOrder ; | |||||
$product['quantity_remaining'] = $product['quantity_max'] - $quantityOrder ; | |||||
if($product['quantity_remaining'] < 0) $product['quantity_remaining'] = 0 ; | |||||
$product['quantity_form'] = 0 ; | |||||
if($product['productDistribution'][0]['active']) { | |||||
$potentialRevenues += $product['quantity_max'] * $product['price']; | |||||
$potentialWeight += $product['quantity_max'] * $product['weight'] / 1000; | |||||
} | |||||
} | |||||
$json['distribution']['potential_revenues'] = $potentialRevenues ; | |||||
$json['distribution']['potential_weight'] = $potentialWeight ; | |||||
$json['products'] = $productsArray ; | |||||
// orders as array | |||||
if($ordersArray) { | |||||
foreach($ordersArray as &$order) { | |||||
$productOrderArray = \yii\helpers\ArrayHelper::map($order->productOrder, 'id_product', 'quantity') ; | |||||
foreach($productsArray as $product) { | |||||
if(!isset($productOrderArray[$product['id']])) { | |||||
$productOrderArray[$product['id']] = 0 ; | |||||
} | |||||
} | |||||
$creditHistoryArray = [] ; | |||||
foreach($order->creditHistory as $creditHistory) { | |||||
$creditHistoryArray[] = [ | |||||
'date' => date('d/m/Y H:i:s', strtotime($creditHistory->date)), | |||||
'user_action' => $creditHistory->strUserAction(), | |||||
'wording' => $creditHistory->getStrWording(), | |||||
'debit' => ($creditHistory->isTypeDebit() ? '- '.$creditHistory->getAmount(Order::AMOUNT_TOTAL,true) : ''), | |||||
'credit' => ($creditHistory->isTypeCredit() ? '+ '.$creditHistory->getAmount(Order::AMOUNT_TOTAL,true) : '') | |||||
] ; | |||||
} | |||||
$arrayCreditUser = [] ; | |||||
if(isset($order->user) && isset($order->user->userProducer)) { | |||||
$arrayCreditUser['credit'] = $order->user->userProducer[0]->credit ; | |||||
} | |||||
$order = array_merge($order->getAttributes(), [ | |||||
'amount' => $order->getAmount(Order::AMOUNT_TOTAL), | |||||
'amount_paid' => $order->getAmount(Order::AMOUNT_PAID), | |||||
'amount_remaining' => $order->getAmount(Order::AMOUNT_REMAINING), | |||||
'amount_surplus' => $order->getAmount(Order::AMOUNT_SURPLUS), | |||||
'user' => (isset($order->user)) ? array_merge($order->user->getAttributes(), $arrayCreditUser) : null, | |||||
'pointSale' => ['id' => $order->pointSale->id, 'name' => $order->pointSale->name], | |||||
'productOrder' => $productOrderArray, | |||||
'creditHistory' => $creditHistoryArray | |||||
]) ; | |||||
} | |||||
} | |||||
$json['orders'] = $ordersArray ; | |||||
// order create | |||||
$productOrderArray = [] ; | |||||
foreach($productsArray as $product) { | |||||
$productOrderArray[$product['id']] = 0 ; | |||||
} | |||||
$json['order_create'] = [ | |||||
'id_point_sale' => 0, | |||||
'id_user' => 0, | |||||
'username' => '', | |||||
'comment' => '', | |||||
'productOrder' => $productOrderArray | |||||
] ; | |||||
// points de vente | |||||
$pointsSaleArray = PointSale::find() | |||||
->joinWith(['pointSaleDistribution' => function($q) use ($distribution) { | |||||
$q->where(['id_distribution' => $distribution->id]); | |||||
}]) | |||||
->where([ | |||||
'id_producer' => Producer::getId(), | |||||
]) | |||||
->asArray() | |||||
->all(); | |||||
$json['points_sale'] = $pointsSaleArray ; | |||||
// utilisateurs | |||||
$usersArray = User::findBy()->all() ; | |||||
$json['users'] = $usersArray ; | |||||
// une production de la semaine activée ou non | |||||
$oneDistributionWeekActive = false ; | |||||
$week = sprintf('%02d',date('W',strtotime($date))); | |||||
$start = strtotime(date('Y',strtotime($date)).'W'.$week); | |||||
$dateMonday = date('Y-m-d',strtotime('Monday',$start)) ; | |||||
$dateTuesday = date('Y-m-d',strtotime('Tuesday',$start)) ; | |||||
$dateWednesday = date('Y-m-d',strtotime('Wednesday',$start)) ; | |||||
$dateThursday = date('Y-m-d',strtotime('Thursday',$start)) ; | |||||
$dateFriday = date('Y-m-d',strtotime('Friday',$start)) ; | |||||
$dateSaturday = date('Y-m-d',strtotime('Saturday',$start)) ; | |||||
$dateSunday = date('Y-m-d',strtotime('Sunday',$start)) ; | |||||
$weekDistribution = Distribution::find() | |||||
->andWhere([ | |||||
'id_producer' => Producer::getId(), | |||||
'active' => 1, | |||||
]) | |||||
->andWhere(['or', | |||||
['date' => $dateMonday], | |||||
['date' => $dateTuesday], | |||||
['date' => $dateWednesday], | |||||
['date' => $dateThursday], | |||||
['date' => $dateFriday], | |||||
['date' => $dateSaturday], | |||||
['date' => $dateSunday], | |||||
]) | |||||
->one(); | |||||
if($weekDistribution) { | |||||
$oneDistributionWeekActive = true ; | |||||
} | |||||
$json['one_distribution_week_active'] = $oneDistributionWeekActive ; | |||||
} | |||||
return $json ; | |||||
} | |||||
/** | |||||
* Génére un PDF récapitulatif des commandes d'un producteur pour une | |||||
* date donnée. | |||||
* | |||||
* @param string $date | |||||
* @param boolean $save | |||||
* @param integer $idProducer | |||||
* @return PDF|null | |||||
*/ | |||||
public function actionReport($date = '', $save = false, $idProducer = 0) | |||||
{ | |||||
if (!Yii::$app->user->isGuest) { | |||||
$idProducer = Producer::getId() ; | |||||
} | |||||
$ordersArray = Order::searchAll([ | |||||
'distribution.date' => $date, | |||||
], | |||||
[ | |||||
'orderby' => 'comment_point_sale ASC, user.name ASC', | |||||
'conditions' => 'date_delete IS NULL' | |||||
]) ; | |||||
$distribution = Distribution::searchOne([],[ | |||||
'conditions' => 'date LIKE :date', | |||||
'params' => [':date' => $date] | |||||
]) ; | |||||
if ($distribution) { | |||||
$selectedProductsArray = ProductDistribution::searchByDistribution($distribution->id) ; | |||||
$pointsSaleArray = PointSale::searchAll() ; | |||||
foreach ($pointsSaleArray as $pointSale) { | |||||
$pointSale->initOrders($ordersArray) ; | |||||
} | |||||
// produits | |||||
$productsArray = Product::searchAll() ; | |||||
// get your HTML raw content without any layouts or scripts | |||||
$content = $this->renderPartial('report', [ | |||||
'date' => $date, | |||||
'distribution' => $distribution, | |||||
'selectedProductsArray' => $selectedProductsArray, | |||||
'pointsSaleArray' => $pointsSaleArray, | |||||
'productsArray' => $productsArray, | |||||
'ordersArray' => $ordersArray | |||||
]); | |||||
$dateStr = date('d/m/Y', strtotime($date)); | |||||
if ($save) { | |||||
$destination = Pdf::DEST_FILE; | |||||
} else { | |||||
$destination = Pdf::DEST_BROWSER; | |||||
} | |||||
$pdf = new Pdf([ | |||||
// set to use core fonts only | |||||
'mode' => Pdf::MODE_UTF8, | |||||
// A4 paper format | |||||
'format' => Pdf::FORMAT_A4, | |||||
// portrait orientation | |||||
'orientation' => Pdf::ORIENT_PORTRAIT, | |||||
// stream to browser inline | |||||
'destination' => $destination, | |||||
'filename' => Yii::getAlias('@app/web/pdf/Commandes-' . $date . '-' . $idProducer . '.pdf'), | |||||
// your html content input | |||||
'content' => $content, | |||||
// format content from your own css file if needed or use the | |||||
// enhanced bootstrap css built by Krajee for mPDF formatting | |||||
//'cssFile' => '@vendor/kartik-v/yii2-mpdf/assets/kv-mpdf-bootstrap.min.css', | |||||
// any css to be embedded if required | |||||
//'cssInline' => '.kv-heading-1{font-size:18px}', | |||||
// set mPDF properties on the fly | |||||
//'options' => ['title' => 'Krajee Report Title'], | |||||
// call mPDF methods on the fly | |||||
'methods' => [ | |||||
'SetHeader' => ['Commandes du ' . $dateStr], | |||||
'SetFooter' => ['{PAGENO}'], | |||||
] | |||||
]); | |||||
// return the pdf output as per the destination setting | |||||
return $pdf->render(); | |||||
} | |||||
return null ; | |||||
} | |||||
public function actionAjaxProcessProductQuantityMax($idDistribution, $idProduct, $quantityMax) | |||||
{ | |||||
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; | |||||
$productDistribution = ProductDistribution::searchOne([ | |||||
'id_distribution' => $idDistribution, | |||||
'id_product' => $idProduct, | |||||
]) ; | |||||
$productDistribution->quantity_max = (int) $quantityMax ; | |||||
$productDistribution->save() ; | |||||
return ['success'] ; | |||||
} | |||||
public function actionAjaxProcessActiveProduct($idDistribution, $idProduct, $active) | |||||
{ | |||||
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; | |||||
$productDistribution = ProductDistribution::searchOne([ | |||||
'id_distribution' => $idDistribution, | |||||
'id_product' => $idProduct, | |||||
]) ; | |||||
$productDistribution->active = $active ; | |||||
$productDistribution->save() ; | |||||
return ['success'] ; | |||||
} | |||||
public function actionAjaxProcessActivePointSale($idDistribution, $idPointSale, $delivery) | |||||
{ | |||||
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; | |||||
$pointSaleDistribution = PointSaleDistribution::searchOne([ | |||||
'id_distribution' => $idDistribution, | |||||
'id_point_sale' => $idPointSale, | |||||
]) ; | |||||
$pointSaleDistribution->delivery = $delivery ; | |||||
$pointSaleDistribution->save() ; | |||||
return ['success'] ; | |||||
} | |||||
/** | |||||
* Active/désactive un jour de distribution. | |||||
* | |||||
* @param integer $idDistribution | |||||
* @param string $date | |||||
* @param boolean $active | |||||
* @return array | |||||
*/ | |||||
public function actionAjaxProcessActiveDistribution($idDistribution = 0, $date = '', $active) | |||||
{ | |||||
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; | |||||
if($idDistribution) { | |||||
$distribution = Distribution::searchOne([ | |||||
'id' => $idDistribution | |||||
]) ; | |||||
} | |||||
$format = 'Y-m-d' ; | |||||
$dateObject = DateTime::createFromFormat($format, $date); | |||||
if($dateObject && $dateObject->format($format) === $date) { | |||||
$distribution = Distribution::initDistribution($date) ; | |||||
} | |||||
if($distribution) { | |||||
$distribution->active = (int) $active ; | |||||
$distribution->save() ; | |||||
if ($active) { | |||||
// ajout des abonnements | |||||
Subscription::addAll($distribution->date); | |||||
} | |||||
return ['success'] ; | |||||
} | |||||
return ['error'] ; | |||||
} | |||||
/** | |||||
* Change l'état d'une semaine de production (activé, désactivé). | |||||
* | |||||
* @param string $date | |||||
* @param integer $active | |||||
*/ | |||||
public function actionAjaxProcessActiveWeekDistribution($date, $active) | |||||
{ | |||||
$week = sprintf('%02d',date('W',strtotime($date))); | |||||
$start = strtotime(date('Y',strtotime($date)).'W'.$week); | |||||
$dateMonday = date('Y-m-d',strtotime('Monday',$start)) ; | |||||
$dateTuesday = date('Y-m-d',strtotime('Tuesday',$start)) ; | |||||
$dateWednesday = date('Y-m-d',strtotime('Wednesday',$start)) ; | |||||
$dateThursday = date('Y-m-d',strtotime('Thursday',$start)) ; | |||||
$dateFriday = date('Y-m-d',strtotime('Friday',$start)) ; | |||||
$dateSaturday = date('Y-m-d',strtotime('Saturday',$start)) ; | |||||
$dateSunday = date('Y-m-d',strtotime('Sunday',$start)) ; | |||||
$pointsSaleArray = PointSale::searchAll() ; | |||||
$activeMonday = false ; | |||||
$activeTuesday = false ; | |||||
$activeWednesday = false ; | |||||
$activeThursday = false ; | |||||
$activeFriday = false ; | |||||
$activeSaturday = false ; | |||||
$activeSunday = false ; | |||||
foreach($pointsSaleArray as $pointSale) { | |||||
if($pointSale->delivery_monday) $activeMonday = true ; | |||||
if($pointSale->delivery_tuesday) $activeTuesday = true ; | |||||
if($pointSale->delivery_wednesday) $activeWednesday = true ; | |||||
if($pointSale->delivery_thursday) $activeThursday = true ; | |||||
if($pointSale->delivery_friday) $activeFriday = true ; | |||||
if($pointSale->delivery_saturday) $activeSaturday = true ; | |||||
if($pointSale->delivery_sunday) $activeSunday = true ; | |||||
} | |||||
if($activeMonday || !$active) { | |||||
$this->actionAjaxProcessActiveDistribution(0, $dateMonday, $active) ; | |||||
} | |||||
if($activeTuesday || !$active) { | |||||
$this->actionAjaxProcessActiveDistribution(0, $dateTuesday, $active) ; | |||||
} | |||||
if($activeWednesday || !$active) { | |||||
$this->actionAjaxProcessActiveDistribution(0, $dateWednesday, $active) ; | |||||
} | |||||
if($activeThursday || !$active) { | |||||
$this->actionAjaxProcessActiveDistribution(0, $dateThursday, $active) ; | |||||
} | |||||
if($activeFriday || !$active) { | |||||
$this->actionAjaxProcessActiveDistribution(0, $dateFriday, $active) ; | |||||
} | |||||
if($activeSaturday || !$active) { | |||||
$this->actionAjaxProcessActiveDistribution(0, $dateSaturday, $active) ; | |||||
} | |||||
if($activeSunday || !$active) { | |||||
$this->actionAjaxProcessActiveDistribution(0, $dateSunday, $active) ; | |||||
} | |||||
return ['success'] ; | |||||
} | |||||
} |
<?php | <?php | ||||
/** | /** | ||||
Copyright La boîte à pain (2018) | |||||
Copyright distrib (2018) | |||||
contact@laboiteapain.net | |||||
contact@opendistrib.net | |||||
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; | use Yii; | ||||
use yii\filters\AccessControl; | use yii\filters\AccessControl; | ||||
use common\models\PointVente; | |||||
use common\models\PointSale; | |||||
use yii\data\ActiveDataProvider; | use yii\data\ActiveDataProvider; | ||||
use yii\web\Controller; | use yii\web\Controller; | ||||
use yii\web\NotFoundHttpException; | use yii\web\NotFoundHttpException; | ||||
use yii\filters\VerbFilter; | use yii\filters\VerbFilter; | ||||
use common\models\User; | use common\models\User; | ||||
use common\models\PointVenteUser; | |||||
use common\models\UserPointSale; | |||||
/** | /** | ||||
* PointVenteController implements the CRUD actions for PointVente model. | * PointVenteController implements the CRUD actions for PointVente model. | ||||
*/ | */ | ||||
class PointVenteController extends BackendController | |||||
class PointSaleController extends BackendController | |||||
{ | { | ||||
public function behaviors() | public function behaviors() | ||||
'allow' => true, | 'allow' => true, | ||||
'roles' => ['@'], | 'roles' => ['@'], | ||||
'matchCallback' => function ($rule, $action) { | 'matchCallback' => function ($rule, $action) { | ||||
return Yii::$app->user->identity->status == USER::STATUS_ADMIN | |||||
|| Yii::$app->user->identity->status == USER::STATUS_BOULANGER; | |||||
return User::hasAccessBackend(); | |||||
} | } | ||||
], | ], | ||||
], | ], | ||||
* @return mixed | * @return mixed | ||||
*/ | */ | ||||
public function actionIndex() | public function actionIndex() | ||||
{ | |||||
$dataProvider = new ActiveDataProvider([ | |||||
'query' => PointVente::find()->where(['id_etablissement' => Yii::$app->user->identity->id_etablissement]) | |||||
]); | |||||
{ | |||||
$searchModel = new PointSaleSearch() ; | |||||
$dataProvider = $searchModel->search(Yii::$app->request->queryParams); | |||||
return $this->render('index', [ | return $this->render('index', [ | ||||
'dataProvider' => $dataProvider, | |||||
'searchModel' => $searchModel, | |||||
'dataProvider' => $dataProvider, | |||||
]); | ]); | ||||
} | } | ||||
*/ | */ | ||||
public function actionCreate() | public function actionCreate() | ||||
{ | { | ||||
$model = new PointVente(); | |||||
$model = new PointSale(); | |||||
if ($model->load(Yii::$app->request->post()) && $model->save()) { | if ($model->load(Yii::$app->request->post()) && $model->save()) { | ||||
$model->gestionPointFabrication(); | |||||
$model->gestionAccesRestreint(); | |||||
$model->processPointProduction(); | |||||
$model->processRestrictedAccess(); | |||||
Distribution::linkPointSaleIncomingDistributions($model) ; | |||||
return $this->redirect(['index']); | return $this->redirect(['index']); | ||||
} else { | } else { | ||||
return $this->render('update', array_merge($this->initForm(), [ | |||||
'model' => $model, | |||||
return $this->render('create', array_merge($this->initForm(), [ | |||||
'model' => $model, | |||||
])); | ])); | ||||
} | } | ||||
} | } | ||||
*/ | */ | ||||
public function actionUpdate($id) | public function actionUpdate($id) | ||||
{ | { | ||||
$model = PointVente::find() | |||||
->with('pointVenteUser') | |||||
$model = PointSale::find() | |||||
->with('userPointSale') | |||||
->where(['id' => $id]) | ->where(['id' => $id]) | ||||
->one(); | ->one(); | ||||
foreach ($model->pointVenteUser as $u) { | |||||
$model->users[] = $u->id_user; | |||||
$model->users_commentaire[$u->id_user] = $u->commentaire; | |||||
foreach ($model->userPointSale as $userPointSale) { | |||||
$model->users[] = $userPointSale->id_user; | |||||
$model->users_comment[$userPointSale->id_user] = $userPointSale->comment; | |||||
} | } | ||||
if ($model->load(Yii::$app->request->post()) && $model->save()) { | if ($model->load(Yii::$app->request->post()) && $model->save()) { | ||||
$model->gestionPointFabrication(); | |||||
$model->gestionAccesRestreint(); | |||||
$model->processPointProduction(); | |||||
$model->processRestrictedAccess(); | |||||
Distribution::linkPointSaleIncomingDistributions($model) ; | |||||
return $this->redirect(['index']); | return $this->redirect(['index']); | ||||
} 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 initForm($id = 0) | public function initForm($id = 0) | ||||
{ | { | ||||
$users = User::findBy() | $users = User::findBy() | ||||
->orderBy('nom ASC') | |||||
->all(); | |||||
->orderBy('name ASC') | |||||
->all(); | |||||
return [ | return [ | ||||
'users' => $users | 'users' => $users | ||||
]; | ]; | ||||
public function actionDelete($id) | public function actionDelete($id) | ||||
{ | { | ||||
$this->findModel($id)->delete(); | $this->findModel($id)->delete(); | ||||
PointVenteUser::deleteAll(['id_point_vente' => $id]); | |||||
ProductionPointVente::deleteAll(['id_point_vente' => $id]) ; | |||||
UserPointSale::deleteAll(['id_point_sale' => $id]); | |||||
PointSaleDistribution::deleteAll(['id_point_sale' => $id]) ; | |||||
return $this->redirect(['index']); | return $this->redirect(['index']); | ||||
} | } | ||||
*/ | */ | ||||
protected function findModel($id) | protected function findModel($id) | ||||
{ | { | ||||
if (($model = PointVente::findOne($id)) !== null) { | |||||
if (($model = PointSale::findOne($id)) !== null) { | |||||
return $model; | return $model; | ||||
} else { | } else { | ||||
throw new NotFoundHttpException('The requested page does not exist.'); | throw new NotFoundHttpException('The requested page does not exist.'); |
<?php | <?php | ||||
/** | /** | ||||
Copyright La boîte à pain (2018) | |||||
Copyright distrib (2018) | |||||
contact@laboiteapain.net | |||||
contact@opendistrib.net | |||||
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\filters\VerbFilter; | use yii\filters\VerbFilter; | ||||
use yii\filters\AccessControl; | use yii\filters\AccessControl; | ||||
use common\helpers\Upload; | use common\helpers\Upload; | ||||
use common\models\Etablissement; | |||||
use common\models\Producer; | |||||
use yii\data\ActiveDataProvider; | use yii\data\ActiveDataProvider; | ||||
use common\models\Facture; | |||||
use common\models\Invoice; | |||||
/** | /** | ||||
* UserController implements the CRUD actions for User model. | * UserController implements the CRUD actions for User model. | ||||
*/ | */ | ||||
class EtablissementAdminController extends BackendController | |||||
class ProducerAdminController extends BackendController | |||||
{ | { | ||||
public function behaviors() | public function behaviors() | ||||
'allow' => true, | 'allow' => true, | ||||
'roles' => ['@'], | 'roles' => ['@'], | ||||
'matchCallback' => function ($rule, $action) { | 'matchCallback' => function ($rule, $action) { | ||||
return Yii::$app->user->identity->status == USER::STATUS_ADMIN; | |||||
return User::getCurrentStatus() == USER::STATUS_ADMIN; | |||||
} | } | ||||
] | ] | ||||
], | ], | ||||
*/ | */ | ||||
public function actionIndex() | public function actionIndex() | ||||
{ | { | ||||
$datas_etablissements = new ActiveDataProvider([ | |||||
'query' => Etablissement::find() | |||||
->with('userEtablissement', 'user') | |||||
$dataProviderProducer = new ActiveDataProvider([ | |||||
'query' => Producer::find() | |||||
->with('userProducer', 'user') | |||||
->orderBy('date_creation DESC'), | ->orderBy('date_creation DESC'), | ||||
'pagination' => [ | 'pagination' => [ | ||||
'pageSize' => 1000, | 'pageSize' => 1000, | ||||
]); | ]); | ||||
return $this->render('index', [ | return $this->render('index', [ | ||||
'datas_etablissements' => $datas_etablissements, | |||||
'dataProviderProducer' => $dataProviderProducer, | |||||
]); | ]); | ||||
} | } | ||||
/** | /** | ||||
* Génère la facture mensuelle d'un producteur. | * Génère la facture mensuelle d'un producteur. | ||||
* | * | ||||
* @param integer $id_etablissement | |||||
* @param integer $idProducer | |||||
*/ | */ | ||||
public function actionFacturer($id_etablissement) | |||||
public function actionBill($idProducer) | |||||
{ | { | ||||
$etablissement = Etablissement::findOne($id_etablissement); | |||||
$producer = Producer::findOne($idProducer); | |||||
if ($etablissement) { | |||||
$periode = date('Y-m', strtotime('-1 month')); | |||||
if ($producer) { | |||||
$period = date('Y-m', strtotime('-1 month')); | |||||
$last_facture = Facture::getLastFacture(); | |||||
if (!$last_facture) { | |||||
$last_invoice = Invoice::getLastInvoice() ; | |||||
if (!$last_invoice) { | |||||
$reference = 'BAP000001'; | $reference = 'BAP000001'; | ||||
} else { | } else { | ||||
$reference = str_replace('BAP', '', $last_facture->reference); | |||||
$reference = str_replace('BAP', '', $last_invoice->reference); | |||||
$reference ++; | $reference ++; | ||||
$reference = 'BAP' . $reference; | $reference = 'BAP' . $reference; | ||||
} | } | ||||
$facture = new Facture; | |||||
$facture->id_etablissement = $id_etablissement; | |||||
$facture->date = date('Y-m-d H:i:s'); | |||||
$facture->reference = $reference; | |||||
$facture->ca = $etablissement->getCA($periode); | |||||
$facture->montant_ht = $etablissement->getMontantFacturer($periode); | |||||
$facture->libelle = 'Facture ' . date('m/Y', strtotime('-1 month')); | |||||
$facture->texte = 'Utilisation de la plateforme <strong>La boîte à pain</strong> pour le mois : ' . date('m/Y', strtotime('-1 month')) . '<br />' | |||||
$invoice = new Invoice; | |||||
$invoice->id_producer = $idProducer; | |||||
$invoice->date = date('Y-m-d H:i:s'); | |||||
$invoice->reference = $reference; | |||||
$invoice->turnover = $producer->getTurnover($period); | |||||
$invoice->amount_ht = $producer->getFreePrice() ; | |||||
$invoice->wording = 'Facture ' . date('m/Y', strtotime('-1 month')); | |||||
$invoice->text = 'Utilisation de la plateforme <strong>distrib</strong> pour le mois : ' . date('m/Y', strtotime('-1 month')) . '<br />' | |||||
. 'Chiffre d\'affaire réalisé sur la plateforme : <strong>' . number_format($facture->ca, 2) . ' €</strong> commissionné à <strong>1%</strong>.'; | . 'Chiffre d\'affaire réalisé sur la plateforme : <strong>' . number_format($facture->ca, 2) . ' €</strong> commissionné à <strong>1%</strong>.'; | ||||
$facture->paye = 0; | |||||
$facture->periode = $periode; | |||||
$facture->save(); | |||||
$invoice->paid = 0; | |||||
$invoice->period = $period; | |||||
$invoice->save(); | |||||
} | } | ||||
$this->redirect(['etablissement-admin/index']); | |||||
$this->redirect(['producer-admin/index']); | |||||
} | } | ||||
/** | /** | ||||
* | * | ||||
* @return mxied | * @return mxied | ||||
*/ | */ | ||||
public function actionFacturation() | |||||
public function actionBilling() | |||||
{ | { | ||||
$datas_factures = new ActiveDataProvider([ | |||||
'query' => Facture::find() | |||||
->with('etablissement') | |||||
$dataProviderInvoice = new ActiveDataProvider([ | |||||
'query' => Invoice::find() | |||||
->with('producer') | |||||
->orderBy('reference DESC'), | ->orderBy('reference DESC'), | ||||
'pagination' => [ | 'pagination' => [ | ||||
'pageSize' => 1000, | 'pageSize' => 1000, | ||||
], | ], | ||||
]); | ]); | ||||
return $this->render('facturation', [ | |||||
'datas_factures' => $datas_factures, | |||||
return $this->render('billing', [ | |||||
'dataProviderInvoice' => $dataProviderInvoice, | |||||
]); | ]); | ||||
} | } | ||||
* @throws NotFoundHttpException | * @throws NotFoundHttpException | ||||
*/ | */ | ||||
protected function findModel($id) { | protected function findModel($id) { | ||||
if (($model = Etablissement::findOne($id)) !== null) { | |||||
if (($model = Producer::findOne($id)) !== null) { | |||||
return $model; | return $model; | ||||
} else { | } else { | ||||
throw new NotFoundHttpException('The requested page does not exist.'); | throw new NotFoundHttpException('The requested page does not exist.'); |
<?php | <?php | ||||
/** | /** | ||||
Copyright La boîte à pain (2018) | |||||
Copyright distrib (2018) | |||||
contact@laboiteapain.net | |||||
contact@opendistrib.net | |||||
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\filters\VerbFilter; | use yii\filters\VerbFilter; | ||||
use yii\filters\AccessControl; | use yii\filters\AccessControl; | ||||
use common\helpers\Upload; | use common\helpers\Upload; | ||||
use common\models\Etablissement; | |||||
use common\models\Facture; | |||||
use common\models\Producer; | |||||
use common\models\Invoice; | |||||
/** | /** | ||||
* UserController implements the CRUD actions for User model. | * UserController implements the CRUD actions for User model. | ||||
*/ | */ | ||||
class EtablissementController extends BackendController | |||||
class ProducerController extends BackendController | |||||
{ | { | ||||
public $enableCsrfValidation = false; | public $enableCsrfValidation = false; | ||||
'allow' => true, | 'allow' => true, | ||||
'roles' => ['@'], | 'roles' => ['@'], | ||||
'matchCallback' => function ($rule, $action) { | 'matchCallback' => function ($rule, $action) { | ||||
return Yii::$app->user->identity->status == USER::STATUS_ADMIN | |||||
|| Yii::$app->user->identity->status == USER::STATUS_BOULANGER; | |||||
return User::hasAccessBackend(); | |||||
} | } | ||||
] | ] | ||||
], | ], | ||||
} | } | ||||
/** | /** | ||||
* Modifie un établissement. | |||||
* Modifie un producteur. | |||||
* | * | ||||
* @return mixed | * @return mixed | ||||
*/ | */ | ||||
public function actionUpdate() | public function actionUpdate() | ||||
{ | { | ||||
$request = Yii::$app->request; | $request = Yii::$app->request; | ||||
$model = $this->findModel(Yii::$app->user->identity->id_etablissement); | |||||
$logo_filename_old = $model->logo; | |||||
$photo_filename_old = $model->photo; | |||||
$model = $this->findModel(Producer::getId()); | |||||
$model->secret_key_payplug = $model->getSecretKeyPayplug() ; | |||||
$logoFilenameOld = $model->logo; | |||||
$photoFilenameOld = $model->photo; | |||||
if ($model->load(Yii::$app->request->post()) && $model->save()) { | if ($model->load(Yii::$app->request->post()) && $model->save()) { | ||||
Upload::uploadFile($model, 'logo', $logo_filename_old); | |||||
Upload::uploadFile($model, 'photo', $photo_filename_old); | |||||
Upload::uploadFile($model, 'logo', $logoFilenameOld); | |||||
Upload::uploadFile($model, 'photo', $photoFilenameOld); | |||||
$delete_logo = $request->post('delete_logo', 0); | |||||
if ($delete_logo) { | |||||
$deleteLogo = $request->post('delete_logo', 0); | |||||
if ($deleteLogo) { | |||||
$model->logo = ''; | $model->logo = ''; | ||||
$model->save(); | $model->save(); | ||||
} | } | ||||
$delete_photo = $request->post('delete_photo', 0); | |||||
if ($delete_photo) { | |||||
$deletePhoto = $request->post('delete_photo', 0); | |||||
if ($deletePhoto) { | |||||
$model->photo = ''; | $model->photo = ''; | ||||
$model->save(); | $model->save(); | ||||
} | } | ||||
$model->saveSecretKeyPayplug() ; | |||||
Yii::$app->getSession()->setFlash('success', 'Paramètres mis à jour.'); | |||||
return $this->redirect(['update', 'id' => $model->id, 'edit_ok' => true]); | return $this->redirect(['update', 'id' => $model->id, 'edit_ok' => true]); | ||||
} else { | } else { | ||||
return $this->render('update', [ | return $this->render('update', [ | ||||
'model' => $model, | |||||
'model' => $model, | |||||
]); | ]); | ||||
} | } | ||||
} | } | ||||
* | * | ||||
* @return mixed | * @return mixed | ||||
*/ | */ | ||||
public function actionFacturation() | |||||
public function actionBilling() | |||||
{ | { | ||||
$datas_factures = new ActiveDataProvider([ | |||||
'query' => Facture::find() | |||||
->where(['id_etablissement' => Yii::$app->user->identity->id_etablissement]) | |||||
$datasInvoices = new ActiveDataProvider([ | |||||
'query' => Invoice::find() | |||||
->where(['id_producer' => Producer::getId()]) | |||||
->orderBy('reference DESC'), | ->orderBy('reference DESC'), | ||||
'pagination' => [ | 'pagination' => [ | ||||
'pageSize' => 1000, | 'pageSize' => 1000, | ||||
], | ], | ||||
]); | ]); | ||||
$etablissement = Etablissement::findOne(Yii::$app->user->identity->id_etablissement); | |||||
$producer = Producer::findOne(Producer::getId()); | |||||
if ($etablissement->load(Yii::$app->request->post())) { | |||||
$etablissement->save(); | |||||
if ($producer->load(Yii::$app->request->post())) { | |||||
$producer->save(); | |||||
if (!is_null($etablissement->prix_libre)) | |||||
$alert_prix_libre = true; | |||||
if (!is_null($producer->free_price)) { | |||||
$alertFreeprice = true; | |||||
} | |||||
} | } | ||||
return $this->render('facturation', [ | |||||
'datas_factures' => $datas_factures, | |||||
'etablissement' => $etablissement, | |||||
'alert_prix_libre' => (isset($alert_prix_libre)) ? true : false | |||||
return $this->render('billing', [ | |||||
'datasInvoices' => $datasInvoices, | |||||
'producer' => $producer, | |||||
'alertFreePrice' => (isset($alertFreeprice)) ? true : false | |||||
]); | ]); | ||||
} | } | ||||
*/ | */ | ||||
protected function findModel($id) | protected function findModel($id) | ||||
{ | { | ||||
if (($model = Etablissement::findOne($id)) !== null) { | |||||
if (($model = Producer::findOne($id)) !== null) { | |||||
return $model; | return $model; | ||||
} else { | } else { | ||||
throw new NotFoundHttpException('The requested page does not exist.'); | throw new NotFoundHttpException('The requested page does not exist.'); |
<?php | <?php | ||||
/** | /** | ||||
Copyright La boîte à pain (2018) | |||||
Copyright distrib (2018) | |||||
contact@laboiteapain.net | |||||
contact@opendistrib.net | |||||
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\models\ProductionProduit; | |||||
use common\models\ProductDistribution; | |||||
use Yii; | use Yii; | ||||
use yii\filters\AccessControl; | use yii\filters\AccessControl; | ||||
use common\models\Produit; | |||||
use common\models\Production; | |||||
use common\models\Product; | |||||
use common\models\Distribution; | |||||
use common\models\User; | use common\models\User; | ||||
use common\models\UserBoulangerie; | |||||
use common\models\UserProducer; | |||||
use yii\data\ActiveDataProvider; | use yii\data\ActiveDataProvider; | ||||
use yii\web\Controller; | use yii\web\Controller; | ||||
use yii\web\NotFoundHttpException; | use yii\web\NotFoundHttpException; | ||||
/** | /** | ||||
* ProduitController implements the CRUD actions for Produit model. | * ProduitController implements the CRUD actions for Produit model. | ||||
*/ | */ | ||||
class ProduitController extends BackendController | |||||
class ProductController extends BackendController | |||||
{ | { | ||||
var $enableCsrfValidation = false; | var $enableCsrfValidation = false; | ||||
'allow' => true, | 'allow' => true, | ||||
'roles' => ['@'], | 'roles' => ['@'], | ||||
'matchCallback' => function ($rule, $action) { | 'matchCallback' => function ($rule, $action) { | ||||
return Yii::$app->user->identity->status == USER::STATUS_ADMIN | |||||
|| Yii::$app->user->identity->status == USER::STATUS_BOULANGER; | |||||
return User::hasAccessBackend(); | |||||
} | } | ||||
] | ] | ||||
], | ], | ||||
*/ | */ | ||||
public function actionIndex() | public function actionIndex() | ||||
{ | { | ||||
$dataProvider = new ActiveDataProvider([ | |||||
'query' => Produit::find() | |||||
->where('(vrac IS NULL OR vrac = 0)') | |||||
->andWhere(['id_etablissement' => Yii::$app->user->identity->id_etablissement]) | |||||
->orderBy('order ASC'), | |||||
'pagination' => [ | |||||
'pageSize' => 1000, | |||||
], | |||||
]); | |||||
$searchModel = new ProductSearch() ; | |||||
$dataProvider = $searchModel->search(Yii::$app->request->queryParams); | |||||
return $this->render('index', [ | return $this->render('index', [ | ||||
'dataProvider' => $dataProvider, | |||||
'searchModel' => $searchModel, | |||||
'dataProvider' => $dataProvider, | |||||
]); | ]); | ||||
} | } | ||||
*/ | */ | ||||
public function actionCreate() | public function actionCreate() | ||||
{ | { | ||||
$model = new Produit(); | |||||
$model->actif = 1; | |||||
$model->id_etablissement = Yii::$app->user->identity->id_etablissement; | |||||
$model->saison = 'all'; | |||||
$model = new Product(); | |||||
$model->active = 1; | |||||
$model->id_producer = Producer::getId(); | |||||
if ($model->load(Yii::$app->request->post()) && $model->save()) { | if ($model->load(Yii::$app->request->post()) && $model->save()) { | ||||
Upload::uploadFile($model, 'illustration'); | |||||
Upload::uploadFile($model, 'photo'); | Upload::uploadFile($model, 'photo'); | ||||
$model->save(); | $model->save(); | ||||
// on ajoute un enregistrement ProductionProduit pour chaque production | |||||
$productions = Production::find() | |||||
->where('date > ' . date('Y-m-d')) | |||||
->andWhere(['id_etablissement' => Yii::$app->user->identity->id_etablissement]) | |||||
->all(); | |||||
foreach ($productions as $prod) { | |||||
$production_produit = new ProductionProduit; | |||||
$production_produit->id_production = $prod->id; | |||||
$production_produit->id_produit = $model->id; | |||||
$production_produit->actif = 0; | |||||
$production_produit->save(); | |||||
} | |||||
// link product / distribution | |||||
Distribution::linkProductIncomingDistributions($model) ; | |||||
Yii::$app->getSession()->setFlash('success', 'Produit <strong>'.Html::encode($model->name).'</strong> ajouté'); | |||||
return $this->redirect(['index']); | return $this->redirect(['index']); | ||||
} else { | } else { | ||||
return $this->render('create', [ | return $this->render('create', [ | ||||
'model' => $model, | |||||
'model' => $model, | |||||
]); | ]); | ||||
} | } | ||||
} | } | ||||
$request = Yii::$app->request; | $request = Yii::$app->request; | ||||
$model = $this->findModel($id); | $model = $this->findModel($id); | ||||
$illustration_filename_old = $model->illustration; | |||||
$photo_filename_old = $model->photo; | |||||
$photoFilenameOld = $model->photo; | |||||
if ($model->load(Yii::$app->request->post()) && $model->save()) { | if ($model->load(Yii::$app->request->post()) && $model->save()) { | ||||
Upload::uploadFile($model, 'illustration', $illustration_filename_old); | |||||
Upload::uploadFile($model, 'photo', $photo_filename_old); | |||||
$delete_illustration = $request->post('delete_illustration', 0); | |||||
if ($delete_illustration) { | |||||
$model->illustration = ''; | |||||
$model->save(); | |||||
} | |||||
Upload::uploadFile($model, 'photo', $photoFilenameOld); | |||||
$delete_photo = $request->post('delete_photo', 0); | |||||
if ($delete_photo) { | |||||
$deletePhoto = $request->post('delete_photo', 0); | |||||
if ($deletePhoto) { | |||||
$model->photo = ''; | $model->photo = ''; | ||||
$model->save(); | $model->save(); | ||||
} | } | ||||
if($model->apply_distributions) { | |||||
// link product / distribution | |||||
Distribution::linkProductIncomingDistributions($model) ; | |||||
} | |||||
Yii::$app->getSession()->setFlash('success', 'Produit <strong>'.Html::encode($model->name).'</strong> modifié'); | |||||
return $this->redirect(['index']); | return $this->redirect(['index']); | ||||
} else { | } else { | ||||
return $this->render('update', [ | return $this->render('update', [ | ||||
'model' => $model, | |||||
'model' => $model, | |||||
]); | ]); | ||||
} | } | ||||
} | } | ||||
*/ | */ | ||||
public function actionDelete($id) | public function actionDelete($id) | ||||
{ | { | ||||
$this->findModel($id)->delete(); | |||||
$productions_produits = ProductionProduit::find()->where(['id_produit' => $id])->all(); | |||||
foreach ($productions_produits as $pp) { | |||||
$pp->delete(); | |||||
} | |||||
$model = $this->findModel($id) ; | |||||
$model->delete(); | |||||
ProductDistribution::deleteAll(['id_product' => $id]) ; | |||||
Yii::$app->getSession()->setFlash('success', 'Produit <strong>'.Html::encode($model->name).'</strong> supprimé'); | |||||
return $this->redirect(['index']); | return $this->redirect(['index']); | ||||
} | } | ||||
/** | /** | ||||
* Modifie l'ordre des produits. | * Modifie l'ordre des produits. | ||||
* | * | ||||
* @param array $tab | |||||
* @param array $array | |||||
*/ | */ | ||||
public function actionOrdre($tab) | |||||
public function actionOrder() | |||||
{ | { | ||||
$tab_ordre = json_decode(stripslashes($tab)); | |||||
foreach ($tab_ordre as $id => $o) { | |||||
$produit = $this->findModel($id); | |||||
$produit->order = $o; | |||||
$produit->save(); | |||||
$array = Yii::$app->request->post('array') ; | |||||
$orderArray = json_decode(stripslashes($array)); | |||||
foreach($orderArray as $id => $order) { | |||||
$product = $this->findModel($id); | |||||
$product->order = $order; | |||||
$product->save(); | |||||
} | } | ||||
} | } | ||||
*/ | */ | ||||
protected function findModel($id) | protected function findModel($id) | ||||
{ | { | ||||
if (($model = Produit::findOne($id)) !== null) { | |||||
if (($model = Product::findOne($id)) !== null) { | |||||
return $model; | return $model; | ||||
} else { | } else { | ||||
throw new NotFoundHttpException('The requested page does not exist.'); | throw new NotFoundHttpException('The requested page does not exist.'); |
<?php | <?php | ||||
/** | /** | ||||
Copyright La boîte à pain (2018) | |||||
Copyright distrib (2018) | |||||
contact@laboiteapain.net | |||||
contact@opendistrib.net | |||||
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\models\LoginForm; | use common\models\LoginForm; | ||||
use common\models\User; | use common\models\User; | ||||
use yii\filters\VerbFilter; | use yii\filters\VerbFilter; | ||||
use common\models\Produit; | |||||
use common\models\PointVente; | |||||
use common\models\Etablissement; | |||||
use common\models\Production; | |||||
use common\models\Commande; | |||||
use common\models\Product; | |||||
use common\models\PointSale; | |||||
use common\models\Producer; | |||||
use common\models\Distribution; | |||||
use common\models\Order; | |||||
/** | /** | ||||
* Site controller | * Site controller | ||||
'allow' => true, | 'allow' => true, | ||||
'roles' => ['@'], | 'roles' => ['@'], | ||||
'matchCallback' => function ($rule, $action) { | 'matchCallback' => function ($rule, $action) { | ||||
return Yii::$app->user->identity->status == USER::STATUS_ADMIN | |||||
|| Yii::$app->user->identity->status == USER::STATUS_BOULANGER; | |||||
return User::hasAccessBackend() ; | |||||
} | } | ||||
], | ], | ||||
[ | [ | ||||
'actions' => ['change-etablissement'], | |||||
'actions' => ['change-producer'], | |||||
'allow' => true, | 'allow' => true, | ||||
'roles' => ['@'], | 'roles' => ['@'], | ||||
'matchCallback' => function ($rule, $action) { | 'matchCallback' => function ($rule, $action) { | ||||
return Yii::$app->user->identity->status == USER::STATUS_ADMIN; | |||||
return User::getCurrentStatus() == User::STATUS_ADMIN ; | |||||
} | } | ||||
], | ], | ||||
], | ], | ||||
'verbs' => [ | 'verbs' => [ | ||||
'class' => VerbFilter::className(), | 'class' => VerbFilter::className(), | ||||
'actions' => [ | 'actions' => [ | ||||
'logout' => ['post'], | |||||
], | ], | ||||
], | ], | ||||
]; | ]; | ||||
public function actionIndex() | public function actionIndex() | ||||
{ | { | ||||
// commandes | // commandes | ||||
$productions = Production::find() | |||||
->with('commande') | |||||
->where(['>=', 'production.date', date('Y-m-d')]) | |||||
$distributionsArray = Distribution::find() | |||||
->with('order') | |||||
->where(['>=', 'distribution.date', date('Y-m-d')]) | |||||
->andWhere([ | ->andWhere([ | ||||
'production.id_etablissement' => Yii::$app->user->identity->id_etablissement, | |||||
'production.actif' => 1 | |||||
'distribution.id_producer' => Producer::getId(), | |||||
'distribution.active' => 1 | |||||
]) | ]) | ||||
->orderBy('date ASC') | ->orderBy('date ASC') | ||||
->limit(5) | |||||
->limit(3) | |||||
->all(); | ->all(); | ||||
// dernières commandes | // dernières commandes | ||||
$commandes = Commande::findBy([ | |||||
$ordersArray = Order::searchAll([],[ | |||||
'orderby' => 'date DESC', | 'orderby' => 'date DESC', | ||||
'condition' => 'production.date > \'' . date('Y-m-d 00:00:00') . '\' AND (type = \'' . Commande::TYPE_USER . '\' OR type = \'' . Commande::TYPE_ADMIN . '\' OR (type = \'' . Commande::TYPE_AUTO . '\' AND (date_update IS NOT NULL OR date_delete IS NOT NULL)))' | |||||
'conditions' => 'distribution.date > :date AND (origin = \'' . Order::ORIGIN_USER . '\' OR origin = \'' . Order::ORIGIN_ADMIN . '\' OR (origin = \'' . Order::ORIGIN_AUTO . '\' AND (date_update IS NOT NULL OR date_delete IS NOT NULL)))', | |||||
'params' => [':date' => date('Y-m-d 00:00:00')], | |||||
]); | ]); | ||||
foreach ($commandes as $c) | |||||
$c->init(); | |||||
// clients | // clients | ||||
$nb_clients = User::findBy()->count(); | |||||
$nbUsers = User::searchCount(); | |||||
$clients = User::findBy() | |||||
$usersArray = User::findBy() | |||||
->orderBy('created_at DESC') | ->orderBy('created_at DESC') | ||||
->limit(5) | ->limit(5) | ||||
->all(); | ->all(); | ||||
$clients_credit_pain_negatif = User::findBy(['id_etablissement' => Yii::$app->user->identity->id_etablissement]) | |||||
->andWhere('user_etablissement.credit < 0') | |||||
$usersNegativeCredit = User::findBy(['id_producer' => Producer::getId()]) | |||||
->andWhere('user_producer.credit < 0') | |||||
->all(); | ->all(); | ||||
// paramètres | // paramètres | ||||
$etablissement = Etablissement::findOne(Yii::$app->user->identity->id_etablissement); | |||||
$producer = Producer::getCurrent(); | |||||
$productsCount = Product::searchCount() ; | |||||
$pointsSaleCount = PointSale::searchCount() ; | |||||
return $this->render('index', [ | return $this->render('index', [ | ||||
'productions' => $productions, | |||||
'commandes' => $commandes, | |||||
'clients' => $clients, | |||||
'nb_clients' => $nb_clients, | |||||
'clients_credit_pain_negatif' => $clients_credit_pain_negatif, | |||||
'etablissement' => $etablissement, | |||||
'distributionsArray' => $distributionsArray, | |||||
'ordersArray' => $ordersArray, | |||||
'usersArray' => $usersArray, | |||||
'nbUsers' => $nbUsers, | |||||
'usersNegativeCredit' => $usersNegativeCredit, | |||||
'producer' => $producer, | |||||
'productsCount' => $productsCount, | |||||
'pointsSaleCount' => $pointsSaleCount | |||||
]); | ]); | ||||
} | } | ||||
* | * | ||||
* @param integer $id | * @param integer $id | ||||
*/ | */ | ||||
public function actionChangeEtablissement($id) | |||||
public function actionChangeProducer($id) | |||||
{ | { | ||||
Yii::$app->user->identity->id_etablissement = $id; | |||||
Yii::$app->user->identity->id_producer = $id; | |||||
Yii::$app->user->identity->save(); | Yii::$app->user->identity->save(); | ||||
$this->redirect(['site/index']); | $this->redirect(['site/index']); | ||||
} | } |
<?php | <?php | ||||
/** | /** | ||||
Copyright La boîte à pain (2018) | |||||
Copyright distrib (2018) | |||||
contact@laboiteapain.net | |||||
contact@opendistrib.net | |||||
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\filters\AccessControl; | use yii\filters\AccessControl; | ||||
use Yii; | use Yii; | ||||
use common\models\User; | use common\models\User; | ||||
use common\models\Commande; | |||||
use common\models\Order; | |||||
use DateTime; | use DateTime; | ||||
use DateInterval; | use DateInterval; | ||||
use DatePeriod; | use DatePeriod; | ||||
'allow' => true, | 'allow' => true, | ||||
'roles' => ['@'], | 'roles' => ['@'], | ||||
'matchCallback' => function ($rule, $action) { | 'matchCallback' => function ($rule, $action) { | ||||
return Yii::$app->user->identity->status == USER::STATUS_ADMIN | |||||
|| Yii::$app->user->identity->status == USER::STATUS_BOULANGER; | |||||
return User::hasAccessBackend() ; | |||||
} | } | ||||
] | ] | ||||
], | ], | ||||
* Volume de commande de l'année passée (par mois) | * Volume de commande de l'année passée (par mois) | ||||
*/ | */ | ||||
$date_start = date('Y-m-d', time() - 60 * 60 * 24 * 365); | |||||
$date_end = date('Y-m-d'); | |||||
$dateStart = date('Y-m-d', time() - 60 * 60 * 24 * 365); | |||||
$dateEnd = date('Y-m-d'); | |||||
$data_pain = []; | |||||
$data = []; | |||||
// labels | // labels | ||||
$data_labels = []; | |||||
$dataLabels = []; | |||||
$start = new DateTime($date_start); | |||||
$start = new DateTime($dateStart); | |||||
$interval = new DateInterval('P1M'); | $interval = new DateInterval('P1M'); | ||||
$end = new DateTime($date_end); | |||||
$end = new DateTime($dateEnd); | |||||
$period = new DatePeriod($start, $interval, $end); | $period = new DatePeriod($start, $interval, $end); | ||||
foreach ($period as $date) { | foreach ($period as $date) { | ||||
$mois = date('m/Y', $date->getTimestamp()); | |||||
$data_labels[] = $mois; | |||||
$data_pain[$mois] = 0; | |||||
$month = date('m/Y', $date->getTimestamp()); | |||||
$dataLabels[] = $month; | |||||
$data[$month] = 0; | |||||
} | } | ||||
// commandes | // commandes | ||||
$commandes = Commande::find() | |||||
->with('commandeProduits') | |||||
->joinWith('production') | |||||
->where('production.date > ' . $date_start) | |||||
->andWhere('production.id_etablissement = ' . Yii::$app->user->identity->id_etablissement) | |||||
->all(); | |||||
foreach ($commandes as $c) { | |||||
$c->init(); | |||||
$mois = date('m/Y', strtotime($c->production->date)); | |||||
if (isset($data_pain[$mois])) { | |||||
$data_pain[$mois] += $c->montant; | |||||
$ordersArray = Order::searchAll([],[ | |||||
'conditions' => 'distribution.date > :date', | |||||
'params' => [':date' => $dateStart] | |||||
]) ; | |||||
if($ordersArray) { | |||||
foreach ($ordersArray as $order) { | |||||
$month = date('m/Y', strtotime($order->distribution->date)); | |||||
if (isset($data[$month])) { | |||||
$data[$month] += $order->amount; | |||||
} | |||||
} | } | ||||
} | } | ||||
// création d'un tableau sans index car chart.js n'accepte pas les index | // création d'un tableau sans index car chart.js n'accepte pas les index | ||||
$data_pain_noindex = []; | |||||
foreach ($data_pain as $key => $val) { | |||||
$data_pain_noindex[] = $val; | |||||
$dataNoIndex = []; | |||||
foreach ($data as $key => $val) { | |||||
$dataNoIndex[] = $val; | |||||
} | } | ||||
return $this->render('index', [ | return $this->render('index', [ | ||||
'data_labels' => $data_labels, | |||||
'data_pain' => $data_pain_noindex, | |||||
'dataLabels' => $dataLabels, | |||||
'data' => $dataNoIndex, | |||||
]); | ]); | ||||
} | } | ||||
const TOTAUX = 13 ; | |||||
const TOTALS = 13 ; | |||||
/** | /** | ||||
* Affiche un tableau avec les totaux (maximums, commandés) de chaque produit | * Affiche un tableau avec les totaux (maximums, commandés) de chaque produit | ||||
* @param integer $year | * @param integer $year | ||||
* @return mixed | * @return mixed | ||||
*/ | */ | ||||
public function actionProduits($year = 0) | |||||
public function actionProducts($year = 0, $section = 1) | |||||
{ | { | ||||
if(!$year) $year = date('Y') ; | if(!$year) $year = date('Y') ; | ||||
$produits = Produit::find() | |||||
->where('(vrac IS NULL OR vrac = 0)') | |||||
->andWhere(['id_etablissement' => Yii::$app->user->identity->id_etablissement]) | |||||
->orderBy('order ASC') | |||||
->all() ; | |||||
$productsArray = Product::searchAll() ; | |||||
$arr_produits = [] ; | |||||
$dataProducts = [] ; | |||||
$arr_produits[self::TOTAUX] = ['max' => [], 'commandes' => []] ; | |||||
foreach($produits as $p) { | |||||
$arr_produits[self::TOTAUX]['max'][$p['nom']] = 0 ; | |||||
$arr_produits[self::TOTAUX]['commandes'][$p['nom']] = 0 ; | |||||
$dataProducts[self::TOTALS] = ['max' => [], 'orders' => []] ; | |||||
foreach($productsArray as $product) { | |||||
$dataProducts[self::TOTALS]['max'][$product['name']] = 0 ; | |||||
$dataProducts[self::TOTALS]['orders'][$product['name']] = 0 ; | |||||
} | } | ||||
if(!in_array($section, [1, 2, 3, 4])) { | |||||
$section = 1 ; | |||||
} | |||||
$iStart = (3 * ($section - 1)) + 1 ; | |||||
$iEnd = 3 * $section ; | |||||
$empty = true ; | $empty = true ; | ||||
for($i = 1; $i <= 12; $i++) { | |||||
for($i = $iStart; $i <= $iEnd; $i++) { | |||||
// Maximums | // Maximums | ||||
$res_maximums = Yii::$app->db->createCommand("SELECT produit.nom, SUM(IF(production_produit.actif,production_produit.quantite_max,0)) AS total | |||||
FROM production, production_produit, produit | |||||
WHERE production.id_etablissement = ".Yii::$app->user->identity->id_etablissement." | |||||
AND production.date >= :date_begin | |||||
AND production.date <= :date_end | |||||
AND production.id = production_produit.id_production | |||||
AND production_produit.id_produit = produit.id | |||||
GROUP BY produit.id | |||||
ORDER BY produit.nom") | |||||
$resMaximums = Yii::$app->db->createCommand("SELECT product.name, SUM(IF(product_distribution.active, product_distribution.quantity_max,0)) AS total | |||||
FROM distribution, product_distribution, product | |||||
WHERE distribution.id_producer = ".Producer::getId()." | |||||
AND distribution.date >= :date_begin | |||||
AND distribution.date <= :date_end | |||||
AND distribution.id = product_distribution.id_distribution | |||||
AND product_distribution.id_product = product.id | |||||
GROUP BY product.id | |||||
ORDER BY product.name") | |||||
->bindValue(':date_begin', date($year.'-'.str_pad($i, 2, 0, STR_PAD_LEFT).'-01')) | ->bindValue(':date_begin', date($year.'-'.str_pad($i, 2, 0, STR_PAD_LEFT).'-01')) | ||||
->bindValue(':date_end', date($year.'-'.str_pad($i, 2, 0, STR_PAD_LEFT).'-31')) | ->bindValue(':date_end', date($year.'-'.str_pad($i, 2, 0, STR_PAD_LEFT).'-31')) | ||||
->queryAll(); | ->queryAll(); | ||||
$arr_produits[$i]['max'] = $res_maximums ; | |||||
if(count($res_maximums)) $empty = false ; | |||||
$dataProducts[$i]['max'] = $resMaximums ; | |||||
if(count($resMaximums)) $empty = false ; | |||||
foreach($res_maximums as $produit_max) { | |||||
if(!isset($arr_produits[self::TOTAUX]['max'][$produit_max['nom']])) $arr_produits[self::TOTAUX]['max'][$produit_max['nom']] = 0 ; | |||||
$arr_produits[self::TOTAUX]['max'][$produit_max['nom']] += $produit_max['total'] ; | |||||
foreach($resMaximums as $productMax) { | |||||
if(!isset($dataProducts[self::TOTALS]['max'][$productMax['name']])) { | |||||
$dataProducts[self::TOTALS]['max'][$productMax['name']] = 0 ; | |||||
} | |||||
$dataProducts[self::TOTALS]['max'][$productMax['name']] += $productMax['total'] ; | |||||
} | } | ||||
// Commandés | // Commandés | ||||
$res_commandes = Yii::$app->db->createCommand("SELECT produit.nom, SUM(commande_produit.quantite) AS total | |||||
FROM production, commande, commande_produit, produit | |||||
WHERE production.id_etablissement = ".Yii::$app->user->identity->id_etablissement." | |||||
AND production.date >= :date_begin | |||||
AND production.date <= :date_end | |||||
AND production.id = commande.id_production | |||||
AND commande.id = commande_produit.id_commande | |||||
AND commande_produit.id_produit = produit.id | |||||
GROUP BY produit.id | |||||
ORDER BY produit.nom") | |||||
$resOrders = Yii::$app->db->createCommand(' | |||||
SELECT product.name, SUM(product_order.quantity) AS total | |||||
FROM `distribution`, `order`, `product_order`, `product` | |||||
WHERE distribution.id_producer = '.Producer::getId().' | |||||
AND distribution.date >= :date_begin | |||||
AND distribution.date <= :date_end | |||||
AND distribution.id = `order`.id_distribution | |||||
AND `order`.id = product_order.id_order | |||||
AND product_order.id_product = product.id | |||||
GROUP BY product.id | |||||
ORDER BY product.name') | |||||
->bindValue(':date_begin', date($year.'-'.str_pad($i, 2, 0, STR_PAD_LEFT).'-01')) | ->bindValue(':date_begin', date($year.'-'.str_pad($i, 2, 0, STR_PAD_LEFT).'-01')) | ||||
->bindValue(':date_end', date($year.'-'.str_pad($i, 2, 0, STR_PAD_LEFT).'-31')) | ->bindValue(':date_end', date($year.'-'.str_pad($i, 2, 0, STR_PAD_LEFT).'-31')) | ||||
->queryAll(); | ->queryAll(); | ||||
$arr_produits[$i]['commandes'] = $res_commandes ; | |||||
if(count($res_commandes)) $empty = false ; | |||||
$dataProducts[$i]['orders'] = $resOrders; | |||||
if(count($resOrders)) $empty = false ; | |||||
foreach($res_commandes as $produit_commandes) { | |||||
if(!isset($arr_produits[self::TOTAUX]['commandes'][$produit_commandes['nom']])) $arr_produits[self::TOTAUX]['commandes'][$produit_commandes['nom']] = 0 ; | |||||
$arr_produits[self::TOTAUX]['commandes'][$produit_commandes['nom']] += $produit_commandes['total'] ; | |||||
foreach($resOrders as $productOrder) { | |||||
if(!isset($dataProducts[self::TOTALS]['orders'][$productOrder['name']])) { | |||||
$dataProducts[self::TOTALS]['orders'][$productOrder['name']] = 0 ; | |||||
} | |||||
$dataProducts[self::TOTALS]['orders'][$productOrder['name']] += $productOrder['total'] ; | |||||
} | } | ||||
} | } | ||||
ksort($arr_produits) ; | |||||
ksort($dataProducts) ; | |||||
$arr_mois = ['Janvier','Février','Mars','Avril','Mai','Juin','Juillet','Août','Septembre','Octobre','Novembre','Décembre','Totaux'] ; | |||||
$monthArray = ['Janvier','Février','Mars','Avril','Mai','Juin','Juillet','Août','Septembre','Octobre','Novembre','Décembre','Totaux'] ; | |||||
return $this->render('produits', [ | |||||
return $this->render('products', [ | |||||
'year' => $year, | 'year' => $year, | ||||
'arr_mois' => $arr_mois, | |||||
'produits' => $produits, | |||||
'arr_produits' => $arr_produits, | |||||
'empty' => $empty | |||||
'monthArray' => $monthArray, | |||||
'productsArray' => $productsArray, | |||||
'dataProducts' => $dataProducts, | |||||
'empty' => $empty, | |||||
'section' => $section, | |||||
'iStart' => $iStart, | |||||
'iEnd' => $iEnd, | |||||
]); | ]); | ||||
} | } | ||||
<?php | |||||
/** | |||||
Copyright distrib (2018) | |||||
contact@opendistrib.net | |||||
Ce logiciel est un programme informatique servant à aider les producteurs | |||||
à distribuer leur production en circuits courts. | |||||
Ce logiciel est régi par la licence CeCILL soumise au droit français et | |||||
respectant les principes de diffusion des logiciels libres. Vous pouvez | |||||
utiliser, modifier et/ou redistribuer ce programme sous les conditions | |||||
de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA | |||||
sur le site "http://www.cecill.info". | |||||
En contrepartie de l'accessibilité au code source et des droits de copie, | |||||
de modification et de redistribution accordés par cette licence, il n'est | |||||
offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons, | |||||
seule une responsabilité restreinte pèse sur l'auteur du programme, le | |||||
titulaire des droits patrimoniaux et les concédants successifs. | |||||
A cet égard l'attention de l'utilisateur est attirée sur les risques | |||||
associés au chargement, à l'utilisation, à la modification et/ou au | |||||
développement et à la reproduction du logiciel par l'utilisateur étant | |||||
donné sa spécificité de logiciel libre, qui peut le rendre complexe à | |||||
manipuler et qui le réserve donc à des développeurs et des professionnels | |||||
avertis possédant des connaissances informatiques approfondies. Les | |||||
utilisateurs sont donc invités à charger et tester l'adéquation du | |||||
logiciel à leurs besoins dans des conditions permettant d'assurer la | |||||
sécurité de leurs systèmes et ou de leurs données et, plus généralement, | |||||
à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. | |||||
Le fait que vous puissiez accéder à cet en-tête signifie que vous avez | |||||
pris connaissance de la licence CeCILL, et que vous en avez accepté les | |||||
termes. | |||||
*/ | |||||
namespace backend\controllers; | |||||
class SubscriptionController extends BackendController | |||||
{ | |||||
var $enableCsrfValidation = false; | |||||
public function behaviors() | |||||
{ | |||||
return [ | |||||
'access' => [ | |||||
'class' => AccessControl::className(), | |||||
'rules' => [ | |||||
[ | |||||
'allow' => true, | |||||
'roles' => ['@'], | |||||
'matchCallback' => function ($rule, $action) { | |||||
return User::hasAccessBackend() ; | |||||
} | |||||
] | |||||
], | |||||
], | |||||
]; | |||||
} | |||||
/** | |||||
* Liste les commandes récurrente du producteur. | |||||
* | |||||
* @return string | |||||
*/ | |||||
public function actionIndex() | |||||
{ | |||||
if (!Product::searchCount() || !PointSale::searchCount()) { | |||||
$this->redirect(['site/index', 'error_products_points_sale' => 1]); | |||||
} | |||||
$searchModel = new SubscriptionSearch ; | |||||
$dataProvider = $searchModel->search(Yii::$app->request->queryParams); | |||||
return $this->render('index', [ | |||||
'searchModel' => $searchModel, | |||||
'dataProvider' => $dataProvider | |||||
]); | |||||
} | |||||
/** | |||||
* Crée une commande récurrente. | |||||
* | |||||
* @return string | |||||
*/ | |||||
public function actionCreate() | |||||
{ | |||||
// form | |||||
$model = new SubscriptionForm; | |||||
$model->id_producer = Producer::getId(); | |||||
// produits | |||||
$productsArray = Product::searchAll() ; | |||||
if ($model->load(Yii::$app->request->post()) && $model->validate() | |||||
&& $model->save()) | |||||
{ | |||||
Yii::$app->getSession()->setFlash('success', 'Abonnement ajouté'); | |||||
$subscription = Subscription::findOne($model->id) ; | |||||
$matchedDistributionsArray = $subscription->searchMatchedIncomingDistributions() ; | |||||
if(count($matchedDistributionsArray)) { | |||||
return $this->redirect(['subscription/update-distributions', 'idSubscription' => $subscription->id]); | |||||
} | |||||
else { | |||||
return $this->redirect(['subscription/index']); | |||||
} | |||||
} | |||||
return $this->render('create', [ | |||||
'model' => $model, | |||||
'productsArray' => $productsArray | |||||
]); | |||||
} | |||||
/** | |||||
* Modifie une commande récurrente. | |||||
* | |||||
* @param integer $id | |||||
* @return string | |||||
* @throws NotFoundHttpException | |||||
*/ | |||||
public function actionUpdate($id) | |||||
{ | |||||
// form | |||||
$model = new SubscriptionForm; | |||||
$subscription = Subscription::findOne($id); | |||||
if ($subscription) { | |||||
$model->id = $id; | |||||
$model->id_producer = $subscription->id_producer; | |||||
$model->id_user = $subscription->id_user; | |||||
$model->username = $subscription->username; | |||||
$model->id_point_sale = $subscription->id_point_sale; | |||||
$model->date_begin = date('d/m/Y', strtotime($subscription->date_begin)); | |||||
if (strlen($subscription->date_end)) { | |||||
$model->date_end = date('d/m/Y', strtotime($subscription->date_end)); | |||||
} | |||||
$model->monday = $subscription->monday; | |||||
$model->tuesday = $subscription->tuesday; | |||||
$model->wednesday = $subscription->wednesday; | |||||
$model->thursday = $subscription->thursday; | |||||
$model->friday = $subscription->friday; | |||||
$model->saturday = $subscription->saturday; | |||||
$model->sunday = $subscription->sunday; | |||||
$model->auto_payment = $subscription->auto_payment; | |||||
$model->week_frequency = $subscription->week_frequency; | |||||
// produits | |||||
$arrayProductsSubscription = ProductSubscription::searchAll([ | |||||
'id_subscription' => $model->id | |||||
]) ; | |||||
foreach ($arrayProductsSubscription as $productSubscription) { | |||||
$model->products['product_' . $productSubscription->id_product] = $productSubscription->quantity; | |||||
} | |||||
} else { | |||||
throw new NotFoundHttpException('L\'abonnement est introuvable.', 404); | |||||
} | |||||
// produits | |||||
$productsArray = Product::searchAll() ; | |||||
if ($model->load(Yii::$app->request->post()) && $model->validate()) { | |||||
if (!strlen($model->date_end)) { | |||||
$model->date_end = null; | |||||
} | |||||
if ($model->save()) { | |||||
Yii::$app->getSession()->setFlash('success', 'Abonnement modifié'); | |||||
$subscription = Subscription::findOne($model->id) ; | |||||
$matchedDistributionsArray = $subscription->searchMatchedIncomingDistributions() ; | |||||
if(count($matchedDistributionsArray)) { | |||||
return $this->redirect(['subscription/update-distributions', 'idSubscription' => $subscription->id,'update' => true]); | |||||
} | |||||
else { | |||||
return $this->redirect(['subscription/index']); | |||||
} | |||||
} | |||||
} | |||||
return $this->render('update', [ | |||||
'model' => $model, | |||||
'productsArray' => $productsArray | |||||
]); | |||||
} | |||||
/** | |||||
* Supprime une commande récurrente. | |||||
* | |||||
* @param integer $id | |||||
*/ | |||||
public function actionDelete($id) | |||||
{ | |||||
ProductSubscription::deleteAll(['id_subscription' => $id]); | |||||
Subscription::findOne($id)->delete(); | |||||
Yii::$app->getSession()->setFlash('success', 'Abonnement supprimé'); | |||||
return $this->redirect(['subscription/index']); | |||||
} | |||||
public function actionUpdateDistributions($idSubscription, $generate = false, $update = false) | |||||
{ | |||||
$subscription = Subscription::findOne($idSubscription) ; | |||||
$matchedDistributionsArray = $subscription->searchMatchedIncomingDistributions() ; | |||||
if($generate) { | |||||
if($update) { | |||||
$subscription->deleteOrdersIncomingDistributions() ; | |||||
} | |||||
foreach($matchedDistributionsArray as $distribution) { | |||||
$subscription->add($distribution->date) ; | |||||
} | |||||
Yii::$app->getSession()->setFlash('success', 'Commandes '.($update ? 're-' : '').'générées dans les distributions futures.'); | |||||
return $this->redirect(['subscription/index']) ; | |||||
} | |||||
return $this->render('update_distributions',[ | |||||
'matchedDistributionsArray' => $matchedDistributionsArray, | |||||
'idSubscription' => $idSubscription, | |||||
'update' => $update | |||||
]) ; | |||||
} | |||||
} |
<?php | <?php | ||||
/** | /** | ||||
Copyright La boîte à pain (2018) | |||||
Copyright distrib (2018) | |||||
contact@laboiteapain.net | |||||
contact@opendistrib.net | |||||
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\models\User ; | |||||
use common\models\Producer ; | |||||
use backend\models\MailForm ; | |||||
/** | /** | ||||
* UserController implements the CRUD actions for User model. | * UserController implements the CRUD actions for User model. | ||||
*/ | */ | ||||
'allow' => true, | 'allow' => true, | ||||
'roles' => ['@'], | 'roles' => ['@'], | ||||
'matchCallback' => function ($rule, $action) { | 'matchCallback' => function ($rule, $action) { | ||||
return Yii::$app->user->identity->status == USER::STATUS_ADMIN | |||||
|| Yii::$app->user->identity->status == USER::STATUS_BOULANGER; | |||||
return User::hasAccessBackend(); | |||||
} | } | ||||
] | ] | ||||
], | ], | ||||
* @return mixed | * @return mixed | ||||
*/ | */ | ||||
public function actionIndex( | public function actionIndex( | ||||
$id_point_vente = 0, $section_clients_inactifs = false) | |||||
{ | |||||
$params = Yii::$app->request->queryParams; | |||||
if($id_point_vente) | |||||
$params['id_point_vente'] = $id_point_vente ; | |||||
if($section_clients_inactifs) | |||||
$params['inactifs'] = true ; | |||||
$query = User::findBy($params); | |||||
$dataProvider = new ActiveDataProvider([ | |||||
'query' => $query, | |||||
'sort' => ['attributes' => ['nom','prenom']], | |||||
]); | |||||
$idPointSale = 0, $sectionInactiveUsers = false) | |||||
{ | |||||
$searchModel = new UserSearch ; | |||||
$dataProvider = $searchModel->search([ | |||||
'UserSearch' => array_merge( | |||||
[ | |||||
'id_point_sale' => $idPointSale, | |||||
'inactive' => (int) $sectionInactiveUsers | |||||
], | |||||
isset(Yii::$app->request->queryParams['UserSearch']) ? | |||||
Yii::$app->request->queryParams['UserSearch'] : | |||||
[] | |||||
) | |||||
]) ; | |||||
$etablissement = Etablissement::find() | |||||
->where(['id' => Yii::$app->user->identity->id_etablissement]) | |||||
->one(); | |||||
$producer = Producer::searchOne([ | |||||
'id' => Producer::getId() | |||||
]) ; | |||||
$points_vente = PointVente::find()->where(['id_etablissement' => $etablissement->id])->all() ; | |||||
$pointsSaleArray = PointSale::searchAll() ; | |||||
return $this->render('index', [ | return $this->render('index', [ | ||||
'searchModel' => $searchModel, | |||||
'dataProvider' => $dataProvider, | 'dataProvider' => $dataProvider, | ||||
'etablissement' => $etablissement, | |||||
'id_point_vente_active' => $id_point_vente, | |||||
'points_vente' => $points_vente, | |||||
'section_clients_inactifs' => $section_clients_inactifs, | |||||
'producer' => $producer, | |||||
'idPointSaleActive' => $idPointSale, | |||||
'pointsSaleArray' => $pointsSaleArray, | |||||
'sectionInactiveUsers' => $sectionInactiveUsers, | |||||
]); | ]); | ||||
} | } | ||||
$model->setPassword($password); | $model->setPassword($password); | ||||
$model->generateAuthKey(); | $model->generateAuthKey(); | ||||
$model->username = $model->email; | $model->username = $model->email; | ||||
$model->confiance = 1; | |||||
if (!strlen($model->email)) | |||||
$model->username = 'inconnu@laboiteapain.net'; | |||||
if (!strlen($model->email)) { | |||||
$model->username = 'inconnu@opendistrib.net'; | |||||
} | |||||
$model->save(); | $model->save(); | ||||
// liaison etablissement / user | // liaison etablissement / user | ||||
$user_etablissement = new UserEtablissement(); | |||||
$user_etablissement->id_user = $model->id; | |||||
$user_etablissement->id_etablissement = Yii::$app->user->identity->id_etablissement; | |||||
$user_etablissement->credit = 0; | |||||
$user_etablissement->actif = 1; | |||||
$user_etablissement->save(); | |||||
$useProducer = new UserProducer(); | |||||
$useProducer->id_user = $model->id; | |||||
$useProducer->id_producer = Producer::getId(); | |||||
$useProducer->credit = 0; | |||||
$useProducer->active = 1; | |||||
$useProducer->save(); | |||||
$model->sendMailWelcome($password) ; | $model->sendMailWelcome($password) ; | ||||
{ | { | ||||
$model = $this->findModel($id); | $model = $this->findModel($id); | ||||
$previous_mail = $model->email ; | |||||
$previousMail = $model->email ; | |||||
$user = User::find()->with('userEtablissement')->where(['id' => $model['id']])->one(); | |||||
$user_appartient_etablissement = UserEtablissement::findOne(['id_user' => $id, 'id_etablissement' => Yii::$app->user->identity->id_etablissement]); | |||||
if (($user_appartient_etablissement && count($user->userEtablissement) == 1) || Yii::$app->user->identity->status == USER::STATUS_ADMIN) { | |||||
$user = User::find()->with('userProducer')->where(['id' => $model['id']])->one(); | |||||
$userBelongToProducer = UserProducer::findOne(['id_user' => $id, 'id_producer' => Producer::getId()]); | |||||
if (($userBelongToProducer && count($user->userProducer) == 1) || User::getCurrentStatus() == USER::STATUS_ADMIN) { | |||||
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 | ||||
if(!strlen($previous_mail) && strlen($model->email)) { | |||||
if(!strlen($previousMail) && strlen($model->email)) { | |||||
$password = Password::generate(); | $password = Password::generate(); | ||||
$model->setPassword($password); | $model->setPassword($password); | ||||
$model->username = $model->email; | $model->username = $model->email; | ||||
*/ | */ | ||||
public function actionDelete($id) | public function actionDelete($id) | ||||
{ | { | ||||
$user_etablissement = UserEtablissement::findOne([ | |||||
$userProducer = UserProducer::findOne([ | |||||
'id_user' => $id, | 'id_user' => $id, | ||||
'id_etablissement' => Yii::$app->user->identity->id_etablissement | |||||
'id_producer' => Producer::getId() | |||||
]) ; | ]) ; | ||||
if($user_etablissement) { | |||||
$user_etablissement->actif = 0 ; | |||||
$user_etablissement->favoris = 0 ; | |||||
$user_etablissement->save() ; | |||||
if($userProducer) { | |||||
$userProducer->active = 0 ; | |||||
$userProducer->bookmark = 0 ; | |||||
$userProducer->save() ; | |||||
} | } | ||||
else { | else { | ||||
throw new \yii\web\NotFoundHttpException('L\'enregistrement UserEtablissement est introuvable', 404) ; | |||||
throw new \yii\web\NotFoundHttpException('L\'enregistrement UserProducer est introuvable', 404) ; | |||||
} | } | ||||
$params = Yii::$app->getRequest()->getQueryParams() ; | $params = Yii::$app->getRequest()->getQueryParams() ; | ||||
* Affiche la liste des emails des utilisateurs liés à un point de vente | * Affiche la liste des emails des utilisateurs liés à un point de vente | ||||
* donné. | * donné. | ||||
* | * | ||||
* @param integer $id_point_vente | |||||
* @param integer $idPointSale | |||||
* @return mixed | * @return mixed | ||||
*/ | */ | ||||
public function actionMail($id_point_vente = 0) | |||||
public function actionMail($idPointSale = 0) | |||||
{ | { | ||||
$users = User::findBy([ | $users = User::findBy([ | ||||
'id_etablissement' => Yii::$app->user->identity->id_etablissement, | |||||
'id_point_vente' => $id_point_vente | |||||
'id_producer' => Producer::getId(), | |||||
'id_point_sale' => $idPointSale | |||||
])->all() ; | ])->all() ; | ||||
$arr_users = []; | |||||
foreach ($users as $u) { | |||||
if (isset($u['email']) && strlen($u['email'])) | |||||
$arr_users[] = $u['email']; | |||||
$usersArray = []; | |||||
foreach ($users as $user) { | |||||
if (isset($user['email']) && strlen($user['email'])) | |||||
$usersArray[] = $user['email']; | |||||
} | } | ||||
$points_vente = PointVente::find()->where(['id_etablissement' => Yii::$app->user->identity->id_etablissement])->all() ; | |||||
$pointsSaleArray = PointSale::find()->where(['id_producer' => Producer::getId()])->all() ; | |||||
$pointSale = null ; | |||||
if($idPointSale) { | |||||
$pointSale = PointSale::findOne(['id' => $idPointSale]) ; | |||||
} | |||||
$point_vente = null ; | |||||
if($id_point_vente) { | |||||
$point_vente = PointVente::findOne(['id' => $id_point_vente, 'id_etablissement' => Yii::$app->user->identity->id_etablissement]) ; | |||||
$mailForm = new MailForm() ; | |||||
if ($mailForm->load(Yii::$app->request->post()) && $mailForm->validate()) { | |||||
$resultSendEmail = $mailForm->sendEmail($users) ; | |||||
if($resultSendEmail) { | |||||
Yii::$app->getSession()->setFlash('success', 'Votre email a bien été envoyé.'); | |||||
} | |||||
else { | |||||
Yii::$app->getSession()->setFlash('error', 'Un problème est survenu lors de l\'envoi de votre email.'); | |||||
} | |||||
return $this->redirect(['mail','idPointSale' => $idPointSale]); | |||||
} | } | ||||
return $this->render('liste_mails', [ | |||||
'users' => $arr_users, | |||||
'points_vente' => $points_vente, | |||||
'point_vente' => $point_vente | |||||
return $this->render('emails', [ | |||||
'usersArray' => $usersArray, | |||||
'pointsSaleArray' => $pointsSaleArray, | |||||
'pointSale' => $pointSale, | |||||
'mailForm' => $mailForm, | |||||
'idPointSaleActive' => $idPointSale | |||||
]); | ]); | ||||
} | } | ||||
*/ | */ | ||||
public function actionCredit($id) | public function actionCredit($id) | ||||
{ | { | ||||
$user = User::find()->with('userEtablissement')->where(['id' => $id])->one(); | |||||
$user_etablissement = UserEtablissement::findOne(['id_user' => $id, 'id_etablissement' => Yii::$app->user->identity->id_etablissement]); | |||||
$user = User::find()->with('userProducer')->where(['id' => $id])->one(); | |||||
$userProducer = UserProducer::findOne(['id_user' => $id, 'id_producer' => Producer::getId()]); | |||||
if (($user_etablissement) || Yii::$app->user->identity->status == USER::STATUS_ADMIN) { | |||||
if (($userProducer) || User::getCurrentStatus() == User::STATUS_ADMIN) { | |||||
$credit_form = new CreditForm; | |||||
if ($credit_form->load(Yii::$app->request->post()) && $credit_form->validate()) { | |||||
$credit_form->id_user = $id ; | |||||
$credit_form->save(); | |||||
$credit_form = new CreditForm; | |||||
$creditForm = new CreditForm; | |||||
if ($creditForm->load(Yii::$app->request->post()) && $creditForm->validate()) { | |||||
$creditForm->id_user = $id ; | |||||
$creditForm->save(); | |||||
$creditForm = new CreditForm; | |||||
} | } | ||||
$historique = CreditHistorique::find() | |||||
->with(['commande', 'userAction']) | |||||
$history = CreditHistory::find() | |||||
->with(['order', 'userAction']) | |||||
->where([ | ->where([ | ||||
'id_user' => $user->id, | 'id_user' => $user->id, | ||||
'id_etablissement' => Yii::$app->user->identity->id_etablissement, | |||||
'id_producer' => Producer::getId(), | |||||
]) | ]) | ||||
->orderBy('date DESC') | ->orderBy('date DESC') | ||||
->all(); | ->all(); | ||||
return $this->render('credit', [ | return $this->render('credit', [ | ||||
'user' => $user, | 'user' => $user, | ||||
'credit_form' => $credit_form, | |||||
'historique' => $historique | |||||
'creditForm' => $creditForm, | |||||
'history' => $history | |||||
]); | ]); | ||||
} | } | ||||
else { | else { | ||||
* @param integer $id | * @param integer $id | ||||
* @return mixed | * @return mixed | ||||
*/ | */ | ||||
public function actionCommandes($id) | |||||
public function actionOrders($id) | |||||
{ | { | ||||
$user = User::findOne($id); | $user = User::findOne($id); | ||||
$commandes = Commande::find() | |||||
->with('commandeProduits', 'pointVente', 'creditHistorique') | |||||
->joinWith('production', 'production.etablissement') | |||||
->where([ | |||||
'id_user' => $id, | |||||
'production.id_etablissement' => Yii::$app->user->identity->id_etablissement | |||||
]) | |||||
->orderBy('production.date DESC') | |||||
->all(); | |||||
foreach ($commandes as $c) | |||||
$c->init(); | |||||
$ordersArray = Order::searchAll([ | |||||
'id_user' => $id | |||||
], ['orderby' => 'distribution.date DESC']) ; | |||||
return $this->render('commandes', [ | |||||
'commandes' => $commandes, | |||||
return $this->render('orders', [ | |||||
'ordersArray' => $ordersArray, | |||||
'user' => $user | 'user' => $user | ||||
]); | ]); | ||||
} | } |
<?php | <?php | ||||
/** | /** | ||||
Copyright La boîte à pain (2018) | |||||
Copyright distrib (2018) | |||||
contact@laboiteapain.net | |||||
contact@opendistrib.net | |||||
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; | use Yii; | ||||
use yii\base\Model; | use yii\base\Model; | ||||
use common\models\CreditHistorique ; | |||||
use common\models\CreditHistory ; | |||||
use common\models\User ; | use common\models\User ; | ||||
use common\models\Etablissement ; | |||||
use common\models\UserEtablissement ; | |||||
use common\models\Producer ; | |||||
use common\models\UserProducer ; | |||||
use common\helpers\Mail ; | use common\helpers\Mail ; | ||||
/** | /** | ||||
public $id_user ; | public $id_user ; | ||||
public $id_user_action ; | public $id_user_action ; | ||||
public $id_etablissement ; | |||||
public $id_producer ; | |||||
public $type ; | public $type ; | ||||
public $montant ; | |||||
public $moyen_paiement ; | |||||
public $commentaire ; | |||||
public $amount ; | |||||
public $mean_payment ; | |||||
public $comment ; | |||||
public $send_mail ; | public $send_mail ; | ||||
/** | /** | ||||
public function rules() | public function rules() | ||||
{ | { | ||||
return [ | return [ | ||||
[['montant'], 'required'], | |||||
[['id_user', 'id_user_action', 'id_etablissement'], 'integer'], | |||||
[['amount'], 'required'], | |||||
[['id_user', 'id_user_action', 'id_producer'], 'integer'], | |||||
[['date','send_mail'], 'safe'], | [['date','send_mail'], 'safe'], | ||||
[['montant'], 'double'], | |||||
[['type', 'moyen_paiement', 'commentaire'], 'string', 'max' => 255], | |||||
[['amount'], 'double'], | |||||
[['type', 'mean_payment', 'comment'], 'string', 'max' => 255], | |||||
]; | ]; | ||||
} | } | ||||
'id_user' => 'Utilisateur', | 'id_user' => 'Utilisateur', | ||||
'id_user_action' => 'Utilisateur', | 'id_user_action' => 'Utilisateur', | ||||
'date' => 'Date', | 'date' => 'Date', | ||||
'montant' => 'Montant', | |||||
'amount' => 'Montant', | |||||
'type' => 'Type', | 'type' => 'Type', | ||||
'id_etablissement' => 'Établissement', | |||||
'moyen_paiement' => 'Moyen de paiement', | |||||
'commentaire' => 'Commentaire', | |||||
'id_producer' => 'Producteur', | |||||
'mean_payment' => 'Moyen de paiement', | |||||
'comment' => 'Commentaire', | |||||
'send_mail' => 'Prévenir l\'utilisateur', | 'send_mail' => 'Prévenir l\'utilisateur', | ||||
]; | ]; | ||||
} | } | ||||
public function save() | public function save() | ||||
{ | { | ||||
if ($this->validate()) { | if ($this->validate()) { | ||||
$credit_historique = new CreditHistorique ; | |||||
$credit_historique->id_user = $this->id_user; | |||||
$credit_historique->id_user_action = Yii::$app->user->identity->id; | |||||
$credit_historique->id_etablissement = Yii::$app->user->identity->id_etablissement; | |||||
$credit_historique->type = $this->type ; | |||||
$credit_historique->commentaire = $this->commentaire ; | |||||
$credit_historique->montant = $this->montant ; | |||||
$credit_historique->moyen_paiement = $this->moyen_paiement ; | |||||
$credit_historique->save(); | |||||
$creditHistory = new CreditHistory; | |||||
$creditHistory->id_user = $this->id_user; | |||||
$creditHistory->id_user_action = Yii::$app->user->identity->id; | |||||
$creditHistory->id_producer = Producer::getId() ; | |||||
$creditHistory->type = $this->type ; | |||||
$creditHistory->comment = $this->comment ; | |||||
$creditHistory->amount = $this->amount ; | |||||
$creditHistory->mean_payment = $this->mean_payment ; | |||||
$creditHistory->save(); | |||||
// on prévient l'utilisateur que son compte vient d'être crédité | // on prévient l'utilisateur que son compte vient d'être crédité | ||||
if($this->send_mail) { | if($this->send_mail) { | ||||
$user = User::findOne($this->id_user) ; | $user = User::findOne($this->id_user) ; | ||||
$etablissement = Etablissement::findOne(Yii::$app->user->identity->id_etablissement) ; | |||||
$user_etablissement = UserEtablissement::findOne(['id_user' => $this->id_user, 'id_etablissement' => Yii::$app->user->identity->id_etablissement]); | |||||
$producer = Producer::getCurrent() ; | |||||
$userProducer = UserProducer::searchOne([ | |||||
'id_user' => $this->id_user | |||||
]); | |||||
Mail::send($user->email, 'Votre compte vient d\'être crédité','creditUser', [ | Mail::send($user->email, 'Votre compte vient d\'être crédité','creditUser', [ | ||||
'user' => $user, | 'user' => $user, | ||||
'etablissement' => $etablissement, | |||||
'user_etablissement' => $user_etablissement, | |||||
'credit_form' => $this | |||||
'producer' => $producer, | |||||
'userProducer' => $userProducer, | |||||
'creditForm' => $this | |||||
]) ; | ]) ; | ||||
} | } | ||||
} | } |
<?php | <?php | ||||
/** | /** | ||||
Copyright La boîte à pain (2018) | |||||
Copyright distrib (2018) | |||||
contact@laboiteapain.net | |||||
contact@opendistrib.net | |||||
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 $subject; | public $subject; | ||||
public $body; | |||||
public $message; | |||||
/** | /** | ||||
* @inheritdoc | * @inheritdoc | ||||
public function rules() | public function rules() | ||||
{ | { | ||||
return [ | return [ | ||||
// name, email, subject and body are required | |||||
[['subject', 'body'], 'required', 'message' => 'Champs obligatoire'], | |||||
[['subject', 'message'], 'required', 'message' => 'Champs obligatoire'], | |||||
]; | ]; | ||||
} | } | ||||
{ | { | ||||
return [ | return [ | ||||
'subject' => 'Sujet', | 'subject' => 'Sujet', | ||||
'body' => 'Message', | |||||
'message' => 'Message', | |||||
]; | ]; | ||||
} | } | ||||
/** | /** | ||||
* Sends an email to the specified email address using the information collected by this model. | |||||
* Envoie un email aux utilisateurs d'un point de vente ou à tous les | |||||
* utilisateurs d'un producteur. | |||||
* | * | ||||
* @param string $email the target email address | |||||
* @return boolean whether the email was sent | |||||
* @param integer $idPointSale ID du point de vente | |||||
*/ | */ | ||||
public function sendEmail($email) | |||||
public function sendEmail($usersArray) | |||||
{ | { | ||||
return Yii::$app->mailer->compose() | |||||
->setTo($email) | |||||
->setFrom(['matthieu@lechatdesnoisettes.com' => 'Le Chat des Noisettes']) | |||||
->setSubject($this->subject) | |||||
->setTextBody($this->body) | |||||
->send(); | |||||
$producer = Producer::getCurrent() ; | |||||
$mj = new \Mailjet\Client( | |||||
$producer->getApiKeyMailjet('public'), | |||||
$producer->getApiKeyMailjet('private'), | |||||
true, | |||||
['version' => 'v3.1'] | |||||
); | |||||
$body = ['Messages' => []] ; | |||||
foreach($usersArray as $user) { | |||||
$body['Messages'][] = [ | |||||
'From' => [ | |||||
'Email' => $producer->slug.'@opendistrib.net', | |||||
'Name' => $producer->name | |||||
], | |||||
'To' => [ | |||||
[ | |||||
'Email' => $user['email'], | |||||
'Name' => $user['name'].' '.$user['lastname'] | |||||
] | |||||
], | |||||
'Subject' => $this->subject, | |||||
'TextPart' => $this->message, | |||||
'HTMLPart' => nl2br($this->message) | |||||
] ; | |||||
} | |||||
$response = $mj->post(\Mailjet\Resources::$Email, ['body' => $body]); | |||||
return $response->success() ; | |||||
} | } | ||||
} | } |
<?php | |||||
/** | |||||
Copyright La boîte à pain (2018) | |||||
contact@laboiteapain.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 common\models\Commande ; | |||||
use yii\helpers\Html ; | |||||
?> | |||||
<div class="panel panel-default"> | |||||
<div class="panel-heading"> | |||||
<h3 class="panel-title"> | |||||
Global | |||||
</h3> | |||||
</div> | |||||
<div class="panel-body"> | |||||
<div class="alert alert-warning"> | |||||
<strong>Potentiel :</strong> <?= number_format($ca_potentiel,2); ?> € (<?= $poids_total ?> kg) • | |||||
<strong>Commandé :</strong> <?= number_format($recettes,2); ?> € (<?= $poids ?> kg) | |||||
</div> | |||||
<table class="table table-bordered tab-content table-produits table-header-rotated"> | |||||
<tbody> | |||||
<tr> | |||||
<?php | |||||
foreach ($produits as $p) { | |||||
if ((isset($produits_selec[$p->id]['actif']) && $produits_selec[$p->id]['actif']) || | |||||
(!$produits_selec[$p->id]['actif'] && Commande::getQuantiteProduit($p->id, $commandes))) | |||||
{ | |||||
(!$produits_selec[$p->id]['actif']) ? $class_disabled = 'disabled' : $class_disabled = '' ; | |||||
echo '<th class="rotate-45 '.$class_disabled.'"><div><span>'.Html::encode($p->getLibelleAdmin()).'</span></div></th>' ; | |||||
} | |||||
} | |||||
?> | |||||
</tr> | |||||
<tr> | |||||
<?php | |||||
foreach ($produits as $p) { | |||||
$quantite = Commande::getQuantiteProduit($p->id, $commandes); | |||||
if ((isset($produits_selec[$p->id]['actif']) && $produits_selec[$p->id]['actif']) || $quantite) | |||||
{ | |||||
$str_quantite = ''; | |||||
if ($quantite) | |||||
$str_quantite = $quantite; | |||||
$classe = 'total'; | |||||
if ($str_quantite > $produits_selec[$p->id]['quantite_max'] && !$produits_selec[$p->id]['vrac']) | |||||
{ | |||||
$classe .= ' depasse'; | |||||
} | |||||
echo '<td class="' . $classe . '"><strong>' . $str_quantite . '</strong> '; | |||||
if ($produits_selec[$p->id]['quantite_max'] && $str_quantite) | |||||
echo '<br /><span>' . $produits_selec[$p->id]['quantite_max'] . '</span>'; | |||||
echo '</td>' ; | |||||
} | |||||
} | |||||
?> | |||||
</tr> | |||||
</tbody> | |||||
</table> | |||||
</div> | |||||
</div> | |||||
<?php | |||||
/** | |||||
Copyright La boîte à pain (2018) | |||||
contact@laboiteapain.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; | |||||
use common\models\Commande; | |||||
use common\models\User ; | |||||
use yii\helpers\ArrayHelper ; | |||||
use yii\widgets\ActiveForm; | |||||
$this->title = 'Commande'; | |||||
$cpt_non_vrac = 0; | |||||
foreach ($produits as $p) { | |||||
if (isset($produits_selec[$p->id]['actif']) && $produits_selec[$p->id]['actif']) { | |||||
if (!$p->vrac) { | |||||
$cpt_non_vrac ++; | |||||
} | |||||
} | |||||
} | |||||
?> | |||||
<div id="page-commande"> | |||||
<div class="col-md-3" id="col-left"> | |||||
<div class="panel panel-default"> | |||||
<div class="panel-heading"> | |||||
<h3 class="panel-title">Calendrier</h3> | |||||
</div> | |||||
<div class="panel-body"> | |||||
<?php | |||||
// chargement assets | |||||
common\components\fullcalendar\FullcalendarWidget::widget(); | |||||
// --> lancement du js en manuel (via lechatdesnoisettes.js) | |||||
?> | |||||
<div id="calendar"></div> | |||||
<?php if (!$date): ?> | |||||
<br /> | |||||
<div class="alert alert-info"> | |||||
<span class="glyphicon glyphicon-share-alt"></span> Choisissez une date pour initier ou | |||||
éditer un jour de production. | |||||
</div> | |||||
<?php else: ?> | |||||
<a class="btn btn-sm btn-default btn-active-week" href="<?= Yii::$app->urlManager->createUrl(['commande/change-state-semaine', 'date' => $date, 'actif' => !$production_semaine_active, ]); ?>"><span class="glyphicon glyphicon-<?= $production_semaine_active ? 'remove' : 'ok' ?>"></span> <?= $production_semaine_active ? 'Désactiver' : 'Activer' ?> cette semaine de production</a> | |||||
<?php endif; ?> | |||||
</div> | |||||
</div> | |||||
<?php if ($date != ''): ?> | |||||
<div id="bloc-production"> | |||||
<input type="hidden" id="date-production" value="<?= $date ?>" /> | |||||
<input type="hidden" id="id-production" value="<?= $production->id ?>" /> | |||||
<div class="panel panel-default"> | |||||
<div class="panel-heading"> | |||||
<h3 class="panel-title">Production du <strong><?php echo date('d/m/Y', strtotime($date)); ?></strong></h3> | |||||
</div> | |||||
<div class="panel-body"> | |||||
<strong>Production</strong><br /> | |||||
<div class="btn-group" role="group"> | |||||
<a class="btn btn-default<?php if ($production->actif): ?> btn-success<?php endif; ?>" href="<?php echo Yii::$app->urlManager->createUrl(['commande/change-state', 'date' => $date, 'actif' => 1]); ?>">Activé</a> | |||||
<a class="btn btn-default<?php if (!$production->actif): ?> btn-danger<?php endif; ?>" href="<?php echo Yii::$app->urlManager->createUrl(['commande/change-state', 'date' => $date, 'actif' => 0]); ?>">Désactivé</a> | |||||
</div> | |||||
<br /> | |||||
<br /> | |||||
<?php if (!$production->actif): ?> | |||||
<div class="alert alert-info"> | |||||
<span class="glyphicon glyphicon-share-alt"></span> Activez ici la production pour qu'elle soit visible au client. | |||||
</div> | |||||
<?php endif; ?> | |||||
<?php if($production->livraison && count($arr_productions_point_vente)): ?> | |||||
<div id="productions-point-vente"> | |||||
<strong>Points de vente : </strong> | |||||
<div class="checkbox-list"> | |||||
<?= Html::activeCheckboxList( | |||||
$production_point_vente, | |||||
'productions_point_vente', | |||||
$arr_productions_point_vente , | |||||
['encode' => false, 'class' => '']) ?> | |||||
</div> | |||||
</div> | |||||
<?php endif; ?> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
<?php endif; ?> | |||||
<?php if ($production): ?> | |||||
<div id="bloc-produits"> | |||||
<div class="panel panel-default"> | |||||
<div class="panel-heading"> | |||||
<h3 class="panel-title">Produits</h3> | |||||
</div> | |||||
<div class="panel-body"> | |||||
<!-- produits sélectionnés --> | |||||
<form id="produits-production" action="<?php echo Yii::$app->urlManager->createUrl(['commande/index', 'date' => $date]); ?>" method="post"> | |||||
<div class="overflow"> | |||||
<table class="table table-condensed"> | |||||
<thead> | |||||
<tr> | |||||
<th class="td-actif">Actif</th> | |||||
<th class="td-produit">Produit</th> | |||||
<th class="td-max">Max. <span class="glyphicon glyphicon-info-sign" data-toggle="tooltip" data-placement="top" data-original-title="Quantité disponible à la commande. Laisser vide si vous ne souhaitez pas avoir de limite de commande. La valeur par défaut est configurable dans vos produits."></span></th> | |||||
</tr> | |||||
</thead> | |||||
<tbody> | |||||
<?php foreach ($produits as $p): ?> | |||||
<tr<?php if ($p->vrac): ?> style="display:none;"<?php endif; ?> <?php if (isset($produits_selec[$p->id]['actif']) && $produits_selec[$p->id]['actif']): ?>class="active"<?php endif; ?>> | |||||
<td class="td-actif"><input id="produit-<?php echo $p->id; ?>" name="Produit[<?php echo $p->id; ?>][actif]" type="checkbox" <?php if (isset($produits_selec[$p->id]['actif']) && $produits_selec[$p->id]['actif']): ?>checked="checked"<?php endif; ?> /></td> | |||||
<td class="td-produit"><label for="produit-<?php echo $p->id; ?>"><?= Html::encode($p->nom) ?></label></td> | |||||
<td class="td-max"><input class="quantite-max" name="Produit[<?php echo $p->id; ?>][quantite_max]" type="text" value="<?php if (isset($produits_selec[$p->id])) echo $produits_selec[$p->id]['quantite_max']; ?>" /></td> | |||||
</tr> | |||||
<?php endforeach; ?> | |||||
</tbody> | |||||
</table> | |||||
</div> | |||||
<input type="submit" name="valider_produit_selec" class="btn btn-default" value="Valider" /> | |||||
</form> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
<?php endif; ?> | |||||
</div> | |||||
<div class="col-md-9" id="col-right"> | |||||
<input type="hidden" value="<?php echo $date; ?>" id="current-date" /> | |||||
<ul id="jours-production"> | |||||
<?php foreach ($jours_production as $j) : ?> | |||||
<li><?php echo $j->date; ?></li> | |||||
<?php endforeach; ?> | |||||
</ul> | |||||
<?php if ($date != ''): ?> | |||||
<div id="bloc-totaux"> | |||||
<?= $this->render('_total_commandes.php',[ | |||||
'produits' => $produits, | |||||
'commandes' => $commandes, | |||||
'produits_selec' => $produits_selec, | |||||
'recettes' => $recettes, | |||||
'poids' => $poids, | |||||
'ca_potentiel' => $ca_potentiel, | |||||
'poids_total' => $poids_total, | |||||
]); ?> | |||||
</div> | |||||
<?php | |||||
$num_jour_semaine = date('w', strtotime($date)); | |||||
$arr_jour_semaine = [0 => 'dimanche', 1 => 'lundi', 2 => 'mardi', 3 => 'mercredi', 4 => 'jeudi', 5 => 'vendredi', 6 => 'samedi']; | |||||
$champs_horaires_point_vente = 'horaires_' . $arr_jour_semaine[$num_jour_semaine]; | |||||
?> | |||||
<div class="panel panel-default" id="panel-commandes"> | |||||
<div class="panel-heading"> | |||||
<h3 class="panel-title"> | |||||
Commandes | |||||
<?php if (!count($commandes)): ?><span class="label label-danger">0</span> | |||||
<?php else: ?><span class="label label-success"><?= count($commandes) ?></span> | |||||
<?php endif; ?> | |||||
<?php if (count($commandes)): ?> | |||||
<a id="btn-export-commandes" class="btn btn-primary" href="<?php echo Yii::$app->urlManager->createUrl(['commande/report', 'date' => $date, 'id_point_vente' => 0, 'global' => 1]); ?>"><span class="glyphicon glyphicon-download-alt"></span> Exporter</a> | |||||
<?php endif; ?> | |||||
<div id="btn-commandes-auto" class="btn-group"> | |||||
<button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> | |||||
<span class="glyphicon glyphicon-repeat"></span> Commandes récurrentes <span class="caret"></span> | |||||
</button> | |||||
<ul class="dropdown-menu"> | |||||
<li><a href="<?= Yii::$app->urlManager->createUrl(['commande/add-commandes-auto', 'date' => $date]); ?>">Importer toutes les commandes</a></li> | |||||
</ul> | |||||
</div> | |||||
</h3> | |||||
</div> | |||||
<div class="panel-body"> | |||||
<div class="col-md-12"> | |||||
<div class="alert alert-danger" style="display:none;">Aucun point de vente activé</div> | |||||
<!-- Nav tabs --> | |||||
<ul id="tabs-points-vente" class="nav nav-tabs" role="tablist"> | |||||
<?php foreach($points_vente as $pv): ?> | |||||
<li role="presentation" class="<?php if($pv->point_fabrication): ?>active<?php endif; ?>"> | |||||
<a href="#point-vente-<?= $pv->id ?>" id="btn-point-vente-<?= $pv->id ?>" aria-controls="point-vente-<?= $pv->id ?>" role="tab" data-toggle="tab"><?= Html::encode($pv->nom) ?> <span class="badge badge-<?php if(count($pv->commandes)): ?>success<?php else: ?>danger<?php endif; ?>"><?php echo count($pv->commandes); ?></span></a> | |||||
</li> | |||||
<?php endforeach; ?> | |||||
</ul> | |||||
<!-- Tab panes --> | |||||
<div class="tab-content" id="commandes-points-vente"> | |||||
<?php foreach($points_vente as $pv): ?> | |||||
<div role="tabpanel" data-id-pv="<?= $pv->id ?>" class="bloc-point-vente tab-pane <?php if($pv->point_fabrication): ?> active<?php endif; ?>" id="point-vente-<?= $pv->id ?>"> | |||||
<div class="col-md-12"> | |||||
<div class="alert alert-warning recap-pv <?php if(!count($pv->commandes)): ?>no-commande<?php endif; ?>"> | |||||
<?php if(count($pv->commandes)): ?> | |||||
<strong class="commandes"><?= count($pv->commandes) ?> commande<?php if(count($pv->commandes) > 1): ?>s<?php endif; ?></strong> | |||||
<span class="recettes"><?= number_format($pv->recettes, 2) ?> €</span> | |||||
<?php else: ?> | |||||
<strong class="commandes">Aucune commande</strong> | |||||
<span class="recettes"></span> | |||||
<?php endif; ?> | |||||
</div> | |||||
<ul class="liste-commandes btn-group-vertical<?php if(!count($pv->commandes)): ?> no-commande<?php endif; ?>"> | |||||
<?php foreach($pv->commandes as $c): ?> | |||||
<li> | |||||
<a href="javascript:void(0);" class="btn btn-default" data-pv-id="<?= $pv->id ?>" data-id-commande="<?= $c->id ?>" data-commande='<?= $pv->data_options_commandes[$c->id]['data-commande'] ?>' data-commentaire="<?= Html::encode($c->commentaire) ?>" data-date="<?= date('d/m à H:i',strtotime($c->date)); ?>"> | |||||
<span class="montant <?php if(number_format($c->montant_paye,2) >= number_format($c->montant,2)): ?>paye<?php endif; ?>"> | |||||
<?= Html::encode(number_format($c->montant, 2)); ?> € | |||||
<?php if($c->montant_paye - $c->montant > 0.01): ?><span class="glyphicon glyphicon-warning-sign"></span><?php endif; ?> | |||||
</span> | |||||
<span class="user"> | |||||
<?php if($c->type): ?> | |||||
<?php if($c->type == Commande::TYPE_ADMIN): ?> | |||||
<span class="label label-warning">vous</span> | |||||
<?php elseif($c->type == Commande::TYPE_AUTO): ?> | |||||
<span class="label label-default">auto</span> | |||||
<?php elseif($c->type == Commande::TYPE_USER): ?> | |||||
<span class="label label-success">client</span> | |||||
<?php endif; ?> | |||||
<?php endif; ?> | |||||
<?php if(isset($c->user)): ?> | |||||
<?= Html::encode($c->user->nom.' '.$c->user->prenom); ?> | |||||
<?php else: ?> | |||||
<?= Html::encode($c->username); ?> | |||||
<?php endif; ?> | |||||
<?php if(!is_null($c->date_delete)): ?> | |||||
(<span class="glyphicon glyphicon-remove"></span> Annulée) | |||||
<?php endif; ?> | |||||
</span> | |||||
<?php if (strlen($c->commentaire)): ?> | |||||
<span class="glyphicon glyphicon-comment"></span> | |||||
<?php endif; ?> | |||||
</a> | |||||
</li> | |||||
<?php endforeach; ?> | |||||
</ul> | |||||
<?= Html::a('<span class="glyphicon glyphicon-plus"></span> Créer une commande', 'javascript:void(0);', ['class' => 'btn btn-default creer-commande', 'data-pv-id' => $pv->id]) ?> | |||||
</div> | |||||
<div class="col-md-12 bloc-commande"> | |||||
<h2 class="title-user"> | |||||
<span class="buttons-edit-remove"> | |||||
<?= Html::a('<span class="glyphicon glyphicon-trash"></span> Supprimer', 'javascript:void(0);', ['class' => 'btn btn-default btn-remove']) ?> | |||||
<?= Html::a('<span class="glyphicon glyphicon-pencil"></span> Modifier', 'javascript:void(0);', ['class' => 'btn btn-default btn-edit']) ?> | |||||
</span> | |||||
<span class="buttons-save-cancel"> | |||||
<?= Html::a('<span class="glyphicon glyphicon-ok"></span> Sauvegarder', 'javascript:void(0);', ['class' => 'btn btn-primary btn-save']) ?> | |||||
<?= Html::a('<span class="glyphicon glyphicon-remove"></span> Annuler', 'javascript:void(0);', ['class' => 'btn btn-default btn-cancel']) ?> | |||||
</span> | |||||
<span class="the-title"></span> | |||||
<span class="choix-user"> | |||||
<?= Html::activeDropDownList(new User, 'id', ArrayHelper::map(User::find()->joinWith('userEtablissement')->where('user_etablissement.id_etablissement = '.Yii::$app->user->identity->id_etablissement)->andWhere('user_etablissement.actif = 1')->orderBy('user.nom ASC, user.prenom ASC')->all(), 'id', function($model, $defaultValue) { | |||||
return $model['nom'].' '.$model['prenom']; | |||||
}), ['prompt' => '--','class' => 'form-control user-id']) ?> | |||||
OU <input type="text" class="form-control username" placeholder="Choisissez un nom" /> | |||||
</span> | |||||
</h2> | |||||
<div class="commentaire alert alert-info"> | |||||
</div> | |||||
<textarea name="commentaire" class="form-control textarea-commentaire" placeholder="Commentaire"></textarea> | |||||
<table class="table table-bordered table-condensed tab-content table-produits"> | |||||
<tbody> | |||||
<?php foreach ($produits as $p): ?> | |||||
<tr class="produit-<?= $p->id ?> <?php if(!$produits_selec[$p->id]['actif']): ?> disabled<?php endif; ?>" data-id-produit="<?= $p->id ?>"> | |||||
<td class="td-commande"></td> | |||||
<td class="td-produit"><?php echo Html::encode($p->getLibelleAdmin()); ?></td> | |||||
</tr> | |||||
<?php endforeach; ?> | |||||
<tr class="tr-total"> | |||||
<td class="td-total"></td> | |||||
<td class="td-paiement"></td> | |||||
</tr> | |||||
</tbody> | |||||
</table> | |||||
</div> | |||||
</div> | |||||
<?php endforeach; ?> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
<?php endif; ?> | |||||
</div> | |||||
</div> |
<?php | |||||
/** | |||||
Copyright La boîte à pain (2018) | |||||
contact@laboiteapain.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 common\models\Commande ; | |||||
$num_jour_semaine = date('w', strtotime($date)); | |||||
$arr_jour_semaine = [0 => 'dimanche', 1 => 'lundi', 2 => 'mardi', 3 => 'mercredi', 4 => 'jeudi', 5 => 'vendredi', 6 => 'samedi']; | |||||
$champs_horaires_point_vente = 'horaires_' . $arr_jour_semaine[$num_jour_semaine]; | |||||
$html = '' ; | |||||
// par point de vente | |||||
foreach ($points_vente as $pv) { | |||||
if (count($pv->commandes) && strlen($pv->$champs_horaires_point_vente)) { | |||||
$html .= '<h3>'.$pv->nom.'</h3>' ; | |||||
$col_credit_pain = '' ; | |||||
if($pv->credit_pain) { | |||||
$col_credit_pain = '<th>Rappel crédit</th>' ; | |||||
} | |||||
$html .= '<table class="table table-bordered">' | |||||
. '<thead>' | |||||
. '<tr>' | |||||
. '<th>Client</th>' | |||||
. '<th>Produits</th>' | |||||
. '<th>Commentaire</th>' | |||||
. $col_credit_pain | |||||
. '<th>Montant</th>' | |||||
. '</tr>' | |||||
. '<tbody>'; | |||||
foreach ($pv->commandes as $c) { | |||||
$html .= '<tr>' ; | |||||
$str_user = ''; | |||||
// username | |||||
if ($c->user) { | |||||
$str_user = $c->user->prenom . " " . $c->user->nom; //.' - '.date('d/m', strtotime($c->date)) ; | |||||
} else { | |||||
$str_user = $c->username; //.' - '.date('d/m', strtotime($c->date)) ; | |||||
} | |||||
if(strlen($c->commentaire_point_vente)) | |||||
{ | |||||
$str_user .= '<br /><em>'.$c->commentaire_point_vente.'</em>' ; | |||||
} | |||||
// téléphone | |||||
if (isset($c->user) && strlen($c->user->telephone)) { | |||||
$str_user .= '<br />' . $c->user->telephone . ''; | |||||
} | |||||
$html .= '<td>'.$str_user.'</td>'; | |||||
// produits | |||||
$str_produits = ''; | |||||
foreach ($produits as $p) { | |||||
$add = false; | |||||
foreach ($c->commandeProduits as $cp) { | |||||
if ($p->id == $cp->id_produit) { | |||||
$str_produits .= $cp->quantite . ' ' . $p->nom . ', '; | |||||
$add = true; | |||||
} | |||||
} | |||||
} | |||||
$html .= '<td>'.substr($str_produits, 0, strlen($str_produits) - 2).'</td>'; | |||||
$html .= '<td>'.$c->commentaire.'</td>'; | |||||
if($pv->credit_pain) { | |||||
$credit = '' ; | |||||
if(isset($c->user) && isset($c->user->userEtablissement)) { | |||||
$credit = number_format($c->user->userEtablissement[0]->credit,2).' €' ; | |||||
} | |||||
$html .= '<td>'.$credit.'</td>' ; | |||||
} | |||||
$html .= '<td><strong>'.number_format($c->montant, 2) . ' € '; | |||||
if($c->getStatutPaiement() == Commande::STATUT_PAYEE) | |||||
{ | |||||
$html .= '(payé)' ; | |||||
} | |||||
elseif($c->getStatutPaiement() == Commande::STATUT_IMPAYEE && $c->getMontantPaye()) | |||||
{ | |||||
$html .= '(reste '.$c->getMontantRestant(true).' à payer)' ; | |||||
} | |||||
elseif($c->getStatutPaiement() == Commande::STATUT_SURPLUS) | |||||
{ | |||||
$html .= '(surplus : '.$c->getMontantSurplus(true).' à rembourser)' ; | |||||
} | |||||
$html .= '</strong></td>' ; | |||||
$html .= '</tr>' ; | |||||
} | |||||
$html .= '<tr><td><strong>Total</strong></td>' ; | |||||
$str_produits = ''; | |||||
foreach ($produits as $p) { | |||||
if (!$p->vrac) { | |||||
$quantite = Commande::getQuantiteProduit($p->id, $pv->commandes); | |||||
$str_quantite = ''; | |||||
if ($quantite) { | |||||
$str_quantite = $quantite; | |||||
$str_produits .= $str_quantite .' '. $p->nom . ', '; | |||||
} | |||||
} | |||||
} | |||||
$str_produits = substr($str_produits, 0, strlen($str_produits) - 2) ; | |||||
$html .= '<td>'.$str_produits.'</td><td></td>' ; | |||||
if($pv->credit_pain) { | |||||
$html .= '<td></td>' ; | |||||
} | |||||
$html .= '<td><strong>'.number_format($pv->recettes, 2) . ' €</strong></td>'; | |||||
$html .= '</tbody></table><pagebreak>' ; | |||||
} | |||||
} | |||||
// par point de vente | |||||
$html .= '<h3>Points de vente</h3>' ; | |||||
$html .= '<table class="table table-bordered">' | |||||
. '<thead>' | |||||
. '<tr>' | |||||
. '<th>Point de vente</th>' | |||||
. '<th>Produits</th>' | |||||
. '<th>Montant</th>' | |||||
. '</tr>' | |||||
. '<tbody>'; | |||||
$recettes = 0 ; | |||||
foreach ($points_vente as $pv) | |||||
{ | |||||
if (count($pv->commandes) && strlen($pv->$champs_horaires_point_vente)) | |||||
{ | |||||
$html .= '<tr><td>'.$pv->nom.'</td><td>' ; | |||||
foreach ($produits as $p) { | |||||
$quantite = Commande::getQuantiteProduit($p->id, $pv->commandes); | |||||
$str_quantite = ''; | |||||
if (!$p->vrac) { | |||||
if ($quantite) | |||||
$str_quantite = $quantite; | |||||
} | |||||
if(strlen($str_quantite)) | |||||
$html .= $str_quantite . ' '.$p->nom.', ' ; | |||||
} | |||||
$html = substr($html, 0, strlen($html) - 2) ; | |||||
$html .= '</td><td>'.number_format($pv->recettes, 2).' €</td></tr>' ; | |||||
$recettes += $pv->recettes ; | |||||
} | |||||
} | |||||
// total | |||||
$html .= '<tr><td><strong>Total</strong></td><td>' ; | |||||
foreach ($produits as $p) { | |||||
$quantite = Commande::getQuantiteProduit($p->id, $commandes); | |||||
if(!$p->vrac && $quantite) | |||||
$html .= $quantite . ' '.$p->nom.', ' ; | |||||
} | |||||
$html = substr($html, 0, strlen($html) - 2) ; | |||||
$html .= '</td><td><strong>'.number_format($recettes, 2).' €</strong></td></tr>' ; | |||||
$html .= '</tbody></table>' ; | |||||
echo $html ; | |||||
?> |
<?php | <?php | ||||
/** | /** | ||||
Copyright La boîte à pain (2018) | |||||
Copyright distrib (2018) | |||||
contact@laboiteapain.net | |||||
contact@opendistrib.net | |||||
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\helpers\Html ; | use yii\helpers\Html ; | ||||
/* | |||||
* To change this license header, choose License Headers in Project Properties. | |||||
* To change this template file, choose Tools | Templates | |||||
* and open the template in the editor. | |||||
*/ | |||||
$this->title = 'Communiquer' ; | |||||
$this->setTitle('Communiquer') ; | |||||
$this->addBreadcrumb('Communiquer') ; | |||||
?> | ?> | ||||
<h1><?= Html::encode($this->title) ; ?></h1> | |||||
<p>Imprimez ce petit encart pour expliquer à vos clients comment passer leurs commandes.</p> | <p>Imprimez ce petit encart pour expliquer à vos clients comment passer leurs commandes.</p> | ||||
<?php echo $this->render('mode_emploi', ['etablissement' => $etablissement]) ; ?> | |||||
<p><?php echo Html::a('<span class="glyphicon glyphicon-download-alt"></span> Télécharger', ['communiquer/modeemploi'], ['class'=>'btn btn-primary']) ?></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> | |||||
<?php | <?php | ||||
/** | /** | ||||
Copyright La boîte à pain (2018) | |||||
Copyright distrib (2018) | |||||
contact@laboiteapain.net | |||||
contact@opendistrib.net | |||||
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 class="communiquer-mode-emploi<?php if(isset($pdf) && $pdf): ?> communiquer-mode-emploi-pdf<?php endif; ?><?php if(!isset($pdf)): ?> communiquer-mode-emploi-encart<?php endif; ?>"> | |||||
<div class="communicate-instructions<?php if(isset($pdf) && $pdf): ?> communicate-instructions-pdf<?php endif; ?><?php if(!isset($pdf)): ?> communicate-instructions-inset<?php endif; ?>"> | |||||
<div class="header"> | <div class="header"> | ||||
<div class="logo"> | <div class="logo"> | ||||
<img src="./img/laboulange4.png" alt="Logo" /> | |||||
<img src="../img/laboulange4.png" alt="Logo" /> | |||||
</div> | </div> | ||||
<h1>La boîte à pain</h1> | |||||
<h2>Plateforme de réservation de pain</h2> | |||||
<h1>distrib</h1> | |||||
<h2>Plateforme de gestion de commandes</h2> | |||||
</div> | </div> | ||||
<div class="clr"></div> | <div class="clr"></div> | ||||
<h3>Pour réserver votre pain en ligne</h3> | |||||
<h3>Pour réserver vos produits en ligne</h3> | |||||
<ol> | <ol> | ||||
<li>Inscrivez-vous sur <strong>www.laboiteapain.net</strong></li> | |||||
<?php if(strlen($etablissement->code)): ?> | |||||
<li>Ajoutez le producteur <strong><?= Html::encode($etablissement->nom); ?></strong><br />grâce au code : <span class="code"><strong><?= Html::encode($etablissement->code) ?></strong> <?php if(!isset($pdf)): echo Html::a('<span class="glyphicon glyphicon-pencil"></span>', ['etablissement/update'], ['class'=> 'btn btn-default btn-xs']); endif; ?></span></li> | |||||
<?php else: ?> | |||||
<li>Ajoutez la producteur <strong><?= Html::encode($etablissement->nom); ?></strong></li> | |||||
<li>Inscrivez-vous sur <strong>www.opendistrib.net</strong> en choisisant le producteur <strong><?= Html::encode($producer->name); ?></strong></li> | |||||
<?php if(strlen($producer->code)): ?> | |||||
<li>Utilisez le code : <span class="code"><strong><?= Html::encode($producer->code) ?></strong> <?php if(!isset($pdf)): echo Html::a('<span class="glyphicon glyphicon-pencil"></span>', ['producer/update'], ['class'=> 'btn btn-default btn-xs']); endif; ?></span></li> | |||||
<?php endif; ?> | <?php endif; ?> | ||||
<li>Passez votre commande</li> | <li>Passez votre commande</li> | ||||
</ol> | </ol> |
<?php | <?php | ||||
/** | /** | ||||
Copyright La boîte à pain (2018) | |||||
Copyright distrib (2018) | |||||
contact@laboiteapain.net | |||||
contact@opendistrib.net | |||||
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 for($i = 0; $i < 8; $i++): ?> | <?php for($i = 0; $i < 8; $i++): ?> | ||||
<div class="bloc-mode-emploi-pdf<?php if($i%2 == 0): ?> bloc-mode-emploi-border<?php endif; ?><?php if($i == 6 || $i == 7): ?> bloc-mode-emploi-bottom<?php endif; ?>"> | |||||
<?php echo $this->render('mode_emploi',['pdf' => true, 'etablissement' => $etablissement]) ; ?> | |||||
<div class="block-instructions-pdf<?php if($i%2 == 0): ?> block-instructions-border<?php endif; ?><?php if($i == 6 || $i == 7): ?> block-instructions-bottom<?php endif; ?>"> | |||||
<?php echo $this->render('instructions',['pdf' => true, 'producer' => $producer]) ; ?> | |||||
</div> | </div> | ||||
<?php endfor; ?> | <?php endfor; ?> |
<?php | <?php | ||||
/** | /** | ||||
Copyright La boîte à pain (2018) | |||||
Copyright distrib (2018) | |||||
contact@laboiteapain.net | |||||
contact@opendistrib.net | |||||
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. | ||||
/* @var $form yii\widgets\ActiveForm */ | /* @var $form yii\widgets\ActiveForm */ | ||||
?> | ?> | ||||
<div class="developpement-form"> | |||||
<div class="development-form"> | |||||
<?php $form = ActiveForm::begin(); ?> | <?php $form = ActiveForm::begin(); ?> | ||||
<?= $form->field($model, 'type')->dropDownList([ | <?= $form->field($model, 'type')->dropDownList([ | ||||
Developpement::TYPE_EVOLUTION => 'Évolution', | |||||
Developpement::TYPE_BUG => 'Anomalie', | |||||
Development::TYPE_EVOLUTION => 'Évolution', | |||||
Development::TYPE_BUG => 'Anomalie', | |||||
]) ?> | ]) ?> | ||||
<?= $form->field($model, 'statut')->dropDownList([ | |||||
Developpement::STATUT_OPEN => 'Ouvert', | |||||
Developpement::STATUT_CLOSED => 'Fermé', | |||||
<?= $form->field($model, 'status')->dropDownList([ | |||||
Development::STATUS_OPEN => 'Ouvert', | |||||
Development::STATUS_CLOSED => 'Fermé', | |||||
]) ?> | ]) ?> | ||||
<?= $form->field($model, 'objet')->textInput(['maxlength' => true]) ?> | |||||
<?= $form->field($model, 'subject')->textInput(['maxlength' => true]) ?> | |||||
<?= $form->field($model, 'description')->textarea(['rows' => 6]) ?> | <?= $form->field($model, 'description')->textarea(['rows' => 6]) ?> | ||||
<?= $form->field($model, 'estimation_temps')->textInput() ?> | |||||
<?= $form->field($model, 'avancement')->textInput() ?> | |||||
<?= $form->field($model, 'date_livraison')->textInput() ?> | |||||
<?= $form->field($model, 'time_estimate')->textInput() ?> | |||||
<?= $form->field($model, 'progress')->textInput() ?> | |||||
<?= $form->field($model, 'date_delivery')->textInput() ?> | |||||
<div class="form-group"> | <div class="form-group"> | ||||
<?= Html::submitButton($model->isNewRecord ? 'Ajouter' : 'Modifier', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?> | <?= Html::submitButton($model->isNewRecord ? 'Ajouter' : 'Modifier', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?> |
<?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('Ajouter un développement') ; | |||||
$this->addBreadcrumb(['label' => 'Développement', 'url' => ['index']]) ; | |||||
$this->addBreadcrumb('Ajouter') ; | |||||
?> | |||||
<div class="development-create"> | |||||
<?= $this->render('_form', [ | |||||
'model' => $model, | |||||
]) ?> | |||||
</div> |
<?php | <?php | ||||
/** | /** | ||||
Copyright La boîte à pain (2018) | |||||
Copyright distrib (2018) | |||||
contact@laboiteapain.net | |||||
contact@opendistrib.net | |||||
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\helpers\Html; | use yii\helpers\Html; | ||||
use yii\grid\GridView; | use yii\grid\GridView; | ||||
use common\models\Developpement; | |||||
use common\models\DeveloppementPriorite; | |||||
use common\models\Development; | |||||
use common\models\DevelopmentPriority; | |||||
use common\models\User; | use common\models\User; | ||||
use common\helpers\Url; | use common\helpers\Url; | ||||
/* @var $this yii\web\View */ | |||||
/* @var $dataProvider yii\data\ActiveDataProvider */ | |||||
$this->setTitle('Développement') ; | |||||
$this->addButton(['label' => '+', 'url' => ['development/create'], 'class' => 'btn btn-primary']) ; | |||||
$this->addBreadcrumb($this->getTitle()) ; | |||||
$this->title = 'Développement'; | |||||
$this->params['breadcrumbs'][] = $this->title; | |||||
?> | ?> | ||||
<div class="developpement-index"> | |||||
<h1><?= Html::encode($this->title) ?> <?= Html::a('Ajouter', ['create'], ['class' => 'btn btn-success']) ?></h1> | |||||
<div class="development-index"> | |||||
<div class="well"> | <div class="well"> | ||||
Cette page liste les besoins recencés auprès des producteurs utilisant la plateforme. N'hésitez pas à me <a href="<?= Url::frontend('site/contact') ?>">contacter</a> pour la faire évoluer. Les remontées de bugs sont également bienvenues.<br /> | |||||
Cette page liste les besoins recencés auprès des producteurs utilisant la plateforme. N'hésitez pas à me <a href="<?= Yii::$app->urlManagerFrontend->createAbsoluteUrl(['site/contact']) ; ?>">contacter</a> pour la faire évoluer. Les remontées de bugs sont également bienvenues.<br /> | |||||
Afin d'orienter de manière pertinente le développement de la plateforme, je vous invite à définir la priorité des évolutions qui vous intéressent. | Afin d'orienter de manière pertinente le développement de la plateforme, je vous invite à définir la priorité des évolutions qui vous intéressent. | ||||
</div> | </div> | ||||
<?php | |||||
foreach (Yii::$app->session->getAllFlashes() as $key => $message) { | |||||
echo '<div class="alert alert-' . $key . '">' . $message . '</div>'; | |||||
} | |||||
?> | |||||
<ul id="tabs-statuts-developpements" class="nav nav-tabs" role="tablist"> | |||||
<li role="presentation" class="<?php if($statut == Developpement::STATUT_OPEN): ?>active<?php endif; ?>"><a href="<?= Yii::$app->urlManager->createUrl(['developpement/index','statut' => Developpement::STATUT_OPEN]); ?>" id="" aria-controls="" role="tab">Ouvert</a></li> | |||||
<li role="presentation" class="<?php if($statut == Developpement::STATUT_CLOSED): ?>active<?php endif; ?>"><a href="<?= Yii::$app->urlManager->createUrl(['developpement/index','statut' => Developpement::STATUT_CLOSED]); ?>" id="" aria-controls="" role="tab">Fermé</a></li> | |||||
<ul id="tab-status-developments" class="nav nav-tabs" role="tablist"> | |||||
<li role="presentation" class="<?php if($status == Development::STATUS_OPEN): ?>active<?php endif; ?>"><a href="<?= Yii::$app->urlManager->createUrl(['development/index','status' => Development::STATUS_OPEN]); ?>" id="" aria-controls="" role="tab">Ouvert</a></li> | |||||
<li role="presentation" class="<?php if($status == Development::STATUS_CLOSED): ?>active<?php endif; ?>"><a href="<?= Yii::$app->urlManager->createUrl(['development/index','status' => Development::STATUS_CLOSED]); ?>" id="" aria-controls="" role="tab">Fermé</a></li> | |||||
</ul> | </ul> | ||||
<?php | <?php | ||||
'header' => 'Type', | 'header' => 'Type', | ||||
'format' => 'raw', | 'format' => 'raw', | ||||
'value' => function($model) { | 'value' => function($model) { | ||||
if($model->type == Developpement::TYPE_EVOLUTION) { | |||||
if($model->type == Development::TYPE_EVOLUTION) { | |||||
return '<span class="label label-success">Évolution</span>' ; | return '<span class="label label-success">Évolution</span>' ; | ||||
} | } | ||||
else { | else { | ||||
[ 'attribute' => 'sujet', | [ 'attribute' => 'sujet', | ||||
'format' => 'raw', | 'format' => 'raw', | ||||
'value' => function($model) { | 'value' => function($model) { | ||||
$html = '<strong>'.Html::encode($model->objet).'</strong>' ; | |||||
$html = '<strong>'.Html::encode($model->subject).'</strong>' ; | |||||
if(strlen($model->description)) | if(strlen($model->description)) | ||||
$html .= '<br />'.nl2br(Html::encode($model->description)) ; | $html .= '<br />'.nl2br(Html::encode($model->description)) ; | ||||
return $html ; | return $html ; | ||||
'header' => 'Estimation', | 'header' => 'Estimation', | ||||
'format' => 'raw', | 'format' => 'raw', | ||||
'value' => function($model) { | 'value' => function($model) { | ||||
return intval($model->estimation_temps).' h' ; | |||||
return intval($model->time_estimate).' h' ; | |||||
}], | }], | ||||
[ 'attribute' => 'avancement', | [ 'attribute' => 'avancement', | ||||
'format' => 'raw', | 'format' => 'raw', | ||||
'value' => function($model) { | 'value' => function($model) { | ||||
if($model->avancement) | |||||
if($model->progress) | |||||
return '<div class="progress"> | return '<div class="progress"> | ||||
<div class="progress-bar progress-bar-warning" role="progressbar" aria-valuenow="'.intval($model->avancement).'" aria-valuemin="0" aria-valuemax="100" style="width: '.intval($model->avancement).'%;"> | |||||
<span class="sr-only">'.intval($model->avancement).'% effectué</span> | |||||
<div class="progress-bar progress-bar-warning" role="progressbar" aria-valuenow="'.intval($model->progress).'" aria-valuemin="0" aria-valuemax="100" style="width: '.intval($model->progress).'%;"> | |||||
<span class="sr-only">'.intval($model->progress).'% effectué</span> | |||||
</div> | </div> | ||||
</div> ' ; | </div> ' ; | ||||
else | else | ||||
return '' ; | return '' ; | ||||
}], | }], | ||||
[ 'attribute' => 'date_livraison', | |||||
[ 'attribute' => 'date_delivery', | |||||
'format' => 'raw', | 'format' => 'raw', | ||||
'value' => function($model) { | 'value' => function($model) { | ||||
if(strlen($model->date_livraison)) | |||||
return date('d/m/Y',strtotime($model->date_livraison)) ; | |||||
if(strlen($model->date_delivery)) | |||||
return date('d/m/Y',strtotime($model->date_delivery)) ; | |||||
else | else | ||||
return '' ; | return '' ; | ||||
}], | }], | ||||
] ; | ] ; | ||||
if(Yii::$app->user->identity->status == USER::STATUS_ADMIN | |||||
|| Yii::$app->user->identity->status == USER::STATUS_BOULANGER) { | |||||
if(User::hasAccessBackend()) { | |||||
$columns[] = [ | $columns[] = [ | ||||
'header' => 'Priorité', | 'header' => 'Priorité', | ||||
'format' => 'raw', | 'format' => 'raw', | ||||
'value' => function($model) { | 'value' => function($model) { | ||||
$current_priorite = (isset($model->developpementPrioriteCurrentEtablissement)) ? $model->developpementPrioriteCurrentEtablissement->getStrPriorite() : 'Non' ; | |||||
$style_bouton = (isset($model->developpementPrioriteCurrentEtablissement)) ? $model->developpementPrioriteCurrentEtablissement->getClassCssStyleBouton() : 'default' ; | |||||
$currentPriority = (isset($model->developmentPrioritYCurrentProducer)) ? $model->developmentPriorityCurrentProducer->getStrPriority() : 'Non' ; | |||||
$styleButton = (isset($model->developmentPriorityCurrentProducer)) ? $model->developmentPriorityCurrentProducer->getClassCssStyleButton() : 'default' ; | |||||
$html = '<div class="btn-group btn-group-priorite"> | $html = '<div class="btn-group btn-group-priorite"> | ||||
<button type="button" class="btn btn-priorite btn-sm btn-'.$style_bouton.' dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> | |||||
'.$current_priorite.' <span class="caret"></span> | |||||
<button type="button" class="btn btn-priorite btn-sm btn-'.$styleButton.' dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> | |||||
'.$currentPriority.' <span class="caret"></span> | |||||
</button> | </button> | ||||
<ul class="dropdown-menu"> | <ul class="dropdown-menu"> | ||||
<li><a href="'.Yii::$app->urlManager->createUrl(['developpement/priorite','id_developpement'=>$model->id]).'">Non</a></li> | |||||
<li><a href="'.Yii::$app->urlManager->createUrl(['developpement/priorite','id_developpement'=>$model->id, 'priorite' => DeveloppementPriorite::PRIORITE_BASSE]).'">Basse</a></li> | |||||
<li><a href="'.Yii::$app->urlManager->createUrl(['developpement/priorite','id_developpement'=>$model->id, 'priorite' => DeveloppementPriorite::PRIORITE_NORMALE]).'">Normale</a></li> | |||||
<li><a href="'.Yii::$app->urlManager->createUrl(['developpement/priorite','id_developpement'=>$model->id, 'priorite' => DeveloppementPriorite::PRIORITE_HAUTE]).'">Haute</a></li> | |||||
<li><a href="'.Yii::$app->urlManager->createUrl(['development/priority','idDevelopment' => $model->id]).'">Non</a></li> | |||||
<li><a href="'.Yii::$app->urlManager->createUrl(['development/priority','idDevelopment' => $model->id, 'priority' => DevelopmentPriority::PRIORITY_LOW]).'">Basse</a></li> | |||||
<li><a href="'.Yii::$app->urlManager->createUrl(['development/priority','idDevelopment' => $model->id, 'priority' => DevelopmentPriority::PRIORITY_NORMAL]).'">Normale</a></li> | |||||
<li><a href="'.Yii::$app->urlManager->createUrl(['development/priority','idDevelopment' => $model->id, 'priority' => DevelopmentPriority::PRIORITY_HIGH]).'">Haute</a></li> | |||||
</ul> | </ul> | ||||
</div><br />' ; | </div><br />' ; | ||||
if(isset($model->developpementPriorite) && count($model->developpementPriorite)) { | |||||
foreach($model->developpementPriorite as $developpement_priorite) { | |||||
if($developpement_priorite->id_etablissement != Yii::$app->user->identity->id_etablissement) | |||||
$html .= '<div class="label label-priorite label-sm label-'.$developpement_priorite->getClassCssStyleBouton().'">'.Html::encode($developpement_priorite->etablissement->nom).'</div> ' ; | |||||
if(isset($model->developmentPriority) && count($model->developmentPriority)) { | |||||
foreach($model->developmentPriority as $developmentPriority) { | |||||
if($developmentPriority->id_producer != Producer::getId()) | |||||
$html .= '<div class="label label-priorite label-sm label-'.$developmentPriority->getClassCssStyleButton().'">'.Html::encode($developmentPriority->producer->name).'</div> ' ; | |||||
} | } | ||||
} | } | ||||
] ; | ] ; | ||||
} | } | ||||
if(Yii::$app->user->identity->status == USER::STATUS_ADMIN) { | |||||
if(User::getCurrentStatus() == USER::STATUS_ADMIN) { | |||||
$columns[] = [ | $columns[] = [ | ||||
'class' => 'yii\grid\ActionColumn', | 'class' => 'yii\grid\ActionColumn', | ||||
'template' => '{update}', | 'template' => '{update}', | ||||
<span class="sr-only">Toggle Dropdown</span> | <span class="sr-only">Toggle Dropdown</span> | ||||
</button> | </button> | ||||
<ul class="dropdown-menu"> | <ul class="dropdown-menu"> | ||||
<li><a href="'.Yii::$app->urlManager->createUrl(['developpement/delete','id' => $model->id]).'" class=""><span class="glyphicon glyphicon-trash"></span> Supprimer</a></li> | |||||
<li><a href="'.Yii::$app->urlManager->createUrl(['development/delete','id' => $model->id]).'" class=""><span class="glyphicon glyphicon-trash"></span> Supprimer</a></li> | |||||
</ul> | </ul> | ||||
</div>' ; | </div>' ; | ||||
}, | }, | ||||
<?= | <?= | ||||
GridView::widget([ | GridView::widget([ | ||||
'id' => 'tab-developpements', | |||||
'id' => 'tab-developments', | |||||
'dataProvider' => $dataProvider, | 'dataProvider' => $dataProvider, | ||||
'columns' => $columns | 'columns' => $columns | ||||
]); | ]); |
<?php | <?php | ||||
/** | /** | ||||
Copyright La boîte à pain (2018) | |||||
Copyright distrib (2018) | |||||
contact@laboiteapain.net | |||||
contact@opendistrib.net | |||||
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\helpers\Html; | use yii\helpers\Html; | ||||
$this->setTitle('Modifier un développement') ; | |||||
$this->addBreadcrumb(['label' => 'Développement', 'url' => ['index']]) ; | |||||
$this->addBreadcrumb(['label' => '#'.$model->id, 'url' => ['update', 'id' => $model->id]]) ; | |||||
$this->addBreadcrumb('Modifier') ; | |||||
/* @var $this yii\web\View */ | |||||
/* @var $model backend\models\PointVente */ | |||||
$this->title = 'Ajouter un point de vente'; | |||||
$this->params['breadcrumbs'][] = ['label' => 'Points de vente', 'url' => ['index']]; | |||||
$this->params['breadcrumbs'][] = 'Ajouter'; | |||||
?> | ?> | ||||
<div class="point-vente-create"> | |||||
<h1><?= Html::encode($this->title) ?></h1> | |||||
<div class="development-update"> | |||||
<?= $this->render('_form', [ | <?= $this->render('_form', [ | ||||
'model' => $model, | 'model' => $model, | ||||
'users' => $users, | |||||
]) ?> | ]) ?> | ||||
</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. | |||||
*/ | |||||
\backend\assets\VuejsDistributionIndexAsset::register($this); | |||||
$this->setTitle('Distributions') ; | |||||
$this->setPageTitle('Distributions') ; | |||||
?> | |||||
<div id="app-distribution-index"> | |||||
<?php if(strlen($date)): ?> | |||||
<span id="distribution-date"><?= $date; ?></span> | |||||
<?php endif; ?> | |||||
<div id="loading" v-if="showLoading"> | |||||
<img src="<?= Yii::$app->urlManagerBackend->getBaseUrl(); ?>/img/loader.gif" alt="Chargement ..." /> | |||||
</div> | |||||
<div id="wrapper-app-distribution-index" :class="{'loaded': !loading}"> | |||||
<div class="col-md-4"> | |||||
<div id="calendar"> | |||||
<v-date-picker | |||||
is-inline | |||||
is-expanded | |||||
v-model="date" | |||||
popover-visibility="hidden" | |||||
:mode="calendar.mode" | |||||
:formats="calendar.formats" | |||||
:theme-styles="calendar.themeStyles" | |||||
:attributes="calendar.attrs" | |||||
@dayclick='dayClicked'> | |||||
></v-date-picker> | |||||
</div> | |||||
<div class="clr"></div> | |||||
</div> | |||||
<div class="col-md-8"> | |||||
<div v-if="date"> | |||||
<div id="infos-top"> | |||||
<div class="col-md-12"> | |||||
<div class="info-box" id="info-box-distribution"> | |||||
<span :class="'info-box-icon '+(distribution.active ? 'bg-green' : 'bg-red')"><i :class="'fa '+(distribution.active ? 'fa-check' : 'fa-remove')"></i></span> | |||||
<div class="info-box-content"> | |||||
<span class="info-box-text"> | |||||
<h4>Distribution du <strong>{{ dateFormat }}</strong></h4> | |||||
<a @click="activeWeekDistribution" data-active="0" class="btn btn-default btn-active-week" v-if="oneDistributionWeekActive">Désactiver cette semaine</a> | |||||
<a @click="activeWeekDistribution" data-active="1" class="btn btn-default btn-active-week" v-else>Activer cette semaine</a> | |||||
<a @click="activeDistribution" data-active="0" class="btn btn-default" v-if="distribution.active">Désactiver ce jour</a> | |||||
<a @click="activeDistribution" data-active="1" class="btn btn-default" v-else>Activer ce jour</a> | |||||
</span> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
<!-- produits --> | |||||
<div class="col-md-6"> | |||||
<div class="info-box col-md-4"> | |||||
<span class="info-box-icon bg-yellow"><i class="fa fa-clone"></i></span> | |||||
<div class="info-box-content"> | |||||
<span class="info-box-text"> | |||||
{{ countActiveProducts }} Produits<br /><br /> | |||||
<button class="btn btn-default" @click="showModalProducts = true">Configurer</button> | |||||
</span> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
<modal v-if="showModalProducts" id="modal-products" @close="showModalProducts = false"> | |||||
<h3 slot="header">Produits</h3> | |||||
<div slot="body"> | |||||
<table class="table table-condensed table-bordered table-hover"> | |||||
<thead> | |||||
<tr> | |||||
<td>Actif</td> | |||||
<td>Nom</td> | |||||
<td class="quantity-ordered">Commandé</td> | |||||
<td class="quantity-max">Maximum</td> | |||||
</tr> | |||||
</thead> | |||||
<tbody> | |||||
<tr v-for="product in products"> | |||||
<td> | |||||
<button class="btn btn-success" v-if="product.productDistribution[0].active == 1"><span class="glyphicon glyphicon-ok"></span></button> | |||||
<button class="btn btn-default" v-else data-active-product="1" :data-id-product="product.id" @click="productActiveClick"><span class="glyphicon glyphicon-ok"></span></button> | |||||
<button class="btn btn-danger" v-if="product.productDistribution[0].active == 0"><span class="glyphicon glyphicon-remove"></span></button> | |||||
<button class="btn btn-default" v-else data-active-product="0" :data-id-product="product.id" @click="productActiveClick"><span class="glyphicon glyphicon-remove"></span></button> | |||||
</td> | |||||
<td>{{ product.name }}</td> | |||||
<td class="quantity-ordered">{{ product.quantity_ordered ? product.quantity_ordered : '-' }}</td> | |||||
<td class="quantity-max"><input type="text" class="form-control quantity-max" placeholder="∞" :data-id-product="product.id" :value="product.productDistribution[0].quantity_max" @keyup="productQuantityMaxChange" /></td> | |||||
</tr> | |||||
</tbody> | |||||
</table> | |||||
</div> | |||||
</modal> | |||||
<div class="col-md-6"> | |||||
<div class="info-box col-md-4"> | |||||
<span class="info-box-icon bg-yellow"><i class="fa fa-map-marker"></i></span> | |||||
<div class="info-box-content"> | |||||
<span class="info-box-text"> | |||||
{{ countActivePointsSale }} Points de vente<br /><br /> | |||||
<button class="btn btn-default" @click="showModalPointsSale = true">Configurer</button> | |||||
</span> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
<modal v-if="showModalPointsSale" id="modal-points-sale" @close="showModalPointsSale = false"> | |||||
<h3 slot="header">Points de vente</h3> | |||||
<div slot="body"> | |||||
<table class="table table-condensed table-bordered table-hover"> | |||||
<thead> | |||||
<tr> | |||||
<td>Actif</td> | |||||
<td>Nom</td> | |||||
</tr> | |||||
</thead> | |||||
<tbody> | |||||
<tr v-for="pointSale in pointsSale"> | |||||
<td> | |||||
<button class="btn btn-success" v-if="pointSale.pointSaleDistribution[0].delivery == 1"><span class="glyphicon glyphicon-ok"></span></button> | |||||
<button class="btn btn-default" v-else data-delivery-point-sale="1" :data-id-point-sale="pointSale.id" @click="pointSaleActiveClick"><span class="glyphicon glyphicon-ok"></span></button> | |||||
<button class="btn btn-danger" v-if="pointSale.pointSaleDistribution[0].delivery == 0"><span class="glyphicon glyphicon-remove"></span></button> | |||||
<button class="btn btn-default" v-else data-delivery-point-sale="0" :data-id-point-sale="pointSale.id" @click="pointSaleActiveClick"><span class="glyphicon glyphicon-remove"></span></button> | |||||
</td> | |||||
<td>{{ pointSale.name }}</td> | |||||
</tr> | |||||
</tbody> | |||||
</table> | |||||
</div> | |||||
</modal> | |||||
<div class="col-md-6"> | |||||
<div id="summary-ca-weight" class="info-box col-md-4"> | |||||
<span class="info-box-icon bg-yellow"><i class="fa fa-euro"></i></span> | |||||
<div class="info-box-content"> | |||||
<span class="info-box-text">CA</span> | |||||
<span class="info-box-number">{{ distribution.revenues }} € <span class="normal">/ {{ distribution.potential_revenues }} €</span></span> | |||||
<span class="info-box-text">Poids</span> | |||||
<span class="info-box-number">{{ distribution.weight }} kg <span class="normal">/ {{ distribution.potential_weight }} kg</span></span> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
<div class="col-md-6"> | |||||
<div class="info-box col-md-4"> | |||||
<span class="info-box-icon bg-yellow"><i class="fa fa-download"></i></span> | |||||
<div class="info-box-content"> | |||||
<span class="info-box-text"> | |||||
{{ countOrders }} Commande<span v-if="countOrders > 1">s</span><br /><br /> | |||||
<a href="#" class="btn btn-default" disabled="disabled" v-if="countOrders == 0">Télécharger (PDF)</a> | |||||
<a :href="distribution.url_report" class="btn btn-default" v-else>Télécharger (PDF)</a> | |||||
</span> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
<div class="callout callout-info" v-else> | |||||
<h4><i class="fa fa-info"></i> Pour commencer</h4> | |||||
<p>Veuillez choisir une date de distribution.</p> | |||||
</div> | |||||
</div> | |||||
<div class="clr"></div> | |||||
<div id="orders" class="panel panel-default" v-if="date"> | |||||
<div class="panel-heading"> | |||||
<h3 class="panel-title">Commandes <label class="label label-success" v-if="orders.length">{{ orders.length }}</label><label class="label label-danger" v-else>0</label></h3> | |||||
</div> | |||||
<div class="panel-body"> | |||||
<button id="btn-add-order" @click="showModalFormOrderCreate = true" class="btn btn-primary btn-xs"><span class="glyphicon glyphicon-plus"></span> Ajouter une commande</button> | |||||
<order-form | |||||
v-if="showModalFormOrderCreate" | |||||
:date="date" | |||||
:order="orderCreate" | |||||
:points-sale="pointsSale" | |||||
:users="users" | |||||
:products="products" | |||||
@close="showModalFormOrderCreate = false" | |||||
@ordercreatedupdated="orderCreatedUpdated" | |||||
></order-form> | |||||
<div id="wrapper-nav-points-sale"> | |||||
<ul id="nav-points-sale"> | |||||
<li data-id-point-sale="0" data-id-point-sale="0" v-if="countActivePointsSale > 1" @click="pointSaleClick"> | |||||
<a class="btn btn-default btn-primary" v-if="idActivePointSale == 0">Tous <span class="label label-default">{{ orders.length }}</span> <span class="glyphicon glyphicon-triangle-bottom"></span></a> | |||||
<a class="btn btn-default" v-else>Tous <span class="label label-default">{{ orders.length }}</span><span class="glyphicon glyphicon-triangle-bottom"></span></a> | |||||
</li> | |||||
<li v-for="pointSale in pointsSale" :data-id-point-sale="pointSale.id" v-if="pointSale.pointSaleDistribution[0].delivery == 1" @click="pointSaleClick"> | |||||
<a class="btn btn-default btn-primary" v-if="idActivePointSale == pointSale.id">{{ pointSale.name }} <span class="label label-default">{{ countOrdersByPointSale[pointSale.id] }}</span><span class="glyphicon glyphicon-triangle-bottom"></span></a> | |||||
<a class="btn btn-default" v-else>{{ pointSale.name }} <span class="label label-default">{{ countOrdersByPointSale[pointSale.id] }}</span><span class="glyphicon glyphicon-triangle-bottom"></span></a> | |||||
</li> | |||||
</ul> | |||||
<div class="clr"></div> | |||||
</div> | |||||
<table class="table table-condensed table-bordered table-hover" v-if="countOrdersByPointSale[idActivePointSale] > 0 || (idActivePointSale == 0 && orders.length > 0)"> | |||||
<tbody> | |||||
<template v-for="order in orders" v-if="idActivePointSale == 0 || idActivePointSale == order.id_point_sale"> | |||||
<tr> | |||||
<td> | |||||
<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> | |||||
<span v-if="order.user">{{ order.user.name +' '+order.user.lastname }}</span> | |||||
<span v-else>{{ order.username }}</span> | |||||
</td> | |||||
<td v-if="idActivePointSale == 0"> | |||||
{{ order.pointSale.name }} | |||||
</td> | |||||
<td>{{ order.amount.toFixed(2).replace(/(\d)(?=(\d{3})+(?:\.\d+)?$)/g, "$1,")+' €' }}</td> | |||||
<td> | |||||
<span class="label label-success" v-if="order.amount_paid == order.amount">payé</span> | |||||
<span class="label label-default" v-else-if="order.amount_paid == 0">non réglé</span> | |||||
<span class="label label-default" v-else-if="order.amount_paid > order.amount">surplus</span> | |||||
<span class="label label-warning" v-else-if="order.amount_paid < order.amount">reste à payer</span> | |||||
</td> | |||||
<td> | |||||
<span class="label label-danger" v-if="order.date_delete">annulée</span> | |||||
<span class="label label-warning" v-if="order.date_update">modifiée</span> | |||||
</td> | |||||
<td class="column-actions"> | |||||
<a class="btn btn-default" :href="baseUrl+'/subscription/update?id='+order.id_subscription" v-if="order.id_subscription > 0"><span class="glyphicon glyphicon-repeat"></span></a> | |||||
<button class="btn btn-default" :data-id-order="order.id" @click="orderViewClick"><span :class="'glyphicon ' + ((showViewProduct && idOrderView == order.id) ? 'glyphicon-eye-close' : 'glyphicon-eye-open')"></span></button> | |||||
<button class="btn btn-default" :data-id-order="order.id" @click="orderPaymentModalClick" v-show="order.user"><span class="glyphicon glyphicon-euro"></span></button> | |||||
<button class="btn btn-default" :data-id-order="order.id" @click="updateOrderClick"><span class="glyphicon glyphicon-pencil"></span></button> | |||||
<button class="btn btn-default" :data-id-order="order.id" @click="deleteOrderClick"><span class="glyphicon glyphicon-trash"></span></button> | |||||
<order-form | |||||
v-if="showModalFormOrderUpdate && idOrderUpdate == order.id" | |||||
:date="date" | |||||
:id-point-sale="idActivePointSale" | |||||
:points-sale="pointsSale" | |||||
:users="users" | |||||
:products="products" | |||||
:order="order" | |||||
@close="showModalFormOrderUpdate = false" | |||||
@ordercreatedupdated="orderCreatedUpdated" | |||||
></order-form> | |||||
<modal v-if="showModalPayment && idOrderPayment == order.id" class="modal-payment" @close="showModalPayment = false"> | |||||
<h3 slot="header"> | |||||
Commande du <strong>{{ dateFormat }}</strong> > | |||||
<strong><span v-if="order.user">{{ order.user.name +' '+order.user.lastname }}</span> | |||||
<span v-else>{{ order.username }}</span></strong> | |||||
</h3> | |||||
<div slot="body"> | |||||
<div class="col-md-4"> | |||||
<div class="info-box"> | |||||
<span :class="'info-box-icon ' +((order.amount_paid == order.amount) ? 'bg-green' : 'bg-red')"><i class="fa fa-check"></i></span> | |||||
<div class="info-box-content"> | |||||
<span class="info-box-text">Montant</span> | |||||
<span class="info-box-number">{{ order.amount.toFixed(2).replace(/(\d)(?=(\d{3})+(?:\.\d+)?$)/g, "$1,")+' €' }}</span> | |||||
<span class="info-box-text"> | |||||
Statut<br /> | |||||
<span class="label label-success" v-if="order.amount_paid == order.amount">payé</span> | |||||
<span class="label label-default" v-else-if="order.amount_paid == 0">non réglé</span> | |||||
<span class="label label-default" v-else-if="order.amount_paid > order.amount">surplus</span> | |||||
<span class="label label-warning" v-else-if="order.amount_paid < order.amount">reste à payer</span> | |||||
</span> | |||||
</div> | |||||
</div> | |||||
<div class="info-box"> | |||||
<span :class="'info-box-icon ' +((order.user.credit > 0) ? 'bg-green' : 'bg-red')"><i class="fa fa-user"></i></span> | |||||
<div class="info-box-content"> | |||||
<span class="info-box-text">Crédit utilisateur</span> | |||||
<span class="info-box-number">{{ order.user.credit.toFixed(2).replace(/(\d)(?=(\d{3})+(?:\.\d+)?$)/g, "$1,")+' €' }}</span> | |||||
</div> | |||||
</div> | |||||
<button v-if="order.amount_paid == order.amount" | |||||
class="btn btn-default" | |||||
:data-amount="order.amount" | |||||
data-type="refund" | |||||
@click="orderPaymentClick" > | |||||
<span class="glyphicon glyphicon-chevron-right"></span> | |||||
Rembourser {{ order.amount.toFixed(2).replace(/(\d)(?=(\d{3})+(?:\.\d+)?$)/g, "$1,")+' €' }} | |||||
</button> | |||||
<button v-else-if="order.amount_paid == 0" | |||||
class="btn btn-default" | |||||
:data-amount="order.amount" | |||||
data-type="payment" | |||||
@click="orderPaymentClick"> | |||||
<span class="glyphicon glyphicon-chevron-right"></span> | |||||
Payer {{ order.amount.toFixed(2).replace(/(\d)(?=(\d{3})+(?:\.\d+)?$)/g, "$1,")+' €' }} | |||||
</button> | |||||
<button v-else-if="order.amount_paid > order.amount" | |||||
class="btn btn-default" | |||||
:data-amount="order.amount_surplus" | |||||
data-type="refund" | |||||
@click="orderPaymentClick"> | |||||
<span class="glyphicon glyphicon-chevron-right"></span> | |||||
Rembourser {{ order.amount_surplus.toFixed(2).replace(/(\d)(?=(\d{3})+(?:\.\d+)?$)/g, "$1,")+' €' }} | |||||
</button> | |||||
<button v-else-if="order.amount_paid < order.amount" | |||||
class="btn btn-default" | |||||
:data-amount="order.amount_remaining" | |||||
data-type="payment" | |||||
@click="orderPaymentClick"> | |||||
<span class="glyphicon glyphicon-chevron-right"></span> | |||||
Payer le restant {{ order.amount_remaining.toFixed(2).replace(/(\d)(?=(\d{3})+(?:\.\d+)?$)/g, "$1,")+' €' }} | |||||
</button> | |||||
</div> | |||||
<div class="col-md-8"> | |||||
<h4>Historique paiement</h4> | |||||
<table class="table table-condensed table-bordered table-hover"> | |||||
<thead> | |||||
<tr> | |||||
<td>Date</td> | |||||
<td>Utilisateur</td> | |||||
<td>Action</td> | |||||
<td>- Débit</td> | |||||
<td>+ Crédit</td> | |||||
</tr> | |||||
</thead> | |||||
<tbody> | |||||
<tr v-for="creditHistory in order.creditHistory"> | |||||
<td>{{ creditHistory.date }}</td> | |||||
<td>{{ creditHistory.user_action }}</td> | |||||
<td v-html="creditHistory.wording"></td> | |||||
<td v-html="creditHistory.debit"></td> | |||||
<td v-html="creditHistory.credit"></td> | |||||
</tr> | |||||
</tbody> | |||||
</table> | |||||
</div> | |||||
</div> | |||||
</modal> | |||||
</td> | |||||
</tr> | |||||
<tr class="view" v-if="showViewProduct && idOrderView == order.id"> | |||||
<td colspan="6"> | |||||
<strong><span class="glyphicon glyphicon-menu-right"></span> Produits</strong> | |||||
<ul> | |||||
<li v-for="product in products" v-if="order.productOrder[product.id] > 0"> | |||||
{{ order.productOrder[product.id] }} x {{ product.name }} | |||||
</li> | |||||
</ul> | |||||
</td> | |||||
</tr> | |||||
</template> | |||||
</tbody> | |||||
</table> | |||||
<div class="alert alert-warning" v-else> | |||||
Aucune commande | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
<!-- template for the order-form component --> | |||||
<script type="text/x-template" id="order-form-template"> | |||||
<modal class="modal-form-order" @close="$emit('close')"> | |||||
<h3 slot="header">Ajouter une commande</h3> | |||||
<div slot="body"> | |||||
<div class="callout callout-warning" v-if="errors.length"> | |||||
<ul> | |||||
<li v-for="error in errors">{{ error }}</li> | |||||
</ul> | |||||
</div> | |||||
<div class="col-md-4"> | |||||
<div class="form-group"> | |||||
<label class="control-label" for="select-id-point-sale">Point de vente</label> | |||||
<select class="form-control" id="select-id-point-sale" v-model="order.id_point_sale"> | |||||
<option v-for="pointSale in pointsSale" v-if="pointSale.pointSaleDistribution[0].delivery == 1" :value="pointSale.id">{{ pointSale.name }}</option> | |||||
</select> | |||||
</div> | |||||
<div class="form-group"> | |||||
<label class="control-label" for="select-id-user">Utilisateur</label> | |||||
<select class="form-control" v-model="order.id_user"> | |||||
<option v-for="user in users" :value="user.id_user">{{ user.name +' '+ user.lastname }}</option> | |||||
</select> | |||||
<input v-model="order.username" type="text" class="form-control" placeholder="Ou saisissez ici le nom de l'utilisateur" /> | |||||
</div> | |||||
<div class="form-group"> | |||||
<label class="control-label" for="textarea-comment">Commentaire</label> | |||||
<textarea class="form-control" id="textarea-comment" v-model="order.comment"></textarea> | |||||
</div> | |||||
</div> | |||||
<div class="col-md-8"> | |||||
<label class="control-label">Produits</label> | |||||
<table class="table table-condensed table-bordered table-hover table-products"> | |||||
<tbody> | |||||
<tr v-for="product in products" :class="(order.productOrder[product.id] > 0) ? 'product-ordered' : ''"> | |||||
<td> | |||||
<span class="label label-success" v-if="product.productDistribution[0].active == 1">Actif</span> | |||||
<span class="label label-danger" v-else>Inactif</span> | |||||
</td> | |||||
<td>{{ product.name }}</td> | |||||
<td class="quantity"> | |||||
<div class="input-group"> | |||||
<span class="input-group-btn"> | |||||
<button class="btn btn-default btn-moins" type="button" @click="productQuantityClick(product.id, -1)"><span class="glyphicon glyphicon-minus"></span></button> | |||||
</span> | |||||
<input type="text" v-model="order.productOrder[product.id]" class="form-control" /> | |||||
<span class="input-group-btn"> | |||||
<button class="btn btn-default btn-plus" type="button" @click="productQuantityClick(product.id, 1)"><span class="glyphicon glyphicon-plus"></span></button> | |||||
</span> | |||||
</div> | |||||
</td> | |||||
<td class="quantity-remaining">/ {{ product.quantity_remaining }}</td> | |||||
</tr> | |||||
</tbody> | |||||
</table> | |||||
</div> | |||||
</div> | |||||
<div slot="footer"> | |||||
<div class="actions-form"> | |||||
<button class="modal-default-button btn btn-primary" @click="submitFormUpdate" v-if="order.id">Modifier</button> | |||||
<button class="modal-default-button btn btn-primary" @click="submitFormCreate" v-else>Créer</button> | |||||
<button class="modal-default-button btn btn-default" @click="$emit('close')">Annuler</button> | |||||
</div> | |||||
</div> | |||||
</modal> | |||||
</script> | |||||
<!-- template for the modal component --> | |||||
<script type="text/x-template" id="modal-template"> | |||||
<transition name="modal"> | |||||
<div class="modal-mask"> | |||||
<div class="modal-wrapper"> | |||||
<div class="modal-container"> | |||||
<div class="modal-header"> | |||||
<slot name="header"></slot> | |||||
</div> | |||||
<div class="modal-body"> | |||||
<slot name="body"></slot> | |||||
</div> | |||||
<div class="modal-footer"> | |||||
<slot name="footer"> | |||||
<button class="modal-default-button btn btn-default" @click="$emit('close')">Fermer</button> | |||||
</slot> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</transition> | |||||
</script> | |||||
<?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 common\models\Order ; | |||||
$dayWeek = date('w', strtotime($date)); | |||||
$dayWeekArray = [0 => 'sunday', 1 => 'monday', 2 => 'tuesday', 3 => 'wednesday', 4 => 'thursday', 5 => 'friday', 6 => 'saturday']; | |||||
$fieldInfosPointSale = 'infos_' . $dayWeekArray[$dayWeek]; | |||||
$html = '' ; | |||||
// par point de vente | |||||
foreach ($pointsSaleArray as $pointSale) { | |||||
if (count($pointSale->orders) && strlen($pointSale->$fieldInfosPointSale)) { | |||||
$html .= '<h3>'.$pointSale->name.'</h3>' ; | |||||
$colCredit = ($pointSale->credit) ? '<th>Rappel crédit</th>' : '' ; | |||||
$html .= '<table class="table table-bordered">' | |||||
. '<thead>' | |||||
. '<tr>' | |||||
. '<th>Client</th>' | |||||
. '<th>Produits</th>' | |||||
. '<th>Commentaire</th>' | |||||
. $colCredit | |||||
. '<th>Montant</th>' | |||||
. '</tr>' | |||||
. '<tbody>'; | |||||
foreach ($pointSale->orders as $order) { | |||||
$html .= '<tr>' ; | |||||
$strUser = ''; | |||||
// username | |||||
if ($order->user) { | |||||
$strUser = $order->user->name . " " . $order->user->lastname; | |||||
} else { | |||||
$strUser = $order->username; | |||||
} | |||||
if(strlen($order->comment_point_sale)) | |||||
{ | |||||
$strUser .= '<br /><em>'.$order->comment_point_sale.'</em>' ; | |||||
} | |||||
// téléphone | |||||
if (isset($order->user) && strlen($order->user->phone)) { | |||||
$strUser .= '<br />' . $order->user->phone . ''; | |||||
} | |||||
$html .= '<td>'.$strUser.'</td>'; | |||||
// produits | |||||
$strProducts = ''; | |||||
foreach ($productsArray as $product) { | |||||
$add = false; | |||||
foreach ($order->productOrder as $productOrder) { | |||||
if ($product->id == $productOrder->id_product) { | |||||
$strProducts .= $productOrder->quantity . ' ' . $product->name . ', '; | |||||
$add = true; | |||||
} | |||||
} | |||||
} | |||||
$html .= '<td>'.substr($strProducts, 0, strlen($strProducts) - 2).'</td>'; | |||||
$html .= '<td>'.$order->comment.'</td>'; | |||||
if($pointSale->credit) { | |||||
$credit = '' ; | |||||
if(isset($order->user) && isset($order->user->userProducer)) { | |||||
$credit = number_format($order->user->userProducer[0]->credit,2).' €' ; | |||||
} | |||||
$html .= '<td>'.$credit.'</td>' ; | |||||
} | |||||
$html .= '<td><strong>'.number_format($order->amount, 2) . ' € '; | |||||
if($order->getPaymentStatus() == Order::PAYMENT_PAID) | |||||
{ | |||||
$html .= '(payé)' ; | |||||
} | |||||
elseif($order->getPaymentStatus() == Order::PAYMENT_UNPAID && $order->getAmount(Order::AMOUNT_PAID)) | |||||
{ | |||||
$html .= '(reste '.$order->getAmount(Order::AMOUNT_REMAINING, true).' à payer)' ; | |||||
} | |||||
elseif($order->getPaymentStatus() == Order::PAYMENT_SURPLUS) | |||||
{ | |||||
$html .= '(surplus : '.$order->getAmount(Order::PAYMENT_SURPLUS, true).' à rembourser)' ; | |||||
} | |||||
$html .= '</strong></td>' ; | |||||
$html .= '</tr>' ; | |||||
} | |||||
$html .= '<tr><td><strong>Total</strong></td>' ; | |||||
$strProducts = ''; | |||||
foreach ($productsArray as $product) { | |||||
$quantity = Order::getProductQuantity($product->id, $pointSale->orders); | |||||
$strQuantity = ''; | |||||
if ($quantity) { | |||||
$strQuantity = $quantity; | |||||
$strProducts .= $strQuantity .' '. $product->name . ', '; | |||||
} | |||||
} | |||||
$strProducts = substr($strProducts, 0, strlen($strProducts) - 2) ; | |||||
$html .= '<td>'.$strProducts.'</td><td></td>' ; | |||||
if($pointSale->credit) { | |||||
$html .= '<td></td>' ; | |||||
} | |||||
$html .= '<td><strong>'.number_format($pointSale->revenues, 2) . ' €</strong></td>'; | |||||
$html .= '</tbody></table><pagebreak>' ; | |||||
} | |||||
} | |||||
// par point de vente | |||||
$html .= '<h3>Points de vente</h3>' ; | |||||
$html .= '<table class="table table-bordered">' | |||||
. '<thead>' | |||||
. '<tr>' | |||||
. '<th>Point de vente</th>' | |||||
. '<th>Produits</th>' | |||||
. '<th>Montant</th>' | |||||
. '</tr>' | |||||
. '<tbody>'; | |||||
$revenues = 0 ; | |||||
foreach ($pointsSaleArray as $pointSale) | |||||
{ | |||||
if (count($pointSale->orders) && strlen($pointSale->$fieldInfosPointSale)) | |||||
{ | |||||
$html .= '<tr><td>'.$pointSale->name.'</td><td>' ; | |||||
foreach ($productsArray as $product) { | |||||
$quantity = Order::getProductQuantity($product->id, $pointSale->orders); | |||||
$strQuantity = ($quantity) ? $quantity : '' ; | |||||
if(strlen($strQuantity)) { | |||||
$html .= $strQuantity . ' '.$product->name.', ' ; | |||||
} | |||||
} | |||||
$html = substr($html, 0, strlen($html) - 2) ; | |||||
$html .= '</td><td>'.number_format($pointSale->revenues, 2).' €</td></tr>' ; | |||||
$revenues += $pointSale->revenues ; | |||||
} | |||||
} | |||||
// total | |||||
$html .= '<tr><td><strong>Total</strong></td><td>' ; | |||||
foreach ($productsArray as $product) { | |||||
$quantity = Order::getProductQuantity($product->id, $ordersArray); | |||||
if($quantity) { | |||||
$html .= $quantity . ' '.$product->name.', ' ; | |||||
} | |||||
} | |||||
$html = substr($html, 0, strlen($html) - 2) ; | |||||
$html .= '</td><td><strong>'.number_format($revenues, 2).' €</strong></td></tr>' ; | |||||
$html .= '</tbody></table>' ; | |||||
echo $html ; | |||||
?> |
<?php | |||||
/** | |||||
Copyright La boîte à pain (2018) | |||||
contact@laboiteapain.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; | |||||
use yii\widgets\ActiveForm; | |||||
use common\helpers\Url ; | |||||
/* @var $this yii\web\View */ | |||||
/* @var $model common\models\User */ | |||||
$this->title = 'Paramètres'; | |||||
$this->params['breadcrumbs'][] = 'Paramètres'; | |||||
?> | |||||
<div class="user-update"> | |||||
<h1><?= Html::encode($this->title) ?></h1> | |||||
<div class="user-form"> | |||||
<?php $form = ActiveForm::begin(); ?> | |||||
<div class=""> | |||||
<?= $form->field($model, 'actif') | |||||
->dropDownList([ | |||||
0 => 'Non', | |||||
1 => 'Oui' | |||||
], []) | |||||
->label('Activer le producteur') | |||||
->hint('Activez cette option pour rendre votre établissement visible à vos clients.') ; ?> | |||||
<?= $form->field($model, 'nom') ?> | |||||
<?= $form->field($model, 'type') ?> | |||||
<?= $form->field($model, 'description') | |||||
->textarea(['rows' => 6]) | |||||
->hint('Affiché sur la page d\'accueil') ?> | |||||
<?= $form->field($model, 'code_postal') ?> | |||||
<?= $form->field($model, 'ville') ?> | |||||
<?= $form->field($model, 'code')->hint("Saisissez ce champs si vous souhaitez protéger l'accès à votre boutique par un code, sinon laissez-le vide.<br />" | |||||
. "Ce code est à communiquer à vos client pour qu'ils puissent ajouter votre établissement à leur tableau de bord.<br />" | |||||
. "<a href=\"".Yii::$app->urlManager->createUrl(['communiquer/index'])."\">Cliquez ici</a> pour télécharger un mode d'emploi comprenant ce code à distribuer à vos clients.") ?> | |||||
<?= $form->field($model, 'delai_commande') | |||||
->dropDownList([ | |||||
1 => '1 jour', | |||||
2 => '2 jours', | |||||
3 => '3 jours', | |||||
4 => '4 jours', | |||||
5 => '5 jours', | |||||
6 => '6 jours', | |||||
7 => '7 jours', | |||||
], []) | |||||
->hint('Si <strong>1 jour</strong> est sélectionné, le client pourra commander jusqu\'à la veille de la production.<br />' | |||||
. 'Si <strong>2 jours</strong> est sélectionné, le client pourra commander jusqu\'à l\'avant-veille de la production, etc.') ; ?> | |||||
<?= $form->field($model, 'heure_limite_commande') | |||||
->dropDownList([ | |||||
24 => 'Minuit', | |||||
23 => '23h', | |||||
22 => '22h', | |||||
21 => '21h', | |||||
20 => '20h', | |||||
19 => '19h', | |||||
18 => '18h', | |||||
17 => '17h', | |||||
16 => '16h', | |||||
15 => '15h', | |||||
14 => '14h', | |||||
13 => '13h', | |||||
12 => '12h', | |||||
11 => '11h', | |||||
10 => '10h', | |||||
9 => '9h', | |||||
8 => '8h', | |||||
], []) | |||||
->hint('Heure limite jusqu\'à laquelle les clients peuvent commander pour satisfaire le délai de commande.<br />' | |||||
. 'Par exemple, si <strong>2 jours</strong> est sélectionné dans le délai de commande, le client devra commander l\'avant-veille de la production avant l\'heure précisée ici.') ; ?> | |||||
<?= $form->field($model, 'credit_pain') | |||||
->dropDownList([ | |||||
0 => 'Non', | |||||
1 => 'Oui', | |||||
], []) | |||||
->label('Activer le système de Crédit Pain') | |||||
->hint('Le système de Crédit Pain permet à vos clients d\'avoir un compte prépayé sur le site <em>La boîte à pain</em>.<br />' | |||||
. 'Ils créditent leur compte en vous donnant la somme de leur choix et c\'est ensuite à vous de '.Html::a('mettre à jour', ['user/index']).' leur compte Crédit Pain en ligne.<br />' | |||||
. 'Ceci fait, les clients paient leur commande directement via leur compte Crédit Pain.') ; ?> | |||||
<?= $form->field($model, 'photo')->fileInput() ?> | |||||
<?php | |||||
if (strlen($model->photo)) { | |||||
$base_url = Yii::$app->urlManagerProducer->baseUrl ; | |||||
echo '<img src="'.$base_url.'/uploads/' . $model->photo . '" width="400px" /><br />'; | |||||
echo '<input type="checkbox" name="delete_photo" id="delete_photo" /> <label for="delete_photo">Supprimer la photo</label><br /><br />'; | |||||
} | |||||
?> | |||||
<?= $form->field($model, 'infos_commande') | |||||
->textarea(['rows' => 6]) | |||||
->hint('Affichées au client lors de sa commande')?> | |||||
<div class="form-group"> | |||||
<?= Html::submitButton('Mettre à jour', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?> | |||||
</div> | |||||
</div> | |||||
<?php ActiveForm::end(); ?> | |||||
</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\widgets\Breadcrumbs; | |||||
use dmstr\widgets\Alert; | |||||
?> | |||||
<div class="content-wrapper"> | |||||
<section class="content-header"> | |||||
<?php if (isset($this->blocks['content-header'])) { ?> | |||||
<h1><?= $this->blocks['content-header'] ?></h1> | |||||
<?php } else { ?> | |||||
<h1> | |||||
<?php | |||||
if ($this->title !== null) { | |||||
echo $this->title; | |||||
} else { | |||||
echo \yii\helpers\Inflector::camel2words( | |||||
\yii\helpers\Inflector::id2camel($this->context->module->id) | |||||
); | |||||
echo ($this->context->module->id !== \Yii::$app->id) ? '<small>Module</small>' : ''; | |||||
} ?> | |||||
<?php | |||||
if(count($this->buttons)) { | |||||
foreach($this->buttons as $button) { | |||||
echo '<a href="'.Yii::$app->urlManagerBackend->createUrl($button['url']).'" class="'.$button['class'].'">'.$button['label'].'</a>' ; | |||||
} | |||||
} | |||||
?> | |||||
</h1> | |||||
<?php } ?> | |||||
<?= | |||||
Breadcrumbs::widget( | |||||
[ | |||||
'links' => isset($this->params['breadcrumbs']) ? $this->params['breadcrumbs'] : [], | |||||
] | |||||
) ?> | |||||
</section> | |||||
<section class="content"> | |||||
<?= Alert::widget() ?> | |||||
<?= $content ?> | |||||
<div class="clr"></div> | |||||
</section> | |||||
</div> | |||||
<footer class="main-footer"> | |||||
<div class="pull-right hidden-xs"> | |||||
<b>Version</b> 2.0 | |||||
</div> | |||||
<strong>Copyright © 2014-2015 <a href="http://almsaeedstudio.com">Almsaeed Studio</a>.</strong> All rights | |||||
reserved. | |||||
</footer> | |||||
<!-- Control Sidebar --> | |||||
<aside class="control-sidebar control-sidebar-dark"> | |||||
<!-- Create the tabs --> | |||||
<ul class="nav nav-tabs nav-justified control-sidebar-tabs"> | |||||
<li><a href="#control-sidebar-home-tab" data-toggle="tab"><i class="fa fa-home"></i></a></li> | |||||
<li><a href="#control-sidebar-settings-tab" data-toggle="tab"><i class="fa fa-gears"></i></a></li> | |||||
</ul> | |||||
<!-- Tab panes --> | |||||
<div class="tab-content"> | |||||
<!-- Home tab content --> | |||||
<div class="tab-pane" id="control-sidebar-home-tab"> | |||||
<h3 class="control-sidebar-heading">Recent Activity</h3> | |||||
<ul class='control-sidebar-menu'> | |||||
<li> | |||||
<a href='javascript::;'> | |||||
<i class="menu-icon fa fa-birthday-cake bg-red"></i> | |||||
<div class="menu-info"> | |||||
<h4 class="control-sidebar-subheading">Langdon's Birthday</h4> | |||||
<p>Will be 23 on April 24th</p> | |||||
</div> | |||||
</a> | |||||
</li> | |||||
<li> | |||||
<a href='javascript::;'> | |||||
<i class="menu-icon fa fa-user bg-yellow"></i> | |||||
<div class="menu-info"> | |||||
<h4 class="control-sidebar-subheading">Frodo Updated His Profile</h4> | |||||
<p>New phone +1(800)555-1234</p> | |||||
</div> | |||||
</a> | |||||
</li> | |||||
<li> | |||||
<a href='javascript::;'> | |||||
<i class="menu-icon fa fa-envelope-o bg-light-blue"></i> | |||||
<div class="menu-info"> | |||||
<h4 class="control-sidebar-subheading">Nora Joined Mailing List</h4> | |||||
<p>nora@example.com</p> | |||||
</div> | |||||
</a> | |||||
</li> | |||||
<li> | |||||
<a href='javascript::;'> | |||||
<i class="menu-icon fa fa-file-code-o bg-green"></i> | |||||
<div class="menu-info"> | |||||
<h4 class="control-sidebar-subheading">Cron Job 254 Executed</h4> | |||||
<p>Execution time 5 seconds</p> | |||||
</div> | |||||
</a> | |||||
</li> | |||||
</ul> | |||||
<!-- /.control-sidebar-menu --> | |||||
<h3 class="control-sidebar-heading">Tasks Progress</h3> | |||||
<ul class='control-sidebar-menu'> | |||||
<li> | |||||
<a href='javascript::;'> | |||||
<h4 class="control-sidebar-subheading"> | |||||
Custom Template Design | |||||
<span class="label label-danger pull-right">70%</span> | |||||
</h4> | |||||
<div class="progress progress-xxs"> | |||||
<div class="progress-bar progress-bar-danger" style="width: 70%"></div> | |||||
</div> | |||||
</a> | |||||
</li> | |||||
<li> | |||||
<a href='javascript::;'> | |||||
<h4 class="control-sidebar-subheading"> | |||||
Update Resume | |||||
<span class="label label-success pull-right">95%</span> | |||||
</h4> | |||||
<div class="progress progress-xxs"> | |||||
<div class="progress-bar progress-bar-success" style="width: 95%"></div> | |||||
</div> | |||||
</a> | |||||
</li> | |||||
<li> | |||||
<a href='javascript::;'> | |||||
<h4 class="control-sidebar-subheading"> | |||||
Laravel Integration | |||||
<span class="label label-waring pull-right">50%</span> | |||||
</h4> | |||||
<div class="progress progress-xxs"> | |||||
<div class="progress-bar progress-bar-warning" style="width: 50%"></div> | |||||
</div> | |||||
</a> | |||||
</li> | |||||
<li> | |||||
<a href='javascript::;'> | |||||
<h4 class="control-sidebar-subheading"> | |||||
Back End Framework | |||||
<span class="label label-primary pull-right">68%</span> | |||||
</h4> | |||||
<div class="progress progress-xxs"> | |||||
<div class="progress-bar progress-bar-primary" style="width: 68%"></div> | |||||
</div> | |||||
</a> | |||||
</li> | |||||
</ul> | |||||
<!-- /.control-sidebar-menu --> | |||||
</div> | |||||
<!-- /.tab-pane --> | |||||
<!-- Settings tab content --> | |||||
<div class="tab-pane" id="control-sidebar-settings-tab"> | |||||
<form method="post"> | |||||
<h3 class="control-sidebar-heading">General Settings</h3> | |||||
<div class="form-group"> | |||||
<label class="control-sidebar-subheading"> | |||||
Report panel usage | |||||
<input type="checkbox" class="pull-right" checked/> | |||||
</label> | |||||
<p> | |||||
Some information about this general settings option | |||||
</p> | |||||
</div> | |||||
<!-- /.form-group --> | |||||
<div class="form-group"> | |||||
<label class="control-sidebar-subheading"> | |||||
Allow mail redirect | |||||
<input type="checkbox" class="pull-right" checked/> | |||||
</label> | |||||
<p> | |||||
Other sets of options are available | |||||
</p> | |||||
</div> | |||||
<!-- /.form-group --> | |||||
<div class="form-group"> | |||||
<label class="control-sidebar-subheading"> | |||||
Expose author name in posts | |||||
<input type="checkbox" class="pull-right" checked/> | |||||
</label> | |||||
<p> | |||||
Allow the user to show his name in blog posts | |||||
</p> | |||||
</div> | |||||
<!-- /.form-group --> | |||||
<h3 class="control-sidebar-heading">Chat Settings</h3> | |||||
<div class="form-group"> | |||||
<label class="control-sidebar-subheading"> | |||||
Show me as online | |||||
<input type="checkbox" class="pull-right" checked/> | |||||
</label> | |||||
</div> | |||||
<!-- /.form-group --> | |||||
<div class="form-group"> | |||||
<label class="control-sidebar-subheading"> | |||||
Turn off notifications | |||||
<input type="checkbox" class="pull-right"/> | |||||
</label> | |||||
</div> | |||||
<!-- /.form-group --> | |||||
<div class="form-group"> | |||||
<label class="control-sidebar-subheading"> | |||||
Delete chat history | |||||
<a href="javascript::;" class="text-red pull-right"><i class="fa fa-trash-o"></i></a> | |||||
</label> | |||||
</div> | |||||
<!-- /.form-group --> | |||||
</form> | |||||
</div> | |||||
<!-- /.tab-pane --> | |||||
</div> | |||||
</aside><!-- /.control-sidebar --> | |||||
<!-- Add the sidebar's background. This div must be placed | |||||
immediately after the control sidebar --> | |||||
<div class='control-sidebar-bg'></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; | |||||
use common\models\Producer; | |||||
use common\models\User; | |||||
use yii\widgets\ActiveForm; | |||||
use yii\helpers\ArrayHelper; | |||||
/* @var $this \yii\web\View */ | |||||
/* @var $content string */ | |||||
?> | |||||
<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']) ?> | |||||
<nav class="navbar navbar-static-top" role="navigation"> | |||||
<a href="#" class="sidebar-toggle" data-toggle="push-menu" role="button"> | |||||
<span class="sr-only">Toggle navigation</span> | |||||
</a> | |||||
<div class="navbar-custom-menu"> | |||||
<?php | |||||
$usersArray = User::findBy(['id_producer' => Producer::getId()]) | |||||
->andWhere('CAST(FROM_UNIXTIME(user.created_at) AS date) > \''.date("Y-m-d", strtotime("-7 days")).'\'') | |||||
->orderBy('created_at DESC') | |||||
->all(); | |||||
?> | |||||
<ul class="nav navbar-nav"> | |||||
<li class="dropdown users-menu notifications-menu"> | |||||
<a href="#" class="dropdown-toggle" data-toggle="dropdown"> | |||||
<i class="fa fa-user-plus"></i> | |||||
<?php if(count($usersArray)): ?><span class="label label-success"><?= count($usersArray) ?></span> | |||||
<?php else: ?><span class="label label-warning">0</span><?php endif; ?> | |||||
</a> | |||||
<ul class="dropdown-menu"> | |||||
<?php if(count($usersArray)): ?> | |||||
<li class="header">Inscriptions des 7 derniers jours</li> | |||||
<li> | |||||
<ul class="menu"> | |||||
<?php foreach($usersArray as $user): ?> | |||||
<li> | |||||
<a href="<?= Yii::$app->urlManagerBackend->createUrl(['user/update','id' => $user['user_id']]) ; ?>"> | |||||
<h5><?= Html::encode($user['name'].' '.$user['lastname']) ; ?> <small><i class="fa fa-clock-o"></i> <?= date('d/m/Y à H:i',$user['created_at']); ?></small></h5> | |||||
</a> | |||||
</li> | |||||
<?php endforeach; ?> | |||||
</ul> | |||||
</li> | |||||
<?php else: ?> | |||||
<li class="header">Aucun nouvel inscrit ces 7 derniers jours.</li> | |||||
<?php endif; ?> | |||||
</ul> | |||||
</li> | |||||
<?php | |||||
$usersNegativeCreditArray = User::findBy(['id_producer' => Producer::getId()]) | |||||
->andWhere('user_producer.credit < 0') | |||||
->orderBy('lastname, name ASC') | |||||
->all(); | |||||
?> | |||||
<li class="dropdown users-negative-credit-menu notifications-menu"> | |||||
<a href="#" class="dropdown-toggle" data-toggle="dropdown"> | |||||
<i class="fa fa-euro"></i> | |||||
<?php if(count($usersNegativeCreditArray)): ?><span class="label label-warning"><?= count($usersNegativeCreditArray) ?></span> | |||||
<?php else: ?><span class="label label-success">0</span><?php endif; ?> | |||||
</a> | |||||
<ul class="dropdown-menu"> | |||||
<?php if(count($usersNegativeCreditArray)): ?> | |||||
<li class="header">Utilisateurs au crédit négatif</li> | |||||
<li> | |||||
<ul class="menu"> | |||||
<?php foreach($usersNegativeCreditArray as $user): ?> | |||||
<li> | |||||
<a href="<?= Yii::$app->urlManagerBackend->createUrl(['user/credit','id' => $user['user_id']]) ; ?>"> | |||||
<h5><?= Html::encode($user['name'].' '.$user['lastname']) ; ?> <small><i class="fa fa-euro"></i> <?= Price::format($user['credit']); ?></small></h5> | |||||
</a> | |||||
</li> | |||||
<?php endforeach; ?> | |||||
</ul> | |||||
</li> | |||||
<?php else: ?> | |||||
<li class="header">Aucun de vos utilisateurs n'a de crédit négatif.</li> | |||||
<?php endif; ?> | |||||
</ul> | |||||
</li> | |||||
<?php if (User::isCurrentProducer() || User::isCurrentAdmin()): ?> | |||||
<li class="dropdown"> | |||||
<a href="#" class="dropdown-toggle" data-toggle="dropdown"> | |||||
<i class="fa fa-home"></i> | |||||
<span><?= Html::encode(Yii::$app->user->identity->getNameProducer()); ?></span> | |||||
<i class="fa fa-caret-down"></i> | |||||
</a> | |||||
<ul class="dropdown-menu"> | |||||
<?php if(User::isCurrentAdmin()): ?> | |||||
<li> | |||||
<a href="<?= Yii::$app->urlManagerProducer->createAbsoluteUrl(['site/index','slug_producer' => Producer::getCurrent()->slug]); ?>"> | |||||
<i class="fa fa-th-large"></i> | |||||
<span class="hidden-xs">Espace du producteur</span> | |||||
</a> | |||||
</li> | |||||
<li class="header"> <strong>Autres producteurs</strong></li> | |||||
<?php $producersArray = Producer::find()->orderBy('name ASC')->all(); ?> | |||||
<?php foreach($producersArray as $producer): ?> | |||||
<li><a href="<?= Yii::$app->urlManagerBackend->createUrl(['site/change-producer', 'id' => $producer->id]); ?>"><?= Html::encode($producer->name) ?></a></li> | |||||
<?php endforeach; ?> | |||||
<?php else: ?> | |||||
<li> | |||||
<a href="<?= Yii::$app->urlManagerProducer->createAbsoluteUrl(['site/index','slug_producer' => Producer::getCurrent()->slug]); ?>"> | |||||
<i class="fa fa-th-large"></i> | |||||
<span class="hidden-xs">Mon espace</span> | |||||
</a> | |||||
</li> | |||||
<?php endif; ?> | |||||
</ul> | |||||
</li> | |||||
<?php endif; ?> | |||||
<li class="dropdown user user-menu"> | |||||
<a href="#" class="dropdown-toggle" data-toggle="dropdown"> | |||||
<i class="fa fa-user"></i> | |||||
<span class="hidden-xs"><?= Html::encode(User::getCurrent()->name.' '.User::getCurrent()->lastname) ; ?></span> | |||||
<i class="fa fa-caret-down"></i> | |||||
</a> | |||||
<ul class="dropdown-menu"> | |||||
<li><a href="<?= Yii::$app->urlManagerFrontend->createAbsoluteUrl(['user/update']); ?>"><i class="fa fa-user"></i> Profil</a></li> | |||||
<li><a href="<?= Yii::$app->urlManagerBackend->createUrl(['site/logout']); ?>"><i class="fa fa-sign-out"></i> Déconnexion</a></li> | |||||
</ul> | |||||
</li> | |||||
<li class="link-control-sidebar"> | |||||
<a href="#" data-toggle="control-sidebar"><i class="fa fa-gears"></i></a> | |||||
</li> | |||||
</ul> | |||||
</div> | |||||
</nav> | |||||
</header> |
<?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. | |||||
*/ | |||||
?> | |||||
<aside class="main-sidebar"> | |||||
<section class="sidebar"> | |||||
<?= dmstr\widgets\Menu::widget( | |||||
[ | |||||
'options' => ['class' => 'sidebar-menu tree', 'data-widget'=> 'tree'], | |||||
'items' => [ | |||||
['label' => 'Tableau de bord','icon' => 'dashboard','url' => ['/site/index'], 'visible' => User::isCurrentProducer()], | |||||
['label' => 'Distributions','icon' => 'calendar','url' => ['/distribution/index'], 'visible' => User::isCurrentProducer()], | |||||
['label' => 'Produits','icon' => 'clone','url' => ['/product/index'], 'visible' => User::isCurrentProducer(), 'active' => Yii::$app->controller->id == 'product'], | |||||
['label' => 'Points de vente','icon' => 'map-marker','url' => ['/point-sale/index'], 'visible' => User::isCurrentProducer(), 'active' => Yii::$app->controller->id == 'point-sale'], | |||||
['label' => 'Utilisateurs','icon' => 'users','url' => ['/user/index'], 'visible' => User::isCurrentProducer(), 'active' => Yii::$app->controller->id == 'user'], | |||||
['label' => 'Abonnements','icon' => 'repeat','url' => ['/subscription/index'], 'visible' => User::isCurrentProducer(), 'active' => Yii::$app->controller->id == 'subscription'], | |||||
['label' => 'Paramètres','icon' => 'cog','url' => ['/producer/update'], 'visible' => User::isCurrentProducer()], | |||||
['label' => 'Communiquer','icon' => 'bullhorn','url' => ['/communicate/index'], 'visible' => User::isCurrentProducer()], | |||||
[ | |||||
'label' => 'Statistiques', | |||||
'icon' => 'line-chart', | |||||
'url' => '#', | |||||
'items' => [ | |||||
['label' => 'Chiffre d\'affaire','icon' => 'line-chart','url' => ['/stats/index'], 'visible' => User::isCurrentProducer()], | |||||
['label' => 'Produits','icon' => 'table','url' => ['/stats/products'], 'visible' => User::isCurrentProducer()], | |||||
], | |||||
], | |||||
['label' => 'Développement','icon' => 'wrench','url' => ['/development/index'], 'visible' => User::isCurrentProducer(), 'active' => Yii::$app->controller->id == 'development'], | |||||
['label' => 'Mon abonnement','icon' => 'euro','url' => ['/producer/billing'], 'visible' => User::isCurrentProducer()], | |||||
['label' => 'Administration', 'options' => ['class' => 'header'], 'visible' => User::isCurrentAdmin()], | |||||
['label' => 'Producteurs','icon' => 'th-list','url' => ['/producer-admin/index'], 'visible' => User::isCurrentAdmin()], | |||||
['label' => 'Outils', 'options' => ['class' => 'header'], 'visible' => User::isCurrentAdmin()], | |||||
['label' => 'Gii', 'icon' => 'file-code-o', 'url' => ['/gii'], 'visible' => User::isCurrentAdmin()], | |||||
['label' => 'Debug', 'icon' => 'dashboard', 'url' => ['/debug'], 'visible' => User::isCurrentAdmin()], | |||||
['label' => 'Login', 'url' => ['site/login'], 'visible' => !User::isCurrentConnected()], | |||||
/*[ | |||||
'label' => 'Some tools', | |||||
'icon' => 'share', | |||||
'url' => '#', | |||||
'items' => [ | |||||
['label' => 'Gii', 'icon' => 'file-code-o', 'url' => ['/gii'],], | |||||
['label' => 'Debug', 'icon' => 'dashboard', 'url' => ['/debug'],], | |||||
[ | |||||
'label' => 'Level One', | |||||
'icon' => 'circle-o', | |||||
'url' => '#', | |||||
'items' => [ | |||||
['label' => 'Level Two', 'icon' => 'circle-o', 'url' => '#',], | |||||
[ | |||||
'label' => 'Level Two', | |||||
'icon' => 'circle-o', | |||||
'url' => '#', | |||||
'items' => [ | |||||
['label' => 'Level Three', 'icon' => 'circle-o', 'url' => '#',], | |||||
['label' => 'Level Three', 'icon' => 'circle-o', 'url' => '#',], | |||||
], | |||||
], | |||||
], | |||||
], | |||||
], | |||||
],*/ | |||||
], | |||||
] | |||||
) ?> | |||||
</section> | |||||
</aside> |
<?php | <?php | ||||
/** | /** | ||||
Copyright La boîte à pain (2018) | |||||
Copyright distrib (2018) | |||||
contact@laboiteapain.net | |||||
contact@opendistrib.net | |||||
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 backend\assets\AppAsset; | |||||
use yii\helpers\Html; | use yii\helpers\Html; | ||||
/* @var $this yii\web\View */ | |||||
/* @var $model common\models\Developpement */ | |||||
/* @var $this \yii\web\View */ | |||||
/* @var $content string */ | |||||
$this->title = 'Modifier un développement'; | |||||
$this->params['breadcrumbs'][] = ['label' => 'Développement', 'url' => ['index']]; | |||||
$this->params['breadcrumbs'][] = ['label' => '#'.$model->id, 'url' => ['update', 'id' => $model->id]]; | |||||
$this->params['breadcrumbs'][] = 'Modifier'; | |||||
if (class_exists('backend\assets\AppAsset')) { | |||||
backend\assets\AppAsset::register($this); | |||||
} else { | |||||
app\assets\AppAsset::register($this); | |||||
} | |||||
dmstr\web\AdminLteAsset::register($this); | |||||
?> | ?> | ||||
<div class="developpement-update"> | |||||
<?php $this->beginPage() ?> | |||||
<!DOCTYPE html> | |||||
<html lang="<?= Yii::$app->language ?>"> | |||||
<head> | |||||
<meta charset="<?= Yii::$app->charset ?>"/> | |||||
<meta name="viewport" content="width=device-width, initial-scale=1"> | |||||
<?= Html::csrfMetaTags() ?> | |||||
<title><?= Html::encode($this->title) ?></title> | |||||
<?php $this->head() ?> | |||||
</head> | |||||
<body class="login-page"> | |||||
<h1><?= Html::encode($this->title) ?></h1> | |||||
<?php $this->beginBody() ?> | |||||
<?= $this->render('_form', [ | |||||
'model' => $model, | |||||
]) ?> | |||||
<?= $content ?> | |||||
</div> | |||||
<?php $this->endBody() ?> | |||||
</body> | |||||
</html> | |||||
<?php $this->endPage() ?> |
<?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; | |||||
use yii\bootstrap\Nav; | |||||
use yii\bootstrap\NavBar; | |||||
use yii\widgets\Breadcrumbs; | |||||
use common\models\Producer; | |||||
use common\models\User; | |||||
use yii\widgets\ActiveForm; | |||||
use yii\helpers\ArrayHelper; | |||||
use common\helpers\Url; | |||||
/* @var $this \yii\web\View */ | |||||
/* @var $content string */ | |||||
\common\assets\CommonAsset::register($this); | |||||
\backend\assets\AppAsset::register($this); | |||||
$producer = null ; | |||||
if(!Yii::$app->user->isGuest) { | |||||
$producer = Producer::findOne(Producer::getId()) ; | |||||
} | |||||
?> | |||||
<?php $this->beginPage() ?> | |||||
<!DOCTYPE html> | |||||
<html lang="<?= Yii::$app->language ?>"> | |||||
<head> | |||||
<meta charset="<?= Yii::$app->charset ?>"> | |||||
<meta name="viewport" content="width=device-width, initial-scale=1"> | |||||
<meta name="baseurl" content="<?= Yii::$app->urlManagerBackend->baseUrl ; ?>"> | |||||
<meta name="baseurl-absolute" content="<?= Yii::$app->urlManagerBackend->getHostInfo().Yii::$app->urlManagerBackend->baseUrl; ?>"> | |||||
<link rel="icon" type="image/png" href="<?php echo Yii::$app->urlManager->getBaseUrl(); ?>/img/favicon3.png" /> | |||||
<?= Html::csrfMetaTags() ?> | |||||
<title><?= Html::encode($this->title) ?> - distrib</title> | |||||
<?php $this->head() ?> | |||||
</head> | |||||
<body> | |||||
<?php $this->beginBody() ?> | |||||
<div class="wrap"> | |||||
<?php | |||||
NavBar::begin([ | |||||
'brandLabel' => '<img class="logo" src="' . Yii::$app->urlManager->getBaseUrl() . '/img/laboulange3.png" />', | |||||
'brandUrl' => Yii::$app->homeUrl, | |||||
'innerContainerOptions' => ['class' => 'container-fluid'], | |||||
'options' => [ | |||||
'class' => 'navbar-inverse navbar-fixed-top nav-header', | |||||
], | |||||
]); | |||||
$menuItems = [ | |||||
[ | |||||
'label' => '<span class="glyphicon glyphicon-home"></span> Tableau de bord', | |||||
'url' => ['/site/index'], | |||||
'visible' => !Yii::$app->user->isGuest | |||||
], | |||||
[ | |||||
'label' => '<span class="glyphicon glyphicon-calendar"></span> Commandes', | |||||
'url' => ['/order/index'], | |||||
'visible' => !Yii::$app->user->isGuest, | |||||
'items' => [ | |||||
[ | |||||
'label' => '<span class="glyphicon glyphicon-calendar"></span> Toutes les commandes', | |||||
'url' => ['/order/index'], | |||||
'visible' => !Yii::$app->user->isGuest | |||||
], | |||||
[ | |||||
'label' => '<span class="glyphicon glyphicon-repeat"></span> Abonnements', | |||||
'url' => ['/subscription/index'], | |||||
'visible' => !Yii::$app->user->isGuest | |||||
], | |||||
] | |||||
], | |||||
[ | |||||
'label' => '<span class="glyphicon glyphicon-grain"></span> Produits', | |||||
'url' => ['/product/index'], | |||||
'visible' => !Yii::$app->user->isGuest | |||||
], | |||||
[ | |||||
'label' => '<span class="glyphicon glyphicon-map-marker"></span> Points de vente', | |||||
'url' => ['/point-sale/index'], | |||||
'visible' => !Yii::$app->user->isGuest | |||||
], | |||||
[ | |||||
'label' => '<span class="glyphicon glyphicon-user"></span> Clients', | |||||
'url' => ['/user/index'], | |||||
'visible' => !Yii::$app->user->isGuest | |||||
], | |||||
[ | |||||
'label' => '<span class="glyphicon glyphicon-plus"></span>', | |||||
'url' => ['/producer/update'], | |||||
'visible' => !Yii::$app->user->isGuest, | |||||
'items' => [ | |||||
[ | |||||
'label' => '<span class="glyphicon glyphicon-cog"></span> Paramètres', | |||||
'url' => ['/producer/update'], | |||||
'visible' => !Yii::$app->user->isGuest | |||||
], | |||||
[ | |||||
'label' => '<span class="glyphicon glyphicon-bullhorn"></span> Communiquer', | |||||
'url' => ['/communicate/index'], | |||||
'visible' => !Yii::$app->user->isGuest | |||||
], | |||||
[ | |||||
'label' => '<span class="glyphicon glyphicon-euro"></span> Mon abonnement', | |||||
'url' => ['/producer/billing'], | |||||
'visible' => !Yii::$app->user->isGuest, | |||||
], | |||||
[ | |||||
'label' => '<span class="glyphicon glyphicon-stats"></span> Statistiques', | |||||
'url' => ['/stats/index'], | |||||
'visible' => !Yii::$app->user->isGuest, | |||||
], | |||||
[ | |||||
'label' => '<span class="glyphicon glyphicon-stats"></span> Statistiques produits', | |||||
'url' => ['/stats/products'], | |||||
'visible' => !Yii::$app->user->isGuest, | |||||
], | |||||
[ | |||||
'label' => '<span class="glyphicon glyphicon-wrench"></span> Développement', | |||||
'url' => ['/development/index'], | |||||
'visible' => !Yii::$app->user->isGuest | |||||
], | |||||
], | |||||
] | |||||
]; | |||||
if (Yii::$app->user->isGuest) { | |||||
$menuItems[] = ['label' => 'Connexion', 'url' => ['/site/login']]; | |||||
} else { | |||||
if (Yii::$app->user->identity->status == USER::STATUS_ADMIN) { | |||||
$menuItems[] = [ | |||||
'label' => '<span class="glyphicon glyphicon-asterisk"></span>', | |||||
'url' => '#', | |||||
'items' => [ | |||||
[ | |||||
'label' => '<span class="glyphicon glyphicon-th-list"></span> Producteurs', | |||||
'url' => ['producer-admin/index'], | |||||
'visible' => !Yii::$app->user->isGuest, | |||||
], | |||||
[ | |||||
'label' => '<span class="glyphicon glyphicon-euro"></span> Facturation', | |||||
'url' => ['producer-admin/billing'], | |||||
'visible' => false, | |||||
], | |||||
] | |||||
]; | |||||
} | |||||
$menuItems[] = [ | |||||
'label' => '<span class="glyphicon glyphicon-off"></span>', | |||||
'url' => ['/site/logout'], | |||||
'linkOptions' => ['data-method' => 'post', 'title' => 'Déconnexion'] | |||||
]; | |||||
$menuItems[] = [ | |||||
'label' => '<span class="retour-site">Retour sur le site</span>', | |||||
'url' => Yii::$app->urlManagerProducer->createAbsoluteUrl(['site/index','slug_producer' => $producer->slug]), | |||||
]; | |||||
} | |||||
echo Nav::widget([ | |||||
'options' => ['class' => 'navbar-nav navbar-right'], | |||||
'items' => $menuItems, | |||||
'encodeLabels' => false | |||||
]); | |||||
NavBar::end(); | |||||
?> | |||||
<div class="container-fluid container-body"> | |||||
<?php if (YII_ENV == 'dev' || YII_ENV == 'demo'): ?> | |||||
<div id="env-dev"><?php if (YII_ENV == 'dev'): ?>Dév.<?php elseif (YII_ENV == 'demo'): ?>Démo<?php endif; ?></div> | |||||
<?php endif; ?> | |||||
<?php if (!Yii::$app->user->isGuest): ?> | |||||
<div class="name-producer"> | |||||
<?php if (User::getCurrentStatus() == User::STATUS_PRODUCER): ?> | |||||
<span><?= Html::encode(Yii::$app->user->identity->getNameProducer()); ?></span> | |||||
<?php elseif (User::getCurrentStatus() == User::STATUS_ADMIN): ?> | |||||
<?php $form = ActiveForm::begin(['id' => 'select-producer']); ?> | |||||
<?= | |||||
Html::dropDownList('select_producer', Producer::getId(), ArrayHelper::map(Producer::find()->orderBy('name ASC')->all(), 'id', function($model, $defaultValue) { | |||||
return $model->name; | |||||
})); | |||||
?> | |||||
<?php ActiveForm::end(); ?> | |||||
<?php endif; ?> | |||||
<?php | |||||
$producer = Producer::findOne(Producer::getId()); | |||||
if (!$producer->active): | |||||
?> | |||||
<span class="label label-danger" data-toggle="tooltip" data-placement="bottom" data-original-title="Activez votre établissement quand vous le souhaitez afin de la rendre visible à vos clients."> | |||||
<?= Html::a('Hors-ligne', ['producer/update']); ?> | |||||
</span> | |||||
<?php endif; ?> | |||||
<div class="clr"></div> | |||||
</div> | |||||
<?php endif; ?> | |||||
<?php if (YII_ENV == 'demo'): ?> | |||||
<div id="block-demo"> | |||||
<div class="container-fluid"> | |||||
<span class="glyphicon glyphicon-eye-open"></span> <strong>Espace de démonstration</strong> : | |||||
Testez la plateforme sans avoir à vous inscrire. Les données sont réinitialisées quotidiennement • <?= Html::a('Retour', Url::env('prod', 'frontend')) ?> | |||||
</div> | |||||
</div> | |||||
<?php endif; ?> | |||||
<?= | |||||
Breadcrumbs::widget([ | |||||
'links' => isset($this->params['breadcrumbs']) ? $this->params['breadcrumbs'] : [], | |||||
]) | |||||
?> | |||||
<?= $content ?> | |||||
</div> | |||||
</div> | |||||
<div id="alerts-fixed"></div> | |||||
<footer class="footer"> | |||||
<div class="container-fluid"> | |||||
<p class="pull-left"> | |||||
<a href="<?php echo Url::frontend('site/contact'); ?>">Contact</a> • | |||||
<a href="<?php echo Url::frontend('site/mentions'); ?>">Mentions légales</a> • | |||||
<a href="<?php echo Url::frontend('site/cgv'); ?>">CGS</a> | |||||
<a id="code-source" href="https://framagit.org/guillaume-bourgeois/laboiteapain">Code source <img src="<?php echo Yii::$app->urlManager->getBaseUrl(); ?>/img/logo-framagit.png" alt="Hébergé par Framasoft" /> <img src="<?php echo Yii::$app->urlManager->getBaseUrl(); ?>/img/logo-gitlab.png" alt="Propulsé par Gitlab" /></a> | |||||
</p> | |||||
<p class="pull-right"><?= Yii::powered() ?></p> | |||||
</div> | |||||
</footer> | |||||
<?php $this->endBody() ?> | |||||
<!-- analytics --> | |||||
<script> | |||||
(function (i, s, o, g, r, a, m) { | |||||
i['GoogleAnalyticsObject'] = r; | |||||
i[r] = i[r] || function () { | |||||
(i[r].q = i[r].q || []).push(arguments) | |||||
}, i[r].l = 1 * new Date(); | |||||
a = s.createElement(o), | |||||
m = s.getElementsByTagName(o)[0]; | |||||
a.async = 1; | |||||
a.src = g; | |||||
m.parentNode.insertBefore(a, m) | |||||
})(window, document, 'script', 'https://www.google-analytics.com/analytics.js', 'ga'); | |||||
ga('create', 'UA-86917043-1', 'auto'); | |||||
ga('send', 'pageview'); | |||||
</script> | |||||
</body> | |||||
</html> | |||||
<?php $this->endPage() ?> |
<?php | <?php | ||||
/** | /** | ||||
Copyright La boîte à pain (2018) | |||||
Copyright distrib (2018) | |||||
contact@laboiteapain.net | |||||
contact@opendistrib.net | |||||
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\helpers\Html; | use yii\helpers\Html; | ||||
use yii\bootstrap\Nav; | |||||
use yii\bootstrap\NavBar; | |||||
use yii\widgets\Breadcrumbs; | |||||
use common\models\Etablissement; | |||||
use common\models\User; | |||||
use yii\widgets\ActiveForm; | |||||
use yii\helpers\ArrayHelper; | |||||
use common\helpers\Url; | |||||
/* @var $this \yii\web\View */ | /* @var $this \yii\web\View */ | ||||
/* @var $content string */ | /* @var $content string */ | ||||
\common\assets\CommonAsset::register($this); | |||||
\backend\assets\AppAsset::register($this); | |||||
$producer = null ; | |||||
if(!Yii::$app->user->isGuest) | |||||
$producer = Etablissement::findOne(Yii::$app->user->identity->id_etablissement) ; | |||||
?> | |||||
<?php $this->beginPage() ?> | |||||
<!DOCTYPE html> | |||||
<html lang="<?= Yii::$app->language ?>"> | |||||
if (Yii::$app->controller->action->id === 'login') { | |||||
/** | |||||
* Do not use this code in your template. Remove it. | |||||
* Instead, use the code $this->layout = '//main-login'; in your controller. | |||||
*/ | |||||
echo $this->render( | |||||
'main-login', | |||||
['content' => $content] | |||||
); | |||||
} else { | |||||
\dmstr\web\AdminLteAsset::register($this); | |||||
\common\assets\CommonAsset::register($this); | |||||
\backend\assets\AppAsset::register($this); | |||||
$directoryAsset = Yii::$app->assetManager->getPublishedUrl('@vendor/almasaeed2010/adminlte/dist'); | |||||
?> | |||||
<?php $this->beginPage() ?> | |||||
<!DOCTYPE html> | |||||
<html lang="<?= Yii::$app->language ?>"> | |||||
<head> | <head> | ||||
<meta charset="<?= Yii::$app->charset ?>"> | |||||
<meta charset="<?= Yii::$app->charset ?>"/> | |||||
<meta name="viewport" content="width=device-width, initial-scale=1"> | <meta name="viewport" content="width=device-width, initial-scale=1"> | ||||
<meta name="baseurl" content="<?= Yii::$app->urlManagerBackend->baseUrl ; ?>"> | <meta name="baseurl" content="<?= Yii::$app->urlManagerBackend->baseUrl ; ?>"> | ||||
<meta name="baseurl-absolute" content="<?= Yii::$app->urlManagerBackend->getHostInfo().Yii::$app->urlManagerBackend->baseUrl; ?>"> | <meta name="baseurl-absolute" content="<?= Yii::$app->urlManagerBackend->getHostInfo().Yii::$app->urlManagerBackend->baseUrl; ?>"> | ||||
<link rel="icon" type="image/png" href="<?php echo Yii::$app->urlManager->getBaseUrl(); ?>/img/favicon3.png" /> | |||||
<?= Html::csrfMetaTags() ?> | <?= Html::csrfMetaTags() ?> | ||||
<title><?= Html::encode($this->title) ?> - La boîte à pain</title> | |||||
<?php $this->head() ?> | |||||
<title><?= Html::encode($this->title) ?> | distrib</title> | |||||
<link rel="icon" type="image/png" href="<?php echo Yii::$app->urlManagerBackend->getBaseUrl(); ?>/img/favicon-distrib.png" /> | |||||
<?php $this->head() ?> | |||||
</head> | </head> | ||||
<body> | |||||
<?php $this->beginBody() ?> | |||||
<div class="wrap"> | |||||
<?php | |||||
NavBar::begin([ | |||||
'brandLabel' => '<img class="logo" src="' . Yii::$app->urlManager->getBaseUrl() . '/img/laboulange3.png" />', | |||||
'brandUrl' => Yii::$app->homeUrl, | |||||
'innerContainerOptions' => ['class' => 'container-fluid'], | |||||
'options' => [ | |||||
'class' => 'navbar-inverse navbar-fixed-top nav-header', | |||||
], | |||||
]); | |||||
$menuItems = [ | |||||
[ | |||||
'label' => '<span class="glyphicon glyphicon-home"></span> Tableau de bord', | |||||
'url' => ['/site/index'], | |||||
'visible' => !Yii::$app->user->isGuest | |||||
], | |||||
[ | |||||
'label' => '<span class="glyphicon glyphicon-calendar"></span> Commandes', | |||||
'url' => ['/commande/index'], | |||||
'visible' => !Yii::$app->user->isGuest, | |||||
'items' => [ | |||||
[ | |||||
'label' => '<span class="glyphicon glyphicon-calendar"></span> Toutes les commandes', | |||||
'url' => ['/commande/index'], | |||||
'visible' => !Yii::$app->user->isGuest | |||||
], | |||||
[ | |||||
'label' => '<span class="glyphicon glyphicon-repeat"></span> Commandes récurrentes', | |||||
'url' => ['/commandeauto/index'], | |||||
'visible' => !Yii::$app->user->isGuest | |||||
], | |||||
] | |||||
], | |||||
[ | |||||
'label' => '<span class="glyphicon glyphicon-grain"></span> Produits', | |||||
'url' => ['/produit/index'], | |||||
'visible' => !Yii::$app->user->isGuest | |||||
], | |||||
[ | |||||
'label' => '<span class="glyphicon glyphicon-map-marker"></span> Points de vente', | |||||
'url' => ['/point-vente/index'], | |||||
'visible' => !Yii::$app->user->isGuest | |||||
], | |||||
[ | |||||
'label' => '<span class="glyphicon glyphicon-user"></span> Clients', | |||||
'url' => ['/user/index'], | |||||
'visible' => !Yii::$app->user->isGuest | |||||
], | |||||
[ | |||||
'label' => '<span class="glyphicon glyphicon-plus"></span>', | |||||
'url' => ['/etablissement/update'], | |||||
'visible' => !Yii::$app->user->isGuest, | |||||
'items' => [ | |||||
[ | |||||
'label' => '<span class="glyphicon glyphicon-cog"></span> Paramètres', | |||||
'url' => ['/etablissement/update'], | |||||
'visible' => !Yii::$app->user->isGuest | |||||
], | |||||
[ | |||||
'label' => '<span class="glyphicon glyphicon-bullhorn"></span> Communiquer', | |||||
'url' => ['/communiquer/index'], | |||||
'visible' => !Yii::$app->user->isGuest | |||||
], | |||||
[ | |||||
'label' => '<span class="glyphicon glyphicon-euro"></span> Mon abonnement', | |||||
'url' => ['/etablissement/facturation'], | |||||
'visible' => !Yii::$app->user->isGuest, | |||||
], | |||||
[ | |||||
'label' => '<span class="glyphicon glyphicon-stats"></span> Statistiques', | |||||
'url' => ['/stats/index'], | |||||
'visible' => !Yii::$app->user->isGuest, | |||||
], | |||||
[ | |||||
'label' => '<span class="glyphicon glyphicon-stats"></span> Statistiques produits', | |||||
'url' => ['/stats/produits'], | |||||
'visible' => !Yii::$app->user->isGuest, | |||||
], | |||||
[ | |||||
'label' => '<span class="glyphicon glyphicon-wrench"></span> Développement', | |||||
'url' => ['/developpement/index'], | |||||
'visible' => !Yii::$app->user->isGuest | |||||
], | |||||
], | |||||
] | |||||
]; | |||||
if (Yii::$app->user->isGuest) { | |||||
$menuItems[] = ['label' => 'Connexion', 'url' => ['/site/login']]; | |||||
} else { | |||||
if (Yii::$app->user->identity->status == USER::STATUS_ADMIN) { | |||||
$menuItems[] = [ | |||||
'label' => '<span class="glyphicon glyphicon-asterisk"></span>', | |||||
'url' => '#', | |||||
'items' => [ | |||||
[ | |||||
'label' => '<span class="glyphicon glyphicon-th-list"></span> Producteurs', | |||||
'url' => ['etablissement-admin/index'], | |||||
'visible' => !Yii::$app->user->isGuest, | |||||
], | |||||
[ | |||||
'label' => '<span class="glyphicon glyphicon-euro"></span> Facturation', | |||||
'url' => ['etablissement-admin/facturation'], | |||||
'visible' => !Yii::$app->user->isGuest, | |||||
], | |||||
] | |||||
]; | |||||
} | |||||
$menuItems[] = [ | |||||
'label' => '<span class="glyphicon glyphicon-off"></span>', | |||||
'url' => ['/site/logout'], | |||||
'linkOptions' => ['data-method' => 'post', 'title' => 'Déconnexion'] | |||||
]; | |||||
$menuItems[] = [ | |||||
'label' => '<span class="retour-site">Retour sur le site</span>', | |||||
'url' => Yii::$app->urlManagerProducer->createAbsoluteUrl(['site/index','slug_producer' => $producer->slug]), | |||||
]; | |||||
} | |||||
echo Nav::widget([ | |||||
'options' => ['class' => 'navbar-nav navbar-right'], | |||||
'items' => $menuItems, | |||||
'encodeLabels' => false | |||||
]); | |||||
NavBar::end(); | |||||
?> | |||||
<div class="container-fluid container-body"> | |||||
<?php if (YII_ENV == 'dev' || YII_ENV == 'demo'): ?> | |||||
<div id="env-dev"><?php if (YII_ENV == 'dev'): ?>Dév.<?php elseif (YII_ENV == 'demo'): ?>Démo<?php endif; ?></div> | |||||
<?php endif; ?> | |||||
<?php if (!Yii::$app->user->isGuest): ?> | |||||
<div class="nom-boulange"> | |||||
<?php if (Yii::$app->user->identity->status == User::STATUS_BOULANGER): ?> | |||||
<span><?= Html::encode(Yii::$app->user->identity->getNomMagasin()); ?></span> | |||||
<?php elseif (Yii::$app->user->identity->status == User::STATUS_ADMIN): ?> | |||||
<?php $form = ActiveForm::begin(['id' => 'select-etablissement']); ?> | |||||
<?= | |||||
Html::dropDownList('select_etablissement', Yii::$app->user->identity->id_etablissement, ArrayHelper::map(Etablissement::find()->orderBy('nom ASC')->all(), 'id', function($model, $defaultValue) { | |||||
return $model->nom; | |||||
})); | |||||
?> | |||||
<?php ActiveForm::end(); ?> | |||||
<?php endif; ?> | |||||
<?php | |||||
$etablissement = Etablissement::findOne(Yii::$app->user->identity->id_etablissement); | |||||
if (!$etablissement->actif): | |||||
?> | |||||
<span class="label label-danger" data-toggle="tooltip" data-placement="bottom" data-original-title="Activez votre établissement quand vous le souhaitez afin de la rendre visible à vos clients."> | |||||
<?= Html::a('Hors-ligne', ['etablissement/update']); ?> | |||||
</span> | |||||
<?php endif; ?> | |||||
<div class="clr"></div> | |||||
</div> | |||||
<?php endif; ?> | |||||
<?php if (YII_ENV == 'demo'): ?> | |||||
<div id="block-demo"> | |||||
<div class="container-fluid"> | |||||
<span class="glyphicon glyphicon-eye-open"></span> <strong>Espace de démonstration</strong> : | |||||
Testez la plateforme sans avoir à vous inscrire. Les données sont réinitialisées quotidiennement • <?= Html::a('Retour', Url::env('prod', 'frontend')) ?> | |||||
</div> | |||||
</div> | |||||
<?php endif; ?> | |||||
<?= | |||||
Breadcrumbs::widget([ | |||||
'links' => isset($this->params['breadcrumbs']) ? $this->params['breadcrumbs'] : [], | |||||
]) | |||||
?> | |||||
<?= $content ?> | |||||
</div> | |||||
</div> | |||||
<div id="alerts-fixed"></div> | |||||
<footer class="footer"> | |||||
<div class="container-fluid"> | |||||
<p class="pull-left"> | |||||
<a href="<?php echo Url::frontend('site/contact'); ?>">Contact</a> • | |||||
<a href="<?php echo Url::frontend('site/mentions'); ?>">Mentions légales</a> • | |||||
<a href="<?php echo Url::frontend('site/cgv'); ?>">CGS</a> | |||||
<a id="code-source" href="https://framagit.org/guillaume-bourgeois/laboiteapain">Code source <img src="<?php echo Yii::$app->urlManager->getBaseUrl(); ?>/img/logo-framagit.png" alt="Hébergé par Framasoft" /> <img src="<?php echo Yii::$app->urlManager->getBaseUrl(); ?>/img/logo-gitlab.png" alt="Propulsé par Gitlab" /></a> | |||||
</p> | |||||
<p class="pull-right"><?= Yii::powered() ?></p> | |||||
</div> | |||||
</footer> | |||||
<?php $this->endBody() ?> | |||||
<!-- analytics --> | |||||
<script> | |||||
(function (i, s, o, g, r, a, m) { | |||||
i['GoogleAnalyticsObject'] = r; | |||||
i[r] = i[r] || function () { | |||||
(i[r].q = i[r].q || []).push(arguments) | |||||
}, i[r].l = 1 * new Date(); | |||||
a = s.createElement(o), | |||||
m = s.getElementsByTagName(o)[0]; | |||||
a.async = 1; | |||||
a.src = g; | |||||
m.parentNode.insertBefore(a, m) | |||||
})(window, document, 'script', 'https://www.google-analytics.com/analytics.js', 'ga'); | |||||
ga('create', 'UA-86917043-1', 'auto'); | |||||
ga('send', 'pageview'); | |||||
</script> | |||||
<body class="<?= Yii::$app->controller->id.'-'.Yii::$app->controller->action->id ?> hold-transition <?= \dmstr\helpers\AdminLteHelper::skinClass() ?> sidebar-mini"> | |||||
<?php $this->beginBody() ?> | |||||
<div class="wrapper"> | |||||
<?= $this->render( | |||||
'header.php', | |||||
['directoryAsset' => $directoryAsset] | |||||
) ?> | |||||
<?= $this->render( | |||||
'left.php', | |||||
['directoryAsset' => $directoryAsset] | |||||
) | |||||
?> | |||||
<?= $this->render( | |||||
'content.php', | |||||
['content' => $content, 'directoryAsset' => $directoryAsset] | |||||
) ?> | |||||
</div> | |||||
<?php $this->endBody() ?> | |||||
<!-- analytics --> | |||||
<script> | |||||
(function (i, s, o, g, r, a, m) { | |||||
i['GoogleAnalyticsObject'] = r; | |||||
i[r] = i[r] || function () { | |||||
(i[r].q = i[r].q || []).push(arguments) | |||||
}, i[r].l = 1 * new Date(); | |||||
a = s.createElement(o), | |||||
m = s.getElementsByTagName(o)[0]; | |||||
a.async = 1; | |||||
a.src = g; | |||||
m.parentNode.insertBefore(a, m) | |||||
})(window, document, 'script', 'https://www.google-analytics.com/analytics.js', 'ga'); | |||||
ga('create', 'UA-86917043-1', 'auto'); | |||||
ga('send', 'pageview'); | |||||
</script> | |||||
</body> | </body> | ||||
</html> | |||||
<?php $this->endPage() ?> | |||||
</html> | |||||
<?php $this->endPage() ?> | |||||
<?php } ?> |
<?php | |||||
/** | |||||
Copyright distrib (2018) | |||||
contact@opendistrib.net | |||||
Ce logiciel est un programme informatique servant à aider les producteurs | |||||
à distribuer leur production en circuits courts. | |||||
Ce logiciel est régi par la licence CeCILL soumise au droit français et | |||||
respectant les principes de diffusion des logiciels libres. Vous pouvez | |||||
utiliser, modifier et/ou redistribuer ce programme sous les conditions | |||||
de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA | |||||
sur le site "http://www.cecill.info". | |||||
En contrepartie de l'accessibilité au code source et des droits de copie, | |||||
de modification et de redistribution accordés par cette licence, il n'est | |||||
offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons, | |||||
seule une responsabilité restreinte pèse sur l'auteur du programme, le | |||||
titulaire des droits patrimoniaux et les concédants successifs. | |||||
A cet égard l'attention de l'utilisateur est attirée sur les risques | |||||
associés au chargement, à l'utilisation, à la modification et/ou au | |||||
développement et à la reproduction du logiciel par l'utilisateur étant | |||||
donné sa spécificité de logiciel libre, qui peut le rendre complexe à | |||||
manipuler et qui le réserve donc à des développeurs et des professionnels | |||||
avertis possédant des connaissances informatiques approfondies. Les | |||||
utilisateurs sont donc invités à charger et tester l'adéquation du | |||||
logiciel à leurs besoins dans des conditions permettant d'assurer la | |||||
sécurité de leurs systèmes et ou de leurs données et, plus généralement, | |||||
à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. | |||||
Le fait que vous puissiez accéder à cet en-tête signifie que vous avez | |||||
pris connaissance de la licence CeCILL, et que vous en avez accepté les | |||||
termes. | |||||
*/ | |||||
use common\models\Order ; | |||||
$dayWeek = date('w', strtotime($date)); | |||||
$dayWeekArray = [0 => 'sunday', 1 => 'monday', 2 => 'tuesday', 3 => 'wednesday', 4 => 'thursday', 5 => 'friday', 6 => 'saturday']; | |||||
$fieldInfosPointSale = 'infos_' . $dayWeekArray[$dayWeek]; | |||||
$html = '' ; | |||||
// par point de vente | |||||
foreach ($pointsSaleArray as $pointSale) { | |||||
if (count($pointSale->orders) && strlen($pointSale->$fieldInfosPointSale)) { | |||||
$html .= '<h3>'.$pointSale->name.'</h3>' ; | |||||
$colCredit = ($pointSale->credit) ? '<th>Rappel crédit</th>' : '' ; | |||||
$html .= '<table class="table table-bordered">' | |||||
. '<thead>' | |||||
. '<tr>' | |||||
. '<th>Client</th>' | |||||
. '<th>Produits</th>' | |||||
. '<th>Commentaire</th>' | |||||
. $colCredit | |||||
. '<th>Montant</th>' | |||||
. '</tr>' | |||||
. '<tbody>'; | |||||
foreach ($pointSale->orders as $order) { | |||||
$html .= '<tr>' ; | |||||
$strUser = ''; | |||||
// username | |||||
if ($order->user) { | |||||
$strUser = $order->user->name . " " . $order->user->lastname; | |||||
} else { | |||||
$strUser = $order->username; | |||||
} | |||||
if(strlen($order->comment_point_sale)) | |||||
{ | |||||
$strUser .= '<br /><em>'.$order->comment_point_sale.'</em>' ; | |||||
} | |||||
// téléphone | |||||
if (isset($order->user) && strlen($order->user->phone)) { | |||||
$strUser .= '<br />' . $order->user->phone . ''; | |||||
} | |||||
$html .= '<td>'.$strUser.'</td>'; | |||||
// produits | |||||
$strProducts = ''; | |||||
foreach ($productsArray as $product) { | |||||
$add = false; | |||||
foreach ($order->productOrder as $productOrder) { | |||||
if ($product->id == $productOrder->id_product) { | |||||
$strProducts .= $productOrder->quantity . ' ' . $product->name . ', '; | |||||
$add = true; | |||||
} | |||||
} | |||||
} | |||||
$html .= '<td>'.substr($strProducts, 0, strlen($strProducts) - 2).'</td>'; | |||||
$html .= '<td>'.$order->comment.'</td>'; | |||||
if($pointSale->credit) { | |||||
$credit = '' ; | |||||
if(isset($order->user) && isset($order->user->userProducer)) { | |||||
$credit = number_format($order->user->userProducer[0]->credit,2).' €' ; | |||||
} | |||||
$html .= '<td>'.$credit.'</td>' ; | |||||
} | |||||
$html .= '<td><strong>'.number_format($order->amount, 2) . ' € '; | |||||
if($order->getPaymentStatus() == Order::PAYMENT_PAID) | |||||
{ | |||||
$html .= '(payé)' ; | |||||
} | |||||
elseif($order->getPaymentStatus() == Order::PAYMENT_UNPAID && $order->getAmount(Order::AMOUNT_PAID)) | |||||
{ | |||||
$html .= '(reste '.$order->getAmount(Order::AMOUNT_REMAINING, true).' à payer)' ; | |||||
} | |||||
elseif($order->getPaymentStatus() == Order::PAYMENT_SURPLUS) | |||||
{ | |||||
$html .= '(surplus : '.$order->getAmount(Order::PAYMENT_SURPLUS, true).' à rembourser)' ; | |||||
} | |||||
$html .= '</strong></td>' ; | |||||
$html .= '</tr>' ; | |||||
} | |||||
$html .= '<tr><td><strong>Total</strong></td>' ; | |||||
$strProducts = ''; | |||||
foreach ($productsArray as $product) { | |||||
$quantity = Order::getProductQuantity($product->id, $pointSale->orders); | |||||
$strQuantity = ''; | |||||
if ($quantity) { | |||||
$strQuantity = $quantity; | |||||
$strProducts .= $strQuantity .' '. $product->name . ', '; | |||||
} | |||||
} | |||||
$strProducts = substr($strProducts, 0, strlen($strProducts) - 2) ; | |||||
$html .= '<td>'.$strProducts.'</td><td></td>' ; | |||||
if($pointSale->credit) { | |||||
$html .= '<td></td>' ; | |||||
} | |||||
$html .= '<td><strong>'.number_format($pointSale->revenues, 2) . ' €</strong></td>'; | |||||
$html .= '</tbody></table><pagebreak>' ; | |||||
} | |||||
} | |||||
// par point de vente | |||||
$html .= '<h3>Points de vente</h3>' ; | |||||
$html .= '<table class="table table-bordered">' | |||||
. '<thead>' | |||||
. '<tr>' | |||||
. '<th>Point de vente</th>' | |||||
. '<th>Produits</th>' | |||||
. '<th>Montant</th>' | |||||
. '</tr>' | |||||
. '<tbody>'; | |||||
$revenues = 0 ; | |||||
foreach ($pointsSaleArray as $pointSale) | |||||
{ | |||||
if (count($pointSale->orders) && strlen($pointSale->$fieldInfosPointSale)) | |||||
{ | |||||
$html .= '<tr><td>'.$pointSale->name.'</td><td>' ; | |||||
foreach ($productsArray as $product) { | |||||
$quantity = Order::getProductQuantity($product->id, $pointSale->orders); | |||||
$strQuantity = ($quantity) ? $quantity : '' ; | |||||
if(strlen($strQuantity)) { | |||||
$html .= $strQuantity . ' '.$product->name.', ' ; | |||||
} | |||||
} | |||||
$html = substr($html, 0, strlen($html) - 2) ; | |||||
$html .= '</td><td>'.number_format($pointSale->revenues, 2).' €</td></tr>' ; | |||||
$revenues += $pointSale->revenues ; | |||||
} | |||||
} | |||||
// total | |||||
$html .= '<tr><td><strong>Total</strong></td><td>' ; | |||||
foreach ($productsArray as $product) { | |||||
$quantity = Order::getProductQuantity($product->id, $ordersArray); | |||||
if($quantity) { | |||||
$html .= $quantity . ' '.$product->name.', ' ; | |||||
} | |||||
} | |||||
$html = substr($html, 0, strlen($html) - 2) ; | |||||
$html .= '</td><td><strong>'.number_format($revenues, 2).' €</strong></td></tr>' ; | |||||
$html .= '</tbody></table>' ; | |||||
echo $html ; | |||||
?> |
<?php | <?php | ||||
/** | /** | ||||
Copyright La boîte à pain (2018) | |||||
Copyright distrib (2018) | |||||
contact@laboiteapain.net | |||||
contact@opendistrib.net | |||||
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\helpers\Html; | use yii\helpers\Html; | ||||
use yii\widgets\ActiveForm; | use yii\widgets\ActiveForm; | ||||
use yii\helpers\ArrayHelper ; | use yii\helpers\ArrayHelper ; | ||||
use common\models\Etablissement ; | |||||
use common\models\Producer ; | |||||
/* @var $this yii\web\View */ | /* @var $this yii\web\View */ | ||||
/* @var $model backend\models\PointVente */ | /* @var $model backend\models\PointVente */ | ||||
/* @var $form yii\widgets\ActiveForm */ | /* @var $form yii\widgets\ActiveForm */ | ||||
?> | ?> | ||||
<div class="point-vente-form"> | |||||
<div class="point-sale-form"> | |||||
<?php $form = ActiveForm::begin(); ?> | <?php $form = ActiveForm::begin(); ?> | ||||
<div class="col-md-8"> | <div class="col-md-8"> | ||||
<?= $form->field($model, 'nom')->textInput(['maxlength' => 255]) ?> | |||||
<?= $form->field($model, 'localite')->textInput(['maxlength' => 255]) ?> | |||||
<?= $form->field($model, 'adresse')->textarea(['rows' => 6]) ?> | |||||
<?= $form->field($model, 'point_fabrication') | |||||
->checkbox() | |||||
->hint('Cochez cette case si ce point de vente correspond à votre lieu de production.') ?> | |||||
<?= $form->field($model, 'name')->textInput(['maxlength' => 255]) ?> | |||||
<?= $form->field($model, 'locality')->textInput(['maxlength' => 255]) ?> | |||||
<?= $form->field($model, 'address')->textarea(['rows' => 6]) ?> | |||||
<?php | <?php | ||||
$add_hint_credit_pain = '' ; | |||||
if(!Etablissement::getConfig('credit_pain')): | |||||
$add_hint_credit_pain = '<br /><strong>Attention, le système de Crédit Pain est désactivé au niveau des '.Html::a('paramètres globaux',['etablissement/update']).'.</strong>' ; | |||||
$addHintCredit = '' ; | |||||
if(!Producer::getConfig('credit')): | |||||
$addHintCredit = '<br /><strong>Attention, le système de Crédit est désactivé au niveau des '.Html::a('paramètres globaux',['producer/update']).'.</strong>' ; | |||||
endif; | endif; | ||||
echo $form->field($model, 'credit_pain') | |||||
echo $form->field($model, 'credit') | |||||
->checkbox() | ->checkbox() | ||||
->hint('Cochez cette case si le client peut régler ses commandes via son compte Crédit Pain pour ce point de vente.' | |||||
.$add_hint_credit_pain); | |||||
->hint('Cochez cette case si le client peut régler ses commandes via son compte <strong>Crédit</strong> pour ce point de vente.' | |||||
.$addHintCredit); | |||||
?> | ?> | ||||
<?= $form->field($model, 'credit_functioning') | |||||
->dropDownList([ | |||||
'' => 'Paramètres globaux ('.Producer::$creditFunctioningArray[Producer::getConfig('credit_functioning')].')', | |||||
Producer::CREDIT_FUNCTIONING_OPTIONAL => 'Optionnelle', | |||||
Producer::CREDIT_FUNCTIONING_MANDATORY => 'Obligatoire', | |||||
], []) ; ?> | |||||
<div id="jours-livraison"> | |||||
<div id="delivery-days"> | |||||
<h2>Jours de livraison</h2> | <h2>Jours de livraison</h2> | ||||
<?= $form->field($model, 'livraison_lundi')->checkbox() ?> | |||||
<?= $form->field($model, 'livraison_mardi')->checkbox() ?> | |||||
<?= $form->field($model, 'livraison_mercredi')->checkbox() ?> | |||||
<?= $form->field($model, 'livraison_jeudi')->checkbox() ?> | |||||
<?= $form->field($model, 'livraison_vendredi')->checkbox() ?> | |||||
<?= $form->field($model, 'livraison_samedi')->checkbox() ?> | |||||
<?= $form->field($model, 'livraison_dimanche')->checkbox() ?> | |||||
<?= $form->field($model, 'delivery_monday')->checkbox() ?> | |||||
<?= $form->field($model, 'delivery_tuesday')->checkbox() ?> | |||||
<?= $form->field($model, 'delivery_wednesday')->checkbox() ?> | |||||
<?= $form->field($model, 'delivery_thursday')->checkbox() ?> | |||||
<?= $form->field($model, 'delivery_friday')->checkbox() ?> | |||||
<?= $form->field($model, 'delivery_saturday')->checkbox() ?> | |||||
<?= $form->field($model, 'delivery_sunday')->checkbox() ?> | |||||
</div> | </div> | ||||
<div class="clr"></div> | <div class="clr"></div> | ||||
<h2>Informations</h2> | <h2>Informations</h2> | ||||
<?= $form->field($model, 'horaires_lundi')->textarea(['rows' => 3]) ?> | |||||
<?= $form->field($model, 'horaires_mardi')->textarea(['rows' => 3]) ?> | |||||
<?= $form->field($model, 'horaires_mercredi')->textarea(['rows' => 3]) ?> | |||||
<?= $form->field($model, 'horaires_jeudi')->textarea(['rows' => 3]) ?> | |||||
<?= $form->field($model, 'horaires_vendredi')->textarea(['rows' => 3]) ?> | |||||
<?= $form->field($model, 'horaires_samedi')->textarea(['rows' => 3]) ?> | |||||
<?= $form->field($model, 'horaires_dimanche')->textarea(['rows' => 3]) ?> | |||||
<?= $form->field($model, 'infos_monday')->textarea(['rows' => 3]) ?> | |||||
<?= $form->field($model, 'infos_tuesday')->textarea(['rows' => 3]) ?> | |||||
<?= $form->field($model, 'infos_wednesday')->textarea(['rows' => 3]) ?> | |||||
<?= $form->field($model, 'infos_thursday')->textarea(['rows' => 3]) ?> | |||||
<?= $form->field($model, 'infos_friday')->textarea(['rows' => 3]) ?> | |||||
<?= $form->field($model, 'infos_saturday')->textarea(['rows' => 3]) ?> | |||||
<?= $form->field($model, 'infos_sunday')->textarea(['rows' => 3]) ?> | |||||
</div> | </div> | ||||
<div class="col-md-4"> | <div class="col-md-4"> | ||||
?> | ?> | ||||
<?= $form->field($model, 'acces_restreint') | |||||
<?= $form->field($model, 'restricted_access') | |||||
->checkbox() | ->checkbox() | ||||
->hint('Cochez cette case si seulement un groupe restreint d\'utilisateurs peuvent accéder à ce point de vente.<br />' | ->hint('Cochez cette case si seulement un groupe restreint d\'utilisateurs peuvent accéder à ce point de vente.<br />' | ||||
. 'Dans le cas des boîtes à pain, il vous est possible de spécifier un commentaire pour chaque utilisateur sélectionné afin de lui renseigner son numéro de boîte ou son code.') ?> | . 'Dans le cas des boîtes à pain, il vous est possible de spécifier un commentaire pour chaque utilisateur sélectionné afin de lui renseigner son numéro de boîte ou son code.') ?> | ||||
<div id="users"> | <div id="users"> | ||||
<?= Html::activeCheckboxList($model, 'users', ArrayHelper::map($users, 'user_id', function($model_user, $defaultValue) use ($model) { | <?= Html::activeCheckboxList($model, 'users', ArrayHelper::map($users, 'user_id', function($model_user, $defaultValue) use ($model) { | ||||
return Html::encode($model_user['nom'].' '.$model_user['prenom']).'<br />' | |||||
return Html::encode($model_user['lastname'].' '.$model_user['name']).'<br />' | |||||
.Html::activeTextInput( | .Html::activeTextInput( | ||||
$model, | $model, | ||||
'users_commentaire['.$model_user['user_id'].']', | |||||
'users_comment['.$model_user['user_id'].']', | |||||
[ | [ | ||||
'class' => 'form-control commentaire', | 'class' => 'form-control commentaire', | ||||
'placeholder' => 'Commentaire', | 'placeholder' => 'Commentaire', | ||||
'value' => (isset($model->users_commentaire[$model_user['user_id']])) ? Html::encode($model->users_commentaire[$model_user['user_id']]) : '' | |||||
'value' => (isset($model->users_comment[$model_user['user_id']])) ? Html::encode($model->users_comment[$model_user['user_id']]) : '' | |||||
]); | ]); | ||||
} ), ['encode' => false, 'class' => '']) ?> | } ), ['encode' => false, 'class' => '']) ?> | ||||
</div> | </div> |
<?php | <?php | ||||
/** | /** | ||||
Copyright La boîte à pain (2018) | |||||
Copyright distrib (2018) | |||||
contact@laboiteapain.net | |||||
contact@opendistrib.net | |||||
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\helpers\Html; | use yii\helpers\Html; | ||||
/* @var $this yii\web\View */ | |||||
/* @var $model app\models\Produit */ | |||||
$this->setTitle('Ajouter un point de vente') ; | |||||
$this->addBreadcrumb(['label' => 'Points de vente', 'url' => ['index']]) ; | |||||
$this->addBreadcrumb('Ajouter') ; | |||||
$this->title = 'Ajouter un produit'; | |||||
$this->params['breadcrumbs'][] = ['label' => 'Produits', 'url' => ['index']]; | |||||
$this->params['breadcrumbs'][] = 'Ajouter'; | |||||
?> | ?> | ||||
<div class="produit-create"> | |||||
<h1><?= Html::encode($this->title) ?></h1> | |||||
<div class="point-sale-create"> | |||||
<?= $this->render('_form', [ | <?= $this->render('_form', [ | ||||
'model' => $model, | 'model' => $model, | ||||
'users' => $users, | |||||
]) ?> | ]) ?> | ||||
</div> | </div> |
<?php | <?php | ||||
/** | /** | ||||
Copyright La boîte à pain (2018) | |||||
Copyright distrib (2018) | |||||
contact@laboiteapain.net | |||||
contact@opendistrib.net | |||||
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\grid\GridView; | use yii\grid\GridView; | ||||
use common\models\PointVenteUser ; | use common\models\PointVenteUser ; | ||||
/* @var $this yii\web\View */ | |||||
/* @var $dataProvider yii\data\ActiveDataProvider */ | |||||
$this->setTitle('Points de vente') ; | |||||
$this->addBreadcrumb($this->getTitle()) ; | |||||
$this->addButton(['label' => '+', 'url' => 'point-sale/create', 'class' => 'btn btn-primary']) ; | |||||
$this->title = 'Points de vente'; | |||||
$this->params['breadcrumbs'][] = $this->title; | |||||
?> | ?> | ||||
<div class="point-vente-index"> | |||||
<h1><?= Html::encode($this->title) ?> <?= Html::a('Ajouter', ['create'], ['class' => 'btn btn-success']) ?></h1> | |||||
<div class="point-sale-index"> | |||||
<?= GridView::widget([ | <?= GridView::widget([ | ||||
'filterModel' => $searchModel, | |||||
'dataProvider' => $dataProvider, | 'dataProvider' => $dataProvider, | ||||
'columns' => [ | 'columns' => [ | ||||
'nom', | |||||
'localite', | |||||
[ | |||||
'attribute' => 'point_fabrication', | |||||
'format' => 'raw', | |||||
'value' => function($model) { | |||||
if($model->point_fabrication) | |||||
{ | |||||
return '<span class="label label-success">Oui</span>' ; | |||||
} | |||||
else { | |||||
return '<span class="label label-danger">Non</span>' ; | |||||
} | |||||
} | |||||
], | |||||
'name', | |||||
'locality', | |||||
[ | [ | ||||
'attribute' => 'delivery', | |||||
'label' => 'Livraison', | 'label' => 'Livraison', | ||||
'filter' => [ | |||||
'monday' => 'Lundi', | |||||
'tuesday' => 'Mardi', | |||||
'wednesday' => 'Mercredi', | |||||
'thursday' => 'Jeudi', | |||||
'friday' => 'Vendredi', | |||||
'saterday' => 'Samedi', | |||||
'sunday' => 'Dimanche', | |||||
], | |||||
'value' => function($model) { | 'value' => function($model) { | ||||
return $model->strJoursLivraison() ; | |||||
return $model->getStrDeliveryDays() ; | |||||
} | } | ||||
], | ], | ||||
[ | [ | ||||
'attribute' => 'acces_restreint', | |||||
'attribute' => 'access_type', | |||||
'label' => 'Accès', | |||||
'filter' => [ | |||||
'open' => 'Ouvert', | |||||
'code' => 'Code', | |||||
'restricted_access' => 'Accès restreint' | |||||
], | |||||
'format' => 'raw', | 'format' => 'raw', | ||||
'value' => function($model) { | 'value' => function($model) { | ||||
$count = PointVenteUser::find()->where(['id_point_vente' => $model->id])->count(); | |||||
$count = UserPointSale::find()->where(['id_point_sale' => $model->id])->count(); | |||||
$html = '' ; | $html = '' ; | ||||
if($model->acces_restreint) | |||||
if($model->restricted_access) | |||||
{ | { | ||||
$html .= '<span class="glyphicon glyphicon-lock"></span> ' ; | $html .= '<span class="glyphicon glyphicon-lock"></span> ' ; | ||||
if($count == 1) | if($count == 1) | ||||
} | } | ||||
], | ], | ||||
[ | [ | ||||
'attribute' => 'credit_pain', | |||||
'label' => 'Crédit pain', | |||||
'attribute' => 'credit', | |||||
'label' => 'Crédit', | |||||
'format' => 'raw', | 'format' => 'raw', | ||||
'value' => function($model) { | 'value' => function($model) { | ||||
if($model->credit_pain) | |||||
if($model->credit) { | |||||
return '<span class="glyphicon glyphicon-euro"></span>' ; | return '<span class="glyphicon glyphicon-euro"></span>' ; | ||||
} | |||||
return '' ; | return '' ; | ||||
} | } | ||||
], | ], | ||||
[ | [ | ||||
'class' => 'yii\grid\ActionColumn', | 'class' => 'yii\grid\ActionColumn', | ||||
'template' => '{update} {delete}', | 'template' => '{update} {delete}', | ||||
'headerOptions' => ['class' => 'actions'], | |||||
'headerOptions' => ['class' => 'column-actions'], | |||||
'contentOptions' => ['class' => 'column-actions'], | |||||
'buttons' => [ | 'buttons' => [ | ||||
'update' => function ($url, $model) { | 'update' => function ($url, $model) { | ||||
return Html::a('<span class="glyphicon glyphicon-pencil"></span> Modifier', $url, [ | |||||
return Html::a('<span class="glyphicon glyphicon-pencil"></span>', $url, [ | |||||
'title' => Yii::t('app', 'Modifier'), 'class' => 'btn btn-default' | 'title' => Yii::t('app', 'Modifier'), 'class' => 'btn btn-default' | ||||
]); | ]); | ||||
}, | }, | ||||
'delete' => function ($url, $model) { | 'delete' => function ($url, $model) { | ||||
return Html::a('<span class="glyphicon glyphicon-trash"></span> Suprimer', $url, [ | |||||
return Html::a('<span class="glyphicon glyphicon-trash"></span>', $url, [ | |||||
'title' => Yii::t('app', 'Supprimer'), 'class' => 'btn btn-default' | 'title' => Yii::t('app', 'Supprimer'), 'class' => 'btn btn-default' | ||||
]); | ]); | ||||
} | } | ||||
], | ], | ||||
], | ], | ||||
]); ?> | ]); ?> | ||||
</div> | </div> |
<?php | <?php | ||||
/** | /** | ||||
Copyright La boîte à pain (2018) | |||||
Copyright distrib (2018) | |||||
contact@laboiteapain.net | |||||
contact@opendistrib.net | |||||
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\helpers\Html; | use yii\helpers\Html; | ||||
/* @var $this yii\web\View */ | |||||
/* @var $model app\models\Produit */ | |||||
$this->setTitle('Modifier un point de vente') ; | |||||
$this->addBreadcrumb(['label' => 'Points de vente', 'url' => ['index']]) ; | |||||
$this->addBreadcrumb(['label' => Html::encode($model->name), 'url' => ['update', 'id' => $model->id]]) ; | |||||
$this->addBreadcrumb('Modifier') ; | |||||
$this->title = 'Modifier une commande récurrente'; | |||||
$this->params['breadcrumbs'][] = ['label' => 'Commandes récurrentes', 'url' => ['index']]; | |||||
$this->params['breadcrumbs'][] = 'Modifier'; | |||||
?> | ?> | ||||
<div class="commandeauto-update"> | |||||
<h1><?= Html::encode($this->title) ?></h1> | |||||
<div class="point-sale-update"> | |||||
<?= $this->render('_form', [ | <?= $this->render('_form', [ | ||||
'model' => $model, | 'model' => $model, | ||||
'produits' => $produits | |||||
'users' => $users | |||||
]) ?> | ]) ?> | ||||
</div> | </div> |
<?php | |||||
/** | |||||
Copyright La boîte à pain (2018) | |||||
contact@laboiteapain.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; | |||||
/* @var $this yii\web\View */ | |||||
/* @var $model backend\models\PointVente */ | |||||
$this->title = 'Modifier un point de vente'; | |||||
$this->params['breadcrumbs'][] = ['label' => 'Points de vente', 'url' => ['index']]; | |||||
$this->params['breadcrumbs'][] = ['label' => Html::encode($model->nom), 'url' => ['update', 'id' => $model->id]]; | |||||
$this->params['breadcrumbs'][] = 'Modifier'; | |||||
?> | |||||
<div class="point-vente-update"> | |||||
<h1><?= Html::encode($this->title) ?></h1> | |||||
<?= $this->render('_form', [ | |||||
'model' => $model, | |||||
'users' => $users | |||||
]) ?> | |||||
</div> |
<?php | <?php | ||||
/** | /** | ||||
Copyright La boîte à pain (2018) | |||||
Copyright distrib (2018) | |||||
contact@laboiteapain.net | |||||
contact@opendistrib.net | |||||
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. | ||||
'label' => 'Référence', | 'label' => 'Référence', | ||||
], | ], | ||||
[ | [ | ||||
'attribute' => 'id_etablissement', | |||||
'label' => 'Établissement', | |||||
'attribute' => 'id_producer', | |||||
'label' => 'Producteur', | |||||
'value' => function($model) { | 'value' => function($model) { | ||||
return Html::encode($model->etablissement->nom) ; | |||||
return Html::encode($model->producer->name) ; | |||||
} | } | ||||
], | ], | ||||
'libelle', | 'libelle', | ||||
[ | [ | ||||
'attribute' => 'montant_ht', | |||||
'attribute' => 'amount_ht', | |||||
'label' => 'Montant', | 'label' => 'Montant', | ||||
'value' => function($model) { | 'value' => function($model) { | ||||
return number_format($model->montant_ht,2).' €' ; | |||||
return number_format($model->amount_ht,2).' €' ; | |||||
} | } | ||||
], | ], | ||||
[ | [ | ||||
'attribute' => 'paye', | |||||
'attribute' => 'paid', | |||||
'label' => 'Payé', | 'label' => 'Payé', | ||||
'format' => 'raw', | 'format' => 'raw', | ||||
'value' => function($model) { | 'value' => function($model) { | ||||
if($model->paye) | |||||
if($model->paid) | |||||
{ | { | ||||
return '<span class="label label-success">Oui</span>' ; | return '<span class="label label-success">Oui</span>' ; | ||||
} | } |
<?php | <?php | ||||
/** | /** | ||||
Copyright La boîte à pain (2018) | |||||
Copyright distrib (2018) | |||||
contact@laboiteapain.net | |||||
contact@opendistrib.net | |||||
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\helpers\Html; | use yii\helpers\Html; | ||||
use yii\grid\GridView; | use yii\grid\GridView; | ||||
use common\models\User ; | use common\models\User ; | ||||
use common\models\Etablissement ; | |||||
use common\models\Producer ; | |||||
use common\models\Distribution ; | |||||
$this->title = 'Producteurs'; | |||||
$this->params['breadcrumbs'][] = 'Administration' ; | |||||
$this->params['breadcrumbs'][] = $this->title; | |||||
$this->setTitle('Producteurs') ; | |||||
$this->addBreadcrumb($this->getTitle()) ; | |||||
?> | ?> | ||||
<h1>Producteurs</h1> | |||||
<?= GridView::widget([ | <?= GridView::widget([ | ||||
'dataProvider' => $datas_etablissements, | |||||
'dataProvider' => $dataProviderProducer, | |||||
'columns' => [ | 'columns' => [ | ||||
'nom', | |||||
'name', | |||||
[ | [ | ||||
'attribute' => 'date_creation', | 'attribute' => 'date_creation', | ||||
'format' => 'raw', | 'format' => 'raw', | ||||
'attribute' => 'Lieu', | 'attribute' => 'Lieu', | ||||
'format' => 'raw', | 'format' => 'raw', | ||||
'value' => function($model) { | 'value' => function($model) { | ||||
return Html::encode($model->ville.' ('.$model->code_postal.')') ; | |||||
return Html::encode($model->city.' ('.$model->postcode.')') ; | |||||
} | } | ||||
], | ], | ||||
[ | [ | ||||
'attribute' => 'Clients', | |||||
'attribute' => 'Utilisateurs', | |||||
'format' => 'raw', | 'format' => 'raw', | ||||
'value' => function($model) { | 'value' => function($model) { | ||||
if(!$model->userEtablissement || !count($model->userEtablissement)) | |||||
if(!$model->userProducer || !count($model->userProducer)) | |||||
{ | { | ||||
return 'Aucun client' ; | |||||
return 'Aucun utilisateur' ; | |||||
} | } | ||||
else { | else { | ||||
$clients = count($model->userEtablissement).' client' ; | |||||
if(count($model->userEtablissement) > 1) | |||||
$clients .= 's' ; | |||||
return $clients ; | |||||
$users = count($model->userProducer).' client' ; | |||||
if(count($model->userProducer) > 1) { | |||||
$users .= 's' ; | |||||
} | |||||
return $users ; | |||||
} | } | ||||
} | } | ||||
else { | else { | ||||
foreach($model->user as $u) | foreach($model->user as $u) | ||||
{ | { | ||||
if($u->status == User::STATUS_BOULANGER) | |||||
if($u->status == User::STATUS_PRODUCER) | |||||
{ | { | ||||
return Html::encode($u->prenom.' '.$u->nom) | |||||
return Html::encode($u->lastname.' '.$u->name) | |||||
.'<br />'.Html::encode($u->email) | .'<br />'.Html::encode($u->email) | ||||
.'<br />'.Html::encode($u->telephone) ; | |||||
.'<br />'.Html::encode($u->phone) ; | |||||
} | } | ||||
} | } | ||||
} | } | ||||
], | ], | ||||
[ | [ | ||||
'attribute' => 'actif', | |||||
'attribute' => 'active', | |||||
'format' => 'raw', | 'format' => 'raw', | ||||
'value' => function($model) { | 'value' => function($model) { | ||||
$html = '' ; | $html = '' ; | ||||
if($model->actif) | |||||
if($model->active) { | |||||
$html .= '<span class="label label-success">En ligne</span>' ; | $html .= '<span class="label label-success">En ligne</span>' ; | ||||
else | |||||
} | |||||
else { | |||||
$html .= '<span class="label label-danger">Hors-ligne</span>' ; | $html .= '<span class="label label-danger">Hors-ligne</span>' ; | ||||
} | |||||
if(strlen($model->code)) | if(strlen($model->code)) | ||||
{ | { | ||||
$html .= ' <span class="glyphicon glyphicon-lock" data-toggle="tooltip" data-placement="bottom" data-original-title="'.Html::encode($model->code).'"></span>' ; | $html .= ' <span class="glyphicon glyphicon-lock" data-toggle="tooltip" data-placement="bottom" data-original-title="'.Html::encode($model->code).'"></span>' ; | ||||
return $html ; | return $html ; | ||||
} | } | ||||
], | ], | ||||
[ | |||||
'attribute' => 'Gratuit', | |||||
'format' => 'raw', | |||||
'value' => function($model) { | |||||
if($model->gratuit) | |||||
return '<span class="label label-success">Compte gratuit</span>' ; | |||||
else | |||||
return '' ; | |||||
} | |||||
], | |||||
[ | [ | ||||
'attribute' => 'Prix libre', | 'attribute' => 'Prix libre', | ||||
'label' => 'Prix libre', | 'label' => 'Prix libre', | ||||
'format' => 'raw', | 'format' => 'raw', | ||||
'value' => function($model) { | 'value' => function($model) { | ||||
if(is_null($model->prix_libre)) | |||||
if(is_null($model->free_price)) { | |||||
return '' ; | return '' ; | ||||
else | |||||
return $model->getPrixLibre() ; | |||||
} | |||||
else { | |||||
return $model->getFreePrice() ; | |||||
} | |||||
} | } | ||||
], | ], | ||||
[ | [ | ||||
'attribute' => 'Cours', | |||||
'label' => 'CA mois en cours', | |||||
'label' => 'Dons (mois précédent)', | |||||
'format' => 'raw', | 'format' => 'raw', | ||||
'value' => function($model) { | 'value' => function($model) { | ||||
$ca = $model->getCA(date('Y-m')) ; | |||||
$productGift = Product::getProductGift() ; | |||||
$distributionsArray = Distribution::find() | |||||
->where(['>=', 'distribution.date', date('Y-m-01', strtotime("-1 month"))]) | |||||
->andWhere(['<=', 'distribution.date', date('Y-m-31', strtotime("-1 month"))]) | |||||
->andWhere(['distribution.id_producer' => $model->id]) | |||||
->with(['order','order.productOrder']) | |||||
->all() ; | |||||
$html = '' ; | |||||
$html .= 'CA : '.number_format($ca,2).' €<br />' ; | |||||
return $html ; | |||||
$gifts = 0 ; | |||||
foreach($distributionsArray as $distribution) { | |||||
foreach($distribution->order as $order) { | |||||
foreach($order->productOrder as $productOrder) { | |||||
if($productOrder->id_product == $productGift->id) { | |||||
$gifts += $productOrder->quantity * $productGift->price ; | |||||
} | |||||
} | |||||
} | |||||
} | |||||
return Price::format($gifts) ; | |||||
} | } | ||||
], | ], | ||||
], | ], |
use yii\helpers\Html; | use yii\helpers\Html; | ||||
use yii\grid\GridView; | use yii\grid\GridView; | ||||
use common\models\User ; | use common\models\User ; | ||||
use common\models\Etablissement ; | |||||
use common\models\Producer ; | |||||
use yii\bootstrap\ActiveForm; | use yii\bootstrap\ActiveForm; | ||||
$this->title = 'Mon abonnement'; | |||||
$this->params['breadcrumbs'][] = 'Administration' ; | |||||
$this->params['breadcrumbs'][] = $this->title; | |||||
$this->setTitle('Mon abonnement') ; | |||||
$this->addBreadcrumb($this->getTitle()) ; | |||||
?> | ?> | ||||
<h1>Mon abonnement</h1> | |||||
<p class=""> | |||||
Vous seuls savez ce que vous apporte cet outil et dans quelle mesure vous souhaitez le soutenir.<br /> | |||||
C'est pourquoi le modèle économique est basé sur un prix libre facturé mensuellement.<br /> | |||||
</p> | |||||
<div class="callout callout-info"> | |||||
<h4>Abonnement à prix libre</h4> | |||||
<p><i>distrib</i> fonctionne avec système d'abonnement à prix libre pour en | |||||
assurer la plus grande diffusion possible. Ceci correspond également à l'unique source de revenus | |||||
nécessaire à la maintenance et au développement de la plateforme.<br /> | |||||
Si cet outil est important dans votre activité, nous vous encourageons à nous soutenir en vous abonnant. | |||||
</p> | |||||
</div> | |||||
<div id="estimation-facture" class=""> | |||||
<div id="free-price" class=""> | |||||
<?php if($alert_prix_libre): ?> | |||||
<?php if($alertFreePrice): ?> | |||||
<div class="alert alert-success"> | <div class="alert alert-success"> | ||||
Le montant de votre abonnement a bien été mis à jour. | |||||
<?php if($etablissement->prix_libre != 0): ?> | |||||
Vos prochaines factures mensuelles auront un montant de <strong><?= number_format(Html::encode($etablissement->prix_libre),2).' € HT' ; ?></strong>. | |||||
Le montant de votre abonnement a bien été mis à jour. | |||||
<?php if($producer->free_price != 0): ?> | |||||
Vos prochaines factures mensuelles auront un montant de <strong><?= number_format(Html::encode($producer->free_price),2).' € HT' ; ?></strong>. | |||||
<?php endif; ?> | <?php endif; ?> | ||||
</div> | </div> | ||||
<?php endif; ?> | <?php endif; ?> | ||||
<?php $form = ActiveForm::begin([ | <?php $form = ActiveForm::begin([ | ||||
//'layout' => 'vertical', | |||||
'fieldConfig' => [ | 'fieldConfig' => [ | ||||
'template' => "{label}\n{beginWrapper}\n{input}\n{hint}\n{error}\n{endWrapper}", | 'template' => "{label}\n{beginWrapper}\n{input}\n{hint}\n{error}\n{endWrapper}", | ||||
'horizontalCssClasses' => [ | 'horizontalCssClasses' => [ | ||||
], | ], | ||||
]); ?> | ]); ?> | ||||
<?= $form->field($etablissement, 'prix_libre',[ | |||||
<?= $form->field($producer, 'free_price',[ | |||||
'inputTemplate' => '<div class="input-group">{input}<span class="input-group-addon"><span class="glyphicon glyphicon-euro"></span> HT / mois</span></div>', | 'inputTemplate' => '<div class="input-group">{input}<span class="input-group-addon"><span class="glyphicon glyphicon-euro"></span> HT / mois</span></div>', | ||||
]) | ]) | ||||
->label('Prix libre'); ?> | ->label('Prix libre'); ?> | ||||
<div class="form-group field-user-prix_libre"> | <div class="form-group field-user-prix_libre"> | ||||
<label class="control-label col-sm-2" for=""></label> | |||||
<div class="col-sm-6"> | <div class="col-sm-6"> | ||||
<?= Html::submitButton('Valider', ['class' => 'btn btn-primary']) ?> | <?= Html::submitButton('Valider', ['class' => 'btn btn-primary']) ?> | ||||
</div> | </div> | ||||
<?php ActiveForm::end(); ?> | <?php ActiveForm::end(); ?> | ||||
<div class="clr"></div> | <div class="clr"></div> | ||||
</div> | |||||
<!-- | |||||
<h2>Dernières factures</h2> | |||||
<?= GridView::widget([ | |||||
'dataProvider' => $datas_factures, | |||||
'columns' => [ | |||||
[ | |||||
'attribute' => 'reference', | |||||
'label' => 'Référence', | |||||
], | |||||
[ | |||||
'attribute' => 'date', | |||||
'value' => function($model) { | |||||
return date('d/m/Y', strtotime($model->date)) ; | |||||
} | |||||
], | |||||
'libelle', | |||||
[ | |||||
'attribute' => 'montant_ht', | |||||
'label' => 'Montant', | |||||
'value' => function($model) { | |||||
return number_format($model->montant_ht,2).' €' ; | |||||
} | |||||
], | |||||
[ | |||||
'attribute' => 'paye', | |||||
'label' => 'Payé', | |||||
'format' => 'raw', | |||||
'value' => function($model) { | |||||
if($model->paye) | |||||
{ | |||||
return '<span class="label label-success">Oui</span>' ; | |||||
} | |||||
else { | |||||
return '<span class="label label-danger">Non</span>' ; | |||||
} | |||||
} | |||||
] | |||||
], | |||||
]); ?> | |||||
--> | |||||
</div> |
<?php | |||||
/** | |||||
Copyright La boîte à pain (2018) | |||||
contact@laboiteapain.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; | |||||
use yii\widgets\ActiveForm; | |||||
use common\helpers\Url ; | |||||
\backend\assets\VuejsProducerUpdateAsset::register($this); | |||||
$this->setTitle('Paramètres') ; | |||||
$this->addBreadcrumb($this->getTitle()) ; | |||||
?> | |||||
<div class="user-update" id="app-producer-update"> | |||||
<div id="nav-params"> | |||||
<button v-for="section in sectionsArray" :class="'btn '+((currentSection == section.name) ? 'btn-primary' : 'btn-default')" @click="changeSection(section)"> | |||||
{{ section.nameDisplay }} | |||||
<span class="glyphicon glyphicon-triangle-bottom"></span> | |||||
</button> | |||||
</div> | |||||
<div class="user-form"> | |||||
<?php $form = ActiveForm::begin(); ?> | |||||
<div> | |||||
<div v-show="currentSection == 'general'" class="panel panel-default"> | |||||
<div class="panel-heading"> | |||||
<h3 class="panel-title">Général</h3> | |||||
</div> | |||||
<div class="panel-body"> | |||||
<?= $form->field($model, 'active') | |||||
->dropDownList([ | |||||
0 => 'Non', | |||||
1 => 'Oui' | |||||
], []) | |||||
->label('En ligne') | |||||
->hint('Activez cette option pour rendre votre établissement visible à vos clients.') ; ?> | |||||
<?= $form->field($model, 'name') ?> | |||||
<?= $form->field($model, 'type') ?> | |||||
<?= $form->field($model, 'description') | |||||
->textarea(['rows' => 6]) | |||||
->hint('Affiché sur la page d\'accueil') ?> | |||||
<?= $form->field($model, 'postcode') ?> | |||||
<?= $form->field($model, 'city') ?> | |||||
<?= $form->field($model, 'code')->hint("Saisissez ce champs si vous souhaitez protéger l'accès à votre boutique par un code, sinon laissez-le vide.<br />" | |||||
. "Ce code est à communiquer à vos client pour qu'ils puissent ajouter votre établissement à leur tableau de bord.<br />" | |||||
. "<a href=\"".Yii::$app->urlManager->createUrl(['communicate/index'])."\">Cliquez ici</a> pour télécharger un mode d'emploi comprenant ce code à distribuer à vos clients.") ?> | |||||
<?= $form->field($model, 'photo')->fileInput() ?> | |||||
<?php | |||||
if (strlen($model->photo)) { | |||||
$base_url = Yii::$app->urlManagerProducer->getHostInfo().'/'.Yii::$app->urlManagerProducer->baseUrl ; | |||||
echo '<img src="'.$base_url.'uploads/' . $model->photo . '" width="400px" /><br />'; | |||||
echo '<input type="checkbox" name="delete_photo" id="delete_photo" /> <label for="delete_photo">Supprimer la photo</label><br /><br />'; | |||||
} | |||||
?> | |||||
</div> | |||||
</div> | |||||
<div v-show="currentSection == 'prise-commande'" class="panel panel-default"> | |||||
<div class="panel-heading"> | |||||
<h3 class="panel-title">Prise de commande</h3> | |||||
</div> | |||||
<div class="panel-body"> | |||||
<?= $form->field($model, 'order_delay') | |||||
->dropDownList([ | |||||
1 => '1 jour', | |||||
2 => '2 jours', | |||||
3 => '3 jours', | |||||
4 => '4 jours', | |||||
5 => '5 jours', | |||||
6 => '6 jours', | |||||
7 => '7 jours', | |||||
], []) | |||||
->hint('Si <strong>1 jour</strong> est sélectionné, le client pourra commander jusqu\'à la veille de la production.<br />' | |||||
. 'Si <strong>2 jours</strong> est sélectionné, le client pourra commander jusqu\'à l\'avant-veille de la production, etc.') ; ?> | |||||
<?= $form->field($model, 'order_deadline') | |||||
->dropDownList([ | |||||
24 => 'Minuit', | |||||
23 => '23h', | |||||
22 => '22h', | |||||
21 => '21h', | |||||
20 => '20h', | |||||
19 => '19h', | |||||
18 => '18h', | |||||
17 => '17h', | |||||
16 => '16h', | |||||
15 => '15h', | |||||
14 => '14h', | |||||
13 => '13h', | |||||
12 => '12h', | |||||
11 => '11h', | |||||
10 => '10h', | |||||
9 => '9h', | |||||
8 => '8h', | |||||
], []) | |||||
->hint('Heure limite jusqu\'à laquelle les clients peuvent commander pour satisfaire le délai de commande.<br />' | |||||
. 'Par exemple, si <strong>2 jours</strong> est sélectionné dans le délai de commande, le client devra commander l\'avant-veille de la production avant l\'heure précisée ici.') ; ?> | |||||
<?= $form->field($model, 'order_infos') | |||||
->textarea(['rows' => 6]) | |||||
->hint('Affichées au client lors de sa commande')?> | |||||
<?= $form->field($model, 'option_allow_user_gift') | |||||
->dropDownList([ | |||||
0 => 'Non', | |||||
1 => 'Oui', | |||||
], []) ; ?> | |||||
</div> | |||||
</div> | |||||
<div v-show="currentSection == 'abonnements'" class="panel panel-default"> | |||||
<div class="panel-heading"> | |||||
<h3 class="panel-title">Abonnements</h3> | |||||
</div> | |||||
<div class="panel-body"> | |||||
<?= $form->field($model, 'user_manage_subscription') | |||||
->dropDownList([ | |||||
0 => 'Non', | |||||
1 => 'Oui', | |||||
], []) ; ?> | |||||
</div> | |||||
</div> | |||||
<div v-show="currentSection == 'credit-payment'" class="panel panel-default"> | |||||
<div class="panel-heading"> | |||||
<h3 class="panel-title">Crédit / paiement en ligne</h3> | |||||
</div> | |||||
<div class="panel-body"> | |||||
<?= $form->field($model, 'credit') | |||||
->dropDownList([ | |||||
0 => 'Non', | |||||
1 => 'Oui', | |||||
], []) | |||||
->label('Activer le système de Crédit') | |||||
->hint('Le système de Crédit permet à vos clients d\'avoir un compte prépayé sur le site <em>distrib</em>.<br />' | |||||
. 'Ils créditent leur compte en vous donnant la somme de leur choix et c\'est ensuite à vous de '.Html::a('mettre à jour', ['user/index']).' leur Crédit en ligne.<br />' | |||||
. 'Ceci fait, les clients paient leur commande directement via leur Crédit.') ; ?> | |||||
<?= $form->field($model, 'credit_limit_reminder',[ | |||||
'template' => '{label}<div class="input-group">{input}<span class="input-group-addon"><span class="glyphicon glyphicon-euro"></span></span></div>{hint}', | |||||
]) | |||||
->hint("Une relance est envoyé au client dès que ce seuil est dépassé.") ; ?> | |||||
<?= $form->field($model, 'credit_functioning') | |||||
->dropDownList([ | |||||
Producer::CREDIT_FUNCTIONING_OPTIONAL => 'Optionnelle', | |||||
Producer::CREDIT_FUNCTIONING_MANDATORY => 'Obligatoire', | |||||
], []) ; ?> | |||||
<?= $form->field($model, 'online_payment') | |||||
->dropDownList([ | |||||
0 => 'Non', | |||||
1 => 'Oui', | |||||
], []) | |||||
->label('Activer le paiement en ligne') | |||||
->hint('Le paiement en ligne permet à vos utilisateurs de recharger leur Crédit' | |||||
. ' via leur carte bancaire.') ; ?> | |||||
<?= $form->field($model, 'secret_key_payplug') ?> | |||||
</div> | |||||
</div> | |||||
<div v-show="currentSection == 'infos'" class="panel panel-default"> | |||||
<div class="panel-heading"> | |||||
<h3 class="panel-title">Informations légales</h3> | |||||
</div> | |||||
<div class="panel-body"> | |||||
<?= $form->field($model, 'mentions') | |||||
->textarea(['rows' => 15]) | |||||
->hint('') ?> | |||||
<?= $form->field($model, 'gcs') | |||||
->textarea(['rows' => 15]) | |||||
->hint('') ?> | |||||
</div> | |||||
</div> | |||||
<div class="form-group"> | |||||
<?= Html::submitButton('Mettre à jour', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?> | |||||
</div> | |||||
</div> | |||||
<?php ActiveForm::end(); ?> | |||||
</div> | |||||
</div> | |||||
<?php | <?php | ||||
/** | /** | ||||
Copyright La boîte à pain (2018) | |||||
Copyright distrib (2018) | |||||
contact@laboiteapain.net | |||||
contact@opendistrib.net | |||||
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. | ||||
/* @var $form yii\widgets\ActiveForm */ | /* @var $form yii\widgets\ActiveForm */ | ||||
?> | ?> | ||||
<div class="produit-form"> | |||||
<div class="product-form"> | |||||
<?php $form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']]); ?> | <?php $form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']]); ?> | ||||
<?= $form->field($model, 'actif')->radioList([1 => 'Oui',0 => 'Non' ]) ?> | |||||
<?= $form->field($model, 'nom')->textInput(['maxlength' => 255]) ?> | |||||
<?= $form->field($model, 'active')->radioList([1 => 'Oui',0 => 'Non' ]) ?> | |||||
<?= $form->field($model, 'name')->textInput(['maxlength' => 255]) ?> | |||||
<?= $form->field($model, 'description')->textInput(['maxlength' => 255]) ?> | <?= $form->field($model, 'description')->textInput(['maxlength' => 255]) ?> | ||||
<?= $form->field($model, 'recette')->textarea() ?> | |||||
<?= $form->field($model, 'prix')->textInput() ?> | |||||
<?= $form->field($model, 'poids')->textInput() ?> | |||||
<?= $form->field($model, 'quantite_max') | |||||
<?= $form->field($model, 'recipe')->textarea() ?> | |||||
<?= $form->field($model, 'price')->textInput() ?> | |||||
<?= $form->field($model, 'weight')->textInput() ?> | |||||
<?= $form->field($model, 'quantity_max') | |||||
->hint('Renseignez ce champs si vous souhaitez limiter la quantité commandable pour ce produit.') | ->hint('Renseignez ce champs si vous souhaitez limiter la quantité commandable pour ce produit.') | ||||
->textInput() ?> | ->textInput() ?> | ||||
<?= $form->field($model, 'photo')->fileInput() ?> | <?= $form->field($model, 'photo')->fileInput() ?> | ||||
<?php | <?php | ||||
if(strlen($model->photo)) { | if(strlen($model->photo)) { | ||||
echo '<img src="../../frontend/web/uploads/'.$model->photo.'" width="200px" /><br />' ; | |||||
echo '<input type="checkbox" name="delete_photo" id="delete_photo" /> <label for="delete_photo">Supprimer la photo</label><br /><br />' ; | |||||
echo '<img src="'.Yii::$app->urlManagerProducer->getBaseUrl().'/uploads/'.$model->photo.'" width="200px" /><br />' ; | |||||
echo '<input type="checkbox" name="delete_photo" id="delete_photo" /> <label for="delete_photo">Supprimer la photo</label><br /><br />' ; | |||||
} | } | ||||
?> | ?> | ||||
<?php if(Yii::$app->user->identity->id_etablissement == 1): ?> | |||||
<?= $form->field($model, 'illustration')->fileInput() ?> | |||||
<?php | |||||
if(strlen($model->illustration)) { | |||||
echo '<img src="../../frontend/web/uploads/'.$model->illustration.'" width="200px" /><br />' ; | |||||
echo '<input type="checkbox" name="delete_illustration" id="delete_illustration" /> <label for="delete_illustration">Supprimer l\'illustration</label><br /><br />' ; | |||||
} | |||||
?> | |||||
<?php endif; ?> | |||||
<h2>Jours de production</h2> | |||||
<div id="jours-production"> | |||||
<?= $form->field($model, 'lundi')->checkbox() ?> | |||||
<?= $form->field($model, 'mardi')->checkbox() ?> | |||||
<?= $form->field($model, 'mercredi')->checkbox() ?> | |||||
<?= $form->field($model, 'jeudi')->checkbox() ?> | |||||
<?= $form->field($model, 'vendredi')->checkbox() ?> | |||||
<?= $form->field($model, 'samedi')->checkbox() ?> | |||||
<?= $form->field($model, 'dimanche')->checkbox() ?> | |||||
<h2>Jours de distribution</h2> | |||||
<div id="days-production"> | |||||
<?= $form->field($model, 'monday')->checkbox() ?> | |||||
<?= $form->field($model, 'tuesday')->checkbox() ?> | |||||
<?= $form->field($model, 'wednesday')->checkbox() ?> | |||||
<?= $form->field($model, 'thursday')->checkbox() ?> | |||||
<?= $form->field($model, 'friday')->checkbox() ?> | |||||
<?= $form->field($model, 'saturday')->checkbox() ?> | |||||
<?= $form->field($model, 'sunday')->checkbox() ?> | |||||
</div> | </div> | ||||
<div class="clr"></div> | <div class="clr"></div> | ||||
<?= $form->field($model, 'id_etablissement')->hiddenInput()->label('') ?> | |||||
<?= $form->field($model, 'id_producer')->hiddenInput()->label('') ?> | |||||
<?php | |||||
if(!$model->isNewRecord) { | |||||
echo $form->field($model, 'apply_distributions') | |||||
->checkbox() | |||||
->hint('Sélectionnez cette option si vous souhaitez que ces modifications soient répercutées dans les distributions à venir déjà initialisées.'); | |||||
} | |||||
?> | |||||
<div class="form-group"> | <div class="form-group"> | ||||
<?= Html::submitButton($model->isNewRecord ? 'Ajouter' : 'Modifier', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?> | <?= Html::submitButton($model->isNewRecord ? 'Ajouter' : 'Modifier', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?> |
<?php | <?php | ||||
/** | /** | ||||
Copyright La boîte à pain (2018) | |||||
Copyright distrib (2018) | |||||
contact@laboiteapain.net | |||||
contact@opendistrib.net | |||||
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; | |||||
$this->setTitle('Ajouter un produit') ; | |||||
$this->addBreadcrumb(['label' => 'Produits', 'url' => ['index']]) ; | |||||
$this->addBreadcrumb('Ajouter') ; | |||||
<h1>Paiement validé</h1> | |||||
?> | |||||
<div class="product-create"> | |||||
<?= $this->render('_form', [ | |||||
'model' => $model, | |||||
]) ?> | |||||
</div> |
<?php | <?php | ||||
/** | /** | ||||
Copyright La boîte à pain (2018) | |||||
Copyright distrib (2018) | |||||
contact@laboiteapain.net | |||||
contact@opendistrib.net | |||||
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\grid\GridView; | use yii\grid\GridView; | ||||
use common\helpers\Url ; | use common\helpers\Url ; | ||||
/* @var $this yii\web\View */ | |||||
/* @var $dataProvider yii\data\ActiveDataProvider */ | |||||
$this->setTitle('Produits') ; | |||||
$this->addBreadcrumb($this->getTitle()) ; | |||||
$this->addButton(['label' => '+', 'url' => 'product/create', 'class' => 'btn btn-primary']) ; | |||||
$this->title = 'Produits'; | |||||
$this->params['breadcrumbs'][] = $this->title; | |||||
?> | ?> | ||||
<div class="produit-index"> | |||||
<h1><?= Html::encode($this->title) ?> <?= Html::a('Ajouter', ['create'], ['class' => 'btn btn-success']) ?></h1> | |||||
<div class="product-index"> | |||||
<?= GridView::widget([ | <?= GridView::widget([ | ||||
'filterModel' => $searchModel, | |||||
'dataProvider' => $dataProvider, | 'dataProvider' => $dataProvider, | ||||
'columns' => [ | 'columns' => [ | ||||
[ | [ | ||||
'attribute' => 'order', | 'attribute' => 'order', | ||||
'headerOptions' => ['class' => 'order'], | 'headerOptions' => ['class' => 'order'], | ||||
'format' => 'raw', | 'format' => 'raw', | ||||
'filter' => '', | |||||
'value' => function($model) { | 'value' => function($model) { | ||||
return '<a class="btn-order btn btn-default" href="javascript:void(0);"><span class="glyphicon glyphicon-resize-vertical"></span></a>' ; | return '<a class="btn-order btn btn-default" href="javascript:void(0);"><span class="glyphicon glyphicon-resize-vertical"></span></a>' ; | ||||
} | } | ||||
'attribute' => 'photo', | 'attribute' => 'photo', | ||||
'format' => 'raw', | 'format' => 'raw', | ||||
'headerOptions' => ['class' => 'td-photo'], | 'headerOptions' => ['class' => 'td-photo'], | ||||
'filter' => '', | |||||
'value' => function($model) { | 'value' => function($model) { | ||||
if(strlen($model->photo)) { | if(strlen($model->photo)) { | ||||
$url = Url::frontend() ; | |||||
return '<img class="photo-produit" src="'.$url.'uploads/'.$model->photo.'" />' ; | |||||
$url = Yii::$app->urlManagerProducer->getHostInfo().'/'.Yii::$app->urlManagerProducer->baseUrl ; | |||||
return '<img class="photo-product" src="'.$url.'/uploads/'.$model->photo.'" />' ; | |||||
} | } | ||||
return '' ; | return '' ; | ||||
} | } | ||||
], | ], | ||||
'nom', | |||||
'name', | |||||
'description', | 'description', | ||||
[ | [ | ||||
'attribute' => 'actif', | |||||
'headerOptions' => ['class' => 'actif'], | |||||
'attribute' => 'active', | |||||
'headerOptions' => ['class' => 'active'], | |||||
'contentOptions' => ['class' => 'center'], | 'contentOptions' => ['class' => 'center'], | ||||
'format' => 'raw', | 'format' => 'raw', | ||||
'filter' => [0 => 'Non', 1 => 'Oui'], | |||||
'value' => function($model) { | 'value' => function($model) { | ||||
if($model->actif) | |||||
if($model->active) | |||||
{ | { | ||||
return '<span class="label label-success">oui</span>' ; | return '<span class="label label-success">oui</span>' ; | ||||
} | } | ||||
[ | [ | ||||
'class' => 'yii\grid\ActionColumn', | 'class' => 'yii\grid\ActionColumn', | ||||
'template' => '{update} {delete}', | 'template' => '{update} {delete}', | ||||
'headerOptions' => ['class' => 'actions'], | |||||
'headerOptions' => ['class' => 'column-actions'], | |||||
'contentOptions' => ['class' => 'column-actions'], | |||||
'buttons' => [ | 'buttons' => [ | ||||
'update' => function ($url, $model) { | 'update' => function ($url, $model) { | ||||
return Html::a('<span class="glyphicon glyphicon-pencil"></span> Modifier', $url, [ | |||||
return Html::a('<span class="glyphicon glyphicon-pencil"></span>', $url, [ | |||||
'title' => Yii::t('app', 'Modifier'), 'class' => 'btn btn-default' | 'title' => Yii::t('app', 'Modifier'), 'class' => 'btn btn-default' | ||||
]); | ]); | ||||
}, | }, | ||||
'delete' => function ($url, $model) { | 'delete' => function ($url, $model) { | ||||
return Html::a('<span class="glyphicon glyphicon-trash"></span> Suprimer', $url, [ | |||||
return Html::a('<span class="glyphicon glyphicon-trash"></span>', $url, [ | |||||
'title' => Yii::t('app', 'Supprimer'), 'class' => 'btn btn-default' | 'title' => Yii::t('app', 'Supprimer'), 'class' => 'btn btn-default' | ||||
]); | ]); | ||||
} | } | ||||
], | ], | ||||
], | ], | ||||
]); ?> | ]); ?> | ||||
</div> | </div> |
<?php | <?php | ||||
/** | /** | ||||
Copyright La boîte à pain (2018) | |||||
Copyright distrib (2018) | |||||
contact@laboiteapain.net | |||||
contact@opendistrib.net | |||||
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\helpers\Html; | use yii\helpers\Html; | ||||
/* @var $this yii\web\View */ | |||||
/* @var $model common\models\Developpement */ | |||||
$this->setTitle('Modifier un produit') ; | |||||
$this->addBreadcrumb(['label' => 'Produits', 'url' => ['index']]) ; | |||||
$this->addBreadcrumb(['label' => $model->name, 'url' => ['update', 'id' => $model->id]]) ; | |||||
$this->addBreadcrumb('Modifier') ; | |||||
$this->title = 'Ajouter un développement'; | |||||
$this->params['breadcrumbs'][] = ['label' => 'Développement', 'url' => ['index']]; | |||||
$this->params['breadcrumbs'][] = $this->title; | |||||
?> | ?> | ||||
<div class="developpement-create"> | |||||
<h1><?= Html::encode($this->title) ?></h1> | |||||
<div class="product-update"> | |||||
<?= $this->render('_form', [ | <?= $this->render('_form', [ | ||||
'model' => $model, | 'model' => $model, | ||||
]) ?> | ]) ?> | ||||
</div> | </div> |
<?php | |||||
/** | |||||
Copyright La boîte à pain (2018) | |||||
contact@laboiteapain.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; | |||||
/* @var $this yii\web\View */ | |||||
/* @var $model app\models\Produit */ | |||||
$this->title = 'Modifier un produit'; | |||||
$this->params['breadcrumbs'][] = ['label' => 'Produits', 'url' => ['index']]; | |||||
$this->params['breadcrumbs'][] = ['label' => $model->nom, 'url' => ['update', 'id' => $model->id]]; | |||||
$this->params['breadcrumbs'][] = 'Modifier'; | |||||
?> | |||||
<div class="produit-update"> | |||||
<h1><?= Html::encode($this->title) ?></h1> | |||||
<?= $this->render('_form', [ | |||||
'model' => $model, | |||||
]) ?> | |||||
</div> |
<?php | <?php | ||||
/** | /** | ||||
Copyright La boîte à pain (2018) | |||||
Copyright distrib (2018) | |||||
contact@laboiteapain.net | |||||
contact@opendistrib.net | |||||
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->title = $name; | $this->title = $name; | ||||
?> | ?> | ||||
<div class="site-error"> | |||||
<section class="content"> | |||||
<h1><?= Html::encode($this->title) ?></h1> | |||||
<div class="error-page"> | |||||
<h2 class="headline text-info"><i class="fa fa-warning text-yellow"></i></h2> | |||||
<div class="alert alert-danger"> | |||||
<?= nl2br(Html::encode($message)) ?> | |||||
</div> | |||||
<div class="error-content"> | |||||
<h3><?= $name ?></h3> | |||||
<p> | |||||
<?= nl2br(Html::encode($message)) ?> | |||||
</p> | |||||
<p> | |||||
The above error occurred while the Web server was processing your request. | |||||
Please contact us if you think this is a server error. Thank you. | |||||
Meanwhile, you may <a href='<?= Yii::$app->homeUrl ?>'>return to dashboard</a> or try using the search | |||||
form. | |||||
</p> | |||||
<p> | |||||
The above error occurred while the Web server was processing your request. | |||||
</p> | |||||
<p> | |||||
Please contact us if you think this is a server error. Thank you. | |||||
</p> | |||||
<form class='search-form'> | |||||
<div class='input-group'> | |||||
<input type="text" name="search" class='form-control' placeholder="Search"/> | |||||
<div class="input-group-btn"> | |||||
<button type="submit" name="submit" class="btn btn-primary"><i class="fa fa-search"></i> | |||||
</button> | |||||
</div> | |||||
</div> | |||||
</form> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</section> |
<?php | <?php | ||||
/** | /** | ||||
Copyright La boîte à pain (2018) | |||||
Copyright distrib (2018) | |||||
contact@laboiteapain.net | |||||
contact@opendistrib.net | |||||
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\helpers\Html ; | use yii\helpers\Html ; | ||||
$this->title = 'Tableau de bord'; | $this->title = 'Tableau de bord'; | ||||
?> | ?> | ||||
<div class="site-index"> | <div class="site-index"> | ||||
<?php if(Yii::$app->request->get('erreur_produits_points_vente')): ?> | |||||
<div class="alert alert-danger">Vous devez saisir vos produits et vos points de vente | |||||
avant d'initialiser vos jours de production.</div> | |||||
<?php if(!$producer->getFreePrice()): ?> | |||||
<div class="callout callout-info"> | |||||
<h4>Abonnement à prix libre</h4> | |||||
<p><i>distrib</i> fonctionne avec système d'abonnement à prix libre pour en | |||||
assurer la plus grande diffusion possible. Ceci correspond également à l'unique source de revenus | |||||
nécessaire à la maintenance et au développement de la plateforme.<br /> | |||||
Si cet outil est important dans votre activité, nous vous encourageons à nous soutenir en vous abonnant. | |||||
</p> | |||||
<p><?= Html::a('> Définir le montant de mon abonnement', ['producer/billing'], ['class' => 'btn btn-default']); ?></p> | |||||
</div> | |||||
<?php endif; ?> | <?php endif; ?> | ||||
<div class="col-md-4"> | |||||
<!-- commandes --> | |||||
<div class=""> | |||||
<div class="panel panel-default"> | |||||
<div class="panel-heading"> | |||||
<h3 class="panel-title"> | |||||
Commandes | |||||
<?= Html::a('Voir', ['commande/index'], ['class' => 'btn btn-default btn-xs']) ; ?> | |||||
</h3> | |||||
</div> | |||||
<div class="panel-body"> | |||||
<?php if(count($productions)): ?> | |||||
<p>Prochaines productions : </p> | |||||
<table class="table table-bordered table-condensed"> | |||||
<thead> | |||||
<tr> | |||||
<th>Date</th> | |||||
<th>Commandes</th> | |||||
<th></th> | |||||
</tr> | |||||
</thead> | |||||
<tbody> | |||||
<?php foreach($productions as $p): ?> | |||||
<tr> | |||||
<td><?= date('d/m/Y',strtotime($p['date'])); ?></td> | |||||
<td><?= count($p->commande); ?></td> | |||||
<td> | |||||
<?= Html::a('<span class="glyphicon glyphicon-eye-open"></span>', ['commande/index','date' => $p['date']], ['class' => 'btn btn-default btn-xs']) ; ?> | |||||
<?php if(count($p->commande)): ?><?= Html::a('<span class="glyphicon glyphicon-download-alt"></span>', ['commande/report','date' => $p['date'],'global' => 1], ['class' => 'btn btn-default btn-xs']) ; ?><?php endif; ?> | |||||
</td> | |||||
</tr> | |||||
<?php endforeach; ?> | |||||
</tbody> | |||||
</table> | |||||
<?php else: ?> | |||||
<div class="alert alert-warning">Aucune production de programmée.</div> | |||||
<?php endif; ?> | |||||
</div> | |||||
</div> | |||||
<?php if(Yii::$app->request->get('error_products_points_sale')): ?> | |||||
<div class="alert alert-warning"> | |||||
Vous devez ajouter <?php if(!$productsCount): ?> des produits<?php endif; ?> | |||||
<?php if(!$productsCount && !$pointsSaleCount): ?> et<?php endif; ?> | |||||
<?php if(!$pointsSaleCount): ?> un ou des points de vente <?php endif; ?> | |||||
avant d'effectuer cette action. | |||||
</div> | </div> | ||||
<?php endif; ?> | |||||
<!-- Clients --> | |||||
<div class=""> | |||||
<div class="panel panel-default"> | |||||
<div class="panel-heading"> | |||||
<h3 class="panel-title"> | |||||
<?= $nb_clients; ?> client<?php if($nb_clients > 1): ?>s<?php endif; ?> | |||||
<?= Html::a('Ajouter',['user/create'],['class' => 'btn btn-success btn-xs margin-left']) ; ?> | |||||
<?= Html::a('Liste', ['user/index'], ['class' => 'btn btn-default btn-xs']) ; ?> | |||||
</h3> | |||||
</div> | |||||
<div class="panel-body"> | |||||
<?php if($nb_clients): ?> | |||||
<p>Dernières inscriptions :</p> | |||||
<table class="table table-bordered table-condensed"> | |||||
<thead> | |||||
<tr> | |||||
<th>Prénom, nom</th> | |||||
<th>Inscription</th> | |||||
<th></th> | |||||
</tr> | |||||
</thead> | |||||
<tbody> | |||||
<?php foreach($clients as $c): ?> | |||||
<tr> | |||||
<td><?= Html::encode($c['prenom'].' '.$c['nom']) ?></td> | |||||
<td><?= date('d/m/Y', $c['created_at']); ?></td> | |||||
<td><?= Html::a('<span class="glyphicon glyphicon-pencil"></span>', ['user/update','id' => $c['user_id']], ['class' => 'btn btn-default btn-xs']) ; ?></td> | |||||
</tr> | |||||
<?php endforeach; ?> | |||||
</tbody> | |||||
</table> | |||||
<?php else: ?> | |||||
<div class="alert alert-warning">Aucun client.</div> | |||||
<?php endif; ?> | |||||
</div> | |||||
<?php if(!$productsCount): ?> | |||||
<div class="info-box"> | |||||
<span class="info-box-icon bg-yellow"><i class="fa fa-clone"></i></span> | |||||
<div class="info-box-content"> | |||||
<span class="info-box-text"><br /><?= Html::a('Ajouter des produits', ['product/create'], ['class' => 'btn btn-default']); ?></span> | |||||
</div> | </div> | ||||
</div> | </div> | ||||
<!-- Clients crédit pain négatif --> | |||||
<div class=""> | |||||
<div class="panel panel-default"> | |||||
<div class="panel-heading"> | |||||
<h3 class="panel-title"> | |||||
Clients au crédit pain négatif | |||||
</h3> | |||||
</div> | |||||
<div class="panel-body"> | |||||
<?php if(count($clients_credit_pain_negatif)): ?> | |||||
<table class="table table-bordered table-condensed"> | |||||
<thead> | |||||
<tr> | |||||
<th>Prénom, nom</th> | |||||
<th>Crédit pain</th> | |||||
</tr> | |||||
</thead> | |||||
<tbody> | |||||
<?php foreach($clients_credit_pain_negatif as $c): ?> | |||||
<tr> | |||||
<td><?= Html::encode($c['prenom'].' '.$c['nom']) ?></td> | |||||
<td><?= number_format($c['credit'],2) ?></td> | |||||
<td><?= Html::a('<span class="glyphicon glyphicon-euro"></span>', ['user/credit','id' => $c['user_id']], ['class' => 'btn btn-default btn-xs']) ; ?></td> | |||||
</tr> | |||||
<?php endforeach; ?> | |||||
</tbody> | |||||
</table> | |||||
<?php else: ?> | |||||
<div class="alert alert-warning">Aucun client.</div> | |||||
<?php endif; ?> | |||||
</div> | |||||
<?php endif; ?> | |||||
<?php if(!$pointsSaleCount): ?> | |||||
<div class="info-box"> | |||||
<span class="info-box-icon bg-yellow"><i class="fa fa-map-marker"></i></span> | |||||
<div class="info-box-content"> | |||||
<span class="info-box-text"><br /><?= Html::a('Ajouter des points de vente', ['point-sale/create'], ['class' => 'btn btn-default']); ?></span> | |||||
</div> | </div> | ||||
</div> | </div> | ||||
<?php endif; ?> | |||||
<!-- Paramètres --> | |||||
<div class=""> | |||||
<div class="panel panel-default"> | |||||
<div class="panel-heading"> | |||||
<h3 class="panel-title"> | |||||
Paramètres | |||||
<?= Html::a('Configurer',['etablissement/update'],['class' => 'btn btn-default btn-xs']) ; ?> | |||||
</h3> | |||||
</div> | |||||
<div class="panel-body"> | |||||
<table class="table table-bordered table-condensed"> | |||||
<thead> | |||||
<tr> | |||||
<th>Configuration</th> | |||||
<th>Valeur</th> | |||||
</tr> | |||||
</thead> | |||||
<tbody> | |||||
<tr> | |||||
<td>Établissement activé</td> | |||||
<td> | |||||
<?php if($etablissement->actif): ?> | |||||
<span class="label label-success">Active</span> | |||||
<?php else: ?> | |||||
<span class="label label-danger">Hors-ligne</span> | |||||
<?php endif; ?> | |||||
</td> | |||||
</tr> | |||||
<tr> | |||||
<td>Établissement protégé par un code</td> | |||||
<td> | |||||
<?php if(strlen($etablissement->code)): ?> | |||||
<span class="label label-success">Oui</span><br /> | |||||
<strong><?= Html::encode($etablissement->code) ?></strong> | |||||
<?php else: ?> | |||||
<span class="label label-danger">Non</span> | |||||
<?php endif; ?> | |||||
</td> | |||||
</tr> | |||||
<tr> | |||||
<td>Délai de commande</td> | |||||
<td><?= $etablissement->delai_commande ?> jour<?php if($etablissement->delai_commande > 1): ?>s<?php endif; ?></td> | |||||
</tr> | |||||
<tr> | |||||
<td>Heure limite de commande</td> | |||||
<td><?= $etablissement->heure_limite_commande ?>h</td> | |||||
</tr> | |||||
<tr> | |||||
<td>Système de Crédit Pain activé</td> | |||||
<td> | |||||
<?php if($etablissement->credit_pain): ?> | |||||
<span class="label label-success">Oui</span><br /> | |||||
<?php else: ?> | |||||
<span class="label label-danger">Non</span> | |||||
<?php endif; ?> | |||||
</td> | |||||
</tr> | |||||
</tbody> | |||||
</table> | |||||
</div> | |||||
<?php if($productsCount && $pointsSaleCount && !count($distributionsArray)): ?> | |||||
<div class="info-box"> | |||||
<span class="info-box-icon bg-yellow"><i class="fa fa-calendar"></i></span> | |||||
<div class="info-box-content"> | |||||
<span class="info-box-text"><br /><?= Html::a('Ajouter des jours de distribution', ['order/index'], ['class' => 'btn btn-default']); ?></span> | |||||
</div> | </div> | ||||
</div> | </div> | ||||
<!-- Mon abonnement --> | |||||
<div class="" id="facturation"> | |||||
<div class="panel panel-default"> | |||||
<div class="panel-heading"> | |||||
<h3 class="panel-title"> | |||||
Mon abonnement | |||||
<?= Html::a('Voir',['etablissement/facturation'],['class' => 'btn btn-default btn-xs']) ; ?> | |||||
</h3> | |||||
</div> | |||||
<div class="panel-body"> | |||||
<div class="col-md-12"> | |||||
<?php if(is_null($etablissement->prix_libre)): ?> | |||||
<h2>Prix libre</h2> | |||||
<p>Le modèle économique de <em>La boîte à pain</em> est basé sur un système de prix libre. <?= Html::a('En savoir plus',['etablissement/facturation']); ?></p> | |||||
<?php else: ?> | |||||
<h2><?= $etablissement->getPrixLibre() ?> / mois <?= Html::a('Modifier',['etablissement/facturation'],['class' => 'btn btn-xs btn-primary']) ?></h2> | |||||
<?php endif; ?> | |||||
</div> | |||||
<!--<div class="col-md-6 mois-en-cours"> | |||||
<h2>Chiffre d'affaire<br />du mois en cours</h2> | |||||
<div class="montant"><span><?= number_format($etablissement->getCA(date('Y-m')), 2); ?> €</span></div> | |||||
</div> | |||||
<div class="col-md-6"> | |||||
<?php $montant = $etablissement->getMontantFacturer(date('Y-m'), 0); ?> | |||||
<h2>Participation<br /><em>La boîte à pain</em> (2%)</h2> | |||||
<div class="montant"><span><?php if($montant): echo number_format($montant,2).' €' ; else: echo 'Gratuit' ; endif; ?></span></div> | |||||
<?php endif; ?> | |||||
<div id="distributions"> | |||||
<!-- distributions --> | |||||
<?php if(count($distributionsArray)): ?> | |||||
<?php foreach($distributionsArray as $distribution): ?> | |||||
<div class="col-md-4 col-sm-12 col-xs-12"> | |||||
<div class="info-box"> | |||||
<span class="info-box-icon bg-green date"> | |||||
<span class="day"><?= strftime('%A', strtotime($distribution->date)) ?></span> | |||||
<span class="num"><?= date('d', strtotime($distribution->date)) ?></span> | |||||
<span class="month"><?= strftime('%B', strtotime($distribution->date)) ?></span> | |||||
</span> | |||||
<div class="info-box-content"> | |||||
<span class="info-box-text"> | |||||
<?php if(count($distribution->order)): ?> | |||||
<strong><?= count($distribution->order); ?></strong> COMMANDES | |||||
<?php else: ?> | |||||
AUCUNE COMMANDE | |||||
<?php endif; ?> | |||||
</span> | |||||
<span class="info-box-number"></span> | |||||
<div class="buttons"> | |||||
<?= Html::a('<span class="fa fa-eye"></span>', ['distribution/index', 'date' => $distribution->date], ['class' => 'btn btn-default']); ?> | |||||
<?php if(count($distribution->order)): ?><?= Html::a('<span class="fa fa-download"></span>', ['distribution/report', 'date' => $distribution->date], ['class' => 'btn btn-default']); ?><?php endif; ?> | |||||
</div> | |||||
</div> | |||||
</div> | </div> | ||||
<div class="clr"></div>--> | |||||
</div> | </div> | ||||
</div> | |||||
</div> | |||||
<?php endforeach; ?> | |||||
<?php endif; ?> | |||||
</div> | </div> | ||||
<div class="col-md-8"> | |||||
<!-- dernières commandes --> | |||||
<div id="dernieres-commandes" class=""> | |||||
<div class="panel panel-default"> | |||||
<div class="panel-heading"> | |||||
<h3 class="panel-title"> | |||||
Dernières commandes clients | |||||
</h3> | |||||
</div> | |||||
<div class="panel-body"> | |||||
<?php if(count($commandes)): ?> | |||||
<div class="clr"></div> | |||||
<!-- dernières commandes --> | |||||
<?php if(is_array($ordersArray) && count($ordersArray)): ?> | |||||
<div id="last-orders" class=""> | |||||
<div class="panel panel-default"> | |||||
<div class="panel-heading"> | |||||
<h3 class="panel-title"> | |||||
Commandes à venir | |||||
</h3> | |||||
</div> | |||||
<div class="panel-body"> | |||||
<table class="table table-condensed table-bordered"> | <table class="table table-condensed table-bordered"> | ||||
<thead> | <thead> | ||||
<tr> | <tr> | ||||
<th></th> | <th></th> | ||||
<th>Date</th> | <th>Date</th> | ||||
<th>Client</th> | <th>Client</th> | ||||
<th>Historique</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 foreach($commandes as $c): ?> | |||||
<tr class="<?= $c->getClassHistorique() ; ?>"> | |||||
<td class="infos"><?= $c->getStrType(true); ?></td> | |||||
<?php foreach($ordersArray as $order): ?> | |||||
<tr class="<?= $order->getClassHistory() ; ?>"> | |||||
<td class="infos"><?= $order->getStrOrigin(true); ?></td> | |||||
<td class="date"> | <td class="date"> | ||||
<div class="bloc-date"> | |||||
<div class="jour"><?= strftime('%A', strtotime($c->production->date)) ?></div> | |||||
<div class="num"><?= date('d', strtotime($c->production->date)) ?></div> | |||||
<div class="mois"><?= strftime('%B', strtotime($c->production->date)) ?></div> | |||||
<div class="block-date"> | |||||
<div class="day"><?= strftime('%A', strtotime($order->distribution->date)) ?></div> | |||||
<div class="num"><?= date('d', strtotime($order->distribution->date)) ?></div> | |||||
<div class="month"><?= strftime('%B', strtotime($order->distribution->date)) ?></div> | |||||
</div> | </div> | ||||
</td> | </td> | ||||
<td> | <td> | ||||
<?= $c->getStrUser(); ?><br /> | |||||
<?= $order->getStrUser(); ?><br /> | |||||
</td> | </td> | ||||
<td class="historique"><?= $c->getStrHistorique() ; ?></td> | |||||
<td><?= $c->getResumePanier() ; ?></td> | |||||
<td><?= $c->getResumePointVente() ; ?></td> | |||||
<td><?= $c->getMontant(true) ; ?></td> | |||||
<td><?= $order->getCartSummary() ; ?></td> | |||||
<td><?= $order->getPointSaleSummary() ; ?></td> | |||||
<td><?= $order->getAmount(Order::AMOUNT_TOTAL, true) ; ?></td> | |||||
<td class="history"><?= $order->getStrHistory() ; ?></td> | |||||
</tr> | </tr> | ||||
<?php endforeach; ?> | <?php endforeach; ?> | ||||
</tbody> | </tbody> | ||||
</table> | </table> | ||||
<?php else: ?> | |||||
<div class="alert alert-warning">Aucune commande</div> | |||||
<?php endif; ?> | |||||
</div> | |||||
</div> | </div> | ||||
</div> | </div> | ||||
</div> | </div> | ||||
<?php endif; ?> | |||||
</div> | </div> |
<?php | <?php | ||||
/** | /** | ||||
Copyright La boîte à pain (2018) | |||||
Copyright distrib (2018) | |||||
contact@laboiteapain.net | |||||
contact@opendistrib.net | |||||
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\helpers\Html; | ||||
use yii\bootstrap\ActiveForm; | use yii\bootstrap\ActiveForm; | ||||
/* @var $form yii\bootstrap\ActiveForm */ | /* @var $form yii\bootstrap\ActiveForm */ | ||||
/* @var $model \common\models\LoginForm */ | /* @var $model \common\models\LoginForm */ | ||||
$this->title = 'Connexion'; | |||||
$this->params['breadcrumbs'][] = $this->title; | |||||
$this->title = 'Sign In'; | |||||
$fieldOptions1 = [ | |||||
'options' => ['class' => 'form-group has-feedback'], | |||||
'inputTemplate' => "{input}<span class='glyphicon glyphicon-envelope form-control-feedback'></span>" | |||||
]; | |||||
$fieldOptions2 = [ | |||||
'options' => ['class' => 'form-group has-feedback'], | |||||
'inputTemplate' => "{input}<span class='glyphicon glyphicon-lock form-control-feedback'></span>" | |||||
]; | |||||
?> | ?> | ||||
<div class="site-login"> | |||||
<h1><?= Html::encode($this->title) ?></h1> | |||||
<div class="row"> | |||||
<div class="col-lg-5"> | |||||
<?php if(YII_ENV == 'demo') : ?> | |||||
<div class="alert alert-warning"> | |||||
Identifiant : <strong>boulanger@laboiteapain.net</strong><br /> | |||||
Mot de passe : <strong>laboiteapain</strong> | |||||
</div> | |||||
<?php endif; ?> | |||||
<?php $form = ActiveForm::begin(['id' => 'login-form']); ?> | |||||
<?= $form->field($model, 'email') ?> | |||||
<?= $form->field($model, 'password')->passwordInput() ?> | |||||
<div class="login-box"> | |||||
<div class="login-logo"> | |||||
<img src="<?= Yii::$app->urlManagerBackend->getBaseUrl(); ?>/img/logo-distrib.png" /> | |||||
</div> | |||||
<!-- /.login-logo --> | |||||
<div class="login-box-body"> | |||||
<?php $form = ActiveForm::begin(['id' => 'login-form', 'enableClientValidation' => false]); ?> | |||||
<?= $form | |||||
->field($model, 'email', $fieldOptions1) | |||||
->label(false) | |||||
->textInput(['placeholder' => $model->getAttributeLabel('username')]) ?> | |||||
<?= $form | |||||
->field($model, 'password', $fieldOptions2) | |||||
->label(false) | |||||
->passwordInput(['placeholder' => $model->getAttributeLabel('password')]) ?> | |||||
<div class="row"> | |||||
<div class="col-xs-8"> | |||||
<?= $form->field($model, 'rememberMe')->checkbox() ?> | <?= $form->field($model, 'rememberMe')->checkbox() ?> | ||||
<div class="form-group"> | |||||
<?= Html::submitButton('Connexion', ['class' => 'btn btn-primary', 'name' => 'login-button']) ?> | |||||
</div> | |||||
<?php ActiveForm::end(); ?> | |||||
</div> | |||||
<!-- /.col --> | |||||
<div class="col-xs-4"> | |||||
<?= Html::submitButton('Connexion', ['class' => 'btn btn-primary btn-block btn-flat', 'name' => 'login-button']) ?> | |||||
</div> | |||||
<!-- /.col --> | |||||
</div> | </div> | ||||
<?php ActiveForm::end(); ?> | |||||
<a href="<?= Yii::$app->urlManagerFrontend->createAbsoluteUrl(['site/request-password-reset']) ; ?>">J'ai oublié mon mot de passe</a><br> | |||||
</div> | </div> | ||||
</div> | |||||
<!-- /.login-box-body --> | |||||
</div><!-- /.login-box --> |
<?php | <?php | ||||
/** | /** | ||||
Copyright La boîte à pain (2018) | |||||
Copyright distrib (2018) | |||||
contact@laboiteapain.net | |||||
contact@opendistrib.net | |||||
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->title = 'Statistiques' ; | |||||
use dosamigos\chartjs\ChartJs; | use dosamigos\chartjs\ChartJs; | ||||
$this->params['breadcrumbs'][] = 'Statistiques'; | |||||
$this->setTitle('Statistiques <small>Chiffre d\'affaire</small>') ; | |||||
$this->addBreadcrumb('Statistiques (chiffre d\'affaire)') ; | |||||
?> | ?> | ||||
<h1>Statistiques</h1> | |||||
<?= ChartJs::widget([ | <?= ChartJs::widget([ | ||||
'type' => 'line', | 'type' => 'line', | ||||
'options' => [ | 'options' => [ | ||||
'width' => 1100 | 'width' => 1100 | ||||
], | ], | ||||
'data' => [ | 'data' => [ | ||||
'labels' => $data_labels, | |||||
'labels' => $dataLabels, | |||||
'datasets' => [ | 'datasets' => [ | ||||
[ | [ | ||||
'label' => 'Recettes commandes', | 'label' => 'Recettes commandes', | ||||
'backgroundColor' => "rgb(187,135,87,0.5)", | |||||
'borderColor' => "rgb(187,135,87,1)", | |||||
'pointBackgroundColor' => "rgb(187,135,87,1)", | |||||
'backgroundColor' => "rgb(255,127,0,0.5)", | |||||
'borderColor' => "rgb(255,127,0,1)", | |||||
'pointBackgroundColor' => "rgb(255,127,0,1)", | |||||
'pointStrokeColor' => "#fff", | 'pointStrokeColor' => "#fff", | ||||
'data' => $data_pain | |||||
'data' => $data | |||||
] | ] | ||||
] | ] | ||||
] | ] |
<?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 \backend\controllers\StatsController ; | |||||
use yii\helpers\Html; | |||||
$this->setTitle('Statistiques <small>Produits '.$year.'</small>', 'Statistiques produits '.$year) ; | |||||
$this->addBreadcrumb('Statistiques produits '.$year) ; | |||||
$this->addButton(['label' => '< '.($year - 1), 'url' => ['stats/products','year' => $year - 1], 'class' => 'btn btn-default']) ; | |||||
$this->addButton(['label' => ($year + 1).' >', 'url' => ['stats/products','year' => $year + 1], 'class' => 'btn btn-default']) ; | |||||
$theMonth = 1 ; | |||||
?> | |||||
<div class="stats-products"> | |||||
<table id="table-stats-products" class="table table-bordered table-hover header-fixed"> | |||||
<thead> | |||||
<tr class="mois"> | |||||
<th></th> | |||||
<?php foreach($monthArray as $key => $month): | |||||
if(($key + 1) >= $iStart && ($key + 1) <= $iEnd): | |||||
?> | |||||
<th colspan="2"> | |||||
<?php if($section != 1 && $key + 1 == $iStart): echo Html::a('<', ['stats/products', 'year' => $year, 'section' => $section - 1], ['class' => 'btn btn-default']) ; ?><?php endif; ?> | |||||
<?= $month; ?> | |||||
<?php if($key + 1 == $iEnd && $section != 4): echo Html::a('>', ['stats/products', 'year' => $year, 'section' => $section + 1], ['class' => 'btn btn-default']) ; ?><?php endif; ?> | |||||
</th> | |||||
<?php | |||||
endif; | |||||
endforeach; | |||||
?> | |||||
<th colspan="2">Totaux</th> | |||||
</tr> | |||||
<tr class="sub-head"> | |||||
<th></th> | |||||
<?php for($i=$iStart; $i<=$iEnd + 1; $i++): ?> | |||||
<th>Maximum</th> | |||||
<th>Commandés</th> | |||||
<?php endfor; ?> | |||||
</tr> | |||||
</thead> | |||||
<tbody> | |||||
<?php foreach($productsArray as $currentProduct): ?> | |||||
<tr> | |||||
<td class="name"><?= Html::encode($currentProduct['name']) ?></td> | |||||
<?php foreach($dataProducts as $month => $productsMonthArray): | |||||
$findMax = false ; | |||||
$findOrders = false ; | |||||
?> | |||||
<?php if($month != StatsController::TOTALS): ?> | |||||
<!-- max --> | |||||
<?php | |||||
$tooltip = 'data-toggle="tooltip" data-placement="top" title="'.Html::encode($currentProduct['name']).' / '.$monthArray[$month - 1] .' '. $year.' / Maximum"' ; | |||||
foreach($productsMonthArray['max'] as $product): | |||||
?> | |||||
<?php if($product['name'] == $currentProduct['name']): | |||||
$findMax = true ; | |||||
?> | |||||
<td class="align-center"> | |||||
<div <?= $tooltip; ?>><?= (int) $product['total'] ?></div> | |||||
</td> | |||||
<?php endif; ?> | |||||
<?php endforeach; ?> | |||||
<?php if(!$findMax): ?><td class="align-center"><div <?= $tooltip; ?>>0</div></td><?php endif; ?> | |||||
<!-- commandes --> | |||||
<?php | |||||
$tooltip = 'data-toggle="tooltip" data-placement="top" title="'.Html::encode($currentProduct['name']).' / '. $monthArray[$month - 1] . ' '. $year .' / Commandés"' ; | |||||
foreach($productsMonthArray['orders'] as $product): | |||||
?> | |||||
<?php if($product['name'] == $currentProduct['name']): | |||||
$findOrders = true ; | |||||
?> | |||||
<td class="align-center"> | |||||
<div <?= $tooltip ?> ><?= (int) $product['total'] ?></div> | |||||
</td> | |||||
<?php endif; ?> | |||||
<?php endforeach; ?> | |||||
<?php if(!$findOrders): ?><td class="align-center"><div <?= $tooltip ?> >0</div></td><?php endif; ?> | |||||
<?php else: ?> | |||||
<!-- totaux max --> | |||||
<?php | |||||
$tooltip = 'data-toggle="tooltip" data-placement="top" title="'.Html::encode($currentProduct['name']).' / Total '. $year .' / Maximums"' ; | |||||
foreach($dataProducts[StatsController::TOTALS]['max'] as $productName => $totalMax): | |||||
?> | |||||
<?php | |||||
if($productName == $currentProduct['name']): | |||||
$findMax = true ; | |||||
?> | |||||
<td class="align-center"> | |||||
<div <?= $tooltip ?> ><?= (int) $totalMax ?></div> | |||||
</td> | |||||
<?php endif; ?> | |||||
<?php endforeach; ?> | |||||
<?php if(!$findMax): ?><td class="align-center"><div <?= $tooltip; ?>>0</div></td><?php endif; ?> | |||||
<!-- totaux commandés --> | |||||
<?php | |||||
$tooltip = 'data-toggle="tooltip" data-placement="top" title="'.Html::encode($currentProduct['name']).' / Total '. $year .' / Commandés"' ; | |||||
foreach($dataProducts[StatsController::TOTALS]['orders'] as $productName => $totalOrders): | |||||
?> | |||||
<?php if($productName == $currentProduct['name']): | |||||
$findOrders = true ; | |||||
?> | |||||
<td class="align-center"> | |||||
<div <?= $tooltip ?> ><?= (int) $totalOrders ?></div> | |||||
</td> | |||||
<?php endif; ?> | |||||
<?php endforeach; ?> | |||||
<?php if(!$findOrders): ?><td class="align-center"><div <?= $tooltip ?> >0</div></td><?php endif; ?> | |||||
<?php endif; ?> | |||||
<?php endforeach; ?> | |||||
</tr> | |||||
<?php endforeach; ?> | |||||
</tbody> | |||||
</table> | |||||
</div> |
<?php | |||||
/** | |||||
Copyright La boîte à pain (2018) | |||||
contact@laboiteapain.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 \backend\controllers\StatsController ; | |||||
$this->title = 'Statistiques produits' ; | |||||
$this->params['breadcrumbs'][] = 'Statistiques produits'; | |||||
?> | |||||
<div class="stats-produits"> | |||||
<h1>Statistiques produits <?= $year ?> | |||||
<div id="nav-year"> | |||||
<a class="btn btn-default" href="<?= Yii::$app->urlManager->createUrl(['stats/produits','year' => $year - 1]); ?>">< <?= ($year - 1) ?></a> | |||||
<a class="btn btn-default" href="<?= Yii::$app->urlManager->createUrl(['stats/produits','year' => $year + 1]); ?>"><?= ($year + 1) ?> ></a> | |||||
</div> | |||||
</h1> | |||||
<?php if($empty): ?> | |||||
<div class="alert alert-warning">Aucune statistique disponible pour cette période</div> | |||||
<?php else: ?> | |||||
<table id="table-stats-produits" class="table table-bordered table-hover header-fixed"> | |||||
<thead> | |||||
<tr class="mois"> | |||||
<th></th> | |||||
<?php foreach($arr_mois as $m): ?> | |||||
<th colspan="2"><?= $m; ?></th> | |||||
<?php endforeach; ?> | |||||
</tr> | |||||
<tr class="sub-head"> | |||||
<th></th> | |||||
<?php for($i=1; $i<=13; $i++): ?> | |||||
<th>Maximum</th> | |||||
<th>Commandés</th> | |||||
<?php endfor; ?> | |||||
</tr> | |||||
</thead> | |||||
<tbody> | |||||
<?php foreach($produits as $produit_current): ?> | |||||
<tr> | |||||
<td class="nom"><?= Html::encode($produit_current['nom']) ?></td> | |||||
<?php foreach($arr_produits as $mois => $arr_produit_mois): | |||||
$find_max = false ; | |||||
$find_commandes = false ; | |||||
?> | |||||
<?php if($mois != StatsController::TOTAUX): ?> | |||||
<!-- max --> | |||||
<?php foreach($arr_produit_mois['max'] as $produit): | |||||
$tooltip = 'data-toggle="tooltip" data-placement="top" data-original-title="'.Html::encode($produit_current['nom']).' / '.$arr_mois[$mois - 1] .' '. $year.' / Maximum"' ; | |||||
?> | |||||
<?php if($produit['nom'] == $produit_current['nom']): | |||||
$find_max = true ; | |||||
?> | |||||
<td class="align-center"> | |||||
<div <?= $tooltip; ?>><?= $produit['total'] ?></div> | |||||
</td> | |||||
<?php endif; ?> | |||||
<?php endforeach; ?> | |||||
<?php if(!$find_max): ?><td class="align-center"><div <?= $tooltip; ?>>0</div></td><?php endif; ?> | |||||
<!-- commandes --> | |||||
<?php foreach($arr_produit_mois['commandes'] as $produit): | |||||
$tooltip = 'data-toggle="tooltip" data-placement="top" data-original-title="'.Html::encode($produit_current['nom']).' / '. $arr_mois[$mois - 1] . ' '. $year .' / Commandés"' ; | |||||
?> | |||||
<?php if($produit['nom'] == $produit_current['nom']): | |||||
$find_commandes = true ; | |||||
?> | |||||
<td class="align-center"> | |||||
<div <?= $tooltip ?> ><?= $produit['total'] ?></div> | |||||
</td> | |||||
<?php endif; ?> | |||||
<?php endforeach; ?> | |||||
<?php if(!$find_commandes): ?><td class="align-center"><div <?= $tooltip ?> >0</div></td><?php endif; ?> | |||||
<?php else: ?> | |||||
<!-- totaux max --> | |||||
<?php foreach($arr_produits[StatsController::TOTAUX]['max'] as $nom_produit => $total_max): | |||||
$tooltip = 'data-toggle="tooltip" data-placement="top" data-original-title="'.Html::encode($produit_current['nom']).' / Total '. $year .' / Maximums"' ; | |||||
?> | |||||
<?php if($nom_produit == $produit_current['nom']): ?> | |||||
<td class="align-center"> | |||||
<div <?= $tooltip ?> ><?= $total_max ?></div> | |||||
</td> | |||||
<?php endif; ?> | |||||
<?php endforeach; ?> | |||||
<!-- totaux commandés --> | |||||
<?php foreach($arr_produits[StatsController::TOTAUX]['commandes'] as $nom_produit => $total_commandes): | |||||
$tooltip = 'data-toggle="tooltip" data-placement="top" data-original-title="'.Html::encode($produit_current['nom']).' / Total '. $year .' / Commandés"' ; | |||||
?> | |||||
<?php if($nom_produit == $produit_current['nom']): ?> | |||||
<td class="align-center"> | |||||
<div <?= $tooltip ?> ><?= $total_commandes ?></div> | |||||
</td> | |||||
<?php endif; ?> | |||||
<?php endforeach; ?> | |||||
<?php endif; ?> | |||||
<?php endforeach; ?> | |||||
</tr> | |||||
<?php endforeach; ?> | |||||
</tbody> | |||||
</table> | |||||
<?php endif; ?> | |||||
</div> |
<?php | <?php | ||||
/** | /** | ||||
Copyright La boîte à pain (2018) | |||||
Copyright distrib (2018) | |||||
contact@laboiteapain.net | |||||
contact@opendistrib.net | |||||
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; | ||||
use yii\helpers\ArrayHelper ; | use yii\helpers\ArrayHelper ; | ||||
use common\models\User ; | use common\models\User ; | ||||
use common\models\PointVente ; | |||||
use common\models\PointSale ; | |||||
?> | ?> | ||||
<div class="commandeauto-form"> | |||||
<div class="subscription-form"> | |||||
<?php $form = ActiveForm::begin(['enableClientValidation' => false]); ?> | <?php $form = ActiveForm::begin(['enableClientValidation' => false]); ?> | ||||
<div class="col-md-5" id="bloc-select-user"> | <div class="col-md-5" id="bloc-select-user"> | ||||
<?= $form->field($model, 'id_user')->dropDownList( ArrayHelper::map(User::find()->joinWith('userEtablissement')->where('user_etablissement.id_etablissement = '.Yii::$app->user->identity->id_etablissement)->andWhere('user_etablissement.actif = 1')->orderBy('nom ASC, prenom ASC')->all(), 'id', function($model, $defaultValue) { | |||||
return $model['nom'].' '.$model['prenom']; | |||||
<?= $form->field($model, 'id_user')->dropDownList( ArrayHelper::map(User::find()->joinWith('userProducer')->where('user_producer.id_producer = '.Producer::getId())->andWhere('user_producer.active = 1')->orderBy('lastname ASC, name ASC')->all(), 'id', function($model, $defaultValue) { | |||||
return $model['lastname'].' '.$model['name']; | |||||
}), ['prompt' => '--','class' => 'form-control user-id', ]) ?> | }), ['prompt' => '--','class' => 'form-control user-id', ]) ?> | ||||
</div> | </div> | ||||
<div class="col-md-1" id="or-user"> | <div class="col-md-1" id="or-user"> | ||||
</div> | </div> | ||||
<div class="clr"></div> | <div class="clr"></div> | ||||
<?= $form->field($model, 'id_etablissement')->hiddenInput() ?> | |||||
<?= $form->field($model, 'id_point_vente')->dropDownList( ArrayHelper::map(PointVente::find()->where('id_etablissement = '.Yii::$app->user->identity->id_etablissement)->all(), 'id', function($model, $defaultValue) { | |||||
return $model['nom']; | |||||
<?= $form->field($model, 'id_producer')->hiddenInput() ?> | |||||
<?= $form->field($model, 'id_point_sale')->dropDownList(ArrayHelper::map(PointSale::find()->where('id_producer = '.Producer::getId())->all(), 'id', function($model, $defaultValue) { | |||||
return $model['name']; | |||||
}), ['prompt' => '--','class' => 'form-control user-id']) ?> | }), ['prompt' => '--','class' => 'form-control user-id']) ?> | ||||
<?= $form->field($model, 'date_debut') ?> | |||||
<?= $form->field($model, 'date_fin')->hint('Laisser vide pour une durée indéterminée') ?> | |||||
<div class="jours"> | |||||
<?= $form->field($model, 'date_begin') ?> | |||||
<?= $form->field($model, 'date_end')->hint('Laisser vide pour une durée indéterminée') ?> | |||||
<div class="days"> | |||||
<h2>Jours</h2> | <h2>Jours</h2> | ||||
<?= $form->field($model, 'lundi')->checkbox() ?> | |||||
<?= $form->field($model, 'mardi')->checkbox() ?> | |||||
<?= $form->field($model, 'mercredi')->checkbox() ?> | |||||
<?= $form->field($model, 'jeudi')->checkbox() ?> | |||||
<?= $form->field($model, 'vendredi')->checkbox() ?> | |||||
<?= $form->field($model, 'samedi')->checkbox() ?> | |||||
<?= $form->field($model, 'dimanche')->checkbox() ?> | |||||
<?= $form->field($model, 'monday')->checkbox() ?> | |||||
<?= $form->field($model, 'tuesday')->checkbox() ?> | |||||
<?= $form->field($model, 'wednesday')->checkbox() ?> | |||||
<?= $form->field($model, 'thursday')->checkbox() ?> | |||||
<?= $form->field($model, 'friday')->checkbox() ?> | |||||
<?= $form->field($model, 'saturday')->checkbox() ?> | |||||
<?= $form->field($model, 'sunday')->checkbox() ?> | |||||
</div> | </div> | ||||
<div class="clr"></div> | <div class="clr"></div> | ||||
<?= $form->field($model, 'periodicite_semaine')->dropDownList([1=>1, 2=>2, 3=>3, 4=>4]) ?> | |||||
<?= $form->field($model, 'week_frequency')->dropDownList([1=>1, 2=>2, 3=>3, 4=>4]) ?> | |||||
<?= $form->field($model, 'paiement_automatique') | |||||
<?= $form->field($model, 'auto_payment') | |||||
->checkbox() | ->checkbox() | ||||
->hint('Cochez cette case si vous souhaitez que le crédit pain du client soit automatiquement débité lors de la création de la commande.<br />' | ->hint('Cochez cette case si vous souhaitez que le crédit pain du client soit automatiquement débité lors de la création de la commande.<br />' | ||||
. 'Attention, un compte client existant doit être spécifié en haut de ce formulaire.') ?> | . 'Attention, un compte client existant doit être spécifié en haut de ce formulaire.') ?> | ||||
<div class="produits"> | |||||
<div class="products"> | |||||
<h2>Produits</h2> | <h2>Produits</h2> | ||||
<?php if(isset($model->errors['produits']) && count($model->errors['produits'])) | |||||
<?php if(isset($model->errors['products']) && count($model->errors['products'])) | |||||
{ | { | ||||
echo '<div class="alert alert-danger">'.$model->errors['produits'][0].'</div>' ; | |||||
echo '<div class="alert alert-danger">'.$model->errors['products'][0].'</div>' ; | |||||
} | } | ||||
?> | ?> | ||||
<table class="table table-bordered table-condensed table-hover"> | <table class="table table-bordered table-condensed table-hover"> | ||||
<?php foreach ($produits as $p) : ?> | |||||
<?php foreach ($productsArray as $p) : ?> | |||||
<tr> | <tr> | ||||
<td><?= Html::encode($p->nom) ?></td> | |||||
<td><?= Html::encode($p->name) ?></td> | |||||
<td> | <td> | ||||
<div class="input-group"> | <div class="input-group"> | ||||
<span class="input-group-btn"> | <span class="input-group-btn"> | ||||
<button class="btn btn-default btn-moins" type="button"><span class="glyphicon glyphicon-minus"></span></button> | <button class="btn btn-default btn-moins" type="button"><span class="glyphicon glyphicon-minus"></span></button> | ||||
</span> | </span> | ||||
<?= Html::input('text', 'CommandeAutoForm[produits][produit_'.$p->id.']', (isset($model->produits['produit_'.$p->id])) ? $model->produits['produit_'.$p->id] : '', ['class' => 'form-control quantite']) ?> | |||||
<?= Html::input('text', 'SubscriptionForm[products][product_'.$p->id.']', (isset($model->products['product_'.$p->id])) ? $model->products['product_'.$p->id] : '', ['class' => 'form-control quantity']) ?> | |||||
<span class="input-group-btn"> | <span class="input-group-btn"> | ||||
<button class="btn btn-default btn-plus" type="button"><span class="glyphicon glyphicon-plus"></span></button> | <button class="btn btn-default btn-plus" type="button"><span class="glyphicon glyphicon-plus"></span></button> | ||||
</span> | </span> |
<?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('Ajouter un abonnement') ; | |||||
$this->addBreadcrumb(['label' => 'Abonnements', 'url' => ['index']]) ; | |||||
$this->addBreadcrumb('Ajouter') ; | |||||
?> | |||||
<div class="subscription-create"> | |||||
<?= $this->render('_form', [ | |||||
'model' => $model, | |||||
'productsArray' => $productsArray | |||||
]) ?> | |||||
</div> |
<?php | <?php | ||||
/** | /** | ||||
Copyright La boîte à pain (2018) | |||||
Copyright distrib (2018) | |||||
contact@laboiteapain.net | |||||
contact@opendistrib.net | |||||
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\helpers\Html; | use yii\helpers\Html; | ||||
use yii\grid\GridView; | use yii\grid\GridView; | ||||
/* @var $this yii\web\View */ | |||||
/* @var $dataProvider yii\data\ActiveDataProvider */ | |||||
$this->title = 'Commandes récurrentes'; | |||||
$this->params['breadcrumbs'][] = $this->title; | |||||
?> | |||||
<div class="commande-auto-index"> | |||||
<h1><?= Html::encode($this->title) ?> <?= Html::a('Ajouter', ['create'], ['class' => 'btn btn-success']) ?></h1> | |||||
$this->setTitle('Abonnements') ; | |||||
$this->addBreadcrumb($this->getTitle()) ; | |||||
$this->addButton(['label' => '+', 'url' => 'subscription/create', 'class' => 'btn btn-success']) ; | |||||
?> | |||||
<div class="subscription-index"> | |||||
<?= GridView::widget([ | <?= GridView::widget([ | ||||
'filterModel' => $searchModel, | |||||
'dataProvider' => $dataProvider, | 'dataProvider' => $dataProvider, | ||||
'columns' => [ | 'columns' => [ | ||||
[ | [ | ||||
'attribute' => 'id_user', | |||||
'attribute' => 'username', | |||||
'label' => 'Utilisateur', | |||||
'format' => 'raw', | 'format' => 'raw', | ||||
'value' => function($model) { | 'value' => function($model) { | ||||
if(strlen($model->username)) | if(strlen($model->username)) | ||||
return Html::encode($model->username) ; | return Html::encode($model->username) ; | ||||
} | } | ||||
else { | else { | ||||
if(isset($model->user)) | |||||
return Html::encode($model->user->nom.' '.$model->user->prenom) ; | |||||
if(isset($model->user)) { | |||||
return Html::encode($model->user->lastname.' '.$model->user->name) ; | |||||
} | |||||
} | } | ||||
} | } | ||||
], | ], | ||||
[ | [ | ||||
'attribute' => 'id_point_vente', | |||||
'format' => 'raw', | |||||
'value' => function($model) { | |||||
return Html::encode($model->pointVente->nom) ; | |||||
} | |||||
], | |||||
[ | |||||
'attribute' => 'produits', | |||||
'attribute' => 'product_name', | |||||
'label' => 'Produits', | |||||
'format' => 'raw', | 'format' => 'raw', | ||||
'value' => function($model) { | 'value' => function($model) { | ||||
$html = '' ; | $html = '' ; | ||||
foreach($model->commandeAutoProduit as $commande_produit) | |||||
foreach($model->productSubscription as $productSubscription) | |||||
{ | { | ||||
$html .= $commande_produit->quantite . ' x '.Html::encode($commande_produit->produit->nom).'<br />' ; | |||||
if(isset($productSubscription->product)) { | |||||
$html .= $productSubscription->quantity . ' x '.Html::encode($productSubscription->product->name).'<br />' ; | |||||
} | |||||
else { | |||||
$html .= 'Produit non défini<br />' ; | |||||
} | |||||
} | } | ||||
// aucun produit | // aucun produit | ||||
if(!count($model->commandeAutoProduit)) | |||||
if(!count($model->productSubscription)) | |||||
{ | { | ||||
$html .= '<span class="glyphicon glyphicon-warning-sign"></span> Aucun produit' ; | $html .= '<span class="glyphicon glyphicon-warning-sign"></span> Aucun produit' ; | ||||
} | } | ||||
} | } | ||||
], | ], | ||||
[ | [ | ||||
'attribute' => 'date_debut', | |||||
'attribute' => 'id_point_sale', | |||||
'label' => 'Point de vente', | |||||
'format' => 'raw', | |||||
'filter' => ArrayHelper::map(PointSale::find()->where(['id_producer' => Producer::getId()])->asArray()->all(), 'id', 'name'), | |||||
'value' => function($model) { | 'value' => function($model) { | ||||
return date('d/m/Y',strtotime($model->date_debut)) ; | |||||
return Html::encode($model->pointSale->name) ; | |||||
} | } | ||||
], | ], | ||||
[ | [ | ||||
'attribute' => 'date_fin', | |||||
'attribute' => 'date_begin', | |||||
'label' => 'Date de début', | |||||
'format' => 'raw', | |||||
'value' => function($model) { | 'value' => function($model) { | ||||
if($model->date_fin) | |||||
return date('d/m/Y',strtotime($model->date_fin)) ; | |||||
else | |||||
return 'indéterminée' ; | |||||
$html = date('d/m/Y',strtotime($model->date_begin)) ; | |||||
return $html ; | |||||
} | } | ||||
], | ], | ||||
[ | [ | ||||
'attribute' => 'lundi', | |||||
'attribute' => 'day', | |||||
'label' => 'Jours', | 'label' => 'Jours', | ||||
'format' => 'raw', | 'format' => 'raw', | ||||
'filter' => [ | |||||
'monday' => 'Lundi', | |||||
'tuesday' => 'Mardi', | |||||
'wednesday' => 'Mercredi', | |||||
'thursday' => 'Jeudi', | |||||
'friday' => 'Vendredi', | |||||
'saterday' => 'Samedi', | |||||
'sunday' => 'Dimanche', | |||||
], | |||||
'contentOptions' => ['class' => 'text-small'], | |||||
'value' => function($model) { | 'value' => function($model) { | ||||
$html = '' ; | $html = '' ; | ||||
if($model->lundi) | |||||
if($model->monday) { | |||||
$html .= 'lundi, ' ; | $html .= 'lundi, ' ; | ||||
if($model->mardi) | |||||
} | |||||
if($model->tuesday) { | |||||
$html .= 'mardi, ' ; | $html .= 'mardi, ' ; | ||||
if($model->mercredi) | |||||
} | |||||
if($model->wednesday) { | |||||
$html .= 'mercredi, ' ; | $html .= 'mercredi, ' ; | ||||
if($model->jeudi) | |||||
} | |||||
if($model->thursday) { | |||||
$html .= 'jeudi, ' ; | $html .= 'jeudi, ' ; | ||||
if($model->vendredi) | |||||
} | |||||
if($model->friday) { | |||||
$html .= 'vendredi, ' ; | $html .= 'vendredi, ' ; | ||||
if($model->samedi) | |||||
} | |||||
if($model->saturday) { | |||||
$html .= 'samedi, ' ; | $html .= 'samedi, ' ; | ||||
if($model->dimanche) | |||||
} | |||||
if($model->sunday) { | |||||
$html .= 'dimanche, ' ; | $html .= 'dimanche, ' ; | ||||
} | |||||
if(strlen($html)) | |||||
if(strlen($html)) { | |||||
return substr ($html, 0, strlen($html) - 2) ; | return substr ($html, 0, strlen($html) - 2) ; | ||||
else | |||||
} | |||||
else { | |||||
return '<span class="glyphicon glyphicon-warning-sign"></span> Aucun jour' ; | return '<span class="glyphicon glyphicon-warning-sign"></span> Aucun jour' ; | ||||
} | |||||
} | } | ||||
], | ], | ||||
[ | [ | ||||
'attribute' => 'periodicite_semaine', | |||||
'attribute' => 'week_frequency', | |||||
'filter' => [ | |||||
1 => 'Toutes les semaines', | |||||
2 => 'Toutes les 2 semaines', | |||||
3 => 'Toutes les 3 semaines', | |||||
4 => 'Tous les mois'], | |||||
'value' => function($model) { | 'value' => function($model) { | ||||
if($model->periodicite_semaine == 1) | |||||
if($model->week_frequency == 1) { | |||||
return 'Toutes les semaines' ; | return 'Toutes les semaines' ; | ||||
else | |||||
return 'Toutes les '.$model->periodicite_semaine.' semaines' ; | |||||
} | |||||
else { | |||||
return 'Toutes les '.$model->week_frequency.' semaines' ; | |||||
} | |||||
} | } | ||||
], | ], | ||||
[ | [ | ||||
'attribute' => 'paiement_automatique', | |||||
'attribute' => 'auto_payment', | |||||
'format' => 'raw', | 'format' => 'raw', | ||||
'label' => 'Paiement automatique', | |||||
'headerOptions' => ['class' => 'column-auto-payment'], | |||||
'contentOptions' => ['class' => 'column-auto-payment'], | |||||
'filter' => [0 => 'Non', 1 => 'Oui'], | |||||
'value' => function($model) { | 'value' => function($model) { | ||||
if($model->paiement_automatique) | |||||
if($model->auto_payment) { | |||||
return '<span class="label label-success">Oui</span>' ; | return '<span class="label label-success">Oui</span>' ; | ||||
else | |||||
} | |||||
else { | |||||
return '<span class="label label-danger">Non</span>' ; | return '<span class="label label-danger">Non</span>' ; | ||||
} | |||||
} | } | ||||
], | ], | ||||
[ | [ | ||||
'class' => 'yii\grid\ActionColumn', | 'class' => 'yii\grid\ActionColumn', | ||||
'template' => '{update} {delete}', | 'template' => '{update} {delete}', | ||||
'headerOptions' => ['class' => 'actions'], | |||||
'headerOptions' => ['class' => 'column-actions'], | |||||
'contentOptions' => ['class' => 'column-actions'], | |||||
'buttons' => [ | 'buttons' => [ | ||||
'update' => function ($url, $model) { | 'update' => function ($url, $model) { | ||||
return Html::a('<span class="glyphicon glyphicon-pencil"></span> Modifier', $url, [ | |||||
return Html::a('<span class="glyphicon glyphicon-pencil"></span>', $url, [ | |||||
'title' => Yii::t('app', 'Modifier'), 'class' => 'btn btn-default' | 'title' => Yii::t('app', 'Modifier'), 'class' => 'btn btn-default' | ||||
]); | ]); | ||||
}, | }, | ||||
'delete' => function ($url, $model) { | 'delete' => function ($url, $model) { | ||||
return Html::a('<span class="glyphicon glyphicon-trash"></span> Suprimer', $url, [ | |||||
return Html::a('<span class="glyphicon glyphicon-trash"></span>', $url, [ | |||||
'title' => Yii::t('app', 'Supprimer'), 'class' => 'btn btn-default' | 'title' => Yii::t('app', 'Supprimer'), 'class' => 'btn btn-default' | ||||
]); | ]); | ||||
} | } |
<?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('Modifier un abonnement') ; | |||||
$this->addBreadcrumb(['label' => 'Abonnements', 'url' => ['index']]) ; | |||||
$this->addBreadcrumb('Modifier') ; | |||||
?> | |||||
<div class="subscription-update"> | |||||
<?= $this->render('_form', [ | |||||
'model' => $model, | |||||
'productsArray' => $productsArray | |||||
]) ?> | |||||
</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('Mise à jour des distributions') ; | |||||
$this->addBreadcrumb(['label' => 'Abonnements', 'url' => ['index']]) ; | |||||
$this->addBreadcrumb($this->getTitle()) ; | |||||
?> | |||||
<p> | |||||
Souhaitez-vous <?php if($update): ?>re-<?php endif; ?>générer les commandes de cet abonnement pour les distributions futures ? | |||||
</p> | |||||
<div class="alert alert-warning">Attention, les éventuelles commandes futures modifiées par l'utilisateur seront supprimées pour être re-générées.</div> | |||||
<p> | |||||
<?php | |||||
$cpt = 0 ; | |||||
foreach($matchedDistributionsArray as $distribution) { | |||||
$cpt ++ ; | |||||
echo date('d/m/Y',strtotime($distribution->date)) ; | |||||
if($cpt < count($matchedDistributionsArray)) { | |||||
echo ', ' ; | |||||
} | |||||
} | |||||
?> | |||||
</p> | |||||
<?= Html::a('Non', ['subscription/index'], ['class' => 'btn btn-default']) ?> | |||||
<?= Html::a('Oui, '.($update ? 're-' : '').'générer les commandes', ['subscription/update-distributions', 'idSubscription' => $idSubscription, 'generate' => true, 'update' => $update], ['class' => 'btn btn-primary']) ?> |
<?php | <?php | ||||
/** | /** | ||||
Copyright La boîte à pain (2018) | |||||
Copyright distrib (2018) | |||||
contact@laboiteapain.net | |||||
contact@opendistrib.net | |||||
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 $form = ActiveForm::begin(); ?> | <?php $form = ActiveForm::begin(); ?> | ||||
<?= $form->field($model, 'nom')->textInput() ?> | |||||
<?= $form->field($model, 'prenom')->textInput() ?> | |||||
<?= $form->field($model, 'telephone')->textInput() ?> | |||||
<?= $form->field($model, 'lastname')->textInput() ?> | |||||
<?= $form->field($model, 'name')->textInput() ?> | |||||
<?= $form->field($model, 'phone')->textInput() ?> | |||||
<?= $form->field($model, 'email')->textInput() ?> | <?= $form->field($model, 'email')->textInput() ?> | ||||
<?= $form->field($model, 'adresse')->textarea() ?> | |||||
<?= $form->field($model, 'address')->textarea() ?> | |||||
<div class="form-group"> | <div class="form-group"> | ||||
<?= Html::submitButton($model->isNewRecord ? 'Ajouter' : 'Modifier', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?> | <?= Html::submitButton($model->isNewRecord ? 'Ajouter' : 'Modifier', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?> |
<?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. | |||||
*/ | |||||
?> | |||||
<div id="menu-users"> | |||||
<div id="nav-points-sale"> | |||||
<a class="btn <?php if(!$idPointSaleActive && !$sectionInactiveUsers): ?>btn-primary<?php else: ?>btn-default<?php endif; ?>" href="<?= Yii::$app->urlManager->createUrl(['user/index']); ?>"> | |||||
Tous <span class="glyphicon glyphicon-triangle-bottom"></span> | |||||
</a> | |||||
<?php foreach($pointsSaleArray as $pointSale): ?> | |||||
<a class="btn <?php if($idPointSaleActive == $pointSale->id): ?>btn-primary<?php else: ?>btn-default<?php endif; ?>" href="<?= Yii::$app->urlManager->createUrl(['user/index','idPointSale' => $pointSale->id]); ?>"> | |||||
<?= Html::encode($pointSale->name) ?> | |||||
<span class="glyphicon glyphicon-triangle-bottom"></span> | |||||
</a> | |||||
<?php endforeach; ?> | |||||
<?php if(isset($sectionInactiveUsers) && !is_null($sectionInactiveUsers)): ?> | |||||
<a class="btn <?php if($sectionInactiveUsers): ?>btn-primary<?php else: ?>btn-default<?php endif; ?>" href="<?= Yii::$app->urlManager->createUrl(['user/index','sectionInactiveUsers' => 1]); ?>"> | |||||
Inactifs <span class="glyphicon glyphicon-triangle-bottom"></span> | |||||
</a> | |||||
<?php endif; ?> | |||||
</div> | |||||
<div id="submenu"> | |||||
<a class="btn btn-xs <?php if($section == 'list'): ?>btn-primary<?php else: ?>btn-default<?php endif; ?>" href="<?= Yii::$app->urlManager->createUrl(['user/index','idPointSale' => $idPointSaleActive]); ?>"> | |||||
<span class="glyphicon glyphicon-th-list"></span> Liste | |||||
</a> | |||||
<a class="btn btn-xs <?php if($section == 'sendmail'): ?>btn-primary<?php else: ?>btn-default<?php endif; ?>" href="<?= Yii::$app->urlManager->createUrl(['user/mail','idPointSale' => $idPointSaleActive]); ?>"> | |||||
<span class="glyphicon glyphicon-envelope"></span> Envoyer un email | |||||
</a> | |||||
</div> | |||||
</div> |
<?php | <?php | ||||
/** | /** | ||||
Copyright La boîte à pain (2018) | |||||
Copyright distrib (2018) | |||||
contact@laboiteapain.net | |||||
contact@opendistrib.net | |||||
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\helpers\Html; | use yii\helpers\Html; | ||||
$this->setTitle('Ajouter un client') ; | |||||
$this->addBreadcrumb(['label' => 'Utilisateurs', 'url' => ['index']]) ; | |||||
$this->addBreadcrumb('Ajouter') ; | |||||
/* @var $this yii\web\View */ | |||||
/* @var $model common\models\User */ | |||||
$this->title = 'Ajouter un client'; | |||||
$this->params['breadcrumbs'][] = ['label' => 'Clients', 'url' => ['index']]; | |||||
$this->params['breadcrumbs'][] = 'Ajouter' ; | |||||
?> | ?> | ||||
<div class="user-create"> | <div class="user-create"> | ||||
<?php if(YII_ENV == 'demo'): ?> | <?php if(YII_ENV == 'demo'): ?> | ||||
<div class="alert alert-warning">Vous ne pouvez pas ajouter de client dans l'espace Démo.</div> | <div class="alert alert-warning">Vous ne pouvez pas ajouter de client dans l'espace Démo.</div> | ||||
<?php else: ?> | <?php else: ?> | ||||
<h1><?= Html::encode($this->title) ?></h1> | |||||
<?= $this->render('_form', [ | <?= $this->render('_form', [ | ||||
'model' => $model, | 'model' => $model, | ||||
]) ?> | ]) ?> |
<?php | <?php | ||||
/** | /** | ||||
Copyright La boîte à pain (2018) | |||||
Copyright distrib (2018) | |||||
contact@laboiteapain.net | |||||
contact@opendistrib.net | |||||
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\helpers\Html; | use yii\helpers\Html; | ||||
use yii\widgets\ActiveForm; | use yii\widgets\ActiveForm; | ||||
use common\models\CreditHistorique; | |||||
use common\models\Etablissement; | |||||
use common\models\CreditHistory; | |||||
use common\models\Producer; | |||||
$this->title = 'Créditer <small>'.Html::encode($user->nom.' '.$user->prenom).'</small>'; | |||||
$this->params['breadcrumbs'][] = ['label' => 'Clients', 'url' => ['index']]; | |||||
$this->params['breadcrumbs'][] = ['label' => Html::encode($user->nom.' '.$user->prenom)]; | |||||
$this->params['breadcrumbs'][] = 'Créditer'; | |||||
$this->setTitle('Créditer <small>'.Html::encode($user->lastname.' '.$user->name).'</small>', 'Créditer '.Html::encode($user->lastname.' '.$user->name)) ; | |||||
$this->addBreadcrumb(['label' => 'Utilisateurs', 'url' => ['index']]) ; | |||||
$this->addBreadcrumb(['label' => Html::encode($user->lastname.' '.$user->name)]) ; | |||||
$this->addBreadcrumb('Créditer') ; | |||||
?> | ?> | ||||
<div class="user-credit"> | <div class="user-credit"> | ||||
<?php | <?php | ||||
$etablissement = Etablissement::find() | |||||
->where(['id' => Yii::$app->user->identity->id_etablissement]) | |||||
->one() ; | |||||
if(!$etablissement->credit_pain) | |||||
$producer = Producer::searchOne([ | |||||
'id' => Producer::getId() | |||||
]); | |||||
if(!$producer->credit) | |||||
{ | { | ||||
echo '<div class="alert alert-warning">Attention, la fonctionnalité <strong>Crédit Pain</strong> est désactivée dans vos <a href="'.Yii::$app->urlManager->createurl(['etablissement/update']).'">paramètres</a>.' | |||||
. ' Pensez à l\'activer si vous souhaitez qu\'elle soit visible de vos clients.</div>' ; | |||||
echo '<div class="alert alert-warning">Attention, la fonctionnalité <strong>Crédit</strong> est désactivée dans vos <a href="'.Yii::$app->urlManager->createurl(['producer/update']).'">paramètres</a>.' | |||||
. ' Pensez à l\'activer si vous souhaitez qu\'elle soit visible de vos utilisateurs.</div>' ; | |||||
} | } | ||||
?> | ?> | ||||
<div class="col-md-12"> | <div class="col-md-12"> | ||||
<h1><?= $this->title ?></h1> | |||||
<?php $form = ActiveForm::begin(); ?> | <?php $form = ActiveForm::begin(); ?> | ||||
<?= $form->field($credit_form, 'type')->dropDownList([ | |||||
CreditHistorique::TYPE_CREDIT => 'Crédit', | |||||
CreditHistorique::TYPE_DEBIT => 'Débit', | |||||
<?= $form->field($creditForm, 'type')->dropDownList([ | |||||
CreditHistory::TYPE_CREDIT => 'Crédit', | |||||
CreditHistory::TYPE_DEBIT => 'Débit', | |||||
]) ?> | ]) ?> | ||||
<?= $form->field($credit_form, 'montant')->textInput() ?> | |||||
<?= $form->field($credit_form, 'moyen_paiement')->dropDownList([ | |||||
CreditHistorique::MOYEN_ESPECES => 'Espèces', | |||||
CreditHistorique::MOYEN_CB => 'Carte bancaire', | |||||
CreditHistorique::MOYEN_CHEQUE => 'Chèque', | |||||
CreditHistorique::MOYEN_AUTRE => 'Autre', | |||||
<?= $form->field($creditForm, 'amount')->textInput() ?> | |||||
<?= $form->field($creditForm, 'mean_payment')->dropDownList([ | |||||
CreditHistory::MEAN_PAYMENT_MONEY => CreditHistory::getStrMeanPaymentBy(CreditHistory::MEAN_PAYMENT_MONEY), | |||||
CreditHistory::MEAN_PAYMENT_CREDIT_CARD => CreditHistory::getStrMeanPaymentBy(CreditHistory::MEAN_PAYMENT_CREDIT_CARD), | |||||
CreditHistory::MEAN_PAYMENT_CHEQUE => CreditHistory::getStrMeanPaymentBy(CreditHistory::MEAN_PAYMENT_CHEQUE), | |||||
CreditHistory::MEAN_PAYMENT_OTHER => CreditHistory::getStrMeanPaymentBy(CreditHistory::MEAN_PAYMENT_OTHER), | |||||
]) ?> | ]) ?> | ||||
<?= $form->field($credit_form, 'commentaire')->textarea() ?> | |||||
<?= $form->field($credit_form, 'send_mail')->checkbox() ?> | |||||
<?= $form->field($creditForm, 'comment')->textarea() ?> | |||||
<?= $form->field($creditForm, 'send_mail')->checkbox() ?> | |||||
<div class="form-group"> | <div class="form-group"> | ||||
<?= Html::submitButton( 'Créditer', ['class' => 'btn btn-primary']) ?> | <?= Html::submitButton( 'Créditer', ['class' => 'btn btn-primary']) ?> | ||||
</div> | </div> | ||||
<div class="col-md-12"> | <div class="col-md-12"> | ||||
<h2>Historique <span class="the-credit"><?= number_format($user->getCredit($etablissement->id), 2); ?> €</span></h2> | |||||
<h2>Historique <span class="the-credit"><?= number_format($user->getCredit($producer->id), 2); ?> €</span></h2> | |||||
<table class="table table-bordered"> | <table class="table table-bordered"> | ||||
<thead> | <thead> | ||||
<tr> | <tr> | ||||
</tr> | </tr> | ||||
</thead> | </thead> | ||||
<tbody> | <tbody> | ||||
<?php if(count($historique)): ?> | |||||
<?php foreach($historique as $ch): ?> | |||||
<?php if(count($history)): ?> | |||||
<?php foreach($history as $creditHistory): ?> | |||||
<tr> | <tr> | ||||
<td><?= $ch->getDate(true) ; ?></td> | |||||
<td><?= Html::encode($ch->strUserAction()); ?></td> | |||||
<td><?= $ch->getStrLibelle(); ?></td> | |||||
<td><?= $creditHistory->getDate(true) ; ?></td> | |||||
<td><?= Html::encode($creditHistory->strUserAction()); ?></td> | |||||
<td><?= $creditHistory->getStrWording(); ?></td> | |||||
<td> | <td> | ||||
<?php if($ch->isTypeDebit()): ?> | |||||
- <?= $ch->getMontant(true); ?> | |||||
<?php if($creditHistory->isTypeDebit()): ?> | |||||
- <?= $creditHistory->getAmount(true); ?> | |||||
<?php endif; ?> | <?php endif; ?> | ||||
</td> | </td> | ||||
<td> | <td> | ||||
<?php if($ch->isTypeCredit()): ?> | |||||
+ <?= $ch->getMontant(true); ?> | |||||
<?php if($creditHistory->isTypeCredit()): ?> | |||||
+ <?= $creditHistory->getAmount(true); ?> | |||||
<?php endif; ?> | <?php endif; ?> | ||||
</td> | </td> | ||||
<td> | <td> | ||||
<?= $ch->getStrMoyenPaiement() ?> | |||||
<?= $creditHistory->getStrMeanPayment() ?> | |||||
</td> | </td> | ||||
<td> | <td> | ||||
<?php if(strlen($ch->commentaire)): ?> | |||||
<?= nl2br($ch->commentaire) ; ?> | |||||
<?php if(strlen($creditHistory->comment)): ?> | |||||
<?= nl2br($creditHistory->comment) ; ?> | |||||
<?php endif; ?> | <?php endif; ?> | ||||
</td> | </td> | ||||
</tr> | </tr> |
<?php | <?php | ||||
/** | /** | ||||
Copyright La boîte à pain (2018) | |||||
Copyright distrib (2018) | |||||
contact@laboiteapain.net | |||||
contact@opendistrib.net | |||||
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\bootstrap\ActiveForm; | |||||
use yii\helpers\Html ; | |||||
use yii\widgets\ActiveForm; | |||||
/* | |||||
* To change this license header, choose License Headers in Project Properties. | |||||
* To change this template file, choose Tools | Templates | |||||
* and open the template in the editor. | |||||
*/ | |||||
$this->title = 'Envoi d\'un email à tous les utilisateurs'; | |||||
$this->setTitle('Liste des emails') ; | |||||
$this->addBreadcrumb(['label' => 'Utilisateurs', 'url' => ['user/index']]) ; | |||||
$this->addBreadcrumb($this->getTitle()) ; | |||||
?> | ?> | ||||
<h1><?= Html::encode($this->title) ?></h1> | |||||
<?= | |||||
<?php | |||||
$this->render('_menu',[ | |||||
'idPointSaleActive' => $idPointSaleActive, | |||||
'sectionInactiveUsers' => isset($sectionInactiveUsers) ? $sectionInactiveUsers : null, | |||||
'pointsSaleArray' => $pointsSaleArray, | |||||
'section' => 'sendmail' | |||||
]) ; | |||||
?> | |||||
$form = ActiveForm::begin(['id' => 'email-masse-form','enableClientValidation' => false]); ?> | |||||
<?= $form->field($model, 'subject') ?> | |||||
<?= $form->field($model, 'body')->textArea(['rows' => 6]) ?> | |||||
<div class="form-group"> | |||||
<label class="control-label">Envoyer à</label> | |||||
<p>Cliquer sur les utilisateurs pour modifier leur état.<br /> | |||||
Légende : <span class="label label-default">à envoyer</span> <span class="label label-danger">ne pas envoyer</span> <span class="label label-success">envoyé</span></p> | |||||
<div id="ids-users"> | |||||
<?php foreach($users as $u): ?> | |||||
<a href="javascript:void(0);" class="label <?php if($u->no_mail): ?>label-danger<?php else: ?>label-default<?php endif; ?>" data-send="0" data-id="<?php echo $u->id; ?>"><?php echo Html::encode($u->prenom.' '.$u->nom); ?></a> | |||||
<?php endforeach; ?> | |||||
<div id=""> | |||||
<div class="col-md-6"> | |||||
<div class="panel panel-default"> | |||||
<div class="panel-heading"> | |||||
<h3 class="panel-title">Envoyer un message</h3> | |||||
</div> | |||||
<div class="panel-body"> | |||||
<?php $form = ActiveForm::begin(); ?> | |||||
<?= $form->field($mailForm, 'subject')->textInput() ; ?> | |||||
<?= $form->field($mailForm, 'message')->textarea(['rows' => '15']) ; ?> | |||||
<div class="form-group"> | |||||
<?= Html::submitButton( 'Envoyer', ['class' => 'btn btn-primary']) ?> | |||||
</div> | |||||
<?php ActiveForm::end(); ?> | |||||
</div> | |||||
</div> | </div> | ||||
<input name="id_user" type="hidden" value="" /> | |||||
</div> | </div> | ||||
<br /> | |||||
<div class="form-group"> | |||||
<?= Html::submitButton('Envoyer', ['class' => 'btn btn-default', 'name' => 'email-masse-button']) ?> | |||||
<div class="col-md-6"> | |||||
<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"> | |||||
<?= implode(', ', $usersArray); ?> | |||||
</div> | |||||
</div> | |||||
</div> | </div> | ||||
<?php ActiveForm::end(); ?> | |||||
<div class="clr"></div> | |||||
</div> | |||||
<?php | <?php | ||||
/** | /** | ||||
Copyright La boîte à pain (2018) | |||||
Copyright distrib (2018) | |||||
contact@laboiteapain.net | |||||
contact@opendistrib.net | |||||
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\helpers\Html; | use yii\helpers\Html; | ||||
use yii\grid\GridView; | use yii\grid\GridView; | ||||
use common\models\User ; | use common\models\User ; | ||||
use common\models\Commande ; | |||||
use common\models\Order ; | |||||
/* @var $this yii\web\View */ | |||||
/* @var $dataProvider yii\data\ActiveDataProvider */ | |||||
$this->setTitle('Utilisateurs') ; | |||||
$this->addBreadcrumb($this->getTitle()) ; | |||||
$this->addButton(['label' => '+', 'url' => 'user/create', 'class' => 'btn btn-primary']) ; | |||||
$this->title = 'Clients'; | |||||
$this->params['breadcrumbs'][] = $this->title; | |||||
?> | ?> | ||||
<?= | |||||
<div class="user-index"> | |||||
<h1> | |||||
<?= Html::encode($this->title) ?> | |||||
<?= Html::a('Ajouter', ['create'], ['class' => 'btn btn-primary']) ?> | |||||
</h1> | |||||
<ul id="tabs-points-vente" class="nav nav-tabs" role="tablist"> | |||||
<li class="<?php if(!$id_point_vente_active && !$section_clients_inactifs): ?>active<?php endif; ?>"> | |||||
<a href="<?= Yii::$app->urlManager->createUrl(['user/index']); ?>">Tous</a> | |||||
</li> | |||||
<?php foreach($points_vente as $pv): ?> | |||||
<li class="<?php if($id_point_vente_active == $pv->id): ?>active<?php endif; ?>"> | |||||
<a href="<?= Yii::$app->urlManager->createUrl(['user/index','id_point_vente'=>$pv->id]); ?>"><?= Html::encode($pv->nom) ?></a> | |||||
</li> | |||||
<?php endforeach; ?> | |||||
<li class="<?php if($section_clients_inactifs): ?>active<?php endif; ?>"> | |||||
<a href="<?= Yii::$app->urlManager->createUrl(['user/index','section_clients_inactifs' => 1]); ?>">Inactifs</a> | |||||
</li> | |||||
</ul> | |||||
<?= Html::a('<span class="glyphicon glyphicon-envelope"></span> Liste des emails', ['mail', 'id_point_vente' => $id_point_vente_active], ['class' => 'btn btn-default btn-liste-emails']) ?> | |||||
<?= GridView::widget([ | |||||
'dataProvider' => $dataProvider, | |||||
'filterModel' => true, | |||||
'columns' => [ | |||||
[ | |||||
'attribute' => 'nom', | |||||
'filter' => Html::input( | |||||
'string', | |||||
'nom', | |||||
isset(Yii::$app->request->queryParams['nom']) ? Html::encode(Yii::$app->request->queryParams['nom']) : '', | |||||
[ 'class' => 'form-control'] | |||||
) | |||||
], | |||||
[ | |||||
'attribute' => 'prenom', | |||||
'filter' => Html::input( | |||||
'string', | |||||
'prenom', | |||||
isset(Yii::$app->request->queryParams['prenom']) ? Html::encode(Yii::$app->request->queryParams['prenom']) : '', | |||||
['class' => 'form-control'] | |||||
) | |||||
], | |||||
[ | |||||
'attribute' => 'telephone', | |||||
'filter' => Html::input( | |||||
'string', | |||||
'telephone', | |||||
isset(Yii::$app->request->queryParams['telephone']) ? Html::encode(Yii::$app->request->queryParams['telephone']) : '', | |||||
['class' => 'form-control'] | |||||
) | |||||
], | |||||
[ | |||||
'attribute' => 'email', | |||||
'filter' => Html::input( | |||||
'string', | |||||
'email', | |||||
isset(Yii::$app->request->queryParams['email']) ? Html::encode(Yii::$app->request->queryParams['email']) : '', | |||||
['class' => 'form-control'] | |||||
) | |||||
], | |||||
[ | |||||
'attribute' => 'created_at', | |||||
'label' => 'Date d\'inscription', | |||||
'value' => function($model) { | |||||
if(isset($model['created_at'])) | |||||
return date('m/d/Y à H:i', $model['created_at']); | |||||
$this->render('_menu',[ | |||||
'idPointSaleActive' => $idPointSaleActive, | |||||
'sectionInactiveUsers' => $sectionInactiveUsers, | |||||
'pointsSaleArray' => $pointsSaleArray, | |||||
'section' => 'list' | |||||
]) ; | |||||
?> | |||||
<?= GridView::widget([ | |||||
'dataProvider' => $dataProvider, | |||||
'filterModel' => $searchModel, | |||||
'columns' => [ | |||||
[ | |||||
'attribute' => 'username', | |||||
'label' => 'Nom', | |||||
'value' => function($model) { | |||||
return $model['lastname'].' '.$model['name'] ; | |||||
} | |||||
], | |||||
[ | |||||
'attribute' => 'contacts', | |||||
'header' => 'Contacts', | |||||
'format' => 'raw', | |||||
'value' => function($model) { | |||||
$html = '' ; | |||||
if(strlen($model['phone'])) { | |||||
$html .= $model['phone'] ; | |||||
} | } | ||||
], | |||||
[ | |||||
'attribute' => 'date_derniere_connexion', | |||||
'label' => 'Dernière connexion', | |||||
'value' => function($model) { | |||||
if(isset($model['date_derniere_connexion'])) | |||||
return date('d/m/Y à H:i', strtotime($model['date_derniere_connexion'])); | |||||
else | |||||
return '' ; | |||||
if(strlen($model['phone']) && strlen($model['email'])) { | |||||
$html .= '<br />' ; | |||||
} | } | ||||
], | |||||
[ | |||||
'class' => 'yii\grid\ActionColumn', | |||||
'template' => '{commandes}', | |||||
'headerOptions' => ['class' => 'actions'], | |||||
'buttons' => [ | |||||
'commandes' => function ($url, $model) { | |||||
$url = Yii::$app->urlManager->createUrl(['user/commandes','id' => $model['user_id']]) ; | |||||
$count_commandes = Commande::find() | |||||
->joinWith('production') | |||||
->where([ | |||||
'id_user' => $model['user_id'], | |||||
'production.id_etablissement' => Yii::$app->user->identity->id_etablissement]) | |||||
->andWhere('date_delete IS NULL') | |||||
->count() ; | |||||
$html = '' ; | |||||
if($count_commandes) | |||||
{ | |||||
$s = '' ; | |||||
if($count_commandes > 1) $s = 's' ; | |||||
$html .= Html::a('<span class="glyphicon glyphicon-eye-open"></span> '.$count_commandes.' commande'.$s, $url, [ | |||||
'title' => Yii::t('app', 'Commandes'), 'class' => 'btn btn-default ' | |||||
]); ; | |||||
} | |||||
else { | |||||
$html .= 'Aucune commande' ; | |||||
} | |||||
return $html ; | |||||
}, | |||||
], | |||||
], | |||||
[ | |||||
'attribute' => 'credit', | |||||
'format' => 'raw', | |||||
'value' => function($model) use($etablissement) { | |||||
if(!isset($model['credit'])) $model['credit'] = 0 ; | |||||
$user = User::findOne($model['user_id']) ; | |||||
$html = '<div class="input-group"> | |||||
<input type="text" class="form-control input-credit" readonly="readonly" value="'.number_format($user->getCredit($etablissement->id),2).' €" placeholder=""> | |||||
<span class="input-group-btn"> | |||||
'.Html::a( | |||||
'<span class="glyphicon glyphicon-euro"></span> Crédit', | |||||
Yii::$app->urlManager->createUrl(['user/credit','id' => $model['user_id']]), | |||||
[ | |||||
'title' => 'Crédit', | |||||
'class' => 'btn btn-default' | |||||
] | |||||
).' | |||||
</span> | |||||
</div>' ; | |||||
return $html ; | |||||
if(strlen($model['email'])) { | |||||
$html .= $model['email'] ; | |||||
} | } | ||||
], | |||||
[ | |||||
'class' => 'yii\grid\ActionColumn', | |||||
'template' => '{update} {delete}', | |||||
'headerOptions' => ['class' => 'actions'], | |||||
'buttons' => [ | |||||
'update' => function ($url, $model) { | |||||
$url = Yii::$app->urlManager->createUrl(['user/update','id' => $model['user_id']]) ; | |||||
$user = User::find()->with('userEtablissement')->where(['id' => $model['user_id']])->one() ; | |||||
if(count($user->userEtablissement) <= 1) | |||||
{ | |||||
return Html::a('<span class="glyphicon glyphicon-pencil"></span> Modifier', $url, [ | |||||
'title' => Yii::t('app', 'Modifier'), 'class' => 'btn btn-default' | |||||
]); | |||||
} | |||||
else { | |||||
return '<span data-toggle="tooltip" data-placement="top" title="Vous ne pouvez pas modifier les clients qui sont liés à plusieurs producteurs."><span class="glyphicon glyphicon-remove-sign"></span> Non modifiable</span>' ; | |||||
} | |||||
}, | |||||
'delete' => function($url, $model) { | |||||
if($model['actif']) { | |||||
return Html::a('<span class="glyphicon glyphicon-trash"></span> Supprimer', Yii::$app->urlManager->createUrl(array_merge(['user/delete','id' => $model['user_id']], Yii::$app->getRequest()->getQueryParams())), [ | |||||
'title' => Yii::t('app', 'Supprimer'), 'class' => 'btn btn-default' | |||||
]); | |||||
} | |||||
return $html ; | |||||
} | |||||
], | |||||
[ | |||||
'class' => 'yii\grid\ActionColumn', | |||||
'header' => 'Commandes', | |||||
'template' => '{orders}', | |||||
'headerOptions' => ['class' => 'actions'], | |||||
'buttons' => [ | |||||
'orders' => function ($url, $model) { | |||||
$url = Yii::$app->urlManager->createUrl(['user/orders','id' => $model['id']]) ; | |||||
$countOrders = Order::searchCount([ | |||||
'id_user' => $model['id'] | |||||
], ['conditions' => 'date_delete IS NULL']) ; | |||||
$html = '' ; | |||||
if($countOrders) { | |||||
$html .= Html::a('<span class="glyphicon glyphicon-eye-open"></span> '.$countOrders, $url, [ | |||||
'title' => Yii::t('app', 'Commandes'), 'class' => 'btn btn-default ' | |||||
]); ; | |||||
} | } | ||||
], | |||||
else { | |||||
$html .= 'Aucune commande' ; | |||||
} | |||||
return $html ; | |||||
}, | |||||
], | |||||
], | |||||
[ | |||||
'attribute' => 'credit', | |||||
'format' => 'raw', | |||||
'value' => function($model) use($producer) { | |||||
$user = User::findOne($model->id) ; | |||||
$html = '<div class="input-group"> | |||||
<input type="text" class="form-control input-credit" readonly="readonly" value="'.number_format($user->getCredit($producer->id),2).' €" placeholder=""> | |||||
<span class="input-group-btn"> | |||||
'.Html::a( | |||||
'<span class="glyphicon glyphicon-euro"></span>', | |||||
Yii::$app->urlManager->createUrl(['user/credit','id' => $model->id]), | |||||
[ | |||||
'title' => 'Crédit', | |||||
'class' => 'btn btn-default' | |||||
] | |||||
).' | |||||
</span> | |||||
</div>' ; | |||||
return $html ; | |||||
} | |||||
], | |||||
[ | |||||
'class' => 'yii\grid\ActionColumn', | |||||
'template' => '{update} {delete}', | |||||
'headerOptions' => ['class' => 'column-actions'], | |||||
'contentOptions' => ['class' => 'column-actions'], | |||||
'buttons' => [ | |||||
'update' => function ($url, $model) { | |||||
$url = Yii::$app->urlManager->createUrl(['user/update','id' => $model->id]) ; | |||||
$user = User::find()->with('userProducer')->where(['id' => $model->id])->one() ; | |||||
if(count($user->userProducer) <= 1) | |||||
{ | |||||
return Html::a('<span class="glyphicon glyphicon-pencil"></span>', $url, [ | |||||
'title' => Yii::t('app', 'Modifier'), 'class' => 'btn btn-default' | |||||
]); | |||||
} | |||||
else { | |||||
return '<span data-toggle="tooltip" data-placement="top" title="Vous ne pouvez pas modifier les utilisateurs qui sont liés à plusieurs producteurs."><span class="glyphicon glyphicon-remove-sign"></span> Non modifiable</span>' ; | |||||
} | |||||
}, | |||||
'delete' => function($url, $model) { | |||||
return Html::a('<span class="glyphicon glyphicon-trash"></span>', Yii::$app->urlManager->createUrl(array_merge(['user/delete','id' => $model->id], Yii::$app->getRequest()->getQueryParams())), [ | |||||
'title' => Yii::t('app', 'Supprimer'), 'class' => 'btn btn-default' | |||||
]); | |||||
} | |||||
], | ], | ||||
], | ], | ||||
]); ?> | |||||
</div> | |||||
], | |||||
]); ?> |
<?php | |||||
/** | |||||
Copyright La boîte à pain (2018) | |||||
contact@laboiteapain.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->title = 'Liste des emails'; | |||||
$this->params['breadcrumbs'][] = ['label' => 'Clients', | |||||
'url' => ['user/index']] ; | |||||
$this->params['breadcrumbs'][] = $this->title; | |||||
?> | |||||
<h1><?php if(isset($point_vente) && $point_vente): echo Html::encode($point_vente->nom).' : '; endif; ?><?= count($users); ?> clients</h1> | |||||
<ul id="tabs-points-vente" class="nav nav-tabs" role="tablist"> | |||||
<li class="<?php if(!isset($point_vente)): ?>active<?php endif; ?>"> | |||||
<a href="<?= Yii::$app->urlManager->createUrl(['user/mail']); ?>">Tous</a> | |||||
</li> | |||||
<?php foreach($points_vente as $pv): ?> | |||||
<li class="<?php if(isset($point_vente) && $point_vente->id == $pv->id): ?>active<?php endif; ?>"> | |||||
<a href="<?= Yii::$app->urlManager->createUrl(['user/mail','id_point_vente'=>$pv->id]); ?>"><?= Html::encode($pv->nom) ?></a> | |||||
</li> | |||||
<?php endforeach; ?> | |||||
</ul> | |||||
<?= implode(', ', $users); ?> | |||||
<?php | <?php | ||||
/** | /** | ||||
Copyright La boîte à pain (2018) | |||||
Copyright distrib (2018) | |||||
contact@laboiteapain.net | |||||
contact@opendistrib.net | |||||
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\helpers\Html; | use yii\helpers\Html; | ||||
use yii\widgets\ActiveForm; | use yii\widgets\ActiveForm; | ||||
use common\models\CreditHistorique; | |||||
use common\models\Etablissement; | |||||
use common\models\Commande; | |||||
use common\models\CreditHistory; | |||||
use common\models\Producer; | |||||
use common\models\Order; | |||||
$this->title = 'Commandes <small>'.Html::encode($user->nom.' '.$user->prenom).'</small>'; | |||||
$this->params['breadcrumbs'][] = ['label' => 'Clients', 'url' => ['index']]; | |||||
$this->params['breadcrumbs'][] = ['label' => Html::encode($user->nom.' '.$user->prenom)]; | |||||
$this->params['breadcrumbs'][] = 'Créditer'; | |||||
$this->setTitle('Commandes <small>'.Html::encode($user->lastname.' '.$user->name).'</small>', 'Commandes de '.Html::encode($user->lastname.' '.$user->name)) ; | |||||
$this->addBreadcrumb(['label' => 'Utilisateurs', 'url' => ['index']]) ; | |||||
$this->addBreadcrumb(['label' => Html::encode($user->lastname.' '.$user->name)]) ; | |||||
$this->addBreadcrumb('Commandes') ; | |||||
?> | ?> | ||||
<div class="user-commandes"> | |||||
<h1><?= $this->title ?> </h1> | |||||
<?php if(count($commandes)): ?> | |||||
<div class="user-orders"> | |||||
<?php if(count($ordersArray)): ?> | |||||
<table id="historique-commandes" class="table table-striped table-bordered"> | <table id="historique-commandes" class="table table-striped table-bordered"> | ||||
<thead> | <thead> | ||||
<tr> | <tr> | ||||
<th>Historique</th> | |||||
<th>Date livraison</th> | <th>Date livraison</th> | ||||
<th>Historique</th> | |||||
<th>Résumé</th> | <th>Résumé</th> | ||||
<th>Point de vente</th> | <th>Point de vente</th> | ||||
<th class="montant">Montant</th> | <th class="montant">Montant</th> | ||||
</tr> | </tr> | ||||
</thead> | </thead> | ||||
<tbody> | <tbody> | ||||
<?php foreach($commandes as $c): ?> | |||||
<tr class="<?= $c->getClassHistorique() ; ?>"> | |||||
<td class="historique"><?= $c->getStrHistorique() ; ?></td> | |||||
<td><?php echo date('d/m/Y',strtotime($c->production->date)); ?></td> | |||||
<td class="resume"><?= $c->getResumePanier() ; ?></td> | |||||
<td><?= $c->getResumePointVente(); ?></td> | |||||
<td class="montant"><?= $c->getResumeMontant(); ?></td> | |||||
<?php foreach($ordersArray as $order): ?> | |||||
<tr class="<?= $order->getClassHistory() ; ?>"> | |||||
<td><?php echo date('d/m/Y',strtotime($order->distribution->date)); ?></td> | |||||
<td class="historique"><?= $order->getStrHistory() ; ?></td> | |||||
<td class="resume"><?= $order->getCartSummary() ; ?></td> | |||||
<td><?= $order->getPointSaleSummary(); ?></td> | |||||
<td class="montant"><?= $order->getAmountSummary(); ?></td> | |||||
</tr> | </tr> | ||||
<?php endforeach; ?> | <?php endforeach; ?> | ||||
</tbody> | </tbody> |
<?php | <?php | ||||
/** | /** | ||||
Copyright La boîte à pain (2018) | |||||
Copyright distrib (2018) | |||||
contact@laboiteapain.net | |||||
contact@opendistrib.net | |||||
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\helpers\Html; | use yii\helpers\Html; | ||||
/* @var $this yii\web\View */ | |||||
/* @var $model common\models\User */ | |||||
$this->setTitle('Modifier un client') ; | |||||
$this->addBreadcrumb(['label' => 'Utilisateurs', 'url' => ['index']]) ; | |||||
$this->addBreadcrumb(['label' => Html::encode($model->lastname.' '.$model->name)]) ; | |||||
$this->addBreadcrumb('Modifier') ; | |||||
$this->title = 'Modifier un client' ; | |||||
$this->params['breadcrumbs'][] = ['label' => 'Clients', 'url' => ['index']]; | |||||
$this->params['breadcrumbs'][] = ['label' => Html::encode($model->nom.' '.$model->prenom)]; | |||||
$this->params['breadcrumbs'][] = 'Modifier'; | |||||
?> | ?> | ||||
<div class="user-update"> | |||||
<h1><?= Html::encode($this->title) ?></h1> | |||||
<div class="user-update"> | |||||
<?= $this->render('_form', [ | <?= $this->render('_form', [ | ||||
'model' => $model, | 'model' => $model, | ||||
]) ?> | ]) ?> | ||||
</div> | </div> |
<?php | |||||
/** | |||||
Copyright La boîte à pain (2018) | |||||
contact@laboiteapain.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; | |||||
use yii\widgets\DetailView; | |||||
/* @var $this yii\web\View */ | |||||
/* @var $model common\models\User */ | |||||
$this->title = $model->id; | |||||
$this->params['breadcrumbs'][] = ['label' => 'Clients', 'url' => ['index']]; | |||||
$this->params['breadcrumbs'][] = $this->title; | |||||
?> | |||||
<div class="user-view"> | |||||
<h1><?= Html::encode($this->title) ?></h1> | |||||
<p> | |||||
<?= Html::a('Update', ['update', 'id' => $model->id], ['class' => 'btn btn-primary']) ?> | |||||
<?= Html::a('Delete', ['delete', 'id' => $model->id], [ | |||||
'class' => 'btn btn-danger', | |||||
'data' => [ | |||||
'confirm' => 'Are you sure you want to delete this item?', | |||||
'method' => 'post', | |||||
], | |||||
]) ?> | |||||
</p> | |||||
<?= DetailView::widget([ | |||||
'model' => $model, | |||||
'attributes' => [ | |||||
'id', | |||||
'username', | |||||
'auth_key', | |||||
'password_hash', | |||||
'password_reset_token', | |||||
'email:email', | |||||
'status', | |||||
'created_at', | |||||
'updated_at', | |||||
'nom', | |||||
'prenom', | |||||
'telephone', | |||||
'confiance', | |||||
], | |||||
]) ?> | |||||
</div> |
@charset "UTF-8"; | @charset "UTF-8"; | ||||
/** | /** | ||||
Copyright La boîte à pain (2018) | |||||
Copyright distrib (2018) | |||||
contact@laboiteapain.net | |||||
contact@opendistrib.net | |||||
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. |
@charset "UTF-8"; | @charset "UTF-8"; | ||||
/** | /** | ||||
Copyright La boîte à pain (2018) | |||||
Copyright distrib (2018) | |||||
contact@laboiteapain.net | |||||
contact@opendistrib.net | |||||
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. |
/** | /** | ||||
Copyright La boîte à pain (2018) | |||||
Copyright distrib (2018) | |||||
contact@laboiteapain.net | |||||
contact@opendistrib.net | |||||
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. | ||||
*/ | */ | ||||
$(document).ready(function() { | $(document).ready(function() { | ||||
chat_calendar() ; | |||||
//chat_calendar() ; | |||||
chat_datepicker() ; | chat_datepicker() ; | ||||
chat_vrac() ; | chat_vrac() ; | ||||
chat_email_masse() ; | chat_email_masse() ; | ||||
function chat_index_commandes_points_vente_livraison() { | function chat_index_commandes_points_vente_livraison() { | ||||
$('#productionpointvente-productions_point_vente input[type=checkbox]').change(function() { | |||||
$('#pointsaledistribution-points_sale_distribution input[type=checkbox]').change(function() { | |||||
var nb = $('#productionpointvente-productions_point_vente input[type=checkbox]:checked').size() ; | |||||
var nb = $('#pointsaledistribution-points_sale_distribution input[type=checkbox]:checked').size() ; | |||||
if(nb == 0) { | if(nb == 0) { | ||||
$(this).prop('checked',true) ; | $(this).prop('checked',true) ; | ||||
if($(this).prop('checked')) | if($(this).prop('checked')) | ||||
livraison = 1 ; | livraison = 1 ; | ||||
$.get(UrlManager.getBaseUrl()+'commande/ajax-point-vente-livraison',{ | |||||
id_production: arr_val[0], | |||||
id_point_vente: arr_val[1], | |||||
bool_livraison: livraison | |||||
$.get(UrlManager.getBaseUrl()+'order/ajax-point-sale-delivery',{ | |||||
idDistribution: arr_val[0], | |||||
idPointSale: arr_val[1], | |||||
boolDelivery: livraison | |||||
}, function(data) { | }, function(data) { | ||||
chat_alert('success','Point de vente modifié') ; | chat_alert('success','Point de vente modifié') ; | ||||
}) ; | }) ; | ||||
function chat_index_commandes_maj_points_vente() { | function chat_index_commandes_maj_points_vente() { | ||||
if($('#productions-point-vente').size()) { | if($('#productions-point-vente').size()) { | ||||
var nb = $('#productionpointvente-productions_point_vente input[type=checkbox]:checked').size() ; | |||||
var nb = $('#pointsaledistribution-points_sale_distribution input[type=checkbox]:checked').size() ; | |||||
if(nb == 0) | if(nb == 0) | ||||
{ | { | ||||
$('#panel-commandes #tabs-points-vente, #panel-commandes #commandes-points-vente').hide() ; | $('#panel-commandes #tabs-points-vente, #panel-commandes #commandes-points-vente').hide() ; | ||||
var id_production = $('#id-production').val() ; | var id_production = $('#id-production').val() ; | ||||
if(id_production) { | if(id_production) { | ||||
$('#tabs-points-vente li').each(function() { | $('#tabs-points-vente li').each(function() { | ||||
var id_point_vente = $(this).find('a').attr('id').replace('btn-point-vente-','') ; | var id_point_vente = $(this).find('a').attr('id').replace('btn-point-vente-','') ; | ||||
var nb_commandes = parseInt($(this).find('.badge-success').html()) ; | var nb_commandes = parseInt($(this).find('.badge-success').html()) ; | ||||
var checked = $('#productionpointvente-productions_point_vente input[value='+id_production+'-'+id_point_vente+']').prop('checked') ; | |||||
var checked = $('#pointsaledistribution-points_sale_distribution input[value='+id_production+'-'+id_point_vente+']').prop('checked') ; | |||||
if(checked || nb_commandes > 0) | if(checked || nb_commandes > 0) | ||||
{ | { | ||||
$(this).show() ; | $(this).show() ; | ||||
function chat_points_vente_acces() { | function chat_points_vente_acces() { | ||||
// affichage du bloc acces restreint | // affichage du bloc acces restreint | ||||
$('#pointvente-acces_restreint').change(function() { | |||||
$('#pointsale-restricted_access').change(function() { | |||||
chat_points_vente_acces_event() ; | chat_points_vente_acces_event() ; | ||||
}) ; | }) ; | ||||
chat_points_vente_acces_event() ; | chat_points_vente_acces_event() ; | ||||
// affichage du champs commentaire | // affichage du champs commentaire | ||||
$('#pointvente-users input[type=checkbox]').change(function() { | |||||
$('#pointsale-users input[type=checkbox]').change(function() { | |||||
chat_points_vente_commentaire_event() ; | chat_points_vente_commentaire_event() ; | ||||
}) ; | }) ; | ||||
chat_points_vente_commentaire_event() ; | chat_points_vente_commentaire_event() ; | ||||
} | } | ||||
function chat_points_vente_commentaire_event() { | function chat_points_vente_commentaire_event() { | ||||
$('#pointvente-users input[type=checkbox]').each(function() { | |||||
$('#pointsale-users input[type=checkbox]').each(function() { | |||||
if($(this).prop('checked')) { | if($(this).prop('checked')) { | ||||
$(this).parent().find('.commentaire').fadeIn() ; | $(this).parent().find('.commentaire').fadeIn() ; | ||||
} | } | ||||
} | } | ||||
function chat_points_vente_acces_event() { | function chat_points_vente_acces_event() { | ||||
if($('#pointvente-acces_restreint').prop('checked')) { | |||||
$('#pointvente-users').fadeIn() ; | |||||
if($('#pointsale-restricted_access').prop('checked')) { | |||||
$('#pointsale-users').fadeIn() ; | |||||
} | } | ||||
else { | else { | ||||
$('#pointvente-users').hide() ; | |||||
$('#pointsale-users').hide() ; | |||||
} | } | ||||
} | } | ||||
function chat_select_etablissement() { | function chat_select_etablissement() { | ||||
$('select[name="select_etablissement"]').change(function() { | |||||
window.location.href = UrlManager.getBaseUrlAbsolute()+'/site/change-etablissement?id='+$(this).val() ; | |||||
$('select[name="select_producer"]').change(function() { | |||||
window.location.href = UrlManager.getBaseUrlAbsolute()+'/site/change-producer?id='+$(this).val() ; | |||||
}) ; | }) ; | ||||
} | } | ||||
function chat_commandeauto() { | function chat_commandeauto() { | ||||
// dates | // dates | ||||
$('#commandeautoform-date_debut, #commandeautoform-date_fin').datepicker() ; | |||||
$('#subscriptionform-date_begin, #subscriptionform-date_end').datepicker() ; | |||||
} | } | ||||
var id_commande = $(this).data('id-commande') ; | var id_commande = $(this).data('id-commande') ; | ||||
$(this).attr('disabled', 'disabled') ; | $(this).attr('disabled', 'disabled') ; | ||||
$.get(UrlManager.getBaseUrl()+'commande/ajax-delete',{ | |||||
$.get(UrlManager.getBaseUrl()+'order/ajax-delete',{ | |||||
date: $('#date-production').val(), | date: $('#date-production').val(), | ||||
id_commande: id_commande | |||||
idOrder: id_commande | |||||
}, function(data) { | }, function(data) { | ||||
$('#point-vente-'+id_pv+' .btn-remove').removeAttr('disabled') ; | $('#point-vente-'+id_pv+' .btn-remove').removeAttr('disabled') ; | ||||
$('#point-vente-'+id_pv+' .creer-commande').trigger('click') ; | $('#point-vente-'+id_pv+' .creer-commande').trigger('click') ; | ||||
} | } | ||||
} | } | ||||
chat_index_commandes_maj_recap_pv(id_pv, data.total_pv) ; | |||||
chat_index_commandes_maj_recap_pv(id_pv, data.total_point_sale) ; | |||||
chat_index_commandes_maj_total_commandes() ; | chat_index_commandes_maj_total_commandes() ; | ||||
chat_alert('success','Commande supprimée') ; | chat_alert('success','Commande supprimée') ; | ||||
}, 'json') ; | }, 'json') ; | ||||
$(this).attr('disabled', 'disabled') ; | $(this).attr('disabled', 'disabled') ; | ||||
$.get(UrlManager.getBaseUrl()+'commande/ajax-create',{ | |||||
$.get(UrlManager.getBaseUrl()+'order/ajax-create',{ | |||||
date: $('#date-production').val(), | date: $('#date-production').val(), | ||||
id_pv: id_pv, | |||||
id_user: $('#point-vente-'+id_pv+' .user-id').val(), | |||||
idPointSale: id_pv, | |||||
idUser: $('#point-vente-'+id_pv+' .user-id').val(), | |||||
username: $('#point-vente-'+id_pv+' .username').val(), | username: $('#point-vente-'+id_pv+' .username').val(), | ||||
produits: JSON.stringify(tab_produits), | |||||
commentaire: $('#point-vente-'+id_pv+' .textarea-commentaire').val() | |||||
products: JSON.stringify(tab_produits), | |||||
comment: $('#point-vente-'+id_pv+' .textarea-commentaire').val() | |||||
}, function(data) { | }, function(data) { | ||||
$('#point-vente-'+id_pv+' .btn-save').removeAttr('disabled') ; | $('#point-vente-'+id_pv+' .btn-save').removeAttr('disabled') ; | ||||
$('#point-vente-'+id_pv+' .btn-save').removeClass('is-create') ; | $('#point-vente-'+id_pv+' .btn-save').removeClass('is-create') ; | ||||
$('#point-vente-'+id_pv+' .liste-commandes').append(data.commande) ; | |||||
$('#point-vente-'+id_pv+' .liste-commandes').append(data.order) ; | |||||
chat_index_commandes_points_vente() ; | chat_index_commandes_points_vente() ; | ||||
chat_index_commandes_maj_recap_pv(id_pv, data.total_pv) ; | |||||
chat_index_commandes_maj_recap_pv(id_pv, data.total_point_sale) ; | |||||
$('#point-vente-'+id_pv+' .buttons-edit-remove').show() ; | $('#point-vente-'+id_pv+' .buttons-edit-remove').show() ; | ||||
$('#point-vente-'+id_pv+' .buttons-save-cancel').hide() ; | $('#point-vente-'+id_pv+' .buttons-save-cancel').hide() ; | ||||
var id_commande = $(this).data('id-commande') ; | var id_commande = $(this).data('id-commande') ; | ||||
$(this).attr('disabled', 'disabled') ; | $(this).attr('disabled', 'disabled') ; | ||||
$.get(UrlManager.getBaseUrl()+'commande/ajax-update',{ | |||||
id_commande: id_commande, | |||||
produits: JSON.stringify(tab_produits), | |||||
$.get(UrlManager.getBaseUrl()+'order/ajax-update',{ | |||||
idOrder: id_commande, | |||||
products: JSON.stringify(tab_produits), | |||||
date: $('#date-production').val(), | date: $('#date-production').val(), | ||||
commentaire: $('#point-vente-'+id_pv+' .textarea-commentaire').val() | |||||
comment: $('#point-vente-'+id_pv+' .textarea-commentaire').val() | |||||
}, function(data) { | }, function(data) { | ||||
$('#point-vente-'+id_pv+' .btn-save').removeAttr('disabled') ; | $('#point-vente-'+id_pv+' .btn-save').removeAttr('disabled') ; | ||||
$('#point-vente-'+id_pv+' a[data-id-commande='+id_commande+']').attr('data-commande',data.json_commande); | |||||
$('#point-vente-'+id_pv+' a[data-id-commande='+id_commande+'] .montant').html(data.json_commande.str_montant) ; | |||||
$('#point-vente-'+id_pv+' a[data-id-commande='+id_commande+']').attr('data-commande',data.json_order); | |||||
$('#point-vente-'+id_pv+' a[data-id-commande='+id_commande+'] .montant').html(data.json_order.str_amount) ; | |||||
chat_index_commandes_affiche_commande(id_pv, id_commande) ; | chat_index_commandes_affiche_commande(id_pv, id_commande) ; | ||||
chat_index_commandes_maj_recap_pv(id_pv, data.total_pv) ; | |||||
chat_index_commandes_maj_recap_pv(id_pv, data.total_point_sale) ; | |||||
$('#point-vente-'+id_pv+' .buttons-edit-remove').show() ; | $('#point-vente-'+id_pv+' .buttons-edit-remove').show() ; | ||||
$('#point-vente-'+id_pv+' .buttons-save-cancel').hide() ; | $('#point-vente-'+id_pv+' .buttons-save-cancel').hide() ; | ||||
// create | // create | ||||
$('.creer-commande').unbind('click').click(function() { | $('.creer-commande').unbind('click').click(function() { | ||||
var id_pv = $(this).data('pv-id') ; | var id_pv = $(this).data('pv-id') ; | ||||
$('#point-vente-'+id_pv+' .bloc-commande').fadeIn() ; | $('#point-vente-'+id_pv+' .bloc-commande').fadeIn() ; | ||||
$('#point-vente-'+id_pv+' .liste-commandes a.active').removeClass('active') ; | $('#point-vente-'+id_pv+' .liste-commandes a.active').removeClass('active') ; | ||||
$('#point-vente-'+id_pv+' .choix-user .username').val('') ; | $('#point-vente-'+id_pv+' .choix-user .username').val('') ; | ||||
$('#point-vente-'+id_pv+' .commentaire').hide() ; | $('#point-vente-'+id_pv+' .commentaire').hide() ; | ||||
$('#point-vente-'+id_pv+' .btn-save').addClass('is-create'); | $('#point-vente-'+id_pv+' .btn-save').addClass('is-create'); | ||||
/*if(!$('#point-vente-'+id_pv+' .btn-cancel').data('id-commande') && | |||||
$('#point-vente-'+id_pv+' .liste-commandes li').size()) { | |||||
$('#point-vente-'+id_pv+' .btn-cancel').data('id-commande',$('#point-vente-'+id_pv+' .liste-commandes li:first a').data('id-commande')) ; | |||||
}*/ | |||||
$('#point-vente-'+id_pv+' .btn-save').data('id-commande',0) ; | $('#point-vente-'+id_pv+' .btn-save').data('id-commande',0) ; | ||||
chat_index_commandes_inputs_commande(id_pv, false) ; | chat_index_commandes_inputs_commande(id_pv, false) ; | ||||
} | } | ||||
function chat_index_commandes_maj_total_commandes() { | function chat_index_commandes_maj_total_commandes() { | ||||
$.get(UrlManager.getBaseUrl()+'commande/ajax-total-commandes',{ | |||||
$.get(UrlManager.getBaseUrl()+'order/ajax-total-orders',{ | |||||
date: $('#date-production').val() | date: $('#date-production').val() | ||||
}, function(data) { | }, function(data) { | ||||
$('#bloc-totaux').html(data.html_totaux) ; | |||||
$('#bloc-totaux').html(data.html_totals) ; | |||||
}, 'json') ; | }, 'json') ; | ||||
} | } | ||||
$('#point-vente-'+id_pv+' a[data-id-commande='+id_commande+'] .montant .glyphicon').remove() ; | $('#point-vente-'+id_pv+' a[data-id-commande='+id_commande+'] .montant .glyphicon').remove() ; | ||||
$('#point-vente-'+id_pv+' a[data-id-commande='+id_commande+'] .montant').html() ; | $('#point-vente-'+id_pv+' a[data-id-commande='+id_commande+'] .montant').html() ; | ||||
$('#point-vente-'+id_pv+' a[data-id-commande='+id_commande+'] .montant').html(commande.str_montant) ; | |||||
if(commande.montant_paye >= commande.montant) { | |||||
$('#point-vente-'+id_pv+' a[data-id-commande='+id_commande+'] .montant').html(commande.str_amount) ; | |||||
if(commande.paid_amount >= commande.amount) { | |||||
$('#point-vente-'+id_pv+' a[data-id-commande='+id_commande+'] .montant').addClass('paye') ; | $('#point-vente-'+id_pv+' a[data-id-commande='+id_commande+'] .montant').addClass('paye') ; | ||||
if(commande.montant_paye > commande.montant) { | |||||
if(commande.paid_amount > commande.amount) { | |||||
$('#point-vente-'+id_pv+' a[data-id-commande='+id_commande+'] .montant').append(' <span class="glyphicon glyphicon-warning-sign"></span>') ; | $('#point-vente-'+id_pv+' a[data-id-commande='+id_commande+'] .montant').append(' <span class="glyphicon glyphicon-warning-sign"></span>') ; | ||||
} | } | ||||
} | } | ||||
// commentaire | // commentaire | ||||
if(commande.commentaire && commande.commentaire.length) { | |||||
if(commande.comment && commande.comment.length) { | |||||
if(!$('#point-vente-'+id_pv+' a[data-id-commande='+id_commande+'] .glyphicon-comment').size()) { | if(!$('#point-vente-'+id_pv+' a[data-id-commande='+id_commande+'] .glyphicon-comment').size()) { | ||||
$('#point-vente-'+id_pv+' a[data-id-commande='+id_commande+']').append(' <span class="glyphicon glyphicon-comment"></span>') ; | $('#point-vente-'+id_pv+' a[data-id-commande='+id_commande+']').append(' <span class="glyphicon glyphicon-comment"></span>') ; | ||||
} | } | ||||
console.log(id_pv+' '+commande.commentaire) ; | |||||
$('#point-vente-'+id_pv+' .commentaire').html(chat_nl2br(commande.commentaire)).show() ; | |||||
$('#point-vente-'+id_pv+' .commentaire').html(chat_nl2br(commande.comment)).show() ; | |||||
} | } | ||||
else { | else { | ||||
$('#point-vente-'+id_pv+' a[data-id-commande='+id_commande+'] .glyphicon-comment').remove() ; | $('#point-vente-'+id_pv+' a[data-id-commande='+id_commande+'] .glyphicon-comment').remove() ; | ||||
$('#point-vente-'+id_pv+' .td-total').html('') ; | $('#point-vente-'+id_pv+' .td-total').html('') ; | ||||
$('#point-vente-'+id_pv+' tr').removeClass('active') ; | $('#point-vente-'+id_pv+' tr').removeClass('active') ; | ||||
$.each(commande.produits, function(i, item) { | |||||
$.each(commande.products, function(i, item) { | |||||
$('#point-vente-'+id_pv+' .produit-'+i+' .td-commande').html(item) ; | $('#point-vente-'+id_pv+' .produit-'+i+' .td-commande').html(item) ; | ||||
$('#point-vente-'+id_pv+' .produit-'+i).addClass('active') ; | $('#point-vente-'+id_pv+' .produit-'+i).addClass('active') ; | ||||
}) ; | }) ; | ||||
$('#point-vente-'+id_pv+' .td-total').html('<span>'+commande.str_montant+'</span>') ; | |||||
$('#point-vente-'+id_pv+' .td-total').html('<span>'+commande.str_amount+'</span>') ; | |||||
$('#point-vente-'+id_pv+' .tr-total').show() ; | $('#point-vente-'+id_pv+' .tr-total').show() ; | ||||
/*var commentaire = link.data('commentaire') ; | |||||
if(commentaire) { | |||||
$('#point-vente-'+id_pv+' .commentaire').html(commentaire).show() ; | |||||
} | |||||
else { | |||||
$('#point-vente-'+id_pv+' .commentaire').hide() ; | |||||
}*/ | |||||
$('#point-vente-'+id_pv+' .title-user span.the-title').html(link.find('.user').html()+" <small>"+link.data('date')+"</small>") ; | $('#point-vente-'+id_pv+' .title-user span.the-title').html(link.find('.user').html()+" <small>"+link.data('date')+"</small>") ; | ||||
$('#point-vente-'+id_pv+' .bloc-commande').fadeIn() ; | $('#point-vente-'+id_pv+' .bloc-commande').fadeIn() ; | ||||
$('#point-vente-'+id_pv+' .tr-total').show() ; | $('#point-vente-'+id_pv+' .tr-total').show() ; | ||||
// paiement | // paiement | ||||
$.get(UrlManager.getBaseUrl()+'commande/statut-paiement',{ | |||||
id_commande: id_commande | |||||
$.get(UrlManager.getBaseUrl()+'order/payment-status',{ | |||||
idOrder: id_commande | |||||
}, function(data) { | }, function(data) { | ||||
$('#point-vente-'+id_pv+' .bloc-commande .td-paiement').html(data.html_statut_paiement) ; | |||||
$('#point-vente-'+id_pv+' a[data-id-commande='+id_commande+']').attr('data-commande',data.json_commande) ; | |||||
$('#point-vente-'+id_pv+' .bloc-commande .td-paiement').html(data.html_payment_status) ; | |||||
$('#point-vente-'+id_pv+' a[data-id-commande='+id_commande+']').attr('data-commande',data.json_order) ; | |||||
chat_index_commandes_boutons_paiement(id_pv, id_commande) ; | chat_index_commandes_boutons_paiement(id_pv, id_commande) ; | ||||
},'json') ; | },'json') ; | ||||
} | } | ||||
function chat_index_commandes_boutons_paiement(id_pv, id_commande) { | function chat_index_commandes_boutons_paiement(id_pv, id_commande) { | ||||
// boutons paiement/remboursement | // boutons paiement/remboursement | ||||
$('#point-vente-'+id_pv+' .payer, #point-vente-'+id_pv+' .rembourser').click(function() { | $('#point-vente-'+id_pv+' .payer, #point-vente-'+id_pv+' .rembourser').click(function() { | ||||
$(this).attr('disabled','disabled') ; | |||||
$.get(UrlManager.getBaseUrl()+'commande/paiement',{ | |||||
id_commande: id_commande, | |||||
type: $(this).data('type'), | |||||
montant: $(this).data('montant') | |||||
}, function(data) { | |||||
$('#point-vente-'+id_pv+' .bloc-commande .td-paiement').html(data.html_statut_paiement) ; | |||||
$('#point-vente-'+id_pv+' a[data-id-commande='+id_commande+']').attr('data-commande',data.json_commande) ; | |||||
chat_index_commandes_affiche_commande(id_pv, id_commande) ; | |||||
chat_index_commandes_boutons_paiement(id_pv, id_commande) ; | |||||
}, 'json') ; | |||||
$(this).attr('disabled','disabled') ; | |||||
$.get(UrlManager.getBaseUrl()+'order/payment',{ | |||||
idOrder: id_commande, | |||||
type: $(this).data('type'), | |||||
amount: $(this).data('montant') | |||||
}, function(data) { | |||||
$('#point-vente-'+id_pv+' .bloc-commande .td-paiement').html(data.html_payment_status) ; | |||||
$('#point-vente-'+id_pv+' a[data-id-commande='+id_commande+']').attr('data-commande',data.json_order) ; | |||||
chat_index_commandes_affiche_commande(id_pv, id_commande) ; | |||||
chat_index_commandes_boutons_paiement(id_pv, id_commande) ; | |||||
}, 'json') ; | |||||
}) ; | }) ; | ||||
} | } | ||||
return ui; | return ui; | ||||
}; | }; | ||||
$(".produit-index table tbody").sortable({ | |||||
$(".product-index table tbody").sortable({ | |||||
items: "> tr", | items: "> tr", | ||||
appendTo: "parent", | appendTo: "parent", | ||||
cursor: "move", | cursor: "move", | ||||
var tab_ordre = {} ; | var tab_ordre = {} ; | ||||
var ordre = 1 ; | var ordre = 1 ; | ||||
$(".produit-index table tbody tr").each(function() { | |||||
$(".product-index table tbody tr").each(function() { | |||||
tab_ordre[$(this).attr('data-key')] = ordre ; | tab_ordre[$(this).attr('data-key')] = ordre ; | ||||
ordre++ ; | ordre++ ; | ||||
}) ; | }) ; | ||||
console.log(tab_ordre) ; | console.log(tab_ordre) ; | ||||
$.get(UrlManager.getBaseUrl()+'produit/ordre',{ | |||||
tab: JSON.stringify(tab_ordre) | |||||
/*$.get(UrlManager.getBaseUrl()+'product/order',{ | |||||
array: JSON.stringify(tab_ordre) | |||||
}) ;*/ | |||||
$.post(UrlManager.getBaseUrl()+'product/order',{ | |||||
array: JSON.stringify(tab_ordre) | |||||
}) ; | }) ; | ||||
} | } | ||||
}).disableSelection(); | }).disableSelection(); | ||||
function chat_datepicker() { | function chat_datepicker() { | ||||
$('.datepicker').datepicker({dateFormat:'dd/mm/yy'}) ; | |||||
$('input.datepicker').datepicker({dateFormat:'dd/mm/yy'}) ; | |||||
} | } | ||||
function chat_calendar() { | function chat_calendar() { | ||||
if($('#page-commande').size()) { | |||||
if($('#page-order').size()) { | |||||
var events = new Array ; | var events = new Array ; | ||||
$('ul#jours-production li').each(function() { | $('ul#jours-production li').each(function() { | ||||
var date = $(this).html() ; | var date = $(this).html() ; | ||||
dayClick: function(date, jsEvent, view) { | dayClick: function(date, jsEvent, view) { | ||||
var url = $(location).attr('href') ; | var url = $(location).attr('href') ; | ||||
var tab_url = url.split('?') ; | var tab_url = url.split('?') ; | ||||
$(location).attr('href',tab_url[0]+'?r=commande/index&date='+date.format()); | |||||
$(location).attr('href',tab_url[0]+'?r=order/index&date='+date.format()); | |||||
}, | }, | ||||
eventRender: function (event, element) { | eventRender: function (event, element) { | ||||
var dataToFind = moment(event.start).format('YYYY-MM-DD'); | var dataToFind = moment(event.start).format('YYYY-MM-DD'); |
var app = new Vue({ | |||||
el: '#app-distribution-index', | |||||
data: { | |||||
baseUrl: $('meta[name=baseurl]').attr('content'), | |||||
date: null, | |||||
dateFormat: null, | |||||
loading: true, | |||||
distribution: { | |||||
active: false, | |||||
}, | |||||
oneDistributionWeekActive: false, | |||||
products: [], | |||||
countActiveProducts: 0, | |||||
pointsSale: [], | |||||
idActivePointSale: 0, | |||||
countActivePointsSale: 0, | |||||
countOrdersByPointSale: [], | |||||
orders: [], | |||||
countOrders: 0, | |||||
users: [], | |||||
showModalProducts: false, | |||||
showModalPointsSale: false, | |||||
showModalFormOrderCreate: false, | |||||
orderCreate: null, | |||||
showModalFormOrderUpdate: false, | |||||
idOrderUpdate: 0, | |||||
showViewProduct: false, | |||||
idOrderView: 0, | |||||
showModalPayment: false, | |||||
idOrderPayment: 0, | |||||
showLoading: false, | |||||
calendar: { | |||||
mode: 'single', | |||||
attrs: [], | |||||
themeStyles: { | |||||
wrapper: { | |||||
background: '#F7F7F7', | |||||
color: '#333', | |||||
border: 'solid 1px #e0e0e0' | |||||
}, | |||||
header: { | |||||
padding: '10px 10px', | |||||
}, | |||||
headerHorizontalDivider: { | |||||
borderTop: 'solid rgba(255, 255, 255, 0.2) 1px', | |||||
width: '80%', | |||||
}, | |||||
weekdays: { | |||||
color: '#e0e0e0', | |||||
fontWeight: '600', | |||||
padding: '10px 10px', | |||||
fontSize: '2rem' | |||||
}, | |||||
weeks: { | |||||
padding: '0 15px 15px 15px', | |||||
}, | |||||
dayContent: function(object) { | |||||
var style = { | |||||
fontSize: '2rem', | |||||
padding: '16px', | |||||
}; | |||||
if(object.isHovered || object.isFocus) { | |||||
style.backgroundColor = '#F39C12' ; | |||||
} | |||||
return style ; | |||||
}, | |||||
}, | |||||
formats: { | |||||
dayPopover: 'DD/MM/YYYY' | |||||
} | |||||
}, | |||||
}, | |||||
mounted: function() { | |||||
if($('#distribution-date').size()) { | |||||
this.date = new Date($('#distribution-date').html()) ; | |||||
this.dateFormat = ('0' + this.date.getDate()).slice(-2)+ '/' | |||||
+ ('0' + (this.date.getMonth() +1)).slice(-2) + '/' | |||||
+ this.date.getFullYear() ; | |||||
} | |||||
this.init() ; | |||||
this.loading = false ; | |||||
}, | |||||
methods: { | |||||
getDate: function() { | |||||
return this.formatDate(this.date) ; | |||||
}, | |||||
formatDate: function(date) { | |||||
if(date) { | |||||
return date.getFullYear() + '-' | |||||
+ ('0' + (date.getMonth() +1)).slice(-2) + '-' | |||||
+ ('0' + date.getDate()).slice(-2) ; | |||||
} | |||||
return false ; | |||||
}, | |||||
init: function(idActivePointSale) { | |||||
var app = this ; | |||||
this.showLoading = true ; | |||||
axios.get("ajax-infos",{params: {date : this.getDate()}}) | |||||
.then(function(response) { | |||||
app.distribution = response.data.distribution ; | |||||
app.products = response.data.products ; | |||||
app.initCountActiveProducts() ; | |||||
app.oneDistributionWeekActive = response.data.one_distribution_week_active ; | |||||
app.countOrders = 0 ; | |||||
if(response.data.orders) { | |||||
app.orders = response.data.orders ; | |||||
for(i=0 ; i < app.orders.length ; i++) { | |||||
if(!app.orders[i].date_delete) { | |||||
app.countOrders ++ ; | |||||
} | |||||
} | |||||
} | |||||
else { | |||||
app.orders = [] ; | |||||
} | |||||
if(response.data.order_create) { | |||||
app.orderCreate = response.data.order_create ; | |||||
} | |||||
if(response.data.points_sale) { | |||||
app.pointsSale = response.data.points_sale ; | |||||
app.initPointsSale(idActivePointSale) ; | |||||
} | |||||
else { | |||||
app.pointsSale = [] ; | |||||
} | |||||
if(response.data.users) { | |||||
app.users = response.data.users ; | |||||
} | |||||
app.calendar.attrs = [] ; | |||||
var distributions = response.data.distributions ; | |||||
if(distributions.length) { | |||||
for(var i= 0; i < distributions.length; i++) { | |||||
app.calendar.attrs.push({ | |||||
highlight: { | |||||
backgroundColor: '#5cb85c', | |||||
}, | |||||
contentStyle: { | |||||
color: 'white', | |||||
}, | |||||
dates: distributions[i].date, | |||||
}) ; | |||||
} | |||||
} | |||||
app.showLoading = false ; | |||||
}) ; | |||||
}, | |||||
initCountActiveProducts: function() { | |||||
this.countActiveProducts = 0 ; | |||||
for(var i= 0; i < this.products.length; i++) { | |||||
if(this.products[i].productDistribution[0].active == 1) { | |||||
this.countActiveProducts ++ ; | |||||
} | |||||
} | |||||
}, | |||||
initPointsSale: function(idActivePointSale) { | |||||
this.countActivePointsSale = 0 ; | |||||
this.setIdActivePointSale(0) ; | |||||
for(var i= 0; i < this.pointsSale.length; i++) { | |||||
if(this.pointsSale[i].pointSaleDistribution[0].delivery == 1) { | |||||
this.countActivePointsSale ++ ; | |||||
this.setIdActivePointSale(this.pointsSale[i].id) ; | |||||
} | |||||
} | |||||
if(this.countActivePointsSale > 1) { | |||||
this.setIdActivePointSale(0) ; | |||||
} | |||||
if(idActivePointSale) { | |||||
this.setIdActivePointSale(idActivePointSale) ; | |||||
} | |||||
this.countOrdersByPointSale = [] ; | |||||
for(var i = 0; i < this.pointsSale.length ; i++) { | |||||
this.countOrdersByPointSale[this.pointsSale[i].id] = 0 ; | |||||
} | |||||
for(var i = 0; i < this.orders.length ; i++) { | |||||
this.countOrdersByPointSale[this.orders[i].id_point_sale] ++ ; | |||||
} | |||||
}, | |||||
dayClicked: function(day) { | |||||
this.date = day.date ; | |||||
this.dateFormat = ('0' + this.date.getDate()).slice(-2)+ '/' | |||||
+ ('0' + (this.date.getMonth() +1)).slice(-2) + '/' | |||||
+ this.date.getFullYear() ; | |||||
this.init() ; | |||||
}, | |||||
productQuantityMaxChange: function(event) { | |||||
axios.get("ajax-process-product-quantity-max",{params: { | |||||
idDistribution: this.distribution.id, | |||||
idProduct: event.currentTarget.getAttribute('data-id-product'), | |||||
quantityMax: event.currentTarget.value | |||||
}}) | |||||
.then(function(response) { | |||||
}) ; | |||||
}, | |||||
productActiveClick: function(event) { | |||||
var idProduct = event.currentTarget.getAttribute('data-id-product') ; | |||||
var activeProduct = event.currentTarget.getAttribute('data-active-product') ; | |||||
axios.get("ajax-process-active-product",{params: { | |||||
idDistribution: this.distribution.id, | |||||
idProduct: idProduct, | |||||
active: activeProduct | |||||
}}) | |||||
.then(function(response) { | |||||
}) ; | |||||
for(i = 0 ; i < this.products.length ; i++) { | |||||
if(this.products[i].id == idProduct) { | |||||
this.products[i].productDistribution[0].active = activeProduct ; | |||||
} | |||||
} | |||||
this.initCountActiveProducts() ; | |||||
}, | |||||
pointSaleActiveClick: function(event) { | |||||
var idPointSale = event.currentTarget.getAttribute('data-id-point-sale') ; | |||||
var deliveryPointSale = event.currentTarget.getAttribute('data-delivery-point-sale') ; | |||||
axios.get("ajax-process-active-point-sale",{params: { | |||||
idDistribution: this.distribution.id, | |||||
idPointSale: idPointSale, | |||||
delivery: deliveryPointSale | |||||
}}) | |||||
.then(function(response) { | |||||
}) ; | |||||
for(i = 0 ; i < this.pointsSale.length ; i++) { | |||||
if(this.pointsSale[i].id == idPointSale) { | |||||
this.pointsSale[i].pointSaleDistribution[0].delivery = deliveryPointSale ; | |||||
} | |||||
} | |||||
this.initPointsSale() ; | |||||
}, | |||||
activeDistribution: function(event) { | |||||
var app = this ; | |||||
axios.get("ajax-process-active-distribution",{params: { | |||||
idDistribution: this.distribution.id, | |||||
active: event.currentTarget.getAttribute('data-active') | |||||
}}) | |||||
.then(function(response) { | |||||
app.init() ; | |||||
}) ; | |||||
}, | |||||
activeWeekDistribution: function(event) { | |||||
var app = this ; | |||||
axios.get("ajax-process-active-week-distribution",{params: { | |||||
date: this.date.getFullYear() + '-' | |||||
+ ('0' + (this.date.getMonth() +1)).slice(-2) + '-' | |||||
+ ('0' + this.date.getDate()).slice(-2), | |||||
active: event.currentTarget.getAttribute('data-active') | |||||
}}) | |||||
.then(function(response) { | |||||
app.init() ; | |||||
}) ; | |||||
}, | |||||
pointSaleClick: function(event) { | |||||
this.setIdActivePointSale(event.currentTarget.getAttribute('data-id-point-sale')) ; | |||||
}, | |||||
setIdActivePointSale: function(id) { | |||||
this.idActivePointSale = id ; | |||||
this.orderCreate.id_point_sale = id ; | |||||
}, | |||||
orderCreatedUpdated: function() { | |||||
this.showModalFormOrderCreate = false ; | |||||
this.showModalFormOrderUpdate = false ; | |||||
this.init(this.idActivePointSale) ; | |||||
}, | |||||
deleteOrderClick: function(event) { | |||||
var app = this ; | |||||
var idOrder = event.currentTarget.getAttribute('data-id-order') ; | |||||
axios.get(UrlManager.getBaseUrlAbsolute()+"order/ajax-delete",{params: { | |||||
idOrder: idOrder | |||||
}}) | |||||
.then(function(response) { | |||||
app.init(app.idActivePointSale) ; | |||||
}) ; | |||||
}, | |||||
updateOrderClick: function(event) { | |||||
var idOrder = event.currentTarget.getAttribute('data-id-order') ; | |||||
this.idOrderUpdate = idOrder ; | |||||
this.showModalFormOrderUpdate = true ; | |||||
}, | |||||
orderPaymentModalClick: function(event) { | |||||
var idOrder = event.currentTarget.getAttribute('data-id-order') ; | |||||
this.idOrderPayment = idOrder ; | |||||
this.showModalPayment = true ; | |||||
}, | |||||
orderPaymentClick: function(event) { | |||||
var app = this ; | |||||
var idOrder = event.currentTarget.getAttribute('data-id-order') ; | |||||
axios.get(UrlManager.getBaseUrlAbsolute()+"order/ajax-payment",{params: { | |||||
idOrder: this.idOrderPayment, | |||||
type: event.currentTarget.getAttribute('data-type'), | |||||
amount: event.currentTarget.getAttribute('data-amount') | |||||
}}) | |||||
.then(function(response) { | |||||
app.init(app.idActivePointSale) ; | |||||
}) ; | |||||
}, | |||||
orderViewClick: function(event) { | |||||
var currentIdOrderView = event.currentTarget.getAttribute('data-id-order') ; | |||||
if(this.idOrderView == currentIdOrderView) { | |||||
this.showViewProduct = !this.showViewProduct ; | |||||
} | |||||
else { | |||||
this.showViewProduct = true ; | |||||
this.idOrderView = currentIdOrderView ; | |||||
} | |||||
} | |||||
}, | |||||
}); | |||||
Vue.component('modal', { | |||||
template: '#modal-template' | |||||
}) | |||||
Vue.component('order-form',{ | |||||
props: ['date', 'pointsSale', 'users', 'products', 'order'], | |||||
data: function() { | |||||
return { | |||||
errors: [], | |||||
idPointSale: 0, | |||||
idUser: 0, | |||||
username : '', | |||||
comment: '', | |||||
} ; | |||||
}, | |||||
template: '#order-form-template', | |||||
methods: { | |||||
checkForm: function() { | |||||
this.errors = [] ; | |||||
var countProducts = 0 ; | |||||
for(var key in this.order.productOrder) { | |||||
if(this.order.productOrder[key] > 0) { | |||||
countProducts ++ ; | |||||
} | |||||
} | |||||
if(this.order.id_point_sale | |||||
&& (this.order.id_user || (this.order.username && this.order.username.length)) | |||||
&& countProducts > 0) { | |||||
return true ; | |||||
} | |||||
if(!this.order.id_point_sale) { | |||||
this.errors.push('Veuillez sélectionner un point de vente') ; | |||||
} | |||||
if(!this.order.id_user && !this.order.username) { | |||||
this.errors.push('Veuillez sélectionner ou saisir un utilisateur') ; | |||||
} | |||||
if(!countProducts) { | |||||
this.errors.push('Veuillez sélectionner au moins un produit') ; | |||||
} | |||||
}, | |||||
submitFormCreate: function() { | |||||
var app = this ; | |||||
if(this.checkForm()) { | |||||
axios.get(UrlManager.getBaseUrlAbsolute()+"order/ajax-create",{params: { | |||||
date: this.date.getFullYear() + '-' | |||||
+ ('0' + (this.date.getMonth() +1)).slice(-2) + '-' | |||||
+ ('0' + this.date.getDate()).slice(-2), | |||||
idPointSale: this.order.id_point_sale, | |||||
idUser: this.order.id_user, | |||||
username: this.order.username, | |||||
products: JSON.stringify(this.order.productOrder), | |||||
comment: this.order.comment | |||||
}}) | |||||
.then(function(response) { | |||||
app.order.id_point_sale = 0 ; | |||||
app.order.id_user = 0 ; | |||||
app.order.username = '' ; | |||||
app.order.comment = '' ; | |||||
for(i=0 ; i<app.order.productOrder.length ; i++) { | |||||
app.order.productOrder[i] = 0 ; | |||||
} | |||||
app.$emit('ordercreatedupdated') ; | |||||
}) ; | |||||
} | |||||
}, | |||||
submitFormUpdate: function() { | |||||
var app = this ; | |||||
if(this.checkForm()) { | |||||
axios.get(UrlManager.getBaseUrlAbsolute()+"order/ajax-update",{params: { | |||||
date: this.date.getFullYear() + '-' | |||||
+ ('0' + (this.date.getMonth() +1)).slice(-2) + '-' | |||||
+ ('0' + this.date.getDate()).slice(-2), | |||||
idOrder: this.order.id, | |||||
idPointSale: this.order.id_point_sale, | |||||
idUser: this.order.id_user, | |||||
username: ''+this.order.username, | |||||
products: JSON.stringify(this.order.productOrder), | |||||
comment: this.comment | |||||
}}) | |||||
.then(function(response) { | |||||
app.$emit('ordercreatedupdated') ; | |||||
}) ; | |||||
} | |||||
}, | |||||
productQuantityClick: function(id_product, quantity) { | |||||
if(this.order.productOrder[id_product] + quantity >= 0) { | |||||
this.order.productOrder[id_product] += quantity ; | |||||
} | |||||
} | |||||
} | |||||
}) ; |
var app = new Vue({ | |||||
el: '#app-producer-update', | |||||
data: { | |||||
currentSection: 'general', | |||||
sectionsArray: [ | |||||
{ | |||||
name: 'general', | |||||
nameDisplay: 'Général' | |||||
}, | |||||
{ | |||||
name: 'prise-commande', | |||||
nameDisplay: 'Prise de commande' | |||||
}, | |||||
{ | |||||
name: 'abonnements', | |||||
nameDisplay: 'Abonnements' | |||||
}, | |||||
{ | |||||
name: 'credit-payment', | |||||
nameDisplay: 'Crédit / paiement en ligne' | |||||
}, | |||||
{ | |||||
name: 'infos', | |||||
nameDisplay: 'Informations légales' | |||||
} | |||||
] | |||||
}, | |||||
methods: { | |||||
changeSection: function(section) { | |||||
this.currentSection = section.name ; | |||||
} | |||||
} | |||||
}); | |||||
body.skin-black { | |||||
.main-header { | |||||
.logo { | |||||
background-color: white ; | |||||
&:hover { | |||||
background-color: white ; | |||||
} | |||||
.logo-lg { | |||||
img { | |||||
width: 30px ; | |||||
height: 30px ; | |||||
} | |||||
} | |||||
.logo-mini { | |||||
img { | |||||
width: 30px ; | |||||
height: 30px ; | |||||
} | |||||
} | |||||
} | |||||
.navbar { | |||||
background-color: white ; | |||||
.sidebar-toggle { | |||||
color: #333 ; | |||||
} | |||||
.navbar-custom-menu .navbar-nav > li > a, | |||||
.navbar-right > li > a { | |||||
border-left: solid 1px #e0e0e0 ; | |||||
color: #333 ; | |||||
} | |||||
.nav > li > a:hover, .nav > li > a:active, .nav > li > a:focus, | |||||
.nav .open > a, .nav .open > a:hover, .nav .open > a:focus, | |||||
.nav > .active > a { | |||||
color: #FF7F00 ; | |||||
} | |||||
.dropdown-menu { | |||||
@include box-shadow(0px 0px 4px gray) ; | |||||
} | |||||
} | |||||
.logo, .navbar .sidebar-toggle { | |||||
border-right: solid 1px #e0e0e0 ; | |||||
} | |||||
.link-control-sidebar { | |||||
display: none ; | |||||
} | |||||
.notifications-menu { | |||||
ul.menu { | |||||
max-height: 300px ; | |||||
li { | |||||
a { | |||||
padding-top: 4px ; | |||||
padding-bottom: 4px ; | |||||
h5 { | |||||
margin-bottom: 2px ; | |||||
small { | |||||
float: right ; | |||||
} | |||||
} | |||||
p { | |||||
margin-left: 10px ; | |||||
} | |||||
} | |||||
} | |||||
} | |||||
} | |||||
} | |||||
.sidebar-menu > li.active > a { | |||||
border-color: $color1 ; | |||||
} | |||||
.content-wrapper { | |||||
background-color: #f5f5f5 ; | |||||
.content-header { | |||||
background-color: #F5F5F5 ; | |||||
padding-bottom: 15px ; | |||||
border-bottom: solid 1px #e0e0e0 ; | |||||
border-top: solid 1px #e0e0e0 ; | |||||
.btn { | |||||
padding: 3px 6px ; | |||||
font-size: 13px ; | |||||
} | |||||
h1 { | |||||
font-family: 'highvoltageregular' ; | |||||
} | |||||
} | |||||
a { | |||||
color: $color1 ; | |||||
} | |||||
.btn { | |||||
color: white ; | |||||
} | |||||
.btn-default { | |||||
color: #333 ; | |||||
} | |||||
.btn-primary { | |||||
background-color: $color1 ; | |||||
color: white ; | |||||
border-color: $color1 ; | |||||
} | |||||
.alert { | |||||
a { | |||||
color: white ; | |||||
} | |||||
} | |||||
.callout { | |||||
h4 .fa { | |||||
margin-right: 7px ; | |||||
} | |||||
a { | |||||
color: white ; | |||||
} | |||||
.btn { | |||||
color: #333 ; | |||||
text-decoration: none ; | |||||
} | |||||
} | |||||
.table { | |||||
th { | |||||
font-size: 13px ; | |||||
} | |||||
th.column-actions, td.column-actions { | |||||
width: 150px ; | |||||
text-align: right ; | |||||
} | |||||
td.text-small, th.text-small { | |||||
font-size: 12px ; | |||||
} | |||||
} | |||||
.pagination > .active > a, .pagination > .active > span, .pagination > .active > a:hover, .pagination > .active > span:hover, .pagination > .active > a:focus, .pagination > .active > span:focus { | |||||
background-color: $color1 ; | |||||
border: solid 1px $color1 ; | |||||
color: white ; | |||||
} | |||||
.pagination > li > a, .pagination > li > span { | |||||
color: $color1 ; | |||||
&:hover { | |||||
color: darken($color1, 10) ; | |||||
} | |||||
} | |||||
} | |||||
.main-footer { | |||||
a { | |||||
color: $color1 ; | |||||
} | |||||
} | |||||
} | |||||
body.login-page { | |||||
background: none ; | |||||
background-color: $color2 ; | |||||
.login-box { | |||||
.login-logo { | |||||
text-align: center ; | |||||
font-family: 'comfortaalight' ; | |||||
img { | |||||
width: 50px ; | |||||
} | |||||
} | |||||
.login-box-body { | |||||
.btn-primary { | |||||
background-color: $color1 ; | |||||
border-color: $color1 ; | |||||
padding: 5px 10px ; | |||||
&:active { | |||||
background-color: lighten($color1, 5) ; | |||||
border-color: $color1 ; | |||||
} | |||||
} | |||||
a { | |||||
color: $color1 ; | |||||
&:hover { | |||||
color: lighten($color1, 5) ; | |||||
} | |||||
} | |||||
} | |||||
} | |||||
} |
/** | /** | ||||
Copyright La boîte à pain (2018) | |||||
Copyright distrib (2018) | |||||
contact@laboiteapain.net | |||||
contact@opendistrib.net | |||||
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. |
/** | |||||
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. | |||||
*/ | |||||
.distribution-index { | |||||
#wrapper-app-distribution-index { | |||||
display: none ; | |||||
&.loaded { | |||||
display: block ; | |||||
} | |||||
} | |||||
.content-header { | |||||
.date { | |||||
font-weight: bold ; | |||||
} | |||||
} | |||||
#app-distribution-index { | |||||
position: relative ; | |||||
} | |||||
#distribution-date { | |||||
display: none ; | |||||
} | |||||
#loading { | |||||
position: fixed ; | |||||
top: 50% ; | |||||
left: 50% ; | |||||
width: 100px ; | |||||
height: 100px ; | |||||
@include border-radius(50px) ; | |||||
background-color: white ; | |||||
z-index: 10 ; | |||||
@include box-shadow(0px 0px 5px #d0d0d0) ; | |||||
img { | |||||
position: relative ; | |||||
top: 35px ; | |||||
left: 35px ; | |||||
width: 30px ; | |||||
height: 30px ; | |||||
} | |||||
} | |||||
#calendar { | |||||
margin-bottom: 15px ; | |||||
.c-header .c-title-layout .c-title-popover .c-title-anchor .c-title[data-v-2083cb72] { | |||||
font-size: 2rem ; | |||||
} | |||||
.c-day-background { | |||||
//background-color: #F39C12; | |||||
//background-color: white ; | |||||
padding: 16px ; | |||||
//border: solid 1px black !important ; | |||||
//opacity: 1 ; | |||||
} | |||||
.c-day-popover-content { | |||||
font-size: 1.3rem ; | |||||
} | |||||
.c-title { | |||||
text-transform: uppercase ; | |||||
font-family: 'capsuularegular' ; | |||||
} | |||||
} | |||||
#products { | |||||
td.quantities { | |||||
width: 100px; | |||||
text-align: right ; | |||||
} | |||||
input.quantity-max { | |||||
width: 50px ; | |||||
text-align: center ; | |||||
display: inline ; | |||||
} | |||||
} | |||||
#infos-top { | |||||
.col-md-4 { | |||||
padding: 0px ; | |||||
} | |||||
$height-info-box: 96px ; | |||||
.info-box { | |||||
min-height: $height-info-box ; | |||||
height: $height-info-box ; | |||||
.info-box-icon { | |||||
height: $height-info-box ; | |||||
width: 50px ; | |||||
line-height: $height-info-box ; | |||||
i.fa { | |||||
font-size: 30px ; | |||||
} | |||||
} | |||||
.info-box-content { | |||||
margin-left: 55px ; | |||||
.info-box-text { | |||||
font-size: 12px ; | |||||
.btn { | |||||
font-size: 12px ; | |||||
text-transform: uppercase ; | |||||
} | |||||
} | |||||
.info-box-number { | |||||
font-size: 14px ; | |||||
} | |||||
} | |||||
} | |||||
#info-box-distribution { | |||||
.btn-active-week { | |||||
float: right ; | |||||
} | |||||
} | |||||
#summary-ca-weight { | |||||
.normal { | |||||
font-weight: normal ; | |||||
} | |||||
} | |||||
} | |||||
#modal-products { | |||||
table.table { | |||||
thead { | |||||
tr { | |||||
td { | |||||
font-weight: bold ; | |||||
} | |||||
} | |||||
} | |||||
td.quantity-ordered, | |||||
td.quantity-max { | |||||
text-align: center; | |||||
} | |||||
td.quantity-ordered { | |||||
width: 50px ; | |||||
} | |||||
td.quantity-max { | |||||
width: 70px ; | |||||
input { | |||||
text-align: center ; | |||||
} | |||||
} | |||||
} | |||||
} | |||||
#orders { | |||||
position: relative ; | |||||
#btn-add-order { | |||||
position: absolute ; | |||||
top: 9px ; | |||||
right: 10px ; | |||||
} | |||||
#wrapper-nav-points-sale { | |||||
margin-bottom: 10px ; | |||||
ul#nav-points-sale { | |||||
margin: 0px ; | |||||
padding: 0px ; | |||||
list-style-type: none ; | |||||
li { | |||||
float: left ; | |||||
margin-right: 10px ; | |||||
margin-bottom: 10px ; | |||||
a { | |||||
.label { | |||||
background-color: white ; | |||||
border: solid 1px #e0e0e0 ; | |||||
@include border-radius(10px) ; | |||||
} | |||||
} | |||||
} | |||||
} | |||||
} | |||||
table { | |||||
td.column-actions { | |||||
text-align: right ; | |||||
width: 230px ; | |||||
.modal-form-order, | |||||
.modal-payment { | |||||
text-align: left ; | |||||
} | |||||
} | |||||
tr.view { | |||||
ul { | |||||
list-style-type: none ; | |||||
margin-left: 0px ; | |||||
padding-left: 15px ; | |||||
li { | |||||
} | |||||
} | |||||
} | |||||
} | |||||
} | |||||
.modal-form-order { | |||||
table.table-products { | |||||
.product-ordered { | |||||
td { | |||||
background-color: #e9e9e9 ; | |||||
} | |||||
input { | |||||
font-size: 16px ; | |||||
font-weight: bold ; | |||||
} | |||||
} | |||||
td.quantity { | |||||
width: 150px ; | |||||
input { | |||||
text-align: center ; | |||||
color: gray ; | |||||
} | |||||
} | |||||
td.quantity-remaining { | |||||
text-align: right ; | |||||
} | |||||
} | |||||
.actions-form { | |||||
button { | |||||
margin-left: 15px ; | |||||
} | |||||
} | |||||
} | |||||
.modal-payment { | |||||
.info-box { | |||||
.info-box-icon { | |||||
width: 50px ; | |||||
i { | |||||
font-size: 30px ; | |||||
} | |||||
} | |||||
.info-box-content { | |||||
margin-left: 50px ; | |||||
} | |||||
} | |||||
} | |||||
.modal-mask { | |||||
position: fixed; | |||||
z-index: 9998; | |||||
top: 0; | |||||
left: 0; | |||||
width: 100%; | |||||
height: 100%; | |||||
background-color: rgba(0, 0, 0, .5); | |||||
display: table; | |||||
transition: opacity .3s ease; | |||||
} | |||||
.modal-wrapper { | |||||
display: table-cell; | |||||
vertical-align: middle; | |||||
} | |||||
.modal-container { | |||||
width: 70%; | |||||
margin: 0px auto; | |||||
padding: 20px 30px; | |||||
background-color: #fff; | |||||
border-radius: 2px; | |||||
box-shadow: 0 2px 8px rgba(0, 0, 0, .33); | |||||
transition: all .3s ease; | |||||
font-family: Helvetica, Arial, sans-serif; | |||||
} | |||||
.modal-header { | |||||
padding-bottom: 0px ; | |||||
h3 { | |||||
margin-top: 0; | |||||
color: #333; | |||||
text-transform: uppercase ; | |||||
margin-bottom: 0px ; | |||||
} | |||||
} | |||||
.modal-body { | |||||
margin: 20px 0; | |||||
max-height: 300px ; | |||||
height: 300px ; | |||||
overflow-y: scroll ; | |||||
} | |||||
.modal-default-button { | |||||
float: right; | |||||
} | |||||
/* | |||||
* The following styles are auto-applied to elements with | |||||
* transition="modal" when their visibility is toggled | |||||
* by Vue.js. | |||||
* | |||||
* You can easily play with the modal transition by editing | |||||
* these styles. | |||||
*/ | |||||
.modal-enter { | |||||
opacity: 0; | |||||
} | |||||
.modal-leave-active { | |||||
opacity: 0; | |||||
} | |||||
.modal-enter .modal-container, | |||||
.modal-leave-active .modal-container { | |||||
-webkit-transform: scale(1.1); | |||||
transform: scale(1.1); | |||||
} | |||||
} | |||||
/** | /** | ||||
Copyright La boîte à pain (2018) | |||||
Copyright distrib (2018) | |||||
contact@laboiteapain.net | |||||
contact@opendistrib.net | |||||
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. |
/** | /** | ||||
Copyright La boîte à pain (2018) | |||||
Copyright distrib (2018) | |||||
contact@laboiteapain.net | |||||
contact@opendistrib.net | |||||
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. |
.producer-update { | |||||
#nav-params { | |||||
margin-bottom: 30px ; | |||||
button { | |||||
margin-right: 10px ; | |||||
} | |||||
} | |||||
} |
.product-create, | |||||
.product-update { | |||||
#product-active { | |||||
label { | |||||
margin-right: 15px ; | |||||
} | |||||
} | |||||
#days-production { | |||||
.form-group { | |||||
float: left ; | |||||
margin-right: 15px ; | |||||
} | |||||
} | |||||
} | |||||
.product-index { | |||||
.td-photo { | |||||
max-width: 100px ; | |||||
width: 100px ; | |||||
} | |||||
.photo-product { | |||||
max-width: 100px ; | |||||
} | |||||
.ui-state-highlight { | |||||
height: 75px; | |||||
background-color: $color2 ; | |||||
} | |||||
} |
/** | /** | ||||
Copyright La boîte à pain (2018) | |||||
Copyright distrib (2018) | |||||
contact@laboiteapain.net | |||||
contact@opendistrib.net | |||||
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. | ||||
$dir-fonts: '../fonts/' ; | $dir-fonts: '../fonts/' ; | ||||
@import "_fonts.scss" ; | @import "_fonts.scss" ; | ||||
$color1: #BB8757 ; | |||||
$color2: #F8F1DD ; | |||||
$color1: #FF7F00 ; | |||||
$color2: white ; | |||||
.clr { | .clr { | ||||
clear: both ; | clear: both ; | ||||
z-index: 1031 ; | z-index: 1031 ; | ||||
} | } | ||||
.pagination > .active > a, .pagination > .active > span, .pagination > .active > a:hover, .pagination > .active > span:hover, .pagination > .active > a:focus, .pagination > .active > span:focus { | |||||
background-color: $color1 ; | |||||
border: solid 1px $color1 ; | |||||
} | |||||
.pagination > li > a, .pagination > li > span { | |||||
color: $color1 ; | |||||
&:hover { | |||||
color: darken($color1, 10) ; | |||||
} | |||||
} | |||||
.wrap { | .wrap { | ||||
.btn-primary, | |||||
.btn-success { | |||||
.btn-primary { | |||||
background: none ; | background: none ; | ||||
background-color: $color1 ; | background-color: $color1 ; | ||||
border: solid 1px $color1 ; | border: solid 1px $color1 ; | ||||
} | } | ||||
} | } | ||||
.nom-boulange { | |||||
.name-producer { | |||||
//font-family: 'Georgia' ; | //font-family: 'Georgia' ; | ||||
margin-bottom: 15px ; | margin-bottom: 15px ; | ||||
text-align: left ; | text-align: left ; | ||||
border-bottom: solid 1px #e0e0e0 ; | border-bottom: solid 1px #e0e0e0 ; | ||||
@include box-shadow(0px 0px 5px gray) ; | @include box-shadow(0px 0px 5px gray) ; | ||||
#etat-paiement-etablissement { | |||||
float: right ; | |||||
text-align: right ; | |||||
color: darken($color1,15) ; | |||||
font-size: 16px ; | |||||
.strong { | |||||
background-color: white ; | |||||
color: $color1 ; | |||||
@include border-radius(10px) ; | |||||
padding: 0px 10px ; | |||||
} | |||||
.btn { | |||||
padding: 2px 5px ; | |||||
} | |||||
} | |||||
#select-etablissement { | |||||
#select-producer { | |||||
float: left ; | float: left ; | ||||
font-size: 15px ; | font-size: 15px ; | ||||
} | } | ||||
a { | a { | ||||
margin-right: 5px ; | margin-right: 5px ; | ||||
margin-left: 5px ; | margin-left: 5px ; | ||||
//text-transform: uppercase ; | |||||
color: gray ; | color: gray ; | ||||
} | } | ||||
} | } | ||||
} | } | ||||
} | } | ||||
a.btn, button.btn { | |||||
position: relative ; | |||||
.glyphicon-triangle-bottom { | |||||
display: none; | |||||
position: absolute; | |||||
top: 26px; | |||||
left: 50%; | |||||
margin-left: -10px; | |||||
font-size: 20px; | |||||
color: #FF7F00; | |||||
} | |||||
&.btn-primary { | |||||
.glyphicon-triangle-bottom { | |||||
display: block ; | |||||
} | |||||
} | |||||
} | |||||
// liste de commandes | // liste de commandes | ||||
.site-index, .user-commandes { | .site-index, .user-commandes { | ||||
#dernieres-commandes, #historique-commandes { | |||||
#last-orders, #history-orders { | |||||
tr.commande-update { | |||||
tr.order-update { | |||||
td { | td { | ||||
background-color: $color2 ; | background-color: $color2 ; | ||||
} | } | ||||
} | } | ||||
} | } | ||||
tr.commande-delete { | |||||
tr.order-delete { | |||||
td { | td { | ||||
background-color: lighten(#C9302C, 40); | background-color: lighten(#C9302C, 40); | ||||
} | } | ||||
} | } | ||||
} | } | ||||
td.historique { | |||||
td.history { | |||||
min-width: 170px ; | min-width: 170px ; | ||||
.small { | .small { | ||||
margin-bottom: 7px ; | margin-bottom: 7px ; | ||||
} | } | ||||
strong { | strong { | ||||
//margin-left: 15px ; | |||||
} | } | ||||
/*.label { | |||||
color: gray ; | |||||
border: solid 1px gray ; | |||||
}*/ | |||||
} | } | ||||
.small, .localite { | |||||
.small, .locality { | |||||
font-size: 12px ; | font-size: 12px ; | ||||
color: gray ; | color: gray ; | ||||
} | } | ||||
.commentaire { | |||||
.comment { | |||||
font-size: 12px ; | font-size: 12px ; | ||||
} | } | ||||
.date { | .date { | ||||
text-align: center ; | text-align: center ; | ||||
.bloc-date { | |||||
width: 50% ; | |||||
margin: 0px auto ; | |||||
padding-top: 0px ; | |||||
} | |||||
.jour { | |||||
text-transform: capitalize ; | |||||
line-height: 13px ; | |||||
font-size: 10px ; | |||||
text-transform: uppercase ; | |||||
} | |||||
.num { | |||||
font-size: 23px ; | |||||
line-height: 28px ; | |||||
font-weight: bold ; | |||||
} | |||||
.mois { | |||||
text-transform: uppercase ; | |||||
line-height: 13px ; | |||||
font-size: 15px ; | |||||
} | |||||
} | } | ||||
} | } | ||||
} | } | ||||
float: right ; | float: right ; | ||||
font-family: 'myriadpro-regular' ; | font-family: 'myriadpro-regular' ; | ||||
&.btn-success { | |||||
background-color: #5cb85c ; | |||||
color: white ; | |||||
border-color: #5cb85c ; | |||||
} | |||||
&.margin-left { | &.margin-left { | ||||
margin-left: 5px ; | margin-left: 5px ; | ||||
} | } | ||||
} | } | ||||
} | } | ||||
#facturation { | |||||
#billing { | |||||
h2 { | h2 { | ||||
font-size: 25px ; | font-size: 25px ; | ||||
text-align: center ; | text-align: center ; | ||||
} | } | ||||
.mois-en-cours { | |||||
.montant span { | |||||
.current-month { | |||||
.amount span { | |||||
background-color: white ; | background-color: white ; | ||||
color: #333 ; | color: #333 ; | ||||
border: solid 1px gray ; | border: solid 1px gray ; | ||||
} | } | ||||
} | } | ||||
.montant { | |||||
.amount { | |||||
margin-top: 35px ; | margin-top: 35px ; | ||||
text-align: center ; | text-align: center ; | ||||
span { | span { | ||||
} | } | ||||
#page-commande { | |||||
#page-order { | |||||
#row2 { | #row2 { | ||||
} | } | ||||
h1 { | h1 { | ||||
.btn-group { | |||||
float: right ; | |||||
} | |||||
.btn-group { | |||||
float: right ; | |||||
} | |||||
} | } | ||||
#col-left, #col-right { | #col-left, #col-right { | ||||
} | } | ||||
#calendar { | #calendar { | ||||
h2 { | h2 { | ||||
font-size: 20px ; | font-size: 20px ; | ||||
position: relative ; | position: relative ; | ||||
font-size: 13px ; | font-size: 13px ; | ||||
} | } | ||||
.btn-success { | |||||
background-color: #5cb85c ; | |||||
border-color: #4cae4c ; | |||||
} | |||||
#productions-point-vente { | #productions-point-vente { | ||||
margin-top: 15px ; | margin-top: 15px ; | ||||
padding: 10px ; | padding: 10px ; | ||||
#produits-production { | #produits-production { | ||||
.overflow { | .overflow { | ||||
//max-height: 400px ; | |||||
//overflow-y: scroll ; | |||||
table { | table { | ||||
width: 100%; | width: 100%; | ||||
thead th { | thead th { | ||||
height: 30px; | height: 30px; | ||||
/*text-align: left;*/ | |||||
} | } | ||||
tbody { | tbody { | ||||
.td-produit { | .td-produit { | ||||
width: 60% ; | width: 60% ; | ||||
} | } | ||||
.td-actif, .td-max { | |||||
.td-active, .td-max { | |||||
width: 20% ; | width: 20% ; | ||||
text-align: center ; | text-align: center ; | ||||
} | } | ||||
thead { | thead { | ||||
.td-produit { | |||||
.td-product { | |||||
width: 57% ; | width: 57% ; | ||||
} | } | ||||
} | } | ||||
} | } | ||||
input.quantite-max { | |||||
input.quantity-max { | |||||
background-color: white; | background-color: white; | ||||
border: 1px solid #e0e0e0; | border: 1px solid #e0e0e0; | ||||
text-align: center; | text-align: center; | ||||
} | } | ||||
#bloc-totaux { | #bloc-totaux { | ||||
.table-produits { | |||||
.table-products { | |||||
.depasse { | .depasse { | ||||
color: #b32815 ; | color: #b32815 ; | ||||
} | } | ||||
display: none; | display: none; | ||||
} | } | ||||
} | } | ||||
.recettes { | .recettes { | ||||
float: right ; | float: right ; | ||||
color: $color1 ; | color: $color1 ; | ||||
//background-color: $color1 ; | |||||
border: solid 1px $color1 ; | border: solid 1px $color1 ; | ||||
padding: 4px 10px ; | padding: 4px 10px ; | ||||
@include border-radius(10px) ; | @include border-radius(10px) ; | ||||
font-weight: bold ; | font-weight: bold ; | ||||
} | } | ||||
} | } | ||||
.alert.commentaire { | |||||
.alert.comment { | |||||
display: none ; | display: none ; | ||||
} | } | ||||
list-style-type: none ; | list-style-type: none ; | ||||
height: 100% ; | height: 100% ; | ||||
max-height: 400px ; | max-height: 400px ; | ||||
//border: solid 1px #e0e0e0 ; | |||||
margin-left: 0 ; | margin-left: 0 ; | ||||
padding-left: 0 ; | padding-left: 0 ; | ||||
margin-top: 0px ; | margin-top: 0px ; | ||||
@include border-radius(0px) ; | @include border-radius(0px) ; | ||||
display: block ; | display: block ; | ||||
padding: 7px ; | padding: 7px ; | ||||
//border-bottom: solid 1px #e0e0e0 ; | |||||
color: #333 ; | color: #333 ; | ||||
.montant { | .montant { | ||||
&:hover, &:active, &.active { | &:hover, &:active, &.active { | ||||
text-decoration: none ; | text-decoration: none ; | ||||
//background-color: #F5F5F5 ; | |||||
//background-color: lighten($color2,5) ; | |||||
background-color: #FCF8E3 ; | background-color: #FCF8E3 ; | ||||
//border-right: solid 3px $color1 ; | |||||
outline: none ; | outline: none ; | ||||
border-color: #ccc ; | border-color: #ccc ; | ||||
@include transition(all 0.1s) ; | @include transition(all 0.1s) ; | ||||
} | } | ||||
table.table-produits { | table.table-produits { | ||||
.td-commande { | |||||
.td-order { | |||||
text-align: center ; | text-align: center ; | ||||
} | } | ||||
input.form-control { | input.form-control { | ||||
//width: 100px ; | |||||
text-align: center ; | text-align: center ; | ||||
} | } | ||||
tr.disabled { | tr.disabled { | ||||
.td-produit { | |||||
.td-product { | |||||
color: gray ; | color: gray ; | ||||
} | } | ||||
} | } | ||||
} | } | ||||
} | } | ||||
.panel-commande-automatique { | |||||
.field-commandeautoform-id_user, | |||||
.field-commandeautoform-id_etablissement | |||||
.panel-commande-auto { | |||||
.field-subscriptionform-id_user, | |||||
.field-subscriptionform-id_producer | |||||
{ | { | ||||
display: none ; | display: none ; | ||||
} | } | ||||
.jours { | |||||
.days { | |||||
.form-group { | .form-group { | ||||
float: left ; | float: left ; | ||||
margin-right: 10px ; | margin-right: 10px ; | ||||
border-bottom: solid 1px #e0e0e0 ; | border-bottom: solid 1px #e0e0e0 ; | ||||
} | } | ||||
.title-point-vente { | |||||
.title-point-sale { | |||||
background-color: lighten(#fdd44b, 30) ; | background-color: lighten(#fdd44b, 30) ; | ||||
border-left: solid 3px $color1 ; | border-left: solid 3px $color1 ; | ||||
font-weight: bold ; | font-weight: bold ; | ||||
padding: 10px ; | padding: 10px ; | ||||
} | } | ||||
.title-totaux { | |||||
.title-totals { | |||||
text-align: center ; | text-align: center ; | ||||
} | } | ||||
border-right: solid 1px #e0e0e0 ; | border-right: solid 1px #e0e0e0 ; | ||||
} | } | ||||
input.quantite { | |||||
//width: 50px ; | |||||
input.quantity { | |||||
width: 30px ; | width: 30px ; | ||||
background-color: white ; | background-color: white ; | ||||
border: solid 1px #e0e0e0 ; | border: solid 1px #e0e0e0 ; | ||||
text-align: center ; | text-align: center ; | ||||
} | } | ||||
.td-produit { | |||||
.td-product { | |||||
text-align: center ; | text-align: center ; | ||||
} | } | ||||
.submit-pv { | |||||
.submit-point-sale { | |||||
float: right ; | float: right ; | ||||
} | } | ||||
border: solid 1px #e0e0e0 ; | border: solid 1px #e0e0e0 ; | ||||
} | } | ||||
.date-commande { | |||||
.date-order { | |||||
font-size: 12px ; | font-size: 12px ; | ||||
} | } | ||||
text-align: center ; | text-align: center ; | ||||
} | } | ||||
.depasse { | .depasse { | ||||
color: #b32815 ; | color: #b32815 ; | ||||
} | } | ||||
font-weight: normal ; | font-weight: normal ; | ||||
font-size: 13px ; | font-size: 13px ; | ||||
} | } | ||||
.vrac { | |||||
display: none ; | |||||
} | |||||
td.client { | |||||
td.user { | |||||
text-align: left ; | text-align: left ; | ||||
padding: 3px ; | padding: 3px ; | ||||
.date-commande { | |||||
.date-order { | |||||
color: gray ; | color: gray ; | ||||
} | } | ||||
} | } | ||||
} | } | ||||
#email-masse-form { | |||||
#ids-users { | |||||
line-height: 30px ; | |||||
.label { | |||||
text-transform: capitalize ; | |||||
} | |||||
} | |||||
} | |||||
.produit-create, .produit-update { | |||||
#jours-production { | |||||
.product-create, .product-update { | |||||
#days-distribution { | |||||
.form-group { | .form-group { | ||||
float: left ; | float: left ; | ||||
margin-right: 15px ; | margin-right: 15px ; | ||||
} | } | ||||
} | } | ||||
} | } | ||||
.field-produit-id_etablissement { | |||||
.field-product-id_producer { | |||||
display: none; | display: none; | ||||
} | } | ||||
} | } | ||||
background-color: white ; | background-color: white ; | ||||
} | } | ||||
.wrap .produit-index { | |||||
.td-photo { | |||||
max-width: 100px ; | |||||
width: 100px ; | |||||
} | |||||
.photo-produit { | |||||
max-width: 100px ; | |||||
} | |||||
.ui-state-highlight { | |||||
height: 75px; | |||||
background-color: $color2 ; | |||||
} | |||||
} | |||||
/* communiquer */ | /* communiquer */ | ||||
.communiquer-mode-emploi { | |||||
.communicate-instructions { | |||||
border: solid 1px #e0e0e0 ; | border: solid 1px #e0e0e0 ; | ||||
padding: 10px ; | padding: 10px ; | ||||
@include border-radius(10px) ; | @include border-radius(10px) ; | ||||
margin-bottom: 30px ; | margin-bottom: 30px ; | ||||
font-family: 'myriadpro-regular' ; | |||||
font-family: 'Arial' ; | |||||
.header { | .header { | ||||
.logo { | .logo { | ||||
display: none ; | |||||
float: left ; | float: left ; | ||||
width: 75px ; | width: 75px ; | ||||
padding-right: 20px ; | padding-right: 20px ; | ||||
img { | img { | ||||
width: 75px ; | width: 75px ; | ||||
} | } | ||||
} | } | ||||
h1 { | h1 { | ||||
font-family: 'comfortaaregular' ; | |||||
font-family: 'highvoltageregular' ; | |||||
font-size: 40px ; | font-size: 40px ; | ||||
margin-top: 0px ; | margin-top: 0px ; | ||||
margin-bottom: 0px ; | margin-bottom: 0px ; | ||||
h2 { | h2 { | ||||
margin-top: 0px ; | margin-top: 0px ; | ||||
font-family: 'myriadpro-regular' ; | |||||
font-family: 'capsuularegular' ; | |||||
font-size: 20px ; | font-size: 20px ; | ||||
margin-top: 0px ; | margin-top: 0px ; | ||||
position: relative ; | position: relative ; | ||||
} | } | ||||
h3 { | h3 { | ||||
font-family: 'comfortaalight' ; | |||||
font-family: 'myriadpro-regular' ; | |||||
font-size: 25px ; | |||||
font-size: 20px ; | |||||
color: $color1 ; | color: $color1 ; | ||||
margin-top: 0px ; | margin-top: 0px ; | ||||
margin-bottom: 0px ; | margin-bottom: 0px ; | ||||
} | } | ||||
} | } | ||||
.communiquer-mode-emploi-encart { | |||||
.communicate-instructions-inset { | |||||
width: 420px ; | width: 420px ; | ||||
margin-top: 20px ; | margin-top: 20px ; | ||||
.header { | .header { | ||||
} | } | ||||
} | } | ||||
.bloc-mode-emploi-pdf { | |||||
.block-instructions-pdf { | |||||
width: 49.9% ; | width: 49.9% ; | ||||
float: left; | float: left; | ||||
border-bottom: dotted 1px gray ; | border-bottom: dotted 1px gray ; | ||||
} | } | ||||
.bloc-mode-emploi-border { | |||||
.block-instructions-border { | |||||
border-right: dotted 1px gray ; | border-right: dotted 1px gray ; | ||||
border-bottom: dotted 1px gray ; | border-bottom: dotted 1px gray ; | ||||
} | } | ||||
.communiquer-mode-emploi-pdf { | |||||
.communicate-instructions-pdf { | |||||
border: 0px none ; | border: 0px none ; | ||||
//border-bottom: dotted 1px gray ; | //border-bottom: dotted 1px gray ; | ||||
@include border-radius(0px) ; | @include border-radius(0px) ; | ||||
} | } | ||||
} | } | ||||
.bloc-mode-emploi-bottom { | |||||
.block-instructions-bottom { | |||||
border-bottom: 0px none ; | border-bottom: 0px none ; | ||||
border-bottom: solid 1px white; | border-bottom: solid 1px white; | ||||
} | } | ||||
/* commandes auto */ | |||||
/* abonnements */ | |||||
.commandeauto-form { | |||||
.subscription-form { | |||||
#bloc-select-user { | |||||
#block-select-user { | |||||
padding-left: 0px ; | padding-left: 0px ; | ||||
} | } | ||||
} | } | ||||
} | } | ||||
.field-commandeautoform-id_etablissement { | |||||
.field-subscriptionform-id_producer { | |||||
display: none ; | display: none ; | ||||
} | } | ||||
.jours { | |||||
.days { | |||||
.form-group { | .form-group { | ||||
float: left; | float: left; | ||||
margin-right: 20px ; | margin-right: 20px ; | ||||
} | } | ||||
} | } | ||||
.produits { | |||||
.products { | |||||
.table { | .table { | ||||
width: 500px ; | width: 500px ; | ||||
} | } | ||||
.quantite { | |||||
.quantity { | |||||
text-align: center ; | text-align: center ; | ||||
} | } | ||||
} | } | ||||
/* points de vente */ | /* points de vente */ | ||||
.point-vente-form { | |||||
#pointvente-users { | |||||
.point-sale-form { | |||||
#pointsale-users { | |||||
display: none ; | display: none ; | ||||
height: 500px ; | height: 500px ; | ||||
overflow-y: scroll ; | overflow-y: scroll ; | ||||
font-weight: normal ; | font-weight: normal ; | ||||
display: block ; | display: block ; | ||||
} | } | ||||
.commentaire { | |||||
.comment { | |||||
display: none ; | display: none ; | ||||
margin-left: 17px ; | margin-left: 17px ; | ||||
width: 200px ; | width: 200px ; | ||||
} | } | ||||
} | } | ||||
#jours-livraison { | |||||
#delivery-days { | |||||
.form-group { | .form-group { | ||||
float: left ; | float: left ; | ||||
margin-right: 15px ; | margin-right: 15px ; | ||||
/* utilisateurs */ | /* utilisateurs */ | ||||
#menu-users { | |||||
#nav-points-sale { | |||||
margin-bottom: 30px ; | |||||
} | |||||
#submenu { | |||||
margin-bottom: 30px ; | |||||
text-align: center ; | |||||
} | |||||
} | |||||
.user-index { | .user-index { | ||||
.input-group { | .input-group { | ||||
width: 180px ; | width: 180px ; | ||||
text-align: center ; | text-align: center ; | ||||
} | } | ||||
} | } | ||||
#tabs-points-vente { | |||||
margin-bottom: 20px ; | |||||
} | |||||
.btn-liste-emails { | |||||
float: right ; | |||||
position: relative ; | |||||
top: -8px ; | |||||
} | |||||
} | } | ||||
.user-credit { | .user-credit { | ||||
/* facturation */ | /* facturation */ | ||||
#estimation-facture { | |||||
#free-price { | |||||
padding: 20px ; | padding: 20px ; | ||||
background-color: #F9F9F9 ; | background-color: #F9F9F9 ; | ||||
h2 { | h2 { | ||||
font-family: 'myriadpro-it' ; | font-family: 'myriadpro-it' ; | ||||
} | } | ||||
.montant { | |||||
.amount { | |||||
span { | span { | ||||
font-size: 25px ; | font-size: 25px ; | ||||
color: white ; | color: white ; | ||||
} | } | ||||
} | } | ||||
.field-etablissement-prix_libre { | |||||
.field-producer-free_price { | |||||
.input-group { | .input-group { | ||||
width: 200px ; | width: 200px ; | ||||
} | } | ||||
} | } | ||||
.field-user-prix_libre { | |||||
.field-user-free_price { | |||||
label { | label { | ||||
display: none ; | display: none ; | ||||
} | } | ||||
} | } | ||||
#etablissement-prix_libre { | |||||
#producer-free_price { | |||||
width: 100px ; | width: 100px ; | ||||
height: 60px ; | height: 60px ; | ||||
font-size: 30px ; | font-size: 30px ; | ||||
} | } | ||||
} | } | ||||
.developpement-index { | |||||
ul#tabs-statuts-developpements { | |||||
.development-index { | |||||
ul#tabs-status-developments { | |||||
margin-bottom: 30px ; | margin-bottom: 30px ; | ||||
border-bottom: solid 3px $color1 ; | border-bottom: solid 3px $color1 ; | ||||
} | } | ||||
} | } | ||||
#tab-developpements { | |||||
.btn-group-priorite { | |||||
#tab-developments { | |||||
.btn-group-priority { | |||||
width: 100% ; | width: 100% ; | ||||
margin-bottom: 5px ; | margin-bottom: 5px ; | ||||
.btn-priorite { | |||||
.btn-priority { | |||||
display: block ; | display: block ; | ||||
float: none ; | float: none ; | ||||
width: 100% ; | width: 100% ; | ||||
} | } | ||||
} | } | ||||
.label-priorite { | |||||
.label-priority { | |||||
display: block ; | display: block ; | ||||
width: 100% ; | width: 100% ; | ||||
margin-bottom: 2px ; | margin-bottom: 2px ; | ||||
/* stats */ | /* stats */ | ||||
.stats-produits { | |||||
.stats-products { | |||||
#nav-year { | #nav-year { | ||||
float: right ; | float: right ; | ||||
} | } | ||||
tr.mois { | |||||
tr.month { | |||||
th { | th { | ||||
text-align: center ; | text-align: center ; | ||||
} | } | ||||
} | } | ||||
} | } | ||||
td.nom { | |||||
td.name { | |||||
text-transform: uppercase ; | text-transform: uppercase ; | ||||
} | } | ||||
td.align-center { | td.align-center { | ||||
text-align: center ; | text-align: center ; | ||||
} | } | ||||
} | |||||
} | |||||
@import "_adminlte.scss" ; | |||||
@import "site/_index.scss" ; | |||||
@import "subscription/_index.scss" ; | |||||
@import "product/_index.scss" ; | |||||
@import "product/_form.scss" ; | |||||
@import "stats/_products.scss" ; | |||||
@import "distribution/_index.scss" ; | |||||
@import "user/_emails.scss" ; | |||||
@import "producer/_update.scss" ; |
.site-index { | |||||
#distributions { | |||||
.info-box { | |||||
.date { | |||||
text-transform: uppercase ; | |||||
font-size: 12px ; | |||||
line-height: 20px ; | |||||
padding-top: 10px ; | |||||
span { | |||||
display: block ; | |||||
} | |||||
.day { | |||||
} | |||||
.num { | |||||
font-size: 30px ; | |||||
padding-top: 5px ; | |||||
padding-bottom: 5px ; | |||||
} | |||||
.month { | |||||
} | |||||
} | |||||
} | |||||
.info-box-content { | |||||
.buttons { | |||||
margin-top: 10px ; | |||||
} | |||||
} | |||||
} | |||||
} |
.stats-products { | |||||
//width: 100% ; | |||||
//overflow-x: scroll ; | |||||
} |
.subscription-index { | |||||
.table { | |||||
.column-auto-payment { | |||||
width: 50px ; | |||||
} | |||||
} | |||||
} |