'decimal:2', 'manager_commission_rate' => 'decimal:2', 'total_contracts' => 'integer', 'total_commission' => 'decimal:2', 'approved_at' => 'datetime', ]; /** * 연결된 사용자 */ public function user(): BelongsTo { return $this->belongsTo(User::class); } /** * 승인자 */ public function approver(): BelongsTo { return $this->belongsTo(User::class, 'approved_by'); } /** * 담당 테넌트 관리 목록 */ public function tenantManagements(): HasMany { return $this->hasMany(SalesTenantManagement::class, 'sales_partner_id'); } /** * 수수료 정산 내역 */ public function commissions(): HasMany { return $this->hasMany(SalesCommission::class, 'partner_id'); } /** * 이 단체를 유치한 영업파트너 */ public function referrer(): BelongsTo { return $this->belongsTo(SalesPartner::class, 'referrer_partner_id'); } /** * 이 영업파트너가 유치한 단체 목록 */ public function referredGroups(): HasMany { return $this->hasMany(SalesPartner::class, 'referrer_partner_id'); } /** * 단체 여부 확인 (partner_type 기반) */ public function isGroup(): bool { return $this->partner_type === 'corporate'; } /** * 파트너 코드 자동 생성 */ public static function generatePartnerCode(): string { $prefix = 'SP'; $year = now()->format('y'); $lastPartner = self::whereYear('created_at', now()->year) ->orderBy('id', 'desc') ->first(); $sequence = $lastPartner ? (int) substr($lastPartner->partner_code, -4) + 1 : 1; return $prefix.$year.str_pad($sequence, 4, '0', STR_PAD_LEFT); } /** * 활성 파트너 스코프 */ public function scopeActive($query) { return $query->where('status', 'active'); } /** * 승인 대기 스코프 */ public function scopePending($query) { return $query->where('status', 'pending'); } }