using foodmarket.Domain.Catalog; using foodmarket.Domain.Common; namespace foodmarket.Domain.Inventory; // Immutable, append-only journal of every stock change. // Stock table is a materialized aggregate over this journal. public class StockMovement : TenantEntity { public Guid ProductId { get; set; } public Product Product { get; set; } = null!; public Guid StoreId { get; set; } public Store Store { get; set; } = null!; /// Signed quantity: positive = receipt, negative = issue. public decimal Quantity { get; set; } /// Per-unit cost at the time of movement (optional). Used for cost rollup / P&L. public decimal? UnitCost { get; set; } public MovementType Type { get; set; } /// Source document discriminator, e.g. "supply", "retail-sale", "write-off", "enter", "transfer-out". public string DocumentType { get; set; } = ""; public Guid? DocumentId { get; set; } public string? DocumentNumber { get; set; } public DateTime OccurredAt { get; set; } = DateTime.UtcNow; public Guid? CreatedByUserId { get; set; } public string? Notes { get; set; } } public enum MovementType { Initial = 0, Supply = 1, // приёмка от поставщика RetailSale = 2, // розничная продажа WholesaleSale = 3, // оптовая отгрузка CustomerReturn = 4, // возврат покупателя SupplierReturn = 5, // возврат поставщику TransferOut = 6, // перемещение со склада TransferIn = 7, // перемещение на склад WriteOff = 8, // списание Enter = 9, // оприходование InventoryAdjustment = 10, // корректировка по результату инвентаризации }