/** * @param Invoice $invoice * * @return Invoice */ public function duplicate(Invoice $invoice) { // We don't use 'clone', since cloning an invoice will clone all the item id's and nested values. // We rather set it manually $newInvoice = new Invoice(); $now = Carbon::now(); $newInvoice->setCreated($now); $newInvoice->setClient($invoice->getClient()); $newInvoice->setBaseTotal($invoice->getBaseTotal()); $newInvoice->setDiscount($invoice->getDiscount()); $newInvoice->setNotes($invoice->getNotes()); $newInvoice->setTotal($invoice->getTotal()); $newInvoice->setTerms($invoice->getTerms()); $newInvoice->setUsers($invoice->getUsers()->toArray()); $newInvoice->setBalance($newInvoice->getTotal()); if (null !== $invoice->getTax()) { $newInvoice->setTax($invoice->getTax()); } foreach ($invoice->getItems() as $item) { $invoiceItem = new Item(); $invoiceItem->setCreated($now); $invoiceItem->setTotal($item->getTotal()); $invoiceItem->setDescription($item->getDescription()); $invoiceItem->setPrice($item->getPrice()); $invoiceItem->setQty($item->getQty()); if (null !== $item->getTax()) { $invoiceItem->setTax($item->getTax()); } $newInvoice->addItem($invoiceItem); } $this->create($newInvoice); return $newInvoice; }