PHPDoc, variable pas initialisee, coquille dans nom de variable
[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 = "";
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         $campagne = _request('id_souscription_campagne');
94
95         $erreurs = formulaires_editer_objet_verifier('souscription', 'new',
96                 array('courriel',
97                         'montant',
98                         'id_souscription_campagne'));
99
100         if (!$id_souscription_campagne || intval($id_souscription_campagne)!=intval($campagne)){
101                 $erreurs['message_erreur'] = "Campagne invalide";
102         }
103
104         $campagne = sql_fetsel(array("type_objectif", "configuration_specifique", "type_saisie", "montants"),
105                 "spip_souscription_campagnes", "id_souscription_campagne=$id_souscription_campagne");
106
107         $type_campagne = $campagne['type_objectif'];
108
109         /* Le champ 'type' (hidden) doit être le même que celui défini dans
110          * la campagne. */
111         if (_request('type_souscription')!=$type_campagne)
112                 $erreurs['message_erreur'] = "Type de souscription invalide : " . _request('type_souscription');
113
114         if (!verifier_campagne($id_souscription_campagne, $type_campagne)){
115                 $erreurs['message_erreur'] = "La campagne à laquelle est associée cette souscription est invalide";
116         }
117
118
119         if (_request('recu_fiscal') || $type_campagne=="adhesion"){
120                 foreach (array('prenom', 'nom', 'adresse', 'code_postal', 'ville', 'pays') as $obligatoire){
121                         if (!_request($obligatoire)){
122                                 if ($type_campagne=="adhesion"){
123                                         $erreurs[$obligatoire] = "Ce champ est obligatoire pour les adhésions";
124                                 } else {
125                                         $erreurs[$obligatoire] = 'Ce champ est obligatoire (reçu fiscal demandé)';
126                                 }
127                         }
128                 }
129         }
130
131         if ($e = _request('courriel') AND !email_valide($e))
132                 $erreurs['courriel'] = _T('form_prop_indiquer_email');
133
134         if ($e = _request('pays')){
135                 $ret = sql_select('nom', 'spip_pays', "code='${e}'");
136
137                 if (sql_count($ret)!=1)
138                         $erreurs['pays'] = "Pays invalide";
139
140                 /* Le code postal n'est vérifié que si on est dans le cas de la France */
141                 elseif ($e = _request('pays') AND $e=="FR") {
142                         if ($e = _request('code_postal') AND !preg_match("/^(2[ABab]|0[1-9]|[1-9][0-9])[0-9]{3}$/", $e)){
143                                 $erreurs['code_postal'] = "Code postal invalide";
144                         }
145                 }
146         }
147
148         if ($e = _request('telephone') AND !preg_match("/^[0-9\+ \.]+$/", $e)){
149                 $erreurs['telephone'] = "Numéro de téléphone incorrect";
150         }
151
152         /* Vérification du montant. Si la campagne est configurée pour
153          * utiliser une configuration spécifique, alors, il faut vérifier
154          * avec les montants de la campagne. Autrement, il faut utiliser les
155          * paramètres globaux.
156          */
157         if ($e = _request('montant')){
158                 if (!(ctype_digit($e)))
159                         $erreurs['montant'] = "Montant invalide";
160                 else {
161                         if ($campagne['configuration_specifique']!=='on'){
162                                 $montant_type = lire_config("souscription/{$type_campagne}_type_saisie", 'input');
163                                 $montant_datas = lire_config("souscription/${$type_campagne}_montants", array());
164                         } else {
165                                 $montant_type = $campagne['type_saisie'];
166                                 $montant_datas = montants_str2array($campagne['montants']);
167                         }
168
169                         /* On ne vérifie strictement la valeur du montant que si on
170                          * n'utilise pas le type de saisie « entrée libre » (input) pour
171                          * le montant. */
172                         if (($montant_type!="input") AND !array_key_exists($e, $montant_datas))
173                                 $erreurs['montant'] = "Le montant spécifié est invalide" . var_export($campagne, true);
174                 }
175         }
176
177         if (count($erreurs)>0){
178                 $erreurs['message_erreur'] = "Le formulaire contient des erreurs";
179         }
180
181         return $erreurs;
182 }
183
184 /**
185  * Chargement du formulaire d'édition de souscription
186  *
187  * Déclarer les champs postés et y intégrer les valeurs par défaut
188  *
189  * @uses formulaires_editer_objet_charger()
190  *
191  * @param int$id_souscription_campagne
192  *     Identifiant de la campagne de souscription
193  * @return array
194  *     Retours des traitements
195  */
196 function formulaires_souscription_traiter_dist($id_souscription_campagne){
197         $lier_trad = 0;
198         $config_fonc = '';
199         $row = array();
200         $hidden = '';
201         $retour = '';
202
203         set_request("id_souscription_campagne",$id_souscription_campagne);
204
205         $ret = formulaires_editer_objet_traiter('souscription',
206                 'new',
207                 '',
208                 $lier_trad,
209                 $retour,
210                 $config_fonc,
211                 $row,
212                 $hidden);
213
214         $redirect = "";
215         $row = sql_fetsel("transaction_hash,id_transaction",
216                 "spip_transactions LEFT JOIN spip_souscriptions USING(id_transaction)",
217                 "id_souscription=" . $ret['id_souscription']);
218
219         if (!$row){
220                 spip_log(sprintf("Erreur lors de la création de la transaction liée à la souscription [%s].", $ret['id_souscription']), "souscription");
221                 $ret['message_erreur'] = "Echec creation de la transaction";
222         } else {
223                 spip_log(sprintf("La souscription [%s], associée à la transaction [%s] a bien été crée.", $ret['id_souscription'], $row['id_transaction']), "souscription");
224                 $hash = $row['transaction_hash'];
225                 $id_transaction = $row['id_transaction'];
226                 $redirect = generer_url_public("payer-acte", "id_transaction=$id_transaction&transaction_hash=$hash", false, false);
227                 $ret['redirect'] = $redirect;
228         }
229
230         return $ret;
231 }
232
233 function verifier_campagne($id_souscription_campagne, $type_souscription = null){
234         /* FIXME: vérifier que la campagne a bien le bon statut (ouverte, fermée, terminée, etc.) */
235
236         $campagne = sql_fetsel(array('type_objectif', 'objectif_initial', 'objectif', 'objectif_limiter'),
237                 'spip_souscription_campagnes', 'id_souscription_campagne=' . sql_quote(intval($id_souscription_campagne)));
238
239         /* La campagne doit exister */
240         if (!count($campagne['type_objectif']))
241                 return false;
242
243         elseif ($type_souscription!=null && $campagne['type_objectif']!=$type_souscription)
244                 return false;
245
246         /* Si la campagne doit être fermée lorsque l'objectif est atteint,
247          * alors on bloque. */
248         elseif ($campagne['objectif_limiter'] &&
249                 calcul_avancement_campagne($id_souscription_campagne, $campagne['type_objectif'], $campagne['objectif_initial'])>=$campagne['objectif']
250         )
251                 return false;
252
253         return true;
254 }