EnVisageOnline/Main/Source/EnVisage/Code/BLL/ExpenditureCategoryManager.cs

168 lines
5.6 KiB
C#

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<ExpenditureCategory, ExpenditureCategoryModel>
{
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<ExpenditureCategory> DataTable => DbContext.ExpenditureCategory;
#region Public Methods
/// <summary>
/// Loads a Expenditure Category from the database.
/// </summary>
/// <param name="value">Unique identifier of the Expenditure Category.</param>
/// <param name="isReadOnly">Indicates that object will not be saved later in the code. Use <b>false</b> if you need to save an updated object.</param>
/// <returns>A <see cref="ExpenditureCategory"/> object retrieved from database.</returns>
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<Guid> { categoryId });
if (result.ContainsKey(categoryId))
return result[categoryId];
return null;
}
public Dictionary<Guid, ExpenditureDetail> GetExpenditureDetails(bool withSuperExpCats = true, List<Guid> 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<string, ExpenditureDetail> GetSuperExpenditureDetails(IEnumerable<Guid> 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<ExpenditureCategory> GetList(List<Guid> categories = null)
{
return GetBasic(categories).ToList();
}
public Dictionary<Guid, ExpenditureCategory> GetAsDictionary(List<Guid> categories = null)
{
return GetList(categories).ToDictionary(x => x.Id, g => g);
}
#endregion
#region Private Methods
private IQueryable<ExpenditureCategory> GetBasic(List<Guid> 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
}
}