/// <summary>
        /// LayGia
        /// </summary>
        /// <param name="maHangHoa"></param>
        /// <param name="sl"></param>
        /// <param name="ngayLapHd"></param>
        /// <param name="source"></param>
        /// <returns></returns>
        public KhuyenMaiSoLuong LayGia(string maHangHoa, string sl, DateTime ngayLapHd, KhuyenMaiSoLuong[] source)
        {
            KhuyenMaiSoLuong retVal;
            try
            {
                KhuyenMaiSoLuong[] temp = frmXuLyHangHoa.GetSource(maHangHoa, source);
                temp = frmXuLyHangHoa.SapXep(temp);
                retVal = frmXuLyHangHoa.GetDonGia(maHangHoa, sl, ngayLapHd, temp);
            }
            catch
            {
                retVal = null;
            }

            return retVal;
        }
        /// <summary>
        /// GetData
        /// </summary>
        /// <param name="maHangHoa"></param>
        /// <returns></returns>
        public Entities.KhuyenMaiSoLuong[] GetData(string maHangHoa)
        {
            Entities.KhuyenMaiSoLuong[] retVal = null;
            try
            {
                cl = new Server_Client.Client();
                // gán TCPclient
                this.client1 = cl.Connect(Luu.IP, Luu.Ports);
                // khởi tạo biến truyền vào với hàm khởi tạo
                Entities.KhuyenMaiSoLuong item = new Entities.KhuyenMaiSoLuong();
                // truyền HanhDong
                item = new Entities.KhuyenMaiSoLuong();
                item.HanhDong = "Select";
                item.MaHangHoa = maHangHoa.Trim().ToUpper();
                // khởi tạo mảng đối tượng để hứng giá trị
                Entities.KhuyenMaiSoLuong[] item1 = new Entities.KhuyenMaiSoLuong[1];
                clientstrem = cl.SerializeObj(this.client1, "KhuyenMaiSoLuong", item);
                // đổ mảng đối tượng vào datagripview
                item1 = (Entities.KhuyenMaiSoLuong[])cl.DeserializeHepper1(clientstrem, item1);
                // Gan gia tri
                retVal = item1;
            }
            catch
            {
                retVal = null;
            }

            return retVal;
        }
        /// <summary>
        /// GetData
        /// </summary>
        /// <param name="maHangHoa"></param>
        /// <returns></returns>
        public KhuyenMaiSoLuong[] GetData()
        {
            KhuyenMaiSoLuong[] retVal = null;
            try
            {
                cl = new Server_Client.Client();
                // gán TCPclient
                Client1 = cl.Connect(Luu.IP, Luu.Ports);
                // khởi tạo biến truyền vào với hàm khởi tạo
                // truyền HanhDong
                KhuyenMaiSoLuong item = new KhuyenMaiSoLuong { HanhDong = "SelectAll" };
                // khởi tạo mảng đối tượng để hứng giá trị
                KhuyenMaiSoLuong[] item1 = new KhuyenMaiSoLuong[1];
                Clientstrem = cl.SerializeObj(Client1, "KhuyenMaiSoLuong", item);
                // đổ mảng đối tượng vào datagripview
                item1 = (KhuyenMaiSoLuong[])cl.DeserializeHepper1(Clientstrem, item1);
                // Gan gia tri
                retVal = item1;
            }
            catch
            {
                retVal = null;
            }

            return retVal;
        }
 /// <summary>
 /// SapXep
 /// </summary>
 /// <param name="source"></param>
 /// <returns></returns>
 public static KhuyenMaiSoLuong[] SapXep(KhuyenMaiSoLuong[] source)
 {
     KhuyenMaiSoLuong[] retVal;
     try
     {
         if (source == null)
             return null;
         retVal = source.OrderBy(c => c.SoLuong).ToArray();
     }
     catch { retVal = null; }
     return retVal;
 }
        /// <summary>
        /// GetSource
        /// </summary>
        /// <param name="maHangHoa"></param>
        /// <param name="source"></param>
        /// <returns></returns>
        public static KhuyenMaiSoLuong[] GetSource(string maHangHoa, KhuyenMaiSoLuong[] source)
        {
            KhuyenMaiSoLuong[] retVal;
            try
            {
                var query = from item in source
                            where item.MaHangHoa.Trim().ToUpper().Equals(maHangHoa.Trim().ToUpper())
                            select item;

                retVal = query.ToArray();
            }
            catch
            {
                retVal = null;
            }

            return retVal;
        }
        /// <summary>
        /// GetDonGia
        /// </summary>
        /// <param name="?"></param>
        /// <param name="maHangHoa"> </param>
        /// <param name="sl"> </param>
        /// <param name="ngayLapHd"> </param>
        /// <param name="source"> </param>
        /// <returns></returns>
        public static KhuyenMaiSoLuong GetDonGia(string maHangHoa, string sl, DateTime ngayLapHd, KhuyenMaiSoLuong[] source)
        {
            KhuyenMaiSoLuong retVal = null;
            try
            {
                if (source == null)
                    return null;

                int length = source.Length;
                KhuyenMaiSoLuong temp;
                // truong hop 1 (chi co 1 item trong source)
                if (length == 1)
                {
                    var query = from item in source
                                let a = item.MaHangHoa.Trim().ToUpper().Equals(maHangHoa.Trim().ToUpper())
                                let b = item.SoLuong <= double.Parse(sl)
                                let c = (item.NgayBatDau.Date >= ngayLapHd.Date) && (item.NgayKetThuc.Date <= ngayLapHd.Date)
                                where a && b && c
                                select item;

                    KhuyenMaiSoLuong[] tempArr = query.ToArray();

                    if (tempArr != null && tempArr.Length > 0)
                    {
                        retVal = tempArr[0];
                        return retVal;
                    }
                }
                // Truong hop 2(sl hang hoa > ca max trong source)
                if (length > 1)
                {
                    temp = source[length - 1];

                    bool a = temp.SoLuong <= double.Parse(sl);
                    bool b = temp.MaHangHoa.Trim().ToUpper().Equals(maHangHoa.Trim().ToUpper());
                    bool c = (temp.NgayBatDau.Date >= ngayLapHd.Date) && (temp.NgayKetThuc.Date <= ngayLapHd.Date);

                    if (a && b && c)
                        return temp;
                }
                // Truong hop 3
                temp = null;
                foreach (Entities.KhuyenMaiSoLuong item in source)
                {
                    // so sanh so luong truoc
                    if (double.Parse(sl) >= item.SoLuong)
                    {
                        temp = item;
                    }
                    else
                        break;
                }

                if (temp != null)
                {
                    bool b = temp.MaHangHoa.Trim().ToUpper().Equals(maHangHoa.Trim().ToUpper());
                    bool c = (temp.NgayBatDau.Date <= ngayLapHd.Date) && (temp.NgayKetThuc.Date >= ngayLapHd.Date);

                    if (b && c)
                        retVal = temp;
                }
            }
            catch
            {
                retVal = null;
            }

            return retVal;
        }
        /// <summary>
        /// txtKMKT_KeyDown
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void txtGiaBanBuon_KeyDown(object sender, KeyEventArgs e)
        {
            try
            {
                if (e.KeyCode.Equals(Keys.Enter))
                {
                    // Validate
                    if (!ValidateDataKM())
                        return;
                    // lay data
                    Entities.KhuyenMaiSoLuong item = new Entities.KhuyenMaiSoLuong();
                    item.MaHangHoa = txtMaHangHoa.Text.Trim().ToUpper();
                    item.TenHangHoa = txtTenHangHoa.Text;
                    item.HanhDong = "Insert";
                    item.SoLuong = double.Parse(txtSoLuongKM.Text);
                    double giaBanBuon = 0;

                    if (!string.IsNullOrEmpty(txtKMGiaBanBuon.Text))
                        giaBanBuon = double.Parse(txtKMGiaBanBuon.Text);

                    item.GiaBanBuon = giaBanBuon;
                    item.GiaBanLe = double.Parse(txtKMGiaBanLe.Text);
                    item.NgayBatDau = ConvertDatetime(txtKMBD.Text);
                    item.NgayKetThuc = ConvertDatetime(txtKMKT.Text);
                    // Check Trung, khong trung , trung 1 phan
                    Entities.KhuyenMaiSoLuong[] source = (Entities.KhuyenMaiSoLuong[])grvKhuyenMaiSL.DataSource;

                    string result = CheckKhoangTime(item, source);
                    bool isValidate = true;

                    if (!string.IsNullOrEmpty(result))
                    {
                        switch (result)
                        {
                            //case "trung":
                            //    {
                            //        MessageBox.Show("Thời gian khuyến mại không được trùng nhau, vui lòng kiểm tra lại! ", "Hệ thống cảnh báo", MessageBoxButtons.OK);
                            //        isValidate = false;
                            //        break;
                            //    }
                            case "trungmotphan":
                                {
                                    MessageBox.Show("Số lượng khuyến mại không được giống nhau, vui lòng kiểm tra lại! ", "Hệ thống cảnh báo", MessageBoxButtons.OK);
                                    isValidate = false;
                                    break;
                                }
                        }
                    }

                    if (isValidate)
                    {
                        // add to list view
                        this.AddToList(item);
                    }
                    //
                }
            }
            catch
            {
            }
        }
        /// <summary>
        /// Update
        /// </summary>
        /// <param name="source"></param>
        /// <returns></returns>
        public bool Update(Entities.KhuyenMaiSoLuong[] source)
        {
            bool retVal = false;
            try
            {
                // Validate
                if (source == null || source.Length <= 0)
                {
                    MessageBox.Show("Danh sách hàng khuyến mại không được để trống, Vui lòng kiểm tra lại", "Hệ thống cảnh báo", MessageBoxButtons.OK);
                    return false;
                }
                //Nghiep vu
                int msg = 0;
                cl = new Server_Client.Client();
                // gán TCPclient
                this.client1 = cl.Connect(Luu.IP, Luu.Ports);
                // khởi tạo biến truyền vào với hàm khởi tạo
                Entities.KhuyenMaiSoLuong item = new Entities.KhuyenMaiSoLuong();
                // Delete
                item = source[0];
                item.HanhDong = "Delete";
                clientstrem = cl.SerializeObj(this.client1, "KhuyenMaiSoLuong", item);
                // đổ mảng đối tượng vào datagripview
                msg = (int)cl.DeserializeHepper(clientstrem, msg);
                // Insert
                foreach (Entities.KhuyenMaiSoLuong item1 in source)
                {
                    item1.HanhDong = "Insert";
                    clientstrem = cl.SerializeObj(this.client1, "KhuyenMaiSoLuong", item1);
                    // đổ mảng đối tượng vào datagripview
                    msg = (int)cl.DeserializeHepper(clientstrem, msg);
                }

                if (msg != 0)
                    retVal = true;
            }
            catch
            {
                retVal = false;
            }

            return retVal;
        }