Projet

Général

Profil

Actions

Evolution #1438

fermé

Add monthly membership

Ajouté par Manuel Her il y a plus de 4 ans. Mis à jour il y a 8 mois.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Catégorie:
Core
Version cible:
Début:
08/06/2020
Echéance:
% réalisé:

100%

Temps estimé:

Description

Bonjour,

Afin de fidéliser les adhérents, de plus en plus d'associations proposent la mensualisation.
Paypal propose ce service que j'ai utilisé/implémenté en dehors de Galette. J'utilise le plugin Paypal pour les callbacks IPN sans aucune modification (L'accès au formulaire classique est commenté dans le source).

En attendant que Galette propose cette fonctionnalité en interne, serait-il possible de poser la base de ce fonctionnement ?
L'essentiel est de pouvoir configurer des durées différentes pour une contribution (1, 2, 6, 12 mois, etc...)

Mon association souhaite pouvoir profiter des évolutions de galette sans devoir faire des diffs / patchs à chaque nouvelle version.

Je propose d'ajouter une durée d'extension à la configuration des types de contribution, qui se substitue aux paramètres des préférences pour le calcul de la fin d'adhésion.

Dans la table des types de contribution, on utiliserait 'cotis_extension' de cette façon :

-1: durée d'adhésion par défaut (config générale en année civile ou sur 12 mois)

0: pas de durée(c'est un Don)

1=>1 mois; 2=>2mois etc...

Qui peut le plus peut le moins. En stockant en entier il suffit de faire == 0 ou != 0 pour savoir si c'est un don ou non.

Le champ cotis_extension est très peu utilisé dans le source.

ça se résume à modifier 3 conditions ; par exemple :

->where(array('cotis_extension' => new Expression('true')))
par   - >where->notEqualTo('cotis_extension', 0)

cotis_extension changerait de tinyint(1) à tinyint(4) ;

Au moment de la mise à jour, il faudrait exécuter :

ALTER TABLE `galette_types_cotisation` CHANGE `cotis_extension` `cotis_extension` TINYINT(4) NOT NULL DEFAULT '0'; 
UPDATE `galette_types_cotisation` SET `cotis_extension`=-1 WHERE `cotis_extension`=1

Voici le code validé sur mon serveur de test :


diff -r -x '*.log' -x '*.rej' -x 'composer.*' '--exclude=data' '--exclude=plugins' '--exclude=vendor' galette/galette/lib/Galette/Entity/Contribution.php galette0941_avantmodif/galette/lib/Galette/Entity/Contribution.php
213a214,229
>         if ($preferences->pref_beg_membership != '') {
>             //case beginning of membership
>             list($j, $m) = explode('/', $preferences->pref_beg_membership);
>             $edate = new \DateTime($bdate->format('Y') . '-' . $m . '-' . $j);
>             while ($edate <= $bdate) {
>                 $edate->modify('+1 year');
>             }
> 
>             if ($preferences->pref_membership_offermonths > 0) {
>                 //count days until end of membership date
>                 $diff1 = (int)$bdate->diff($edate)->format('%a');
> 
>                 //count days beetween end of membership date and offered months
>                 $tdate = clone $edate;
>                 $tdate->modify('-' . $preferences->pref_membership_offermonths . ' month');
>                 $diff2 = (int)$edate->diff($tdate)->format('%a');
215,221c231,232
<         if ($preferences->pref_beg_membership != '') { //adhésion classique de date à date + 1 an 
<             if ($this->_type->extension==-1) //C'est une adhésion classique en année
<             {
<                 //case beginning of membership
<                 list($j, $m) = explode('/', $preferences->pref_beg_membership);
<                 $edate = new \DateTime($bdate->format('Y') . '-' . $m . '-' . $j);
<                 while ($edate <= $bdate) {
---
>                 //when number of days until end of membership is less than for offered months, it's free :)
>                 if ($diff1 <= $diff2) {
224,240d234
<     
<                 if ($preferences->pref_membership_offermonths > 0) {
<                     //count days until end of membership date
<                     $diff1 = (int)$bdate->diff($edate)->format('%a');
<     
<                     //count days beetween end of membership date and offered months
<                     $tdate = clone $edate;
<                     $tdate->modify('-' . $preferences->pref_membership_offermonths . ' month');
<                     $diff2 = (int)$edate->diff($tdate)->format('%a');
<     
<                     //when number of days until end of membership is less than for offered months, it's free :)
<                     if ($diff1 <= $diff2) {
<                         $edate->modify('+1 year');
<                     }
<                 }
<     
<                 $this->_end_date = $edate->format('Y-m-d');
242,248c236,238
<             else 
<             {
<                 $dext = new \DateInterval('P' . $this->_type->extension . 'M');
<                 $edate = $bdate->add($dext);
<                 $this->_end_date = $edate->format('Y-m-d');
<             }
<         } elseif ($preferences->pref_membership_ext != '') { //adhésion classique de date à date + N mois 
---
> 
>             $this->_end_date = $edate->format('Y-m-d');
>         } elseif ($preferences->pref_membership_ext != '') {
251,254c241
<                 if ($this->_type->extension==-1)
<                     $this->_extension = $preferences->pref_membership_ext;
<                 else
<                     $this->_extension = $this->_type->extension;
---
>                 $this->_extension = $preferences->pref_membership_ext;
534,535c521
<                 //->where(array('cotis_extension' => new Expression('true')))
<                 ->where->notEqualTo('cotis_extension', 0)
---
>                 ->where(array('cotis_extension' => new Expression('true')))
847,849c833
<             )->where->notEqualTo('cotis_extension', 0);
<             
<             /*->where(
---
>             )->where(
851c835
<             );*/
---
>             );
1255c1239
<                         if ($this->$rname->extension != 0) {//== 1) {
---
>                         if ($this->$rname->extension == 1) {
diff -r -x '*.log' -x '*.rej' -x 'composer.*' '--exclude=data' '--exclude=plugins' '--exclude=vendor' galette/galette/lib/Galette/Entity/ContributionsTypes.php galette0941_avantmodif/galette/lib/Galette/Entity/ContributionsTypes.php
130,131d129
<     
< 
diff -r -x '*.log' -x '*.rej' -x 'composer.*' '--exclude=data' '--exclude=plugins' '--exclude=vendor' galette/galette/lib/Galette/Entity/Entitled.php galette0941_avantmodif/galette/lib/Galette/Entity/Entitled.php
253,254c253
<                     //$select->where(array($this->fthird => new Expression('true')));
<                     $select->where->notEqualTo($this->fthird, 0);
---
>                     $select->where(array($this->fthird => new Expression('true')));
256,257c255
<                     //$select->where(array($this->fthird => new Expression('false')));
<                     $select->where->equalTo($this->fthird, 0);
---
>                     $select->where(array($this->fthird => new Expression('false')));
diff -r -x '*.log' -x '*.rej' -x 'composer.*' '--exclude=data' '--exclude=plugins' '--exclude=vendor' galette/galette/templates/default/editer_intitule.tpl galette0941_avantmodif/galette/templates/default/editer_intitule.tpl
28,38c28
<             
<                     <select name="{$field}">
<                         <option value="0" {if $entry->$field == 0}selected="selected"{/if}>{_T string="No"}</option>
<                         <option value="-1" {if $entry->$field == -1}selected="selected"{/if}>{_T string="By default"}</option>                        
<                         {for $m=12 to 2 step -1}
<                             <option value="{$m}" {if $entry->$field == $m}selected="selected"{/if} >{$m} {_T string="months"}</option>
<                         {/for}
<                         <option value="1" {if $entry->$field == 1}selected="selected"{/if} >1 {_T string="month"}</option>
<                     </select>
<                     
<                                 
---
>             <input type="checkbox" name="{$field}" id="{$field}" value="1"{if $entry->$field == 1} checked="checked"{/if} />
diff -r -x '*.log' -x '*.rej' -x 'composer.*' '--exclude=data' '--exclude=plugins' '--exclude=vendor' galette/galette/templates/default/gestion_intitule_content.tpl galette0941_avantmodif/galette/templates/default/gestion_intitule_content.tpl
36d35
< 
38,44c37,38
<                         <option value="-1">{_T string="By default"}</option>                        
<                         {for $m=12 to 2 step -1}
<                             <option value="{$m}">{$m} {_T string="months"}</option>
<                         {/for}
<                         <option value="1">1 {_T string="month"}</option>
<                            
<                     </select> 
---
>                         <option value="1">{_T string="Yes"}</option>
>                     </select>
83,88c77,78
<                     {if $entry.extra eq 0}
<                         {_T string="No"}
<                     {elseif $entry.extra eq -1}
<                         {_T string="By default"}
<                     {elseif $entry.extra eq 1}
<                         {$entry.extra} {_T string="month"}
---
>                     {if $entry.extra eq 1}
>                         {_T string="Yes"}
90c80
<                         {$entry.extra} {_T string="months"}
---
>                         {_T string="No"}

Manuel


Fichiers

diff_2.txt (7,33 ko) diff_2.txt diff Manuel Her, 08/06/2020 09:20
0001-Adhesion-en-mois-mensualisation-1438.patch (10,2 ko) 0001-Adhesion-en-mois-mensualisation-1438.patch Manuel Her, 17/08/2020 18:46
modif_adhmensuelle.txt (15,2 ko) modif_adhmensuelle.txt Manuel Her, 23/02/2024 08:33

Demandes liées 2 (0 ouverte2 fermées)

Lié à Galette - Evolution #495: Contribution: durée d'inscriptionFermé23/01/2013

Actions
Précède Galette - Evolution #1824: Handle reminders for monthly contributionsRejeté09/06/202009/06/2020

Actions

Mis à jour par Johan Cwiklinski il y a plus de 4 ans

Je ne parviens pas à appliquer le patch fourni, je me prend systématiquement l'erreur :
patch: **** Only garbage was found in the patch input..

Bref, il serait bien plus simple de fourni un patch GIT ; je n'ai pas trop envie de répercuter les modifications une par une :)

Mis à jour par Johan Cwiklinski il y a plus de 4 ans

Mis à jour par Manuel Her il y a plus de 4 ans

Bonjour,

J'ai fait un patch GIT (ci-joint)

Il faut executer

ALTER TABLE `galette_types_cotisation` CHANGE `cotis_extension` `cotis_extension` TINYINT(4) NOT NULL DEFAULT '0'; 
UPDATE `galette_types_cotisation` SET `cotis_extension`=-1 WHERE `cotis_extension`=1

Manuel

Mis à jour par Manuel Her il y a 10 mois

Bonjour,
Ci-joint un git diff pour la version 1.1.

cotis_extension=-1 : adhésion par défaut de galette
cotis_extension=0, c'est un don
cotis_extension>0, nombre de mois

Il faut executer :

ALTER TABLE `galette_types_cotisation` CHANGE `cotis_extension` `cotis_extension` TINYINT NOT NULL DEFAULT '0';
UPDATE `galette_types_cotisation` SET `cotis_extension`=-1 WHERE `cotis_extension`=1

Manuel

Mis à jour par Johan Cwiklinski il y a 10 mois

  • Catégorie mis à Core
  • Statut changé de Nouveau à In Progress
  • Assigné à mis à Manuel Her

Le plus simple serait sûrement d'ouvrir une PR sur le dépôt github, non ?

Pour le coup, j'avais complètement oublié qu'il y avait un patch fourni ; je n'ai donc jamais testé...

Sur la branche develop, des scripts de migration pour la 1.1.0 ont été ajoutés, les instructions SQL peuvent y être placées (pour mysql et postgres). Il faudrait également prévoir des tests unitaires, en plus de corriger cuex qui existent (je suppose que certains vont échouer).

Mis à jour par Johan Cwiklinski il y a 8 mois

  • Sujet changé de Mensualisation - Fidéliser les adhérents à Add monthly membership
  • Version cible mis à 1.1.0

Mis à jour par Johan Cwiklinski il y a 8 mois

  • Statut changé de In Progress à Résolu
  • % réalisé changé de 0 à 100

Mis à jour par Johan Cwiklinski il y a 8 mois

  • Précède Evolution #1824: Handle reminders for monthly contributions ajouté

Mis à jour par Johan Cwiklinski il y a 8 mois

  • Statut changé de Résolu à Fermé
Actions

Formats disponibles : Atom PDF