6d269c591f523e1f84b46f6cfaed4d2a13772a90
[spip_souscriptions.git] / formulaires / souscription.php
1 <?php
2 /**
3  * Gestion du formulaire de d'édition de souscription
4  *
5  * @plugin     Souscription
6  * @copyright  2013
7  * @author     Olivier Tétard
8  * @licence    GNU/GPL
9  * @package    SPIP\Souscription\Formulaires
10  */
11
12 if (!defined('_ECRIRE_INC_VERSION')) return;
13
14 include_spip('inc/actions');
15 include_spip('inc/editer');
16 include_spip('inc/config');
17
18 /**
19  * Identifier le formulaire en faisant abstraction des paramètres qui ne représentent pas l'objet edité
20  *
21  * @param int|string $id_souscription
22  *     Identifiant du souscription. 'new' pour un nouveau souscription.
23  * @param string $retour
24  *     URL de redirection après le traitement
25  * @param int $lier_trad
26  *     Identifiant éventuel d'un souscription source d'une traduction
27  * @param string $config_fonc
28  *     Nom de la fonction ajoutant des configurations particulières au formulaire
29  * @param array $row
30  *     Valeurs de la ligne SQL du souscription, si connu
31  * @param string $hidden
32  *     Contenu HTML ajouté en même temps que les champs cachés du formulaire.
33  * @return string
34  *     Hash du formulaire
35  */
36 function formulaires_souscription_identifier_dist($id_souscription = 'new',
37                                                   $retour = '',
38                                                   $lier_trad = 0,
39                                                   $config_fonc = '',
40                                                   $row = array(),
41                                                   $hidden = ''){
42         return serialize(array(intval($id_souscription)));
43 }
44
45 /**
46  * Chargement du formulaire d'édition de souscription
47  *
48  * Déclarer les champs postés et y intégrer les valeurs par défaut
49  *
50  * @uses formulaires_editer_objet_charger()
51  *
52  * @param int|string $id_souscription
53  *     Identifiant du souscription. 'new' pour un nouveau souscription.
54  * @param string $retour
55  *     URL de redirection après le traitement
56  * @param int $lier_trad
57  *     Identifiant éventuel d'un souscription source d'une traduction
58  * @param string $config_fonc
59  *     Nom de la fonction ajoutant des configurations particulières au formulaire
60  * @param array $row
61  *     Valeurs de la ligne SQL du souscription, si connu
62  * @param string $hidden
63  *     Contenu HTML ajouté en même temps que les champs cachés du formulaire.
64  * @return array
65  *     Environnement du formulaire
66  */
67 function formulaires_souscription_charger_dist($id_souscription_campagne){
68
69         if (!verifier_campagne($id_souscription_campagne))
70                 return false;
71
72         /* Récupération des information à propos de la campagne */
73         $campagne = sql_fetsel(array("type_objectif", "configuration_specifique", "type_saisie", "montants"),
74                 "spip_souscription_campagnes",
75                 "id_souscription_campagne=$id_souscription_campagne");
76
77         $type = $campagne['type_objectif'];
78
79         $recu_fiscal = "";
80         if ($type=="adhesion")
81                 $recu_fiscal = "on";
82
83         if ($campagne['configuration_specifique']!=='on'){
84                 $montant_type = lire_config("souscription/{$type}_type_saisie", 'input');
85                 $montant_datas = lire_config("souscription/${type}_montants", array());
86         } else {
87                 $montant_type = $campagne['type_saisie'];
88                 $montant_datas = $campagne['montants'];
89         }
90
91         $montant_label = lire_config("souscription/${type}_montants_label", _T('souscription:label_montant'));
92         $montant_explication = nl2br(lire_config("souscription/${type}_montants_description"));
93
94         return array('montant' => '',
95                 'courriel' => '',
96                 'recu_fiscal' => $recu_fiscal,
97                 'envoyer_info' => 'on',
98                 'informer_comite_local' => 'on',
99                 'prenom' => '',
100                 'nom' => '',
101                 'adresse' => '',
102                 'code_postal' => '',
103                 'ville' => '',
104                 'pays' => 'FR',
105                 'telephone' => '',
106                 'id_souscription_campagne' => $id_souscription_campagne,
107                 'type_souscription' => $type,
108                 '_montant_datas' => montants_str2array($montant_datas),
109                 'montant_type' => $montant_type,
110                 'montant_label' => $montant_label,
111                 'montant_explication' => $montant_explication
112         );
113 }
114
115 /**
116  * Vérifications du formulaire d'édition de souscription
117  *
118  * Vérifier les champs postés et signaler d'éventuelles erreurs
119  *
120  * @uses formulaires_editer_objet_verifier()
121  *
122  * @param int|string $id_souscription
123  *     Identifiant du souscription. 'new' pour un nouveau souscription.
124  * @param string $retour
125  *     URL de redirection après le traitement
126  * @param int $lier_trad
127  *     Identifiant éventuel d'un souscription source d'une traduction
128  * @param string $config_fonc
129  *     Nom de la fonction ajoutant des configurations particulières au formulaire
130  * @param array $row
131  *     Valeurs de la ligne SQL du souscription, si connu
132  * @param string $hidden
133  *     Contenu HTML ajouté en même temps que les champs cachés du formulaire.
134  * @return array
135  *     Tableau des erreurs
136  */
137 function formulaires_souscription_verifier_dist($id_souscription_campagne){
138         $campagne = _request('id_souscription_campagne');
139
140         $erreurs = formulaires_editer_objet_verifier('souscription', 'new',
141                 array('courriel',
142                         'montant',
143                         'id_souscription_campagne'));
144
145         if (!$id_souscription_campagne || intval($id_souscription_campagne)!=intval($campagne)){
146                 $erreurs['message_erreur'] = "Campagne invalide";
147         }
148
149         $campagne = sql_fetsel(array("type_objectif", "configuration_specifique", "type_saisie", "montants"),
150                 "spip_souscription_campagnes", "id_souscription_campagne=$id_souscription_campagne");
151
152         $type_campagne = $campagne['type_objectif'];
153
154         /* Le champ 'type' (hidden) doit être le même que celui défini dans
155          * la campagne. */
156         if (_request('type_souscription')!=$type_campagne)
157                 $erreurs['message_erreur'] = "Type de souscription invalide : " . _request('type_souscription');
158
159         if (!verifier_campagne($id_souscription_campagne, $type_campagne)){
160                 $erreurs['message_erreur'] = "La campagne à laquelle est associée cette souscription est invalide";
161         }
162
163
164         if (_request('recu_fiscal') || $type_campagne=="adhesion"){
165                 foreach (array('prenom', 'nom', 'adresse', 'code_postal', 'ville', 'pays') as $obligatoire){
166                         if (!_request($obligatoire)){
167                                 if ($type_campagne=="adhesion"){
168                                         $erreurs[$obligatoire] = "Ce champ est obligatoire pour les adhésions";
169                                 } else {
170                                         $erreurs[$obligatoire] = 'Ce champ est obligatoire (reçu fiscal demandé)';
171                                 }
172                         }
173                 }
174         }
175
176         if ($e = _request('courriel') AND !email_valide($e))
177                 $erreurs['courriel'] = _T('form_prop_indiquer_email');
178
179         if ($e = _request('pays')){
180                 $ret = sql_select('nom', 'spip_pays', "code='${e}'");
181
182                 if (sql_count($ret)!=1)
183                         $erreurs['pays'] = "Pays invalide";
184
185                 /* Le code postal n'est vérifié que si on est dans le cas de la France */
186                 elseif ($e = _request('pays') AND $e=="FR") {
187                         if ($e = _request('code_postal') AND !preg_match("/^(2[ABab]|0[1-9]|[1-9][0-9])[0-9]{3}$/", $e)){
188                                 $erreurs['code_postal'] = "Code postal invalide";
189                         }
190                 }
191         }
192
193         if ($e = _request('telephone') AND !preg_match("/^[0-9\+ \.]+$/", $e)){
194                 $erreurs['telephone'] = "Numéro de téléphone incorrect";
195         }
196
197         /* Vérification du montant. Si la campagne est configurée pour
198          * utiliser une configuration spécifique, alors, il faut vérifier
199          * avec les montants de la campagne. Autrement, il faut utiliser les
200          * paramètres globaux.
201          */
202         if ($e = _request('montant')){
203                 if (!(ctype_digit($e)))
204                         $erreurs['montant'] = "Montant invalide";
205                 else {
206                         if ($campagne['configuration_specifique']!=='on'){
207                                 $montant_type = lire_config("souscription/{$type}_type_saisie", 'input');
208                                 $montant_datas = lire_config("souscription/${type}_montants", array());
209                         } else {
210                                 $montant_type = $campagne['type_saisie'];
211                                 $montant_datas = montants_str2array($campagne['montants']);
212                         }
213
214                         /* On ne vérifie strictement la valeur du montant que si on
215                          * n'utilise pas le type de saisie « entrée libre » (input) pour
216                          * le montant. */
217                         if (($montant_type!="input") AND !array_key_exists($e, $montant_datas))
218                                 $erreurs['montant'] = "Le montant spécifié est invalide" . var_export($campagne, true);
219                 }
220         }
221
222         if (count($erreurs)>0){
223                 $erreurs['message_erreur'] = "Le formulaire contient des erreurs";
224         }
225
226         return $erreurs;
227 }
228
229 /**
230  * Traitement du formulaire d'édition de souscription
231  *
232  * Traiter les champs postés
233  *
234  * @uses formulaires_editer_objet_traiter()
235  *
236  * @param int|string $id_souscription
237  *     Identifiant du souscription. 'new' pour un nouveau souscription.
238  * @param string $retour
239  *     URL de redirection après le traitement
240  * @param int $lier_trad
241  *     Identifiant éventuel d'un souscription source d'une traduction
242  * @param string $config_fonc
243  *     Nom de la fonction ajoutant des configurations particulières au formulaire
244  * @param array $row
245  *     Valeurs de la ligne SQL du souscription, si connu
246  * @param string $hidden
247  *     Contenu HTML ajouté en même temps que les champs cachés du formulaire.
248  * @return array
249  *     Retours des traitements
250  */
251 function formulaires_souscription_traiter_dist($id_souscription_campagne){
252         $lier_trad = 0;
253         $config_fonc = '';
254         $row = array();
255         $hidden = '';
256
257         $ret = formulaires_editer_objet_traiter('souscription',
258                 'new',
259                 '',
260                 $lier_trad,
261                 $retour,
262                 $config_fonc,
263                 $row,
264                 $hidden);
265
266         $redirect = "";
267         $row = sql_fetsel("transaction_hash,id_transaction",
268                 "spip_transactions LEFT JOIN spip_souscriptions USING(id_transaction)",
269                 "id_souscription=" . $ret['id_souscription']);
270
271         if (!$row){
272                 spip_log(sprintf("Erreur lors de la création de la transaction liée à la souscription [%s].", $ret['id_souscription']), "souscription");
273                 $ret['message_erreur'] = "Echec creation de la transaction";
274         } else {
275                 spip_log(sprintf("La souscription [%s], associée à la transaction [%s] a bien été crée.", $ret['id_souscription'], $row['id_transaction']), "souscription");
276                 $hash = $row['transaction_hash'];
277                 $id_transaction = $row['id_transaction'];
278                 $redirect = generer_url_public("payer-acte", "id_transaction=$id_transaction&transaction_hash=$hash", false, false);
279                 $ret['redirect'] = $redirect;
280         }
281
282         return $ret;
283 }
284
285 function verifier_campagne($id_souscription_campagne, $type_souscription = null){
286         /* FIXME: vérifier que la campagne a bien le bon statut (ouverte, fermée, terminée, etc.) */
287
288         $campagne = sql_fetsel(array('type_objectif', 'objectif_initial', 'objectif', 'objectif_limiter'),
289                 'spip_souscription_campagnes', 'id_souscription_campagne=' . sql_quote(intval($id_souscription_campagne)));
290
291         /* La campagne doit exister */
292         if (!count($campagne['type_objectif']))
293                 return false;
294
295         elseif ($type_souscription!=null && $campagne['type_objectif']!=$type_souscription)
296                 return false;
297
298         /* Si la campagne doit être fermée lorsque l'objectif est atteint,
299          * alors on bloque. */
300         elseif ($campagne['objectif_limiter'] &&
301                 calcul_avancement_campagne($id_souscription_campagne, $campagne['type_objectif'], $campagne['objectif_initial'])>=$campagne['objectif']
302         )
303                 return false;
304
305         return true;
306 }