StockHolding.cs 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  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.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 => new Column<IStockHolding>[]
  81. {
  82. new Column<IStockHolding>(x => x.Job.ID),
  83. new Column<IStockHolding>(x => x.Location.ID),
  84. new Column<IStockHolding>(x => x.Product.ID),
  85. new Column<IStockHolding>(x => x.Style.ID),
  86. new Column<IStockHolding>(x => x.Dimensions.Unit.ID),
  87. new Column<IStockHolding>(x => x.Dimensions.Quantity),
  88. new Column<IStockHolding>(x => x.Dimensions.Length),
  89. new Column<IStockHolding>(x => x.Dimensions.Width),
  90. new Column<IStockHolding>(x => x.Dimensions.Height),
  91. new Column<IStockHolding>(x => x.Dimensions.Weight),
  92. };
  93. }
  94. [UserTracking(typeof(StockMovement))]
  95. [AutoEntity(typeof(StockHoldingUnionGenerator))]
  96. public class StockHolding : StockEntity, IRemotable, IPersistent, IOneToMany<StockLocation>, IOneToMany<Product>,
  97. IStockHolding, ILicense<WarehouseLicense>
  98. {
  99. public override ProductLink Product { get; set; }
  100. public ProductStyleLink Style { get; set; }
  101. public StockLocationLink Location { get; set; }
  102. public JobLink Job { get; set; }
  103. [RequiredColumn]
  104. [DimensionsEditor(typeof(StockDimensions), AllowEditingUnit = false)]
  105. public override StockDimensions Dimensions { get; set; }
  106. [Condition(typeof(StockHoldingIsRemnantCondition))]
  107. [NullEditor]
  108. public bool IsRemnant { get; set; }
  109. [Aggregate(typeof(StockHoldingUnitAggregate))]
  110. [DoubleEditor(Editable = Editable.Disabled, Summary = Summary.Sum)]
  111. public double Units { get; set; }
  112. [Aggregate(typeof(StockHoldingQuantityAggregate))]
  113. [DoubleEditor(Editable = Editable.Disabled, Summary = Summary.Sum)]
  114. public double Qty { get; set; }
  115. [Formula(typeof(StockHoldingWeightFormula))]
  116. [DoubleEditor(Editable = Editable.Disabled, Summary = Summary.Sum)]
  117. public double Weight { get; set; }
  118. [Aggregate(typeof(StockHoldingValueAggregate))]
  119. [DoubleEditor(Editable = Editable.Disabled, Summary = Summary.Sum)]
  120. public double Value { get; set; }
  121. [Formula(typeof(StockHoldingAverageValueFormula))]
  122. [DoubleEditor(Editable = Editable.Disabled)]
  123. public double AverageValue { get; set; }
  124. }
  125. }