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

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

Oups, c'est statut=ok pour les transactions, pas statut=paye

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