PurchaseOrder.cs 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  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 PurchaseOrderDueDate : CoreAggregate<PurchaseOrder, PurchaseOrderItem, DateTime>
  8. // {
  9. // public override Expression<Func<PurchaseOrderItem, DateTime>> Aggregate => x => x.DueDate;
  10. //
  11. // public override AggregateCalculation Calculation => AggregateCalculation.Minimum;
  12. //
  13. // public override Filter<PurchaseOrderItem>? Filter => new Filter<PurchaseOrderItem>(c => c.DueDate).IsNotEqualTo(DateTime.MinValue);
  14. //
  15. // public override Dictionary<Expression<Func<PurchaseOrderItem, object>>, Expression<Func<PurchaseOrder, object>>> Links =>
  16. // new Dictionary<Expression<Func<PurchaseOrderItem, object>>, Expression<Func<PurchaseOrder, object>>>()
  17. // {
  18. // { PurchaseOrderItem => PurchaseOrderItem.PurchaseOrderLink.ID, PurchaseOrder => PurchaseOrder.ID }
  19. // };
  20. // }
  21. public class PurchaseOrderExTax : CoreAggregate<PurchaseOrder, PurchaseOrderItem, double>
  22. {
  23. public override Expression<Func<PurchaseOrderItem, double>> Aggregate => x => x.ExTax;
  24. public override AggregateCalculation Calculation => AggregateCalculation.Sum;
  25. public override Dictionary<Expression<Func<PurchaseOrderItem, object>>, Expression<Func<PurchaseOrder, object>>> Links =>
  26. new Dictionary<Expression<Func<PurchaseOrderItem, object>>, Expression<Func<PurchaseOrder, object>>>()
  27. {
  28. { PurchaseOrderItem => PurchaseOrderItem.PurchaseOrderLink.ID, PurchaseOrder => PurchaseOrder.ID }
  29. };
  30. }
  31. public class PurchaseOrderTax : CoreAggregate<PurchaseOrder, PurchaseOrderItem, double>
  32. {
  33. public override Expression<Func<PurchaseOrderItem, double>> Aggregate => x => x.Tax;
  34. public override AggregateCalculation Calculation => AggregateCalculation.Sum;
  35. public override Dictionary<Expression<Func<PurchaseOrderItem, object>>, Expression<Func<PurchaseOrder, object>>> Links =>
  36. new Dictionary<Expression<Func<PurchaseOrderItem, object>>, Expression<Func<PurchaseOrder, object>>>()
  37. {
  38. { PurchaseOrderItem => PurchaseOrderItem.PurchaseOrderLink.ID, PurchaseOrder => PurchaseOrder.ID }
  39. };
  40. }
  41. public class PurchaseOrderIncTax : CoreAggregate<PurchaseOrder, PurchaseOrderItem, double>
  42. {
  43. public override Expression<Func<PurchaseOrderItem, double>> Aggregate => x => x.IncTax;
  44. public override AggregateCalculation Calculation => AggregateCalculation.Sum;
  45. public override Dictionary<Expression<Func<PurchaseOrderItem, object>>, Expression<Func<PurchaseOrder, object>>> Links =>
  46. new Dictionary<Expression<Func<PurchaseOrderItem, object>>, Expression<Func<PurchaseOrder, object>>>()
  47. {
  48. { PurchaseOrderItem => PurchaseOrderItem.PurchaseOrderLink.ID, PurchaseOrder => PurchaseOrder.ID }
  49. };
  50. }
  51. public class PurchaseOrderBalance : CoreAggregate<PurchaseOrder, PurchaseOrderItem, double>
  52. {
  53. public override Expression<Func<PurchaseOrderItem, double>> Aggregate => x => x.Balance;
  54. public override AggregateCalculation Calculation => AggregateCalculation.Sum;
  55. public override Dictionary<Expression<Func<PurchaseOrderItem, object>>, Expression<Func<PurchaseOrder, object>>> Links =>
  56. new Dictionary<Expression<Func<PurchaseOrderItem, object>>, Expression<Func<PurchaseOrder, object>>>()
  57. {
  58. { PurchaseOrderItem => PurchaseOrderItem.PurchaseOrderLink.ID, PurchaseOrder => PurchaseOrder.ID }
  59. };
  60. }
  61. [UserTracking(typeof(Bill))]
  62. public class PurchaseOrder : Entity, IRemotable, IPersistent, IStringAutoIncrement<PurchaseOrder>, IOneToMany<Supplier>,
  63. ILicense<AccountsPayableLicense>
  64. {
  65. private bool bChanging;
  66. [UniqueCodeEditor(Visible = Visible.Default, Editable = Editable.Enabled)]
  67. [EditorSequence(0)]
  68. public string PONumber { get; set; }
  69. [EntityRelationship(DeleteAction.SetNull)]
  70. [EditorSequence(1)]
  71. public SupplierLink SupplierLink { get; set; }
  72. [MemoEditor]
  73. [EditorSequence(2)]
  74. public string Notes { get; set; }
  75. [EditorSequence(3)]
  76. public PurchaseOrderCategoryLink Category { get; set; }
  77. [EditorSequence(4)]
  78. public EmployeeLink RaisedBy { get; set; }
  79. [DateEditor]
  80. [EditorSequence(5)]
  81. public DateTime DueDate { get; set; }
  82. [EditorSequence(6)]
  83. public EmployeeLink IssuedBy { get; set; }
  84. [TimestampEditor]
  85. [EditorSequence(7)]
  86. public DateTime IssuedDate { get; set; }
  87. [TimestampEditor]
  88. [EditorSequence(8)]
  89. public DateTime ClosedDate { get; set; }
  90. [EditorSequence(9)]
  91. [DoubleEditor(Editable = Editable.Hidden, Summary = Summary.Sum)]
  92. [Aggregate(typeof(PurchaseOrderExTax))]
  93. public double ExTax { get; set; }
  94. [EditorSequence(10)]
  95. [DoubleEditor(Editable = Editable.Hidden, Summary = Summary.Sum)]
  96. [Aggregate(typeof(PurchaseOrderTax))]
  97. public double Tax { get; set; }
  98. [EditorSequence(11)]
  99. [DoubleEditor(Editable = Editable.Hidden, Summary = Summary.Sum)]
  100. [Aggregate(typeof(PurchaseOrderIncTax))]
  101. public double IncTax { get; set; }
  102. [EditorSequence(12)]
  103. [DoubleEditor(Editable = Editable.Hidden, Summary = Summary.Sum)]
  104. [Aggregate(typeof(PurchaseOrderBalance))]
  105. public double Balance { get; set; }
  106. [EditorSequence(13)]
  107. [EnumLookupEditor(typeof(PurchaseOrderStatus), Editable = Editable.Hidden)]
  108. public PurchaseOrderStatus Status { get; set; }
  109. //[CodeEditor(Visible = Visible.Default, Editable = Editable.Hidden)]
  110. [NullEditor]
  111. public string SupplierCode { get; set; }
  112. //[TextBoxEditor]
  113. [NullEditor]
  114. public string SupplierName { get; set; }
  115. public Expression<Func<PurchaseOrder, string>> AutoIncrementField()
  116. {
  117. return x => x.PONumber;
  118. }
  119. public Filter<PurchaseOrder> AutoIncrementFilter()
  120. {
  121. return null;
  122. }
  123. public string AutoIncrementFormat()
  124. {
  125. return "{0:D6}";
  126. }
  127. protected override void DoPropertyChanged(string name, object before, object after)
  128. {
  129. base.DoPropertyChanged(name, before, after);
  130. if (bChanging)
  131. return;
  132. bChanging = true;
  133. if (name.Equals("Status"))
  134. {
  135. var status = (PurchaseOrderStatus)after;
  136. if (status.Equals(PurchaseOrderStatus.Closed))
  137. {
  138. if (ClosedDate == DateTime.MinValue)
  139. ClosedDate = DateTime.Now;
  140. if (IssuedDate == DateTime.MinValue)
  141. IssuedDate = DateTime.Now;
  142. }
  143. else if (status == PurchaseOrderStatus.Issued)
  144. {
  145. if (ClosedDate != DateTime.MinValue)
  146. ClosedDate = DateTime.MinValue;
  147. if (IssuedDate == DateTime.MinValue)
  148. IssuedDate = DateTime.Now;
  149. }
  150. else
  151. {
  152. if (ClosedDate != DateTime.MinValue)
  153. ClosedDate = DateTime.MinValue;
  154. if (IssuedDate != DateTime.MinValue)
  155. IssuedDate = DateTime.MinValue;
  156. }
  157. }
  158. else
  159. {
  160. var closed = name.Equals("ClosedDate") ? (DateTime)after : ClosedDate;
  161. var issued = name.Equals("IssuedDate") ? (DateTime)after : IssuedDate;
  162. var status = PurchaseOrderStatus.Closed;
  163. if (closed != DateTime.MinValue)
  164. status = PurchaseOrderStatus.Closed;
  165. else if (issued != DateTime.MinValue)
  166. status = PurchaseOrderStatus.Issued;
  167. else
  168. status = PurchaseOrderStatus.Draft;
  169. if (Status != status)
  170. Status = status;
  171. }
  172. bChanging = false;
  173. }
  174. protected override void Init()
  175. {
  176. base.Init();
  177. SupplierLink = new SupplierLink(this);
  178. LinkProperty<SupplierLink, PurchaseOrder>(x => x.Code, x => x.SupplierCode);
  179. LinkProperty<SupplierLink, PurchaseOrder>(x => x.Name, x => x.SupplierName);
  180. IssuedBy = new EmployeeLink();
  181. RaisedBy = new EmployeeLink();
  182. Category = new PurchaseOrderCategoryLink();
  183. }
  184. }
  185. }