RequisitionItem.cs 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. using System;
  2. using System.Linq;
  3. using System.Linq.Expressions;
  4. using InABox.Core;
  5. using PRSClasses;
  6. namespace Comal.Classes
  7. {
  8. [UserTracking(typeof(Requisition))]
  9. [Obsolete("Replaced with PickingListItem")]
  10. public class RequisitionItem : StockEntity, IPersistent, IRemotable, INumericAutoIncrement<RequisitionItem>, IOneToMany<Requisition>
  11. , ILicense<LogisticsLicense>, IJobMaterial, IJobScopedItem
  12. {
  13. [IntegerEditor(Editable = Editable.Hidden)]
  14. [NullEditor]
  15. public int Sequence { get; set; }
  16. [EntityRelationship(DeleteAction.Cascade)]
  17. [NullEditor]
  18. public RequisitionLink Requisition { get; set; }
  19. [Obsolete("Replaced by Requisition")]
  20. public RequisitionLink RequisitionLink
  21. {
  22. get => Requisition;
  23. set { }
  24. }
  25. private class StockLocationLookup : LookupDefinitionGenerator<StockLocation, RequisitionItem>
  26. {
  27. public override Filter<StockLocation> DefineFilter(RequisitionItem[] items)
  28. {
  29. var productid = items.Select(x => x.Product.ID).FirstOrDefault();
  30. var styleid = items.Select(x => x.Style.ID).FirstOrDefault();
  31. var dimensions = items.Select(x => x.Dimensions).FirstOrDefault();
  32. var result = Filter<StockLocation>.Where(x => x.ID).InQuery(
  33. Filter<StockHolding>.Where(x => x.Product.ID).IsEqualTo(productid)
  34. .And(x => x.Style.ID).IsEqualTo(styleid)
  35. .And(x => x.Dimensions).DimensionEquals(dimensions)
  36. .And(x => x.Qty).IsNotEqualTo(0.0),
  37. x => x.Location.ID);
  38. return result;
  39. }
  40. public override Columns<RequisitionItem> DefineFilterColumns()
  41. => Columns.None<RequisitionItem>().Add(x => x.Product.ID).Add(x => x.Style.ID);
  42. }
  43. [LookupDefinition(typeof(StockLocationLookup))]
  44. [EditorSequence(1)]
  45. [RequiredColumn]
  46. public StockLocationLink Location { get; set; }
  47. [EditorSequence(2)]
  48. [RequiredColumn]
  49. public override ProductLink Product { get; set; }
  50. [EditorSequence(2)]
  51. [CodeEditor(Visible = Visible.Optional)]
  52. public string Code { get; set; }
  53. [MemoEditor]
  54. [EditorSequence(3)]
  55. public string Description { get; set; }
  56. [EditorSequence(4)]
  57. [RequiredColumn]
  58. public ProductStyleLink Style { get; set; }
  59. [EditorSequence(5)]
  60. [RequiredColumn]
  61. [DimensionsEditor(typeof(StockDimensions))]
  62. public override StockDimensions Dimensions { get; set; }
  63. [EntityRelationship(DeleteAction.Cascade)]
  64. [EditorSequence(6)]
  65. [RequiredColumn]
  66. public JobLink Job { get; set; }
  67. [Obsolete("Replaced with Job")]
  68. [NullEditor]
  69. public JobLink JobLink { get; set; }
  70. [EditorSequence(7)]
  71. [Caption("Required Quantity")]
  72. [RequiredColumn]
  73. public double Quantity { get; set; }
  74. [EditorSequence(8)]
  75. [RequiredColumn]
  76. public double ActualQuantity { get; set; }
  77. [EditorSequence(9)]
  78. [CurrencyEditor(Visible = Visible.Optional, Editable = Editable.Enabled)]
  79. [RequiredColumn]
  80. public double Cost { get; set; }
  81. /// <summary>
  82. /// This is the JRI that the stock for the Requisition is sourced from, filled if generated <i>from</i> a JRI.
  83. /// This can't be changed.
  84. /// </summary>
  85. [RequiredColumn]
  86. public JobRequisitionItemLink SourceJRI { get; set; }
  87. /// <summary>
  88. /// This is the JobRequisitionItem that the stock movements will be issued from; the holding JRI allocation. That is, it is the "target" JRI.<br/>
  89. /// This will be set when selecting holdings for this line
  90. /// </summary>
  91. [EditorSequence(9)]
  92. [RequiredColumn]
  93. public JobRequisitionItemLink JobRequisitionItem { get; set; }
  94. [NullEditor]
  95. [Obsolete("Replaced with Done")]
  96. public DateTime Picked { get; set; }
  97. [EditorSequence(10)]
  98. [CheckBoxEditor]
  99. public bool Done { get; set; }
  100. [EditorSequence("Image",1)]
  101. [DataModelTableName("Image")]
  102. public ImageDocumentLink Image { get; set; }
  103. [NullEditor]
  104. public string BarCode { get; set; }
  105. [NullEditor]
  106. public PickingListItemEditType EditType { get; set; }
  107. private class JobScopeLookup : LookupDefinitionGenerator<JobScope, RequisitionItem>
  108. {
  109. public override Filter<JobScope> DefineFilter(RequisitionItem[] items)
  110. {
  111. var item = items?.Length == 1 ? items[0] : null;
  112. if (item != null)
  113. return Filter<JobScope>.Where(x => x.Job.ID).IsEqualTo(item.Requisition.Job.ID).And(x => x.Status.Approved).IsEqualTo(true);
  114. return Filter.None<JobScope>();
  115. }
  116. public override Columns<RequisitionItem> DefineFilterColumns()
  117. => Columns.None<RequisitionItem>().Add(x=>x.Requisition.Job.ID);
  118. }
  119. [LookupDefinition(typeof(JobScopeLookup))]
  120. [EditorSequence("Processing",1)]
  121. public JobScopeLink JobScope { get; set; }
  122. [EditorSequence("Processing",2)]
  123. public ActualCharge Charge { get; set; }
  124. public Expression<Func<RequisitionItem, int>> AutoIncrementField() => x => x.Sequence;
  125. public Filter<RequisitionItem> AutoIncrementFilter() => Filter<RequisitionItem>.Where(x => x.Requisition.ID).IsEqualTo(Requisition.ID);
  126. public int AutoIncrementDefault() => 1;
  127. static RequisitionItem()
  128. {
  129. LinkedProperties.Register<RequisitionItem, ProductLink, String>(x => x.Product, x => x.Code, x => x.Code);
  130. LinkedProperties.Register<RequisitionItem, ProductLink, String>(x => x.Product, x => x.Name, x => x.Description);
  131. LinkedProperties.Register<RequisitionItem, ProductLink, bool>(x => x.Product, x => x.Chargeable, x => x.Charge.Chargeable);
  132. LinkedProperties.Register<RequisitionItem, ProductStyleLink, Guid>(x=>x.Product.DefaultInstance.Style, x => x.ID, x => x.Style.ID);
  133. LinkedProperties.Register<RequisitionItem, StockLocationLink, Guid>(x=>x.Product.DefaultLocation, x => x.ID, x => x.Location.ID);
  134. StockEntity.LinkStockDimensions<RequisitionItem>();
  135. LinkedProperties.Register<RequisitionItem, JobLink, Guid>(x=>x.Requisition.Job, x => x.ID, x => x.Job.ID);
  136. LinkedProperties.Register<RequisitionItem, JobScopeLink, Guid>(x=>x.Requisition.JobScope, x => x.ID, x => x.JobScope.ID);
  137. Classes.JobScope.LinkScopeProperties<RequisitionItem>();
  138. }
  139. }
  140. }