JobBillOfMaterialsActivity.cs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  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 ActivityLink { get; set; }
  26. [EditorSequence(2)]
  27. [RequiredColumn]
  28. [DurationEditor(Summary = Summary.Sum)]
  29. public TimeSpan Duration { get; set; }
  30. [EditorSequence(3)]
  31. [CurrencyEditor]
  32. public double HourlyCost { get; set; }
  33. [EditorSequence(4)]
  34. [CurrencyEditor(Summary = Summary.Sum)]
  35. public double TotalCost { get; set; }
  36. [EditorSequence(5)]
  37. [RequiredColumn]
  38. public JobScopeLink Scope { get; set; }
  39. private class JobITPLookup : LookupDefinitionGenerator<JobITP, JobBillOfMaterialsItem>
  40. {
  41. public override Filter<JobITP> DefineFilter(JobBillOfMaterialsItem[] items)
  42. {
  43. if (items.Length == 1)
  44. return Filter<JobITP>.Where(x => x.Job.ID).IsEqualTo(items.First().Job.ID);
  45. return LookupFactory.DefineFilter<JobITP>();
  46. }
  47. public override Columns<JobBillOfMaterialsItem> DefineFilterColumns()
  48. => Columns.None<JobBillOfMaterialsItem>().Add(x => x.Job.ID);
  49. }
  50. [EditorSequence(6)]
  51. [EntityRelationship(DeleteAction.SetNull)]
  52. [LookupDefinition(typeof(JobITPLookup))]
  53. public JobITPLink ITP { get; set; }
  54. [EditorSequence("Issues", 1)]
  55. public ManagedProblem Problem { get; set; }
  56. private bool bChanging;
  57. protected override void DoPropertyChanged(string name, object? before, object? after)
  58. {
  59. if (bChanging)
  60. return;
  61. try
  62. {
  63. bChanging = true;
  64. if (name.Equals(nameof(Duration)) && after is TimeSpan duration)
  65. TotalCost = HourlyCost * duration.TotalHours;
  66. else if (name.Equals(nameof(HourlyCost)) && after is double cost)
  67. TotalCost = cost * Duration.TotalHours;
  68. else if (name.Equals(nameof(TotalCost)) && after is double total)
  69. {
  70. if (Duration == TimeSpan.Zero)
  71. Duration = TimeSpan.FromHours(1.0);
  72. HourlyCost = total / Duration.TotalHours;
  73. }
  74. }
  75. finally
  76. {
  77. bChanging = false;
  78. }
  79. base.DoPropertyChanged(name, before, after);
  80. }
  81. }
  82. }