StockHoldingSummaryGenerator.cs 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. using System;
  2. using InABox.Core;
  3. namespace Comal.Classes
  4. {
  5. public class StockHoldingSummaryGenerator : AutoEntitySummaryGenerator<StockHolding, StockMovement>
  6. {
  7. public override void Configure()
  8. {
  9. GroupBy(x=>x.Location.ID, x=>x.Location.ID);
  10. GroupBy(x=>x.Product.ID, x=>x.Product.ID);
  11. GroupBy(x=>x.Style.ID, x=>x.Style.ID);
  12. GroupBy(x=>x.Job.ID, x=>x.Job.ID);
  13. GroupBy(x=>x.Dimensions.Unit.ID, x=>x.Dimensions.Unit.ID);
  14. GroupBy(x=>x.Dimensions.Length, x=>x.Dimensions.Length);
  15. GroupBy(x=>x.Dimensions.Width, x=>x.Dimensions.Width);
  16. GroupBy(x=>x.Dimensions.Height, x=>x.Dimensions.Height);
  17. GroupBy(x=>x.Dimensions.Weight, x=>x.Dimensions.Weight);
  18. GroupBy(x=>x.Dimensions.Quantity,x=>x.Dimensions.Quantity);
  19. GroupBy(x=>x.Dimensions.Value, x=>x.Dimensions.Value);
  20. GroupBy(x=>x.Dimensions.UnitSize, x=>x.Dimensions.UnitSize);
  21. Aggregate(x => x.Units, AutoEntitySummaryAggregate.Sum, new UnitsFormula());
  22. Aggregate(x => x.Qty, AutoEntitySummaryAggregate.Sum, new QtyFormula());
  23. Aggregate(x=>x.Weight, AutoEntitySummaryAggregate.Sum, new WeightFormula());
  24. Aggregate(x=>x.Available, AutoEntitySummaryAggregate.Sum, new AvailableStockFomula());
  25. Aggregate(x=>x.Allocated, AutoEntitySummaryAggregate.Sum, new AllocatedStockFomula());
  26. Aggregate(x=>x.Value, AutoEntitySummaryAggregate.Sum, new TotalCostFomula());
  27. Aggregate(x =>x.LastStockTake, AutoEntitySummaryAggregate.Maximum, new StockTakeFormula());
  28. Having(new Filter<StockHolding>(x => x.Units).IsGreaterThan(0.0001)
  29. .Or(x => x.Units).IsLessThan(-0.0001)
  30. .Or(x => x.Available).IsGreaterThan(0.0001)
  31. .Or(x => x.Available).IsLessThan(-0.0001)
  32. .Or(x => x.Allocated).IsGreaterThan(0.0001)
  33. .Or(x => x.Allocated).IsLessThan(-0.0001)
  34. );
  35. }
  36. private class UnitsFormula : ComplexFormulaGenerator<StockMovement, object?>
  37. {
  38. public override IComplexFormulaNode<StockMovement, object?> GetFormula() => Formula(
  39. FormulaOperator.Subtract,
  40. Property(x => x.Received),
  41. Property(x => x.Issued)
  42. );
  43. }
  44. private class QtyFormula : ComplexFormulaGenerator<StockMovement, object?>
  45. {
  46. public override IComplexFormulaNode<StockMovement, object?> GetFormula() => Formula(
  47. FormulaOperator.Multiply,
  48. Formula(
  49. FormulaOperator.Subtract,
  50. Property(x => x.Received),
  51. Property(x => x.Issued)
  52. ),
  53. Property(x=>x.Dimensions.Value)
  54. );
  55. }
  56. private class WeightFormula : ComplexFormulaGenerator<StockMovement, object?>
  57. {
  58. public override IComplexFormulaNode<StockMovement, object?> GetFormula() => Formula(
  59. FormulaOperator.Multiply,
  60. Formula(
  61. FormulaOperator.Subtract,
  62. Property(x => x.Received),
  63. Property(x => x.Issued)
  64. ),
  65. Property(x=>x.Dimensions.Weight)
  66. );
  67. }
  68. private class StockTakeFormula : ComplexFormulaGenerator<StockMovement, object?>
  69. {
  70. public override IComplexFormulaNode<StockMovement, object?> GetFormula() =>
  71. If<StockMovement,StockMovementType,object?>(
  72. Property<StockMovement,StockMovementType>(x=>x.Type),
  73. Condition.Equals,
  74. Constant<StockMovement,StockMovementType>(StockMovementType.StockTake)
  75. ).Then(
  76. Property(x=>x.Date)
  77. ).Else(
  78. Constant(DateTime.MinValue)
  79. );
  80. }
  81. private class AvailableStockFomula : ComplexFormulaGenerator<StockMovement, object?>
  82. {
  83. public override IComplexFormulaNode<StockMovement, object?> GetFormula() =>
  84. If<StockMovement,Guid,object?>(
  85. Property<StockMovement, Guid>(x => x.JobRequisitionItem.ID),
  86. Condition.Equals,
  87. Constant<StockMovement, Guid>(Guid.Empty)
  88. ).Then(
  89. Formula<StockMovement, object?>(
  90. FormulaOperator.Subtract,
  91. Property(x => x.Received),
  92. Property(x => x.Issued)
  93. )
  94. ).Else(
  95. Constant(0.0)
  96. );
  97. }
  98. private class AllocatedStockFomula : ComplexFormulaGenerator<StockMovement, object?>
  99. {
  100. public override IComplexFormulaNode<StockMovement, object?> GetFormula() =>
  101. If<StockMovement,Guid,object?>(
  102. Property<StockMovement, Guid>(x => x.JobRequisitionItem.ID),
  103. Condition.NotEqual,
  104. Constant<StockMovement, Guid>(Guid.Empty)
  105. ).Then(
  106. Formula<StockMovement, object?>(
  107. FormulaOperator.Subtract,
  108. Property(x => x.Received),
  109. Property(x => x.Issued)
  110. )
  111. ).Else(
  112. Constant(0.0)
  113. );
  114. }
  115. private class TotalCostFomula : ComplexFormulaGenerator<StockMovement, object?>
  116. {
  117. public override IComplexFormulaNode<StockMovement, object?> GetFormula() =>
  118. Formula(FormulaOperator.Multiply,
  119. Formula<StockMovement, object?>(
  120. FormulaOperator.Subtract,
  121. Property(x => x.Received),
  122. Property(x => x.Issued)
  123. ),
  124. Property(x => x.Cost)
  125. );
  126. }
  127. }
  128. }