using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Runtime.CompilerServices; using InABox.Core; namespace Comal.Classes { public class StockSummaryBOMAggregate : CoreAggregate { public override Expression> Aggregate => x => x.Quantity; public override AggregateCalculation Calculation => AggregateCalculation.Sum; public override Dictionary>, Expression>> Links => new Dictionary>, Expression>>() { { JobBillOfMaterialsItem => JobBillOfMaterialsItem.Product.ID, StockSummary => StockSummary.Product.ID }, { JobBillOfMaterialsItem => JobBillOfMaterialsItem.Style.ID, StockSummary => StockSummary.Style.ID }, { JobBillOfMaterialsItem => JobBillOfMaterialsItem.Dimensions.UnitSize, StockSummary => StockSummary.Dimensions.UnitSize } }; public override Filter Filter => new Filter(x => x.BillOfMaterials.Approved).IsNotEqualTo(DateTime.MinValue); } public class StockSummaryTotalRequiredAggregate : CoreAggregate { public override Expression> Aggregate => x => x.Qty; public override AggregateCalculation Calculation => AggregateCalculation.Sum; public override Dictionary>, Expression>> Links => new Dictionary>, Expression>>() { { StockSummaryRequisitionItem => StockSummaryRequisitionItem.Product.ID, StockSummary => StockSummary.Product.ID }, { StockSummaryRequisitionItem => StockSummaryRequisitionItem.Style.ID, StockSummary => StockSummary.Style.ID }, { StockSummaryRequisitionItem => StockSummaryRequisitionItem.Dimensions.UnitSize, StockSummary => StockSummary.Dimensions.UnitSize } }; public override Filter Filter => new Filter(x => x.Requisition.Approved).IsNotEqualTo(DateTime.MinValue); } public class StockSummaryOrderAggregate : CoreAggregate { public override Expression> Aggregate => x => x.Qty; public override AggregateCalculation Calculation => AggregateCalculation.Sum; public override Dictionary>, Expression>> Links => new Dictionary>, Expression>>() { { PurchaseOrderItem => PurchaseOrderItem.Product.ID, StockSummary => StockSummary.Product.ID }, { PurchaseOrderItem => PurchaseOrderItem.Style.ID, StockSummary => StockSummary.Style.ID }, { PurchaseOrderItem => PurchaseOrderItem.Dimensions.UnitSize, StockSummary => StockSummary.Dimensions.UnitSize } }; public override Filter Filter => new Filter(x => x.ReceivedDate).IsEqualTo(DateTime.MinValue); } public class StockSummaryOrderValue : CoreAggregate { public override Expression> Aggregate => x => x.ExTax; public override AggregateCalculation Calculation => AggregateCalculation.Sum; public override Dictionary>, Expression>> Links => new Dictionary>, Expression>>() { { PurchaseOrderItem => PurchaseOrderItem.Product.ID, StockSummary => StockSummary.Product.ID }, { PurchaseOrderItem => PurchaseOrderItem.Style.ID, StockSummary => StockSummary.Style.ID }, { PurchaseOrderItem => PurchaseOrderItem.Dimensions.UnitSize, StockSummary => StockSummary.Dimensions.UnitSize } }; public override Filter Filter => new Filter(x => x.ReceivedDate).IsEqualTo(DateTime.MinValue); } public class StockSummaryReceivedAggregate : CoreAggregate { public override Expression> Aggregate => x => x.Received; public override Filter Filter => new Filter(x => x.IsTransfer).IsEqualTo(false); public override AggregateCalculation Calculation => AggregateCalculation.Sum; public override Dictionary>, Expression>> Links => new Dictionary>, Expression>>() { { StockMovement => StockMovement.Product.ID, StockSummary => StockSummary.Product.ID }, { StockMovement => StockMovement.Style.ID, StockSummary => StockSummary.Style.ID }, { StockMovement => StockMovement.Dimensions.UnitSize, StockSummary => StockSummary.Dimensions.UnitSize } }; } public class StockSummaryIssuedAggregate : CoreAggregate { public override Expression> Aggregate => x => x.Issued; public override Filter Filter => new Filter(x => x.IsTransfer).IsEqualTo(false); public override AggregateCalculation Calculation => AggregateCalculation.Sum; public override Dictionary>, Expression>> Links => new Dictionary>, Expression>>() { { StockMovement => StockMovement.Product.ID, StockSummary => StockSummary.Product.ID }, { StockMovement => StockMovement.Style.ID, StockSummary => StockSummary.Style.ID }, { StockMovement => StockMovement.Dimensions.UnitSize, StockSummary => StockSummary.Dimensions.UnitSize } }; } public class StockSummaryBalanceRequiredFormula : IFormula { public Expression> Value => x => x.TotalRequired; public Expression>[] Modifiers => new Expression>[] { x => x.Issued }; public FormulaOperator Operator => FormulaOperator.Subtract; public FormulaType Type => FormulaType.Virtual; } public class StockSummaryReservedStockAggregate : CoreAggregate { public override Expression> Aggregate => x => x.Units; public override AggregateCalculation Calculation => AggregateCalculation.Sum; public override Dictionary>, Expression>> Links => new Dictionary>, Expression>>() { { StockMovement => StockMovement.Product.ID, StockSummary => StockSummary.Product.ID }, { StockMovement => StockMovement.Style.ID, StockSummary => StockSummary.Style.ID }, { StockMovement => StockMovement.Dimensions.UnitSize, StockSummary => StockSummary.Dimensions.UnitSize } }; } public class StockSummaryFreeStockAggregate : CoreAggregate { public override Expression> Aggregate => x => x.Units; public override AggregateCalculation Calculation => AggregateCalculation.Sum; public override Filter Filter => new Filter(x => x.Job).NotLinkValid().Or(x=>x.Job.JobStatus.Active).IsEqualTo(false); public override Dictionary>, Expression>> Links => new Dictionary>, Expression>>() { { StockMovement => StockMovement.Product.ID, StockSummary => StockSummary.Product.ID }, //{ StockMovement => StockMovement.Style.ID, StockSummary => StockSummary.Style.ID }, //{ StockMovement => StockMovement.Dimensions.UnitSize, StockSummary => StockSummary.Dimensions.UnitSize } }; } public interface IStockSummary { ProductLink Product { get; set; } ProductStyleLink Style { get; set; } StockDimensions Dimensions { get; set; } } public class StockSummaryUnionGenerator : AutoEntityUnionGenerator { protected override void Configure() { AddTable(); AddTable(); AddTable(); AddTable(); } public override bool Distinct => true; public override Column[] IDColumns => new Column[] { 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) }; } [UserTracking(typeof(Product))] [AutoEntity(typeof(StockSummaryUnionGenerator))] public class StockSummary : StockEntity, IStockSummary, IRemotable, IPersistent, ILicense/* , IDimensioned */ { [EditorSequence(1)] public override ProductLink Product { get; set; } [EditorSequence(2)] public ProductStyleLink Style { get; set; } [NullEditor] [Obsolete("Replaced with Dimensions", true)] public double UnitSize { get; set; } [EditorSequence(3)] [RequiredColumn] [DimensionsEditor(typeof(StockDimensions), AllowEditingUnit = false)] public override StockDimensions Dimensions { get; set; } [EditorSequence(4)] [DoubleEditor] [Aggregate(typeof(StockSummaryBOMAggregate))] public double BillOfMaterials { get; set; } [EditorSequence(5)] [DoubleEditor] [Aggregate(typeof(StockSummaryTotalRequiredAggregate))] public double TotalRequired { get; set; } [EditorSequence(6)] [DoubleEditor] [Aggregate(typeof(StockSummaryOrderAggregate))] public double OnOrder { get; set; } [EditorSequence(7)] [DoubleEditor] [Aggregate(typeof(StockSummaryOrderValue))] public double OrderValue { get; set; } [EditorSequence(8)] [Aggregate(typeof(StockSummaryReceivedAggregate))] [DoubleEditor(Editable = Editable.Hidden)] public double Received { get; set; } [EditorSequence(9)] [Aggregate(typeof(StockSummaryIssuedAggregate))] [DoubleEditor(Editable = Editable.Hidden)] public double Issued { get; set; } [EditorSequence(10)] [DoubleEditor] [Formula(typeof(StockSummaryBalanceRequiredFormula))] public double BalanceRequired { get; set; } [EditorSequence(11)] [Aggregate(typeof(StockSummaryReservedStockAggregate))] [DoubleEditor(Editable = Editable.Hidden)] public double ReservedStock { get; set; } [EditorSequence(12)] [Aggregate(typeof(StockSummaryFreeStockAggregate))] [DoubleEditor(Editable = Editable.Hidden)] public double FreeStock { get; set; } protected override void Init() { base.Init(); Style = new ProductStyleLink(); } } }