Product Module

BaseProduct inheritance model, new origin/logistics fields, and the UnitOfMeasure enum.

Entity Hierarchy

Shell
BaseProduct (abstract, @MappedSuperclass)
├── SupplierProduct (@Entity, table: supplier_product)
└── CompanyProduct (@Entity, table: company_product)

BaseProduct Fields

FieldTypeDescription
idLongAuto-generated PK
nameStringProduct name (required)
skuStringStock-keeping unit
descriptionStringOptional description
compositionStringMaterial composition
productOriginCountryStringISO alpha-2 where product is manufactured **
rawMaterialOriginCountryStringISO alpha-2 where raw material originates **
unitOfMeasureUnitOfMeasureMETERS, KG, PIECES, ROLLS. Default: KG **
quantityAvailableDoubleCurrent stock (≥ 0) **
leadTimeDaysIntegerProcurement lead time in days (≥ 0) **
productWeightKgDoubleProduct weight in kg
gotsCertifiedBooleanGOTS certification
availableBooleanAvailability flag (default: true)
createdAtLocalDateTimeAuto-set on persist

UnitOfMeasure Enum

New in v1.1.0

Java
@Schema(enumeration = {"METERS", "KG", "PIECES", "ROLLS"})
public enum UnitOfMeasure {
METERS, KG, PIECES, ROLLS
}

Default value: KG (set in @PrePersist).

Country Code Validation

productOriginCountry and rawMaterialOriginCountry are annotated with @ISO3166CountryCode, a custom Jakarta Validation constraint that checks the value against the full ISO 3166-1 alpha-2 list. Invalid codes return 400 Bad Request.

Java
@ISO3166CountryCode
@Column(name = "product_origin_country", length = 2)
public String productOriginCountry;

SupplierProduct Extra Fields

FieldTypeDescription
supplierIdLongFK to Supplier.id (required)
unitCostBigDecimalPurchase price per unit
currencyStringISO 4217
reachCompliantbooleanREACH compliance
certificationsList<String>Product-level certifications

CompanyProduct Extra Fields

FieldTypeDescription
barcodeStringEAN/GTIN barcode
unitSalePriceBigDecimalSelling price per unit
sustainabilityScoreIntegerESG score 0–100
recycledContentPercentDouble% recycled content