| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189 | using Abp.Domain.Entities;
using Abp.Extensions;
using Microsoft.CodeAnalysis;
using Microsoft.EntityFrameworkCore;
using RestSharp;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Dynamic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using UnivateProperties_API.Containers.Timeshare;
using UnivateProperties_API.Containers.Timeshare.Detailed;
using UnivateProperties_API.Containers.Users;
using UnivateProperties_API.Context;
using UnivateProperties_API.Helpers;
using UnivateProperties_API.Helpers.Communication;
using UnivateProperties_API.Model;
using UnivateProperties_API.Model.Communication;
using UnivateProperties_API.Model.Region;
using UnivateProperties_API.Model.Timeshare;
using UnivateProperties_API.Model.Users;
using UnivateProperties_API.Repository.Communication;
using UnivateProperties_API.Repository.Region;
using UnivateProperties_API.Repository.Users;
namespace UnivateProperties_API.Repository.Timeshare
{
    public interface IWeekRepository : IRepository<TimeshareWeek>
    {
        int SaveNewWeek(TimeshareWeekDto sellItem);
        void PublishOnly(WeekDto week);
        int IndivWeekCount(int id);
        List<WeekDto> GetAllByResortCode(string resortCode);
        List<dynamic> GetLatest();
        void PublishWeek(int WeekId);
        void UnpublishWeek(int WeekId);
    }
    public class WeekRepository : IWeekRepository
    {
        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.Include("Owner").ToList();
        }
        public TimeshareWeek GetDetailed(Func<TimeshareWeek, bool> first)
        {
            var item = _dbContext.Weeks.FirstOrDefault(first);
            item = GetDetailedWeek(item);
            return item;
        }
        public DetailedWeekDto GetMyDetailed(Func<TimeshareWeek, bool> first)
        {
            var item = GetDetailed(first);
            if(item != null)
            {
                return new DetailedWeekDto(item);
            }
            return null;
        }
        public List<WeekDto> GetAllByResortCode(string resortCode) 
        {
            List<WeekDto> list = new List<WeekDto>();
            foreach (var item in GetDetailedByResortCode(resortCode))
            {
                list.Add(new WeekDto(item));
            }
            var listIds = list.Select(x => x.WeekUni).ToList();
            foreach (var item in GetTenderWeeksByResortCode(resortCode))
            {
                if (!listIds.Contains(item.WeekUni))
                    list.Add(item);
            }
            return list;
        }
        private List<TimeshareWeek> GetDetailedByResortCode(string resortCode)
        {
            var list = GetAllUsingResortCode(resortCode);
            List<TimeshareWeek> weeklist = new List<TimeshareWeek>();
            foreach (var item in list)
            {
                weeklist.Add(GetDetailedWeek(item));
            }
            return weeklist;
        }
        private List<TimeshareWeek> GetAllUsingResortCode(string resortCode)
        {
            return _dbContext.Weeks.Where(x => x.ResortCode == resortCode).ToList();
        }
        public List<WeekDto> GetDtoListAll()
        {
            List<WeekDto> list = new List<WeekDto>();
            foreach (var item in GetDetailedAll())
            {
                list.Add(new WeekDto(item));
            }
            var listIds = list.Select(x => x.WeekUni).ToList();
            foreach (var item in GetTenderWeeks())
            {
                if (!listIds.Contains(item.WeekUni))
                    list.Add(item);
            }
            return list;
        }
        public List<dynamic> GetLatest()
        {
            //List<WeekDto> list = new List<WeekDto>();
            var weeks = _dbContext.Weeks.Where(x => x.Publish == true).OrderByDescending(x => x.Id).Take(4).ToList();
            var client = new RestClient();
            var request = new RestRequest(Method.GET);
            IRestResponse response = client.Execute(request);
            var img = "";
            
            List<dynamic> myWeekList = new List<dynamic>();
            foreach (var week in weeks)
            {
                client = new RestClient(string.Format("https://www.tradeunipoint.com/unibackend/seam/resource/rest/products/{0}/image/{1}", week.ResortCode, 0))
                {
                    Timeout = -1
                };
                response = client.Execute(request);
                dynamic myDynamicWeek = new ExpandoObject();
                myDynamicWeek.resortName = week.ResortName;
                myDynamicWeek.module = week.Module;
                myDynamicWeek.season = week.Season;
                myDynamicWeek.levyAmount = week.LevyAmount;
                myDynamicWeek.id = week.Id;
                myDynamicWeek.sellPrice = week.SellPrice;
                myDynamicWeek.resortCode = week.ResortCode;
                myDynamicWeek.image = string.Format("data:image/jpeg;base64,{0}", response.Content);
                myWeekList.Add(myDynamicWeek);
            }
            return myWeekList;
            /*foreach (var week in weeks)
            {
                list.Add(new WeekDto(week));
            }
            return list;*/
        }
        public int IndivWeekCount(int id)
        {
            var agent = _dbContext.Agents.Where(x => x.UserId == id).Where(y => y.IsDeleted == false).FirstOrDefault();
            var indiv = _dbContext.Individuals.Where(x => x.UserId == id).Where(y => y.IsDeleted == false).FirstOrDefault();
            int count = 0;
            if (agent != null)
            {
                count = _dbContext.Weeks.Where(x => x.AgentId == agent.Id).Count();
            }
            else
            {
                count = _dbContext.Weeks.Where(x => x.OwnerId == indiv.Id).Count();
            }
            return count;
        }
        public List<WeekDto> GetMyWeeks(int userId)
        {
            List<WeekDto> list = new List<WeekDto>();
            UserRepository userRepository = new UserRepository(_dbContext);
            var user = userRepository.Get(x => x.Id == userId).FirstOrDefault();
            if (userId == 0)
            {
                foreach (var item in GetDetailedAll())
                {
                    if (item.Publish)
                    {
                        list.Add(new WeekDto(item));
                    }
                }
            }
            else 
            {
                if (user.IsUserInRole(Role.SuperAdmin))
                {
                    foreach (var item in GetDetailedAll())
                    {
                        list.Add(new WeekDto(item));
                    }
                }
                else if (user.IsUserInRole(Role.Agency))
                {
                    var agent = _dbContext.Agents.FirstOrDefault(x => x.UserId == userId);
                    if (agent != null)
                    {
                        foreach (var item in GetDetailedAll().Where(x => x.AgencyId == agent.AgencyId))
                        {
                            list.Add(new WeekDto(item));
                        }
                    }
                }
                else if (user.IsUserInRole(Role.Agent) || user.IsUserInRole(Role.ManagingAgent))
                {
                    var agent = _dbContext.Agents.FirstOrDefault(x => x.UserId == userId);
                    if (agent != null)
                    {
                        foreach (var item in GetDetailedAll().Where(x => x.AgentId == agent.Id))
                        {
                            list.Add(new WeekDto(item));
                        }
                    }
                }
                else if (user.IsUserInRole(Role.Designer) || user.IsUserInRole(Role.ManagingAgent))
                {
                    var _user = _dbContext.Individuals.FirstOrDefault(x => x.UserId == userId);
                    if (_user != null)
                    {
                        foreach (var item in GetDetailedAll())
                        {
                            list.Add(new WeekDto(item));
                        }
                    }
                }
                else
                {
                    var individual = _dbContext.Individuals.FirstOrDefault(x => x.UserId == userId);
                    if (individual != null)
                    {
                        foreach (var item in GetDetailedAll().Where(x => x.OwnerId == individual.Id))
                        {
                            list.Add(new WeekDto(item));
                        }
                    }
                }
            }
            
            return list;
        }
        public List<RegionDto> GetAvailResort()
        {
            List<RegionDto> list = new List<RegionDto>();
            var allItems = GetDtoListAll();
            foreach (var item in allItems)
            {
                if (item.Region != null)
                {
                    if (!list.Any(x => x.RegionCode == item.Region.RegionCode))
                    {
                        list.Add(new RegionDto(item.Region.RegionCode, item.Region.RegionName));
                    }
                    foreach (var i in list.Where(x => x.RegionCode == item.Region.RegionCode))
                    {
                        i.TryAddResort(item.Resort.ResortCode, item.Resort.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.Resort.ResortCode == resort.ResortCode);
                }
            }
            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();
            }
            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();
                /*week.DisplayOwner = week.Owner.Name + " " + week.Owner.Surname;
                _dbContext.Weeks.Update(week);
                _dbContext.SaveChanges();*/
            }
            return week;
        }
        public void Insert(TimeshareWeek item)
        {
            item = GetDetailedWeek(item);
            StatusRepository repo = new StatusRepository(_dbContext);
            var stat = repo.Get(x => x.Code == "A1" && x.StatusType == StatusType.Timeshare).FirstOrDefault();
            if (stat == null)
            {
                //Create initial
                stat = new Status()
                {
                    Code = "A1",
                    Description = "Pending verification",
                    StatusType = StatusType.Timeshare,
                    ModifiedBy = "KobusB"
                };
                repo.Insert(stat);
            }
            //item.Id = NewId();
            item.ProcessFlows.Add(new Model.ProcessFlow.ProcessFlow()
            {
                Status = item.Status,
                Timeshare = item
            });
            TemplateRepository templateRepository = new TemplateRepository(_dbContext);
            if(item.Owner != null)
            {
                var template = _dbContext.Templates.FirstOrDefault(x => x.Name == "WeekLoaded-Owner");
                if(template != null)
                {
                    templateRepository.SendEmailTemplate(template, item.Owner, new List<BaseEntity>() { item, item.Owner });
                }
                template = _dbContext.Templates.FirstOrDefault(x => x.Name == "WeekLoaded-UV");
                if(template != null)
                {
                    templateRepository.SendEmailTemplate(template, item.Owner, new List<BaseEntity>() { item, item.Owner });
                }
            }
            
            _dbContext.Add(item);
            Save();
        }
        public void Insert(IEnumerable<TimeshareWeek> 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<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 PublishOnly(WeekDto week)
        {
            var saved = _dbContext.Weeks.Where(w => w.Id == week.Id).FirstOrDefault();
            if(saved.StatusId != week.Status.Id)
            {
                saved.StatusId = week.Status.Id;
            }
            if (saved.Publish != week.Publish)
            {
                saved.Publish = week.Publish;
            }
            _dbContext.Update(saved);
            Save();
        }
        public void Update(TimeshareWeek item)
        {
            var saved = _dbContext.Weeks.Where(w => w.Id == item.Id).FirstOrDefault();
            
            if (saved.RegionId != item.RegionId)
            {
                saved.RegionId = item.RegionId;
            }
            if (saved.ResortCode != item.ResortCode)
            {
                saved.ResortCode = item.ResortCode;
            }
            if (saved.ResortName != item.ResortName)
            {
                saved.ResortName = item.ResortName;
            }
            if (saved.UnitNumber != item.UnitNumber)
            {
                saved.UnitNumber = item.UnitNumber;
            }
            if (saved.Module != item.Module)
            {
                saved.Module = item.Module;
            }
            if (saved.Season != item.Season)
            {
                saved.Season = item.Season;
            }
            if (saved.Bedrooms != item.Bedrooms)
            {
                saved.Bedrooms = item.Bedrooms;
            }
            if (saved.MaxSleep != item.MaxSleep)
            {
                saved.MaxSleep = item.MaxSleep;
            }
            if (saved.LevyAmount != item.LevyAmount)
            {
                saved.LevyAmount = item.LevyAmount;
            }
            if (saved.WeekType != item.WeekType)
            {
                saved.WeekType = item.WeekType;
            }
            if (saved.ArrivalDate != item.ArrivalDate)
            {
                saved.ArrivalDate = item.ArrivalDate;
            }
            if (saved.DepartureDate != item.DepartureDate)
            {
                saved.DepartureDate = item.DepartureDate;
            }
            if (saved.AskingPrice != item.AskingPrice)
            {
                saved.AskingPrice = item.AskingPrice;
            }
            if (saved.SellPrice != item.SellPrice)
            {
                saved.SellPrice = item.SellPrice;
            }
            if (saved.CurrentYearBanked != item.CurrentYearBanked)
            {
                saved.CurrentYearBanked = item.CurrentYearBanked;
            }
            if (saved.BankedWith != item.BankedWith)
            {
                saved.BankedWith = item.BankedWith;
            }
            if (saved.OwnerId != item.OwnerId)
            {
                saved.OwnerId = item.OwnerId;
            }
            if (saved.AgencyId != item.AgencyId)
            {
                saved.AgencyId = item.AgencyId;
            }
            if (saved.AgentId != item.AgentId)
            {
                saved.AgentId = item.AgentId;
            }
            if (saved.CustomOwner != item.CustomOwner)
            {
                saved.CustomOwner = item.CustomOwner;
            }
            if (item.CustomOwner)
            {
                var customOwner = _dbContext.NonRegIndividuals.Where(x => x.WeekId == item.Id).FirstOrDefault();
                if (customOwner != null)
                {
                    if (item.Owner.Name != customOwner.Name)
                    {
                        customOwner.Name = item.Owner.Name;
                    }
                    if (item.Owner.Surname != customOwner.Surname)
                    {
                        customOwner.Surname = item.Owner.Surname;
                    }
                    if (item.Owner.IdNumber != customOwner.IDNumber)
                    {
                        customOwner.IDNumber = item.Owner.IdNumber;
                    }
                    if (item.Owner.CompanyRegNumber != customOwner.CompanyRegNumber)
                    {
                        customOwner.CompanyRegNumber = item.Owner.CompanyRegNumber;
                    }
                    if (item.Owner.Email != customOwner.EmailAddress)
                    {
                        customOwner.EmailAddress = item.Owner.Email;
                    }
                    if (item.Owner.CellNumber != customOwner.CellNumber)
                    {
                        customOwner.CellNumber = item.Owner.CellNumber;
                    }
                    if (item.Owner.Telephone != customOwner.TelephoneNumber)
                    {
                        customOwner.TelephoneNumber = item.Owner.Telephone;
                    }
                    saved.DisplayOwner = item.Owner.Name + " " + item.Owner.Surname;
                    _dbContext.NonRegIndividuals.Update(customOwner);
                    _dbContext.SaveChanges();
                }
                else
                {
                    var nonRegUserObj = new NonRegIndividual
                    {
                        Name = item.Owner.Name,
                        Surname = item.Owner.Surname,
                        IDNumber = item.Owner.IdNumber,
                        CompanyRegNumber = item.Owner.CompanyRegNumber,
                        EmailAddress = item.Owner.Email,
                        CellNumber = item.Owner.CellNumber,
                        TelephoneNumber = item.Owner.Telephone,
                        WeekId = item.Id
                    };
                    _dbContext.NonRegIndividuals.Add(nonRegUserObj);
                    _dbContext.SaveChanges();
                    
                    saved.DisplayOwner = item.Owner.Name + " " + item.Owner.Surname;
                }
                
            }
            else 
            {
                if (saved.DisplayOwner != item.Owner.Name + " " + item.Owner.Surname)
                {
                    saved.DisplayOwner = item.Owner.Name + " " + item.Owner.Surname;
                }
            }
            /*var owner = _dbContext.Individuals.Where(x => x.Id == item.OwnerId).FirstOrDefault();
            if (owner.Name != item.Owner.Name)
            {
                owner.Name = item.Owner.Name;
            }
            if (owner.Surname != item.Owner.Surname)
            {
                owner.Surname = item.Owner.Surname;
            }
            if (owner.IdNumber != item.Owner.IdNumber)
            {
                owner.IdNumber = item.Owner.IdNumber;
            }
            if (owner.CompanyRegNumber != item.Owner.CompanyRegNumber)
            {
                owner.CompanyRegNumber = item.Owner.CompanyRegNumber;
            }
            if (owner.Email != item.Owner.Email)
            {
                owner.Email = item.Owner.Email;
            }
            if (owner.CellNumber != item.Owner.CellNumber)
            {
                owner.CellNumber = item.Owner.CellNumber;
            }
            if (owner.Telephone != item.Owner.Telephone)
            {
                owner.Telephone = item.Owner.Telephone;
            }*/
            if (saved.Mandate != item.Mandate)
            {
                if (item.Mandate)
                    saved.DateMandated = DateTime.Now;
            }
            if (item.Status != null)
            {
                if (saved.StatusId != item.Status.Id)
                {
                    saved.StatusId = item.Status.Id;
                }
            }
            else
            {
                var status = _dbContext.Status.Where(x => x.Id == item.StatusId).FirstOrDefault();
                saved.Status = status;
                saved.StatusId = item.StatusId;
            }
            
            if (saved.Publish != item.Publish)
            {
                saved.Publish = item.Publish;
            }
            if (saved.PulbishedDate != item.PulbishedDate)
            {
                saved.PulbishedDate = item.PulbishedDate;
            }
            _dbContext.Entry(saved).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;
        }
        //public int NewId()
        //{
        //    int id = 0;
        //    if (_dbContext.Weeks.Count() > 0)
        //    {
        //        id = _dbContext.Weeks.Max(x => x.Id);
        //    }
        //    id += 1;
        //    return id;
        //}
        private int _TenderId = 10000;
        private int GetTenderId()
        {
            return _TenderId++;
        }
        public List<WeekDto> GetTenderWeeks()
        {
            List<WeekDto> list = new List<WeekDto>();
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(MyCommon.TenderUrl);
            request.Method = "GET";
            WebResponse response = request.GetResponse();
            using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8))
            {
                string result = reader.ReadToEnd();
                if (result.Length > 0)
                {
                    string cleanLine;
                    string[] lines = result.Split(new char[] { '\n' }, StringSplitOptions.RemoveEmptyEntries);
                    foreach (string line in lines)
                    {
                        cleanLine = line.Replace("<br>", "");
                        cleanLine = cleanLine.Replace("<br >", "");
                        cleanLine = cleanLine.Replace("<br/>", "");
                        cleanLine = cleanLine.Replace("<br />", "");
                        list.Add(new WeekDto(GetTenderId(),cleanLine));
                    }
                }
            }
            // Check that all regions are same as other
            list
                .Where(x => x.Region != null && x.Region.RegionCode == "FN")
                .ToList()
                .ForEach(x => x.Region.RegionCode = ChangeRegion(x.Region.RegionCode));
            list = GetRegion(list);
            return list;
        }
        public List<WeekDto> GetTenderWeeksByResortCode(string resortCode)
        {
            List<WeekDto> list = new List<WeekDto>();
            string conString = string.Format("http://www.unipoint-consoft.co.za/nph-srep.exe?cluvavail.sch&CLUB=LPA&RESORT={0}&SUMMARY=N&HEAD=N", resortCode);
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(conString);
            request.Method = "GET";
            WebResponse response = request.GetResponse();
            using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8))
            {
                string result = reader.ReadToEnd();
                if (result.Length > 0)
                {
                    string cleanLine;
                    string[] lines = result.Split(new char[] { '\n' }, StringSplitOptions.RemoveEmptyEntries);
                    if (lines[0].Trim() != "none")
                    {
                        foreach (string line in lines)
                        {
                            cleanLine = line.Replace("<br>", "");
                            cleanLine = cleanLine.Replace("<br >", "");
                            cleanLine = cleanLine.Replace("<br/>", "");
                            cleanLine = cleanLine.Replace("<br />", "");
                            list.Add(new WeekDto(GetTenderId(), cleanLine));
                        }
                    }
                    
                }
            }
            // Check that all regions are same as other
            list
                .Where(x => x.Region != null && x.Region.RegionCode == "FN")
                .ToList()
                .ForEach(x => x.Region.RegionCode = ChangeRegion(x.Region.RegionCode));
            list = GetRegion(list);
            return list;
        }
        private List<WeekDto> GetRegion(List<WeekDto> list)
        {
            ProvinceRepository province = new ProvinceRepository(_dbContext);
            Province prov = null;
            foreach(var item in list)
            {
                prov = province.GetDetailed(x => x.Code == item.Region.RegionCode);
                if(prov != null)
                {
                    item.Region = new RegionDto(prov.Id, prov.Code, prov.Description);
                }                
            }
            return list;
        }
        private string ChangeRegion(string value)
        {
            switch(value)
            {
                case "FN":
                    return "KZN";
                case "L":
                    return "LI";
                default:
                    return value;
            }
        }
        public List<DetailedWeekDto> GetNeedApproval()
        {
            List<DetailedWeekDto> detList = new List<DetailedWeekDto>();
            var status = _dbContext.Status.FirstOrDefault(x => x.Code == "A1" && x.StatusType == StatusType.Timeshare);
            if(status != null)
            {
                var list = GetDetailedAll().Where(x => x.Status != null && x.Status.Id == status.Id).ToList();
                list.ForEach(x => detList.Add(new DetailedWeekDto(x)));
            }
            return detList;
        }
        public void VerifyWeek(int id)
        {
            var week = _dbContext.Weeks.FirstOrDefault(x => x.Id == id);
            var newStatus = _dbContext.Status.FirstOrDefault(x => x.Code.ToLower() == "a2" && x.StatusType == StatusType.Timeshare);
            if(week != null && newStatus != null)
            {
                week = GetDetailedWeek(week);
                week.Status = newStatus;
                Update(week);
                var template = _dbContext.Templates.Where(x => x.Name == "WeekAuthorized").FirstOrDefault();
                if(template != null)
                {
                    
                    TemplateRepository tempRepo = new TemplateRepository(_dbContext);
                    tempRepo.SendEmailTemplate(template, week.Owner, new List<BaseEntity>() { week, week.Owner, week.Owner.User});
                }
            }
        }
        public void PublishWeek(int id)
        {
            var week = _dbContext.Weeks.FirstOrDefault(x => x.Id == id);
            if (week != null)
            {
                week.Publish = true;
                week.PulbishedDate = DateTime.Now;
                _dbContext.Entry(week).State = EntityState.Modified;
                Save();
            }
        }
        public int SaveNewWeek(TimeshareWeekDto sellItem)
        {
            
            //var banking = _dbContext.BankAccounts.Where(b => b.Id == sellItem.OwnerObject.BankingDetails.Id).FirstOrDefault();
            var status = _dbContext.Status.Where(s => s.Id == sellItem.StatusId && s.StatusType == StatusType.Timeshare).FirstOrDefault();
            if (sellItem.AgentId != null)
            {
                var agent = _dbContext.Agents.Where(ag => ag.Id == sellItem.AgentId).FirstOrDefault();
            }
            #region Address - Check if the user has an address, if not and a new address has been posted it can be updated
            var address = new Model.Misc.Address();
            if (sellItem.OwnerObject.Address != null)
            {
                address = _dbContext.Addresses.Where(a => a.Id == sellItem.OwnerObject.Address.Id).FirstOrDefault();
            }
            if (sellItem.OwnerObject.Address.PostalCode != "")
            {
                if (address == null)
                {
                    address = new Model.Misc.Address();
                }
                address.StreetNumber = sellItem.OwnerObject.Address.StreetNumber;
                address.Street = sellItem.OwnerObject.Address.Street;
                address.Suburb = sellItem.OwnerObject.Address.Suburb;
                address.City = sellItem.OwnerObject.Address.City;
                address.Province = sellItem.OwnerObject.Address.Province;
                address.PostalCode = sellItem.OwnerObject.Address.PostalCode;
                if (address.Id == 0)
                {
                    _dbContext.Add(address);
                    Save();
                }
                else
                {
                    _dbContext.Entry(address).State = EntityState.Modified;
                    Save();
                }
            }
            #endregion
            //#region Banking
            //if (sellItem.OwnerObject.BankingDetails.AccountHolder != "")
            //{
            //    if (banking == null)
            //    {
            //        banking = new Model.Banks.BankAccount();
            //    }
            //    banking.AccountHolder = sellItem.OwnerObject.BankingDetails.AccountHolder;
            //    banking.AccountNumber = sellItem.OwnerObject.BankingDetails.AccountNumber;
            //    banking.BankId = sellItem.OwnerObject.BankingDetails.Bank.Id;
            //    if (banking.Id == 0)
            //    {
            //        _dbContext.Add(banking);
            //        Save();
            //    }
            //    else
            //    {
            //        _dbContext.Entry(banking).State = EntityState.Modified;
            //        Save();
            //    }
            //}
            //#endregion
            #region Owner
            //Check if an agent has listed the week.
            var agentWeek = _dbContext.Agents.Where(x => x.UserId == sellItem.OwnerId && !x.IsDeleted).FirstOrDefault();
            var owner = new Model.Users.Individual();
            var indiv = new NonRegIndividual();
            //Check if agentWeek is null. If null get an owner that listed the week
            if (agentWeek == null)
            {
                owner = _dbContext.Individuals.Where(x => x.UserId == sellItem.OwnerId).FirstOrDefault();
            }
            if (sellItem.CustomOwner)
            {
                sellItem.DisplayOwner = sellItem.OwnerObject.Name + " " + sellItem.OwnerObject.Surname;
                indiv = new NonRegIndividual()
                {
                    Name = sellItem.OwnerObject.Name,
                    Surname = sellItem.OwnerObject.Surname,
                    IDNumber = sellItem.OwnerObject.IdNumber,
                    CompanyRegNumber = sellItem.OwnerObject.CompanyRegNumber,
                    EmailAddress = sellItem.OwnerObject.EmailAddress,
                    CellNumber = sellItem.OwnerObject.CellNumber,
                    TelephoneNumber = sellItem.OwnerObject.LandlineNumber,
                    SpouseCellnumber = sellItem.OwnerObject.SpouseCellnumber,
                    SpouseEmail = sellItem.OwnerObject.SpouseEmail,
                    SpouseName = sellItem.OwnerObject.SpouseName,
                    SpouseSurname = sellItem.OwnerObject.SpouseSurname,
                    SpouseTelephone = sellItem.OwnerObject.SpouseSurname,                    
                };
                switch (sellItem.OwnerObject.MaritalStatus?.ToUpper())
                {
                    case "":
                        indiv.HowMarried = MarriedType.NotApplicable;
                        break;
                    case "N/A":
                        indiv.HowMarried = MarriedType.NotApplicable;
                        break;
                    case "IN COMMUNITY OF PROPERTY":
                        indiv.HowMarried = MarriedType.ICOP;
                        break;
                    case "OUT OF COMMUNITY OF PROPERTY":
                        indiv.HowMarried = MarriedType.OCOP;
                        break;
                    case "OTHER":
                        indiv.HowMarried = MarriedType.Other;
                        break;
                    case "TRADITIONAL WEDDING":
                        indiv.HowMarried = MarriedType.Traditional;
                        break;
                    case "SINGLE":
                        indiv.HowMarried = MarriedType.Single;
                        break;
                    case "DIVORCED":
                        indiv.HowMarried = MarriedType.Divorced;
                        break;
                    case "WIDOW":
                        indiv.HowMarried = MarriedType.Widow;
                        break;
                    case "COMMITTED RELATIONSHIP":
                        indiv.HowMarried = MarriedType.CommittedRelationship;
                        break;
                    case "PARTNER":
                        indiv.HowMarried = MarriedType.Partner;
                        break;
                    default:
                        indiv.HowMarried = MarriedType.NotApplicable;
                        break;
                }
                _dbContext.NonRegIndividuals.Add(indiv);
                _dbContext.SaveChanges();
            }
            else
            {
                if (owner == null)
                {
                    owner = new Model.Users.Individual();
                }
                if (address != null)
                {
                    owner.AddressId = address.Id;
                    owner.Address = address;
                }
                if (agentWeek == null)
                {
                    owner.Name = sellItem.OwnerObject.Name;
                    owner.Surname = sellItem.OwnerObject.Surname;
                    owner.IdNumber = sellItem.OwnerObject.IdNumber;
                    owner.CompanyRegNumber = sellItem.OwnerObject.CompanyRegNumber;
                    owner.Email = sellItem.OwnerObject.EmailAddress;
                    owner.CellNumber = sellItem.OwnerObject.CellNumber;
                    owner.Telephone = sellItem.OwnerObject.LandlineNumber;
                    sellItem.DisplayOwner = owner.Name + " " + owner.Surname;
                    switch (sellItem.OwnerObject.MaritalStatus?.ToUpper())
                    {
                        case "N/A":
                            owner.HowMarried = MarriedType.NotApplicable;
                            break;
                        case "IN COMMUNITY OF PROPERTY":
                            owner.HowMarried = MarriedType.ICOP;
                            break;
                        case "OUT OF COMMUNITY OF PROPERTY":
                            owner.HowMarried = MarriedType.OCOP;
                            break;
                        case "OTHER":
                            owner.HowMarried = MarriedType.Other;
                            break;
                        case "TRADITIONAL WEDDING":
                            owner.HowMarried = MarriedType.Traditional;
                            break;
                        case "SINGLE":
                            owner.HowMarried = MarriedType.Single;
                            break;
                        case "DIVORCED":
                            owner.HowMarried = MarriedType.Divorced;
                            break;
                        case "WIDOW":
                            owner.HowMarried = MarriedType.Widow;
                            break;
                        case "COMMITTED RELATIONSHIP":
                            owner.HowMarried = MarriedType.CommittedRelationship;
                            break;
                        case "PARTNER":
                            owner.HowMarried = MarriedType.Partner;
                            break;
                        default:
                            owner.HowMarried = MarriedType.NotApplicable;
                            break;
                    }
                    owner.SpouseCellnumber = sellItem.OwnerObject.SpouseCellnumber;
                    owner.SpouseEmail = sellItem.OwnerObject.SpouseEmail;
                    owner.SpouseName = sellItem.OwnerObject.SpouseName;
                    owner.SpouseSurname = sellItem.OwnerObject.SpouseSurname;
                    owner.SpouseTelephone = sellItem.OwnerObject.SpouseSurname;
                    if (owner.Id == 0)
                    {
                        _dbContext.Add(owner);
                        Save();
                    }
                    else
                    {
                        _dbContext.Entry(owner).State = EntityState.Modified;
                        Save();
                    }
                }
                else
                {
                    agentWeek.Name = sellItem.OwnerObject.Name;
                    agentWeek.Surname = sellItem.OwnerObject.Surname;                    
                    agentWeek.Email = sellItem.OwnerObject.EmailAddress;
                    agentWeek.CellNumber = sellItem.OwnerObject.CellNumber;
                    agentWeek.Telephone = sellItem.OwnerObject.LandlineNumber;
                    sellItem.DisplayOwner = agentWeek.Name + " " + agentWeek.Surname;                  
                    if (agentWeek.Id == 0)
                    {
                        _dbContext.Add(agentWeek);
                        Save();
                    }
                    else
                    {
                        _dbContext.Entry(agentWeek).State = EntityState.Modified;
                        Save();
                    }
                }
            }
            #endregion           
            var week = new TimeshareWeek();
            foreach (string prop in week.GetAllProperties())
            {
                if (prop != "Item" && prop != "Display")
                    week[prop] = sellItem[prop];
            }
            week.Region = null;
            week.RegionId = sellItem.Region.Id;
            //if agentWeek then set week owner equal to agentWeek.id else
            if (agentWeek != null)
            {
                week.OwnerId = agentWeek.Id;
            }
            else
            {
                week.OwnerId = owner.Id;
            }
            if (week.Mandate)
                week.DateMandated = DateTime.Now;
            TemplateRepository templateRepository = new TemplateRepository(_dbContext);
            MailRepository mailRepository = new MailRepository(_dbContext);
            var template = _dbContext.Templates.FirstOrDefault(x => x.Name == "WeekLoaded-Owner");
            try
            {
                if (agentWeek != null)
                {
                    template = _dbContext.Templates.FirstOrDefault(x => x.Name == "WeekLoaded-Agent");
                    if (template != null)
                    {
                        mailRepository.WeekLoadedAgent(sellItem);
                        //templateRepository.SendEmailTemplateWeek(template, agent, sellItem);
                    }
                }
                else
                {
                    if (template != null)
                    {
                        mailRepository.WeekLoadedOwner(sellItem);
                        //templateRepository.SendEmailTemplateWeek(template, owner, sellItem);
                    }
                    /*template = _dbContext.Templates.FirstOrDefault(x => x.Name == "WeekLoaded-UV");
                    if (template != null)
                    {
                        templateRepository.SendEmailTemplate(template, sellItem.Owner, new List<BaseEntity>() { sellItem, sellItem.Owner });
                    }*/
                }
            }
            catch (Exception ex)
            {
                throw (ex);
            }
            if (sellItem.StatusId == 0)
            {
                var statuses = _dbContext.Status.ToList();
                foreach (var statusItem in statuses)
                {
                    if (statusItem.Code == "AP")
                    {
                        week.StatusId = statusItem.Id;
                    }
                }
            }
            _dbContext.Add(week);
            Save();
            if (sellItem.CustomOwner)
            {
                indiv.WeekId = week.Id;
                _dbContext.NonRegIndividuals.Update(indiv);
                Save();
            }
            return week.Id;
        }
        public void UnpublishWeek(int WeekId)
        {
            var week = _dbContext.Weeks.FirstOrDefault(x => x.Id == WeekId);
            if (week != null)
            {
                week.Publish = false;
                week.PulbishedDate = DateTime.MinValue;
                _dbContext.Entry(week).State = EntityState.Modified;
                Save();
            }
        }
    }
}
 |