PageRenderTime 47ms CodeModel.GetById 16ms RepoModel.GetById 1ms app.codeStats 0ms

/config/classes/panier.class.php

https://code.google.com/
PHP | 329 lines | 203 code | 36 blank | 90 comment | 41 complexity | c59ca3c607880ea28a321f31352b00dd MD5 | raw file
  1. <?php
  2. /***********************************************************************************
  3. *
  4. * PANIER
  5. *
  6. ***********************************************************************************/
  7. class panier
  8. {
  9. // Attributs
  10. /**
  11. * Constructeur de la class, spécifie les valeurs du formulaire
  12. */
  13. function panier()
  14. {
  15. }
  16. // Fin constructeur
  17. // Fonctions
  18. /**
  19. * Fonction qui ajoute une référence et sa quantité au panier ($_SESSION )
  20. * @param string $session - identifiant de la $_SESSION ou est stocké le panier
  21. * @param string $reference - id de la ligne du produit
  22. * @param string $quantite - quantité du produit
  23. * @return string erreur
  24. */
  25. function add($session,$reference,$quantite)
  26. {
  27. GLOBAL $db;
  28. if (empty($session) || empty($reference) || empty($quantite)) {
  29. return;
  30. }
  31. $erreur=false;
  32. $count = (isset($_SESSION["$session"]) ? count($_SESSION["$session"]) : 0);
  33. $quantite=ceil($quantite);
  34. // Vérification que la référence existe et qu'il y a du stock
  35. $detail = $db->query("SELECT nom, produit_id, reference, stock FROM produit_detail WHERE id='".$reference."'");
  36. $detail = $db->fetch_assoc($detail);
  37. if ($detail) {
  38. if ($detail['stock']<$quantite){
  39. // Plus de stock pour ce produit, on mets au minimum la quantité
  40. $produit = $db->query("SELECT nom FROM produit WHERE id='".$detail['produit_id']."'");
  41. $produit = $db->fetch_assoc($produit);
  42. $erreur='Erreur, le stock est insuffisant pour le produit '.$produit['nom'].' (réf : '.$detail['reference'].' '.$detail['nom'].'). La quantité maximum est '.$detail['stock'].'.' ;
  43. $quantite = $detail['stock'];
  44. }
  45. // Le produit n'existe pas
  46. } else return ;
  47. for($i=0;$i<$count;$i++)
  48. {
  49. //$_SESSION["$session"][$i]["reference"]; ////// ?? PhR
  50. // on fait une boucle qui va passer en revue chaque produit du panier
  51. // pour voir si le produit que l'on veut rajouter existe déja
  52. if($_SESSION["$session"][$i]["reference"]==$reference)
  53. {
  54. // le produit existe...
  55. $existe = "true";
  56. // inscrit dans une variable que le produit existe...
  57. $existe_ref = $i;
  58. // et on précise aussi quel est son emplacment dans le caddie
  59. }
  60. }
  61. if(isset($existe) && $existe == "true")
  62. {
  63. // si le produit existe déja...
  64. // ...la quantité précédente est effacée...
  65. array_splice($_SESSION["$session"],$existe_ref,1);
  66. // ...pour laisser place ? celle qui le client vient de rajouter si >0 ...
  67. if($quantite>0) {
  68. $_SESSION["$session"][]=array("reference"=>$reference,"quantite"=>$quantite);
  69. }
  70. } else {
  71. // sinon on rajoute le produit dans le panier tt simplement...
  72. if($quantite>0) {
  73. $_SESSION["$session"][]=array("reference"=>$reference,"quantite"=>$quantite);
  74. }
  75. }
  76. return $erreur;
  77. }
  78. /**
  79. * Fonction qui supprime une référence du panier ($_SESSION )
  80. * @param string $session - identifiant de la $_SESSION ou est stocké le panier
  81. * @param array $reference - id de la ligne du produit
  82. */
  83. function del($session,$reference)
  84. {
  85. if (empty($session) || empty($reference)) {
  86. return;
  87. }
  88. $count = count($_SESSION["$session"]);
  89. for ($i=0; $i < $count; $i++)
  90. {
  91. if ($_SESSION["$session"][$i]['reference'] == $reference)
  92. {
  93. array_splice($_SESSION["$session"],$i,1);
  94. $count--;
  95. }
  96. }
  97. }
  98. /**
  99. * Recalcule entierement le panier ? partir des valeurs post du formulaire de la page panier
  100. * Toutes les variables sont effacées puis réassignées
  101. * $reference et $quantite sont les tableaux post du formulaire
  102. * @param string $session - identifiant de la $_SESSION ou est stocké le panier
  103. * @param array $reference - id de la ligne du produit
  104. * @param array $quantite - quantités des produit
  105. * @return string erreur
  106. * le montant total se trouve dans $_SESSION['COMMANDE']['tpanier']
  107. */
  108. function calc($session,$reference,$quantite)
  109. {
  110. GLOBAL $db;
  111. if (empty($session) || empty($reference) || empty($quantite)) {
  112. return;
  113. }
  114. unset($_SESSION["$session"]);
  115. $erreur=false;
  116. $count = count($quantite);
  117. $ttc=0;
  118. for($i=0;$i<$count;$i++)
  119. {
  120. $quantite[$i]=ceil($quantite[$i]);
  121. if($quantite[$i]>0) {
  122. // Vérification du stock
  123. $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]."'");
  124. $detail = $db->fetch_assoc($detail);
  125. if ($detail) {
  126. if ($detail['stock']<$quantite[$i]){
  127. // Plus de stock pour ce produit, on mets au minimum la quantité
  128. $erreur[]='Erreur, le stock est insuffisant pour le produit '.$detail['prod_nom'].' (réf : '.$detail['reference'].' '.$detail['nom'].'). La quantité maximum est '.$detail['stock'].'.' ;
  129. $quantite[$i] = $detail['stock'];
  130. }
  131. $_SESSION["$session"][]=array("reference"=>$reference[$i],"quantite"=>$quantite[$i]);
  132. $prix=$this->prix_unit($reference[$i]);
  133. $montant=$prix * $quantite[$i] ;
  134. $ttc+=$montant;
  135. }
  136. }
  137. }
  138. // Enregistrement du total pour vérification ultérieur avec le montant de la commande
  139. $_SESSION['COMMANDE']['tpanier'] = $ttc;
  140. return ($erreur);
  141. }
  142. /**
  143. * Calcul le prix unitaire d'une référence (avec les promos)
  144. * @param string $reference - référence produit
  145. * @return string prix du unitaire
  146. */
  147. function prix_unit($reference)
  148. {
  149. GLOBAL $db;
  150. $detail = $db->query("SELECT prix, promo FROM produit_detail WHERE id='".$db->escape($reference)."'");
  151. $detail = $db->fetch_assoc($detail);
  152. if (empty($detail['promo'])) {
  153. return $detail['prix'];
  154. }
  155. else {
  156. return $detail['promo'];
  157. }
  158. }
  159. /**
  160. * Récupére le détails du panier pour un futur affichage
  161. * @param string $session - identifiant de la $_SESSION ou est stocké le panier
  162. * @return array(tpanier,photo,produit_detail)
  163. */
  164. function details($session)
  165. {
  166. GLOBAL $db,$IMAGE_TYPE;
  167. $nb_produits=count($_SESSION[$session]);
  168. $tpanier=$tva=$tht=$ttc=0;
  169. for ($i=0; $i<$nb_produits ; $i++) {
  170. $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']."'");
  171. $produit_detail = $db->fetch_assoc($produit_detail);
  172. // Préparation photo
  173. $mini = findFile('prod-'.$produit_detail['id'].'-m-*',REP_PHOTOS,$IMAGE_TYPE);
  174. $photo = ($mini ? '<img class="floatleft" src="'.REP_PHOTOS.$mini[0].'" alt="'.htmlspecialchars($produit_detail['prod_nom']).'" />':'');
  175. // Calcul montant et cummul
  176. $prix=$this->prix_unit($produit_detail['produit_detail_id']);
  177. $produit_detail['quantite']=$quantite=$_SESSION[$session][$i]['quantite'];
  178. $produit_detail['montant']=$montant=$prix * $quantite ;
  179. $tpanier+=$montant;
  180. $panier['produit_detail'][] = $produit_detail;
  181. $panier['photo'][] = $photo;
  182. }
  183. // Enregistrement du total pour vérification ultérieur avec le montant de la commande
  184. $_SESSION['COMMANDE']['tpanier'] = $tpanier;
  185. $panier['tht'] = $tht = $tpanier - ($tpanier*TXTVA)/100;
  186. $panier['tva'] = $tpanier - $tht;
  187. $panier['tpanier'] = $tpanier;
  188. return $panier;
  189. }
  190. /**
  191. * Calcul des frais de ports
  192. * @param string $livraison - id de livraison (transporteur)
  193. * @param string $poids - poid total de la commande en kg
  194. * @param string $pays_livraison - id du pays de livraison
  195. * @return string prix du transport
  196. */
  197. function frais_port($livraison,$poids,$pays_livraison)
  198. {
  199. GLOBAL $db;
  200. // Récupération de la zone de livraison
  201. $liv_pays=$db->query("SELECT zone_id, tva FROM port_pays WHERE pays_id='".$pays_livraison."' AND tarifs_id='".$livraison."'");
  202. $liv_pays = $db->fetch_assoc($liv_pays);
  203. // Calcul des frais de port
  204. // Vérifie si il y a une livraison (cas de l'enlévement)
  205. if (!empty($poids) OR $livraison == 0) {
  206. // Recherche la tranche de poids concernée
  207. $requete="SELECT id
  208. FROM port_tranches
  209. WHERE '".$poids."' > mini AND '".$poids."' <= maxi AND supp != 'o' AND tarifs_id='".$livraison."'
  210. ";
  211. $tranche = $db->query($requete);
  212. if ($db->num_rows($tranche) ){
  213. // Le poids rentre dans une tranche
  214. $tranche = $db->fetch_assoc($tranche);
  215. // Recherche du tarif associé ? la tranche
  216. $requete="SELECT montant
  217. FROM port_frais
  218. WHERE id_tranche = '".$tranche['id']."' AND id_tarif = '".$livraison ."' AND id_zone = '".$liv_pays['zone_id'] ."'
  219. ";
  220. $frais = $db->query($requete);
  221. $frais = $db->fetch_assoc($frais);
  222. $port = $frais['montant'];
  223. }
  224. else {
  225. // Recherche de la plus grande tranche et de son tarif
  226. $requete="SELECT t.id, t.maxi, f.montant
  227. FROM port_frais f
  228. INNER JOIN port_tranches t
  229. WHERE f.id_tranche = t.id AND f.id_tarif = '".$livraison."' AND f.id_zone = '".$liv_pays['zone_id'] ."'
  230. ORDER BY t.maxi DESC LIMIT 1
  231. ";
  232. $maxi = $db->query($requete);
  233. $maxi = $db->fetch_assoc($maxi);
  234. //print_r($maxi);
  235. // Cas ou les tranches ne se suivent pas (erreur dans la table port_tranches )
  236. if ($poids < $maxi['maxi'])
  237. $port = 0;
  238. else {
  239. // Cas du supplément
  240. $requete="SELECT id, mini
  241. FROM port_tranches
  242. WHERE supp = 'o' AND tarifs_id='".$livraison."'
  243. ";
  244. $supp = $db->query($requete);
  245. $supp = $db->fetch_assoc($supp);
  246. // Recherche du tarif associé au supplément
  247. $requete="SELECT montant
  248. FROM port_frais
  249. WHERE id_tranche = '".$supp['id']."' AND id_tarif = '".$livraison."' AND id_zone = '".$liv_pays['zone_id'] ."'
  250. ";
  251. $frais = $db->query($requete);
  252. $frais = $db->fetch_assoc($frais);
  253. // Calcul des tranches supplémentaires
  254. if (!empty($frais['montant'])) {
  255. $port = $maxi['montant'] + (ceil(($poids - $maxi['maxi'])/$supp['mini']) * $frais['montant']);
  256. }
  257. else $port = 0;
  258. //echo '$maxi : '.$maxi['maxi'];
  259. //echo '<br />prix maxi : '.$maxi['montant'];
  260. }
  261. }
  262. }
  263. else $port = 0;
  264. return $port;
  265. }
  266. /**
  267. * Calcul le poid du panier
  268. * @param array $_SESSION['PANIER']
  269. * @return string poids du panier
  270. */
  271. function poids()
  272. {
  273. GLOBAL $db;
  274. $poids=0;
  275. if (is_array($_SESSION['PANIER'])) {
  276. $nb_produits = count($_SESSION['PANIER']);
  277. for ($i=0; $i<$nb_produits ; $i++) {
  278. // Lecture du produit_detail
  279. $requete="SELECT p.poids
  280. FROM produit_detail pd
  281. INNER JOIN produit p
  282. WHERE p.id = pd.produit_id AND pd.id='".$_SESSION['PANIER'][$i]['reference']."'
  283. ";
  284. $produit = $db->query($requete);
  285. $produit = $db->fetch_assoc($produit);
  286. // Calcul du cummul
  287. $poids += $produit['poids']/1000;
  288. }
  289. }
  290. return $poids;
  291. }
  292. } // Fin classe panier
  293. ?>