using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using InABox.Core; namespace Comal.Classes { // public class PurchaseOrderDueDate : CoreAggregate // { // public override Expression> Aggregate => x => x.DueDate; // // public override AggregateCalculation Calculation => AggregateCalculation.Minimum; // // public override Filter? Filter => new Filter(c => c.DueDate).IsNotEqualTo(DateTime.MinValue); // // public override Dictionary>, Expression>> Links => // new Dictionary>, Expression>>() // { // { PurchaseOrderItem => PurchaseOrderItem.PurchaseOrderLink.ID, PurchaseOrder => PurchaseOrder.ID } // }; // } public class PurchaseOrderExTax : CoreAggregate { public override Expression> Aggregate => x => x.ExTax; public override AggregateCalculation Calculation => AggregateCalculation.Sum; public override Dictionary>, Expression>> Links => new Dictionary>, Expression>>() { { PurchaseOrderItem => PurchaseOrderItem.PurchaseOrderLink.ID, PurchaseOrder => PurchaseOrder.ID } }; } public class PurchaseOrderTax : CoreAggregate { public override Expression> Aggregate => x => x.Tax; public override AggregateCalculation Calculation => AggregateCalculation.Sum; public override Dictionary>, Expression>> Links => new Dictionary>, Expression>>() { { PurchaseOrderItem => PurchaseOrderItem.PurchaseOrderLink.ID, PurchaseOrder => PurchaseOrder.ID } }; } public class PurchaseOrderIncTax : CoreAggregate { public override Expression> Aggregate => x => x.IncTax; public override AggregateCalculation Calculation => AggregateCalculation.Sum; public override Dictionary>, Expression>> Links => new Dictionary>, Expression>>() { { PurchaseOrderItem => PurchaseOrderItem.PurchaseOrderLink.ID, PurchaseOrder => PurchaseOrder.ID } }; } public class PurchaseOrderBalance : CoreAggregate { public override Expression> Aggregate => x => x.Balance; public override AggregateCalculation Calculation => AggregateCalculation.Sum; public override Dictionary>, Expression>> Links => new Dictionary>, Expression>>() { { PurchaseOrderItem => PurchaseOrderItem.PurchaseOrderLink.ID, PurchaseOrder => PurchaseOrder.ID } }; } [UserTracking(typeof(Bill))] public class PurchaseOrder : Entity, IRemotable, IPersistent, IStringAutoIncrement, IOneToMany, ILicense { private bool bChanging; [UniqueCodeEditor(Visible = Visible.Default, Editable = Editable.Enabled)] [EditorSequence(0)] public string PONumber { get; set; } [EntityRelationship(DeleteAction.SetNull)] [EditorSequence(1)] public SupplierLink SupplierLink { get; set; } [MemoEditor] [EditorSequence(2)] public string Notes { get; set; } [EditorSequence(3)] public PurchaseOrderCategoryLink Category { get; set; } [EditorSequence(4)] public EmployeeLink RaisedBy { get; set; } [DateEditor] [EditorSequence(5)] public DateTime DueDate { get; set; } [EditorSequence(6)] public EmployeeLink IssuedBy { get; set; } [TimestampEditor] [EditorSequence(7)] public DateTime IssuedDate { get; set; } [TimestampEditor] [EditorSequence(8)] public DateTime ClosedDate { get; set; } [EditorSequence(9)] [DoubleEditor(Editable = Editable.Hidden, Summary = Summary.Sum)] [Aggregate(typeof(PurchaseOrderExTax))] public double ExTax { get; set; } [EditorSequence(10)] [DoubleEditor(Editable = Editable.Hidden, Summary = Summary.Sum)] [Aggregate(typeof(PurchaseOrderTax))] public double Tax { get; set; } [EditorSequence(11)] [DoubleEditor(Editable = Editable.Hidden, Summary = Summary.Sum)] [Aggregate(typeof(PurchaseOrderIncTax))] public double IncTax { get; set; } [EditorSequence(12)] [DoubleEditor(Editable = Editable.Hidden, Summary = Summary.Sum)] [Aggregate(typeof(PurchaseOrderBalance))] public double Balance { get; set; } [EditorSequence(13)] [EnumLookupEditor(typeof(PurchaseOrderStatus), Editable = Editable.Hidden)] public PurchaseOrderStatus Status { get; set; } //[CodeEditor(Visible = Visible.Default, Editable = Editable.Hidden)] [NullEditor] public string SupplierCode { get; set; } //[TextBoxEditor] [NullEditor] public string SupplierName { get; set; } public Expression> AutoIncrementField() { return x => x.PONumber; } public Filter AutoIncrementFilter() { return null; } public string AutoIncrementFormat() { return "{0:D6}"; } protected override void DoPropertyChanged(string name, object before, object after) { base.DoPropertyChanged(name, before, after); if (bChanging) return; bChanging = true; if (name.Equals("Status")) { var status = (PurchaseOrderStatus)after; if (status.Equals(PurchaseOrderStatus.Closed)) { if (ClosedDate == DateTime.MinValue) ClosedDate = DateTime.Now; if (IssuedDate == DateTime.MinValue) IssuedDate = DateTime.Now; } else if (status == PurchaseOrderStatus.Issued) { if (ClosedDate != DateTime.MinValue) ClosedDate = DateTime.MinValue; if (IssuedDate == DateTime.MinValue) IssuedDate = DateTime.Now; } else { if (ClosedDate != DateTime.MinValue) ClosedDate = DateTime.MinValue; if (IssuedDate != DateTime.MinValue) IssuedDate = DateTime.MinValue; } } else { var closed = name.Equals("ClosedDate") ? (DateTime)after : ClosedDate; var issued = name.Equals("IssuedDate") ? (DateTime)after : IssuedDate; var status = PurchaseOrderStatus.Closed; if (closed != DateTime.MinValue) status = PurchaseOrderStatus.Closed; else if (issued != DateTime.MinValue) status = PurchaseOrderStatus.Issued; else status = PurchaseOrderStatus.Draft; if (Status != status) Status = status; } bChanging = false; } protected override void Init() { base.Init(); SupplierLink = new SupplierLink(this); LinkProperty(x => x.Code, x => x.SupplierCode); LinkProperty(x => x.Name, x => x.SupplierName); IssuedBy = new EmployeeLink(); RaisedBy = new EmployeeLink(); Category = new PurchaseOrderCategoryLink(); } public static void UpdateCosts(IEnumerable items, Guid supplierid, Dictionary changes) { void UpdateValue(PurchaseOrderItem item,Expression> property, TType value) { CoreUtils.MonitorChanges( item, () => CoreUtils.SetPropertyValue(item, CoreUtils.GetFullPropertyName(property, "."), value), changes ); } var productids = items.Where(x => x.Product.ID != Guid.Empty).Select(x => x.Product.ID).ToArray(); MultiQuery query = new MultiQuery(); query.Add( new Filter(x=>x.SupplierLink.ID).IsEqualTo(supplierid) .And(x=>x.ProductLink.ID).InList(productids) .And(x=>x.Dimensions.UnitSize).IsEqualTo(items.First().Dimensions.UnitSize), new Columns(x=>x.ProductLink.ID) .Add(x=>x.Job.ID) .Add(x=>x.CostPrice) .Add(x=>x.SupplierCode) .Add(x=>x.SupplierDescription) .Add(x=>x.Dimensions.Value) ); query.Add( new Filter(x=>x.ID).InList(productids), new Columns(x=>x.ID) .Add(x=>x.NettCost) .Add(x=>x.Code) .Add(x=>x.Name) .Add(x=>x.Dimensions.Value) ); query.Query(); foreach (var item in items) { CoreRow? row = query.Get()?.Rows.FirstOrDefault(r => (r.Get(c => c.ProductLink.ID) == item.Product.ID) && (r.Get(c => c.Job.ID) == item.Job.ID) ); if (row == null) row = query.Get()?.Rows.FirstOrDefault(r => (r.Get(c => c.ProductLink.ID) == item.Product.ID) && (r.Get(c => c.Job.ID) == Guid.Empty) ); if (row != null) { UpdateValue(item, x => x.SupplierCode, row.Get(c => c.SupplierCode)); UpdateValue(item, x => x.Description, row.Get(c => c.SupplierDescription)); UpdateValue(item, x => x.Cost, row.Get(c => c.CostPrice)); } else { row = query.Get()?.Rows.FirstOrDefault(r => (r.Get(c => c.ID) == item.Product.ID) ); if (row != null) { UpdateValue(item, x => x.SupplierCode, row.Get(c => c.Code)); UpdateValue(item, x => x.Description, row.Get(c => c.Name)); if (String.Equals(row.Get(c=>c.Dimensions.UnitSize),items.First().Dimensions.UnitSize)) UpdateValue(item, x => x.Cost, row.Get(c => c.NettCost)); else UpdateValue(item, x => x.Cost, 0.0F); } else { UpdateValue(item, x => x.SupplierCode, ""); UpdateValue(item, x => x.Description, ""); UpdateValue(item, x => x.Cost, 0.0F); } } } } } }