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

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

plus besoin

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