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

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

Coquille, c'est mieux avec data? quand on renvoie un flux de pipeline…

File size: 15.4 KB
Line 
1<?php
2/**
3 * Pieplines utilisées par le plugin Commandes
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\Pipelines
10 */
11
12// Sécurité
13if (!defined('_ECRIRE_INC_VERSION')) return;
14
15
16/**
17 * Insertion de la feuille de style CSS sur les pages publiques
18 *
19 * @pipeline insert_head_css
20 * @param  array $flux Données du pipeline
21 * @return array       Données du pipeline
22 */
23function commandes_insert_head_css($flux){
24        $css = find_in_path('css/commandes.css');
25        $flux .= "<link rel='stylesheet' type='text/css' media='all' href='$css' />\n";
26        return $flux;
27}
28
29
30/**
31 * Optimiser la base de donnée en supprimant toutes les commandes en cours qui sont trop vieilles
32 *
33 * Le délai de "péremption" est défini dans les options de configuration du plugin
34 *
35 * @pipeline optimiser_base_disparus
36 * @param  array $flux Données du pipeline
37 * @return array       Données du pipeline
38 */
39function commandes_optimiser_base_disparus($flux){
40        include_spip('inc/config');
41        // On cherche la date depuis quand on a le droit d'avoir fait la commande (par défaut 1h)
42        $depuis = date('Y-m-d H:i:s', time() - 3600*intval(lire_config('commandes/duree_vie', 1)));
43        // On récupère les commandes trop vieilles
44        $commandes = sql_allfetsel(
45                'id_commande',
46                'spip_commandes',
47                'statut = '.sql_quote('encours').' and date<'.sql_quote($depuis)
48        );
49
50        // S'il y a bien des commandes à supprimer
51        if ($commandes) {
52                $commandes = array_map('reset', $commandes);
53                include_spip('inc/commandes');
54                commandes_supprimer($commandes);
55                $flux['data'] += count($commandes);
56        }
57
58        return $flux;
59}
60
61
62/**
63 * Ajout de contenu sur certaines pages
64 *
65 * - Formulaires pour modifier les dates sur la fiche d'une commande
66 *
67 * @pipeline affiche_milieu
68 * @param  array $flux Données du pipeline
69 * @return array       Données du pipeline
70 */
71function commandes_affiche_milieu($flux) {
72
73        if (
74                $exec = trouver_objet_exec($flux['args']['exec'])
75                and $exec['edition'] == false 
76                and $exec['type'] == 'commande'
77                and $id_table_objet = $exec['id_table_objet']
78                and (isset($flux['args'][$id_table_objet]) and $id_commande = intval($flux['args'][$id_table_objet]))
79        ) {
80                $texte = recuperer_fond('prive/squelettes/contenu/commande_affiche_milieu',array('id_commande'=>$id_commande));
81        }
82
83        if (isset($texte)) {
84                if ($p=strpos($flux['data'],"<!--affiche_milieu-->"))
85                        $flux['data'] = substr_replace($flux['data'],$texte,$p,0);
86                else
87                        $flux['data'] .= $texte;
88        }
89
90        return $flux;
91}
92
93
94/**
95 * Ajout de contenu dans la liste des éléments en attente de validation
96 *
97 * - Liste des commandes aux statuts définis comme "actifs" dans les options de configuration
98 *
99 * @pipeline accueil_encours
100 * @param  array $flux Données du pipeline
101 * @return array       Données du pipeline
102 */
103function commandes_accueil_encours($flux) {
104
105        include_spip('inc/config');
106        $activer = lire_config('commandes/accueil_encours');
107        $statuts = lire_config('commandes/statuts_actifs');
108        if ($activer and is_array($statuts)) {
109                foreach($statuts as $statut){
110                        if ($nb_{$statut} = sql_countsel(table_objet_sql('commande'), "statut=".sql_quote($statut))) {
111                                $titre_{$statut} = singulier_ou_pluriel($nb_{$statut}, 'commandes:info_1_commande_statut_'.$statut, 'commandes:info_nb_commandes_statut_'.$statut);
112                                $flux .= recuperer_fond('prive/objets/liste/commandes', array(
113                                        'titre' => $titre_{$statut},
114                                        'statut' => $statut,
115                                        'cacher_tri' => true,
116                                        'nb' => 5),
117                                        array('ajax' => true)
118                                );
119                        }
120                }
121        }
122
123        return $flux;
124}
125
126
127/**
128 * Ajout de liste sur la vue d'un auteur
129 *
130 * - Liste des commandes de l'auteur
131 *
132 * @pipeline affiche_auteurs_interventions
133 * @param  array $flux Données du pipeline
134 * @return array       Données du pipeline
135**/
136function commandes_affiche_auteurs_interventions($flux) {
137
138        if ($id_auteur = intval($flux['args']['id_auteur'])) {
139                $flux['data'] .= recuperer_fond('prive/objets/liste/commandes', array(
140                        'id_auteur' => $id_auteur,
141                        'titre' => _T('commandes:titre_commandes_auteur'),
142                        'cacher_tri' => true
143                        ),
144                        array('ajax' => true)
145                );
146        }
147
148        return $flux;
149}
150
151
152/**
153 * Compléter la liste des types d'adresses du plugin Coordonnées
154 *
155 * Ajout de 2 types d'adresses : facturation et livraison
156 *
157 * @pipeline types_coordonnees
158 * @param  array $liste Données du pipeline
159 * @return array        Données du pipeline
160**/
161function commandes_types_coordonnees($liste) {
162
163        $types_adresses = $liste['adresse'];
164        if (!$types_adresses or !is_array($types_adresses)) $types_adresses = array();
165
166        // on définit les couples types + chaînes de langue à ajouter
167        $types_adresses_commandes = array(
168                'livraison' => _T('commandes:type_adresse_livraison'),
169                'facturation' => _T('commandes:type_adresse_facturation')
170        );
171        // on les rajoute à la liste des types des adresses
172        $liste['adresse'] = array_merge($types_adresses, $types_adresses_commandes);
173
174        return $liste;
175}
176
177
178/**
179 * Enregistrer le bon reglement d'une commande liee a une transaction du plugin bank
180 *
181 * @pipeline bank_traiter_reglement
182 * @param array $flux
183 * @return array mixed
184 */
185function commandes_bank_traiter_reglement($flux){
186        // Si on est dans le bon cas d'un paiement de commande et qu'il y a un id_commande et que la commande existe toujours
187        if (
188                $id_transaction = $flux['args']['id_transaction']
189                and $transaction = sql_fetsel("*","spip_transactions","id_transaction=".intval($id_transaction))
190                and $id_commande = $transaction['id_commande']
191                and $commande = sql_fetsel('id_commande, statut, id_auteur, echeances', 'spip_commandes', 'id_commande='.intval($id_commande))
192        ){
193                $statut_commande = $commande['statut'];
194                $montant_regle = $transaction['montant_regle'];
195                $transaction_mode = $transaction['mode'];
196                $statut_nouveau = 'paye';
197               
198                // Si la commande n'a pas d'échéance, le montant attendu est celui du prix de la commande
199                if (!$commande['echeances'] or !$echeances = unserialize($commande['echeances'])) {
200                        $fonction_prix = charger_fonction('prix', 'inc/');
201                        $montant_attendu = $fonction_prix('commande', $id_commande);
202                }
203                // Sinon le montant attendu est celui de la prochaine échéance
204                else {
205                        include_spip('inc/commandes_echeances');
206                        $montant_attendu = commandes_trouver_prochaine_echeance($id_commande, $echeances);
207                }
208                spip_log("commande #$id_commande attendu:$montant_attendu regle:$montant_regle", 'commandes');
209
210                // Si le plugin n'était pas déjà en payé et qu'on a pas assez payé
211                // (si le plugin était déjà en payé, ce sont possiblement des renouvellements)
212                if (
213                        $statut_commande != 'paye'
214                        and (floatval($montant_attendu) - floatval($montant_regle)) >= 0.01
215                ){
216                        $statut_nouveau = 'partiel';
217                }
218               
219                // S'il y a bien un statut à changer
220                if ($statut_nouveau !== $statut_commande){
221                        spip_log("commandes_bank_traiter_reglement marquer la commande #$id_commande statut=$statut_nouveau mode=$transaction_mode",'commandes');
222                        // On met a jour la commande
223                        include_spip("action/editer_commande");
224                        commande_modifier($id_commande, array('statut'=>$statut_nouveau, 'mode'=>$transaction_mode));
225                }
226        }
227
228        return $flux;
229}
230
231/**
232 * Enregistrer le reglement en attente d'une commande liee a une transaction du plugin bank
233 * (cas du reglement par cheque par exemple)
234 *
235 * @pipeline trig_bank_reglement_en_attente
236 * @param array $flux
237 * @return array mixed
238 */
239function commandes_trig_bank_reglement_en_attente($flux){
240        // Si on est dans le bon cas d'un paiement de commande et qu'il y a un id_commande et que la commande existe toujours
241        if ($id_transaction = $flux['args']['id_transaction']
242          AND $transaction = sql_fetsel("*","spip_transactions","id_transaction=".intval($id_transaction))
243                AND $id_commande = $transaction['id_commande']
244                AND $commande = sql_fetsel('id_commande, statut, id_auteur, mode', 'spip_commandes', 'id_commande='.intval($id_commande))){
245
246                $statut_commande = $commande['statut'];
247                $transaction_mode = $transaction['mode'];
248                $commande_mode = $commande['mode'];
249                $statut_nouveau = 'attente';
250                if ($statut_nouveau !== $statut_commande OR $transaction_mode !==$commande_mode){
251                        spip_log("commandes_trig_bank_reglement_en_attente marquer la commande #$id_commande statut=$statut_nouveau mode=$transaction_mode",'commandes');
252                        //on met a jour la commande
253                        include_spip("action/editer_commande");
254                        commande_modifier($id_commande,array('statut'=>$statut_nouveau,'mode'=>$transaction_mode));
255                }
256        }
257
258        return $flux;
259}
260
261
262/**
263 * Enregistrer le reglement en echec d'une commande liee a une transaction du plugin bank
264 * (cas du reglement annule ou du refus de carte etc)
265 *
266 * @pipeline trig_bank_reglement_en_echec
267 * @param array $flux
268 * @return array mixed
269 */
270function commandes_trig_bank_reglement_en_echec($flux){
271        // Si on est dans le bon cas d'un paiement de commande et qu'il y a un id_commande et que la commande existe toujours
272        if ($id_transaction = $flux['args']['id_transaction']
273          AND $transaction = sql_fetsel("*","spip_transactions","id_transaction=".intval($id_transaction))
274                AND $id_commande = $transaction['id_commande']
275                AND $commande = sql_fetsel('id_commande, statut, id_auteur', 'spip_commandes', 'id_commande='.intval($id_commande))){
276
277                $statut_commande = $commande['statut'];
278                $transaction_mode = $transaction['mode'];
279                $statut_nouveau = $statut_commande;
280
281                // on ne passe la commande en erreur que si le reglement a effectivement echoue,
282                // pas si c'est une simple annulation (retour en arriere depuis la page de paiement bancaire)
283                if (strncmp($transaction['statut'],"echec",5)==0){
284                        $statut_nouveau = 'erreur';
285                }
286                if ($statut_nouveau !== $statut_commande){
287                        spip_log("commandes_trig_bank_reglement_en_attente marquer la commande #$id_commande statut=$statut_nouveau",'commandes');
288                        //on met a jour la commande
289                        include_spip("action/editer_commande");
290                        commande_modifier($id_commande,array('statut'=>$statut_nouveau,'mode'=>$transaction_mode));
291                }
292        }
293
294        return $flux;
295}
296
297/**
298 * Déclarer les échéances à la banque
299 *
300 * @pipeline bank_abos_decrire_echeance
301 **/
302function commandes_bank_abos_decrire_echeance($flux) {
303        if (
304                // si on doit bien faire du prélèvement auto
305                $flux['args']['force_auto'] == true
306                // et qu'on a une transaction sous la main
307                and $id_transaction = intval($flux['args']['id_transaction'])
308                // et que cette transaction a un id_commande
309                and $id_commande = intval(sql_getfetsel('id_commande', 'spip_transactions', 'id_transaction = '.$id_transaction))
310                // et que la commande a des informations d'échéances
311                and $commande = sql_fetsel('echeances_type, echeances', 'spip_commandes', 'id_commande = '.$id_commande)
312                and $echeances = unserialize($commande['echeances'])
313                and $echeances_type = $commande['echeances_type']
314                and in_array($echeances_type, array('mois', 'annee'))
315        ) {
316                // On définit la périodicité
317                switch($echeances_type) {
318                        case 'mois':
319                                $flux['data']['freq'] = 'monthly';
320                        case 'annee':
321                                $flux['data']['freq'] = 'yearly';
322                }
323               
324                // Si c'est une seule valeur toute simple
325                if (!is_array($echeances)) {
326                        $echeances = floatval($echeances);
327                        $flux['data']['montant'] = $echeances;
328                }
329                // Sinon c'est un peu plus compliqué, et pour l'instant on ne gère que DEUX montants possibles
330                elseif (count($echeances) >= 2) {
331                        // Premier montant d'échéances
332                        $flux['data']['montant_init'] = $echeances[0]['montant'];
333                        $flux['data']['count_init'] = $echeances[0]['nb'];
334                        // Deuxième montant d'échéances
335                        $flux['data']['montant'] = $echeances[1]['montant'];
336                        if (isset($echeances[1]['nb'])) {
337                                $flux['data']['count'] = $echeances[1]['nb'];
338                        }
339                }
340        }
341       
342        return $flux;
343}
344
345/**
346 * Lier une commande à un identifiant bancaire lorsqu'un prélèvement bancaire est bien validé
347 *
348 * @pipeline bank_abos_activer_abonnement
349 **/
350function commandes_bank_abos_activer_abonnement($flux){
351        // Si on a une transaction
352        if ($id_transaction = intval($flux['args']['id_transaction'])) {
353                $were = 'id_transaction = '.$id_transaction;
354        }
355        // Sinon on cherche par l'identifiant d'abonnement bancaire
356        elseif ($abo_uid = $flux['args']['abo_uid']) {
357                $where = 'abo_uid = '.sql_quote($abo_uid);
358        }
359       
360        // On gère d'abord les erreurs possibles si on ne trouve pas la bonne transaction
361        if (!$transaction = sql_fetsel('*', 'spip_transactions', $where)) {
362                spip_log("Impossible de trouver la transaction ($id_transaction / $abo_uid).", 'commandes.'._LOG_ERREUR);
363                $flux['data'] = false;
364        }
365        elseif ($transaction['statut'] == 'commande') {
366                spip_log("La transaction ${transaction['id_transaction']} n’a pas été réglée.", 'commandes.'._LOG_ERREUR);
367                $flux['data'] = false;
368        }
369        elseif (strncmp($transaction['statut'], 'echec',5) == 0) {
370                spip_log("La transaction ${transaction['id_transaction']} a echoué.",'commandes.'._LOG_ERREUR);
371                $flux['data'] = false;
372        }
373        // Si on a trouvé ce qu'il faut, on va lier la commande à l'identifiant bancaire
374        elseif ($id_commande = intval($transaction['id_commande'])) {
375                include_spip('action/editer_objet');
376               
377                objet_modifier('commande', $id_commande, array('bank_uid' => $flux['args']['abo_uid']));
378        }
379       
380        return $flux;
381}
382
383/**
384 * Créer la transaction correspondant à la prochaine échéance d'une commande
385 *
386 * @pipeline bank_abos_preparer_echeance
387 **/
388function commandes_bank_abos_preparer_echeance($flux){
389        // On commence par chercher la commande dont il s'agit
390        // et vérifier qu'elle a des échéances
391        if (
392                strncmp($id,"uid:",4) == 0
393                and $bank_uid = substr($id, 4)
394                and $commande = sql_fetsel('*', 'spip_commandes', 'bank_uid = '.sql_quote($bank_uid))
395                and $id_commande = intval($commande['id_commande'])
396                and $echeances = unserialize($commande['echeances'])
397                and $echeances_type = $commande['echeances_type']
398        ){
399                include_spip('inc/commandes_echeances');
400               
401                // Si on a bien trouvé une prochaine échéance
402                if ($montant = commandes_trouver_prochaine_echeance($id_commande, $echeances)) {
403                        include_spip('action/editer_objet');
404                       
405                        // On remet la commande en attente de paiement puisqu'on… attend un paiement !
406                        objet_modifier('commande', $id_commande, array('statut' => 'attente'));
407                       
408                        // On crée la transaction qui testera le vrai paiement
409                        $inserer_transaction = charger_fonction('inserer_transaction', 'bank');
410                        $options_transaction = array(
411                                'id_auteur' => intval($commande['id_auteur']),
412                                'champs' => array(
413                                        'id_commande' => $id_commande,
414                                ),
415                        );
416                        $id_transaction = intval($inserer_transaction($montant, $options_transaction));
417                       
418                        $flux['data'] = $id_transaction;
419                }
420        }
421       
422        return $flux;
423}
424
425/**
426 * Mettre en erreur une commande dont le prélèvement automatique aurait échoué
427 *
428 * @pipeline bank_abos_resilier
429 **/
430function commandes_bank_abos_resilier($flux){
431        // On commence par chercher la commande dont il s'agit
432        // et vérifier qu'elle a des échéances
433        if (
434                strncmp($id,"uid:",4) == 0
435                and $bank_uid = substr($id, 4)
436                and $commande = sql_fetsel('*', 'spip_commandes', 'bank_uid = '.sql_quote($bank_uid))
437                and $id_commande = intval($commande['id_commande'])
438        ) {
439                include_spip('action/editer_objet');
440               
441                // Le prélèvement a échoué explicitement, donc la commande d'origine est en erreur
442                objet_modifier('commande', $id_commande, array('statut' => 'erreur'));
443        }
444       
445        return $flux;
446}
Note: See TracBrowser for help on using the repository browser.