- <?php
-
- namespace frontend\controllers;
-
- use common\models\ProductionProduit;
- use common\models\CommandeProduit;
- use Yii;
- use yii\filters\AccessControl;
- use common\models\Commande;
- use common\models\PointVente;
- use common\models\Production;
- use common\models\Produit;
- use common\models\Etablissement;
- use common\helpers\Departements;
- use yii\helpers\Html;
- use frontend\models\AddEtablissementForm;
- use common\models\UserEtablissement;
- use common\models\CreditHistorique ;
- use yii\web\NotFoundHttpException ;
- use common\models\ProductionPointVente ;
- use yii\base\UserException ;
-
- class CommandeController extends \yii\web\Controller {
-
- public function behaviors() {
- return [
- 'access' => [
- 'class' => AccessControl::className(),
- 'rules' => [
- [
- 'allow' => true,
- 'roles' => ['@'],
- ]
- ],
- ],
- ];
- }
-
- public function actionInfosProduction($id_production) {
-
- $production = Production::findOne($id_production);
-
- if ($production) {
- $arr = [] ;
-
- $produits_dispos = ProductionProduit::findProduits($production->id);
-
- $arr['produits_dispos'] = $produits_dispos ;
-
- $points_vente = PointVente::find()
- ->joinWith(['productionPointVente'=> function($q) use ($production) {
- $q->where(['id_production' => $production->id]) ;
- } ])
- ->where([
- 'id_etablissement' => $production->id_etablissement,
- ])
- ->all();
-
- $arr['points_vente'] = [] ;
- foreach($points_vente as $pv)
- {
- if(isset($pv->productionPointVente) &&
- isset($pv->productionPointVente[0]))
- {
- $arr['points_vente'][$pv->id] = $pv->productionPointVente[0]->livraison ;
- }
- else {
- $arr['points_vente'][$pv->id] = false ;
- }
- }
-
- return json_encode($arr);
- }
-
- return json_encode([]);
- }
-
- public static function initForm($commande = null) {
-
- // etablissements
- $etablissements = Yii::$app->user->identity->getEtablissementsFavoris() ;
- $id_etablissement = Yii::$app->request->get('id_etablissement', 0) ;
-
- $etablissement_paiement_ok = false ;
- if($id_etablissement)
- {
- $etablissement = Etablissement::findOne($id_etablissement);
- if($etablissement->etatPaiement() == Etablissement::PAIEMENT_OK || $etablissement->etatPaiement() == Etablissement::PAIEMENT_ESSAI)
- {
- $etablissement_paiement_ok = true ;
- }
- }
-
- // points de vente
- $points_vente = PointVente::find()
- ->with('pointVenteUser')
- ->where(['id_etablissement'=>$id_etablissement])
- ->andWhere('acces_restreint = 0 OR (acces_restreint = 1 AND (SELECT COUNT(*) FROM point_vente_user WHERE point_vente.id = point_vente_user.id_point_vente AND point_vente_user.id_user = :id_user) > 0)')
- ->params([':id_user' => Yii::$app->user->identity->id])
- ->all();
- $arr_points_vente = $points_vente;
-
- // jours de production
- $heure_limite = 20 ;
- $date = date('Y-m-d') ;
- if(isset($etablissement))
- {
- $heure_limite = $etablissement->heure_limite_commande ;
- if (date('H') >= $heure_limite) {
- $date = date('Y-m-d', strtotime(date('Y-m-d')) + ($etablissement->delai_commande)*(24*60*60) );
- } else {
- $date = date('Y-m-d', strtotime(date('Y-m-d')) + ($etablissement->delai_commande - 1)*(24*60*60));
- }
- }
-
- $jours_production = Production::find()
- ->where(['actif' => 1])
- ->andWhere('date > :date')
- ->andWhere(['id_etablissement'=>$id_etablissement])
- ->addParams([':date' => $date])
- ->all();
-
- $arr_jours_production = array('' => '--');
- foreach ($jours_production as $j)
- $arr_jours_production[$j->id] = date('d/m/Y', strtotime($j->date));
-
- // produits
- $produits = Produit::find()
- ->leftJoin('production_produit', 'produit.id = production_produit.id_produit')
- ->where(['produit.actif' => 1, 'id_etablissement' => $id_etablissement])
- ->andWhere('produit.vrac IS NULL OR produit.vrac = 0')
- ->orderBy('produit.order ASC')->all();
- $arr_produits = array();
- foreach ($produits as $p)
- $arr_produits[] = $p;
-
- // produits vrac
- $produits_vrac = Produit::find()->where(['actif' => 1, 'vrac' => 1])->orderBy('order ASC')->all();
-
- // produits selec
- $posts = Yii::$app->request->post();
- $produits_selec = [];
- if (isset($posts['Produit'])) {
- foreach ($posts['Produit'] as $key => $quantity) {
- $key = (int) str_replace('produit_', '', $key);
- $p = Produit::find()->where(['id' => $key])->one();
- if ($p && $quantity)
- $produits_selec[$p->id] = (int) $quantity;
- }
- }
- elseif (!is_null($commande)) {
- $produits_commande = CommandeProduit::find()->where(['id_commande' => $commande->id])->all();
- foreach ($produits_commande as $pc) {
- $produits_selec[$pc->id_produit] = (int) $pc->quantite;
- }
- }
-
- $produits_dispos = [];
- $production = null;
- if (!is_null($commande) && $commande->id_production) {
- $produits_dispos = ProductionProduit::findProduits($commande->id_production);
- $production = Production::find()->where(['id' => $commande->id_production])->one();
- }
-
- $commandes = Commande::find()
- ->where(['id_user' => Yii::$app->user->identity->id])
- ->all();
-
- if($id_etablissement)
- {
- $user_etablissement = UserEtablissement::find()
- ->where([
- 'id_etablissement' => $id_etablissement,
- 'id_user' => Yii::$app->user->identity->id
- ])
- ->one() ;
-
- $credit = $user_etablissement->credit ;
- }
- else {
- $credit = 0 ;
- }
-
- return [
- 'points_vente' => $arr_points_vente,
- 'jours_production' => $arr_jours_production,
- 'produits' => $produits,
- 'produits_selec' => $produits_selec,
- 'produits_dispos' => $produits_dispos,
- 'production' => $production,
- 'commandes_en_cours' => $commandes,
- 'produits_vrac' => $produits_vrac,
- 'etablissements' => $etablissements,
- 'id_etablissement' => $id_etablissement,
- 'etablissement_paiement_ok' => $etablissement_paiement_ok,
- 'credit' => $credit
- ];
- }
-
- public function actionIndex() {
-
- $model_form_etablissement = new AddEtablissementForm() ;
- if($model_form_etablissement->load(Yii::$app->request->post())
- && $model_form_etablissement->validate())
- {
- $model_form_etablissement->add() ;
- $model_form_etablissement->code = '' ;
- }
-
- // liste des etablissements
- $etablissements = Yii::$app->user->identity->getEtablissementsFavoris();
-
- // liste des boulangeries disponibles
- $arr_etablissements = Etablissement::getEtablissementsPopulateDropdown() ;
- $data_etablissements_dispos = $arr_etablissements['data'] ;
- $options_etablissements_dispos = $arr_etablissements['options'] ;
-
- // liste des commandes
- $commandes = Commande::find()
- ->with('commandeProduits', 'pointVente', 'creditHistorique')
- ->joinWith('production','production.etablissement')
- ->where(['id_user' => Yii::$app->user->id])
- //->andWhere('production.date < '.)
- ->orderBy('production.date DESC')
- ->limit(40)
- ->all();
-
- // initilisation commandes
- foreach ($commandes as $c)
- $c->init();
-
- return $this->render('index', [
- 'commandes' => $commandes,
- 'commande_ok' => Yii::$app->getRequest()->get('commande_ok', false),
- 'annule_ok' => Yii::$app->getRequest()->get('annule_ok', false),
- 'pate_deja_petrie' => Yii::$app->getRequest()->get('pate_deja_petrie', false),
- 'etablissements' => $etablissements,
- 'model_form_etablissement' => $model_form_etablissement,
- 'data_etablissements_dispos' => $data_etablissements_dispos,
- 'options_etablissements_dispos' => $options_etablissements_dispos,
- ]);
- }
-
- public function actionRemoveEtablissement($id = 0)
- {
- $user_etablissement = UserEtablissement::find()
- ->where(['id_etablissement'=>$id, 'id_user' => Yii::$app->user->identity->id])
- ->one() ;
-
- $user_etablissement->actif = 0 ;
- $user_etablissement->save() ;
-
- $this->redirect(['commande/index']) ;
- }
-
- public function actionCreate($id_etablissement = 0) {
-
- $commande = new Commande;
-
- $posts = Yii::$app->request->post();
-
- if($id_etablissement)
- $this->_verifEtablissementActif($id_etablissement) ;
-
- if ($commande->load($posts)) {
-
- $commande = Commande::find()->where('id_production = ' . $posts['Commande']['id_production'])->andWhere('id_user = ' . Yii::$app->user->id)->one();
- if (!$commande) {
- $commande = new Commande;
- $commande->load(Yii::$app->request->post());
- $commande->id_user = Yii::$app->user->id;
- $commande->date = date('Y-m-d H:i:s');
- $commande->type = Commande::TYPE_USER ;
- }
-
- $this->gestionForm($commande);
- }
-
- return $this->render('create', array_merge(self::initForm($commande), [
- 'model' => $commande,
- ]));
- }
-
- public function actionUpdate($id) {
-
- $commande = Commande::find()
- ->with('production')
- ->where(['id' => $id])
- ->one();
-
- if($commande->getEtat() != Commande::ETAT_MODIFIABLE)
- {
- throw new UserException('Cette commande n\'est pas modifiable.') ;
- }
-
- $this->_verifEtablissementActif($commande->production->id_etablissement) ;
-
- if ($commande && $commande->load(Yii::$app->request->post()))
- {
- $commande->date_update = date('Y-m-d H:i:s');
- $this->gestionForm($commande);
- }
-
-
- return $this->render('update', array_merge(self::initForm($commande), [
- 'model' => $commande,
- 'commande_introuvable' => !$commande,
- ]));
- }
-
- public function _verifEtablissementActif($id_etablissement)
- {
- $etablissement = Etablissement::findOne($id_etablissement) ;
- if($etablissement && !$etablissement->actif)
- {
- throw new NotFoundHttpException('Cet établissement est actuellement hors ligne.');
- }
- }
-
- public function gestionForm($commande) {
- $posts = Yii::$app->request->post();
- $produits = array();
-
- $quantite_totale = 0;
-
- foreach ($posts['Produit'] as $key => $quantity) {
- $key = (int) str_replace('produit_', '', $key);
- $p = Produit::find()->where(['id' => $key])->one();
- $quantite_totale += $quantity;
- if ($p && $quantity)
- $produits[] = $p;
- }
-
- // nombre de produits
- $err_nb_produits = false;
- if (!Yii::$app->user->identity->confiance && $quantite_totale > 3) {
- $err_nb_produits = true;
- }
-
- // date
- $err_date = false;
- $pate_deja_petrie = false;
- if (isset($commande->id_production)) {
- // date de commande
- $production = Production::find()->where(['id' => $commande->id_production])->one();
- if (date('H') >= 20) {
- $date = date('Y-m-d', strtotime(date('Y-m-d')) + 60 * 60 * 24);
- } else {
- $date = date('Y-m-d');
- }
-
- if ($production->date < $date) {
- $err_date = true;
- }
- }
-
- // point de vente
- $err_point_vente = false ;
- if(isset($production) && $production)
- {
-
- $ppv = ProductionPointVente::find()
- ->where([
- 'id_production' => $production->id,
- 'id_point_vente' => $posts['Commande']['id_point_vente']
- ])
- ->one() ;
-
- if(!$ppv || !$ppv->livraison)
- {
- $err_point_vente = true ;
- }
-
- $point_vente = PointVente::findOne($posts['Commande']['id_point_vente']) ;
-
- if($point_vente)
- {
- if(strlen($point_vente->code) && !$point_vente->verifCode($posts['code_point_vente_'.$point_vente->id]))
- {
- $err_point_vente = true ;
- }
- }
- else {
- $err_point_vente = true ;
- }
- }
-
- if ($commande->validate() && count($produits) && !$err_nb_produits && !$err_date && !$err_point_vente) {
-
- // gestion point de vente
- $pv = PointVente::find()
- ->with('pointVenteUser')
- ->where(['id' => $commande->id_point_vente])
- ->one() ;
- if($pv && strlen($pv->getCommentaire()))
- $commande->commentaire_point_vente = $pv->getCommentaire() ;
- else
- $commande->commentaire_point_vente = '' ;
-
- // sauvegarde de la commande
- $commande->save();
-
- // suppression de tous les enregistrements CommandeProduit
- if (!is_null($commande)) {
- CommandeProduit::deleteAll(['id_commande' => $commande->id]);
- }
-
- // produits dispos
- $produits_dispos = ProductionProduit::findProduits($production->id);
-
- // sauvegarde des produits
- foreach ($produits as $p) {
- // le produit doit etre dispo à la vente
- if (isset($produits_dispos[$p->id]) && $produits_dispos[$p->id]['actif']) {
-
- $commande_produit = new CommandeProduit();
- $commande_produit->id_commande = $commande->id;
- $commande_produit->id_produit = $p->id;
-
- $commande_produit->prix = $p->prix;
-
- $quantite_voulue = (int) $posts['Produit']['produit_' . $p->id];
- if ($produits_dispos[$p->id]['quantite_max'] && $quantite_voulue > $produits_dispos[$p->id]['quantite_restante'])
- $quantite_voulue = $produits_dispos[$p->id]['quantite_restante'];
-
- $commande_produit->quantite = $quantite_voulue;
-
- $commande_produit->save();
- }
- }
-
- // credit pain
- $credit_pain = isset($posts['credit_pain']) && $posts['credit_pain'] ;
- if($credit_pain && ($pv->credit_pain || $commande->getMontantPaye()))
- {
- $commande = Commande::find()
- ->with('commandeProduits')
- ->where(['id' => $commande->id])
- ->one() ;
- $commande->init() ;
- $montant_paye = $commande->getMontantPaye() ;
-
- // à payer
- if($commande->getStatutPaiement() == Commande::STATUT_IMPAYEE)
- {
- $montant_payer = $commande->montant - $montant_paye ;
- $credit = Yii::$app->user->identity->getCredit($production->id_etablissement) ;
-
- if($montant_payer > $credit)
- {
- $montant_payer = $credit ;
- }
-
- $commande->creditHistorique(
- CreditHistorique::TYPE_PAIEMENT,
- $montant_payer,
- $production->id_etablissement,
- Yii::$app->user->identity->id
- ) ;
- }
- // surplus à rembourser
- elseif($commande->getStatutPaiement() == Commande::STATUT_SURPLUS)
- {
- $montant_rembourser = $montant_paye - $commande->montant ;
- $commande->creditHistorique(
- CreditHistorique::TYPE_REMBOURSEMENT,
- $montant_rembourser,
- $production->id_etablissement,
- Yii::$app->user->identity->id
- ) ;
- }
- }
-
- // redirection
- $this->redirect(Yii::$app->urlManager->createUrl(['commande/index', 'commande_ok' => true, 'pate_deja_petrie' => $pate_deja_petrie]));
- }
- else {
- if (!count($produits))
- Yii::$app->session->setFlash('error', "Vous n'avez choisi aucun produit");
- if ($err_nb_produits)
- Yii::$app->session->setFlash('error', "Vous ne pouvez pas commander plus de 3 produits");
- if ($err_date)
- Yii::$app->session->setFlash('error', "Vous ne pouvez pas commander pour cette date.");
- if($err_point_vente)
- Yii::$app->session->setFlash('error', "Point de vente invalide.");
- }
- }
-
- public function actionAnnuler($id) {
-
- $commande = Commande::find()
- ->with('production','creditHistorique','commandeProduits')
- ->where(['id' => $id])
- ->one();
-
- if($commande->getEtat() != Commande::ETAT_MODIFIABLE)
- {
- throw new UserException('Vous ne pouvez plus annuler cette commande.') ;
- }
-
- $commande->init() ;
- if ($commande && Yii::$app->user->id == $commande->id_user) {
- // remboursement
- if($commande->getMontantPaye())
- {
- $commande->creditHistorique(
- CreditHistorique::TYPE_REMBOURSEMENT,
- $commande->getMontantPaye(),
- $commande->production->id_etablissement,
- Yii::$app->user->identity->id
- ) ;
- }
- // delete
- $commande->delete();
- CommandeProduit::deleteAll(['id_commande' => $commande->id]);
- }
-
- $this->redirect(Yii::$app->urlManager->createUrl(['commande/index', 'annule_ok' => true]));
- }
-
- public function actionVerifCodePointVente($id_point_vente, $code)
- {
- $point_vente = PointVente::findOne($id_point_vente) ;
- if($point_vente)
- {
- if($point_vente->verifCode($code))
- {
- return true ;
- }
- }
- return false ;
- }
-
- }
|