StockHolding.cs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. using System;
  2. using InABox.Core;
  3. namespace Comal.Classes
  4. {
  5. [AutoEntity(typeof(StockHoldingSummaryGenerator))]
  6. [UserTracking(typeof(StockMovement))]
  7. public class StockHolding : StockEntity, IRemotable, IPersistent, IOneToMany<StockLocation>, IOneToMany<Product>,
  8. IStockHolding, ILicense<WarehouseLicense>
  9. {
  10. [Editable(Editable.Disabled)]
  11. [EditorSequence(1)]
  12. public StockLocationLink Location { get; set; }
  13. private class ProductLookupGenerator : LookupDefinitionGenerator<Product, StockHolding>
  14. {
  15. public override Filter<Product>? DefineFilter(StockHolding[] items)
  16. => LookupFactory.DefineFilter<Product>().And(x => x.NonStock).IsEqualTo(false);
  17. }
  18. [Editable(Editable.Disabled)]
  19. [EditorSequence(2)]
  20. [LookupDefinition(typeof(ProductLookupGenerator))]
  21. public override ProductLink Product { get; set; }
  22. [DimensionsEditor(typeof(StockDimensions))]
  23. [Editable(Editable.Disabled)]
  24. [EditorSequence(3)]
  25. public override StockDimensions Dimensions { get; set; }
  26. [Editable(Editable.Disabled)]
  27. [EditorSequence(4)]
  28. public ProductStyleLink Style { get; set; }
  29. [Editable(Editable.Disabled)]
  30. [EditorSequence(4)]
  31. public JobLink Job { get; set; }
  32. [DoubleEditor(Editable = Editable.Disabled, Summary = Summary.Sum)]
  33. [EditorSequence(5)]
  34. public double Units { get; set; }
  35. [DoubleEditor(Editable = Editable.Disabled, Summary = Summary.Sum)]
  36. [EditorSequence(6)]
  37. public double Qty { get; set; }
  38. [DoubleEditor(Editable = Editable.Disabled, Summary = Summary.Sum)]
  39. [EditorSequence(7)]
  40. public double Weight { get; set; }
  41. [DoubleEditor(Editable = Editable.Disabled, Summary = Summary.Sum)]
  42. [EditorSequence(8)]
  43. public double Available { get; set; }
  44. [DoubleEditor(Editable = Editable.Disabled, Summary = Summary.Sum)]
  45. [EditorSequence(9)]
  46. public double Allocated { get; set; }
  47. [DoubleEditor(Editable = Editable.Disabled, Summary = Summary.Sum)]
  48. [EditorSequence(10)]
  49. public double Value { get; set; }
  50. private class AverageValueFormula : ComplexFormulaGenerator<StockHolding, double>
  51. {
  52. public override IComplexFormulaNode<StockHolding, double> GetFormula() =>
  53. Formula(
  54. FormulaOperator.Divide,
  55. Property(x => x.Value),
  56. Property(x => x.Units)
  57. );
  58. }
  59. [ComplexFormula(typeof(AverageValueFormula))]
  60. [DoubleEditor(Editable = Editable.Disabled)]
  61. [EditorSequence(11)]
  62. public double AverageValue { get; set; }
  63. [DateEditor(Editable = Editable.Disabled)]
  64. [EditorSequence(11)]
  65. public DateTime LastStockTake { get; set; }
  66. public static Column<IStockHolding>[] Columns => new Column<IStockHolding>[]
  67. {
  68. new Column<IStockHolding>(x => x.Job.ID),
  69. new Column<IStockHolding>(x => x.Location.ID),
  70. new Column<IStockHolding>(x => x.Product.ID),
  71. new Column<IStockHolding>(x => x.Style.ID),
  72. new Column<IStockHolding>(x => x.Dimensions.Unit.ID),
  73. new Column<IStockHolding>(x => x.Dimensions.Quantity),
  74. new Column<IStockHolding>(x => x.Dimensions.Length),
  75. new Column<IStockHolding>(x => x.Dimensions.Width),
  76. new Column<IStockHolding>(x => x.Dimensions.Height),
  77. new Column<IStockHolding>(x => x.Dimensions.Weight),
  78. };
  79. public static Filter<StockMovement>? GetFilter(IStockHolding holding)
  80. {
  81. var filter = new Filters<StockMovement>();
  82. foreach(var column in Columns)
  83. {
  84. filter.Add(new Filter<StockMovement>(column.Cast<StockMovement>()).IsEqualTo(CoreUtils.GetPropertyValue(holding, column.Property)));
  85. }
  86. return filter.Combine();
  87. }
  88. }
  89. }