JobBillOfMaterialsActivity.cs 3.2 KB

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