'integer', 'source_variant_id' => 'integer', 'source_purchase_id' => 'integer', 'starts_at' => 'datetime', 'expires_at' => 'datetime', 'used_at' => 'datetime', 'user_id' => 'integer', ]; } /** @return BelongsTo */ public function tenant(): BelongsTo { return $this->belongsTo(Tenant::class, 'tenant_code', 'codigo'); } /** @return BelongsTo */ public function user(): BelongsTo { return $this->belongsTo(User::class); } /** @return BelongsTo */ public function sourcePurchase(): BelongsTo { return $this->belongsTo(Purchase::class, 'source_purchase_id'); } public function isValid(): bool { $now = now(); return $this->used_at === null && ($this->starts_at === null || $this->starts_at->lessThanOrEqualTo($now)) && ($this->expires_at === null || $this->expires_at->greaterThan($now)); } public function getIsValidAttribute(): bool { return $this->isValid(); } public function getIsExpiredAttribute(): bool { return $this->used_at === null && $this->expires_at !== null && $this->expires_at->lessThanOrEqualTo(now()); } public function getIsUsedAttribute(): bool { return $this->used_at !== null; } }