source: spip-zone/_plugins_/reservations_bank/trunk/reservation_bank_pipelines.php @ 110732

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

redirection vers page de paiement au lieu de s'insérer dans le message ok du formulaire réservation

File size: 20.0 KB
Line 
1<?php
2/**
3 * Utilisations de pipelines par Réservations Bank
4 *
5 * @plugin     Réservations Bank
6 * @copyright  2015-2018
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                // Définir les champs pour les détails de réservation.
52                $sql = sql_select('id_reservations_detail,prix,prix_ht,quantite,devise,taxe,descriptif,montant_paye', 'spip_reservations_details', 'id_reservation=' . $id_reservation);
53
54                $montant_detail = array();
55                $montant_reservations_detail_defaut = array();
56                $montant_reservations_detail_total = array();
57                $count = sql_count($sql);
58                $montant_transaction_detail = '';
59                if ($count > 0) {
60                        $montant_transaction_detail = $montant_transaction / $count;
61                }
62
63                $montant_ouvert = '';
64                $montant_defaut = '';
65                $fonction_prix = '';
66                if (charger_fonction('prix', 'inc/', TRUE)) {
67                        $fonction_prix = charger_fonction('prix', 'inc/');
68                }
69
70                while ($data = sql_fetch($sql)) {
71                        $id_reservations_detail = $data['id_reservations_detail'];
72                        $devise = $data['devise'];
73                        $montant_paye[$id_reservations_detail] = $data['montant_paye'];
74
75                        if ($fonction_prix) {
76                                $montant = $fonction_prix('reservations_detail', $id_reservations_detail);
77                        }
78                        else {
79                                $montant = $data['prix'];
80                                if ($montant <= 0) {
81                                        $montant = $data['prix_ht'] + $data['taxe'];
82                                }
83                        }
84
85                        $montant_reservations_detail_total[$id_reservations_detail] = $montant;
86
87                        $montant_ouvert = $montant_defaut = $montant - $data['montant_paye'];
88
89                        if ($montant_ouvert < $montant_transaction_detail and $montant_ouvert >= 0) {
90                                if (!$montant_defaut = _request('montant_reservations_detail_' . $id_reservations_detail)) {
91                                        $montant_defaut = $montant_ouvert;
92                                }
93                        }
94
95                        if ($credit[$devise] > 0 and ($credit[$devise] / $count) <= $montant_defaut) {
96                                $montant_defaut = $credit[$devise] / $count;
97                        }
98
99                        if ($montant_defaut > 0) {
100
101                                $montant_detail[] = array(
102                                        'saisie' => 'input',
103                                        'options' => array(
104                                                'nom' => 'montant_reservations_detail_' . $id_reservations_detail,
105                                                'label' => $data['descriptif'],
106                                                'defaut' => $montant_defaut,
107                                                'size' => 20
108                                        )
109                                );
110                        }
111
112                        $flux['data']['montant_reservations_detail_' . $id_reservations_detail] = '';
113                        $montant_reservations_detail_defaut[$id_reservations_detail] = $montant_ouvert;
114                }
115
116                if ($credit) {
117                        $flux['credit'] = '';
118                        $flux['_hidden'] .= '<input name="credit" value="' . $credit[$devise] . '" type="hidden"/>';
119                }
120
121                $flux['_mes_saisies'] = array(
122                        array(
123                                'saisie' => 'fieldset',
124                                'options' => array(
125                                        'nom' => 'specifier',
126                                        'label' => _T('reservation_bank:label_fieldset_specifier')
127                                ),
128                                'saisies' => array(
129                                        array(
130                                                'saisie' => 'oui_non',
131                                                'options' => array(
132                                                        'nom' => 'specifier_montant',
133                                                        'label' => _T('reservation_bank:label_specifier_montant'),
134                                                        'defaut' => _request('specifier_montant')
135                                                )
136                                        )
137                                )
138                        ),
139                        array(
140                                'saisie' => 'fieldset',
141                                'options' => array(
142                                        'nom' => 'montant',
143                                        'label' => _T('reservation_bank:label_fieldset_montant_detail', array(
144                                                'devise' => $devise
145                                        )),
146                                        'afficher_si' => '@specifier_montant@ == "on"'
147                                ),
148                                'saisies' => $montant_detail
149                        )
150                );
151                $flux['data']['specifier_montant'] = _request('specifier_montant');
152                $flux['data']['montant_reservations_detail_defaut'] = '';
153                $flux['data']['montant_paye'] = $montant_paye;
154                $flux['_hidden'] .= '<input name="id_reservation" value="' . $id_reservation . '" type="hidden"/>';
155                $flux['_hidden'] .= '<input name="id_transaction" value="' . $id_transaction . '" type="hidden"/>';
156
157                $montant_reservations_detail_defaut = serialize($montant_reservations_detail_defaut);
158                $montant_reservations_detail_total = serialize($montant_reservations_detail_total);
159                $flux['_hidden'] .= "<input name='montant_reservations_detail_defaut' value='$montant_reservations_detail_defaut' type='hidden'/>";
160                $flux['_hidden'] .= "<input name='montant_reservations_detail_total' value='$montant_reservations_detail_total' type='hidden'/>";
161        }
162        return $flux;
163}
164
165/**
166 * Intervientpendant la vérification d'un formulaire CVT
167 *
168 * @pipeline formulaire_verifier
169 *
170 * @param array $flux
171 *              Données du pipeline
172 * @return array Données du pipeline
173 */
174function reservation_bank_formulaire_verifier($flux) {
175        $form = $flux['args']['form'];
176        if ($form == 'encaisser_reglement') {
177                $id_reservation = _request('id_reservation');
178
179                $montant_reservations_detail_defaut = _request('montant_reservations_detail_defaut') ? unserialize(_request('montant_reservations_detail_defaut')) : array();
180                $montant_reservations_detail_total = _request('montant_reservations_detail_total') ? unserialize(_request('montant_reservations_detail_total')) : array();
181
182                if ($montant_reservations_detail_defaut) {
183                        set_request('montant_reservations_detail_defaut', $montant_reservations_detail_defaut);
184                }
185                if ($montant_reservations_detail_total) {
186                        set_request('montant_reservations_detail_total', $montant_reservations_detail_total);
187                }
188
189                $sql = sql_select('id_reservations_detail,montant_paye', 'spip_reservations_details', 'id_reservation=' . $id_reservation);
190                $montant_ouvert = array();
191                $montant_paye = array();
192                $montants = array();
193                while ($data = sql_fetch($sql)) {
194                        $id_reservations_detail = $data['id_reservations_detail'];
195                        $montant = _request('montant_reservations_detail_' . $id_reservations_detail);
196                        $montant_defaut = $montant_reservations_detail_defaut[$id_reservations_detail];
197
198                        $montant_paye[$id_reservations_detail] = $paye = $data['montant_paye'];
199                        $montants[] = $montant;
200
201                        if (_request('specifier_montant') and $montant > $montant_defaut) {
202                                $flux['data']['montant_reservations_detail_' . $id_reservations_detail] = _T('reservation_bank:message_erreur_montant_reservations_detail', array(
203                                        'montant_ouvert' => $montant_defaut
204                                ));
205                        }
206                }
207                set_request('montant_paye', $montant_paye);
208                if ($credit = _request('credit') and $credit < array_sum($montants)) {
209                        $flux['data']['specifier_montant'] = _T('reservation_bank:message_erreur_montant_credit', array(
210                                'credit' => $credit
211                        ));
212                }
213                session_set('encaisser_montant_regle', array_sum($montants));
214        }
215        return $flux;
216}
217
218/**
219 * Intervient au traitement d'un formulaire CVT
220 *
221 * @pipeline formulaire_traiter
222 *
223 * @param array $flux
224 *              Données du pipeline
225 * @return array Données du pipeline
226 */
227function reservation_bank_formulaire_traiter($flux) {
228        $form = $flux['args']['form'];
229
230        // Affiche le formulaire de paiment au retour du formulaire réservation
231        if ($form == 'reservation') {
232                if (!_request('gratuit')) {
233                        include_spip('inc/config');
234                        $config = lire_config('reservation_bank', array());
235                        $cacher_paiement_public = isset($config['cacher_paiement_public']) ? $config['cacher_paiement_public'] : '';
236                        $preceder_formulaire = isset($config['preceder_formulaire']) ? $config['preceder_formulaire'] : '';
237                        $id_reservation = session_get('id_reservation');
238                        $id_transaction = rb_inserer_transaction($id_reservation);
239                        if (!$cacher_paiement_public) {
240                                $flux['data']['redirect'] = generer_url_public(
241                                        'paiement_reservation',
242                                        "id_reservation=$id_reservation");
243
244                        }
245                }
246        }
247
248        return $flux;
249}
250
251/**
252 * Intervient lors de l’édition d’un élément éditorial.
253 *
254 * @pipeline pre_edition
255 *
256 * @param array $flux
257 *              Données du pipeline
258 * @return array Données du pipeline.
259 */
260function reservation_bank_pre_edition($flux) {
261        $table = $flux['args']['table'];
262
263        if (!_request('gratuit') &&
264                        $table == 'spip_reservations' &&
265                        $flux['args']['statut_ancien'] == 'encours' &&
266                        _request('statut') == 'encours' &&
267                        $montants = _request('montants')
268                        ) {
269                        $id_reservation = $flux['args']['id_reservation'];
270                        $prix_ht = array_sum(array_column($montants, 'prix_ht'));
271                        $prix = array_sum(array_column($montants, 'prix'));
272                        if ($prix_ht <= 0 && $prix <= 0) {
273                                spip_log($flux, 'teste');
274                                $id_transaction = rb_inserer_transaction($id_reservation);
275                                $row = sql_fetsel('*','spip_transactions','id_transaction='.intval($id_transaction));
276
277                                $set = array(
278                                        "mode"=>'gratuit',
279                                        "montant_regle" => 0,
280                                        "date_paiement" => date('Y-m-d H:i:s'),
281                                        "statut"=>'ok',
282                                        "reglee"=>'oui'
283                                );
284                                sql_updateq("spip_transactions", $set,  "id_transaction=".intval($id_transaction));
285                                spip_log("call_resonse : id_transaction $id_transaction, reglee",$mode);
286                                set_request('gratuit', TRUE);
287
288                                $regler_transaction = charger_fonction('regler_transaction', 'bank');
289                                $regler_transaction($id_transaction, array('row_prec'=>$row));
290                        }
291
292        }
293
294
295        if ($table == 'spip_reservations_details' and $montant_reservations_detail_total = _request('montant_reservations_detail_total') and $montant_paye = _request('montant_paye')) {
296
297                $id_reservations_detail = $flux['args']['id_reservations_detail'];
298
299                $montant_total = $montant_reservations_detail_total[$id_reservations_detail];
300                $montant_reservations_detail = _request('montant_reservations_detail_' . $id_reservations_detail);
301
302                $montant_paye = $montant_paye[$id_reservations_detail] + $montant_reservations_detail;
303
304                // Si le montant payé est inférieur au montant dû on change les statuts.
305
306                $statut = $flux['data']['statut'];
307
308                if ($montant_paye < $montant_total and (!empty($montant_total) and $montant_total != 0)) {
309                        if ($statut == 'accepte') {
310                                $flux['data']['statut'] = 'accepte_part';
311                        }
312                        elseif ($statut == 'attente') {
313                                $flux['data']['statut'] = 'attente_part';
314                        }
315                }
316                // Si montant égal, mais statut en attente, on met en attente_paye.
317                elseif ($statut == 'attente') {
318                        $flux['data']['statut'] = 'attente_paye';
319                }
320
321                // Enregistre le montant payé
322                $flux['data']['montant_paye'] = $montant_paye;
323        }
324        return $flux;
325}
326
327/**
328 * Permet de compléter ou modifier le résultat de la compilation d’un squelette donné.
329 *
330 * @pipeline recuperer_fond
331 *
332 * @param array $flux
333 *              Données du pipeline
334 * @return array Données du pipeline
335 */
336function reservation_bank_recuperer_fond($flux) {
337        $fond = $flux['args']['fond'];
338        $contexte = $flux['data']['contexte'];
339
340        // Ajoute des champs supplémentaires pour le paiment des réservations dans l'espace privé.
341        if ($fond == 'formulaires/encaisser_reglement' and _request('exec') == 'payer_reservation') {
342                $reservation_bank = recuperer_fond('formulaires/inc-encaisser_reglement_reservation', $contexte);
343                $flux['data']['texte'] = str_replace('<ul class="editer-groupe">', $reservation_bank . '<ul class="editer-groupe">', $flux['data']['texte']);
344        }
345
346        // Ajoute un colonne en plus à la liste des réservations
347        if ($fond == 'prive/objets/liste/inc-reservations_reservations') {
348                $row = recuperer_fond('prive/objets/liste/inc-reservations_thead', $contexte);
349                $flux['data']['texte'] = str_replace("<th class='client' scope='col'>", $row . "<th class='client' scope='col'>", $flux['data']['texte']);
350        }
351
352        // Ajoute un colonne en plus à la liste des réservations
353        if ($fond == 'prive/objets/liste/inc-reservations_row') {
354                $row = recuperer_fond('prive/objets/liste/inc-reservations_row_paiement', $contexte);
355                $flux['data']['texte'] = str_replace("<td class='client'>", $row . "<td class='client'>", $flux['data']['texte']);
356        }
357
358        // Ajoute le lien de paiement à la page réservation
359        if ($fond == 'prive/objets/contenu/inc-reservation_montant') {
360                $id_reservation = $contexte['id_reservation'];
361                $sql = sql_select('montant_paye', 'spip_reservations_details', 'id_reservation=' . $id_reservation);
362
363                $montant_paye = array();
364                while ($data = sql_fetch($sql)) {
365                        $montant_paye[] = $data['montant_paye'];
366                }
367                $contexte['montant_paye'] = array_sum($montant_paye);
368                $row = recuperer_fond('prive/objets/contenu/inc-reservation_montant_paiement', $contexte);
369                $flux['data']['texte'] = str_replace('</div>', '</div>' . $row, $flux['data']['texte']);
370        }
371
372        // Ajoute le message de paiement à la notification de réservation.
373        if ($fond == 'inclure/reservation' and
374                        $id_reservation = $flux['data']['contexte']['id_reservation'] and
375                        $statut = sql_getfetsel('statut', 'spip_reservations', 'id_reservation=' . $id_reservation) and
376                        ($statut == 'attente_paiement' or $statut == 'accepte')) {
377                $qui = $flux['data']['contexte']['qui'];
378                $transaction = sql_fetsel('mode, id_transaction, transaction_hash, message, tracking_id', 'spip_transactions', 'id_reservation=' . $id_reservation, '', 'date_transaction DESC');
379                $mode = $transaction['mode'];
380                $id_transaction = $transaction['id_transaction'];
381                if ($qui == 'client') {
382                        if ($statut == 'attente_paiement') {
383                                $pattern = array(
384                                        '|<p class="titre h4">|',
385                                        '|</p>|'
386                                );
387                                $replace = array(
388                                        '<h3>',
389                                        '</h3>'
390                                );
391                                $texte = preg_replace($pattern, $replace, bank_afficher_attente_reglement($mode, $id_transaction, $transaction['transaction_hash'], ''));
392                        }
393                        else {
394                                $texte = '<p>' . $transaction['message'] . '</p>';
395                        }
396                }
397                elseif ($qui == 'vendeur') {
398                        $url = generer_url_ecrire('transaction', 'id_transaction=' . $id_transaction);
399                        $texte = '<h2>' . _T('reservation_bank:titre_paiement_vendeur') . '</h2>';
400                        $texte .= '<p>' . _T('reservation_bank:message_paiement_vendeur', array(
401                                'mode' => $mode,
402                                'url' => $url
403                        )) . '</p>';
404                }
405
406                $flux['data']['texte'] .= $texte;
407        }
408
409        // Ajouter le message pour la référence su paiement par virement.
410        if ($fond == 'presta/virement/payer/attente' and $tracking_id = sql_getfetsel('tracking_id', 'spip_transactions', 'id_transaction=' . $contexte['id_transaction']) and $id_reservation = sql_getfetsel('id_reservation', 'spip_reservations', 'reference LIKE ' . sql_quote($tracking_id))) {
411
412                $texte = '<strong>' . _T('reservation_bank:reservation_paiement_reference', array(
413                        'reference' => $tracking_id
414                )) . '</strong>';
415                $flux['data']['texte'] = str_replace('</div>', $texte . '</div>', $flux['data']['texte']);
416        }
417
418        // Ajoute un bouton de paimeent pour le réservations en cours.
419        if ($fond == 'prive/squelettes/navigation/reservation') {
420                if ($statut = sql_getfetsel('statut', 'spip_reservations', 'id_reservation= ' . $contexte['id_reservation']) and $statut == 'encours') {
421                        $button = recuperer_fond('inclure/bouton_inserer_prestataire', $contexte);
422                        $flux['data']['texte'] = str_replace('<!-- Infos extras -->', $button . ' <!-- Infos extras -->', $flux['data']['texte']);
423                }
424        }
425
426        return $flux;
427}
428
429/**
430 * Enregistrer le bon reglement d'une commande liee a une transaction du plugin bank
431 *
432 * @pipeline bank_traiter_reglement
433 *
434 * @param array $flux
435 * @return array mixed
436 */
437function reservation_bank_bank_traiter_reglement($flux) {
438        // 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
439
440        if ($id_transaction = $flux['args']['id_transaction'] and
441                        $transaction = sql_fetsel("*", "spip_transactions", "id_transaction=" . intval($id_transaction)) and
442                        $id_reservation = $transaction['id_reservation'] and
443                        $reservation = sql_fetsel('statut, reference', 'spip_reservations', 'id_reservation=' . intval($id_reservation))) {
444
445                $paiement_detail = array();
446                if (!_request('gratuit')) {
447                        if (!$montant_reservations_detail_total = _request('montant_reservations_detail_total')) {
448                                include_spip('inc/reservation_bank');
449                                $montant_reservations_detail_total = montant_reservations_detail_total($id_reservation);
450                        }
451
452                        foreach (array_keys($montant_reservations_detail_total) as $id_reservation_detail) {
453                                $paiement_detail[$id_reservation_detail] = _request('montant_reservations_detail_' . $id_reservation_detail);
454                        }
455
456                        if (!$montant_regle = array_sum($paiement_detail)) {
457                                $montant_regle = $transaction['montant_regle'];
458                        }
459                        elseif (is_array($montant_regle)) {
460                                $montant_regle = array_sum($montant_regle);
461                        }
462
463
464
465                set_request('montant_regle', $montant_regle);
466
467                $set = array(
468                        'montant_regle' => $montant_regle,
469                        'paiement_detail' => serialize($paiement_detail)
470                );
471
472                sql_updateq('spip_transactions', $set, 'id_transaction=' . $id_transaction);
473                }
474
475                include_spip('action/editer_objet');
476                objet_instituer('reservation', $id_reservation, array(
477                        'statut' => 'accepte',
478                        'date_paiement' => $transaction['date_transaction']
479                ));
480
481                // un message gentil pour l'utilisateur qui vient de payer, on lui rappelle son numero de commande
482                $flux['data'] .= "<br />" . _T('reservation_bank:merci_de_votre_reservation_paiement', array(
483                        'reference' => $reservation['reference']
484                ));
485
486        }
487
488        return $flux;
489}
490
491/**
492 * Changer de statut si transaction en attente
493 *
494 * @pipeline trig_bank_reglement_en_attente
495 *
496 * @param array $flux
497 * @return array
498 */
499function reservation_bank_trig_bank_reglement_en_attente($flux) {
500        if ($id_reservation = sql_getfetsel('id_reservation', 'spip_transactions', 'id_transaction=' . $flux['args']['id_transaction'])) {
501                include_spip('action/editer_objet');
502                objet_instituer('reservation', $id_reservation, array(
503                        'statut' => 'attente_paiement'
504                ));
505        }
506
507        return $flux;
508}
509
510/**
511 * Insertion de css.
512 *
513 * @pipeline insert_head_css
514 *
515 * @param array $flux
516 *              Données du pipeline
517 * @return array Données du pipeline
518 */
519function reservation_bank_insert_head_css($flux) {
520        $css = find_in_path('css/reservations_bank.css');
521        $flux .= "<link rel='stylesheet' type='text/css' media='all' href='$css' />\n";
522        return $flux;
523}
524
525/**
526 * Ajouter les configurations dans celle de réservation événements.
527 *
528 * @pipeline reservation_evenement_objets_configuration
529 *
530 * @param array $flux
531 *              Données du pipeline
532 * @return array Données du pipeline
533 */
534function reservation_bank_reservation_evenement_objets_configuration($flux) {
535        $objets = array(
536                'bank' => array(
537                        'label' => _T('bank:titre_menu_configurer')
538                ),
539                'reservation_bank' => array(
540                        'label' => _T('reservation_bank:reservation_bank_titre')
541                )
542        );
543
544        $flux['data'] = array_merge($flux['data'], $objets);
545
546        return $flux;
547}
548
549/**
550 * Ajouter une entré au menu de navigation de résrvation événement.
551 *
552 * @pipeline reservation_evenement_objets_navigation
553 *
554 * @param array $flux
555 *              Données du pipeline
556 * @return array Données du pipeline
557 */
558function reservation_bank_reservation_evenement_objets_navigation($flux) {
559        $flux['data']['transactions'] = array(
560                'label' => _T('bank:titre_menu_transactions'),
561                'icone' => 'credit-card-16.png'
562        );
563
564        return $flux;
565}
566
567/**
568 * Intervention sur les détails de réservation.
569 *
570 * @pipeline reservation_evenement_donnees_details.
571 *
572 * @param array $flux
573 *              Données du pipeline
574 * @return array
575 *          Données du pipeline
576 */
577function reservation_bank_reservation_evenement_donnees_details($flux) {
578        $data = $flux['data'];
579        if ($flux['args']['statut'] == 'encours') {
580                if (isset($data['prix_ht']) && isset($data['prix'])) {
581                        $prix_ht = $data['prix_ht'];
582                        $prix = $data['prix'];
583                        if ($prix <= 0 && $prix_ht <= 0) {
584                                $flux['data']['statut'] = 'accepte';
585                        }
586                }
587        }
588
589
590        return $flux;
591}
592
Note: See TracBrowser for help on using the repository browser.