TechnicalDescriptionService.php 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Services;
  4. use App\Models\CommonCatalogItem;
  5. use App\Models\Setting;
  6. class TechnicalDescriptionService
  7. {
  8. public const MODE_CHARACTERISTICS_SHORT = 'characteristics_short';
  9. public const MODE_CHARACTERISTICS_FULL = 'characteristics_full';
  10. public const MODE_SHORT = 'short';
  11. public const MODE_FULL = 'full';
  12. public const MODE_CHARACTERISTICS = 'characteristics';
  13. public const DESCRIPTION_MODES = [
  14. self::MODE_CHARACTERISTICS_SHORT => 'Характеристики + краткое описание',
  15. self::MODE_CHARACTERISTICS_FULL => 'Характеристики + полное описание',
  16. self::MODE_SHORT => 'Только краткое описание',
  17. self::MODE_FULL => 'Только полное описание',
  18. self::MODE_CHARACTERISTICS => 'Только характеристики',
  19. ];
  20. public function priceField(): string
  21. {
  22. return Setting::technicalDescriptionPriceField();
  23. }
  24. public function priceLabel(): string
  25. {
  26. return CommonCatalogItem::PRICE_FIELDS[$this->priceField()];
  27. }
  28. public function price(CommonCatalogItem $item): ?float
  29. {
  30. $value = $item->{$this->priceField()};
  31. return $value === null ? null : (float) $value;
  32. }
  33. public function formattedPrice(CommonCatalogItem $item): string
  34. {
  35. $price = $this->price($item);
  36. return $price === null ? '' : number_format($price, 2, '.', ' ');
  37. }
  38. public function description(CommonCatalogItem $item, string $mode): string
  39. {
  40. $parts = match ($mode) {
  41. self::MODE_CHARACTERISTICS_SHORT => [$item->characteristics, $item->technical_description_short],
  42. self::MODE_CHARACTERISTICS_FULL => [$item->characteristics, $item->technical_description],
  43. self::MODE_SHORT => [$item->technical_description_short],
  44. self::MODE_FULL => [$item->technical_description],
  45. default => [$item->characteristics],
  46. };
  47. return collect($parts)
  48. ->map(fn (mixed $value): string => trim((string) $value))
  49. ->filter()
  50. ->implode("\n");
  51. }
  52. }