fix:단체 파트너 수당 - 1차/2차 납입 시 deposit/balance 레코드 분리 생성

기존에는 management당 하나의 커미션 레코드만 생성되어 수당리스트에 계약금만 표시됨.
이제 1차 필드(first_*)는 deposit 레코드, 2차 필드(second_*)는 balance 레코드로
분리하여 양쪽 모두 수당리스트에 나타남.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
김보곤
2026-02-19 16:01:07 +09:00
parent 7e741884d6
commit e7ab389023

View File

@@ -29,6 +29,51 @@ private function checkAdminAccess(): void
}
}
/**
* 필드명에 따라 payment_type 결정 (1차→deposit, 2차→balance)
*/
private function getPaymentTypeForField(string $field): string
{
return in_array($field, ['second_payment_at', 'second_partner_paid_at'])
? SalesCommission::PAYMENT_BALANCE
: SalesCommission::PAYMENT_DEPOSIT;
}
/**
* deposit/balance 커미션 레코드를 병합하여 뷰용 객체 반환
*/
private function loadMergedCommission(?SalesTenantManagement $management): ?object
{
if (!$management) {
return null;
}
$commissions = SalesCommission::where('management_id', $management->id)->get();
if ($commissions->isEmpty()) {
return null;
}
$deposit = $commissions->firstWhere('payment_type', SalesCommission::PAYMENT_DEPOSIT);
$balance = $commissions->firstWhere('payment_type', SalesCommission::PAYMENT_BALANCE);
// balance 레코드가 없으면 기존 단일 레코드 그대로 반환 (하위호환)
if (!$balance) {
return $deposit ?? $commissions->first();
}
// 1차 필드는 deposit, 2차 필드는 balance에서 가져옴
$merged = new \stdClass();
$merged->first_payment_at = $deposit?->first_payment_at;
$merged->first_partner_paid_at = $deposit?->first_partner_paid_at;
$merged->second_payment_at = $balance->second_payment_at;
$merged->second_partner_paid_at = $balance->second_partner_paid_at;
$merged->first_subscription_at = $deposit?->first_subscription_at;
$merged->manager_paid_at = $deposit?->manager_paid_at;
$merged->referrer_commission = ($deposit?->referrer_commission ?? 0) + ($balance?->referrer_commission ?? 0);
return $merged;
}
/**
* 전체 고객 목록 페이지
*/
@@ -147,12 +192,7 @@ private function getIndexData(Request $request): array
$prospect->hq_status_label = $management?->hq_status_label ?? '대기';
$prospect->manager_user = $management?->manager;
if ($management) {
$commission = SalesCommission::where('management_id', $management->id)->first();
$prospect->commission = $commission;
} else {
$prospect->commission = null;
}
$prospect->commission = $this->loadMergedCommission($management);
// 파트너 타입: management → registered_by 순으로 조회
$partnerType = $management?->salesPartner?->partner_type;
@@ -199,12 +239,7 @@ private function getIndexData(Request $request): array
$prospect->manager_user = $management?->manager;
// 수당 정보 (management가 있는 경우)
if ($management) {
$commission = SalesCommission::where('management_id', $management->id)->first();
$prospect->commission = $commission;
} else {
$prospect->commission = null;
}
$prospect->commission = $this->loadMergedCommission($management);
// 파트너 타입: management → registered_by 순으로 조회
$partnerType = $management?->salesPartner?->partner_type;
@@ -290,12 +325,16 @@ public function updateCommissionDate(int $id, Request $request)
$prospect = TenantProspect::findOrFail($id);
$management = SalesTenantManagement::findOrCreateByProspect($prospect->id);
// Commission 레코드 조회 또는 생성
$field = $request->input('field');
// 1차 필드 → deposit 레코드, 2차 필드 → balance 레코드
$paymentType = $this->getPaymentTypeForField($field);
// Commission 레코드 조회 또는 생성 (payment_type별 분리)
$commission = SalesCommission::firstOrCreate(
['management_id' => $management->id],
['management_id' => $management->id, 'payment_type' => $paymentType],
[
'tenant_id' => $prospect->tenant_id ?? 1,
'payment_type' => 'deposit',
'payment_amount' => 0,
'payment_date' => now(),
'base_amount' => 0,
@@ -311,8 +350,6 @@ public function updateCommissionDate(int $id, Request $request)
'manager_user_id' => $management->manager_user_id,
]
);
$field = $request->input('field');
$date = $request->input('date') ?: now()->format('Y-m-d');
// 수당지급일 필드는 개발상태가 '인계'일 때만 저장 가능
@@ -481,13 +518,18 @@ public function clearCommissionDate(int $id, Request $request)
return response()->json(['success' => false, 'message' => '관리 정보가 없습니다.']);
}
$commission = SalesCommission::where('management_id', $management->id)->first();
$field = $request->input('field');
// 1차 필드 → deposit 레코드, 2차 필드 → balance 레코드
$paymentType = $this->getPaymentTypeForField($field);
$commission = SalesCommission::where('management_id', $management->id)
->where('payment_type', $paymentType)
->first();
if (!$commission) {
return response()->json(['success' => false, 'message' => '수당 정보가 없습니다.']);
}
$field = $request->input('field');
$updateData = [$field => null];
// 납입일 삭제 시 수당지급일도 함께 초기화