source: spip-zone/_plugins_/prix_objets/branches/v1/prix_objets_fonctions.php @ 115288

Last change on this file since 115288 was 115288, checked in by abelass@…, 7 months ago

v 2.4.0

  • fusionner deux fonctions semblables en une nouvelle, nommer plus clairement
  • enlever fonctions inutile
  • PHP doc
  • Property svn:executable set to *
File size: 12.9 KB
Line 
1<?php
2/**
3 * Fonctions utiles au plugin Prix Objets
4 *
5 * @plugin     Prix Objets
6 * @copyright  2012 - 2019
7 * @author     Rainer Müller
8 * @licence    GNU/GPL
9 * @package    SPIP\Promotions_commandes\Fonctions
10 */
11
12// Sécurité
13if (!defined('_ECRIRE_INC_VERSION'))
14        return;
15
16include_spip('base/abstract_sql');
17
18/**
19 * Un tableau des devises dispoibles.
20 *
21 * @return array
22 *   Les devises disponibles.
23 */
24function devises() {
25        $devises = array(
26
27                // A
28                'AUD' => 'AUD',
29
30                // B
31                'BRL' => 'Real',
32
33                // C
34                'CAD' => 'CAD',
35                'CHF' => 'CHF',
36                'CNY' => 'Yuan',
37                'CSD' => 'CSD',
38                'CZK' => 'CZK',
39
40                // D
41                'DKK' => 'DKK',
42
43                // E
44                'EUR' => '€',
45
46                // G
47                'GBP' => '£',
48
49                // H
50                'HKD' => 'HKD',
51                'HUF' => 'HUF',
52
53                // I
54                'IDR' => 'IDR',
55                'ILS' => 'Shekel',
56                'IQD' => 'IQD',
57                'IRR' => 'IRR',
58                'ISK' => 'ISK',
59
60                // J
61                'JEP' => 'JEP',
62                'JOD' => 'JOD',
63                'JMD' => 'JMD',
64                'JPY' => '¥',
65
66                // K
67                'KES' => 'KES',
68                'KGS' => 'KGS',
69                'KWD' => 'KWD',
70                'KZT' => 'Tenge',
71
72                // L
73                'LAK' => 'Kip',
74                'LBP' => 'LBP',
75                'LKR' => 'LKR',
76                'LRD' => 'LRD',
77                'LTL' => 'Litas',
78                'LVL' => 'Lat',
79
80                // M
81                'MAD' => 'Dirham',
82                'MDL' => 'MDL',
83                'MGA' => 'Ariary',
84                'MKD' => 'MKD',
85                'MNT' => 'Tughrik',
86                'MRO' => 'Ouguiya',
87                'MUR' => 'MUR',
88                'MVR' => 'Rufiyaa',
89                'MWK' => 'MWK',
90                'MXN' => 'MXN',
91                'MYR' => 'Ringgit',
92                'MZN' => 'Metical',
93
94                // N
95                'NAD' => 'NAD',
96                'NGN' => 'Naira',
97                'NIO' => 'Cordoba',
98                'NPR' => 'NPR',
99                'NOK' => 'NOK',
100                'NZD' => 'NZD',
101
102                // O
103                'OMR' => 'OMR',
104
105                'QAR' => 'Riyal',
106
107                // P
108                'PGK' => 'Kina',
109                'PHP' => 'PHP',
110                'PKR' => 'PKR',
111                'PLN' => 'Zloty',
112
113                'RON' => 'RON',
114                'RUB' => 'Rouble',
115                'RWF' => 'RWF',
116
117                // S
118                'SCR' => 'SCR',
119                'SDD' => 'SDD',
120                'SEK' => 'SEK',
121                'SGD' => 'SGD',
122                'SOS' => 'SOS',
123                'SLL' => 'Leone',
124                'SRD' => 'SRD',
125                'STD' => 'Dobra',
126                'SVC' => 'Colon',
127                'SYP' => 'SYP',
128
129                // T
130                'THB' => 'Baht',
131                'TJS' => 'Somoni',
132                'TND' => 'TND',
133                'TMM' => 'TMM',
134                'TRY' => 'Lirasi',
135                'TTD' => 'TTD',
136                'TWD' => 'TWD',
137                'TZS' => 'TZS',
138
139                // U
140                'UAH' => 'Hryvna',
141                'UGX' => 'UGX',
142                'USD' => 'USD',
143                'UZS' => 'UZS',
144
145                // V
146                'VND' => 'Dong',
147
148                // X
149                'XAF' => 'XAF',
150                'XOF' => 'XOF',
151
152                // Y
153                'YER' => 'Rial',
154
155                // Z
156                'ZMK' => 'ZMK',
157                'ZWN' => 'ZWN'
158        );
159
160        return $devises;
161}
162
163/**
164 * Affiche le symbole de la devise si disponible
165 *
166 * @param string $code_devise
167 * @return string
168 */
169function traduire_devise($code_devise) {
170        include_spip('inc/devises');
171
172        $devises = devises();
173        $trad = $devises[$code_devise];
174
175        return $trad;
176}
177
178/**
179 * Donne le prix d'un objet avec sa devise.
180 *
181 * @deprecated 2.3.0 Utilisez prix_objet_formate($id_objet, $objet = 'article');
182 * @param integer $id_objet
183 *   L'identifiant de l'objet
184 * @param string $objet
185 *   L'objet
186 *
187 * @return string
188 *   Le prix formaté.
189 */
190function prix_defaut($id_objet, $objet = 'article') {
191        prix_objet_formate($id_objet, $objet);
192}
193
194/**
195 * Donne le prix d'un objet avec sa devise
196 *
197 * @param integer $id_objet
198 *   L'identifiant de l'objet
199 * @param string $objet
200 *   L'objet
201 *
202 * @return string
203 *   Le prix formaté.
204 */
205function prix_objet_formate($id_objet, $objet = 'article') {
206
207        $req = sql_fetsel('code_devise,prix', 'spip_prix_objets', 'id_objet=' . $id_objet . ' AND objet=' . sql_quote($objet));
208
209        $devise = isset($reg['code_devise']) ? $reg['code_devise'] : '';
210        $prix = filtres_prix_formater($req['prix'], $devise);
211
212        return $prix;
213}
214
215/**
216 * Ajoute la devise à un prix
217 *
218 * @param mixed $prix
219 *   Le prix
220 * @param boolean $traduire
221 *   Afficher le symbole de la devis, défaut true.
222 *
223 * @return string
224 *   Le prix avec la devise
225 */
226function devise_defaut_prix($prix = '', $traduire = true) {
227        if ($_COOKIE['spip_devise']) {
228                $devise_defaut = $_COOKIE['spip_devise'];
229        }
230        else {
231                $devise_defaut = $devise_defaut = prix_objets_devise_defaut();
232        }
233        $devise_defaut = traduire_devise($devise_defaut);
234
235        if ($prix) {
236                $devise_defaut = $prix . ' ' . $devise_defaut;
237        }
238
239        return $devise_defaut;
240}
241
242/**
243 * Donne le prix d'un objet avec sa devise.
244 *
245 * @deprecated 2.3.0 Utilisez prix_objet_formate($id_objet, $objet = 'article');
246 * @param integer $id_objet
247 *   L'identifiant de l'objet
248 * @param string $objet
249 *   L'objet
250 *
251 * @return string
252 *   Le prix formaté.
253 */
254function devise_defaut_objet($id_objet, $objet = 'article') {
255        prix_objet_formate($id_objet, $objet);
256}
257
258function rubrique_prix($id = '', $objet = 'article', $sousrubriques = false) {
259        include_spip('inc/config');
260        include_spip('prive/formulaires/selecteur/generique_fonctions');
261
262        $rubrique_produit = picker_selected(lire_config('prix_objets/rubrique_prix', array()), 'rubrique');
263
264        if ($rubrique_produit) {
265                $id_parent = $rubrique_produit;
266
267                if (!$sousrubriques) {
268                        $rubriques = $id_parent;
269                }
270                else {
271                        $rubriques = array();
272                }
273
274                $rubriques = rubriques_enfant($id_parent, $rubriques);
275                if ($id) {
276                        $retour = sql_getfetsel('id_' . $objet, 'spip_' . $objet . 's', 'id_' . $objet . '=' . $id . ' AND id_rubrique IN (' . implode(',', $rubriques) . ')');
277                }
278                else {
279                        $retour = $rubriques;
280                }
281        }
282        else {
283                return false;
284        }
285
286        return $retour;
287}
288
289function rubriques_enfant($id_parent, $rubriques = array()) {
290        $id_p = '';
291
292        if (is_array($id_parent)) {
293                $id_parent = implode(',', $id_parent);
294        }
295
296        if ($id_parent) {
297                $sql = sql_select('id_rubrique', 'spip_rubriques', 'id_parent IN (' . $id_parent . ')');
298        }
299
300        $id_p = array();
301        while ($row = sql_fetch($sql)) {
302                $id_p[] = $row['id_rubrique'];
303                $rubriques[] = $row['id_rubrique'];
304        }
305
306        if (count($id_p) > 0) {
307                $rubriques = rubriques_enfant($id_p, $rubriques);
308        }
309
310        return $rubriques;
311}
312
313/**
314 * Surcharge de la fonction filtres_prix_formater_dist du plugin prix.
315 * Formate le prix en y ajoutant la devise.
316 *
317 * @param string $prix
318 * @param string $devise
319 * @param integer $decimals
320 * @return string
321 */
322function filtres_prix_formater($prix, $devise = '') {
323        include_spip('inc/config');
324        include_spip('inc/cookie');
325
326        $config = lire_config('prix_objets');
327
328        if (!$devise) {
329                $devises = isset($config['devises']) ? $config['devises'] : array();
330
331                // Si il y a un cookie 'devise_selectionnee' et qu'il figure parmis les devises disponibles on le prend
332                if (isset($_COOKIE['devise_selectionnee']) and in_array($_COOKIE['devise_selectionnee'], $devises)) {
333                        $devise = $_COOKIE['devise_selectionnee'];
334                        $GLOBALS['devise_defaut'] = $devise;
335                } // Sinon on regarde si il ya une devise defaut valable
336                else {
337                        $devise = prix_objets_devise_defaut($config);
338                }
339        }
340
341        // On met le cookie
342        spip_setcookie('devise_selectionnee', $devise, time() + 3660 * 24 * 365, '/');
343
344        // On détermine la langue du contexte
345        if (isset($_COOKIE['spip_lang'])) {
346                $lang = $_COOKIE['spip_lang'];
347        }
348        else {
349                $lang = lire_config('langue_site');
350        }
351
352        // Si PECL intl est présent on dermine le format de l'affichage de la devise selon la langue du contexte
353        if (function_exists('numfmt_create') and is_float($prix)) {
354                $fmt = numfmt_create($lang, NumberFormatter::CURRENCY);
355                $prix = numfmt_format_currency($fmt, $prix, $devise);
356        } // Sinon à la française
357        else {
358                $prix = $prix . '&nbsp;' . traduire_devise($devise);
359        }
360
361        return $prix;
362}
363
364/**
365 * Détermine la devise par défaut
366 *
367 * @param array $config
368 *              Les donnes de configuration de prix_objets
369 * @return string Code de la devise
370 */
371function prix_objets_devise_defaut($config = '') {
372        if (!$config) {
373                include_spip('inc/config');
374                $config = lire_config('prix_objets');
375        }
376        $devises = isset($config['devises']) ? $config['devises'] : array();
377        // Sinon on regarde si il ya une devise defaut valable
378        if ($config['devise_default']) {
379                $devise_defaut = $config['devise_default'];
380        } // Sinon on prend la première des devises choisies
381        elseif (isset($devises[0])) {
382                $devise_defaut = $devises[0];
383        } // Sinon on met l'Euro
384        else {
385                $devise_defaut = 'EUR';
386        }
387
388        return $devise_defaut;
389}
390
391/**
392 * Donne le prix pour un objet
393 *
394 * @param string $objet
395 *              Objet dont on cherche le prix
396 * @param string $id_objet
397 *              Identifiant de l'objet dont on cherche le prix
398 * @param array $contexte
399 *              Les variables de l'environnement utilisées dans le calcul du prix.
400 * @param string  $type
401 *          prix (ttc) ou prix_ht
402 * @param array $options
403 *   mode: 'global' ou 'prorata'
404 *
405 * @return string Le prix applicable.
406 */
407function prix_par_objet($objet, $id_objet, $contexte, $type = 'prix_ht', $options = array()) {
408        $prix = 0;
409
410        if ($type == 'prix_ht') {
411                $fonction_prix = charger_fonction('ht', 'inc/prix');
412        }
413        else {
414                $fonction_prix = charger_fonction('prix', 'inc');
415        }
416
417        // Le mode de calcul de prix, ou passé dans les options, ou depuis la config.
418        if (isset($options['mode']) and !empty($options['mode'])) {
419                $mode = $options['mode'];
420        }
421        else {
422                include_spip('inc/config');
423                $mode = lire_config('prix_objets/prix_par_objet_mode', 'global');
424        }
425
426        if ($mode == 'prorata') {
427                $horaire = isset($options['horaire']) ? $options['horaire'] : '';
428                $format = isset($options['date_format']) ? $options['date_format'] : '';
429                $sequence = isset($options['sequence']) ? $options['sequence'] : '';
430
431                if (!$sequence) {
432
433                        // Séquence composé de dates.
434                        if (isset($contexte['date_debut']) and
435                                        isset($contexte['date_fin']) and
436                                        include_spip('filtres/dates_outils') and
437                                        function_exists('dates_intervalle')) {
438
439                                                $sequence = dates_intervalle($contexte['date_debut'], $contexte['date_fin'], 0, -1, $horaire, $format);
440                                        }
441                                        else {
442                                                $sequence = array();
443                                        }
444                }
445
446                $nr_elements_sequence = count($sequence);
447                $contexte['date_fin'] = $contexte['date_debut'];
448        }
449        else {
450                $nr_elements_sequence = 0;
451        }
452
453        $prix_source = sql_allfetsel(
454                        'id_prix_objet,prix_total,titre',
455                        'spip_prix_objets',
456                        'id_prix_objet_source=0 AND objet LIKE ' . sql_quote(trim($objet)) . ' AND id_objet=' . $id_objet, '',
457                        array(
458                                'rang_lien',
459                                'titre',
460                                'prix_ht'
461                        )
462                        );
463
464
465        // On parcours les extension pour chaque prix principal.
466        $prix_elements = array();
467        foreach ($prix_source as $index => $data_source) {
468
469                $id_prix_objet = $data_source['id_prix_objet'];
470
471                // passer l'info sur le prix total dans l'environnement
472                set_request('prix_total', $data_source['prix_total']);
473
474                $extensions = sql_allfetsel('extension,id_extension,titre', 'spip_prix_objets', 'id_prix_objet_source=' . $id_prix_objet);
475                $prix = $fonction_prix('prix_objet', $id_prix_objet);
476                $count_sextensions = count($extensions);
477
478                // Si il y a des extensions.
479                if ($count_sextensions > 0) {
480                        $i = 0;
481                        $applicables = array();
482                        $dates_applicables = array();
483
484                        // On établit l'extension qui définit le prix.
485                        foreach ($extensions as $data_extension) {
486                                $i ++;
487                                $id_extension = $data_extension['id_extension'];
488
489                                if ($extension = charger_fonction($data_extension['extension'], 'prix_objet/', TRUE)) {
490                                        switch ($mode) {
491                                                // Si global on met les resultats positiv dans un simple tableau.
492                                                case 'global':
493                                                        if ($applicable = $extension($id_extension, $contexte, $mode)) {
494                                                                $applicables[] = $applicable;
495                                                        }
496                                                        break;
497                                                        // Si prorata on détermine quels éléments de séquences sont applicables.
498                                                case 'prorata':
499                                                        if (is_array($sequence)) {
500                                                                foreach ($sequence as $index => $element) {
501                                                                        $contexte['date_debut'] = $element;
502                                                                        $contexte['date_fin'] = $element;
503
504                                                                        if ($applicable = $extension($id_extension, $contexte, $mode)) {
505                                                                                $dates_applicables[$element][$index][] = $applicable;
506                                                                        }
507                                                                }
508                                                        }
509                                                        break;
510                                        }
511                                }
512                                else {
513                                        $applicables[] = 1;
514                                }
515                        }
516
517                        // mode de calcul global
518                        if ($mode == 'global') {
519                                // On choisit le premier prix qui est applicable pour chaque extension.
520                                if (count($applicables) == $count_sextensions) {
521                                        break;
522                                }
523                        }
524                        // mode de calcul prorata
525                        elseif ($mode == "prorata" and is_array($dates_applicables)) {
526                                // On établit un prix pour éléement de séquence, puis on enlève l'élément de la séquence.
527                                foreach ($dates_applicables as $element => $applicables) {
528                                        foreach ($applicables as $index => $counter) {
529                                                if (array_sum($counter) >= $count_sextensions) {
530                                                        $prix_elements[$element] = $prix;
531                                                        unset($sequence[$index]);
532                                                }
533                                        }
534                                }
535                        }
536                }
537        }
538
539        // Si mode prorata on calcule le prix à partir des prix par élément
540        if ($mode == "prorata") {
541                $nr_prix_prorata = count($prix_elements);
542                $sum_prix_prorata = array_sum($prix_elements);
543
544                // Si on a un prix pour chaque élément de séquence
545                if ($nr_prix_prorata == $nr_elements_sequence) {
546                        // Si il y a des éléments de séquence, on divise la somme par le nombre d'élément.
547                        if ($nr_elements_sequence > 0) {
548                                $prix = $sum_prix_prorata / $nr_elements_sequence;
549                        }
550                }
551                // Sinon on divise la somme par le nombre de prix, on ajoute le prix par défaut (le dernier)
552                // et on divise par deux
553                elseif ($nr_prix_prorata > 0) {
554                        $prix = (($sum_prix_prorata / $nr_prix_prorata) + $prix) / 2;
555                }
556        }
557
558        // Permettre d'intervenir sur le prix
559        return pipeline('prix_par_objet', array(
560                'data' => $prix,
561                'args' => array(
562                        'objet' => $objet,
563                        'id_objet' => $id_objet,
564                        'contexte' => $contexte,
565                        'type' => $type,
566                        'options' => $options
567                )
568        ));
569}
Note: See TracBrowser for help on using the repository browser.