public JsonResult GetBranchFactorReport(CustomerFactorViewModel model)
        {
            Response response;

            try
            {
                using (var db = new KiaGalleryContext())
                {
                    var query = db.CustomerFactor.Select(x => x);

                    var list = query.GroupBy(x => x.Branch).Select(x => new CustomerFactorViewModel
                    {
                        branchName  = x.Key.Name,
                        count       = x.Count(),
                        returnCount = x.Where(y => y.PurchaseType == PurchaseType.Return).Count(),
                        branchType  = x.Key.BranchType,
                    }).OrderBy(x => x.branchType).ToList();
                    var yesterdayList = query.Where(x => x.Date < DateTime.Today && x.Date >= DbFunctions.AddDays(DateTime.Today, -1)).GroupBy(x => x.Branch).Select(x => new CustomerFactorViewModel
                    {
                        branchName  = x.Key.Name,
                        count       = x.Count(),
                        returnCount = x.Where(y => y.PurchaseType == PurchaseType.Return).Count(),
                        branchType  = x.Key.BranchType,
                    }).OrderBy(x => x.branchType).ToList();
                    response = new Response()
                    {
                        status = 200,
                        data   = new
                        {
                            list          = list,
                            yesterdayList = yesterdayList
                        }
                    };
                }
            }
            catch (Exception ex)
            {
                response = Core.GetExceptionResponse(ex);
            }
            return(Json(response, JsonRequestBehavior.AllowGet));
        }
        public JsonResult SearchDetail(CustomerFactorViewModel model)
        {
            Response response;
            int      dataCount;

            var currentUser = GetAuthenticatedUser();

            try
            {
                long    priceSum        = 0;
                var     countSum        = 0;
                decimal?branchWeightSum = 0;
                using (var db = new KiaGalleryContext())
                {
                    var query = db.CustomerFactor.Select(x => x);
                    if (User.IsInRole("admin"))
                    {
                        priceSum        = query.Where(x => x.PurchaseType == PurchaseType.Buy).Sum(x => x.FactorPrice) - ((long?)query.Where(y => y.PurchaseType == PurchaseType.Return).Sum(y => y.FactorPrice) ?? 0);
                        countSum        = query.Where(x => x.PurchaseType == PurchaseType.Buy).Count() - query.Where(y => y.PurchaseType == PurchaseType.Return).Count();
                        branchWeightSum = query.Sum(x => x.FactorWeight);
                    }
                    else
                    {
                        branchWeightSum = query.Where(x => DbFunctions.TruncateTime(x.Date) == DateTime.Today && x.BranchId == currentUser.BranchId).Sum(x => x.FactorWeight) ?? 0;
                    }
                    if (!User.IsInRole("admin") && !User.IsInRole("loyalCustomer") && currentUser.BranchType == BranchType.Branch)
                    {
                        query = query.Where(x => x.BranchId == currentUser.BranchId);
                    }
                    if (!User.IsInRole("admin") && currentUser.BranchType == BranchType.Solicitorship)
                    {
                        query = query.Where(x => x.BranchId == currentUser.BranchId);
                    }
                    if (model.id != null && model.id > 0)
                    {
                        query = query.Where(x => x.CustomerLoyality.Id == model.id);
                    }
                    if (!string.IsNullOrEmpty(model.term))
                    {
                        query = query.Where(x => x.CustomerLoyality.PhoneNumber.Contains(model.term.Trim()) || x.CustomerLoyality.FirstName.Contains(model.term.Trim()) || x.CustomerLoyality.LastName.Contains(model.term.Trim()) || x.FactorNumber.Contains(model.term.Trim()));
                    }
                    dataCount = query.Count();
                    query     = query.OrderByDescending(x => x.Date).Skip(model.page * model.count).Take(model.count);
                    var list = query.Select(x => new CustomerLoyalityViewModel
                    {
                        id           = x.Id,
                        fullName     = x.CustomerLoyality.FirstName + " " + x.CustomerLoyality.LastName,
                        phoneNumber  = x.CustomerLoyality.PhoneNumber,
                        branchId     = x.BranchId,
                        branchName   = x.Branch.Name,
                        date         = x.Date,
                        factorPrice  = x.FactorPrice,
                        factorNumber = x.FactorNumber,
                        purchaseType = x.PurchaseType,
                        returnDate   = x.ReturnDate,
                        factorWeight = x.FactorWeight
                    }).ToList();
                    list.ForEach(x =>
                    {
                        x.persianDate         = DateUtility.GetPersianDate(x.date);
                        x.persianReturnDate   = DateUtility.GetPersianDate(x.returnDate);
                        x.separateFactorPrice = Core.ToSeparator(x.factorPrice);
                        x.purchaseTypeTitle   = Enums.GetTitle(x.purchaseType);
                    });

                    response = new Response()
                    {
                        status = 200,
                        data   = new
                        {
                            list            = list,
                            priceSum        = Core.ToSeparator(priceSum),
                            countSum        = Core.ToSeparator(countSum),
                            branchWeightSum = branchWeightSum,
                            pageCount       = Math.Ceiling((double)dataCount / model.count),
                            count           = dataCount,
                            page            = model.page + 1
                        }
                    };
                }
            }
            catch (Exception ex)
            {
                response = Core.GetExceptionResponse(ex);
            }
            return(Json(response, JsonRequestBehavior.AllowGet));
        }