using System; using InABox.Core; namespace Comal.Classes { public class StockHoldingSummaryGenerator : AutoEntitySummaryGenerator { public override void Configure() { GroupBy(x=>x.Location.ID, x=>x.Location.ID); GroupBy(x=>x.Product.ID, x=>x.Product.ID); GroupBy(x=>x.Style.ID, x=>x.Style.ID); GroupBy(x=>x.Job.ID, x=>x.Job.ID); GroupBy(x=>x.Dimensions.Unit.ID, x=>x.Dimensions.Unit.ID); GroupBy(x=>x.Dimensions.Length, x=>x.Dimensions.Length); GroupBy(x=>x.Dimensions.Width, x=>x.Dimensions.Width); GroupBy(x=>x.Dimensions.Height, x=>x.Dimensions.Height); GroupBy(x=>x.Dimensions.Weight, x=>x.Dimensions.Weight); GroupBy(x=>x.Dimensions.Quantity,x=>x.Dimensions.Quantity); GroupBy(x=>x.Dimensions.Value, x=>x.Dimensions.Value); GroupBy(x=>x.Dimensions.UnitSize, x=>x.Dimensions.UnitSize); Aggregate(x => x.Units, AutoEntitySummaryAggregate.Sum, new UnitsFormula()); Aggregate(x => x.Qty, AutoEntitySummaryAggregate.Sum, new QtyFormula()); Aggregate(x=>x.Weight, AutoEntitySummaryAggregate.Sum, new WeightFormula()); Aggregate(x=>x.Available, AutoEntitySummaryAggregate.Sum, new AvailableStockFomula()); Aggregate(x=>x.Allocated, AutoEntitySummaryAggregate.Sum, new AllocatedStockFomula()); Aggregate(x=>x.Value, AutoEntitySummaryAggregate.Sum, new TotalCostFomula()); Aggregate(x =>x.LastStockTake, AutoEntitySummaryAggregate.Maximum, new StockTakeFormula()); Having(new Filter(x => x.Units).IsGreaterThan(0.0001) .Or(x => x.Units).IsLessThan(-0.0001) .Or(x => x.Available).IsGreaterThan(0.0001) .Or(x => x.Available).IsLessThan(-0.0001) .Or(x => x.Allocated).IsGreaterThan(0.0001) .Or(x => x.Allocated).IsLessThan(-0.0001) ); } private class UnitsFormula : ComplexFormulaGenerator { public override IComplexFormulaNode GetFormula() => Formula( FormulaOperator.Subtract, Property(x => x.Received), Property(x => x.Issued) ); } private class QtyFormula : ComplexFormulaGenerator { public override IComplexFormulaNode GetFormula() => Formula( FormulaOperator.Multiply, Formula( FormulaOperator.Subtract, Property(x => x.Received), Property(x => x.Issued) ), Property(x=>x.Dimensions.Value) ); } private class WeightFormula : ComplexFormulaGenerator { public override IComplexFormulaNode GetFormula() => Formula( FormulaOperator.Multiply, Formula( FormulaOperator.Subtract, Property(x => x.Received), Property(x => x.Issued) ), Property(x=>x.Dimensions.Weight) ); } private class StockTakeFormula : ComplexFormulaGenerator { public override IComplexFormulaNode GetFormula() => If( Property(x=>x.Type), Condition.Equals, Constant(StockMovementType.StockTake) ).Then( Property(x=>x.Date) ).Else( Constant(DateTime.MinValue) ); } private class AvailableStockFomula : ComplexFormulaGenerator { public override IComplexFormulaNode GetFormula() => If( Property(x => x.JobRequisitionItem.ID), Condition.Equals, Constant(Guid.Empty) ).Then( Formula( FormulaOperator.Subtract, Property(x => x.Received), Property(x => x.Issued) ) ).Else( Constant(0.0) ); } private class AllocatedStockFomula : ComplexFormulaGenerator { public override IComplexFormulaNode GetFormula() => If( Property(x => x.JobRequisitionItem.ID), Condition.NotEqual, Constant(Guid.Empty) ).Then( Formula( FormulaOperator.Subtract, Property(x => x.Received), Property(x => x.Issued) ) ).Else( Constant(0.0) ); } private class TotalCostFomula : ComplexFormulaGenerator { public override IComplexFormulaNode GetFormula() => Formula(FormulaOperator.Multiply, Formula( FormulaOperator.Subtract, Property(x => x.Received), Property(x => x.Issued) ), Property(x => x.Cost) ); } } }