Ajout de la possibilité de configurer les montants par campagne.
[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   }
87   else {
88     $montant_type = $campagne['type_saisie'];
89     $montant_datas = montants_str2array($campagne['montants']);
90   }
91
92   $montant_label = lire_config("souscription/${type}_montants_label", _T('souscription:label_montant'));
93   $montant_explication = nl2br(lire_config("souscription/${type}_montants_description"));
94
95   return array('montant' => '',
96                'courriel' => '',
97                'recu_fiscal' => $recu_fiscal,
98                'envoyer_info' => 'on',
99                'informer_comite_local' => 'on',
100                'prenom' => '',
101                'nom' => '',
102                'adresse' => '',
103                'code_postal' => '',
104                'ville' => '',
105                'pays' => 'FR',
106                'telephone' => '',
107                'id_souscription_campagne' => $id_souscription_campagne,
108                'type_souscription' => $type,
109                'montant_datas' => $montant_datas,
110                'montant_type' => $montant_type,
111                'montant_label' => $montant_label,
112                'montant_explication' => $montant_explication
113                );
114 }
115
116 /**
117  * Vérifications du formulaire d'édition de souscription
118  *
119  * Vérifier les champs postés et signaler d'éventuelles erreurs
120  *
121  * @uses formulaires_editer_objet_verifier()
122  *
123  * @param int|string $id_souscription
124  *     Identifiant du souscription. 'new' pour un nouveau souscription.
125  * @param string $retour
126  *     URL de redirection après le traitement
127  * @param int $lier_trad
128  *     Identifiant éventuel d'un souscription source d'une traduction
129  * @param string $config_fonc
130  *     Nom de la fonction ajoutant des configurations particulières au formulaire
131  * @param array $row
132  *     Valeurs de la ligne SQL du souscription, si connu
133  * @param string $hidden
134  *     Contenu HTML ajouté en même temps que les champs cachés du formulaire.
135  * @return array
136  *     Tableau des erreurs
137  */
138 function formulaires_souscription_verifier_dist($id_souscription_campagne) {
139   $campagne = _request('id_souscription_campagne');
140
141   $erreurs = formulaires_editer_objet_verifier('souscription', 'new',
142                                                array('courriel',
143                                                      'montant',
144                                                      'id_souscription_campagne'));
145
146   if(!$id_souscription_campagne || intval($id_souscription_campagne) != intval($campagne)) {
147       $erreurs['message_erreur'] = "Campagne invalide";
148   }
149
150   $campagne = sql_fetsel(array("type_objectif", "configuration_specifique", "type_saisie", "montants"),
151                          "spip_souscription_campagnes", "id_souscription_campagne=$id_souscription_campagne");
152
153   $type_campagne = $campagne['type_objectif'];
154
155   /* Le champ 'type' (hidden) doit être le même que celui défini dans
156    * la campagne. */
157   if(_request('type_souscription') != $type_campagne)
158     $erreurs['message_erreur'] = "Type de souscription invalide : " . _request('type_souscription');
159
160   if(!verifier_campagne($id_souscription_campagne, $type_campagne)) {
161     $erreurs['message_erreur'] = "La campagne à laquelle est associée cette souscription est invalide";
162   }
163
164
165   if(_request('recu_fiscal') || $type_campagne == "adhesion") {
166     foreach(array('prenom', 'nom', 'adresse', 'code_postal', 'ville', 'pays') as $obligatoire) {
167       if(!_request($obligatoire)) {
168         if($type_campagne == "adhesion") {
169           $erreurs[$obligatoire] = "Ce champ est obligatoire pour les adhésions";
170         }
171         else {
172           $erreurs[$obligatoire] = 'Ce champ est obligatoire (reçu fiscal demandé)';
173         }
174       }
175     }
176   }
177
178   if ($e = _request('courriel') AND !email_valide($e))
179     $erreurs['courriel'] = _T('form_prop_indiquer_email');
180
181   if($e = _request('pays')) {
182     $ret = sql_select('nom', 'spip_pays', "code='${e}'");
183
184     if(sql_count($ret) != 1)
185       $erreurs['pays'] = "Pays invalide";
186
187     /* Le code postal n'est vérifié que si on est dans le cas de la France */
188     elseif($e = _request('pays') AND $e == "FR") {
189       if ($e = _request('code_postal') AND !preg_match("/^(2[ABab]|0[1-9]|[1-9][0-9])[0-9]{3}$/", $e)) {
190         $erreurs['code_postal'] = "Code postal invalide";
191       }
192     }
193   }
194
195   if ($e = _request('telephone') AND !preg_match("/^[0-9\+ \.]+$/", $e)) {
196     $erreurs['telephone'] = "Numéro de téléphone incorrect";
197   }
198
199   /* Vérification du montant. Si la campagne est configurée pour
200    * utiliser une configuration spécifique, alors, il faut vérifier
201    * avec les montants de la campagne. Autrement, il faut utiliser les
202    * paramètres globaux.
203    */
204   if ($e = _request('montant')) {
205     if(!(ctype_digit($e)))
206       $erreurs['montant'] = "Montant invalide";
207     else {
208       if($campagne['configuration_specifique'] !== 'on') {
209         $montant_type = lire_config("souscription/{$type}_type_saisie", 'input');
210         $montant_datas = lire_config("souscription/${type}_montants", array());
211       }
212       else {
213         $montant_type = $campagne['type_saisie'];
214         $montant_datas = montants_str2array($campagne['montants']);
215       }
216
217       /* On ne vérifie strictement la valeur du montant que si on
218        * n'utilise pas le type de saisie « entrée libre » (input) pour
219        * le montant. */
220       if(($montant_type != "input") AND !array_key_exists($e, $montant_datas))
221         $erreurs['montant'] = "Le montant spécifié est invalide" . var_export($campagne, true);
222     }
223   }
224
225   if(count($erreurs) > 0) {
226     $erreurs['message_erreur'] = "Le formulaire contient des erreurs";
227   }
228
229   return $erreurs;
230 }
231
232 /**
233  * Traitement du formulaire d'édition de souscription
234  *
235  * Traiter les champs postés
236  *
237  * @uses formulaires_editer_objet_traiter()
238  *
239  * @param int|string $id_souscription
240  *     Identifiant du souscription. 'new' pour un nouveau souscription.
241  * @param string $retour
242  *     URL de redirection après le traitement
243  * @param int $lier_trad
244  *     Identifiant éventuel d'un souscription source d'une traduction
245  * @param string $config_fonc
246  *     Nom de la fonction ajoutant des configurations particulières au formulaire
247  * @param array $row
248  *     Valeurs de la ligne SQL du souscription, si connu
249  * @param string $hidden
250  *     Contenu HTML ajouté en même temps que les champs cachés du formulaire.
251  * @return array
252  *     Retours des traitements
253  */
254 function formulaires_souscription_traiter_dist($id_souscription_campagne) {
255   $lier_trad=0;
256   $config_fonc='';
257   $row=array();
258   $hidden='';
259
260   $ret = formulaires_editer_objet_traiter('souscription',
261                                           'new',
262                                           '',
263                                           $lier_trad,
264                                           $retour,
265                                           $config_fonc,
266                                           $row,
267                                           $hidden);
268
269   $redirect = "";
270   $row = sql_fetsel("transaction_hash,id_transaction",
271                     "spip_transactions LEFT JOIN spip_souscriptions USING(id_transaction)",
272                     "id_souscription=".$ret['id_souscription']);
273
274   if(!$row) {
275     spip_log(sprintf("Erreur lors de la création de la transaction liée à la souscription [%s].", $ret['id_souscription']), "souscription");
276     $ret['message_erreur'] = "Echec creation de la transaction";
277   }
278   else {
279     spip_log(sprintf("La souscription [%s], associée à la transaction [%s] a bien été crée.", $ret['id_souscription'], $row['id_transaction']), "souscription");
280     $hash = $row['transaction_hash'];
281     $id_transaction = $row['id_transaction'];
282     $redirect = generer_url_public("payer-acte", "id_transaction=$id_transaction&transaction_hash=$hash", false, false);
283     $ret['redirect'] = $redirect;
284   }
285
286   return $ret;
287 }
288
289 function verifier_campagne($id_souscription_campagne, $type_souscription=null) {
290   /* FIXME: vérifier que la campagne a bien le bon statut (ouverte, fermée, terminée, etc.) */
291
292   $campagne = sql_fetsel(array('type_objectif', 'objectif_initial', 'objectif', 'objectif_limiter'),
293                          'spip_souscription_campagnes', 'id_souscription_campagne='.sql_quote(intval($id_souscription_campagne)));
294
295   /* La campagne doit exister */
296   if(!count($campagne['type_objectif']))
297     return false;
298
299   elseif($type_souscription != null && $campagne['type_objectif'] != $type_souscription)
300     return false;
301
302   /* Si la campagne doit être fermée lorsque l'objectif est atteint,
303    * alors on bloque. */
304   elseif($campagne['objectif_limiter'] &&
305          calcul_avancement_campagne($id_souscription_campagne, $campagne['type_objectif'], $campagne['objectif_initial']) >= $campagne['objectif'])
306     return false;
307
308   return true;
309 }