Projet

Général

Profil

Actions

Evolution #1407

fermé

Adhésion en année civile avec cadeau pour les 2 derniers mois

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

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

100%

Temps estimé:

Description

Bonjour,

Je souhaiterais que les adhésions faites à partir du 1er octobre soient effectives jusqu'au 31/12 de l'année suivante.

pref_beg_membership doit être configuré au 31/12 ou au 01/01?

Merci
Manuel


Demandes liées 1 (0 ouverte1 fermée)

Dupliqué par Galette - Souhaits #913: Offrir les 3 derniers mois de l'annéeRejeté30/03/2015

Actions

Mis à jour par Johan Cwiklinski il y a presque 5 ans

  • Duplique Souhaits #913: Offrir les 3 derniers mois de l'année ajouté

Mis à jour par Johan Cwiklinski il y a presque 5 ans

  • Statut changé de Nouveau à Rejeté

Aucune idée pour la date, ça dépend de ce que vous voulez... Le mieux serait sûrement de poser ce genre de question sur la liste, que d'autres puissent aider au besoin.

Je souhaiterais que les adhésions faites à partir du 1er octobre soient effectives jusqu'au 31/12 de l'année suivante.

Galette ne permet pas ça de manière automatique ; la date proposée est la bonne, à l'exception de l'année. La demande a déjà été faite (https://bugs.galette.eu/issues/913) mais n'a pas intéressé grand monde. J'ai crée un vote pour la demande.

Mis à jour par Manuel Her il y a presque 5 ans

Bonjour,

Voici comment je l'ai implémenté.
Le format de pref_beg_membership devient 'dd/mm;mois à offrir' et fonctionne aussi avec dd/mm.
Je l'ai testé en changeant la date de mon serveur de test.
Dans mon cas, j'ai configuré 01/01;2
Ca va faire gagner pas mal de temps à notre secrétaire qui doit modifier les dates des contributions paypal en fin d'année.

preferences.tpl ; line 192 :

                  
<input type="text" name="pref_beg_membership" id="pref_beg_membership" value="{$pref.pref_beg_membership}" maxlength="7"(au lieu de 5)
{if isset($required.pref_beg_membership) and $required.pref_beg_membership eq 1} required="required"{/if}/>
                    <span class="exemple">{_T string="(dd/mm) or (dd/mm;freemonth)"}</span>

Preferences.php; line 462 :


 case 'pref_beg_membership':
                        //$beg_membership = explode("/", $value);
                        //format is dd/mm;freemonth 
                        if (preg_match_all('#(\d{1,2})/(\d{1,2});?(\d)?$#mius', $value, $beg_membership, PREG_SET_ORDER))
                        {
                            $beg_membership = $beg_membership[0]; //je ne maitrise pas bien preg; il y peut être une façon plus propre de faire ça :)
                            array_shift($beg_membership); //supprimer le "catch" global
                        }
                         //   $this->errors[] .= "beg_membership =".var_export($beg_membership, true);
                        if (count($beg_membership) != 2 && count($beg_membership) != 3) {
                            $this->errors[] = _T("- Invalid format of beginning of membership.");
                        } else {
                            $now = getdate();
                            if (!checkdate($beg_membership[1], $beg_membership[0], $now['year'])) {
                                $this->errors[] = _T("- Invalid date for beginning of membership.");
                            }
                        }
                        break;

Contribution.php ; line 209 :


        global $preferences;

        $bdate = new \DateTime($this->_begin_date);
        if ($preferences->pref_beg_membership != '') {
            //case beginning of membership
            //list($j, $m) = explode('/', $preferences->pref_beg_membership);
            list($j, $m, $freemonth) = preg_split('#[/;]#', $preferences->pref_beg_membership.';0'); //format (dd/mm;0) or (dd/mm;freemonth)
            $edate = new \DateTime($bdate->format('Y') . '-' . $m . '-' . $j);
            while ($edate <= $bdate) {
                $edate->modify('+1 year');
            }
            //hm->        
            if($freemonth>0)
            {
                //comparaison en nombre de jours (le 1er essai en nombre de mois ne fonctionnait pas avec diff(); pb d'arrondi par excès?)
                //le nombre de mois entre la date de fin venant d'être calculé et la date de début est-il inférieur ou égal à $freemonth ?
                $diff1 = intval($bdate->diff($edate)->format('%a'));
                $tdate = clone $edate;
                $tdate->modify('-' . $freemonth . ' month');
                $diff2 = intval($edate->diff($tdate)->format('%a'));
                if($diff1<=$diff2) $edate->modify('+1 year');
                //echo "<br>interval=".$diff1."<br>interval2=".$diff2."<br>";
            }
            // <-hm 
            $this->_end_date = $edate->format('Y-m-d');
        } elseif ($preferences->pref_membership_ext != '') {

Manuel

Mis à jour par Johan Cwiklinski il y a presque 5 ans

  • Catégorie mis à Core
  • Statut changé de Rejeté à Nouveau

En effet, c'est une piste intéressante, j'y regarderai de plus près :)

Du coup, je réouvre ce ticket et ferme l'autre.

Mis à jour par Johan Cwiklinski il y a presque 5 ans

  • Duplique Souhaits #913: Offrir les 3 derniers mois de l'année supprimé

Mis à jour par Johan Cwiklinski il y a presque 5 ans

  • Dupliqué par Souhaits #913: Offrir les 3 derniers mois de l'année ajouté

Mis à jour par Johan Cwiklinski il y a presque 5 ans

Globalement, je suis d'accord. Ne serait-il pas plus aisé pour les utilisateurs que cette information soit dans un champ à part, plutôt que d'utiliser une syntaxe spécifique ? (personnellement, ça ne me gêne pas plus que ça, mais c'est forcément plus compliqué ;)).

Sinon, au regard de l'implémentation actuelle ; je n'aurai probablement pas eu recours à du preg split. À mon avis, il faut regarder pour la présence d'un ; et dans ce cas, récupérer la valeur, et la virer de la chaine d'origine. Quelque chose comme :

if (strpos($value, ';') !== false)) {
    list $beg_membership, $freemonth = explode(';', $value);
    $beg_membership = explode('/', $beg_membership);
} else {
    $beg_membership = explode('/', $value);    
}

Et probablement une fonction pour traiter ça proprement puisque c'est utile à différents endroits.

Enfin, dans ce genre là :)

Mis à jour par Manuel Her il y a presque 5 ans

J'ai utilisé le ; pour éviter de confondre avec une date type mm/dd/yy.

Il serait préférable d'ajouter un champ pour une meilleure compréhension, initialisé à 0 par défaut.

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

Bonjour,

Du coup, allez-vous l'intégrer dans la prochaine version ?

Manuel

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

  • Version cible mis à 0.9.4
  • Vote mis à https://vote.galette.eu/posts/63/offer-last-n-months

Je pense que ce pourrait être dans la prochaine version, oui

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

  • Statut changé de Nouveau à In Progress
  • Assigné à mis à Johan Cwiklinski
  • % réalisé changé de 0 à 100

Si tu peux tester https://github.com/galette/galette/pull/47

Il faut que j'ajoute des tests unitaires pour valider le fonctionnement (enfin... si j'y arrive).

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

Johan Cwiklinski a écrit :

Il faut que j'ajoute des tests unitaires pour valider le fonctionnement (enfin... si j'y arrive).

C'est fait :)

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

  • Statut changé de In Progress à Résolu

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

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

Formats disponibles : Atom PDF