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;
}