Consignment.cs 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq.Expressions;
  4. using InABox.Core;
  5. namespace Comal.Classes
  6. {
  7. public class ConsignmentLastReceived : CoreAggregate<Consignment, PurchaseOrderItem, DateTime>
  8. {
  9. public override Expression<Func<PurchaseOrderItem, DateTime>> Aggregate => x => x.ReceivedDate;
  10. public override AggregateCalculation Calculation => AggregateCalculation.Maximum;
  11. public override Dictionary<Expression<Func<PurchaseOrderItem, object>>, Expression<Func<Consignment, object>>> Links =>
  12. new Dictionary<Expression<Func<PurchaseOrderItem, object>>, Expression<Func<Consignment, object>>>()
  13. {
  14. { PurchaseOrderItem => PurchaseOrderItem.Consignment.ID, Consignment => Consignment.ID }
  15. };
  16. }
  17. public class ConsignmentUnreceivedItems : CoreAggregate<Consignment, PurchaseOrderItem, Guid>
  18. {
  19. public override Expression<Func<PurchaseOrderItem, Guid>> Aggregate => x => x.ID;
  20. public override AggregateCalculation Calculation => AggregateCalculation.Count;
  21. public override Filter<PurchaseOrderItem> Filter => new Filter<PurchaseOrderItem>(x => x.ReceivedDate).IsEqualTo(DateTime.MinValue);
  22. public override Dictionary<Expression<Func<PurchaseOrderItem, object>>, Expression<Func<Consignment, object>>> Links =>
  23. new Dictionary<Expression<Func<PurchaseOrderItem, object>>, Expression<Func<Consignment, object>>>()
  24. {
  25. { PurchaseOrderItem => PurchaseOrderItem.Consignment.ID, Consignment => Consignment.ID }
  26. };
  27. }
  28. [UserTracking(typeof(Delivery))]
  29. public class Consignment : Entity, IRemotable, IPersistent, ITaxable, ILicense<LogisticsLicense>
  30. {
  31. [TextBoxEditor]
  32. [EditorSequence(0)]
  33. public string Number { get; set; }
  34. [EditorSequence(1)]
  35. public ConsignmentTypeLink Type { get; set; }
  36. [EditorSequence(2)]
  37. public PurchaseOrderCategoryLink Category { get; set; }
  38. [Caption("Carrier")]
  39. [EditorSequence(3)]
  40. public SupplierLink Supplier { get; set; }
  41. [TextBoxEditor]
  42. [EditorSequence(4)]
  43. public string Origin { get; set; }
  44. [TextBoxEditor]
  45. [EditorSequence(5)]
  46. public string Description { get; set; }
  47. [DateEditor]
  48. [Caption("Est. Shipping Date")]
  49. [EditorSequence(6)]
  50. public DateTime EstimatedDispatchDate { get; set; }
  51. [DateEditor]
  52. [Caption("Act. Shipping Date")]
  53. [EditorSequence(7)]
  54. public DateTime ActualDispatchDate { get; set; }
  55. [DateEditor]
  56. [Caption("Est. Port Arrival")]
  57. [EditorSequence(8)]
  58. public DateTime EstimatedPortArrival { get; set; }
  59. [DateEditor]
  60. [Caption("Act. Port Arrival")]
  61. [EditorSequence(9)]
  62. public DateTime ActualPortArrival { get; set; }
  63. [NullEditor]
  64. [EditorSequence(10)]
  65. public DateTime EstimatedDepotArrival { get; set; }
  66. [NullEditor]
  67. [EditorSequence(11)]
  68. public DateTime ActualDepotArrival { get; set; }
  69. [DateEditor]
  70. [Caption("Est. Warehouse Arrival")]
  71. [EditorSequence(12)]
  72. public DateTime EstimatedWarehouseArrival { get; set; }
  73. [DateEditor]
  74. [Caption("Act. Warehouse Arrival")]
  75. [EditorSequence(13)]
  76. public DateTime ActualWarehouseArrival { get; set; }
  77. [TextBoxEditor]
  78. [EditorSequence(14)]
  79. public string Status { get; set; }
  80. [EditorSequence(14)]
  81. public PDFDocumentLink BillOfLading { get; set; }
  82. [TimestampEditor(Editable = Editable.Disabled)]
  83. [EditorSequence(15)]
  84. [Aggregate(typeof(ConsignmentLastReceived))]
  85. public DateTime LastReceived { get; set; }
  86. [IntegerEditor(Visible = Visible.Optional, Editable = Editable.Hidden)]
  87. [Aggregate(typeof(ConsignmentUnreceivedItems))]
  88. public int UnreceivedItems { get; set; }
  89. [TimestampEditor] //(Editable = Editable.Disabled)]
  90. [EditorSequence(16)]
  91. //[Condition(typeof(ConsignmentClosed))]
  92. public DateTime Closed { get; set; }
  93. [NullEditor]
  94. [EditorSequence(17)]
  95. public EmployeeLink Employee { get; set; }
  96. [CurrencyEditor(Visible = Visible.Default, Summary = Summary.Sum)]
  97. [EditorSequence(18)]
  98. public double ExTax { get; set; }
  99. [RequiredColumn]
  100. [EditorSequence(19)]
  101. public TaxCodeLink TaxCode { get; set; }
  102. [EditorSequence(20)]
  103. [DoubleEditor(Visible = Visible.Default, Editable = Editable.Hidden)]
  104. public double TaxRate { get; set; }
  105. [EditorSequence(21)]
  106. [CurrencyEditor(Visible = Visible.Default, Summary = Summary.Sum)]
  107. public double Tax { get; set; }
  108. [EditorSequence(22)]
  109. [CurrencyEditor(Visible = Visible.Default, Summary = Summary.Sum)]
  110. public double IncTax { get; set; }
  111. [NullEditor]
  112. [EntityRelationship(DeleteAction.SetNull)]
  113. public BillLineLink BillLine { get; set; }
  114. static Consignment()
  115. {
  116. LinkedProperties.Register<Consignment, TaxCodeLink, double>(x => x.TaxCode, x => x.Rate, x => x.TaxRate);
  117. }
  118. private bool bChanging;
  119. protected override void DoPropertyChanged(string name, object? before, object? after)
  120. {
  121. if (bChanging)
  122. return;
  123. try
  124. {
  125. bChanging = true;
  126. if (name.Equals(nameof(ExTax)) && after is double extax)
  127. {
  128. Tax = extax * TaxCode.Rate / 100.0;
  129. IncTax = extax + Tax;
  130. }
  131. else if (name.Equals(nameof(TaxRate)) && after is double taxrate)
  132. {
  133. Tax = ExTax * taxrate / 100.0;
  134. IncTax = ExTax + Tax;
  135. }
  136. else if (name.Equals(nameof(Tax)) && after is double tax)
  137. {
  138. IncTax = ExTax + tax;
  139. }
  140. else if (name.Equals(nameof(IncTax)) && after is double inctax)
  141. {
  142. Tax = inctax / (100.0 + TaxCode.Rate) / 100.0;
  143. ExTax = inctax - Tax;
  144. }
  145. }
  146. finally
  147. {
  148. bChanging = false;
  149. }
  150. base.DoPropertyChanged(name, before, after);
  151. }
  152. }
  153. }