using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; using System.Linq; using UnivateProperties_API.Containers.ProcessFlow; using UnivateProperties_API.Context; using UnivateProperties_API.Helpers; using UnivateProperties_API.Model; using UnivateProperties_API.Model.ProcessFlow; using UnivateProperties_API.Repository.Communication; using UnivateProperties_API.Repository.Timeshare; namespace UnivateProperties_API.Repository.ProccessFlow { public class BidRepository : IBidRepository { private readonly DataContext _dbContext; public BidRepository(DataContext dbContext) { _dbContext = dbContext; } public List Get(Func where) { return _dbContext.BidItems.Where(where).ToList(); } public List GetAll() { return _dbContext.BidItems.ToList(); } public BidItem GetDetailed(Func first) { var item = _dbContext.BidItems.FirstOrDefault(first); if (item == null) { item = new BidItem(); } return item; } public List GetDetailedAll() { return GetAll(); } public List GetAllBid() { List bids = _dbContext.BidItems .Include("Property") .Include("TimeshareWeek") .Include("BidMaker") .Include("Status") .Include("Property.Owner") .Include("Property.Agent") .ToList(); return LoadDisplay(bids); } public List GetMyBid(Func where) { List bids = _dbContext.BidItems .Include("Property") .Include("TimeshareWeek") .Include("BidMaker") .Include("Status") .Where(where) .ToList(); return LoadDisplay(bids); } public List GetAllBidBy(string name) { /* * Agency - can see all its agents' listings * Agent - only see own listings * Private User - only see own listings * Super Admin - can see all */ var user = _dbContext.Users.Where(u => u.Username == name).FirstOrDefault(); if (user != null) { if (user.Role.ToUpper() == "AGENCY" || user.Role.ToUpper() == "AGENT") { var agent = _dbContext.Agents.Where(a => a.UserId == user.Id).FirstOrDefault(); if (user.Role.ToUpper() == "AGENCY") { List bids = _dbContext.BidItems .Include("Property") .Include("TimeshareWeek") .Include("BidMaker") .Include("Status") .Where(x => x.TimeshareWeek.AgencyId == agent.AgencyId || x.Property.AgencyId == agent.AgencyId) .ToList(); return LoadDisplay(bids); } else { List bids = _dbContext.BidItems .Include("Property") .Include("TimeshareWeek") .Include("BidMaker") .Include("Status") .Where(x => x.TimeshareWeek.AgentId == agent.Id || x.Property.AgentId == agent.Id) .ToList(); return LoadDisplay(bids); } } if (user.Role.ToUpper() == "PRIVATE USER") { var individual = _dbContext.Individuals.Where(i => i.UserId == user.Id).FirstOrDefault(); List bids = _dbContext.BidItems .Include("Property") .Include("TimeshareWeek") .Include("BidMaker") .Include("Status") .Where(x => x.TimeshareWeek.OwnerId == individual.Id || x.Property.OwnerId == individual.Id) .ToList(); return LoadDisplay(bids); } if (user.Role.ToUpper() == "SUPER ADMIN") return GetAllBid(); } return null; } private List LoadDisplay(List bids) { List list = new List(); foreach (BidItem item in bids) { BidItemDisplay bid = BidItemDisplay(item); if (bid != null) list.Add(bid); } return list; } public void Insert(BidItem item) { var week = _dbContext.Weeks.Find(item.TimeshareWeekId); if (!(item.TimeshareWeek == null && week == null)) { if (week == null && item.TimeshareWeek != null) { MyCommon.PostToConsoft(item.TimeshareWeek); WeekRepository weekRepository = new WeekRepository(_dbContext); weekRepository.Insert(item.TimeshareWeek); } var status = _dbContext.Status.Where(x => x.Code == "E1").FirstOrDefault(); if (status != null) { List list = new List() { item, week, week.Owner }; item.StatusId = status.Id; if (item.TimeshareWeekId != null) { if (week != null) { TemplateRepository templateRepository = new TemplateRepository(_dbContext); var template = _dbContext.Templates.FirstOrDefault(x => x.Name == "WeekOfferMade-Owner"); if (template != null) { templateRepository.SendEmailTemplate(template, week.Owner, list); } template = _dbContext.Templates.FirstOrDefault(x => x.Name == "WeekOfferMade-User"); if (template != null) { var bidMaker = _dbContext.Individuals.FirstOrDefault(x => x.Id == item.BidMakerId); if (bidMaker != null) { templateRepository.SendEmailTemplate(template, bidMaker, list); } } } } } _dbContext.Add(item); Save(); } } public void InsertNew(BidItemNew item) { var status = _dbContext.Status.Where(x => x.Code == "E1").FirstOrDefault(); var week = _dbContext.Weeks.Include("Owner").Where(x => x.Id == item.TimeshareWeekId).FirstOrDefault(); if (item.TenderWeek != null) { //owner is set to UniVate2018 user - will need to check who the owner of a tender week will be. var owner = _dbContext.Individuals.Where(o => o.UserId == 14).FirstOrDefault(); var region = _dbContext.Provinces.Where(p => p.Id == item.TenderWeek.Region.Id).FirstOrDefault(); week = new Model.Timeshare.TimeshareWeek(); week.Owner = owner; week.OwnerId = owner.Id; week.ResortCode = item.TenderWeek.Resort.ResortCode; week.ResortName = item.TenderWeek.Resort.ResortName; week.Region = region; week.RegionId = region.Id; week.Module = item.TenderWeek.WeekNumber; week.Season = item.TenderWeek.Season; week.Bedrooms = item.TenderWeek.Bedrooms; week.MaxSleep = item.TenderWeek.MaxSleeps; week.UnitNumber = item.TenderWeek.UnitNumber; week.WeekNumber = item.TenderWeek.WeekNumber; week.LevyAmount = (double)item.TenderWeek.LevyAmount; week.CurrentYearBanked = false; week.BankedWith = ""; week.LeviesPaidInFull = false; week.WeekPlacedForRental = false; week.OriginalPurchasePrice = (double)item.TenderWeek.SellingPrice; week.OriginalPurchaseDate = DateTime.Now; week.ArrivalDate = item.TenderWeek.ArrivalDate; week.DepartureDate = item.TenderWeek.DepartureDate; week.SellPrice = (double)item.TenderWeek.SellingPrice; week.AgentCommision = 0; week.Status = status; week.StatusId = status.Id; _dbContext.Weeks.Add(week); Save(); item.TimeshareWeek = week; } var property = _dbContext.Properties.Include("Owner").Where(x => x.Id == item.PropertyId).FirstOrDefault(); BidItem bid = new BidItem(); foreach (string prop in bid.GetAllProperties()) { if (prop != "Item" && prop != "Display") bid[prop] = item[prop]; } if (status != null) bid.StatusId = status.Id; var individual = _dbContext.Individuals.Where(i => i.UserId == item.UserId).FirstOrDefault(); if (individual != null) { bid.BidMakerId = individual.Id; bid.BidMaker = individual; } if (!(bid.TimeshareWeek == null && week == null)) { if (week == null && bid.TimeshareWeek != null) { MyCommon.PostToConsoft(bid.TimeshareWeek); WeekRepository weekRepository = new WeekRepository(_dbContext); weekRepository.Insert(bid.TimeshareWeek); } List list = new List() { bid, week, week.Owner }; if (bid.TimeshareWeekId != null) { if (week != null) { TemplateRepository templateRepository = new TemplateRepository(_dbContext); MailRepository mailRepository = new MailRepository(_dbContext); var template = _dbContext.Templates.FirstOrDefault(x => x.Name == "WeekOfferMade-Owner"); if (template != null) { mailRepository.WeekOfferMadeOwner(week, bid); //templateRepository.SendEmailTemplate(template, week.Owner, list); } template = _dbContext.Templates.FirstOrDefault(x => x.Name == "WeekOfferMade-User"); if (template != null) { var bidMaker = _dbContext.Individuals.FirstOrDefault(x => x.Id == bid.BidMakerId); if (bidMaker != null) { mailRepository.WeekOfferMadeUser(week, bid); //templateRepository.SendEmailTemplate(template, bidMaker, list); } } } } _dbContext.Add(bid); Save(); } else { List list = new List() { bid, property, property.Owner }; if (bid.PropertyId != null) { if (property != null) { var propertyStatus = _dbContext.Status.Where(s => s.Code == "P4").FirstOrDefault(); if (propertyStatus != null) { property.StatusId = propertyStatus.Id; _dbContext.Update(property); } TemplateRepository templateRepository = new TemplateRepository(_dbContext); var template = _dbContext.Templates.FirstOrDefault(x => x.Name == "PropertyOfferMade-Owner"); if (template != null) { templateRepository.SendEmailTemplate(template, property.Owner, list); } template = _dbContext.Templates.FirstOrDefault(x => x.Name == "PropertyOfferMade-User"); if (template != null) { if (individual != null) { templateRepository.SendEmailTemplate(template, individual, list); } } } } _dbContext.Add(bid); Save(); } item.Id = bid.Id; } public void Insert(IEnumerable items) { foreach (var item in items) { _dbContext.Add(item); } Save(); } public void Remove(BidItem item) { var i = _dbContext.BidItems.Find(item); _dbContext.BidItems.Remove(i); Save(); } public void Remove(IEnumerable items) { foreach (var item in items) { var i = _dbContext.BidItems.Find(item); _dbContext.BidItems.Remove(i); } Save(); } public void RemoveAtId(int item) { var i = _dbContext.BidItems.Find(item); _dbContext.BidItems.Remove(i); Save(); } public void Save() { _dbContext.SaveChanges(); } public void Update(BidItem item) { _dbContext.Entry(item).State = EntityState.Modified; Save(); } public BidItemDisplay AcceptBid(int id) { var item = _dbContext.BidItems .Include("Property") .Include("TimeshareWeek") .Include("BidMaker") .Include("Status") .Where(x => x.Id == id).FirstOrDefault(); var status = (from s in _dbContext.Status where s.Code == "E2" select s).FirstOrDefault(); if (status != null) { item.StatusId = status.Id; } if (item.Property != null) { var propertyStatus = _dbContext.Status.Where(p => p.Code == "P5").FirstOrDefault(); if (propertyStatus != null) { item.Property.StatusId = propertyStatus.Id; item.Property.Published = false; } } _dbContext.Entry(item).State = EntityState.Modified; Save(); List bids = new List() { item }; return LoadDisplay(bids).Find(x => x.Id == item.Id); } public BidItemDisplay DecineBid(BitItemDecline item) { var bid = _dbContext.BidItems .Include("Property") .Include("TimeshareWeek") .Include("BidMaker") .Include("Status") .Where(x => x.Id == item.Id).FirstOrDefault(); var status = (from s in _dbContext.Status where s.Code == "E3" select s).FirstOrDefault(); if (status != null) { bid.StatusId = status.Id; } bid.DeclinedReason = item.Comment; if (bid.Property != null) { var propertyStatus = _dbContext.Status.Where(p => p.Code == "P3").FirstOrDefault(); if (propertyStatus != null) { bid.Property.StatusId = propertyStatus.Id; } } _dbContext.Entry(bid).State = EntityState.Modified; Save(); List bids = new List() { bid }; return LoadDisplay(bids).Find(x => x.Id == bid.Id); } public int NewId() { // Not sure if properties need it return 0; } public BidItemDisplay GetDispaly(int id) { var bid = _dbContext.BidItems .Include("Property") .Include("TimeshareWeek") .Include("BidMaker") .Include("Status") .Where(x => x.Id == id).FirstOrDefault(); return BidItemDisplay(bid); } private BidItemDisplay BidItemDisplay(BidItem item) { if (item == null) return null; BidItemDisplay bid = new BidItemDisplay() { Id = item.Id, Offer = (decimal)item.Amount, Comment = item.Comment, DeclineReason = item.DeclinedReason }; if (item.PropertyId != null) { if (item.Property == null) return null; bid.Type = "Property"; bid.ShortDescription = item.Property.ShortDescription; bid.Description = item.Property.Description; bid.Price = item.Property.Price; } if (item.TimeshareWeekId != null) { if (item.TimeshareWeek == null) return null; bid.Type = "Timeshare"; bid.ShortDescription = string.Format("{0} {1} {2}", item.TimeshareWeek.ResortCode, item.TimeshareWeek.WeekNumber, item.TimeshareWeek.UnitNumber); bid.SellPrice = (decimal)item.TimeshareWeek.SellPrice; bid.Resort = item.TimeshareWeek.ResortName; bid.UnitNumber = item.TimeshareWeek.UnitNumber; bid.WeekNumber = item.TimeshareWeek.Module; } if (item.Status != null) { bid.StatusCode = item.Status.Code; bid.Status = string.Format("{0} - {1}", item.Status.Code, item.Status.Description); } if (item.BidMaker != null) bid.MadeBy = (item.BidMaker.Name + " " + item.BidMaker.Surname).Trim(); bid.Date = item.Created; return bid; } public BidItemNew NewBidTemplate() { return new BidItemNew(); } } }