'integer', 'quote_version_id' => 'integer', 'expires_at' => 'datetime', 'source_pdf_generated_at' => 'datetime', 'sent_at' => 'datetime', 'completed_at' => 'datetime', 'archived_at' => 'datetime', 'last_synced_at' => 'datetime', ]; public function version(): BelongsTo { return $this->belongsTo(CourierQuoteVersion::class, 'quote_version_id'); } public function statusLabel(): string { return match ($this->status) { self::STATUS_PREPARED => '待推送', self::STATUS_SENDING => '推送中', self::STATUS_SIGNING => '待签署', self::STATUS_COMPLETED => '签署完成,待归档', self::STATUS_ARCHIVED => '已签署并归档', self::STATUS_REVOKED => '已撤销', self::STATUS_EXPIRED => '已过期', self::STATUS_REJECTED => '已拒签', self::STATUS_FAILED => '处理失败', default => $this->status, }; } public function canSend(): bool { return in_array($this->status, [self::STATUS_PREPARED, self::STATUS_FAILED], true) && blank($this->esign_sign_flow_id); } public function lastErrorSummary(): ?string { return EsignErrorMessage::sanitize($this->last_error); } }