CommonCatalogItem.php 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Models;
  4. use Database\Factories\CommonCatalogItemFactory;
  5. use Illuminate\Database\Eloquent\Casts\Attribute;
  6. use Illuminate\Database\Eloquent\Factories\HasFactory;
  7. use Illuminate\Database\Eloquent\Model;
  8. use Illuminate\Database\Eloquent\Relations\BelongsTo;
  9. use Illuminate\Database\Eloquent\Relations\BelongsToMany;
  10. use Illuminate\Database\Eloquent\Relations\HasMany;
  11. use Illuminate\Database\Eloquent\Relations\HasOne;
  12. use Illuminate\Database\Eloquent\SoftDeletes;
  13. class CommonCatalogItem extends Model
  14. {
  15. /** @use HasFactory<CommonCatalogItemFactory> */
  16. use HasFactory;
  17. use SoftDeletes;
  18. public const DEFAULT_SORT_BY = 'article';
  19. protected $fillable = [
  20. 'image_file_id',
  21. 'article',
  22. 'calculator_name',
  23. 'kind',
  24. 'dimensions',
  25. 'fall_height',
  26. 'additional_info',
  27. 'dimension_unit',
  28. 'weight',
  29. 'volume',
  30. 'places',
  31. 'composition',
  32. 'age_group',
  33. 'max_users',
  34. 'unit',
  35. 'series',
  36. 'trademark',
  37. 'note',
  38. ];
  39. protected $appends = ['image'];
  40. protected function casts(): array
  41. {
  42. return [
  43. 'fall_height' => 'decimal:3',
  44. 'weight' => 'decimal:3',
  45. 'volume' => 'decimal:3',
  46. 'places' => 'integer',
  47. 'max_users' => 'integer',
  48. ];
  49. }
  50. public function imageFile(): BelongsTo
  51. {
  52. return $this->belongsTo(File::class, 'image_file_id');
  53. }
  54. public function documents(): BelongsToMany
  55. {
  56. return $this->belongsToMany(
  57. File::class,
  58. 'common_catalog_item_documents',
  59. )->withTimestamps();
  60. }
  61. public function stockOrders(): HasMany
  62. {
  63. return $this->hasMany(StockOrder::class);
  64. }
  65. public function latestStockOrder(): HasOne
  66. {
  67. return $this->hasOne(StockOrder::class)->latestOfMany();
  68. }
  69. public function stockReservations(): HasMany
  70. {
  71. return $this->hasMany(StockReservation::class);
  72. }
  73. public function stockMovements(): HasMany
  74. {
  75. return $this->hasMany(StockMovement::class);
  76. }
  77. protected function image(): Attribute
  78. {
  79. return Attribute::make(
  80. get: fn (): string => (string) ($this->imageFile?->thumbnail_link ?? ''),
  81. );
  82. }
  83. }