using System; using System.Collections.Generic; using System.Linq.Expressions; using InABox.Core; using PRSClasses; namespace Comal.Classes { // public class StockHoldingUnitAggregate : CoreAggregate // { // public override Expression> Aggregate => x => x.Units; // // public override Dictionary>, Expression>> Links => // new Dictionary>, Expression>>() // { // { StockMovement => StockMovement.Product.ID, StockHolding => StockHolding.Product.ID }, // { StockMovement => StockMovement.Job.ID, StockHolding => StockHolding.Job.ID }, // { StockMovement => StockMovement.Location.ID, StockHolding => StockHolding.Location.ID }, // { StockMovement => StockMovement.Style.ID, StockHolding => StockHolding.Style.ID }, // { StockMovement => StockMovement.Dimensions.Unit.ID, StockHolding => StockHolding.Dimensions.Unit.ID }, // { StockMovement => StockMovement.Dimensions.Quantity, StockHolding => StockHolding.Dimensions.Quantity }, // { StockMovement => StockMovement.Dimensions.Length, StockHolding => StockHolding.Dimensions.Length }, // { StockMovement => StockMovement.Dimensions.Width, StockHolding => StockHolding.Dimensions.Width }, // { StockMovement => StockMovement.Dimensions.Height, StockHolding => StockHolding.Dimensions.Height }, // { StockMovement => StockMovement.Dimensions.Weight, StockHolding => StockHolding.Dimensions.Weight }, // }; // // public override AggregateCalculation Calculation => AggregateCalculation.Sum; // } // // public class StockHoldingValueAggregate : CoreAggregate // { // public override Expression> Aggregate => x => x.Value; // // public override Dictionary>, Expression>> Links => // new Dictionary>, Expression>>() // { // { StockMovement => StockMovement.Product.ID, StockHolding => StockHolding.Product.ID }, // { StockMovement => StockMovement.Job.ID, StockHolding => StockHolding.Job.ID }, // { StockMovement => StockMovement.Location.ID, StockHolding => StockHolding.Location.ID }, // { StockMovement => StockMovement.Style.ID, StockHolding => StockHolding.Style.ID }, // { StockMovement => StockMovement.Dimensions.Unit.ID, StockHolding => StockHolding.Dimensions.Unit.ID }, // { StockMovement => StockMovement.Dimensions.Quantity, StockHolding => StockHolding.Dimensions.Quantity }, // { StockMovement => StockMovement.Dimensions.Length, StockHolding => StockHolding.Dimensions.Length }, // { StockMovement => StockMovement.Dimensions.Width, StockHolding => StockHolding.Dimensions.Width }, // { StockMovement => StockMovement.Dimensions.Height, StockHolding => StockHolding.Dimensions.Height }, // { StockMovement => StockMovement.Dimensions.Weight, StockHolding => StockHolding.Dimensions.Weight }, // }; // // public override AggregateCalculation Calculation => AggregateCalculation.Sum; // } // // public class StockHoldingAverageValueFormula : IFormula // { // public Expression> Value => x => x.Value; // // public Expression>[] Modifiers => new Expression>[] { x => x.Units }; // // public FormulaOperator Operator => FormulaOperator.Divide; // // public FormulaType Type => FormulaType.Virtual; // } // // public class StockHoldingQuantityAggregate : CoreAggregate // { // public override Expression> Aggregate => x => x.Qty; // // public override Dictionary>, Expression>> Links => // new Dictionary>, Expression>>() // { // { StockMovement => StockMovement.Product.ID, StockHolding => StockHolding.Product.ID }, // { StockMovement => StockMovement.Job.ID, StockHolding => StockHolding.Job.ID }, // { StockMovement => StockMovement.Location.ID, StockHolding => StockHolding.Location.ID }, // { StockMovement => StockMovement.Style.ID, StockHolding => StockHolding.Style.ID }, // { StockMovement => StockMovement.Dimensions.Unit.ID, StockHolding => StockHolding.Dimensions.Unit.ID }, // { StockMovement => StockMovement.Dimensions.Quantity, StockHolding => StockHolding.Dimensions.Quantity }, // { StockMovement => StockMovement.Dimensions.Length, StockHolding => StockHolding.Dimensions.Length }, // { StockMovement => StockMovement.Dimensions.Width, StockHolding => StockHolding.Dimensions.Width }, // { StockMovement => StockMovement.Dimensions.Height, StockHolding => StockHolding.Dimensions.Height }, // { StockMovement => StockMovement.Dimensions.Weight, StockHolding => StockHolding.Dimensions.Weight }, // }; // // public override AggregateCalculation Calculation => AggregateCalculation.Sum; // } // public class StockHoldingAvailableAggregate : CoreAggregate // { // public override Expression> Aggregate => x => x.Units; // // public override Dictionary>, Expression>> Links => // new Dictionary>, Expression>>() // { // { StockMovement => StockMovement.Product.ID, StockHolding => StockHolding.Product.ID }, // { StockMovement => StockMovement.Job.ID, StockHolding => StockHolding.Job.ID }, // { StockMovement => StockMovement.Location.ID, StockHolding => StockHolding.Location.ID }, // { StockMovement => StockMovement.Style.ID, StockHolding => StockHolding.Style.ID }, // { StockMovement => StockMovement.Dimensions.Unit.ID, StockHolding => StockHolding.Dimensions.Unit.ID }, // { StockMovement => StockMovement.Dimensions.Quantity, StockHolding => StockHolding.Dimensions.Quantity }, // { StockMovement => StockMovement.Dimensions.Length, StockHolding => StockHolding.Dimensions.Length }, // { StockMovement => StockMovement.Dimensions.Width, StockHolding => StockHolding.Dimensions.Width }, // { StockMovement => StockMovement.Dimensions.Height, StockHolding => StockHolding.Dimensions.Height }, // { StockMovement => StockMovement.Dimensions.Weight, StockHolding => StockHolding.Dimensions.Weight }, // }; // // public override AggregateCalculation Calculation => AggregateCalculation.Sum; // // public override Filter? Filter => new Filter(x => x.JobRequisitionItem.ID).IsEqualTo(Guid.Empty); // } // public class StockHoldingWeightFormula : IFormula // { // public Expression> Value => x => x.Qty; // // public Expression>[] Modifiers => new Expression>[] { x => x.Dimensions.Weight }; // // public FormulaOperator Operator => FormulaOperator.Multiply; // // public FormulaType Type => FormulaType.Virtual; // } // // public class StockHoldingIsRemnantCondition : ICondition // { // public Expression> Left => x => x.Dimensions.Value; // // public Condition Condition => Condition.LessThan; // // public Expression> Right => x => x.Product.DefaultInstance.Dimensions.Value; // // public Expression> True => x => true; // // public Expression> False => x => null; // // public ConditionType Type => ConditionType.Virtual; // } // public class StockHoldingUnionGenerator : AutoEntityUnionGenerator // { // protected override void Configure() // { // AddTable(); // } // // public override bool Distinct => true; // // public override Column[] IDColumns => Columns; // // public static Column[] Columns => new Column[] // { // new Column(x => x.Job.ID), // new Column(x => x.Location.ID), // new Column(x => x.Product.ID), // new Column(x => x.Style.ID), // new Column(x => x.Dimensions.Unit.ID), // new Column(x => x.Dimensions.Quantity), // new Column(x => x.Dimensions.Length), // new Column(x => x.Dimensions.Width), // new Column(x => x.Dimensions.Height), // new Column(x => x.Dimensions.Weight), // }; // // public static Filter? GetFilter(IStockHolding holding) // { // var filter = new Filters(); // // foreach(var column in Columns) // { // filter.Add(new Filter(column.Cast()).IsEqualTo(CoreUtils.GetPropertyValue(holding, column.Property))); // } // // return filter.Combine(); // } // } // // [UserTracking(typeof(StockMovement))] // [AutoEntity(typeof(StockHoldingUnionGenerator))] // public class StockHoldingView : StockEntity, IRemotable, IPersistent, IOneToMany, IOneToMany, // IStockHolding, ILicense // { // // public override ProductLink Product { get; set; } // // public ProductStyleLink Style { get; set; } // // public StockLocationLink Location { get; set; } // // public JobLink Job { get; set; } // // [RequiredColumn] // [DimensionsEditor(typeof(StockDimensions), AllowEditingUnit = false)] // public override StockDimensions Dimensions { get; set; } // // [Condition(typeof(StockHoldingIsRemnantCondition))] // [NullEditor] // public bool IsRemnant { get; set; } // // [Aggregate(typeof(StockHoldingUnitAggregate))] // [DoubleEditor(Editable = Editable.Disabled, Summary = Summary.Sum)] // public double Units { get; set; } // // [Aggregate(typeof(StockHoldingQuantityAggregate))] // [DoubleEditor(Editable = Editable.Disabled, Summary = Summary.Sum)] // public double Qty { get; set; } // // [Formula(typeof(StockHoldingWeightFormula))] // [DoubleEditor(Editable = Editable.Disabled, Summary = Summary.Sum)] // public double Weight { get; set; } // // [Aggregate(typeof(StockHoldingValueAggregate))] // [DoubleEditor(Editable = Editable.Disabled, Summary = Summary.Sum)] // public double Value { get; set; } // // [Formula(typeof(StockHoldingAverageValueFormula))] // [DoubleEditor(Editable = Editable.Disabled)] // public double AverageValue { get; set; } // } // FV 6/2/24: This used to be a view (see above), but we were running into performance issues trying to // get aggregates fof stock locations (ie show me how many holdings in a given location was taking upwrds of // 20 seconds. Have moved update logic to StockHoldingStore / StockMovementStore so updates are a bit slower, // but reads are now much faster. [UserTracking(typeof(StockMovement))] public class StockHolding : StockEntity, IRemotable, IPersistent, IOneToMany, IOneToMany, IStockHolding, ILicense { [Editable(Editable.Disabled)] [EditorSequence(1)] public StockLocationLink Location { get; set; } [Editable(Editable.Disabled)] [EditorSequence(2)] public override ProductLink Product { get; set; } [DimensionsEditor(typeof(StockDimensions), AllowEditingUnit = false)] [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 Value { get; set; } [DoubleEditor(Editable = Editable.Disabled)] [EditorSequence(9)] public double AverageValue { get; set; } [DoubleEditor(Editable = Editable.Disabled, Summary = Summary.Sum)] [EditorSequence(10)] public double Available { get; set; } public static Column[] Columns => new Column[] { new Column(x => x.Job.ID), new Column(x => x.Location.ID), new Column(x => x.Product.ID), new Column(x => x.Style.ID), new Column(x => x.Dimensions.Unit.ID), new Column(x => x.Dimensions.Quantity), new Column(x => x.Dimensions.Length), new Column(x => x.Dimensions.Width), new Column(x => x.Dimensions.Height), new Column(x => x.Dimensions.Weight), }; public static Filter? GetFilter(IStockHolding holding) { var filter = new Filters(); foreach(var column in Columns) { filter.Add(new Filter(column.Cast()).IsEqualTo(CoreUtils.GetPropertyValue(holding, column.Property))); } return filter.Combine(); } } }