From 6a846a1c0de079883037fe2e4141acde8e79ad2f 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:34:07 +0900 Subject: [PATCH] =?UTF-8?q?feat:=EA=B3=84=EC=95=BD=EC=9D=BC=20date=20input?= =?UTF-8?q?=20=EC=9E=85=EB=A0=A5=20=EA=B0=80=EB=8A=A5=ED=95=98=EA=B2=8C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= 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 | 24 +++++++++++++++ .../sales/admin-prospects/index.blade.php | 29 +++++++++++++++++++ .../partials/content.blade.php | 7 +++-- routes/web.php | 1 + 4 files changed, 59 insertions(+), 2 deletions(-) diff --git a/app/Http/Controllers/Sales/AdminProspectController.php b/app/Http/Controllers/Sales/AdminProspectController.php index db107976..1f8e9bd8 100644 --- a/app/Http/Controllers/Sales/AdminProspectController.php +++ b/app/Http/Controllers/Sales/AdminProspectController.php @@ -323,6 +323,30 @@ public function updateHqStatus(int $id, Request $request) ]); } + /** + * 계약일 변경 + */ + public function updateContractedDate(int $id, Request $request) + { + $this->checkAdminAccess(); + + $request->validate([ + 'contracted_at' => 'nullable|date', + ]); + + $prospect = TenantProspect::findOrFail($id); + $management = SalesTenantManagement::findOrCreateByProspect($prospect->id); + + $management->update([ + 'contracted_at' => $request->input('contracted_at') ?: null, + ]); + + return response()->json([ + 'success' => true, + 'contracted_at' => $management->contracted_at?->format('Y-m-d'), + ]); + } + /** * 인계일 수동 변경 */ diff --git a/resources/views/sales/admin-prospects/index.blade.php b/resources/views/sales/admin-prospects/index.blade.php index 1b266491..676f0aa3 100644 --- a/resources/views/sales/admin-prospects/index.blade.php +++ b/resources/views/sales/admin-prospects/index.blade.php @@ -350,6 +350,35 @@ function confirmDelete() { }); } +// 계약일 저장 +function saveContractedDate(prospectId, date, inputEl) { + fetch(`/sales/admin-prospects/${prospectId}/contracted-date`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').content, + 'Accept': 'application/json' + }, + body: JSON.stringify({ contracted_at: date || null }) + }) + .then(response => response.json()) + .then(result => { + if (result.success && inputEl) { + if (date) { + inputEl.className = 'w-28 h-7 text-xs px-1 border-2 border-blue-400 rounded cursor-pointer hover:border-blue-400 focus:outline-none focus:border-blue-500 text-blue-600 font-medium bg-blue-50'; + } else { + inputEl.className = 'w-28 h-7 text-xs px-1 border-2 border-gray-300 rounded cursor-pointer hover:border-blue-400 focus:outline-none focus:border-blue-500 text-gray-500 bg-gray-50'; + } + } else if (!result.success) { + alert(result.message || '계약일 저장에 실패했습니다.'); + } + }) + .catch(error => { + console.error('Error:', error); + alert('계약일 저장 중 오류가 발생했습니다.'); + }); +} + // 인계일 저장 function saveHandoverDate(prospectId, date) { if (!date) return; diff --git a/resources/views/sales/admin-prospects/partials/content.blade.php b/resources/views/sales/admin-prospects/partials/content.blade.php index f77e196e..6ce24e5c 100644 --- a/resources/views/sales/admin-prospects/partials/content.blade.php +++ b/resources/views/sales/admin-prospects/partials/content.blade.php @@ -148,8 +148,11 @@ class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none foc $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차 납입완료 --}} diff --git a/routes/web.php b/routes/web.php index 7f7fb533..63a1c26a 100644 --- a/routes/web.php +++ b/routes/web.php @@ -1253,6 +1253,7 @@ 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}/contracted-date', [\App\Http\Controllers\Sales\AdminProspectController::class, 'updateContractedDate'])->name('admin-prospects.update-contracted-date'); Route::post('admin-prospects/{id}/handover-date', [\App\Http\Controllers\Sales\AdminProspectController::class, 'updateHandoverDate'])->name('admin-prospects.update-handover-date'); 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');