|
@@ -63,112 +63,7 @@ namespace Comal.Classes
|
|
|
/// </summary>
|
|
|
Issued
|
|
|
}
|
|
|
- public class JobRequisitionItemTotalQtyFormula : IFormula<JobRequisitionItem, double>
|
|
|
- {
|
|
|
- public Expression<Func<JobRequisitionItem, double>> Value => x => x.Qty;
|
|
|
- public Expression<Func<JobRequisitionItem, double>>[] Modifiers => new Expression<Func<JobRequisitionItem, double>>[] { x => x.Dimensions.Value };
|
|
|
- public FormulaOperator Operator => FormulaOperator.Multiply;
|
|
|
- public FormulaType Type => FormulaType.Virtual;
|
|
|
- }
|
|
|
-
|
|
|
- public class JobRequisitionItemInStockAggregate : CoreAggregate<JobRequisitionItem, StockMovement, double>
|
|
|
- {
|
|
|
- public override Expression<Func<StockMovement, double>> Aggregate => x => x.Units;
|
|
|
-
|
|
|
- public override Dictionary<Expression<Func<StockMovement, object?>>, Expression<Func<JobRequisitionItem, object?>>> Links => new Dictionary<Expression<Func<StockMovement, object?>>, Expression<Func<JobRequisitionItem, object?>>>
|
|
|
- {
|
|
|
- { x => x.JobRequisitionItem.ID, x => x.ID }
|
|
|
- };
|
|
|
-
|
|
|
- public override AggregateCalculation Calculation => AggregateCalculation.Sum;
|
|
|
- }
|
|
|
- public class JobRequisitionItemOrdersAggregate : CoreAggregate<JobRequisitionItem, JobRequisitionItemPurchaseOrderItem, double>
|
|
|
- {
|
|
|
- public override Expression<Func<JobRequisitionItemPurchaseOrderItem, double>> Aggregate => x => x.PurchaseOrderItem.Qty;
|
|
|
-
|
|
|
- public override Dictionary<Expression<Func<JobRequisitionItemPurchaseOrderItem, object?>>, Expression<Func<JobRequisitionItem, object?>>> Links => new Dictionary<Expression<Func<JobRequisitionItemPurchaseOrderItem, object?>>, Expression<Func<JobRequisitionItem, object?>>>
|
|
|
- {
|
|
|
- { x => x.JobRequisitionItem.ID, x => x.ID },
|
|
|
- };
|
|
|
-
|
|
|
- public override AggregateCalculation Calculation => AggregateCalculation.Sum;
|
|
|
-
|
|
|
- public override Filter<JobRequisitionItemPurchaseOrderItem>? Filter =>
|
|
|
- new Filter<JobRequisitionItemPurchaseOrderItem>(x => x.PurchaseOrderItem.ReceivedDate).IsEqualTo(null);
|
|
|
- }
|
|
|
-
|
|
|
- public class JobRequisitionItemOnOrderAggregate : CoreAggregate<JobRequisitionItem, JobRequisitionItemPurchaseOrderItem, double>
|
|
|
- {
|
|
|
- public override Expression<Func<JobRequisitionItemPurchaseOrderItem, double>> Aggregate => x => x.PurchaseOrderItem.Qty;
|
|
|
-
|
|
|
- public override Dictionary<Expression<Func<JobRequisitionItemPurchaseOrderItem, object?>>, Expression<Func<JobRequisitionItem, object?>>> Links => new Dictionary<Expression<Func<JobRequisitionItemPurchaseOrderItem, object?>>, Expression<Func<JobRequisitionItem, object?>>>
|
|
|
- {
|
|
|
- { x => x.JobRequisitionItem.ID, x => x.ID },
|
|
|
- { x => x.PurchaseOrderItem.Product.ID, x => x.Product.ID },
|
|
|
- };
|
|
|
-
|
|
|
- public override AggregateCalculation Calculation => AggregateCalculation.Sum;
|
|
|
-
|
|
|
- public override Filter<JobRequisitionItemPurchaseOrderItem>? Filter =>
|
|
|
- new Filter<JobRequisitionItemPurchaseOrderItem>(x => x.PurchaseOrderItem.ReceivedDate).IsEqualTo(null);
|
|
|
- }
|
|
|
-
|
|
|
- public class JobRequisitionItemAllocatedAggregate : CoreAggregate<JobRequisitionItem, StockMovement, double>
|
|
|
- {
|
|
|
- public override Expression<Func<StockMovement, double>> Aggregate => x => x.Units;
|
|
|
-
|
|
|
- public override Dictionary<Expression<Func<StockMovement, object?>>, Expression<Func<JobRequisitionItem, object?>>> Links => new Dictionary<Expression<Func<StockMovement, object?>>, Expression<Func<JobRequisitionItem, object?>>>
|
|
|
- {
|
|
|
- { x => x.JobRequisitionItem.ID, x => x.ID },
|
|
|
- { x => x.Style.ID, x => x.Style.ID },
|
|
|
- };
|
|
|
-
|
|
|
- public override AggregateCalculation Calculation => AggregateCalculation.Sum;
|
|
|
- }
|
|
|
- public class JobRequisitionItemTreatmentOnOrderFormula : IFormula<JobRequisitionItem, double>
|
|
|
- {
|
|
|
- public Expression<Func<JobRequisitionItem, double>> Value => x => x.TotalOrders;
|
|
|
- public Expression<Func<JobRequisitionItem, double>>[] Modifiers => new Expression<Func<JobRequisitionItem, double>>[] { x => x.OnOrder };
|
|
|
- public FormulaOperator Operator => FormulaOperator.Subtract;
|
|
|
- public FormulaType Type => FormulaType.Virtual;
|
|
|
- }
|
|
|
- public class JobRequisitionItemTreatmentRequiredFormula : IFormula<JobRequisitionItem, double>
|
|
|
- {
|
|
|
- public Expression<Func<JobRequisitionItem, double>> Value => x => x.InStock;
|
|
|
- public Expression<Func<JobRequisitionItem, double>>[] Modifiers => new Expression<Func<JobRequisitionItem, double>>[] { x => x.Allocated };
|
|
|
- public FormulaOperator Operator => FormulaOperator.Subtract;
|
|
|
- public FormulaType Type => FormulaType.Virtual;
|
|
|
- }
|
|
|
-
|
|
|
- public class JobRequisitionItemPickRequestedAggregate : CoreAggregate<JobRequisitionItem, RequisitionItem, double>
|
|
|
- {
|
|
|
- public override Expression<Func<RequisitionItem, double>> Aggregate => x => x.Quantity;
|
|
|
-
|
|
|
- public override Dictionary<Expression<Func<RequisitionItem, object?>>, Expression<Func<JobRequisitionItem, object?>>> Links =>
|
|
|
- new Dictionary<Expression<Func<RequisitionItem, object?>>, Expression<Func<JobRequisitionItem, object?>>>
|
|
|
- {
|
|
|
- { x => x.SourceJRI.ID, x => x.ID },
|
|
|
- };
|
|
|
-
|
|
|
- public override Filter<RequisitionItem>? Filter => new Filter<RequisitionItem>(x => x.RequisitionLink.StockUpdated).IsEqualTo(DateTime.MinValue);
|
|
|
-
|
|
|
- public override AggregateCalculation Calculation => AggregateCalculation.Sum;
|
|
|
- }
|
|
|
-
|
|
|
- public class JobRequisitionItemIssuedAggregate : CoreAggregate<JobRequisitionItem, StockMovement, double>
|
|
|
- {
|
|
|
- public override Expression<Func<StockMovement, double>> Aggregate => x => x.Issued;
|
|
|
-
|
|
|
- public override Dictionary<Expression<Func<StockMovement, object?>>, Expression<Func<JobRequisitionItem, object?>>> Links => new Dictionary<Expression<Func<StockMovement, object?>>, Expression<Func<JobRequisitionItem, object?>>>
|
|
|
- {
|
|
|
- { x => x.JobRequisitionItem.ID, x => x.ID },
|
|
|
- { x => x.Style.ID, x => x.Style.ID },
|
|
|
- };
|
|
|
-
|
|
|
- public override Filter<StockMovement>? Filter => new Filter<StockMovement>(x => x.Type).IsEqualTo(StockMovementType.Issue);
|
|
|
|
|
|
- public override AggregateCalculation Calculation => AggregateCalculation.Sum;
|
|
|
- }
|
|
|
|
|
|
public interface IJobRequisitionItem : IEntity
|
|
|
{
|
|
@@ -211,8 +106,13 @@ namespace Comal.Classes
|
|
|
[RequiredColumn]
|
|
|
public double Qty { get; set; }
|
|
|
|
|
|
+ private class TotalQtyFormula : ComplexFormulaGenerator<JobRequisitionItem, double>
|
|
|
+ {
|
|
|
+ public override IComplexFormulaNode<JobRequisitionItem, double> GetFormula() =>
|
|
|
+ Formula(FormulaOperator.Multiply, Property(x => x.Qty), Property(x => x.Dimensions.Value));
|
|
|
+ }
|
|
|
[DoubleEditor(Editable = Editable.Hidden)]
|
|
|
- [Formula(typeof(JobRequisitionItemTotalQtyFormula))]
|
|
|
+ [ComplexFormula(typeof(TotalQtyFormula))]
|
|
|
public double TotalQty { get; set; }
|
|
|
|
|
|
[EditorSequence(5)]
|
|
@@ -229,51 +129,112 @@ namespace Comal.Classes
|
|
|
[EditorSequence(8)]
|
|
|
public SupplierLink Supplier { get; set; }
|
|
|
|
|
|
- [EnumLookupEditor(typeof(JobRequisitionItemStatus), Editable = Editable.Disabled)]
|
|
|
+ [NullEditor]
|
|
|
[EditorSequence(9)]
|
|
|
[LoggableProperty]
|
|
|
[RequiredColumn]
|
|
|
public JobRequisitionItemStatus Status { get; set; } = JobRequisitionItemStatus.NotChecked;
|
|
|
|
|
|
+ private class InStockFormula : ComplexFormulaGenerator<JobRequisitionItem, double>
|
|
|
+ {
|
|
|
+ public override IComplexFormulaNode<JobRequisitionItem, double> GetFormula() =>
|
|
|
+ Aggregate<StockMovement>(AggregateCalculation.Sum, x => x.Property(x => x.Units))
|
|
|
+ .WithLink(x => x.JobRequisitionItem.ID, x => x.ID);
|
|
|
+ }
|
|
|
+ [ComplexFormula(typeof(InStockFormula))]
|
|
|
+ [DoubleEditor(Editable = Editable.Disabled)]
|
|
|
+ [EditorSequence(10)]
|
|
|
/// <summary>
|
|
|
/// The amount of this requisition item that is currently in stock, which is an aggregate of the <see cref="StockMovement.Units"/> property.
|
|
|
/// </summary>
|
|
|
- [Aggregate(typeof(JobRequisitionItemInStockAggregate))]
|
|
|
- [DoubleEditor(Editable = Editable.Disabled)]
|
|
|
- [EditorSequence(10)]
|
|
|
public double InStock { get; set; }
|
|
|
|
|
|
- [Aggregate(typeof(JobRequisitionItemOrdersAggregate))]
|
|
|
+ private class TotalOrdersFormula : ComplexFormulaGenerator<JobRequisitionItem, double>
|
|
|
+ {
|
|
|
+ public override IComplexFormulaNode<JobRequisitionItem, double> GetFormula() =>
|
|
|
+ Aggregate<JobRequisitionItemPurchaseOrderItem>(
|
|
|
+ AggregateCalculation.Sum,
|
|
|
+ x => x.Property(x => x.PurchaseOrderItem.Qty),
|
|
|
+ new Filter<JobRequisitionItemPurchaseOrderItem>(x => x.PurchaseOrderItem.ReceivedDate).IsEqualTo(null))
|
|
|
+ .WithLink(x => x.JobRequisitionItem.ID, x => x.ID);
|
|
|
+ }
|
|
|
+ [ComplexFormula(typeof(TotalOrdersFormula))]
|
|
|
[DoubleEditor(Editable = Editable.Disabled, Visible = Visible.Optional)]
|
|
|
[EditorSequence(11)]
|
|
|
public double TotalOrders { get; set; }
|
|
|
|
|
|
- [Aggregate(typeof(JobRequisitionItemOnOrderAggregate))]
|
|
|
+ private class OnOrderFormula : ComplexFormulaGenerator<JobRequisitionItem, double>
|
|
|
+ {
|
|
|
+ public override IComplexFormulaNode<JobRequisitionItem, double> GetFormula() =>
|
|
|
+ Aggregate<JobRequisitionItemPurchaseOrderItem>(
|
|
|
+ AggregateCalculation.Sum,
|
|
|
+ x => x.Property(x => x.PurchaseOrderItem.Qty),
|
|
|
+ new Filter<JobRequisitionItemPurchaseOrderItem>(x => x.PurchaseOrderItem.ReceivedDate).IsEqualTo(null))
|
|
|
+ .WithLink(x => x.JobRequisitionItem.ID, x => x.ID)
|
|
|
+ .WithLink(x => x.PurchaseOrderItem.Product.ID, x => x.Product.ID);
|
|
|
+ }
|
|
|
+ [ComplexFormula(typeof(OnOrderFormula))]
|
|
|
[DoubleEditor(Editable = Editable.Disabled)]
|
|
|
[EditorSequence(12)]
|
|
|
public double OnOrder { get; set; }
|
|
|
|
|
|
- [Formula(typeof(JobRequisitionItemTreatmentRequiredFormula))]
|
|
|
+ private class TreatmentRequiredFormula : ComplexFormulaGenerator<JobRequisitionItem, double>
|
|
|
+ {
|
|
|
+ public override IComplexFormulaNode<JobRequisitionItem, double> GetFormula() =>
|
|
|
+ Formula(FormulaOperator.Subtract, Property(x => x.InStock), Property(x => x.Allocated));
|
|
|
+ }
|
|
|
+ [ComplexFormula(typeof(TreatmentRequiredFormula))]
|
|
|
[DoubleEditor(Editable = Editable.Disabled)]
|
|
|
[EditorSequence(13)]
|
|
|
public double TreatmentRequired { get; set; }
|
|
|
|
|
|
- [Formula(typeof(JobRequisitionItemTreatmentOnOrderFormula))]
|
|
|
+ private class TreatmentOnOrderFormula : ComplexFormulaGenerator<JobRequisitionItem, double>
|
|
|
+ {
|
|
|
+ public override IComplexFormulaNode<JobRequisitionItem, double> GetFormula() =>
|
|
|
+ Formula(FormulaOperator.Subtract, Property(x => x.TotalOrders), Property(x => x.OnOrder));
|
|
|
+ }
|
|
|
+ [ComplexFormula(typeof(TreatmentOnOrderFormula))]
|
|
|
[DoubleEditor(Editable = Editable.Disabled)]
|
|
|
[EditorSequence(14)]
|
|
|
public double TreatmentOnOrder { get; set; }
|
|
|
|
|
|
- [Aggregate(typeof(JobRequisitionItemAllocatedAggregate))]
|
|
|
+ private class AllocatedFormula : ComplexFormulaGenerator<JobRequisitionItem, double>
|
|
|
+ {
|
|
|
+ public override IComplexFormulaNode<JobRequisitionItem, double> GetFormula() =>
|
|
|
+ Aggregate<StockMovement>(
|
|
|
+ AggregateCalculation.Sum,
|
|
|
+ x => x.Property(x => x.Units))
|
|
|
+ .WithLink(x => x.JobRequisitionItem.ID, x => x.ID)
|
|
|
+ .WithLink(x => x.Style.ID, x => x.Style.ID);
|
|
|
+ }
|
|
|
+ [ComplexFormula(typeof(AllocatedFormula))]
|
|
|
[DoubleEditor(Editable = Editable.Disabled)]
|
|
|
[EditorSequence(15)]
|
|
|
public double Allocated { get; set; }
|
|
|
|
|
|
- [Aggregate(typeof(JobRequisitionItemPickRequestedAggregate))]
|
|
|
+ private class PickRequestedFormula : ComplexFormulaGenerator<JobRequisitionItem, double>
|
|
|
+ {
|
|
|
+ public override IComplexFormulaNode<JobRequisitionItem, double> GetFormula() =>
|
|
|
+ Aggregate<RequisitionItem>(AggregateCalculation.Sum, x => x.Property(x => x.Quantity), new Filter<RequisitionItem>(x => x.RequisitionLink.StockUpdated).IsEqualTo(DateTime.MinValue))
|
|
|
+ .WithLink(x => x.SourceJRI.ID, x => x.ID);
|
|
|
+ }
|
|
|
+ [ComplexFormula(typeof(PickRequestedFormula))]
|
|
|
[DoubleEditor(Editable = Editable.Disabled)]
|
|
|
[EditorSequence(16)]
|
|
|
public double PickRequested { get; set; }
|
|
|
|
|
|
- [Aggregate(typeof(JobRequisitionItemIssuedAggregate))]
|
|
|
+
|
|
|
+ private class IssuedFormula : ComplexFormulaGenerator<JobRequisitionItem, double>
|
|
|
+ {
|
|
|
+ public override IComplexFormulaNode<JobRequisitionItem, double> GetFormula() =>
|
|
|
+ Aggregate<StockMovement>(
|
|
|
+ AggregateCalculation.Sum,
|
|
|
+ x => x.Property(x => x.Issued),
|
|
|
+ new Filter<StockMovement>(x => x.Type).IsEqualTo(StockMovementType.Issue))
|
|
|
+ .WithLink(x => x.JobRequisitionItem.ID, x => x.ID)
|
|
|
+ .WithLink(x => x.Style.ID, x => x.Style.ID);
|
|
|
+ }
|
|
|
+ [ComplexFormula(typeof(IssuedFormula))]
|
|
|
[DoubleEditor(Editable = Editable.Disabled)]
|
|
|
[EditorSequence(17)]
|
|
|
public double Issued { get; set; }
|
|
@@ -284,7 +245,15 @@ namespace Comal.Classes
|
|
|
[NullEditor]
|
|
|
public PurchaseOrderItemLink PurchaseOrderItem { get; set; }
|
|
|
|
|
|
- [Aggregate(typeof(JobRequisitionItemPurchaseOrderNumberAggregate))]
|
|
|
+ private class PurchaseOrderNumbersFormula : ComplexFormulaGenerator<JobRequisitionItem, string>
|
|
|
+ {
|
|
|
+ public override IComplexFormulaNode<JobRequisitionItem, string> GetFormula() =>
|
|
|
+ Aggregate<JobRequisitionItemPurchaseOrderItem>(
|
|
|
+ AggregateCalculation.Concat,
|
|
|
+ x => x.Property(x => x.PurchaseOrderItem.PurchaseOrderLink.PONumber))
|
|
|
+ .WithLink(x => x.JobRequisitionItem.ID, x => x.ID);
|
|
|
+ }
|
|
|
+ [ComplexFormula(typeof(PurchaseOrderNumbersFormula))]
|
|
|
[TextBoxEditor(Editable = Editable.Hidden)]
|
|
|
public string PurchaseOrderNumbers { get; set; }
|
|
|
|
|
@@ -433,16 +402,4 @@ namespace Comal.Classes
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- public class JobRequisitionItemPurchaseOrderNumberAggregate : CoreAggregate<JobRequisitionItem, JobRequisitionItemPurchaseOrderItem, string>
|
|
|
- {
|
|
|
- public override Expression<Func<JobRequisitionItemPurchaseOrderItem, string>> Aggregate => x => x.PurchaseOrderItem.PurchaseOrderLink.PONumber;
|
|
|
-
|
|
|
- public override Dictionary<Expression<Func<JobRequisitionItemPurchaseOrderItem, object?>>, Expression<Func<JobRequisitionItem, object?>>> Links { get; } = new Dictionary<Expression<Func<JobRequisitionItemPurchaseOrderItem, object?>>, Expression<Func<JobRequisitionItem, object?>>>
|
|
|
- {
|
|
|
- { x => x.JobRequisitionItem.ID, x => x.ID }
|
|
|
- };
|
|
|
-
|
|
|
- public override AggregateCalculation Calculation => AggregateCalculation.Concat;
|
|
|
- }
|
|
|
}
|