'Entwurf', self::STATUS_GENERATED => 'Generiert', self::STATUS_DOWNLOADED => 'Heruntergeladen', self::STATUS_LOCKED => 'Gesperrt', ]; const STATUS_BADGES = [ self::STATUS_DRAFT => 'secondary', self::STATUS_GENERATED => 'info', self::STATUS_DOWNLOADED => 'success', self::STATUS_LOCKED => 'dark', ]; protected $fillable = [ 'period_from', 'period_to', 'month', 'year', 'status', 'berater_nr', 'mandant_nr', 'invoice_count', 'credit_count', 'cancellation_count', 'total_revenue', 'total_commissions', 'filename', 'file_path', 'file_hash', 'created_by', 'warning_count', 'error_count', 'validation_summary', ]; protected $casts = [ 'period_from' => 'date', 'period_to' => 'date', 'total_revenue' => 'decimal:2', 'total_commissions' => 'decimal:2', 'validation_summary' => 'array', ]; /* |-------------------------------------------------------------------------- | Relationships |-------------------------------------------------------------------------- */ public function lines() { return $this->hasMany(DatevExportLine::class, 'datev_export_id'); } public function creator() { return $this->belongsTo(User::class, 'created_by'); } /* |-------------------------------------------------------------------------- | Scopes |-------------------------------------------------------------------------- */ public function scopeForPeriod($query, int $month, int $year) { return $query->where('month', $month)->where('year', $year); } public function scopeGenerated($query) { return $query->where('status', '>=', self::STATUS_GENERATED); } public function scopeLocked($query) { return $query->where('status', self::STATUS_LOCKED); } /* |-------------------------------------------------------------------------- | Accessors |-------------------------------------------------------------------------- */ public function getStatusLabelAttribute(): string { return self::STATUS_LABELS[$this->status] ?? '-'; } public function getStatusBadgeAttribute(): string { $badge = self::STATUS_BADGES[$this->status] ?? 'secondary'; return ''.$this->status_label.''; } public function getPeriodLabelAttribute(): string { return str_pad($this->month, 2, '0', STR_PAD_LEFT).'/'.$this->year; } public function getTotalLinesAttribute(): int { return $this->invoice_count + $this->credit_count + $this->cancellation_count; } /* |-------------------------------------------------------------------------- | Methods |-------------------------------------------------------------------------- */ public function isLocked(): bool { return $this->status === self::STATUS_LOCKED; } public function isGenerated(): bool { return $this->status >= self::STATUS_GENERATED; } public function markAsDownloaded(): void { if ($this->status === self::STATUS_GENERATED) { $this->update(['status' => self::STATUS_DOWNLOADED]); } } public function lock(): void { $this->update(['status' => self::STATUS_LOCKED]); } public function getStoragePath(): string { return config('datev.storage_path').'/'.$this->year.'/'.str_pad($this->month, 2, '0', STR_PAD_LEFT); } public function getFullFilePath(): string { return $this->getStoragePath().'/'.$this->filename; } }