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

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

Oubli de correction d'ordre des arguments dans l'appel a la fonction commandes_reference dont on a changé la signature (Chourak)

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