public IActionResult InsertOrUpdateMembershipPrivilege([FromBody] MembershipPrivilegesCreateModel model)
 {
     try
     {
         var result = _membershipPrivilegeService.CreateOrUpdateMembershipPrivileges(model).Result;
         return(Ok(result));
     }
     catch (Exception ex)
     {
         return(BadRequest(ex.StackTrace.ToString()));
     }
 }
        public MembershipPrivilegesCreateModel GetMembershipPrivilegesById(int id)
        {
            var data = new MembershipPrivilegesCreateModel();

            try
            {
                var privilege = _dbConfigContext.AqmembershipDiscountPrivileges.SingleOrDefault(x => x.Id == id);
                if (id != 0 && privilege == null)
                {
                    return(null);
                }
                else
                {
                    if (id == 0)
                    {
                        data = new MembershipPrivilegesCreateModel
                        {
                            EffectiveDate    = DateTime.Now,
                            EffectiveEndDate = DateTime.Now.AddYears(1)
                        };
                    }
                    else
                    {
                        data = _mapper.Map <AqmembershipDiscountPrivileges, MembershipPrivilegesCreateModel>(privilege);
                    }
                    var listBooking      = _dbConfigContext.CommonValues.Where(x => x.ValueGroup == "BOOKINGPORTALDOMAIN").ToList();
                    var privilegeDetails = _dbConfigContext.AqmembershipDiscountPrivilegeDetails.Where(x => x.PrivilegeFid == id).ToList();
                    data.DataDetail = listBooking.GroupJoin(privilegeDetails.Where(c => c.PrivilegeFid == id), x => x.UniqueId, y => y.BookingDomainUniqueId,
                                                            (x, y) => new { Booking = x, Privilege = y }).SelectMany(x => x.Privilege.DefaultIfEmpty(), (x, y) => new { b = x.Booking, p = y }).Select(a => new MembershipPrivilegesDetailCreateModel()
                    {
                        ID = a.p?.Id,
                        BookingDomainFID      = a.b.Id,
                        BookingDomainName     = a.b.Text,
                        BookingDomainUniqueID = a.b.UniqueId,
                        DiscountPercent       = a.p?.DiscountPercent,
                        PrivilegeFID          = a.p?.PrivilegeFid,
                        Remark = a.p?.Remark
                    }).ToList();
                    return(data);
                }
            }
            catch
            {
                throw;
            }
        }
        bool CheckValidMembershipPrivileges(MembershipPrivilegesCreateModel model)
        {
            IQueryable <AqmembershipDiscountPrivileges> entities;

            if (model.ID > 0)
            {
                entities = _dbConfigContext.AqmembershipDiscountPrivileges.Where(x => !x.Deleted && x.Id != model.ID && x.EffectiveEndDate != null &&
                                                                                 x.EffectiveDate <= model.EffectiveDate && x.EffectiveEndDate >= model.EffectiveDate);
            }
            else
            {
                entities = _dbConfigContext.AqmembershipDiscountPrivileges.Where(x => !x.Deleted && x.EffectiveEndDate != null &&
                                                                                 x.EffectiveDate <= model.EffectiveDate && x.EffectiveEndDate >= model.EffectiveDate);
            }
            if (entities.Count() > 0)
            {
                return(false);
            }
            return(true);
        }
        public async Task <BasicResponse> CreateOrUpdateMembershipPrivileges(MembershipPrivilegesCreateModel model)
        {
            try
            {
                var check = CheckValidMembershipPrivileges(model);
                if (check)
                {
                    var entity = _dbConfigContext.AqmembershipDiscountPrivileges.FirstOrDefault(x => x.Id == model.ID);
                    if (entity != null)
                    {
                        entity.Name             = model.Name;
                        entity.Remark           = model.Remark;
                        entity.EffectiveDate    = model.EffectiveDate;
                        entity.EffectiveEndDate = model.EffectiveEndDate;
                        entity.LastModifiedBy   = GetCurrentUserId();
                        entity.LastModifiedDate = DateTime.Now;
                        entity.RoleFid          = model.RoleFID;
                        var details = _dbConfigContext.AqmembershipDiscountPrivilegeDetails.Where(x => x.PrivilegeFid == model.ID).ToList();
                        foreach (var i in details)
                        {
                            i.LastModifiedBy   = GetCurrentUserId();
                            i.LastModifiedDate = DateTime.Now;
                            i.DiscountPercent  = model.DataDetail.Find(x => x.ID == i.Id).DiscountPercent.GetValueOrDefault();
                        }
                        _dbConfigContext.AqmembershipDiscountPrivileges.Update(entity);
                        _dbConfigContext.AqmembershipDiscountPrivilegeDetails.UpdateRange(details);

                        UpdateOldMembershipPrivileges(entity);
                        _dbConfigContext.AqmembershipDiscountPrivileges.UpdateRange(entity);
                    }
                    else
                    {
                        var newMF = _mapper.Map <MembershipPrivilegesCreateModel, AqmembershipDiscountPrivileges>(model);
                        newMF.CreatedBy        = GetCurrentUserId();
                        newMF.CreatedDate      = DateTime.Now;
                        newMF.LastModifiedBy   = GetCurrentUserId();
                        newMF.LastModifiedDate = DateTime.Now;
                        _dbConfigContext.AqmembershipDiscountPrivileges.Add(newMF);
                        await _dbConfigContext.SaveChangesAsync();

                        var newDetails = _mapper.Map <List <MembershipPrivilegesDetailCreateModel>, List <AqmembershipDiscountPrivilegeDetails> >(model.DataDetail);
                        foreach (var i in newDetails)
                        {
                            i.PrivilegeFid     = newMF.Id;
                            i.LastModifiedBy   = GetCurrentUserId();
                            i.LastModifiedDate = DateTime.Now;
                        }
                        _dbConfigContext.AqmembershipDiscountPrivilegeDetails.AddRange(newDetails);
                        UpdateOldMembershipPrivileges(newMF);
                    }
                    await _dbConfigContext.SaveChangesAsync();

                    return(BasicResponse.Succeed("Success"));
                }
                else
                {
                    return(BasicResponse.Failed("Effective Date Invalid!"));
                }
            }
            catch
            {
                throw;
            }
        }