using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Comal.Classes; using InABox.Core; using InABox.Database; namespace Comal.Stores { public class UserPlatform { public string UserID { get; set; } public string Platform { get; set; } public string Version { get; set; } } public static class PlatformCache { static PlatformCache() { Platforms = new List(); } public static List Platforms { get; } } public class BaseStore : Store where T : Entity, new() { protected override Filter PrepareFilter(Filter filter) { CheckPlatformVersion(); return base.PrepareFilter(filter); } protected override void BeforeSave(T entity) { CheckPlatformVersion(); base.BeforeSave(entity); } protected override void BeforeDelete(T entity) { CheckPlatformVersion(); base.BeforeDelete(entity); } private void CheckPlatformVersion() { if (string.IsNullOrEmpty(UserID) || string.IsNullOrEmpty(Platform) || string.IsNullOrEmpty(Version)) return; var platform = PlatformCache.Platforms.FirstOrDefault(x => x.UserID.Equals(UserID) && x.Platform.Equals(Platform)); if (platform == null) { platform = new UserPlatform { UserID = UserID, Platform = Platform, Version = "???" }; PlatformCache.Platforms.Add(platform); } if (!platform.Version.Equals(Version)) { platform.Version = Version; var prop = DatabaseSchema.Property(typeof(User), Platform); if (prop != null && prop.Getter() != null && prop.Setter() != null) { var user = Provider.Load(new Filter(x => x.UserID).IsEqualTo(UserID)).FirstOrDefault(); if (user != null) { var value = prop.Getter().Invoke(user); if (!Version.Equals(value)) { prop.Setter().Invoke(user, Version); Provider.Save(user); } } } } } protected void EnsureJobMaterials(ProductLink product, JobLink job, ProductStyleLink style, StockDimensions dimensions) { // if (product.ID == Guid.Empty || job.ID == Guid.Empty) // return; // // var jobmaterials = Provider.List( // new Filter(x => x.Product.ID).IsEqualTo(product.ID) // .And(x => x.Job.ID).IsEqualTo(job.ID) // .And(x => x.Style.ID).IsEqualTo(style.ID) // .And(x => x.Dimensions.Unit.ID).IsEqualTo(dimensions.Unit.ID) // .And(x => x.Dimensions.Length).IsEqualTo(dimensions.Length) // .And(x => x.Dimensions.Width).IsEqualTo(dimensions.Width) // .And(x => x.Dimensions.Height).IsEqualTo(dimensions.Height) // .And(x => x.Dimensions.Weight).IsEqualTo(dimensions.Weight) // , // new Columns(x => x.ID) // ); // if (!jobmaterials.Any()) // { // var material = new JobMaterial(); // material.Product.ID = product.ID; // material.Job.ID = job.ID; // material.Style.ID = style.ID; // material.Dimensions.CopyFrom(dimensions); // Provider.Save(material); // } } protected void CleanupJobMaterials(Guid id, ProductLink Product, JobLink Job, ProductStyleLink Style, StockDimensions Dimensions, bool delete) { // if (Product.ID == Guid.Empty || Job.ID == Guid.Empty) // return; // // var hasProduct = !delete && Product.HasOriginalValue(x=>x.ID); // var hasJob = !delete && Job.HasOriginalValue(x=>x.ID); // var hasStyle = !delete && Style.HasOriginalValue(x=>x.ID); // var hasUnit = !delete && Dimensions.HasOriginalValue(x=>x.Unit.ID); // var hasLength = !delete && Dimensions.HasOriginalValue(x => x.Length); // var hasWidth = !delete && Dimensions.HasOriginalValue(x => x.Width); // var hasHeight = !delete && Dimensions.HasOriginalValue(x => x.Height); // var hasWeight = !delete && Dimensions.HasOriginalValue(x => x.Weight); // if (delete || hasProduct || hasJob || hasStyle || hasUnit || hasLength || hasWidth || hasHeight || hasWeight) // { // var productid = hasProduct ? Product.GetOriginalValue(x=>x.ID) : Product.ID; // var jobid = hasJob ? Job.GetOriginalValue(x=>x.ID) : Job.ID; // var styleid = hasStyle ? Style.GetOriginalValue(x=>x.ID) : Style.ID; // var unitid = hasUnit ? Dimensions.GetOriginalValue(x=>x.Unit.ID) : Dimensions.Unit.ID; // var length = hasLength ? Dimensions.GetOriginalValue(x=>x.Length) : Dimensions.Length; // var width = hasWidth ? Dimensions.GetOriginalValue(x=>x.Width) : Dimensions.Width; // var height = hasHeight ? Dimensions.GetOriginalValue(x=>x.Height) : Dimensions.Height; // var weight = hasWeight ? Dimensions.GetOriginalValue(x=>x.Weight) : Dimensions.Weight; // // var bomtask = Task.Run(() => // { // return Provider.List( // new Filter(x => x.Product.ID).IsEqualTo(productid) // .And(x => x.Job.ID).IsEqualTo(jobid) // .And(x => x.Style.ID).IsEqualTo(styleid) // .And(x => x.ID).IsNotEqualTo(id) // .And(x => x.Dimensions.Unit.ID).IsEqualTo(unitid) // .And(x => x.Dimensions.Length).IsEqualTo(length) // .And(x => x.Dimensions.Width).IsEqualTo(width) // .And(x => x.Dimensions.Height).IsEqualTo(height) // .And(x => x.Dimensions.Weight).IsEqualTo(weight) // , // new Columns(x => x.ID) // ).Any(); // }); // // var reqtask = Task.Run(() => // { // return Provider.List( // new Filter(x => x.Product.ID).IsEqualTo(productid) // .And(x => x.Requisition.Job.ID).IsEqualTo(jobid) // .And(x => x.Style.ID).IsEqualTo(styleid) // .And(x => x.ID).IsNotEqualTo(id) // .And(x => x.Dimensions.Unit.ID).IsEqualTo(unitid) // .And(x => x.Dimensions.Length).IsEqualTo(length) // .And(x => x.Dimensions.Width).IsEqualTo(width) // .And(x => x.Dimensions.Height).IsEqualTo(height) // .And(x => x.Dimensions.Weight).IsEqualTo(weight) // , // new Columns(x => x.ID) // ).Any(); // }); // // var movetask = Task.Run(() => // { // return Provider.List( // new Filter(x => x.Product.ID).IsEqualTo(productid) // .And(x => x.Job.ID).IsEqualTo(jobid) // .And(x => x.Style.ID).IsEqualTo(styleid) // .And(x => x.ID).IsNotEqualTo(id) // .And(x => x.Dimensions.Unit.ID).IsEqualTo(unitid) // .And(x => x.Dimensions.Length).IsEqualTo(length) // .And(x => x.Dimensions.Width).IsEqualTo(width) // .And(x => x.Dimensions.Height).IsEqualTo(height) // .And(x => x.Dimensions.Weight).IsEqualTo(weight) // , // new Columns(x => x.ID) // ).Any(); // }); // // var potask = Task.Run(() => // { // return Provider.List( // new Filter(x => x.ProductLink.ID).IsEqualTo(productid) // .And(x => x.Job.ID).IsEqualTo(jobid) // .And(x => x.StyleLink.ID).IsEqualTo(styleid) // .And(x => x.ID).IsNotEqualTo(id) // .And(x => x.Dimensions.Unit.ID).IsEqualTo(unitid) // .And(x => x.Dimensions.Length).IsEqualTo(length) // .And(x => x.Dimensions.Width).IsEqualTo(width) // .And(x => x.Dimensions.Height).IsEqualTo(height) // .And(x => x.Dimensions.Weight).IsEqualTo(weight) // , // new Columns(x => x.ID) // ).Any(); // }); // // Task.WaitAll(bomtask, reqtask, movetask, potask); // // if (bomtask.Result || reqtask.Result || movetask.Result || potask.Result) // return; // // var remove = Provider.Query( // new Filter(x => x.Product.ID).IsEqualTo(productid) // .And(x => x.Job.ID).IsEqualTo(jobid) // .And(x => x.Style.ID).IsEqualTo(styleid) // .And(x => x.Dimensions.Unit.ID).IsEqualTo(unitid) // .And(x => x.Dimensions.Length).IsEqualTo(length) // .And(x => x.Dimensions.Width).IsEqualTo(width) // .And(x => x.Dimensions.Height).IsEqualTo(height) // .And(x => x.Dimensions.Weight).IsEqualTo(weight) // , // new Columns(x => x.ID) // ).Rows.Select(x => x.ToObject()); // // Provider.Delete(remove); // } } protected void UnlinkTrackingKanban(TEntity entity) where TEntityKanban : EntityKanban, new() where TEntity : Entity where TEntityLink : IEntityLink, new() { var kanbans = Provider.Query( new Filter(x => x.Entity.ID).IsEqualTo(entity.ID).And(x => x.Kanban.Locked).IsEqualTo(true), new Columns( x => x.Entity.ID, x => x.Kanban.ID, x => x.Kanban.Locked ) ); if (!kanbans.Rows.Any()) return; var kanban = kanbans.Rows.First().ToObject(x => x.Kanban); kanban.Locked = false; Provider.Save(kanban); } protected void UpdateTrackingKanban(TEntity entity, Func category) where TEntityKanban : EntityKanban, new() where TEntity : Entity where TEntityLink : IEntityLink, new() { var kanbans = Provider.Query( new Filter(x => x.Entity.ID).IsEqualTo(entity.ID), new Columns( x => x.Entity.ID, x => x.Kanban.ID, x => x.Kanban.Category, x => x.Kanban.Closed, x => x.Kanban.Completed, x => x.Kanban.EmployeeLink.ID, x => x.Kanban.Notes, x => x.Kanban.DueDate, x => x.Kanban.Title, x => x.Kanban.Summary ) ); if (!kanbans.Rows.Any()) return; var oldcategory = Kanban.StringToCategory(kanbans.Rows.First().Get(c => c.Kanban.Category)); var newcategory = category(entity); if (!Equals(newcategory, oldcategory)) { var kanban = kanbans.Rows.First().ToObject(x => x.Kanban); kanban.Category = Kanban.CategoryToString(newcategory); var notes = kanban.Notes.ToList(); notes.Add(string.Format("{0:yyyy-MM-dd HH:mm:ss} {1}: {2}", DateTime.Now, UserID, "Task Status updated by Requisition Progress")); kanban.Notes = notes.ToArray(); kanban.Locked = true; FindSubStore().Save(kanban, "Updated due to Requisition Status Change"); } } protected void NotifyEmployee( TEntity entity, Func employeeid, Func filter, Func title, Func body ) where TEntity : Entity { if (!filter(entity)) return; var employees = Provider.Query( new Filter(x => x.ID).IsEqualTo(employeeid(entity)).Or(x => x.UserLink.ID).IsEqualTo(UserGuid), new Columns(x => x.ID).Add(x => x.UserLink.ID).Add(x => x.Name) ).Rows.Select(r => new Tuple( r.Get(c => c.ID), r.Get(c => c.UserLink.ID), r.Get(c => c.Name) ) ); var recipient = employees.FirstOrDefault(x => Equals(x.Item1, employeeid(entity))); var sender = employees.FirstOrDefault(x => Equals(x.Item2, UserGuid)); if (recipient == null || sender == null) return; if (recipient.Item2 == UserGuid) return; var notification = new Notification(); notification.Employee.ID = recipient.Item1; notification.Sender.ID = sender.Item1; notification.Title = title(entity); var sb = new StringBuilder(); sb.AppendLine(string.Format("Dear {0},\n", recipient.Item3.Split(' ').First())); sb.Append(body.Invoke(entity)); if (sender != null) sb.AppendLine(string.Format("\n\nRegards,\n{0}.", sender.Item3.Split(' ').First())); notification.Description = sb.ToString(); notification.EntityType = typeof(TEntity).EntityName(); notification.EntityID = entity.ID; FindSubStore().Save(notification, ""); } } }