diff --git a/app/Http/Controllers/Finance/SalesCommissionController.php b/app/Http/Controllers/Finance/SalesCommissionController.php index 0aa5a8e0..50bd87b1 100644 --- a/app/Http/Controllers/Finance/SalesCommissionController.php +++ b/app/Http/Controllers/Finance/SalesCommissionController.php @@ -253,6 +253,29 @@ public function cancel(int $id): JsonResponse } } + /** + * 수당지급일/협업지원금 인라인 수정 + */ + public function updateCommissionDate(int $id, Request $request): JsonResponse + { + $validated = $request->validate([ + 'field' => 'required|in:first_partner_paid_at,second_partner_paid_at,manager_paid_at,referrer_commission', + 'value' => 'nullable', + ]); + + $commission = SalesCommission::findOrFail($id); + + // 수당지급일은 인계 상태일 때만 변경 가능 + $paidFields = ['first_partner_paid_at', 'second_partner_paid_at', 'manager_paid_at']; + if (in_array($validated['field'], $paidFields) && $commission->management?->hq_status !== 'handover') { + return response()->json(['success' => false, 'message' => '인계 상태일 때만 수당지급일 설정 가능'], 422); + } + + $commission->update([$validated['field'] => $validated['value'] ?: null]); + + return response()->json(['success' => true]); + } + /** * 정산 테이블 부분 새로고침 (HTMX) */ diff --git a/app/Http/Controllers/Sales/AdminProspectController.php b/app/Http/Controllers/Sales/AdminProspectController.php index 3d2239a3..b14faad7 100644 --- a/app/Http/Controllers/Sales/AdminProspectController.php +++ b/app/Http/Controllers/Sales/AdminProspectController.php @@ -191,6 +191,7 @@ private function getIndexData(Request $request): array $prospect->hq_status = $management?->hq_status ?? 'pending'; $prospect->hq_status_label = $management?->hq_status_label ?? '대기'; $prospect->manager_user = $management?->manager; + $prospect->contracted_at = $management?->contracted_at; $prospect->commission = $this->loadMergedCommission($management); @@ -237,6 +238,7 @@ private function getIndexData(Request $request): array $prospect->hq_status = $management?->hq_status ?? 'pending'; $prospect->hq_status_label = $management?->hq_status_label ?? '대기'; $prospect->manager_user = $management?->manager; + $prospect->contracted_at = $management?->contracted_at; // 수당 정보 (management가 있는 경우) $prospect->commission = $this->loadMergedCommission($management); diff --git a/resources/views/finance/settlement/index.blade.php b/resources/views/finance/settlement/index.blade.php index f12fcbef..de2701f1 100644 --- a/resources/views/finance/settlement/index.blade.php +++ b/resources/views/finance/settlement/index.blade.php @@ -362,6 +362,28 @@ function cancelCommission(id) { }); } + function saveSettlementDate(commissionId, field, value) { + fetch(`{{ url('finance/sales-commissions') }}/${commissionId}/update-date`, { + method: 'PUT', + headers: { + 'Content-Type': 'application/json', + 'X-CSRF-TOKEN': '{{ csrf_token() }}', + 'Accept': 'application/json' + }, + body: JSON.stringify({ field: field, value: value }) + }) + .then(r => r.json()) + .then(data => { + if (!data.success) { + alert(data.message || '저장에 실패했습니다.'); + } + }) + .catch(error => { + console.error('Error:', error); + alert('저장 중 오류가 발생했습니다.'); + }); + } + function onTenantSelect(managementId) { if (!managementId) return; htmx.ajax('GET', '{{ route("finance.sales-commissions.payment-form") }}?management_id=' + managementId, { diff --git a/resources/views/finance/settlement/partials/commission/table.blade.php b/resources/views/finance/settlement/partials/commission/table.blade.php index ad0645f7..752a1833 100644 --- a/resources/views/finance/settlement/partials/commission/table.blade.php +++ b/resources/views/finance/settlement/partials/commission/table.blade.php @@ -19,6 +19,9 @@ 유치파트너 유치수당 지급예정일 + 수당지급일 + 매니저지급일 + 협업지원금 상태 액션 @@ -179,6 +182,41 @@ class="commission-checkbox rounded border-gray-300 text-emerald-600 focus:ring-e {{ $commission->scheduled_payment_date->format('Y-m-d') }} + {{-- 수당지급일 (deposit→first_partner_paid_at, balance→second_partner_paid_at) --}} + @php + $paidField = $commission->payment_type === 'deposit' ? 'first_partner_paid_at' : 'second_partner_paid_at'; + $paidValue = $commission->$paidField?->format('Y-m-d'); + @endphp + + + + {{-- 매니저지급일 --}} + + @if($isGroup) + - + @else + + @endif + + {{-- 협업지원금 --}} + + @if(!$isGroup) + + @else + - + @endif + @php $statusColors = [ @@ -235,7 +273,7 @@ class="p-1 text-green-400 hover:text-green-600" @empty - + 등록된 정산 내역이 없습니다. diff --git a/resources/views/sales/admin-prospects/index.blade.php b/resources/views/sales/admin-prospects/index.blade.php index 5d4c6467..d1179e33 100644 --- a/resources/views/sales/admin-prospects/index.blade.php +++ b/resources/views/sales/admin-prospects/index.blade.php @@ -336,57 +336,7 @@ function confirmDelete() { }); } -// 협업지원금 저장 -function saveReferrerCommission(prospectId, amount) { - const input = document.querySelector(`input[data-prospect-id="${prospectId}"][data-field="referrer_commission"]`); - const numAmount = parseInt(amount) || 0; - - fetch(`/sales/admin-prospects/${prospectId}/referrer-commission`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').content, - 'Accept': 'application/json' - }, - body: JSON.stringify({ amount: numAmount }) - }) - .then(response => response.json()) - .then(result => { - if (result.success && input) { - if (numAmount > 0) { - input.value = result.amount; - input.className = input.className.replace(/text-gray-500 bg-gray-50/g, '').replace(/text-orange-600 font-medium bg-orange-50 border-orange-400/g, ''); - input.classList.add('text-orange-600', 'font-medium', 'bg-orange-50', 'border-orange-400'); - } else { - input.value = ''; - input.className = input.className.replace(/text-orange-600 font-medium bg-orange-50 border-orange-400/g, ''); - input.classList.add('text-gray-500', 'bg-gray-50'); - } - } else if (!result.success) { - alert(result.message || '협업지원금 저장에 실패했습니다.'); - } - }) - .catch(error => { - console.error('Error:', error); - alert('협업지원금 저장 중 오류가 발생했습니다.'); - }); -} - -// 인계 상태 체크 (수당지급 필드만) -const commissionPaidFields = ['first_partner_paid_at', 'second_partner_paid_at', 'manager_paid_at']; - -function checkHandoverStatus(prospectId, field) { - if (!commissionPaidFields.includes(field)) return true; - - const hqSelect = document.querySelector(`select[data-hq-status="${prospectId}"]`); - if (hqSelect && hqSelect.value !== 'handover') { - alert('개발상태가 인계일 때만 수당이 지급됩니다.'); - return false; - } - return true; -} - -// 수당 날짜 저장 (date input에서 호출) +// 납입 날짜 저장 (date input에서 호출) function saveCommissionDate(prospectId, field, date) { const input = document.querySelector(`input[data-prospect-id="${prospectId}"][data-field="${field}"]`); @@ -396,12 +346,6 @@ function saveCommissionDate(prospectId, field, date) { return; } - // 수당지급일 입력 시 인계 상태 체크 - if (!checkHandoverStatus(prospectId, field)) { - input.value = ''; - return; - } - fetch(`/sales/admin-prospects/${prospectId}/commission-date`, { method: 'POST', headers: { @@ -474,22 +418,9 @@ function updateInputStyle(input, field, hasValue) { input.className = 'commission-date-input w-24 text-xs px-1 py-1 border border-gray-200 rounded text-center focus:outline-none focus:ring-1'; if (hasValue) { - if (field === 'first_payment_at' || field === 'second_payment_at') { - input.className += ' text-emerald-600 font-medium bg-emerald-50 focus:ring-emerald-500 focus:border-emerald-500'; - } else if (field === 'first_partner_paid_at' || field === 'second_partner_paid_at') { - input.className += ' text-blue-600 font-medium bg-blue-50 focus:ring-blue-500 focus:border-blue-500'; - } else if (field === 'manager_paid_at') { - input.className += ' text-purple-600 font-medium bg-purple-50 focus:ring-purple-500 focus:border-purple-500'; - } + input.className += ' text-emerald-600 font-medium bg-emerald-50 focus:ring-emerald-500 focus:border-emerald-500'; } else { - input.className += ' text-gray-400 bg-white'; - if (field === 'first_payment_at' || field === 'second_payment_at') { - input.className += ' focus:ring-emerald-500 focus:border-emerald-500'; - } else if (field === 'first_partner_paid_at' || field === 'second_partner_paid_at') { - input.className += ' focus:ring-blue-500 focus:border-blue-500'; - } else if (field === 'manager_paid_at') { - input.className += ' focus:ring-purple-500 focus:border-purple-500'; - } + input.className += ' text-gray-400 bg-white focus:ring-emerald-500 focus:border-emerald-500'; } } diff --git a/resources/views/sales/admin-prospects/partials/content.blade.php b/resources/views/sales/admin-prospects/partials/content.blade.php index 6b2beabe..e3624cd9 100644 --- a/resources/views/sales/admin-prospects/partials/content.blade.php +++ b/resources/views/sales/admin-prospects/partials/content.blade.php @@ -89,15 +89,11 @@ class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none foc 담당 매니저 영업 진행률 매니저 진행률 + 계약일 1차 납입 - 1차 수당 2차 납입 - 2차 수당 - 매니저 수당 - 협업지원금 개발 상태 상태 - 등록일 관리 @@ -150,6 +146,10 @@ class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none foc $isCorporate = ($prospect->partner_type ?? 'individual') === 'corporate'; $disabledClass = $commissionDisabled ? 'opacity-40 cursor-not-allowed bg-gray-100' : ''; @endphp + {{-- 계약일 --}} + + {{ $prospect->contracted_at ? \Carbon\Carbon::parse($prospect->contracted_at)->format('Y-m-d') : '-' }} + {{-- 1차 납입완료 --}} id }}, 'first_payment_at', this.value)"> - {{-- 1차 파트너 수당지급 --}} - - - {{-- 2차 납입완료 --}} id }}, 'second_payment_at', this.value)"> - {{-- 2차 파트너 수당지급 --}} - - - - {{-- 매니저 수당지급 --}} - {{-- 매니저 수당지급 (단체는 해당없음) --}} - - @if($isCorporate) - - - @else - - @endif - - {{-- 협업지원금 --}} - - @if(($prospect->partner_type ?? 'individual') !== 'corporate') - - @else - - - @endif -