|
1
|
|
|
<?php |
|
2
|
|
|
/** |
|
3
|
|
|
* **************************************************************************** |
|
4
|
|
|
* oledrion - MODULE FOR XOOPS |
|
5
|
|
|
* Copyright (c) Hervé Thouzard of Instant Zero (http://www.instant-zero.com) |
|
6
|
|
|
* |
|
7
|
|
|
* You may not change or alter any portion of this comment or credits |
|
8
|
|
|
* of supporting developers from this source code or any supporting source code |
|
9
|
|
|
* which is considered copyrighted (c) material of the original comment or credit authors. |
|
10
|
|
|
* This program is distributed in the hope that it will be useful, |
|
11
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
12
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
|
13
|
|
|
* |
|
14
|
|
|
* @copyright Hervé Thouzard of Instant Zero (http://www.instant-zero.com) |
|
15
|
|
|
* @license http://www.fsf.org/copyleft/gpl.html GNU public license |
|
16
|
|
|
* @package oledrion |
|
17
|
|
|
* @author Hervé Thouzard of Instant Zero (http://www.instant-zero.com) |
|
18
|
|
|
* |
|
19
|
|
|
* Version : |
|
20
|
|
|
* **************************************************************************** |
|
21
|
|
|
*/ |
|
22
|
|
|
|
|
23
|
|
|
/** |
|
24
|
|
|
* Calcul du panier et de ses réductions en fonction des règles de remises |
|
25
|
|
|
* Cette classe ne gère pas de fichier (elle sert uniquement aux calculs) |
|
26
|
|
|
* |
|
27
|
|
|
* Détail des tableaux : |
|
28
|
|
|
* categoriesProductsCount => Nombre de produits par catégorie |
|
29
|
|
|
* [clé] = Id Catégorie, [valeur] = Nombre de produits |
|
30
|
|
|
* |
|
31
|
|
|
* categoriesProductsQuantities => Quantités de produits par catégorie |
|
32
|
|
|
* [clé] = Id Catégorie, [valeur] = Quantité de produits |
|
33
|
|
|
* |
|
34
|
|
|
* totalProductsQuantities => Quantité totale de tous les produits |
|
35
|
|
|
* |
|
36
|
|
|
* associatedManufacturers => Contient la liste des ID uniques de produits |
|
37
|
|
|
* [clé] = Id Produit, [valeur] = Id produit |
|
38
|
|
|
* |
|
39
|
|
|
* associatedVendors => Contient la liste des vendeurs de produits |
|
40
|
|
|
* [clé] = Id Vendeur, [valeur] = Id Vendeur |
|
41
|
|
|
* |
|
42
|
|
|
* associatedAttributesPerProduct => Contient les attributs de chaque produit |
|
43
|
|
|
* [clé] = Id Produit, [valeurS] = Tous les attributs du produit sous la forme d'objets de type Attributs |
|
44
|
|
|
* |
|
45
|
|
|
* associatedCategories => Contient la liste des ID de catégories |
|
46
|
|
|
* [clé] = Id Catégorie, [valeur] = Id Catégorie |
|
47
|
|
|
* |
|
48
|
|
|
* totalAmountBeforeDiscounts => Montant total de la commande avant les réductions |
|
49
|
|
|
* |
|
50
|
|
|
* associatedManufacturersPerProduct => Contient la liste des ID des fabricants par produit |
|
51
|
|
|
* [clé] = Id produit, [valeur] = array(Ids des fabricants) |
|
52
|
|
|
* |
|
53
|
|
|
* Les 3 tableaux suivants évoluent ensuite comme ceci : |
|
54
|
|
|
* associatedManufacturers => Tableau d'objets de type Fabricants |
|
55
|
|
|
* [clé] = id Fabricant [valeur] = Fabricant sous la forme d'un objet |
|
56
|
|
|
* |
|
57
|
|
|
* associatedVendors => Tableau d'ojets de type Vendeurs |
|
58
|
|
|
* [clé] = Id Vendeur [valeur] = Vendeur sous la forme d'un objet |
|
59
|
|
|
* |
|
60
|
|
|
* associatedCategories => Tableau d'objets de type Categories |
|
61
|
|
|
* [clé] = Id Catégorie [valeur] = Catéagorie sous la forme d'un objet |
|
62
|
|
|
* |
|
63
|
|
|
*/ |
|
64
|
|
|
class Oledrion_reductions |
|
|
|
|
|
|
65
|
|
|
{ |
|
66
|
|
|
// Ne contient que la liste des règles actives au moment du calcul |
|
67
|
|
|
private $allActiveRules = array(); |
|
68
|
|
|
|
|
69
|
|
|
// Nombre de produits par catégorie |
|
70
|
|
|
private $categoriesProductsCount = array(); |
|
71
|
|
|
|
|
72
|
|
|
// Quantité de produits par catégorie |
|
73
|
|
|
private $categoriesProductsQuantities = array(); |
|
74
|
|
|
|
|
75
|
|
|
/** |
|
76
|
|
|
* le caddy en mémoire |
|
77
|
|
|
* $cart['number'] = Indice du produit |
|
78
|
|
|
* $cart['id'] = Identifiant du produit |
|
79
|
|
|
* $cart['qty'] = Quantité voulue |
|
80
|
|
|
* $cart['product'] = L'objet produit correspondant au panier |
|
81
|
|
|
*/ |
|
82
|
|
|
private $cart = array(); |
|
83
|
|
|
|
|
84
|
|
|
/** |
|
85
|
|
|
* Le caddy pour le template. Consulter les détails du caddy dans la métode ComputeCart |
|
86
|
|
|
*/ |
|
87
|
|
|
private $cartForTemplate = array(); |
|
88
|
|
|
|
|
89
|
|
|
/** |
|
90
|
|
|
* Les règles à appliquer à la fin, sur l'intégralité du panier |
|
91
|
|
|
*/ |
|
92
|
|
|
private $rulesForTheWhole = array(); |
|
93
|
|
|
|
|
94
|
|
|
// Le total des quantités de produits avant les réductions |
|
95
|
|
|
private $totalProductsQuantities = 0; |
|
96
|
|
|
// Montant total de la commande avant les réductions |
|
97
|
|
|
private $totalAmountBeforeDiscounts = 0; |
|
98
|
|
|
|
|
99
|
|
|
// Handlers vers les tables du module |
|
100
|
|
|
private $handlers; |
|
101
|
|
|
|
|
102
|
|
|
// Les fabricants associés aux produits du panier |
|
103
|
|
|
private $associatedManufacturers = array(); |
|
104
|
|
|
|
|
105
|
|
|
// Les vendeur associés aux produits du panier |
|
106
|
|
|
private $associatedVendors = array(); |
|
107
|
|
|
|
|
108
|
|
|
// Les catégories associées aux produits du panier |
|
109
|
|
|
private $associatedCategories = array(); |
|
110
|
|
|
|
|
111
|
|
|
// Fabricants associés par produit du panier |
|
112
|
|
|
private $associatedManufacturersPerProduct = array(); |
|
113
|
|
|
|
|
114
|
|
|
// Attributs par produit du panier |
|
115
|
|
|
private $associatedAttributesPerProduct = array(); |
|
116
|
|
|
|
|
117
|
|
|
/** |
|
118
|
|
|
* Chargement des handlers et des règles actives |
|
119
|
|
|
*/ |
|
120
|
|
|
public function __construct() |
|
121
|
|
|
{ |
|
122
|
|
|
$this->initHandlers(); |
|
123
|
|
|
$this->loadAllActiveRules(); |
|
124
|
|
|
} |
|
125
|
|
|
|
|
126
|
|
|
/** |
|
127
|
|
|
* Chargement des handlers |
|
128
|
|
|
*/ |
|
129
|
|
|
private function initHandlers() |
|
130
|
|
|
{ |
|
131
|
|
|
$this->handlers = OledrionHandler::getInstance(); |
|
132
|
|
|
} |
|
133
|
|
|
|
|
134
|
|
|
/** |
|
135
|
|
|
* Chargement de toutes les règles actives de réductions (sans date définie ou avec une période correspondante à aujourd'hui) |
|
136
|
|
|
*/ |
|
137
|
|
|
public function loadAllActiveRules() |
|
138
|
|
|
{ |
|
139
|
|
|
$critere = new CriteriaCompo(); |
|
140
|
|
|
$critere1 = new CriteriaCompo(); |
|
141
|
|
|
$critere1->add(new Criteria('disc_date_from', 0, '=')); |
|
142
|
|
|
$critere1->add(new Criteria('disc_date_to', 0, '=')); |
|
143
|
|
|
$critere->add($critere1); |
|
144
|
|
|
|
|
145
|
|
|
$critere2 = new CriteriaCompo(); |
|
146
|
|
|
$critere2->add(new Criteria('disc_date_from', time(), '<=')); |
|
147
|
|
|
$critere2->add(new Criteria('disc_date_to', time(), '>=')); |
|
148
|
|
|
$critere->add($critere2, 'OR'); |
|
149
|
|
|
|
|
150
|
|
|
$this->allActiveRules = $this->handlers->h_oledrion_discounts->getObjects($critere); |
|
|
|
|
|
|
151
|
|
|
} |
|
152
|
|
|
|
|
153
|
|
|
/** |
|
154
|
|
|
* Calcul des quantités de produits par catégorie et du nombre de produits par catégorie |
|
155
|
|
|
* |
|
156
|
|
|
* @param oledrion_products $product |
|
157
|
|
|
* @param integer $quantity |
|
158
|
|
|
*/ |
|
159
|
|
|
public function computePerCategories(Oledrion_products $product, $quantity) |
|
160
|
|
|
{ |
|
161
|
|
|
// Nombre de produits par catégories |
|
162
|
|
View Code Duplication |
if (isset($this->categoriesProductsCount[$product->product_cid])) { |
|
|
|
|
|
|
163
|
|
|
++$this->categoriesProductsCount[$product->product_cid]; |
|
164
|
|
|
} else { |
|
165
|
|
|
$this->categoriesProductsCount[$product->product_cid] = 1; |
|
166
|
|
|
} |
|
167
|
|
|
|
|
168
|
|
|
// Mise à jour des quantités par catégories |
|
169
|
|
View Code Duplication |
if (isset($this->categoriesProductsQuantities[$product->product_cid])) { |
|
|
|
|
|
|
170
|
|
|
$this->categoriesProductsQuantities[$product->product_cid] += $quantity; |
|
171
|
|
|
} else { |
|
172
|
|
|
$this->categoriesProductsQuantities[$product->product_cid] = $quantity; |
|
173
|
|
|
} |
|
174
|
|
|
$this->totalProductsQuantities += $quantity; |
|
175
|
|
|
// Quantité totale de tous les produits |
|
176
|
|
|
} |
|
177
|
|
|
|
|
178
|
|
|
/** |
|
179
|
|
|
* Ajoute à un tableau interne, le fabricant associé à un produit |
|
180
|
|
|
* |
|
181
|
|
|
* @param oledrion_products $product |
|
182
|
|
|
*/ |
|
183
|
|
|
private function addAssociatedManufacturers(Oledrion_products $product) |
|
184
|
|
|
{ |
|
185
|
|
|
if (!isset($this->associatedManufacturers[$product->product_id])) { |
|
186
|
|
|
$this->associatedManufacturers[$product->product_id] = $product->product_id; |
|
187
|
|
|
} |
|
188
|
|
|
} |
|
189
|
|
|
|
|
190
|
|
|
/** |
|
191
|
|
|
* Recherche des attributs associés à chaque produit |
|
192
|
|
|
* |
|
193
|
|
|
* @param oledrion_products $product |
|
194
|
|
|
* @param attray $attributes |
|
195
|
|
|
* @since 2.3 |
|
196
|
|
|
*/ |
|
197
|
|
|
private function addAssociatedAttributes(Oledrion_products $product, $attributes) |
|
198
|
|
|
{ |
|
199
|
|
|
if (!isset($this->associatedAttributesPerProduct[$product->product_id])) { |
|
200
|
|
|
$this->associatedAttributesPerProduct[$product->product_id] = $product->getProductsAttributesList($attributes); |
|
201
|
|
|
} |
|
202
|
|
|
} |
|
203
|
|
|
|
|
204
|
|
|
/** |
|
205
|
|
|
* Ajoute à un tableau interne, le vendeur associé à un produit |
|
206
|
|
|
* |
|
207
|
|
|
* @param oledrion_products $product |
|
208
|
|
|
*/ |
|
209
|
|
|
private function addAssociatedVendors(Oledrion_products $product) |
|
210
|
|
|
{ |
|
211
|
|
|
if (!isset($this->associatedVendors[$product->product_vendor_id])) { |
|
212
|
|
|
$this->associatedVendors[$product->product_vendor_id] = $product->product_vendor_id; |
|
213
|
|
|
} |
|
214
|
|
|
} |
|
215
|
|
|
|
|
216
|
|
|
/** |
|
217
|
|
|
* Ajoute à un tableau interne, la catégorie associée à un produit |
|
218
|
|
|
* |
|
219
|
|
|
* @param oledrion_products $product |
|
220
|
|
|
*/ |
|
221
|
|
|
private function addAssociatedCategories(Oledrion_products $product) |
|
222
|
|
|
{ |
|
223
|
|
|
if (!isset($this->associatedCategories[$product->product_cid])) { |
|
224
|
|
|
$this->associatedCategories[$product->product_cid] = $product->product_cid; |
|
225
|
|
|
} |
|
226
|
|
|
} |
|
227
|
|
|
|
|
228
|
|
|
/** |
|
229
|
|
|
* Charge les fabricants associés aux produits du panier |
|
230
|
|
|
*/ |
|
231
|
|
|
private function loadAssociatedManufacturers() |
|
232
|
|
|
{ |
|
233
|
|
|
if (count($this->associatedManufacturers) > 0) { |
|
234
|
|
|
sort($this->associatedManufacturers); |
|
235
|
|
|
$productsIds = $this->associatedManufacturers; |
|
236
|
|
|
$this->associatedManufacturers = array(); |
|
237
|
|
|
// au cas où cela échouerait |
|
238
|
|
|
$productsManufacturers = $manufacturersIds = array(); |
|
|
|
|
|
|
239
|
|
|
$productsManufacturers = $this->handlers->h_oledrion_productsmanu->getFromProductsIds($productsIds); |
|
|
|
|
|
|
240
|
|
|
if (count($productsManufacturers) > 0) { |
|
241
|
|
|
foreach ($productsManufacturers as $productManufacturer) { |
|
242
|
|
|
if (!isset($manufacturersIds[$productManufacturer->pm_manu_id])) { |
|
243
|
|
|
$manufacturersIds[$productManufacturer->pm_manu_id] = $productManufacturer->pm_manu_id; |
|
244
|
|
|
} |
|
245
|
|
|
$this->associatedManufacturersPerProduct[$productManufacturer->pm_product_id][] = $productManufacturer->pm_manu_id; |
|
246
|
|
|
} |
|
247
|
|
|
if (count($manufacturersIds) > 0) { |
|
248
|
|
|
sort($manufacturersIds); |
|
249
|
|
|
$this->associatedManufacturers = $this->handlers->h_oledrion_manufacturer->getManufacturersFromIds($manufacturersIds); |
|
|
|
|
|
|
250
|
|
|
} |
|
251
|
|
|
} |
|
252
|
|
|
} |
|
253
|
|
|
} |
|
254
|
|
|
|
|
255
|
|
|
/** |
|
256
|
|
|
* Charge la liste des vendeurs associés aux produits |
|
257
|
|
|
*/ |
|
258
|
|
|
private function loadAssociatedVendors() |
|
259
|
|
|
{ |
|
260
|
|
|
if (count($this->associatedVendors) > 0) { |
|
261
|
|
|
sort($this->associatedVendors); |
|
262
|
|
|
$ids = $this->associatedVendors; |
|
263
|
|
|
$this->associatedVendors = $this->handlers->h_oledrion_vendors->getVendorsFromIds($ids); |
|
|
|
|
|
|
264
|
|
|
} |
|
265
|
|
|
} |
|
266
|
|
|
|
|
267
|
|
|
/** |
|
268
|
|
|
* Charge les catégories associées aux produits du panier |
|
269
|
|
|
*/ |
|
270
|
|
|
private function loadAssociatedCategories() |
|
271
|
|
|
{ |
|
272
|
|
|
if (count($this->associatedCategories) > 0) { |
|
273
|
|
|
sort($this->associatedCategories); |
|
274
|
|
|
$ids = $this->associatedCategories; |
|
275
|
|
|
$this->associatedCategories = $this->handlers->h_oledrion_cat->getCategoriesFromIds($ids); |
|
|
|
|
|
|
276
|
|
|
} |
|
277
|
|
|
} |
|
278
|
|
|
|
|
279
|
|
|
/** |
|
280
|
|
|
* Recherche les fabricants, catégories et vendeurs associés à chaque produit |
|
281
|
|
|
*/ |
|
282
|
|
|
public function loadElementsAssociatedToProducts() |
|
283
|
|
|
{ |
|
284
|
|
|
$this->loadAssociatedManufacturers(); |
|
285
|
|
|
$this->loadAssociatedVendors(); |
|
286
|
|
|
$this->loadAssociatedCategories(); |
|
287
|
|
|
} |
|
288
|
|
|
|
|
289
|
|
|
/** |
|
290
|
|
|
* Recherche les (objets) produits associés à chaque produit du panier (et lance le calcul des quantités) |
|
291
|
|
|
*/ |
|
292
|
|
|
public function loadProductsAssociatedToCart() |
|
293
|
|
|
{ |
|
294
|
|
|
$newCart = array(); |
|
295
|
|
|
foreach ($this->cart as $cartProduct) { |
|
296
|
|
|
$data = array(); |
|
297
|
|
|
$data['id'] = $cartProduct['id']; |
|
298
|
|
|
$data['number'] = $cartProduct['number']; |
|
299
|
|
|
$data['qty'] = $cartProduct['qty']; |
|
300
|
|
|
$data['attributes'] = $cartProduct['attributes']; |
|
301
|
|
|
|
|
302
|
|
|
$product = null; |
|
|
|
|
|
|
303
|
|
|
$product = $this->handlers->h_oledrion_products->get($data['id']); |
|
|
|
|
|
|
304
|
|
|
if (!is_object($product)) { |
|
305
|
|
|
trigger_error(_OLEDRION_ERROR9); |
|
306
|
|
|
continue; |
|
307
|
|
|
// Pour éviter le cas de la suppression d'un produit (dans l'admin) alors qu'un client l'a toujours dans son panier (et donc en session) |
|
308
|
|
|
} |
|
309
|
|
|
$data['product'] = $product; |
|
310
|
|
|
// Mise à jour des calculs par catégorie |
|
311
|
|
|
$this->computePerCategories($product, $data['qty']); |
|
312
|
|
|
// Recherche des éléments associés à chaque produit |
|
313
|
|
|
$this->addAssociatedManufacturers($product); |
|
314
|
|
|
$this->addAssociatedVendors($product); |
|
315
|
|
|
$this->addAssociatedAttributes($product, $data['attributes']); |
|
316
|
|
|
$this->addAssociatedCategories($product); |
|
317
|
|
|
|
|
318
|
|
|
// Calcul du total de la commande avant réductions |
|
319
|
|
View Code Duplication |
if ((float)$product->getVar('product_discount_price', 'n') > 0) { |
|
|
|
|
|
|
320
|
|
|
$ht = (float)$product->getVar('product_discount_price', 'n'); |
|
321
|
|
|
} else { |
|
322
|
|
|
$ht = (float)$product->getVar('product_price', 'n'); |
|
323
|
|
|
} |
|
324
|
|
|
// S'il y a des options, on rajoute leur montant |
|
325
|
|
View Code Duplication |
if (is_array($data['attributes']) && count($data['attributes']) > 0) { |
|
|
|
|
|
|
326
|
|
|
$ht += $this->handlers->h_oledrion_attributes->getProductOptionsPrice($data['attributes'], $product->getVar('product_vat_id')); |
|
|
|
|
|
|
327
|
|
|
} |
|
328
|
|
|
|
|
329
|
|
|
$this->totalAmountBeforeDiscounts += ($data['qty'] * $ht); |
|
330
|
|
|
|
|
331
|
|
|
$newCart[] = $data; |
|
332
|
|
|
} |
|
333
|
|
|
$this->loadElementsAssociatedToProducts(); |
|
334
|
|
|
$this->cart = $newCart; |
|
335
|
|
|
} |
|
336
|
|
|
|
|
337
|
|
|
/** |
|
338
|
|
|
* Calcul du montant HT auquel on applique un pourcentage de réduction |
|
339
|
|
|
* |
|
340
|
|
|
* @param float $price Le prix auquel appliquer la réduction |
|
341
|
|
|
* @param integer $discount Le pourcentage de réduction |
|
342
|
|
|
* @return float Le montant réduit |
|
343
|
|
|
*/ |
|
344
|
|
|
private function getDiscountedPrice($price, $discount) |
|
345
|
|
|
{ |
|
346
|
|
|
return (float)($price - ($price * ($discount / 100))); |
|
347
|
|
|
} |
|
348
|
|
|
|
|
349
|
|
|
/** |
|
350
|
|
|
* Remise à zéro des membres internes |
|
351
|
|
|
*/ |
|
352
|
|
|
private function initializePrivateData() |
|
353
|
|
|
{ |
|
354
|
|
|
$this->totalProductsQuantities = 0; |
|
355
|
|
|
$this->totalAmountBeforeDiscounts = 0; |
|
356
|
|
|
$this->rulesForTheWhole = array(); |
|
357
|
|
|
$this->cartForTemplate = array(); |
|
358
|
|
|
$this->associatedManufacturers = array(); |
|
359
|
|
|
$this->associatedVendors = array(); |
|
360
|
|
|
$this->associatedCategories = array(); |
|
361
|
|
|
$this->associatedManufacturersPerProduct = array(); |
|
362
|
|
|
$this->associatedAttributesPerProduct = array(); |
|
363
|
|
|
} |
|
364
|
|
|
|
|
365
|
|
|
/** |
|
366
|
|
|
* Calcul de la facture en fonction du panier |
|
367
|
|
|
* Contenu du panier en session : |
|
368
|
|
|
* |
|
369
|
|
|
* $datas['number'] = Indice du produit dans le panier |
|
370
|
|
|
* $datas['id'] = Identifiant du produit dans la base |
|
371
|
|
|
* $datas['qty'] = Quantité voulue |
|
372
|
|
|
* $datas['attributes'] = Attributs produit array('attr_id' => id attribut, 'values' => array(valueId1, valueId2 ...)) |
|
373
|
|
|
* |
|
374
|
|
|
* En variable privé, le panier (dans $cart) contient la même chose + un objet 'oledrion_products' dans la clé 'product' |
|
375
|
|
|
* |
|
376
|
|
|
* @param array $cartForTemplate Contenu du caddy à passer au template (en fait la liste des produits) |
|
377
|
|
|
* @param boolean emptyCart Indique si le panier est vide ou pas |
|
378
|
|
|
* @param float $shippingAmount Montant des frais de port |
|
379
|
|
|
* @param float $commandAmount Montant HT de la commande |
|
380
|
|
|
* @param float $vatAmount Montant de la TVA |
|
381
|
|
|
* @param string $goOn Adresse vers laquelle renvoyer le visiteur après qu'il ait ajouté un produit dans son panier (cela correspond en fait à la catégorie du dernier produit ajouté dans le panier) |
|
382
|
|
|
* @param float $commandAmountTTC Montant TTC de la commande |
|
383
|
|
|
* @param array $discountsDescription Descriptions des remises GLOBALES appliquées (et pas les remises par produit !) |
|
384
|
|
|
* @param integer $discountsCount Le nombre TOTAL de réductions appliquées (individuellement ou sur la globalité du panier) |
|
385
|
|
|
* |
|
386
|
|
|
* TODO: Passer les paramètres sous forme d'objet |
|
387
|
|
|
* @return bool |
|
388
|
|
|
*/ |
|
389
|
|
|
public function computeCart( |
|
|
|
|
|
|
390
|
|
|
&$cartForTemplate, |
|
391
|
|
|
&$emptyCart, |
|
392
|
|
|
&$shippingAmount, |
|
393
|
|
|
&$commandAmount, |
|
394
|
|
|
&$vatAmount, |
|
395
|
|
|
&$goOn, |
|
396
|
|
|
&$commandAmountTTC, |
|
397
|
|
|
&$discountsDescription, |
|
398
|
|
|
&$discountsCount |
|
399
|
|
|
) { |
|
400
|
|
|
$emptyCart = false; |
|
401
|
|
|
$goOn = ''; |
|
402
|
|
|
$vats = array(); |
|
|
|
|
|
|
403
|
|
|
$cpt = 0; |
|
404
|
|
|
$discountsCount = 0; |
|
405
|
|
|
$this->cart = isset($_SESSION[OledrionOledrion_caddyHandler::CADDY_NAME]) ? $_SESSION[OledrionOledrion_caddyHandler::CADDY_NAME] : array(); |
|
406
|
|
|
$cartCount = count($this->cart); |
|
407
|
|
|
if ($cartCount == 0) { |
|
408
|
|
|
$emptyCart = true; |
|
409
|
|
|
|
|
410
|
|
|
return true; |
|
411
|
|
|
} |
|
412
|
|
|
|
|
413
|
|
|
// Réinitialisation des données privées |
|
414
|
|
|
$this->initializePrivateData(); |
|
415
|
|
|
// Chargement des objets produits associés aux produits du panier et calcul des quantités par catégorie |
|
416
|
|
|
$this->loadProductsAssociatedToCart(); |
|
417
|
|
|
// Chargement des TVA |
|
418
|
|
|
if (!isset($_POST['cmd_country']) || empty($_POST['cmd_country'])) { |
|
419
|
|
|
$_POST['cmd_country'] = OLEDRION_DEFAULT_COUNTRY; |
|
420
|
|
|
} |
|
421
|
|
|
$vats = $this->handlers->h_oledrion_vat->getCountryVats($_POST['cmd_country']); |
|
|
|
|
|
|
422
|
|
|
$oledrion_Currency = &Oledrion_Currency::getInstance(); |
|
423
|
|
|
$caddyCount = count($this->cart); |
|
424
|
|
|
|
|
425
|
|
|
// Initialisation des totaux généraux (ht, tva et frais de port) |
|
426
|
|
|
$totalHT = $totalVAT = $totalShipping = 0.0; |
|
427
|
|
|
|
|
428
|
|
|
// Boucle sur tous les produits et sur chacune des règles pour calculer le prix du produit (et ses frais de port) et voir si on doit y appliquer une réduction |
|
429
|
|
|
foreach ($this->cart as $cartProduct) { |
|
430
|
|
|
if ((float)$cartProduct['product']->getVar('product_discount_price', 'n') > 0) { |
|
431
|
|
|
$ht = (float)$cartProduct['product']->getVar('product_discount_price', 'n'); |
|
432
|
|
|
} else { |
|
433
|
|
|
$ht = (float)$cartProduct['product']->getVar('product_price', 'n'); |
|
434
|
|
|
} |
|
435
|
|
|
// S'il y a des options, on rajoute leur montant |
|
436
|
|
|
$productAttributes = array(); |
|
437
|
|
View Code Duplication |
if (is_array($cartProduct['attributes']) && count($cartProduct['attributes']) > 0) { |
|
|
|
|
|
|
438
|
|
|
$ht += $this->handlers->h_oledrion_attributes->getProductOptionsPrice($cartProduct['attributes'], $cartProduct['product']->getVar('product_vat_id'), $productAttributes); |
|
|
|
|
|
|
439
|
|
|
} |
|
440
|
|
|
|
|
441
|
|
|
$discountedPrice = $ht; |
|
442
|
|
|
$quantity = (int)$cartProduct['qty']; |
|
443
|
|
|
|
|
444
|
|
|
if (Oledrion_utils::getModuleOption('shipping_quantity')) { |
|
445
|
|
|
$discountedShipping = (float)($cartProduct['product']->getVar('product_shipping_price', 'n') * $quantity); |
|
446
|
|
|
} else { |
|
447
|
|
|
$discountedShipping = (float)$cartProduct['product']->getVar('product_shipping_price', 'n'); |
|
448
|
|
|
} |
|
449
|
|
|
$totalPrice = 0.0; |
|
|
|
|
|
|
450
|
|
|
$reduction = ''; |
|
451
|
|
|
|
|
452
|
|
|
++$cpt; |
|
453
|
|
|
if ($cpt == $caddyCount) { |
|
454
|
|
|
// On arrive sur le dernier produit |
|
455
|
|
|
$category = null; |
|
|
|
|
|
|
456
|
|
|
$category = $this->handlers->h_oledrion_cat->get($cartProduct['product']->getVar('product_cid')); |
|
|
|
|
|
|
457
|
|
|
if (is_object($category)) { |
|
458
|
|
|
$goOn = $category->getLink(); |
|
459
|
|
|
} |
|
460
|
|
|
} |
|
461
|
|
|
|
|
462
|
|
|
// Boucle sur les règles |
|
463
|
|
|
foreach ($this->allActiveRules as $rule) { |
|
464
|
|
|
$applyRule = false; |
|
465
|
|
|
if (($rule->disc_group != 0 && Oledrion_utils::isMemberOfGroup($rule->disc_group)) |
|
466
|
|
|
|| $rule->disc_group == 0 |
|
467
|
|
|
) { |
|
468
|
|
|
if (($rule->disc_cat_cid != 0 |
|
469
|
|
|
&& $cartProduct['product']->getVar('product_cid') == $rule->disc_cat_cid) |
|
470
|
|
|
|| $rule->disc_cat_cid == 0 |
|
471
|
|
|
) { |
|
472
|
|
|
if (($rule->disc_vendor_id != 0 |
|
473
|
|
|
&& $cartProduct['product']->getVar('disc_vendor_id') == $rule->disc_vendor_id) |
|
474
|
|
|
|| $rule->disc_vendor_id == 0 |
|
475
|
|
|
) { |
|
476
|
|
|
if (($rule->disc_product_id != 0 |
|
477
|
|
|
&& $cartProduct['product']->getVar('product_id') == $rule->disc_product_id) |
|
478
|
|
|
|| $rule->disc_product_id == 0 |
|
479
|
|
|
) { |
|
480
|
|
|
// Dans quel cas appliquer la réduction ? |
|
481
|
|
|
switch ($rule->disc_price_case) { |
|
482
|
|
|
case OLEDRION_DISCOUNT_PRICE_CASE_ALL : |
|
|
|
|
|
|
483
|
|
|
// Dans tous les cas |
|
484
|
|
|
$applyRule = true; |
|
485
|
|
|
break; |
|
486
|
|
|
case OLEDRION_DISCOUNT_PRICE_CASE_FIRST_BUY : |
|
|
|
|
|
|
487
|
|
|
// Si c'est le premier achat de l'utilisateur sur le site |
|
488
|
|
|
if ($this->handlers->h_oledrion_commands->isFirstCommand()) { |
|
|
|
|
|
|
489
|
|
|
$applyRule = true; |
|
490
|
|
|
} |
|
491
|
|
|
break; |
|
492
|
|
|
case OLEDRION_DISCOUNT_PRICE_CASE_PRODUCT_NEVER : |
|
|
|
|
|
|
493
|
|
|
// Si le produit n'a jamais été acheté par le client |
|
494
|
|
|
if (!$this->handlers->h_oledrion_commands->productAlreadyBought(0, $cartProduct['product']->getVar('product_id'))) { |
|
|
|
|
|
|
495
|
|
|
$applyRule = true; |
|
496
|
|
|
} |
|
497
|
|
|
break; |
|
498
|
|
|
case OLEDRION_DISCOUNT_PRICE_CASE_QTY_IS : |
|
|
|
|
|
|
499
|
|
|
// Si la quantité de produit est ... à ... |
|
500
|
|
|
switch ($rule->disc_price_case_qty_cond) { |
|
501
|
|
|
case OLEDRION_DISCOUNT_PRICE_QTY_COND1 : |
|
|
|
|
|
|
502
|
|
|
// > |
|
503
|
|
|
if ($cartProduct['qty'] > $rule->disc_price_case_qty_value) { |
|
504
|
|
|
$applyRule = true; |
|
505
|
|
|
} |
|
506
|
|
|
break; |
|
507
|
|
|
case OLEDRION_DISCOUNT_PRICE_QTY_COND2 : |
|
|
|
|
|
|
508
|
|
|
// >= |
|
509
|
|
|
if ($cartProduct['qty'] >= $rule->disc_price_case_qty_value) { |
|
510
|
|
|
$applyRule = true; |
|
511
|
|
|
} |
|
512
|
|
|
break; |
|
513
|
|
|
case OLEDRION_DISCOUNT_PRICE_QTY_COND3 : |
|
|
|
|
|
|
514
|
|
|
// < |
|
515
|
|
|
if ($cartProduct['qty'] < $rule->disc_price_case_qty_value) { |
|
516
|
|
|
$applyRule = true; |
|
517
|
|
|
} |
|
518
|
|
|
break; |
|
519
|
|
|
case OLEDRION_DISCOUNT_PRICE_QTY_COND4 : |
|
|
|
|
|
|
520
|
|
|
// <= |
|
521
|
|
|
if ($cartProduct['qty'] <= $rule->disc_price_case_qty_value) { |
|
522
|
|
|
$applyRule = true; |
|
523
|
|
|
} |
|
524
|
|
|
break; |
|
525
|
|
|
case OLEDRION_DISCOUNT_PRICE_QTY_COND5 : |
|
|
|
|
|
|
526
|
|
|
// == |
|
527
|
|
|
if ($cartProduct['qty'] == $rule->disc_price_case_qty_value) { |
|
528
|
|
|
$applyRule = true; |
|
529
|
|
|
} |
|
530
|
|
|
break; |
|
531
|
|
|
} |
|
532
|
|
|
} |
|
533
|
|
|
} |
|
534
|
|
|
} |
|
535
|
|
|
} |
|
536
|
|
|
} |
|
537
|
|
|
if ($applyRule) { |
|
538
|
|
|
// Il faut appliquer la règle |
|
539
|
|
|
// On calcule le nouveau prix ht du produit |
|
540
|
|
|
switch ($rule->disc_price_type) { |
|
541
|
|
|
case OLEDRION_DISCOUNT_PRICE_TYPE1 : |
|
|
|
|
|
|
542
|
|
|
// Montant dégressif selon les quantités |
|
543
|
|
|
if ($quantity >= $rule->disc_price_degress_l1qty1 |
|
544
|
|
|
&& $quantity <= $rule->disc_price_degress_l1qty2 |
|
545
|
|
|
) { |
|
546
|
|
|
$discountedPrice = (float)$rule->getVar('disc_price_degress_l1total', 'n'); |
|
547
|
|
|
} |
|
548
|
|
|
if ($quantity >= $rule->disc_price_degress_l2qty1 |
|
549
|
|
|
&& $quantity <= $rule->disc_price_degress_l2qty2 |
|
550
|
|
|
) { |
|
551
|
|
|
$discountedPrice = (float)$rule->getVar('disc_price_degress_l2total', 'n'); |
|
552
|
|
|
} |
|
553
|
|
|
if ($quantity >= $rule->disc_price_degress_l3qty1 |
|
554
|
|
|
&& $quantity <= $rule->disc_price_degress_l3qty2 |
|
555
|
|
|
) { |
|
556
|
|
|
$discountedPrice = (float)$rule->getVar('disc_price_degress_l3total', 'n'); |
|
557
|
|
|
} |
|
558
|
|
|
if ($quantity >= $rule->disc_price_degress_l4qty1 |
|
559
|
|
|
&& $quantity <= $rule->disc_price_degress_l4qty2 |
|
560
|
|
|
) { |
|
561
|
|
|
$discountedPrice = (float)$rule->getVar('disc_price_degress_l4total', 'n'); |
|
562
|
|
|
} |
|
563
|
|
|
if ($quantity >= $rule->disc_price_degress_l5qty1 |
|
564
|
|
|
&& $quantity <= $rule->disc_price_degress_l5qty2 |
|
565
|
|
|
) { |
|
566
|
|
|
$discountedPrice = (float)$rule->getVar('disc_price_degress_l5total', 'n'); |
|
567
|
|
|
} |
|
568
|
|
|
$reduction = $rule->disc_description; |
|
569
|
|
|
++$discountsCount; |
|
570
|
|
|
break; |
|
571
|
|
|
|
|
572
|
|
|
case OLEDRION_DISCOUNT_PRICE_TYPE2 : |
|
|
|
|
|
|
573
|
|
|
// D'un montant ou d'un pourcentage |
|
574
|
|
|
if ($rule->disc_price_amount_on == OLEDRION_DISCOUNT_PRICE_AMOUNT_ON_PRODUCT) { |
|
575
|
|
|
// Réduction sur le produit |
|
576
|
|
|
if ($rule->disc_price_amount_type == OLEDRION_DISCOUNT_PRICE_REDUCE_PERCENT) { |
|
577
|
|
|
// Réduction en pourcentage |
|
578
|
|
|
$discountedPrice = $this->getDiscountedPrice($discountedPrice, $rule->getVar('disc_price_amount_amount', 'n')); |
|
579
|
|
|
} elseif ($rule->disc_price_amount_type == OLEDRION_DISCOUNT_PRICE_REDUCE_MONEY) { |
|
580
|
|
|
// Réduction d'un montant en euros |
|
581
|
|
|
$discountedPrice -= (float)$rule->getVar('disc_price_amount_amount', 'n'); |
|
582
|
|
|
} |
|
583
|
|
|
|
|
584
|
|
|
// Pas de montants négatifs |
|
585
|
|
|
Oledrion_utils::doNotAcceptNegativeAmounts($discountedPrice); |
|
586
|
|
|
$reduction = $rule->disc_description; |
|
587
|
|
|
++$discountsCount; |
|
588
|
|
|
} elseif ($rule->disc_price_amount_on == OLEDRION_DISCOUNT_PRICE_AMOUNT_ON_CART) { |
|
589
|
|
|
// Règle à appliquer sur le panier |
|
590
|
|
|
if (!isset($this->rulesForTheWhole[$rule->disc_id])) { |
|
591
|
|
|
$this->rulesForTheWhole[$rule->disc_id] = $rule; |
|
592
|
|
|
} |
|
593
|
|
|
} |
|
594
|
|
|
break; |
|
595
|
|
|
} |
|
596
|
|
|
|
|
597
|
|
|
// On passe au montant des frais de port |
|
598
|
|
|
switch ($rule->disc_shipping_type) { |
|
599
|
|
|
case OLEDRION_DISCOUNT_SHIPPING_TYPE1 : |
|
|
|
|
|
|
600
|
|
|
// A payer dans leur intégralité, rien à faire |
|
601
|
|
|
break; |
|
602
|
|
|
case OLEDRION_DISCOUNT_SHIPPING_TYPE2 : |
|
|
|
|
|
|
603
|
|
|
// Totalement gratuits si le client commande plus de X euros d'achat |
|
604
|
|
|
if ($this->totalAmountBeforeDiscounts > $rule->disc_shipping_free_morethan) { |
|
605
|
|
|
$discountedShipping = 0.0; |
|
606
|
|
|
} |
|
607
|
|
|
break; |
|
608
|
|
|
case OLEDRION_DISCOUNT_SHIPPING_TYPE3 : |
|
|
|
|
|
|
609
|
|
|
// Frais de port réduits de X euros si la commande est > x |
|
610
|
|
|
if ($this->totalAmountBeforeDiscounts > $rule->disc_shipping_reduce_cartamount) { |
|
611
|
|
|
$discountedShipping -= (float)$rule->getVar('disc_shipping_reduce_amount', 'n'); |
|
612
|
|
|
} |
|
613
|
|
|
// Pas de montants négatifs |
|
614
|
|
|
Oledrion_utils::doNotAcceptNegativeAmounts($discountedShipping); |
|
615
|
|
|
break; |
|
616
|
|
|
case OLEDRION_DISCOUNT_SHIPPING_TYPE4 : |
|
|
|
|
|
|
617
|
|
|
// Frais de port dégressifs |
|
618
|
|
|
if ($quantity >= $rule->disc_shipping_degress_l1qty1 |
|
619
|
|
|
&& $quantity <= $rule->disc_shipping_degress_l1qty2 |
|
620
|
|
|
) { |
|
621
|
|
|
$discountedShipping = (float)$rule->getVar('disc_shipping_degress_l1total', 'n'); |
|
622
|
|
|
} |
|
623
|
|
|
if ($quantity >= $rule->disc_shipping_degress_l2qty1 |
|
624
|
|
|
&& $quantity <= $rule->disc_shipping_degress_l2qty2 |
|
625
|
|
|
) { |
|
626
|
|
|
$discountedShipping = (float)$rule->getVar('disc_shipping_degress_l2total', 'n'); |
|
627
|
|
|
} |
|
628
|
|
|
if ($quantity >= $rule->disc_shipping_degress_l3qty1 |
|
629
|
|
|
&& $quantity <= $rule->disc_shipping_degress_l3qty2 |
|
630
|
|
|
) { |
|
631
|
|
|
$discountedShipping = (float)$rule->getVar('disc_shipping_degress_l3total', 'n'); |
|
632
|
|
|
} |
|
633
|
|
|
if ($quantity >= $rule->disc_shipping_degress_l4qty1 |
|
634
|
|
|
&& $quantity <= $rule->disc_shipping_degress_l4qty2 |
|
635
|
|
|
) { |
|
636
|
|
|
$discountedShipping = (float)$rule->getVar('disc_shipping_degress_l4total', 'n'); |
|
637
|
|
|
} |
|
638
|
|
|
if ($quantity >= $rule->disc_shipping_degress_l5qty1 |
|
639
|
|
|
&& $quantity <= $rule->disc_shipping_degress_l5qty2 |
|
640
|
|
|
) { |
|
641
|
|
|
$discountedShipping = (float)$rule->getVar('disc_shipping_degress_l5total', 'n'); |
|
642
|
|
|
} |
|
643
|
|
|
break; |
|
644
|
|
|
} // Sélection du type de réduction sur les frais de port |
|
645
|
|
|
} // Il faut appliquer la règle de réduction |
|
646
|
|
|
}// Boucle sur les réductions |
|
647
|
|
|
|
|
648
|
|
|
// Calcul de la TVA du produit |
|
649
|
|
|
$vatId = $cartProduct['product']->getVar('product_vat_id'); |
|
650
|
|
|
if (is_array($vats) && isset($vats[$vatId])) { |
|
651
|
|
|
$vatRate = (float)$vats[$vatId]->getVar('vat_rate', 'n'); |
|
652
|
|
|
$vatAmount = Oledrion_utils::getVAT($discountedPrice * $quantity, $vatRate); |
|
653
|
|
|
} else { |
|
654
|
|
|
$vatRate = 0.0; |
|
655
|
|
|
$vatAmount = 0.0; |
|
656
|
|
|
} |
|
657
|
|
|
|
|
658
|
|
|
// Calcul du TTC du produit ((ht * qte) + tva + frais de port) |
|
659
|
|
|
$totalPrice = (float)(($discountedPrice * $quantity) + $vatAmount + $discountedShipping); |
|
660
|
|
|
|
|
661
|
|
|
// Les totaux généraux |
|
662
|
|
|
$totalHT += ($discountedPrice * $quantity); |
|
663
|
|
|
$totalVAT += $vatAmount; |
|
664
|
|
|
$totalShipping += $discountedShipping; |
|
665
|
|
|
|
|
666
|
|
|
// Recherche des éléments associés au produit |
|
667
|
|
|
$associatedVendor = $associatedCategory = $associatedManufacturers = array(); |
|
668
|
|
|
$manufacturersJoinList = ''; |
|
669
|
|
|
// Le vendeur |
|
670
|
|
|
if (isset($this->associatedVendors[$cartProduct['product']->product_vendor_id])) { |
|
671
|
|
|
$associatedVendor = $this->associatedVendors[$cartProduct['product']->product_vendor_id]->toArray(); |
|
672
|
|
|
} |
|
673
|
|
|
|
|
674
|
|
|
// La catégorie |
|
675
|
|
|
if (isset($this->associatedCategories[$cartProduct['product']->product_cid])) { |
|
676
|
|
|
$associatedCategory = $this->associatedCategories[$cartProduct['product']->product_cid]->toArray(); |
|
677
|
|
|
} |
|
678
|
|
|
|
|
679
|
|
|
// Les fabricants |
|
680
|
|
|
$product_id = $cartProduct['product']->product_id; |
|
681
|
|
|
if (isset($this->associatedManufacturersPerProduct[$product_id])) { |
|
682
|
|
|
// Recherche de la liste des fabricants associés à ce produit |
|
683
|
|
|
$manufacturers = $this->associatedManufacturersPerProduct[$product_id]; |
|
684
|
|
|
$manufacturersList = array(); |
|
685
|
|
|
foreach ($manufacturers as $manufacturer_id) { |
|
686
|
|
|
if (isset($this->associatedManufacturers[$manufacturer_id])) { |
|
687
|
|
|
$associatedManufacturers[] = $this->associatedManufacturers[$manufacturer_id]->toArray(); |
|
688
|
|
|
} |
|
689
|
|
|
$manufacturersList[] = $this->associatedManufacturers[$manufacturer_id]->manu_commercialname . ' ' . $this->associatedManufacturers[$manufacturer_id]->manu_name; |
|
690
|
|
|
} |
|
691
|
|
|
$manufacturersJoinList = implode(OLEDRION_STRING_TO_JOIN_MANUFACTURERS, $manufacturersList); |
|
692
|
|
|
} |
|
693
|
|
|
$productTemplate = array(); |
|
|
|
|
|
|
694
|
|
|
$productTemplate = $cartProduct['product']->toArray(); |
|
695
|
|
|
$productTemplate['attributes'] = $productAttributes; |
|
696
|
|
|
$productTemplate['number'] = $cartProduct['number']; |
|
697
|
|
|
$productTemplate['id'] = $cartProduct['id']; |
|
698
|
|
|
$productTemplate['product_qty'] = $cartProduct['qty']; |
|
699
|
|
|
|
|
700
|
|
|
$productTemplate['unitBasePrice'] = $ht; |
|
701
|
|
|
// Prix unitaire HT SANS réduction |
|
702
|
|
|
$productTemplate['discountedPrice'] = $discountedPrice; |
|
703
|
|
|
// Prix unitaire HT AVEC réduction |
|
704
|
|
|
$productTemplate['discountedPriceWithQuantity'] = $discountedPrice * $quantity; |
|
705
|
|
|
// Prix HT AVEC réduction et la quantité |
|
706
|
|
|
// Les même prix mais formatés |
|
707
|
|
|
$productTemplate['unitBasePriceFormated'] = $oledrion_Currency->amountForDisplay($ht); |
|
708
|
|
|
// Prix unitaire HT SANS réduction |
|
709
|
|
|
$productTemplate['discountedPriceFormated'] = $oledrion_Currency->amountForDisplay($discountedPrice); |
|
710
|
|
|
// Prix unitaire HT AVEC réduction |
|
711
|
|
|
$productTemplate['discountedPriceWithQuantityFormated'] = $oledrion_Currency->amountForDisplay($discountedPrice * $quantity); |
|
712
|
|
|
// Prix HT AVEC réduction et la quantité |
|
713
|
|
|
|
|
714
|
|
|
// Add by voltan |
|
715
|
|
|
$productTemplate['discountedPriceFormatedOrg'] = $oledrion_Currency->amountForDisplay($ht - $discountedPrice); |
|
716
|
|
|
$productTemplate['discountedPriceOrg'] = $ht - $discountedPrice; |
|
717
|
|
|
|
|
718
|
|
|
$productTemplate['vatRate'] = $oledrion_Currency->amountInCurrency($vatRate); |
|
719
|
|
|
$productTemplate['vatAmount'] = $vatAmount; |
|
720
|
|
|
$productTemplate['normalShipping'] = $cartProduct['product']->getVar('product_shipping_price', 'n'); |
|
721
|
|
|
$productTemplate['discountedShipping'] = $discountedShipping; |
|
722
|
|
|
$productTemplate['totalPrice'] = $totalPrice; |
|
723
|
|
|
$productTemplate['reduction'] = $reduction; |
|
724
|
|
|
$productTemplate['templateProduct'] = $cartProduct['product']->toArray(); |
|
725
|
|
|
|
|
726
|
|
|
$productTemplate['vatAmountFormated'] = $oledrion_Currency->amountInCurrency($vatAmount); |
|
727
|
|
|
$productTemplate['normalShippingFormated'] = $oledrion_Currency->amountForDisplay($cartProduct['product']->getVar('product_shipping_price', 'n')); |
|
728
|
|
|
$productTemplate['discountedShippingFormated'] = $oledrion_Currency->amountForDisplay($discountedShipping); |
|
729
|
|
|
$productTemplate['totalPriceFormated'] = $oledrion_Currency->amountInCurrency($totalPrice); |
|
730
|
|
|
$productTemplate['templateCategory'] = $associatedCategory; |
|
731
|
|
|
$productTemplate['templateVendor'] = $associatedVendor; |
|
732
|
|
|
$productTemplate['templateManufacturers'] = $associatedManufacturers; |
|
733
|
|
|
$productTemplate['manufacturersJoinList'] = $manufacturersJoinList; |
|
734
|
|
|
$this->cartForTemplate[] = $productTemplate; |
|
735
|
|
|
}// foreach sur les produits du panier |
|
736
|
|
|
|
|
737
|
|
|
// Traitement des règles générales s'il y en a |
|
738
|
|
|
if (count($this->rulesForTheWhole) > 0) { |
|
739
|
|
|
// $discountsDescription |
|
740
|
|
|
foreach ($this->rulesForTheWhole as $rule) { |
|
741
|
|
|
switch ($rule->disc_price_type) { |
|
742
|
|
|
case OLEDRION_DISCOUNT_PRICE_TYPE2 : |
|
|
|
|
|
|
743
|
|
|
// D'un montant ou d'un pourcentage |
|
744
|
|
|
if ($rule->disc_price_amount_on == OLEDRION_DISCOUNT_PRICE_AMOUNT_ON_CART) { |
|
745
|
|
|
// Règle à appliquer sur le panier |
|
746
|
|
|
if ($rule->disc_price_amount_type == OLEDRION_DISCOUNT_PRICE_REDUCE_PERCENT) { |
|
747
|
|
|
// Réduction en pourcentage |
|
748
|
|
|
$totalHT = $this->getDiscountedPrice($totalHT, $rule->getVar('disc_price_amount_amount')); |
|
749
|
|
|
$totalVAT = $this->getDiscountedPrice($totalVAT, $rule->getVar('disc_price_amount_amount')); |
|
750
|
|
|
} elseif ($rule->disc_price_amount_type == OLEDRION_DISCOUNT_PRICE_REDUCE_MONEY) { |
|
751
|
|
|
// Réduction d'un montant en euros |
|
752
|
|
|
$totalHT -= (float)$rule->getVar('disc_price_amount_amount'); |
|
753
|
|
|
$totalVAT -= (float)$rule->getVar('disc_price_amount_amount'); |
|
754
|
|
|
} |
|
755
|
|
|
|
|
756
|
|
|
// Pas de montants négatifs |
|
757
|
|
|
Oledrion_utils::doNotAcceptNegativeAmounts($totalHT); |
|
758
|
|
|
Oledrion_utils::doNotAcceptNegativeAmounts($totalVAT); |
|
759
|
|
|
$discountsDescription[] = $rule->disc_description; |
|
760
|
|
|
++$discountsCount; |
|
761
|
|
|
}// Règle à appliquer sur le panier |
|
762
|
|
|
break; |
|
763
|
|
|
} // Switch |
|
764
|
|
|
} // Foreach |
|
765
|
|
|
}// S'il y a des règles globales |
|
766
|
|
|
// Les totaux "renvoyés" à l'appelant |
|
767
|
|
|
$shippingAmount = $totalShipping; |
|
768
|
|
|
$commandAmount = $totalHT; |
|
769
|
|
|
|
|
770
|
|
|
$vatAmount = $totalVAT; |
|
771
|
|
|
$commandAmountTTC = $totalHT + $totalVAT + $totalShipping; |
|
772
|
|
|
|
|
773
|
|
|
$cartForTemplate = $this->cartForTemplate; |
|
774
|
|
|
|
|
775
|
|
|
return true; |
|
776
|
|
|
} |
|
777
|
|
|
} |
|
778
|
|
|
|
You can fix this by adding a namespace to your class:
When choosing a vendor namespace, try to pick something that is not too generic to avoid conflicts with other libraries.