<?php
/*
 * REGNI Giorgio
 * Ma pizza online
 * Gestion du panier
 */
/*
 * Le script enregistre la variable $panier comme session panier
 */
// Un objet dans le panier
class Item {
  var $id; // id dans la base
  var $nb;
  var $type;
  var $article; // nom de l'article
  var $prix;
  var $commentaire;
//  var $express; 
  function Item($nid,$nnb,$narticle,$nprix)//,$nexpress)
    {
      $this->id = $nid;
      $this->nb = $nnb;
      $this->type="";
      $this->article= $narticle;
      $this->prix= $nprix;
//      $this->express= $nexpress;
    }
  function Total()
    {
      return $this->prix * $this->nb;
    }
  function SetCommentaire($supplément,$opération,$menu=false)
    {
	if (empty($supplément))
		unset($this->commentaire);
	elseif($opération == "ajouter")
	  {
		$this->commentaire[$supplément] += 1;
	  }
    	else
		$this->commentaire[$supplément] -= 1;
    }
}
// Un objet dans le panier
class Pizza extends Item {
  function Pizza($nid,$nnb,$ntaille,$narticle,$nprix)//,$nexpress)
    {
      $this->id = $nid;
      $this->nb = $nnb;
      $this->taille = $ntaille;
      $this->type = "pizza";
      $this->article= $narticle;
      $this->prix= $nprix;
//      $this->express= $nexpress;
    }
}
// Un menu dans le panier
class Menu extends Item {
  var $produits;
  var $produit_id;
  function Menu($nid,$nnb,$nproduit_id,$narticle,$nprix,$nproduits)//,$nexpress)
    {
      $this->id = $nid;
      $this->nb = $nnb;
      $this->produits = $nproduits;
      $this->type = "menu";
      $this->article= $narticle;
      $this->prix= $nprix;
      $this->produit_id = $nproduit_id;
//      $this->express = $nexpress;
    }
}
// Un plateau dans le panier
class Plateau extends Item {
  var $produits;
  var $produit_id;
  function Plateau($nid,$nnb,$nproduit_id,$narticle,$nprix,$nproduits)//,$nexpress)
    {
      $this->id = $nid;
      $this->nb = $nnb;
      $this->produits = $nproduits;
      $this->type = "plateau";
      $this->article= $narticle;
      $this->prix= $nprix;
      $this->produit_id = $nproduit_id;
//      $this->express = $nexpress;
    }
}
// Un supplement dans le panier
class Supplement extends Item {
  var $pizza;
  var $taille;
  function Supplement($nid,$nnb,$ntype,$narticle,$nprix,$npizza,$ntaille)
    {
      $this->id = $nid;
      $this->nb = $nnb;
      $this->type = $ntype;
      $this->article= $narticle;
      $this->prix= $nprix;
      $this->pizza = $npizza;
      $this->taille = $ntaille;
    }
}
// Un objet autre que pizza dans le panier
class Produit extends Item {
  var $type;
  function Produit($nid,$nnb,$ntype,$narticle,$nprix)//,$nexpress)
    {
      $this->id = $nid;
      $this->nb = $nnb;
      $this->type = $ntype;
      $this->article= $narticle;
      $this->prix= $nprix;
//      $this->express= $nexpress;
    }
}
// Un objet dans le panier de type quantite
class Indenombrable extends Item {
  var $unite_calc; // refernce pour le calcul du prix
  var $unite; // unite à afficher par ex / 100 g 
  var $produit_id;
  var $precision;
  function Indenombrable($nid,$nnb,$nproduit_id,$nunite,$nunite_calc,$narticle,$nprix,$nprecision='1')
    {
      $this->id = $nid;
      $this->nb = $nnb;
      $this->unite = $nunite;
      $this->unite_calc = $nunite_calc;
      $this->produit_id = $nproduit_id;
      $this->type="quantite";
      $this->article= $narticle;
      $this->prix= $nprix;
      $this->precision = $nprecision;
    }
  function Total()
    {
      $total=$this->prix*$this->nb/$this->unite_calc;
      switch($this->precision)
	{
	case '2':
	  $total= arrondi_2($total);
	  break;
	case '5':
	  $total= arrondi_5($total);
	  break;
	default:
	  $total= round($total,2);
	  break;
	}
      return $total;
    }
}

// Un coupon de réduction dans le panier
class Coupon  {
  var $id;
  var $publicite;
  var $nom;
  var $type;
  var $taille;
  var $valeur; // réduction
  var $jour; // jours pendant lesquels le coupon marche (tableau)
  var $debut;
  var $fin;
  var $actif;
  var $montant; // montant calculé sur le panier
  var $mode;  // livraison,emporte,surplace (tableau)
  var $type_produit; // le type de produit sur lequel le coupon s'applique
  var $motif; // motif dans le cas d'une remise exceptionnelle
  var $infos; // Infos client dans le cas d'un coupon fidélité en emporté
  var $cde_origine; // N° de la commande ayant donné droit au coupon pour les achats différés.
  var $produits; /* Produits éligibles pour l'application du coupon */
  
  function Coupon( $db_result )
    {
      $this->id = $db_result['idc'];
      $this->publicite = $db_result['publicite'];
      $this->type = $db_result['type'];
      $this->taille = $db_result['taille'];
      $this->nom = $db_result['nom']; // nom du coupon
      $this->valeur = $db_result['valeur']; // reduction
      $this->jour = $db_result['jour']; // jour pendant lesquels le coupon marche (tableau)
      $this->debut = $db_result['debut'];
      $this->fin = $db_result['fin'];
      $this->actif = $db_result['actif'];
      $this->mode = $db_result['mode']; // (tableau)
      $this->type_produit = $db_result['type_produit'];
      $this->motif = $db_result['motif']; // motif de la remise exceptionnelle
      $this->infos = $db_result['infos']; // infos client du coupon fidélité e, emporté
      $this->cde_origine = $db_result['cde_origine']; // N° de la commande ayant donné droit au coupon pour les achats différés.
      $this->produits = $db_result['produits']; /* Produits pour lesquels la
                                                   promo est applicable */
      $this->montant = 0;
    }
  /* verifie que ce coupon peut s'appliquer dans le panier
   * Teste le jour et le mode
   */
  function valide_coupon($panier)
    {
      /*
     echo '<pre>';
      print_r($this);
      echo '</pre>';
*/
      // coupon manager,personnel ou d'achat différé toujours applicables
      if ($this->type == "8" or $this->type == "11" or $this->type == "16" or $this->type == "17" or $this->type == "18")
	{
	  return true;
	}

      // valide le mode
	$modes = explode(',',$this->mode);
      if ( !in_array ( $panier->mode , $modes ) )
	return false;
      // valide le jour
      $convert_en_fr = array( 'monday'=>'lundi',
			      'tuesday'=>'mardi',
			      'wednesday'=>'mercredi',
			      'thursday'=>'jeudi',
			      'friday'=>'vendredi',
			      'saturday'=>'samedi',
			      'sunday'=>'dimanche'
			      );
      $jours = explode(',',$this->jour);
      if (!in_array($convert_en_fr[strtolower(date('l'))], $jours))
		return false;
	return true;
  }
  function valide_coupon_fidelite($panier,$client)
    {
      // valide le jour
      $convert_en_fr = array( 'monday'=>'lundi',
			      'tuesday'=>'mardi',
			      'wednesday'=>'mercredi',
			      'thursday'=>'jeudi',
			      'friday'=>'vendredi',
			      'saturday'=>'samedi',
			      'sunday'=>'dimanche'
			      );
      $jours = explode(',',$this->jour);
      return true;
  }
}//Fin de la classe Coupon

class Panier {
  var $items;
  var $coupons;
  var $mode;
  var $magic; // unique session id for this panier
  var $total;
  var $commentaire;
//  var $express;
  function Panier()
    {
      $this->items = array();
      $this->coupons = array();
      $this->mode = 'livraison';
      $this->magic= md5(uniqid(rand()));
      $this->total = 0;
      $this->commentaire= '';
//      $this->express="oui";
    }
  function SetCommentaire($str)
    {
      $this->commentaire=$str;
    }
  // retoune le numéro de l'objet ajouté
  function Ajouter($item)
    {
/*      if ($item->express=="non")
	$this->express="non";*/
      /* Si c'est un menu, on l'ajoute meme si il existe déjà! */
      if ($item->type == "menu" || $item->type == "plateau")
	{
	  $trouve = false;
	}
      else
	{
	  $trouve = false;
	  reset($this->items);
	  foreach($this->items as $key=>$old)
	    {
/*	      if ($old->express == "non");
	      $this->express="non";*/
	      if ($old->id == $item->id and $old->type == $item->type and !is_array($item->commentaire) and !is_array($old->commentaire))
		{
		  $this->items[$key]->nb += $item->nb;
		  $trouve = true;
		}
	    }
	}
      if ($trouve == false)
	$this->items[] = $item;
      return count($this->items)-1;
    }
  function Ajouter_Coupon($item)
    {
      $this->coupons[] = $item;
      return true;
    }
  // enlever l'item de numéro indiqué
  function Enlever($num)
    {
      $new = $this->items;
      unset($new[$num]);
      $this->items = array();
      //reconstruit le tableau
      foreach($new as $item)
	{
	  $this->items[]=$item;
	}
    }
  // enlevé l'item de numéro indiqué
  function Enlever_mini_panier($type,$num)
    {
      if($type==7)
	$type="menu";
      $new = $this->items;
      foreach($new as $clef=>$item)
	{
	  if($item->id==$num && $item->type==$type)
	  unset($new[$clef]);
	}
      $this->items = array();
      //reconstruit le tableau
      foreach($new as $item)
	{
	  $this->items[]=$item;
	}
    }
  // enlevé l'item de numéro indiqué
  function Enlever_Coupon($num)
    {
      //$new = $this->items;
      unset($this->coupons[$num]);
      //$this->items = array();
      //reconstruit le tableau
      //foreach($new as $item)
      //{
      //  $this->items[]=$item;
      //}
    }
  // Retourne le total du panier avant promo
  function Calcul_Valeur()
    {
      $total = 0;
      foreach( $this->items as $p_id=>$item)
	{ 
	  if ($item->nb>0)
	    {
	      $total+=$item->Total();
	    }
	}
      return $total;
    }
  /** 
   *  Remet à jour la valeur des coupons et les recalculs
   */
  function Calcul_Reduc()
    {
        $valeur = 0;
        $produits = array();
        /*
         * Classer le contenu du panier suivant le type des objets
         */
        foreach( $this->items as $key=>$item ) 
          {
              switch($item->type)
                {
                  case 'quantite':
                    if (!is_array($produits[$item->produit_id]))
                      $produits[$item->produit_id]=array();
                    for($i=0;$i<$item->nb;$i++)
                      $produits[$item->produit_id][]=$item->prix;
                    break;
                  case 'pizza':
                    if (!is_array($produits[1]))
                      {
                          $produits[1]=array();
                          $produits_par_id[1]=array();
                      }
                    if (!is_array($produits[1][$item->taille]))
                      {
                          $produits[1][$item->taille]=array();
                          $produits_par_id[1][$item->taille]=array();
                      }
                    for($i=0;$i<$item->nb;$i++)
                      {
                          $produits[1][$item->taille][]=$item->prix;
                          $produits_par_id[1][$item->id][]=$item->prix;
                      }
                    break;
                  case '17':
                    if (!is_array($produits[1]))
                      $produits[1-$item->taille]=array();
                    if (!is_array($produits[1][$item->taille]))
                      $produits[1-$item->taille][$item->taille]=array();
                    for($i=0;$i<$item->nb;$i++)
                      $produits[1-$item->taille][$item->taille][]=$item->prix;
                    break;
                  case 'menu':
                    if (!is_array($produits[$item->produit_id]))
                      {
                          $produits[$item->produit_id]=array();
                          $produits_par_id[$item->produit_id]=array();
                      }
                    for($i=0;$i<$item->nb;$i++)
                      {
                          $produits[$item->produit_id][]=$item->prix;
                          $produits_par_id[$item->produit_id][$item->id][]=$item->prix;
                      }
                    break;
                  case 'plateau':
                    if (!is_array($produits[$item->produit_id]))
                      {
                          $produits[$item->produit_id]=array();
                          $produits_par_id[$item->produit_id][$item->id]=array();
                      }
                    for($i=0;$i<$item->nb;$i++)
                      {
                          $produits[$item->produit_id][]=$item->prix;
                          $produits_par_id[$item->produit_id][$item->id][]=$item->prix;
                      }
                    break;
                  default:
                    if (!is_array($produits[$item->type]))
                      {
                          $produits[$item->type]=array();
                          $produits_par_id[$item->type]=array();
                      }
                    for($i=0;$i<$item->nb;$i++)
                      {
                          $produits[$item->type][]=$item->prix;
                          $produits_par_id[$item->type][$item->id][]=$item->prix;
                      }
                    break;
                }
          }
        
      // reclasser
      foreach($produits as $id=>$prix_produit)
	{
	  if ($id==1)
	    {
	      // Pour les pizzas, classer les tailles aussi
	      foreach( $prix_produit as $taille=>$pizza_prix )
		{
		  rsort($produits[$id][$taille]);
		}
	    }
	  else
	    {
	      rsort($produits[$id]);
	    }
	}
      
      
      /*echo '<pre>';
      print_r($produits);
      echo '</pre>';*/
        
        /** 
         *  Parcours des coupons
        */
        if (is_array($this->coupons))
          {
              $prix_filtres = array();
              foreach( $this->coupons as $p_id=>$coupon)
                {
                    $ok=false;
                    $coupon->montant = 0;
                    
                    /* PB: vérifier si le coupon peut s'appliquer ? */
                    /* coupon Manager, Personnel, Ticket_after, Coupon
                       fidélité toujours applicable et invariable, ne dépend
                       pas du contenu du panier */
                    if ($coupon->type == "8" or $coupon->type == "11" or $coupon->type == "16" or $coupon->type == "18")
                      {
                          $coupon->montant=$coupon->valeur;
                          $ok=true;
                      }
                    elseif ($coupon->type == "6")
                      {
                          /* % de la vente calculer le total */
                          $coupon->montant = round($this->Calcul_Valeur()*$coupon->valeur/100.0,2);
                          $ok=true;
                      }
                    elseif ($coupon->type == "14")
                      {
                          /*remise sur la vente calculer le total */
                          $coupon->montant = $coupon->valeur;
                          $ok=true;
                      }
                    else
                      {
                          /*Spécifier la liste de prix qui nous intéresse en
                            fonction du type du coupon*/
                          $trouve = 0;
                          $tableau_filtrant = array();
                          if ( $coupon->type_produit == "1" )
                            {
                                /* 
                                 * pizza: vérifier la taille aussi 
                                 * reste à vérifier les coupons qui marchent pour toutes les pizzas
                                 */
                                if( $coupon->produits )
                                   {
                                       /** 
                                        * Seules certaines pizzas sont
                                        * éligibles
                                        */
                                       if( strstr( $coupon->produits  , ','  ) )
                                         {
                                             /** 
                                              * Plusieurs pizzas sont éligibles
                                              */
                                             $tableau_filtrant_pizza = array();
                                             $tableau_filtrant_pizza = explode( ',' , $coupon->produits );
                                             if( count( $produits[$coupon->type_produit][$coupon->taille] ) > 0 )
                                               {
                                                   foreach( $tableau_filtrant_pizza as $id_pizza )
                                                     {
                                                         if( is_array( $produits_par_id[$coupon->type_produit][$id_pizza] ) )
                                                           {
                                                               foreach( $produits_par_id[$coupon->type_produit][$id_pizza] as $prix_filtre )
                                                                 {
                                                                     if( count( $prix_filtres[$coupon->id][$coupon->type_produit][$coupon->taille] ) < count( $produits[$coupon->type_produit][$coupon->taille] ) && in_array( $prix_filtre, $produits[$coupon->type_produit][$coupon->taille] ) )
                                                                       {
                                                                           $prix_filtres[$coupon->id][$coupon->type_produit][$coupon->taille][]  = $prix_filtre;
                                                                           array_shift( $produits_par_id[$coupon->type_produit][$id_pizza] );
                                                                       }
                                                                 }
                                                           }
                                                     }
                                               }
                                         }      
                                       else
                                         {
                                             /** 
                                              * Une seule pizza est éligible
                                              */
                                             if( count( $produits_par_id[$coupon->type_produit][$coupon->produits] ) > 0 )
                                               {
                                                   $prix[$coupon->type_produit][$coupon->taille][$coupon->produits] = &$produits_par_id[$coupon->type_produit][$coupon->produits];
                                               }        
                                         }
                                       $trouve = count( $prix_filtres[$coupon->id][$coupon->type_produit][$coupon->taille] );
                                   }
                                else
                                  {
                                       /** 
                                        * Toutes pizzas de cette taille sont
                                        * valables
                                        */
                                      if ( count( $produits[$coupon->type_produit][$coupon->taille] ) > 0 )
                                        {
                                            /*Il reste des pizzas de
                                             * cette taille
                                             * dans le panier !*/
                                            $prix[$coupon->type_produit][$coupon->taille] = &$produits[$coupon->type_produit][$coupon->taille];
                                            $trouve = count($prix[$coupon->type_produit][$coupon->taille]);
                                        }
                                  }
                                   /** 
                                    * Fin de la catégorie pizza
                                    */
                            }
                          elseif ( $coupon->type == 19 )
                            {
                                /* 
                                 * Coupon menu
                                 */
                                $produit = array();
                                $trouve_ensemble = array();
                                foreach( $coupon->type_produit as $id_type_produit=>$produit )
                                  {
                                      $trouve_ensemble[$id_type_produit] = false;
                                      if ( $id_type_produit == 1)
                                        {
                                            $tailles = $produit;
                                            foreach( $tailles as $id_taille=>$taille )
                                              {
                                                  if( count( $produits[$id_type_produit][$id_taille] ) > 0 )
                                                    {
                                                        $prix[$id_type_produit][$id_taille] = &$produits[$id_type_produit][$id_taille]; 
                                                    }
                                                  $trouve_ensemble[$id_type_produit][$id_taille] = count( $prix[$id_type_produit][$id_taille] );
                                              }
                                            unset( $tailles );
                                        }
                                      else
                                        {
                                            /* 
                                             * Autres produits
                                             */
                                            if( $produit['produits'] )
                                              {
                                                  /* Seuls certains
                                                   * produit(s)
                                                   * donné(s) de
                                                   * la catégorie
                                                   * sont éligibles */
                                                  if( strstr( $produit['produits']  , ','  ) )
                                                    {
                                                        /** 
                                                         * Plusieurs ids
                                                         */
                                                        $tableau_filtrant = array();
                                                        $tableau_filtrant = explode( ',' , $produit['produits'] );
                                                        if( count( $produits[$id_type_produit] ) > 0 )
                                                          {
                                                              foreach( $tableau_filtrant as $id_produit )
                                                                {
                                                                    if( is_array( $produits_par_id[$id_type_produit] ) )
                                                                      {
                                                                          foreach( $produits_par_id[$id_type_produit][$id_produit] as $prix_filtre )
                                                                            {
                                                                                if( count( $prix_filtres[$coupon->id][$id_type_produit] ) < count( $produits[$id_type_produit] ) && in_array( $prix_filtre, $produits[$id_type_produit] ) )
                                                                                  {
                                                                            $prix_filtres[$coupon->id][$id_type_produit][] = $prix_filtre;
                                                                            array_shift( $produits_par_id[$id_type_produit][$id_produit] );
                                                                                  }
                                                                             }
                                                                       }        
                                                                }    
                                                                          print_r( $prix_filtres );
                                                                          die();
                                                                          
                                                                          
                                                          }
                                                        die();
                                                        
                                                    }
                                                  else
                                                    {
                                                        /** 
                                                         * Un seul
                                                         * produit est éligible
                                                         */
                                                        
                                                        if( count( $produits_par_id[$id_type_produit][$produit['produits']] ) )
                                                          {
                                                              $prix[$id_type_produit][$produit['produits']] = &$produits_par_id[$id_type_produit][$produit['produits']];
                                                          }
                                                    }
                                                  $trouve_ensemble[$id_type_produit] = count( $prix_filtres[$id_type_produit] );
                                              }
                                        }
                                  }
                            }    
                          else
                            {
                                /* 
                                 * Autres produits
                                 */
                                if ( count( $produits[$coupon->type_produit] ) > 0 )
                                  {
                                      /** 
                                       * Il reste des produits de ce type dans le panier !
                                       */
                                      $prix[$coupon->type_produit]=&$produits[$coupon->type_produit];
                                      $trouve=count($prix[$coupon->type_produit]);
                                  }
                            }
                          /*echo'<pre>';
                          print_r( $produits );
                          echo'</pre>';*/
                          /** 
                           * Action variable selon le type de coupon
                           */
                          if ( in_array( $coupon->type , array( '1','2','4','5','7','9','10','11','12' ) ) and ( $trouve >= 2 ) )
                            {	
                                switch($coupon->type)
                                  {
                                    case '4':
                                      /** 
                                       * Réduction sur 2 produits achetés
                                       */
                                      $coupon->montant = $coupon->valeur;
                                      if( $coupon->type_produit == "1" )
                                        {
                                            array_shift( $prix[$coupon->type_produit][$coupon->taille] );
                                            array_shift( $prix[$coupon->type_produit][$coupon->taille] );
                                        }
                                      else
                                        {
                                            array_shift( $prix[$coupon->type_produit] );
                                            array_shift( $prix[$coupon->type_produit] );
                                        }
                                      $ok=true;
                                      break;
                                    case '5':
                                      /** 
                                       *  -50% sur le deuxième produit acheté
                                       */
                                      if( $coupon->type_produit == "1" )
                                        {
                                            array_shift( $prix[$coupon->type_produit][$coupon->taille] );
                                            $coupon->montant = array_pop($prix[$coupon->type_produit][$coupon->taille])/2;
                                        }
                                      else
                                        {
                                            array_shift( $prix[$coupon->type_produit] );
                                            $coupon->montant = array_pop($prix[$coupon->type_produit] ) / 2;
                                        }
                                      $ok=true;
                                      break;
                                    case '10':
                                      /** 
                                       * 2 ième produit à x euros
                                       */
                                      if( $coupon->type_produit == "1" )
                                        {
                                            array_shift( $prix[$coupon->type_produit][$coupon->taille] );
                                            $coupon->montant = array_pop( $prix[$coupon->type_produit][$coupon->taille] ) - $coupon->valeur;
                                        }
                                      else
                                        {
                                            array_shift( $prix[$coupon->type_produit] );
                                            $coupon->montant = array_pop( $prix[$coupon->type_produit] ) - $coupon->valeur;
                                        }
                                      $ok=true;
                                      break;
                                    case '1':
                                      /** 
                                       *  1 produit acheté = 1 produit offert
                                       */
                                      if( $coupon->type_produit == "1" )
                                        {
                                            $coupon->montant = array_pop( $prix[$coupon->type_produit][$coupon->taille] );
                                            array_shift( $prix[$coupon->type_produit][$coupon->taille] );
                                        }
                                      else
                                        {
                                            $coupon->montant = array_pop( $prix[$coupon->type_produit] );
                                            array_shift( $prix[$coupon->type_produit] );
                                        }
                                      $ok=true;
                                      break;
                                    case '2':
                                      /** 
                                       *  2 produits au choix =
                                       */
                                      if( $coupon->type_produit == "1" )
                                        $coupon->montant = array_pop( $prix[$coupon->type_produit][$coupon->taille] ) + @array_pop( $prix[$coupon->type_produit][$coupon->taille] ) - $coupon->valeur;
                                      else
                                        $coupon->montant = array_pop( $prix[$coupon->type_produit][$coupon->taille] ) + @array_pop( $prix[$coupon->type_produit][$coupon->taille] ) - $coupon->valeur;
                                      $ok=true;
                                      break;
                                    case '12':
                                      /** 
                                       *  3 produits au choix =
                                       */
                                      if ( $trouve>=3 )
                                        {
                                            if( $coupon->type_produit == "1" )
                                              $coupon->montant = array_pop( $prix[$coupon->type_produit][$coupon->taille] ) + array_pop( $prix[$coupon->type_produit][$coupon->taille] ) + array_pop( $prix[$coupon->type_produit][$coupon->taille] ) - $coupon->valeur;
                                            else
                                              $coupon->montant = array_pop( $prix[$coupon->type_produit] ) + array_pop( $prix[$coupon->type_produit] ) + array_pop( $prix[$coupon->type_produit] ) - $coupon->valeur;
                                            $ok=true;
                                        }
                                      break;
                                    case '7':
                                      /** 
                                       * 3 produits pour le prix de 2
                                       */
                                      if ( $trouve>=3 )
                                        {
                                            if( $coupon->type_produit == "1" )
                                              {
                                                  $coupon->montant = array_pop( $prix[$coupon->type_produit][$coupon->taille] );
                                                  array_shift( $prix[$coupon->type_produit][$coupon->taille] );
                                                  array_shift( $prix[$coupon->type_produit][$coupon->taille] );
                                              }
                                            else
                                              {
                                                  $coupon->montant = array_pop( $prix[$coupon->type_produit] ); 
                                                  array_shift( $prix[$coupon->type_produit] );
                                                  array_shift( $prix[$coupon->type_produit] );
                                              }
                                            $ok=true;
                                        }
                                      break;
                                    case '9':
                                      /** 
                                       *  4 produits pour le prix de 2
                                       */
                                      if ( $trouve>=4 )
                                        {
                                            if( $coupon->type_produit == "1" )
                                              {
                                                  $coupon->montant = array_pop( $prix[$coupon->type_produit][$coupon->taille] );
                                                  $coupon->montant += array_pop( $prix[$coupon->type_produit][$coupon->taille] );
                                                  array_shift( $prix[$coupon->type_produit][$coupon->taille] );
                                                  array_shift( $prix[$coupon->type_produit][$coupon->taille] );
                                              }
                                            else
                                              {
                                                  $coupon->montant = array_pop( $prix[$coupon->type_produit] );
                                                  $coupon->montant += array_pop( $prix[$coupon->type_produit] );
                                                  array_shift( $prix[$coupon->type_produit] );
                                                  array_shift( $prix[$coupon->type_produit] );
                                              }
                                            $ok=true;
                                        }
                                      break;
                                  }
                            }
                          elseif ( $coupon->type == '3' && $trouve > 0 )
                            {
                                /** 
                                 *  Promotion du type réduction sur 1 produit
                                 */
                                if ( $coupon->type_produit == "1" )
                                  array_shift( $prix[$coupon->type_produit][$coupon->taille] );
                                else
                                  array_shift( $prix[$coupon->type_produit] );
                                $coupon->montant = $coupon->valeur;
                                $ok=true;
                            }
                          elseif ( $coupon->type == '13' && $trouve > 0 )
                            {
                                /** 
                                 * Promotion du type "1 produit à un prix
                                 * déterminé"
                                 */
                                if ( $coupon->type_produit == "1" )
                                  {
                                      if ( $coupon->produits )
                                        {
                                            $coupon->montant = array_pop( $prix_filtres[$coupon->id][$coupon->type_produit][$coupon->taille] ) - $coupon->valeur;
                                            unset( $produits[$coupon->type_produit][$coupon->taille][array_search( $coupon->montant + $coupon->valeur, $produits[$coupon->type_produit][$coupon->taille] )] );
                                        }
                                      else
                                        $coupon->montant = array_pop( $prix[$coupon->type_produit][$coupon->taille] ) - $coupon->valeur;
                                  }
                                else
                                  $coupon->montant = array_pop( $prix[$coupon->type_produit] ) - $coupon->valeur;
                                $ok=true;
                            }
                          elseif ( $coupon->type == '15' or $coupon->type == '17' )
                            {
                                /** 
                                 * 1 produit offert
                                 */
                                if ( $coupon->type_produit == "1" )
                                  {
                                      $coupon->montant = array_pop($prix[$coupon->type_produit][$coupon->taille]);
                                      array_shift( $prix[$coupon->type_produit][$coupon->taille] );
                                  }
                                else
                                  {
                                      $coupon->montant = array_pop($prix[$coupon->type_produit] );
                                      array_shift( $prix[$coupon->type_produit] );
                                  }
                                $ok = true;
                            }
                          elseif ( $coupon->type == '19' )
                            {
                                /** 
                                 * 1 ensemble de produits à un prix de
                                 */
                                $ok = true;
                                /** 
                                 * Vérification de la présence de la
                                 * quantité nécessaire de tous les éléments
                                 * requis
                                 */
                                foreach( $coupon->type_produit as $id_type_produit=>$produit )
                                  {
                                      if( $id_type_produit == 1 )
                                        {
                                            $tailles = $produit;
                                            foreach( $tailles as $id_taille=>$taille )
                                              {
                                                  if ( $trouve_ensemble[$id_type_produit][$id_taille] < $taille['nb'] )
                                                    $ok = false;
                                              }
                                        }
                                      else
                                        {
                                            if ( $trouve_ensemble[$id_type_produit] < $produit['nb'] )
                                              $ok = false;
                                        }
                                  }
                                if ( $ok )
                                  {
                                      /** 
                                       * Pour ce coupon le sens de
                                       dépilage du tableau importe peu
                                       car aucun produit n'est offert
                                       */
                                      foreach( $coupon->type_produit as $id_type_produit=>$produit )
                                        {
                                            if( $id_type_produit == 1 )
                                              {
                                                  $tailles = $produit;
                                                  foreach( $tailles as $id_taille=>$taille )
                                                    {
                                                        for( $i=0 ; $i<$taille['nb'] ; $i++ )
                                                          {
                                                              $coupon->montant += array_pop( $prix[$id_type_produit][$id_taille] );
                                                          }
                                                    }
                                                  unset( $tailles );
                                              }
                                            else
                                              {
                                                  
                                                  if( $produit['produits'] )
                                              {
                                                  /* Seuls certains
                                                   * produit(s)
                                                   * donné(s) de
                                                   * la catégorie
                                                   * sont éligibles */
                                                  if( strstr( $produit['produits']  , ','  ) )
                                                    {
                                                        /** 
                                                         * Plusieurs ids
                                                         */
                                                        $tableau_filtrant = array();
                                                        $tableau_filtrant = explode( ',' , $produit['produits'] );
                                                        foreach( $tableau_filtrant as $id_produit )
                                                          {
                                                              $prix[$id_type_produit] = array_merge( $prix[$id_type_produit] , $produits_par_id[$id_type_produit][$id_produit] );
                                                                } 
                                                          }
                                                    }       
                                                  else
                                                    {
                                                        /** 
                                                         * Un seul
                                                         * produit est éligible
                                                         */
                                                        if( count( $produits_par_id[$id_type_produit][$produit['produits']] ) )
                                                          {
                                                              $prix[$id_type_produit][$produit['produits']] = &$produits_par_id[$id_type_produit][$produit['produits']];
                                                          }
                                                    }
                                                  for( $i=0 ; $i<$produit['nb'] ; $i++ )
                                                    {
                                                        $coupon->montant += array_pop( $prix[$id_type_produit] );
                                                    }
                                                  
                                              }     
                                        }
                                      $coupon->montant -= $coupon->valeur;
                                  }
                            }
                      }
                    /** 
                     * Fin des coupons fonction du contenu du panier
                     */
                    /** 
                     * Traitement des prix planchers pour la livraison
                     * Vérifier si les planchers sont activés et si oui les
                     * appliquer
                     */
                    $sql = new DB();
                    $sql->query("SELECT *
                           FROM livraison_type");
                    $sql->next_object();
                    $livraison_type = $sql->object;
                    $sql->free();
                    unset($sql);
                    if( $this->mode == "livraison" && $livraison_type->activation_plancher )
                      {
                          if( $this->Calcul_Valeur() - $coupon->montant < $livraison_type->plancher )
                            $coupon->montant = 0;
                      }
                    $this->coupons[$p_id]=$coupon; // parce que foreach travaille sur une copie
                      $valeur += $coupon->montant;
                }
              /** 
               * Fin du parcours des coupons du panier
               */
          }
        return $valeur;
    }
}
?>
