Changeset 110864 in spip-zone


Ignore:
Timestamp:
Jun 25, 2018, 7:16:20 PM (3 years ago)
Author:
nicod@…
Message:

On garde l'id du coupon en session, au cas où le visiteur repasse par le panier pour regénérer la commande (dans ce cas, on réinsère le coupon qu'on a en session).

Plus un peu de refactoring :

  • une fonction autonome coupon_ajouter_commande(), qui ajoute un coupon dans la commande, utilisable par d'autres plugins
  • la fonction coupons_calculer_reduction_commande() peut maintenant calculer aussi le montant de réduction qui s'applique pour un coupon sur un panier (on garde le nom de la fonction au cas où)
Location:
_plugins_/coupons/trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/coupons/trunk/coupons_fonctions.php

    r110618 r110864  
    6565
    6666/**
    67  * Calculer le montant de la réduction d'un coupon sur une commande
    68  * en fonction des taxes des objets
     67 * Calculer le montant de la réduction d'un coupon sur une commande ou sur un panier en fonction des taxes des objets
    6968 *
     69 * @param $id_commande integer or null
     70 * @param $id_panier integer
     71 *
    7072 * @return string
    7173 */
    72 function coupons_calculer_reduction_commande($id_coupon, $id_commande = null) {
    73         if (!$id_commande) {
    74                 $id_commande = intval(session_get('id_commande'));
     74function coupons_calculer_reduction_commande($id_coupon, $id_commande, $id_panier=null) {
     75        if(!intval($id_commande) && !intval($id_panier)){
     76                return false;
    7577        }
    76 
     78       
    7779        $montant_reduction = coupon_montant_utilisable($id_coupon);
    7880        $infos_coupon  = sql_fetsel('id_produit, restriction_taxe', 'spip_coupons', 'id_coupon = ' . $id_coupon);
     
    8082        $id_produit = $infos_coupon['id_produit'];
    8183       
    82         // calculer le total des produits dans la commande
     84        // calculer le total des produits dans la commande / le panier
    8385        // avec une éventuelle restriction sur la taxe
    84         $where = array('id_commande = ' . $id_commande);
     86        if(intval($id_commande)) {
     87                $where = array('id_commande = ' . $id_commande);
     88                $table = 'spip_commandes_details';
     89                $champ_prix = 'prix_unitaire_ht';
     90        } else if(intval($id_panier)) {
     91                $where = array('id_panier = ' . $id_panier);
     92                $table = 'spip_paniers_liens pl join spip_produits p on(pl.objet="produit" and pl.id_objet=p.id_produit)';
     93                $champ_prix = 'prix_ht';
     94        }
    8595        if (floatval($restriction_taxe)) {
    8696                $where[] = 'taxe = ' . $restriction_taxe;
     
    90100                $where[] = 'objet="produit" and id_objet = ' . $id_produit;
    91101        }
    92         $details = sql_allfetsel('*', 'spip_commandes_details', $where);
     102        $details = sql_allfetsel('*', $table, $where);
    93103
    94104        $total_commande = 0;
    95105        foreach ($details as $detail) {
    96106                if (!in_array($detail['objet'], array('expedition', 'coupon'))) {
    97                         $total_produit = $detail['prix_unitaire_ht'] * $detail['quantite'] * (1 + $detail['taxe']);
     107                        $total_produit = $detail[$champ_prix] * $detail['quantite'] * (1 + $detail['taxe']);
    98108                        if (floatval($detail['reduction']) > 0) {
    99109                                $reduction     = min(floatval($detail['reduction']), 1.0); // on peut pas faire une reduction de plus de 100%;
     
    111121        return $montant_reduction;
    112122}
    113 
     123/**
     124 * Calculer le montant de la réduction d'un coupon sur un panier en fonction des taxes des objets
     125 *
     126 * @param $id_panier integer
     127 *
     128 * @return string
     129 */
     130function coupons_calculer_reduction_panier($id_coupon, $id_panier) {
     131        return coupons_calculer_reduction_commande($id_coupon, 0, $id_panier);
     132}
    114133/**
    115134 * Génère un code coupon aléatoire et unique, avec un préfixe en option
     
    131150        return $code;
    132151}
     152
     153function coupon_ajouter_commande($id_coupon, $id_commande = null){
     154        include_spip('inc/session');
     155       
     156        if(!$id_commande) {
     157                $id_commande = intval(session_get('id_commande'));
     158        }
     159       
     160        if($id_commande) {
     161                // supprimer les occurences de coupons déjà présentes dans la commande
     162                $id_commande = intval(session_get('id_commande'));
     163                sql_delete(
     164                        'spip_commandes_details',
     165                        'id_commande=' . $id_commande . ' and objet="coupon"');
     166               
     167                $titre = sql_getfetsel('titre', 'spip_coupons', 'id_coupon=' . $id_coupon);
     168
     169                $montant_reduction = coupons_calculer_reduction_commande($id_coupon, $id_commande);
     170
     171                $id_commandes_detail = objet_inserer('commandes_detail');
     172                $valeurs             = array(
     173                        'id_commande'      => $id_commande,
     174                        'objet'            => 'coupon',
     175                        'id_objet'         => $id_coupon,
     176                        'descriptif'       => $titre,
     177                        'quantite'         => 1,
     178                        'prix_unitaire_ht' => 0 - $montant_reduction,
     179                        'taxe'             => 0,
     180                        'statut'           => 'attente',
     181                );
     182                objet_modifier('commandes_detail', $id_commandes_detail, $valeurs);
     183
     184                // stocker le coupon en session
     185                session_set('id_coupon', $id_coupon);
     186
     187                spip_log('ajout du coupon ' . $id_coupon . ' dans le détail de commande ' . $id_commandes_detail, 'coupons_commandes');
     188        }
     189       
     190}
  • _plugins_/coupons/trunk/coupons_pipelines.php

    r110618 r110864  
    1515
    1616/**
    17  * Enregistrer la date d'inscription lors de l'insertion d'un auteur en base
     17 * Générer un code autoamtique pour le coupon s'il n'en a pas
    1818 *
    1919 * @param array $flux
     20 *
    2021 * @return array
    2122 */
    22 function coupons_pre_insertion($flux){
    23         if ($flux['args']['table']=='spip_coupons' && !trim($flux['data']['code'])){
     23function coupons_pre_insertion($flux) {
     24        if ($flux['args']['table'] == 'spip_coupons' && !trim($flux['data']['code'])) {
    2425                $flux['data']['code'] = coupon_generer_code();
    2526        }
     
    3132        if (
    3233                $flux['args']['table'] == 'spip_commandes'
     34                && $flux['args']['action'] == 'remplir_commande'
     35        ) {
     36                include_spip('inc/session');
     37
     38                // si on a un coupon utilisable en session, le remettre dans la commande
     39                if ($id_coupon = session_get('id_coupon')) {
     40                        if (coupon_utilisable($id_coupon)) {
     41                                $id_commande = intval($flux['args']['id_objet']);
     42                                coupon_ajouter_commande($id_coupon, $id_commande);
     43                        }
     44                }
     45        }
     46
     47        if (
     48                $flux['args']['table'] == 'spip_commandes'
    3349                && $flux['args']['action'] == 'instituer'
    3450                && $flux['data']['statut'] == 'paye'
     
    3652                $id_commande = intval($flux['args']['id_objet']);
    3753
     54                include_spip('inc/session');
     55                include_spip('action/editer_objet');
     56
    3857                // 1 - au paiement de la commande, traiter les coupons utilisés
     58                // (normalement il ne peut y en avoir qu'un seul)
    3959
    4060                $infos_coupons = sql_allfetsel(
     
    5272                                        'montant'     => abs($coupon['prix_unitaire_ht']),
    5373                                ));
    54                         spip_log('coupon ' . $coupon['id_objet'] . ' utilisé par commande ' . $id_commande . ' - montant : ' . $coupon['prix_unitaire_ht'],
    55                                 'coupons');
     74                        spip_log('coupon ' . $coupon['id_objet'] . ' utilisé par commande ' . $id_commande . ' - montant : ' . $coupon['prix_unitaire_ht'], 'coupons');
     75
     76                        // si le coupon en entièrement utilisé, on le désactive
     77                        if (!coupon_montant_utilisable($coupon['id_objet'])) {
     78                                objet_modifier('coupon', $coupon['id_objet'], array('actif' => ''));
     79                        }
    5680                }
     81
     82                // supprimer le coupon de la session
     83                session_set('id_coupon', '');
    5784
    5885                // 2 - générer un coupon pour chaque produit "bon d'achat" dans la commande
     
    6996                                $montant_coupon = $bon['prix_unitaire_ht'] * (1 + $bon['taxe']);
    7097                                if ($montant_coupon) {
    71                                         include_spip('action/editer_objet');
     98
    7299                                        $id_coupon      = objet_inserer('coupon');
    73100                                        $valeurs_coupon = array(
     
    102129
    103130function coupons_affiche_milieu($flux) {
     131       
    104132        if ($flux['args']['exec'] == 'commande' && $flux['args']['id_commande']) {
    105133                $details              = sql_allfetsel(
     
    125153                        }
    126154                }
    127 
    128155        }
    129156
    130157        if ($flux['args']['exec'] == 'produit' && $flux['args']['id_produit']) {
    131 
    132158                $texte = recuperer_fond(
    133159                        'prive/objets/liste/coupons',
     
    141167                        $flux['data'] .= $texte;
    142168                }
    143                
    144169        }
    145        
     170
    146171        return $flux;
    147172}
  • _plugins_/coupons/trunk/formulaires/utiliser_coupon.php

    r110618 r110864  
    77
    88include_spip('action/editer_objet');
     9include_spip('inc/session');
    910
    1011function formulaires_utiliser_coupon_charger_dist() {
    11         return array('code_coupon' => '');
     12        $code_coupon = '';
     13        if($id_coupon=session_get('id_coupon')){
     14                if(coupon_utilisable($id_coupon)){
     15                        $code_coupon = sql_getfetsel('code','spip_coupons','id_coupon='.$id_coupon);
     16                }
     17        }
     18        return array('code_coupon' => $code_coupon);
    1219}
    1320
     
    2734        );
    2835       
     36        // stocker le coupon en session
     37        session_set('id_coupon',$id_coupon);
     38       
    2939        // coupon inconnu ou déjà utilisé ?
    3040        if (!$id_coupon || !coupon_utilisable($id_coupon)) {
     
    4252
    4353        if ($id_coupon = $coupon['id_coupon']) {
    44                
    45                 $id_commande = intval(session_get('id_commande'));
    46                 $montant_reduction = coupons_calculer_reduction_commande($id_coupon, $id_commande);
    47 
    48                 $id_commandes_detail = objet_inserer('commandes_detail');
    49                 $valeurs             = array(
    50                         'id_commande'      => $id_commande,
    51                         'objet'            => 'coupon',
    52                         'id_objet'         => $coupon['id_coupon'],
    53                         'descriptif'       => $coupon['titre'],
    54                         'quantite'         => 1,
    55                         'prix_unitaire_ht' => 0 - $montant_reduction,
    56                         'taxe'             => 0,
    57                         'statut'           => 'attente',
    58                 );
    59                 objet_modifier('commandes_detail', $id_commandes_detail, $valeurs);
    60 
    61                 spip_log('ajout d\'un coupon dans le détail de commande ' . $id_commandes_detail, 'coupons_commandes');
    62                 spip_log($valeurs, 'coupons_commandes');
     54                coupon_ajouter_commande($id_coupon);
    6355        }
    6456
  • _plugins_/coupons/trunk/paquet.xml

    r110778 r110864  
    22        prefix="coupons"
    33        categorie="divers"
    4         version="2.1.2"
     4        version="2.2.0"
    55        etat="test"
    66        compatibilite="[3.1.0;3.2.*]"
Note: See TracChangeset for help on using the changeset viewer.