'decimal:2', 'purchased_at' => 'datetime', 'expires_at' => 'datetime', 'used_events' => 'integer', 'active' => 'boolean', ]; public function tenant(): BelongsTo { return $this->belongsTo(Tenant::class); } public function package(): BelongsTo { return $this->belongsTo(Package::class); } public function isActive(): bool { return $this->active && (!$this->expires_at || $this->expires_at->isFuture()); } public function canCreateEvent(): bool { if (!$this->isActive()) { return false; } if (!$this->package->isReseller()) { return false; } $maxEvents = $this->package->max_events_per_year ?? 0; return $this->used_events < $maxEvents; } public function getRemainingEventsAttribute(): int { if (!$this->package->isReseller()) { return 0; } $max = $this->package->max_events_per_year ?? 0; return max(0, $max - $this->used_events); } protected static function boot() { parent::boot(); static::creating(function ($tenantPackage) { if (!$tenantPackage->purchased_at) { $tenantPackage->purchased_at = now(); } if (!$tenantPackage->expires_at && $tenantPackage->package) { $tenantPackage->expires_at = now()->addYear(); // Standard für Reseller } $tenantPackage->active = true; }); static::updating(function ($tenantPackage) { if ($tenantPackage->isDirty('expires_at') && $tenantPackage->expires_at->isPast()) { $tenantPackage->active = false; } }); } }