RequisitionItem.cs 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  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. public class RequisitionItem : StockEntity, IPersistent, IRemotable, INumericAutoIncrement<RequisitionItem>, IOneToMany<Invoice>, IOneToMany<Requisition>
  10. , ILicense<LogisticsLicense>, IJobMaterial, IJobScopedItem
  11. {
  12. [IntegerEditor(Editable = Editable.Hidden)]
  13. [NullEditor]
  14. public int Sequence { get; set; }
  15. [EntityRelationship(DeleteAction.Cascade)]
  16. [NullEditor]
  17. public RequisitionLink RequisitionLink { get; set; }
  18. [NullEditor]
  19. [Obsolete("Replaced With JobLink", true)]
  20. public JobLink Job { get; set; }
  21. [EntityRelationship(DeleteAction.Cascade)]
  22. [NullEditor]
  23. public JobLink JobLink { get; set; }
  24. [EditorSequence(1)]
  25. [RequiredColumn]
  26. public override ProductLink Product { get; set; }
  27. [EditorSequence(3)]
  28. [CodeEditor(Visible = Visible.Optional)]
  29. public string Code { get; set; }
  30. [MemoEditor]
  31. [EditorSequence(4)]
  32. public string Description { get; set; }
  33. [EditorSequence(5)]
  34. [RequiredColumn]
  35. public ProductStyleLink Style { get; set; }
  36. [EditorSequence(6)]
  37. [RequiredColumn]
  38. [DimensionsEditor(typeof(StockDimensions), AllowEditingUnit = false)]
  39. public override StockDimensions Dimensions { get; set; }
  40. [EditorSequence(7)]
  41. public double Quantity { get; set; }
  42. [EditorSequence(8)]
  43. public double ActualQuantity { get; set; }
  44. private class StockLocationLookup : LookupDefinitionGenerator<StockLocation, RequisitionItem>
  45. {
  46. public override Filter<StockLocation> DefineFilter(RequisitionItem[] items)
  47. {
  48. var productid = items.Select(x => x.Product.ID).FirstOrDefault();
  49. var styleid = items.Select(x => x.Style.ID).FirstOrDefault();
  50. var unitsize = items.Select(x => x.Dimensions.UnitSize).FirstOrDefault();
  51. var result = new Filter<StockLocation>(x => x.ID).InQuery<StockHolding>(
  52. new Filter<StockHolding>(x => x.Product.ID).IsEqualTo(productid)
  53. .And(x=>x.Style.ID).IsEqualTo(styleid)
  54. .And(x=>x.Dimensions.UnitSize).IsEqualTo(unitsize)
  55. .And(x => x.Qty).IsGreaterThan(0.0F),
  56. x => x.Location.ID);
  57. return result;
  58. }
  59. public override Columns<RequisitionItem> DefineFilterColumns()
  60. => new Columns<RequisitionItem>(x => x.Product.ID).Add(x => x.Style.ID);
  61. }
  62. [LookupDefinition(typeof(StockLocationLookup))]
  63. [EditorSequence(9)]
  64. [RequiredColumn]
  65. public StockLocationLink Location { get; set; }
  66. [EditorSequence(10)]
  67. [RequiredColumn]
  68. public JobRequisitionItemLink JobRequisitionItem { get; set; }
  69. [EditorSequence(11)]
  70. [TimestampEditor]
  71. public DateTime Picked { get; set; }
  72. [EditorSequence("Image",1)]
  73. [DataModelTableName("Image")]
  74. public ImageDocumentLink Image { get; set; }
  75. [NullEditor]
  76. public string BarCode { get; set; }
  77. [NullEditor]
  78. public InvoiceLink Invoice { get; set; }
  79. private class JobScopeLookup : LookupDefinitionGenerator<JobScope, RequisitionItem>
  80. {
  81. public override Filter<JobScope> DefineFilter(RequisitionItem[] items)
  82. {
  83. var item = items?.Length == 1 ? items[0] : null;
  84. if (item != null)
  85. return new Filter<JobScope>(x => x.Job.ID).IsEqualTo(item.RequisitionLink.JobLink.ID).And(x => x.Status.Approved).IsEqualTo(true);
  86. return new Filter<JobScope>(x => x.ID).None();
  87. }
  88. public override Columns<RequisitionItem> DefineFilterColumns()
  89. => new Columns<RequisitionItem>(x=>x.RequisitionLink.JobLink.ID);
  90. }
  91. [LookupDefinition(typeof(JobScopeLookup))]
  92. [EditorSequence("Processing",1)]
  93. public JobScopeLink JobScope { get; set; }
  94. [EditorSequence("Processing",2)]
  95. public ActualCharge Charge { get; set; }
  96. public Expression<Func<RequisitionItem, int>> AutoIncrementField()
  97. {
  98. return x => x.Sequence;
  99. }
  100. public Filter<RequisitionItem> AutoIncrementFilter()
  101. {
  102. return new Filter<RequisitionItem>(x => x.RequisitionLink.ID).IsEqualTo(RequisitionLink.ID);
  103. }
  104. static RequisitionItem()
  105. {
  106. LinkedProperties.Register<RequisitionItem, ProductLink, String>(x => x.Product, x => x.Code, x => x.Code);
  107. LinkedProperties.Register<RequisitionItem, ProductLink, String>(x => x.Product, x => x.Name, x => x.Description);
  108. LinkedProperties.Register<RequisitionItem, ProductLink, bool>(x => x.Product, x => x.Charge.Chargeable, x => x.Charge.Chargeable);
  109. LinkedProperties.Register<RequisitionItem, ProductStyleLink, Guid>(x=>x.Product.DefaultInstance.Style, x => x.ID, x => x.Style.ID);
  110. LinkedProperties.Register<RequisitionItem, StockLocationLink, Guid>(x=>x.Product.DefaultLocation, x => x.ID, x => x.Location.ID);
  111. StockEntity.LinkStockDimensions<RequisitionItem>();
  112. LinkedProperties.Register<RequisitionItem, JobLink, Guid>(x=>x.RequisitionLink.JobLink, x => x.ID, x => x.JobLink.ID);
  113. LinkedProperties.Register<RequisitionItem, JobScopeLink, Guid>(x=>x.RequisitionLink.JobScope, x => x.ID, x => x.JobScope.ID);
  114. Classes.JobScope.LinkScopeProperties<RequisitionItem>();
  115. }
  116. }
  117. }