StockHolding.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  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.Unit.ID, StockHolding => StockHolding.Dimensions.Unit.ID },
  19. { StockMovement => StockMovement.Dimensions.Quantity, StockHolding => StockHolding.Dimensions.Quantity },
  20. { StockMovement => StockMovement.Dimensions.Length, StockHolding => StockHolding.Dimensions.Length },
  21. { StockMovement => StockMovement.Dimensions.Width, StockHolding => StockHolding.Dimensions.Width },
  22. { StockMovement => StockMovement.Dimensions.Height, StockHolding => StockHolding.Dimensions.Height },
  23. { StockMovement => StockMovement.Dimensions.Weight, StockHolding => StockHolding.Dimensions.Weight },
  24. };
  25. public override AggregateCalculation Calculation => AggregateCalculation.Sum;
  26. }
  27. public class StockHoldingValueAggregate : CoreAggregate<StockHolding, StockMovement, double>
  28. {
  29. public override Expression<Func<StockMovement, double>> Aggregate => x => x.Value;
  30. public override Dictionary<Expression<Func<StockMovement, object>>, Expression<Func<StockHolding, object>>> Links =>
  31. new Dictionary<Expression<Func<StockMovement, object>>, Expression<Func<StockHolding, object>>>()
  32. {
  33. { StockMovement => StockMovement.Product.ID, StockHolding => StockHolding.Product.ID },
  34. { StockMovement => StockMovement.Job.ID, StockHolding => StockHolding.Job.ID },
  35. { StockMovement => StockMovement.Location.ID, StockHolding => StockHolding.Location.ID },
  36. { StockMovement => StockMovement.Style.ID, StockHolding => StockHolding.Style.ID },
  37. { StockMovement => StockMovement.Dimensions.Unit.ID, StockHolding => StockHolding.Dimensions.Unit.ID },
  38. { StockMovement => StockMovement.Dimensions.Quantity, StockHolding => StockHolding.Dimensions.Quantity },
  39. { StockMovement => StockMovement.Dimensions.Length, StockHolding => StockHolding.Dimensions.Length },
  40. { StockMovement => StockMovement.Dimensions.Width, StockHolding => StockHolding.Dimensions.Width },
  41. { StockMovement => StockMovement.Dimensions.Height, StockHolding => StockHolding.Dimensions.Height },
  42. { StockMovement => StockMovement.Dimensions.Weight, StockHolding => StockHolding.Dimensions.Weight },
  43. };
  44. public override AggregateCalculation Calculation => AggregateCalculation.Sum;
  45. }
  46. public class StockHoldingAverageValueFormula : IFormula<StockHolding, double>
  47. {
  48. public Expression<Func<StockHolding, double>> Value => x => x.Value;
  49. public Expression<Func<StockHolding, double>>[] Modifiers => new Expression<Func<StockHolding, double>>[] { x => x.Units };
  50. public FormulaOperator Operator => FormulaOperator.Divide;
  51. public FormulaType Type => FormulaType.Virtual;
  52. }
  53. public class StockHoldingQuantityAggregate : CoreAggregate<StockHolding, StockMovement, double>
  54. {
  55. public override Expression<Func<StockMovement, double>> Aggregate => x => x.Qty;
  56. public override Dictionary<Expression<Func<StockMovement, object>>, Expression<Func<StockHolding, object>>> Links =>
  57. new Dictionary<Expression<Func<StockMovement, object>>, Expression<Func<StockHolding, object>>>()
  58. {
  59. { StockMovement => StockMovement.Product.ID, StockHolding => StockHolding.Product.ID },
  60. { StockMovement => StockMovement.Job.ID, StockHolding => StockHolding.Job.ID },
  61. { StockMovement => StockMovement.Location.ID, StockHolding => StockHolding.Location.ID },
  62. { StockMovement => StockMovement.Style.ID, StockHolding => StockHolding.Style.ID },
  63. { StockMovement => StockMovement.Dimensions.Unit.ID, StockHolding => StockHolding.Dimensions.Unit.ID },
  64. { StockMovement => StockMovement.Dimensions.Quantity, StockHolding => StockHolding.Dimensions.Quantity },
  65. { StockMovement => StockMovement.Dimensions.Length, StockHolding => StockHolding.Dimensions.Length },
  66. { StockMovement => StockMovement.Dimensions.Width, StockHolding => StockHolding.Dimensions.Width },
  67. { StockMovement => StockMovement.Dimensions.Height, StockHolding => StockHolding.Dimensions.Height },
  68. { StockMovement => StockMovement.Dimensions.Weight, StockHolding => StockHolding.Dimensions.Weight },
  69. };
  70. public override AggregateCalculation Calculation => AggregateCalculation.Sum;
  71. }
  72. public class StockHoldingAvailableAggregate : CoreAggregate<StockHolding, StockMovement, double>
  73. {
  74. public override Expression<Func<StockMovement, double>> Aggregate => x => x.Units;
  75. public override Dictionary<Expression<Func<StockMovement, object>>, Expression<Func<StockHolding, object>>> Links =>
  76. new Dictionary<Expression<Func<StockMovement, object>>, Expression<Func<StockHolding, object>>>()
  77. {
  78. { StockMovement => StockMovement.Product.ID, StockHolding => StockHolding.Product.ID },
  79. { StockMovement => StockMovement.Job.ID, StockHolding => StockHolding.Job.ID },
  80. { StockMovement => StockMovement.Location.ID, StockHolding => StockHolding.Location.ID },
  81. { StockMovement => StockMovement.Style.ID, StockHolding => StockHolding.Style.ID },
  82. { StockMovement => StockMovement.Dimensions.Unit.ID, StockHolding => StockHolding.Dimensions.Unit.ID },
  83. { StockMovement => StockMovement.Dimensions.Quantity, StockHolding => StockHolding.Dimensions.Quantity },
  84. { StockMovement => StockMovement.Dimensions.Length, StockHolding => StockHolding.Dimensions.Length },
  85. { StockMovement => StockMovement.Dimensions.Width, StockHolding => StockHolding.Dimensions.Width },
  86. { StockMovement => StockMovement.Dimensions.Height, StockHolding => StockHolding.Dimensions.Height },
  87. { StockMovement => StockMovement.Dimensions.Weight, StockHolding => StockHolding.Dimensions.Weight },
  88. };
  89. public override AggregateCalculation Calculation => AggregateCalculation.Sum;
  90. public override Filter<StockMovement>? Filter => new Filter<StockMovement>(x => x.JobRequisitionItem.ID).IsEqualTo(Guid.Empty);
  91. }
  92. public class StockHoldingWeightFormula : IFormula<StockHolding, double>
  93. {
  94. public Expression<Func<StockHolding, double>> Value => x => x.Qty;
  95. public Expression<Func<StockHolding, double>>[] Modifiers => new Expression<Func<StockHolding, double>>[] { x => x.Dimensions.Weight };
  96. public FormulaOperator Operator => FormulaOperator.Multiply;
  97. public FormulaType Type => FormulaType.Virtual;
  98. }
  99. public class StockHoldingIsRemnantCondition : ICondition<StockHolding, double, object>
  100. {
  101. public Expression<Func<StockHolding, double>> Left => x => x.Dimensions.Value;
  102. public Condition Condition => Condition.LessThan;
  103. public Expression<Func<StockHolding, double>> Right => x => x.Product.DefaultInstance.Dimensions.Value;
  104. public Expression<Func<StockHolding, object>> True => x => true;
  105. public Expression<Func<StockHolding, object>> False => x => null;
  106. public ConditionType Type => ConditionType.Virtual;
  107. }
  108. public class StockHoldingUnionGenerator : AutoEntityUnionGenerator<IStockHolding>
  109. {
  110. protected override void Configure()
  111. {
  112. AddTable<StockMovement>();
  113. }
  114. public override bool Distinct => true;
  115. public override Column<IStockHolding>[] IDColumns => Columns;
  116. public static Column<IStockHolding>[] Columns => new Column<IStockHolding>[]
  117. {
  118. new Column<IStockHolding>(x => x.Job.ID),
  119. new Column<IStockHolding>(x => x.Location.ID),
  120. new Column<IStockHolding>(x => x.Product.ID),
  121. new Column<IStockHolding>(x => x.Style.ID),
  122. new Column<IStockHolding>(x => x.Dimensions.Unit.ID),
  123. new Column<IStockHolding>(x => x.Dimensions.Quantity),
  124. new Column<IStockHolding>(x => x.Dimensions.Length),
  125. new Column<IStockHolding>(x => x.Dimensions.Width),
  126. new Column<IStockHolding>(x => x.Dimensions.Height),
  127. new Column<IStockHolding>(x => x.Dimensions.Weight),
  128. };
  129. public static Filter<StockMovement>? GetFilter(IStockHolding holding)
  130. {
  131. var filter = new Filters<StockMovement>();
  132. foreach(var column in Columns)
  133. {
  134. filter.Add(new Filter<StockMovement>(column.Cast<StockMovement>()).IsEqualTo(CoreUtils.GetPropertyValue(holding, column.Property)));
  135. }
  136. return filter.Combine();
  137. }
  138. }
  139. [UserTracking(typeof(StockMovement))]
  140. [AutoEntity(typeof(StockHoldingUnionGenerator))]
  141. public class StockHolding : StockEntity, IRemotable, IPersistent, IOneToMany<StockLocation>, IOneToMany<Product>,
  142. IStockHolding, ILicense<WarehouseLicense>
  143. {
  144. public override ProductLink Product { get; set; }
  145. public ProductStyleLink Style { get; set; }
  146. public StockLocationLink Location { get; set; }
  147. public JobLink Job { get; set; }
  148. [RequiredColumn]
  149. [DimensionsEditor(typeof(StockDimensions), AllowEditingUnit = false)]
  150. public override StockDimensions Dimensions { get; set; }
  151. [Condition(typeof(StockHoldingIsRemnantCondition))]
  152. [NullEditor]
  153. public bool IsRemnant { get; set; }
  154. [Aggregate(typeof(StockHoldingUnitAggregate))]
  155. [DoubleEditor(Editable = Editable.Disabled, Summary = Summary.Sum)]
  156. public double Units { get; set; }
  157. [Aggregate(typeof(StockHoldingAvailableAggregate))]
  158. [DoubleEditor(Editable = Editable.Disabled, Summary = Summary.Sum)]
  159. public double Available { get; set; }
  160. [Aggregate(typeof(StockHoldingQuantityAggregate))]
  161. [DoubleEditor(Editable = Editable.Disabled, Summary = Summary.Sum)]
  162. public double Qty { get; set; }
  163. [Formula(typeof(StockHoldingWeightFormula))]
  164. [DoubleEditor(Editable = Editable.Disabled, Summary = Summary.Sum)]
  165. public double Weight { get; set; }
  166. [Aggregate(typeof(StockHoldingValueAggregate))]
  167. [DoubleEditor(Editable = Editable.Disabled, Summary = Summary.Sum)]
  168. public double Value { get; set; }
  169. [Formula(typeof(StockHoldingAverageValueFormula))]
  170. [DoubleEditor(Editable = Editable.Disabled)]
  171. public double AverageValue { get; set; }
  172. }
  173. }