MoneyCast::class, 'status' => InvoiceStatus::class, 'invoice_date' => 'date', 'due_date' => 'date', 'sent_at' => 'date', ]; public function client(): BelongsTo { return $this->belongsTo(Client::class); } public function lines(): HasMany { return $this->hasMany(InvoiceLine::class); } public function formattedTotal(): string { return '$'.number_format($this->total, 2); } public function recalculateTotal(): void { $this->total = $this->lines()->sum('amount'); $this->saveQuietly(); } public function isLocked(): bool { return in_array($this->status, [InvoiceStatus::POSTED, InvoiceStatus::PAID, InvoiceStatus::VOID]); } }