StockLocation.cs 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Linq.Expressions;
  5. using InABox.Core;
  6. namespace Comal.Classes
  7. {
  8. public class StockLocationHoldings : CoreAggregate<StockLocation, StockHolding, Guid>
  9. {
  10. public override Expression<Func<StockHolding, Guid>> Aggregate => x => x.Product.ID;
  11. public override Dictionary<Expression<Func<StockHolding, object>>, Expression<Func<StockLocation, object>>> Links =>
  12. new Dictionary<Expression<Func<StockHolding, object>>, Expression<Func<StockLocation, object>>>()
  13. {
  14. { StockHolding => StockHolding.Location.ID, StockLocation => StockLocation.ID },
  15. };
  16. public override AggregateCalculation Calculation => AggregateCalculation.Count;
  17. }
  18. public class StockLocationLastStocktake : CoreAggregate<StockLocation, StockMovement, DateTime>
  19. {
  20. public override Expression<Func<StockMovement, DateTime>> Aggregate => x => x.Date;
  21. public override Filter<StockMovement> Filter => new Filter<StockMovement>(x => x.Batch).LinkValid().And(x => x.Batch.Type)
  22. .IsEqualTo(StockMovementBatchType.Stocktake);
  23. public override Dictionary<Expression<Func<StockMovement, object>>, Expression<Func<StockLocation, object>>> Links =>
  24. new Dictionary<Expression<Func<StockMovement, object>>, Expression<Func<StockLocation, object>>>()
  25. {
  26. { StockMovement => StockMovement.Location.ID, StockLocation => StockLocation.ID }
  27. };
  28. public override AggregateCalculation Calculation => AggregateCalculation.Maximum;
  29. }
  30. [UserTracking(typeof(StockMovement))]
  31. public class StockLocation : Entity, IRemotable, IPersistent, IStockLocation, ILicense<WarehouseLicense>, IExportable, IImportable
  32. {
  33. [UniqueCodeEditor(Visible = Visible.Default, Editable = Editable.Enabled)]
  34. [EditorSequence(1)]
  35. public string Code { get; set; }
  36. [TextBoxEditor]
  37. [EditorSequence(2)]
  38. public string Description { get; set; }
  39. [EntityRelationship(DeleteAction.SetNull)]
  40. [EditorSequence(3)]
  41. public StockWarehouseLink Warehouse { get; set; }
  42. private class StockAreaLookup : LookupDefinitionGenerator<StockArea, StockLocation>
  43. {
  44. public override Filter<StockArea> DefineFilter(StockLocation[] items)
  45. {
  46. var ids = items.Select(x => x.Warehouse.ID).Distinct().ToArray();
  47. if (ids.Length == 1)
  48. return new Filter<StockArea>(x => x.Warehouse.ID).IsEqualTo(ids[0]).And(x => x.Active).IsEqualTo(true);
  49. return new Filter<StockArea>(x => x.ID).IsEqualTo(CoreUtils.FullGuid);
  50. }
  51. public override Columns<StockLocation> DefineFilterColumns()
  52. => new Columns<StockLocation>(x => x.Warehouse.ID);
  53. }
  54. [LookupDefinition(typeof(StockAreaLookup))]
  55. [EntityRelationship(DeleteAction.SetNull)]
  56. [EditorSequence(4)]
  57. public StockAreaLink Area { get; set; }
  58. [EditorSequence(5)]
  59. public JobLink Job { get; set; }
  60. /// <summary>
  61. /// Is the location a "shelf" (ie permanent) or "pack" (ie transient)
  62. /// </summary>
  63. [EnumLookupEditor(typeof(StockLocationType))]
  64. [EditorSequence(6)]
  65. public StockLocationType Type { get; set; }
  66. /// <summary>
  67. /// Is the Stock Location Active?
  68. /// </summary>
  69. [EditorSequence(7)]
  70. public bool Active { get; set; }
  71. /// <summary>
  72. /// Mark this location as the default receival location for the warehouse
  73. /// </summary>
  74. [EditorSequence(8)]
  75. public bool Default { get; set; }
  76. /// <summary>
  77. /// Mark this location as a favourite which shows up in Timebench Transfer module for quick selection
  78. /// </summary>
  79. [EditorSequence(9)]
  80. public bool Favourite { get; set; } = false;
  81. [Aggregate(typeof(StockLocationHoldings))]
  82. [DoubleEditor(Editable = Editable.Hidden)]
  83. [EditorSequence(10)]
  84. public double Holdings { get; set; }
  85. [Aggregate(typeof(StockLocationLastStocktake))]
  86. [DateEditor(Editable = Editable.Hidden)]
  87. [EditorSequence(11)]
  88. public DateTime LastStocktake { get; set; }
  89. }
  90. }