diff --git a/app/Http/Controllers/Sales/AdminProspectController.php b/app/Http/Controllers/Sales/AdminProspectController.php index d8b38b4d..b2b38b0e 100644 --- a/app/Http/Controllers/Sales/AdminProspectController.php +++ b/app/Http/Controllers/Sales/AdminProspectController.php @@ -194,4 +194,87 @@ public function updateHqStatus(int $id, Request $request) 'hq_status_label' => $management->hq_status_label, ]); } + + /** + * 수당 날짜 기록/수정 + */ + public function updateCommissionDate(int $id, Request $request) + { + $this->checkAdminAccess(); + + $request->validate([ + 'field' => 'required|in:first_payment_at,first_partner_paid_at,second_payment_at,second_partner_paid_at,first_subscription_at,manager_paid_at', + 'date' => 'nullable|date', + ]); + + $prospect = TenantProspect::findOrFail($id); + $management = SalesTenantManagement::findOrCreateByProspect($prospect->id); + + // Commission 레코드 조회 또는 생성 + $commission = SalesCommission::firstOrCreate( + ['management_id' => $management->id], + [ + 'tenant_id' => $prospect->tenant_id ?? 1, + 'payment_type' => 'deposit', + 'payment_amount' => 0, + 'payment_date' => now(), + 'base_amount' => 0, + 'partner_rate' => 0, + 'manager_rate' => 0, + 'partner_commission' => 0, + 'manager_commission' => 0, + 'scheduled_payment_date' => now()->addMonth()->day(10), + 'status' => SalesCommission::STATUS_PENDING, + 'partner_id' => $management->sales_partner_id ?? 0, + 'manager_user_id' => $management->manager_user_id, + ] + ); + + $field = $request->input('field'); + $date = $request->input('date') ?: now()->format('Y-m-d'); + + $commission->update([ + $field => $date, + ]); + + return response()->json([ + 'success' => true, + 'field' => $field, + 'date' => $commission->$field?->format('Y-m-d'), + 'date_display' => $commission->$field?->format('m/d'), + ]); + } + + /** + * 수당 날짜 삭제 (초기화) + */ + public function clearCommissionDate(int $id, Request $request) + { + $this->checkAdminAccess(); + + $request->validate([ + 'field' => 'required|in:first_payment_at,first_partner_paid_at,second_payment_at,second_partner_paid_at,first_subscription_at,manager_paid_at', + ]); + + $prospect = TenantProspect::findOrFail($id); + $management = SalesTenantManagement::where('tenant_prospect_id', $prospect->id)->first(); + + if (!$management) { + return response()->json(['success' => false, 'message' => '관리 정보가 없습니다.']); + } + + $commission = SalesCommission::where('management_id', $management->id)->first(); + + if (!$commission) { + return response()->json(['success' => false, 'message' => '수당 정보가 없습니다.']); + } + + $field = $request->input('field'); + $commission->update([$field => null]); + + return response()->json([ + 'success' => true, + 'field' => $field, + ]); + } } diff --git a/resources/views/sales/admin-prospects/index.blade.php b/resources/views/sales/admin-prospects/index.blade.php index ad9eda1d..c8ecef94 100644 --- a/resources/views/sales/admin-prospects/index.blade.php +++ b/resources/views/sales/admin-prospects/index.blade.php @@ -164,5 +164,118 @@ function closeDetailModal() { closeDetailModal(); } }); + +// 수당 날짜 기록/수정 +function updateCommissionDate(prospectId, field, currentDate = null) { + const fieldLabels = { + 'first_payment_at': '1차 납입완료', + 'first_partner_paid_at': '1차 파트너 수당지급', + 'second_payment_at': '2차 납입완료', + 'second_partner_paid_at': '2차 파트너 수당지급', + 'first_subscription_at': '첫 구독료 입금', + 'manager_paid_at': '매니저 수당지급' + }; + + const label = fieldLabels[field] || field; + + if (currentDate) { + // 이미 날짜가 있는 경우: 삭제 또는 수정 선택 + const action = confirm(`${label} 날짜(${currentDate})를 삭제하시겠습니까?\n\n취소를 누르면 날짜를 변경할 수 있습니다.`); + if (action) { + // 삭제 + clearCommissionDate(prospectId, field); + } else { + // 날짜 변경 + const newDate = prompt(`${label} 날짜를 입력하세요 (YYYY-MM-DD):`, currentDate); + if (newDate && newDate !== currentDate) { + saveCommissionDate(prospectId, field, newDate); + } + } + } else { + // 날짜가 없는 경우: 오늘 날짜로 기록할지 확인 + const today = new Date().toISOString().split('T')[0]; + const useToday = confirm(`${label} 날짜를 오늘(${today})로 기록하시겠습니까?\n\n취소를 누르면 다른 날짜를 선택할 수 있습니다.`); + if (useToday) { + saveCommissionDate(prospectId, field, today); + } else { + const customDate = prompt(`${label} 날짜를 입력하세요 (YYYY-MM-DD):`, today); + if (customDate) { + saveCommissionDate(prospectId, field, customDate); + } + } + } +} + +// 수당 날짜 저장 +function saveCommissionDate(prospectId, field, date) { + fetch(`/sales/admin-prospects/${prospectId}/commission-date`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').content, + 'Accept': 'application/json' + }, + body: JSON.stringify({ field: field, date: date }) + }) + .then(response => response.json()) + .then(result => { + if (result.success) { + // 셀 업데이트 + const cell = document.querySelector(`[data-prospect-id="${prospectId}"][data-field="${field}"]`); + if (cell && result.date_display) { + cell.innerHTML = `${result.date_display}`; + cell.dataset.date = result.date; + } + } else { + alert(result.message || '날짜 저장에 실패했습니다.'); + } + }) + .catch(error => { + console.error('Error:', error); + alert('날짜 저장 중 오류가 발생했습니다.'); + }); +} + +// 수당 날짜 삭제 +function clearCommissionDate(prospectId, field) { + fetch(`/sales/admin-prospects/${prospectId}/commission-date`, { + method: 'DELETE', + headers: { + 'Content-Type': 'application/json', + 'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').content, + 'Accept': 'application/json' + }, + body: JSON.stringify({ field: field }) + }) + .then(response => response.json()) + .then(result => { + if (result.success) { + // 셀 업데이트 + const cell = document.querySelector(`[data-prospect-id="${prospectId}"][data-field="${field}"]`); + if (cell) { + cell.innerHTML = `-`; + cell.dataset.date = ''; + } + } else { + alert(result.message || '날짜 삭제에 실패했습니다.'); + } + }) + .catch(error => { + console.error('Error:', error); + alert('날짜 삭제 중 오류가 발생했습니다.'); + }); +} + +// 필드별 색상 클래스 +function getDateColorClass(field) { + if (field === 'first_payment_at' || field === 'second_payment_at') { + return 'text-emerald-600'; + } else if (field === 'first_partner_paid_at' || field === 'second_partner_paid_at') { + return 'text-blue-600'; + } else if (field === 'manager_paid_at') { + return 'text-purple-600'; + } + return 'text-gray-600'; +} @endpush diff --git a/resources/views/sales/admin-prospects/partials/content.blade.php b/resources/views/sales/admin-prospects/partials/content.blade.php index dfb20e35..dde2e3f4 100644 --- a/resources/views/sales/admin-prospects/partials/content.blade.php +++ b/resources/views/sales/admin-prospects/partials/content.blade.php @@ -133,7 +133,12 @@ class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none foc {{-- 1차 납입완료 --}} - + @if($prospect->commission?->first_payment_at) {{ $prospect->commission->first_payment_at->format('m/d') }} @else @@ -141,7 +146,12 @@ class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none foc @endif {{-- 1차 파트너 수당지급 --}} - + @if($prospect->commission?->first_partner_paid_at) {{ $prospect->commission->first_partner_paid_at->format('m/d') }} @else @@ -149,7 +159,12 @@ class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none foc @endif {{-- 2차 납입완료 --}} - + @if($prospect->commission?->second_payment_at) {{ $prospect->commission->second_payment_at->format('m/d') }} @else @@ -157,7 +172,12 @@ class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none foc @endif {{-- 2차 파트너 수당지급 --}} - + @if($prospect->commission?->second_partner_paid_at) {{ $prospect->commission->second_partner_paid_at->format('m/d') }} @else @@ -165,7 +185,12 @@ class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none foc @endif {{-- 매니저 수당지급 --}} - + @if($prospect->commission?->manager_paid_at) {{ $prospect->commission->manager_paid_at->format('m/d') }} @else diff --git a/routes/web.php b/routes/web.php index 24641385..3f6ab90a 100644 --- a/routes/web.php +++ b/routes/web.php @@ -937,6 +937,8 @@ Route::get('admin-prospects/refresh', [\App\Http\Controllers\Sales\AdminProspectController::class, 'refresh'])->name('admin-prospects.refresh'); Route::get('admin-prospects/{id}/modal-show', [\App\Http\Controllers\Sales\AdminProspectController::class, 'modalShow'])->name('admin-prospects.modal-show'); Route::post('admin-prospects/{id}/hq-status', [\App\Http\Controllers\Sales\AdminProspectController::class, 'updateHqStatus'])->name('admin-prospects.update-hq-status'); + Route::post('admin-prospects/{id}/commission-date', [\App\Http\Controllers\Sales\AdminProspectController::class, 'updateCommissionDate'])->name('admin-prospects.update-commission-date'); + Route::delete('admin-prospects/{id}/commission-date', [\App\Http\Controllers\Sales\AdminProspectController::class, 'clearCommissionDate'])->name('admin-prospects.clear-commission-date'); // 영업 시나리오 관리 Route::prefix('scenarios')->name('scenarios.')->group(function () {