public void SaveVersion <T>(T cName, int UserId)
        {
            int          Version = 1;
            Subscription val     = (Subscription)(object)cName;

            var result = _db.Subscription_History.Where(i => i.SubscriptionId == val.SubscriptionId).OrderByDescending(x => x.Version).FirstOrDefault();

            Version = (result == null) ? 1 : result.Version + 1;

            Subscription_History       S_History  = new Subscription_History();
            SubscriptionMarket_History SM_History = null;

            val.CopyProperties(S_History);

            S_History.ModifiedDate   = DateTime.UtcNow;
            S_History.UserId         = UserId;
            S_History.Version        = Version;
            S_History.LastSaved      = val.LastModified;
            S_History.SubscriptionId = val.SubscriptionId;

            var subMarket = _db.subscriptionMarket.Where(sm => sm.SubscriptionId == val.SubscriptionId).ToList();


            foreach (SubscriptionMarket smData in subMarket)
            {
                SM_History = new SubscriptionMarket_History();
                smData.CopyProperties(SM_History);
                var marketBase = _db.MarketBase_History.Where(mb => mb.MBId == smData.MarketBaseId).OrderByDescending(x => x.Version).FirstOrDefault();
                SM_History.MarketBaseVersion   = (marketBase == null) ? 1 : marketBase.Version;
                SM_History.SubscriptionVersion = Version;

                if (S_History.SubscriptionMarket_History == null)
                {
                    S_History.SubscriptionMarket_History = new List <SubscriptionMarket_History>();
                }
                S_History.SubscriptionMarket_History.Add(SM_History);
            }

            _db.Subscription_History.Add(S_History);
            _db.SaveChanges();
        }
        public dynamic GenerateReport(int Id, int startversion, int endVersion, string report)
        {
            List <string> nameChangeParm = new List <string>()
            {
                "StartDate", "EndDate"
            };
            SubscriptionDTO             dto    = new SubscriptionDTO();
            List <Subscription_History> result = _db.Subscription_History.Where(i => i.SubscriptionId == Id).Where(x => x.Version >= startversion && x.Version <= endVersion).ToList();

            #region SubscriptionPeriodChange
            if (report == ReportRequestType.SubscriptionPeriodChange)
            {
                if (result.Count > 1)
                {
                    for (int i = 1; i < result.Count; i++)
                    {
                        var item1    = result[i - 1];
                        var item2    = result[i];
                        var diffList = item1.GetObjectDifference(item2, nameChangeParm);

                        if (diffList.Count >= 1)
                        {
                            SubscriptionPeriodChangeDTO diff = new SubscriptionPeriodChangeDTO();
                            diff.DataSubscriptionPeriod = item1.StartDate.ToString("MMM-yyyy") + " ~ " + item1.EndDate.ToString("MMM-yyyy");
                            diff.VersionNumber          = item1.Version;
                            var userDetail = _db.Users.Where(a => a.UserID == item1.UserId).FirstOrDefault();
                            diff.SubmittedBy = userDetail.FirstName + " " + userDetail.LastName;
                            diff.DateTime    = item1.ModifiedDate.ToString("yyyy-MM-dd hh:mm:ss");
                            //("dd/MM/yyyy HH:mm:ss");
                            if (dto.SubscriptionPeriodChange == null)
                            {
                                dto.SubscriptionPeriodChange = new List <SubscriptionPeriodChangeDTO>();
                            }
                            int iCnt = dto.SubscriptionPeriodChange.Where(a => a.VersionNumber == item1.Version).Count();
                            if (iCnt == 0)
                            {
                                dto.SubscriptionPeriodChange.Add(diff);
                            }

                            diff = new SubscriptionPeriodChangeDTO();
                            // diff.StartDate = item2.StartDate;
                            diff.DataSubscriptionPeriod = item2.StartDate.ToString("MMM-yyyy") + " ~ " + item2.EndDate.ToString("MMM-yyyy");
                            //  diff.EndDate = item2.EndDate.ToString("MMM-yyyy");
                            diff.VersionNumber = item2.Version;
                            userDetail         = _db.Users.Where(a => a.UserID == item2.UserId).FirstOrDefault();
                            diff.SubmittedBy   = userDetail.FirstName + " " + userDetail.LastName;
                            diff.DateTime      = item2.ModifiedDate.ToString("yyyy-MM-dd hh:mm:ss");
                            //("dd/MM/yyyy HH:mm:ss");

                            dto.SubscriptionPeriodChange.Add(diff);
                        }
                    }
                }
            }


            #endregion

            #region SubscriptionMktbaseChange

            if (report == ReportRequestType.SubscriptionMktbaseChange)
            {
                SubscriptionMktBaseNamEChangeDTO        subMktDto    = new SubscriptionMktBaseNamEChangeDTO();
                List <SubscriptionMktBaseNamEChangeDTO> lstsubMktDto = new List <SubscriptionMktBaseNamEChangeDTO>();

                var MarketBases = (from sm in _db.SubscriptionMarket_History
                                   where sm.SubscriptionId == Id && sm.SubscriptionVersion >= startversion && sm.SubscriptionVersion <= endVersion
                                   select new { sm.SubscriptionVersion, sm.SubscriptionId, sm.MarketBaseId, sm.MarketBaseVersion }).Distinct().ToList();

                if (dto.SubscriptionMktBaseNamEChange == null)
                {
                    dto.SubscriptionMktBaseNamEChange = new List <SubscriptionMktBaseNamEChangeDTO>();
                }
                for (int version = startversion; version < endVersion; version++)
                {
                    //hasSettingChange = false;
                    var tempList1 = MarketBases.Where(x => x.SubscriptionVersion == version).OrderBy(m => m.MarketBaseId).Distinct().ToList();
                    var tempList2 = MarketBases.Where(x => x.SubscriptionVersion == version + 1).OrderBy(m => m.MarketBaseId).Distinct().ToList();
                    //if (tempList1.Count > 0 && tempList2.Count > 0)
                    //{
                    var deletedItem  = tempList1.Where(a => !tempList2.Any(a1 => a1.MarketBaseId == a.MarketBaseId)).Distinct().ToList();
                    var insertedItem = tempList2.Where(a => !tempList1.Any(a1 => a1.MarketBaseId == a.MarketBaseId)).Distinct().ToList();

                    //int userId = _db.Subscription_History.Where(x => x.SubscriptionId == Id).FirstOrDefault().UserId;
                    DateTime dtModifiedDate = DateTime.MinValue;
                    foreach (var mkt in deletedItem)
                    {
                        subMktDto = new SubscriptionMktBaseNamEChangeDTO();
                        MarketBase mktBase = _db.MarketBases.Where(x => x.Id == mkt.MarketBaseId).FirstOrDefault();

                        if (mktBase != null)
                        {
                            subMktDto.MarketBaseName += _db.MarketBases.Where(x => x.Id == mkt.MarketBaseId).FirstOrDefault().Name + "  " + _db.MarketBases.Where(x => x.Id == mkt.MarketBaseId).FirstOrDefault().Suffix;
                        }
                        subMktDto.MarketBaseVersion = mkt.MarketBaseVersion;
                        subMktDto.VersionNumber     = version + 1;
                        subMktDto.Action            = "Deleted";
                        if (_db.Subscription_History.Where(x => x.SubscriptionId == Id && x.Version == subMktDto.VersionNumber).FirstOrDefault() != null)
                        {
                            dtModifiedDate = _db.Subscription_History.Where(x => x.SubscriptionId == Id && x.Version == subMktDto.VersionNumber).FirstOrDefault().ModifiedDate;
                        }

                        Subscription_History sHistory = _db.Subscription_History.Where(x => x.SubscriptionId == Id && x.Version == subMktDto.VersionNumber).FirstOrDefault();
                        if (sHistory != null)
                        {
                            int userId     = _db.Subscription_History.Where(x => x.SubscriptionId == Id && x.Version == subMktDto.VersionNumber).FirstOrDefault().UserId;
                            var userDetail = _db.Users.Where(a => a.UserID == userId).FirstOrDefault();
                            subMktDto.SubmittedBy = userDetail.FirstName + " " + userDetail.LastName;
                        }
                        subMktDto.DateTime = dtModifiedDate.ToString("yyyy-MM-dd hh:mm:ss");
                        //("dd/MM/yyyy HH:mm:ss");
                        dto.SubscriptionMktBaseNamEChange.Add(subMktDto);
                    }

                    foreach (var mkt in insertedItem)
                    {
                        subMktDto = new SubscriptionMktBaseNamEChangeDTO();
                        MarketBase mktBase = _db.MarketBases.Where(x => x.Id == mkt.MarketBaseId).FirstOrDefault();

                        if (mktBase != null)
                        {
                            subMktDto.MarketBaseName += _db.MarketBases.Where(x => x.Id == mkt.MarketBaseId).FirstOrDefault().Name + "  " + _db.MarketBases.Where(x => x.Id == mkt.MarketBaseId).FirstOrDefault().Suffix;
                        }
                        subMktDto.MarketBaseVersion = mkt.MarketBaseVersion;
                        subMktDto.VersionNumber     = mkt.SubscriptionVersion;

                        subMktDto.Action = "Added";
                        if (_db.Subscription_History.Where(x => x.SubscriptionId == Id && x.Version == subMktDto.VersionNumber).FirstOrDefault() != null)
                        {
                            dtModifiedDate = _db.Subscription_History.Where(x => x.SubscriptionId == Id && x.Version == subMktDto.VersionNumber).FirstOrDefault().ModifiedDate;
                        }
                        Subscription_History sHistory = _db.Subscription_History.Where(x => x.SubscriptionId == Id && x.Version == subMktDto.VersionNumber).FirstOrDefault();
                        if (sHistory != null)
                        {
                            int userId     = _db.Subscription_History.Where(x => x.SubscriptionId == Id && x.Version == subMktDto.VersionNumber).FirstOrDefault().UserId;
                            var userDetail = _db.Users.Where(a => a.UserID == userId).FirstOrDefault();
                            subMktDto.SubmittedBy = userDetail.FirstName + " " + userDetail.LastName;
                        }
                        subMktDto.DateTime = dtModifiedDate.ToString("yyyy-MM-dd hh:mm:ss");
                        //("dd/MM/yyyy HH:mm:ss");
                        dto.SubscriptionMktBaseNamEChange.Add(subMktDto);
                    }
                    // }
                }
                // }
            }

            #endregion

            return(dto);
        }