diff --git a/app/Http/Controllers/Finance/ConsultingFeeController.php b/app/Http/Controllers/Finance/ConsultingFeeController.php new file mode 100644 index 00000000..82de601f --- /dev/null +++ b/app/Http/Controllers/Finance/ConsultingFeeController.php @@ -0,0 +1,87 @@ +input('search')) { + $query->where(function ($q) use ($search) { + $q->where('consultant', 'like', "%{$search}%") + ->orWhere('customer', 'like', "%{$search}%"); + }); + } + if ($status = $request->input('status')) { + if ($status !== 'all') $query->where('status', $status); + } + + $fees = $query->orderBy('date', 'desc')->get()->map(fn($item) => [ + 'id' => $item->id, 'date' => $item->date?->format('Y-m-d'), + 'consultant' => $item->consultant, 'customer' => $item->customer, + 'service' => $item->service, 'hours' => $item->hours, + 'hourlyRate' => $item->hourly_rate, 'amount' => $item->amount, + 'status' => $item->status, 'memo' => $item->memo, + ]); + + $all = ConsultingFee::forTenant($tenantId)->get(); + $stats = [ + 'totalAmount' => $all->sum('amount'), + 'paidAmount' => $all->where('status', 'paid')->sum('amount'), + 'pendingAmount' => $all->where('status', 'pending')->sum('amount'), + 'totalHours' => $all->sum('hours'), + ]; + + return response()->json(['success' => true, 'data' => $fees, 'stats' => $stats]); + } + + public function store(Request $request): JsonResponse + { + $request->validate(['consultant' => 'required|string|max:100', 'amount' => 'required|integer|min:0']); + $tenantId = session('selected_tenant_id', 1); + + ConsultingFee::create([ + 'tenant_id' => $tenantId, 'date' => $request->input('date'), + 'consultant' => $request->input('consultant'), 'customer' => $request->input('customer'), + 'service' => $request->input('service'), 'hours' => $request->input('hours', 0), + 'hourly_rate' => $request->input('hourlyRate', 0), + 'amount' => $request->input('amount', 0), + 'status' => $request->input('status', 'pending'), 'memo' => $request->input('memo'), + ]); + + return response()->json(['success' => true, 'message' => '컨설팅비가 등록되었습니다.']); + } + + public function update(Request $request, int $id): JsonResponse + { + $tenantId = session('selected_tenant_id', 1); + $item = ConsultingFee::forTenant($tenantId)->findOrFail($id); + $request->validate(['consultant' => 'required|string|max:100', 'amount' => 'required|integer|min:0']); + + $item->update([ + 'date' => $request->input('date'), 'consultant' => $request->input('consultant'), + 'customer' => $request->input('customer'), 'service' => $request->input('service'), + 'hours' => $request->input('hours', $item->hours), + 'hourly_rate' => $request->input('hourlyRate', $item->hourly_rate), + 'amount' => $request->input('amount'), + 'status' => $request->input('status', $item->status), 'memo' => $request->input('memo'), + ]); + + return response()->json(['success' => true, 'message' => '컨설팅비가 수정되었습니다.']); + } + + public function destroy(int $id): JsonResponse + { + $tenantId = session('selected_tenant_id', 1); + ConsultingFee::forTenant($tenantId)->findOrFail($id)->delete(); + return response()->json(['success' => true, 'message' => '컨설팅비가 삭제되었습니다.']); + } +} diff --git a/app/Http/Controllers/Finance/CustomerController.php b/app/Http/Controllers/Finance/CustomerController.php new file mode 100644 index 00000000..57eeb594 --- /dev/null +++ b/app/Http/Controllers/Finance/CustomerController.php @@ -0,0 +1,93 @@ +input('search')) { + $query->where(function ($q) use ($search) { + $q->where('name', 'like', "%{$search}%") + ->orWhere('ceo', 'like', "%{$search}%") + ->orWhere('manager', 'like', "%{$search}%"); + }); + } + if ($status = $request->input('status')) { + if ($status !== 'all') $query->where('status', $status); + } + if ($grade = $request->input('grade')) { + if ($grade !== 'all') $query->where('grade', $grade); + } + + $customers = $query->orderBy('created_at', 'desc')->get()->map(fn($item) => [ + 'id' => $item->id, 'name' => $item->name, 'bizNo' => $item->biz_no, + 'ceo' => $item->ceo, 'industry' => $item->industry, 'grade' => $item->grade, + 'contact' => $item->contact, 'email' => $item->email, 'address' => $item->address, + 'manager' => $item->manager, 'managerPhone' => $item->manager_phone, + 'status' => $item->status, 'memo' => $item->memo, + ]); + + $all = Customer::forTenant($tenantId)->get(); + $stats = [ + 'total' => $all->count(), + 'active' => $all->where('status', 'active')->count(), + 'vip' => $all->where('grade', 'VIP')->count(), + 'inactive' => $all->where('status', 'inactive')->count(), + ]; + + return response()->json(['success' => true, 'data' => $customers, 'stats' => $stats]); + } + + public function store(Request $request): JsonResponse + { + $request->validate(['name' => 'required|string|max:100']); + $tenantId = session('selected_tenant_id', 1); + + Customer::create([ + 'tenant_id' => $tenantId, 'name' => $request->input('name'), + 'biz_no' => $request->input('bizNo'), 'ceo' => $request->input('ceo'), + 'industry' => $request->input('industry'), 'grade' => $request->input('grade', 'Silver'), + 'contact' => $request->input('contact'), 'email' => $request->input('email'), + 'address' => $request->input('address'), 'manager' => $request->input('manager'), + 'manager_phone' => $request->input('managerPhone'), + 'status' => $request->input('status', 'active'), 'memo' => $request->input('memo'), + ]); + + return response()->json(['success' => true, 'message' => '고객사가 등록되었습니다.']); + } + + public function update(Request $request, int $id): JsonResponse + { + $tenantId = session('selected_tenant_id', 1); + $item = Customer::forTenant($tenantId)->findOrFail($id); + $request->validate(['name' => 'required|string|max:100']); + + $item->update([ + 'name' => $request->input('name'), 'biz_no' => $request->input('bizNo'), + 'ceo' => $request->input('ceo'), 'industry' => $request->input('industry'), + 'grade' => $request->input('grade', $item->grade), + 'contact' => $request->input('contact'), 'email' => $request->input('email'), + 'address' => $request->input('address'), 'manager' => $request->input('manager'), + 'manager_phone' => $request->input('managerPhone'), + 'status' => $request->input('status', $item->status), 'memo' => $request->input('memo'), + ]); + + return response()->json(['success' => true, 'message' => '고객사가 수정되었습니다.']); + } + + public function destroy(int $id): JsonResponse + { + $tenantId = session('selected_tenant_id', 1); + Customer::forTenant($tenantId)->findOrFail($id)->delete(); + return response()->json(['success' => true, 'message' => '고객사가 삭제되었습니다.']); + } +} diff --git a/app/Http/Controllers/Finance/CustomerSettlementController.php b/app/Http/Controllers/Finance/CustomerSettlementController.php new file mode 100644 index 00000000..eca0e8dc --- /dev/null +++ b/app/Http/Controllers/Finance/CustomerSettlementController.php @@ -0,0 +1,90 @@ +input('search')) { + $query->where(function ($q) use ($search) { + $q->where('customer', 'like', "%{$search}%"); + }); + } + if ($status = $request->input('status')) { + if ($status !== 'all') $query->where('status', $status); + } + + $settlements = $query->orderBy('created_at', 'desc')->get()->map(fn($item) => [ + 'id' => $item->id, 'period' => $item->period, + 'customer' => $item->customer, 'totalSales' => $item->total_sales, + 'commission' => $item->commission, 'expense' => $item->expense, + 'netAmount' => $item->net_amount, 'status' => $item->status, + 'settledDate' => $item->settled_date?->format('Y-m-d'), 'memo' => $item->memo, + ]); + + $all = CustomerSettlement::forTenant($tenantId)->get(); + $stats = [ + 'totalSales' => $all->sum('total_sales'), + 'totalCommission' => $all->sum('commission'), + 'totalNet' => $all->sum('net_amount'), + 'settledAmount' => $all->where('status', 'settled')->sum('net_amount'), + ]; + + return response()->json(['success' => true, 'data' => $settlements, 'stats' => $stats]); + } + + public function store(Request $request): JsonResponse + { + $request->validate(['customer' => 'required|string|max:100']); + $tenantId = session('selected_tenant_id', 1); + + CustomerSettlement::create([ + 'tenant_id' => $tenantId, 'period' => $request->input('period'), + 'customer' => $request->input('customer'), + 'total_sales' => $request->input('totalSales', 0), + 'commission' => $request->input('commission', 0), + 'expense' => $request->input('expense', 0), + 'net_amount' => $request->input('netAmount', 0), + 'status' => $request->input('status', 'pending'), + 'settled_date' => $request->input('settledDate'), 'memo' => $request->input('memo'), + ]); + + return response()->json(['success' => true, 'message' => '정산이 등록되었습니다.']); + } + + public function update(Request $request, int $id): JsonResponse + { + $tenantId = session('selected_tenant_id', 1); + $item = CustomerSettlement::forTenant($tenantId)->findOrFail($id); + $request->validate(['customer' => 'required|string|max:100']); + + $item->update([ + 'period' => $request->input('period', $item->period), + 'customer' => $request->input('customer'), + 'total_sales' => $request->input('totalSales', $item->total_sales), + 'commission' => $request->input('commission', $item->commission), + 'expense' => $request->input('expense', $item->expense), + 'net_amount' => $request->input('netAmount', $item->net_amount), + 'status' => $request->input('status', $item->status), + 'settled_date' => $request->input('settledDate'), 'memo' => $request->input('memo'), + ]); + + return response()->json(['success' => true, 'message' => '정산이 수정되었습니다.']); + } + + public function destroy(int $id): JsonResponse + { + $tenantId = session('selected_tenant_id', 1); + CustomerSettlement::forTenant($tenantId)->findOrFail($id)->delete(); + return response()->json(['success' => true, 'message' => '정산이 삭제되었습니다.']); + } +} diff --git a/app/Http/Controllers/Finance/ExpenseController.php b/app/Http/Controllers/Finance/ExpenseController.php new file mode 100644 index 00000000..1977ce8b --- /dev/null +++ b/app/Http/Controllers/Finance/ExpenseController.php @@ -0,0 +1,92 @@ +input('search')) { + $query->where(function ($q) use ($search) { + $q->where('vendor', 'like', "%{$search}%") + ->orWhere('description', 'like', "%{$search}%"); + }); + } + if ($status = $request->input('status')) { + if ($status !== 'all') $query->where('status', $status); + } + if ($category = $request->input('category')) { + if ($category !== 'all') $query->where('category', $category); + } + + $expenses = $query->orderBy('date', 'desc')->get()->map(fn($item) => [ + 'id' => $item->id, 'date' => $item->date?->format('Y-m-d'), + 'vendor' => $item->vendor, 'description' => $item->description, + 'category' => $item->category, 'amount' => $item->amount, + 'status' => $item->status, 'paymentMethod' => $item->payment_method, + 'invoiceNo' => $item->invoice_no, 'memo' => $item->memo, + ]); + + $all = Expense::forTenant($tenantId)->get(); + $stats = [ + 'totalAmount' => $all->sum('amount'), + 'paidAmount' => $all->where('status', 'paid')->sum('amount'), + 'pendingAmount' => $all->where('status', 'pending')->sum('amount'), + 'count' => $all->count(), + ]; + + return response()->json(['success' => true, 'data' => $expenses, 'stats' => $stats]); + } + + public function store(Request $request): JsonResponse + { + $request->validate(['vendor' => 'required|string|max:100', 'amount' => 'required|integer|min:0']); + $tenantId = session('selected_tenant_id', 1); + + Expense::create([ + 'tenant_id' => $tenantId, 'date' => $request->input('date'), + 'vendor' => $request->input('vendor'), 'description' => $request->input('description'), + 'category' => $request->input('category', '기타지출'), + 'amount' => $request->input('amount', 0), + 'status' => $request->input('status', 'pending'), + 'payment_method' => $request->input('paymentMethod'), + 'invoice_no' => $request->input('invoiceNo'), 'memo' => $request->input('memo'), + ]); + + return response()->json(['success' => true, 'message' => '지출이 등록되었습니다.']); + } + + public function update(Request $request, int $id): JsonResponse + { + $tenantId = session('selected_tenant_id', 1); + $item = Expense::forTenant($tenantId)->findOrFail($id); + $request->validate(['vendor' => 'required|string|max:100', 'amount' => 'required|integer|min:0']); + + $item->update([ + 'date' => $request->input('date'), 'vendor' => $request->input('vendor'), + 'description' => $request->input('description'), + 'category' => $request->input('category', $item->category), + 'amount' => $request->input('amount'), + 'status' => $request->input('status', $item->status), + 'payment_method' => $request->input('paymentMethod'), + 'invoice_no' => $request->input('invoiceNo'), 'memo' => $request->input('memo'), + ]); + + return response()->json(['success' => true, 'message' => '지출이 수정되었습니다.']); + } + + public function destroy(int $id): JsonResponse + { + $tenantId = session('selected_tenant_id', 1); + Expense::forTenant($tenantId)->findOrFail($id)->delete(); + return response()->json(['success' => true, 'message' => '지출이 삭제되었습니다.']); + } +} diff --git a/app/Http/Controllers/Finance/IncomeController.php b/app/Http/Controllers/Finance/IncomeController.php new file mode 100644 index 00000000..551f7f06 --- /dev/null +++ b/app/Http/Controllers/Finance/IncomeController.php @@ -0,0 +1,85 @@ +input('search')) { + $query->where(function ($q) use ($search) { + $q->where('customer', 'like', "%{$search}%") + ->orWhere('description', 'like', "%{$search}%"); + }); + } + if ($status = $request->input('status')) { if ($status !== 'all') $query->where('status', $status); } + if ($category = $request->input('category')) { if ($category !== 'all') $query->where('category', $category); } + + $incomes = $query->orderBy('date', 'desc')->get()->map(fn($item) => [ + 'id' => $item->id, 'date' => $item->date?->format('Y-m-d'), + 'customer' => $item->customer, 'description' => $item->description, + 'category' => $item->category, 'amount' => $item->amount, + 'status' => $item->status, 'invoiceNo' => $item->invoice_no, 'memo' => $item->memo, + ]); + + $all = Income::forTenant($tenantId)->get(); + $stats = [ + 'totalAmount' => $all->sum('amount'), + 'completedAmount' => $all->where('status', 'completed')->sum('amount'), + 'pendingAmount' => $all->where('status', 'pending')->sum('amount'), + 'count' => $all->count(), + ]; + + return response()->json(['success' => true, 'data' => $incomes, 'stats' => $stats]); + } + + public function store(Request $request): JsonResponse + { + $request->validate(['customer' => 'required|string|max:100', 'amount' => 'required|integer|min:0']); + $tenantId = session('selected_tenant_id', 1); + + Income::create([ + 'tenant_id' => $tenantId, 'date' => $request->input('date'), + 'customer' => $request->input('customer'), 'description' => $request->input('description'), + 'category' => $request->input('category', '기타수입'), + 'amount' => $request->input('amount', 0), + 'status' => $request->input('status', 'pending'), + 'invoice_no' => $request->input('invoiceNo'), 'memo' => $request->input('memo'), + ]); + + return response()->json(['success' => true, 'message' => '수입이 등록되었습니다.']); + } + + public function update(Request $request, int $id): JsonResponse + { + $tenantId = session('selected_tenant_id', 1); + $item = Income::forTenant($tenantId)->findOrFail($id); + $request->validate(['customer' => 'required|string|max:100', 'amount' => 'required|integer|min:0']); + + $item->update([ + 'date' => $request->input('date'), 'customer' => $request->input('customer'), + 'description' => $request->input('description'), + 'category' => $request->input('category', $item->category), + 'amount' => $request->input('amount'), + 'status' => $request->input('status', $item->status), + 'invoice_no' => $request->input('invoiceNo'), 'memo' => $request->input('memo'), + ]); + + return response()->json(['success' => true, 'message' => '수입이 수정되었습니다.']); + } + + public function destroy(int $id): JsonResponse + { + $tenantId = session('selected_tenant_id', 1); + Income::forTenant($tenantId)->findOrFail($id)->delete(); + return response()->json(['success' => true, 'message' => '수입이 삭제되었습니다.']); + } +} diff --git a/app/Http/Controllers/Finance/PurchaseController.php b/app/Http/Controllers/Finance/PurchaseController.php new file mode 100644 index 00000000..308a9162 --- /dev/null +++ b/app/Http/Controllers/Finance/PurchaseController.php @@ -0,0 +1,90 @@ +input('search')) { + $query->where(function ($q) use ($search) { + $q->where('vendor', 'like', "%{$search}%") + ->orWhere('item', 'like', "%{$search}%"); + }); + } + if ($status = $request->input('status')) { + if ($status !== 'all') $query->where('status', $status); + } + if ($category = $request->input('category')) { + if ($category !== 'all') $query->where('category', $category); + } + + $purchases = $query->orderBy('date', 'desc')->get()->map(fn($item) => [ + 'id' => $item->id, 'date' => $item->date?->format('Y-m-d'), + 'vendor' => $item->vendor, 'item' => $item->item, + 'category' => $item->category, 'amount' => $item->amount, + 'vat' => $item->vat, 'status' => $item->status, + 'invoiceNo' => $item->invoice_no, 'memo' => $item->memo, + ]); + + $all = Purchase::forTenant($tenantId)->get(); + $stats = [ + 'totalAmount' => $all->sum('amount'), + 'totalVat' => $all->sum('vat'), + 'receivedAmount' => $all->where('status', 'received')->sum('amount'), + 'pendingAmount' => $all->where('status', 'pending')->sum('amount'), + ]; + + return response()->json(['success' => true, 'data' => $purchases, 'stats' => $stats]); + } + + public function store(Request $request): JsonResponse + { + $request->validate(['vendor' => 'required|string|max:100', 'amount' => 'required|integer|min:0']); + $tenantId = session('selected_tenant_id', 1); + + Purchase::create([ + 'tenant_id' => $tenantId, 'date' => $request->input('date'), + 'vendor' => $request->input('vendor'), 'item' => $request->input('item'), + 'category' => $request->input('category', '기타매입'), + 'amount' => $request->input('amount', 0), 'vat' => $request->input('vat', 0), + 'status' => $request->input('status', 'pending'), + 'invoice_no' => $request->input('invoiceNo'), 'memo' => $request->input('memo'), + ]); + + return response()->json(['success' => true, 'message' => '매입이 등록되었습니다.']); + } + + public function update(Request $request, int $id): JsonResponse + { + $tenantId = session('selected_tenant_id', 1); + $item = Purchase::forTenant($tenantId)->findOrFail($id); + $request->validate(['vendor' => 'required|string|max:100', 'amount' => 'required|integer|min:0']); + + $item->update([ + 'date' => $request->input('date'), 'vendor' => $request->input('vendor'), + 'item' => $request->input('item'), + 'category' => $request->input('category', $item->category), + 'amount' => $request->input('amount'), 'vat' => $request->input('vat', $item->vat), + 'status' => $request->input('status', $item->status), + 'invoice_no' => $request->input('invoiceNo'), 'memo' => $request->input('memo'), + ]); + + return response()->json(['success' => true, 'message' => '매입이 수정되었습니다.']); + } + + public function destroy(int $id): JsonResponse + { + $tenantId = session('selected_tenant_id', 1); + Purchase::forTenant($tenantId)->findOrFail($id)->delete(); + return response()->json(['success' => true, 'message' => '매입이 삭제되었습니다.']); + } +} diff --git a/app/Http/Controllers/Finance/SalesRecordController.php b/app/Http/Controllers/Finance/SalesRecordController.php new file mode 100644 index 00000000..2df87bbe --- /dev/null +++ b/app/Http/Controllers/Finance/SalesRecordController.php @@ -0,0 +1,89 @@ +input('search')) { + $query->where(function ($q) use ($search) { + $q->where('customer', 'like', "%{$search}%") + ->orWhere('project', 'like', "%{$search}%"); + }); + } + if ($status = $request->input('status')) { + if ($status !== 'all') $query->where('status', $status); + } + if ($type = $request->input('type')) { + if ($type !== 'all') $query->where('type', $type); + } + + $records = $query->orderBy('date', 'desc')->get()->map(fn($item) => [ + 'id' => $item->id, 'date' => $item->date?->format('Y-m-d'), + 'customer' => $item->customer, 'project' => $item->project, + 'type' => $item->type, 'amount' => $item->amount, + 'vat' => $item->vat, 'status' => $item->status, + 'invoiceNo' => $item->invoice_no, 'memo' => $item->memo, + ]); + + $all = SalesRecord::forTenant($tenantId)->get(); + $stats = [ + 'totalAmount' => $all->sum('amount'), + 'totalVat' => $all->sum('vat'), + 'confirmedAmount' => $all->where('status', 'completed')->sum('amount'), + 'contractedAmount' => $all->whereIn('status', ['contracted', 'invoiced'])->sum('amount'), + ]; + + return response()->json(['success' => true, 'data' => $records, 'stats' => $stats]); + } + + public function store(Request $request): JsonResponse + { + $request->validate(['customer' => 'required|string|max:100', 'amount' => 'required|integer|min:0']); + $tenantId = session('selected_tenant_id', 1); + + SalesRecord::create([ + 'tenant_id' => $tenantId, 'date' => $request->input('date'), + 'customer' => $request->input('customer'), 'project' => $request->input('project'), + 'type' => $request->input('type'), 'amount' => $request->input('amount', 0), + 'vat' => $request->input('vat', 0), + 'status' => $request->input('status', 'contracted'), + 'invoice_no' => $request->input('invoiceNo'), 'memo' => $request->input('memo'), + ]); + + return response()->json(['success' => true, 'message' => '매출이 등록되었습니다.']); + } + + public function update(Request $request, int $id): JsonResponse + { + $tenantId = session('selected_tenant_id', 1); + $item = SalesRecord::forTenant($tenantId)->findOrFail($id); + $request->validate(['customer' => 'required|string|max:100', 'amount' => 'required|integer|min:0']); + + $item->update([ + 'date' => $request->input('date'), 'customer' => $request->input('customer'), + 'project' => $request->input('project'), 'type' => $request->input('type', $item->type), + 'amount' => $request->input('amount'), 'vat' => $request->input('vat', $item->vat), + 'status' => $request->input('status', $item->status), + 'invoice_no' => $request->input('invoiceNo'), 'memo' => $request->input('memo'), + ]); + + return response()->json(['success' => true, 'message' => '매출이 수정되었습니다.']); + } + + public function destroy(int $id): JsonResponse + { + $tenantId = session('selected_tenant_id', 1); + SalesRecord::forTenant($tenantId)->findOrFail($id)->delete(); + return response()->json(['success' => true, 'message' => '매출이 삭제되었습니다.']); + } +} diff --git a/app/Http/Controllers/Finance/SubscriptionController.php b/app/Http/Controllers/Finance/SubscriptionController.php new file mode 100644 index 00000000..cbb5ed21 --- /dev/null +++ b/app/Http/Controllers/Finance/SubscriptionController.php @@ -0,0 +1,92 @@ +input('search')) { + $query->where(function ($q) use ($search) { + $q->where('customer', 'like', "%{$search}%"); + }); + } + if ($status = $request->input('status')) { + if ($status !== 'all') $query->where('status', $status); + } + + $subscriptions = $query->orderBy('created_at', 'desc')->get()->map(fn($item) => [ + 'id' => $item->id, 'customer' => $item->customer, + 'plan' => $item->plan, 'monthlyFee' => $item->monthly_fee, + 'billingCycle' => $item->billing_cycle, + 'startDate' => $item->start_date?->format('Y-m-d'), + 'nextBilling' => $item->next_billing?->format('Y-m-d'), + 'status' => $item->status, 'users' => $item->users, 'memo' => $item->memo, + ]); + + $all = Subscription::forTenant($tenantId)->get(); + $active = $all->where('status', 'active'); + $monthlyRecurring = $active->sum('monthly_fee'); + $stats = [ + 'activeCount' => $active->count(), + 'monthlyRecurring' => $monthlyRecurring, + 'yearlyRecurring' => $monthlyRecurring * 12, + 'totalUsers' => $active->sum('users'), + ]; + + return response()->json(['success' => true, 'data' => $subscriptions, 'stats' => $stats]); + } + + public function store(Request $request): JsonResponse + { + $request->validate(['customer' => 'required|string|max:100']); + $tenantId = session('selected_tenant_id', 1); + + Subscription::create([ + 'tenant_id' => $tenantId, 'customer' => $request->input('customer'), + 'plan' => $request->input('plan'), + 'monthly_fee' => $request->input('monthlyFee', 0), + 'billing_cycle' => $request->input('billingCycle', 'monthly'), + 'start_date' => $request->input('startDate'), + 'next_billing' => $request->input('nextBilling'), + 'status' => $request->input('status', 'active'), + 'users' => $request->input('users', 0), 'memo' => $request->input('memo'), + ]); + + return response()->json(['success' => true, 'message' => '구독이 등록되었습니다.']); + } + + public function update(Request $request, int $id): JsonResponse + { + $tenantId = session('selected_tenant_id', 1); + $item = Subscription::forTenant($tenantId)->findOrFail($id); + $request->validate(['customer' => 'required|string|max:100']); + + $item->update([ + 'customer' => $request->input('customer'), 'plan' => $request->input('plan', $item->plan), + 'monthly_fee' => $request->input('monthlyFee', $item->monthly_fee), + 'billing_cycle' => $request->input('billingCycle', $item->billing_cycle), + 'start_date' => $request->input('startDate'), + 'next_billing' => $request->input('nextBilling'), + 'status' => $request->input('status', $item->status), + 'users' => $request->input('users', $item->users), 'memo' => $request->input('memo'), + ]); + + return response()->json(['success' => true, 'message' => '구독이 수정되었습니다.']); + } + + public function destroy(int $id): JsonResponse + { + $tenantId = session('selected_tenant_id', 1); + Subscription::forTenant($tenantId)->findOrFail($id)->delete(); + return response()->json(['success' => true, 'message' => '구독이 삭제되었습니다.']); + } +}