using System; using System.Linq; using System.Linq.Expressions; using InABox.Core; using PRSClasses; namespace Comal.Classes { [UserTracking(typeof(Requisition))] public class RequisitionItem : StockEntity, IPersistent, IRemotable, INumericAutoIncrement, IOneToMany, IOneToMany , ILicense, IJobMaterial, IJobScopedItem { [IntegerEditor(Editable = Editable.Hidden)] [NullEditor] public int Sequence { get; set; } [EntityRelationship(DeleteAction.Cascade)] [NullEditor] public RequisitionLink RequisitionLink { get; set; } [NullEditor] [Obsolete("Replaced With JobLink", true)] public JobLink Job { get; set; } [EntityRelationship(DeleteAction.Cascade)] [NullEditor] public JobLink JobLink { get; set; } [EditorSequence(1)] [RequiredColumn] public override ProductLink Product { get; set; } [EditorSequence(3)] [CodeEditor(Visible = Visible.Optional)] public string Code { get; set; } [MemoEditor] [EditorSequence(4)] public string Description { get; set; } [EditorSequence(5)] [RequiredColumn] public ProductStyleLink Style { get; set; } [EditorSequence(6)] [RequiredColumn] [DimensionsEditor(typeof(StockDimensions), AllowEditingUnit = false)] public override StockDimensions Dimensions { get; set; } [EditorSequence(7)] public double Quantity { get; set; } [EditorSequence(8)] public double ActualQuantity { get; set; } private class StockLocationLookup : LookupDefinitionGenerator { public override Filter DefineFilter(RequisitionItem[] items) { var productid = items.Select(x => x.Product.ID).FirstOrDefault(); var styleid = items.Select(x => x.Style.ID).FirstOrDefault(); var unitsize = items.Select(x => x.Dimensions.UnitSize).FirstOrDefault(); var result = new Filter(x => x.ID).InQuery( new Filter(x => x.Product.ID).IsEqualTo(productid) .And(x=>x.Style.ID).IsEqualTo(styleid) .And(x=>x.Dimensions.UnitSize).IsEqualTo(unitsize) .And(x => x.Qty).IsGreaterThan(0.0F), x => x.Location.ID); return result; } public override Columns DefineFilterColumns() => new Columns(x => x.Product.ID).Add(x => x.Style.ID); } [LookupDefinition(typeof(StockLocationLookup))] [EditorSequence(9)] [RequiredColumn] public StockLocationLink Location { get; set; } [EditorSequence(10)] [RequiredColumn] public JobRequisitionItemLink JobRequisitionItem { get; set; } [EditorSequence(11)] [TimestampEditor] public DateTime Picked { get; set; } [EditorSequence("Image",1)] [DataModelTableName("Image")] public ImageDocumentLink Image { get; set; } [NullEditor] public string BarCode { get; set; } [NullEditor] public InvoiceLink Invoice { get; set; } private class JobScopeLookup : LookupDefinitionGenerator { public override Filter DefineFilter(RequisitionItem[] items) { var item = items?.Length == 1 ? items[0] : null; if (item != null) return new Filter(x => x.Job.ID).IsEqualTo(item.RequisitionLink.JobLink.ID).And(x => x.Status.Approved).IsEqualTo(true); return new Filter(x => x.ID).None(); } public override Columns DefineFilterColumns() => new Columns(x=>x.RequisitionLink.JobLink.ID); } [LookupDefinition(typeof(JobScopeLookup))] [EditorSequence("Processing",1)] public JobScopeLink JobScope { get; set; } [EditorSequence("Processing",2)] public ActualCharge Charge { get; set; } public Expression> AutoIncrementField() { return x => x.Sequence; } public Filter AutoIncrementFilter() { return new Filter(x => x.RequisitionLink.ID).IsEqualTo(RequisitionLink.ID); } static RequisitionItem() { LinkedProperties.Register(x => x.Product, x => x.Code, x => x.Code); LinkedProperties.Register(x => x.Product, x => x.Name, x => x.Description); LinkedProperties.Register(x => x.Product, x => x.Charge.Chargeable, x => x.Charge.Chargeable); LinkedProperties.Register(x=>x.Product.DefaultInstance.Style, x => x.ID, x => x.Style.ID); LinkedProperties.Register(x=>x.Product.DefaultLocation, x => x.ID, x => x.Location.ID); StockEntity.LinkStockDimensions(); LinkedProperties.Register(x=>x.RequisitionLink.JobLink, x => x.ID, x => x.JobLink.ID); LinkedProperties.Register(x=>x.RequisitionLink.JobScope, x => x.ID, x => x.JobScope.ID); Classes.JobScope.LinkScopeProperties(); } } }