'date', 'day_quota' => 'integer', 'booked_count' => 'integer', 'carry_in' => 'integer', ]; public function ticketGrabEvent(): BelongsTo { return $this->belongsTo(TicketGrabEvent::class, 'ticket_grab_event_id'); } public function venue(): BelongsTo { return $this->belongsTo(Venue::class); } public function availableRemaining(): int { return max(0, (int) $this->carry_in + (int) $this->day_quota - (int) $this->booked_count); } /** 昨日及以前未约完的票会滚入次日,在后台展示时「过去放票日」余量为 0。 */ public function remainingForDisplay(): int { $tz = (string) config('app.timezone'); $today = Carbon::now($tz)->toDateString(); $rd = $this->release_date instanceof Carbon ? $this->release_date->format('Y-m-d') : Carbon::parse($this->release_date)->format('Y-m-d'); if ($rd < $today) { return 0; } return $this->availableRemaining(); } public function totalDayPool(): int { return (int) $this->carry_in + (int) $this->day_quota; } }