'pref_mail_smtp_password' => '',
'pref_membership_ext' => 12,
'pref_beg_membership' => '',
+ 'pref_membership_offermonths' => 0,
'pref_email_reply_to' => '',
'pref_website' => '',
/* Preferences for labels */
}
}
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.");
$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]) == '') {
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
<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}/>
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,
['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'));
->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);
);
$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;
}
/**