/**
  * Create invoice.
  *
  * Create a new invoice using the membership information.
  *
  * @since  1.0.0
  *
  * @param MS_Model_Relationship $subscription The membership to create invoice for.
  * @param int $invoice_number Optional. The invoice number.
  *
  * @return object $invoice
  */
 public static function create_invoice($subscription, $invoice_number = false)
 {
     $membership = $subscription->get_membership();
     if (!MS_Model_Membership::is_valid_membership($membership->id)) {
         throw new Exception('Invalid Membership.');
     }
     $invoice = null;
     $member = MS_Factory::load('MS_Model_Member', $subscription->user_id);
     $invoice_status = self::STATUS_NEW;
     $notes = null;
     if (empty($invoice_number)) {
         $invoice_number = $subscription->current_invoice_number;
     }
     $invoice = self::get_invoice($subscription->id, $invoice_number);
     // No existing invoice, create a new one.
     if (!$invoice || !$invoice->id) {
         $invoice = MS_Factory::create('MS_Model_Invoice');
         $invoice = apply_filters('ms_model_invoice', $invoice);
     }
     // Update invoice info.
     $invoice->ms_relationship_id = $subscription->id;
     $invoice->gateway_id = $subscription->gateway_id;
     $invoice->status = $invoice_status;
     $invoice->invoice_date = MS_Helper_Period::current_date();
     $invoice->membership_id = $membership->id;
     $invoice->currency = MS_Plugin::instance()->settings->currency;
     $invoice->user_id = $member->id;
     $invoice->name = apply_filters('ms_model_invoice_name', sprintf(__('Invoice for %s - %s', MS_TEXT_DOMAIN), $membership->name, $member->username));
     $invoice->invoice_number = $invoice_number;
     $invoice->discount = 0;
     $invoice->notes = $notes;
     $invoice->amount = $membership->price;
     // Without taxes!
     // Check for trial period in the first period.
     if ($subscription->is_trial_eligible() && $invoice_number === $subscription->current_invoice_number) {
         $invoice->trial_price = $membership->trial_price;
         // Without taxes!
         $invoice->uses_trial = true;
         $invoice->trial_ends = $subscription->trial_expire_date;
     }
     $invoice->set_due_date();
     $invoice = apply_filters('ms_model_invoice_create_before_save', $invoice, $subscription);
     $invoice->save();
     // Refresh the tax-rate and payment description.
     $invoice->total_amount_changed();
     $invoice->save();
     return apply_filters('ms_model_relationship_create_invoice', $invoice, $subscription, $invoice_number);
 }