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