Product Module

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

Entity Hierarchy

Shell
BaseProduct (abstract, @MappedSuperclass)
├── SupplierProduct (@Entity, table: supplier_product)
├── CompanyProduct (@Entity, table: company_product)
└── BaseTextileProduct (abstract, @MappedSuperclass)
├── YarnProduct (@Entity, table: yarn_product)
├── FiberProduct (@Entity, table: fiber_product)
└── FabricProduct (@Entity, table: fabric_product)
Note

Textile products extend BaseTextileProduct which adds supplierId, companyId, userId, and textileCategory. See Textile Products Module → for details.

BaseProduct Fields

FieldTypeDescription
idLongAuto-generated PK
nameStringProduct name (required)
codeStringProduct code
categoryStringProduct category
subcategoryStringProduct subcategory
descriptionStringOptional description
technicalSpecsStringTechnical specifications
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)
pricePerUnitBigDecimalPrice per unit
currencyStringISO 4217 currency code
minimumOrderDoubleMinimum order quantity
productWeightKgDoubleProduct weight in kg
gotsCertifiedBooleanGOTS certification
grsCertifiedBooleanGRS certification
oekoTexCertifiedBooleanOEKO-TEX certification
cradleToCradleCertifiedBooleanCradle to Cradle certification
betterCottonCertifiedBooleanBetter Cotton certification
otherCertificationsStringOther certification details
recycledContentPercentDoublePercentage of recycled content
organicContentPercentDoublePercentage of organic content
sustainabilityNotesStringSustainability notes
availableBooleanAvailability flag (default: true)
metadataMap<String, Object>Arbitrary JSON key-value pairs
createdAtLocalDateTimeAuto-set on persist
updatedAtLocalDateTimeAuto-set on update

UnitOfMeasure Enum

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)
userIdLongCreator user ID

CompanyProduct Extra Fields

FieldTypeDescription
companyIdLongCompany ID
userIdLongCreator user ID

Entity Metadata

The metadata field allows attaching arbitrary JSON attributes to products without schema changes:

JSON
{
"erp_sku": "ERP-FAB-001",
"season": "SS2026",
"moq_unit": "METERS"
}