Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

DocumentPreviewDTO.php 2.9KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  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. return new self(
  15. header: $data['header'] ?? $settings->header ?? 'Invoice',
  16. subheader: $data['subheader'] ?? $settings->subheader,
  17. footer: $data['footer'] ?? $settings->footer,
  18. terms: $data['terms'] ?? $settings->terms,
  19. logo: $settings->logo_url,
  20. number: self::generatePreviewNumber($settings, $data),
  21. referenceNumber: 'ORD-00001',
  22. date: $company->locale->date_format->getLabel(),
  23. dueDate: $paymentTerms->getDueDate($company->locale->date_format->value),
  24. currencyCode: CurrencyAccessor::getDefaultCurrency(),
  25. subtotal: self::formatToMoney('1000', null),
  26. discount: self::formatToMoney('100', null),
  27. tax: self::formatToMoney('50', null),
  28. total: self::formatToMoney('950', null),
  29. amountDue: self::formatToMoney('950', null),
  30. company: CompanyDTO::fromModel($company),
  31. client: ClientPreviewDTO::fake(),
  32. lineItems: LineItemPreviewDTO::fakeItems(),
  33. label: DocumentType::Invoice->getLabels(),
  34. columnLabel: self::generateColumnLabels($settings, $data),
  35. accentColor: $data['accent_color'] ?? $settings->accent_color ?? '#000000',
  36. showLogo: $data['show_logo'] ?? $settings->show_logo ?? true,
  37. font: Font::tryFrom($data['font']) ?? $settings->font ?? Font::Inter,
  38. );
  39. }
  40. protected static function generatePreviewNumber(DocumentDefault $settings, ?array $data): string
  41. {
  42. $prefix = $data['number_prefix'] ?? $settings->number_prefix ?? 'INV-';
  43. $digits = $data['number_digits'] ?? $settings->number_digits ?? 5;
  44. $next = $data['number_next'] ?? $settings->number_next;
  45. return $settings->getNumberNext(padded: true, format: true, prefix: $prefix, digits: $digits, next: $next);
  46. }
  47. protected static function generateColumnLabels(DocumentDefault $settings, ?array $data): DocumentColumnLabelDTO
  48. {
  49. return new DocumentColumnLabelDTO(
  50. items: $settings->resolveColumnLabel('item_name', 'Items', $data),
  51. units: $settings->resolveColumnLabel('unit_name', 'Quantity', $data),
  52. price: $settings->resolveColumnLabel('price_name', 'Price', $data),
  53. amount: $settings->resolveColumnLabel('amount_name', 'Amount', $data),
  54. );
  55. }
  56. }