| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511 | 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<BidItem> Get(Func<BidItem, bool> where)
        {
            return _dbContext.BidItems.Where(where).ToList();
        }
        public List<BidItem> GetAll()
        {
            return _dbContext.BidItems.ToList();
        }
        public BidItem GetDetailed(Func<BidItem, bool> first)
        {
            var item = _dbContext.BidItems.FirstOrDefault(first);
            if (item == null)
            {
                item = new BidItem();
            }
            return item;
        }
        public List<BidItem> GetDetailedAll()
        {
            return GetAll();
        }
        public List<BidItemDisplay> GetAllBid()
        {
            List<BidItem> bids = _dbContext.BidItems
                .Include("Property")
                .Include("TimeshareWeek")
                .Include("BidMaker")
                .Include("Status")
                .Include("Property.Owner")
                .Include("Property.Agent")
                .ToList();
            return LoadDisplay(bids);
        }
        public List<BidItemDisplay> GetMyBid(Func<BidItem, bool> where)
        {
            List<BidItem> bids = _dbContext.BidItems
                .Include("Property")
                .Include("TimeshareWeek")
                .Include("BidMaker")
                .Include("Status")
                .Where(where)
                .ToList();
            return LoadDisplay(bids);
        }
        public List<BidItemDisplay> 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<BidItem> 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<BidItem> 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<BidItem> 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<BidItemDisplay> LoadDisplay(List<BidItem> bids)
        {
            List<BidItemDisplay> list = new List<BidItemDisplay>();
            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<BaseEntity> list = new List<BaseEntity>() { 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;
            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<BaseEntity> list = new List<BaseEntity>() { bid, week, week.Owner };
                if (bid.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 == bid.BidMakerId);
                            if (bidMaker != null)
                            {
                                templateRepository.SendEmailTemplate(template, bidMaker, list);
                            }
                        }
                    }
                }                
                _dbContext.Add(bid);
                Save();
            }
            else
            {                
                List<BaseEntity> list = new List<BaseEntity>() { 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<BidItem> 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<BidItem> 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<BidItem> bids = new List<BidItem>() { 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<BidItem> bids = new List<BidItem>() { 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();
        }
    }
}
 |