*/ use HasFactory, SoftDeletes; protected $fillable = [ 'packaging_material_id', 'supplier_id', 'name', 'category', 'weight_grams', 'min_stock_alert', 'url', 'product_id', 'storage_room_id', 'storage_shelf_id', 'storage_slot_id', 'active', ]; /** * @return array */ protected function casts(): array { return [ 'active' => 'boolean', 'weight_grams' => 'decimal:2', ]; } /** * @return BelongsTo */ public function packagingMaterial(): BelongsTo { return $this->belongsTo(PackagingMaterial::class); } /** * @return BelongsTo */ public function supplier(): BelongsTo { return $this->belongsTo(Supplier::class); } /** * @return BelongsTo */ public function product(): BelongsTo { return $this->belongsTo(Product::class); } /** * Produkte, die diesen Verpackungsartikel in der Stückliste führen (BOM). * * @return BelongsToMany */ public function products(): BelongsToMany { return $this->belongsToMany(Product::class, 'product_packagings') ->withPivot('quantity', 'pos') ->withTimestamps(); } /** * AP-51: Lagerplatz (Raum/Regal/Fach) — gleiche Hierarchie wie beim Rohstoff. * * @return BelongsTo */ public function storageRoom(): BelongsTo { return $this->belongsTo(StorageRoom::class); } /** * @return BelongsTo */ public function storageShelf(): BelongsTo { return $this->belongsTo(StorageShelf::class); } /** * @return BelongsTo */ public function storageSlot(): BelongsTo { return $this->belongsTo(StorageSlot::class); } /** * Lagerplatz-Anzeige im Schema „Raum 1 | Regal 3 | A" (nur gepflegte Teile). */ public function storageLabel(): ?string { $parts = array_filter([ $this->storageRoom?->label, $this->storageShelf?->label, $this->storageSlot?->label, ]); return $parts === [] ? null : implode(' | ', $parts); } }