using System; using InABox.Core; namespace Comal.Classes { [UserTracking(typeof(Invoice))] public class InvoiceLine : Entity, IPersistent, IRemotable, ISequenceable, IOneToMany, ITaxable, ILicense { [NullEditor] [EntityRelationship(DeleteAction.Cascade)] public InvoiceLink InvoiceLink { get; set; } [MemoEditor] [EditorSequence(1)] public string Description { get; set; } [EditorSequence(2)] [DoubleEditor] public double Quantity { get; set; } = 1.0F; [EditorSequence(3)] [CurrencyEditor] public double Amount { get; set; } [EditorSequence(4)] [DoubleEditor(Summary = Summary.Sum)] public double ExTax { get; set; } [EditorSequence(5)] public TaxCodeLink TaxCode { get; set; } [EditorSequence(6)] [DoubleEditor(Editable = Editable.Hidden)] public double TaxRate { get; set; } [EditorSequence(7)] [DoubleEditor(Editable = Editable.Hidden, Summary = Summary.Sum)] public double Tax { get; set; } [EditorSequence(8)] [DoubleEditor(Summary = Summary.Sum)] public double IncTax { get; set; } private class JobScopeLookup : LookupDefinitionGenerator { public override Filter DefineFilter(InvoiceLine[] items) { if (items == null) return new Filter(x => x.ID).IsEqualTo(CoreUtils.FullGuid); var jobid = CoreUtils.FullGuid; foreach (var item in items) { if (jobid == CoreUtils.FullGuid) jobid = item.InvoiceLink.JobLink.ID; if (item.InvoiceLink.JobLink.ID != jobid) return new Filter(x => x.ID).IsEqualTo(CoreUtils.FullGuid); } return new Filter(x => x.Job.ID).IsEqualTo(jobid).And(x => x.Status.Approved).IsEqualTo(true); } public override Columns DefineFilterColumns() => new Columns(x => x.InvoiceLink.JobLink.ID); } [LookupDefinition(typeof(JobScopeLookup))] [EditorSequence(9)] public JobScopeLink Scope { get; set; } [EditorSequence(10)] public CostCentreLink CostCentre { get; set; } [NullEditor] public long Sequence { get; set; } static InvoiceLine() { LinkedProperties.Register(x => x.TaxCode, x => x.Rate, x => x.TaxRate); } private enum Suppress { This } protected override void DoPropertyChanged(string name, object? before, object? after) { base.DoPropertyChanged(name, before, after); if (EventSuppressor.IsSet(Suppress.This)) return; using (new EventSuppressor(Suppress.This)) { if (String.Equals(name, nameof(Quantity))) ExTax = (double)after * Amount; else if (String.Equals(name, nameof(Amount))) ExTax = (double)after * Quantity; else if (String.Equals(name, nameof(ExTax))) Amount = (double)after / (Quantity == 0.0F ? 1.0F : Quantity); } } } }