Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

DocumentDTO.php 3.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. <?php
  2. namespace App\DTO;
  3. use App\Enums\Accounting\DocumentType;
  4. use App\Enums\Setting\Font;
  5. use App\Models\Accounting\Document;
  6. use App\Models\Setting\DocumentDefault;
  7. use App\Utilities\Currency\CurrencyAccessor;
  8. use App\Utilities\Currency\CurrencyConverter;
  9. use Filament\FontProviders\BunnyFontProvider;
  10. use Illuminate\Contracts\Support\Htmlable;
  11. readonly class DocumentDTO
  12. {
  13. /**
  14. * @param LineItemDTO[] $lineItems
  15. */
  16. public function __construct(
  17. public string $header,
  18. public ?string $subheader,
  19. public ?string $footer,
  20. public ?string $terms,
  21. public ?string $logo,
  22. public string $number,
  23. public ?string $referenceNumber,
  24. public string $date,
  25. public string $dueDate,
  26. public string $currencyCode,
  27. public ?string $subtotal,
  28. public ?string $discount,
  29. public ?string $tax,
  30. public string $total,
  31. public ?string $amountDue,
  32. public CompanyDTO $company,
  33. public ?ClientDTO $client,
  34. public iterable $lineItems,
  35. public DocumentLabelDTO $label,
  36. public DocumentColumnLabelDTO $columnLabel,
  37. public string $accentColor = '#000000',
  38. public bool $showLogo = true,
  39. public Font $font = Font::Inter,
  40. ) {}
  41. public static function fromModel(Document $document): self
  42. {
  43. /** @var DocumentDefault $settings */
  44. $settings = $document->company->documentDefaults()
  45. ->type($document::documentType())
  46. ->first() ?? $document->company->defaultInvoice;
  47. $currencyCode = $document->currency_code ?? CurrencyAccessor::getDefaultCurrency();
  48. $discount = $document->discount_total > 0
  49. ? self::formatToMoney($document->discount_total, $currencyCode)
  50. : null;
  51. $tax = $document->tax_total > 0
  52. ? self::formatToMoney($document->tax_total, $currencyCode)
  53. : null;
  54. $subtotal = ($discount || $tax)
  55. ? self::formatToMoney($document->subtotal, $currencyCode)
  56. : null;
  57. $amountDue = $document::documentType() !== DocumentType::Estimate ?
  58. self::formatToMoney($document->amountDue(), $currencyCode) :
  59. null;
  60. return new self(
  61. header: $document->header,
  62. subheader: $document->subheader,
  63. footer: $document->footer,
  64. terms: $document->terms,
  65. logo: $document->logo_url ?? $settings->logo_url,
  66. number: $document->documentNumber(),
  67. referenceNumber: $document->referenceNumber(),
  68. date: $document->documentDate(),
  69. dueDate: $document->dueDate(),
  70. currencyCode: $currencyCode,
  71. subtotal: $subtotal,
  72. discount: $discount,
  73. tax: $tax,
  74. total: self::formatToMoney($document->total, $currencyCode),
  75. amountDue: $amountDue,
  76. company: CompanyDTO::fromModel($document->company),
  77. client: $document->client ? ClientDTO::fromModel($document->client) : null,
  78. lineItems: $document->lineItems->map(fn ($item) => LineItemDTO::fromModel($item)),
  79. label: $document::documentType()->getLabels(),
  80. columnLabel: DocumentColumnLabelDTO::fromModel($settings),
  81. accentColor: $settings->accent_color ?? '#000000',
  82. showLogo: $settings->show_logo ?? false,
  83. font: $settings->font ?? Font::Inter,
  84. );
  85. }
  86. protected static function formatToMoney(int $value, ?string $currencyCode): string
  87. {
  88. return CurrencyConverter::formatCentsToMoney($value, $currencyCode);
  89. }
  90. public function getFontHtml(): Htmlable
  91. {
  92. return app(BunnyFontProvider::class)->getHtml($this->font->getLabel());
  93. }
  94. }