using System; using System.Collections.Generic; using System.Linq.Expressions; using InABox.Core; namespace Comal.Classes { // public class InvoiceChargeableHours : CoreAggregate // { // public override Expression> Aggregate => x => x.ChargeableHours; // // public override AggregateCalculation Calculation => AggregateCalculation.Sum; // // public override Dictionary>, Expression>> Links => // new Dictionary>, Expression>>() // { // { Assignment => Assignment.Invoice.ID, Invoice => Invoice.ID } // }; // // public override Filter? Filter => new Filter(x => x.Chargeable).IsEqualTo(true); // } public class InvoiceExTax : CoreAggregate { public override Expression> Aggregate => x => x.ExTax; public override AggregateCalculation Calculation => AggregateCalculation.Sum; public override Dictionary>, Expression>> Links => new Dictionary>, Expression>>() { { InvoiceLine => InvoiceLine.InvoiceLink.ID, Invoice => Invoice.ID } }; } public class InvoiceTax : CoreAggregate { public override Expression> Aggregate => x => x.Tax; public override AggregateCalculation Calculation => AggregateCalculation.Sum; public override Dictionary>, Expression>> Links => new Dictionary>, Expression>>() { { InvoiceLine => InvoiceLine.InvoiceLink.ID, Invoice => Invoice.ID } }; } public class InvoiceIncTax : CoreAggregate { public override Expression> Aggregate => x => x.IncTax; public override AggregateCalculation Calculation => AggregateCalculation.Sum; public override Dictionary>, Expression>> Links => new Dictionary>, Expression>>() { { InvoiceLine => InvoiceLine.InvoiceLink.ID, Invoice => Invoice.ID } }; } public class InvoiceAmountPaid : CoreAggregate { public override Expression> Aggregate => x => x.Amount; public override AggregateCalculation Calculation => AggregateCalculation.Sum; public override Dictionary>, Expression>> Links => new Dictionary>, Expression>>() { { InvoiceReceipt => InvoiceReceipt.InvoiceLink.ID, Invoice => Invoice.ID } }; } public class InvoiceBalance : IFormula { public Expression> Value => x => x.IncTax; public Expression>[] Modifiers => new Expression>[] { x => x.AmountPaid }; public FormulaOperator Operator => FormulaOperator.Subtract; public FormulaType Type => FormulaType.Virtual; } [UserTracking("Accounts Receivable")] public class Invoice : Entity, IPersistent, IRemotable, INumericAutoIncrement, ILicense, IExportable, IPostable { [EditorSequence(1)] [IntegerEditor(Visible = Visible.Default, Editable = Editable.Enabled)] public int Number { get; set; } [EditorSequence(2)] [DateEditor(Visible = Visible.Default, TodayVisible = true)] public DateTime Date { get; set; } = DateTime.Today; [EditorSequence(3)] [MemoEditor(Visible = Visible.Default)] public string Description { get; set; } [EditorSequence(4)] public JobLink JobLink { get; set; } [EditorSequence(5)] public CustomerLink CustomerLink { get; set; } // [EditorSequence(6)] // [DurationEditor(Editable = Editable.Hidden)] // [Aggregate(typeof(InvoiceChargeableHours))] // public TimeSpan ChargeableHours { get; set; } [EditorSequence(7)] [CurrencyEditor(Editable = Editable.Hidden, Summary = Summary.Sum)] [Aggregate(typeof(InvoiceExTax))] public double ExTax { get; set; } [EditorSequence(8)] [CurrencyEditor(Editable = Editable.Hidden, Summary = Summary.Sum)] [Aggregate(typeof(InvoiceTax))] public double Tax { get; set; } [EditorSequence(9)] [CurrencyEditor(Visible = Visible.Default, Editable = Editable.Hidden, Summary = Summary.Sum)] [Aggregate(typeof(InvoiceIncTax))] public double IncTax { get; set; } [EditorSequence(10)] [CurrencyEditor(Editable = Editable.Hidden)] [Aggregate(typeof(InvoiceExTax))] public double Total { get; set; } [EditorSequence(11)] [CurrencyEditor(Editable = Editable.Hidden)] [Aggregate(typeof(InvoiceAmountPaid))] public double AmountPaid { get; set; } [EditorSequence(12)] [CurrencyEditor(Editable = Editable.Hidden, Summary = Summary.Sum)] [Formula(typeof(InvoiceBalance))] public double Balance { get; set; } [NullEditor] [LoggableProperty] public PostedStatus PostedStatus { get; set; } = PostedStatus.NeverPosted; [NullEditor] [LoggableProperty] public DateTime Posted { get; set; } [NullEditor] public string PostedNote { get; set; } [NullEditor] public string PostedReference { get; set; } public Expression> AutoIncrementField() { return x => x.Number; } public Filter? AutoIncrementFilter() { return null; } public override string ToString() { return string.Format("{0}: {1}", Number, Description); } protected override void DoPropertyChanged(string name, object? before, object? after) { base.DoPropertyChanged(name, before, after); if (name.Equals("IncTax")) Balance = (double)after - AmountPaid; else if (name.Equals("AmountPaid")) Balance = IncTax - (double)after; } } }