'decimal:2', 'sales_start' => 'datetime', 'sales_end' => 'datetime', 'is_refundable' => 'boolean', ]; } // ── Relationships ──────────────────────────────────── public function event() { return $this->belongsTo(Event::class); } public function orderItems() { return $this->hasMany(OrderItem::class); } // ── Helpers ────────────────────────────────────────── public function availableStock(): int { return max(0, $this->quota - $this->sold_count); } public function isOnSale(): bool { $now = now(); if ($this->sales_start && $now->lt($this->sales_start)) return false; if ($this->sales_end && $now->gt($this->sales_end)) return false; if ($this->availableStock() <= 0) return false; return true; } }