![]() Server : Apache System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64 User : corals ( 1002) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/corals/job-board.corals.io/Corals/modules/Reservation/Classes/ |
<?php namespace Corals\Modules\Reservation\Classes; use Corals\Modules\Payment\Common\Models\Invoice; use Corals\Modules\Payment\Common\Models\InvoiceItem; use Corals\Modules\Reservation\Facades\RatesFacade; use Corals\Modules\Reservation\Models\LineItemValue; use Corals\Modules\Reservation\Models\Reservation; use Corals\User\Models\User; use Illuminate\Support\Facades\DB; class Invoices { /** * @param Reservation $reservation * @param array $lineItems * @return Invoice */ public function generate(Reservation $reservation, array $lineItems) { try { DB::beginTransaction(); RatesFacade::calculateLineItemValues($reservation, $lineItems); return tap($this->createInvoice($reservation), function (Invoice $invoice) { $this->createInvoiceItems($invoice); DB::commit(); }); } catch (\Exception $e) { DB::rollback(); log_exception($e); } } /** * @param Reservation $reservation * @return \Illuminate\Database\Eloquent\Model */ protected function createInvoice(Reservation $reservation) { $total = $reservation->lineItemValues()->sum('value'); if ($invoice = $reservation->invoice) { $this->deleteInvoice($invoice); } $user_id = null; if ($reservation->owner_type === getMorphAlias(User::class)) { $user_id = $reservation->owner_id; } return $reservation->invoice()->create([ 'code' => Invoice::getCode('INV'), 'currency' => 'USD', 'description' => null, 'terms' => null, 'status' => 'pending', 'due_date' => now(), 'invoice_date' => now(), 'sub_total' => $total, 'total' => $total, 'user_id' => $user_id, ]); } /** * @param Invoice $invoice * @return Invoice */ protected function createInvoiceItems(Invoice $invoice) { $reservation = $invoice->invoicable; $reservation->lineItemValues ->each(function (LineItemValue $lineItemValue) use ($invoice) { $lineItem = $lineItemValue->lineItem; $invoiceItem = InvoiceItem::create([ 'code' => InvoiceItem::getCode('INV'), 'amount' => $lineItemValue->value, 'invoice_id' => $invoice->id, 'itemable_type' => getMorphAlias($lineItem), 'itemable_id' => $lineItem->id, 'description' => $lineItem->description, 'quantity' => $lineItemValue->getProperty('quantity', 1) ]); }); return $invoice; } /** * @param Invoice $invoice */ public function deleteInvoice(Invoice $invoice): void { $invoice->items()->forceDelete(); $invoice->forceDelete(); } /** * @param Invoice $invoice */ public function cancelInvoice(Invoice $invoice) { $invoice->update(['status' => 'cancelled']); } }