Setout.cs 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. using System;
  2. using System.Linq;
  3. using InABox.Core;
  4. namespace Comal.Classes
  5. {
  6. public enum SetoutStatus
  7. {
  8. Unapproved,
  9. Approved,
  10. Cancelled
  11. }
  12. [UserTracking(typeof(ManufacturingPacket))]
  13. public class Setout : Entity, IPersistent, IRemotable, ILicense<ManufacturingLicense>, IJobScopedItem, IProblems<ManagedProblem>
  14. {
  15. [EditorSequence(1)]
  16. [DateTimeEditor(Visible = Visible.Default, Editable = Editable.Hidden)]
  17. public override DateTime Created
  18. {
  19. get => base.Created;
  20. set => base.Created = value;
  21. }
  22. [UniqueCodeEditor(Visible = Visible.Default, Editable = Editable.Enabled)]
  23. [EditorSequence(2)]
  24. [RequiredColumn]
  25. public string Number { get; set; }
  26. [EntityRelationship(DeleteAction.Cascade)]
  27. [EditorSequence(3)]
  28. public JobLink Job { get; set; }
  29. [NullEditor]
  30. [Obsolete("Replaced with Job")]
  31. public JobLink JobLink { get; set; }
  32. [EditorSequence(4)]
  33. public SetoutGroupLink Group { get; set; }
  34. [MemoEditor]
  35. [EditorSequence(5)]
  36. public string Description { get; set; }
  37. [EditorSequence(6)]
  38. public DateTime DueDate { get; set; }
  39. private class JobStageLookup : LookupDefinitionGenerator<JobStage, Setout>
  40. {
  41. public override Filter<JobStage> DefineFilter(Setout[] items)
  42. {
  43. if (items.Length == 1)
  44. return Filter<JobStage>.Where(x => x.Job.ID).IsEqualTo(items.First().Job.ID).And(x => x.IsHeader).IsEqualTo(false);
  45. return Filter<JobStage>.Where(x => x.ID).IsEqualTo(Guid.Empty);
  46. }
  47. public override Columns<Setout> DefineFilterColumns()
  48. => Columns.None<Setout>().Add(x => x.Job.ID);
  49. }
  50. [LookupDefinition(typeof(JobStageLookup))]
  51. [EditorSequence(7)]
  52. public JobStageLink JobStage { get; set; }
  53. [EditorSequence(8)]
  54. [Editable(Editable.Disabled)]
  55. [LoggableProperty]
  56. public SetoutStatus Status { get; set; }
  57. [EditorSequence("Issues", 1)]
  58. public ManagedProblem Problem { get; set; }
  59. private class JobScopeLookup : LookupDefinitionGenerator<JobScope, Setout>
  60. {
  61. public override Filter<JobScope> DefineFilter(Setout[] items)
  62. {
  63. var item = items?.Length == 1 ? items[0] : null;
  64. if (item != null)
  65. return Filter<JobScope>.Where(x => x.Job.ID).IsEqualTo(item.Job.ID).And(x => x.Status.Approved).IsEqualTo(true);
  66. return Filter.None<JobScope>();
  67. }
  68. public override Columns<Setout> DefineFilterColumns()
  69. => Columns.None<Setout>().Add(x => x.Job.ID);
  70. }
  71. [LookupDefinition(typeof(JobScopeLookup))]
  72. public JobScopeLink JobScope { get; set; }
  73. #region Aggregates
  74. private class PacketsAggregate : ComplexFormulaGenerator<Setout, int>
  75. {
  76. public override IComplexFormulaNode<Setout, int> GetFormula() =>
  77. Count<ManufacturingPacket, Guid>(
  78. x => x.Property(x => x.ID))
  79. .WithLink(x => x.SetoutLink.ID, x => x.ID);
  80. }
  81. [NullEditor]
  82. [ComplexFormula(typeof(PacketsAggregate))]
  83. public int Packets { get; set; }
  84. private class UnprocessedPacketsAggregate : ComplexFormulaGenerator<Setout, int>
  85. {
  86. public override IComplexFormulaNode<Setout, int> GetFormula() =>
  87. Count<ManufacturingPacket, Guid>(
  88. x => x.Property(x => x.ID),
  89. Filter<ManufacturingPacket>.Where(x => x.Approved).IsEqualTo(DateTime.MinValue))
  90. .WithLink(x => x.SetoutLink.ID, x => x.ID);
  91. }
  92. [NullEditor]
  93. [ComplexFormula(typeof(UnprocessedPacketsAggregate))]
  94. public int UnapprovedPackets { get; set; }
  95. private class FormsAggregate : ComplexFormulaGenerator<Setout, int>
  96. {
  97. public override IComplexFormulaNode<Setout, int> GetFormula() =>
  98. Count<SetoutForm, Guid>(
  99. x => x.Property(x => x.ID))
  100. .WithLink(x => x.Parent.ID, x => x.ID);
  101. }
  102. [NullEditor]
  103. [ComplexFormula(typeof(FormsAggregate))]
  104. public int Forms { get; set; }
  105. private class OpenFormsAggregate : ComplexFormulaGenerator<Setout, int>
  106. {
  107. public override IComplexFormulaNode<Setout, int> GetFormula() =>
  108. Count<SetoutForm, Guid>(
  109. x => x.Property(x => x.ID),
  110. Filter<SetoutForm>.Where(x => x.FormCompleted).IsEqualTo(DateTime.MinValue))
  111. .WithLink(x => x.Parent.ID, x => x.ID);
  112. }
  113. [NullEditor]
  114. [ComplexFormula(typeof(OpenFormsAggregate))]
  115. public int OpenForms { get; set; }
  116. private class ActiveDocumentsAggregate : ComplexFormulaGenerator<Setout, int>
  117. {
  118. public override IComplexFormulaNode<Setout, int> GetFormula() =>
  119. Count<SetoutDocument, Guid>(
  120. x => x.Property(x => x.ID),
  121. Filter<SetoutDocument>.Where(x => x.Superceded).IsEqualTo(DateTime.MinValue))
  122. .WithLink(x => x.EntityLink.ID, x => x.ID);
  123. }
  124. [NullEditor]
  125. [ComplexFormula(typeof(ActiveDocumentsAggregate))]
  126. public int ActivateDocuments { get; set; }
  127. #endregion
  128. #region Obsolete Properties
  129. [Obsolete("Supreceded by ManufacturingPacket.Serial")]
  130. [NullEditor]
  131. public string Reference { get; set; }
  132. [Obsolete("Superceded by ManufacturingPacket.Location")]
  133. [NullEditor]
  134. public string Location { get; set; }
  135. #endregion
  136. public override string ToString()
  137. {
  138. return string.Format("{0}: {1}", Number, Reference);
  139. }
  140. static Setout()
  141. {
  142. DefaultColumns.Add<Setout>(x => x.Number);
  143. DefaultColumns.Add<Setout>(x => x.Description);
  144. DefaultColumns.Add<Setout>(x => x.DueDate);
  145. }
  146. }
  147. }