Files
sam-manage/app/Http/Controllers/Sales/SalesDashboardController.php
pro 2f381b2285 feat:레거시 영업관리 시스템 MNG 마이그레이션
- 영업/매니저 시나리오 모달 구현 (6단계 체크리스트)
- 상담 기록 기능 (텍스트, 음성, 첨부파일)
- 음성 녹음 + Speech-to-Text 변환
- 첨부파일 Drag & Drop 업로드
- 매니저 지정 드롭다운

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-28 21:45:11 +09:00

185 lines
5.6 KiB
PHP

<?php
namespace App\Http\Controllers\Sales;
use App\Http\Controllers\Controller;
use App\Models\Tenants\Tenant;
use App\Models\User;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\View\View;
/**
* 영업관리 대시보드 컨트롤러
*/
class SalesDashboardController extends Controller
{
/**
* 대시보드 화면
*/
public function index(Request $request): View
{
$data = $this->getDashboardData($request);
return view('sales.dashboard.index', $data);
}
/**
* HTMX 부분 새로고침용 데이터 반환
*/
public function refresh(Request $request): View
{
$data = $this->getDashboardData($request);
return view('sales.dashboard.partials.data-container', $data);
}
/**
* 대시보드 데이터 조회
*/
private function getDashboardData(Request $request): array
{
// 기간 설정
$period = $request->input('period', 'month'); // month or custom
$year = $request->input('year', now()->year);
$month = $request->input('month', now()->month);
// 기간 설정 모드일 경우
if ($period === 'custom') {
$startDate = $request->input('start_date', now()->startOfMonth()->format('Y-m-d'));
$endDate = $request->input('end_date', now()->format('Y-m-d'));
} else {
$startDate = now()->startOfMonth()->format('Y-m-d');
$endDate = now()->endOfMonth()->format('Y-m-d');
}
// 통계 데이터 (임시 데이터 - 추후 실제 데이터로 교체)
$stats = [
'total_membership_fee' => 0, // 총 가입비
'total_commission' => 0, // 총 수당
'commission_rate' => 0, // 지급 승인 완료 비율
'total_contracts' => 0, // 전체 건수
'pending_membership_approval' => 0, // 가입 승인 대기
'pending_payment_approval' => 0, // 지급 승인 대기
];
// 역할별 수당 상세
$commissionByRole = [
[
'name' => '판매자',
'rate' => 20,
'amount' => 0,
'color' => 'green',
],
[
'name' => '관리자',
'rate' => 5,
'amount' => 0,
'color' => 'blue',
],
[
'name' => '매뉴제작 협업수당',
'rate' => null, // 별도
'amount' => null, // 운영팀 산정
'color' => 'red',
],
];
// 총 가입비 대비 수당
$totalCommissionRatio = 0;
// 수익 및 테넌트 관리 통계 (임시 데이터 - 추후 실제 데이터로 교체)
$tenantStats = [
'total_tenants' => 0, // 관리 테넌트
'total_membership_revenue' => 0, // 총 가입비 실적
'total_commission_accumulated' => 0, // 누적 가입비 수당
'confirmed_commission' => 0, // 확정 가입비 수당
];
// 테넌트 목록 (현재 로그인한 사용자가 속한 테넌트만, HQ 제외)
$currentUser = auth()->user();
$tenants = $currentUser->tenants()
->where('tenant_type', '!=', 'HQ')
->orderBy('created_at', 'desc')
->get();
return compact(
'stats',
'commissionByRole',
'totalCommissionRatio',
'tenantStats',
'tenants',
'period',
'year',
'month',
'startDate',
'endDate'
);
}
/**
* 매니저 지정 변경
*/
public function assignManager(int $tenantId, Request $request): JsonResponse
{
$request->validate([
'manager_id' => 'required|integer',
]);
$tenant = Tenant::findOrFail($tenantId);
$managerId = $request->input('manager_id');
// 캐시 키
$cacheKey = "tenant_manager:{$tenantId}";
if ($managerId === 0) {
// 본인으로 설정 (현재 로그인 사용자)
$manager = auth()->user();
cache()->put($cacheKey, [
'id' => $manager->id,
'name' => $manager->name,
'is_self' => true,
], now()->addDays(365));
} else {
// 특정 매니저 지정
$manager = User::find($managerId);
if (!$manager) {
return response()->json([
'success' => false,
'message' => '매니저를 찾을 수 없습니다.',
], 404);
}
cache()->put($cacheKey, [
'id' => $manager->id,
'name' => $manager->name,
'is_self' => $manager->id === auth()->id(),
], now()->addDays(365));
}
return response()->json([
'success' => true,
'manager' => [
'id' => $manager->id,
'name' => $manager->name,
],
]);
}
/**
* 매니저 목록 조회 (드롭다운용)
*/
public function getManagers(Request $request): JsonResponse
{
// HQ 테넌트의 사용자 중 매니저 역할이 있는 사용자 조회
$managers = User::whereHas('tenants', function ($query) {
$query->where('tenant_type', 'HQ');
})->get(['id', 'name', 'email']);
return response()->json([
'success' => true,
'managers' => $managers,
]);
}
}