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.*.registration_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'], 'registration_fee' => $product['registration_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, ], ]); } }