Files
sam-manage/app/Http/Controllers/Sales/SalesContractController.php
pro 7547a63284 feat:계약 체결 단계에 상품 선택 기능 추가
- SalesContractController: 계약 상품 저장/조회 API
- product-selection.blade.php: 상품 선택 UI 컴포넌트
- scenario-step.blade.php: 6단계에서 상품 선택 컴포넌트 표시
- routes/web.php: /sales/contracts/* 라우트 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-29 15:04:26 +09:00

92 lines
3.0 KiB
PHP

<?php
namespace App\Http\Controllers\Sales;
use App\Http\Controllers\Controller;
use App\Models\Sales\SalesContractProduct;
use App\Models\Sales\SalesTenantManagement;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
/**
* 영업 계약관리 컨트롤러
*/
class SalesContractController extends Controller
{
/**
* 계약 상품 저장 (전체 교체 방식)
*/
public function saveProducts(Request $request): JsonResponse
{
$validated = $request->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,
],
]);
}
}