From 16437c542aefbcf242822b39dcf188c82ac1acda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=B3=B4=EA=B3=A4?= Date: Fri, 13 Mar 2026 19:41:51 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20[sales]=20=EA=B0=80=EA=B2=A9=20?= =?UTF-8?q?=EC=8B=9C=EB=AE=AC=EB=A0=88=EC=9D=B4=ED=84=B0=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 영업파트너용 상품 조합별 예상 비용/수당 실시간 시뮬레이션 - 개인/단체 가입유형별 수당률 자동 전환 - 재량권 상품 가격 슬라이더 조정 기능 - 할인율, 본사 마진율 실시간 계산 --- .../Sales/PriceSimulatorController.php | 35 ++ .../sales/price-simulator/index.blade.php | 483 ++++++++++++++++++ routes/web.php | 4 + 3 files changed, 522 insertions(+) create mode 100644 app/Http/Controllers/Sales/PriceSimulatorController.php create mode 100644 resources/views/sales/price-simulator/index.blade.php diff --git a/app/Http/Controllers/Sales/PriceSimulatorController.php b/app/Http/Controllers/Sales/PriceSimulatorController.php new file mode 100644 index 00000000..b11aa3b3 --- /dev/null +++ b/app/Http/Controllers/Sales/PriceSimulatorController.php @@ -0,0 +1,35 @@ +header('HX-Request')) { + return response('', 200)->header('HX-Redirect', route('sales.price-simulator.index')); + } + + $categories = SalesProductCategory::active() + ->ordered() + ->with(['products' => fn ($q) => $q->active()->ordered()]) + ->get(); + + return view('sales.price-simulator.index', compact('categories')); + } +} diff --git a/resources/views/sales/price-simulator/index.blade.php b/resources/views/sales/price-simulator/index.blade.php new file mode 100644 index 00000000..d70b23b2 --- /dev/null +++ b/resources/views/sales/price-simulator/index.blade.php @@ -0,0 +1,483 @@ +@extends('layouts.app') + +@section('title', '가격 시뮬레이터') + +@section('content') +
+ + {{-- 헤더 --}} +
+
+
+ + + +
+
+

가격 시뮬레이터

+

상품 조합별 예상 비용과 수당을 실시간으로 확인합니다

+
+
+
+ +
+
+ +
+ {{-- 좌측: 상품 선택 영역 --}} +
+ {{-- 가입유형 선택 --}} +
+

가입 유형

+
+ + +
+ {{-- 유치파트너(협업지원금) 토글 --}} + +
+ + {{-- 카테고리별 상품 목록 --}} + @foreach($categories as $category) +
+
+
+

{{ $category->name }}

+

기본 제공: {{ $category->base_storage }}

+
+ + {{ $category->products->count() }}개 상품 + +
+
+ @foreach($category->products as $product) +
+
+ {{-- 체크박스 --}} + +
+
+ {{ $product->name }} + @if($product->is_required) + 필수 + @endif + @if($product->allow_flexible_pricing) + 재량권 + @endif +
+ @if($product->description) +

{{ $product->description }}

+ @endif +
+ 개발비: {{ number_format($product->development_fee) }}원 + 가입비: {{ number_format($product->registration_fee) }}원 + 구독료: {{ number_format($product->subscription_fee) }}원/월 +
+ + {{-- 선택 시 가격 조정 슬라이더 --}} + +
+
+
+ @endforeach +
+
+ @endforeach +
+ + {{-- 우측: 시뮬레이션 결과 패널 (sticky) --}} +
+ {{-- 고객 비용 요약 --}} +
+
+

고객 비용 요약

+

선택한 상품 기준 예상 비용

+
+
+ {{-- 선택 상품 수 --}} +
+ 선택 상품 + +
+ +
+ {{-- 개발비 원가 합계 --}} +
+ 개발비 (원가) + +
+ {{-- 적용 가입비 합계 --}} +
+ 가입비 (적용가) + +
+ {{-- 할인율 --}} +
+ 할인율 + +
+
+ +
+ {{-- 월 구독료 --}} +
+ 월 구독료 + +
+ {{-- 연 구독료 --}} +
+ 연 구독료 + +
+
+ + {{-- 총 1년 비용 --}} +
+
+ 1년차 총 비용 + +
+

가입비 + 12개월 구독료 (VAT 별도)

+
+
+
+ + {{-- 수당 시뮬레이션 --}} +
+
+

수당 시뮬레이션

+

+ 기준 +

+
+
+ {{-- 수당 기준액 --}} +
+ 수당 기준액 (가입비) + +
+ +
+ {{-- 영업파트너 수당 --}} +
+
+ + +
+
+ + +
+
+ {{-- 매니저 수당 --}} +
+
+ + 매니저 수당 +
+
+ + +
+
+ {{-- 유치 수당 --}} +
+
+ + 협업지원금 (유치) +
+
+ + (3%) +
+
+
+ + {{-- 총 수당 / 본사 수익 --}} +
+
+ 총 수당 지급 + +
+
+ 본사 순수익 + +
+
+ 본사 마진율 + +
+
+
+
+ + {{-- 선택 상품 내역 --}} +
+
+

선택 상품 내역

+
+
+ +
+
+
+
+
+ +@push('scripts') + +@endpush +@endsection diff --git a/routes/web.php b/routes/web.php index 8da781ad..f2ce9bc5 100644 --- a/routes/web.php +++ b/routes/web.php @@ -69,6 +69,7 @@ use App\Http\Controllers\RoadmapController; use App\Http\Controllers\RoleController; use App\Http\Controllers\RolePermissionController; +use App\Http\Controllers\Sales\PriceSimulatorController; use App\Http\Controllers\Sales\SalesProductController; use App\Http\Controllers\Stats\StatDashboardController; use App\Http\Controllers\System\AiConfigController; @@ -1668,6 +1669,9 @@ // 매니저 목록/검색은 리소스 라우트 앞에 정의됨 (912줄 위치) + // 가격 시뮬레이터 + Route::get('price-simulator', [PriceSimulatorController::class, 'index'])->name('price-simulator.index'); + // 상품관리 (HQ 전용) Route::prefix('products')->name('products.')->group(function () { Route::get('/', [SalesProductController::class, 'index'])->name('index');