| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 | using System;using InABox.Core;namespace Comal.Classes{    [AutoEntity(typeof(StockHoldingSummaryGenerator))]    [UserTracking(typeof(StockMovement))]    public class StockHolding : StockEntity, IRemotable, IPersistent, IOneToMany<StockLocation>, IOneToMany<Product>,         IStockHolding, ILicense<WarehouseLicense>    {        [Editable(Editable.Disabled)]        [EditorSequence(1)]        public StockLocationLink Location { get; set; }                private class ProductLookupGenerator : LookupDefinitionGenerator<Product, StockHolding>        {            public override Filter<Product>? DefineFilter(StockHolding[] items)                => LookupFactory.DefineFilter<Product>().And(x => x.NonStock).IsEqualTo(false);        }        [Editable(Editable.Disabled)]        [EditorSequence(2)]        [LookupDefinition(typeof(ProductLookupGenerator))]        public override ProductLink Product { get; set; }                [DimensionsEditor(typeof(StockDimensions))]        [Editable(Editable.Disabled)]        [EditorSequence(3)]        public override StockDimensions Dimensions { get; set; }        [Editable(Editable.Disabled)]        [EditorSequence(4)]        public ProductStyleLink Style { get; set; }                [Editable(Editable.Disabled)]        [EditorSequence(4)]        public JobLink Job { get; set; }                [DoubleEditor(Editable = Editable.Disabled, Summary = Summary.Sum)]        [EditorSequence(5)]        public double Units { get; set; }                [DoubleEditor(Editable = Editable.Disabled, Summary = Summary.Sum)]        [EditorSequence(6)]        public double Qty { get; set; }                [DoubleEditor(Editable = Editable.Disabled, Summary = Summary.Sum)]        [EditorSequence(7)]        public double Weight { get; set; }                [DoubleEditor(Editable = Editable.Disabled, Summary = Summary.Sum)]        [EditorSequence(8)]        public double Available { get; set; }                [DoubleEditor(Editable = Editable.Disabled, Summary = Summary.Sum)]        [EditorSequence(9)]        public double Allocated { get; set; }                [DoubleEditor(Editable = Editable.Disabled, Summary = Summary.Sum)]        [EditorSequence(10)]        public double Value { get; set; }                private class AverageValueFormula : ComplexFormulaGenerator<StockHolding, double>        {            public override IComplexFormulaNode<StockHolding, double> GetFormula() =>                Formula(                    FormulaOperator.Divide,                    Property(x => x.Value),                    Property(x => x.Units)                );        }                [ComplexFormula(typeof(AverageValueFormula))]        [DoubleEditor(Editable = Editable.Disabled)]        [EditorSequence(11)]        public double AverageValue { get; set; }                [DateEditor(Editable = Editable.Disabled)]        [EditorSequence(11)]        public DateTime LastStockTake { get; set; }                public static Column<IStockHolding>[] Columns => new Column<IStockHolding>[]        {            new Column<IStockHolding>(x => x.Job.ID),            new Column<IStockHolding>(x => x.Location.ID),            new Column<IStockHolding>(x => x.Product.ID),            new Column<IStockHolding>(x => x.Style.ID),            new Column<IStockHolding>(x => x.Dimensions.Unit.ID),            new Column<IStockHolding>(x => x.Dimensions.Quantity),            new Column<IStockHolding>(x => x.Dimensions.Length),            new Column<IStockHolding>(x => x.Dimensions.Width),            new Column<IStockHolding>(x => x.Dimensions.Height),            new Column<IStockHolding>(x => x.Dimensions.Weight),        };                public static Filter<StockMovement>? GetFilter(IStockHolding holding)        {            var filter = new Filters<StockMovement>();                    foreach(var column in Columns)            {                filter.Add(new Filter<StockMovement>(column.Cast<StockMovement>()).IsEqualTo(CoreUtils.GetPropertyValue(holding, column.Property)));            }                    return filter.Combine();        }            }}
 |