public override ChungTuBusinessBase Clone()
        {
            TK[] arrClonedChiTietChungTu = new TK[ListChiTietChungTu.Count];
            ListChiTietChungTu.CopyTo(arrClonedChiTietChungTu);

            ChungTuKeToanKhoBusinessBase <T, TK> tmpBusiness = (ChungTuKeToanKhoBusinessBase <T, TK>)base.Clone();

            tmpBusiness.ListChiTietChungTu.Clear();
            tmpBusiness.ListChiTietChungTu.AddRange(arrClonedChiTietChungTu);
            return(tmpBusiness);
        }
        /// <summary>
        /// Kiểm tra có cập nhật thì mới lưu.
        /// </summary>
        protected internal override void SaveChungTuInstance()
        {
            TK[] arrBackupChiTietChungTu = new TK[ListChiTietChungTu.Count];
            ListChiTietChungTu.CopyTo(arrBackupChiTietChungTu);
            int backupChungTu = ChungTuInfo.IdChungTu;

            try
            {
                if (ListChiTietChungTu.Count == 0)
                {
                    throw new ManagedException("Không có line chi tiết!");
                }

                if (!IsOnTheSameAccountBook)
                {
                    throw new ManagedException("Không được ghi nhận trong cùng bộ sổ.");
                }

                if (IsEditMode)
                {
                    if (!ChungTuInfo.IsOrigin)
                    {
                        if ((ChungTuOriginInfo as ChungTuBaseInfo).IdKho != ChungTuInfo.IdKho)
                        {
                            throw new ManagedException("Chứng từ đã được tạo, không thể thay đổi thông tin kho!");
                        }

                        if ((ChungTuOriginInfo as ChungTuBaseInfo).SoChungTu != ChungTuInfo.SoChungTu)
                        {
                            throw new ManagedException("Chứng từ đã được tạo, không thể thay đổi số chứng từ!");
                        }

                        CheckInvalidLock();

                        BusinessProvider.UpdateChungTu(ChungTu);
                    }
                }
                else
                {
                    ChungTuInfo.IdChungTu = BusinessProvider.InsertChungTu(ChungTu);
                }

                //if ((((BusinessProviderBase)BusinessProvider).GetChungTuBySoChungTu<T>(ChungTuInfo.SoChungTu) as ChungTuBaseInfo).TrangThai == TrangThaiHuy)
                //{
                //    throw new ManagedException("Chứng từ này đã bị hủy!");
                //}

                //check so chung tu bi lap
                if (BusinessProvider is BusinessProviderBase)
                {
                    if (((BusinessProviderBase)BusinessProvider).
                        DuplicateSoChungTu(ChungTuInfo.SoChungTu, ChungTuInfo.IdChungTu))
                    {
                        throw new ManagedException("Số chứng từ này đã được sử dụng!");
                    }
                }


                List <TK> listOrigin = BusinessProvider.GetListChiTietChungTuByIdChungTu(ChungTuInfo.IdChungTu);

                if (!IsKeToan && listOrigin.Count == 0)
                {
                    throw new Exception("Nghiệp vụ này không làm phát sinh nội dung chứng từ");
                }

                ListChiTietChungTu.Sort(
                    delegate(TK cthh1, TK cthh2)
                {
                    return(ToBaseInfo(cthh1).IdSanPham.CompareTo(ToBaseInfo(cthh2).IdSanPham));
                });

                SaveChiTietChungTu(listOrigin, ListChiTietChungTu);

                if (ChungTuInfo.IdKho == 0)
                {
                    return;
                }

                ((BusinessProviderBase)BusinessProvider).ChungTuSyncPushORC(this);
            }
            catch (Exception ex)
            {
                ChungTuInfo.IdChungTu = backupChungTu;
                ListChiTietChungTu.Clear();
                ListChiTietChungTu.AddRange(arrBackupChiTietChungTu);
                var description = String.Empty;
                ListChiTietChungTu.ForEach(delegate(TK ctct)
                {
                    description += ToBaseInfo(ctct).IdSanPham + " " + ToBaseInfo(ctct).SoLuong + "\r\n";
                });
                description += ex.ToString();

                EventLogProvider.Instance.WriteOfflineLog(String.Format("{0}\r\n{1}", ChungTuInfo.SoChungTu, description), "Loi luu chung tu");
                throw;
            }
        }