'datetime', 'emailed_at' => 'datetime', 'downloaded_at' => 'datetime', 'download_count' => 'integer', ]; } protected static function boot(): void { parent::boot(); static::creating(function ($model) { $model->uuid ??= (string) Str::uuid(); $model->token ??= Str::random(48); }); } public function program() { return $this->belongsTo(Program::class); } public function participant() { return $this->belongsTo(Participant::class); } public function template() { return $this->belongsTo(CertificateTemplate::class, 'certificate_template_id'); } public function emailLogs() { return $this->hasMany(EmailLog::class); } public function isGenerated(): bool { return $this->status === 'generated' || $this->status === 'emailed' || $this->status === 'downloaded'; } public function recordDownload(): void { $this->increment('download_count'); if (! $this->downloaded_at) { $this->update(['downloaded_at' => now(), 'status' => 'downloaded']); } } }