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