App\Ninja\Repositories\InvoiceRepository::cloneInvoice PHP Method

cloneInvoice() public method

public cloneInvoice ( Invoice $invoice, null $quotePublicId = null ) : mixed
$invoice app\models\Invoice
$quotePublicId null
return mixed
    public function cloneInvoice(Invoice $invoice, $quotePublicId = null)
    {
        $invoice->load('invitations', 'invoice_items');
        $account = $invoice->account;
        $clone = Invoice::createNew($invoice);
        $clone->balance = $invoice->amount;
        // if the invoice prefix is diff than quote prefix, use the same number for the invoice (if it's available)
        $invoiceNumber = false;
        if ($account->hasInvoicePrefix() && $account->share_counter) {
            $invoiceNumber = $invoice->invoice_number;
            if ($account->quote_number_prefix && strpos($invoiceNumber, $account->quote_number_prefix) === 0) {
                $invoiceNumber = substr($invoiceNumber, strlen($account->quote_number_prefix));
            }
            $invoiceNumber = $account->invoice_number_prefix . $invoiceNumber;
            if (Invoice::scope(false, $account->id)->withTrashed()->whereInvoiceNumber($invoiceNumber)->first()) {
                $invoiceNumber = false;
            }
        }
        $clone->invoice_number = $invoiceNumber ?: $account->getNextInvoiceNumber($clone);
        $clone->invoice_date = date_create()->format('Y-m-d');
        foreach (['client_id', 'discount', 'is_amount_discount', 'po_number', 'is_recurring', 'frequency_id', 'start_date', 'end_date', 'terms', 'invoice_footer', 'public_notes', 'invoice_design_id', 'tax_name1', 'tax_rate1', 'tax_name2', 'tax_rate2', 'amount', 'invoice_type_id', 'custom_value1', 'custom_value2', 'custom_taxes1', 'custom_taxes2', 'partial', 'custom_text_value1', 'custom_text_value2'] as $field) {
            $clone->{$field} = $invoice->{$field};
        }
        if ($quotePublicId) {
            $clone->invoice_type_id = INVOICE_TYPE_STANDARD;
            $clone->quote_id = $quotePublicId;
            if ($account->invoice_terms) {
                $clone->terms = $account->invoice_terms;
            }
        }
        $clone->save();
        if ($quotePublicId) {
            $invoice->quote_invoice_id = $clone->public_id;
            $invoice->save();
        }
        foreach ($invoice->invoice_items as $item) {
            $cloneItem = InvoiceItem::createNew($invoice);
            foreach (['product_id', 'product_key', 'notes', 'cost', 'qty', 'tax_name1', 'tax_rate1', 'tax_name2', 'tax_rate2'] as $field) {
                $cloneItem->{$field} = $item->{$field};
            }
            $clone->invoice_items()->save($cloneItem);
        }
        foreach ($invoice->documents as $document) {
            $cloneDocument = $document->cloneDocument();
            $clone->documents()->save($cloneDocument);
        }
        foreach ($invoice->invitations as $invitation) {
            $cloneInvitation = Invitation::createNew($invoice);
            $cloneInvitation->contact_id = $invitation->contact_id;
            $cloneInvitation->invitation_key = str_random(RANDOM_KEY_LENGTH);
            $clone->invitations()->save($cloneInvitation);
        }
        return $clone;
    }

Usage Example

 /**
  * @param $quote
  * @param Invitation|null $invitation
  * @return mixed
  */
 public function convertQuote($quote)
 {
     return $this->invoiceRepo->cloneInvoice($quote, $quote->id);
 }