コード例 #1
0
 /**
  * Save invoices using the invoices model.
  *
  * @since  1.0.0
  *
  * @param mixed $fields Transaction fields
  */
 private function save_invoice($fields)
 {
     $msg = MS_Helper_Billing::BILLING_MSG_NOT_UPDATED;
     if ($this->is_admin_user() && is_array($fields) && !empty($fields['user_id']) && !empty($fields['membership_id'])) {
         $member = MS_Factory::load('MS_Model_Member', $fields['user_id']);
         $membership_id = $fields['membership_id'];
         $gateway_id = 'admin';
         $subscription = MS_Model_Relationship::get_subscription($member->id, $membership_id);
         if (empty($subscription)) {
             $subscription = MS_Model_Relationship::create_ms_relationship($membership_id, $member->id, $gateway_id);
         } else {
             $subscription->gateway_id = $gateway_id;
             $subscription->save();
         }
         $invoice_id = intval($fields['invoice_id']);
         $invoice = MS_Factory::load('MS_Model_Invoice', $invoice_id);
         if (!$invoice->is_valid()) {
             $invoice = $subscription->get_current_invoice();
             $msg = MS_Helper_Billing::BILLING_MSG_ADDED;
         } else {
             $msg = MS_Helper_Billing::BILLING_MSG_UPDATED;
         }
         foreach ($fields as $field => $value) {
             $invoice->{$field} = $value;
         }
         $invoice->save();
         if (!empty($fields['execute'])) {
             $invoice->changed();
         }
     }
     return apply_filters('ms_controller_billing_save_invoice', $msg, $fields, $this);
 }
コード例 #2
0
 /**
  * Cancel a membership.
  *
  * The membership remains valid until expiration date.
  *
  * @since  1.0.0
  * @api
  *
  * @param int $membership_id The membership id to drop.
  */
 public function cancel_membership($membership_id)
 {
     $subscription = $this->get_subscription($membership_id);
     if ($subscription) {
         $subscription->cancel_membership();
     } else {
         // The membership might be on status "PENDING" which is not included
         // in $this->subscriptions.
         $subscription = MS_Model_Relationship::get_subscription($this->id, $membership_id);
         if ($subscription->user_id == $this->id) {
             $subscription->cancel_membership();
         }
     }
     do_action('ms_model_membership_cancel_membership', $membership_id, $this);
 }
コード例 #3
0
 /**
  * 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;
 }
コード例 #4
0
 /**
  * Update the subscription details after the invoice has changed.
  *
  * Process transaction status change related to this membership relationship.
  * Change status accordinly to transaction status.
  *
  * @since  1.0.0
  * @param MS_Model_Invoice $invoice The invoice to process.
  * @return MS_Model_Invoice The processed invoice.
  */
 public function changed()
 {
     do_action('ms_model_invoice_changed_before', $this);
     if (!$this->ms_relationship_id) {
         MS_Helper_Debug::log('Cannot process transaction: No relationship defined (inv #' . $this->id . ')');
     } else {
         $subscription = $this->get_subscription();
         $member = MS_Factory::load('MS_Model_Member', $this->user_id);
         $membership = $subscription->get_membership();
         switch ($this->status) {
             case self::STATUS_NEW:
             case self::STATUS_BILLED:
                 break;
             case self::STATUS_PAID:
                 if ($this->total > 0) {
                     MS_Model_Event::save_event(MS_Model_Event::TYPE_PAID, $subscription);
                 }
                 do_action('ms_model_invoice_changed-paid', $this, $member);
                 // Check for moving memberships
                 if ($subscription->move_from_id) {
                     $ids = explode(',', $subscription->move_from_id);
                     foreach ($ids as $id) {
                         $move_from = MS_Model_Relationship::get_subscription($subscription->user_id, $id);
                         if ($move_from->is_valid()) {
                             $move_from->cancel_membership();
                         }
                     }
                     $subscription->cancelled_memberships = $subscription->move_from_id;
                     $subscription->move_from_id = '';
                 }
                 /*
                  * Memberships with those payment types can have multiple
                  * invoices for a single subscription.
                  */
                 $multi_invoice = array(MS_Model_Membership::PAYMENT_TYPE_RECURRING, MS_Model_Membership::PAYMENT_TYPE_FINITE);
                 if (in_array($membership->payment_type, $multi_invoice)) {
                     // Update the current_invoice_number counter.
                     $subscription->current_invoice_number = max($subscription->current_invoice_number, $this->invoice_number + 1);
                 }
                 if (MS_Gateway_Manual::ID == $this->gateway_id) {
                     $this->pay_it($this->gateway_id);
                 }
                 break;
             case self::STATUS_DENIED:
                 MS_Model_Event::save_event(MS_Model_Event::TYPE_PAYMENT_DENIED, $subscription);
                 break;
             case self::STATUS_PENDING:
                 MS_Model_Event::save_event(MS_Model_Event::TYPE_PAYMENT_PENDING, $subscription);
                 break;
             default:
                 do_action('ms_model_invoice_changed-unknown', $this);
                 break;
         }
         $member->save();
         $subscription->gateway_id = $this->gateway_id;
         $subscription->save();
         $this->gateway_id = $this->gateway_id;
         $this->save();
     }
     return apply_filters('ms_model_invoice_changed', $this, $this);
 }
コード例 #5
0
 /**
  * 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;
 }