'array', 'settings' => 'array', 'last_activity_at' => 'datetime', 'total_revenue' => 'decimal:2', 'settings_updated_at' => 'datetime', 'subscription_expires_at' => 'datetime', ]; public function events(): HasMany { return $this->hasMany(Event::class); } public function photos(): HasManyThrough { return $this->hasManyThrough( Photo::class, Event::class, 'tenant_id', 'event_id', 'id', 'id' ); } public function purchases(): HasMany { return $this->hasMany(PackagePurchase::class); } public function tenantPackages(): HasMany { return $this->hasMany(TenantPackage::class); } public function activeResellerPackage(): HasOne { return $this->hasOne(TenantPackage::class)->where('active', true); } public function canCreateEvent(): bool { $package = $this->activeResellerPackage()->first(); if (!$package) { return false; } return $package->canCreateEvent(); } public function incrementUsedEvents(int $amount = 1): bool { $package = $this->activeResellerPackage()->first(); if (!$package) { return false; } $package->increment('used_events', $amount); return true; } public function setSettingsAttribute($value): void { if (is_string($value)) { $this->attributes['settings'] = $value; return; } $this->attributes['settings'] = json_encode($value ?? []); } public function incrementCredits(int $amount, string $reason = 'manual', ?string $note = null, ?int $purchaseId = null): bool { if ($amount <= 0) { return false; } $balance = (int) ($this->event_credits_balance ?? 0) + $amount; $this->forceFill(['event_credits_balance' => $balance])->save(); EventCreditsLedger::create([ 'tenant_id' => $this->id, 'delta' => $amount, 'reason' => $reason, 'related_purchase_id' => $purchaseId, 'note' => $note, ]); return true; } public function decrementCredits(int $amount, string $reason = 'usage', ?string $note = null, ?int $purchaseId = null): bool { $current = (int) ($this->event_credits_balance ?? 0); if ($amount <= 0 || $amount > $current) { return false; } $balance = $current - $amount; $this->forceFill(['event_credits_balance' => $balance])->save(); EventCreditsLedger::create([ 'tenant_id' => $this->id, 'delta' => -$amount, 'reason' => $reason, 'related_purchase_id' => $purchaseId, 'note' => $note, ]); return true; } public function activeSubscription(): Attribute { return Attribute::make( get: fn () => $this->activeResellerPackage()->exists(), ); } public function user(): BelongsTo { return $this->belongsTo(User::class); } }