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

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

alignement psr

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 (
54                defined('_DIR_PLUGIN_BANK')
55                and $transactions_commande = intval(sql_countsel('spip_transactions',array('id_commande = '.$id_commande, 'statut = "ok"')))
56        ) {
57                $nb_paiements += $transactions_commande;
58        }
59       
60        return $nb_paiements;
61}
62
63/**
64 * Trouver la prochaine échéance à payer pour une commande
65 *
66 * @param int $id_commande
67 *              Identifiant de la commande
68 * @param array|float $echeances
69 *              Montant unique ou tableau décrivant des échéances complexes
70 * @return float
71 *              Retourne le montant de la prochaine échéance
72 **/
73function commandes_trouver_prochaine_echeance($id_commande, $echeances=null, $ignorer_derniere=false) {
74        static $montants = array();
75        $id_commande = intval($id_commande);
76       
77        // Si on a déjà la réponse dans ce hit PHP, on retourne
78        if (isset($montants[$id_commande]) and $montants[$id_commande]) {
79                return $montants[$id_commande];
80        }
81       
82        // S'il n'y a pas d'échéances, on va les chercher
83        if (
84                is_null($echeances)
85                and $echeances = sql_getfetsel('echeances', 'spip_commandes', 'id_commande = '.$id_commande)
86        ) {
87                $echeances = unserialize($echeances);
88        }
89       
90        // Si on a bien des échéances au final
91        if ($echeances) {
92                // Si les échéances sont uniques, toujours les mêmes, c'est facile
93                if (!is_array($echeances)) {
94                        $montant = floatval($echeances);
95                }
96                // Sinon on va chercher a combien de paiements payés on en est déjà
97                // afin de trouver le montant de la prochaine échéance
98                else {
99                        // On cherche le nombre de paiements valides pour cette commande
100                        $nb_paiements = commandes_nb_echeances_payees($id_commande);
101                        // Si on cherche à tester la dernière transaction, il faut l'ignorer
102                        if ($ignorer_derniere) {
103                                $nb_paiements = $nb_paiements - 1;
104                        }
105                       
106                        // On liste les montants
107                        $montants_echeances = commandes_lister_montants_echeances($echeances);
108                       
109                        // Si le nombre déjà payé est supérieur à la liste on prend le dernier
110                        if ($nb_paiements >= count($montants_echeances)) {
111                                $montant = array_pop($montants_echeances);
112                        }
113                        else {
114                                $montant = $montants_echeances[$nb_paiements];
115                        }
116                       
117                        // Histoire d'être sûr
118                        $montant = floatval($montant);
119                }
120               
121                // Si on a un montant correct
122                if ($montant and $montant > 0) {
123                        $montants[$id_commande] = $montant;
124                        return $montant;
125                }
126        }
127       
128        // On a rien trouvé avant
129        return false;
130}
Note: See TracBrowser for help on using the repository browser.