source: spip-zone/_plugins_/commandes/trunk/action/editer_commande.php @ 101417

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

version 1.8.26 : n'appeler les notifications que quand le statut change (sinon ça notifie dès qu'on édite une commande !) + pécadille

File size: 10.9 KB
Line 
1<?php
2/**
3 * API d'édition du plugin Commandes
4 *
5 * @plugin     Commandes
6 * @copyright  2014
7 * @author     Ateliers CYM, Matthieu Marcillaud, Les Développements Durables
8 * @licence    GPL 3
9 * @package    SPIP\Commandes\Editer
10 */
11
12// Sécurité
13if (!defined("_ECRIRE_INC_VERSION")) return;
14
15/**
16 * Point d'entrée d'édition d'une commande
17 *
18 * On ne peut entrer que par un appel en fournissant `$id_commande`
19 * mais pas pas une url
20 *
21 * @uses commande_inserer()
22 * @uses commande_modifier()
23 *
24 * @param int $id_commande
25 *     Identifiant de la commande
26 * @return array
27 *     Identifiant de la commande et message d'erreur eventuel
28 */
29function action_editer_commande_dist($id_commande=null) {
30
31        // appel direct depuis une url interdit
32        if (is_null($id_commande)){
33                //$securiser_action = charger_fonction('securiser_action', 'inc');
34                //$id_commande = $securiser_action();
35                include_spip('inc/minipres');
36                echo minipres(_T('info_acces_interdit'));
37                die();
38        }
39
40        // si id_commande n'est pas un nombre, c'est une creation
41        if (!$id_commande = intval($id_commande)) {
42                $id_commande = commande_inserer(null,array('id_auteur'=>_request('id_auteur')));
43        }
44
45        if (!($id_commande = intval($id_commande))>0)
46                return array($id_commande,_L('echec enregistrement en base'));
47
48        // Enregistre l'envoi dans la BD
49        $err = commande_modifier($id_commande);
50
51        return array($id_commande,$err);
52}
53
54
55/**
56 * Crée une nouvelle commande et retourne son identifiant
57 *
58 * Les notifications par email sont traitées après l'insertion en base et l'appel des pipelines
59 *
60 * @uses commandes_notifier()
61 *
62 * @pipeline_appel pre_insertion
63 * @pipeline_appel post_insertion
64 * @param null $id_parent
65 *     Paramètre inutilisé, présent pour compatibilité avec api modifier objet
66 * @param array $champs
67 *     Couples des champs/valeurs par défaut
68 * @return int|bool
69 *     - Identifiant de la commande si succès
70 *     - False en cas d'erreur
71 */
72 
73function commande_inserer($id_parent=null, $champs=array()) {
74        $id_commande = false;
75
76        // On insère seulement s'il y a un auteur correct
77        if (isset($champs['id_auteur']) and $champs['id_auteur'] = intval($champs['id_auteur'])){
78                // La date de tout de suite
79                $champs['date'] = date('Y-m-d H:i:s');
80               
81                // Le statut en cours par défaut
82                if (!isset($champs['statut'])) {
83                        $champs['statut'] = 'encours';
84                }
85
86                // La référence si elle n'est pas déjà donnée
87                if (!isset($champs['reference'])) {
88                        $fonction_reference = charger_fonction('commandes_reference', 'inc/');
89                        $champs['reference'] = $fonction_reference($champs['id_auteur']);
90                }
91               
92                // Envoyer aux plugins avant insertion
93                $champs = pipeline('pre_insertion',
94                        array(
95                                'args' => array(
96                                        'table' => 'spip_commandes',
97                                ),
98                                'data' => $champs
99                        )
100                );
101               
102                // Si on veut insérer des échéances et que ce n'est pas déjà sérialisé, on sérialise TOUJOURS ce champ
103                if (isset($champs['echeances']) and @unserialize($champs['echeances']) === false) {
104                        $champs['echeances'] = serialize($champs['echeances']);
105                }
106               
107                // Insérer l'objet
108                $id_commande = sql_insertq("spip_commandes", $champs);
109
110                // Envoyer aux plugins après insertion
111                pipeline('post_insertion',
112                        array(
113                                'args' => array(
114                                        'table' => 'spip_commandes',
115                                        'id_objet' => $id_commande
116                                ),
117                                'data' => $champs
118                        )
119                );
120               
121                // Envoi des notifications par email
122                spip_log("inserer_commande : appel des notifications pour la commande $id_commande",'commandes.'._LOG_INFO);
123                include_spip('inc/commandes');
124                commandes_notifier($id_commande);
125
126        }
127
128        return $id_commande;
129}
130
131/**
132 * Appelle les fonctions de modification d'une commande
133 *
134 * @uses objet_modifier_champs()
135 * @uses commande_instituer()
136 *
137 * @param int $id_commande
138 *     Identifiant de la commande
139 * @param array|null $set
140 *     Couples des champs/valeurs à modifier
141 * @return mixed|string $err
142 *     Message d'erreur éventuel
143 */
144function commande_modifier($id_commande, $set=null) {
145        $err = '';
146
147        include_spip('inc/modifier');
148        include_spip('inc/filtres');
149        $c = collecter_requests(
150                // whitelist
151                objet_info('commande','champs_editables'),
152                // blacklist
153                array('date','statut'),
154                // donnees eventuellement fournies
155                $set
156        );
157       
158        // Si on veut insérer des échéances et que ce n'est pas déjà sérialisé, on sérialise TOUJOURS ce champ
159        if (isset($c['echeances']) and @unserialize($c['echeances']) === false) {
160                $c['echeances'] = serialize($c['echeances']);
161        }
162       
163        // Si l'objet est publie, invalider les caches et demander sa reindexation
164        if (objet_test_si_publie('commande',$id_commande)){
165                $invalideur = "id='id_commande/$id_commande'";
166                $indexation = true;
167        }
168        else {
169                $invalideur = "";
170                $indexation = false;
171        }
172
173        if ($err = objet_modifier_champs('commande', $id_commande,
174                array(
175                        'data' => $set,
176                        'nonvide' => array('statut' => _T('info_sans_statut')),
177                        'invalideur' => $invalideur,
178                        'indexation' => $indexation,
179                ),
180                $c))
181                return $err;
182
183        // Modification de statut
184        $c = array();
185        foreach (array('id_auteur', 'date', 'statut',) as $champ)
186                $c[$champ] = _request($champ, $set);
187        $err = commande_instituer($id_commande, $c);
188
189        return $err;
190}
191
192/**
193 * Instituer une commande
194 *
195 * Modifie des éléments à part que sont l'auteur, la date, le statut
196 *
197 * @uses editer_commande_details()
198 * @uses commandes_notifier()
199 *
200 * @pipeline_appel pre_edition
201 * @pipeline_appel post_edition
202 * @param int $id_commande
203 *     Identifiant de la commande
204 * @param array $c
205 *     Couples champ/valeur à modifier
206 * @param bool $calcul_details
207 *     (?) Inutilisé
208 * @return mixed|string
209 */
210function commande_instituer($id_commande, $c, $calcul_details=true){
211        include_spip('inc/autoriser');
212        include_spip('inc/modifier');
213
214        $row = sql_fetsel("statut, date, id_auteur", "spip_commandes", "id_commande=$id_commande");
215        $id_auteur = $row['id_auteur'];
216        $statut_ancien = $statut = $row['statut'];
217        $date_ancienne = $date = $row['date'];
218        $champs = array();
219
220        $d = isset($c['date']) ? $c['date'] : null;
221        $s = isset($c['statut']) ? $c['statut'] : $statut;
222
223        // On ne modifie le statut que si c'est autorisé
224        if ($s != $statut or ($d AND $d != $date)) {
225                //todo = donner l'autorisation a commandes_paypal_traitement_paypal
226                //if (autoriser('modifier', 'commande', $id_commande))
227                        $statut = $champs['statut'] = $s;
228                //else
229                //      spip_log("editer_commande $id_commande refus " . join(' ', $c),'commandes');
230
231                // Si on doit changer la date explicitement
232                if ($d){
233                        $champs['date'] = $date = $d;
234                }
235        }
236
237        $champs['id_auteur'] = $id_auteur;
238
239        // Mettre à jour les dates de paiement ou d'envoi pour les statuts correspondants
240        if ($statut != $statut_ancien)
241                foreach (array('partiel'=>'paiement', 'paye'=>'paiement', 'envoye'=>'envoi') as $k=>$v)
242                        if ($statut == $k)
243                                $champs["date_$v"] = date('Y-m-d H:i:s');
244
245        // Envoyer aux plugins avant édition
246        $champs = pipeline(
247                'pre_edition',
248                array(
249                        'args' => array(
250                                'table' => 'spip_commandes',
251                                'id_objet' => $id_commande,
252                                'action' => 'instituer',
253                                'statut_ancien' => $statut_ancien,
254                        ),
255                        'data' => $champs
256                )
257        );
258
259        if (!count($champs)) return;
260
261        // Envoyer les modifications et calculer les héritages
262        editer_commande_details($id_commande, $champs, $calcul_details);
263
264        // Invalider les caches
265        include_spip('inc/invalideur');
266        suivre_invalideur("id='id_commande/$id_commande'");
267
268        include_spip('inc/commandes');
269        // distribuer la commande si payee
270        if ($statut != $statut_ancien
271          and $statut=='paye'
272          and in_array($statut_ancien,array('encours','attente','partiel'))){
273                commandes_distribuer($id_commande);
274        }
275
276        spip_log("instituer_commande : flux post_edition pour la commande $id_commande",'commandes.'._LOG_INFO);
277
278        // Envoyer aux plugins après édition
279        pipeline(
280                'post_edition',
281                array(
282                        'args' => array(
283                                'table' => 'spip_commandes',
284                                'id_objet' => $id_commande,
285                                'action' => 'instituer',
286                                'statut_ancien' => $statut_ancien,
287                        ),
288                        'data' => $champs
289                )
290        );
291
292        // Envoi des notifications par email
293        if ($statut != $statut_ancien) {
294                spip_log("instituer_commande : appel des notifications pour la commande $id_commande",'commandes.'._LOG_INFO);
295                commandes_notifier($id_commande);
296        }
297
298        return ''; // pas d'erreur
299}
300
301/**
302 * Fabrique la requête d'institution de la commande
303 *
304 * Modifie la commande en calculant les dépendances des détails
305 *
306 * @param int $id_commande
307 *     Identifiant de la commande
308 * @param array $champs
309 *     Couples des champs/valeurs à modifier
310 * @param bool $cond
311 *     (?) inutilisé
312 * @return void
313 */
314function editer_commande_details($id_commande, $champs, $cond=true) {
315
316        if (!$champs) return;
317
318        sql_updateq(table_objet_sql('commande'), $champs, "id_commande=$id_commande");
319
320        // Changer le statut des elements concernes ? (voir details)
321
322        /*
323        if ($cond) {
324                include_spip('inc/rubriques');
325                $postdate = ($GLOBALS['meta']["post_dates"] == "non" and isset($champs['date']) and (strtotime($champs['date']) < time())) ? $champs['date'] : false;
326                calculer_rubriques_if($id_rubrique, $champs, $statut, $postdate);
327        }
328        */
329}
330
331// Ci dessous, fonctions dépréciées gardées pour rétro-compatibilité
332
333/**
334 * Enregistre une modification d'une commande
335 *
336 * @deprecated Alias de 'commande_modifier' pour rétro-compatibilité
337 * @uses commande_modifier()
338 *
339 * @param int $id_commande
340 *     Identifiant de la commande
341 * @param array $c
342 *     Couples des champs/valeurs modifiées
343 * @return mixed|string
344 */
345function revision_commande($id_commande, $c=false) {
346        return commande_modifier($id_commande, $c);
347}
348
349/**
350 * Crée une nouvelle commande
351 *
352 * @deprecated Alias de 'commande_inserer' pour rétro-compatibilité
353 * @uses commande_inserer()
354 *
355 * @param array $champs
356 *     Couples des champs/valeurs par défaut
357 * @return
358 */
359function commande_insert($champs=array()){
360        return commande_inserer(null,$champs);
361}
362
363/**
364 * Appelle les fonctions de modification d'une commande
365 *
366 * @deprecated Alias de 'commande_modifier' pour rétro-compatibilité
367 * @uses commande_modifier()
368 *
369 * @param int $id_commande
370 *     Identifiant de la commande
371 * @param array|null $set
372 *     Couples des champs/valeurs à modifier
373 * @return
374 */
375function commande_set($id_commande, $set=null){
376        return commande_modifier($id_commande, $set);
377}
378
379/**
380 * Modifie des éléments à part que sont l'auteur, la date, le statut
381 *
382 * @deprecated Alias de 'commande_instituer' pour rétro-compatibilité
383 * @uses commande_instituer()
384 *
385 * @param int $id_commande
386 *     Identifiant de la commande
387 * @param array $c
388 *     Couples des champs/valeurs à modifier
389 * @param bool $calcul_details
390 *     (?) Inutilisé
391 * @return
392 */
393function instituer_commande($id_commande, $c, $calcul_details=true){
394        return commande_instituer($id_commande, $c, $calcul_details);
395}
396
397?>
Note: See TracBrowser for help on using the repository browser.