Changeset 123222 in spip-zone


Ignore:
Timestamp:
Apr 2, 2020, 9:42:37 PM (8 weeks ago)
Author:
Charles Razack
Message:

Par défaut, prendre l'arrondi de la devise dans les fonctions prix et prix_ht (jusqu'à présent c'était celui de l'euro → 2).
On ajoute aussi la possibilité de ne pas faire d'arrondi en passant -1 ou false.
Incidemment, l'option 'float' dans prix_formater n'a plus aucun intérêt, on la retire (il suffit de faire #PRIX*).

Location:
_plugins_/prix
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/prix

    • Property subgit:lock:f8625640147e7ef8a06fa1304f980b37a9561e1e deleted
    • Property subgit:lock:03e4d81a5b289f8af18e68054e464107ca69bede set to 2020-04-03T00:04:37.685
  • _plugins_/prix/inc/prix.php

    r122831 r123222  
    55
    66/**
    7  * Permet d'obtenir le prix HT d'un objet SPIP. C'est le résultat de cette fonction qui est utilisée pour calculer le prix TTC.
     7 * Permet d'obtenir le prix HT d'un objet SPIP.
     8 * C'est le résultat de cette fonction qui est utilisée pour calculer le prix TTC.
    89 *
    910 * @param string $objet
     
    1213 *   L'identifiant de l'objet
    1314 * @param array $options
    14  *   Tableau d'options
    15  *   - arrondi
     15 *   Tableau d'options :
     16 *   - arrondi : nombre entier, par défaut celui de la devise.
     17 *               -1 ou false pour ne pas arrondir.
    1618 *   - serveur
    17  *   ou un entier pour l'arrondi pour compat avec l'ancienne signature
     19 *   Ou un entier pour l'arrondi pour compat avec l'ancienne signature
    1820 * @param string $serveur
    1921 *   Déprécié. Autre base distante.
    2022 * @return float Retourne le prix HT de l'objet sinon 0
    2123 */
    22 function inc_prix_ht_dist($objet, $id_objet, $options = array(), $serveur = ''){
     24function inc_prix_ht_dist($objet, $id_objet, $options = array(), $serveur = '') {
    2325        include_spip('base/objets');
    2426        $prix_ht = 0;
    25        
     27
     28        // Arrondi de la devise
     29        $devise = prix_devise_defaut();
     30        $arrondi_devise = intval(prix_devise_info($devise, 'fraction'));
     31
    2632        // Compatibilité avec l'ancienne signature
    2733        if (is_int($options)) {
     
    3339        // Options par défaut
    3440        $options_defaut = array(
    35                 'arrondi' => 2,
     41                'arrondi' => $arrondi_devise,
    3642                'serveur' => '',
    3743        );
    3844        // On fusionne avec les défauts
    3945        $options = array_merge($options_defaut, $options);
    40        
     46
    4147        // Cherchons d'abord si l'objet existe bien
    4248        if (
     
    4753                and $cle_objet = id_table_objet($objet, $options['serveur'])
    4854                and $ligne = sql_fetsel('*', $table_sql, "$cle_objet = $id_objet", '', '', '', '', $options['serveur'])
    49         ){
     55        ) {
    5056                // Existe-t-il une fonction précise pour le prix HT de ce type d'objet : prix_<objet>_ht() dans prix/<objet>.php
    51                 if ($fonction_ht = charger_fonction('ht', "prix/$objet", true)){
     57                if ($fonction_ht = charger_fonction('ht', "prix/$objet", true)) {
    5258                        // On passe la ligne SQL en paramètre pour ne pas refaire la requête
    5359                        $prix_ht = $fonction_ht($id_objet, $ligne, $options);
     
    6066                        $prix_ht = $ligne['prix'];
    6167                }
    62                
    63                 // Enfin on passe dans un pipeline pour modifier le prix HT
     68
     69                // On passe dans un pipeline pour modifier le prix HT
    6470                $prix_ht = pipeline(
    6571                        'prix_ht',
     
    7783                );
    7884        }
    79        
    80         // Si on demande un arrondi, on le fait
    81         if ($options['arrondi']) {
     85
     86        // Enfin si nécessaire, on fait un arrondi
     87        if (
     88                is_int($options['arrondi'])
     89                and $options['arrondi'] >= 0
     90        ) {
    8291                $prix_ht = round($prix_ht, $options['arrondi']);
    8392        }
    84        
     93
    8594        return $prix_ht;
    8695}
     
    94103 *   L'identifiant de l'objet
    95104 * @param array $options
    96  *   Tableau d'options
    97  *   - arrondi
     105 *   Tableau d'options :
     106 *   - arrondi : nombre entier, par défaut celui de la devise.
     107 *               -1 ou false pour ne pas arrondir.
    98108 *   - serveur
    99  *   ou un entier pour l'arrondi pour compat avec l'ancienne signature
     109 *   Ou un entier pour l'arrondi pour compat avec l'ancienne signature
    100110 * @param string $serveur
    101111 *   Déprécié. Autre base distante.
     
    104114function inc_prix_dist($objet, $id_objet, $options = array(), $serveur = '') {
    105115        include_spip('base/objets');
    106        
     116
     117        // Arrondi de la devise
     118        $devise = prix_devise_defaut();
     119        $arrondi_devise = intval(prix_devise_info($devise, 'fraction'));
     120
    107121        // Compatibilité avec l'ancienne signature
    108122        if (is_int($options)) {
     
    114128        // Options par défaut
    115129        $options_defaut = array(
    116                 'arrondi' => 2,
     130                'arrondi' => $arrondi_devise,
    117131                'serveur' => '',
    118132        );
     
    126140        $prix = $prix_ht = $fonction_prix_ht($objet, $id_objet, $options_ht);
    127141        $taxes = array();
    128        
     142
    129143        // On cherche maintenant s'il existe une personnalisation pour le prix total TTC : prix_<objet>() dans prix/<objet>.php
    130         if ($fonction_prix_objet = charger_fonction($objet, 'prix/', true)){
     144        if ($fonction_prix_objet = charger_fonction($objet, 'prix/', true)) {
    131145                $prix = $fonction_prix_objet($id_objet, $prix_ht, $options);
    132146        }
     
    137151                $prix = $prix_ht + $taxes_total;
    138152        }
    139        
    140         // Enfin on passe dans un pipeline pour pouvoir ajouter taxes, ristournes ou autres modifications
     153
     154        // On passe dans un pipeline pour pouvoir ajouter taxes, ristournes ou autres modifications
    141155        $prix = pipeline(
    142156                'prix',
     
    153167                )
    154168        );
    155        
    156         // Si on demande un arrondi, on le fait
    157         if ($options['arrondi']) {
     169
     170        // Enfin si nécessaire, on fait un arrondi
     171        if (
     172                is_int($options['arrondi'])
     173                and $options['arrondi'] >= 0
     174        ) {
    158175                $prix = round($prix, $options['arrondi']);
    159176        }
    160        
     177
    161178        // Et c'est fini
    162179        return $prix;
    163180}
    164 
  • _plugins_/prix/paquet.xml

    r123213 r123222  
    22        prefix="prix"
    33        categorie="outil"
    4         version="1.2.5"
     4        version="1.2.6"
    55        etat="dev"
    66        compatibilite="[3.2.0;3.2.*]"
  • _plugins_/prix/prix_fonctions.php

    r123194 r123222  
    140140 *     Tableau d'options :
    141141 *     - currency|devise :         (String) devise, code alphabétique à 3 lettres.
    142  *                                 Défaut : celle par défaut configurée
    143  *     - float|flottant :          (Bool) pour retourner le nombre flottant arrondi selon la devise
    144  *                                 au lieu d'une chaîne de texte.
    145  *                                 Défaut : false
     142 *                                 Défaut : celle configurée
    146143 *     - locale :                  (String) identifiant d'une locale (fr-CA) ou code de langue SPIP (fr_tu)
    147144 *     - style :                   (String) standard | accounting.
     
    169166        $prix = floatval(str_replace(',', '.', $prix));
    170167
    171         // Devise à utiliser et sa fraction (ex. : nb pour passer des euros aux centimes)
     168        // Devise à utiliser
    172169        $devise = (!empty($options['currency']) ? $options['currency'] : prix_devise_defaut());
    173         $fraction = intval(prix_devise_info($devise, 'fraction'));
    174 
    175         // S'il faut retourner directement le nombre flottant, on arrondit simplement selon la devise.
    176         if (!empty($options['float'])) {
    177                 $prix_formate = round($prix, $fraction);
    178 
    179         // Sinon lançons la machine
     170
     171        // Locale à utiliser
     172        $locale = (!empty($options['locale']) ? $options['locale'] : prix_locale_defaut());
     173        $locale = prix_langue_vers_locale($locale);
     174
     175        // 1) De préférence, on utilise la librairie Intl de Commerceguys
     176        if (extension_loaded('bcmath')) {
     177
     178                // Options : on pose celles de base puis on ajoute celles passées en paramètre.
     179                $options_base = array(
     180                        'locale'           => $locale,
     181                        'currency_display' => 'code', // pour l'accessibilité
     182                );
     183                if (is_array($options)) {
     184                        $options = prix_filtrer_options_formater($options);
     185                        $options = array_merge($options_base, $options);
     186                } else {
     187                        $options = $options_base;
     188                }
     189
     190                // Formatons
     191                $numberFormatRepository = new CommerceGuys\Intl\NumberFormat\NumberFormatRepository;
     192                $currencyRepository = new CommerceGuys\Intl\Currency\CurrencyRepository;
     193                $currencyFormatter = new CommerceGuys\Intl\Formatter\CurrencyFormatter($numberFormatRepository, $currencyRepository, $options);
     194                $prix_formate = $currencyFormatter->format($prix, $devise);
     195
     196        // 2) Sinon on se rabat sur la librairie Intl PECL
     197        } elseif (extension_loaded('intl')) {
     198                $currencyFormatter = new NumberFormatter($locale, NumberFormatter::CURRENCY);
     199                $prix_formate = $currencyFormatter->formatCurrency($prix, $devise);
     200
     201        // 3) Sinon, on fait le formatage du pauvre, au doigt mouillé
    180202        } else {
    181 
    182                 // Locale à utiliser
    183                 $locale = (!empty($options['locale']) ? $options['locale'] : prix_locale_defaut());
    184                 $locale = prix_langue_vers_locale($locale);
    185 
    186                 // 1) De préférence, on utilise la librairie Intl de Commerceguys
    187                 if (extension_loaded('bcmath')) {
    188 
    189                         // Options : on pose celles de base puis on ajoute celles passées en paramètre.
    190                         $options_base = array(
    191                                 'locale'           => $locale,
    192                                 'currency_display' => 'code', // pour l'accessibilité
    193                         );
    194                         if (is_array($options)) {
    195                                 $options = prix_filtrer_options_formater($options);
    196                                 $options = array_merge($options_base, $options);
    197                         } else {
    198                                 $options = $options_base;
    199                         }
    200 
    201                         // Formatons
    202                         $numberFormatRepository = new CommerceGuys\Intl\NumberFormat\NumberFormatRepository;
    203                         $currencyRepository = new CommerceGuys\Intl\Currency\CurrencyRepository;
    204                         $currencyFormatter = new CommerceGuys\Intl\Formatter\CurrencyFormatter($numberFormatRepository, $currencyRepository, $options);
    205                         $prix_formate = $currencyFormatter->format($prix, $devise);
    206 
    207                 // 2) Sinon on se rabat sur la librairie Intl PECL
    208                 } elseif (extension_loaded('intl')) {
    209                         $currencyFormatter = new NumberFormatter($locale, NumberFormatter::CURRENCY);
    210                         $prix_formate = $currencyFormatter->formatCurrency($prix, $devise);
    211 
    212                 // 3) Sinon, on fait le formatage du pauvre
    213                 } else {
    214                         $prix_formate = str_replace('.', ',', round($prix, $fraction)) . '&nbsp;' . $devise;
    215                 }
     203                $prix_formate = str_replace('.', ',', $prix) . '&nbsp;' . $devise;
    216204        }
    217205
Note: See TracChangeset for help on using the changeset viewer.