using System; using System.Collections.Generic; using System.Linq.Expressions; using InABox.Core; namespace Comal.Classes { public class QuoteProposalExTax : CoreAggregate { public override Expression> Aggregate => x => x.ExTax; public override AggregateCalculation Calculation => AggregateCalculation.Sum; public override Dictionary>, Expression>> Links => new Dictionary>, Expression>>() { { QuoteProposalCostSheet => QuoteProposalCostSheet.Proposal.ID, QuoteProposal => QuoteProposal.ID } }; } public class QuoteProposalTax : CoreAggregate { public override Expression> Aggregate => x => x.Tax; public override AggregateCalculation Calculation => AggregateCalculation.Sum; public override Dictionary>, Expression>> Links => new Dictionary>, Expression>>() { { QuoteProposalCostSheet => QuoteProposalCostSheet.Proposal.ID, QuoteProposal => QuoteProposal.ID } }; } public class QuoteProposalIncTax : CoreAggregate { public override Expression> Aggregate => x => x.IncTax; public override AggregateCalculation Calculation => AggregateCalculation.Sum; public override Dictionary>, Expression>> Links => new Dictionary>, Expression>>() { { QuoteProposalCostSheet => QuoteProposalCostSheet.Proposal.ID, QuoteProposal => QuoteProposal.ID } }; } [UserTracking(typeof(Quote))] public class QuoteProposal : Entity, IRemotable, IPersistent, IQuoteProposal, IOneToMany, ILicense { [NullEditor] [EntityRelationship(DeleteAction.Cascade)] public QuoteLink Quote { get; set; } [DateEditor(Visible = Visible.Default)] [EditorSequence(1)] public DateTime Date { get; set; } [TextBoxEditor(Visible = Visible.Default)] [EditorSequence(2)] public string Description { get; set; } [EditorSequence(3)] public double Price { get; set; } [EditorSequence(4)] public TaxCodeLink TaxCode { get; set; } [CheckBoxEditor] [EditorSequence(5)] public bool Default { get; set; } private class ExTaxFormula : ComplexFormulaGenerator { public override IComplexFormulaNode GetFormula() => If( x => x.Property(x => x.Price), Condition.Equals, x => Constant(0.0)) .Then(Aggregate(AggregateCalculation.Sum, x => x.Property(x => x.ExTax)).WithLink(x => x.Proposal.ID, x => x.ID)) .Else(Property(x => x.Price)); } [CurrencyEditor(Visible = Visible.Default, Editable = Editable.Hidden)] [ComplexFormula(typeof(ExTaxFormula))] public double ExTax { get; set; } private class TaxFormula : ComplexFormulaGenerator { public override IComplexFormulaNode GetFormula() => If( x => x.Property(x => x.Price), Condition.Equals, x => x.Constant(0.0)) .Then(Aggregate(AggregateCalculation.Sum, x => x.Property(x => x.Tax)).WithLink(x => x.Proposal.ID, x => x.ID)) .Else(Formula(FormulaOperator.Multiply, Property(x => x.Price), Property(x => x.TaxCode.Rate), Constant(0.01))); } [CurrencyEditor(Visible = Visible.Optional, Editable = Editable.Hidden)] [ComplexFormula(typeof(TaxFormula))] public double Tax { get; set; } private class IncTaxFormula : ComplexFormulaGenerator { public override IComplexFormulaNode GetFormula() => If( x => x.Property(x => x.Price), Condition.Equals, x => x.Constant(0.0)) .Then(Aggregate(AggregateCalculation.Sum, x => x.Property(x => x.IncTax)).WithLink(x => x.Proposal.ID, x => x.ID)) .Else(Formula(FormulaOperator.Add, Property(x => x.Price), Property(x => x.Tax))); } [CurrencyEditor(Visible = Visible.Optional, Editable = Editable.Hidden)] [ComplexFormula(typeof(IncTaxFormula))] public double IncTax { get; set; } [RichTextEditor(Visible = Visible.Hidden)] [EditorSequence("Preamble", 1)] public string Preamble { get; set; } [RichTextEditor(Visible = Visible.Hidden)] [EditorSequence("Summary", 1)] public string Summary { get; set; } [NullEditor] public long Sequence { get; set; } } }