StockHolding.cs 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq.Expressions;
  4. using InABox.Core;
  5. using PRSClasses;
  6. namespace Comal.Classes
  7. {
  8. public class StockHoldingUnitAggregate : CoreAggregate<StockHolding, StockMovement, double>
  9. {
  10. public override Expression<Func<StockMovement, double>> Aggregate => x => x.Units;
  11. public override Dictionary<Expression<Func<StockMovement, object>>, Expression<Func<StockHolding, object>>> Links =>
  12. new Dictionary<Expression<Func<StockMovement, object>>, Expression<Func<StockHolding, object>>>()
  13. {
  14. { StockMovement => StockMovement.Product.ID, StockHolding => StockHolding.Product.ID },
  15. { StockMovement => StockMovement.Job.ID, StockHolding => StockHolding.Job.ID },
  16. { StockMovement => StockMovement.Location.ID, StockHolding => StockHolding.Location.ID },
  17. { StockMovement => StockMovement.Style.ID, StockHolding => StockHolding.Style.ID },
  18. { StockMovement => StockMovement.Dimensions.UnitSize, StockHolding => StockHolding.Dimensions.UnitSize }
  19. };
  20. public override AggregateCalculation Calculation => AggregateCalculation.Sum;
  21. }
  22. public class StockHoldingValueAggregate : CoreAggregate<StockHolding, StockMovement, double>
  23. {
  24. public override Expression<Func<StockMovement, double>> Aggregate => x => x.Value;
  25. public override Dictionary<Expression<Func<StockMovement, object>>, Expression<Func<StockHolding, object>>> Links =>
  26. new Dictionary<Expression<Func<StockMovement, object>>, Expression<Func<StockHolding, object>>>()
  27. {
  28. { StockMovement => StockMovement.Product.ID, StockHolding => StockHolding.Product.ID },
  29. { StockMovement => StockMovement.Job.ID, StockHolding => StockHolding.Job.ID },
  30. { StockMovement => StockMovement.Location.ID, StockHolding => StockHolding.Location.ID },
  31. { StockMovement => StockMovement.Style.ID, StockHolding => StockHolding.Style.ID },
  32. { StockMovement => StockMovement.Dimensions.UnitSize, StockHolding => StockHolding.Dimensions.UnitSize }
  33. };
  34. public override AggregateCalculation Calculation => AggregateCalculation.Sum;
  35. }
  36. public class StockHoldingAverageValueFormula : IFormula<StockHolding, double>
  37. {
  38. public Expression<Func<StockHolding, double>> Value => x => x.Value;
  39. public Expression<Func<StockHolding, double>>[] Modifiers => new Expression<Func<StockHolding, double>>[] { x => x.Units };
  40. public FormulaOperator Operator => FormulaOperator.Divide;
  41. public FormulaType Type => FormulaType.Virtual;
  42. }
  43. public class StockHoldingQuantityAggregate : CoreAggregate<StockHolding, StockMovement, double>
  44. {
  45. public override Expression<Func<StockMovement, double>> Aggregate => x => x.Qty;
  46. public override Dictionary<Expression<Func<StockMovement, object>>, Expression<Func<StockHolding, object>>> Links =>
  47. new Dictionary<Expression<Func<StockMovement, object>>, Expression<Func<StockHolding, object>>>()
  48. {
  49. { StockMovement => StockMovement.Product.ID, StockHolding => StockHolding.Product.ID },
  50. { StockMovement => StockMovement.Job.ID, StockHolding => StockHolding.Job.ID },
  51. { StockMovement => StockMovement.Location.ID, StockHolding => StockHolding.Location.ID },
  52. { StockMovement => StockMovement.Style.ID, StockHolding => StockHolding.Style.ID },
  53. { StockMovement => StockMovement.Dimensions.UnitSize, StockHolding => StockHolding.Dimensions.UnitSize }
  54. };
  55. public override AggregateCalculation Calculation => AggregateCalculation.Sum;
  56. }
  57. public class StockHoldingWeightFormula : IFormula<StockHolding, double>
  58. {
  59. public Expression<Func<StockHolding, double>> Value => x => x.Qty;
  60. public Expression<Func<StockHolding, double>>[] Modifiers => new Expression<Func<StockHolding, double>>[] { x => x.Dimensions.Weight };
  61. public FormulaOperator Operator => FormulaOperator.Multiply;
  62. public FormulaType Type => FormulaType.Virtual;
  63. }
  64. public class StockHoldingIsRemnantCondition : ICondition<StockHolding, double, object>
  65. {
  66. public Expression<Func<StockHolding, double>> Left => x => x.Dimensions.Value;
  67. public Condition Condition => Condition.LessThan;
  68. public Expression<Func<StockHolding, double>> Right => x => x.Product.DefaultInstance.Dimensions.Value;
  69. public Expression<Func<StockHolding, object>> True => x => true;
  70. public Expression<Func<StockHolding, object>> False => x => null;
  71. public ConditionType Type => ConditionType.Virtual;
  72. }
  73. public class StockHoldingUnionGenerator : AutoEntityUnionGenerator<IStockHolding>
  74. {
  75. protected override void Configure()
  76. {
  77. AddTable<StockMovement>();
  78. }
  79. public override bool Distinct => true;
  80. public override Column<IStockHolding>[] IDColumns => Columns;
  81. public static Column<IStockHolding>[] Columns => new Column<IStockHolding>[]
  82. {
  83. new Column<IStockHolding>(x => x.Job.ID),
  84. new Column<IStockHolding>(x => x.Location.ID),
  85. new Column<IStockHolding>(x => x.Product.ID),
  86. new Column<IStockHolding>(x => x.Style.ID),
  87. new Column<IStockHolding>(x => x.Dimensions.Unit.ID),
  88. new Column<IStockHolding>(x => x.Dimensions.Quantity),
  89. new Column<IStockHolding>(x => x.Dimensions.Length),
  90. new Column<IStockHolding>(x => x.Dimensions.Width),
  91. new Column<IStockHolding>(x => x.Dimensions.Height),
  92. new Column<IStockHolding>(x => x.Dimensions.Weight),
  93. };
  94. public static Filter<StockMovement>? GetFilter(IStockHolding holding)
  95. {
  96. var filter = new Filters<StockMovement>();
  97. foreach(var column in Columns)
  98. {
  99. filter.Add(new Filter<StockMovement>(column.Cast<StockMovement>()).IsEqualTo(CoreUtils.GetPropertyValue(holding, column.Property)));
  100. }
  101. return filter.Combine();
  102. }
  103. }
  104. [UserTracking(typeof(StockMovement))]
  105. [AutoEntity(typeof(StockHoldingUnionGenerator))]
  106. public class StockHolding : StockEntity, IRemotable, IPersistent, IOneToMany<StockLocation>, IOneToMany<Product>,
  107. IStockHolding, ILicense<WarehouseLicense>
  108. {
  109. public override ProductLink Product { get; set; }
  110. public ProductStyleLink Style { get; set; }
  111. public StockLocationLink Location { get; set; }
  112. public JobLink Job { get; set; }
  113. [RequiredColumn]
  114. [DimensionsEditor(typeof(StockDimensions), AllowEditingUnit = false)]
  115. public override StockDimensions Dimensions { get; set; }
  116. [Condition(typeof(StockHoldingIsRemnantCondition))]
  117. [NullEditor]
  118. public bool IsRemnant { get; set; }
  119. [Aggregate(typeof(StockHoldingUnitAggregate))]
  120. [DoubleEditor(Editable = Editable.Disabled, Summary = Summary.Sum)]
  121. public double Units { get; set; }
  122. [Aggregate(typeof(StockHoldingQuantityAggregate))]
  123. [DoubleEditor(Editable = Editable.Disabled, Summary = Summary.Sum)]
  124. public double Qty { get; set; }
  125. [Formula(typeof(StockHoldingWeightFormula))]
  126. [DoubleEditor(Editable = Editable.Disabled, Summary = Summary.Sum)]
  127. public double Weight { get; set; }
  128. [Aggregate(typeof(StockHoldingValueAggregate))]
  129. [DoubleEditor(Editable = Editable.Disabled, Summary = Summary.Sum)]
  130. public double Value { get; set; }
  131. [Formula(typeof(StockHoldingAverageValueFormula))]
  132. [DoubleEditor(Editable = Editable.Disabled)]
  133. public double AverageValue { get; set; }
  134. }
  135. }