'integer', 'source_variant_id' => 'integer', 'source_purchase_id' => 'integer', 'used_at' => 'datetime', 'scanner_user_id' => 'integer', '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 scannerUser(): BelongsTo { return $this->belongsTo(User::class, 'scanner_user_id'); } /** @return BelongsTo */ public function sourcePurchase(): BelongsTo { return $this->belongsTo(Purchase::class, 'source_purchase_id'); } /** @return BelongsTo */ public function sourceCatalogItem(): BelongsTo { return $this->belongsTo(CatalogItem::class, 'source_catalog_item_id')->withTrashed(); } /** @return BelongsTo */ public function sourceVariant(): BelongsTo { return $this->belongsTo(Variant::class, 'source_variant_id')->withTrashed(); } public function isValid(): bool { if ($this->used_at !== null) { return false; } return $this->resolvedValidity()->isValid(); } public function getIsValidAttribute(): bool { return $this->isValid(); } public function getIsExpiredAttribute(): bool { return $this->used_at === null && $this->resolvedValidity()->isExpired(); } public function getIsUsedAttribute(): bool { return $this->used_at !== null; } public function getStatusAttribute(): string { if ($this->is_used) { return self::STATUS_USED; } if ($this->is_expired) { return self::STATUS_EXPIRED; } return self::STATUS_ACTIVE; } public function getNameAttribute(): string { return app(TicketPresentationResolver::class)->name($this); } public function getDescriptionAttribute(): string { return app(TicketPresentationResolver::class)->description($this); } public function getEffectiveStartsAt(): ?CarbonInterface { return $this->resolvedValidity()->effectiveStartsAt(); } public function getEffectiveExpiresAt(): ?CarbonInterface { return $this->resolvedValidity()->effectiveExpiresAt(); } /** @return Collection */ public function resolvedValidityGroups(): Collection { return $this->resolvedValidity()->groups; } public function resolvedValidity(): ResolvedTicketValidity { return $this->resolvedValidity ??= app(TicketValidityResolver::class)->resolveTicket($this); } }