using EnVisage.Models; using System; using System.Collections.Generic; using System.Data.Entity; using System.Linq; using Resources; namespace EnVisage.Code.BLL { public class ExpenditureCategoryManager : ManagerBase { public ExpenditureCategoryManager(): base(null) { } public ExpenditureCategoryManager(EnVisageEntities dbContext): base(dbContext) { } protected override ExpenditureCategory InitInstance() { return new ExpenditureCategory { Id = Guid.NewGuid() }; } protected override ExpenditureCategory RetrieveReadOnlyById(Guid key) { return DataTable.AsNoTracking().FirstOrDefault(t => t.Id == key); } public override DbSet DataTable => DbContext.ExpenditureCategory; #region Public Methods /// /// Loads a Expenditure Category from the database. /// /// Unique identifier of the Expenditure Category. /// Indicates that object will not be saved later in the code. Use false if you need to save an updated object. /// A object retrieved from database. public override ExpenditureCategory Load(Guid? value, bool isReadOnly = true) { if (value == null || value == Guid.Empty) return new ExpenditureCategory(); return isReadOnly ? DbContext.ExpenditureCategory.AsNoTracking().FirstOrDefault(t => t.Id == value) : DbContext.ExpenditureCategory.Find(value); } public override ExpenditureCategory Save(ExpenditureCategoryModel model) { if (model == null) throw new ArgumentNullException(nameof(model)); #region Save ExpenditureCategory data ExpenditureCategory dbObj = null; if (model.Id != Guid.Empty) dbObj = DbContext.ExpenditureCategory.Find(model.Id); if (dbObj == null) { dbObj = new ExpenditureCategory { Id = Guid.NewGuid() }; } model.CopyTo(dbObj); dbObj.CGEFX = "CG"; if (model.Id == Guid.Empty) DbContext.ExpenditureCategory.Add(dbObj); else DbContext.Entry(dbObj).State = EntityState.Modified; #endregion if (IsContextLocal) DbContext.SaveChanges(); return dbObj; } public ExpenditureDetail GetExpenditureDetails(Guid categoryId) { if (categoryId == Guid.Empty) throw new ArgumentException(Messages.Commonl_ArgumentEmpty, nameof(categoryId)); var result = GetExpenditureDetails(true, new List { categoryId }); if (result.ContainsKey(categoryId)) return result[categoryId]; return null; } public Dictionary GetExpenditureDetails(bool withSuperExpCats = true, List categories = null) { var query = DbContext.VW_ExpenditureCategory.AsNoTracking().AsQueryable(); if (categories != null && categories.Count > 0) query = query.Where(x => categories.Contains(x.Id)); if (!withSuperExpCats) query = query.Where(x => x.AllowResourceAssignment); var result = query.AsParallel().Select(x => new ExpenditureDetail { ExpenditureCategoryId = x.Id, ExpenditureCategoryName = x.ExpCategoryWithCcName, UOMId = x.UOMId, UOMValue = x.UOMValue, CGEFX = x.CGEFX, CreditId = x.CreditId, GLId = x.GLId, SystemAttributeOne = x.SystemAttributeOne, SystemAttributeTwo = x.SystemAttributeTwo, Type = x.Type ?? 0, UseType = x.UseType ?? 1, AllowResourceAssignment = x.AllowResourceAssignment, }).ToDictionary(t => t.ExpenditureCategoryId); return result; } public Dictionary GetSuperExpenditureDetails(IEnumerable expenditures = null) { var query = (from e in DbContext.ExpenditureCategory.AsNoTracking() join f in DbContext.VW_ExpenditureCategory.AsNoTracking() on e.Id equals f.Id where !e.AllowResourceAssignment orderby f.ExpCategoryWithCcName select new ExpenditureDetail { ExpenditureCategoryId = e.Id, ExpenditureCategoryName = f.ExpCategoryWithCcName, UOMId = e.UOMId, UOMValue = e.UOM.UOMValue, CGEFX = e.CGEFX, CreditId = e.CreditId, GLId = e.GLId, SystemAttributeOne = e.SystemAttributeOne, SystemAttributeTwo = e.SystemAttributeTwo, Type = e.Type ?? 0, UseType = e.UseType ?? 1, AllowResourceAssignment = e.AllowResourceAssignment, }); if (expenditures?.Any() == true) query = query.Where(x => expenditures.Contains(x.ExpenditureCategoryId)); return query.ToDictionary(t => t.ExpenditureCategoryId.ToString()); } public List GetList(List categories = null) { return GetBasic(categories).ToList(); } public Dictionary GetAsDictionary(List categories = null) { return GetList(categories).ToDictionary(x => x.Id, g => g); } #endregion #region Private Methods private IQueryable GetBasic(List categories = null) { var query = DbContext.ExpenditureCategory.AsNoTracking().AsQueryable(); if (categories != null && categories.Count >= 0) query = query.Where(x => categories.Contains(x.Id)); return query; } #endregion } }