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

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

Ajout d'une fonction pour connaître le nombre de paiements déjà bien payés (ok) pour une commande. Du coup on l'utilise dans la fonction pour trouver la prochaine échéance.

File size: 3.4 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 ($transactions_commande = intval(sql_countsel(
54                'spip_transactions',
55                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) {
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                       
102                        // On liste les montants
103                        $montants_echeances = commandes_lister_montants_echeances($echeances);
104                       
105                        // Si le nombre déjà payé est supérieur à la liste on prend le dernier
106                        if ($nb_paiements >= count($montants_echeances)) {
107                                $montant = array_pop($montants_echeances);
108                        }
109                        else {
110                                $montant = $montants_echeances[$nb_paiements];
111                        }
112                       
113                        // Histoire d'être sûr
114                        $montant = floatval($montant);
115                }
116               
117                // Si on a un montant correct
118                if ($montant and $montant > 0) {
119                        $montants[$id_commande] = $montant;
120                        return $montant;
121                }
122        }
123       
124        // On a rien trouvé avant
125        return false;
126}
Note: See TracBrowser for help on using the repository browser.