diff --git a/app/Helpers/OrderHelper.php b/app/Helpers/OrderHelper.php index 60f9c53..37556a1 100644 --- a/app/Helpers/OrderHelper.php +++ b/app/Helpers/OrderHelper.php @@ -23,7 +23,7 @@ class OrderHelper $number = $prefix . '-' . strtoupper(Str::random(8)); $exists = match ($prefix) { - 'INV' => Invoice::where('invoice_num', $number)->exists(), + 'INV' => Invoice::where('invoice_number', $number)->exists(), default => Order::where('order_num', $number)->exists(), }; } while ($exists); diff --git a/app/Http/Controllers/Api/Admin/Invoice/InvoiceController.php b/app/Http/Controllers/Api/Admin/Invoice/InvoiceController.php index 61bad8f..a613fcf 100644 --- a/app/Http/Controllers/Api/Admin/Invoice/InvoiceController.php +++ b/app/Http/Controllers/Api/Admin/Invoice/InvoiceController.php @@ -58,14 +58,14 @@ class InvoiceController extends Controller ); return DataTables::eloquent($query) - ->addColumn('invoice_num', fn($d) => $d->invoice_num) + ->addColumn('invoice_number', fn($d) => $d->invoice_number) ->addColumn('date', fn($d) => $d->date) ->addColumn('customer', fn($d) => $d->customer?->fullname) ->addColumn('payment', fn($d) => $d->payment?->name) ->addColumn('total', fn($d) => $d->total) ->addColumn('status', fn($d) => $d->status) ->addColumn('action', fn($d) => $d->id) - ->rawColumns(['invoice_num', 'date', 'customer', 'payment', 'total', 'status', 'action']) + ->rawColumns(['invoice_number', 'date', 'customer', 'payment', 'total', 'status', 'action']) ->make(true); } diff --git a/app/Http/Controllers/Api/Service/OrderController.php b/app/Http/Controllers/Api/Service/OrderController.php index c715037..7cfebac 100644 --- a/app/Http/Controllers/Api/Service/OrderController.php +++ b/app/Http/Controllers/Api/Service/OrderController.php @@ -466,7 +466,7 @@ class OrderController extends Controller return [ 'id' => $invoice->id, - 'invoice_number' => $invoice->invoice_number, + 'invoice_number' => $invoice->invoice_number, 'invoice_type' => $invoice->invoice_type, 'status' => $invoice->status, 'status_text' => InvoiceStatus::tryFrom((int) $invoice->status)?->label() ?? '-', diff --git a/app/Http/Controllers/admin/InvoiceController.php b/app/Http/Controllers/admin/InvoiceController.php index deb72a6..45deb4e 100644 --- a/app/Http/Controllers/admin/InvoiceController.php +++ b/app/Http/Controllers/admin/InvoiceController.php @@ -151,8 +151,8 @@ class InvoiceController extends Controller ); return DataTables::eloquent($query) - ->addColumn('invoice_num', function ($d) { - return view('administrator.pages.invoice.datatable.invoice_num', ['row' => $d])->render(); + ->addColumn('invoice_number', function ($d) { + return view('administrator.pages.invoice.datatable.invoice_number', ['row' => $d])->render(); }) ->addColumn('date', function ($d) { return view('administrator.pages.invoice.datatable.date', ['row' => $d])->render(); @@ -172,7 +172,7 @@ class InvoiceController extends Controller ->addColumn('action', function ($d) { return view('administrator.pages.invoice.datatable.action', ['row' => $d])->render(); }) - ->rawColumns(['invoice_num', 'date', 'customer', 'payment', 'total', 'status', 'action']) + ->rawColumns(['invoice_number', 'date', 'customer', 'payment', 'total', 'status', 'action']) ->make(true); } } diff --git a/app/Models/Os.php b/app/Models/Os.php index 791965b..c9c3d59 100644 --- a/app/Models/Os.php +++ b/app/Models/Os.php @@ -29,17 +29,6 @@ class Os extends Model default => 'De-Active' }; } - - /** - * Many-to-many relationship với VPS products. - */ - public function vpsProducts() - { - return $this->belongsToMany(\App\Models\VPS::class, 'product_os', 'os_id', 'product_id') - ->withTimestamps() - ->withPivot('product_type'); - } - /** * Many-to-many relationship với Products (new table: os_product) */ diff --git a/app/Models/Product.php b/app/Models/Product.php index 6b4bc6d..a62223b 100644 --- a/app/Models/Product.php +++ b/app/Models/Product.php @@ -80,7 +80,7 @@ class Product extends Model */ public function operatingSystems() { - return $this->belongsToMany(Os::class, 'product_os', 'product_id', 'os_id') + return $this->belongsToMany(Os::class, 'os_product', 'product_id', 'os_id') ->withTimestamps(); } diff --git a/app/Repositories/Api/Invoice/InvoiceRepository.php b/app/Repositories/Api/Invoice/InvoiceRepository.php index 10c5cbd..d8cca1b 100644 --- a/app/Repositories/Api/Invoice/InvoiceRepository.php +++ b/app/Repositories/Api/Invoice/InvoiceRepository.php @@ -36,7 +36,7 @@ class InvoiceRepository extends BaseApiRepository implements InvoiceRepositoryIn public function createFromOrder(Order $order): Invoice { $invoice = $this->model->create([ - 'invoice_number' => OrderHelper::generateOrderNumber('INV'), + 'invoice_number' => OrderHelper::generateOrderNumber('INV'), 'customer_id' => $order->customer_id, 'order_id' => $order->id, 'invoice_type' => 1, // new service diff --git a/app/Services/OrderService.php b/app/Services/OrderService.php index c4da297..b967ec0 100644 --- a/app/Services/OrderService.php +++ b/app/Services/OrderService.php @@ -42,14 +42,14 @@ class OrderService [$productItems, $relIdData, $total] = $this->buildProductItems($data); $invoiceData = [ - 'date' => Carbon::today()->toDateString(), + 'invoice_number' => Helper::generateUniqueCode(), 'due_date' => Carbon::today()->toDateString(), - 'date_paid' => (int) $data['status'] === 1 ? Carbon::today()->toDateString() : null, + 'paid_at' => (int) $data['status'] === 1 ? Carbon::today()->toDateString() : null, 'sub_total' => $total, 'tax' => $total * (10 / 100), 'total' => $total + ($total * (10 / 100)), 'payment_method' => $paymentRecord?->id, - 'customer_id' => ($data['create_invoice'] ?? false) ? $data['customer_id'] : 0, + 'customer_id' => $data['customer_id'], 'status' => $data['status'], ]; @@ -84,10 +84,15 @@ class OrderService $this->createModules($relIdData); - $invoiceItemData = array_map( - fn ($item) => \Illuminate\Support\Arr::except($item, ['billing_cycle', 'code']), - $productItems - ); + $invoiceItemData = array_map(fn ($item) => [ + 'invoice_id' => $item['invoice_id'], + 'product_id' => $item['product_id'], + 'type' => 'service', + 'months' => $item['months'], + 'quantity' => $item['quantity'], + 'unit_price' => $item['price'], + 'total_price' => $item['price'] * $item['quantity'], + ], $productItems); $this->invoiceItemRepository->insert($invoiceItemData); $now = now(); diff --git a/database/migrations/2024_02_03_095630_module_vmware.php b/database/migrations/2024_02_03_095630_module_vmware.php index 327c1d7..7bbe6b3 100644 --- a/database/migrations/2024_02_03_095630_module_vmware.php +++ b/database/migrations/2024_02_03_095630_module_vmware.php @@ -18,10 +18,10 @@ return new class extends Migration $table->string('name')->nullable(); $table->foreignId('module_ip_address') - ->constrained('module_ip_address'); + ->constrained('module_ip_address')->nullable(); $table->foreignId('vcenter_id') - ->constrained('module_vcenter'); + ->constrained('module_vcenter')->nullable(); $table->integer('port')->nullable(); $table->integer('order_id')->nullable(); diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index 737e76d..b0e5734 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -23,6 +23,6 @@ class DatabaseSeeder extends Seeder $this->call(TemplateSeeder::class); $this->call(Setting::class); $this->call(ControlPanelSeeder::class); - $this->call(VPSProductSeeder::class); + // $this->call(VPSProductSeeder::class); } }