From 6a7a8d00d0a0a9b2cfd922ade00c8d18bd624af2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=B3=B4=EA=B3=A4?= Date: Thu, 19 Feb 2026 16:27:12 +0900 Subject: [PATCH] =?UTF-8?q?feat:=EC=98=81=EC=97=85=ED=8C=8C=ED=8A=B8?= =?UTF-8?q?=EB=84=88=20=EA=B3=A0=EA=B0=9D=EA=B4=80=EB=A6=AC=20=EC=9D=B8?= =?UTF-8?q?=EA=B3=84=EC=9D=BC=20=EC=BB=AC=EB=9F=BC=20=EB=8F=99=EC=A0=81=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.6 --- .../Sales/AdminProspectController.php | 41 +++++++++++++++++-- app/Models/Sales/SalesTenantManagement.php | 2 + .../sales/admin-prospects/index.blade.php | 39 ++++++++++++++++++ .../partials/content.blade.php | 14 ++++++- routes/web.php | 1 + 5 files changed, 93 insertions(+), 4 deletions(-) diff --git a/app/Http/Controllers/Sales/AdminProspectController.php b/app/Http/Controllers/Sales/AdminProspectController.php index b14faad7..db107976 100644 --- a/app/Http/Controllers/Sales/AdminProspectController.php +++ b/app/Http/Controllers/Sales/AdminProspectController.php @@ -192,6 +192,7 @@ private function getIndexData(Request $request): array $prospect->hq_status_label = $management?->hq_status_label ?? '대기'; $prospect->manager_user = $management?->manager; $prospect->contracted_at = $management?->contracted_at; + $prospect->handover_at = $management?->handover_at; $prospect->commission = $this->loadMergedCommission($management); @@ -239,6 +240,7 @@ private function getIndexData(Request $request): array $prospect->hq_status_label = $management?->hq_status_label ?? '대기'; $prospect->manager_user = $management?->manager; $prospect->contracted_at = $management?->contracted_at; + $prospect->handover_at = $management?->handover_at; // 수당 정보 (management가 있는 경우) $prospect->commission = $this->loadMergedCommission($management); @@ -301,14 +303,47 @@ public function updateHqStatus(int $id, Request $request) $prospect = TenantProspect::findOrFail($id); $management = SalesTenantManagement::findOrCreateByProspect($prospect->id); - $management->update([ - 'hq_status' => $request->input('hq_status'), - ]); + $newStatus = $request->input('hq_status'); + $updateData = ['hq_status' => $newStatus]; + + // 인계로 변경 시 오늘 날짜 자동 세팅, 다른 상태로 변경 시 초기화 + if ($newStatus === SalesTenantManagement::HQ_STATUS_HANDOVER) { + $updateData['handover_at'] = now(); + } else { + $updateData['handover_at'] = null; + } + + $management->update($updateData); return response()->json([ 'success' => true, 'hq_status' => $management->hq_status, 'hq_status_label' => $management->hq_status_label, + 'handover_at' => $management->handover_at?->format('Y-m-d'), + ]); + } + + /** + * 인계일 수동 변경 + */ + public function updateHandoverDate(int $id, Request $request) + { + $this->checkAdminAccess(); + + $request->validate([ + 'handover_at' => 'required|date', + ]); + + $prospect = TenantProspect::findOrFail($id); + $management = SalesTenantManagement::findOrCreateByProspect($prospect->id); + + $management->update([ + 'handover_at' => $request->input('handover_at'), + ]); + + return response()->json([ + 'success' => true, + 'handover_at' => $management->handover_at?->format('Y-m-d'), ]); } diff --git a/app/Models/Sales/SalesTenantManagement.php b/app/Models/Sales/SalesTenantManagement.php index c8aceb52..b812cae7 100644 --- a/app/Models/Sales/SalesTenantManagement.php +++ b/app/Models/Sales/SalesTenantManagement.php @@ -60,6 +60,7 @@ class SalesTenantManagement extends Model 'sales_progress', 'manager_progress', 'hq_status', + 'handover_at', 'incentive_status', 'notes', // 입금 정보 @@ -85,6 +86,7 @@ class SalesTenantManagement extends Model 'onboarding_completed_at' => 'datetime', 'membership_paid_at' => 'datetime', 'commission_paid_at' => 'datetime', + 'handover_at' => 'datetime', // 입금 정보 'deposit_amount' => 'decimal:2', 'deposit_paid_date' => 'date', diff --git a/resources/views/sales/admin-prospects/index.blade.php b/resources/views/sales/admin-prospects/index.blade.php index d1179e33..1b266491 100644 --- a/resources/views/sales/admin-prospects/index.blade.php +++ b/resources/views/sales/admin-prospects/index.blade.php @@ -219,6 +219,20 @@ function updateHqStatus(prospectId, status) { selectEl.className += 'bg-purple-100 text-purple-700 border-purple-300'; } selectEl.dataset.originalValue = status; + + // 인계일 셀 동적 업데이트 + const handoverCell = document.getElementById(`handover-cell-${prospectId}`); + if (handoverCell) { + if (status === 'handover' && result.handover_at) { + handoverCell.innerHTML = ``; + } else { + handoverCell.innerHTML = `-`; + } + } } else { alert('상태 변경에 실패했습니다.'); selectEl.value = originalValue; @@ -336,6 +350,31 @@ function confirmDelete() { }); } +// 인계일 저장 +function saveHandoverDate(prospectId, date) { + if (!date) return; + + fetch(`/sales/admin-prospects/${prospectId}/handover-date`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').content, + 'Accept': 'application/json' + }, + body: JSON.stringify({ handover_at: date }) + }) + .then(response => response.json()) + .then(result => { + if (!result.success) { + alert(result.message || '인계일 저장에 실패했습니다.'); + } + }) + .catch(error => { + console.error('Error:', error); + alert('인계일 저장 중 오류가 발생했습니다.'); + }); +} + // 납입 날짜 저장 (date input에서 호출) function saveCommissionDate(prospectId, field, date) { const input = document.querySelector(`input[data-prospect-id="${prospectId}"][data-field="${field}"]`); diff --git a/resources/views/sales/admin-prospects/partials/content.blade.php b/resources/views/sales/admin-prospects/partials/content.blade.php index e3624cd9..f77e196e 100644 --- a/resources/views/sales/admin-prospects/partials/content.blade.php +++ b/resources/views/sales/admin-prospects/partials/content.blade.php @@ -93,6 +93,7 @@ class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none foc 1차 납입 2차 납입 개발 상태 + 인계일 상태 관리 @@ -185,6 +186,17 @@ class="text-xs font-medium rounded-lg px-2 py-1 border cursor-pointer @endforeach + + @if($prospect->hq_status === 'handover') + + @else + - + @endif + @if(in_array($prospect->status, ['active', 'completed']))