using Prefab.Catalog.Domain.Events; using Prefab.Domain.Common; namespace Prefab.Catalog.Domain.Entities; public enum AttributeDataType { Text = 1, Number = 3, Boolean = 4, Enum = 5 } public class AttributeDefinition : EntityWithAuditAndStatus { private AttributeDefinition() { } public string Name { get; private set; } = string.Empty; public AttributeDataType DataType { get; private set; } public string? Unit { get; private set; } public static AttributeDefinition Create(string name, AttributeDataType dataType, string? unit = null) { ArgumentException.ThrowIfNullOrWhiteSpace(name); var definition = new AttributeDefinition { Id = Guid.NewGuid(), Name = name.Trim(), DataType = dataType, Unit = string.IsNullOrWhiteSpace(unit) ? null : unit.Trim() }; definition.AddEvent(new AttributeDefinitionCreated(definition.Id, definition.Name, definition.DataType)); return definition; } } public class ProductAttributeValue : EntityWithAuditAndStatus { private ProductAttributeValue() { } public Guid ProductId { get; internal set; } public Product Product { get; internal set; } = null!; public Guid AttributeDefinitionId { get; internal set; } public AttributeDefinition AttributeDefinition { get; internal set; } = null!; public string? Value { get; internal set; } public decimal? NumericValue { get; internal set; } public string? UnitCode { get; internal set; } public string? EnumCode { get; internal set; } internal static ProductAttributeValue Create( Guid productId, Guid attributeDefinitionId, string? value, decimal? numericValue, string? unitCode, string? enumCode) { return new ProductAttributeValue { Id = Guid.NewGuid(), ProductId = productId, AttributeDefinitionId = attributeDefinitionId, Value = value, NumericValue = numericValue, UnitCode = unitCode, EnumCode = enumCode }; } }