source: spip-zone/_plugins_/reservation_evenement/trunk/action/editer_reservation.php

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

référence aussi pour l'espace privé

File size: 9.8 KB
Line 
1<?php
2if (!defined('_ECRIRE_INC_VERSION'))
3        return;
4
5function reservation_inserer($id_parent = null, $set = null) {
6        $table_sql = table_objet_sql('reservation');
7        $champs = array();
8        $champs['statut'] = 'encours';
9        $champs['date'] = date('Y-m-d H:i:s');
10
11        if ($set)
12                $champs = array_merge($champs, $set);
13
14        // Envoyer aux plugins
15        $champs = pipeline('pre_insertion', array(
16                'args' => array('table' => $table_sql, ),
17                'data' => $champs
18        ));
19
20        $id_reservation = sql_insertq($table_sql, $champs);
21        // Génération de la référence.
22        $fonction_reference = charger_fonction('reservation_reference', 'inc/');
23        $reference = $fonction_reference($id_reservation);
24        set_request('reference', $reference);
25
26        if ($id_reservation) {
27                pipeline('post_insertion', array(
28                        'args' => array(
29                                'table' => $table_sql,
30                                'id_objet' => $id_reservation,
31                        ),
32                        'data' => $champs
33                ));
34        }
35        return $id_reservation;
36}
37
38function reservation_instituer($id_reservation, $c, $calcul_rub = true) {
39        include_spip('inc/autoriser');
40        include_spip('inc/rubriques');
41        include_spip('inc/modifier');
42        include_spip('inc/config');
43        $config = lire_config('reservation_evenement');
44
45        $statut_calculer_auto = isset($config['statut_calculer_auto']) ? $config['statut_calculer_auto'] : '';
46
47        if ($statut_calculer_auto == 'on')
48                set_request('statuts_details_reservation', array());
49
50        $row = sql_fetsel('statut,date,id_auteur,email,lang,donnees_auteur,destinataires_supplementaires', 'spip_reservations', 'id_reservation=' . intval($id_reservation));
51        $statut_ancien = $statut = $row['statut'];
52        $date_ancienne = $date = $row['date'];
53        $donnees_auteur = isset($row['donnees_auteur']) ? $row['donnees_auteur'] : '';
54        if ($donnees_auteur) {
55                $donnees_auteur = unserialize($donnees_auteur);
56        }
57
58        $d = isset($c['date']) ? $c['date'] : null;
59        $s = isset($c['statut']) ? $c['statut'] : $statut;
60
61        $champs = array();
62
63        // cf autorisations dans inc/instituer_objet
64        if ($s != $statut OR ($d AND $d != $date)) {
65                if (autoriser('modifier', 'reservation', $id_reservation))
66                        $statut = $champs['statut'] = $s;
67                else
68                        spip_log("editer_reservation $id_reservation refus " . join(' ', $c));
69
70                // En cas de paiement, fixer la date_paiement a "maintenant"
71
72                if ($statut == 'accepte' AND $statut_ancien == 'attente_paiement')
73                        $champs['date_paiement'] = date('Y-m-d H:i:s');
74        }
75
76        // Gérer les détails des réservations
77        $set = array(
78                'id_reservation' => $id_reservation,
79                'statut' => $statut,
80                'statut_calculer_auto' => $statut_calculer_auto
81        );
82
83        $evenements = _request('id_evenement');
84
85        // Si les déclinaisons sont actives on récupère les évenements via le prix
86        if ($plugin_declinaison = test_plugin_actif('declinaisons')) {
87                $evenements = array();
88                $quantite = $_REQUEST['quantite'] ;
89
90                //id_request force le type des variable en id_
91                if ($id_prix_objet = $_REQUEST['id_objet_prix']) {
92                        foreach ($id_prix_objet as $id_evenement => $declinaisons) {
93                                foreach($declinaisons as $declinaison) {
94                                        if (!is_array($evenements[$id_evenement])) {
95                                                $evenements[$id_evenement] = array();
96                                        }
97                                        $evenements[$id_evenement][] = array(
98                                                'id_prix_objet' => (int)$declinaison,
99                                                'quantite' => isset($quantite[$id_evenement][$declinaison]) ? (int)$quantite[$id_evenement][$declinaison] : 1
100                                        );
101                                }
102                        }
103                }
104        }
105        // Si on n'est pas dans le cas d'une création, on récupère les détails attachées à la réservation
106        if (!is_array($evenements) OR (is_array($evenements) AND count($evenements) == 0)) {
107                include_spip('action/editer_reservations_detail');
108                $c = array(
109                        'statut' => $statut,
110                        'statut_calculer_auto' => $statut_calculer_auto
111                );
112                $sql = sql_select('id_reservations_detail', 'spip_reservations_details', 'id_reservation=' . $id_reservation);
113
114                // Eviter l'envoi d'une notification pour chaque détail
115                set_request('envoi_separe_actif', 'non');
116                while ($data = sql_fetch($sql)) {
117                        reservations_detail_instituer($data['id_reservations_detail'], $c);
118                }
119        }
120        else {
121                $action = charger_fonction('editer_objet', 'action');
122                $set['evenements'] = $evenements;
123                set_request('evenements', $evenements);
124        }
125        //Si on est dans le cas d'une création
126        if (is_array($evenements)) {
127                // Si le plugin déclinaison est activé.
128                if ($plugin_declinaison) {
129                        // Pour chaque événement on crée un détail de la réservation
130                        foreach ($evenements AS $id_evenement => $evenement_details) {
131                                foreach ($evenement_details as $evenement_detail) {
132                                        $where = 'id_reservation=' . $id_reservation . ' AND id_evenement=' . $id_evenement;
133                                        if (isset($evenement_detail['id_prix_objet'])) {
134                                                $where .= ' AND id_prix_objet = '.$evenement_detail['id_prix_objet'];
135                                        }
136                                        // Si aucun détail n'est attaché à l'événement, on le crée
137                                        if (!$reservations_detail = sql_fetsel('*', 'spip_reservations_details', $where)) {
138                                                $id_reservations_detail = 'new';
139                                                $set['id_prix_objet'] = $evenement_detail['id_prix_objet'];
140                                                $set['quantite'] = $evenement_detail['quantite'];
141                                        }
142                                        else {
143                                                $id_reservations_detail = $reservations_detail['id_reservations_detail'];
144                                                $set['quantite'] = $reservations_detail['quantite'];
145                                        }
146                                        // Pour l'enregistrement
147                                        $set['id_evenement'] = $id_evenement;
148
149                                        // Eviter l'envoi d'une notification pour chaque détail
150                                        set_request('envoi_separe_actif', 'non');
151
152                                        // Actualiser le détail de réservation
153                                        $action($id_reservations_detail, 'reservations_detail', $set);
154                                }
155                        }
156                }
157                else {
158                        // Pour chaque événement on crée un détail de la réservation
159                        foreach ($evenements AS $id_evenement) {
160                                // Si aucun détail n'est attaché à l'événement, on le crée
161                                if (!$reservations_detail = sql_fetsel('*', 'spip_reservations_details',
162                                                'id_reservation=' . $id_reservation . ' AND id_evenement=' . $id_evenement)) {
163                                                $id_reservations_detail = 'new';
164                                                $set['id_prix_objet'] = $id_prix_objet[$id_evenement];
165                                }
166                                else {
167                                        $id_reservations_detail = $reservations_detail['id_reservations_detail'];
168                                        $set['quantite'] = $reservations_detail['quantite'];
169                                }
170
171                                // Pour l'enregistrement
172                                $set['id_evenement'] = $id_evenement;
173
174                                // Eviter l'envoi d'une notification pour chaque détail
175                                set_request('envoi_separe_actif', 'non');
176
177                                // Actualiser le détail de réservation
178                                $action($id_reservations_detail, 'reservations_detail', $set);
179                        }
180                }
181        }
182
183
184        //Etablir si tous les détails d'événement ont le statut de la réservation
185        if ($statut_calculer_auto == 'on' AND $c['statut'] == 'accepte') {
186
187                $statuts_details_reservation = _request('statuts_details_reservation');
188                $statut_modifie = array();
189
190                foreach ($statuts_details_reservation AS $data) {
191                        $statut_modifie[] = $data['statut_modifie'];
192                }
193                //Sinon lui attibuer le statut accepté partiellement.
194                if (array_sum($statut_modifie) > 0)
195                        $champs['statut'] = 'accepte_part';
196        }
197
198        //les champs extras auteur
199        include_spip('cextras_pipelines');
200        $valeurs_extras = array();
201
202        if (function_exists('champs_extras_objet')) {
203
204                //Charger les définitions pour la création des formulaires
205                $champs_extras_auteurs = champs_extras_objet(table_objet_sql('auteur'));
206
207                if (is_array($champs_extras_auteurs)) {
208                        foreach ($champs_extras_auteurs as $value) {
209                                $valeurs_extras[$value['options']['nom']] = _request($value['options']['nom']) ?
210                                        _request($value['options']['nom']) :
211                                        (isset($donnees_auteur[$value['options']['nom']]) ?
212                                                $donnees_auteur[$value['options']['nom']] :
213                                                ''
214                                        );
215                        }
216                }
217                $champs['donnees_auteur'] = serialize($valeurs_extras);
218        }
219
220        // Envoyer aux plugins
221        $champs = pipeline('pre_edition', array(
222                'args' => array(
223                        'table' => 'spip_reservations',
224                        'id_reservation' => $id_reservation,
225                        'action' => 'instituer',
226                        'statut_ancien' => $statut_ancien,
227                        'date_ancienne' => $date_ancienne,
228                ),
229                'data' => $champs
230        ));
231
232        if (!count($champs)) {
233                return '';
234        }
235
236        // Envoyer les modifs.
237        objet_editer_heritage('reservation', $id_reservation, '', $statut_ancien, $champs);
238
239        // Invalider les caches
240        include_spip('inc/invalideur');
241        suivre_invalideur("id='reservation/$id_reservation'");
242
243        // Pipeline
244        pipeline('post_edition', array(
245                'args' => array(
246                        'table' => 'spip_reservations',
247                        'id_reservation' => $id_reservation,
248                        'action' => 'instituer',
249                        'statut_ancien' => $statut_ancien,
250                        'date_ancienne' => $date_ancienne,
251                ),
252                'data' => $champs
253        ));
254
255        // Les traitements spécifiques
256        // Notifications
257        if ((!$statut_ancien OR $statut != $statut_ancien) && (isset($config['activer'])) && (isset($config['quand']) && is_array($config['quand']) && in_array($statut, $config['quand'])) && ($notifications = charger_fonction('notifications', 'inc', true))) {
258
259                //Déterminer la langue pour les notifications
260                $lang = isset($row['lang']) ? $row['lang'] : lire_config('langue_site');
261                lang_select($lang);
262
263                // Determiner l'expediteur
264                $options = array(
265                        'statut' => $champs['statut'],
266                        'lang' => $lang
267                );
268                if ($config['expediteur'] != "facteur")
269                        $options['expediteur'] = $config['expediteur_' . $config['expediteur']];
270
271                // Envoyer au vendeur et au client
272                $notifications('reservation_vendeur', $id_reservation, $options);
273                if ($config['client']) {
274
275                        if (intval($row['id_auteur']) AND $row['id_auteur'] > 0) {
276                                $options['email'] = sql_getfetsel('email', 'spip_auteurs', 'id_auteur=' . $row['id_auteur']);
277                        }
278                        else {
279                                $options['email'] = $row['email'];
280                        }
281
282                        // Voir si il faut envoyer à plusieurs déstinataires.
283                        if (isset($config['destinataires_supplementaires']) and
284                                $config['destinataires_supplementaires'] == 'on' and
285                                $destinataires_supplementaires  = $row['destinataires_supplementaires']) {
286
287                                $destinataires_supplementaires = explode(',', $destinataires_supplementaires);
288                                $options['email'] = array_merge(array($options['email']), $destinataires_supplementaires);
289                        }
290
291                        $notifications('reservation_client', $id_reservation, $options);
292                }
293
294        }
295
296        return '';
297        // pas d'erreur
298}
Note: See TracBrowser for help on using the repository browser.