'integer', 'compra_id' => 'integer', 'producto_id' => 'integer', 'variante_id' => 'integer', 'bodega_id' => 'integer', 'cantidad'=> 'integer', 'precio_unitario' => 'decimal:2', 'subtotal' => 'decimal:2', ]; public function compra(): BelongsTo { return $this->belongsTo(Compra::class); } public function producto(): BelongsTo { return $this->belongsTo(Producto::class)->withDefault(); } public function variante():BelongsTo { return $this->belongsTo(ProductVariant::class)->withDefault(); } public function bodega(): BelongsTo { return $this->belongsTo(Bodega::class); } /** * Obtiene el nombre del producto, usando snapshot si el producto fue eliminado */ public function getProductoNombreAttribute(): string { if ($this->producto) { return $this->producto->nombre; } return $this->producto_nombre_snapshot ?? 'Producto eliminado'; } /** * Obtiene la información de la variante, usando snapshot si la variante fue eliminada */ public function getVarianteInfoAttribute(): ?string { if ($this->variante) { // Validación defensiva para evitar error "name" on null $colorName = $this->variante->color ? $this->variante->color->name : 'Sin color'; $sizeName = $this->variante->size ? $this->variante->size->name : 'Sin talla'; return $colorName . ' / ' . $sizeName; } return $this->variante_info_snapshot; } }