QuoteContract.cs 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Linq.Expressions;
  5. using InABox.Core;
  6. namespace Comal.Classes
  7. {
  8. [UserTracking(typeof(Quote))]
  9. public class QuoteContract : Entity, IRemotable, IPersistent, IQuoteContract, ILicense<QuotesManagementLicense>, IOneToMany<Quote>
  10. {
  11. [NullEditor]
  12. [EntityRelationship(DeleteAction.Cascade)]
  13. public QuoteLink Quote { get; set; }
  14. [TextBoxEditor]
  15. [EditorSequence(1)]
  16. public string Description { get; set; }
  17. [CurrencyEditor]
  18. [EditorSequence(2)]
  19. public double Price { get; set; }
  20. [EditorSequence(3)]
  21. public TaxCodeLink TaxCode { get; set; }
  22. private class ExTaxFormula : ComplexFormulaGenerator<QuoteContract, double>
  23. {
  24. public override IComplexFormulaNode<QuoteContract, double> GetFormula() => If<double>(
  25. x => x.Property(x => x.Price),
  26. Condition.Equals,
  27. x => Constant(0.0))
  28. .Then(Aggregate<QuoteContractProposal>(AggregateCalculation.Sum, x => x.Property(x => x.ExTax)).WithLink(x => x.Contract.ID, x => x.ID))
  29. .Else(Property(x => x.Price));
  30. }
  31. [CurrencyEditor(Editable = Editable.Hidden, Summary = Summary.Sum)]
  32. [ComplexFormula(typeof(ExTaxFormula))]
  33. public double ExTax { get; set; }
  34. private class TaxFormula : ComplexFormulaGenerator<QuoteContract, double>
  35. {
  36. public override IComplexFormulaNode<QuoteContract, double> GetFormula() => If<double>(
  37. x => x.Property(x => x.Price),
  38. Condition.Equals,
  39. x => x.Constant(0.0))
  40. .Then(Aggregate<QuoteContractProposal>(AggregateCalculation.Sum, x => x.Property(x => x.Tax)).WithLink(x => x.Proposal.ID, x => x.ID))
  41. .Else(Formula(FormulaOperator.Multiply, Property(x => x.Price), Property(x => x.TaxCode.Rate), Constant(0.01)));
  42. }
  43. [CurrencyEditor(Editable = Editable.Hidden, Summary = Summary.Sum)]
  44. [ComplexFormula(typeof(TaxFormula))]
  45. public double Tax { get; set; }
  46. private class IncTaxFormula : ComplexFormulaGenerator<QuoteContract, double>
  47. {
  48. public override IComplexFormulaNode<QuoteContract, double> GetFormula() => If<double>(
  49. x => x.Property(x => x.Price),
  50. Condition.Equals,
  51. x => x.Constant(0.0))
  52. .Then(Aggregate<QuoteContractProposal>(AggregateCalculation.Sum, x => x.Property(x => x.IncTax)).WithLink(x => x.Proposal.ID, x => x.ID))
  53. .Else(Formula(FormulaOperator.Add, Property(x => x.Price), Property(x => x.Tax)));
  54. }
  55. [CurrencyEditor(Visible = Visible.Default, Editable = Editable.Hidden, Summary = Summary.Sum)]
  56. [ComplexFormula(typeof(IncTaxFormula))]
  57. public double IncTax { get; set; }
  58. [DateTimeEditor]
  59. [EditorSequence(2)]
  60. public DateTime Confirmed { get; set; }
  61. private class QuoteContractJobScopeLookup : LookupDefinitionGenerator<JobScope, QuoteContract>
  62. {
  63. public override Filter<JobScope> DefineFilter(QuoteContract[] items)
  64. {
  65. if (items?.Any() != true)
  66. return LookupFactory.DefineFilter<JobScope>();
  67. return new Filter<JobScope>(x => x.Job.ID).IsEqualTo(items.First().Quote.Job.ID);
  68. }
  69. public override Columns<QuoteContract> DefineFilterColumns()
  70. => new Columns<QuoteContract>(ColumnTypeFlags.Required);
  71. }
  72. [LookupDefinition(typeof(QuoteContractJobScopeLookup))]
  73. [EditorSequence(3)]
  74. public JobScopeLink JobScope { get; set; }
  75. }
  76. }