| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188 | using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using UnivateProperties_API.Containers.Timeshare;
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<TimeshareWeek>
    {
        private readonly DataContext _dbContext;
        public WeekRepository(DataContext dbContext)
        {
            _dbContext = dbContext;
        }
        public List<TimeshareWeek> Get(Func<TimeshareWeek, bool> where)
        {
            return _dbContext.Weeks.Where(where).ToList();
        }
        public List<TimeshareWeek> GetAll()
        {
            return _dbContext.Weeks.ToList();
        }
        public TimeshareWeek GetDetailed(Func<TimeshareWeek, bool> first)
        {
            var item = _dbContext.Weeks.FirstOrDefault(first);
            item = GetDetailedWeek(item);
            return item;
        }
        public List<WeekDto> GetDtoListAll()
        {
            List<WeekDto> list = new List<WeekDto>();
            foreach(var item in GetDetailedAll())
            {
                list.Add(new WeekDto(item));
            }
            return list;
        }
        public List<TimeshareWeek> GetDetailedAll()
        {
            var list = GetAll();
            List<TimeshareWeek> weeklist = new List<TimeshareWeek>();
            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();
            }
            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"
                };
            }            
            _dbContext.Add(item);           
            Save();
        }
        public void Insert(IEnumerable<TimeshareWeek> items)
        {
            foreach (var item in items)
            {
                _dbContext.Add(item);
            }
            Save();
        }
        public void Remove(TimeshareWeek item)
        {
            var i = _dbContext.Weeks.Find(item);
            _dbContext.Weeks.Remove(i);
            Save();
        }
        public void Remove(IEnumerable<TimeshareWeek> 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<TimeshareWeek> GetBy(WeekFilterDto week)
        {
            List<TimeshareWeek> 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;
        }
    }
}
 |