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:
@@ -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];
|
||||
|
||||
// 납입일 삭제 시 수당지급일도 함께 초기화
|
||||
|
||||
Reference in New Issue
Block a user