You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

DocumentDTO.php 2.6KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. <?php
  2. namespace App\DTO;
  3. use App\Models\Accounting\Document;
  4. use App\Models\Setting\DocumentDefault;
  5. use App\Utilities\Currency\CurrencyAccessor;
  6. use App\Utilities\Currency\CurrencyConverter;
  7. readonly class DocumentDTO
  8. {
  9. /**
  10. * @param LineItemDTO[] $lineItems
  11. */
  12. public function __construct(
  13. public ?string $header,
  14. public ?string $footer,
  15. public ?string $terms,
  16. public ?string $logo,
  17. public string $number,
  18. public ?string $referenceNumber,
  19. public string $date,
  20. public string $dueDate,
  21. public string $currencyCode,
  22. public string $subtotal,
  23. public string $discount,
  24. public string $tax,
  25. public string $total,
  26. public string $amountDue,
  27. public CompanyDTO $company,
  28. public ClientDTO $client,
  29. public iterable $lineItems,
  30. public DocumentLabelDTO $label,
  31. public string $accentColor = '#000000',
  32. public bool $showLogo = true,
  33. ) {}
  34. public static function fromModel(Document $document): self
  35. {
  36. /** @var DocumentDefault $settings */
  37. $settings = $document->company->defaultInvoice;
  38. return new self(
  39. header: $document->header,
  40. footer: $document->footer,
  41. terms: $document->terms,
  42. logo: $document->logo,
  43. number: $document->documentNumber(),
  44. referenceNumber: $document->referenceNumber(),
  45. date: $document->documentDate(),
  46. dueDate: $document->dueDate(),
  47. currencyCode: $document->currency_code ?? CurrencyAccessor::getDefaultCurrency(),
  48. subtotal: self::formatToMoney($document->subtotal, $document->currency_code),
  49. discount: self::formatToMoney($document->discount_total, $document->currency_code),
  50. tax: self::formatToMoney($document->tax_total, $document->currency_code),
  51. total: self::formatToMoney($document->total, $document->currency_code),
  52. amountDue: self::formatToMoney($document->amountDue(), $document->currency_code),
  53. company: CompanyDTO::fromModel($document->company),
  54. client: ClientDTO::fromModel($document->client),
  55. lineItems: $document->lineItems->map(fn ($item) => LineItemDTO::fromModel($item)),
  56. label: $document->documentType()->getLabels(),
  57. accentColor: $settings->accent_color ?? '#000000',
  58. showLogo: $settings->show_logo ?? false,
  59. );
  60. }
  61. private static function formatToMoney(float | string $value, ?string $currencyCode): string
  62. {
  63. return CurrencyConverter::formatToMoney($value, $currencyCode);
  64. }
  65. }