您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

DocumentPreviewDTO.php 2.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. <?php
  2. namespace App\DTO;
  3. use App\Enums\Accounting\DocumentType;
  4. use App\Enums\Setting\Font;
  5. use App\Enums\Setting\PaymentTerms;
  6. use App\Models\Setting\DocumentDefault;
  7. use App\Utilities\Currency\CurrencyAccessor;
  8. readonly class DocumentPreviewDTO extends DocumentDTO
  9. {
  10. public static function fromSettings(DocumentDefault $settings, ?array $data = null): self
  11. {
  12. $company = $settings->company;
  13. $paymentTerms = PaymentTerms::parse($data['payment_terms']) ?? $settings->payment_terms;
  14. $amountDue = $settings->type !== DocumentType::Estimate ?
  15. self::formatToMoney(95000, null) :
  16. null;
  17. return new self(
  18. header: $data['header'] ?? $settings->header ?? 'Invoice',
  19. subheader: $data['subheader'] ?? $settings->subheader,
  20. footer: $data['footer'] ?? $settings->footer,
  21. terms: $data['terms'] ?? $settings->terms,
  22. logo: $settings->logo_url,
  23. number: self::generatePreviewNumber($settings, $data),
  24. referenceNumber: $settings->getNumberNext('ORD-'),
  25. date: $company->locale->date_format->getLabel(),
  26. dueDate: $paymentTerms->getDueDate($company->locale->date_format->value),
  27. currencyCode: CurrencyAccessor::getDefaultCurrency(),
  28. subtotal: self::formatToMoney(100000, null), // $1000.00
  29. discount: self::formatToMoney(10000, null), // $100.00
  30. tax: self::formatToMoney(5000, null), // $50.00
  31. total: self::formatToMoney(95000, null), // $950.00
  32. amountDue: $amountDue, // $950.00 or null for estimates
  33. company: CompanyDTO::fromModel($company),
  34. client: ClientPreviewDTO::fake(),
  35. lineItems: LineItemPreviewDTO::fakeItems(),
  36. label: $settings->type->getLabels(),
  37. columnLabel: self::generateColumnLabels($settings, $data),
  38. accentColor: $data['accent_color'] ?? $settings->accent_color ?? '#000000',
  39. showLogo: $data['show_logo'] ?? $settings->show_logo ?? true,
  40. font: Font::tryFrom($data['font']) ?? $settings->font ?? Font::Inter,
  41. );
  42. }
  43. protected static function generatePreviewNumber(DocumentDefault $settings, ?array $data): string
  44. {
  45. $prefix = $data['number_prefix'] ?? $settings->number_prefix ?? 'INV-';
  46. return $settings->getNumberNext($prefix);
  47. }
  48. protected static function generateColumnLabels(DocumentDefault $settings, ?array $data): DocumentColumnLabelDTO
  49. {
  50. return new DocumentColumnLabelDTO(
  51. items: $settings->resolveColumnLabel('item_name', 'Items', $data),
  52. units: $settings->resolveColumnLabel('unit_name', 'Quantity', $data),
  53. price: $settings->resolveColumnLabel('price_name', 'Price', $data),
  54. amount: $settings->resolveColumnLabel('amount_name', 'Amount', $data),
  55. );
  56. }
  57. }