private PromotionOut CreateCardPromotion(Promotion itm, List <QuaTangKH> lstQuaTangKH)
        {
            var i = new PromotionOut
            {
                Id          = itm.Id.ToString(),
                Name        = itm.Name,
                IsChange    = itm.IsChange,
                FlagTangQua = 0,
                QuaTangKH   = lstQuaTangKH,
                CountPrice  = lstQuaTangKH.Sum(s => s.Price),
                Code        = itm.Code,
                label       = itm.Code,
                value       = itm.Id.ToString(),
            };

            return(i);
        }
        public dynamic Check(string accNo, string json, string phanhe, ClaimsPrincipal principal)
        {
            dynamic result = new ExpandoObject();

            try
            {
                var lstPromotion = new List <PromotionOut>();
                var lstCusGift   = new List <CustomerGift>();
                var cusGift      = new CustomerGift();

                var userinfo = ContextProvider.GetUserInfo(principal);

                var infoCusFromCoreBanking = ConvertJson(json);
                //var infoCusFromCoreBanking = JsonConvert.DeserializeObject<CustomerDTO>(json);

                SessionManager.DoWork(ss =>
                {
                    var lstUser      = ss.Query <User>().ToList();
                    var now          = DateTime.Now;
                    var timeNow      = DateTime.ParseExact(new DateTime(now.Year, now.Month, now.Day, 0, 0, 0).ToString("yyyy-MM-dd hh:mm:ss tt"), "yyyy-MM-dd hh:mm:ss tt", CultureInfo.InvariantCulture);
                    var idPromotions = ss.Query <Store>().Where(s => s.DepartmentId == userinfo.Organization.Id && s.Amount > 0).Select(s => s.PromotionId).ToList();
                    if (idPromotions.Count == 0)
                    {
                        result.MesError = "Hiện không triển khai chương trình khuyến mãi nào.";
                    }
                    var promotions = ss.Query <Promotion>().Where(s =>
                                                                  s.StartDate <= timeNow &&
                                                                  s.FinishDate >= timeNow &&
                                                                  s.Status == 2).ToList();
                    if (promotions.Count == 0)
                    {
                        result.MesError = "Hiện không triển khai chương trình khuyến mãi nào.";
                    }
                    else
                    {
                        var status = false;
                        foreach (var itm in promotions)
                        {
                            var quaTangKH       = new QuaTangKH();
                            var promotionIdUsed = new Guid();

                            cusGift = ss.Query <CustomerGift>().SingleOrDefault(s => s.Acctno == accNo && s.Promotion.Id == itm.Id && s.PhanHe == phanhe);
                            if (cusGift != null)
                            {
                                status = true;
                                lstCusGift.Add(cusGift);

                                var gifts       = ss.Query <Gift>().Where(s => s.Id == cusGift.Gift.Id).ToList();
                                promotionIdUsed = cusGift.Promotion.Id;

                                quaTangKH.GiftId   = cusGift.Gift.Id.ToString();
                                quaTangKH.GiftName = ContextProvider.GiftName(gifts, cusGift.Gift.Id);
                                quaTangKH.Num      = cusGift.NumGift;

                                var lstQuaTangKH = new List <QuaTangKH>();
                                lstQuaTangKH.Add(quaTangKH);

                                var promotionOut = new PromotionOut
                                {
                                    Id          = promotionIdUsed.ToString(),
                                    Code        = ContextProvider.GetPromotionCode(promotions, promotionIdUsed),
                                    Name        = ContextProvider.GetPromotionName(promotions, promotionIdUsed),
                                    label       = ContextProvider.GetPromotionCode(promotions, promotionIdUsed),
                                    value       = promotionIdUsed.ToString(),
                                    FlagTangQua = cusGift.Status,
                                    QuaTangKH   = lstQuaTangKH
                                };
                                lstPromotion.Add(promotionOut);
                            }
                            if (idPromotions.Any(a => a == itm.Id))
                            {
                                var idGP    = promotions.Select(s => s.GiftPromotionId).ToList();
                                var giftIds = ss.Query <GiftPromotion>().Where(s => idGP.Contains(s.GiftPromotionId)).Select(s => s.GiftId).ToList();
                                var gift    = ss.Query <Gift>().Where(s => giftIds.Contains(s.Id)).ToList();
                                if (promotionIdUsed.ToString() != Constants.GUIDE_TYPE_NULL)
                                {
                                    if (itm.Id != promotionIdUsed)
                                    {
                                        var lstQuaTangKH = new List <QuaTangKH>();

                                        if (infoCusFromCoreBanking.FRDATE >= itm.StartDate && infoCusFromCoreBanking.FRDATE <= itm.FinishDate)
                                        {
                                            var configPromotion = JsonConvert.DeserializeObject <List <ConfigPromotion> >(itm.ConfigPromotion.ToString());
                                            foreach (var itmConfigPromotion in configPromotion)
                                            {
                                                if (string.IsNullOrEmpty(phanhe))
                                                {
                                                    phanhe = "DEFAULT";
                                                }
                                                if (infoCusFromCoreBanking.TERM >= decimal.Parse(itmConfigPromotion.kyhantoithieu) &&
                                                    infoCusFromCoreBanking.BALANCE >= decimal.Parse(itmConfigPromotion.sodutoithieu) &&
                                                    itmConfigPromotion.phanhe.ToUpper() == phanhe.ToUpper())
                                                {
                                                    infoCusFromCoreBanking.PhanHe = phanhe.ToUpper();

                                                    var dataGift = itmConfigPromotion.dataKhaiBaoQuaTang;
                                                    if (dataGift == null)
                                                    {
                                                        result.MesError = "Chưa thiết lập nguyên tắc tặng quà.";
                                                    }
                                                    else
                                                    {
                                                        lstQuaTangKH = CreateLstGift(dataGift, gift, infoCusFromCoreBanking);
                                                    }
                                                }
                                            }
                                        }
                                        if (lstQuaTangKH.Count > 0)
                                        {
                                            lstPromotion.Add(CreateCardPromotion(itm, lstQuaTangKH));
                                        }
                                    }
                                }

                                else
                                {
                                    var lstQuaTangKH = new List <QuaTangKH>();

                                    if (infoCusFromCoreBanking.FRDATE >= itm.StartDate && infoCusFromCoreBanking.FRDATE <= itm.FinishDate)
                                    {
                                        var configPromotion = JsonConvert.DeserializeObject <List <ConfigPromotion> >(itm.ConfigPromotion.ToString());
                                        foreach (var itmConfigPromotion in configPromotion)
                                        {
                                            if (string.IsNullOrEmpty(phanhe))
                                            {
                                                phanhe = "DEFAULT";
                                            }
                                            if (infoCusFromCoreBanking.TERM >= decimal.Parse(itmConfigPromotion.kyhantoithieu) &&
                                                infoCusFromCoreBanking.BALANCE >= decimal.Parse(itmConfigPromotion.sodutoithieu) &&
                                                itmConfigPromotion.phanhe.ToUpper() == phanhe.ToUpper())
                                            {
                                                infoCusFromCoreBanking.PhanHe = phanhe.ToUpper();

                                                var dataGift = itmConfigPromotion.dataKhaiBaoQuaTang;
                                                if (dataGift == null)
                                                {
                                                    result.MesError = "Chưa thiết lập nguyên tắc tặng quà.";
                                                }

                                                else
                                                {
                                                    lstQuaTangKH = CreateLstGift(dataGift, gift, infoCusFromCoreBanking);
                                                }
                                            }
                                        }
                                    }
                                    if (lstQuaTangKH.Count > 0)
                                    {
                                        lstPromotion.Add(CreateCardPromotion(itm, lstQuaTangKH));
                                    }
                                }
                            }
                        }

                        if (lstCusGift.Count == 0)
                        {
                            lstCusGift.Add(infoCusFromCoreBanking);
                        }

                        result.InfoCus = LstCustomer(lstCusGift, phanhe, lstUser);

                        result.LstPromotion = lstPromotion.ToList().OrderByDescending(o => o.CountPrice).ToList();
                        result.Status       = status;
                    }
                });
            }
            catch (Exception ex)
            {
                throw;
            }
            return(result);
        }