using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Runtime.CompilerServices; using InABox.Core; using PRSClasses; namespace Comal.Classes { public class JobMaterialBOMAggregate : CoreAggregate { public override Expression> Aggregate => x => x.Quantity; public override AggregateCalculation Calculation => AggregateCalculation.Sum; public override Dictionary>, Expression>> Links => new Dictionary>, Expression>>() { { JobBillOfMaterialsItem => JobBillOfMaterialsItem.Job.ID, JobMaterial => JobMaterial.Job.ID }, { JobBillOfMaterialsItem => JobBillOfMaterialsItem.Product.ID, JobMaterial => JobMaterial.Product.ID }, { JobBillOfMaterialsItem => JobBillOfMaterialsItem.Style.ID, JobMaterial => JobMaterial.Style.ID }, { JobBillOfMaterialsItem => JobBillOfMaterialsItem.Dimensions.UnitSize, JobMaterial => JobMaterial.Dimensions.UnitSize } }; public override Filter Filter => new Filter(x => x.BillOfMaterials.Approved).IsNotEqualTo(DateTime.MinValue); } public class JobMaterialRequisitionsAggregate : CoreAggregate { public override Expression> Aggregate => x => x.Qty; public override AggregateCalculation Calculation => AggregateCalculation.Sum; public override Dictionary>, Expression>> Links => new Dictionary>, Expression>>() { { JobMaterialRequisitionItem => JobMaterialRequisitionItem.Requisition.Job.ID, JobMaterial => JobMaterial.Job.ID }, { JobMaterialRequisitionItem => JobMaterialRequisitionItem.Product.ID, JobMaterial => JobMaterial.Product.ID }, { JobMaterialRequisitionItem => JobMaterialRequisitionItem.Style.ID, JobMaterial => JobMaterial.Style.ID }, { JobMaterialRequisitionItem => JobMaterialRequisitionItem.Dimensions.UnitSize, JobMaterial => JobMaterial.Dimensions.UnitSize } }; public override Filter Filter => new Filter(x => x.Requisition.Approved).IsNotEqualTo(DateTime.MinValue) .And(x=>x.Status).IsNotEqualTo(JobRequisitionItemStatus.Cancelled); } public class JobMaterialPickingListsAggregate : CoreAggregate { public override Expression> Aggregate => x => x.Quantity; public override AggregateCalculation Calculation => AggregateCalculation.Sum; public override Dictionary>, Expression>> Links => new Dictionary>, Expression>>() { { RequisitionItem => RequisitionItem.RequisitionLink.JobLink.ID, JobMaterial => JobMaterial.Job.ID }, { RequisitionItem => RequisitionItem.Product.ID, JobMaterial => JobMaterial.Product.ID }, { RequisitionItem => RequisitionItem.Style.ID, JobMaterial => JobMaterial.Style.ID }, { RequisitionItem => RequisitionItem.Dimensions.UnitSize, JobMaterial => JobMaterial.Dimensions.UnitSize } }; public override Filter Filter => new Filter(x => x.RequisitionLink.Filled).IsEqualTo(DateTime.MinValue); } public class JobMaterialReservedStockAggregate : CoreAggregate { public override Expression> Aggregate => x => x.Units; public override AggregateCalculation Calculation => AggregateCalculation.Sum; public override Dictionary>, Expression>> Links => new Dictionary>, Expression>>() { { StockMovement => StockMovement.Job.ID, JobMaterial => JobMaterial.Job.ID }, { StockMovement => StockMovement.Product.ID, JobMaterial => JobMaterial.Product.ID }, { StockMovement => StockMovement.Style.ID, JobMaterial => JobMaterial.Style.ID }, { StockMovement => StockMovement.Dimensions.UnitSize, JobMaterial => JobMaterial.Dimensions.UnitSize } }; } public class JobMaterialOnOrderAggregate : CoreAggregate { public override Expression> Aggregate => x => x.Qty; public override AggregateCalculation Calculation => AggregateCalculation.Sum; public override Dictionary>, Expression>> Links => new Dictionary>, Expression>>() { { PurchaseOrderItem => PurchaseOrderItem.Job.ID, JobMaterial => JobMaterial.Job.ID }, { PurchaseOrderItem => PurchaseOrderItem.Product.ID, JobMaterial => JobMaterial.Product.ID }, { PurchaseOrderItem => PurchaseOrderItem.Style.ID, JobMaterial => JobMaterial.Style.ID }, { PurchaseOrderItem => PurchaseOrderItem.Dimensions.UnitSize, JobMaterial => JobMaterial.Dimensions.UnitSize } }; public override Filter Filter => new Filter(x => x.ReceivedDate).IsEqualTo(DateTime.MinValue); } public class JobMaterialIssuedAggregate : CoreAggregate { public override Expression> Aggregate => x => x.Issued; public override Filter Filter => new Filter(x => x.Type).IsEqualTo(StockMovementType.Issue); public override AggregateCalculation Calculation => AggregateCalculation.Sum; public override Dictionary>, Expression>> Links => new Dictionary>, Expression>>() { { StockMovement => StockMovement.Job.ID, JobMaterial => JobMaterial.Job.ID }, { StockMovement => StockMovement.Product.ID, JobMaterial => JobMaterial.Product.ID }, { StockMovement => StockMovement.Style.ID, JobMaterial => JobMaterial.Style.ID }, { StockMovement => StockMovement.Dimensions.UnitSize, JobMaterial => JobMaterial.Dimensions.UnitSize } }; } public class JobMaterialCalculatedField : IFormula { public Expression> Value => x => 0.0; public Expression>[] Modifiers => new Expression>[] { }; public FormulaOperator Operator => FormulaOperator.Constant; public FormulaType Type => FormulaType.Virtual; } public class JobMaterialUnionGenerator : AutoEntityUnionGenerator { protected override void Configure() { AddTable(); AddTable(); AddTable(); AddTable(); } public override bool Distinct => true; public override Column[] IDColumns => new Column[] { new Column(x => x.Job.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) }; } [UserTracking(typeof(Job))] [AutoEntity(typeof(JobMaterialUnionGenerator))] public class JobMaterial : StockEntity, IJobMaterial, IJobMaterialSummary, IRemotable, IPersistent, IManyToMany, ILicense /* , IDimensioned */ { [NullEditor] public JobLink Job { get; set; } [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(JobMaterialBOMAggregate))] public double BillOfMaterials { get; set; } [EditorSequence(5)] [DoubleEditor] [Aggregate(typeof(JobMaterialRequisitionsAggregate))] public double Requisitions { get; set; } [EditorSequence(6)] [DoubleEditor] [Aggregate(typeof(JobMaterialPickingListsAggregate))] public double PickingLists { get; set; } [EditorSequence(7)] [Aggregate(typeof(JobMaterialIssuedAggregate))] [DoubleEditor(Editable = Editable.Hidden)] public double Issued { get; set; } [EditorSequence(8)] [Aggregate(typeof(JobMaterialReservedStockAggregate))] [DoubleEditor(Editable = Editable.Hidden)] public double ReservedStock { get; set; } [EditorSequence(9)] [DoubleEditor] [Aggregate(typeof(JobMaterialOnOrderAggregate))] public double OnOrder { get; set; } [EditorSequence(10)] [DoubleEditor] [Formula(typeof(JobMaterialCalculatedField))] public double JobShortage { get; set; } [EditorSequence(11)] [DoubleEditor] [Formula(typeof(JobMaterialCalculatedField))] public double FreeOnHand { get; set; } [EditorSequence(12)] [DoubleEditor] [Formula(typeof(JobMaterialCalculatedField))] public double FreeOnOrder { get; set; } [EditorSequence(13)] [DoubleEditor] [Formula(typeof(JobMaterialCalculatedField))] public double FreeStockTotal { get; set; } [EditorSequence(14)] [DoubleEditor] [Formula(typeof(JobMaterialCalculatedField))] public double FreeStockShortage { get; set; } } }