diff --git a/app/Http/Controllers/Admin/Master/CustomerController.php b/app/Http/Controllers/Admin/Master/CustomerController.php
index 4c8affc..6ad344c 100644
--- a/app/Http/Controllers/Admin/Master/CustomerController.php
+++ b/app/Http/Controllers/Admin/Master/CustomerController.php
@@ -8,6 +8,7 @@
use App\Http\Requests\Admin\Master\CustomerRequest;
use App\Models\Customer;
use App\Services\Master\CustomerService;
+use Illuminate\Http\JsonResponse;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Inertia\Inertia;
@@ -41,6 +42,18 @@ public function store(CustomerRequest $request): RedirectResponse
return redirect()->route('admin.master.customers.index');
}
+ public function storeApi(CustomerRequest $request): JsonResponse
+ {
+ $this->customerService->create($request->validated());
+
+ $customer = Customer::query()->latest()->first();
+
+ return response()->json([
+ 'id' => $customer->id,
+ 'name' => $customer->name,
+ ]);
+ }
+
public function update(CustomerRequest $request, Customer $customer): RedirectResponse
{
$this->customerService->update($customer, $request->validated());
diff --git a/resources/js/components/admin/manage/orders/CustomerQuickCreateModal.vue b/resources/js/components/admin/manage/orders/CustomerQuickCreateModal.vue
new file mode 100644
index 0000000..dbc8080
--- /dev/null
+++ b/resources/js/components/admin/manage/orders/CustomerQuickCreateModal.vue
@@ -0,0 +1,121 @@
+
+
+
+
+
diff --git a/resources/js/components/admin/manage/orders/OrderPosForm.vue b/resources/js/components/admin/manage/orders/OrderPosForm.vue
index 8e3eab4..f9c5e7c 100644
--- a/resources/js/components/admin/manage/orders/OrderPosForm.vue
+++ b/resources/js/components/admin/manage/orders/OrderPosForm.vue
@@ -5,6 +5,7 @@ import { computed, ref, watch } from 'vue';
import { toast } from 'vue-sonner';
import PosCatalogCard from '@/components/admin/manage/PosCatalogCard.vue';
import PosCatalogVariantThumb from '@/components/admin/manage/PosCatalogVariantThumb.vue';
+import CustomerQuickCreateModal from '@/components/admin/manage/orders/CustomerQuickCreateModal.vue';
import { NumberInput } from '@/components/form/number-input';
import { RupiahInput } from '@/components/form/rupiah-input';
import { Button } from '@/components/ui/button';
@@ -37,6 +38,7 @@ import { Textarea } from '@/components/ui/textarea';
import { OrderChannel } from '@/constants/order-channel';
import { apiFetch } from '@/lib/api';
import { getFirstCoverImage } from '@/lib/catalog-cover';
+import { useCan } from '@/composables/useCan';
import { formErrors } from '@/lib/form';
import { formatRupiah, parseRupiah } from '@/lib/rupiah';
import type { Auth } from '@/types/auth';
@@ -71,6 +73,8 @@ const props = defineProps<{
const isCreateMode = computed(() => props.method === 'post');
+const { can } = useCan();
+
const page = usePage();
const authUser = computed(() => (page.props.auth as Auth).user);
const isMarketingUser = computed(() =>
@@ -79,6 +83,12 @@ const isMarketingUser = computed(() =>
const search = ref('');
const cart = ref([]);
+const customerFormOpen = ref(false);
+
+function onCustomerCreated(customer: { id: number; name: string }) {
+ props.customers.push({ value: customer.id, label: customer.name });
+ form.customer_id = String(customer.id);
+}
// Auto-fill marketing_id with logged-in user's id if they are marketing role
const defaultMarketingId = computed(() =>
@@ -591,19 +601,25 @@ function submit() {
Pelanggan
-
+
+
+
+
@@ -727,4 +743,6 @@ function submit() {
+
+
diff --git a/routes/web.php b/routes/web.php
index ca77252..e24e06d 100644
--- a/routes/web.php
+++ b/routes/web.php
@@ -156,6 +156,10 @@
->middleware('permission:'.Permission::CUSTOMERS_CREATE->value)
->name('store');
+ Route::post('api', [CustomerController::class, 'storeApi'])
+ ->middleware('permission:'.Permission::CUSTOMERS_CREATE->value)
+ ->name('store.api');
+
Route::put('{customer}', [CustomerController::class, 'update'])
->middleware('permission:'.Permission::CUSTOMERS_UPDATE->value)
->name('update');