bugfix sur validation du formulaire : on ne poste plus id_souscription_campagne ni...
[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 /**
20  * Chargement du formulaire d'édition de souscription
21  *
22  * Déclarer les champs postés et y intégrer les valeurs par défaut
23  *
24  * @uses formulaires_editer_objet_charger()
25  *
26  * @param int$id_souscription_campagne
27  *     Identifiant de la campagne de souscription
28  * @return array
29  *     Environnement du formulaire
30  */
31 function formulaires_souscription_charger_dist($id_souscription_campagne){
32
33         if (!verifier_campagne($id_souscription_campagne))
34                 return false;
35
36         /* Récupération des information à propos de la campagne */
37         $campagne = sql_fetsel(array("type_objectif", "configuration_specifique", "type_saisie", "montants"),
38                 "spip_souscription_campagnes",
39                 "id_souscription_campagne=$id_souscription_campagne");
40
41         $type = $campagne['type_objectif'];
42
43         $recu_fiscal = "off";
44         if ($type=="adhesion")
45                 $recu_fiscal = "on";
46
47         if ($campagne['configuration_specifique']!=='on'){
48                 $montant_type = lire_config("souscription/{$type}_type_saisie", 'input');
49                 $montant_datas = lire_config("souscription/${type}_montants", array());
50         } else {
51                 $montant_type = $campagne['type_saisie'];
52                 $montant_datas = $campagne['montants'];
53         }
54
55         $montant_label = lire_config("souscription/${type}_montants_label", _T('souscription:label_montant'));
56         $montant_explication = nl2br(lire_config("souscription/${type}_montants_description"));
57
58         return array('montant' => '',
59                 'courriel' => '',
60                 'recu_fiscal' => $recu_fiscal,
61                 'envoyer_info' => 'on',
62                 'informer_comite_local' => 'on',
63                 'prenom' => '',
64                 'nom' => '',
65                 'adresse' => '',
66                 'code_postal' => '',
67                 'ville' => '',
68                 'pays' => 'FR',
69                 'telephone' => '',
70                 'id_souscription_campagne' => $id_souscription_campagne,
71                 'type_souscription' => $type,
72                 '_montant_datas' => montants_str2array($montant_datas),
73                 'montant_type' => $montant_type,
74                 'montant_label' => $montant_label,
75                 'montant_explication' => $montant_explication
76         );
77 }
78
79
80 /**
81  * Chargement du formulaire d'édition de souscription
82  *
83  * Déclarer les champs postés et y intégrer les valeurs par défaut
84  *
85  * @uses formulaires_editer_objet_charger()
86  *
87  * @param int$id_souscription_campagne
88  *     Identifiant de la campagne de souscription
89  * @return array
90  *     Tableau des erreurs
91  */
92 function formulaires_souscription_verifier_dist($id_souscription_campagne){
93
94         $erreurs = formulaires_editer_objet_verifier('souscription', 'new', array('courriel','montant'));
95
96         $campagne = sql_fetsel(array("type_objectif", "configuration_specifique", "type_saisie", "montants"),
97                 "spip_souscription_campagnes", "id_souscription_campagne=".intval($id_souscription_campagne));
98
99         $type_campagne = $campagne['type_objectif'];
100
101         if (!verifier_campagne($id_souscription_campagne, $type_campagne)){
102                 $erreurs['message_erreur'] = "La campagne à laquelle est associée cette souscription est invalide";
103         }
104
105
106         if (_request('recu_fiscal')==="on" || $type_campagne=="adhesion"){
107                 foreach (array('prenom', 'nom', 'adresse', 'code_postal', 'ville', 'pays') as $obligatoire){
108                         if (!_request($obligatoire)){
109                                 if ($type_campagne=="adhesion"){
110                                         $erreurs[$obligatoire] = "Ce champ est obligatoire pour les adhésions";
111                                 } else {
112                                         $erreurs[$obligatoire] = 'Ce champ est obligatoire (reçu fiscal demandé)';
113                                 }
114                         }
115                 }
116         }
117
118         if ($e = _request('courriel') AND !email_valide($e))
119                 $erreurs['courriel'] = _T('form_prop_indiquer_email');
120
121         if ($e = _request('pays')){
122                 $ret = sql_select('nom', 'spip_pays', "code='${e}'");
123
124                 if (sql_count($ret)!=1)
125                         $erreurs['pays'] = "Pays invalide";
126
127                 /* Le code postal n'est vérifié que si on est dans le cas de la France */
128                 elseif ($e = _request('pays') AND $e=="FR") {
129                         if ($e = _request('code_postal') AND !preg_match("/^(2[ABab]|0[1-9]|[1-9][0-9])[0-9]{3}$/", $e)){
130                                 $erreurs['code_postal'] = "Code postal invalide";
131                         }
132                 }
133         }
134
135         if ($e = _request('telephone') AND !preg_match("/^[0-9\+ \.]+$/", $e)){
136                 $erreurs['telephone'] = "Numéro de téléphone incorrect";
137         }
138
139         /* Vérification du montant. Si la campagne est configurée pour
140          * utiliser une configuration spécifique, alors, il faut vérifier
141          * avec les montants de la campagne. Autrement, il faut utiliser les
142          * paramètres globaux.
143          */
144         if ($e = _request('montant')){
145                 if (!(ctype_digit($e)))
146                         $erreurs['montant'] = "Montant invalide";
147                 else {
148                         if ($campagne['configuration_specifique']!=='on'){
149                                 $montant_type = lire_config("souscription/{$type_campagne}_type_saisie", 'input');
150                                 $montant_datas = lire_config("souscription/{$type_campagne}_montants", array());
151                         } else {
152                                 $montant_type = $campagne['type_saisie'];
153                                 $montant_datas = montants_str2array($campagne['montants']);
154                         }
155
156                         /* On ne vérifie strictement la valeur du montant que si on
157                          * n'utilise pas le type de saisie « entrée libre » (input) pour
158                          * le montant. */
159                         if (($montant_type!="input") AND !array_key_exists($e, $montant_datas))
160                                 $erreurs['montant'] = "Le montant spécifié est invalide" . var_export($campagne, true);
161                 }
162         }
163
164         if (count($erreurs)>0){
165                 $erreurs['message_erreur'] = "Le formulaire contient des erreurs";
166         }
167
168         return $erreurs;
169 }
170
171 /**
172  * Chargement du formulaire d'édition de souscription
173  *
174  * Déclarer les champs postés et y intégrer les valeurs par défaut
175  *
176  * @uses formulaires_editer_objet_charger()
177  *
178  * @param int$id_souscription_campagne
179  *     Identifiant de la campagne de souscription
180  * @return array
181  *     Retours des traitements
182  */
183 function formulaires_souscription_traiter_dist($id_souscription_campagne){
184         $lier_trad = 0;
185         $config_fonc = '';
186         $row = array();
187         $hidden = '';
188         $retour = '';
189
190         $campagne = sql_fetsel(array("type_objectif", "configuration_specifique", "type_saisie", "montants"),
191                 "spip_souscription_campagnes", "id_souscription_campagne=".intval($id_souscription_campagne));
192         set_request("id_souscription_campagne",$id_souscription_campagne);
193         set_request('type_souscription',$campagne['type_objectif']);
194
195         $ret = formulaires_editer_objet_traiter('souscription',
196                 'new',
197                 '',
198                 $lier_trad,
199                 $retour,
200                 $config_fonc,
201                 $row,
202                 $hidden);
203
204         $redirect = "";
205         $row = sql_fetsel("transaction_hash,id_transaction",
206                 "spip_transactions LEFT JOIN spip_souscriptions USING(id_transaction)",
207                 "id_souscription=" . $ret['id_souscription']);
208
209         if (!$row){
210                 spip_log(sprintf("Erreur lors de la création de la transaction liée à la souscription [%s].", $ret['id_souscription']), "souscription");
211                 $ret['message_erreur'] = "Echec creation de la transaction";
212         } else {
213                 spip_log(sprintf("La souscription [%s], associée à la transaction [%s] a bien été crée.", $ret['id_souscription'], $row['id_transaction']), "souscription");
214                 $hash = $row['transaction_hash'];
215                 $id_transaction = $row['id_transaction'];
216                 $redirect = generer_url_public("payer-acte", "id_transaction=$id_transaction&transaction_hash=$hash", false, false);
217                 $ret['redirect'] = $redirect;
218         }
219
220         return $ret;
221 }
222
223 function verifier_campagne($id_souscription_campagne, $type_souscription = null){
224         /* FIXME: vérifier que la campagne a bien le bon statut (ouverte, fermée, terminée, etc.) */
225
226         $campagne = sql_fetsel(array('type_objectif', 'objectif_initial', 'objectif', 'objectif_limiter'),
227                 'spip_souscription_campagnes', 'id_souscription_campagne=' . sql_quote(intval($id_souscription_campagne)));
228
229         /* La campagne doit exister */
230         if (!count($campagne['type_objectif']))
231                 return false;
232
233         elseif ($type_souscription!=null && $campagne['type_objectif']!=$type_souscription)
234                 return false;
235
236         /* Si la campagne doit être fermée lorsque l'objectif est atteint,
237          * alors on bloque. */
238         elseif ($campagne['objectif_limiter'] &&
239                 calcul_avancement_campagne($id_souscription_campagne, $campagne['type_objectif'], $campagne['objectif_initial'])>=$campagne['objectif']
240         )
241                 return false;
242
243         return true;
244 }