protected void LinqDataSourceEnd_Selecting(object sender, LinqDataSourceSelectEventArgs e)
    {
        ucDateRange.Validated();

        var packBLL = new PackBLL();

        e.Result = packBLL.GetRemainByDate(ucDateRange.ToDate.Value)
            .Select(r => new { r.ProductCode, r.Donation.BloodGroup, r.Volume })
            .ToList()
            .GroupBy(r => new { r.ProductCode }, (r, sub) => new
            {
                r.ProductCode,
                ProductDesc = ProductBLL.GetDesc(r.ProductCode),
                Total = sub.Count(),
                BloodGroupSumary = sub.GroupBy(r1 => r1.BloodGroup, (r1, BGSub) => new
                {
                    BloodGroupDesc = BloodGroupBLL.GetDescription(r1),
                    Total = BGSub.Count(),
                    Order = BloodGroupBLL.GetOrder(r1),
                }).OrderBy(r1 => r1.Order).ThenBy(r1 => r1.BloodGroupDesc),
                VolumeSumary = sub.GroupBy(r1 => r1.Volume, (r1, VolSub) => new
                {
                    Volume = r1,
                    Total = VolSub.Count()
                })
            })
            .OrderBy(r => r.ProductDesc);
    }
        public ActionResult _609(string productCode, DateTime? from, DateTime? to, bool? Start, bool? In, bool? Out, bool? End)
        {
            if (!Start.HasValue) Start = true;
            if (!End.HasValue) End = true;
            if (!In.HasValue) In = true;
            if (!Out.HasValue) Out = true;

            if (!from.HasValue || !to.HasValue)
            {
                from = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
                to = DateTime.Now.Date;
            }

            ViewBag.from = from.Value.ToStringVNLong();
            ViewBag.to = to.Value.ToStringVNLong();
            ViewBag.chkStart = Start.Value;
            ViewBag.chkEnd = End.Value;
            ViewBag.chkIn = In.Value;
            ViewBag.chkOut = Out.Value;

            RedBloodDataContext db = new RedBloodDataContext();

            ViewBag.Start = new List<RptModel1>();
            ViewBag.End = new List<RptModel1>();
            ViewBag.In = new List<RptModel1>();
            ViewBag.Out = new List<RptModel1>();

            PackBLL packBLL = new PackBLL();

            if (Start.HasValue && Start.Value)
            {
                ViewBag.Start = packBLL.GetRemainByDate(from.Value)
                    .Where(r => r.ProductCode == productCode)
                    .Select(r => new { r.ID }.ToExpando())
                    .ToList()
                    ;
            }

            if (End.HasValue && End.Value)
            {
                ViewBag.End = packBLL.GetRemainByDate(to.Value)
                   .Where(r => r.ProductCode == productCode)
                    .Select(r => new { r.ID }.ToExpando())
                    .ToList()
                    ;
            }

            Func<IGrouping<string, Rpt608_M1>, string, int> f1 = (l, aboLetter) =>
            {
                return l.Where(r1 => BloodGroupBLL.GetLetter(r1.BloodGroup) == aboLetter).Sum(r1 => r1.Count);
            };

            if (In.HasValue && In.Value)
            {
                ViewBag.In = db.PackTransactions
                    .Where(r =>
                (r.Type == PackTransaction.TypeX.In_Collect ||
                r.Type == PackTransaction.TypeX.In_Product) &&
               from <= r.Date && r.Date <= to
                )
                .Where(r => r.Pack.ProductCode == productCode)
                    .Select(r => new { ID = r.PackID }.ToExpando())
                    .ToList()
                    ;
            }

            if (Out.HasValue && Out.Value)
            {
                ViewBag.Out = db.PackTransactions
                    .Where(r =>
               PackTransactionBLL.OutTypeList.Contains(r.Type) &&
               from <= r.Date && r.Date <= to
                )
                .Where(r => r.Pack.ProductCode == productCode)
                    .Select(r => new { ID = r.PackID }.ToExpando())
                    .ToList()
                    ;
            }

            return View();
        }
        public ActionResult _612(DateTime? from, DateTime? to)
        {
            if (!from.HasValue || !to.HasValue)
            {
                from = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
                to = DateTime.Now.Date;
            }

            ViewBag.from = from.Value.ToStringVNLong();
            ViewBag.to = to.Value.ToStringVNLong();

            RedBloodDataContext db = new RedBloodDataContext();
            db.CommandTimeout = 3600;

            PackBLL packBLL = new PackBLL();
            var end = packBLL.GetRemainByDate(to.Value)
                .Where(r => Product.Apheresis.ProductCodeList.Contains(r.ProductCode))
                .Select(r => new { r.Donation.BloodGroup })
                .ToList()
                .GroupBy(r => BloodGroupBLL.GetLetter(r.BloodGroup))
                .Select(r =>
                    new
                    {
                        ABO = r.Key,
                        Count = r.Count(),
                    })
                    .ToList();

            ViewBag.L = db.PackTransactions
                .Where(r => from <= r.Date && r.Date <= to && Product.Apheresis.ProductCodeList.Contains(r.Pack.ProductCode))
                .Select(r => new { r.Pack.ProductCode, r.Pack.Donation.BloodGroup, r.Type })
                .ToList()
                .GroupBy(r => new { r.ProductCode, r.BloodGroup, r.Type })
                .Select(r => new { r.Key.ProductCode, r.Key.BloodGroup, r.Key.Type, Count = r.Count() })
                .ToList()
                .GroupBy(r => BloodGroupBLL.GetLetter(r.BloodGroup))
                .Select(r => new Rpt612
                {
                    ABO = r.Key,
                    In = r.Where(r1 => PackTransactionBLL.InTypeList.Contains(r1.Type)).Sum(r1 => r1.Count),
                    Out = r.Where(r1 => PackTransactionBLL.OutTypeList.Contains(r1.Type)).Sum(r1 => r1.Count),
                    End = end.Where(r1 => r1.ABO == r.Key).FirstOrDefault() != null ? end.Where(r1 => r1.ABO == r.Key).FirstOrDefault().Count : 0,
                }).ToList();

            return View();
        }
        public ActionResult _608(DateTime? from, DateTime? to, bool? Start, bool? In, bool? Out, bool? End)
        {
            if (!Start.HasValue) Start = true;
            if (!End.HasValue) End = true;
            if (!In.HasValue) In = true;
            if (!Out.HasValue) Out = true;

            if (!from.HasValue || !to.HasValue)
            {
                from = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
                to = DateTime.Now.Date;
            }

            ViewBag.from = from.Value.ToStringVNLong();
            ViewBag.to = to.Value.ToStringVNLong();
            ViewBag.chkStart = Start.Value;
            ViewBag.chkEnd = End.Value;
            ViewBag.chkIn = In.Value;
            ViewBag.chkOut = Out.Value;

            RedBloodDataContext db = new RedBloodDataContext();
            db.CommandTimeout = 3600;

            ViewBag.Start = new List<RptModel1>();
            ViewBag.End = new List<RptModel1>();
            ViewBag.In = new List<RptModel1>();
            ViewBag.Out = new List<RptModel1>();

            PackBLL packBLL = new PackBLL();

            if (Start.HasValue && Start.Value)
            {
                ViewBag.Start = packBLL.GetRemainByDate(from.Value)
                    .Select(r => new { r.ProductCode, r.Donation.BloodGroup })
                    .ToList()
                    .GroupBy(r => r.ProductCode)
                    .Select(r => new RptModel1
                    {
                        ProductCode = r.Key,
                        Name = ProductBLL.GetGroupName(r.Key),
                        Sum = r.Count(),
                        A = r.Where(r1 => BloodGroupBLL.GetLetter(r1.BloodGroup) == BloodGroup.ABOLetter_A).Count(),
                        B = r.Where(r1 => BloodGroupBLL.GetLetter(r1.BloodGroup) == BloodGroup.ABOLetter_B).Count(),
                        AB = r.Where(r1 => BloodGroupBLL.GetLetter(r1.BloodGroup) == BloodGroup.ABOLetter_AB).Count(),
                        O = r.Where(r1 => BloodGroupBLL.GetLetter(r1.BloodGroup) == BloodGroup.ABOLetter_O).Count(),
                    }).ToList();
            }

            if (End.HasValue && End.Value)
            {
                ViewBag.End = packBLL.GetRemainByDate(to.Value)
                   .Select(r => new { r.ProductCode, r.Donation.BloodGroup })
                   .ToList()
                   .GroupBy(r => r.ProductCode)
                   .Select(r => new RptModel1
                   {
                       ProductCode = r.Key,
                       Name = ProductBLL.GetGroupName(r.Key),
                       Sum = r.Count(),
                       A = r.Where(r1 => BloodGroupBLL.GetLetter(r1.BloodGroup) == BloodGroup.ABOLetter_A).Count(),
                       B = r.Where(r1 => BloodGroupBLL.GetLetter(r1.BloodGroup) == BloodGroup.ABOLetter_B).Count(),
                       AB = r.Where(r1 => BloodGroupBLL.GetLetter(r1.BloodGroup) == BloodGroup.ABOLetter_AB).Count(),
                       O = r.Where(r1 => BloodGroupBLL.GetLetter(r1.BloodGroup) == BloodGroup.ABOLetter_O).Count(),
                   }).ToList();
            }

            Func<IGrouping<string, Rpt608_M1>, string, int> f1 = (l, aboLetter) =>
            {
                return l.Where(r1 => BloodGroupBLL.GetLetter(r1.BloodGroup) == aboLetter).Sum(r1 => r1.Count);
            };

            if (In.HasValue && In.Value)
            {
                ViewBag.In = db.PackTransactions
                    .Where(r =>
                (r.Type == PackTransaction.TypeX.In_Collect ||
                r.Type == PackTransaction.TypeX.In_Product) &&
               from <= r.Date && r.Date <= to
                )
                .GroupBy(r => new { r.Pack.ProductCode, r.Pack.Donation.BloodGroup })
                .Select(r => new Rpt608_M1 { ProductCode = r.Key.ProductCode, BloodGroup = r.Key.BloodGroup, Count = r.Count() })
                .ToList()
                    .GroupBy(r => r.ProductCode)
                    .Select(r => new RptModel1
                    {
                        ProductCode = r.Key,
                        Name = ProductBLL.GetGroupName(r.Key),
                        Sum = r.Sum(r1 => r1.Count),
                        A = f1(r, BloodGroup.ABOLetter_A),
                        B = f1(r, BloodGroup.ABOLetter_B),
                        AB = f1(r, BloodGroup.ABOLetter_AB),
                        O = f1(r, BloodGroup.ABOLetter_O),
                    }).ToList();
            }

            if (Out.HasValue && Out.Value)
            {
                ViewBag.Out = db.PackTransactions
                    .Where(r =>
               PackTransactionBLL.OutTypeList.Contains(r.Type) &&
               from <= r.Date && r.Date <= to
                )
                .GroupBy(r => new { r.Pack.ProductCode, r.Pack.Donation.BloodGroup })
                .Select(r => new Rpt608_M1 { ProductCode = r.Key.ProductCode, BloodGroup = r.Key.BloodGroup, Count = r.Count() })
                .ToList()

                    .ToList()
                    .GroupBy(r => r.ProductCode)
                    .Select(r => new RptModel1
                    {
                        ProductCode = r.Key,
                        Name = ProductBLL.GetGroupName(r.Key),
                        Sum = r.Sum(r1 => r1.Count),
                        A = f1(r, BloodGroup.ABOLetter_A),
                        B = f1(r, BloodGroup.ABOLetter_B),
                        AB = f1(r, BloodGroup.ABOLetter_AB),
                        O = f1(r, BloodGroup.ABOLetter_O),
                    }).ToList();
            }

            return View();
        }