source: spip-zone/_plugins_/commandes/trunk/inc/commandes_echeances.php @ 103862

Last change on this file since 103862 was 103862, checked in by cedric@…, 3 years ago

bugfix : _DIR_PLUGIN_BANK est toujours vrai meme si le plugin bank n'est pas actif, car si la constante n'existe pas elle vaudra la valeur de sa chaine '_DIR_PLUGIN_BANK', il faut utiliser defined('_DIR_PLUGIN_BANK') pour faire un test valable

File size: 3.6 KB
Line 
1<?php
2/**
3 * Fonctions du plugin Commandes relatives aux échéances attendues
4 *
5 * @plugin     Commandes
6 * @copyright  2014
7 * @author     Ateliers CYM, Matthieu Marcillaud, Les Développements Durables
8 * @licence    GPL 3
9 * @package    SPIP\Commandes\Fonctions
10 **/
11
12// Sécurité
13if (!defined('_ECRIRE_INC_VERSION')) return;
14
15/**
16 * Lister un à un les montants des échéances prévus
17 *
18 * @param array $echeances
19 *              Tableau des échéances décrites suivant ce qu'on attend pour les commandes :
20 *              ```
21 *              array(
22 *                      array('montant' => 40, 'nb' => 2),
23 *                      array('montant' => 50),
24 *              )
25 *              ```
26 * @return array
27 *              Retourne un tableau listant uniquement les montants un par un :
28 *              ```
29 *              array(40, 40, 50)
30 *              ```
31 **/
32function commandes_lister_montants_echeances($echeances) {
33        $montants_echeances = array();
34       
35        // Pour chaque montant d'échéance, s'il y a un nombre on rajoute le montant N fois
36        foreach ($echeances as $echeance) {
37                $montant = floatval($echeance['montant']);
38               
39                if ($nb = intval($echeance['nb'])) {
40                        $montants_echeances = array_merge($montants_echeances, array_fill(0, $nb, $montant));
41                }
42                else {
43                        array_push($montants_echeances, $montant);
44                }
45        }
46       
47        return $montants_echeances;
48}
49
50function commandes_nb_echeances_payees($id_commande) {
51        $nb_paiements = 0;
52       
53        if (defined('_DIR_PLUGIN_BANK')
54                and $transactions_commande = intval(sql_countsel('spip_transactions',array('id_commande = '.$id_commande, 'statut = "ok"')))
55          ) {
56                $nb_paiements += $transactions_commande;
57        }
58       
59        return $nb_paiements;
60}
61
62/**
63 * Trouver la prochaine échéance à payer pour une commande
64 *
65 * @param int $id_commande
66 *              Identifiant de la commande
67 * @param array|float $echeances
68 *              Montant unique ou tableau décrivant des échéances complexes
69 * @return float
70 *              Retourne le montant de la prochaine échéance
71 **/
72function commandes_trouver_prochaine_echeance($id_commande, $echeances=null, $ignorer_derniere=false) {
73        static $montants = array();
74        $id_commande = intval($id_commande);
75       
76        // Si on a déjà la réponse dans ce hit PHP, on retourne
77        if (isset($montants[$id_commande]) and $montants[$id_commande]) {
78                return $montants[$id_commande];
79        }
80       
81        // S'il n'y a pas d'échéances, on va les chercher
82        if (
83                is_null($echeances)
84                and $echeances = sql_getfetsel('echeances', 'spip_commandes', 'id_commande = '.$id_commande)
85        ) {
86                $echeances = unserialize($echeances);
87        }
88       
89        // Si on a bien des échéances au final
90        if ($echeances) {
91                // Si les échéances sont uniques, toujours les mêmes, c'est facile
92                if (!is_array($echeances)) {
93                        $montant = floatval($echeances);
94                }
95                // Sinon on va chercher a combien de paiements payés on en est déjà
96                // afin de trouver le montant de la prochaine échéance
97                else {
98                        // On cherche le nombre de paiements valides pour cette commande
99                        $nb_paiements = commandes_nb_echeances_payees($id_commande);
100                        // Si on cherche à tester la dernière transaction, il faut l'ignorer
101                        if ($ignorer_derniere) {
102                                $nb_paiements = $nb_paiements - 1;
103                        }
104                       
105                        // On liste les montants
106                        $montants_echeances = commandes_lister_montants_echeances($echeances);
107                       
108                        // Si le nombre déjà payé est supérieur à la liste on prend le dernier
109                        if ($nb_paiements >= count($montants_echeances)) {
110                                $montant = array_pop($montants_echeances);
111                        }
112                        else {
113                                $montant = $montants_echeances[$nb_paiements];
114                        }
115                       
116                        // Histoire d'être sûr
117                        $montant = floatval($montant);
118                }
119               
120                // Si on a un montant correct
121                if ($montant and $montant > 0) {
122                        $montants[$id_commande] = $montant;
123                        return $montant;
124                }
125        }
126       
127        // On a rien trouvé avant
128        return false;
129}
Note: See TracBrowser for help on using the repository browser.