Files
2025-07-24 16:18:27 +07:00

81 lines
2.3 KiB
PHP

<?php
namespace App\Http\Services\Invoice;
use App\Enums\Invoice\InvoiceStatus;
use App\Models\Invoice;
use App\Models\InvoiceAddons;
use App\Models\InvoiceItem;
use App\Models\Order;
use Illuminate\Http\Client\Request;
class InvoiceService
{
public function createInvoice(Order $order): Invoice
{
$productTypes = collect($order->orderItems)->pluck('product_type');
$invoiceType = match (true) {
$productTypes->contains(3) => 3,
$productTypes->contains(4) => 4,
default => 1,
};
$maxMonths = $order->orderItems->max('months') ?? 1;
$dueDate = now()->addMonths($maxMonths);
$invoice = Invoice::create([
'date' => now(),
'order_num' => $order->order_num,
'due_date' => $dueDate,
'date_paid' => now(),
'sub_total' => $order->amount,
'tax' => 0,
'total' => $order->amount,
'customer_id' => $order->customer_id,
'client_ip' => request()->ip(),
'order_id' => $order->id,
'note' => 'Thanh toán đơn hàng #' . $order->order_num,
'invoice_type' => $invoiceType,
'status' => 1,
]);
foreach ($order->orderItems as $item) {
$invoiceItem = InvoiceItem::create([
'invoice_id' => $invoice->id,
'product_id' => $item->product_id,
'months' => $item->months,
'os_id' => $item->os_id,
'server_name' => $item->server_name,
'quantity' => $item->quantity,
'price' => $item->price,
'product_type' => $item->product_type,
]);
foreach ($item->addons as $addon) {
InvoiceAddons::create([
'invoice_item_id' => $invoiceItem->id,
'addon_id' => $addon->addon_id,
'qty' => $addon->qty,
'price' => $addon->price,
]);
}
}
$order->update(['invoice_id' => $invoice->id]);
return $invoice;
}
public function markAsPaid(Invoice $invoice): Invoice
{
$invoice->update([
'status' => InvoiceStatus::PAID->value,
'date_paid' => now(),
]);
return $invoice;
}
}