/** * 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); }
/** * 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); }
/** * 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; }
/** * 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); }
/** * 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; }