perso.php 23.4 KB
Newer Older
1
<?php
2
namespace Controller;
3
4
5
6

use LQDN\Command\AddressCreateCommand;
use LQDN\Command\AddressDeleteCommand;
use LQDN\Command\AddressUpdateCommand;
Okhin's avatar
Okhin committed
7
8
9
10
11
use LQDN\Command\CounterpartCreateCommand;
use LQDN\Command\CounterpartDeleteCommand;
use LQDN\Command\UserUpdateCumulCommand;
use LQDN\Command\UserUpdateTotalCommand;
use LQDN\Command\UserCreateCommand;
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

class Perso extends Controller
{
    /*
    Page principale de l'administration personnelle
     */
    public function beforeRoute($f3, $args)
    {
        parent::beforeRoute($f3, $args);
        $f3->clear('SESSION.form_visible');
    }

    public function show($f3, $args)
    {
        if (!$f3->exists('SESSION.user')) {
            $f3->reroute('/login');
        }
        $this->get_infos($f3, $args);
        $this->get_contreparties($f3);
        $this->get_dons($f3);
        $this->get_recurrents($f3);
33
        $this->compute_history($f3);
Okhin's avatar
Okhin committed
34
        if ($f3->exists('GET.validate')) {
35
36
37
38
39
            $f3->set('modal_counterparts', '1');
            $f3->clear('GET.validate');
        } else {
            $f3->set('modal_counterparts', '0');
        };
40
41
42
43
44
45
46
        $f3->set('block_content', 'user/perso.html');
    }

    public function get_infos($f3, $args)
    {
        // Chargement des informations de l'utilisateur
        $db = $f3->get('DB');
Okhin's avatar
Okhin committed
47
48
49
        $user = $f3->get('container')['user_finder']->findById($f3->get('SESSION.id'));
        $f3->set('infos', $user);
        $result = $db->query("SELECT id, pdf, decimale FROM dons WHERE user_id='".$user['id']."' and pdf!='' ");
50
        $pdfs = array();
51
        foreach ($result->fetchAll(\PDO::FETCH_ASSOC) as $row) {
52
53
            $pdfs[$row['pdf']] = $row;
        }
Okhin's avatar
Okhin committed
54
        $addresse = $f3->get('container')['address_finder']->findByUserId((int) $user['id']);
Okhin's avatar
Okhin committed
55
        $f3->set('adresse', $addresse);
56
57
58
59
60
61
        $f3->set('pdfs', $pdfs);
    }

    public function get_contreparties($f3)
    {
        // Chargement des contreparties de l'utilisateur
Okhin's avatar
Okhin committed
62
63
        $contreparties = $f3->get('container')['counterpart_finder']->findByUserId((int) $f3->get('SESSION.id'));
        $f3->set('contreparties', $contreparties);
64
65
66
67
68
69
    }

    public function get_dons($f3)
    {
        // Chargement des dons de l'utilisateur
        $db = $f3->get('DB');
Okhin's avatar
Okhin committed
70
        $dons = $f3->get('container')['donation_finder']->findByUserId((int) $f3->get('SESSION.id'));
Okhin's avatar
Okhin committed
71
72
        $dons = array_filter($dons, function ($don) {
            return in_array((int) $don['status'], [1, 4]);
Okhin's avatar
Okhin committed
73
74
        });
        $f3->set('dons', $dons);
75
76
77
78
79
80
    }

    public function get_recurrents($f3)
    {
        // Chargement des abonnements de l'utilisateur
        $db = $f3->get('DB');
Okhin's avatar
Okhin committed
81
82
83
84
85
        $dons = $f3->get('container')['donation_finder']->findByUserId((int) $f3->get('SESSION.id'));
        $dons = array_filter($dons, function ($don) {
            return in_array((int) $don['status'], [101, 102]);
        });
        $f3->set('dons_recurrents', $dons);
86
87
    }

88
89
90
91
92
93
94
95
96
97
    public function compute_history($f3)
    {
        $history = array();
        $history = array_merge($f3->get('dons'), $f3->get('dons_recurrents'));
        usort($history, function ($a, $b) {
            return strtotime($a['datec']) - strtotime($b['datec']);
        });
        $f3->set('historique', $history);
    }

98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
    public function login($f3, $args)
    {
        $f3->set('form_visible', 'login');

        if ($f3->get('action')=='renew_password') {
            // Renouvellement de mot de passe
            $f3->clear('form_visible');
            $this->renew_password($f3);
            $f3->reroute('/');
        } elseif ($f3->get('action')=='create_account') {
            // Création d'un compte utilisateur
            $f3->clear('form_visible');
            $this->create_user($f3);
        } elseif ($f3->get('email')) {
            // Tentative de connexion
            // We should use auth module from Fat Free
            $db = $f3->get('DB');
115
            $mapper = new \DB\SQL\Mapper($f3->get('DB'), 'users');
116
            $auth = new \Auth($mapper, array('id' => 'email', 'pw' => 'hash'));
117
            $email = \Utils::asl($f3->get('email'));
118
119
120
121
122
123
124
            $hash = hash('sha256', $f3->get('password'));
            $login = $auth->login($email, $hash);

            // As we're login with email, not for id, we need to get it
            if ($login) {
                // We want to retrieve the associated user
                $result = $db->query("SELECT id, email FROM users WHERE email='".$email."'");
125
126
                $id = $result->fetch(\PDO::FETCH_ASSOC)['id'];
                $email = $result->fetch(\PDO::FETCH_ASSOC)['email'];
127
128
129
130
131
132
                $f3->set('SESSION.id', $id);
                $f3->set('SESSION.email', $email);
                $f3->set('SESSION.user', true);
                $f3->clear('form_visible');
                $f3->set('block_content', 'user/perso.html');
            } else {
Okhin's avatar
WIP    
Okhin committed
133
                $f3->push('SESSION.error', _("Mauvais identifiant ou mot de passe."));
134
135
136
137
                Campaign::show($f3, $args);
                return;
            }
        } else {
Okhin's avatar
WIP    
Okhin committed
138
            $f3->push('SESSION.error', _("Merci de renseigner une adresse mail."));
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
            Campaign::show($f3, $args);
            return;
        }
        Campaign::show($f3, $args);
    }

    public function logout($f3, $args)
    {
        $f3->clear('SESSION');
        $f3->reroute('/');
    }

    public function renew_password($f3)
    {
        if ($f3->get('email')!='') {
            // On vérifie que l'adresse mail existe
            $db = $f3->get('DB');
156
157
            $result = $db->query("SELECT email FROM users WHERE email='".\Utils::asl($f3->get('email'))."';");
            $row = $result->fetch(\PDO::FETCH_ASSOC);
158
159
            if ($row['email']!='') {
                // On régénère un mot de passe
160
                $pass = \Utils::generate_password();
161
162
163
                // On ne conserve que le mot de passe haché
                $hash = hash('sha256', $pass);
                // On le sauve en base de données
164
                $query = "UPDATE users SET hash='".$hash."' WHERE email='".\Utils::asl($f3->get('email'))."';";
165
166
167
168
                $db->query($query);

                // On le renvoie par email
                // On utilise le système SMTP de fat free
Guinness's avatar
Guinness committed
169
                $mailer = new \SMTP(SMTP_HOST, SMTP_PORT, SMTP_SECURITY, SMTP_USER, SMTP_PW);
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
                $mailer->set('From', $f3->get('mail.from'));
                $mailer->set('To', $f3->get('email'));
                $mailer->set('Subject', _("Renouvellement de mot de passe"));

                $mailer->set('FromName', $f3->get('mail.fromName'));
                $mailer->set('CharSet', "UTF-8");

                // Préparation du texte du mail par morceaux
                $text = _("Bonjour,

                    Un nouveau mot de passe vient de vous être attribuer pour pouvoir vous connecter à votre page d'administration pour choisir vos contreparties, et nous indiquer vos coordonnées :
                    %%URL_ADMIN%%
                    Identifiant : votre adresse email
                    Mot de passe : %%PASSWORD%%

                    Encore merci pour votre soutien,
                    Toute l'équipe de La Quadrature du Net
                    ")."\n\n";
                // Création de l'url d'administration
189
                $admin_url = "https://don.laquadrature.net/perso";
190
191
192
193
194
195
196
197
198
                // Remplacement des variables par leurs valeurs
                $fields = array(
                    "PASSWORD" => $pass,
                    "URL_ADMIN" => $admin_url
                );
                foreach ($fields as $k=>$v) {
                    $text = str_replace("%%".$k."%%", $v, $text);
                }
                if ($mailer->send($text)) {
Okhin's avatar
WIP    
Okhin committed
199
                    $f3->push('SESSION.message', _("Nouveau mot de passe envoyé par mail."));
200
                } else {
201
                    $logger = new \Log('mail.log');
Okhin's avatar
WIP    
Okhin committed
202
                    $f3->push('SESSION.error', _("Oops."));
203
204
205
                    $logger->write($mailer->log());
                }
            } else {
Okhin's avatar
WIP    
Okhin committed
206
                $f3->push('SESSION.error', _("Vous n'avez pas encore de compte, merci de faire un don pour cela."));
207
208
            }
        } else {
Okhin's avatar
WIP    
Okhin committed
209
            $f3->push('SESSION.error', _("Merci de renseigner une adresse mail."));
210
211
212
213
214
215
216
217
        }
    }

    public function create_user($f3)
    {
        if ($f3->get('email')!='') {
            // On vérifie que l'adresse mail n'existe pas
            $db = $f3->get('DB');
Okhin's avatar
Okhin committed
218
            $user = $f3->get('container')['user_finder']->findByEmail($f3->get('email'));
219
            $total = 0;
220
            $cumul = 0;
221
222

            if ($user['email']!=$f3->get('email')) {
223
224
225
226
                $hash = hash('sha256', $f3->get('password'));
                // On recherche le montant cumulé jusqu'à présent. On fait la somme depuis le
                // premier janvier 2013 en se basant sur l'adresse mail
                $res = $db->query("SELECT sum(dons.somme) as somme FROM dons INNER JOIN users WHERE dons.user_id = users.id AND users.email='".$f3->get('email')."' and dons.status in (1, 4, 102) and dons.datec>'2013-01-01';");
227
                $total = $res->fetch(\PDO::FETCH_ASSOC);
228
                $total = (int) $total['somme'];
229
                // Création de l'utilisateur
Okhin's avatar
WIP    
Okhin committed
230
                $f3->push('SESSION.message', _("Votre compte a bien été créé, merci."));
231
232
                $f3->get('container')['command_handler']->handle(new UserCreateCommand($f3->get('email'), $hash, '', $total, $total));
                $f3->reroute('/perso');
233
            } else {
Okhin's avatar
WIP    
Okhin committed
234
                $f3->push('SESSION.error', _("Vous avez déjà un compte associé à cette adresse mail, merci de demander un nouveau mot de passe."));
235
236
            }
        } else {
Okhin's avatar
WIP    
Okhin committed
237
            $f3->push('SESSION.error', _("Merci de renseigner une adresse mail."));
238
239
240
241
242
243
244
245
246
247
        }
    }

    public function infos($f3, $args)
    {
        $db = $f3->get('DB');

        if ($f3->exists('SESSION.id')) {
            // Let's firts check that both the password match
            if ($f3->get('password') != $f3->get('password_confirmation')) {
248
                $f3->set('SESSION.error', _("Les mots de passe ne correspondent pas"));
249
            } else {
250
251
                $sql = "UPDATE users SET email='".\Utils::asl($f3->get('email'))."',
                    pseudo='".\Utils::asl($f3->get('pseudo'))."'";
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
                if ($f3->get('password') != '') {
                    $hash = hash('sha256', $f3->get('password'));
                    $sql .= ", hash='".$hash."'";
                }
                $sql .= " WHERE id='".$f3->get('SESSION.id')."'";
                $db->query($sql);
            }
        } else {
            $f3->error(401);
        }
        $f3->set('SESSION.msg', _('Informations personnelles modifiées.'));
        $this->show($f3, $args);
    }

    public function adresses($f3, $args)
    {
        if (!$f3->exists('SESSION.id')) {
            $f3->error('401');
        }

        switch ($f3->get('action')) {
        case 'ADD':
            try {
                $f3->get('container')['command_handler']->handle(
                    new AddressCreateCommand(
277
278
279
280
281
282
283
                        \Utils::asl($f3->get('SESSION.id')),
                        \Utils::asl($f3->get('nom')),
                        \Utils::asl($f3->get('adresse')),
                        \Utils::asl($f3->get('adresse2')),
                        \Utils::asl($f3->get('codepostal')),
                        \Utils::asl($f3->get('ville')),
                        \Utils::asl($f3->get('pays')),
Okhin's avatar
Okhin committed
284
                        \Utils::asl($f3->get('state'))
285
286
287
288
289
290
                    )
                );
            } catch (AddressAlreadyExistsException $e) {
                $f3->set("error", _("Cette adresse existe déjà."));
                $f3->error('403');
            }
Okhin's avatar
WIP    
Okhin committed
291
            $f3->push('SESSION.message', _("Adresse ajoutée à votre profil"));
292
293
294
295
296
            break;
        case 'DELETE':
            try {
                $f3->get('container')['command_handler']->handle(
                    new AddressDeleteCommand(
297
298
                        \Utils::asl($f3->get('id')),
                        \Utils::asl($f3->get('SESSION.id'))
299
300
301
                    )
                );
            } catch (AddressUsedException $e) {
Okhin's avatar
Okhin committed
302
                $f3->set("error", _("Cette adresse est utilisée pour une de vos contreparties"));
303
304
                $f3->error('403');
            };
Okhin's avatar
WIP    
Okhin committed
305
            $f3->push('SESSION.message', _("Adresse supprimée de votre profil"));
306
307
308
309
310
311
312
313
314
315
            break;
        }
        $f3->reroute('/perso');
    }

    public function add_contrepartie($f3, $args)
    {
        if (!$f3->exists('SESSION.user')) {
            $f3->error('401');
        }
Okhin's avatar
Okhin committed
316

317
        $db = $f3->get('DB');
Okhin's avatar
Okhin committed
318
        $user = $f3->get('container')['user_finder']->findById($f3->get('SESSION.id'));
319
320
321
322

        // Récupération des valeurs du formulaire
        $adresse_id = $f3->get('adresse_id');
        $quoi = $f3->get('quoi');
323
        $commentaire = $f3->get('commentaire');
324
325
326
327
328
329
330
331
332
333
334
335
336
337
        $valeur = 0;
        $piplome_id = intval(substr($f3->get('piplome_id'), 0, strpos($f3->get('piplome_id'), '_')));
        $taille = intval($f3->get('taille'));
        $taille_h = intval($f3->get('taille_h'));
        switch ($quoi) {
        case 'piplome':
            $valeur = 30;
            break;
        case 'pibag':
            $valeur = 50;
            break;
        case 'pishirt':
            $valeur = 100;
            break;
Okhin's avatar
Okhin committed
338
        case 'hoodie':
339
340
341
342
343
            $valeur = 250;
            break;
        }

        // Ajout d'une demande de contrepartie pour chaque contrepartie
Okhin's avatar
Okhin committed
344
        if ((int) $user['cumul'] >= $valeur) {
345
            $parent = $f3->get('container')['counterpart_finder']->getNextInsertedId();
346
            switch ($quoi) {
Okhin's avatar
Okhin committed
347
            case 'hoodie':
348
349
350
351
352
353
354
355
356
357
                $f3->get('container')['command_handler']->handle(new CounterpartCreateCommand(\Utils::asl($adresse_id), $f3->get('SESSION.id'), 'hoodie', \Utils::asl($taille_h), 1, date("Y-m-d H:i:s"), \Utils::asl($commentaire), $parent));
                // no break
            case 'pishirt':
                $f3->get('container')['command_handler']->handle(new CounterpartCreateCommand(\Utils::asl($adresse_id), $f3->get('SESSION.id'), 'pishirt', \Utils::asl($taille), 1, date("Y-m-d H:i:s"), \Utils::asl($commentaire), $parent));
                // no break
            case 'pibag':
                $f3->get('container')['command_handler']->handle(new CounterpartCreateCommand(\Utils::asl($adresse_id), $f3->get('SESSION.id'), 'pibag', '', 1, date("Y-m-d H:i:s"), \Utils::asl($commentaire), $parent));
                // no break
            case 'piplome':
                $f3->get('container')['command_handler']->handle(new CounterpartCreateCommand(\Utils::asl($adresse_id), $f3->get('SESSION.id'), 'piplome', \Utils::asl($piplome_id), 1, date("Y-m-d H:i:s"), \Utils::asl($commentaire), $parent));
Okhin's avatar
Okhin committed
358
                break;
359
            }
Okhin's avatar
Okhin committed
360
361
            // Puis diminution du cumul de la valeur des contreparties
            $f3->get('container')['command_handler']->handle(new UserUpdateCumulCommand($user['id'], $user['cumul'] - $valeur));
Okhin's avatar
WIP    
Okhin committed
362
            $f3->push('SESSION.message', _("Merci, vos contreparties seront envoyées dès que possible !".$valeur));
Okhin's avatar
Okhin committed
363
        } else {
Okhin's avatar
WIP    
Okhin committed
364
            $f3->push('SESSION.error', _("Désolé, mais vous n'avez pas cumulé suffisament de dons pour avoir un ").$quoi);
Okhin's avatar
Okhin committed
365
            $f3->clear('SESSION.message');
366
        }
367
        $f3->reroute('/perso');
368
369
370
371
372
373
374
375
    }

    public function receipt($f3, $params)
    {
        if (!$f3->exists('SESSION.user')) {
            $f3->reroute('/login');
        }
        // Variables utiles
376
        $logger = new \Log('receipt.log');
377
378
379
        $db = $f3->get('DB');
        $id = $params['id'];
        $command = "pdftk ";
380
        $args = " ../www/receipt.pdf fill_form ../tmp/".$id.".xfdf output ../tmp/".$id.".pdf flatten dont_ask";
381
382
383
        $logger->write($command . " " .$args);

        // Vérification que le don appartient bien à l'utilisateur connecté
Okhin's avatar
Okhin committed
384
385
386
387
388
389
390
391
392
393
394
        $query="SELECT dons.datec,
            dons.somme,
            adresses.nom as pseudo,
            adresses.adresse,
            adresses.adresse2,
            adresses.codepostal,
            adresses.ville,
            adresses.pays
            FROM dons
            INNER JOIN users ON users.id = dons.user_id
            LEFT OUTER JOIN adresses ON adresses.user_id = users.id
Okhin's avatar
Okhin committed
395
            WHERE users.id=".$f3->get('SESSION.id')." AND dons.id=".\Utils::asl($id).";";
396
397
        $result = $db->query($query);
        $logger->write($query);
398
        $don = $result->fetch(\PDO::FETCH_ASSOC);
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
        if (!$don) {
            $f3->reroute("/perso");
        }

        // Création du fichier datas
        $name = $don['pseudo'];
        $address = $name;
        if ($don['adresse']!='') {
            $address .= "\n" . $don['adresse'];
            $address .= "\n" . $don['adresse2'];
            $address .= "\n" . $don['codepostal'] . " " . $don['ville'];
        }
        $amount = $don['somme'];
        $monthes = array(
            '01'=>_('Janvier'),
            '02'=>_('Février'),
            '03'=>_('Mars'),
            '04'=>_('Avril'),
            '05'=>_('Mai'),
            '06'=>_('Juin'),
            '07'=>_('Juillet'),
            '08'=>_('Août'),
            '09'=>_('Septembre'),
            '10'=>_('Octobre'),
            '11'=>_('Novembre'),
            '12'=>_('Décembre')
        );
        $date = substr($don['datec'], 8, 2)." ".$monthes[substr($don['datec'], 5, 2)]." ".substr($don['datec'], 0, 4);
        $content = '<?xml version="1.0" encoding="UTF-8"?>
Okhin's avatar
Okhin committed
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
            <xfdf xmlns="http://ns.adobe.com/xfdf/" xml:space="preserve">
            <fields>
            <field name="address">
            <value>'.$address.'</value>
            </field>
            <field name="donor">
            <value>'.$name.'</value>
            </field>
            <field name="content">
            <value>Reçu le '.$date.' un don de '.$amount.' euros de la part de '.$name.'.</value>
            </field>
            <field name="date">
            <value>Fait à Paris le '.$date.'</value>
            </field>
            </fields>
            </xfdf>';
444
        $fp = fopen("../tmp/".$id.".xfdf", "w");
445
446
447
448
449
450
451
452
453
454
        if ($fp) {
            fputs($fp, $content);
            fclose($fp);
        }

        // Création du reçu
        $output = array();
        exec($command.$args, $output);

        // Suppression du fichier datas
455
        unlink("../tmp/".$id.".xfdf");
456
457

        // Renvoi du fichier pdf au client
458
        $fp = fopen("../tmp/".$id.".pdf", "rb");
459
        if ($fp) {
460
            $fsize = filesize("../tmp/".$id.".pdf");
461
462
463
464
465
466
467
468
469
470
471
472
473
            header("Content-Type: application/pdf");
            header("Content-Disposition: attachment; filename=\"".$id.".pdf\"");
            header("Content-Length: $fsize");
            while (!feof($fp)) {
                $buffer = fread($fp, 2048);
                echo $buffer;
            }
            fclose($fp);
        } else {
            $f3->reroute('/perso');
        }

        // Suppression du fichier reçu
474
        unlink("../tmp/".$id.".pdf");
475
476
477
478
479
480
481
        die();
    }

    public function cancel($f3, $params)
    {
        $db = $f3->get('DB');
        $result = $db->query("SELECT identifier, user_id from identifiers where identifier like '".$params['id']."'");
482
        $result = $result->fetch(\PDO::FETCH_ASSOC);
483
484
485
486
487
488
489
        if ($result) {
            $identifier = $result['identifier'];
            $user_id = $result['user_id'];
        } else {
            $f3->reroute('/perso');
        }
        // Commande customerCancel
490
        $date = new \DateTime('now', new \DateTimeZone("UTC"));
491
492
493
494
495
496
497
498
499
500
501
502
        $parameters = array(
            "shopId"    => SITE_ID,
            "cardIdent" => $identifier,
            "date"      => $date->format("Ymd"),
            "ctxMode"   => CTX_MODE,
        );
        // Calcul de la signature
        $signature = "";
        foreach ($params as $key=>$value) {
            $signature .= $value."+";
        }
        $signature .= CERTIFICATE;
Guinness's avatar
Guinness committed
503
504
        $signature = base64_encode(hash_hmac('sha256', $signature, CERTIFICATE, true));
        #$signature = sha1($signature);
505
        $parameters["wsSignature"] = $signature;
506
        $client = new \SoapClient("https://paiement.systempay.fr/vads-ws/ident-v2.1?wsdl");
507
508
509
        $result = $client->customerCancel($parameters);
        // Let's add a 103 don at 0€ to keep track of them
        $f3->query("INSERT INTO dons SET
Okhin's avatar
Okhin committed
510
511
512
513
514
515
            status = '103',
            datec = NOW(),
            somme = 0,
            user_id = '".$user_id."',
            identifier = '".$identifier."',
            cumul = 0;");
Okhin's avatar
WIP    
Okhin committed
516
        $f3->push('SESSION.message', _("Don récurrent supprimé."));
517
518
519
520
521
522
523
524
525
526
527
528
        $f3->reroute('/perso');
    }

    public function renew($f3, $params)
    {
        // TODO: à écrire, finaliser, tester, mettre en prod :o)
/*
    // Variables utiles
    $id = $params['id'];

    // Cas S2 de mise à jour des infos de la CB
    $target = "https://paiement.systempay.fr/vads-payment/";
529
    $transaction_date = new \DateTime('now', new \DateTimeZone("UTC"));
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
    $params = array(
        // Champs obligatoires
        "vads_trans_date" => $transaction_date->format("YmdHis"),
        "vads_site_id" => SITE_ID,
        "vads_action_mode" => "INTERACTIVE",
        "vads_ctx_mode" => CTX_MODE,
        // Autres codes possibles (page 16)
        "vads_trans_id" => str_repeat("0",6-strlen($id)).$id,
        "vads_version" => "V2",
        // Champs facultatifs
        "vads_language" => $f3->get('lang'),
        "vads_order_id" => $id,
        "vads_url_cancel" => ROOTURL,
        "vads_url_check" => "",
        "vads_url_error" => ROOTURL,
        "vads_url_referral" => ROOTURL,
        "vads_url_refused" => ROOTURL,
        "vads_url_return" => ROOTURL,
        "vads_url_success" => ROOTURL,
        "vads_validation_mode" => "0",
        "vads_shop_name" => "La Quadrature du Net",
        "vads_shop_url" => ROOTURL
    );
    if ($f3->get('monthly')) {
        // En cas de paiement récurrent, on doit créer un compte carte si ce n'est pas déjà fait
        $result = mysql_fetch_array(mysql_query("SELECT identifier from users where email='".$email."'"));
        $identifier = "";
        if ($result) {
        $identifier = $result['identifier'];
        }
        if ($identifier=="") {
        // Si l'utilisateur n'existe pas déjà, on lui crée un identifiant
        $identifier = $id . "_" . substr($email,0,strpos($email,'@'));
        $params["vads_identifier"] = substr($identifier, 0, 50); // Pas plus de 50 caractères
        $params["vads_page_action"] = "REGISTER_SUBSCRIBE";
        $params["vads_cust_email"] = $email; // Email du porteur
        } else {
        // Sinon, on instaure juste une récurrence en utilisant l'identifiant déjà connu
        $params["vads_page_action"] = "SUBSCRIBE";
        $params["vads_identifier"] = $identifier;
        }
        $params["vads_sub_effect_date"] = date("Ymd"); // Date d'effet à ce jour
        $params["vads_sub_amount"] = $f3->get('sum')*100;
        $params["vads_sub_currency"] = "978";
        $params["vads_sub_desc"] = "RRULE:FREQ=MONTHLY;BYMONTHDAY=7"; // Tous les 7 du mois
    } else {
        // En cas de paiement ponctuel, le montant est donné différemment
        $params["vads_page_action"] = "PAYMENT";
        $params["vads_amount"] = $f3->get('sum')*100;
        $params["vads_currency"] = "978";
        $params["vads_payment_config"] = "SINGLE";
    }
    // Calcul de la signature
    ksort($params);
    $signature = "";
    foreach ($params as $key=>$value) {
        $signature .= $value."+";
    }
    $signature .= CERTIFICATE;
    $signature = sha1($signature);

    $f3->set('target', $target);
    $f3->set('params', $params);
    $f3->set('signature', $signature);
 */
    }
};