/config/classes/panier.class.php
PHP | 329 lines | 203 code | 36 blank | 90 comment | 41 complexity | c59ca3c607880ea28a321f31352b00dd MD5 | raw file
- <?php
- /***********************************************************************************
- *
- * PANIER
- *
- ***********************************************************************************/
- class panier
- {
- // Attributs
- /**
- * Constructeur de la class, spécifie les valeurs du formulaire
- */
- function panier()
- {
- }
- // Fin constructeur
- // Fonctions
-
- /**
- * Fonction qui ajoute une référence et sa quantité au panier ($_SESSION )
- * @param string $session - identifiant de la $_SESSION ou est stocké le panier
- * @param string $reference - id de la ligne du produit
- * @param string $quantite - quantité du produit
- * @return string erreur
- */
- function add($session,$reference,$quantite)
- {
- GLOBAL $db;
-
- if (empty($session) || empty($reference) || empty($quantite)) {
- return;
- }
- $erreur=false;
- $count = (isset($_SESSION["$session"]) ? count($_SESSION["$session"]) : 0);
- $quantite=ceil($quantite);
-
- // Vérification que la référence existe et qu'il y a du stock
- $detail = $db->query("SELECT nom, produit_id, reference, stock FROM produit_detail WHERE id='".$reference."'");
- $detail = $db->fetch_assoc($detail);
- if ($detail) {
- if ($detail['stock']<$quantite){
- // Plus de stock pour ce produit, on mets au minimum la quantité
- $produit = $db->query("SELECT nom FROM produit WHERE id='".$detail['produit_id']."'");
- $produit = $db->fetch_assoc($produit);
- $erreur='Erreur, le stock est insuffisant pour le produit '.$produit['nom'].' (réf : '.$detail['reference'].' '.$detail['nom'].'). La quantité maximum est '.$detail['stock'].'.' ;
- $quantite = $detail['stock'];
- }
- // Le produit n'existe pas
- } else return ;
-
-
- for($i=0;$i<$count;$i++)
- {
- //$_SESSION["$session"][$i]["reference"]; ////// ?? PhR
- // on fait une boucle qui va passer en revue chaque produit du panier
- // pour voir si le produit que l'on veut rajouter existe déja
- if($_SESSION["$session"][$i]["reference"]==$reference)
- {
- // le produit existe...
- $existe = "true";
- // inscrit dans une variable que le produit existe...
- $existe_ref = $i;
- // et on précise aussi quel est son emplacment dans le caddie
- }
- }
-
- if(isset($existe) && $existe == "true")
- {
- // si le produit existe déja...
- // ...la quantité précédente est effacée...
- array_splice($_SESSION["$session"],$existe_ref,1);
- // ...pour laisser place ? celle qui le client vient de rajouter si >0 ...
- if($quantite>0) {
- $_SESSION["$session"][]=array("reference"=>$reference,"quantite"=>$quantite);
- }
- } else {
- // sinon on rajoute le produit dans le panier tt simplement...
- if($quantite>0) {
- $_SESSION["$session"][]=array("reference"=>$reference,"quantite"=>$quantite);
- }
- }
- return $erreur;
- }
- /**
- * Fonction qui supprime une référence du panier ($_SESSION )
- * @param string $session - identifiant de la $_SESSION ou est stocké le panier
- * @param array $reference - id de la ligne du produit
- */
- function del($session,$reference)
- {
- if (empty($session) || empty($reference)) {
- return;
- }
- $count = count($_SESSION["$session"]);
- for ($i=0; $i < $count; $i++)
- {
- if ($_SESSION["$session"][$i]['reference'] == $reference)
- {
- array_splice($_SESSION["$session"],$i,1);
- $count--;
- }
- }
- }
- /**
- * Recalcule entierement le panier ? partir des valeurs post du formulaire de la page panier
- * Toutes les variables sont effacées puis réassignées
- * $reference et $quantite sont les tableaux post du formulaire
- * @param string $session - identifiant de la $_SESSION ou est stocké le panier
- * @param array $reference - id de la ligne du produit
- * @param array $quantite - quantités des produit
- * @return string erreur
- * le montant total se trouve dans $_SESSION['COMMANDE']['tpanier']
- */
- function calc($session,$reference,$quantite)
- {
- GLOBAL $db;
-
- if (empty($session) || empty($reference) || empty($quantite)) {
- return;
- }
-
- unset($_SESSION["$session"]);
-
- $erreur=false;
- $count = count($quantite);
- $ttc=0;
- for($i=0;$i<$count;$i++)
- {
- $quantite[$i]=ceil($quantite[$i]);
- if($quantite[$i]>0) {
- // Vérification du stock
- $detail = $db->query("SELECT d.nom, d.produit_id, d.reference, d.stock, p.nom AS prod_nom FROM produit_detail d INNER JOIN produit p ON p.id = d.produit_id WHERE d.id='".$reference[$i]."'");
- $detail = $db->fetch_assoc($detail);
- if ($detail) {
- if ($detail['stock']<$quantite[$i]){
- // Plus de stock pour ce produit, on mets au minimum la quantité
- $erreur[]='Erreur, le stock est insuffisant pour le produit '.$detail['prod_nom'].' (réf : '.$detail['reference'].' '.$detail['nom'].'). La quantité maximum est '.$detail['stock'].'.' ;
- $quantite[$i] = $detail['stock'];
- }
- $_SESSION["$session"][]=array("reference"=>$reference[$i],"quantite"=>$quantite[$i]);
- $prix=$this->prix_unit($reference[$i]);
- $montant=$prix * $quantite[$i] ;
- $ttc+=$montant;
- }
- }
- }
- // Enregistrement du total pour vérification ultérieur avec le montant de la commande
- $_SESSION['COMMANDE']['tpanier'] = $ttc;
- return ($erreur);
- }
-
- /**
- * Calcul le prix unitaire d'une référence (avec les promos)
- * @param string $reference - référence produit
- * @return string prix du unitaire
- */
- function prix_unit($reference)
- {
- GLOBAL $db;
-
- $detail = $db->query("SELECT prix, promo FROM produit_detail WHERE id='".$db->escape($reference)."'");
- $detail = $db->fetch_assoc($detail);
- if (empty($detail['promo'])) {
- return $detail['prix'];
- }
- else {
- return $detail['promo'];
- }
- }
- /**
- * Récupére le détails du panier pour un futur affichage
- * @param string $session - identifiant de la $_SESSION ou est stocké le panier
- * @return array(tpanier,photo,produit_detail)
- */
- function details($session)
- {
- GLOBAL $db,$IMAGE_TYPE;
-
- $nb_produits=count($_SESSION[$session]);
-
- $tpanier=$tva=$tht=$ttc=0;
- for ($i=0; $i<$nb_produits ; $i++) {
- $produit_detail = $db->query("SELECT d.id AS produit_detail_id, d.nom, d.produit_id, d.reference, d.prix, d.promo, p.id, p.nom AS prod_nom FROM produit_detail d INNER JOIN produit p ON p.id = d.produit_id WHERE d.id='".$_SESSION[$session][$i]['reference']."'");
- $produit_detail = $db->fetch_assoc($produit_detail);
- // Préparation photo
- $mini = findFile('prod-'.$produit_detail['id'].'-m-*',REP_PHOTOS,$IMAGE_TYPE);
- $photo = ($mini ? '<img class="floatleft" src="'.REP_PHOTOS.$mini[0].'" alt="'.htmlspecialchars($produit_detail['prod_nom']).'" />':'');
- // Calcul montant et cummul
- $prix=$this->prix_unit($produit_detail['produit_detail_id']);
- $produit_detail['quantite']=$quantite=$_SESSION[$session][$i]['quantite'];
- $produit_detail['montant']=$montant=$prix * $quantite ;
- $tpanier+=$montant;
- $panier['produit_detail'][] = $produit_detail;
- $panier['photo'][] = $photo;
- }
- // Enregistrement du total pour vérification ultérieur avec le montant de la commande
- $_SESSION['COMMANDE']['tpanier'] = $tpanier;
-
- $panier['tht'] = $tht = $tpanier - ($tpanier*TXTVA)/100;
- $panier['tva'] = $tpanier - $tht;
- $panier['tpanier'] = $tpanier;
- return $panier;
-
- }
-
- /**
- * Calcul des frais de ports
- * @param string $livraison - id de livraison (transporteur)
- * @param string $poids - poid total de la commande en kg
- * @param string $pays_livraison - id du pays de livraison
- * @return string prix du transport
- */
- function frais_port($livraison,$poids,$pays_livraison)
- {
- GLOBAL $db;
-
- // Récupération de la zone de livraison
- $liv_pays=$db->query("SELECT zone_id, tva FROM port_pays WHERE pays_id='".$pays_livraison."' AND tarifs_id='".$livraison."'");
- $liv_pays = $db->fetch_assoc($liv_pays);
- // Calcul des frais de port
- // Vérifie si il y a une livraison (cas de l'enlévement)
- if (!empty($poids) OR $livraison == 0) {
- // Recherche la tranche de poids concernée
- $requete="SELECT id
- FROM port_tranches
- WHERE '".$poids."' > mini AND '".$poids."' <= maxi AND supp != 'o' AND tarifs_id='".$livraison."'
- ";
- $tranche = $db->query($requete);
-
- if ($db->num_rows($tranche) ){
- // Le poids rentre dans une tranche
- $tranche = $db->fetch_assoc($tranche);
- // Recherche du tarif associé ? la tranche
- $requete="SELECT montant
- FROM port_frais
- WHERE id_tranche = '".$tranche['id']."' AND id_tarif = '".$livraison ."' AND id_zone = '".$liv_pays['zone_id'] ."'
- ";
- $frais = $db->query($requete);
- $frais = $db->fetch_assoc($frais);
- $port = $frais['montant'];
- }
- else {
- // Recherche de la plus grande tranche et de son tarif
- $requete="SELECT t.id, t.maxi, f.montant
- FROM port_frais f
- INNER JOIN port_tranches t
- WHERE f.id_tranche = t.id AND f.id_tarif = '".$livraison."' AND f.id_zone = '".$liv_pays['zone_id'] ."'
- ORDER BY t.maxi DESC LIMIT 1
- ";
- $maxi = $db->query($requete);
- $maxi = $db->fetch_assoc($maxi);
- //print_r($maxi);
- // Cas ou les tranches ne se suivent pas (erreur dans la table port_tranches )
- if ($poids < $maxi['maxi'])
- $port = 0;
- else {
- // Cas du supplément
- $requete="SELECT id, mini
- FROM port_tranches
- WHERE supp = 'o' AND tarifs_id='".$livraison."'
- ";
- $supp = $db->query($requete);
- $supp = $db->fetch_assoc($supp);
- // Recherche du tarif associé au supplément
- $requete="SELECT montant
- FROM port_frais
- WHERE id_tranche = '".$supp['id']."' AND id_tarif = '".$livraison."' AND id_zone = '".$liv_pays['zone_id'] ."'
- ";
- $frais = $db->query($requete);
- $frais = $db->fetch_assoc($frais);
- // Calcul des tranches supplémentaires
- if (!empty($frais['montant'])) {
- $port = $maxi['montant'] + (ceil(($poids - $maxi['maxi'])/$supp['mini']) * $frais['montant']);
- }
- else $port = 0;
- //echo '$maxi : '.$maxi['maxi'];
- //echo '<br />prix maxi : '.$maxi['montant'];
- }
- }
- }
- else $port = 0;
- return $port;
- }
-
- /**
- * Calcul le poid du panier
- * @param array $_SESSION['PANIER']
- * @return string poids du panier
- */
- function poids()
- {
- GLOBAL $db;
-
- $poids=0;
- if (is_array($_SESSION['PANIER'])) {
- $nb_produits = count($_SESSION['PANIER']);
- for ($i=0; $i<$nb_produits ; $i++) {
- // Lecture du produit_detail
- $requete="SELECT p.poids
- FROM produit_detail pd
- INNER JOIN produit p
- WHERE p.id = pd.produit_id AND pd.id='".$_SESSION['PANIER'][$i]['reference']."'
- ";
- $produit = $db->query($requete);
- $produit = $db->fetch_assoc($produit);
-
- // Calcul du cummul
- $poids += $produit['poids']/1000;
- }
- }
- return $poids;
- }
- } // Fin classe panier
- ?>