/**
  * Returns property associated with the render.
  *
  * @since  1.0.0
  * @internal
  *
  * @param string $property The name of a property.
  * @return mixed Returns mixed value of a property or NULL if a property doesn't exist.
  */
 public function __get($property)
 {
     $value = null;
     switch ($property) {
         case 'type':
             if (!self::is_valid_type($this->type)) {
                 $this->type = self::TYPE_STANDARD;
             }
             $value = $this->type;
             break;
         case 'payment_type':
             $types = self::get_payment_types();
             if (!array_key_exists($this->payment_type, $types)) {
                 $this->payment_type = self::PAYMENT_TYPE_PERMANENT;
             }
             $value = $this->payment_type;
             break;
         case 'trial_period_enabled':
         case 'active':
         case 'private':
         case 'is_free':
             $value = lib3()->is_true($this->{$property});
             break;
         case 'type_description':
             $value = $this->get_type_description();
             break;
         case 'period_unit':
             $value = MS_Helper_Period::get_period_value($this->period, 'period_unit');
             break;
         case 'period_type':
             $value = MS_Helper_Period::get_period_value($this->period, 'period_type');
             break;
         case 'pay_cycle_period_unit':
             $value = MS_Helper_Period::get_period_value($this->pay_cycle_period, 'period_unit');
             break;
         case 'pay_cycle_period_type':
             $value = MS_Helper_Period::get_period_value($this->pay_cycle_period, 'period_type');
             break;
         case 'trial_period_unit':
             $value = MS_Helper_Period::get_period_value($this->trial_period, 'period_unit');
             break;
         case 'trial_period_type':
             $value = MS_Helper_Period::get_period_value($this->trial_period, 'period_type');
             break;
         case 'price':
             if ($this->is_free()) {
                 $value = 0;
             } else {
                 $value = $this->price;
             }
             break;
         case 'total_price':
             if ($this->is_free()) {
                 $value = 0;
             } else {
                 $value = $this->price;
             }
             $value = apply_filters('ms_apply_taxes', $value, $this);
             break;
         case 'pay_cycle_repetitions':
             $value = absint($this->pay_cycle_repetitions);
             break;
         case 'disabled_gateways':
             $value = lib3()->array->get($this->disabled_gateways);
             break;
         case 'is_paid':
             $value = !$this->is_free;
             break;
         case 'public':
             $value = !$this->private;
             break;
         default:
             if (property_exists($this, $property)) {
                 $value = $this->{$property};
             }
             break;
     }
     return apply_filters('ms_model_membership__get', $value, $property, $this);
 }
 /**
  * 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);
 }
 public static function get_period_desc($period, $include_quanity_one = false)
 {
     $period_unit = MS_Helper_Period::get_period_value($period, 'period_unit');
     $period_type = MS_Helper_Period::get_period_value($period, 'period_type');
     $types = self::get_period_types();
     if (1 == $period_unit) {
         $desc = '%2$s';
         if ($include_quanity_one) {
             $period_type = $types['1' . $period_type];
         } else {
             $period_type = $types['1-' . $period_type];
         }
     } else {
         $desc = '%1$s %2$s';
     }
     $desc = sprintf($desc, $period_unit, $period_type);
     return apply_filters('ms_helper_period_get_period_desc', $desc);
 }
 /**
  * Prepare the PayPal IPN fields
  *
  * Details here:
  * https://developer.paypal.com/docs/classic/paypal-payments-standard/integration-guide/Appx_websitestandard_htmlvariables/
  *
  * @since  1.0.0
  * @return array
  */
 private function prepare_fields()
 {
     $subscription = $this->data['ms_relationship'];
     $membership = $subscription->get_membership();
     if (0 === $membership->price) {
         return;
     }
     $gateway = $this->data['gateway'];
     $invoice = $subscription->get_current_invoice();
     $regular_invoice = null;
     $settings = MS_Factory::load('MS_Model_Settings');
     $nonce = wp_create_nonce($gateway->id . '_' . $subscription->id);
     $cancel_url = MS_Model_Pages::get_page_url(MS_Model_Pages::MS_PAGE_REGISTER);
     $return_url = esc_url_raw(add_query_arg(array('ms_relationship_id' => $subscription->id), MS_Model_Pages::get_page_url(MS_Model_Pages::MS_PAGE_REG_COMPLETE, false)));
     $fields = array('_wpnonce' => array('id' => '_wpnonce', 'type' => MS_Helper_Html::INPUT_TYPE_HIDDEN, 'value' => $nonce), 'charset' => array('id' => 'charset', 'type' => MS_Helper_Html::INPUT_TYPE_HIDDEN, 'value' => 'utf-8'), 'business' => array('id' => 'business', 'type' => MS_Helper_Html::INPUT_TYPE_HIDDEN, 'value' => $gateway->merchant_id), 'cmd' => array('id' => 'cmd', 'type' => MS_Helper_Html::INPUT_TYPE_HIDDEN, 'value' => '_xclick-subscriptions'), 'bn' => array('id' => 'bn', 'type' => MS_Helper_Html::INPUT_TYPE_HIDDEN, 'value' => 'incsub_SP'), 'item_name' => array('id' => 'item_name', 'type' => MS_Helper_Html::INPUT_TYPE_HIDDEN, 'value' => $membership->name), 'item_number' => array('id' => 'item_number', 'type' => MS_Helper_Html::INPUT_TYPE_HIDDEN, 'value' => $membership->id), 'currency_code' => array('id' => 'currency_code', 'type' => MS_Helper_Html::INPUT_TYPE_HIDDEN, 'value' => MS_Plugin::instance()->settings->currency), 'return' => array('id' => 'return', 'type' => MS_Helper_Html::INPUT_TYPE_HIDDEN, 'value' => $return_url), 'cancel_return' => array('id' => 'cancel_return', 'type' => MS_Helper_Html::INPUT_TYPE_HIDDEN, 'value' => $cancel_url), 'notify_url' => array('id' => 'notify_url', 'type' => MS_Helper_Html::INPUT_TYPE_HIDDEN, 'value' => $gateway->get_return_url()), 'country' => array('id' => 'country', 'type' => MS_Helper_Html::INPUT_TYPE_HIDDEN, 'value' => $gateway->paypal_site), 'no_note' => array('id' => 'no_note', 'type' => MS_Helper_Html::INPUT_TYPE_HIDDEN, 'value' => 1), 'no_shipping' => array('id' => 'no_shipping', 'type' => MS_Helper_Html::INPUT_TYPE_HIDDEN, 'value' => 1), 'invoice' => array('id' => 'invoice', 'type' => MS_Helper_Html::INPUT_TYPE_HIDDEN, 'value' => $invoice->id));
     $fields['submit'] = array('id' => 'submit', 'type' => MS_Helper_Html::INPUT_TYPE_IMAGE, 'value' => 'https://www.paypal.com/en_US/i/btn/btn_subscribe_LG.gif', 'alt' => __('PayPal - The safer, easier way to pay online', 'membership2'));
     // custom pay button defined in gateway settings
     $custom_label = $gateway->pay_button_url;
     if (!empty($custom_label)) {
         if (false !== strpos($custom_label, '://')) {
             $fields['submit']['value'] = $custom_label;
         } else {
             $fields['submit'] = array('id' => 'submit', 'type' => MS_Helper_Html::INPUT_TYPE_SUBMIT, 'value' => $custom_label);
         }
     }
     // Trial period
     if ($subscription->is_trial_eligible()) {
         $fields['a1'] = array('id' => 'a1', 'type' => MS_Helper_Html::INPUT_TYPE_HIDDEN, 'value' => $invoice->trial_price);
         $trial_type = MS_Helper_Period::get_period_value($membership->trial_period, 'period_type');
         $trial_type = strtoupper($trial_type[0]);
         $trial_value = MS_Helper_Period::get_period_value($membership->trial_period, 'period_unit');
         $trial_value = MS_Helper_Period::validate_range($trial_value, $trial_type);
         $fields['p1'] = array('id' => 'p1', 'type' => MS_Helper_Html::INPUT_TYPE_HIDDEN, 'value' => $trial_value);
         $fields['t1'] = array('id' => 't1', 'type' => MS_Helper_Html::INPUT_TYPE_HIDDEN, 'value' => $trial_type);
     }
     // Membership price
     $membership_price = $invoice->total;
     $membership_price = MS_Helper_Billing::format_price($membership_price);
     $fields['a3'] = array('id' => 'a3', 'type' => MS_Helper_Html::INPUT_TYPE_HIDDEN, 'value' => $membership_price);
     $fields['amount'] = array('id' => 'amount', 'type' => MS_Helper_Html::INPUT_TYPE_HIDDEN, 'value' => $membership_price);
     $recurring = 0;
     switch ($membership->payment_type) {
         // == RECURRING PAYMENTS
         case MS_Model_Membership::PAYMENT_TYPE_RECURRING:
             $period_type = MS_Helper_Period::get_period_value($membership->pay_cycle_period, 'period_type');
             $period_type = strtoupper($period_type[0]);
             $period_value = MS_Helper_Period::get_period_value($membership->pay_cycle_period, 'period_unit');
             $period_value = MS_Helper_Period::validate_range($period_value, $period_type);
             $fields['p3'] = array('id' => 'p3', 'type' => MS_Helper_Html::INPUT_TYPE_HIDDEN, 'value' => $period_value);
             $fields['t3'] = array('id' => 't3', 'type' => MS_Helper_Html::INPUT_TYPE_HIDDEN, 'value' => $period_type);
             // This makes the payments recurring!
             $recurring = 1;
             break;
             // == FINITE END DATE
         // == FINITE END DATE
         case MS_Model_Membership::PAYMENT_TYPE_FINITE:
             $period_type = MS_Helper_Period::get_period_value($membership->period, 'period_type');
             $period_type = strtoupper($period_type[0]);
             $period_value = MS_Helper_Period::get_period_value($membership->period, 'period_unit');
             $period_value = MS_Helper_Period::validate_range($period_value, $period_type);
             $fields['p3'] = array('id' => 'p3', 'type' => MS_Helper_Html::INPUT_TYPE_HIDDEN, 'value' => $period_value);
             $fields['t3'] = array('id' => 't3', 'type' => MS_Helper_Html::INPUT_TYPE_HIDDEN, 'value' => $period_type);
             break;
             // == DATE RANGE
         // == DATE RANGE
         case MS_Model_Membership::PAYMENT_TYPE_DATE_RANGE:
             $period_value = MS_Helper_Period::subtract_dates($membership->period_date_end, $membership->period_date_start);
             $period_value = MS_Helper_Period::validate_range($period_value, 'D');
             $fields['p3'] = array('id' => 'p3', 'type' => MS_Helper_Html::INPUT_TYPE_HIDDEN, 'value' => $period_value);
             $fields['t3'] = array('id' => 't3', 'type' => MS_Helper_Html::INPUT_TYPE_HIDDEN, 'value' => 'D');
             break;
             // == PERMANENT
         // == PERMANENT
         case MS_Model_Membership::PAYMENT_TYPE_PERMANENT:
             /*
              * Permanent membership: Set the subscription range to 5 years!
              * PayPal requires us to provide the subscription range and the
              * maximum possible value is 5 years.
              */
             $period_value = MS_Helper_Period::validate_range(5, 'Y');
             $fields['p3'] = array('id' => 'p3', 'type' => MS_Helper_Html::INPUT_TYPE_HIDDEN, 'value' => $period_value);
             $fields['t3'] = array('id' => 't3', 'type' => MS_Helper_Html::INPUT_TYPE_HIDDEN, 'value' => 'Y');
             break;
     }
     if (1 == $recurring) {
         if (1 == $membership->pay_cycle_repetitions) {
             $recurring = 0;
         } elseif ($membership->pay_cycle_repetitions > 1) {
             /**
              * Recurring times.
              * The number of times that a recurring payment is made.
              */
             $fields['srt'] = array('id' => 'srt', 'type' => MS_Helper_Html::INPUT_TYPE_HIDDEN, 'value' => $membership->pay_cycle_repetitions);
         }
     }
     /**
      * Recurring field.
      * 0 - one time payment
      * 1 - recurring payments
      */
     $fields['src'] = array('id' => 'src', 'type' => MS_Helper_Html::INPUT_TYPE_HIDDEN, 'value' => $recurring);
     /**
      * Modify current subscription field.
      * value != 0 does not allow trial period.
      * 0 - allows subscribers only to sign up for new subscriptions
      * 1 - allows subscribers to sign up for new subscriptions and modify their current subscriptions
      * 2 - allows subscribers to modify only their current subscriptions
      */
     $modify = !empty($move_from_id);
     $fields['modify'] = array('id' => 'modify', 'type' => MS_Helper_Html::INPUT_TYPE_HIDDEN, 'value' => $modify ? 2 : 0);
     if ($gateway->is_live_mode()) {
         $this->data['action_url'] = 'https://www.paypal.com/cgi-bin/webscr';
     } else {
         $this->data['action_url'] = 'https://www.sandbox.paypal.com/cgi-bin/webscr';
     }
     return apply_filters('ms_gateway_paypalstandard_view_prepare_fields', $fields);
 }