Modification du panier

9 messages dans ce sujet

Posté(e) · Signaler ce message

Bonjour,

Je souhaiterais afficher le bouton valider la commande dans le panier lorsque toutes les conditions imposées sont réunies. J'ai créée une table pour ses nouvelles conditions et ajouter les champs nécessaires dans la fiche produit. J'ai modifié les class caddie et produits en conséquence et les fichiers langues. Tout cela fonctionne.

J'ai modifié le fichier "caddie_content_html.tpl" ainsi (vers ligne 104) :

{if $is_minimum_error}
									<p class="center">
										{if !empty($STR_MINIMUM_PURCHASE_ONLY_50)}
											{$STR_MINIMUM_PURCHASE_ONLY_50}
										{/if}	
										
										{if !empty($STR_MINIMUM_PURCHASE_ONLY_75)}
											{$STR_MINIMUM_PURCHASE_ONLY_75}	
										{/if}
										
										{if !empty($STR_MINIMUM_PURCHASE_OF) && !empty($minimum_prix) && !empty($STR_REQUIRED_VALIDATE_ORDER)}	
											{$STR_MINIMUM_PURCHASE_OF}{$minimum_prix}{$STR_REQUIRED_VALIDATE_ORDER}
										{/if}
											
									</p>
								{else}
									<p class="center">
									{if !empty($recommanded_product_on_cart_page)}
										{$recommanded_product_on_cart_page}
									{elseif (!empty($STR_ORDER))}
										<button type="submit" class="tooltip_link btn btn-lg btn-primary"{if !empty($shipping_text)} data-toggle="tooltip" title="{$shipping_text|str_form_value}"{/if} onclick="return frmsubmit('commande')">{$STR_ORDER} <span class="glyphicon glyphicon-chevron-right"></span></button>
									{/if}
									</p>
								{/if}

et dans le fichier display_caddie.php, j'ai modifié la fonction get_caddie_content_html ainsi :

// PANIER SUPÉRIEUR AU MONTANT MINIMUM
			else {
				
				// MYM Vérifier les quantités minimums pour chaque type de produit
				$sqlTypeProd = 'SELECT id, technical_code, quantitemin 
								FROM peel_produits_type';
				$resTypeProd = query($sqlTypeProd);				
				while ($type_produit = fetch_assoc($resTypeProd)) {
				
					if ($type_produit['technical_code'] == 'type_50cl') { $btle50 = $type_produit['quantitemin']; 
						echo '<br />qte minimum 50 '.$btle50; }
					if ($type_produit['technical_code'] == 'type_75cl') { $btle75 = $type_produit['quantitemin']; 
						echo '<br />qte minimum 75 '.$btle75; }

								
					// UNIQUEMENT DES 50 CL
					if (!empty($_SESSION['session_caddie']->total_type_50cl) 
						&& empty($_SESSION['session_caddie']->total_type_75cl)
						&& empty($_SESSION['session_caddie']->total_type_magnum)
						&& empty($_SESSION['session_caddie']->total_type_bib5)
						&& empty($_SESSION['session_caddie']->total_type_bib10)
						&& empty($_SESSION['session_caddie']->total_type_plv)) {
						if ($_SESSION['session_caddie']->total_type_50cl >= $btle50 && ($_SESSION['session_caddie']->total_type_50cl % 12 == 0)) {
							$tpl->assign('is_minimum_error', false);
							// FINALISER VOTRE COMMANDE
							$tpl->assign('STR_ORDER', $GLOBALS['STR_ORDER']);
						}
						else {
							$tpl->assign('is_minimum_error', true);
							$tpl->assign('STR_MINIMUM_PURCHASE_ONLY_50', $GLOBALS['STR_MINIMUM_PURCHASE_ONLY_50']);
							//$tpl->assign('STR_REQUIRED_VALIDATE_ORDER', $GLOBALS['STR_REQUIRED_VALIDATE_ORDER']);
						}
					}
					
					// UNIQUEMENT DES 75 CL
					if (empty($_SESSION['session_caddie']->total_type_50cl) 
						&& !empty($_SESSION['session_caddie']->total_type_75cl)
						&& empty($_SESSION['session_caddie']->total_type_magnum)
						&& empty($_SESSION['session_caddie']->total_type_bib5)
						&& empty($_SESSION['session_caddie']->total_type_bib10)
						&& empty($_SESSION['session_caddie']->total_type_plv)) {
						if ($_SESSION['session_caddie']->total_type_75cl >= $btle75 && ($_SESSION['session_caddie']->total_type_75cl % 6 == 0)) {
							$tpl->assign('is_minimum_error', false);
							// FINALISER VOTRE COMMANDE
							$tpl->assign('STR_ORDER', $GLOBALS['STR_ORDER']);
						}
						else {
							$tpl->assign('is_minimum_error', true);
							$tpl->assign('STR_MINIMUM_PURCHASE_ONLY_75', $GLOBALS['STR_MINIMUM_PURCHASE_ONLY_75']);
							//$tpl->assign('STR_REQUIRED_VALIDATE_ORDER', $GLOBALS['STR_REQUIRED_VALIDATE_ORDER']);
						}
					}
				}

 

La modification apportée à cette fonction déclenche le message d'erreur suivant :

PHP Notice: Trying to get property of non-object sur is_minimum_error

Pouvez vous m'aider.

 

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Posté(e) · Signaler ce message

Bonjour,

Visiblement dans votre test vous ne passer pas dans une des condition qui défini la variable is_minimum_error. Pour corriger ce problème vous pouvez définir is_minimum_error à au début de la fonction avec une valeur par défaut, pour que is_minimum_error soit défini tout le temps

Partager ce message


Lien à poster
Partager sur d’autres sites

Posté(e) · Signaler ce message

Bonjour Simon,

Dans la version d'origine dans le fichier display_caddie.php (que je modifie), la variable is_minimum_error n'est pas défini. Vous pouvez êtes plus précis, s'il vous plait.

Partager ce message


Lien à poster
Partager sur d’autres sites

Posté(e) · Signaler ce message

J'ai trouvé, merci Simon.

Partager ce message


Lien à poster
Partager sur d’autres sites

Posté(e) · Signaler ce message

Simon

Toujours dans la modification de ce panier, dans la class caddie, j'ai ajouté les lignes suivantes dans la fonction update_line() :

// Total type produit 50 cl de la ligne
        if ($product_object->type_btle = 1) {$this->type_50cl[$numero_ligne] = $this->quantite[$numero_ligne];}
        // MYM Total type produit 75 cl de la ligne
        if ($product_object->type_btle = 2) {$this->type_75cl[$numero_ligne] = $this->quantite[$numero_ligne];}
        // MYM Total type produit magnum de la ligne
        if ($product_object->type_btle = 3) {$this->type_magnum[$numero_ligne] = $this->quantite[$numero_ligne];}    
        // MYM Total type produit bib 5l de la ligne
        if ($product_object->type_btle = 4) {$this->type_bib5[$numero_ligne] = $this->quantite[$numero_ligne];}    
        // MYM Total type produit bib 10l de la ligne
        if ($product_object->type_btle = 5) {$this->type_bib10[$numero_ligne] = $this->quantite[$numero_ligne];}    
        // MYM Total type produit plv de la ligne
        if ($product_object->type_btle = 6) {$this->type_plv[$numero_ligne] = $this->quantite[$numero_ligne];}

J'ai le message d'erreur suivant : Warning: Cannot use a scalar value as an array pour les 6 lignes.

J'ai pris l'exemple du poids de la bouteille pour modifier la class caddie.

Merci de votre aide.

Partager ce message


Lien à poster
Partager sur d’autres sites

Posté(e) · Signaler ce message

Attention j'ai bien mis dans ma programmation == 1, == 2, etc dans la condition.

Partager ce message


Lien à poster
Partager sur d’autres sites

Posté(e) · Signaler ce message

Bonjour,

le message d'erreur indique que vous utilisez des valeurs comme des tableaux alors qu'elle ne le sont pas. Dans votre message précédent vous utilisiez && empty($_SESSION['session_caddie']->total_type_bib5)  par exemple, et non pas $this->type_bib5[$numero_ligne]. Le problème vient peut-être de là.

Partager ce message


Lien à poster
Partager sur d’autres sites

Posté(e) · Signaler ce message

Bonjour Simon,

Oui en effet j'avais compris le message mais c'est la manière dont vous rédigez dans le fichier class Caddie.php. En procédurale sur la version 6, je n'avais pas de souci, j'intervenais sur caddie_ajout. La tout se trouve dans la class Caddie.php. 

Chaque produit a un type définit dans la variable $type_btle. 6 cas possibles : type_50cl, type_75cl, type_magnum, type_bib5, type_bib10, type_plv.
J'ai besoin, pour chaque ligne du caddie, d'attribuer la quantité saisie à la bonne $type_xxx.
Ensuite, il faut additionner tous les $type_xxx identique dans une variable total_type_xxx.

Enfin, en fonction du type, on contrôle les quantités minimales autorisées et on affiche le bouton valider la commande ou alors on affiche un message d'erreur de quantité.

Dans mon fichier Caddie.php j'ai suivi l'exemple de la variable poids. Cependant, ma variable total_type_xxx ne s'alimente pas.

Pouvez-vous regarder mon code :

<?php
// This file should be in UTF8 without BOM - Accents examples: éèê
// +----------------------------------------------------------------------+
// | Copyright (c) 2004-2015 Advisto SAS, service PEEL - contact@peel.fr  |
// +----------------------------------------------------------------------+
// | This file is part of PEEL Shopping 7.2.1, which is subject to an	  |
// | opensource GPL license: you are allowed to customize the code		  |
// | for your own needs, but must keep your changes under GPL			  |
// | More information: https://www.peel.fr/lire/licence-gpl-70.html		  |
// +----------------------------------------------------------------------+
// | Author: Advisto SAS, RCS 479 205 452, France, https://www.peel.fr/	  |
// +----------------------------------------------------------------------+
// $Id: Caddie.php 44077 2015-02-17 10:20:38Z sdelaporte $
if (!defined('IN_PEEL')) {
	die();
}
/**
 * Caddie
 *
 * @package PEEL
 * @author PEEL <contact@peel.fr>
 * @copyright Advisto SAS 51 bd Strasbourg 75010 Paris https://www.peel.fr/
 * @version $Id: Caddie.php 44077 2015-02-17 10:20:38Z sdelaporte $
 * @access public
 */
class Caddie {
	/* Déclaration des tableaux */

	/* gestion de la liste cadeau */
	var $giftlist_owners = array();
	/* Tableau des articles */
	var $articles = array();
	/* Tableau des quantités */
	var $quantite = array();
	/* Tableau des poids (pour chaque ligne, le poids est déjà multiplié par la quantité) */
	var $poids = array();

	/* MYM */
	/* Tableau des type de produit bouteille 50cl */
	var $type_50cl = array();
	/* Tableau des type de produit bouteille 75cl */
	var $type_75cl = array();
	/* Tableau des type de produit bouteille magnum */
	var $type_magnum = array();
	/* Tableau des type de produit bib 5 litres */
	var $type_bib5 = array();
	/* Tableau des type de produit bib 10 litres */
	var $type_bib10 = array();
	/* Tableau des type de produit objet plv */
	var $type_plv = array();
	/* FIN MYM */

	/* Tableau des points (pour chaque ligne, points est déjà multiplié par la quantité) */
	var $points = array();
	/* Tableau des couleurs */
	var $couleurId = array();
	/* Tableau des tailles */
	var $tailleId = array();
	/* Tableau des prix unitaire TTC*/
	var $prix = array();
	/* Tableau des prix unitaire HT*/
	var $prix_ht = array();
	/* Tableau des prix unitaire TTC*/
	var $prix_cat = array();
	/* Tableau des prix unitaire HT*/
	var $prix_cat_ht = array();
	/* Tableau prix TTC d'un produit avant l'application d'un code promotionnel*/
	var $prix_avant_code_promo = array();
	/* Tableau prix TTC d'un produit avant l'application d'un code promotionnel*/
	var $prix_ht_avant_code_promo = array();
	/* Net produit vendu TTC prix x qte*/
	var $total_prix = array();
	/* Net produit vendu HT prix_ht x qte */
	var $total_prix_ht = array();
	/* Tableau des taux de TVA */
	var $tva_percent = array();
	/* Tableau des TVA en valeur */
	var $tva = array();
	// percent_remise_produit est le tableau des promotions en pourcentage (colonne "promotion" dans peel_produits + toutes les autres réductions en pourcentage)  sur les produits
	var $percent_remise_produit = array();
	/* Tableau des type (EUR ou %) de remises par marque */
	var $remise = array();
	/* Tableau des remises HT par produit en EUR */
	var $remise_ht = array();
	/* Tableau stock produit géré ou non*/
	var $etat_stock = array();
	/* Tableau délai d'approvisionnement du stock */
	var $delai_stock = array();
	/* Tableau du prix des options */
	var $option = array();
	/* Tableau du prix des options */
	var $option_ht = array();
	/* Tableau des emails amis */
	var $email_check = array();
	/* Tableau de l'ecotaxe par ligne */
	var $ecotaxe_ttc = array();
	/* Tableau de l'ecotaxe HT par ligne */
	var $ecotaxe_ht = array();
	/* Tableau des attributs */
	var $attribut = array();
	var $id_attribut = array();
	var $total_prix_attribut = array();
	/* Références produits */
	var $reference = array();

	/* Déclaration des variables */
	/* Montant total du caddie */
	var $total;
	/* Montant total du caddie HT */
	var $total_ht;
	var $total_quantite;
	/* Montant total du caddie */
	var $total_produit;
	var $total_produit_related_to_code_promo;
	var $total_ecotaxe_ttc_related_to_code_promo;
	var $total_produit_avant_code_promo;
	/* Montant total du caddie HT */
	var $total_produit_ht;
	var $tva_total_produit;
	var $total_tva;
	/* Poids total du caddie */
	var $total_poids;

	/* MYM */
	/* Nombre total de 50cl dans le caddie */
	var $total_type_50cl;
	/* Nombre total de 75cl dans le caddie */
	var $total_type_75cl;
	/* Nombre total de magnum dans le caddie */
	var $total_type_magnum;
	/* Nombre total de bib 5 litres */
	var $total_type_bib5;
	/* Nombre total de bib 10 litres */
	var $total_type_bib10;
	/* Nombre total de objet plv */
	var $total_type_plv;
	/* FIN MYM */

	/* Total des points cadeaux */
	var $total_points;

	var $cout_transport;
	var $cout_transport_ht;
	var $tva_cout_transport;

	var $total_remise;
	var $total_remise_ht;
	var $tva_total_remise;

	var $total_option;
	var $total_option_ht;
	var $tva_total_option;

	/* Nom du code promo */
	var $code_promo;

	var $percent_remise_user;
	var $percent_code_promo;
	var $valeur_code_promo;
	var $total_reduction_code_promo;
	var $total_reduction_percent_code_promo;
	// Détermine si un code promo s'applique à une seule catégorie ou toutes
	var $code_infos;

	/* Avoir client en EURO */
	var $avoir;
	var $avoir_user;
	// Country name (and not id)
	var $pays;
	var $zone;
	var $zoneId;
	var $zoneTva;
	var $zoneFranco;
	var $zone_technical_code;
	var $type;
	var $typeId;
	var $apply_vat;

	var $payment_technical_code;
	/* supplément pour le paiement */
	var $tarif_paiement;
	/* supplément pour le paiement */
	var $tarif_paiement_ht;
	/* supplément pour le paiement */
	var $tva_tarif_paiement;

	var $total_ecotaxe_ttc;
	var $total_ecotaxe_ht;
	var $tva_total_ecotaxe;

	var $message_caddie;

	/*Order ID for Socolissimo */
	var $delivery_orderid;

	/* ID de la commande liée au caddie */
	var $commande_id;
	var $commande_hash;
	var $conditionnement;

	/**
	 * Caddie::Caddie()
	 *
	 * @param mixed $percent_remise_user
	 */
	function Caddie($percent_remise_user)
	{
		$this->percent_remise_user = $percent_remise_user;
		/* constructeur d'object */
		$this->init();
	}

	/**
	 * Initialise le caddie
	 *
	 * @return
	 */
	function init()
	{
		foreach($this->articles as $numero_ligne => $product_id) {
			$this->delete_line($numero_ligne);
		}
		/* Montant total du caddie */
		$this->total = 0;
		
		/* Montant total du caddie HT */
		$this->total_ht = 0;
		$this->total_tva = 0;
		
		$this->total_quantite = 0;

		/* Montant total des produits dans le caddie */
		$this->total_produit = 0;
		$this->total_produit_ht = 0;
		$this->tva_total_produit = 0;
		$this->total_produit_avant_code_promo = 0;

		/* Poids total du caddie */
		$this->total_poids = 0;

		/* MYM Types produits total du caddie*/
		$this->total_type_50cl = 0;
		$this->total_type_75cl = 0;
		$this->total_type_magnum = 0;
		$this->total_type_bib5 = 0;
		$this->total_type_bib10 = 0;
		$this->total_type_plv = 0;

		/* Total des points cadeaux */
		$this->total_points = 0;

		$this->cout_transport = 0;
		$this->cout_transport_ht = 0;
		$this->tva_cout_transport = 0;

		$this->total_remise = 0;
		$this->total_remise_ht = 0;
		$this->tva_total_remise = 0;

		$this->total_option = 0;
		$this->total_option_ht = 0;
		$this->tva_total_option = 0;
		$this->total_reduction_percent_code_promo = 0;
		/* Nom du code promo */
		$this->code_promo = "";
		// NE PAS FAIRE $this->percent_remise_user = 0; : c'est le seul attribut à ne pas initialiser car défini dans le cosntructeur
		$this->percent_code_promo = 0;
		$this->valeur_code_promo = 0;

		/* Avoir client en EURO */
		$this->avoir = 0;
		$this->avoir_user = 0;
		// type est ici le nom du type de livraison (en base de données, la colonne type est une id qui s'appelle ici typeId)
		$this->type = "";
		$this->typeId = "";
		// zone est ici le nom de la zone de livraison (en base de données, la colonne zone est une id qui s'appelle ici zoneId)
		$this->zone = "";
		$this->zoneId = "";
		// Valeur par défaut : on applique la TVA, tant qu'une zone n'est pas encore sélectionnée ce qui permettra de savoir si la TVA est bien applicable ou non
		$this->zoneTva = 1;
		$this->apply_vat = true;
		$this->zoneFranco = 1;
		$this->zone_technical_code = "";

		$this->payment_technical_code = '';
		$this->tarif_paiement = 0;
		$this->tarif_paiement_ht = 0;
		$this->tva_tarif_paiement = 0;

		$this->total_ecotaxe_ttc = 0;
		$this->total_ecotaxe_ht = 0;
		$this->tva_total_ecotaxe = 0;

		$this->message_caddie = array();

		$this->commande_id = 0;
		$this->commande_hash = '';

		$this->delivery_orderid = String::substr(sha1(mt_rand(1, 10000000)), 0, 16);
		if (!empty($GLOBALS['site_parameters']['save_caddie_in_cookie']) && !empty($_COOKIE[$GLOBALS['caddie_cookie_name']])) {
			// Le panier vient d'être initialisé. Si un cookie qui contient des produits n'est pas vide, il faut remplir le panier avec les informations du cookie si le paramétrage de la boutique le permet.
			$product_in_caddie_cookie = @unserialize($_COOKIE[$GLOBALS['caddie_cookie_name']]);
			foreach ($product_in_caddie_cookie as $this_product_info) {
				// Il ne faut pas mettre les données stocké dans le cookie directement dans le panier. Les données dans le cookies peuvent être erronées, ou frauduleuse.
				$product_object = new Product($this_product_info['product_id'], null, false, null, true, !is_user_tva_intracom_for_no_vat() && !is_micro_entreprise_module_active());
				$product_object->set_configuration($this_product_info['couleurId'], $this_product_info['tailleId'], $this_product_info['id_attribut'], is_reseller_module_active() && is_reseller());
				$this->add_product($product_object, $this_product_info['quantite'], $email_check, $listcadeaux_owner);
				unset($product_object);
			}
		}
		
		// Au cas où certaines variables ne seraient pas bien nettoyées, on recalcule l'ensemble pour assurer une parfaite cohérence
		$this->update();
	}

	/**
	 * affiche_erreur_caddie()
	 *
	 * @return
	 */
	function affiche_erreur_caddie()
	{
		if (count($this->message_caddie) > 0) {
			if (!empty($this->message_caddie['ERROR_CODE_PROMO'])) {
				echo $GLOBALS['tplEngine']->createTemplate('global_error.tpl', array('message' => String::html_entity_decode_if_needed($this->message_caddie['ERROR_CODE_PROMO'])))->fetch();
				unset($this->message_caddie['ERROR_CODE_PROMO']);
			}
			if (!empty($this->message_caddie['SUCCES_CODE_PROMO'])) {
				echo $GLOBALS['tplEngine']->createTemplate('global_success.tpl', array('message' => String::html_entity_decode_if_needed($this->message_caddie['SUCCES_CODE_PROMO'])))->fetch();
				unset($this->message_caddie['SUCCES_CODE_PROMO']);
			}
			/* MYM */
			if (!empty($this->message_caddie['ERROR_QUANTITE_MINIMUM'])) {
				echo $GLOBALS['tplEngine']->createTemplate('global_error.tpl', array('message' => String::html_entity_decode_if_needed($this->message_caddie['ERROR_QUANTITE_MINIMUM'])))->fetch();
				unset($this->message_caddie['ERROR_CODE_PROMO']);
			}

		}
	}

	/**
	 * On ajoute un nouveau produit dans le panier
	 *
	 * @param class $product_object
	 * @param integer $quantite
	 * @param string $email_check
	 * @param string $listcadeaux_owner
	 * @param string $custom_product_reference
	 * @return Added quantity
	 */
	function add_product(&$product_object, $added_quantity_wished, $email_check, $listcadeaux_owner = null, $custom_product_reference = null)
	{
		if(empty($GLOBALS['site_parameters']['allow_float_quantity'])) {
			$added_quantity_wished = intval($added_quantity_wished);
		}
		if (in_array($product_object->id, $this->articles) && empty($email_check)) {
			// Si le produit est dans le caddie, et que ce n'est pas un chèque cadeau, alors on va vouloir fusionner les données dans une même ligne
			foreach ($this->articles as $k => $this_produit_id) {
				if ($product_object->id == $this_produit_id && $product_object->configuration_color_id == $this->couleurId[$k] && $product_object->configuration_size_id == $this->tailleId[$k] && $product_object->configuration_attributs_list == $this->id_attribut[$k]) {
					$numero_ligne = $k;
					break;
				}
			}
		}
		if (is_giftlist_module_active() && $listcadeaux_owner !== null && $this->giftlist_owners[$numero_ligne] != $listcadeaux_owner) {
			// on teste pour qui est destiné le cadeau, et on ne fusionne pas deux lignes pour deux destinataires différents
			unset($numero_ligne);
		}
		if (isset($numero_ligne)) {
			// Le produit est déjà dans le panier avec la bonne configuration de couleur et de taille
			$quantite_start = $this->quantite[$numero_ligne];
			if (is_giftlist_module_active() && $listcadeaux_owner !== null) {
				// destinataire déjà répertorié
				// on regarde ses besoins en quantité
				$quantity_wished = min($this->quantite[$numero_ligne] + $added_quantity_wished, getNessQuantityFromGiftList($this->articles[$numero_ligne], $product_object->configuration_color_id, $product_object->configuration_size_id, $this->giftlist_owners[$numero_ligne]));
			} else {
				$quantity_wished = $this->quantite[$numero_ligne] + $added_quantity_wished;
			}
		} else {
			// On ajoute le produit au panier : une nouvelle ligne doit être créée dans le panier
			$quantite_start = 0;
			if (!isset($this->articles[0])) {
				$numero_ligne = 0;
			} else {
				$numero_ligne = max(array_keys($this->articles)) + 1;
			}
			$this->conditionnement[$numero_ligne] = $product_object->conditionnement;
			$quantity_wished = $added_quantity_wished;
		}
		
		$this->reference[$numero_ligne] = $custom_product_reference;
		// On met à jour la ligne du caddie
		// Si module de gestion de stock présent : on fait la gestion de stock temporaire et la vérification aussi avec les stocks réels
		$this->change_line_data($numero_ligne, $product_object->id, $quantity_wished, $product_object->configuration_color_id, $product_object->configuration_size_id, $email_check, $product_object->configuration_attributs_list, $listcadeaux_owner);
		
		// On renvoie la quantité réellement ajoutée
		return $this->quantite[$numero_ligne] - $quantite_start;
	}

	/**
	 * Caddie::change_lines_data()
	 *
	 * @param array $line_infos Array with all fields data
	 * @return
	 */
	function change_lines_data(&$line_infos)
	{
		if (!empty($line_infos['id'])) {
			foreach ($line_infos['id'] as $numero_ligne => $product_id) {
				if (!empty($this->articles[$numero_ligne])) {
					$this->change_line_data($numero_ligne, $product_id, get_float_from_user_input(vn($line_infos['quantite'][$numero_ligne])), vn($line_infos['couleurId'][$numero_ligne]), vn($line_infos['tailleId'][$numero_ligne]), vb($line_infos['email_check'][$numero_ligne]), vn($line_infos['id_attribut'][$numero_ligne]), vb($line_infos['listcadeaux_owner'][$numero_ligne]));
				}
			}
		}
		$this->update();
	}

	/**
	 * On met à jour une ligne de produit, en connaissant déjà son numéro
	 *
	 * @param mixed $numero_ligne
	 * @param mixed $product_id
	 * @param mixed $quantity_wished
	 * @param mixed $couleur_id
	 * @param mixed $taille_id
	 * @param mixed $email_check
	 * @param mixed $liste_attribut
	 * @param mixed $listcadeaux_owner
	 * @return
	 */
	function change_line_data($numero_ligne, $product_id, $quantity_wished, $couleur_id, $taille_id, $email_check, $liste_attribut, $listcadeaux_owner = null)
	{
		if (!is_numeric($numero_ligne)) {
			return false;
		}
		if(empty($GLOBALS['site_parameters']['allow_float_quantity'])) {
			$quantity_wished = intval($quantity_wished);
		}
		$this->articles[$numero_ligne] = $product_id;
		// Si on gère les stocks pour ce produit, la valeur $quantite est temporaire avant validation du stock disponible
		// $added_quantity peut être négative, nulle ou positive suivant évolution depuis dernière mise à jour du caddie
		$added_quantity_wished = $quantity_wished - vn($this->quantite[$numero_ligne]);
		$this->couleurId[$numero_ligne] = $couleur_id;
		$this->tailleId[$numero_ligne] = $taille_id;
		$this->email_check[$numero_ligne] = $email_check;
		$this->id_attribut[$numero_ligne] = $liste_attribut;
		$this->giftlist_owners[$numero_ligne] = $listcadeaux_owner;
		// On appelle update_line pour mettre à jour les autres colonnes, telles que $this->etat_stock[$numero_ligne] qui sert pour les stocks ci-dessous
		$this->update_line($numero_ligne, $this->get_available_point_for_current_line($numero_ligne));
		// Que la valeur de commande_id soit définie ou pas, on continue à faire vivre l'évaluation des variables de stock temporaire
		if(check_if_module_active('stock_advanced') && $this->etat_stock[$numero_ligne] == 1) {
			// Le module de gestion des stocks est activé et le produit a on_stock=1 ($this->etat_stock[$numero_ligne] est la valeur de on_stock du produit)
			// On réserve des stocks temporaires pour les nouvelles informations de la ligne
			// Si nécessaire on rectifie la quantité dans le panier en fonction de ce qui a pu être réservé après vérification des stocks temporaires et réels
			if (is_conditionnement_module_active() && !empty($this->conditionnement[$numero_ligne])) {
				$this->quantite[$numero_ligne] += reservation_stock_temp_conditionnement($this, $numero_ligne, $product_id, $couleur_id, $taille_id, $added_quantity_wished);
			} else {
				$this->quantite[$numero_ligne] += reservation_stock_temp($product_id, $couleur_id, $taille_id, $added_quantity_wished);
			}
		} else {
			$this->quantite[$numero_ligne] += $added_quantity_wished;
		}
		if($this->quantite[$numero_ligne]<$quantity_wished && (defined('IN_STEP1') || defined('IN_STEP2') || defined('IN_STEP3'))) {
			// Redirection en cas de problème de stock au dernier moment lors de la commande => on redirige vers la page de caddie
			redirect_and_die($GLOBALS['wwwroot'] . "/achat/caddie_affichage.php");
		}
		// Si on veut avoir les totaux de cette ligne et du caddie, il faut appeler par la suite $this->update(); 
		// On ne le fait pas après chaque ligne pour éviter surcharge inutile
	}

	/**
	 * Caddie::get_available_point_for_current_line()
	 *
	 * @param integer $this_line
	 * @return
	 */
	function get_available_point_for_current_line($this_line)
	{
		$max_available_gift_points = intval(vn($_SESSION['session_utilisateur']['points']));
		foreach ($this->articles as $numero_ligne => $product_id) {
			if($numero_ligne !== $this_line) {
				$product_object = new Product($this->articles[$numero_ligne], null, false, null, true, $this->apply_vat);
				$product_object->set_configuration($this->couleurId[$numero_ligne], $this->tailleId[$numero_ligne], $this->id_attribut[$numero_ligne], is_reseller_module_active() && is_reseller());
				if(!empty($product_object->on_gift) && $product_object->on_gift_points > 0 && empty($this->prix_cat[$numero_ligne])) {
					// Produit cadeau qui est mis dans caddie gratuitement avec les points disponibles
					$max_available_gift_points -= $product_object->on_gift_points * $this->quantite[$numero_ligne];
				}
			}
		}
		return $max_available_gift_points;
	}

	/**
	 * On recalcule les informations d'une ligne
	 *
	 * @param integer $numero_ligne
	 * @param integer $max_available_gift_points
	 * @return
	 */
	function update_line($numero_ligne, $max_available_gift_points)
	{
		$product_object = new Product($this->articles[$numero_ligne], null, false, null, true, $this->apply_vat);
		$product_object->set_configuration($this->couleurId[$numero_ligne], $this->tailleId[$numero_ligne], $this->id_attribut[$numero_ligne], is_reseller_module_active() && is_reseller());

		if(!empty($product_object->on_gift) && $product_object->on_gift_points > 0) {
			// Produit cadeau qui est susceptible d'être mis dans caddie gratuitement avec les points disponibles
			$gift_max_quantity = floor($max_available_gift_points / $product_object->on_gift_points);
			if($gift_max_quantity>=1 || $product_object->get_final_price(get_current_user_promotion_percentage(), display_prices_with_taxes_active(), is_reseller_module_active() && is_reseller()) == 0) {
				// on limite la quantité au max possible payable avec les points dans 2 cas :
				// - quantité prenable avec les points non nulle => ce mode de paiement a priorité
				// - OU prix nul => produit pas commandable par ailleurs
				$this->quantite[$numero_ligne] = min($this->quantite[$numero_ligne], $gift_max_quantity);
			} else {
				// On retire la propriété de cadeau au produit, car il a un prix et l'utilisateur n'a pas les points pour l'avoir gratuitement
				$product_object->on_gift = 0;
				$product_object->on_gift_points = 0;
			}
		}
		
		/* Traitement de l'ecotaxe */
		$this->delai_stock[$numero_ligne] = $product_object->delai_stock;
		// Attention : etat_stock de Caddie est on_stock du produit
		$this->etat_stock[$numero_ligne] = $product_object->on_stock;
		$this->ecotaxe_ht[$numero_ligne] = $product_object->ecotaxe_ht;
		if (is_gifts_module_active()) {
			// Total points de la ligne
			$this->points[$numero_ligne] = $product_object->points * $this->quantite[$numero_ligne];
		}
		if ($this->apply_vat) {
			// Si la zone de TVA est active
			$this->tva_percent[$numero_ligne] = $product_object->tva;
			$this->ecotaxe_ttc[$numero_ligne] = $product_object->ecotaxe_ttc;
			$apply_vat = true;
		} else {
			// Si zone hors TVA, on ne doit pas facturer la TVA de l'ecotaxe
			$this->tva_percent[$numero_ligne] = 0;
			$this->ecotaxe_ttc[$numero_ligne] = $product_object->ecotaxe_ht;
			$apply_vat = false;
		}
		if (check_if_module_active('attributs')) {
			// Ces valeurs servent pour remplir la table peel_commandes, mais pas pour les calculs qui se servent de la classe Product qui gère tout cela
			$this->total_prix_attribut[$numero_ligne] = $product_object->format_prices($product_object->configuration_total_original_price_attributs_ht, $apply_vat, false, false, false);
			$this->attribut[$numero_ligne] = $product_object->configuration_attributs_description;
		} else {
			$this->total_prix_attribut[$numero_ligne] = null;
			$this->attribut[$numero_ligne] = null;
		}
		// Les valeurs des options ne contiennent pas les éventuelles réductions en pourcentage
		$this->option_ht[$numero_ligne] = $product_object->format_prices($product_object->configuration_size_price_ht + $product_object->configuration_total_original_price_attributs_ht, false, false, false, false);
		$this->option[$numero_ligne] = $product_object->format_prices($product_object->configuration_size_price_ht + $product_object->configuration_total_original_price_attributs_ht, $apply_vat, false, false, false);
		// Total poids de la ligne
		$this->poids[$numero_ligne] = ($product_object->poids + $product_object->configuration_overweight) * $this->quantite[$numero_ligne];
		
		// MYM Total type produit de la ligne
		//echo "<br />type bouteille".$product_object->type_btle;
		/*if ($product_object->type_btle == 1) {$this->type_50cl[$numero_ligne] = $this->quantite[$numero_ligne];
		} elseif ($product_object->type_btle == 2) {
			$this->type_75cl[$numero_ligne] = $this->quantite[$numero_ligne];
		} elseif ($product_object->type_btle == 3) {
			$this->type_magnum[$numero_ligne] = $this->quantite[$numero_ligne];
		} elseif ($product_object->type_btle == 4) {
			$this->type_bib5[$numero_ligne] = $this->quantite[$numero_ligne];
		} elseif ($product_object->type_btle == 5) {
			$this->type_bib10[$numero_ligne] = $this->quantite[$numero_ligne];
		} else {$this->type_plv[$numero_ligne] = $this->quantite[$numero_ligne];}*/
		
		// Calcul du prix original avant réductions et options
		$this->prix_cat_ht[$numero_ligne] = $product_object->get_original_price(false, is_reseller_module_active() && is_reseller(), false, false, true, false);
		$this->prix_cat[$numero_ligne] = $product_object->get_original_price($apply_vat, is_reseller_module_active() && is_reseller(), false, false, true, false);
		if (display_prices_with_taxes_active()) {
			// On doit arrondir les valeurs tarifaires officielles qui sont en TTC
			$this->prix_cat[$numero_ligne] = round($this->prix_cat[$numero_ligne], 2);
			$this->option[$numero_ligne] = round($this->option[$numero_ligne], 2);
			$this->ecotaxe_ttc[$numero_ligne] = round($this->ecotaxe_ttc[$numero_ligne], 2);
		} else {
			// On doit arrondir les valeurs tarifaires officielles qui sont en HT
			$this->prix_cat_ht[$numero_ligne] = round($this->prix_cat_ht[$numero_ligne], 2);
			$this->option_ht[$numero_ligne] = round($this->option_ht[$numero_ligne], 2);
			$this->ecotaxe_ht[$numero_ligne] = round($this->ecotaxe_ht, 2);
		}
		// NB : on n'applique pas ici la ventilation d'un code promo en valeur sur le nouveau produit, car le calcul concerne forcément tout le panier en même temps
		// On fait donc cela dans la fonction update
		// On n'applique pas non plus les codes promos de réductions en pourcentage ici pour tout faire au même endroit.
		if (!empty($this->quantite[$numero_ligne])) {
			// La variable prix_avant_code_promo sert pour connaître le montant acheté pour savoir si on peut appliquer ou non un code promo
			// Pour tenir compte des prix par lots, on récupère le prix pour l'ensemble des produits et on divise par la quantité
			if (is_conditionnement_module_active() && !empty($this->conditionnement[$numero_ligne])) {
				$real_stock_used = $this->conditionnement[$numero_ligne] * $this->quantite[$numero_ligne];
			} else {
				$real_stock_used = intval($this->quantite[$numero_ligne]);
			}
			$this->prix_ht_avant_code_promo[$numero_ligne] = $product_object->get_final_price($this->percent_remise_user, false, is_reseller_module_active() && is_reseller(), false, false, $real_stock_used, true, true, false, $this->count_products($product_object->categorie_id)) / $real_stock_used;
			$this->prix_avant_code_promo[$numero_ligne] = $product_object->get_final_price($this->percent_remise_user, $apply_vat, is_reseller_module_active() && is_reseller(), false, false, $real_stock_used, true, true, false,$this->count_products($product_object->categorie_id)) / $real_stock_used;
		}
		$this->percent_remise_produit[$numero_ligne] = $product_object->get_all_promotions_percentage(is_reseller_module_active() && is_reseller(), $this->percent_remise_user, false);
		if(!empty($product_object->on_gift) && $product_object->on_gift_points * $this->quantite[$numero_ligne] <= $max_available_gift_points) {
			foreach(array('ecotaxe', 'ecotaxe_ht', 'prix_cat', 'prix_cat_ht', 'option', 'option_ht', 'prix_ht_avant_code_promo', 'prix_avant_code_promo', 'percent_remise_produit') as $this_property) {
				$this_temp = &$this->$this_property;
				$this_temp[$numero_ligne] = 0;
			}
			$max_available_gift_points -= $product_object->on_gift_points * $this->quantite[$numero_ligne];
		}
		unset($product_object);
		return $max_available_gift_points;
	}

	/**
	 * Enlève un produit du caddie
	 *
	 * @param mixed $numero_ligne
	 * @return
	 */
	function delete_line($numero_ligne)
	{
		$attributs_list = $this->id_attribut[$numero_ligne];
		// Avant d'effacer la ligne, on met proprement la quantité à 0 pour gérer les stocks, etc.
		$this->change_line_data($numero_ligne, vn($this->articles[$numero_ligne]), 0, vn($this->couleurId[$numero_ligne]), vn($this->tailleId[$numero_ligne]), vb($this->email_check[$numero_ligne]), vb($this->id_attribut[$numero_ligne]), vb($this->giftlist_owners[$numero_ligne]));
		unset($this->giftlist_owners[$numero_ligne],
			$this->articles[$numero_ligne],
			$this->quantite[$numero_ligne],
			$this->poids[$numero_ligne],
			$this->type_50cl[$numero_ligne],
			$this->type_75cl[$numero_ligne],
			$this->type_magnum[$numero_ligne],
			$this->type_bib5[$numero_ligne],
			$this->type_bib10[$numero_ligne],
			$this->type_plv[$numero_ligne],
			$this->points[$numero_ligne],
			$this->couleurId[$numero_ligne],
			$this->tailleId[$numero_ligne],
			$this->prix[$numero_ligne],
			$this->prix_ht[$numero_ligne],
			$this->prix_cat[$numero_ligne],
			$this->prix_cat_ht[$numero_ligne],
			$this->prix_avant_code_promo[$numero_ligne],
			$this->prix_ht_avant_code_promo[$numero_ligne],
			$this->total_prix[$numero_ligne],
			$this->total_prix_ht[$numero_ligne],
			$this->tva_percent[$numero_ligne],
			$this->tva[$numero_ligne],
			$this->percent_remise_produit[$numero_ligne],
			$this->remise[$numero_ligne],
			$this->remise_ht[$numero_ligne],
			$this->etat_stock[$numero_ligne],
			$this->delai_stock[$numero_ligne],
			$this->option[$numero_ligne],
			$this->option_ht[$numero_ligne],
			$this->email_check[$numero_ligne],
			$this->ecotaxe_ttc[$numero_ligne],
			$this->ecotaxe_ht[$numero_ligne],
			$this->reference[$numero_ligne],
			$this->id_attribut[$numero_ligne],
			$this->attribut[$numero_ligne],
			$this->total_prix_attribut[$numero_ligne]);
		// suppression des attributs d'image existants
		if (!empty($attributs_list)) {
			foreach(explode("§", $attributs_list) as $attribut_infos_list) {
				$attribut_infos = explode("|", $attribut_infos_list);
				if (!empty($attribut_infos[2])) { 
					// si c'est un attribut de type upload ou texte libre
					delete_uploaded_file_and_thumbs($attribut_infos[2]);
				}
			}
		}
	}

	/**
	 * Appeler cette fonction avec $new_code_promo="CODE" pour l'appliquer, $new_code_promo="" pour supprimer le code promo,
	 * ou avec $new_code_promo=null pour vérifier si code promo toujours bien applicable
	 *
	 * @param mixed $new_code_promo
	 * @return
	 */
	function update_code_promo($new_code_promo = null)
	{
		$this->total_produit_related_to_code_promo = 0;
		$this->total_ecotaxe_ttc_related_to_code_promo = 0;
		if ($new_code_promo !== null && $this->code_promo != $new_code_promo) {
			$this->code_promo = $new_code_promo;
			$code_promo_updated = true;
			if ($new_code_promo === '') {
				$this->message_caddie = array("SUCCES_CODE_PROMO" => $GLOBALS['STR_YOUR_CODE_PROMO'] . ' ' . $this->code_promo . ' ' . $GLOBALS['STR_HAS_BEEN_DELETED'] . '.');
			}
		}
		if (!empty($this->code_promo)) {
			// On vérifie d'abord la validité du code promo avec les paramètres insérés en back-office
			// On trouve le code promo si il est valide dans l'absolu
			// Restera à voir ensuite si il est bien valide pour l'utilisateur qui veut l'utiliser
			$sql = "SELECT *
				FROM `peel_codes_promos`
				WHERE " . get_filter_site_cond('codes_promos') . " AND nom='" . nohtml_real_escape_string($this->code_promo) . "' AND (nombre_prevue=0 OR compteur_utilisation<nombre_prevue) AND '" . date('Y-m-d', time()) . "' BETWEEN `date_debut` AND `date_fin` AND etat = '1'";
			$query = query($sql);
			$code_infos = fetch_assoc($query);
			if(!empty($code_promo_updated) && !empty($code_infos)) {
				$this->message_caddie = array("SUCCES_CODE_PROMO" => $GLOBALS['STR_YOUR_CODE_PROMO'] . ' ' . $code_infos['nom'] . ' ' . $GLOBALS['STR_IS_VALID'] . '.');
			}
		}
		// REMARQUE si on passe ici avec $new_code_promo non vide :
		// alors on doit absolument s'assurer que toutes les infos sur les produits et les ecotaxes sont bien à jour (exemple : nouveau produit vient d'être ajouté)
		// et donc dans ce cas on ne doit pas traiter maintenant la réduction, mais plus tard lorsque cette fonction sera appelée via update
		if (!empty($code_infos) && $new_code_promo === null) {
			// On traite un code promo qui est valide et ne vient pas d'être enregistré (cf. explications ci-dessus)
			$this->code_infos = $code_infos;
			if (!empty($code_infos['id_categorie'])) {
				// Si le code ne s'applique qu'à une catégorie et à ses filles
				$code_only_for_one_cat_and_sons = true;
			} else {
				$code_only_for_one_cat_and_sons = false;
			}
			foreach ($this->articles as $numero_ligne => $product_id) {
				// On cherche le montant par catégorie de produit pour pouvoir appliquer ensuite
				// des codes promos avec des seuils minimum sur une catégorie donnée
				// On fait la somme des produits en faisant attention à ce qu'un produit pourrait apparaître dans plusieurs catégories donc on peut sommer les montants
				$found_cat = null;
				$product_object = new Product($this->articles[$numero_ligne]);
				$apply_code_on_this_product = $product_object->is_code_promo_applicable($code_infos['id_categorie'], $code_infos['product_filter'], $found_cat, $code_infos['cat_not_apply_code_promo']);
				unset($product_object);
				if($apply_code_on_this_product) {
					// ATTENTION : la somme de $this->total_produit_related_to_code_promo n'est pas égale au total du caddie si des produits se retrouvent dans plusieurs catégories
					$this->total_produit_related_to_code_promo += $this->prix_avant_code_promo[$numero_ligne] * $this->quantite[$numero_ligne];
					// On calcule l'écotaxe car on doit la retirer du montant sur lequel on applique un pourcentage de réduction
					$this->total_ecotaxe_ttc_related_to_code_promo += $this->ecotaxe_ttc[$numero_ligne] * $this->quantite[$numero_ligne];
				}
			}
			if ($code_only_for_one_cat_and_sons == false || ($code_only_for_one_cat_and_sons == true && !empty($found_cat))) {
				// Si le code s'applique à toutes les catégories OU si le code s'applique à une seule catégorie et qu'il y a au moins un article de la catégorie correspondante dans le panier
				// On vérifie maintenant que le code est bien valide pour l'utilisateur qui veut l'utiliser
				$sql_check_cp_use = "SELECT c.id
					FROM peel_commandes c
					LEFT JOIN peel_statut_paiement sp ON sp.id=c.id_statut_paiement AND " . get_filter_site_cond('statut_paiement', 'sp') . "
					WHERE c.code_promo = '" . nohtml_real_escape_string($this->code_promo) . "' AND c.id_utilisateur ='" . intval($_SESSION['session_utilisateur']['id_utilisateur']) . "' AND " . get_filter_site_cond('commandes', 'c') . ""
				 . (!empty($this->commande_id)? " AND c.id !='" . intval($this->commande_id) . "'" : "")
				 . " AND sp.technical_code NOT IN ('cancelled','refused',refunded')";
				// Le code a-t-il déjà été utilisé par ce client ?
				$q_check_cp_use = query($sql_check_cp_use);
				if (($code_infos['nombre_prevue'] == 0 || num_rows($q_check_cp_use) < $code_infos['nombre_prevue']) && ($code_infos['nb_used_per_client'] == 0 || num_rows($q_check_cp_use) < $code_infos['nb_used_per_client'])) {
					// Si le code promotionnel n'a pas été trouvé dans une commande antérieure pour ce client, on passe à la suite.
					if ($code_infos['montant_min'] <= $this->total_produit_related_to_code_promo) {
						// Le code est OK : le montant minimum du code promotionnel est bien inférieur au montant total des catégories concernées par le code_promo
						if ($code_infos['on_type'] == 1) {
							$this->percent_code_promo = $code_infos['remise_percent'];
							$this->valeur_code_promo = 0;
						} elseif ($code_infos['on_type'] == 2) {
							$this->percent_code_promo = 0;
							// La réduction ne peut être plus importante que le montant des produits concernés
							$this->valeur_code_promo = min($code_infos['remise_valeur'], $this->total_produit_avant_code_promo);
						}
					} else {
						// Le code n'est pas pris en compte : le montant minimum du code promotionnel est supérieur au montant total des catégories concernées par le code_promo
						$cancel_code = true;
						if ($this->count_products()>0) {
							$this->message_caddie = array("ERROR_CODE_PROMO" => nl2br($GLOBALS['STR_CART_IS_NOT_ENOUGHT']));
						}
					}
				} else {
					$cancel_code = true;
					if ($this->count_products()>0) {
						$this->message_caddie = array("ERROR_CODE_PROMO" => nl2br($GLOBALS['STR_CODE_PROMO_USE_ONLY_ONCE']));
					}
				}
			} else {
				$cancel_code = true;
				if ($this->count_products()>0) {
					$this->message_caddie = array("ERROR_CODE_PROMO" => nl2br($GLOBALS['STR_CODE_PROMO_IS_NOT_FOR_THIS_CAT']));
				}
			}
		} elseif (empty($code_infos)) {
			$cancel_code = true;
			if (!empty($this->code_promo)) {
				$this->message_caddie = array("ERROR_CODE_PROMO" => nl2br($GLOBALS['STR_ERR_CODE_PROMO']));
			}
		}
		
		if (!empty($cancel_code)) {
			$this->code_promo = "";
			$this->code_infos = array();
			$this->percent_code_promo = 0;
			$this->valeur_code_promo = 0;
		}
		// On veut appliquer les X euros de réduction par le code PROMO sur le panier en ventilant sur chaque produit indépendamment
		// Par ailleurs le pourcentage de réduction est applicable au total des produits hors ecotaxe
		$this->total_reduction_percent_code_promo = ($this->total_produit_related_to_code_promo - $this->total_ecotaxe_ttc_related_to_code_promo) * $this->percent_code_promo / 100;
		$this->total_reduction_code_promo = $this->valeur_code_promo + $this->total_reduction_percent_code_promo;
	}

	/**
	 * Renvoie le nombre d'articles dans le caddie (toujours positif)
	 *
	 * We apply abs() for each item count in order to protect the calculation from eventual negative quantity values
	 *
	 * @return
	 */
	function count_products($cat_id = null)
	{
		$total = 0;
		if (!empty($this->quantite)) {
			foreach ($this->quantite as $numero_ligne => $qte) {
				if ($cat_id !== null) {
					if(!empty($this->articles[$numero_ligne])) {
						$product_object = new Product($this->articles[$numero_ligne]);
						if (!empty($product_object) && $product_object->categorie_id == $cat_id) {
							// Quantité pour la catégorie.
							$total += abs($qte);
						}
					}
				} else {
					$total += abs($qte);
				}
			}
		}
		return $total;
	}

	/**
	 * Traitement du moyen de paiement
	 *
	 * @param integer $payment_technical_code
	 * @return
	 */
	function set_paiement($payment_technical_code)
	{
		// On définit ce nouveau moyen de paiement
		$this->payment_technical_code = $payment_technical_code;
		// On lance les calculs
		$frm = array('payment_technical_code' => $this->payment_technical_code, 'sub_total' => $this->total - $this->tarif_paiement, 'sub_total_ht' => $this->total_ht - $this->tarif_paiement_ht);
		set_paiement($frm);
		$this->tarif_paiement_ht = $frm['tarif_paiement_ht'];
		if ($this->apply_vat) {
			$this->tarif_paiement = $frm['tarif_paiement'];
		} else {
			$this->tarif_paiement = $this->tarif_paiement_ht;
		}
		$this->tva_tarif_paiement = $this->tarif_paiement - $this->tarif_paiement_ht ;
	}

	/**
	 * Définition de la zone d'expédition
	 *
	 * @param mixed $zoneId
	 * @return
	 */
	function set_zone($zoneId)
	{
		$zoneId = intval($zoneId);
		$sql = "SELECT nom_" . $_SESSION['session_langue'] . " AS nom, tva, on_franco, technical_code, etat
			FROM peel_zones z
			WHERE id = '" . intval($zoneId) . "' AND etat = 1 AND " . get_filter_site_cond('zones', 'z') . "";
		$query = query($sql);
		if ($Zone = fetch_assoc($query)) {
			if ($zoneId != $this->zoneId) {
				// On initilialise le type de port à blank car on a changé de zone ou de pays
				$this->type = "";
				$this->typeId = "";
			}
			$this->zone = $Zone['nom'];
			$this->zone_technical_code = $Zone['technical_code'];
			$this->zoneTva = $Zone['tva'];
			$this->zoneFranco = $Zone['on_franco'];
			$this->zoneId = $zoneId;
		}
	}

	/**
	 * Définition du type de port
	 *
	 * @param integer $typeId
	 * @return
	 */
	function set_type($typeId)
	{
		$typeId = intval($typeId);
		$type_name = get_delivery_type_name($typeId);
		if ($type_name !== false) {
			// On définit le type de port seulement si trouvé en BDD
			$this->typeId = $typeId;
			$this->type = $type_name;
		} else {
			$this->typeId = '';
			$this->type = '';
		}
	}

	/**
	 * Cette méthode doit toujours être appelée après la modification (ou un ensemble de modifications) du caddie, avant son affichage
	 * Elle gère notamment la ventilation des codes promos en valeur, et l'application des codes promos en pourcentage
	 *
	 * @param mixed $percent_remise_user
	 * @return
	 */
	function update($percent_remise_user = null)
	{
		static $update_in_process;
		// Evite les boucles infinies
		if(!empty($update_in_process)) {
			$skip_add_products = true;
		}
		$update_in_process = true;
		if ($percent_remise_user !== null) {
			$this->percent_remise_user = $percent_remise_user;
		}
		$this->apply_vat = ($this->zoneTva && !is_user_tva_intracom_for_no_vat() && !is_micro_entreprise_module_active());
		// INITIALISATION : On enlève tous les produits non valides
		// c'est à dire ceux dont l'identifiant n'est pas numérique ou dont la quantité est < 1
		foreach ($this->quantite as $numero_ligne => $qte) {
			if ($qte < 1) {
				// Attention ici normalement on nettoie si la quantité commandée est < à 1
				unset($this->giftlist_owners[$numero_ligne]);
				unset($this->articles[$numero_ligne]);
				unset($this->quantite[$numero_ligne]);
				unset($this->poids[$numero_ligne]);
				unset($this->type_50cl[$numero_ligne]); /*MYM*/
				unset($this->type_75cl[$numero_ligne]); /*MYM*/
				unset($this->type_magnum[$numero_ligne]); /*MYM*/
				unset($this->type_bib5[$numero_ligne]); /*MYM*/
				unset($this->type_bib10[$numero_ligne]); /*MYM*/
				unset($this->type_plv[$numero_ligne]); /*MYM*/
				unset($this->points[$numero_ligne]);
				unset($this->couleurId[$numero_ligne]);
				unset($this->tailleId[$numero_ligne]);
				unset($this->prix_avant_code_promo[$numero_ligne]);
				unset($this->prix_ht_avant_code_promo[$numero_ligne]);
				unset($this->prix[$numero_ligne]);
				unset($this->prix_ht[$numero_ligne]);
				unset($this->prix_cat[$numero_ligne]);
				unset($this->prix_cat_ht[$numero_ligne]);
				unset($this->total_prix[$numero_ligne]);
				unset($this->total_prix_ht[$numero_ligne]);
				unset($this->tva_percent[$numero_ligne]);
				unset($this->tva[$numero_ligne]);
				unset($this->percent_remise_produit[$numero_ligne]);
				unset($this->remise[$numero_ligne]);
				unset($this->remise_ht[$numero_ligne]);
				unset($this->etat_stock[$numero_ligne]);
				unset($this->delai_stock[$numero_ligne]);
				unset($this->option[$numero_ligne]);
				unset($this->option_ht[$numero_ligne]);
				unset($this->email_check[$numero_ligne]);
				unset($this->ecotaxe_ttc[$numero_ligne]);
				unset($this->ecotaxe_ht[$numero_ligne]);
				unset($this->reference[$numero_ligne]);
				unset($this->id_attribut[$numero_ligne]);
				unset($this->attribut[$numero_ligne]);
				unset($this->total_prix_attribut[$numero_ligne]);
			}
		}

		$this->avoir_user = max(vn($_SESSION['session_utilisateur']['avoir']), 0);
		// ETAPE 1 : On calcule les totaux avant réduction
		$max_available_gift_points = intval(vn($_SESSION['session_utilisateur']['points']));
		foreach ($this->articles as $numero_ligne => $product_id) {
			$max_available_gift_points = $this->update_line($numero_ligne, $max_available_gift_points);
			$this->total_ecotaxe_ttc += $this->ecotaxe_ttc[$numero_ligne] * $this->quantite[$numero_ligne];
			$this->total_ecotaxe_ht += $this->ecotaxe_ht[$numero_ligne] * $this->quantite[$numero_ligne];
			if (is_conditionnement_module_active() && !empty($this->conditionnement[$numero_ligne])) {
				$real_stock_used = $this->conditionnement[$numero_ligne] * $this->quantite[$numero_ligne];
			} else {
				$real_stock_used = intval($this->quantite[$numero_ligne]);
			}
			$this->total_produit_avant_code_promo += $this->prix_avant_code_promo[$numero_ligne] * $real_stock_used;
		}
		// ETAPE 2 : maintenant qu'on connait le montant total avant réduction pour le catégorie et chaque catégorie de produits,
		// on vérifie si le code promotionnel est toujours actif aprés un changement de montant total du caddie.
		$this->update_code_promo();

		// Recalcul des produits en appliquant correctement les ventilations des codes promos
		foreach ($this->articles as $numero_ligne => $product_id) {
			// Gestion du code promo
			if (!empty($this->total_produit_related_to_code_promo) && !empty($this->code_infos)) {
				$found_cat = null;
				$product_object = new Product($this->articles[$numero_ligne]);
				$apply_code_on_this_product = $product_object->is_code_promo_applicable($this->code_infos['id_categorie'], $this->code_infos['product_filter'], $found_cat, $this->code_infos['cat_not_apply_code_promo']);
				unset($product_object);
			} else {
				$apply_code_on_this_product = false;
			}
			if ($apply_code_on_this_product) {
				// Panier au montant non nul et code promo s'appliquant au total du panier ou à une catégorie et ses filles qui concernent au moins un produit du panier
				$code_promo_ventile_ttc = $this->total_reduction_code_promo * ($this->prix_avant_code_promo[$numero_ligne] * $this->quantite[$numero_ligne]) / $this->total_produit_related_to_code_promo;
			} else {
				// Panier au montant nul ou code promo à une catégorie non applicable au panier
				$code_promo_ventile_ttc = 0;
			}
			// Le produit et l'ecotaxe ont potentiellement deux taux de TVA différents => quand on passe de HT à TTC il faut traiter l'ecotaxe à part
			// Par ailleurs il faut arrondir les prix en TTC ou HT pour qu'ensuite l'application de quantités ne donne pas de problèmes d'arrondi
			if (display_prices_with_taxes_active()) {
				// On arrondit le prix TTC
				$this->prix[$numero_ligne] = round($this->prix_avant_code_promo[$numero_ligne] - $code_promo_ventile_ttc / $this->quantite[$numero_ligne], 2);
				// On recalcule le prix HT à partir du prix TTC arrondi
				$this->prix_ht[$numero_ligne] = ($this->prix[$numero_ligne] - $this->ecotaxe_ttc[$numero_ligne]) / (1 + $this->tva_percent[$numero_ligne] / 100) + $this->ecotaxe_ht[$numero_ligne];
			} else {
				// On arrondit le prix HT
				$this->prix_ht[$numero_ligne] = round($this->prix_ht_avant_code_promo[$numero_ligne] - $code_promo_ventile_ttc / $this->quantite[$numero_ligne] / (1 + $this->tva_percent[$numero_ligne] / 100), 2);
				// On recalcule le prix TTC à partir du prix HT arrondi
				$this->prix[$numero_ligne] = (($this->prix_ht[$numero_ligne] - $this->ecotaxe_ht[$numero_ligne]) * (1 + $this->tva_percent[$numero_ligne] / 100)) + $this->ecotaxe_ttc[$numero_ligne];
			}
		}
		
		// Calcul du total des lignes
		$this->_recalc_line_totals();
		
		// Calcul du pourcentage applicable en fonction du total des produits dans le panier
		if (is_lot_module_active() && !empty($GLOBALS['site_parameters']['global_promotion_percent_by_threshold'])) {
			// Tri des valeurs par ordre croissant, pour permettre la sélection du bon taux en fonction du montant total des produits
			asort($GLOBALS['site_parameters']['global_promotion_percent_by_threshold']);
			foreach ($GLOBALS['site_parameters']['global_promotion_percent_by_threshold'] as $promotion_percent => $threshold) {
				if ($threshold > $this->total_produit) {
					// Le seuil courant est strictement supérieur au total des produits => il faut sortir de la boucle. Le code promotionnel sauvegardé est celui de l'itération précedente
					break;
				}
				$this_global_promotion_percent_by_threshold = $promotion_percent;
			}
			// Application de réductions ventilées par ligne, quand on souhaite ne pas l'appliquer directement dans le calcul du prix d'un produit, mais dans la logique de caddie
			if(!empty($this_global_promotion_percent_by_threshold)) {
				foreach ($this->articles as $numero_ligne => $product_id) {
					// Gestion de la réduction
					$reduction_ventilee_ttc = ($this->prix[$numero_ligne] * $this->quantite[$numero_ligne])*($this_global_promotion_percent_by_threshold / 100) ;
					if (display_prices_with_taxes_active()) {
						// On arrondit le prix TTC
						$this->prix[$numero_ligne] = round($this->prix[$numero_ligne] - $reduction_ventilee_ttc / $this->quantite[$numero_ligne], 2);
						// On recalcule le prix HT à partir du prix TTC arrondi
						$this->prix_ht[$numero_ligne] = ($this->prix[$numero_ligne] - $this->ecotaxe_ttc[$numero_ligne]) / (1 + $this->tva_percent[$numero_ligne] / 100) + $this->ecotaxe_ht[$numero_ligne];
					} else {
						// On arrondit le prix HT
						$this->prix_ht[$numero_ligne] = round($this->prix_ht[$numero_ligne] - $reduction_ventilee_ttc / $this->quantite[$numero_ligne] / (1 + $this->tva_percent[$numero_ligne] / 100), 2);
						// On recalcule le prix TTC à partir du prix HT arrondi
						$this->prix[$numero_ligne] = (($this->prix_ht[$numero_ligne] - $this->ecotaxe_ht[$numero_ligne]) * (1 + $this->tva_percent[$numero_ligne] / 100)) + $this->ecotaxe_ttc[$numero_ligne];
					}
				}
				// Calcul à nouveau du total des lignes, qui contiennent maintenant la réduction ventilée
				$this->_recalc_line_totals();
			}
		}
		
		// ETAPE 3 : On gère des éventuels frais supplémentaires si la commande est trop petite
		if (count($this->articles) && $this->total_produit < vn($GLOBALS['site_parameters']['small_order_overcost_limit']) && $this->total_produit >= vn($GLOBALS['site_parameters']['minimal_amount_to_order'])) {
			$this->small_order_overcost_amount_ht = $GLOBALS['site_parameters']['small_order_overcost_amount'] / (1 + ($GLOBALS['site_parameters']['small_order_overcost_tva_percent'] / 100));
			if ($this->apply_vat) {
				$this->small_order_overcost_amount = $this->small_order_overcost_amount_ht * (1 + ($GLOBALS['site_parameters']['small_order_overcost_tva_percent'] / 100));
			} else {
				$this->small_order_overcost_amount = $this->small_order_overcost_amount_ht;
			}
			$this->tva_small_order_overcost = $this->small_order_overcost_amount - $this->small_order_overcost_amount_ht;
		} else {
			$this->small_order_overcost_amount_ht = 0;
			$this->small_order_overcost_amount = 0;
			$this->tva_small_order_overcost = 0;
		}
		// ETAPE 4 : Calcul des frais de port
		if (!empty($this->typeId) && !empty($this->zoneId)) {
			$delivery_cost_infos = get_delivery_cost_infos($this->total_poids, $this->total_produit, $this->typeId, $this->zoneId, $this->count_products());
		}
		if(!empty($GLOBALS['site_parameters']['user_offers_table_enable']) && !empty($_SESSION['session_utilisateur']['id_utilisateur'])) {
			foreach ($this->articles as $numero_ligne => $product_id) {
				$product_object = new Product($product_id, null, false, null, true, $this->apply_vat);
				$sql = "SELECT o.*
					FROM peel_offres o
					LEFT JOIN peel_utilisateurs_offres uo ON uo.id_utilisateur='" . intval(vn($_SESSION['session_utilisateur']['id_utilisateur'])) . "' AND o.id_offre=uo.id_offre
					WHERE (o.id_offre=0 OR uo.id_offre IS NOT NULL) AND o.date_limite>='" . date('Y-m-d', time()) . "' AND (" . (!empty($product_object->reference)?"(o.ref='".real_escape_string($product_object->reference)."' AND o.qnte<='".intval($this->quantite[$numero_ligne])."' AND o.seuil<='".max(floatval($this->quantite[$numero_ligne]*$product_object->prix_ht), floatval($value_total))."') OR ":"") . "(o.ref='' AND o.fournisseur IN ('".implode("','", real_escape_string($product_object->get_product_brands(true)))."') AND o.qnte<='".intval($quantity_by_brand['brand_'.$product_object->get_product_brands(false)])."' AND o.seuil<='".max(floatval($total_by_brand['brand_'.$product_object->get_product_brands(false)]), floatval($value_total))."') OR (o.ref='' AND o.fournisseur='' AND o.qnte<='".intval($quantity_total)."' AND o.seuil<='".floatval($value_total)."'))
					ORDER BY " . (floatval($product_object->prix_ht)>0 ? "IF(o.prix>0 AND o.remise_percent>0, LEAST(o.prix, o.remise_percent*'".floatval($product_object->prix_ht)."'), IF(o.remise_percent>0, o.remise_percent*'".floatval($product_object->prix_ht)."', o.prix))" : "o.prix") . " DESC, o.remise_percent DESC, o.port_offert DESC, o.carbo_offert DESC
					LIMIT 1";
				$query = query($sql);
				if(($result = fetch_object($query)) && $result->port_offert == 1) {
					$delivery_cost_infos = false;
					break;
				}
				unset($product_object);
			}
			// Fin de l'usage des informations pour peel_offer : carboglace et frais de ports ont été étudiés
			unset($quantity_by_brand);
			unset($total_by_brand);
			unset($quantity_total);
			unset($value_total);
		}
		if (!isset($delivery_cost_infos) || $delivery_cost_infos === false) {
			// Pas de port à calculer pour l'instant, ou pas de frais de port trouvés pour ce poids et ce total (dans ce cas, ce n'est pas ici qu'on présente une erreur au client)
			$delivery_cost_infos = array('cost_ht' => 0, 'tva' => 0);
		}
		if (!empty($_SESSION['session_commande']['delivery_dyforwardingcharges'])) {
			// Coût Livraison So Colissimo, en € TTC
			$this->cout_transport_ht = $_SESSION['session_commande']['delivery_dyforwardingcharges'] / (1 + $delivery_cost_infos['tva'] / 100);
		} else {
			$this->cout_transport_ht = $delivery_cost_infos['cost_ht'];
		}

		if ($this->apply_vat) {
			$this->cout_transport = $this->cout_transport_ht * (1 + $delivery_cost_infos['tva'] / 100);
		} else {
			$this->cout_transport = $this->cout_transport_ht;
		}
		$this->tva_cout_transport = $this->cout_transport - $this->cout_transport_ht;

		$this->total_tva = $this->tva_total_produit + $this->tva_cout_transport + $this->tva_tarif_paiement + $this->tva_small_order_overcost;
		// ETAPE 5 : gestion de l'avoir
		// L'avoir est limité au total de la commande.
		// L'avoir est uniquement sur le TTC et n'affecte pas le calcul de la TVA
		$this->avoir = max(0, min($this->avoir_user, $this->total_produit + $this->cout_transport + $this->tarif_paiement + $this->small_order_overcost_amount));
		// ETAPE 6 : finalisation des totaux
		$this->tva_total_option = $this->total_option - $this->total_option_ht;
		$this->tva_total_remise = $this->total_remise - $this->total_remise_ht;
		$this->tva_total_ecotaxe = $this->total_ecotaxe_ttc - $this->total_ecotaxe_ht;
		$this->total = $this->total_produit - $this->avoir + $this->cout_transport + $this->tarif_paiement + $this->small_order_overcost_amount;
		$this->total_ht = $this->total_produit_ht + $this->cout_transport_ht + $this->tarif_paiement_ht + $this->small_order_overcost_amount_ht;

		if (!empty($GLOBALS['site_parameters']['save_caddie_in_cookie'])) {
			// ETAPE 7 : Le contenu du panier est stocké dans un cookie, pour que l'utilisateurs puisse retrouver son panier après que la session soit expiré. Le panier est chargé avec les informations du cookie dans la fonction init
			if (isset($_COOKIE[$GLOBALS['caddie_cookie_name']])) {
				// Le cookie qui contient les produits est vidé à chaque calcul du caddie, c'est plus simple que de mettre à jour ligne par ligne.
				unset($_COOKIE[$GLOBALS['caddie_cookie_name']]);
			}
			$product_in_caddie_cookie = array();
			foreach ($this->articles as $numero_ligne => $product_id) {
				// on ajoute le produit à la liste.
				$product_in_caddie_cookie[] = array('quantite'=>$this->quantite[$numero_ligne],'product_id'=>$product_id,'couleurId'=>$this->couleurId[$numero_ligne],'tailleId'=>$this->tailleId[$numero_ligne],'id_attribut'=>$this->id_attribut[$numero_ligne]);
			}
			// on crée le cookie avec 1 an de vie
			if($GLOBALS['site_parameters']['force_sessions_for_subdomains']){
				@setcookie($GLOBALS['caddie_cookie_name'], serialize($product_in_caddie_cookie), time() + 365 * 24 * 60 * 60, '/', '.'.get_site_domain());
			} else {
				@setcookie($GLOBALS['caddie_cookie_name'], serialize($product_in_caddie_cookie), time() + 365 * 24 * 60 * 60, '/');
			}
		}
		// FIN
		$update_in_process = false;
		return true;
	}
	
	/**
	 * Recalcul des totaux en appliquant correctement les ventilations des codes promos
	 *
	 * @return
	 */
	function _recalc_line_totals() {
		// On initialise les montants qu'on va recalculer
		$this->total = $this->total_ht = 0;
		$this->total_quantite = 0;
		$this->total_produit = $this->total_produit_ht = 0;
		$this->total_produit_avant_code_promo = 0;
		$this->total_option = $this->total_option_ht = $this->tva_total_option = 0;
		$this->total_tva = $this->tva_total_produit = 0;
		$this->total_poids = $this->total_points = 0;
		$this->total_type_50cl = $this->total_type_75cl = $this->total_type_magnum = $this->total_type_bib5 = $this->total_type_bib10 = $this->total_type_plv = 0;
		$this->total_remise = $this->total_remise_ht = $this->tva_total_remise = 0;
		$this->total_ecotaxe_ttc = $this->total_ecotaxe_ht = $this->tva_total_ecotaxe = 0;
		// Recalcul des totaux en appliquant correctement les ventilations des codes promos
		foreach ($this->articles as $numero_ligne => $product_id) {
			// Si le module conditionnement est présent, il faut prendre en compte le conditionnement dans le calcul du prix de la ligne.
			if (is_conditionnement_module_active() && !empty($this->conditionnement[$numero_ligne])) {
				$this->total_prix[$numero_ligne] = $this->prix[$numero_ligne] * $this->quantite[$numero_ligne] * $this->conditionnement[$numero_ligne];
				$this->total_prix_ht[$numero_ligne] = $this->prix_ht[$numero_ligne] * $this->quantite[$numero_ligne] * $this->conditionnement[$numero_ligne];
			} else {
				$this->total_prix[$numero_ligne] = $this->prix[$numero_ligne] * $this->quantite[$numero_ligne];
				$this->total_prix_ht[$numero_ligne] = $this->prix_ht[$numero_ligne] * $this->quantite[$numero_ligne];
			}

			if ($this->apply_vat) {
				$this->tva[$numero_ligne] = $this->total_prix[$numero_ligne] - $this->total_prix_ht[$numero_ligne];
			} else {
				$this->tva[$numero_ligne] = 0;
			}
			// Aucune remise ne s'applique sur l'ecotaxe
			// => on calcule la remise sur $prix_ht_no_ecotaxe qui est le prix hors ecotaxe
			if (is_conditionnement_module_active() && !empty($this->conditionnement[$numero_ligne])) {
				$real_stock_used = $this->conditionnement[$numero_ligne] * $this->quantite[$numero_ligne];
			} else {
				$real_stock_used = intval($this->quantite[$numero_ligne]);
			}

			$this->remise_ht[$numero_ligne] = ($this->prix_cat_ht[$numero_ligne] + $this->option_ht[$numero_ligne] - $this->prix_ht[$numero_ligne]) * $real_stock_used;
			$this->remise[$numero_ligne] = ($this->prix_cat[$numero_ligne] + $this->option[$numero_ligne] - $this->prix[$numero_ligne]) * $real_stock_used;
			$this->total_remise += $this->remise[$numero_ligne];
			$this->total_remise_ht += $this->remise_ht[$numero_ligne];
			$this->total_quantite += $this->quantite[$numero_ligne];
			$this->total_produit += $this->total_prix[$numero_ligne];
			$this->total_produit_ht += $this->total_prix_ht[$numero_ligne];
			$this->total_option += $this->option[$numero_ligne] * $real_stock_used;
			$this->total_option_ht += $this->option_ht[$numero_ligne] * $real_stock_used;
			$this->tva_total_produit += $this->tva[$numero_ligne];
			$this->total_poids += $this->poids[$numero_ligne];
			
			/*$this->total_type_50cl += $this->type_50cl[$numero_ligne];
			$this->total_type_75cl += $this->type_75cl[$numero_ligne];
			$this->total_type_magnum += $this->type_magnum[$numero_ligne];
			$this->total_type_bib5 += $this->type_bib5[$numero_ligne];
			$this->total_type_bib10 += $this->type_bib10[$numero_ligne];
			$this->total_type_plv += $this->type_plv[$numero_ligne];*/

			if (is_gifts_module_active()) {
				$this->total_points += $this->points[$numero_ligne];
			}
		}
		return true;
	}

	/**
	 * Enregistre la commande dans la base
	 *
	 * @param mixed $order_infos This array has all user infos related to the order
	 * @return
	 */
	function save_in_database(&$order_infos)
	{
		// On s'assure des montants avant leur insertion en BDD
		$this->update();
		/* Le reversement affilié est calculé sur le total HT des produits */
		if (is_affiliate_module_active() && !empty($_SESSION['session_affilie']) && is_affiliation_active($_SESSION['session_affilie'])) {
			$order_infos['affilie'] = 1;
			$order_infos['statut_affilie'] = 0;
			$order_infos['montant_affilie'] = $this->total_produit * $GLOBALS['site_parameters']['commission_affilie'] / 100;
			$order_infos['id_affilie'] = intval($_SESSION['session_affilie']);
		} else {
			$order_infos['affilie'] = 0;
			$order_infos['montant_affilie'] = 0;
			$order_infos['statut_affilie'] = 0;
			$order_infos['id_affilie'] = 0;
		}
		foreach(array('total_option',
				'total_option_ht',
				'tva_total_option',
				'total_produit',
				'total_produit_ht',
				'tva_total_produit',
				'code_promo',
				'percent_remise_user',
				'percent_code_promo',
				'valeur_code_promo',
				'total_remise',
				'total_remise_ht',
				'tva_total_remise',
				'total_tva',
				'cout_transport',
				'cout_transport_ht',
				'tva_cout_transport',
				'total_points',
				'total_poids',
				'total_type_50cl',
				'total_type_75cl',
				'total_type_magnum',
				'total_type_bib5',
				'total_type_bib10',
				'total_type_plv',
				'total_ecotaxe_ttc',
				'total_ecotaxe_ht',
				'tva_total_ecotaxe',
				'avoir',
				'payment_technical_code',
				'apply_vat',
				'tarif_paiement',
				'tarif_paiement_ht',
				'tva_tarif_paiement',
				'zoneFranco',
				'pays',
				'zoneId',
				'type',
				'typeId',
				'small_order_overcost_amount',
				'tva_small_order_overcost') as $this_item) {
			$order_infos[$this_item] = $this->$this_item;
		}
		$order_infos['montant'] = $this->total;
		$order_infos['montant_ht'] = $this->total_ht;
		$order_infos['id_utilisateur'] = vb($_SESSION['session_utilisateur']['id_utilisateur']);
		$order_infos['id_parrain'] = vb($_SESSION['session_utilisateur']['id_parrain']);
		$order_infos['parrain'] =  vb($_SESSION['session_utilisateur']['type']);
		$order_infos['devise'] =  vb($_SESSION['session_devise']['code']);
		$order_infos['currency_rate'] =  vb($_SESSION['session_devise']['conversion']);
		$order_infos['delivery_tracking'] = null;
		$order_infos['site_id'] = $GLOBALS['site_id'];
		
		$articles = array();
		foreach ($this->articles as $numero_ligne => $product_id) {
			// Attention ici normalement on nettoie si la quantité commandée est < à 1
			$articles[$numero_ligne]['product_id'] = $product_id;
			$articles[$numero_ligne]['quantite'] = $this->quantite[$numero_ligne];
			if (is_giftlist_module_active()) {
				$articles[$numero_ligne]['giftlist_owners'] = $this->giftlist_owners[$numero_ligne];
			}
			$articles[$numero_ligne]['poids'] = $this->poids[$numero_ligne];
			
			/* MYM */
			if ($product_object->type_btle == 1) {$articles[$numero_ligne]['type_50cl'] = $this->type_50cl[$numero_ligne];
			} elseif ($product_object->type_btle == 2) {
				$articles[$numero_ligne]['type_75cl'] = $this->type_75cl[$numero_ligne];
			} elseif ($product_object->type_btle == 3) {
				$articles[$numero_ligne]['type_magnum'] = $this->type_magnum[$numero_ligne];
			} elseif ($product_object->type_btle == 4) {
				$articles[$numero_ligne]['type_bib5'] = $this->type_bib5[$numero_ligne];
			} elseif ($product_object->type_btle == 5) {
				$articles[$numero_ligne]['type_bib10'] = $this->type_bib10[$numero_ligne];
			} else {$articles[$numero_ligne]['type_plv'] = $this->type_plv[$numero_ligne];}
			
			/* FIN MYM */

			$articles[$numero_ligne]['points'] = $this->points[$numero_ligne];
			$articles[$numero_ligne]['couleurId'] = $this->couleurId[$numero_ligne];
			$articles[$numero_ligne]['tailleId'] = $this->tailleId[$numero_ligne];
			if (is_conditionnement_module_active()) {
				$articles[$numero_ligne]['conditionnement'] = $this->conditionnement[$numero_ligne];
			}
			$articles[$numero_ligne]['prix'] = $this->prix[$numero_ligne];
			$articles[$numero_ligne]['prix_ht'] = $this->prix_ht[$numero_ligne];
			$articles[$numero_ligne]['prix_cat'] = $this->prix_cat[$numero_ligne];
			$articles[$numero_ligne]['prix_cat_ht'] = $this->prix_cat_ht[$numero_ligne];
			$articles[$numero_ligne]['total_prix'] = $this->total_prix[$numero_ligne];
			$articles[$numero_ligne]['total_prix_ht'] = $this->total_prix_ht[$numero_ligne];
			$articles[$numero_ligne]['tva_percent'] = $this->tva_percent[$numero_ligne];
			$articles[$numero_ligne]['tva'] = $this->tva[$numero_ligne];
			$articles[$numero_ligne]['percent_remise_produit'] = $this->percent_remise_produit[$numero_ligne];
			$articles[$numero_ligne]['remise'] = $this->remise[$numero_ligne];
			$articles[$numero_ligne]['remise_ht'] = $this->remise_ht[$numero_ligne];
			$articles[$numero_ligne]['etat_stock'] = $this->etat_stock[$numero_ligne];
			$articles[$numero_ligne]['delai_stock'] = $this->delai_stock[$numero_ligne];
			$articles[$numero_ligne]['option'] = $this->option[$numero_ligne];
			$articles[$numero_ligne]['option_ht'] = $this->option_ht[$numero_ligne];
			$articles[$numero_ligne]['email_check'] = $this->email_check[$numero_ligne];
			$articles[$numero_ligne]['ecotaxe_ttc'] = $this->ecotaxe_ttc[$numero_ligne];
			$articles[$numero_ligne]['ecotaxe_ht'] = $this->ecotaxe_ht[$numero_ligne];
			$articles[$numero_ligne]['reference'] = $this->reference[$numero_ligne];
			$articles[$numero_ligne]['attribut'] = vb($this->attribut[$numero_ligne]);
			$articles[$numero_ligne]['id_attribut'] = vb($this->id_attribut[$numero_ligne]);
			$articles[$numero_ligne]['total_prix_attribut'] = vb($this->total_prix_attribut[$numero_ligne]);
		}
		if (sha1(serialize($order_infos) . serialize($articles)) != $this->commande_hash) {
			// La commande n'avait jamais été créée, ou les informations de la commande sont différentes
			$this->commande_hash = sha1(serialize($order_infos) . serialize($articles));

			$order_id = create_or_update_order($order_infos, $articles);

			$used_gift_points = intval(vn($_SESSION['session_utilisateur']['points'])) - $this->get_available_point_for_current_line(null);
			if (!empty($this->commande_id) && $this->commande_id != $order_id) {
				// On annule la commande précédemment liée à ce caddie car on vient de créer une nouvelle commande lui correspondant
				// SAUF si elle est déjà payée (=> 3ème argument à false)
				$GLOBALS['output_create_or_update_order'] = update_order_payment_status($this->commande_id, 'cancelled', false);
			}
			// On retire les points utilisés lors de la commande.
			// NB : Cette gestion n'utilise pas "total_points" de peel_commandes, qui est géré ailleurs et concerne les points gagnés lors de la commande
			query("UPDATE peel_utilisateurs
				SET points=points-" . intval($used_gift_points) . "
				WHERE id_utilisateur='" . intval($_SESSION['session_utilisateur']['id_utilisateur']) . "' AND " . get_filter_site_cond('utilisateurs') . "");
			$user_infos = get_user_information($_SESSION['session_utilisateur']['id_utilisateur']);
			$_SESSION['session_utilisateur']['points'] = $user_infos['points'];
			$this->commande_id = $order_id;
			// Incrémentation du compteur de code promotionnel
			if (!empty($this->code_promo)) {
				query("UPDATE peel_codes_promos
					SET compteur_utilisation=compteur_utilisation+1
					WHERE nom = '" . nohtml_real_escape_string($this->code_promo) . "' AND " . get_filter_site_cond('codes_promos') . "");
			}
		}
		// Si le caddie correspond à une commande en cours, alors on met à jour la commande en question
		// Sinon, on crée la comande
		if (!empty($this->code_promo)) {
			// Si le code avait été créé spécifiquement pour être envoyé à un utilisateur, alors il est présent dans peel_utilisateurs_codes_promos auquel cas on met à jour l'info d'utilisation
			query("UPDATE peel_utilisateurs_codes_promos
				SET utilise = '1'
				WHERE id_utilisateur = '" . intval($_SESSION['session_utilisateur']['id_utilisateur']) . "' AND nom_code = '" . nohtml_real_escape_string($this->code_promo) . "'");
		}
		$_SESSION['session_utilisateur']['remise_percent'] = 0;
		$_SESSION['session_utilisateur']['id_parrain'] = 0;
		$_SESSION['session_utilisateur']['type'] = ''; #- Suppression du statut filleul

		// On met à jour l'avoir de la session client
		$_SESSION['session_utilisateur']['avoir'] = max($_SESSION['session_utilisateur']['avoir'] - $_SESSION['session_caddie']->avoir, 0);
		// Annule la remise en % du client, supprimer ces lignes si vous souhaitez que les remises client soient permanentes
		query("UPDATE peel_utilisateurs
			SET remise_percent = '0', avoir = GREATEST(0, avoir-'" . nohtml_real_escape_string($_SESSION['session_caddie']->avoir) . "')
			WHERE id_utilisateur = '" . intval($_SESSION['session_utilisateur']['id_utilisateur']) . "' AND " . get_filter_site_cond('utilisateurs') . "");

		// si il y a des commandes de cadeau on envoie un email
		if (!empty($this->giftlist_owners[0]) && is_giftlist_module_active()) {
			email_ordered_cadeaux($this->commande_id, $order_infos, $this->giftlist_owners[0]);
		}
		return $this->commande_id;
	}
}

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Posté(e) · Signaler ce message

Bonjour,

A la première lecture du code on peut voir que les variable total_type_ ligne 1180 sont en commentaires, donc le code que vous avez posté ne peut pas fonctionner correctement. Sinon les modifications effectuées semble bonne. Ce sujet nécessite du temps pour comprendre, corriger et tester votre code. Nous pouvons intervenir sur votre développement si vous le souhaitez, il faut pour cela prendre contact avec notre service commercial au 01 75 43 67 97

Partager ce message


Lien à poster
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !


Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.


Connectez-vous maintenant

Twitter Advisto ecommerce

Facebook PEEL Shopping