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

Last change on this file since 113726 was 113726, checked in by cedric@…, 20 months ago

retour sur r109419 : pas de trouver_fond() au moment de l'appel de notification, c'est presumer de ce que fait la notification. Mais on passe statut et statut_ancien dans les options en cas de changement de statut, ce qui permet a la notification d'aiguiller sur un squelette en particulier si besoin (ou de faire la même chose en utilisant simplement un fond qui verie selon le statut)

File size: 11.4 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        $id_auteur = 0;
78        if (isset($champs['id_auteur'])) {
79                $id_auteur = intval($champs['id_auteur']);
80        }
81        include_spip('inc/autoriser');
82        if (autoriser('commander','',0,$id_auteur)){
83                // La date de tout de suite
84                $champs['date'] = date('Y-m-d H:i:s', $_SERVER['REQUEST_TIME']);
85               
86                // Le statut en cours par défaut
87                if (!isset($champs['statut'])) {
88                        $champs['statut'] = 'encours';
89                }
90
91                // Envoyer aux plugins avant insertion
92                $champs = pipeline('pre_insertion',
93                        array(
94                                'args' => array(
95                                        'table' => 'spip_commandes',
96                                ),
97                                'data' => $champs
98                        )
99                );
100
101                // Si on veut insérer des échéances et que ce n'est pas déjà sérialisé, on sérialise TOUJOURS ce champ
102                if (isset($champs['echeances']) and @unserialize($champs['echeances']) === false) {
103                        $champs['echeances'] = serialize($champs['echeances']);
104                }
105               
106                // Insérer l'objet
107                $id_commande = sql_insertq("spip_commandes", $champs);
108
109                // La référence si elle n'est pas déjà donnée : on attend d'avoir l'id_commande pour pouvoir generer un numero unique
110                if (!isset($champs['reference'])) {
111                        $commandes_reference = charger_fonction('commandes_reference', 'inc/');
112                        $champs['reference'] = $commandes_reference($id_commande, $id_auteur=0);
113                        sql_updateq('spip_commandes', array('reference' => $champs['reference']), 'id_commande=' . intval($id_commande));
114                }
115
116                // Envoyer aux plugins après insertion
117                pipeline('post_insertion',
118                        array(
119                                'args' => array(
120                                        'table' => 'spip_commandes',
121                                        'id_objet' => $id_commande
122                                ),
123                                'data' => $champs
124                        )
125                );
126               
127                // Envoi des notifications par email
128                spip_log("inserer_commande : appel des notifications pour la commande $id_commande",'commandes.'._LOG_INFO);
129                include_spip('inc/commandes');
130                // c'est une creation : statut_ancien=''
131                commandes_notifier($id_commande, '');
132
133        }
134
135        return $id_commande;
136}
137
138/**
139 * Appelle les fonctions de modification d'une commande
140 *
141 * @uses objet_modifier_champs()
142 * @uses commande_instituer()
143 *
144 * @param int $id_commande
145 *     Identifiant de la commande
146 * @param array|null $set
147 *     Couples des champs/valeurs à modifier
148 * @return mixed|string $err
149 *     Message d'erreur éventuel
150 */
151function commande_modifier($id_commande, $set=null) {
152        $err = '';
153
154        include_spip('inc/modifier');
155        include_spip('inc/filtres');
156        $c = collecter_requests(
157                // whitelist
158                objet_info('commande','champs_editables'),
159                // blacklist
160                array('date','statut'),
161                // donnees eventuellement fournies
162                $set
163        );
164       
165        // Si on veut insérer des échéances et que ce n'est pas déjà sérialisé, on sérialise TOUJOURS ce champ
166        if (isset($c['echeances']) and @unserialize($c['echeances']) === false) {
167                $c['echeances'] = serialize($c['echeances']);
168        }
169       
170        // Si l'objet est publie, invalider les caches et demander sa reindexation
171        if (objet_test_si_publie('commande',$id_commande)){
172                $invalideur = "id='id_commande/$id_commande'";
173                $indexation = true;
174        }
175        else {
176                $invalideur = "";
177                $indexation = false;
178        }
179
180        if ($err = objet_modifier_champs('commande', $id_commande,
181                array(
182                        'data' => $set,
183                        'nonvide' => array('statut' => _T('info_sans_statut')),
184                        'invalideur' => $invalideur,
185                        'indexation' => $indexation,
186                ),
187                $c))
188                return $err;
189
190        // Modification de statut
191        $c = array();
192        foreach (array('id_auteur', 'date', 'statut',) as $champ)
193                $c[$champ] = _request($champ, $set);
194        $err = commande_instituer($id_commande, $c);
195
196        return $err;
197}
198
199/**
200 * Instituer une commande
201 *
202 * Modifie des éléments à part que sont l'auteur, la date, le statut
203 *
204 * @uses editer_commande_details()
205 * @uses commandes_notifier()
206 *
207 * @pipeline_appel pre_edition
208 * @pipeline_appel post_edition
209 * @param int $id_commande
210 *     Identifiant de la commande
211 * @param array $c
212 *     Couples champ/valeur à modifier
213 * @param bool $calcul_details
214 *     (?) Inutilisé
215 * @return mixed|string
216 */
217function commande_instituer($id_commande, $c, $calcul_details=true){
218        include_spip('inc/autoriser');
219        include_spip('inc/modifier');
220
221        $row = sql_fetsel("statut, date, id_auteur", "spip_commandes", "id_commande=$id_commande");
222        $id_auteur = $row['id_auteur'];
223        $statut_ancien = $statut = $row['statut'];
224        $date_ancienne = $date = $row['date'];
225        $champs = array();
226
227        $d = isset($c['date']) ? $c['date'] : null;
228        $s = isset($c['statut']) ? $c['statut'] : $statut;
229
230        // On ne modifie le statut que si c'est autorisé
231        if ($s != $statut or ($d AND $d != $date)) {
232                //todo = donner l'autorisation a commandes_paypal_traitement_paypal
233                //if (autoriser('modifier', 'commande', $id_commande))
234                        $statut = $champs['statut'] = $s;
235                //else
236                //      spip_log("editer_commande $id_commande refus " . join(' ', $c),'commandes');
237
238                // Si on doit changer la date explicitement
239                if ($d){
240                        $champs['date'] = $date = $d;
241                }
242        }
243
244        $champs['id_auteur'] = $id_auteur;
245
246        // Mettre à jour les dates de paiement ou d'envoi pour les statuts correspondants
247        if ($statut != $statut_ancien)
248                foreach (array('partiel'=>'paiement', 'paye'=>'paiement', 'envoye'=>'envoi') as $k=>$v)
249                        if ($statut == $k)
250                                $champs["date_$v"] = date('Y-m-d H:i:s');
251
252        // Envoyer aux plugins avant édition
253        $champs = pipeline(
254                'pre_edition',
255                array(
256                        'args' => array(
257                                'table' => 'spip_commandes',
258                                'id_objet' => $id_commande,
259                                'action' => 'instituer',
260                                'statut_ancien' => $statut_ancien,
261                        ),
262                        'data' => $champs
263                )
264        );
265
266        if (!count($champs)) return;
267
268        // Envoyer les modifications et calculer les héritages
269        editer_commande_details($id_commande, $champs, $calcul_details);
270
271        // Invalider les caches
272        include_spip('inc/invalideur');
273        suivre_invalideur("id='id_commande/$id_commande'");
274
275        include_spip('inc/commandes');
276        // distribuer la commande si payee
277        if ($statut != $statut_ancien
278          and $statut=='paye'
279          and in_array($statut_ancien,array('encours','attente','partiel','erreur','poubelle'))
280          and $distribuer_commande = charger_fonction('distribuer_commande','action',true)){
281                $distribuer_commande($id_commande);
282        }
283
284        spip_log("instituer_commande : flux post_edition pour la commande $id_commande",'commandes.'._LOG_INFO);
285
286        // Envoyer aux plugins après édition
287        pipeline(
288                'post_edition',
289                array(
290                        'args' => array(
291                                'table' => 'spip_commandes',
292                                'id_objet' => $id_commande,
293                                'action' => 'instituer',
294                                'statut_ancien' => $statut_ancien,
295                        ),
296                        'data' => $champs
297                )
298        );
299
300        // Envoi des notifications par email
301        if ($statut != $statut_ancien) {
302                spip_log("instituer_commande : appel des notifications pour la commande $id_commande",'commandes.'._LOG_INFO);
303                commandes_notifier($id_commande, $statut_ancien);
304        }
305
306        return ''; // pas d'erreur
307}
308
309/**
310 * Fabrique la requête d'institution de la commande
311 *
312 * Modifie la commande en calculant les dépendances des détails
313 *
314 * @param int $id_commande
315 *     Identifiant de la commande
316 * @param array $champs
317 *     Couples des champs/valeurs à modifier
318 * @param bool $cond
319 *     (?) inutilisé
320 * @return void
321 */
322function editer_commande_details($id_commande, $champs, $cond=true) {
323
324        if (!$champs) return;
325
326        sql_updateq(table_objet_sql('commande'), $champs, "id_commande=$id_commande");
327
328        // Changer le statut des elements concernes ? (voir details)
329
330        /*
331        if ($cond) {
332                include_spip('inc/rubriques');
333                $postdate = ($GLOBALS['meta']["post_dates"] == "non" and isset($champs['date']) and (strtotime($champs['date']) < time())) ? $champs['date'] : false;
334                calculer_rubriques_if($id_rubrique, $champs, $statut, $postdate);
335        }
336        */
337}
338
339// Ci dessous, fonctions dépréciées gardées pour rétro-compatibilité
340
341/**
342 * Enregistre une modification d'une commande
343 *
344 * @deprecated Alias de 'commande_modifier' pour rétro-compatibilité
345 * @uses commande_modifier()
346 *
347 * @param int $id_commande
348 *     Identifiant de la commande
349 * @param array $c
350 *     Couples des champs/valeurs modifiées
351 * @return mixed|string
352 */
353function revision_commande($id_commande, $c=false) {
354        return commande_modifier($id_commande, $c);
355}
356
357/**
358 * Crée une nouvelle commande
359 *
360 * @deprecated Alias de 'commande_inserer' pour rétro-compatibilité
361 * @uses commande_inserer()
362 *
363 * @param array $champs
364 *     Couples des champs/valeurs par défaut
365 * @return
366 */
367function commande_insert($champs=array()){
368        return commande_inserer(null,$champs);
369}
370
371/**
372 * Appelle les fonctions de modification d'une commande
373 *
374 * @deprecated Alias de 'commande_modifier' pour rétro-compatibilité
375 * @uses commande_modifier()
376 *
377 * @param int $id_commande
378 *     Identifiant de la commande
379 * @param array|null $set
380 *     Couples des champs/valeurs à modifier
381 * @return
382 */
383function commande_set($id_commande, $set=null){
384        return commande_modifier($id_commande, $set);
385}
386
387/**
388 * Modifie des éléments à part que sont l'auteur, la date, le statut
389 *
390 * @deprecated Alias de 'commande_instituer' pour rétro-compatibilité
391 * @uses commande_instituer()
392 *
393 * @param int $id_commande
394 *     Identifiant de la commande
395 * @param array $c
396 *     Couples des champs/valeurs à modifier
397 * @param bool $calcul_details
398 *     (?) Inutilisé
399 * @return
400 */
401function instituer_commande($id_commande, $c, $calcul_details=true){
402        return commande_instituer($id_commande, $c, $calcul_details);
403}
404
405?>
Note: See TracBrowser for help on using the repository browser.