source: spip-zone/_plugins_/coupons/trunk/coupons_fonctions.php @ 112204

Last change on this file since 112204 was 112204, checked in by nicod@…, 10 months ago

Corriger le test

File size: 6.0 KB
Line 
1<?php
2/**
3 * Fonctions utiles au plugin Coupons de réduction
4 *
5 * @plugin     Coupons de réduction
6 * @copyright  2017
7 * @author     Nicolas Dorigny
8 * @licence    GNU/GPL
9 * @package    SPIP\Coupons\Fonctions
10 */
11
12if (!defined('_ECRIRE_INC_VERSION')) {
13        return;
14}
15
16/**
17 * Une fonction qui indique si un coupon est utilisable ou pas (i.e. pas encore utilisé)
18 *
19 * @param $id_coupon
20 * @param $id_commande
21 *
22 * @return bool
23 */
24function coupon_utilisable($id_coupon, $id_commande = null) {
25        if(!$id_commande) {
26                $id_commande = intval(session_get('id_commande'));
27        }
28       
29        $utilisable = false;
30       
31        // le coupon est il actif et toujours valide ?
32        if ($infos_coupon = sql_fetsel(
33                'id_coupon, id_auteur',
34                'spip_coupons',
35                array(
36                        'id_coupon = ' . intval($id_coupon),
37                        'actif = ' . sql_quote('on'),
38                        'date_validite >= ' . sql_quote(date('Y-m-d H:i:s')),
39                )
40        )) {
41                $utilisable = true;
42                // le coupon est il restreint à un auteur en particulier ?
43                if(!test_espace_prive() && $id_commande) {
44                        $id_auteur = sql_getfetsel('id_auteur','spip_commandes','id_commande='.$id_commande);
45                        if($id_auteur && $infos_coupon['id_auteur'] && $id_auteur != $infos_coupon['id_auteur']){
46                                $utilisable = false;
47                        }
48                }
49        }
50       
51        // reste t'il un montant utilisable sur le coupon ?
52        if ($id_coupon && !coupon_montant_utilisable($id_coupon)) {
53                $utilisable = false;
54        }
55       
56        return $utilisable;
57}
58
59/**
60 * Une fonction qui retourne le montant qui reste à utiliser sur un coupon
61 *
62 * @param $id_coupon
63 *
64 * @return float
65 */
66function coupon_montant_utilisable($id_coupon) {
67        $montant_coupon  = sql_getfetsel(
68                'montant',
69                'spip_coupons',
70                'id_coupon = ' . intval($id_coupon)
71        );
72        $montant_utilise = sql_getfetsel(
73                'sum(montant) as total',
74                'spip_coupons_commandes',
75                'id_coupon = ' . intval($id_coupon)
76        );
77
78        return $montant_coupon - $montant_utilise;
79}
80
81/**
82 * Calculer le montant de la réduction d'un coupon sur une commande ou sur un panier en fonction des taxes des objets
83 *
84 * @param $id_coupon integer
85 * @param $id_commande integer or null
86 * @param $id_panier integer
87 *
88 * @return string
89 */
90function coupons_calculer_reduction_commande($id_coupon, $id_commande, $id_panier = null) {
91        $id_coupon = intval($id_coupon);
92        if (!intval($id_coupon) || (!intval($id_commande) && !intval($id_panier))) {
93                return false;
94        }
95
96        $montant_reduction = coupon_montant_utilisable(intval($id_coupon));
97        $infos_coupon  = sql_fetsel('id_produit, restriction_taxe', 'spip_coupons', 'id_coupon = ' . intval($id_coupon));
98        $restriction_taxe = $infos_coupon['restriction_taxe'];
99        $id_produit = $infos_coupon['id_produit'];
100       
101        // calculer le total des produits dans la commande / le panier
102        // avec une éventuelle restriction sur la taxe
103        if(intval($id_commande)) {
104                $where = array('id_commande = ' . $id_commande);
105                $table = 'spip_commandes_details';
106                $champ_prix = 'prix_unitaire_ht';
107        } else if(intval($id_panier)) {
108                $where = array('id_panier = ' . $id_panier);
109                $table = 'spip_paniers_liens pl join spip_produits p on(pl.objet="produit" and pl.id_objet=p.id_produit)';
110                $champ_prix = 'prix_ht';
111        }
112        if (floatval($restriction_taxe)) {
113                $where[] = 'taxe = ' . $restriction_taxe;
114        }
115        // ou sur un produit
116        if($id_produit) {
117                $where[] = 'objet="produit" and id_objet = ' . $id_produit;
118        }
119        $details = sql_allfetsel('*', $table, $where);
120
121        $total_commande = 0;
122        foreach ($details as $detail) {
123                if (!in_array($detail['objet'], array('expedition', 'coupon'))) {
124                        $total_produit = $detail[$champ_prix] * $detail['quantite'] * (1 + $detail['taxe']);
125                        if (floatval($detail['reduction']) > 0) {
126                                $reduction     = min(floatval($detail['reduction']), 1.0); // on peut pas faire une reduction de plus de 100%;
127                                $total_produit = $total_produit * (1.0 - $reduction);
128                        }
129                        $total_commande += $total_produit;
130                }
131        }
132
133        // vérifier si le montant de la réduction est supérieur au total des produits
134        if ($montant_reduction > $total_commande) {
135                $montant_reduction = $total_commande;
136        }
137
138        return $montant_reduction;
139}
140/**
141 * Calculer le montant de la réduction d'un coupon sur un panier en fonction des taxes des objets
142 *
143 * @param $id_panier integer
144 *
145 * @return string
146 */
147function coupons_calculer_reduction_panier($id_coupon, $id_panier) {
148        return coupons_calculer_reduction_commande($id_coupon, 0, $id_panier);
149}
150/**
151 * Génère un code coupon aléatoire et unique, avec un préfixe en option
152 * On évite les I et O et 1 et 0 qui se ressemblent trop
153 *
154 * @param $prefixe  string
155 * @param $longueur int
156 *
157 * @return string
158 */
159function coupon_generer_code($prefixe = '', $longueur = 10) {
160        $chars = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789";
161
162        $code = ($prefixe ? $prefixe . '-' : '') . substr(str_shuffle($chars), 0, $longueur);
163        while ($id_coupon = sql_getfetsel('id_coupon', 'spip_coupons', 'code = ' . sql_quote($code))) {
164                $code = ($prefixe ? $prefixe . '-' : '') . substr(str_shuffle($chars), 0, $longueur);
165        }
166
167        return $code;
168}
169
170function coupon_ajouter_commande($id_coupon, $id_commande = null){
171        include_spip('inc/session');
172       
173        if(!$id_commande) {
174                $id_commande = intval(session_get('id_commande'));
175        }
176       
177        if($id_commande) {
178                // supprimer les occurences de coupons déjà présentes dans la commande
179                $id_commande = intval(session_get('id_commande'));
180                sql_delete(
181                        'spip_commandes_details',
182                        'id_commande=' . $id_commande . ' and objet="coupon"');
183               
184                $titre = sql_getfetsel('titre', 'spip_coupons', 'id_coupon=' . $id_coupon);
185
186                $montant_reduction = coupons_calculer_reduction_commande($id_coupon, $id_commande);
187
188                $id_commandes_detail = objet_inserer('commandes_detail');
189                $valeurs             = array(
190                        'id_commande'      => $id_commande,
191                        'objet'            => 'coupon',
192                        'id_objet'         => $id_coupon,
193                        'descriptif'       => $titre,
194                        'quantite'         => 1,
195                        'prix_unitaire_ht' => 0 - $montant_reduction,
196                        'taxe'             => 0,
197                        'statut'           => 'attente',
198                );
199                objet_modifier('commandes_detail', $id_commandes_detail, $valeurs);
200
201                // stocker le coupon en session
202                session_set('id_coupon', $id_coupon);
203
204                spip_log('ajout du coupon ' . $id_coupon . ' dans le détail de commande ' . $id_commandes_detail, 'coupons_commandes');
205        }
206       
207}
Note: See TracBrowser for help on using the repository browser.