Bill.cs 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. using System;
  2. using System.Collections.Generic;
  3. using InABox.Core;
  4. namespace Comal.Classes
  5. {
  6. [UserTracking("Accounts Payable")]
  7. public class Bill : Entity, IPersistent, IRemotable, ILicense<AccountsPayableLicense>, IDataEntryInstance, IPostable, IExportable,
  8. IProblems<ManagedProblem>
  9. {
  10. [RequiredColumn]
  11. [EditorSequence(1)]
  12. [EntityRelationship(DeleteAction.Cascade)]
  13. public SupplierLink SupplierLink { get; set; }
  14. [EditorSequence(2)]
  15. [CodeEditor(Visible = Visible.Default, Editable = Editable.Enabled)]
  16. public string Number { get; set; }
  17. [EditorSequence(3)]
  18. [MemoEditor]
  19. public string Description { get; set; }
  20. [EditorSequence(4)]
  21. [DateEditor]
  22. public DateTime BillDate { get; set; }
  23. [EditorSequence(5)]
  24. [LookupDefinition(typeof(AccountsPayablePaymentTermsLookup<Bill>))]
  25. public PaymentTermsLink Terms { get; set; }
  26. [EditorSequence(6)]
  27. [DateEditor]
  28. public DateTime PaymentDate { get; set; }
  29. [EditorSequence(7)]
  30. [DateEditor]
  31. public DateTime AccountingDate { get; set; }
  32. [EditorSequence("Additional",1)]
  33. [TimestampEditor]
  34. public DateTime DataEntered { get; set; }
  35. [EditorSequence("Additional",2)]
  36. [TimestampEditor]
  37. [Security(typeof(CanCheckBills), Editable = Editable.Disabled)]
  38. public DateTime Checked { get; set; }
  39. [EditorSequence("Additional",3)]
  40. [TimestampEditor]
  41. [Security(typeof(CanApproveBills), Editable = Editable.Disabled)]
  42. public DateTime Approved { get; set; }
  43. [DoubleEditor(Editable = Editable.Hidden, Summary = Summary.Sum)]
  44. [Aggregate(typeof(BillExTax))]
  45. public double ExTax { get; set; }
  46. [DoubleEditor(Editable = Editable.Hidden, Summary = Summary.Sum)]
  47. [Aggregate(typeof(BillTax))]
  48. public double Tax { get; set; }
  49. [DoubleEditor(Editable = Editable.Hidden, Summary = Summary.Sum)]
  50. [Aggregate(typeof(BillIncTax))]
  51. public double IncTax { get; set; }
  52. [CurrencyEditor(Editable = Editable.Hidden, Summary = Summary.Sum)]
  53. [Aggregate(typeof(BillAmountPaid))]
  54. public double AmountPaid { get; set; }
  55. [CurrencyEditor(Editable = Editable.Hidden, Summary = Summary.Sum)]
  56. [Formula(typeof(BillBalance))]
  57. public double Balance { get; set; }
  58. [Aggregate(typeof(BillDocumentCount))]
  59. [IntegerEditor(Editable = Editable.Hidden)]
  60. public int Documents { get; set; }
  61. [NullEditor]
  62. [LoggableProperty]
  63. public DateTime Posted { get; set; }
  64. [NullEditor]
  65. [LoggableProperty]
  66. [RequiredColumn]
  67. public PostedStatus PostedStatus { get; set; }
  68. [NullEditor]
  69. public string PostedNote { get; set; }
  70. [NullEditor]
  71. public string PostedReference { get; set; }
  72. private static string BILLDATE = CoreUtils.GetFullPropertyName<Bill, DateTime>(x => x.BillDate, ".");
  73. private static string TERMSCALCULATION = CoreUtils.GetFullPropertyName<Bill, String>(x => x.Terms.Calculation, ".");
  74. private static string SUPPLIERLINKTERMSCALCULATION = CoreUtils.GetFullPropertyName<Bill, String>(x => x.SupplierLink.Terms.Calculation, ".");
  75. private static string AMOUNTPAID = CoreUtils.GetFullPropertyName<Bill, double>(x => x.AmountPaid, ".");
  76. private static string INCTAX = CoreUtils.GetFullPropertyName<Bill, double>(x => x.IncTax, ".");
  77. protected override void DoPropertyChanged(string name, object? before, object? after)
  78. {
  79. base.DoPropertyChanged(name, before, after);
  80. if (name.Equals(AMOUNTPAID))
  81. Balance = IncTax - (double)(after ?? 0.0);
  82. else if (name.Equals(INCTAX))
  83. Balance = (double)(after ?? 0.0) - AmountPaid;
  84. else if (name.Equals(BILLDATE))
  85. PaymentDate = CalculateTerms((DateTime)(after ?? ""),Terms.Calculation);
  86. else if (name.Equals(TERMSCALCULATION))
  87. PaymentDate = CalculateTerms(BillDate, (string)(after ?? ""));
  88. else if (name.Equals(SUPPLIERLINKTERMSCALCULATION))
  89. PaymentDate = CalculateTerms(BillDate, (string)(after ?? ""));
  90. }
  91. private DateTime CalculateTerms(DateTime date, string calculation)
  92. {
  93. if (string.IsNullOrWhiteSpace(calculation))
  94. return date;
  95. var variables = new Dictionary<string, object?>()
  96. {
  97. { "Date", date }
  98. };
  99. try
  100. {
  101. var expr = new CoreExpression(calculation);
  102. var eval = expr.Evaluate(variables);
  103. return (DateTime)(CoreUtils.ChangeType(eval, typeof(DateTime)) ?? date);
  104. }
  105. catch (Exception e)
  106. {
  107. Logger.Send(LogType.Information, "", $"Error in Formula: [{calculation}] ({e.Message})");
  108. return date;
  109. }
  110. }
  111. static Bill()
  112. {
  113. LinkedProperties.Register<Bill,PaymentTermsLink,Guid>(x=>x.SupplierLink.Terms,x=>x.ID, x=>x.Terms.ID);
  114. LinkedProperties.Register<Bill,PaymentTermsLink,String>(x=>x.SupplierLink.Terms,x=>x.Code, x=>x.Terms.Code);
  115. LinkedProperties.Register<Bill,PaymentTermsLink,String>(x=>x.SupplierLink.Terms,x=>x.Description, x=>x.Terms.Description);
  116. LinkedProperties.Register<Bill,PaymentTermsLink,String>(x=>x.SupplierLink.Terms,x=>x.Calculation, x=>x.Terms.Calculation);
  117. }
  118. //[NullEditor]
  119. //public string Issues { get; set; }
  120. [EditorSequence("Issues", 1)]
  121. public ManagedProblem Problem { get; set; }
  122. }
  123. }