public ActionResult Search([FromBody] SearchPartnerDTO searchPartnerDTO) { if (searchPartnerDTO == null) { return(BadRequest()); } if (!ModelState.IsValid) { return(BadRequest()); } List <string> regions = new List <string>(); List <PartnerCoursePackage> partnerCoursePackages = new List <PartnerCoursePackage>(); List <PartnerCenterInfo> partnerCenterInfos = new List <PartnerCenterInfo>(); List <CRMPartnerDTO> crmPartnerDTOs = new List <CRMPartnerDTO>(); List <SearchPartnerResultDTO> searchPartnerResultDTOs = new List <SearchPartnerResultDTO>(); List <int> partnerIdList = new List <int>(); try { // Note : here performance hit is there as we are loading first data based on partnertype // then in memory we are doing filtring based on regions // as regions are stored as ; seperated value // TODO: In future need to come up with better appraoch to avoid split and triming searchPartnerDTO.PartnerType = searchPartnerDTO.PartnerType.Select(x => x.Trim().ToLower()).ToList(); foreach (var regionId in searchPartnerDTO.RegionIds) { var regionInDb = _choiceRepository.GetById <Region>(regionId); if (regionInDb != null && !string.IsNullOrWhiteSpace(regionInDb.Name)) { regions.Add(regionInDb.Name.Trim().ToLower()); } } if (searchPartnerDTO.CoursePackageIds.Any()) { //Step 1: If coursepackageid is provided then we have to first retreive all the associated partnercourspackage // for that course package id which are offered. IList <int> removeCrmPartnerIds = new List <int>(); // First retrieve all crm partner from db which offers the corrosponding course package var tempPartnerCoursePackageList = _choiceRepository.GetAll <PartnerCoursePackage>() .Where(x => searchPartnerDTO.CoursePackageIds.Contains(x.CoursePackageId) && x.Offered != null && x.Offered == true); // Now grioup by CrmPartnerId and find any partner who doesn't support all the coursepackageids // which are provided as input foreach (var tempPartnerCoursePackage in tempPartnerCoursePackageList.GroupBy(x => x.CRMPartnerId)) { var coursePackageIdsSupportedByPartner = tempPartnerCoursePackage.Select(x => x.CoursePackageId); //var r = searchPartnerDTO.CoursePackageIds.Except(coursePackageIdsSupportedByPartner); if (searchPartnerDTO.CoursePackageIds.Except(coursePackageIdsSupportedByPartner).Count() != 0) { removeCrmPartnerIds.Add(tempPartnerCoursePackage.Key); } } // Now remove the crm partner from the tempPartnerCoursePackageList based on above selection var partnerCoursePackageList = tempPartnerCoursePackageList .Where(x => !removeCrmPartnerIds.Contains(x.CRMPartnerId)) .DistinctBy(a => a.CRMPartnerId); //var partnerCoursePackageList = _choiceRepository.GetAll<PartnerCoursePackage>() // .Where(x => searchPartnerDTO.CoursePackageIds.Any(a=> a == x.CoursePackageId) // && x.Offered != null && x.Offered == true) // Offered is always true // .DistinctBy(p => p.CRMPartnerId) // .ToList(); //Step 2: Now for each and every partnercoursepackage selected above //check their partnertype and regions are they matching then store it in a partnerCoursePackages list. foreach (var partnerCoursePackage in partnerCoursePackageList) { if (searchPartnerDTO.PartnerType.Any() && searchPartnerDTO.RegionIds.Any()) { var crmPartner = _choiceRepository .GetById <CRMPartner> (x => x.CRMPartnerId == partnerCoursePackage.CRMPartnerId && searchPartnerDTO.PartnerType.Any(a => a == x.Partnertype.Trim().ToLower())); if (crmPartner != null && !string.IsNullOrWhiteSpace(crmPartner.Regions)) { List <string> regionsArrayInDb = crmPartner.Regions.Split(';').Select(x => x.Trim().ToLower()).ToList(); if (regionsArrayInDb != null && regions.Intersect(regionsArrayInDb).Count() > 0) { partnerCoursePackages.Add(partnerCoursePackage); } } } else if (searchPartnerDTO.PartnerType.Any()) { var crmPartner = _choiceRepository .GetById <CRMPartner> (x => x.CRMPartnerId == partnerCoursePackage.CRMPartnerId && searchPartnerDTO.PartnerType.Any(a => a == x.Partnertype.Trim().ToLower())); if (crmPartner != null) { partnerCoursePackages.Add(partnerCoursePackage); } } else if (searchPartnerDTO.RegionIds.Any()) { var crmPartner = _choiceRepository .GetById <CRMPartner> (x => x.CRMPartnerId == partnerCoursePackage.CRMPartnerId); if (crmPartner != null) { List <string> regionsArrayInDb = crmPartner.Regions.Split(';').Select(x => x.Trim().ToLower()).ToList(); if (regionsArrayInDb != null && regions.Intersect(regionsArrayInDb).Count() > 0) { partnerCoursePackages.Add(partnerCoursePackage); } } } else { partnerCoursePackages.Add(partnerCoursePackage); } } } //Else Step 1: If coursepackageid is not provided. Get CRMPartner first based on partner type and regions. else { if (searchPartnerDTO.PartnerType.Any() && searchPartnerDTO.RegionIds.Any()) { var crmPartnersInDb = _choiceRepository .GetAll <CRMPartner>(x => searchPartnerDTO.PartnerType.Contains(x.Partnertype.ToLower())) .ToList(); //Step2 : Gets the crm partner course package for the crmpartners which are filtered above in step 1 // Note: we are querying the data for all available partnercoursepackages foreach (var crmPartner in crmPartnersInDb) { if (!string.IsNullOrWhiteSpace(crmPartner.Regions)) { List <string> regionsArrayInDb = crmPartner.Regions.Split(';').Select(x => x.Trim().ToLower()).ToList(); if (regionsArrayInDb != null && regions.Intersect(regionsArrayInDb).Count() > 0) { // NOTE: We retrieve the partner if any one of the course package is offered by him var partnerCoursePackage = _choiceRepository.GetAll <PartnerCoursePackage>() .Where(x => x.CRMPartnerId == crmPartner.CRMPartnerId && x.Offered != null && x.Offered == true) .FirstOrDefault(); if (partnerCoursePackage != null) { partnerCoursePackages.Add(partnerCoursePackage); } } } } } else if (searchPartnerDTO.PartnerType.Any()) { var crmPartnersInDb = _choiceRepository .GetAll <CRMPartner>(x => searchPartnerDTO.PartnerType.Contains(x.Partnertype.ToLower())) .ToList(); foreach (var crmPartner in crmPartnersInDb) { var partnerCoursePackage = _choiceRepository.GetAll <PartnerCoursePackage>() .Where(x => x.CRMPartnerId == crmPartner.CRMPartnerId && x.Offered != null && x.Offered == true) .FirstOrDefault(); if (partnerCoursePackage != null) { partnerCoursePackages.Add(partnerCoursePackage); } } } else if (searchPartnerDTO.RegionIds.Any()) { var crmPartnersInDb = _choiceRepository .GetAll <CRMPartner>(x => !string.IsNullOrWhiteSpace(x.Regions)); foreach (var crmPartner in crmPartnersInDb) { if (!string.IsNullOrWhiteSpace(crmPartner.Regions)) { List <string> regionsArrayInDb = crmPartner.Regions.Split(';').Select(x => x.Trim().ToLower()).ToList(); if (regionsArrayInDb != null && regions.Intersect(regionsArrayInDb).Count() > 0) { // NOTE: We retrieve the partner if any one of the course package is offered by him var partnerCoursePackage = _choiceRepository.GetAll <PartnerCoursePackage>() .Where(x => x.CRMPartnerId == crmPartner.CRMPartnerId && x.Offered != null && x.Offered == true) .FirstOrDefault(); if (partnerCoursePackage != null) { partnerCoursePackages.Add(partnerCoursePackage); } } } } } else { var crmPartnersInDb = _choiceRepository.DbContext.CRMPartner; foreach (var crmPartner in crmPartnersInDb) { var partnerCoursePackage = _choiceRepository.GetAll <PartnerCoursePackage>() .Where(x => x.CRMPartnerId == crmPartner.CRMPartnerId && x.Offered != null && x.Offered == true) .FirstOrDefault(); if (partnerCoursePackage != null) { partnerCoursePackages.Add(partnerCoursePackage); } } } } //Step3 : check wether the partnerCenterInfo provides these ameneties foreach (var partnerCoursePackage in partnerCoursePackages) { var query = _choiceRepository.GetAll <PartnerCenterInfo>() .Where(x => x.CRMPartnerId == partnerCoursePackage.CRMPartnerId).AsQueryable(); // Avoid all this if we make a chnage in db value to not nullable and put -1 instead as default value if (searchPartnerDTO.StateAgreement != null) { query = query.Where(GetDynamicLinqExpressionQueryForBoolean("StateAgreement", searchPartnerDTO.StateAgreement.Value)); } if (searchPartnerDTO.TotalRooms != null) { query = query.Where(GetDynamicLinqExpressionQueryForInt("TotalRooms", searchPartnerDTO.TotalRooms.Value)); } if (searchPartnerDTO.GroupRooms != null) { query = query.Where(GetDynamicLinqExpressionQueryForInt("GroupRooms", searchPartnerDTO.GroupRooms.Value)); } if (searchPartnerDTO.MaxSpaceAtRowOfChairs != null) { query = query.Where(GetDynamicLinqExpressionQueryForInt("MaxSpaceAtRowOfChairs", searchPartnerDTO.GroupRooms.Value)); } if (searchPartnerDTO.MaxSpaceAtRowOfChairs != null) { query = query.Where(GetDynamicLinqExpressionQueryForInt("MaxSpaceAtRowOfChairs", searchPartnerDTO.GroupRooms.Value)); } foreach (var refereshmentItemId in searchPartnerDTO.RefreshmentList) { var d = _choiceRepository.GetRefreshments(); var refereshmentEntryInDb = _choiceRepository.GetById <Refreshment>(refereshmentItemId); if (refereshmentEntryInDb != null) { var refereshmentName = refereshmentEntryInDb.Name; query = query.Where(GetDynamicLinqExpressionQueryForBoolean(refereshmentName)); } else { //No entry found for the corrosponding refreshment id query = null; } } var res = query?.ToList(); if (res != null && res.Any()) { partnerCenterInfos.AddRange(res); } } //Step4 : Prepare the final list of crm partner dto foreach (var partnerCenterInfo in partnerCenterInfos) { SearchPartnerResultDTO searchPartnerResultDTO = new SearchPartnerResultDTO(); // Get partner Name var crmPartner = _choiceRepository.GetById <CRMPartner>(x => x.CRMPartnerId == partnerCenterInfo.CRMPartnerId); //CRMPartnerDTO cRMPartnerDTO = _mapper.Map<CRMPartner, CRMPartnerDTO>(crmPartner); //crmPartnerDTOs.Add(cRMPartnerDTO); searchPartnerResultDTO.PartnerName = string.Format("{0} ({1})", crmPartner.PartnerName, crmPartner.Partnertype); // Get PartnerCoursePackageInfo if (searchPartnerDTO.CoursePackageIds.Any()) { foreach (var item in partnerCoursePackages) { if (item.CRMPartnerId == partnerCenterInfo.CRMPartnerId) { var partnerCoursePackageList = _choiceRepository.GetAll <PartnerCoursePackage> (x => x.CRMPartnerId == item.CRMPartnerId && searchPartnerDTO.CoursePackageIds.Contains(x.CoursePackageId)) .ToList(); var partnerCoursePackage = _mapper.Map <List <PartnerCoursePackage>, List <PartnerCoursePackageDTO> >(partnerCoursePackageList); foreach (var PartnerCourse in partnerCoursePackage) { var course = _choiceRepository.GetCoursePackage().Where(x => x.CoursePackageId == PartnerCourse.CoursePackageId).FirstOrDefault(); if (course != null) { PartnerCourse.CoursePackageName = course.CoursePackageName; PartnerCourse.CoursePackageNameEN = course.CoursePackageNameEN; } } searchPartnerResultDTO.PartnerCoursePackageDTOs.AddRange(partnerCoursePackage); } } } else { var partnerCoursePackagesInDb = _choiceRepository.GetAll <PartnerCoursePackage>() .Where(x => x.CRMPartnerId == crmPartner.CRMPartnerId && x.Offered != null && x.Offered == true); foreach (var item in partnerCoursePackagesInDb) { var partnerCoursePackage = _mapper.Map <PartnerCoursePackage, PartnerCoursePackageDTO>(item); searchPartnerResultDTO.PartnerCoursePackageDTOs.Add(partnerCoursePackage); } } PartnerCenterInfoDTO partnerCenterInfoDTO = _mapper.Map <PartnerCenterInfo, PartnerCenterInfoDTO>(partnerCenterInfo); searchPartnerResultDTO.PartnerCenterInfoDTO = partnerCenterInfoDTO; searchPartnerResultDTOs.Add(searchPartnerResultDTO); } //// now based on final list of crm partner dto prepare PartnerCoursePackage and PartnerEmployee //foreach (var crmPartner in crmPartnerDTOs) //{ // SearchPartnerResultDTO searchPartnerResultDTO = new SearchPartnerResultDTO(); // searchPartnerResultDTO.CRMPartnerDTO = crmPartner; // var partnerCoursePackageInDb = _choiceRepository.GetAllPartnerCoursePackagesByCrmPartnerId(crmPartner.CRMPartnerId); // var partnerCoursePackageList = _mapper.Map<List<PartnerCoursePackage>, List<PartnerCoursePackageDTO>>(partnerCoursePackageInDb); // var partnerEmployeeInDb = _choiceRepository.GetAll<PartnerEmployee>(x => x.CRMPartnerId == crmPartner.CRMPartnerId).ToList(); // var partnerEmployeeList = _mapper.Map<List<PartnerEmployee>, List<PartnerEmployeeDTO>>(partnerEmployeeInDb); // //partnerEmployeeDTOs.AddRange(partnerEmployeeList); // searchPartnerResultDTO.PartnerCoursePackageDtos.AddRange(partnerCoursePackageList); // searchPartnerResultDTO.PartnerEmployeeDTOs.AddRange(partnerEmployeeList); // searchPartnerResultDTOs.Add(searchPartnerResultDTO); //} } catch (Exception ex) { // log it here in future add appropriate message } return(Ok(searchPartnerResultDTOs)); }
// [Route("UpdatePartnerCenterInfo/{PartnerCenterInfoId:int}")] public IActionResult UpdatePartnerCenterInfo(int PartnerCenterInfoId, [FromBody] PartnerCenterInfoDTO partnerCenterInfoDTO) { if (!ModelState.IsValid) { return(BadRequest()); } if (partnerCenterInfoDTO == null) { return(BadRequest()); } var objPartnerCenterInfo = _choiceRepoistory.GetById <PartnerCenterInfo>(c => c.PartnerCenterInfoId == PartnerCenterInfoId); if (objPartnerCenterInfo == null) { return(BadRequest()); } //objPartnerCenterInfo.PartnerCenterInfoId = partnerCenterInfoDTO.PartnerCenterInfoId; objPartnerCenterInfo.CRMPartnerId = partnerCenterInfoDTO.CRMPartnerId; objPartnerCenterInfo.ContentStatusId = partnerCenterInfoDTO.ContentStatusId; objPartnerCenterInfo.TotalRooms = partnerCenterInfoDTO.TotalRooms; objPartnerCenterInfo.GroupRooms = partnerCenterInfoDTO.GroupRooms; // objPartnerCenterInfo.MaxSpaceAtRowOfChairs = partnerCenterInfoDTO.MaxSpaceAtRowOfChairs; //objPartnerCenterInfo.MaxspaceAtTables = partnerCenterInfoDTO.MaxspaceAtTables; objPartnerCenterInfo.StateAgreement = partnerCenterInfoDTO.StateAgreement; objPartnerCenterInfo.MaxAccommodation = partnerCenterInfoDTO.MaxAccommodation; objPartnerCenterInfo.PartnerCenfoInfoSPId = partnerCenterInfoDTO.PartnerCenfoInfoSPId; objPartnerCenterInfo.NumberOfSingleRooms = partnerCenterInfoDTO.NumberOfSingleRooms; objPartnerCenterInfo.NumberOfDoubleRooms = partnerCenterInfoDTO.NumberOfDoubleRooms; objPartnerCenterInfo.Suite = partnerCenterInfoDTO.Suite; objPartnerCenterInfo.DistanceToAddtiionalAccommodation = partnerCenterInfoDTO.DistanceToAddtiionalAccommodation; objPartnerCenterInfo.Chamber = partnerCenterInfoDTO.Chamber; objPartnerCenterInfo.HandicapRooms = partnerCenterInfoDTO.HandicapRooms; objPartnerCenterInfo.MaximumNumberOfVisitors = partnerCenterInfoDTO.MaximumNumberOfVisitors; objPartnerCenterInfo.MaxDiningPlacesInRestaurant = partnerCenterInfoDTO.MaxDiningPlacesInRestaurant; objPartnerCenterInfo.MaxDiningPlacesInRoom = partnerCenterInfoDTO.MaxDiningPlacesInRoom; objPartnerCenterInfo.MaxSpaceInAuditorium = partnerCenterInfoDTO.MaxSpaceInAuditorium; objPartnerCenterInfo.MinParticipants = partnerCenterInfoDTO.MinParticipants; objPartnerCenterInfo.AirportDistance = partnerCenterInfoDTO.AirportDistance; objPartnerCenterInfo.StationDdistance = partnerCenterInfoDTO.StationDdistance; objPartnerCenterInfo.DistanceToBus = partnerCenterInfoDTO.DistanceToBus; objPartnerCenterInfo.DistanceToMotorway = partnerCenterInfoDTO.DistanceToMotorway; objPartnerCenterInfo.NumberOfFreeParkingSpaces = partnerCenterInfoDTO.NumberOfFreeParkingSpaces; objPartnerCenterInfo.DistanceToFreeParking = partnerCenterInfoDTO.DistanceToFreeParking; objPartnerCenterInfo.NumberOfParkingSpaces = partnerCenterInfoDTO.NumberOfParkingSpaces; objPartnerCenterInfo.DistanceToPayParking = partnerCenterInfoDTO.DistanceToPayParking; objPartnerCenterInfo.EnvironmentalCertificate = partnerCenterInfoDTO.EnvironmentalCertificate; objPartnerCenterInfo.AgreementForEmployees = partnerCenterInfoDTO.AgreementForEmployees; objPartnerCenterInfo.Handicapfriendly = partnerCenterInfoDTO.Handicapfriendly; objPartnerCenterInfo.RegionsAgreement = partnerCenterInfoDTO.RegionsAgreement; objPartnerCenterInfo.Bar = partnerCenterInfoDTO.Bar; objPartnerCenterInfo.Lounge = partnerCenterInfoDTO.Lounge; //objPartnerCenterInfo.BilliardsDartTableTennis = partnerCenterInfoDTO.BilliardsDartTableTennis; objPartnerCenterInfo.Spa = partnerCenterInfoDTO.Spa; objPartnerCenterInfo.Pool = partnerCenterInfoDTO.Pool; objPartnerCenterInfo.FitnessRoom = partnerCenterInfoDTO.FitnessRoom; objPartnerCenterInfo.Casino = partnerCenterInfoDTO.Casino; objPartnerCenterInfo.DiningArea = partnerCenterInfoDTO.DiningArea; objPartnerCenterInfo.GreenArea = partnerCenterInfoDTO.GreenArea; objPartnerCenterInfo.Golf = partnerCenterInfoDTO.Golf; objPartnerCenterInfo.AirCondition = partnerCenterInfoDTO.AirCondition; objPartnerCenterInfo.CookingSchool = partnerCenterInfoDTO.CookingSchool; objPartnerCenterInfo.NoOfRooms = partnerCenterInfoDTO.PartnerCenterInfoId; objPartnerCenterInfo.Auditoriums = partnerCenterInfoDTO.Auditoriums; objPartnerCenterInfo.CreatedDate = partnerCenterInfoDTO.CreatedDate; objPartnerCenterInfo.CreatedBy = partnerCenterInfoDTO.CreatedBy; objPartnerCenterInfo.LastModified = partnerCenterInfoDTO.LastModified; objPartnerCenterInfo.LastModifiedBY = partnerCenterInfoDTO.LastModifiedBY; objPartnerCenterInfo.PartnerCentInfoSpId = partnerCenterInfoDTO.PartnerCentInfoSpId; _choiceRepoistory.Attach(objPartnerCenterInfo); _choiceRepoistory.Complete(); var crmPartner = _choiceRepoistory.GetById <CRMPartner>(x => x.CRMPartnerId == objPartnerCenterInfo.CRMPartnerId); crmPartner.LastModified = DateTime.UtcNow; crmPartner.LastModifiedBy = "CloudMission"; _choiceRepoistory.Attach(crmPartner); _choiceRepoistory.Complete(); return(NoContent()); }