Browse Source

Merge branch 'dev'

master
Guillaume Bourgeois 6 years ago
parent
commit
9e30b2fc43
38 changed files with 826 additions and 1231 deletions
  1. +2
    -1
      backend/controllers/BackendController.php
  2. +170
    -42
      backend/controllers/CommandeController.php
  3. +45
    -19
      backend/controllers/CommandeautoController.php
  4. +20
    -5
      backend/controllers/CommuniquerController.php
  5. +21
    -4
      backend/controllers/CronController.php
  6. +22
    -8
      backend/controllers/DeveloppementController.php
  7. +33
    -7
      backend/controllers/EtablissementAdminController.php
  8. +28
    -5
      backend/controllers/EtablissementController.php
  9. +0
    -136
      backend/controllers/PaiementController.php
  10. +34
    -31
      backend/controllers/PointVenteController.php
  11. +37
    -31
      backend/controllers/ProduitController.php
  12. +38
    -8
      backend/controllers/SiteController.php
  13. +20
    -6
      backend/controllers/StatsController.php
  14. +44
    -14
      backend/controllers/UserController.php
  15. +0
    -231
      backend/controllers/VracController.php
  16. +0
    -1
      backend/models/MailForm.php
  17. +0
    -73
      backend/views/point-vente/view.php
  18. +0
    -79
      backend/views/produit/view.php
  19. +0
    -72
      backend/views/vrac/_form.php
  20. +0
    -57
      backend/views/vrac/create.php
  21. +0
    -73
      backend/views/vrac/index.php
  22. +0
    -57
      backend/views/vrac/update.php
  23. +0
    -79
      backend/views/vrac/view.php
  24. +11
    -10
      backend/web/js/lechatdesnoisettes.js
  25. +12
    -6
      common/components/MyView.php
  26. +4
    -2
      common/controllers/CommonController.php
  27. +42
    -39
      common/helpers/CSV.php
  28. +4
    -2
      common/helpers/Mail.php
  29. +2
    -1
      common/helpers/Price.php
  30. +4
    -2
      common/helpers/Upload.php
  31. +2
    -1
      common/helpers/Url.php
  32. +2
    -1
      frontend/controllers/FrontendController.php
  33. +109
    -20
      frontend/controllers/SiteController.php
  34. +8
    -10
      frontend/controllers/UserController.php
  35. +0
    -65
      frontend/views/user/credit.php
  36. +79
    -16
      producer/controllers/CommandeController.php
  37. +16
    -5
      producer/controllers/ProducerBaseController.php
  38. +17
    -12
      producer/controllers/SiteController.php

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



namespace backend\controllers; namespace backend\controllers;


class BackendController extends \common\controllers\CommonController {
class BackendController extends \common\controllers\CommonController
{
} }



+ 170
- 42
backend/controllers/CommandeController.php View File



namespace backend\controllers; namespace backend\controllers;


class CommandeController extends BackendController {
class CommandeController extends BackendController
{


var $enableCsrfValidation = false; var $enableCsrfValidation = false;


public function behaviors() {
public function behaviors()
{
return [ return [
'access' => [ 'access' => [
'class' => AccessControl::className(), 'class' => AccessControl::className(),
]; ];
} }


public function actionReportCron($date = '', $save = false, $id_etablissement = 0, $key = '') {
if ($key == '64ac0bdab7e9f5e48c4d991ec5201d57') {
$this->actionReport($date, $save, $id_etablissement);
}
}

public function actionReport($date = '', $save = false, $id_etablissement = 0) {

/**
* 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 $id_etablissement
* @return PDF|null
*/
public function actionReport($date = '', $save = false, $id_etablissement = 0)
{
if (!Yii::$app->user->isGuest) if (!Yii::$app->user->isGuest)
$id_etablissement = Yii::$app->user->identity->id_etablissement; $id_etablissement = Yii::$app->user->identity->id_etablissement;


// return the pdf output as per the destination setting // return the pdf output as per the destination setting
return $pdf->render(); return $pdf->render();
} }
return null ;
} }


public function actionDeleteCommande($date, $id_commande) {
/**
* Supprime une commande.
*
* @param string $date
* @param integer $id_commande
*/
public function actionDeleteCommande($date, $id_commande)
{


$commande = Commande::find() $commande = Commande::find()
->with(['production', 'commandeProduits']) ->with(['production', 'commandeProduits'])
$this->redirect(['index', 'date' => $date]); $this->redirect(['index', 'date' => $date]);
} }


public function gestionFormCommandes($production, $date, $points_vente, $produits, $users) {
/**
* Traite le formulaire d'ajout/modification de commande.
*
* @param Production $production
* @param string $date
* @param array $points_vente
* @param array $produits
* @param array $users
*/
public function gestionFormCommandes(
$production, $date, $points_vente, $produits, $users)
{


if ($date != '') { if ($date != '') {
// commandes // commandes
} }
} }


public function actionIndex($date = '', $return_data = false) {
/**
* Page principale de la gestion des commandes.
*
* @param string $date
* @param boolean $return_data
* @return string
*/
public function actionIndex($date = '', $return_data = false)
{


if (!Produit::count() && !PointVente::count()) { if (!Produit::count() && !PointVente::count()) {
$this->redirect(['site/index', 'erreur_produits_points_vente' => 1]); $this->redirect(['site/index', 'erreur_produits_points_vente' => 1]);
} }
} }


public function actionDownload($date = '', $id_point_vente = 0, $global = 0) {

/**
* Génère un fichier d'export des commandes au format CSV.
*
* @param string $date
* @param integer $id_point_vente
* @param boolean $global
*/
public function actionDownload($date = '', $id_point_vente = 0, $global = 0)
{
// commandes // commandes
$commandes = Commande::find() $commandes = Commande::find()
->with('commandeProduits', 'user') ->with('commandeProduits', 'user')
} }
} }


public function contentRecapCSV($date, $produits, $points_vente, $commandes) {

/**
* Génère le contenu nécessaire aux exports au format CSV.
*
* @see CommandeController::actionDownload()
* @param string $date
* @param array $produits
* @param array $points_vente
* @param array $commandes
* @return array
*/
public function contentRecapCSV($date, $produits, $points_vente, $commandes)
{
$data = []; $data = [];
$filename = 'recapitulatif_' . $date; $filename = 'recapitulatif_' . $date;


]; ];
} }


public function contentPointVenteCSV($date, $produits, $points_vente, $id_point_vente) {
/**
* Génère le contenu relatif aux points de vente nécessaires aux exports au
* format CSV.
*
* @param string $date
* @param array $produits
* @param array $points_vente
* @param integer $id_point_vente
* @return array
*/
public function contentPointVenteCSV($date, $produits, $points_vente, $id_point_vente)
{


$data = []; $data = [];


]; ];
} }
public function actionAddCommandesAuto($date) {
/**
* Ajoute les commandes récurrentes pour une date donnée.
*
* @param string $date
*/
public function actionAddCommandesAuto($date)
{
CommandeAuto::addAll($date, true); CommandeAuto::addAll($date, true);
$this->redirect(['index', 'date' => $date]); $this->redirect(['index', 'date' => $date]);
} }


public function actionChangeState($date, $actif, $redirect = true) {
/**
* Change l'état d'un jour de production (activé, désactivé).
*
* @param string $date
* @param integer $actif
* @param boolean $redirect
*/
public function actionChangeState($date, $actif, $redirect = true)
{
// changement état // changement état
$production = Production::initProduction($date) ; $production = Production::initProduction($date) ;
$production->actif = $actif; $production->actif = $actif;
CommandeAuto::addAll($date); CommandeAuto::addAll($date);
} }


if($redirect)
if($redirect) {
$this->redirect(['index', 'date' => $date]); $this->redirect(['index', 'date' => $date]);
}
} }
public function actionChangeStateSemaine($date, $actif) {
/**
* Change l'état d'une semaine de production (activé, désactivé).
*
* @param string $date
* @param integer $actif
*/
public function actionChangeStateSemaine($date, $actif)
{
$week = sprintf('%02d',date('W',strtotime($date))); $week = sprintf('%02d',date('W',strtotime($date)));
$start = strtotime(date('Y',strtotime($date)).'W'.$week); $start = strtotime(date('Y',strtotime($date)).'W'.$week);
$date_lundi = date('Y-m-d',strtotime('Monday',$start)) ; $date_lundi = date('Y-m-d',strtotime('Monday',$start)) ;
$this->redirect(['index', 'date' => $date]); $this->redirect(['index', 'date' => $date]);
} }


public function actionChangeLivraison($date, $livraison) {
$production = Production::find()->where(['date' => $date])->one();
$production->livraison = $livraison;
$production->save();
$this->redirect(['index', 'date' => $date]);
}

public function actionAjaxUpdate($id_commande, $produits, $date, $commentaire) {
/**
* Met à jour une commande via une requête AJAX.
*
* @param integer $id_commande
* @param array $produits
* @param string $date
* @param string $commentaire
*/
public function actionAjaxUpdate(
$id_commande, $produits, $date, $commentaire)
{
$commande = Commande::find()->with('production', 'creditHistorique', 'user')->where(['id' => $id_commande])->one(); $commande = Commande::find()->with('production', 'creditHistorique', 'user')->where(['id' => $id_commande])->one();


if ($commande && if ($commande &&
} }
} }


public function actionAjaxDelete($date, $id_commande) {
/**
* Supprime une commande via une requête AJAX.
*
* @param string $date
* @param integer $id_commande
*/
public function actionAjaxDelete($date, $id_commande)
{
$commande = Commande::find() $commande = Commande::find()
->with(['production', 'commandeProduits']) ->with(['production', 'commandeProduits'])
->where(['id' => $id_commande]) ->where(['id' => $id_commande])
die(); die();
} }


public function actionAjaxCreate($date, $id_pv, $id_user, $username, $produits, $commentaire) {
/**
* Crée une commande via une requête AJAX.
*
* @param string $date
* @param integer $id_pv
* @param integer $id_user
* @param string $username
* @param array $produits
* @param string $commentaire
*/
public function actionAjaxCreate(
$date, $id_pv, $id_user, $username, $produits, $commentaire)
{
$produits = json_decode($produits); $produits = json_decode($produits);
$point_vente = PointVente::findOne($id_pv); $point_vente = PointVente::findOne($id_pv);
$production = Production::findOne([ $production = Production::findOne([
} }
} }


/**
* Retourne un récapitulatif du total des commandes (potentiel, commandé et
* par produits) au format HTML;
*
* @param string $date
*/
public function actionAjaxTotalCommandes($date) { public function actionAjaxTotalCommandes($date) {


$production = Production::find() $production = Production::find()
->andWhere(['id_etablissement' => Yii::$app->user->identity->id_etablissement]) ->andWhere(['id_etablissement' => Yii::$app->user->identity->id_etablissement])
->one(); ->one();



if ($production) { if ($production) {
// produits // produits
$produits = Produit::find() $produits = Produit::find()
->orderBy('order ASC') ->orderBy('order ASC')
->all(); ->all();




// commandes // commandes
$commandes = Commande::find() $commandes = Commande::find()
->with('commandeProduits','commandeProduits.produit', 'user') ->with('commandeProduits','commandeProduits.produit', 'user')
// produits selec pour production // produits selec pour production
$produits_selec = ProductionProduit::findProduits($production->id); $produits_selec = ProductionProduit::findProduits($production->id);



$ca_potentiel = 0; $ca_potentiel = 0;
$poids_total = 0; $poids_total = 0;
foreach ($produits_selec as $id_produit_selec => $produit_selec) { foreach ($produits_selec as $id_produit_selec => $produit_selec) {
'poids_pain' => $poids_pain, 'poids_pain' => $poids_pain,
]); ]);



echo json_encode([ echo json_encode([
'html_totaux' => $html_totaux, 'html_totaux' => $html_totaux,
]); ]);
die(); die();
} }


public function actionAjaxPointVenteLivraison($id_production, $id_point_vente, $bool_livraison) {
/**
* Active ou désactive la livraison dans un point de vente.
*
* @param integer $id_production
* @param integer $id_point_vente
* @param boolean $bool_livraison
*/
public function actionAjaxPointVenteLivraison(
$id_production, $id_point_vente, $bool_livraison)
{


$production_point_vente = ProductionPointVente::find() $production_point_vente = ProductionPointVente::find()
->where([ ->where([
die(); die();
} }


public function actionStatutPaiement($id_commande) {
/**
* Retourne l'état du paiement (historique, crédit) d'une commande donnée.
*
* @param integer $id_commande
*/
public function actionStatutPaiement($id_commande)
{
$commande = Commande::find() $commande = Commande::find()
->with('commandeProduits', 'production') ->with('commandeProduits', 'production')
->where(['id' => $id_commande]) ->where(['id' => $id_commande])
die(); die();
} }


public function actionPaiement($id_commande, $type, $montant) {
/**
* Effectue le paiement/remboursement d'une commande.
*
* @param integer $id_commande
* @param string $type
* @param float $montant
* @return string
*/
public function actionPaiement($id_commande, $type, $montant)
{
$commande = Commande::find() $commande = Commande::find()
->with('commandeProduits', 'production') ->with('commandeProduits', 'production')
->where(['id' => $id_commande]) ->where(['id' => $id_commande])

+ 45
- 19
backend/controllers/CommandeautoController.php View File



namespace backend\controllers; namespace backend\controllers;


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


public function behaviors() {
public function behaviors()
{
return [ return [
'access' => [ 'access' => [
'class' => AccessControl::className(), 'class' => AccessControl::className(),
]; ];
} }


public function actionIndex() {
/**
* Liste les commandes récurrente du producteur.
*
* @return string
*/
public function actionIndex()
{
$dataProvider = new ActiveDataProvider([ $dataProvider = new ActiveDataProvider([
'query' => CommandeAuto::find() 'query' => CommandeAuto::find()
->with(['user', 'etablissement', 'pointVente', 'commandeAutoProduit']) ->with(['user', 'etablissement', 'pointVente', 'commandeAutoProduit'])
]); ]);


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


public function actionCreate() {
/**
* Crée une commande récurrente.
*
* @return string
*/
public function actionCreate()
{
// form // form
$model = new CommandeAutoForm; $model = new CommandeAutoForm;
$model->id_etablissement = Yii::$app->user->identity->id_etablissement; $model->id_etablissement = Yii::$app->user->identity->id_etablissement;
->orderBy('order ASC') ->orderBy('order ASC')
->all(); ->all();


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

if ($model->load(Yii::$app->request->post()) && $model->validate()
&& $model->save())
{
$this->redirect(['commandeauto/index']); $this->redirect(['commandeauto/index']);
} }


]); ]);
} }


public function actionUpdate($id) {
/**
* Modifie une commande récurrente.
*
* @param integer $id
* @return string
* @throws NotFoundHttpException
*/
public function actionUpdate($id)
{
// form // form
$model = new CommandeAutoForm; $model = new CommandeAutoForm;
$commandeauto = CommandeAuto::findOne($id); $commandeauto = CommandeAuto::findOne($id);


// produits // produits
$produits = Produit::find() $produits = Produit::find()
->where(['id_etablissement' => $model->id_etablissement])
->orderBy('order ASC')
->all();
->where(['id_etablissement' => $model->id_etablissement])
->orderBy('order ASC')
->all();


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

if (!strlen($model->date_fin)) { if (!strlen($model->date_fin)) {
$model->date_fin = null; $model->date_fin = null;
} }

if ($model->save()) { if ($model->save()) {
$this->redirect(['commandeauto/index']); $this->redirect(['commandeauto/index']);
} }
} }


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


public function actionDelete($id) {
/**
* Supprime une commande récurrente.
*
* @param integer $id
*/
public function actionDelete($id)
{
CommandeAutoProduit::deleteAll(['id_commande_auto' => $id]); CommandeAutoProduit::deleteAll(['id_commande_auto' => $id]);
CommandeAuto::findOne($id)->delete(); CommandeAuto::findOne($id)->delete();
$this->redirect(['commandeauto/index']); $this->redirect(['commandeauto/index']);

+ 20
- 5
backend/controllers/CommuniquerController.php View File

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


public function behaviors() { public function behaviors() {
return [ return [
]; ];
} }


public function actionIndex() {
/**
* Affiche la page d'accueil de la section avec un aperçu du mpde d'emploi
* à imprimer.
*
* @return string
*/
public function actionIndex()
{
$etablissement = Etablissement::findOne(['id' => Yii::$app->user->identity->id_etablissement]); $etablissement = Etablissement::findOne(['id' => Yii::$app->user->identity->id_etablissement]);


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


public function actionModeemploi() {
/**
* Génére un PDF contenant le mode d'emploi d'utilisation de la plateforme
* à destination des clients des producteurs.
*
* @return string
*/
public function actionModeemploi()
{


$etablissement = Etablissement::findOne(['id' => Yii::$app->user->identity->id_etablissement]); $etablissement = Etablissement::findOne(['id' => Yii::$app->user->identity->id_etablissement]);



+ 21
- 4
backend/controllers/CronController.php View File

/** /**
* 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 [
'verbs' => [ 'verbs' => [
'class' => VerbFilter::className(), 'class' => VerbFilter::className(),
]; ];
} }


public function actionInitBddDemo($key = '') {
/**
* Initialise la base de données de démo avec les données de l'environnement
* de production (en modifiant les données privées).
*
* @param string $key
*/
public function actionInitBddDemo($key = '')
{
if ($key == '45432df6e842ac71aa0b5bb6b9f25d44' && YII_ENV == 'demo') { if ($key == '45432df6e842ac71aa0b5bb6b9f25d44' && YII_ENV == 'demo') {


$arr_noms = [ $arr_noms = [
} }
} }


public function actionProcessCommandes($key = '', $force_date = '') {
/**
* Routine quotidienne concernant les commandes : paiement et envoi d'un
* récap aux producteurs.
*
* @param string $key
* @param string $force_date
*/
public function actionProcessCommandes($key = '', $force_date = '')
{
if ($key == '64ac0bdab7e9f5e48c4d991ec5201d57') { if ($key == '64ac0bdab7e9f5e48c4d991ec5201d57') {
if(strlen($force_date)) { if(strlen($force_date)) {

+ 22
- 8
backend/controllers/DeveloppementController.php View File

/** /**
* DeveloppementController implements the CRUD actions for Developpement model. * DeveloppementController implements the CRUD actions for Developpement model.
*/ */
class DeveloppementController extends Controller {
class DeveloppementController extends Controller
{


/** /**
* @inheritdoc * @inheritdoc
} }


/** /**
* Lists all Developpement models.
* Liste les développements.
*
* @return mixed * @return mixed
*/ */
public function actionIndex($statut = Developpement::STATUT_OPEN) {
public function actionIndex($statut = Developpement::STATUT_OPEN)
{
$dataProvider = new ActiveDataProvider([ $dataProvider = new ActiveDataProvider([
'query' => Developpement::find()->with(['developpementPriorite', 'developpementPrioriteCurrentEtablissement'])->where(['statut' => $statut])->orderBy('date DESC'), 'query' => Developpement::find()->with(['developpementPriorite', 'developpementPrioriteCurrentEtablissement'])->where(['statut' => $statut])->orderBy('date DESC'),
]); ]);
* If creation is successful, the browser will be redirected to the 'view' page. * If creation is successful, the browser will be redirected to the 'view' page.
* @return mixed * @return mixed
*/ */
public function actionCreate() {
public function actionCreate()
{
$model = new Developpement(); $model = new Developpement();


if ($model->load(Yii::$app->request->post())) { if ($model->load(Yii::$app->request->post())) {
* @param integer $id * @param integer $id
* @return mixed * @return mixed
*/ */
public function actionUpdate($id) {
public function actionUpdate($id)
{
$model = $this->findModel($id); $model = $this->findModel($id);


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


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


public function actionPriorite($id_developpement, $priorite = null) {
/**
* Définit une priorité pour un développement.
*
* @param integer $id_developpement
* @param string $priorite
*/
public function actionPriorite($id_developpement, $priorite = null)
{


$developpement_priorite = DeveloppementPriorite::find() $developpement_priorite = DeveloppementPriorite::find()
->where(['id_developpement' => $id_developpement, 'id_etablissement' => Yii::$app->user->identity->id_etablissement]) ->where(['id_developpement' => $id_developpement, 'id_etablissement' => Yii::$app->user->identity->id_etablissement])
* @return Developpement the loaded model * @return Developpement the loaded model
* @throws NotFoundHttpException if the model cannot be found * @throws NotFoundHttpException if the model cannot be found
*/ */
protected function findModel($id) {
protected function findModel($id)
{
if (($model = Developpement::findOne($id)) !== null) { if (($model = Developpement::findOne($id)) !== null) {
return $model; return $model;
} else { } else {

+ 33
- 7
backend/controllers/EtablissementAdminController.php View File

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


public function behaviors() {
public function behaviors()
{
return [ return [
'verbs' => [ 'verbs' => [
'class' => VerbFilter::className(), 'class' => VerbFilter::className(),
]; ];
} }


public function actionIndex() {
/**
* Liste les producteurs.
*
* @return mixed
*/
public function actionIndex()
{
$datas_etablissements = new ActiveDataProvider([ $datas_etablissements = new ActiveDataProvider([
'query' => Etablissement::find() 'query' => Etablissement::find()
->with('userEtablissement', 'user') ->with('userEtablissement', 'user')
]); ]);


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


public function actionFacturer($id_etablissement) {

/**
* Génère la facture mensuelle d'un producteur.
*
* @param integer $id_etablissement
*/
public function actionFacturer($id_etablissement)
{
$etablissement = Etablissement::findOne($id_etablissement); $etablissement = Etablissement::findOne($id_etablissement);


if ($etablissement) { if ($etablissement) {
$this->redirect(['etablissement-admin/index']); $this->redirect(['etablissement-admin/index']);
} }


public function actionFacturation() {
/**
* Liste les factures des producteurs.
*
* @return mxied
*/
public function actionFacturation()
{
$datas_factures = new ActiveDataProvider([ $datas_factures = new ActiveDataProvider([
'query' => Facture::find() 'query' => Facture::find()
->with('etablissement') ->with('etablissement')
]); ]);
} }


/**
* Recherche un établissement.
*
* @param integer $id
* @return Etablissement
* @throws NotFoundHttpException
*/
protected function findModel($id) { protected function findModel($id) {
if (($model = Etablissement::findOne($id)) !== null) { if (($model = Etablissement::findOne($id)) !== null) {
return $model; return $model;

+ 28
- 5
backend/controllers/EtablissementController.php View File

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


public $enableCsrfValidation = false; public $enableCsrfValidation = false;
public function behaviors() {
public function behaviors()
{
return [ return [
'verbs' => [ 'verbs' => [
'class' => VerbFilter::className(), 'class' => VerbFilter::className(),
]; ];
} }


public function actionUpdate() {
/**
* Modifie un établissement.
*
* @return mixed
*/
public function actionUpdate()
{
$request = Yii::$app->request; $request = Yii::$app->request;
$model = $this->findModel(Yii::$app->user->identity->id_etablissement); $model = $this->findModel(Yii::$app->user->identity->id_etablissement);
$logo_filename_old = $model->logo; $logo_filename_old = $model->logo;
} }
} }


public function actionFacturation() {
/**
* Affiche le formulaire permettant au producteur de définir le montant
* de son abonnement.
*
* @return mixed
*/
public function actionFacturation()
{
$datas_factures = new ActiveDataProvider([ $datas_factures = new ActiveDataProvider([
'query' => Facture::find() 'query' => Facture::find()
->where(['id_etablissement' => Yii::$app->user->identity->id_etablissement]) ->where(['id_etablissement' => Yii::$app->user->identity->id_etablissement])
]); ]);
} }


protected function findModel($id) {
/**
* Recherche un établissement via son ID.
*
* @param integer $id
* @return Etablissement
* @throws NotFoundHttpException
*/
protected function findModel($id)
{
if (($model = Etablissement::findOne($id)) !== null) { if (($model = Etablissement::findOne($id)) !== null) {
return $model; return $model;
} else { } else {

+ 0
- 136
backend/controllers/PaiementController.php View File

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

namespace backend\controllers;

use Yii;
use yii\filters\AccessControl;
use yii\data\ActiveDataProvider;
use yii\web\Controller;
use yii\web\NotFoundHttpException;
use yii\filters\VerbFilter;
use common\models\User;
use common\models\Etablissement;
use c006\paypal_ipn\PayPal_Ipn;

/**
* ProduitController implements the CRUD actions for Produit model.
*/
class PaiementController extends BackendController {

var $enableCsrfValidation = false;

public function behaviors() {
return [
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
],
],
'access' => [
'class' => AccessControl::className(),
'rules' => [
[
'actions' => ['ipn'],
'allow' => true,
'roles' => ['?'],
],
[
'allow' => true,
'roles' => ['@'],
'matchCallback' => function ($rule, $action) {
return Yii::$app->user->identity->status == USER::STATUS_ADMIN
|| Yii::$app->user->identity->status == USER::STATUS_BOULANGER;
}
]
],
],
];
}

/**
* Lists all Produit models.
* @return mixed
*/
public function actionIndex() {

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

public function actionAnnuler() {

return $this->render('annuler', [
]);
}

public function actionSucces() {
return $this->render('succes', [
]);
}

public function beforeAction($action) {
if (Yii::$app->controller->action->id == "ipn")
$this->enableCsrfValidation = false;
return parent::beforeAction($action);
}

public function actionIpn() {
if (isset($_POST)) {
$ipn = new PayPal_Ipn(false);
if ($ipn->init()) {
$custom = $ipn->getKeyValue('custom');
$txn_type = $ipn->getKeyValue('txn_type');

if ($txn_type == 'subscr_payment' && $custom) {
$user = User::findOne($custom);
if ($user) {
$etablissement = Etablissement::findOne($user->id_etablissement);
if ($etablissement) {
$etablissement->date_paiement = date('Y-m-d H:i:s', time());
$etablissement->save();
}
}
}
}
}
/* Enable again if you use it */
Yii::$app->request->enableCsrfValidation = true;
}

}

+ 34
- 31
backend/controllers/PointVenteController.php View File

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


public function behaviors() {
public function behaviors()
{
return [ return [
'verbs' => [ 'verbs' => [
'class' => VerbFilter::className(), 'class' => VerbFilter::className(),
} }


/** /**
* Lists all PointVente models.
* Liste les points de vente.
*
* @return mixed * @return mixed
*/ */
public function actionIndex() {
public function actionIndex()
{
$dataProvider = new ActiveDataProvider([ $dataProvider = new ActiveDataProvider([
'query' => PointVente::find()->where(['id_etablissement' => Yii::$app->user->identity->id_etablissement]) 'query' => PointVente::find()->where(['id_etablissement' => Yii::$app->user->identity->id_etablissement])
]); ]);
} }


/** /**
* Displays a single PointVente model.
* @param integer $id
* @return mixed
*/
public function actionView($id) {
return $this->render('view', [
'model' => $this->findModel($id),
]);
}

/**
* Creates a new PointVente model.
* If creation is successful, the browser will be redirected to the 'view' page.
* Crée un point de vente.
*
* @return mixed * @return mixed
*/ */
public function actionCreate() {
public function actionCreate()
{
$model = new PointVente(); $model = new PointVente();


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


/** /**
* Updates an existing PointVente model.
* If update is successful, the browser will be redirected to the 'view' page.
* Modifie un point de vente.
*
* @param integer $id * @param integer $id
* @return mixed * @return mixed
*/ */
public function actionUpdate($id) {
public function actionUpdate($id)
{
$model = PointVente::find() $model = PointVente::find()
->with('pointVenteUser') ->with('pointVenteUser')
->where(['id' => $id]) ->where(['id' => $id])
} }
} }


public function initForm($id = 0) {
/**
* Initialise le formulaire de création/modification.
*
* @param integer $id
* @return mixed
*/
public function initForm($id = 0)
{
$users = User::findBy() $users = User::findBy()
->orderBy('nom ASC') ->orderBy('nom ASC')
->all(); ->all();
} }


/** /**
* Deletes an existing PointVente model.
* If deletion is successful, the browser will be redirected to the 'index' page.
* Supprime un point de vente et redirige vers la liste des points de vente.
*
* @param integer $id * @param integer $id
* @return mixed * @return mixed
*/ */
public function actionDelete($id) {
public function actionDelete($id)
{
$this->findModel($id)->delete(); $this->findModel($id)->delete();
PointVenteUser::deleteAll(['id_point_vente' => $id]); PointVenteUser::deleteAll(['id_point_vente' => $id]);
ProductionPointVente::deleteAll(['id_point_vente' => $id]) ; ProductionPointVente::deleteAll(['id_point_vente' => $id]) ;
} }


/** /**
* Finds the PointVente model based on its primary key value.
* If the model is not found, a 404 HTTP exception will be thrown.
* Recherche un point de vente en fonction de son ID.
*
* @param integer $id * @param integer $id
* @return PointVente the loaded model
* @throws NotFoundHttpException if the model cannot be found
* @return PointVente
* @throws NotFoundHttpException si le modèle n'est pas trouvé
*/ */
protected function findModel($id) {
protected function findModel($id)
{
if (($model = PointVente::findOne($id)) !== null) { if (($model = PointVente::findOne($id)) !== null) {
return $model; return $model;
} else { } else {

+ 37
- 31
backend/controllers/ProduitController.php View File

/** /**
* ProduitController implements the CRUD actions for Produit model. * ProduitController implements the CRUD actions for Produit model.
*/ */
class ProduitController extends BackendController {
class ProduitController extends BackendController
{
var $enableCsrfValidation = false; var $enableCsrfValidation = false;


public function behaviors() {
public function behaviors()
{
return [ return [
'verbs' => [ 'verbs' => [
'class' => VerbFilter::className(), 'class' => VerbFilter::className(),
} }


/** /**
* Lists all Produit models.
* Liste les modèles Produit.
*
* @return mixed * @return mixed
*/ */
public function actionIndex() {
public function actionIndex()
{
$dataProvider = new ActiveDataProvider([ $dataProvider = new ActiveDataProvider([
'query' => Produit::find() 'query' => Produit::find()
->where('(vrac IS NULL OR vrac = 0)') ->where('(vrac IS NULL OR vrac = 0)')
} }


/** /**
* Displays a single Produit model.
* @param integer $id
* @return mixed
*/
public function actionView($id) {
return $this->render('view', [
'model' => $this->findModel($id),
]);
}

/**
* Creates a new Produit model.
* If creation is successful, the browser will be redirected to the 'view' page.
* Crée un modèle Produit.
* Si la création réussit, le navigateur est redirigé vers la page 'index'.
*
* @return mixed * @return mixed
*/ */
public function actionCreate() {
public function actionCreate()
{
$model = new Produit(); $model = new Produit();
$model->actif = 1; $model->actif = 1;
$model->id_etablissement = Yii::$app->user->identity->id_etablissement; $model->id_etablissement = Yii::$app->user->identity->id_etablissement;
} }


/** /**
* Updates an existing Produit model.
* If update is successful, the browser will be redirected to the 'view' page.
* Modifie un modèle Produit existant.
* Si la modification réussit, le navigateur est redirigé vers la page 'index'.
*
* @param integer $id * @param integer $id
* @return mixed * @return mixed
*/ */
public function actionUpdate($id) {
public function actionUpdate($id)
{
$request = Yii::$app->request; $request = Yii::$app->request;


$model = $this->findModel($id); $model = $this->findModel($id);
} }


/** /**
* Deletes an existing Produit model.
* If deletion is successful, the browser will be redirected to the 'index' page.
* Supprime un modèle Produit.
* Si la suppression réussit, le navigateur est redirigé vers la page
* 'index'.
*
* @param integer $id * @param integer $id
* @return mixed * @return mixed
*/ */
public function actionDelete($id) {
public function actionDelete($id)
{
$this->findModel($id)->delete(); $this->findModel($id)->delete();


$productions_produits = ProductionProduit::find()->where(['id_produit' => $id])->all(); $productions_produits = ProductionProduit::find()->where(['id_produit' => $id])->all();
return $this->redirect(['index']); return $this->redirect(['index']);
} }


public function actionOrdre($tab) {
/**
* Modifie l'ordre des produits.
*
* @param array $tab
*/
public function actionOrdre($tab)
{
$tab_ordre = json_decode(stripslashes($tab)); $tab_ordre = json_decode(stripslashes($tab));


foreach ($tab_ordre as $id => $o) { foreach ($tab_ordre as $id => $o) {
} }


/** /**
* Finds the Produit model based on its primary key value.
* If the model is not found, a 404 HTTP exception will be thrown.
* Recherche un produit en fonction de son ID.
*
* @param integer $id * @param integer $id
* @return Produit the loaded model
* @throws NotFoundHttpException if the model cannot be found
* @return Produit
* @throws NotFoundHttpException si le modèle n'est pas trouvé
*/ */
protected function findModel($id) {
protected function findModel($id)
{
if (($model = Produit::findOne($id)) !== null) { if (($model = Produit::findOne($id)) !== null) {
return $model; return $model;
} else { } else {

+ 38
- 8
backend/controllers/SiteController.php View File

/** /**
* Site controller * Site controller
*/ */
class SiteController extends BackendController {
class SiteController extends BackendController
{


/** /**
* @inheritdoc * @inheritdoc
*/ */
public function behaviors() {
public function behaviors()
{
return [ return [
'access' => [ 'access' => [
'class' => AccessControl::className(), 'class' => AccessControl::className(),
/** /**
* @inheritdoc * @inheritdoc
*/ */
public function actions() {
public function actions()
{
return [ return [
'error' => [ 'error' => [
'class' => 'yii\web\ErrorAction', 'class' => 'yii\web\ErrorAction',
]; ];
} }


public function actionIndex() {
/**
* Affiche le tableau de bord du backend avec les dernières commandes
* réalisée, les dernières inscriptions, la liste des clients ayant un crédit
* négatif etc.
*
* @return mixed
*/
public function actionIndex()
{
// commandes // commandes
$productions = Production::find() $productions = Production::find()
->with('commande') ->with('commande')
]); ]);
} }


public function actionLogin() {
/**
* Affiche la page de connexion.
*
* @return mixed
*/
public function actionLogin()
{
if (!\Yii::$app->user->isGuest) { if (!\Yii::$app->user->isGuest) {
return $this->goHome(); return $this->goHome();
} }
return $this->goBack(); return $this->goBack();
} else { } else {
return $this->render('login', [ return $this->render('login', [
'model' => $model,
'model' => $model,
]); ]);
} }
} }


public function actionLogout() {
/**
* Déconnecte l'utilisateur et le redirige à la page d'accueil.
*
* @return mixed
*/
public function actionLogout()
{
Yii::$app->user->logout(); Yii::$app->user->logout();


return $this->goHome(); return $this->goHome();
} }


public function actionChangeEtablissement($id) {
/**
* Change le producteur courant de l'utilisateur connecté.
* Permet de passer d'un producteur à un autre en tant qu'administrateur.
*
* @param integer $id
*/
public function actionChangeEtablissement($id)
{
Yii::$app->user->identity->id_etablissement = $id; Yii::$app->user->identity->id_etablissement = $id;
Yii::$app->user->identity->save(); Yii::$app->user->identity->save();
$this->redirect(['site/index']); $this->redirect(['site/index']);

+ 20
- 6
backend/controllers/StatsController.php View File

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


class StatsController extends BackendController {
class StatsController extends BackendController
{


public function behaviors() {
public function behaviors()
{
return [ return [
'access' => [ 'access' => [
'class' => AccessControl::className(), 'class' => AccessControl::className(),
]; ];
} }


public function actionIndex() {

/**
* Affiche les statistiques de l'année avec le CA réalisé par mois.
*
* @return mixed
*/
public function actionIndex()
{
/* /*
* Volume de commande de l'année passée (par mois) * Volume de commande de l'année passée (par mois)
*/ */
const TOTAUX = 13 ; const TOTAUX = 13 ;
public function actionProduits($year = 0) {
/**
* Affiche un tableau avec les totaux (maximums, commandés) de chaque produit
* par mois d'une année donnée.
*
* @param integer $year
* @return mixed
*/
public function actionProduits($year = 0)
{
if(!$year) $year = date('Y') ; if(!$year) $year = date('Y') ;
$produits = Produit::find() $produits = Produit::find()

+ 44
- 14
backend/controllers/UserController.php View File

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


public function behaviors() {
public function behaviors()
{
return [ return [
'verbs' => [ 'verbs' => [
'class' => VerbFilter::className(), 'class' => VerbFilter::className(),
} }


/** /**
* Lists all User models.
* Liste les utilisateurs.
*
* @return mixed * @return mixed
*/ */
public function actionIndex($id_point_vente = 0, $section_clients_inactifs = false) {
public function actionIndex(
$id_point_vente = 0, $section_clients_inactifs = false)
{
$params = Yii::$app->request->queryParams; $params = Yii::$app->request->queryParams;
if($id_point_vente) if($id_point_vente)
$params['id_point_vente'] = $id_point_vente ; $params['id_point_vente'] = $id_point_vente ;
* If creation is successful, the browser will be redirected to the 'view' page. * If creation is successful, the browser will be redirected to the 'view' page.
* @return mixed * @return mixed
*/ */
public function actionCreate() {
public function actionCreate()
{
$model = new User(); $model = new User();


if ($model->load(Yii::$app->request->post()) && $model->validate() && YII_ENV != 'demo') { if ($model->load(Yii::$app->request->post()) && $model->validate() && YII_ENV != 'demo') {
* @param integer $id * @param integer $id
* @return mixed * @return mixed
*/ */
public function actionUpdate($id) {
public function actionUpdate($id)
{
$model = $this->findModel($id); $model = $this->findModel($id);


$previous_mail = $model->email ; $previous_mail = $model->email ;
* *
* @param integer $id ID de l'utilisateur * @param integer $id ID de l'utilisateur
*/ */
public function actionDelete($id) {
public function actionDelete($id)
{
$user_etablissement = UserEtablissement::findOne([ $user_etablissement = UserEtablissement::findOne([
'id_user' => $id, 'id_user' => $id,
'id_etablissement' => Yii::$app->user->identity->id_etablissement 'id_etablissement' => Yii::$app->user->identity->id_etablissement
$this->redirect(array_merge(['index'],$params)); $this->redirect(array_merge(['index'],$params));
} }


public function actionMail($id_point_vente = 0) {
/**
* Affiche la liste des emails des utilisateurs liés à un point de vente
* donné.
*
* @param integer $id_point_vente
* @return mixed
*/
public function actionMail($id_point_vente = 0)
{
$users = User::findBy([ $users = User::findBy([
'id_etablissement' => Yii::$app->user->identity->id_etablissement, 'id_etablissement' => Yii::$app->user->identity->id_etablissement,
'id_point_vente' => $id_point_vente 'id_point_vente' => $id_point_vente
if($id_point_vente) { if($id_point_vente) {
$point_vente = PointVente::findOne(['id' => $id_point_vente, 'id_etablissement' => Yii::$app->user->identity->id_etablissement]) ; $point_vente = PointVente::findOne(['id' => $id_point_vente, 'id_etablissement' => Yii::$app->user->identity->id_etablissement]) ;
} }


return $this->render('liste_mails', [ return $this->render('liste_mails', [
'users' => $arr_users, 'users' => $arr_users,
]); ]);
} }


public function actionCredit($id) {
/**
* Affiche les données liées au crédit d'un utilisateur (formulaire,
* historique).
*
* @param integer $id
* @return mixed
* @throws UserException
*/
public function actionCredit($id)
{
$user = User::find()->with('userEtablissement')->where(['id' => $id])->one(); $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_etablissement = UserEtablissement::findOne(['id_user' => $id, 'id_etablissement' => Yii::$app->user->identity->id_etablissement]);
} }
} }


public function actionCommandes($id) {
/**
* Affiche les commandes d'un utilisateur.
*
* @param integer $id
* @return mixed
*/
public function actionCommandes($id)
{


$user = User::findOne($id); $user = User::findOne($id);


* @return User the loaded model * @return User the loaded model
* @throws NotFoundHttpException if the model cannot be found * @throws NotFoundHttpException if the model cannot be found
*/ */
protected function findModel($id) {
protected function findModel($id)
{
if (($model = User::findOne($id)) !== null) { if (($model = User::findOne($id)) !== null) {
return $model; return $model;
} else { } else {

+ 0
- 231
backend/controllers/VracController.php View File

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

namespace backend\controllers;

use common\models\ProductionProduit;
use Yii;
use yii\filters\AccessControl;
use common\models\Produit;
use common\models\Production;
use common\models\User;
use yii\data\ActiveDataProvider;
use yii\web\Controller;
use yii\web\NotFoundHttpException;
use yii\filters\VerbFilter;
use yii\web\UploadedFile;

/**
* ProduitController implements the CRUD actions for Produit model.
*/
class VracController extends BackendController {

var $enableCsrfValidation = false;

public function behaviors() {
return [
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
'delete' => ['post'],
],
],
'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;
}
]
],
],
];
}

/**
* Lists all Produit models.
* @return mixed
*/
public function actionIndex() {
$dataProvider = new ActiveDataProvider([
'query' => Produit::find()->where('vrac = 1')->orderBy('order ASC'),
]);

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

/**
* Displays a single Produit model.
* @param integer $id
* @return mixed
*/
public function actionView($id) {
return $this->render('view', [
'model' => $this->findModel($id),
]);
}

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

if ($model->load(Yii::$app->request->post()) && $model->save()) {
self::uploadFile($model, 'illustration');
self::uploadFile($model, 'photo');

$model->vrac = 1;
$model->lundi = 1;
$model->mardi = 1;
$model->mercredi = 1;
$model->jeudi = 1;
$model->vendredi = 1;
$model->samedi = 1;
$model->dimanche = 1;
$model->save();

// on ajoute un enregistrement ProductionProduit pour chaque production
$productions = Production::find()->where('date > ' . date('Y-m-d'))->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();
}

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

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

$model = $this->findModel($id);
$illustration_filename_old = $model->illustration;
$photo_filename_old = $model->photo;

if ($model->load(Yii::$app->request->post()) && $model->save()) {
self::uploadFile($model, 'illustration', $illustration_filename_old);
self::uploadFile($model, 'photo', $photo_filename_old);

$delete_illustration = $request->post('delete_illustration', 0);
if ($delete_illustration) {
$model->illustration = '';
$model->save();
}

$delete_photo = $request->post('delete_photo', 0);
if ($delete_photo) {
$model->photo = '';
$model->save();
}

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

public static function uploadFile($model, $champs, $filename_old = '') {
$file = UploadedFile::getInstance($model, $champs);
if ($file) {
$file_name = $file->baseName . '-' . uniqid() . '.' . $file->extension;
$file->saveAs('../../frontend/web/uploads/' . $file_name);
$model->$champs = $file_name;
} else {
$model->$champs = $filename_old;
}

$model->save();
}

/**
* Deletes an existing Produit model.
* If deletion is successful, the browser will be redirected to the 'index' page.
* @param integer $id
* @return mixed
*/
public function actionDelete($id) {
$this->findModel($id)->delete();

$productions_produits = ProductionProduit::find()->where(['id_produit' => $id])->all();
foreach ($productions_produits as $pp) {
$pp->delete();
}

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

/**
* Finds the Produit model based on its primary key value.
* If the model is not found, a 404 HTTP exception will be thrown.
* @param integer $id
* @return Produit the loaded model
* @throws NotFoundHttpException if the model cannot be found
*/
protected function findModel($id) {
if (($model = Produit::findOne($id)) !== null) {
return $model;
} else {
throw new NotFoundHttpException('The requested page does not exist.');
}
}

}

+ 0
- 1
backend/models/MailForm.php View File

*/ */
public function sendEmail($email) public function sendEmail($email)
{ {

return Yii::$app->mailer->compose() return Yii::$app->mailer->compose()
->setTo($email) ->setTo($email)
->setFrom(['matthieu@lechatdesnoisettes.com' => 'Le Chat des Noisettes']) ->setFrom(['matthieu@lechatdesnoisettes.com' => 'Le Chat des Noisettes'])

+ 0
- 73
backend/views/point-vente/view.php View File

<?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 backend\models\PointVente */

$this->title = $model->id;
$this->params['breadcrumbs'][] = ['label' => 'Point Ventes', 'url' => ['index']];
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="point-vente-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',
'nom',
'adresse:ntext',
],
]) ?>

</div>

+ 0
- 79
backend/views/produit/view.php View File

<?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 app\models\Produit */

$this->title = $model->id;
$this->params['breadcrumbs'][] = ['label' => 'Produits', 'url' => ['index']];
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="produit-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',
'nom',
'description',
'actif',
'illustration',
'photo',
'saison',
'prix',
'poids',
],
]) ?>

</div>

+ 0
- 72
backend/views/vrac/_form.php View File

<?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;

/* @var $this yii\web\View */
/* @var $model app\models\Produit */
/* @var $form yii\widgets\ActiveForm */
?>

<div class="produit-form">

<?php $form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']]); ?>

<?= $form->field($model, 'actif')->radioList([1 => 'Oui',0 => 'Non' ]) ?>
<?= $form->field($model, 'order')->textInput(['maxlength' => 255]) ?>
<?= $form->field($model, 'nom')->textInput(['maxlength' => 255]) ?>
<?= $form->field($model, 'diminutif')->textInput(['maxlength' => 255]) ?>
<?= $form->field($model, 'description')->textInput(['maxlength' => 255]) ?>
<?= $form->field($model, 'prix')->textInput() ?>
<?= $form->field($model, 'epuise')->checkbox() ?>
<?= $form->field($model, 'photo')->fileInput() ?>
<?php
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 />' ;
}
?>
<div class="form-group">
<?= Html::submitButton($model->isNewRecord ? 'Create' : 'Update', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
</div>

<?php ActiveForm::end(); ?>
</div>

+ 0
- 57
backend/views/vrac/create.php View File

<?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 = 'Ajouter vrac';
$this->params['breadcrumbs'][] = ['label' => 'Produits', 'url' => ['index']];
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="produit-create">

<h1><?= Html::encode($this->title) ?></h1>

<?= $this->render('_form', [
'model' => $model,
]) ?>

</div>

+ 0
- 73
backend/views/vrac/index.php View File

<?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\grid\GridView;

/* @var $this yii\web\View */
/* @var $dataProvider yii\data\ActiveDataProvider */

$this->title = 'Vrac';
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="produit-index">

<h1><?= Html::encode($this->title) ?> <?= Html::a('Ajouter', ['create'], ['class' => 'btn btn-success']) ?></h1>

<?= GridView::widget([
'dataProvider' => $dataProvider,
'columns' => [
//['class' => 'yii\grid\SerialColumn'],

//'id',
'order',
'diminutif',
'nom',
'epuise',
'actif',
//'illustration',
// 'photo',
// 'saison',
// 'prix',
// 'poids',

['class' => 'yii\grid\ActionColumn'],
],
]); ?>

</div>

+ 0
- 57
backend/views/vrac/update.php View File

<?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 vrac #'. $model->id;
$this->params['breadcrumbs'][] = ['label' => 'Produits', 'url' => ['index']];
$this->params['breadcrumbs'][] = ['label' => $model->id, 'url' => ['view', 'id' => $model->id]];
$this->params['breadcrumbs'][] = 'Update';
?>
<div class="produit-update">

<h1><?= Html::encode($this->title) ?></h1>

<?= $this->render('_form', [
'model' => $model,
]) ?>

</div>

+ 0
- 79
backend/views/vrac/view.php View File

<?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 app\models\Produit */

$this->title = $model->id;
$this->params['breadcrumbs'][] = ['label' => 'Produits', 'url' => ['index']];
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="produit-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',
'nom',
'description',
'actif',
'illustration',
'photo',
'saison',
'prix',
'poids',
],
]) ?>

</div>

+ 11
- 10
backend/web/js/lechatdesnoisettes.js View File

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() {
$.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()+'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') ;
}) ; }) ;
} }



+ 12
- 6
common/components/MyView.php View File



namespace common\components ; namespace common\components ;


class MyView extends \yii\web\View {
class MyView extends \yii\web\View
{
var $title ; var $title ;
var $page_title ; var $page_title ;
public function setTitle($title, $page_title = '') {
public function setTitle($title, $page_title = '')
{
$this->title = $title ; $this->title = $title ;
if(strlen($page_title)) if(strlen($page_title))
$this->page_title = $page_title ; $this->page_title = $page_title ;
$this->page_title = $title ; $this->page_title = $title ;
} }
public function getTitle() {
public function getTitle()
{
return $this->title ; return $this->title ;
} }
public function setPageTitle($page_title) {
public function setPageTitle($page_title)
{
$this->page_title = $page_title ; $this->page_title = $page_title ;
} }
public function getPageTitle() {
public function getPageTitle()
{
return $this->page_title ; return $this->page_title ;
} }
public function getControllerAction() {
public function getControllerAction()
{
return Yii::$app->controller->id.'/'.Yii::$app->controller->action->id ; return Yii::$app->controller->id.'/'.Yii::$app->controller->action->id ;
} }

+ 4
- 2
common/controllers/CommonController.php View File



use yii; use yii;


class CommonController extends \yii\web\Controller {
class CommonController extends \yii\web\Controller
{


public function beforeAction($event) {
public function beforeAction($event)
{
if (!Yii::$app->user->isGuest) { if (!Yii::$app->user->isGuest) {
Yii::$app->user->identity->updateDerniereConnexion(); Yii::$app->user->identity->updateDerniereConnexion();
} }

+ 42
- 39
common/helpers/CSV.php View File



namespace common\helpers; namespace common\helpers;


class CSV {
class CSV
{
public static function array2csv(array &$array) {
if (count($array) == 0) {
return null;
}
ob_start();
$df = fopen("php://output", 'w');
// clés
//fputcsv($df, array_keys(reset($array)));
foreach ($array as $row) {
fputcsv($df, $row);
}
fclose($df);
return ob_get_clean();
}
public static function downloadSendHeaders($filename) {
// disable caching
$now = gmdate("D, d M Y H:i:s");
header("Expires: Tue, 03 Jul 2001 06:00:00 GMT");
header("Cache-Control: max-age=0, no-cache, must-revalidate, proxy-revalidate");
header("Last-Modified: {$now} GMT");
// force download
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
// disposition / encoding on response body
header("Content-Disposition: attachment;filename={$filename}");
header("Content-Transfer-Encoding: binary");
}
/*
* usage
* download_send_headers("data_export_" . date("Y-m-d") . ".csv");
echo array2csv($array);
die();
*/
public static function array2csv(array &$array)
{
if (count($array) == 0) {
return null;
}
ob_start();
$df = fopen("php://output", 'w');
// clés
//fputcsv($df, array_keys(reset($array)));
foreach ($array as $row) {
fputcsv($df, $row);
}
fclose($df);
return ob_get_clean();
}

public static function downloadSendHeaders($filename)
{
// disable caching
$now = gmdate("D, d M Y H:i:s");
header("Expires: Tue, 03 Jul 2001 06:00:00 GMT");
header("Cache-Control: max-age=0, no-cache, must-revalidate, proxy-revalidate");
header("Last-Modified: {$now} GMT");

// force download
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");

// disposition / encoding on response body
header("Content-Disposition: attachment;filename={$filename}");
header("Content-Transfer-Encoding: binary");
}

/*
* usage
* download_send_headers("data_export_" . date("Y-m-d") . ".csv");
echo array2csv($array);
die();
*/
} }

+ 4
- 2
common/helpers/Mail.php View File



use Yii; use Yii;


class Mail {
public static function send($email, $subject, $view, $data) {
class Mail
{
public static function send($email, $subject, $view, $data)
{
$mail = Yii::$app->mailer->compose( $mail = Yii::$app->mailer->compose(
[ 'html' => $view.'-html', [ 'html' => $view.'-html',
'text' => $view.'-text' 'text' => $view.'-text'

+ 2
- 1
common/helpers/Price.php View File



class Price { class Price {
public static function format($number) {
public static function format($number)
{
return number_format($number, 2).' €' ; return number_format($number, 2).' €' ;
} }

+ 4
- 2
common/helpers/Upload.php View File

use yii\web\UploadedFile; use yii\web\UploadedFile;
use Yii ; use Yii ;


class Upload {
class Upload
{


public static function uploadFile($model, $champs, $filename_old = '') {
public static function uploadFile($model, $champs, $filename_old = '')
{
$file = UploadedFile::getInstance($model, $champs); $file = UploadedFile::getInstance($model, $champs);
if ($file) { if ($file) {
$file_name = $file->baseName . '-' . uniqid() ; $file_name = $file->baseName . '-' . uniqid() ;

+ 2
- 1
common/helpers/Url.php View File

} }
} }
public static function slugify($string) {
public static function slugify($string)
{
return strtolower(trim(preg_replace('/[^A-Za-z0-9-]+/', '-', $string))); return strtolower(trim(preg_replace('/[^A-Za-z0-9-]+/', '-', $string)));
} }
} }

+ 2
- 1
frontend/controllers/FrontendController.php View File

use yii; use yii;
use common\controllers\CommonController; use common\controllers\CommonController;


class FrontendController extends CommonController {
class FrontendController extends CommonController
{
} }



+ 109
- 20
frontend/controllers/SiteController.php View File

/** /**
* Site controller * Site controller
*/ */
class SiteController extends FrontendController {
class SiteController extends FrontendController
{


/** /**
* @inheritdoc * @inheritdoc
*/ */
public function behaviors() {
public function behaviors()
{
return [ return [
'access' => [ 'access' => [
'class' => AccessControl::className(), 'class' => AccessControl::className(),
/** /**
* @inheritdoc * @inheritdoc
*/ */
public function actions() {
public function actions()
{
return [ return [
'captcha' => [ 'captcha' => [
'class' => 'yii\captcha\CaptchaAction', 'class' => 'yii\captcha\CaptchaAction',
]; ];
} }
/**
* Affiche la page d'erreur.
*
* @return mixed
*/
public function actionError() public function actionError()
{ {
$exception = Yii::$app->errorHandler->exception; $exception = Yii::$app->errorHandler->exception;
} }
} }


public function actionIndex() {

/**
* Affiche la page d'accueil.
*
* @return mixed
*/
public function actionIndex()
{
return $this->render('index'); return $this->render('index');
} }
public function actionProducers() {
/**
* Liste les producteurs utilisant la plateforme.
*
* @return mixed
*/
public function actionProducers()
{
$data_provider_producers = new ActiveDataProvider([ $data_provider_producers = new ActiveDataProvider([
'query' => Etablissement::find() 'query' => Etablissement::find()
->where([ ->where([
]); ]);
} }


public function actionMentions() {
/**
* Affiche les mentions légales.
*
* @return mixed
*/
public function actionMentions()
{
return $this->render('mentions'); return $this->render('mentions');
} }


public function actionLogin() {
/**
* Affiche la page de connexion et traite le formulaire de connexion.
*
* @return mixed
*/
public function actionLogin()
{
if (!\Yii::$app->user->isGuest) { if (!\Yii::$app->user->isGuest) {
return Yii::$app->getResponse()->redirect(['commande/index']); return Yii::$app->getResponse()->redirect(['commande/index']);
} }
} }
} }


public function actionLogout() {
/**
* Déconnecte l'utilisateur.
*
* @return mixed
*/
public function actionLogout()
{
Yii::$app->user->logout(); Yii::$app->user->logout();
return $this->goHome(); return $this->goHome();
} }


public function actionContact() {
/**
* Affiche la page de contact et traite le formulaire s'il est soumis.
*
* @return mixed
*/
public function actionContact()
{
$model = new ContactForm(); $model = new ContactForm();
if ($model->load(Yii::$app->request->post()) && $model->validate()) { if ($model->load(Yii::$app->request->post()) && $model->validate()) {
if ($model->sendEmail(Yii::$app->params['adminEmail'])) { if ($model->sendEmail(Yii::$app->params['adminEmail'])) {
} }
} }


public function actionSignup() {
/**
* Affiche la page d'inscription et traite son formulaire.
*
* @return mixed
*/
public function actionSignup()
{
$model = new SignupForm(); $model = new SignupForm();
if ($model->load(Yii::$app->request->post())) { if ($model->load(Yii::$app->request->post())) {
if ($user = $model->signup()) { if ($user = $model->signup()) {
if (Yii::$app->getUser()->login($user)) { if (Yii::$app->getUser()->login($user)) {

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


public function actionRequestPasswordReset() {
/**
* Affiche la page de demande de nouveau mot de passe.
* Traitement du formulaire.
*
* @return mixed
*/
public function actionRequestPasswordReset()
{
$model = new PasswordResetRequestForm(); $model = new PasswordResetRequestForm();
if ($model->load(Yii::$app->request->post()) && $model->validate()) { if ($model->load(Yii::$app->request->post()) && $model->validate()) {
if ($model->sendEmail()) { if ($model->sendEmail()) {
} }


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


/**
* Met à jour le mot de passe de l'utilisateur.
*
* @param string $token
* @return mixed
* @throws BadRequestHttpException
*/
public function actionResetPassword($token) { public function actionResetPassword($token) {
try { try {
$model = new ResetPasswordForm($token); $model = new ResetPasswordForm($token);
} }


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


public function actionCgv() {
/**
* Affiche les conditions générale de service.
*
* @return mixed
*/
public function actionCgv()
{
return $this->render('cgv'); return $this->render('cgv');
} }


public function actionCreditpain() {
/**
* Affiche les précisions concernant l'utilisation du crédit pain.
* @return type
*/
public function actionCreditpain()
{
return $this->render('creditpain'); return $this->render('creditpain');
} }
public function actionProducerCode($id) {
/**
* Affiche le formulaire de demande de code pour accéder à certains
* producteurs.
*
* @param integer $id
* @return mixed
* @throws \yii\web\HttpException
*/
public function actionProducerCode($id)
{
$producer = Etablissement::findOne($id); $producer = Etablissement::findOne($id);
if(!$producer) if(!$producer)
]) ; ]) ;
} }


public function actionProducer($id) {
/**
* Affiche la page de connexion / inscription pour accéder notamment au
* formulaire de commande des producteirs.
*
* @param integer $id
* @return mixed
*/
public function actionProducer($id)
{
$model_login = new LoginForm(); $model_login = new LoginForm();
$model_signup = new SignupForm(); $model_signup = new SignupForm();

+ 8
- 10
frontend/controllers/UserController.php View File

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


public function behaviors() {
public function behaviors()
{
return [ return [
'verbs' => [ 'verbs' => [
'class' => VerbFilter::className(), 'class' => VerbFilter::className(),
* @param integer $id * @param integer $id
* @return mixed * @return mixed
*/ */
public function actionUpdate() {
public function actionUpdate()
{
$model = $this->findModel(Yii::$app->user->identity->id); $model = $this->findModel(Yii::$app->user->identity->id);


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


public function actionCredit() {

return $this->render('credit', [
]);
}

/** /**
* Finds the User model based on its primary key value. * Finds the User model based on its primary key value.
* If the model is not found, a 404 HTTP exception will be thrown. * If the model is not found, a 404 HTTP exception will be thrown.
* @return User the loaded model * @return User the loaded model
* @throws NotFoundHttpException if the model cannot be found * @throws NotFoundHttpException if the model cannot be found
*/ */
protected function findModel($id) {
protected function findModel($id)
{
if (($model = User::findOne($id)) !== null) { if (($model = User::findOne($id)) !== null) {
return $model; return $model;
} else { } else {

+ 0
- 65
frontend/views/user/credit.php View File

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

$this->title = 'Crédit' ;

?>

<h1>Crédit</h1>

<p>Vous avez plusieurs manières de créditer votre compte.</p>

<h2>À la boutique</h2>
<p>Bla bla bla</p>

<h2>Par carte bancaire via Paypal</h2>

<form action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_top">
<input type="hidden" name="cmd" value="_s-xclick">
<input type="hidden" name="hosted_button_id" value="KME2NU24R334A">
<table>
<tr><td><input type="hidden" name="on0" value="Montant du crédit pain">Montant du crédit pain</td></tr><tr><td><select name="os0">
<option value="10 crédits pains">10 crédits pains €10,00 EUR</option>
<option value="20 crédits pains">20 crédits pains €20,00 EUR</option>
<option value="50 crédits pains">50 crédits pains €50,00 EUR</option>
</select> </td></tr>
</table>
<input type="hidden" name="currency_code" value="EUR">
<input type="image" src="https://www.paypalobjects.com/fr_FR/FR/i/btn/btn_buynowCC_LG.gif" border="0" name="submit" alt="PayPal, le réflexe sécurité pour payer en ligne">
<img alt="" border="0" src="https://www.paypalobjects.com/fr_FR/i/scr/pixel.gif" width="1" height="1">
</form>

+ 79
- 16
producer/controllers/CommandeController.php View File



namespace producer\controllers; namespace producer\controllers;


class CommandeController extends ProducerBaseController {
class CommandeController extends ProducerBaseController
{


public function behaviors() {
public function behaviors()
{
return [ return [
'access' => [ 'access' => [
'class' => AccessControl::className(), 'class' => AccessControl::className(),
]; ];
} }


public function actionInfosProduction($id_production) {

/**
* Retourne au format JSON toutes les informations relatives à une
* production donnée.
*
* @param integer $id_production
* @return mixed
*/
public function actionInfosProduction($id_production)
{
$production = Production::findOne($id_production); $production = Production::findOne($id_production);


if ($production) { if ($production) {
return json_encode([]); return json_encode([]);
} }


/**
* Initialise le formulaire de création/modification de commande.
*
* @param Commande $commande
* @return array
*/
public function initForm($commande = null) { public function initForm($commande = null) {


// etablissements // etablissements
* *
* @return ProducerView * @return ProducerView
*/ */
public function actionHistorique() {
public function actionHistorique()
{
$data_provider_commandes = new ActiveDataProvider([ $data_provider_commandes = new ActiveDataProvider([
'query' => Commande::find() 'query' => Commande::find()
]); ]);
} }


public function actionRemoveEtablissement($id = 0) {
/**
* Supprime un producteur.
*
* @param integer $id
*/
public function actionRemoveEtablissement($id = 0)
{
$user_etablissement = UserEtablissement::find() $user_etablissement = UserEtablissement::find()
->where(['id_etablissement' => $id, 'id_user' => Yii::$app->user->identity->id]) ->where(['id_etablissement' => $id, 'id_user' => Yii::$app->user->identity->id])
->one(); ->one();
$this->redirect(['commande/index']); $this->redirect(['commande/index']);
} }


public function actionCreate() {
/**
* Crée une commande.
*
* @return mixed
*/
public function actionCreate()
{


$id_etablissement = $this->getProducer()->id ; $id_etablissement = $this->getProducer()->id ;
$commande = new Commande; $commande = new Commande;
])); ]));
} }


public function actionUpdate($id) {
/**
* Modifie une commande.
*
* @param integer $id
* @return mixed
* @throws UserException
*/
public function actionUpdate($id)
{


$commande = Commande::find() $commande = Commande::find()
->with('production') ->with('production')




return $this->render('update', array_merge($this->initForm($commande), [ return $this->render('update', array_merge($this->initForm($commande), [
'model' => $commande,
'commande_introuvable' => !$commande,
'model' => $commande,
'commande_introuvable' => !$commande,
])); ]));
} }


public function _verifEtablissementActif($id_etablissement) {
/**
* Vérifie si un producteur est actif.
*
* @param integer $id_etablissement
* @throws NotFoundHttpException
*/
public function _verifEtablissementActif($id_etablissement)
{
$etablissement = Etablissement::findOne($id_etablissement); $etablissement = Etablissement::findOne($id_etablissement);
if ($etablissement && !$etablissement->actif) { if ($etablissement && !$etablissement->actif) {
throw new NotFoundHttpException('Cet établissement est actuellement hors ligne.'); throw new NotFoundHttpException('Cet établissement est actuellement hors ligne.');
} }
} }


public function gestionForm($commande) {
/**
* Traite le formulaire de création/modification de commande.
*
* @param Commande $commande
*/
public function gestionForm($commande)
{
$posts = Yii::$app->request->post(); $posts = Yii::$app->request->post();
$produits = array(); $produits = array();


} }
} }


public function actionAnnuler($id) {

/**
* Annule une commande.
*
* @param integer $id
* @throws \yii\web\NotFoundHttpException
* @throws UserException
*/
public function actionAnnuler($id)
{
$commande = Commande::find() $commande = Commande::find()
->with('production', 'creditHistorique', 'commandeProduits') ->with('production', 'creditHistorique', 'commandeProduits')
->where(['id' => $id]) ->where(['id' => $id])
$this->redirect(Yii::$app->urlManager->createUrl(['commande/historique'])); $this->redirect(Yii::$app->urlManager->createUrl(['commande/historique']));
} }


public function actionVerifCodePointVente($id_point_vente, $code) {
/**
* Vérifie le code saisi pour un point de vente.
*
* @param integer $id_point_vente
* @param string $code
* @return boolean
*/
public function actionVerifCodePointVente($id_point_vente, $code)
{
$point_vente = PointVente::findOne($id_point_vente); $point_vente = PointVente::findOne($id_point_vente);
if ($point_vente) { if ($point_vente) {
if ($point_vente->verifCode($code)) { if ($point_vente->verifCode($code)) {

+ 16
- 5
producer/controllers/ProducerBaseController.php View File



namespace producer\controllers; namespace producer\controllers;


class ProducerBaseController extends CommonController {
class ProducerBaseController extends CommonController
{


var $producer ; var $producer ;
/** /**
* @inheritdoc * @inheritdoc
*/ */
public function behaviors() {
public function behaviors()
{
return []; return [];
} }
public function actions() {
public function actions()
{
return []; return [];
} }
public function beforeAction($event) {
public function beforeAction($event)
{
$producer = $this->getProducer() ; $producer = $this->getProducer() ;
return parent::beforeAction($event); return parent::beforeAction($event);
} }
public function getProducer() {
/**
* Retourne le producteur courant.
*
* @return Etablissement
* @throws \yii\web\HttpException
*/
public function getProducer()
{
if($this->producer) { if($this->producer) {
return $this->producer ; return $this->producer ;
} }

+ 17
- 12
producer/controllers/SiteController.php View File



namespace producer\controllers; namespace producer\controllers;


class SiteController extends ProducerBaseController {
class SiteController extends ProducerBaseController
{
/** /**
* @inheritdoc * @inheritdoc
*/ */
public function behaviors() {
public function behaviors()
{
return []; return [];
} }
public function actions() {
public function actions()
{
return [ return [
'captcha' => [ 'captcha' => [
'class' => 'yii\captcha\CaptchaAction', 'class' => 'yii\captcha\CaptchaAction',
]; ];
} }
/**
* Affiche et gère les erreurs.
*
* @return mixed
*/
public function actionError() public function actionError()
{ {
$exception = Yii::$app->errorHandler->exception; $exception = Yii::$app->errorHandler->exception;
} }
/** /**
*
* Affiche la page d'accueil des producteurs comprenant une image, une * Affiche la page d'accueil des producteurs comprenant une image, une
* description, la liste des points de vente et les produits * description, la liste des points de vente et les produits
* *
* @return ProducerView * @return ProducerView
*/ */
public function actionIndex() {
public function actionIndex()
{
// points de vente // points de vente
$data_provider_points_vente = new ActiveDataProvider([ $data_provider_points_vente = new ActiveDataProvider([
'query' => PointVente::find() 'query' => PointVente::find()
} }
/** /**
*
* Affiche et traite le formulaire de contact dédié aux producteurs * Affiche et traite le formulaire de contact dédié aux producteurs
* *
* @return ProducerView * @return ProducerView
*/ */
public function actionContact() {
public function actionContact()
{
$model = new ContactForm(); $model = new ContactForm();
$producer = $this->getProducer() ; $producer = $this->getProducer() ;
* *
* @param $action 'add' ou 'delete' * @param $action 'add' ou 'delete'
*/ */
public function actionFavorite($action) {
public function actionFavorite($action)
{
$producer = $this->getProducer() ; $producer = $this->getProducer() ;
$user_etablissement = UserEtablissement::find() $user_etablissement = UserEtablissement::find()

Loading…
Cancel
Save