- 가입비 설정 시: 가입비 × 5% 예상수당 표시 - 가입비 미설정 시: "계약전" 표시 - 요약 통계 및 파트너별 예상수당 모두 적용 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
290 lines
21 KiB
PHP
290 lines
21 KiB
PHP
{{-- 유치 파트너 활동 현황 --}}
|
|
<div class="space-y-6">
|
|
{{-- 요약 카드 섹션 --}}
|
|
<div class="grid grid-cols-2 md:grid-cols-4 gap-4">
|
|
<!-- 유치 파트너 수 -->
|
|
<div class="bg-white border border-gray-200 rounded-xl p-5 hover:shadow-md transition-shadow">
|
|
<div class="flex items-start justify-between mb-3">
|
|
<span class="text-sm text-gray-500">유치 파트너</span>
|
|
<div class="p-2 bg-indigo-50 rounded-lg">
|
|
<svg class="w-5 h-5 text-indigo-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0zm6 3a2 2 0 11-4 0 2 2 0 014 0zM7 10a2 2 0 11-4 0 2 2 0 014 0z" />
|
|
</svg>
|
|
</div>
|
|
</div>
|
|
<p class="text-3xl font-bold text-gray-900">{{ $summaryStats['partner_count'] }}명</p>
|
|
<p class="text-xs text-gray-400 mt-1">직접 유치한 파트너</p>
|
|
</div>
|
|
|
|
<!-- 총 영업권 -->
|
|
<div class="bg-white border border-gray-200 rounded-xl p-5 hover:shadow-md transition-shadow">
|
|
<div class="flex items-start justify-between mb-3">
|
|
<span class="text-sm text-gray-500">총 영업권</span>
|
|
<div class="p-2 bg-blue-50 rounded-lg">
|
|
<svg class="w-5 h-5 text-blue-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 10h18M7 15h1m4 0h1m-7 4h12a3 3 0 003-3V8a3 3 0 00-3-3H6a3 3 0 00-3 3v8a3 3 0 003 3z" />
|
|
</svg>
|
|
</div>
|
|
</div>
|
|
<p class="text-3xl font-bold text-gray-900">{{ $summaryStats['total_prospects'] }}건</p>
|
|
<p class="text-xs text-gray-400 mt-1">파트너들이 등록한 명함</p>
|
|
</div>
|
|
|
|
<!-- 총 계약 -->
|
|
<div class="bg-white border border-gray-200 rounded-xl p-5 hover:shadow-md transition-shadow">
|
|
<div class="flex items-start justify-between mb-3">
|
|
<span class="text-sm text-gray-500">총 계약</span>
|
|
<div class="p-2 bg-green-50 rounded-lg">
|
|
<svg class="w-5 h-5 text-green-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z" />
|
|
</svg>
|
|
</div>
|
|
</div>
|
|
<p class="text-3xl font-bold text-green-600">{{ $summaryStats['total_conversions'] }}건</p>
|
|
<p class="text-xs text-gray-400 mt-1">계약 성사 건수</p>
|
|
</div>
|
|
|
|
<!-- 예상 수당 -->
|
|
<div class="bg-gradient-to-br from-amber-50 to-orange-50 border border-amber-200 rounded-xl p-5 hover:shadow-md transition-shadow">
|
|
<div class="flex items-start justify-between mb-3">
|
|
<span class="text-sm text-amber-700">예상 수당</span>
|
|
<div class="p-2 bg-amber-100 rounded-lg">
|
|
<svg class="w-5 h-5 text-amber-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 8c-1.657 0-3 .895-3 2s1.343 2 3 2 3 .895 3 2-1.343 2-3 2m0-8c1.11 0 2.08.402 2.599 1M12 8V7m0 1v8m0 0v1m0-1c-1.11 0-2.08-.402-2.599-1M21 12a9 9 0 11-18 0 9 9 0 0118 0z" />
|
|
</svg>
|
|
</div>
|
|
</div>
|
|
<p class="text-3xl font-bold text-amber-700">{{ number_format($summaryStats['expected_commission']) }}원</p>
|
|
<p class="text-xs text-amber-600 mt-1">매니저 수당 합계</p>
|
|
</div>
|
|
</div>
|
|
|
|
{{-- 파트너별 영업 현황 --}}
|
|
@if(count($partnerActivities) === 0)
|
|
<div class="bg-white rounded-xl shadow-sm">
|
|
<div class="text-center py-16">
|
|
<div class="w-16 h-16 bg-gray-100 rounded-full flex items-center justify-center mx-auto mb-4">
|
|
<svg class="w-8 h-8 text-gray-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0zm6 3a2 2 0 11-4 0 2 2 0 014 0zM7 10a2 2 0 11-4 0 2 2 0 014 0z" />
|
|
</svg>
|
|
</div>
|
|
<p class="text-gray-600 font-medium mb-1">유치한 파트너가 없습니다</p>
|
|
<p class="text-sm text-gray-400">파트너를 유치하면 이곳에서 활동 현황을 확인할 수 있습니다</p>
|
|
</div>
|
|
</div>
|
|
@else
|
|
@foreach($partnerActivities as $activity)
|
|
@php
|
|
$statusColors = [
|
|
'active' => 'bg-green-100 text-green-800 border-green-200',
|
|
'moderate' => 'bg-yellow-100 text-yellow-800 border-yellow-200',
|
|
'inactive' => 'bg-gray-100 text-gray-600 border-gray-200',
|
|
];
|
|
$statusLabels = [
|
|
'active' => '활동중',
|
|
'moderate' => '보통',
|
|
'inactive' => '비활동',
|
|
];
|
|
$borderColors = [
|
|
'active' => 'border-green-300',
|
|
'moderate' => 'border-yellow-300',
|
|
'inactive' => 'border-gray-200',
|
|
];
|
|
@endphp
|
|
<div class="bg-white rounded-xl shadow-sm overflow-hidden border {{ $borderColors[$activity['status']] ?? 'border-gray-200' }}"
|
|
x-data="{ expanded: false }">
|
|
{{-- 파트너 헤더 --}}
|
|
<div class="p-4 cursor-pointer hover:bg-gray-50 transition-colors" @click="expanded = !expanded">
|
|
<div class="flex items-center justify-between">
|
|
<div class="flex items-center gap-4">
|
|
{{-- 펼침 아이콘 --}}
|
|
<button type="button" class="p-1 text-gray-400 hover:text-gray-600 transition-transform"
|
|
:class="{ 'rotate-90': expanded }">
|
|
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7" />
|
|
</svg>
|
|
</button>
|
|
{{-- 파트너 정보 --}}
|
|
<div class="flex items-center gap-3">
|
|
<div class="w-10 h-10 rounded-full bg-indigo-100 flex items-center justify-center">
|
|
<span class="text-indigo-600 font-bold text-sm">{{ mb_substr($activity['partner']->name, 0, 1) }}</span>
|
|
</div>
|
|
<div>
|
|
<p class="font-bold text-gray-900">{{ $activity['partner']->name }}</p>
|
|
<p class="text-xs text-gray-500">{{ $activity['partner']->email }}</p>
|
|
</div>
|
|
</div>
|
|
{{-- 역할 배지 --}}
|
|
<span class="px-2.5 py-1 rounded-full text-xs font-medium bg-blue-100 text-blue-800">
|
|
{{ $activity['role_label'] }}
|
|
</span>
|
|
{{-- 상태 배지 --}}
|
|
<span class="px-2.5 py-1 rounded-full text-xs font-medium {{ $statusColors[$activity['status']] ?? $statusColors['inactive'] }}">
|
|
{{ $statusLabels[$activity['status']] ?? '비활동' }}
|
|
</span>
|
|
</div>
|
|
{{-- 요약 통계 --}}
|
|
<div class="flex items-center gap-6 text-sm">
|
|
<div class="text-center">
|
|
<p class="text-gray-400 text-xs">영업권</p>
|
|
<p class="font-bold text-gray-900">{{ $activity['prospect_count'] }}</p>
|
|
</div>
|
|
<div class="text-center">
|
|
<p class="text-gray-400 text-xs">진행중</p>
|
|
<p class="font-bold text-blue-600">{{ $activity['active_prospects'] }}</p>
|
|
</div>
|
|
<div class="text-center">
|
|
<p class="text-gray-400 text-xs">인계완료</p>
|
|
<p class="font-bold text-green-600">{{ $activity['conversions'] }}</p>
|
|
</div>
|
|
<div class="text-center">
|
|
<p class="text-gray-400 text-xs">예상수당</p>
|
|
@if($activity['has_registration_fee'])
|
|
<p class="font-bold text-amber-600">₩{{ number_format($activity['manager_commission']) }}</p>
|
|
@else
|
|
<p class="font-medium text-gray-400 text-xs">계약전</p>
|
|
@endif
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
{{-- 가망고객 목록 (펼침 영역) --}}
|
|
<div x-show="expanded" x-collapse x-cloak class="border-t border-gray-100">
|
|
@if($activity['all_prospects']->isEmpty() && $activity['recent_tenants']->isEmpty())
|
|
<div class="p-8 text-center text-gray-500">
|
|
<svg class="w-12 h-12 mx-auto text-gray-300 mb-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z" />
|
|
</svg>
|
|
<p class="text-sm">등록된 영업권이 없습니다</p>
|
|
</div>
|
|
@else
|
|
<div class="divide-y divide-gray-100">
|
|
{{-- 진행 중인 가망고객 --}}
|
|
@if($activity['all_prospects']->isNotEmpty())
|
|
<div class="p-4 bg-orange-50/50">
|
|
<div class="flex items-center gap-2 mb-3">
|
|
<span class="text-sm font-semibold text-orange-600">영업 진행중</span>
|
|
<span class="px-2 py-0.5 bg-orange-100 text-orange-700 text-xs font-medium rounded-full">{{ $activity['all_prospects']->count() }}건</span>
|
|
</div>
|
|
<div class="space-y-2">
|
|
@foreach($activity['all_prospects'] as $prospect)
|
|
@php
|
|
$prospectProgress = \App\Models\Sales\SalesScenarioChecklist::getProspectProgress($prospect->id);
|
|
$prospectManagement = \App\Models\Sales\SalesTenantManagement::findOrCreateByProspect($prospect->id);
|
|
$prospectHqStatuses = \App\Models\Sales\SalesTenantManagement::$hqStatusLabels;
|
|
$prospectHqStatusOrder = \App\Models\Sales\SalesTenantManagement::$hqStatusOrder;
|
|
$prospectCurrentHqStep = $prospectHqStatusOrder[$prospectManagement->hq_status ?? 'pending'] ?? 0;
|
|
$isProspectHqEnabled = $prospectProgress['sales']['percentage'] >= 100 && $prospectProgress['manager']['percentage'] >= 100;
|
|
@endphp
|
|
<div class="bg-white rounded-lg p-3 border border-orange-200">
|
|
<div class="flex items-center justify-between mb-2">
|
|
<div>
|
|
<p class="font-medium text-gray-900 text-sm">{{ $prospect->company_name }}</p>
|
|
<p class="text-xs text-gray-500">{{ $prospect->business_number ?? '-' }}</p>
|
|
</div>
|
|
@if($prospect->isActive())
|
|
<span class="text-xs text-orange-600 font-medium">D-{{ $prospect->remaining_days }}</span>
|
|
@endif
|
|
</div>
|
|
{{-- 영업/매니저 진행률 --}}
|
|
<div class="grid grid-cols-2 gap-4">
|
|
<div>
|
|
<div class="flex items-center gap-2 mb-1">
|
|
<span class="text-xs font-medium text-blue-600">영업</span>
|
|
<span class="text-xs text-gray-500">{{ $prospectProgress['sales']['percentage'] }}%</span>
|
|
</div>
|
|
<div class="w-full bg-gray-200 rounded-full h-2">
|
|
<div class="bg-blue-500 h-2 rounded-full transition-all" style="width: {{ $prospectProgress['sales']['percentage'] }}%"></div>
|
|
</div>
|
|
</div>
|
|
<div>
|
|
<div class="flex items-center gap-2 mb-1">
|
|
<span class="text-xs font-medium text-green-600">매니저</span>
|
|
<span class="text-xs text-gray-500">{{ $prospectProgress['manager']['percentage'] }}%</span>
|
|
</div>
|
|
<div class="w-full bg-gray-200 rounded-full h-2">
|
|
<div class="bg-green-500 h-2 rounded-full transition-all" style="width: {{ $prospectProgress['manager']['percentage'] }}%"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{{-- 개발 진행 상태 (100% 완료 시) --}}
|
|
@if($isProspectHqEnabled)
|
|
<div class="mt-2 pt-2 border-t border-gray-100">
|
|
<div class="flex items-center gap-2">
|
|
<span class="text-xs font-medium text-purple-600">개발</span>
|
|
<div class="flex-1 flex items-center gap-0.5">
|
|
@foreach($prospectHqStatuses as $statusKey => $statusLabel)
|
|
@php
|
|
$stepNum = $prospectHqStatusOrder[$statusKey];
|
|
$isCompleted = $stepNum < $prospectCurrentHqStep;
|
|
$isCurrent = $stepNum === $prospectCurrentHqStep;
|
|
@endphp
|
|
<div class="flex-1 h-1.5 rounded-full {{ $isCompleted ? 'bg-purple-500' : ($isCurrent ? 'bg-purple-300' : 'bg-gray-200') }}"></div>
|
|
@endforeach
|
|
</div>
|
|
<span class="text-xs px-2 py-0.5 rounded-full bg-purple-100 text-purple-700">{{ $prospectManagement->hq_status_label }}</span>
|
|
</div>
|
|
</div>
|
|
@endif
|
|
</div>
|
|
@endforeach
|
|
</div>
|
|
</div>
|
|
@endif
|
|
|
|
{{-- 인계 완료 (계약 성사) --}}
|
|
@if($activity['recent_tenants']->isNotEmpty())
|
|
<div class="p-4 bg-emerald-50/50">
|
|
<div class="flex items-center gap-2 mb-3">
|
|
<span class="text-sm font-semibold text-emerald-600">인계 완료</span>
|
|
<span class="px-2 py-0.5 bg-emerald-100 text-emerald-700 text-xs font-medium rounded-full">{{ $activity['conversions'] }}건</span>
|
|
</div>
|
|
<div class="space-y-2">
|
|
@foreach($activity['recent_tenants'] as $prospect)
|
|
<div class="bg-white rounded-lg p-3 border border-emerald-200">
|
|
<div class="flex items-center justify-between">
|
|
<div>
|
|
<p class="font-medium text-gray-900 text-sm">{{ $prospect->company_name }}</p>
|
|
<p class="text-xs text-gray-500">{{ $prospect->business_number ?? '-' }}</p>
|
|
</div>
|
|
<div class="flex items-center gap-3">
|
|
<span class="text-xs text-gray-500">{{ $prospect->converted_at?->format('Y-m-d') ?? '-' }}</span>
|
|
<span class="px-2 py-0.5 rounded-full text-xs font-medium bg-emerald-100 text-emerald-700">
|
|
<svg class="w-3 h-3 inline mr-0.5" fill="currentColor" viewBox="0 0 20 20">
|
|
<path fill-rule="evenodd" d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z" clip-rule="evenodd" />
|
|
</svg>
|
|
완료
|
|
</span>
|
|
</div>
|
|
</div>
|
|
{{-- 완료 프로그레스 바 --}}
|
|
<div class="grid grid-cols-2 gap-4 mt-2">
|
|
<div>
|
|
<div class="flex items-center gap-2 mb-1">
|
|
<span class="text-xs font-medium text-blue-600">영업</span>
|
|
<span class="text-xs text-gray-500">100%</span>
|
|
</div>
|
|
<div class="w-full bg-blue-500 rounded-full h-2"></div>
|
|
</div>
|
|
<div>
|
|
<div class="flex items-center gap-2 mb-1">
|
|
<span class="text-xs font-medium text-green-600">매니저</span>
|
|
<span class="text-xs text-gray-500">100%</span>
|
|
</div>
|
|
<div class="w-full bg-green-500 rounded-full h-2"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
@endforeach
|
|
</div>
|
|
</div>
|
|
@endif
|
|
</div>
|
|
@endif
|
|
</div>
|
|
</div>
|
|
@endforeach
|
|
@endif
|
|
</div>
|