JobBillOfMaterialsActivity.cs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. using System;
  2. using System.Linq;
  3. using InABox.Core;
  4. namespace Comal.Classes
  5. {
  6. [Caption("Labour")]
  7. public class JobBillOfMaterialsActivity : Entity, IRemotable, IPersistent, IJobActivity, IOneToMany<Job>,
  8. IOneToMany<JobBillOfMaterials>, ISequenceable, ILicense<ProjectManagementLicense>,
  9. IProblems<ManagedProblem>
  10. {
  11. [NullEditor]
  12. public long Sequence { get; set; }
  13. [EntityRelationship(DeleteAction.Cascade)]
  14. [Editable(Editable.Hidden)]
  15. public JobLink Job { get; set; }
  16. [NullEditor]
  17. [Obsolete("Replaced with Job")]
  18. public JobLink JobLink { get; set; }
  19. [EntityRelationship(DeleteAction.Cascade)]
  20. [Editable(Editable.Hidden)]
  21. public JobBillOfMaterialsLink BillOfMaterials { get; set; }
  22. [EditorSequence(1)]
  23. [EntityRelationship(DeleteAction.SetNull)]
  24. [RequiredColumn]
  25. public AssignmentActivityLink Activity { get; set; }
  26. [Obsolete("Replaced by Activity")]
  27. public AssignmentActivityLink ActivityLink
  28. {
  29. get => Activity;
  30. set { }
  31. }
  32. [EditorSequence(2)]
  33. [RequiredColumn]
  34. [DurationEditor(Summary = Summary.Sum)]
  35. public TimeSpan Duration { get; set; }
  36. [EditorSequence(3)]
  37. [CurrencyEditor]
  38. public double HourlyCost { get; set; }
  39. [EditorSequence(4)]
  40. [CurrencyEditor(Summary = Summary.Sum)]
  41. public double TotalCost { get; set; }
  42. [EditorSequence(5)]
  43. [RequiredColumn]
  44. public JobScopeLink Scope { get; set; }
  45. private class JobITPLookup : LookupDefinitionGenerator<JobITP, JobBillOfMaterialsItem>
  46. {
  47. public override Filter<JobITP> DefineFilter(JobBillOfMaterialsItem[] items)
  48. {
  49. if (items.Length == 1)
  50. return Filter<JobITP>.Where(x => x.Job.ID).IsEqualTo(items.First().Job.ID);
  51. return LookupFactory.DefineFilter<JobITP>();
  52. }
  53. public override Columns<JobBillOfMaterialsItem> DefineFilterColumns()
  54. => Columns.None<JobBillOfMaterialsItem>().Add(x => x.Job.ID);
  55. }
  56. [EditorSequence(6)]
  57. [EntityRelationship(DeleteAction.SetNull)]
  58. [LookupDefinition(typeof(JobITPLookup))]
  59. public JobITPLink ITP { get; set; }
  60. [EditorSequence("Issues", 1)]
  61. public ManagedProblem Problem { get; set; }
  62. private bool bChanging;
  63. protected override void DoPropertyChanged(string name, object? before, object? after)
  64. {
  65. if (bChanging)
  66. return;
  67. try
  68. {
  69. bChanging = true;
  70. if (name.Equals(nameof(Duration)) && after is TimeSpan duration)
  71. TotalCost = HourlyCost * duration.TotalHours;
  72. else if (name.Equals(nameof(HourlyCost)) && after is double cost)
  73. TotalCost = cost * Duration.TotalHours;
  74. else if (name.Equals(nameof(TotalCost)) && after is double total)
  75. {
  76. if (Duration == TimeSpan.Zero)
  77. Duration = TimeSpan.FromHours(1.0);
  78. HourlyCost = total / Duration.TotalHours;
  79. }
  80. }
  81. finally
  82. {
  83. bChanging = false;
  84. }
  85. base.DoPropertyChanged(name, before, after);
  86. }
  87. }
  88. }