InvoiceStatus::class, 'amount_cents' => 'integer', 'tax_cents' => 'integer', 'total_cents' => 'integer', 'is_netto' => 'boolean', 'invoice_date' => 'date', 'due_date' => 'date', 'paid_at' => 'datetime', 'sent_at' => 'datetime', 'reminded_at' => 'datetime', 'reminder_count' => 'integer', 'voided_at' => 'datetime', 'deleted_at' => 'datetime', ]; } /** * @return BelongsTo */ public function user(): BelongsTo { return $this->belongsTo(User::class); } /** * @return BelongsTo */ public function userPayment(): BelongsTo { return $this->belongsTo(UserPayment::class, 'user_payment_id'); } /** * Abgerechnete Zahlungsvereinbarung (MAN-Kreis). Für STR-Rechnungen NULL. * * @return BelongsTo */ public function userPaymentOption(): BelongsTo { return $this->belongsTo(UserPaymentOption::class); } /** * @return BelongsTo */ public function invoiceBillingAddress(): BelongsTo { return $this->belongsTo(InvoiceBillingAddress::class); } /** * MAN-Kreis: lokal ausgestellte Rechnung, per Überweisung zu zahlen. */ public function isManual(): bool { return $this->stripe_invoice_id === null; } public function isOverdue(): bool { return $this->status === InvoiceStatus::Open && $this->due_date !== null && $this->due_date->isBefore(today()); } /** * Rechnungen des manuellen Kreises (ohne Stripe-Beleg). */ public function scopeManual(Builder $query): Builder { return $query->whereNull('stripe_invoice_id'); } public function scopeOpen(Builder $query): Builder { return $query->where('status', InvoiceStatus::Open->value); } public function scopeOverdue(Builder $query): Builder { return $this->scopeOpen($query)->whereDate('due_date', '<', today()); } }