DocumentType::class, 'date' => 'date', 'due_date' => 'date', 'status' => DocumentStatus::class, 'subtotal' => MoneyCast::class, 'tax_total' => MoneyCast::class, 'discount_total' => MoneyCast::class, 'total' => MoneyCast::class, 'amount_paid' => MoneyCast::class, 'amount_due' => MoneyCast::class, ]; public function client(): BelongsTo { return $this->belongsTo(Client::class); } public function vendor(): BelongsTo { return $this->belongsTo(Vendor::class); } public function lineItems(): HasMany { return $this->hasMany(DocumentLineItem::class); } public function payments(): HasMany { return $this->hasMany(Payment::class); } public static function getNextDocumentNumber(DocumentType $documentType = DocumentType::Invoice): string { $company = auth()->user()->currentCompany; if (! $company) { throw new \RuntimeException('No current company is set for the user.'); } $defaultInvoiceSettings = $company->defaultInvoice; $numberPrefix = $defaultInvoiceSettings->number_prefix; $numberDigits = $defaultInvoiceSettings->number_digits; $latestDocument = static::query() ->whereNotNull('document_number') ->where('type', $documentType) ->latest('document_number') ->first(); $lastNumberNumericPart = $latestDocument ? (int) substr($latestDocument->document_number, strlen($numberPrefix)) : 0; $numberNext = $lastNumberNumericPart + 1; return $defaultInvoiceSettings->getNumberNext( padded: true, format: true, prefix: $numberPrefix, digits: $numberDigits, next: $numberNext ); } }