diff --git a/app/Http/Controllers/Sales/SalesContractController.php b/app/Http/Controllers/Sales/SalesContractController.php new file mode 100644 index 00000000..acbb91c2 --- /dev/null +++ b/app/Http/Controllers/Sales/SalesContractController.php @@ -0,0 +1,91 @@ +validate([ + 'tenant_id' => 'required|exists:tenants,id', + 'products' => 'required|array', + 'products.*.product_id' => 'required|exists:sales_products,id', + 'products.*.category_id' => 'required|exists:sales_product_categories,id', + 'products.*.development_fee' => 'required|numeric|min:0', + 'products.*.subscription_fee' => 'required|numeric|min:0', + ]); + + try { + DB::transaction(function () use ($validated) { + $tenantId = $validated['tenant_id']; + + // 영업관리 레코드 조회 (없으면 생성) + $management = SalesTenantManagement::findOrCreateByTenant($tenantId); + + // 기존 상품 삭제 + SalesContractProduct::where('tenant_id', $tenantId)->delete(); + + // 새 상품 저장 + foreach ($validated['products'] as $product) { + SalesContractProduct::create([ + 'tenant_id' => $tenantId, + 'management_id' => $management->id, + 'category_id' => $product['category_id'], + 'product_id' => $product['product_id'], + 'development_fee' => $product['development_fee'], + 'subscription_fee' => $product['subscription_fee'], + 'discount_rate' => 0, + 'created_by' => auth()->id(), + ]); + } + }); + + return response()->json([ + 'success' => true, + 'message' => '계약 상품이 저장되었습니다.', + ]); + } catch (\Exception $e) { + return response()->json([ + 'success' => false, + 'message' => '저장 중 오류가 발생했습니다.', + ], 500); + } + } + + /** + * 계약 상품 조회 + */ + public function getProducts(int $tenantId): JsonResponse + { + $products = SalesContractProduct::where('tenant_id', $tenantId) + ->with(['product', 'category']) + ->get(); + + $totals = [ + 'development_fee' => $products->sum('development_fee'), + 'subscription_fee' => $products->sum('subscription_fee'), + 'count' => $products->count(), + ]; + + return response()->json([ + 'success' => true, + 'data' => [ + 'products' => $products, + 'totals' => $totals, + ], + ]); + } +} diff --git a/resources/views/sales/modals/partials/product-selection.blade.php b/resources/views/sales/modals/partials/product-selection.blade.php new file mode 100644 index 00000000..34328de1 --- /dev/null +++ b/resources/views/sales/modals/partials/product-selection.blade.php @@ -0,0 +1,237 @@ +{{-- 계약 체결 시 상품 선택 컴포넌트 --}} +@php + use App\Models\Sales\SalesProductCategory; + use App\Models\Sales\SalesContractProduct; + + $categories = SalesProductCategory::active() + ->ordered() + ->with(['products' => fn($q) => $q->active()->ordered()]) + ->get(); + + // 이미 선택된 상품들 조회 + $selectedProducts = SalesContractProduct::where('tenant_id', $tenant->id) + ->pluck('product_id') + ->toArray(); + + // 기존 계약 상품 정보 (가격 커스터마이징 포함) + $contractProducts = SalesContractProduct::where('tenant_id', $tenant->id) + ->get() + ->keyBy('product_id'); +@endphp + +
고객사에 제공할 솔루션 패키지를 선택하세요
+{{ $product->description }}
+ @endif +선택 상품
+ +총 가입비
+ +월 구독료
+ +