company->documentDefaults() ->type($document::documentType()) ->first() ?? $document->company->defaultInvoice; $currencyCode = $document->currency_code ?? CurrencyAccessor::getDefaultCurrency(); $discount = $document->discount_total > 0 ? self::formatToMoney($document->discount_total, $currencyCode) : null; $tax = $document->tax_total > 0 ? self::formatToMoney($document->tax_total, $currencyCode) : null; $subtotal = ($discount || $tax) ? self::formatToMoney($document->subtotal, $currencyCode) : null; $amountDue = $document::documentType() !== DocumentType::Estimate ? self::formatToMoney($document->amountDue(), $currencyCode) : null; return new self( header: $document->header, subheader: $document->subheader, footer: $document->footer, terms: $document->terms, logo: $document->logo_url ?? $settings->logo_url, number: $document->documentNumber(), referenceNumber: $document->referenceNumber(), date: $document->documentDate(), dueDate: $document->dueDate(), currencyCode: $currencyCode, subtotal: $subtotal, discount: $discount, tax: $tax, total: self::formatToMoney($document->total, $currencyCode), amountDue: $amountDue, company: CompanyDTO::fromModel($document->company), client: $document->client ? ClientDTO::fromModel($document->client) : null, lineItems: $document->lineItems->map(fn ($item) => LineItemDTO::fromModel($item)), label: $document::documentType()->getLabels(), columnLabel: DocumentColumnLabelDTO::fromModel($settings), accentColor: $settings->accent_color ?? '#000000', showLogo: $settings->show_logo ?? false, font: $settings->font ?? Font::Inter, ); } protected static function formatToMoney(float | string $value, ?string $currencyCode): string { return CurrencyConverter::formatToMoney($value, $currencyCode); } public function getFontHtml(): Htmlable { return app(BunnyFontProvider::class)->getHtml($this->font->getLabel()); } }