'대기', self::STATUS_APPROVED => '승인', self::STATUS_PAID => '지급완료', self::STATUS_CANCELLED => '취소', ]; /** * 입금 구분 라벨 */ public static array $paymentTypeLabels = [ self::PAYMENT_DEPOSIT => '계약금', self::PAYMENT_BALANCE => '잔금', ]; protected $fillable = [ 'tenant_id', 'management_id', 'payment_type', 'payment_amount', 'payment_date', 'base_amount', 'partner_rate', 'manager_rate', 'partner_commission', 'manager_commission', 'scheduled_payment_date', 'status', 'actual_payment_date', 'partner_id', 'manager_user_id', 'notes', 'bank_reference', 'approved_by', 'approved_at', ]; protected $casts = [ 'payment_amount' => 'decimal:2', 'base_amount' => 'decimal:2', 'partner_rate' => 'decimal:2', 'manager_rate' => 'decimal:2', 'partner_commission' => 'decimal:2', 'manager_commission' => 'decimal:2', 'payment_date' => 'date', 'scheduled_payment_date' => 'date', 'actual_payment_date' => 'date', 'approved_at' => 'datetime', ]; /** * 테넌트 관계 */ public function tenant(): BelongsTo { return $this->belongsTo(Tenant::class); } /** * 영업관리 관계 */ public function management(): BelongsTo { return $this->belongsTo(SalesTenantManagement::class, 'management_id'); } /** * 영업파트너 관계 */ public function partner(): BelongsTo { return $this->belongsTo(SalesPartner::class, 'partner_id'); } /** * 매니저(사용자) 관계 */ public function manager(): BelongsTo { return $this->belongsTo(User::class, 'manager_user_id'); } /** * 상세 내역 관계 */ public function details(): HasMany { return $this->hasMany(SalesCommissionDetail::class, 'commission_id'); } /** * 승인자 관계 */ public function approver(): BelongsTo { return $this->belongsTo(User::class, 'approved_by'); } /** * 상태 라벨 Accessor */ public function getStatusLabelAttribute(): string { return self::$statusLabels[$this->status] ?? $this->status; } /** * 입금 구분 라벨 Accessor */ public function getPaymentTypeLabelAttribute(): string { return self::$paymentTypeLabels[$this->payment_type] ?? $this->payment_type; } /** * 총 수당액 Accessor */ public function getTotalCommissionAttribute(): float { return $this->partner_commission + $this->manager_commission; } /** * 지급예정일 계산 (입금일 익월 10일) */ public static function calculateScheduledPaymentDate(Carbon $paymentDate): Carbon { return $paymentDate->copy()->addMonth()->day(10); } /** * 승인 처리 */ public function approve(int $approverId): bool { if ($this->status !== self::STATUS_PENDING) { return false; } return $this->update([ 'status' => self::STATUS_APPROVED, 'approved_by' => $approverId, 'approved_at' => now(), ]); } /** * 지급완료 처리 */ public function markAsPaid(?string $bankReference = null): bool { if ($this->status !== self::STATUS_APPROVED) { return false; } return $this->update([ 'status' => self::STATUS_PAID, 'actual_payment_date' => now()->format('Y-m-d'), 'bank_reference' => $bankReference, ]); } /** * 취소 처리 */ public function cancel(): bool { if ($this->status === self::STATUS_PAID) { return false; } return $this->update([ 'status' => self::STATUS_CANCELLED, ]); } /** * 대기 상태 스코프 */ public function scopePending(Builder $query): Builder { return $query->where('status', self::STATUS_PENDING); } /** * 승인완료 스코프 */ public function scopeApproved(Builder $query): Builder { return $query->where('status', self::STATUS_APPROVED); } /** * 지급완료 스코프 */ public function scopePaid(Builder $query): Builder { return $query->where('status', self::STATUS_PAID); } /** * 특정 영업파트너 스코프 */ public function scopeForPartner(Builder $query, int $partnerId): Builder { return $query->where('partner_id', $partnerId); } /** * 특정 매니저 스코프 */ public function scopeForManager(Builder $query, int $managerUserId): Builder { return $query->where('manager_user_id', $managerUserId); } /** * 특정 월 지급예정 스코프 */ public function scopeForScheduledMonth(Builder $query, int $year, int $month): Builder { return $query->whereYear('scheduled_payment_date', $year) ->whereMonth('scheduled_payment_date', $month); } /** * 특정 기간 입금 스코프 */ public function scopePaymentDateBetween(Builder $query, string $startDate, string $endDate): Builder { return $query->whereBetween('payment_date', [$startDate, $endDate]); } }