Myriam

Utilisateur open source
  • Compteur de contenus

    45
  • Inscrit(e) le

  • Dernière visite


Tout ce qui a été posté par Myriam

  1. Myriam a ajouté un message dans un sujet  Module cron (peel premium 8)   

    Bonjour,
    Finalement cela fonctionne. La tâche cron est juste plus longue que sur mon ancien serveur et du coup, j'avais un décalage sur la réception des messages.
    • 0
  2. Myriam a ajouté un message dans un sujet  Module cron (peel premium 8)   

    Bonjour,
    Ils ont vides.

    • 0
  3. Myriam a ajouté un sujet dans Module PEEL Premium pour PEEL SHOPPING   

    Module cron (peel premium 8)
    Bonjour,
    J'ai enfin installé le module cron.
    Je suis hébergé sur une instance de Gandi et j'ai configuré anacron ainsi : @hourly 0 my_php_script php -f /srv/data/web/vhosts/www.monsite.fr/htdocs/modules/crons/crons.php login=LOGIN pass=PASSWORD
    J'ai bien renseigné le champs cron_login dans la table peel_configuration.
    J'ai activé le module cron dans les paramètres du site, créé une newsletter et fait un test administrateur.
    J'ai bien les messages verts qui dit que les messages tests sont partis, envoi ok la date d'envoi se modifie.
    La table peel_crons a bien une ligne FR et EN avec modules/crons/envoi_emails.php qui se créent.
    Et pourtant, je ne reçois pas la newsletter.
    Auriez-vous une idée ?  
    • 3 réponses
    • 2 718 vues
  4. Myriam a ajouté un message dans un sujet  Background header différent en fonction de la page   

    Merci ! Je vais tester cela.
    • 0
  5. Myriam a ajouté un message dans un sujet  Background header différent en fonction de la page   

    Par contre, lorsque l'on clique sur un produit et qu'on affiche donc la fiche d'un produit, la variable $page_name est vide. Cela est aussi le cas pour le panier
    • 0
  6. Myriam a ajouté un message dans un sujet  Background header différent en fonction de la page   

    J'ai remarqué qu'il y avait cette variable dans le haut.tpl = page_{$page_name} ; Ce qui donne page_index pour l'accueil, page_catalogue pour le catalogue, etc
    Cela pourrait être un bon début pour moi, peut-être plus facile que le code-technique ?
    • 0
  7. Myriam a ajouté un sujet dans PEEL SHOPPING : logiciel open source de boutique en ligne   

    Background header différent en fonction de la page
    Bonjour,
    Dans le header (id=main_header) et particulièrement dans le style navbar-inner j'ai mis une image de fond.
    Je souhaiterai que cette image de fond soit différente en page d'accueil, en page catalogue et pour les rubrique de premier niveau.
    Où puis-je mettre mon code pour obtenir ce résultat ? est-ce que je peux utiliser les code-technique pour différencier mes zones ? où avez-vous une solution déjà toute prête dans la version 8 ?
    • 4 réponses
    • 1 980 vues
  8. Myriam a ajouté un sujet dans Module PEEL Premium pour PEEL SHOPPING   

    Newsletter en anglais
    Bonjour,
    J'ai créé deux templates de newsletter, un en fr et un en en. A priori pour rien car dans fidélisation > envoi de newsletter on ne peut rattacher qu'un seul template aussi bien pour la partie française que anglaise.
    Ensuite dans fidélisation > envoi de newsletter > j'ai créé une newsletter en réalisant bien un texte français et un texte anglais.
    Seulement, seuls les utilisateurs français reçoivent correctement la newsletter.
    Les utilisateurs anglais reçoivent un mail avec la lettre L en majuscule.

    • 2 réponses
    • 3 372 vues
  9. Myriam a ajouté un message dans un sujet  Bug javascript en version anglaise   

    Merci Simon !
    • 0
  10. Myriam a ajouté un sujet dans Module PEEL Premium pour PEEL SHOPPING   

    Bug javascript en version anglaise
    Bonjour,
    Je ne comprends pas. Le javascript n'est pas mon fort !
    Le site fonctionne correctement en version française mais dès que l'on cliques sur le drapeau anglais. Le javascript ne fonctionne plus : le zoom sur l'image de la fiche produit, le menu responsive !, le carrousel, etc.
    Dans la console j'ai les messages d'erreur suivants : voir image.

    • 2 réponses
    • 2 176 vues
  11. Myriam a ajouté un message dans un sujet  Envoi de newsletters   

    En fait, pour l'instant je n'ai fait que des envois tests vers les administrateurs.
    Je reçois deux fois la newsletter. Dans la table cron, il y a deux taches qui se crées. Une en FR et une en EN.
    La FR arrive correctement dans la boite mail.
    la EN le sujet est bon mais le contenu est remplacer par la lettre L.
    • 0
  12. Myriam a ajouté un message dans un sujet  Envoi de newsletters   

    Bonjour,
    J'ai ajouté $template_tags['EMAIL'] = $this_user['email']; dans modules/crons/envois_emails.php.
    La synthèse du lien avec tag dans un modèle d'emails est bien :
    [link="http://www.terraventoux.fr/descinscription.php?email="]cliquez ici[/link]
    Il n'y a pas besoin d'entourer EMAIL de simple ou double quote ?
    "fr" pour les français et "en" pour les autres.
    • 0
  13. Myriam a ajouté un message dans un sujet  Envoi de newsletters   

    Bonsoir Simon
    Merci pour vos réponses. En effet, la tache cron sur l'hébergement n'avait pas été programmé.
    Maintenant cela fonctionne. Juste une chose. Dans mon modèles d'emails, j'ai mis un lien ainsi :
    Pour annuler votre inscription : [link="http://www.terraventoux.fr/desinscription.php?email="]cliquez ici[/link]
    Cependant, lorsque l'on reçoit le mail, voici comment apparaît le lien :
    http://www.terraventoux.fr/desinscription.php?email=[EMAIL>
    Comment je peux récupérer l'email du destinataire ?
    Pourquoi le destinataire reçoit la newsletter française et anglaise ?
    • 0
  14. Myriam a ajouté un message dans un sujet  Envoi de newsletters   

    Pouvez-vous me dire quel lien je dois renseigner dans mon template de newsletter pour que le contact puisse ce désinscrire ?
    • 0
  15. Myriam a ajouté un message dans un sujet  Envoi de newsletters   

    En revanche, dans mes erreurs de logs, j'ai cela :
    [Fri Oct 09 12:43:57 2015] [error] [client 176.128.71.92] PHP Warning: Illegal string offset 'en' in /var/www/vhosts/terraventoux.fr/httpdocs/gestion/newsletter.php on line 304, referer: http://www.terraventoux.fr/gestion/newsletter.php?start=0 
    Pouvez-vous m'expliquer ?
    • 0
  16. Myriam a ajouté un sujet dans Module PEEL Premium pour PEEL SHOPPING   

    Envoi de newsletters
    Bonjour,
    Je viens de créer une newsletter et j'ai cliqué sur "envoi test au administrateurs", il y a maintenant une demi heure.
    Je n'ai rien reçu.
    Lorsque je regarde mes logs, la requête a été réalisée avec succès : [09/Oct/2015:12:43:57 +0200] "GET /gestion/newsletter.php?mode=send&id=1&format=html&test=test&token=39006f9f69c3cd95b330e580aa95add4 HTTP/1.1" 200 6188 "http://www.terraventoux.fr/gestion/newsletter.php?start=0" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36" 
    Quand vous dites aux administrateurs, quel type d'administrateur ? quel mail est incrémenté quand il y a la variable test ?
    • 8 réponses
    • 3 149 vues
  17. Myriam a ajouté un sujet dans Module PEEL Premium pour PEEL SHOPPING   

    Page contact
    Bonjour,
    La page contact (www.site.com/utilisateurs/contact.php) affiche un formulaire de contact dans la div contact_form. Juste au dessus de cette div, il y a la div contact_info. 
    Dans votre démo, le contenu de la table peel_contacts s'affiche en pied de page dans Coordonnées.
    Je souhaiterai que le contenu de cette table s'affiche dans la div contact_info de la page utilisateurs > contact.php, comment dois-je procéder ?
    • 1 réponse
    • 1 681 vues
  18. Myriam a ajouté un message dans un sujet  Page erreur personnalisée   

    Bonjour Simon
    Oui, la 404.
    • 0
  19. Myriam a ajouté un sujet dans Module PEEL Premium pour PEEL SHOPPING   

    Page erreur personnalisée
    Bonjour,
    Je souhaiterai dans la nouvelle version de peel shopping avoir une page d'erreur personnalisée comme dans les versions précédentes.
    Où dois-je intervenir dans le code pour cela ?
    • 3 réponses
    • 1 464 vues
  20. Myriam a ajouté un message dans un sujet  Page d'accueil : articles à la une + produits à la une   

    Merci Simon. Je regarde cela.
    • 0
  21. Myriam a ajouté un sujet dans Module PEEL Premium pour PEEL SHOPPING   

    Page d'accueil : articles à la une + produits à la une
    Bonjour,
    Je souhaiterai modifier l'affichage de la page d'accueil.
    En premier, je souhaiterai afficher Notre sélection, est cela est configurable dans site.php et où je peux modifier le style et la template.
    Ensuite, je voudrais afficher les articles à la une : j'ai vu que cela se configurait dans site.php mais où je peux changer le style, template et le nombre d'article sur la page d'accueil.
    Quel est la différences entre à la une et article à la une dans site.php car je ne vois rien s'afficher. Quels sont les différents valeurs pour Mode d'affichage.
    • 2 réponses
    • 1 596 vues
  22. Myriam a ajouté un message dans un sujet  Modification du panier   

    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; } }  
    • 0
  23. Myriam a ajouté un message dans un sujet  Bug Rédactionnel rubrique   

    Merci.
    • 0
  24. Myriam a ajouté un sujet dans Module PEEL Premium pour PEEL SHOPPING   

    Bug Rédactionnel rubrique
    Bonjour,
    Dans la partie rédactionnel, liste des rubriques, lorsque l'on souhaite modifier une sous rubrique, dans le champ rubrique parente, c'est la rubrique en cours de modification qui est sélectionnée si bien que si vous ne resélectionnez pas la rubrique primaire, la sous rubrique devient une rubrique à la racine.
    Où doit-on modifier ce bug ?
    • 2 réponses
    • 1 284 vues
  25. Myriam a ajouté un message dans un sujet  Modification du panier   

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

Twitter Advisto ecommerce

Facebook PEEL Shopping