/** * Calculate expire date. * * Based in the membership definition * * @since 1.0.0 * @internal * * @param string $start_date Optional. The start date to calculate date from. * @param bool $paid If the user made a payment to extend the expire date. * @return string The calculated expire date. */ public function calc_expire_date($start_date = null, $paid = false) { $membership = $this->get_membership(); $gateway = $this->get_gateway(); $start_date = $this->calc_trial_expire_date($start_date); $expire_date = null; /* * When in trial period and gateway does not send automatic recurring * payment notifications, the expire date is equal to trial expire date. */ if ($this->is_trial_eligible()) { $expire_date = $start_date; } else { if ($paid) { /* * Always extend the membership from current date or later, even if * the specified start-date is in the past. * * Example: User does not pay for 3 days (subscription set "pending") * Then he pays: The 3 days without access are for free; * his subscriptions is extended from current date! */ $today = MS_Helper_Period::current_date(); if (MS_Helper_Period::is_after($today, $start_date)) { $start_date = $today; } } /* * The gatway calls the payment handler URL automatically: * This means that the user does not need to re-authorize each * payment. */ switch ($membership->payment_type) { case MS_Model_Membership::PAYMENT_TYPE_PERMANENT: $expire_date = false; break; case MS_Model_Membership::PAYMENT_TYPE_FINITE: $period_unit = MS_Helper_Period::get_period_value($membership->period, 'period_unit'); $period_type = MS_Helper_Period::get_period_value($membership->period, 'period_type'); $expire_date = MS_Helper_Period::add_interval($period_unit, $period_type, $start_date); break; case MS_Model_Membership::PAYMENT_TYPE_DATE_RANGE: $expire_date = $membership->period_date_end; break; case MS_Model_Membership::PAYMENT_TYPE_RECURRING: $period_unit = MS_Helper_Period::get_period_value($membership->pay_cycle_period, 'period_unit'); $period_type = MS_Helper_Period::get_period_value($membership->pay_cycle_period, 'period_type'); $expire_date = MS_Helper_Period::add_interval($period_unit, $period_type, $start_date); break; } } return apply_filters('ms_model_relationship_calc_expire_date', $expire_date, $this); }