ProductInstance.cs 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. using InABox.Core;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Linq.Expressions;
  6. using System.Text;
  7. using InABox.Clients;
  8. namespace Comal.Classes
  9. {
  10. public class ProductInstanceFreeStockAggregate : CoreAggregate<ProductInstance, StockHolding, double>
  11. {
  12. public override Expression<Func<StockHolding, double>> Aggregate => x => x.Units;
  13. public override Filter<StockHolding> Filter => new Filter<StockHolding>(x => x.Job).NotLinkValid();
  14. public override Dictionary<Expression<Func<StockHolding, object?>>, Expression<Func<ProductInstance, object?>>>
  15. Links =>
  16. new Dictionary<Expression<Func<StockHolding, object?>>, Expression<Func<ProductInstance, object?>>>()
  17. {
  18. { StockHolding => StockHolding.Product.ID, Instance => Instance.Product.ID },
  19. { StockHolding => StockHolding.Style.ID, Instance => Instance.Style.ID },
  20. }.AddRange(Dimensions.GetLinks<StockHolding, ProductInstance>(x => x.Dimensions, x => x.Dimensions));
  21. public override AggregateCalculation Calculation => AggregateCalculation.Sum;
  22. }
  23. public class ProductInstanceFreeStockValueAggregate : CoreAggregate<ProductInstance, StockHolding, double>
  24. {
  25. public override Expression<Func<StockHolding, double>> Aggregate => x => x.Value;
  26. public override Filter<StockHolding> Filter => new Filter<StockHolding>(x => x.Job).NotLinkValid();
  27. public override Dictionary<Expression<Func<StockHolding, object?>>, Expression<Func<ProductInstance, object?>>>
  28. Links =>
  29. new Dictionary<Expression<Func<StockHolding, object?>>, Expression<Func<ProductInstance, object?>>>()
  30. {
  31. { StockHolding => StockHolding.Product.ID, Instance => Instance.Product.ID },
  32. { StockHolding => StockHolding.Style.ID, Instance => Instance.Style.ID },
  33. }.AddRange(Dimensions.GetLinks<StockHolding, ProductInstance>(x => x.Dimensions, x => x.Dimensions));
  34. public override AggregateCalculation Calculation => AggregateCalculation.Sum;
  35. }
  36. public class ProductInstanceAverageCostFormula : IFormula<ProductInstance, double>
  37. {
  38. public Expression<Func<ProductInstance, double>> Value => x => x.FreeStockValue;
  39. public Expression<Func<ProductInstance, double>>[] Modifiers => new Expression<Func<ProductInstance, double>>[] { x => x.FreeStock };
  40. public FormulaOperator Operator => FormulaOperator.Divide;
  41. public FormulaType Type => FormulaType.Virtual;
  42. }
  43. public class ProductInstance : StockEntity, IRemotable, IPersistent, IProductInstance,
  44. ISequenceable, ILicense<ProductManagementLicense>
  45. {
  46. [NullEditor] public long Sequence { get; set; }
  47. [EditorSequence(1)]
  48. public override ProductLink Product { get; set; }
  49. [EditorSequence(2)]
  50. public ProductStyleLink Style { get; set; }
  51. [EditorSequence(3)]
  52. [RequiredColumn]
  53. [DimensionsEditor(typeof(StockDimensions))]
  54. public override StockDimensions Dimensions { get; set; }
  55. [IntegerEditor]
  56. [EditorSequence(4)]
  57. [LoggableProperty]
  58. public int MinimumStockLevel { get; set; }
  59. [IntegerEditor]
  60. [EditorSequence(5)]
  61. [LoggableProperty]
  62. public int MinimumStockDays{ get; set; }
  63. [EditorSequence(6)]
  64. [Aggregate(typeof(ProductInstanceFreeStockAggregate))]
  65. [DoubleEditor(Editable = Editable.Hidden)]
  66. public double FreeStock { get; set; }
  67. [EditorSequence(7)]
  68. [Aggregate(typeof(ProductInstanceFreeStockValueAggregate))]
  69. [DoubleEditor(Editable = Editable.Hidden)]
  70. public double FreeStockValue { get; set; }
  71. [CurrencyEditor(Visible = Visible.Optional)]
  72. [EditorSequence(8)]
  73. [LoggableProperty]
  74. public double NettCost { get; set; }
  75. [Formula(typeof(ProductInstanceAverageCostFormula))]
  76. [CurrencyEditor(Visible = Visible.Optional, Editable = Editable.Disabled)]
  77. [EditorSequence(9)]
  78. public double AverageCost { get; set; }
  79. [CurrencyEditor(Visible = Visible.Optional, Editable = Editable.Disabled)]
  80. [EditorSequence(10)]
  81. [LoggableProperty]
  82. public double LastCost { get; set; }
  83. [NullEditor]
  84. [Obsolete("", true)]
  85. public double Parameter { get; set; }
  86. }
  87. }