source: spip-zone/_plugins_/reservations_bank/branches/v1/reservation_bank_pipelines.php @ 103680

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

v 1.2.0

  • Enlever le message de confirmation original et ne montrer que le récapitulatif (plus clair)
  • Permettre de choisir si le formulaire de paiment s'affiche avant ou après le récapitulatif
  • Salvatore
File size: 17.1 KB
Line 
1<?php
2/**
3 * Utilisations de pipelines par Réservations Bank
4 *
5 * @plugin     Réservations Bank
6 * @copyright  2015
7 * @author     Rainer Müller
8 * @licence    GNU/GPL
9 * @package    SPIP\Reservation_bank\Pipelines
10 */
11if (!defined('_ECRIRE_INC_VERSION'))
12        return;
13
14/**
15 * permet de modifier le tableau de valeurs envoyé par la fonction charger d’un formulaire CVT
16 *
17 * @pipeline formulaire_charger
18 *
19 * @param array $flux
20 *              Données du pipeline
21 * @return array Données du pipeline
22 */
23function reservation_bank_formulaire_charger($flux) {
24        $form = $flux['args']['form'];
25        if ($form == 'reservation') {
26                $flux['data']['checkout'] = _request('checkout');
27                if ($flux['data']['checkout'] = _request('checkout')) {
28                        $flux['data']['editable'] = FALSE;
29                        $flux['data']['message_ok'] .= recuperer_fond('inclure/paiement_reservation', array (
30                                'id_reservation' => session_get('id_reservation'),
31                                'cacher_paiement_public' => FALSE,
32                                ));
33                }
34        }
35
36        if ($form == 'encaisser_reglement') {
37                $id_transaction = $flux['data']['_id_transaction'];
38
39                // Les infos supplémentaires de la transaction
40                $transaction = sql_fetsel('id_reservation,montant,auteur', 'spip_transactions', 'id_transaction=' . $id_transaction);
41                $id_reservation = $flux['id_reservation'] = $transaction['id_reservation'];
42                $montant_transaction = $flux['montant'] = $transaction['montant'];
43
44                // Cas spécial pour les crédits
45                if ($flux['data']['_mode'] == 'credit' and $credit = credit_client('', $transaction['auteur'])) {
46                        $flux['data']['credit'] = '';
47                        $flux['data']['email_client'] = $email_client = $transaction['auteur'];
48                        $flux['_hidden'] .= '<input name="email_client" value="' . $email_client . '" type="hidden"/>';
49                }
50
51
52                // Définir les champs pour les détails de réservation.
53                $sql = sql_select('id_reservations_detail,prix,prix_ht,quantite,devise,taxe,descriptif,montant_paye', 'spip_reservations_details', 'id_reservation=' . $id_reservation);
54
55                $montant_detail = array ();
56                $montant_reservations_detail_defaut = array ();
57                $montant_reservations_detail_total = array ();
58                $count = sql_count($sql);
59                $montant_transaction_detail = '';
60                if ($count > 0) {
61                        $montant_transaction_detail = $montant_transaction / $count;
62                }
63                $montant_ouvert = '';
64                $montant_defaut = '';
65                while ( $data = sql_fetch($sql) ) {
66                        $id_reservations_detail = $data['id_reservations_detail'];
67                        $devise = $data['devise'];
68                        $montant_paye[$id_reservations_detail] = $data['montant_paye'];
69
70                        if ($montant = $data['prix'] <= 0) {
71                                $montant = $data['prix_ht'] + $data['taxe'];
72                        }
73
74                        $montant_reservations_detail_total[$id_reservations_detail] = $montant;
75
76                        $montant_ouvert = $montant_defaut = $montant - $data['montant_paye'];
77
78                        if ($montant_ouvert < $montant_transaction_detail and $montant_ouvert >= 0) {
79                                if (!$montant_defaut = _request('montant_reservations_detail_' . $id_reservations_detail)) {
80                                        $montant_defaut = $montant_ouvert;
81                                }
82                        }
83
84                        if ($credit[$devise] > 0 and ($credit[$devise] / $count) <= $montant_defaut) {
85                                $montant_defaut = $credit[$devise] / $count;
86                        }
87
88                        if ($montant_defaut > 0) {
89
90                                $montant_detail[] = array (
91                                                'saisie' => 'input',
92                                                'options' => array (
93                                                                'nom' => 'montant_reservations_detail_' . $id_reservations_detail,
94                                                                'label' => $data['descriptif'],
95                                                                'defaut' => $montant_defaut,
96                                                                'size' => 20
97                                                )
98                                );
99                        }
100
101                        $flux['data']['montant_reservations_detail_' . $id_reservations_detail] = '';
102                        $montant_reservations_detail_defaut[$id_reservations_detail] = $montant_ouvert;
103                }
104
105                if ($credit) {
106                        $flux['credit'] = '';
107                        $flux['_hidden'] .= '<input name="credit" value="' . $credit[$devise] . '" type="hidden"/>';
108                }
109
110                $flux['_mes_saisies'] = array (
111                                array (
112                                                'saisie' => 'fieldset',
113                                                'options' => array (
114                                                                'nom' => 'specifier',
115                                                                'label' => _T('reservation_bank:label_fieldset_specifier')
116                                                ),
117                                                'saisies' => array (
118                                                                array (
119                                                                                'saisie' => 'oui_non',
120                                                                                'options' => array (
121                                                                                                'nom' => 'specifier_montant',
122                                                                                                'label' => _T('reservation_bank:label_specifier_montant'),
123                                                                                                'defaut' => _request('specifier_montant')
124                                                                                )
125                                                                )
126                                                )
127                                ),
128                                array (
129                                                'saisie' => 'fieldset',
130                                                'options' => array (
131                                                                'nom' => 'montant',
132                                                                'label' => _T('reservation_bank:label_fieldset_montant_detail', array (
133                                                                                'devise' => $devise
134                                                                )),
135                                                                'afficher_si' => '@specifier_montant@ == "on"'
136                                                ),
137                                                'saisies' => $montant_detail
138                                )
139                );
140                $flux['data']['specifier_montant'] = _request('specifier_montant');
141                $flux['data']['montant_reservations_detail_defaut'] = '';
142                $flux['data']['montant_paye'] = $montant_paye;
143                $flux['_hidden'] .= '<input name="id_reservation" value="' . $id_reservation . '" type="hidden"/>';
144                $flux['_hidden'] .= '<input name="id_transaction" value="' . $id_transaction . '" type="hidden"/>';
145
146                $montant_reservations_detail_defaut = serialize($montant_reservations_detail_defaut);
147                $montant_reservations_detail_total = serialize($montant_reservations_detail_total);
148                $flux['_hidden'] .= "<input name='montant_reservations_detail_defaut' value='$montant_reservations_detail_defaut' type='hidden'/>";
149                $flux['_hidden'] .= "<input name='montant_reservations_detail_total' value='$montant_reservations_detail_total' type='hidden'/>";
150        }
151        return $flux;
152}
153
154/**
155 * Intervientpendant la vérification d'un formulaire CVT
156 *
157 * @pipeline formulaire_verifier
158 *
159 * @param array $flux
160 *              Données du pipeline
161 * @return array Données du pipeline
162 */
163function reservation_bank_formulaire_verifier($flux) {
164        $form = $flux['args']['form'];
165        if ($form == 'encaisser_reglement') {
166                $id_reservation = _request('id_reservation');
167
168                $montant_reservations_detail_defaut = _request('montant_reservations_detail_defaut') ? unserialize(_request('montant_reservations_detail_defaut')) : array();
169                $montant_reservations_detail_total = _request('montant_reservations_detail_total') ? unserialize(_request('montant_reservations_detail_total')) : array();
170
171                if ($montant_reservations_detail_defaut){
172                        set_request('montant_reservations_detail_defaut', $montant_reservations_detail_defaut);
173                }
174                if ($montant_reservations_detail_total) {
175                        set_request('montant_reservations_detail_total',$montant_reservations_detail_total);
176                }
177
178                $sql = sql_select('id_reservations_detail,montant_paye', 'spip_reservations_details', 'id_reservation=' . $id_reservation);
179                $montant_ouvert = array ();
180                $montant_paye = array ();
181                $montants = array ();
182                while ( $data = sql_fetch($sql) ) {
183                        $id_reservations_detail = $data['id_reservations_detail'];
184                        $montant = _request('montant_reservations_detail_' . $id_reservations_detail);
185                        $montant_defaut = $montant_reservations_detail_defaut[$id_reservations_detail];
186
187                        $montant_paye[$id_reservations_detail] = $paye = $data['montant_paye'];
188                        $montants[] = $montant;
189
190                        if (_request('specifier_montant') AND $montant > $montant_defaut) {
191                                $flux['data']['montant_reservations_detail_' .$id_reservations_detail]= _T('reservation_bank:message_erreur_montant_reservations_detail',array('montant_ouvert' => $montant_defaut));
192                        }
193                }
194                set_request('montant_paye', $montant_paye);
195                if ($credit = _request('credit') and $credit < array_sum($montants)) {
196                        $flux['data']['specifier_montant'] = _T('reservation_bank:message_erreur_montant_credit', array (
197                                        'credit' => $credit
198                        ));
199                }
200                session_set('encaisser_montant_regle', array_sum($montants));
201        }
202        return $flux;
203}
204
205/**
206 * Intervient au traitement d'un formulaire CVT
207 *
208 * @pipeline formulaire_traiter
209 *
210 * @param array $flux
211 *              Données du pipeline
212 * @return array Données du pipeline
213 */
214function reservation_bank_formulaire_traiter($flux) {
215        $form = $flux['args']['form'];
216
217        // Affiche le formulaire de paiment au retour du formulaire réservation
218        if ($form == 'reservation') {
219                include_spip('inc/config');
220                $config = lire_config('reservation_bank', array());
221                $cacher_paiement_public = isset($config['cacher_paiement_public']) ? $config['cacher_paiement_public'] : '';
222                $preceder_formulaire = isset($config['preceder_formulaire']) ? $config['preceder_formulaire'] : '';
223                $id_transaction = rb_inserer_transaction(session_get('id_reservation'));
224                if (!$cacher_paiement_public) {
225                        $message_ok = preg_replace('/<p[^>]*>.*?<\/p>/i', '',$flux['data']['message_ok']);
226                        $tag_regex = '/<div[^>]*'.$attr.'="'.$value.'">(.*?)<\\/div>/si';
227                        if ($preceder_formulaire) {
228                                $flux['data']['message_ok'] = recuperer_fond('inclure/paiement_reservation', array (
229                                        'id_reservation' => session_get('id_reservation'),
230                                        'cacher_paiement_public' => FALSE
231                                )) . '<br />'. $message_ok;
232                        }
233                        else {
234                                $flux['data']['message_ok'] = $message_ok . recuperer_fond('inclure/paiement_reservation', array (
235                                        'id_reservation' => session_get('id_reservation'),
236                                        'cacher_paiement_public' => FALSE
237                                ));
238                        }
239
240                }
241        }
242
243        return $flux;
244}
245
246/**
247 * Intervient lors de l’édition d’un élément éditorial.
248 *
249 * @pipeline pre_edition
250 *
251 * @param array $flux
252 *              Données du pipeline
253 * @return array Données du pipeline
254 */
255function reservation_bank_pre_edition($flux) {
256        $table = $flux['args']['table'];
257
258        if ($table == 'spip_reservations_details'
259                and $montant_reservations_detail_total = _request('montant_reservations_detail_total')
260                and $montant_paye = _request('montant_paye')) {
261
262                $id_reservations_detail = $flux['args']['id_reservations_detail'];
263
264                $montant_total = $montant_reservations_detail_total[$id_reservations_detail];
265                $montant_reservations_detail = _request('montant_reservations_detail_' . $id_reservations_detail);
266
267                $montant_paye = $montant_paye[$id_reservations_detail] + $montant_reservations_detail;
268
269                // Si le montant payé est inférieur au montant dû on change les statuts.
270                $statut = $flux['data']['statut'];
271                if ($montant_paye < $montant_total) {
272                        if ($statut == 'accepte') {
273                                $flux['data']['statut'] = 'accepte_part';
274                        }
275                        elseif ($statut == 'attente') {
276                                $flux['data']['statut'] = 'attente_part';
277                        }
278                }
279                // Si montant égal, mais statut en attente, on met en attente_paye.
280                elseif ($statut == 'attente') {
281                        $flux['data']['statut'] = 'attente_paye';
282                }
283
284                // Enregistre le montant payé
285                $flux['data']['montant_paye'] = $montant_paye;
286        }
287        return $flux;
288}
289
290/**
291 * Permet de compléter ou modifier le résultat de la compilation d’un squelette donné.
292 *
293 * @pipeline recuperer_fond
294 *
295 * @param array $flux
296 *              Données du pipeline
297 * @return array Données du pipeline
298 */
299function reservation_bank_recuperer_fond($flux) {
300        $fond = $flux['args']['fond'];
301        $contexte = $flux['data']['contexte'];
302
303        // Ajoute des champs supplémentaires pour le paiment des réservations dans l'espace privé.
304        if ($fond == 'formulaires/encaisser_reglement' and _request('exec') == 'payer_reservation') {
305                $reservation_bank = recuperer_fond('formulaires/inc-encaisser_reglement_reservation', $contexte);
306                $flux['data']['texte'] = str_replace('<ul class="editer-groupe">', $reservation_bank . '<ul class="editer-groupe">', $flux['data']['texte']);
307        }
308
309        // Ajoute un colonne en plus à la liste des réservations
310        if ($fond == 'prive/objets/liste/inc-reservations_reservations') {
311                $row = recuperer_fond('prive/objets/liste/inc-reservations_thead', $contexte);
312                $flux['data']['texte'] = str_replace("<th class='client' scope='col'>", $row . "<th class='client' scope='col'>", $flux['data']['texte']);
313        }
314
315        // Ajoute un colonne en plus à la liste des réservations
316        if ($fond == 'prive/objets/liste/inc-reservations_row') {
317                $row = recuperer_fond('prive/objets/liste/inc-reservations_row_paiement', $contexte);
318                $flux['data']['texte'] = str_replace("<td class='client'>", $row . "<td class='client'>", $flux['data']['texte']);
319        }
320
321        // Ajoute le lien de paiement à la page réservation
322        if ($fond == 'prive/objets/contenu/inc-reservation_montant') {
323                $id_reservation = $contexte['id_reservation'];
324                $sql = sql_select('montant_paye', 'spip_reservations_details', 'id_reservation=' . $id_reservation);
325
326                $montant_paye = array ();
327                while ( $data = sql_fetch($sql) ) {
328                        $montant_paye[] = $data['montant_paye'];
329                }
330                $contexte['montant_paye'] = array_sum($montant_paye);
331                $row = recuperer_fond('prive/objets/contenu/inc-reservation_montant_paiement', $contexte);
332                $flux['data']['texte'] = str_replace('</div>', '</div>' . $row, $flux['data']['texte']);
333        }
334
335        // Ajoute le message de paiement à la notification de réservation.
336        if ($fond == 'inclure/reservation'
337                        and $id_reservation = $flux['data']['contexte']['id_reservation']
338                        and $statut = sql_getfetsel('statut', 'spip_reservations', 'id_reservation=' . $id_reservation)
339                        and ($statut == 'attente_paiement' or $statut == 'accepte')) {
340                                $qui = $flux['data']['contexte']['qui'];
341                                $transaction = sql_fetsel('mode, id_transaction, transaction_hash, message, tracking_id',
342                                'spip_transactions',
343                                'id_reservation=' . $id_reservation,
344                                '',
345                                'date_transaction DESC'
346                                );
347                $mode = $transaction['mode'];
348                $id_transaction = $transaction['id_transaction'];
349                if ($qui == 'client') {
350                        if ($statut == 'attente_paiement') {
351                                $pattern = array('|<p class="titre h4">|','|</p>|');
352                                $replace = array('<h3>','</h3>');
353                                $texte = preg_replace($pattern, $replace, bank_afficher_attente_reglement(
354                                                $mode,
355                                                $id_transaction,
356                                                $transaction['transaction_hash'],
357                                                '')
358                                                );
359                        }
360                        else{
361                                $texte = '<p>' . $transaction['message'] . '</p>';
362                        }
363                }
364                else {
365                        $url = generer_url_ecrire('transaction', 'id_transaction=' . $id_transaction);
366                        $texte = '<h2>' . _T('reservation_bank:titre_paiement_vendeur') . '</h2>';
367                        $texte .= '<p>' . _T('reservation_bank:message_paiement_vendeur', array(
368                                'mode' => $mode,
369                                'url' => $url,
370                                )
371                        ) . '</p>';
372                }
373
374                $flux['data']['texte'] .= $texte;
375        }
376
377        // Ajouter le message pour la référence su paiement par virement.
378        if ($fond == 'presta/virement/payer/attente'and
379                        $tracking_id = sql_getfetsel('tracking_id',
380                                        'spip_transactions',
381                                        'id_transaction=' . $contexte['id_transaction']) and
382$id_reservation = sql_getfetsel('id_reservation', 'spip_reservations', 'reference LIKE '. sql_quote($tracking_id))) {
383
384                        $texte = '<strong>' . _T('reservation_bank:reservation_paiement_reference',
385                                        array('reference' => $tracking_id)) . '</strong>';
386                        $flux['data']['texte'] = str_replace('</div>', $texte . '</div>', $flux['data']['texte']);
387
388        }
389
390        return $flux;
391}
392
393/**
394 * Enregistrer le bon reglement d'une commande liee a une transaction du plugin bank
395 *
396 * @pipeline bank_traiter_reglement
397 *
398 * @param array $flux
399 * @return array mixed
400 */
401function reservation_bank_bank_traiter_reglement($flux) {
402
403        // Si on est dans le bon cas d'un paiement de reservation et qu'il y a un id_reservation et que la reservation existe toujours
404        if ($id_transaction = $flux['args']['id_transaction']
405                        and $transaction = sql_fetsel("*", "spip_transactions",
406                                "id_transaction=" . intval($id_transaction))
407                        and $id_reservation = $transaction['id_reservation']
408                        and $reservation = sql_fetsel('statut, reference',
409                                        'spip_reservations',
410                                        'id_reservation='.intval($id_reservation))) {
411                if (!$montant_reservations_detail_total = _request('montant_reservations_detail_total')) {
412                        include_spip('inc/reservation_bank');
413                        $montant_reservations_detail_total = montant_reservations_detail_total($id_reservation);
414                }
415
416                $paiement_detail = array ();
417                foreach ( array_keys($montant_reservations_detail_total) as $id_reservation_detail ) {
418                        $paiement_detail[$id_reservation_detail] = _request('montant_reservations_detail_' . $id_reservation_detail);
419                }
420
421                if (!$montant_regle = array_sum($paiement_detail)) {
422                        $montant_regle = $transaction['montant_regle'];
423                }
424                elseif (is_array($montant_regle)) {
425                        $montant_regle = array_sum($montant_regle);
426                }
427
428                set_request('montant_regle', $montant_regle);
429
430                $set = array (
431                                'montant_regle' => $montant_regle,
432                                'paiement_detail' => serialize($paiement_detail)
433                );
434
435                sql_updateq('spip_transactions', $set, 'id_transaction=' . $id_transaction);
436
437                include_spip('action/editer_objet');
438                objet_instituer('reservation', $id_reservation, array (
439                                'statut' => 'accepte',
440                                'date_paiement' => $transaction['date_transaction']
441                ));
442
443                // un message gentil pour l'utilisateur qui vient de payer, on lui rappelle son numero de commande
444                $flux['data'] .= "<br />"._T('reservation_bank:merci_de_votre_reservation_paiement',
445                                array('reference' => $reservation['reference']));
446
447        }
448
449        return $flux;
450}
451
452/**
453 * Changer de statut si transaction en attente
454 *
455 * @pipeline trig_bank_reglement_en_attente
456 *
457 * @param array $flux
458 * @return array
459 */
460function reservation_bank_trig_bank_reglement_en_attente($flux) {
461        if ($id_reservation = sql_getfetsel(
462                        'id_reservation',
463                        'spip_transactions',
464                        'id_transaction=' . $flux['args']['id_transaction'])) {
465                include_spip('action/editer_objet');
466                objet_instituer('reservation', $id_reservation, array (
467                        'statut' => 'attente_paiement',
468                ));
469        }
470
471        return $flux;
472}
473
474/**
475 * Insertion de css.
476 *
477 * @pipeline insert_head_css
478 *
479 * @param array $flux
480 *              Données du pipeline
481 * @return array Données du pipeline
482 */
483function reservation_bank_insert_head_css($flux) {
484        $css = find_in_path('css/reservations_bank.css');
485        $flux .= "<link rel='stylesheet' type='text/css' media='all' href='$css' />\n";
486        return $flux;
487}
Note: See TracBrowser for help on using the repository browser.