diff --git a/app/Http/Controllers/Admin/Manage/OrderController.php b/app/Http/Controllers/Admin/Manage/OrderController.php
index 0c11f59..fffeda9 100644
--- a/app/Http/Controllers/Admin/Manage/OrderController.php
+++ b/app/Http/Controllers/Admin/Manage/OrderController.php
@@ -8,6 +8,7 @@
use App\Enums\PriceType;
use App\Http\Controllers\Controller;
use App\Http\Requests\Admin\Manage\Order\OrderRequest;
+use App\Models\GeneralSetting;
use App\Models\Order;
use App\Models\OrderItem;
use App\Models\Product;
@@ -115,6 +116,16 @@ public function edit(Order $order): Response
]);
}
+ public function show(Order $order): Response
+ {
+ $order->load(['items.product', 'user']);
+
+ return Inertia::render('admin/manage/order/show', [
+ 'order' => $order,
+ 'setting' => GeneralSetting::first(),
+ ]);
+ }
+
public function update(OrderRequest $request, Order $order): RedirectResponse
{
$validated = $request->validated();
diff --git a/resources/js/pages/admin/manage/order/partials/columns.tsx b/resources/js/pages/admin/manage/order/partials/columns.tsx
index 46aef4f..5e03742 100644
--- a/resources/js/pages/admin/manage/order/partials/columns.tsx
+++ b/resources/js/pages/admin/manage/order/partials/columns.tsx
@@ -12,7 +12,7 @@ import type { Order } from '@/types/order';
import { ORDER_CHANNEL, ORDER_STATUS, PAYMENT_METHOD } from '@/types/order';
import { Link } from '@inertiajs/react';
import type { ColumnDef } from '@tanstack/react-table';
-import { Pencil, Printer, Trash2 } from 'lucide-react';
+import { FileText, Pencil, Printer, Trash2 } from 'lucide-react';
interface ColumnProps {
onDelete: (order: Order) => void;
@@ -182,6 +182,22 @@ export const getColumns = ({
return (
+
+
+
+
+
+
+
+
+
+ Invoice
+
+
+
+
+ {/* Header / Actions */}
+
+
+
+
+
+
+
+ Detail Pesanan
+
+
+ Invoice #{order.order_number}
+
+
+
+
+ {/* Actions removed as requested */}
+
+
+
+ {/* Invoice Card */}
+
+
+
+
+
+
+
+ {setting?.logo_light_url ? (
+
+ ) : (
+
+ {setting?.name?.charAt(0) || 'V'}
+
+ )}
+
+
{setting?.name || 'VN Grup'}
+
Your Style, Our Passion
+
+
+
+
{setting?.address || 'Alamat Toko Belum Diatur'}
+
{setting?.phone || '-'}
+
+
+
+
+
+
INVOICE
+
#{order.order_number}
+
+
+
Tanggal Pesanan: {order.created_at_formatted}
+
Channel: {ORDER_CHANNEL[order.order_channel] || order.order_channel}
+
+ Status:
+
+ {ORDER_STATUS[order.order_status]?.label ?? order.order_status}
+
+
+
+
+
+
+
+
+
+
+
Tagihan Untuk:
+
+
{order.customer_name}
+
Pelanggan Setia
+
+
+
+
Pembayaran:
+
+
{PAYMENT_METHOD[order.payment_method] || order.payment_method}
+
+
+
+
+
+
+
+
+
+
+ #
+ Produk
+ Harga
+ Jumlah
+ Total
+
+
+
+ {order.items?.map((item, index) => (
+
+ {index + 1}
+
+ {item.product?.name || 'Produk Tidak Diketahui'}
+ {item.price_type}
+
+ {item.price_formatted}
+ {item.qty}
+ {item.total_formatted}
+
+ ))}
+
+
+
+
+
+
+
+
Catatan:
+
+ Terima kasih telah berbelanja di {setting?.name || 'VN Grup'}.
+ Barang yang sudah dibeli tidak dapat ditukar atau dikembalikan kecuali ada perjanjian sebelumnya.
+ Simpan invoice ini sebagai bukti pembelian yang sah.
+
+
+
+
+ Dicatat oleh: {order.user?.name || '-'}
+
+
+
+
+
+ Subtotal
+ {order.subtotal_formatted}
+
+
+ Potongan / Diskon
+ - {order.discount_formatted}
+
+
+
+ Total Tagihan
+ {order.total_formatted}
+
+
+ Sudah Dibayar
+ {order.payment_formatted}
+
+
+
+
+
+
Semoga hari Anda menyenangkan!
+
Generated by {setting?.name || 'VN Grup'} System
+
+
+
+
+ );
+}
+
+OrderShow.layout = (page: any) => (
+ {page}
+);
diff --git a/routes/manage.php b/routes/manage.php
index a8f3350..48da690 100644
--- a/routes/manage.php
+++ b/routes/manage.php
@@ -24,6 +24,7 @@
Route::get('orders', [OrderController::class, 'index'])->name('order.index')->middleware('can:View:Order');
Route::get('order/create', [OrderController::class, 'create'])->name('order.create')->middleware('can:Create:Order');
Route::post('order/store', [OrderController::class, 'store'])->name('order.store')->middleware('can:Create:Order');
+ Route::get('order/show/{order}', [OrderController::class, 'show'])->name('order.show')->middleware('can:View:Order');
Route::get('order/edit/{order}', [OrderController::class, 'edit'])->name('order.edit')->middleware('can:Edit:Order');
Route::patch('order/update/{order}', [OrderController::class, 'update'])->name('order.update')->middleware('can:Edit:Order');
Route::delete('order/destroy/{order}', [OrderController::class, 'destroy'])->name('order.destroy')->middleware('can:Delete:Order');
diff --git a/tests/Feature/Admin/Manage/OrderTest.php b/tests/Feature/Admin/Manage/OrderTest.php
index 20c5305..5810ae3 100644
--- a/tests/Feature/Admin/Manage/OrderTest.php
+++ b/tests/Feature/Admin/Manage/OrderTest.php
@@ -4,6 +4,7 @@
use App\Enums\OrderStatus;
use App\Enums\PaymentMethod;
use App\Enums\PriceType;
+use App\Models\GeneralSetting;
use App\Models\Order;
use App\Models\OrderItem;
use App\Models\Product;
@@ -45,6 +46,13 @@
'DeleteAny:Order',
]);
actingAs($user);
+
+ GeneralSetting::create([
+ 'name' => 'VN Grup',
+ 'phone' => '08123456789',
+ 'address' => 'Jl. Test No. 1',
+ 'description' => 'Test Description',
+ ]);
});
it('can access order index page', function () {
@@ -74,6 +82,42 @@
);
});
+ it('can access order show page', function () {
+ $order = Order::factory()
+ ->has(OrderItem::factory()->count(2), 'items')
+ ->create();
+
+ get(route('order.show', $order))
+ ->assertOk()
+ ->assertInertia(fn ($page) => $page
+ ->component('admin/manage/order/show')
+ ->has('order', fn ($page) => $page
+ ->where('id', $order->id)
+ ->has('items', 2)
+ ->has('items.0.product')
+ ->has('user')
+ ->etc()
+ )
+ ->has('setting')
+ );
+ });
+
+ it('can access order edit page', function () {
+ $order = Order::factory()->create();
+
+ get(route('order.edit', $order))
+ ->assertOk()
+ ->assertInertia(fn ($page) => $page
+ ->component('admin/manage/order/edit')
+ ->has('order')
+ ->has('products')
+ ->has('orderStatus')
+ ->has('orderChannels')
+ ->has('paymentMethods')
+ ->has('priceTypes')
+ );
+ });
+
it('can manage cart items', function () {
$product = Product::factory()->create(['stock' => 10]);
@@ -275,6 +319,12 @@
actingAs(createUnauthorizedUser());
});
+ it('cannot view an order without permission', function () {
+ $order = Order::factory()->create();
+ get(route('order.show', $order))
+ ->assertStatus(403);
+ });
+
it('cannot store an order without permission', function () {
postJson(route('order.store'), ['customer_name' => 'Unauthorized'])
->assertStatus(403);