using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; using System.Linq; using UnivateProperties_API.Containers.Timeshare; using UnivateProperties_API.Containers.Users; using UnivateProperties_API.Context; using UnivateProperties_API.Model.Timeshare; using UnivateProperties_API.Repository.Region; using UnivateProperties_API.Repository.Users; namespace UnivateProperties_API.Repository.Timeshare { public class WeekRepository : IRepository { private readonly DataContext _dbContext; public WeekRepository(DataContext dbContext) { _dbContext = dbContext; } public List Get(Func where) { return _dbContext.Weeks.Where(where).ToList(); } public List GetAll() { return _dbContext.Weeks.ToList(); } public TimeshareWeek GetDetailed(Func first) { var item = _dbContext.Weeks.FirstOrDefault(first); item = GetDetailedWeek(item); return item; } public List GetDtoListAll() { List list = new List(); foreach(var item in GetDetailedAll()) { list.Add(new WeekDto(item)); } return list; } public List GetMyWeeks(int userId) { List list = new List(); UserRepository userRepository = new UserRepository(_dbContext); var user = userRepository.Get(x => x.Id == userId).FirstOrDefault(); if(user.IsUserInRole(Role.SuperAdmin)) { foreach (var item in GetDetailedAll()) { list.Add(new WeekDto(item)); } } else if(user.IsUserInRole(Role.Agency)) { foreach (var item in GetDetailedAll().Where(x => x.AgencyId == userId)) { list.Add(new WeekDto(item)); } } else if (user.IsUserInRole(Role.Agent) || user.IsUserInRole(Role.ManagingAgent)) { foreach (var item in GetDetailedAll().Where(x => x.AgentId == userId)) { list.Add(new WeekDto(item)); } } else { foreach (var item in GetDetailedAll().Where(x => x.OwnerId == userId)) { list.Add(new WeekDto(item)); } } return list; } public List GetAvailResort() { List list = new List(); var allItems = GetDetailedAll(); foreach (var item in allItems) { if (item.Region != null) { if (!list.Any(x => x.RegionCode == item.Region.Code)) { list.Add(new RegionDto(item.Region.Code, item.Region.Description)); } foreach (var i in list.Where(x => x.RegionCode == item.Region.Code)) { i.TryAddResort(item.ResortCode, item.ResortName); } } } list = list.OrderBy(x => x.RegionName).ToList(); foreach(var region in list) { region.OrderResorts(); foreach(var resort in region.Resorts) { resort.Available = allItems.Count(x => x.ResortCode == resort.ResortCode); } } return list; } public List GetDetailedAll() { var list = GetAll(); List weeklist = new List(); foreach(var item in list) { weeklist.Add(GetDetailedWeek(item)); } return weeklist; } private TimeshareWeek GetDetailedWeek(TimeshareWeek week) { if(week.AgencyId != null) { AgencyRepository agency = new AgencyRepository(_dbContext); week.Agency = agency.Get(x => x.Id == week.AgencyId).FirstOrDefault(); } if(week.AgentId != null) { AgentRepository agent = new AgentRepository(_dbContext); week.Agent = agent.Get(x => x.Id == week.AgentId).FirstOrDefault(); } if (week.StatusId != 0) { StatusRepository status = new StatusRepository(_dbContext); week.Status = status.Get(x => x.Id == week.StatusId).FirstOrDefault(); } else { StatusRepository repo = new StatusRepository(_dbContext); week.Status = repo.GetDetailed(s => s.Code == "A1"); } if (week.RegionId != 0) { ProvinceRepository province = new ProvinceRepository(_dbContext); week.Region = province.Get(x => x.Id == week.RegionId).FirstOrDefault(); } if (week.OwnerId != 0) { IndividualRepository individual = new IndividualRepository(_dbContext); week.Owner = individual.Get(x => x.Id == week.OwnerId).FirstOrDefault(); } return week; } public void Insert(TimeshareWeek item) { item = GetDetailedWeek(item); item.Id = _dbContext.Weeks.Max(x => x.Id) + 1; if (item.Owner != null && item.Owner.Id == 0) { item.Owner.Id = _dbContext.Individuals.Max(x => x.Id) + 1; } // Set starting Status of A1 StatusRepository repo = new StatusRepository(_dbContext); item.Status = repo.GetDetailed(s => s.Code == "A1"); if(item.Status != null) { //Create initial item.Status = new Status() { Code = "A1", Description = "Pending verification", StatusType = StatusType.Timeshare, ModifiedBy = "KobusB" }; } item.Id = NewId(); _dbContext.Add(item); Save(); } public void Insert(IEnumerable items) { int id = NewId(); foreach (var item in items) { item.Id = id; _dbContext.Add(item); id += 1; } Save(); } public void Remove(TimeshareWeek item) { var i = _dbContext.Weeks.Find(item); _dbContext.Weeks.Remove(i); Save(); } public void Remove(IEnumerable items) { foreach (var item in items) { var i = _dbContext.Weeks.Find(item); _dbContext.Weeks.Remove(i); } Save(); } public void RemoveAtId(int item) { var i = _dbContext.Weeks.Find(item); _dbContext.Weeks.Remove(i); Save(); } public void Save() { _dbContext.SaveChanges(); } public void Update(TimeshareWeek item) { _dbContext.Entry(item).State = EntityState.Modified; Save(); } public List GetBy(WeekFilterDto week) { List item = GetDetailedAll(); if (!string.IsNullOrEmpty(week.RegionCode)) { item = item.Where(x => x.Region != null && x.Region.Code?.ToLower() == week.RegionCode.ToLower()).ToList(); } if (!string.IsNullOrEmpty(week.ResortCode)) { item = item.Where(x => x.ResortCode?.ToLower() == week.ResortCode).ToList(); } if (week.Date != null) { item = item.Where(x => x.ArrivalDate >= week.Date.Value.AddDays(-7) && x.DepartureDate <= week.Date.Value.AddDays(7)).ToList(); } if (week.MinAmount != null && week.MinAmount != 0) { item = item.Where(x => x.SellPrice >= week.MinAmount).ToList(); } if (week.MaxAmount != null && week.MaxAmount != 0) { item.Where(x => x.SellPrice <= week.MaxAmount).ToList(); } return item; } public int NewId() { int id = 0; if (_dbContext.Weeks.Count() > 0) { id = _dbContext.Weeks.Max(x => x.Id); } id += 1; return id; } } }