]> git.agnieray.net Git - galette.git/commitdiff
Add preference to offer last months of the year
authorJohan Cwiklinski <johan@x-tnd.be>
Sat, 18 Apr 2020 06:32:22 +0000 (08:32 +0200)
committerJohan Cwiklinski <johan@x-tnd.be>
Mon, 27 Apr 2020 16:29:14 +0000 (18:29 +0200)
closes #1407

galette/lib/Galette/Core/Preferences.php
galette/lib/Galette/Entity/Contribution.php
galette/templates/default/preferences.tpl
tests/Galette/Entity/tests/units/Contribution.php

index 07cdc087de5eba6ac74d03618a34d78fc1eea5c5..fbd884e0e99e7777094b18edf2db5c1ef12dd892 100644 (file)
@@ -128,6 +128,7 @@ class Preferences
         'pref_mail_smtp_password'   => '',
         'pref_membership_ext'    =>    12,
         'pref_beg_membership'    =>    '',
+        'pref_membership_offermonths' => 0,
         'pref_email_reply_to'    =>    '',
         'pref_website'        =>    '',
         /* Preferences for labels */
@@ -490,6 +491,11 @@ class Preferences
                             }
                         }
                         break;
+                    case 'pref_membership_offermonths':
+                        if (!is_numeric($value) || $value < 0) {
+                            $this->errors[] = _T("- Invalid number of offered months.");
+                        }
+                        break;
                     case 'pref_card_year':
                         if (!preg_match('/^(?:\d{4}|\d{2})(\D?)(?:\d{4}|\d{2})$/', $value)) {
                             $this->errors[] = _T("- Invalid year for cards.");
@@ -549,6 +555,14 @@ class Preferences
             $this->errors[] =_T("- Default membership extention and beginning of membership are mutually exclusive.");
         }
 
+        if (isset($insert_values['pref_membership_offermonths'])
+            && (int)$insert_values['pref_membership_offermonths'] > 0
+            && isset($insert_values['pref_membership_ext'])
+            && $insert_values['pref_membership_ext'] != ''
+        ) {
+            $this->errors[] =_T("- Offering months is only compatible with beginning of membership.");
+        }
+
         // missing required fields?
         foreach ($this->required as $val) {
             if (!isset($values[$val]) || isset($values[$val]) && trim($values[$val]) == '') {
index a41041bde323e0e7e4c79d73664dfc12c81876c1..8de385c396f40645cf16731b0aaf3bb837dcc697 100644 (file)
@@ -218,6 +218,22 @@ class Contribution
             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');
+
+                //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');
         } elseif ($preferences->pref_membership_ext != '') {
             //case membership extension
index 9cc1bffa589c8dee81c94eb4dce9853769107fda..1861666b8c86c6e4d690cefdd5022848744f8dd7 100644 (file)
                     <input type="text" name="pref_beg_membership" id="pref_beg_membership" value="{$pref.pref_beg_membership}" maxlength="5"{if isset($required.pref_beg_membership) and $required.pref_beg_membership eq 1} required="required"{/if}/>
                     <span class="exemple">{_T string="(dd/mm)"}</span>
                 </p>
+                <p>
+                    <label for="pref_membership_offermonths" class="bline tooltip">{_T string="Number of months offered:"}</label>
+                    <span class="tip">{_T string="When using the beginning of membership option; you can offer the last months of the year."}<br/>{_T string="Let's say you offer last 2 months, and have a renewal on 31th of December. All created contributions in current year will be valid until this date, but as of October, they will be valid for the entire next year."}</span>
+                    <input type="number" name="pref_membership_offermonths" min="0" id="pref_membership_offermonths" value="{$pref.pref_membership_offermonths}" maxlength="5"{if isset($required.pref_membership_offermonths) and $required.pref_membership_offermonths eq 1} required="required"{/if}/>
+                </p>
                 <p>
                     <label for="pref_bool_publicpages" class="bline">{_T string="Public pages enabled?"}</label>
                     <input type="checkbox" name="pref_bool_publicpages" id="pref_bool_publicpages" value="1" {if $pref.pref_bool_publicpages} checked="checked"{/if}{if isset($required.pref_bool_publicpages) and $required.pref_bool_publicpages eq 1} required="required"{/if}/>
index 02c94c600bd7b6d0488bae369cc7dc50f818e79a..5f74fddabeee29d38cfb42184e1f54084c8c4b93 100644 (file)
@@ -570,6 +570,7 @@ class Contribution extends atoum
         global $preferences;
         $orig_pref_beg_membership = $this->preferences->pref_beg_membership;
         $orig_pref_membership_ext = $this->preferences->pref_membership_ext;
+        $orig_pref_membership_offermonths = $this->preferences->pref_membership_offermonths;
 
         $contrib = new \Galette\Entity\Contribution(
             $this->zdb,
@@ -577,6 +578,7 @@ class Contribution extends atoum
             ['type' => 1] //anual fee
         );
 
+        // First, check for 12 months renewal
         $expected = new \DateTime();
         $expected->add(new \DateInterval('P1Y'));
         $this->string($contrib->end_date)->isIdenticalTo($expected->format('Y-m-d'));
@@ -597,6 +599,7 @@ class Contribution extends atoum
             ->isInstanceOf('RuntimeException')
             ->hasMessage('Unable to define end date; none of pref_beg_membership nor pref_membership_ext are defined!');
 
+        // Second, test with beginning of membership date
         $preferences->pref_beg_membership = '29/05';
         $expected = new \DateTime();
         $expected->setDate(date('Y'), 5, 29);
@@ -611,9 +614,25 @@ class Contribution extends atoum
         );
         $this->string($contrib->end_date)->isIdenticalTo($expected->format('Y-m-d'));
 
+        // Third, test with beginning of membership date and i2 last months offered
+        $beginning = new \DateTime();
+        $beginning->add(new \DateInterval('P1M'));
+        $preferences->pref_beg_membership = $beginning->format('t/m'); // end of next month
+        $preferences->pref_membership_offermonths = 2;
+        $expected = clone $beginning;
+        $expected->add(new \DateInterval('P1Y'));
+
+        $contrib = new \Galette\Entity\Contribution(
+            $this->zdb,
+            $this->login,
+            ['type' => 1] // anual fee
+        );
+        $this->string($contrib->end_date)->isIdenticalTo($expected->format('Y-m-t'));
+
         //reset
         $preferences->pref_beg_membership = $orig_pref_beg_membership;
         $preferences->pref_membership_ext = $orig_pref_membership_ext;
+        $preferences->pref_membership_offermonths = $orig_pref_membership_offermonths;
     }
 
     /**