StockHoldingSummaryGenerator.cs 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  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).IsNotEqualTo(FilterConstant.Zero)
  29. .Or(x => x.Available).IsNotEqualTo(FilterConstant.Zero)
  30. .Or(x => x.Allocated).IsNotEqualTo(FilterConstant.Zero)
  31. );
  32. }
  33. private class UnitsFormula : ComplexFormulaGenerator<StockMovement, object?>
  34. {
  35. public override IComplexFormulaNode<StockMovement, object?> GetFormula() => Formula(
  36. FormulaOperator.Subtract,
  37. Property(x => x.Received),
  38. Property(x => x.Issued)
  39. );
  40. }
  41. private class QtyFormula : ComplexFormulaGenerator<StockMovement, object?>
  42. {
  43. public override IComplexFormulaNode<StockMovement, object?> GetFormula() => Formula(
  44. FormulaOperator.Multiply,
  45. Formula(
  46. FormulaOperator.Subtract,
  47. Property(x => x.Received),
  48. Property(x => x.Issued)
  49. ),
  50. Property(x=>x.Dimensions.Value)
  51. );
  52. }
  53. private class WeightFormula : ComplexFormulaGenerator<StockMovement, object?>
  54. {
  55. public override IComplexFormulaNode<StockMovement, object?> GetFormula() => Formula(
  56. FormulaOperator.Multiply,
  57. Formula(
  58. FormulaOperator.Subtract,
  59. Property(x => x.Received),
  60. Property(x => x.Issued)
  61. ),
  62. Property(x=>x.Dimensions.Weight)
  63. );
  64. }
  65. private class StockTakeFormula : ComplexFormulaGenerator<StockMovement, object?>
  66. {
  67. public override IComplexFormulaNode<StockMovement, object?> GetFormula() =>
  68. If<StockMovement,StockMovementType,object?>(
  69. Property<StockMovement,StockMovementType>(x=>x.Type),
  70. Condition.Equals,
  71. Constant<StockMovement,StockMovementType>(StockMovementType.StockTake)
  72. ).Then(
  73. Property(x=>x.Date)
  74. ).Else(
  75. Constant(DateTime.MinValue)
  76. );
  77. }
  78. private class AvailableStockFomula : ComplexFormulaGenerator<StockMovement, object?>
  79. {
  80. public override IComplexFormulaNode<StockMovement, object?> GetFormula() =>
  81. If<StockMovement,Guid,object?>(
  82. Property<StockMovement, Guid>(x => x.JobRequisitionItem.ID),
  83. Condition.Equals,
  84. Constant<StockMovement, Guid>(Guid.Empty)
  85. ).Then(
  86. Formula<StockMovement, object?>(
  87. FormulaOperator.Subtract,
  88. Property(x => x.Received),
  89. Property(x => x.Issued)
  90. )
  91. ).Else(
  92. Constant(0.0)
  93. );
  94. }
  95. private class AllocatedStockFomula : ComplexFormulaGenerator<StockMovement, object?>
  96. {
  97. public override IComplexFormulaNode<StockMovement, object?> GetFormula() =>
  98. If<StockMovement,Guid,object?>(
  99. Property<StockMovement, Guid>(x => x.JobRequisitionItem.ID),
  100. Condition.NotEqual,
  101. Constant<StockMovement, Guid>(Guid.Empty)
  102. ).Then(
  103. Formula<StockMovement, object?>(
  104. FormulaOperator.Subtract,
  105. Property(x => x.Received),
  106. Property(x => x.Issued)
  107. )
  108. ).Else(
  109. Constant(0.0)
  110. );
  111. }
  112. private class TotalCostFomula : ComplexFormulaGenerator<StockMovement, object?>
  113. {
  114. public override IComplexFormulaNode<StockMovement, object?> GetFormula() =>
  115. Formula(FormulaOperator.Multiply,
  116. Formula<StockMovement, object?>(
  117. FormulaOperator.Subtract,
  118. Property(x => x.Received),
  119. Property(x => x.Issued)
  120. ),
  121. Property(x => x.Cost)
  122. );
  123. }
  124. }
  125. }