Changeset 110618 in spip-zone


Ignore:
Timestamp:
Jun 11, 2018, 3:03:20 PM (3 years ago)
Author:
nicod@…
Message:

V2, et refonte des coupons :

  • date de fin validité
  • utilisables en plusieurs fois
Location:
_plugins_/coupons/trunk
Files:
2 added
1 deleted
15 edited

Legend:

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

    r110096 r110618  
    2727function coupons_declarer_tables_interfaces($interfaces) {
    2828
    29         $interfaces['table_des_tables']['coupons'] = 'coupons';
     29        $interfaces['table_des_tables']['coupons']           = 'coupons';
     30        $interfaces['table_des_tables']['coupons_commandes'] = 'coupons_commandes';
    3031
    3132        return $interfaces;
     
    4950                'principale'           => 'oui',
    5051                'field'                => array(
    51                         'id_coupon'                   => 'bigint(21) NOT NULL',
    52                         'titre'                       => 'text',
    53                         'code'                        => 'varchar(25) NOT NULL DEFAULT ""',
    54                         'montant'                     => 'decimal(20,6)',
    55                         'id_commandes_detail_origine' => 'bigint(21) NOT NULL DEFAULT 0',
    56                         'id_commande'                 => 'bigint(21) NOT NULL DEFAULT 0',
    57                         'actif'                       => 'varchar(3)  DEFAULT "" NOT NULL',
    58                         'restriction_taxe'            => 'decimal(20,6)',
    59                         'date'                        => 'datetime NOT NULL DEFAULT "0000-00-00 00:00:00"',
    60                         'maj'                         => 'TIMESTAMP',
     52                        'id_coupon'           => 'bigint(21) NOT NULL',
     53                        'titre'               => 'text',
     54                        'code'                => 'varchar(25) NOT NULL DEFAULT ""',
     55                        'montant'             => 'decimal(20,6)',
     56                        'id_commandes_detail' => 'bigint(21) NOT NULL DEFAULT 0',
     57                        'id_produit'          => 'bigint(21) NULL',
     58                        'actif'               => 'varchar(3)  DEFAULT "" NOT NULL',
     59                        'date_validite'       => 'datetime NULL DEFAULT NULL',
     60                        'restriction_taxe'    => 'decimal(20,6)',
     61                        'date'                => 'datetime NOT NULL DEFAULT "0000-00-00 00:00:00"',
     62                        'maj'                 => 'TIMESTAMP',
    6163                ),
    6264                'key'                  => array(
     
    7072                        'code',
    7173                        'montant',
    72                         'id_commandes_detail_origine',
    73                         'id_commande',
     74                        'id_produit',
     75                        'actif',
     76                        'date_validite',
    7477                        'restriction_taxe',
    7578                ),
     
    7881                        'code',
    7982                        'montant',
    80                         'id_commandes_detail_origine',
    81                         'id_commande',
     83                        'id_produit',
     84                        'id_commandes_detail',
     85                        'actif',
     86                        'date_validite',
    8287                        'restriction_taxe',
    8388                ),
     
    8590                'tables_jointures'     => array(),
    8691                'texte_changer_statut' => 'coupon:texte_changer_statut_coupon',
    87 
    8892        );
    8993
    9094        return $tables;
     95}
     96
     97/**
     98 * Une table qui contient les différentes utilisations d'un coupon
     99 * une ligne par utilisation / par commande, avec le montant utilisé pour la commande
     100 *
     101 * @param $tables_auxiliaires
     102 *
     103 * @return array
     104 */
     105function coupons_declarer_tables_auxiliaires($tables_auxiliaires) {
     106
     107        $spip_coupons_commandes = array(
     108                'id_coupon'   => 'bigint(21) DEFAULT "0" NOT NULL',
     109                'id_commande' => 'bigint(21) DEFAULT "0" NOT NULL',
     110                'id_auteur'   => 'bigint(21) DEFAULT "0" NOT NULL',
     111                'montant'     => 'decimal(20,6)',
     112                'maj'         => 'TIMESTAMP',
     113        );
     114
     115        $spip_coupons_commandes_cles = array(
     116                'PRIMARY KEY' => 'id_coupon, id_commande',
     117        );
     118
     119        $tables_auxiliaires['spip_coupons_commandes'] = array(
     120                'field' => &$spip_coupons_commandes,
     121                'key'   => &$spip_coupons_commandes_cles,
     122        );
     123
     124        return $tables_auxiliaires;
    91125}
    92126
  • _plugins_/coupons/trunk/coupons_administrations.php

    r110096 r110618  
    3030 **/
    3131function coupons_upgrade($nom_meta_base_version, $version_cible) {
     32       
    3233        $maj = array();
    3334
    3435        $maj['create'] = array(array('maj_tables', array('spip_coupons')));
    35         $maj['1.3.0'] = array(
     36        $maj['1.3.0']  = array(
    3637                array('maj_tables', array('spip_coupons')),
    37                 array('coupons_update_statut')
     38                array('coupons_update_statut'),
     39        );
     40        $maj['1.4.0']  = array(
     41                array('maj_tables', array('spip_coupons')),
     42                array('coupons_update_date_validite'),
     43        );
     44        $maj['2.0.0']  = array(
     45                array('maj_tables', array('spip_coupons', 'spip_coupons_commandes')),
     46                array('coupons_update_coupons_commandes'),
     47        );
     48        $maj['2.0.1']  = array(
     49                array('maj_tables', array('spip_coupons')),
     50                array('coupons_update_coupons_id_commandes'),
     51        );
     52        $maj['2.1.0']  = array(
     53                array('maj_tables', array('spip_coupons')),
    3854        );
    3955
     
    5773
    5874        cextras_api_vider_tables(coupons_declarer_champs_extras());
    59        
     75
    6076        effacer_meta($nom_meta_base_version);
    6177}
    6278
    63 function coupons_update_statut(){
    64         sql_updateq(
    65                 'spip_coupons',
    66                 array(
    67                         'actif' => 'on'
    68                 ),
    69                 'id_commande = 0'
    70         );
    71         sql_updateq(
    72                 'spip_coupons',
    73                 array(
    74                         'actif' => ''
    75                 ),
    76                 'id_commande <> 0'
    77         );
     79/**
     80 * Mettre à jour le nouveau champ "actif" sur les coupons pas encore utilisés
     81 */
     82function coupons_update_statut() {
     83        $trouver_table = charger_fonction('trouver_table', 'base');
     84        $desc = $trouver_table('coupons');
     85        if($desc['field']['id_commande']) {
     86                sql_updateq(
     87                        'spip_coupons',
     88                        array(
     89                                'actif' => 'on',
     90                        ),
     91                        'id_commande = 0'
     92                );
     93                sql_updateq(
     94                        'spip_coupons',
     95                        array(
     96                                'actif' => '',
     97                        ),
     98                        'id_commande <> 0'
     99                );
     100        }
    78101}
     102
     103/**
     104 * Mettre à jour le nouveau champ "date_validite" (par défaut +365 jours)
     105 */
     106function coupons_update_date_validite() {
     107        // durée de validite de 365 jours par défaut
     108        ecrire_config('coupons/duree_validite', 365);
     109        // on met à jour les dates de validité de tous les coupons
     110        sql_query('update spip_coupons set date_validite = DATE_ADD(DATE,INTERVAL 365 DAY)');
     111}
     112
     113/**
     114 * Créer une ligne dans coupons_commandes par utilisation du coupon
     115 */
     116function coupons_update_coupons_commandes() {
     117        $trouver_table = charger_fonction('trouver_table', 'base');
     118        $desc = $trouver_table('coupons');
     119        if($desc['field']['id_commande']) {
     120                $coupons = sql_allfetsel('*', 'spip_coupons', 'id_commande <> 0');
     121                foreach ($coupons as $coupon) {
     122                        $data = array(
     123                                'id_coupon'   => $coupon['id_coupon'],
     124                                'id_commande' => $coupon['id_commande'],
     125                                //'id_auteur'   => '',
     126                                'montant'     => $coupon['montant'],
     127                                'maj'         => $coupon['maj'],
     128                        );
     129                        sql_insertq('spip_coupons_commandes', $data);
     130                }
     131                sql_query('ALTER TABLE spip_coupons DROP id_commande');
     132        }
     133}
     134
     135/**
     136 * Renommer id_commandes_detail en id_commandes_detail
     137 */
     138function coupons_update_coupons_id_commandes() {
     139        sql_query('update spip_coupons set id_commandes_detail = id_commandes_detail_origine');
     140        sql_query('ALTER TABLE spip_coupons DROP id_commandes_detail_origine');
     141}
  • _plugins_/coupons/trunk/coupons_fonctions.php

    r110096 r110618  
    1717 * Une fonction qui indique si un coupon est utilisable ou pas (i.e. pas encore utilisé)
    1818 *
    19  * @deprecated utiliser le champ "actif" pour déterminer si un coupon est valide
    20  *           
    2119 * @param $id_coupon
    2220 *
     
    2422 */
    2523function coupon_utilisable($id_coupon) {
    26         $id_coupon = sql_getfetsel('id_coupon', 'spip_coupons', 'id_coupon = '.$id_coupon.' and actif = '.sql_quote('on'));
    27         return ($id_coupon ? false : true);
     24        $utilisable = false;
     25        if ($id_coupon = sql_getfetsel(
     26                'id_coupon',
     27                'spip_coupons',
     28                array(
     29                        'id_coupon = ' . intval($id_coupon),
     30                        'actif = ' . sql_quote('on'),
     31                        'date_validite >= ' . sql_quote(date('Y-m-d H:i:s')),
     32                )
     33        )) {
     34                $utilisable = true;
     35        }
     36       
     37        if ($id_coupon && !coupon_montant_utilisable($id_coupon)) {
     38                $utilisable = false;
     39        }
     40
     41        return $utilisable;
    2842}
    2943
    3044/**
    31  * Génère un code coupon aléatoire
    32  * On évite les I et O et 1 et 0 qui se ressemblent trop
     45 * Une fonction qui retourne le montant qui reste à utiliser sur un coupon
     46 *
     47 * @param $id_coupon
     48 *
     49 * @return float
     50 */
     51function coupon_montant_utilisable($id_coupon) {
     52        $montant_coupon  = sql_getfetsel(
     53                'montant',
     54                'spip_coupons',
     55                'id_coupon = ' . intval($id_coupon)
     56        );
     57        $montant_utilise = sql_getfetsel(
     58                'sum(montant) as total',
     59                'spip_coupons_commandes',
     60                'id_coupon = ' . intval($id_coupon)
     61        );
     62
     63        return $montant_coupon - $montant_utilise;
     64}
     65
     66/**
     67 * Calculer le montant de la réduction d'un coupon sur une commande
     68 * en fonction des taxes des objets
    3369 *
    3470 * @return string
    3571 */
    36 function coupon_generer_code() {
     72function coupons_calculer_reduction_commande($id_coupon, $id_commande = null) {
     73        if (!$id_commande) {
     74                $id_commande = intval(session_get('id_commande'));
     75        }
    3776
     77        $montant_reduction = coupon_montant_utilisable($id_coupon);
     78        $infos_coupon  = sql_fetsel('id_produit, restriction_taxe', 'spip_coupons', 'id_coupon = ' . $id_coupon);
     79        $restriction_taxe = $infos_coupon['restriction_taxe'];
     80        $id_produit = $infos_coupon['id_produit'];
     81       
     82        // calculer le total des produits dans la commande
     83        // avec une éventuelle restriction sur la taxe
     84        $where = array('id_commande = ' . $id_commande);
     85        if (floatval($restriction_taxe)) {
     86                $where[] = 'taxe = ' . $restriction_taxe;
     87        }
     88        // ou sur un produit
     89        if($id_produit) {
     90                $where[] = 'objet="produit" and id_objet = ' . $id_produit;
     91        }
     92        $details = sql_allfetsel('*', 'spip_commandes_details', $where);
     93
     94        $total_commande = 0;
     95        foreach ($details as $detail) {
     96                if (!in_array($detail['objet'], array('expedition', 'coupon'))) {
     97                        $total_produit = $detail['prix_unitaire_ht'] * $detail['quantite'] * (1 + $detail['taxe']);
     98                        if (floatval($detail['reduction']) > 0) {
     99                                $reduction     = min(floatval($detail['reduction']), 1.0); // on peut pas faire une reduction de plus de 100%;
     100                                $total_produit = $total_produit * (1.0 - $reduction);
     101                        }
     102                        $total_commande += $total_produit;
     103                }
     104        }
     105
     106        // vérifier si le montant de la réduction est supérieur au total des produits
     107        if ($montant_reduction > $total_commande) {
     108                $montant_reduction = $total_commande;
     109        }
     110
     111        return $montant_reduction;
     112}
     113
     114/**
     115 * Génère un code coupon aléatoire et unique, avec un préfixe en option
     116 * On évite les I et O et 1 et 0 qui se ressemblent trop
     117 *
     118 * @param $prefixe  string
     119 * @param $longueur int
     120 *
     121 * @return string
     122 */
     123function coupon_generer_code($prefixe = '', $longueur = 10) {
    38124        $chars = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789";
    39         return substr(str_shuffle($chars),0,10);
     125
     126        $code = ($prefixe ? $prefixe . '-' : '') . substr(str_shuffle($chars), 0, $longueur);
     127        while ($id_coupon = sql_getfetsel('id_coupon', 'spip_coupons', 'code = ' . sql_quote($code))) {
     128                $code = ($prefixe ? $prefixe . '-' : '') . substr(str_shuffle($chars), 0, $longueur);
     129        }
     130
     131        return $code;
    40132}
  • _plugins_/coupons/trunk/coupons_pipelines.php

    r110096 r110618  
    1414}
    1515
     16/**
     17 * Enregistrer la date d'inscription lors de l'insertion d'un auteur en base
     18 *
     19 * @param array $flux
     20 * @return array
     21 */
     22function coupons_pre_insertion($flux){
     23        if ($flux['args']['table']=='spip_coupons' && !trim($flux['data']['code'])){
     24                $flux['data']['code'] = coupon_generer_code();
     25        }
     26        return $flux;
     27}
     28
    1629function coupons_post_edition($flux) {
    1730
     
    2336                $id_commande = intval($flux['args']['id_objet']);
    2437
    25                 // 1 - au paiement de la commande, marquer les coupons comme utilisés
     38                // 1 - au paiement de la commande, traiter les coupons utilisés
    2639
    2740                $infos_coupons = sql_allfetsel(
    28                         'id_objet',
     41                        'id_objet, prix_unitaire_ht',
    2942                        'spip_commandes_details',
    3043                        'id_commande = ' . $id_commande . ' AND objet = "coupon"');
    3144
    3245                foreach ($infos_coupons as $coupon) {
    33                         sql_updateq(
    34                                 'spip_coupons',
     46                        sql_insertq(
     47                                'spip_coupons_commandes',
    3548                                array(
     49                                        'id_coupon'   => $coupon['id_objet'],
    3650                                        'id_commande' => $id_commande,
    37                                         'actif'       => '',
    38                                 ),
    39                                 'id_coupon = ' . $coupon['id_objet']
    40                         );
    41                         spip_log('coupon ' . $coupon['id_objet'] . ' utilisé par commande ' . $id_commande, 'coupons');
     51                                        'id_auteur'   => $GLOBALS['visiteur_session']['id_auteur'],
     52                                        'montant'     => abs($coupon['prix_unitaire_ht']),
     53                                ));
     54                        spip_log('coupon ' . $coupon['id_objet'] . ' utilisé par commande ' . $id_commande . ' - montant : ' . $coupon['prix_unitaire_ht'],
     55                                'coupons');
    4256                }
    4357
    44                 // 2 - générer un coupon pour chaque bon d'achat dans la commande
     58                // 2 - générer un coupon pour chaque produit "bon d'achat" dans la commande
    4559
    4660                $infos_bon_cadeau = sql_allfetsel(
     
    5872                                        $id_coupon      = objet_inserer('coupon');
    5973                                        $valeurs_coupon = array(
    60                                                 'montant'                     => $montant_coupon,
    61                                                 'restriction_taxe'            => $bon['taxe'],
    62                                                 'id_commandes_detail_origine' => $bon['id_commandes_detail'],
    63                                                 'titre'                       => $bon['titre'],
    64                                                 'code'                        => coupon_generer_code(),
    65                                                 'actif'                       => 'on',
     74                                                'montant'             => $montant_coupon,
     75                                                'restriction_taxe'    => $bon['taxe'],
     76                                                'id_commandes_detail' => $bon['id_commandes_detail'],
     77                                                'titre'               => $bon['titre'],
     78                                                'code'                => coupon_generer_code(),
     79                                                'actif'               => 'on',
     80                                                'date_validite'       => date('Y-m-d H:i:s', strtotime(date('Y-m-d H:i:s') . ' + ' . lire_config('coupons/duree_validite') . ' days')),
    6681                                        );
    6782                                        objet_modifier('coupon', $id_coupon, $valeurs_coupon);
     
    101116                                'prive/objets/liste/coupons',
    102117                                array(
    103                                         'where' => 'id_commandes_detail_origine IN (' . join(',', $id_commandes_details) . ')',
     118                                        'where' => 'id_commandes_detail IN (' . join(',', $id_commandes_details) . ')',
    104119                                )
    105120                        );
     
    113128        }
    114129
     130        if ($flux['args']['exec'] == 'produit' && $flux['args']['id_produit']) {
     131
     132                $texte = recuperer_fond(
     133                        'prive/objets/liste/coupons',
     134                        array(
     135                                'id_produit' => $flux['args']['id_produit'],
     136                        )
     137                );
     138                if (($p = strpos($flux['data'], '<!--afficher_fiche_objet-->')) !== false) {
     139                        $flux['data'] = substr_replace($flux['data'], $texte, $p, 0);
     140                } else {
     141                        $flux['data'] .= $texte;
     142                }
     143               
     144        }
     145       
    115146        return $flux;
    116147}
  • _plugins_/coupons/trunk/formulaires/configurer_coupons.html

    r107889 r110618  
    1010                #ACTION_FORMULAIRE{#ENV{action}}
    1111
     12                [(#SAISIE{input, duree_validite,
     13                        label=<:coupons:label_duree_validite_notifications:>,
     14                        explication=<:coupons:explication_duree_validite_notifications:>, defaut=365})]
     15                       
    1216                [(#SAISIE{input, emails_notifications,
    1317                        label=<:coupons:label_emails_notifications:>,
  • _plugins_/coupons/trunk/formulaires/editer_coupon.html

    r110096 r110618  
    1313
    1414                        [(#SAISIE{case, actif,
    15                                 label_case=<:coupon:champ_actif_label:>})]
     15                                label=<:coupon:champ_actif_label:>, defaut=on})]
    1616
    17                         [(#SAISIE{input, code, obligatoire=oui,
    18                                 label=<:coupon:champ_code_label:>})]
     17                        [(#SAISIE{date, date_validite,
     18                                label=<:coupon:champ_date_validite_label:>})]
     19                                       
     20                                       
     21                        [(#SAISIE{input, code,
     22                                label=<:coupon:champ_code_label:>,explication=<:coupon:explication_code_label:>})]
    1923
    2024                        [(#SAISIE{input, montant, obligatoire=oui,
    2125                                label=<:coupon:champ_montant_label:>})]
     26
     27                        [(#SAISIE{input, id_produit,
     28                                label=<:coupon:champ_restriction_produit_label:>})]
    2229
    2330                        [(#SAISIE{input, restriction_taxe,
  • _plugins_/coupons/trunk/formulaires/editer_coupon.php

    r107058 r110618  
    2424 * @param string     $retour
    2525 *     URL de redirection après le traitement
    26  * @param int        $lier_trad
    27  *     Identifiant éventuel d'un coupon source d'une traduction
    28  * @param string     $config_fonc
    29  *     Nom de la fonction ajoutant des configurations particulières au formulaire
    30  * @param array      $row
    31  *     Valeurs de la ligne SQL du coupon, si connu
    32  * @param string     $hidden
    33  *     Contenu HTML ajouté en même temps que les champs cachés du formulaire.
    3426 *
    3527 * @return string
    3628 *     Hash du formulaire
    3729 */
    38 function formulaires_editer_coupon_identifier_dist(
    39         $id_coupon = 'new',
    40         $retour = '',
    41         $lier_trad = 0,
    42         $config_fonc = '',
    43         $row = array(),
    44         $hidden = ''
    45 ) {
     30function formulaires_editer_coupon_identifier_dist($id_coupon = 'new', $retour = '') {
    4631        return serialize(array(intval($id_coupon)));
    4732}
     
    5843 * @param string     $retour
    5944 *     URL de redirection après le traitement
    60  * @param int        $lier_trad
    61  *     Identifiant éventuel d'un coupon source d'une traduction
    62  * @param string     $config_fonc
    63  *     Nom de la fonction ajoutant des configurations particulières au formulaire
    64  * @param array      $row
    65  *     Valeurs de la ligne SQL du coupon, si connu
    66  * @param string     $hidden
    67  *     Contenu HTML ajouté en même temps que les champs cachés du formulaire.
    6845 *
    6946 * @return array
    7047 *     Environnement du formulaire
    7148 */
    72 function formulaires_editer_coupon_charger_dist(
    73         $id_coupon = 'new',
    74         $retour = '',
    75         $lier_trad = 0,
    76         $config_fonc = '',
    77         $row = array(),
    78         $hidden = ''
    79 ) {
    80         $valeurs = formulaires_editer_objet_charger('coupon', $id_coupon, '', $lier_trad, $retour, $config_fonc, $row,
    81                 $hidden);
     49function formulaires_editer_coupon_charger_dist($id_coupon = 'new', $retour = '') {
     50        $valeurs = formulaires_editer_objet_charger('coupon', $id_coupon, '', 0, $retour, '');
    8251
     52        if (!intval($id_coupon)) {
     53                $valeurs['actif']         = 'on';
     54                $valeurs['date_validite'] = date('Y-m-d H:i:s', strtotime(date('Y-m-d H:i:s') . ' + ' . lire_config('coupons/duree_validite') . ' days'));
     55        }
    8356        return $valeurs;
    8457}
     
    9568 * @param string     $retour
    9669 *     URL de redirection après le traitement
    97  * @param int        $lier_trad
    98  *     Identifiant éventuel d'un coupon source d'une traduction
    99  * @param string     $config_fonc
    100  *     Nom de la fonction ajoutant des configurations particulières au formulaire
    101  * @param array      $row
    102  *     Valeurs de la ligne SQL du coupon, si connu
    103  * @param string     $hidden
    104  *     Contenu HTML ajouté en même temps que les champs cachés du formulaire.
    10570 *
    10671 * @return array
    10772 *     Tableau des erreurs
    10873 */
    109 function formulaires_editer_coupon_verifier_dist(
    110         $id_coupon = 'new',
    111         $retour = '',
    112         $lier_trad = 0,
    113         $config_fonc = '',
    114         $row = array(),
    115         $hidden = ''
    116 ) {
    117         $erreurs = array();
     74function formulaires_editer_coupon_verifier_dist($id_coupon = 'new', $retour = '') {
    11875
    119         $erreurs = formulaires_editer_objet_verifier('coupon', $id_coupon, array('titre', 'code', 'montant'));
     76        $erreurs = formulaires_editer_objet_verifier('coupon', $id_coupon, array('titre', 'montant'));
     77
     78        $verifier = charger_fonction('verifier', 'inc');
     79        foreach (array('date_validite') AS $champ) {
     80                $normaliser = null;
     81                if ($erreur = $verifier(_request($champ), 'date', array('normaliser' => 'datetime'), $normaliser)) {
     82                        $erreurs[$champ] = $erreur;
     83                        // si une valeur de normalisation a ete transmis, la prendre.
     84                } elseif (!is_null($normaliser)) {
     85                        set_request($champ, $normaliser);
     86                        // si pas de normalisation ET pas de date soumise, il ne faut pas tenter d'enregistrer ''
     87                } else {
     88                        set_request($champ, null);
     89                }
     90        }
     91        if (intval($id_coupon)){
     92                if (_request('code') && sql_getfetsel('id_coupon', 'spip_coupons', 'id_coupon <> '.intval($id_coupon).' and code = ' . sql_quote(_request('code')))) {
     93                        $erreurs['code'] = _T('coupon:erreur_code_deja_utilise');
     94                }               
     95        } else {
     96                if (_request('code') && sql_getfetsel('id_coupon', 'spip_coupons', 'code = ' . sql_quote(_request('code')))) {
     97                        $erreurs['code'] = _T('coupon:erreur_code_deja_utilise');
     98                }
     99        }
    120100
    121101        return $erreurs;
     
    133113 * @param string     $retour
    134114 *     URL de redirection après le traitement
    135  * @param int        $lier_trad
    136  *     Identifiant éventuel d'un coupon source d'une traduction
    137  * @param string     $config_fonc
    138  *     Nom de la fonction ajoutant des configurations particulières au formulaire
    139  * @param array      $row
    140  *     Valeurs de la ligne SQL du coupon, si connu
    141  * @param string     $hidden
    142  *     Contenu HTML ajouté en même temps que les champs cachés du formulaire.
    143115 *
    144116 * @return array
    145117 *     Retours des traitements
    146118 */
    147 function formulaires_editer_coupon_traiter_dist(
    148         $id_coupon = 'new',
    149         $retour = '',
    150         $lier_trad = 0,
    151         $config_fonc = '',
    152         $row = array(),
    153         $hidden = ''
    154 ) {
    155         $retours = formulaires_editer_objet_traiter('coupon', $id_coupon, '', $lier_trad, $retour, $config_fonc, $row,
    156                 $hidden);
     119function formulaires_editer_coupon_traiter_dist($id_coupon = 'new', $retour = '') {
    157120
     121        if (!_request('code')) {
     122                $code = coupon_generer_code();
     123                set_request('code',$code);
     124        }
     125
     126        $retours = formulaires_editer_objet_traiter('coupon', $id_coupon, '', 0, $retour, '');
     127       
    158128        return $retours;
    159129}
  • _plugins_/coupons/trunk/formulaires/utiliser_coupon.php

    r110096 r110618  
    1515        $code_coupon = trim(_request('code_coupon'));
    1616
    17         // pas de code saisi ?
    18         if (!$code_coupon) {
    19                 return array('code_coupon' => _T('info_obligatoire_02'));
    20         }
    21 
    22         $coupon = sql_fetsel(
     17        // supprimer les occurences de coupons déjà présentes dans la commande
     18        $id_commande = intval(session_get('id_commande'));
     19        sql_delete(
     20                'spip_commandes_details',
     21                'id_commande=' . $id_commande . ' and objet="coupon"');
     22       
     23        $id_coupon = sql_getfetsel(
    2324                'id_coupon',
    2425                'spip_coupons',
    25                 'actif=' . sql_quote('on') . ' and code = ' . sql_quote($code_coupon)
     26                'code = ' . sql_quote($code_coupon)
    2627        );
    27 
     28       
    2829        // coupon inconnu ou déjà utilisé ?
    29         if (!$coupon['id_coupon']) {
     30        if (!$id_coupon || !coupon_utilisable($id_coupon)) {
    3031                return array('code_coupon' => _T('coupons:code_invalide'));
    3132        }
     
    3839
    3940        $code_coupon = trim(_request('code_coupon'));
    40         $coupon      = sql_fetsel('*', 'spip_coupons', 'code = ' . sql_quote($code_coupon) . ' and id_commande = 0');
     41        $coupon      = sql_fetsel('*', 'spip_coupons', 'code = ' . sql_quote($code_coupon));
    4142
    42         if ($coupon['id_coupon']) {
    43                 $id_commande = sql_getfetsel(
    44                         'id_commande',
    45                         'spip_commandes',
    46                         'id_auteur = ' . $GLOBALS['visiteur_session']['id_auteur'] . ' AND statut = "encours"',
    47                         '',
    48                         'date DESC'
    49                 );
    50 
    51                 $montant_reduction = $coupon['montant'];
    52 
    53                 // calculer le total des produits dans la commande, avec une éventuelle restriction sur la taxe
    54                 $where = array('id_commande = ' . $id_commande);
    55                 if (floatval($coupon['restriction_taxe'])) {
    56                         $where[] = 'taxe = ' . $coupon['restriction_taxe'];
    57                 }
    58                 $details = sql_allfetsel('*', 'spip_commandes_details', $where);
    59 
    60                 $total_commande = 0;
    61                 foreach ($details as $detail) {
    62                         if (!in_array($detail['objet'], array('expedition', 'coupon'))) {
    63                                 $total_produit = $detail['prix_unitaire_ht'] * $detail['quantite'] * (1 + $detail['taxe']);
    64                                 if (floatval($detail['reduction']) > 0) {
    65                                         $reduction     = min(floatval($detail['reduction']), 1.0); // on peut pas faire une reduction de plus de 100%;
    66                                         $total_produit = $total_produit * (1.0 - $reduction);
    67                                 }
    68                                 $total_commande += $total_produit;
    69                         }
    70                 }
    71 
    72                 // vérifier si le montant de la réduction est supérieur au total des produits
    73                 if ($montant_reduction > $total_commande) {
    74                         $montant_reduction = $total_commande;
    75                 }
    76 
    77                 // supprimer les occurences de ce coupon déjà présentes dans la commande
    78                 sql_delete(
    79                         'spip_commandes_details',
    80                         'id_commande=' . $id_commande . ' and objet="coupon" and id_objet = ' . $coupon['id_coupon']);
     43        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);
    8147
    8248                $id_commandes_detail = objet_inserer('commandes_detail');
  • _plugins_/coupons/trunk/lang/coupon_fr.php

    r110096 r110618  
    99
    1010        // A
    11         'ajouter_lien_coupon'                     => 'Ajouter ce coupon de réduction',
     11        'ajouter_lien_coupon'                   => 'Ajouter ce coupon de réduction',
    1212
    1313        // C
    14         'champ_actif_label'                       => 'Coupon activé ?',
    15         'champ_code_label'                        => 'Code',
    16         'champ_id_commande_label'                 => 'Utilisé dans la commande',
    17         'champ_id_commandes_detail_origine_label' => 'Généré par la commande',
    18         'champ_montant_label'                     => 'Montant',
    19         'champ_restriction_taxe_label'            => 'Restreint aux objets de la taxe',
    20         'champ_titre_label'                       => 'Titre',
    21         'confirmer_supprimer_coupon'              => 'Confirmez-vous la suppression de cet coupon de réduction ?',
    22         'coupon_utilise'                          => 'Coupon utilisé',
     14        'champ_actif_label'                     => 'Coupon activé',
     15        'champ_code_label'                      => 'Code',
     16        'champ_date_validite_label'             => 'Date de fin de validité',
     17        'champ_id_commandes_detail_label'       => 'Généré par la commande',
     18        'champ_montant_label'                   => 'Montant',
     19        'champ_restriction_produit_label'       => 'Restreint au produit n°',
     20        'champ_restriction_produit_titre_label' => 'Restreint au produit',
     21        'champ_restriction_taxe_label'          => 'Restreint aux objets de la taxe',
     22        'champ_titre_label'                     => 'Titre',
     23        'confirmer_supprimer_coupon'            => 'Confirmez-vous la suppression de cet coupon de réduction ?',
     24        'coupon_genere'                         => 'Coupon généré',
     25        'coupon_utilise'                        => 'Coupon utilisé',
     26        'coupon_utilisable'                     => 'Coupon utilisable',
     27
     28        // E
     29        'explication_code_label'                => 'Laisser vide pour le générer aléatoirement',
     30        'erreur_code_deja_utilise'              => 'Ce code est déjà utilisé par un coupon',
    2331
    2432        // I
    25         'icone_creer_coupon'                      => 'Créer un coupon de réduction',
    26         'icone_modifier_coupon'                   => 'Modifier ce coupon de réduction',
    27         'info_1_coupon'                           => 'Un coupon de réduction',
    28         'info_aucun_coupon'                       => 'Aucun coupon de réduction',
    29         'info_coupons_auteur'                     => 'Les coupons de réduction de cet auteur',
    30         'info_nb_coupons'                         => '@nb@ coupons de réduction',
     33        'icone_creer_coupon'                    => 'Créer un coupon de réduction',
     34        'icone_modifier_coupon'                 => 'Modifier ce coupon de réduction',
     35        'info_1_coupon'                         => 'Un coupon de réduction',
     36        'info_aucun_coupon'                     => 'Aucun coupon de réduction',
     37        'info_coupons_auteur'                   => 'Les coupons de réduction de cet auteur',
     38        'info_nb_coupons'                       => '@nb@ coupons de réduction',
     39
     40        // M
     41        'montant_utilisable'                    => 'Montant restant à utilise',
    3142
    3243        // R
    33         'retirer_lien_coupon'                     => 'Retirer ce coupon de réduction',
    34         'retirer_tous_liens_coupons'              => 'Retirer tous les coupons de réduction',
     44        'retirer_lien_coupon'                   => 'Retirer ce coupon de réduction',
     45        'retirer_tous_liens_coupons'            => 'Retirer tous les coupons de réduction',
    3546
    3647        // S
    37         'supprimer_coupon'                        => 'Supprimer cet coupon de réduction',
     48        'supprimer_coupon'                      => 'Supprimer cet coupon de réduction',
    3849
    3950        // T
    40         'texte_ajouter_coupon'                    => 'Ajouter un coupon de réduction',
    41         'texte_changer_statut_coupon'             => 'Ce coupon de réduction est :',
    42         'texte_creer_associer_coupon'             => 'Créer et associer un coupon de réduction',
    43         'texte_definir_comme_traduction_coupon'   => 'Ce coupon de réduction est une traduction du coupon de réduction numéro :',
    44         'titre_coupon'                            => 'Coupon de réduction',
    45         'titre_coupons'                           => 'Coupons de réduction',
    46         'titre_coupons_rubrique'                  => 'Coupons de réduction de la rubrique',
    47         'titre_langue_coupon'                     => 'Langue de ce coupon de réduction',
    48         'titre_logo_coupon'                       => 'Logo de ce coupon de réduction',
    49         'titre_objets_lies_coupon'                => 'Liés à ce coupon de réduction',
     51        'texte_ajouter_coupon'                  => 'Ajouter un coupon de réduction',
     52        'texte_changer_statut_coupon'           => 'Ce coupon de réduction est :',
     53        'texte_creer_associer_coupon'           => 'Créer et associer un coupon de réduction',
     54        'texte_definir_comme_traduction_coupon' => 'Ce coupon de réduction est une traduction du coupon de réduction numéro :',
     55        'titre_coupon'                          => 'Coupon de réduction',
     56        'titre_coupons'                         => 'Coupons de réduction',
     57        'titre_coupons_rubrique'                => 'Coupons de réduction de la rubrique',
     58        'titre_langue_coupon'                   => 'Langue de ce coupon de réduction',
     59        'titre_logo_coupon'                     => 'Logo de ce coupon de réduction',
     60        'titre_objets_lies_coupon'              => 'Liés à ce coupon de réduction',
     61
     62        // U
     63        'utilise_dans_commandes'                => 'Utilisé dans les commandes',
    5064);
  • _plugins_/coupons/trunk/lang/coupons_fr.php

    r107889 r110618  
    1818        // E
    1919        'explication_emails_notifications' => 'Séparés par une virgule',
     20        'explication_duree_validite_notifications' => 'En nombre de jours',
    2021
    2122        // L
    2223        'label_emails_notifications' => 'Emails à notifier de la création d\'un coupon',
     24        'label_duree_validite_notifications' => 'Durée de validité d\'un nouveau coupon créé',
    2325
    2426        // U
  • _plugins_/coupons/trunk/notifications/notification_coupon.html

    r107995 r110618  
    22<p><strong><:coupon:champ_montant_label:></strong> [(#MONTANT|prix_formater)]
    33<p><strong><:coupon:champ_code_label:></strong> [(#CODE)]
    4 <BOUCLE_commandes_details(COMMANDES_DETAILS){id_commandes_detail=#ID_COMMANDES_DETAIL_ORIGINE}>
     4<BOUCLE_commandes_details(COMMANDES_DETAILS){id_commandes_detail}>
    55<p><a href="[(#VAL{commande}|generer_url_ecrire{id_commande})]">Voir la commande n° #ID_COMMANDE</a></p>
    66</BOUCLE_commandes_details>
  • _plugins_/coupons/trunk/paquet.xml

    r110096 r110618  
    22        prefix="coupons"
    33        categorie="divers"
    4         version="1.3.0"
     4        version="2.1.0"
    55        etat="test"
    66        compatibilite="[3.1.0;3.2.*]"
    77        logo="prive/themes/spip/images/coupons-64.png"
    88        documentation=""
    9         schema="1.3.0"
     9        schema="2.1.0"
    1010>
    1111        <nom>Coupons de réduction</nom>
     
    2222        <pipeline nom="declarer_tables_objets_sql" inclure="base/coupons.php" />
    2323        <pipeline nom="declarer_tables_interfaces" inclure="base/coupons.php" />
     24        <pipeline nom="declarer_tables_auxiliaires" inclure="base/coupons.php" />
    2425        <pipeline nom="declarer_champs_extras" inclure="base/coupons.php" />
    2526        <pipeline nom="autoriser" inclure="coupons_autorisations.php" />
    2627
     28        <pipeline nom="pre_insertion" inclure="coupons_pipelines.php" />
    2729        <pipeline nom="post_edition" inclure="coupons_pipelines.php" />
    2830        <pipeline nom="affiche_milieu" inclure="coupons_pipelines.php" />
  • _plugins_/coupons/trunk/prive/objets/contenu/coupon.html

    r110096 r110618  
    11<BOUCLE_coupon(COUPONS){id_coupon}>
    22
    3 <div class="champ">
    4         <label><:coupon:champ_actif_label:> : </label>
    5         [(#ACTIF|?{<:item_non:>,<:item_oui:>})]
    6 </div>
     3<p class="champ">
     4        <strong><:coupon:champ_actif_label:> : </strong>
     5        [(#ACTIF|?{<:item_oui:>,<:item_non:>})]
     6</p>
    77
    8 [<div class="champ">
    9         <label><:coupon:champ_code_label:> : </label>
     8<p class="champ">
     9        <strong><:coupon:champ_date_validite_label:> : </strong>
     10        [(#DATE_VALIDITE|affdate)]
     11</p>
     12
     13[<p class="champ">
     14        <strong><:coupon:champ_code_label:> : </strong>
    1015        (#CODE)
    11 </div>]
     16</p>]
    1217
    13 [<div class="champ">
    14         <label><:coupon:champ_montant_label:> : </label>
     18[<p class="champ">
     19        <strong><:coupon:champ_montant_label:> : </strong>
    1520        (#MONTANT|prix_formater)
    16 </div>]
     21</p>]
    1722
    18 <BOUCLE_commande_detail_origine(COMMANDES_DETAILS){id_commandes_detail=#ID_COMMANDES_DETAIL_ORIGINE}>
     23[<p class="champ">
     24        <strong><:coupon:montant_utilisable:> : </strong>
     25        (#ID_COUPON|coupon_montant_utilisable|prix_formater)
     26</p>]
     27
     28[<p class="champ">(#ID_PRODUIT|oui)
     29        <strong><:coupon:champ_restriction_produit_titre_label:> : </strong>
     30        <a href="[(#ID_PRODUIT|generer_url_entite{produit})]">[(#INFO_TITRE{produit,#ID_PRODUIT})]</a>
     31</p>]
     32
     33[<p class="champ">(#RESTRICTION_TAXE|>{0}|oui)
     34        <strong><:coupon:champ_restriction_taxe_label:> : </strong>
     35        [(#RESTRICTION_TAXE|mult{100})%]
     36</p>]
     37
     38
     39[(#BOITE_OUVRIR{<:coupon:coupon_utilisable:>,'statut'})]
     40        [(#ID_COUPON|coupon_utilisable|?{Oui,Non})]
     41#BOITE_FERMER
     42
     43<BOUCLE_commande_detail_origine(COMMANDES_DETAILS){id_commandes_detail}>
    1944<BOUCLE_commande_origine(COMMANDES){id_commande}>
    20 <div class="champ">
    21         <label><:coupon:champ_id_commandes_detail_origine_label:> : </label>
     45[(#BOITE_OUVRIR{<:coupon:champ_id_commandes_detail_label:>,'info'})]
    2246        <a href="[(#ID_COMMANDE|generer_url_entite{commande})]">#REFERENCE</a>
    23 </div>
     47#BOITE_FERMER
    2448</BOUCLE_commande_origine>
    2549</BOUCLE_commande_detail_origine>
    2650
    27 <BOUCLE_commande(COMMANDES){id_commande=#ID_COMMANDE}>
    28 <div class="champ">
    29         <label><:coupon:champ_id_commande_label:> : </label>
    30         <a href="[(#ID_COMMANDE|generer_url_entite{commande})]">#REFERENCE</a>
    31 </div>
    32 </BOUCLE_commande>
     51<B_commandes>
     52[(#BOITE_OUVRIR{<:coupon:utilise_dans_commandes:>,'info'})]
     53<BOUCLE_commandes(COUPONS_COMMANDES){id_coupon}>
    3354
    34 [<div class="champ">(#RESTRICTION_TAXE|>{0}|oui)
    35         <label><:coupon:champ_restriction_taxe_label:> : </label>
    36         [(#RESTRICTION_TAXE|mult{100})%]
    37 </div>]
     55        <p>
     56                <a href="[(#ID_COMMANDE|generer_url_entite{commande})]">#INFO_REFERENCE{commande,#ID_COMMANDE}</a> : [(#MONTANT|prix_formater)] - [(#MAJ|affdate_heure)]
     57        </p>
     58
     59</BOUCLE_commandes>
     60#BOITE_FERMER
     61</B_commandes>
     62
    3863
    3964</BOUCLE_coupon>
  • _plugins_/coupons/trunk/prive/objets/liste/coupons.html

    r110096 r110618  
    1111        <thead>
    1212                <tr class="first_row">
    13                         <th class="picto" scope="col"></th>
    1413                        <th class="titre" scope="col">[(#TRI{titre,<:coupon:champ_titre_label:>,ajax})]</th>
    1514                        <th class="" scope="col">[(#TRI{code,<:coupon:champ_code_label:>,ajax})]</th>
    16                         <th class="" scope="col">[(#TRI{id_commandes_detail_origine,<:commandes:commande_titre:>,ajax})]</th>
    1715                        <th class="" scope="col"><:coupon:coupon_utilisable:></th>
    1816                        <th class="date" scope="col">[(#TRI{date,<:date:>,ajax})]</th>
     
    2220        <tbody>
    2321        <BOUCLE_liste_coupons(COUPONS)
    24                 {id_commandes_detail_origine?}{id_mot?}{id_auteur?}{where?}{recherche?}
     22                {id_commandes_detail?}{id_mot?}{id_auteur?}{where?}{code?}{id_produit?}{recherche?}
    2523                {tri #ENV{par,date},#GET{defaut_tri}}{par titre}{pagination #ENV{nb,10}}>
    2624                <tr class="[(#COMPTEUR_BOUCLE|alterner{row_odd,row_even})]">
    27                         <td class="picto">[(#CHEMIN_IMAGE{coupon-16.png}|balise_img)]</td>
    2825                        <td class="titre principale">[(#LOGO_COUPON|image_reduire{20,26})]<a href="[(#ID_COUPON|generer_url_entite{coupon})]" title="<:info_numero_abbreviation|attribut_html:> #ID_COUPON">[(#RANG). ]#TITRE</a></td>
    2926                        <td class="">#CODE</td>
    30                         <td class=""><BOUCLE_commande(COMMANDES_DETAILS){id_commandes_detail=#ID_COMMANDES_DETAIL_ORIGINE}><a href="#URL_ECRIRE{commande,id_commande=#ID_COMMANDE}">#ID_COMMANDE</a></BOUCLE_commande></td>
    31                         <td class="">[(#ACTIF|?{<:item_non:>,<:item_oui:>})]</td>
     27                        <td class="">[(#ID_COUPON|coupon_utilisable|?{Oui,Non})]</td>
    3228                        <td class="date secondaire">[(#DATE|affdate_jourcourt)]</td>
    3329                        <td class="id">[(#AUTORISER{modifier,coupon,#ID_COUPON}|?{
  • _plugins_/coupons/trunk/prive/squelettes/contenu/coupons.html

    r107058 r110618  
    22<div class="nettoyeur"></div>
    33
    4 <INCLURE{fond=prive/objets/liste/coupons, env, ajax, sinon=<:coupon:info_aucun_coupon:>}>
     4<INCLURE{fond=prive/objets/liste/coupons, env, ajax=liste-objets, nb=25, sinon=<:coupon:info_aucun_coupon:>}>
    55
    66[(#AUTORISER{creer,coupon})
Note: See TracChangeset for help on using the changeset viewer.