From: Olivier Tétard Date: Sun, 6 Oct 2013 17:23:12 +0000 (+0200) Subject: Ajout de la possibilité de configurer les montants par campagne. X-Git-Url: http://olivier.miskin.fr/git/?a=commitdiff_plain;h=358292a9e2c26a1dde6d624cb2744f131f13e504;p=spip_souscriptions.git Ajout de la possibilité de configurer les montants par campagne. Il est désormais possible d'activer une configuration spécifique pour les campagnes, qui si elle est activée permet de configurer le type de saisie et les montants. --- diff --git a/base/souscription.php b/base/souscription.php index b8ac65d..055dd53 100644 --- a/base/souscription.php +++ b/base/souscription.php @@ -85,6 +85,9 @@ function souscription_declarer_tables_objets_sql($tables) { "objectif_limiter" => "varchar(3) NOT NULL DEFAULT ''", "titre" => "text NOT NULL DEFAULT ''", "texte" => "longtext NOT NULL DEFAULT ''", + "configuration_specifique" => "varchar(3) NOT NULL DEFAULT ''", + "type_saisie" => "varchar(255) NOT NULL DEFAULT ''", + "montants" => "text NOT NULL DEFAULT ''", "statut" => "varchar(255) NOT NULL DEFAULT 0", "date" => "datetime NOT NULL DEFAULT '0000-00-00 00:00:00'", "maj" => "TIMESTAMP" @@ -94,8 +97,8 @@ function souscription_declarer_tables_objets_sql($tables) { ), 'titre' => "titre AS titre, '' AS lang", 'date' => "date", - 'champs_editables' => array('objectif', 'titre', 'texte', 'objectif_initial', 'type_objectif', 'objectif_limiter'), - 'champs_versionnes' => array('objectif', 'titre', 'texte', 'objectif_initial', 'type_objectif', 'objectif_limiter'), + 'champs_editables' => array('objectif', 'titre', 'texte', 'objectif_initial', 'type_objectif', 'objectif_limiter', 'configuration_specifique', 'type_saisie', 'montants'), + 'champs_versionnes' => array('objectif', 'titre', 'texte', 'objectif_initial', 'type_objectif', 'objectif_limiter', 'configuration_specifique', 'type_saisie', 'montants'), 'rechercher_champs' => array(), ); diff --git a/formulaires/editer_souscription_campagne.php b/formulaires/editer_souscription_campagne.php index d1b5695..000ac5c 100644 --- a/formulaires/editer_souscription_campagne.php +++ b/formulaires/editer_souscription_campagne.php @@ -87,6 +87,33 @@ function formulaires_editer_souscription_campagne_charger_dist($id_souscription_ 'label' => _T('souscription:label_objectif_limite'))) ), ), + array('saisie' => 'oui_non', + 'options' => array('nom' => 'configuration_specifique', + 'label' => _T('souscription:label_configuration_specifique'), + 'explication' => _T('souscription:explication_configuration_specifique'), + 'defaut' => $defaut_objectif) + ), + array('saisie' => 'fieldset', + 'options' => array('nom' => 'groupe_configuration_specifique', + 'label' => _T('souscription:label_objectif_groupe'), + 'afficher_si' => '@configuration_specifique@ == "on"'), + 'saisies' => array(array('saisie' => 'selection', + 'options' => array('nom' => 'type_saisie', + 'label' => _T('souscription:label_type_saisie'), + 'explication' => _T('souscription:explication_type_saisie'), + 'datas' => array("input" => _T("souscription:configurer_type_saisie_input"), + "radio" => _T("souscription:configurer_type_saisie_radio"), + "selection" => _T("souscription:configurer_type_saisie_selection")), + 'defaut' => 'input') + ), + array('saisie' => 'textarea', + 'options' => array('nom' => 'montants', + 'label' => _T('souscription:label_montants'), + 'explication' => _T('souscription:explication_montants'), + 'afficher_si' => '@type_saisie@ == "radio" || @type_saisie@ == "selection"', + 'rows' => 4)) + ), + ), array('saisie' => 'textarea', 'options' => array('nom' => 'texte', 'label' => _T('souscription:label_description'), @@ -142,6 +169,25 @@ function formulaires_editer_souscription_campagne_verifier_dist($id_souscription $ret['limite'] = _T("souscription:message_nok_limite_valeur"); } + /* Si une guration spécifique est demandée, alors on vérifie les + * valeurs 'type_saisie' et 'montants' (si on a demandé un bouton + * radio ou une selection). Autrement, les données sont supprimées + * dans la fonction traiter. */ + if(_request('configuration_specifique')) { + $type_saisie = _request('type_saisie'); + if(!$type_saisie || !in_array($type_saisie, array('radio', 'selection', 'input'))) + $ret['type_saisie'] = _T('souscription:message_nok_type_saisie'); + + $montants = _request('montants'); + if($type_saisie && in_array($type_saisie, array('radio', 'selection'))) { + if(!$montants || !is_string($montants)) + $ret['montants'] = _T('souscription:message_nok_montants'); + + elseif(!montants_str2array($montants)) + $ret['montants'] = _T('souscription:message_nok_montants'); + } + } + return $ret; } @@ -160,6 +206,11 @@ function formulaires_editer_souscription_campagne_traiter_dist($id_souscription_ set_request('objectif_limiter', ''); } + if(_request('configuration_specifique' != "on")) { + set_request('type_saisie', ''); + set_request('montants', ''); + } + $res = formulaires_editer_objet_traiter('souscription_campagne', $id_souscription_campagne, '', diff --git a/formulaires/souscription.php b/formulaires/souscription.php index 82363b5..8ef91f3 100644 --- a/formulaires/souscription.php +++ b/formulaires/souscription.php @@ -70,16 +70,25 @@ function formulaires_souscription_charger_dist($id_souscription_campagne) { return false; /* Récupération des information à propos de la campagne */ - $type = sql_getfetsel("type_objectif", - "spip_souscription_campagnes", - "id_souscription_campagne=$id_souscription_campagne"); + $campagne = sql_fetsel(array("type_objectif", "configuration_specifique", "type_saisie", "montants"), + "spip_souscription_campagnes", + "id_souscription_campagne=$id_souscription_campagne"); + + $type = $campagne['type_objectif']; $recu_fiscal = ""; if($type == "adhesion") $recu_fiscal = "on"; - $montant_type = lire_config("souscription/{$type}_type_saisie", 'input'); - $montant_datas = lire_config("souscription/${type}_montants", array()); + if($campagne['configuration_specifique'] !== 'on') { + $montant_type = lire_config("souscription/{$type}_type_saisie", 'input'); + $montant_datas = lire_config("souscription/${type}_montants", array()); + } + else { + $montant_type = $campagne['type_saisie']; + $montant_datas = montants_str2array($campagne['montants']); + } + $montant_label = lire_config("souscription/${type}_montants_label", _T('souscription:label_montant')); $montant_explication = nl2br(lire_config("souscription/${type}_montants_description")); @@ -134,33 +143,29 @@ function formulaires_souscription_verifier_dist($id_souscription_campagne) { 'montant', 'id_souscription_campagne')); - if(!verifier_campagne($id_souscription_campagne)) { - $erreurs['message_erreur'] = "La campagne à laquelle est associée cette souscription est invalide"; - } - if(!$id_souscription_campagne || intval($id_souscription_campagne) != intval($campagne)) { $erreurs['message_erreur'] = "Campagne invalide"; } - /* La campagne doit être valide (définie dans la base) et doit - * accepter les dons. */ - $type = sql_getfetsel("type_objectif", - "spip_souscription_campagnes", - "id_souscription_campagne=$id_souscription_campagne"); + $campagne = sql_fetsel(array("type_objectif", "configuration_specifique", "type_saisie", "montants"), + "spip_souscription_campagnes", "id_souscription_campagne=$id_souscription_campagne"); - if(!$type || !in_array($type, array("don", "adhesion"))) - $erreurs['message_erreur'] = "Type de souscription invalide"; + $type_campagne = $campagne['type_objectif']; /* Le champ 'type' (hidden) doit être le même que celui défini dans * la campagne. */ - if(_request('type_souscription') != $type) - $erreurs['message_erreur'] = "Type de souscription invalide: " . _request('type_souscription'); + if(_request('type_souscription') != $type_campagne) + $erreurs['message_erreur'] = "Type de souscription invalide : " . _request('type_souscription'); + + if(!verifier_campagne($id_souscription_campagne, $type_campagne)) { + $erreurs['message_erreur'] = "La campagne à laquelle est associée cette souscription est invalide"; + } - if(_request('recu_fiscal') || $type == "adhesion") { + if(_request('recu_fiscal') || $type_campagne == "adhesion") { foreach(array('prenom', 'nom', 'adresse', 'code_postal', 'ville', 'pays') as $obligatoire) { if(!_request($obligatoire)) { - if($type == "adhesion") { + if($type_campagne == "adhesion") { $erreurs[$obligatoire] = "Ce champ est obligatoire pour les adhésions"; } else { @@ -191,18 +196,29 @@ function formulaires_souscription_verifier_dist($id_souscription_campagne) { $erreurs['telephone'] = "Numéro de téléphone incorrect"; } - + /* Vérification du montant. Si la campagne est configurée pour + * utiliser une configuration spécifique, alors, il faut vérifier + * avec les montants de la campagne. Autrement, il faut utiliser les + * paramètres globaux. + */ if ($e = _request('montant')) { if(!(ctype_digit($e))) $erreurs['montant'] = "Montant invalide"; else { - $type_saisie = lire_config("souscription/${type}_type_saisie"); + if($campagne['configuration_specifique'] !== 'on') { + $montant_type = lire_config("souscription/{$type}_type_saisie", 'input'); + $montant_datas = lire_config("souscription/${type}_montants", array()); + } + else { + $montant_type = $campagne['type_saisie']; + $montant_datas = montants_str2array($campagne['montants']); + } /* On ne vérifie strictement la valeur du montant que si on * n'utilise pas le type de saisie « entrée libre » (input) pour * le montant. */ - if(($type_saisie != "input") AND !array_key_exists($e, lire_config("souscription/${type}_montants"))) - $erreurs['montant'] = "Le montant spécifié est invalide"; + if(($montant_type != "input") AND !array_key_exists($e, $montant_datas)) + $erreurs['montant'] = "Le montant spécifié est invalide" . var_export($campagne, true); } } @@ -270,15 +286,24 @@ function formulaires_souscription_traiter_dist($id_souscription_campagne) { return $ret; } -function verifier_campagne($id_souscription_campagne) { +function verifier_campagne($id_souscription_campagne, $type_souscription=null) { /* FIXME: vérifier que la campagne a bien le bon statut (ouverte, fermée, terminée, etc.) */ - /* Vérification de l'existance de la *campagne*, de son *statut* et de la *concordance du type* */ - if(intval($id_souscription_campagne) - AND $t = sql_getfetsel('type_objectif', 'spip_souscription_campagnes', 'id_souscription_campagne='.intval($id_souscription_campagne))) - { - return true; - } + $campagne = sql_fetsel(array('type_objectif', 'objectif_initial', 'objectif', 'objectif_limiter'), + 'spip_souscription_campagnes', 'id_souscription_campagne='.sql_quote(intval($id_souscription_campagne))); + + /* La campagne doit exister */ + if(!count($campagne['type_objectif'])) + return false; + + elseif($type_souscription != null && $campagne['type_objectif'] != $type_souscription) + return false; + + /* Si la campagne doit être fermée lorsque l'objectif est atteint, + * alors on bloque. */ + elseif($campagne['objectif_limiter'] && + calcul_avancement_campagne($id_souscription_campagne, $campagne['type_objectif'], $campagne['objectif_initial']) >= $campagne['objectif']) + return false; - return false; + return true; } diff --git a/lang/souscription_fr.php b/lang/souscription_fr.php index 569b740..db79de8 100644 --- a/lang/souscription_fr.php +++ b/lang/souscription_fr.php @@ -39,6 +39,8 @@ $GLOBALS[$GLOBALS['idx_lang']] = array( 'explication_type_objectif' => 'Type de l\'objectif (influe le montant de l\'objectif)', 'explication_bloc_fiscal_adhesion' => "Les informations suivantes sont nécessaire pour nous permettre de réaliser l'adhésion :", 'explication_bloc_fiscal_don' => "Ces informations sont nécessaire en vue de l'établissement du reçu permettant une déduction fiscale qui vous sera envoyé", + 'explication_configuration_specifique' => "Permet de configurer des niveaux spécifiques d'adhésion ou de dons pour cette campagne", + 'explication_type_saisie' => "Mode d'affichage des différents montants possibles", // I 'icone_creer_souscription' => 'Créer une souscription', @@ -108,6 +110,7 @@ $GLOBALS[$GLOBALS['idx_lang']] = array( 'label_objectif_initial' => 'Niveau initial de la campagne', 'label_objectif_groupe' => 'Definition de l\'objectif de la campagne', 'label_objectif_limite' => 'Fermer la campagne si l\'objectif est atteint', + 'label_configuration_specifique' => 'Activer une configuration spécifique', 'label_pays' => 'Pays', 'label_prenom' => 'Prénom', 'label_recu_fiscal' => 'Recevoir un reçu fiscal', diff --git a/paquet.xml b/paquet.xml index 58191b2..9512c9d 100644 --- a/paquet.xml +++ b/paquet.xml @@ -5,7 +5,7 @@ compatibilite="[3.0.5;3.0.*]" logo="" documentation="" - schema="0.4"> + schema="0.5"> Souscription Olivier Tétard diff --git a/souscription_administrations.php b/souscription_administrations.php index abb75dc..8e10fc0 100644 --- a/souscription_administrations.php +++ b/souscription_administrations.php @@ -36,6 +36,10 @@ function souscription_upgrade($nom_meta_base_version, $version_cible) { $maj['0.4'] = array(array('sql_alter', "TABLE spip_souscription_campagnes ADD objectif_limiter varchar(3) NOT NULL DEFAULT ''")); + $maj['0.5'] = array(array('sql_alter', "TABLE spip_souscription_campagnes ADD configuration_specifique varchar(3) NOT NULL DEFAULT ''"), + array('sql_alter', "TABLE spip_souscription_campagnes ADD type_saisie varchar(255) NOT NULL DEFAULT ''"), + array('sql_alter', "TABLE spip_souscription_campagnes ADD montants text NOT NULL DEFAULT ''")); + include_spip('base/upgrade'); maj_plugin($nom_meta_base_version, $version_cible, $maj); }