/**
  * Adds the Pro-Rating discount to an invoice.
  *
  * @since  1.0.1.0
  * @param  MS_Model_Invoice $invoice
  * @return MS_Model_Invoice Modified Invoice.
  */
 public function add_discount($invoice)
 {
     // Only the first invoice can be pro-rated.
     if ($invoice->invoice_number > 1) {
         return $invoice;
     }
     $subscription = $invoice->get_subscription();
     $membership = $invoice->get_membership();
     if (!$subscription->move_from_id) {
         return $invoice;
     }
     $ids = explode(',', $subscription->move_from_id);
     if (empty($ids)) {
         return $invoice;
     }
     if ($membership->is_free()) {
         return $invoice;
     }
     // Calc pro rate discount if moving from another membership.
     $pro_rate = 0;
     foreach ($ids as $id) {
         if (!$id) {
             continue;
         }
         $move_from = MS_Model_Relationship::get_subscription($subscription->user_id, $id);
         if ($move_from->is_valid() && $move_from->id == $id) {
             $pro_rate += $this->get_discount($move_from);
         }
     }
     $pro_rate = floatval(apply_filters('ms_addon_prorate_apply_discount', abs($pro_rate), $invoice));
     if ($pro_rate > $invoice->amount) {
         $pro_rate = $invoice->amount;
     }
     if ($pro_rate > 0) {
         $invoice->pro_rate = $pro_rate;
         $notes[] = sprintf(__('Pro-Rate Discount: %s.', MS_TEXT_DOMAIN) . ' ', $invoice->currency . ' ' . $pro_rate);
     }
     return $invoice;
 }
 /**
  * Adds the Pro-Rating discount to an invoice.
  *
  * @since  1.0.1.0
  * @param  MS_Model_Invoice $invoice
  * @return MS_Model_Invoice Modified Invoice.
  */
 public function add_discount($invoice)
 {
     $subscription = $invoice->get_subscription();
     // If memberships were already cancelled don't pro-rate again!
     if ($subscription->cancelled_memberships) {
         return $invoice;
     }
     $membership = $invoice->get_membership();
     if (!$subscription->move_from_id) {
         return $invoice;
     }
     $ids = explode(',', $subscription->move_from_id);
     if (empty($ids)) {
         return $invoice;
     }
     if ($membership->is_free()) {
         return $invoice;
     }
     // Calc pro rate discount if moving from another membership.
     $pro_rate = 0;
     foreach ($ids as $id) {
         if (!$id) {
             continue;
         }
         $move_from = MS_Model_Relationship::get_subscription($subscription->user_id, $id);
         if ($move_from->is_valid() && $move_from->membership_id == $id) {
             $pro_rate += $this->get_discount($move_from);
         }
     }
     $pro_rate = floatval(apply_filters('ms_addon_prorate_apply_discount', abs($pro_rate), $invoice));
     if ($pro_rate > $invoice->amount) {
         $pro_rate = $invoice->amount;
     }
     if ($pro_rate > 0) {
         $invoice->pro_rate = $pro_rate;
         $notes[] = sprintf(__('Pro-Rate Discount: %s.', 'membership2') . ' ', $invoice->currency . ' ' . $pro_rate);
     }
     return $invoice;
 }
 /**
  * When an invoice was paid we need to notify taxamo of the transaction.
  *
  * @since  1.0.0
  * @param  MS_Model_Invoice $invoice The processed invoice.
  */
 public function invoice_paid($invoice)
 {
     if (!$invoice->is_paid()) {
         return;
     }
     if (0 == $invoice->total) {
         return;
     }
     $membership = $invoice->get_membership();
     $member = $invoice->get_member();
     MS_Addon_Taxamo_Api::register_payment($invoice->total, $membership->name, $invoice->tax_rate, $invoice->get_invoice_number(), $member->full_name, $member->email, $invoice->gateway_id, $invoice->currency, $invoice->checkout_ip);
 }
 /**
  * Creates a subscription that starts immediately.
  *
  * @since  1.0.0
  * @internal
  *
  * @param  M2_Stripe_Customer $customer Stripe customer to charge.
  * @param  MS_Model_Invoice $invoice The relevant invoice.
  * @return M2_Stripe_Subscription The resulting charge object.
  */
 public function subscribe($customer, $invoice)
 {
     $membership = $invoice->get_membership();
     $plan_id = MS_Gateway_Stripeplan::get_the_id($membership->id, 'plan');
     $subscription = self::get_subscription($customer, $membership);
     /*
      * If no active subscription was found for the membership create it.
      */
     if (!$subscription) {
         $tax_percent = null;
         $coupon_id = null;
         if (is_numeric($invoice->tax_rate) && $invoice->tax_rate > 0) {
             $tax_percent = floatval($invoice->tax_rate);
         }
         if ($invoice->coupon_id) {
             $coupon_id = MS_Gateway_Stripeplan::get_the_id($invoice->coupon_id, 'coupon');
         }
         $args = array('plan' => $plan_id, 'tax_percent' => $tax_percent, 'coupon' => $coupon_id);
         $subscription = $customer->subscriptions->create($args);
     }
     return apply_filters('ms_gateway_stripe_subscribe', $subscription, $customer, $invoice, $membership, $this);
 }
 /**
  * Called right before the payment form on the front end is displayed.
  * We check if the user already specified an invitation code or not.
  *
  * If no code was specified then we remove all payment buttons and display
  * an input field for the invitation code instead.
  *
  * @since  1.0.1.0
  * @param  bool $flag The original Skip-Form flag.
  * @param  MS_Model_Invoice $invoice
  * @param  MS_View $view The parent view.
  * @return bool The modified Skip-Form flag.
  */
 public function do_not_skip($flag, $invoice, $view)
 {
     $membership = $invoice->get_membership();
     $is_public = lib3()->is_true($membership->get_custom_data('no_invitation'));
     if (!$is_public) {
         // Do not skip the form!
         $flag = false;
     }
     return $flag;
 }