Purchase Records Module

SupplierPurchaseRecord entity, purchase status lifecycle, document tracking fields, delivery tracking, metadata, and automatic CO₂ calculation.

Entity: SupplierPurchaseRecord

FieldTypeDB ColumnDescription
idLongidAuto-generated PK
companyIdLongcompany_idCompany making the purchase
supplierIdLongsupplier_idFK to Supplier (required)
supplierProductIdLongsupplier_product_idFK to SupplierProduct (optional)
userIdLonguser_idOperator who created the record
purchaseDateLocalDateTimepurchase_dateFull datetime of purchase
productDescriptionStringproduct_descriptionFree-text description
quantityKgDoublequantity_kgQuantity in kg
consumedKgDoubleconsumed_kgQuantity consumed
currentStockKgDoublecurrent_stock_kgCurrent stock
purchaseValueEurDoublepurchase_value_eurPurchase value in EUR
transportMethodStringtransport_methodROAD, SEA, AIR, RAIL
distanceKmDoubledistance_kmTransport distance in km
distanceSourceStringdistance_sourceHow distance was determined
transportEmissionsTco2Doubletransport_emissions_tco2Calculated from transport fields
emissionFactorUsedStringemission_factor_usedFactor used for calculation
purchaseOrderNumberStringpurchase_order_numberPO reference, max 100
invoiceNumberStringinvoice_numberInvoice reference, max 100
ddtNumberStringddt_numberDDT delivery note, max 100
transactionCertificateNumberStringtransaction_certificate_numberGOTS/GRS TC number, max 100
batchNumberStringbatch_numberBatch/lot ID — unique per supplier_id
deliveryDateLocalDateTimedelivery_dateActual delivery datetime
expectedDeliveryDateLocalDateTimeexpected_delivery_dateExpected delivery datetime
deliveryNotesStringdelivery_notesDelivery notes (max 2000)
purchaseStatusPurchaseStatuspurchase_statusStatus enum, default ORDERED
notesStringnotesGeneral notes
metadataMap<String, Object>metadataArbitrary JSON key-value pairs
createdAtLocalDateTimecreated_atAuto-set
updatedAtLocalDateTimeupdated_atAuto-set

Purchase Status Lifecycle

Shell
ORDERED → IN_TRANSIT → DELIVERED
↘ ↗
CANCELLED ←──
StatusMeaning
ORDEREDPurchase placed, awaiting shipment. Default.
IN_TRANSITGoods dispatched from supplier
DELIVEREDGoods received at destination
CANCELLEDOrder cancelled

Entity: PurchaseStatusChangeLog

Created automatically by the service whenever purchaseStatus changes. Accessible via GET /api/v1/purchases/{id}/status-changes.

FieldTypeDescription
purchaseIdLongFK to SupplierPurchaseRecord.id
fromStatusPurchaseStatusPrevious status (nullable for initial set)
toStatusPurchaseStatusNew status
changedByUserIdLongFrom userId query parameter
changedAtLocalDateTimeAuto-set via @CreationTimestamp

Business Validations

  • purchaseDate must be between 1900-01-01T00:00:00 and 2100-12-31T23:59:59
  • deliveryDate must not be before purchaseDate
  • Document reference fields (purchaseOrderNumber, etc.) must match ^[\p{L}\p{N}][\p{L}\p{N} ./_-]{0,99}$
  • batchNumber is unique per supplier_id (enforced at DB level)

Automatic CO₂ Calculation

When transport_method, distance_km, and related weight fields are provided, the service auto-calculates transport emissions:

Java
co2 = emissionFactor[transportMethod] × distanceKm × (weightKg / 1000.0)
ModeFactor (kg CO₂/tonne·km)
ROAD0.000096
SEA0.000011
AIR0.000602
RAIL0.000028

Entity Metadata

The metadata field allows custom attributes on purchase records:

JSON
{
"erp_po_id": "ERP-PO-12345",
"customs_declaration": "CD-2025-001",
"quality_grade": "A"
}