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
- |
|
@@ -271,7 +217,7 @@ class="text-red-500 hover:text-red-700"
@empty
|
- |
+ |
등록된 고객이 없습니다.
|
diff --git a/routes/web.php b/routes/web.php
index e93e9a9b..52280d94 100644
--- a/routes/web.php
+++ b/routes/web.php
@@ -1025,6 +1025,7 @@
Route::post('/{id}/approve', [\App\Http\Controllers\Finance\SalesCommissionController::class, 'approve'])->name('approve');
Route::post('/{id}/mark-paid', [\App\Http\Controllers\Finance\SalesCommissionController::class, 'markPaid'])->name('mark-paid');
Route::post('/{id}/cancel', [\App\Http\Controllers\Finance\SalesCommissionController::class, 'cancel'])->name('cancel');
+ Route::put('/{id}/update-date', [\App\Http\Controllers\Finance\SalesCommissionController::class, 'updateCommissionDate'])->name('update-date');
});
// 기존 URL 리다이렉트 → 통합 정산관리