/// <summary>
        /// 
        /// </summary>
        /// <param name="objThanhtoan"></param>
        /// <param name="objLuotkham"></param>
        /// <param name="objArrPaymentDetail"></param>
        /// <param name="id_thanhtoan"></param>
        /// <param name="IdHdonLog"></param>
        /// <param name="Layhoadondo"></param>
        /// <param name="TongtienBNchitra"></param>
        /// <returns></returns>
        public ActionResult ThanhtoanChiphiDVuKCB(KcbThanhtoan objThanhtoan, KcbLuotkham objLuotkham, List<KcbThanhtoanChitiet> objArrPaymentDetail, ref int id_thanhtoan, long IdHdonLog, bool Layhoadondo, ref decimal TongtienBNchitra,ref string ErrMsg)
        {
            ErrMsg = "";
            decimal PtramBHYT = 0;
            ///tổng tiền hiện tại truyền vào của lần payment đang thực hiện
            decimal v_dblTongtienDCT = 0;
            ///tổng tiền đã thanh toán
            decimal v_TotalPaymentDetail = 0;
            try
            {
                using (var scope = new TransactionScope())
                {
                    using (var dbscope = new SharedDbConnectionScope())
                    {
                        if (Utility.Byte2Bool(objThanhtoan.NoiTru))
                        {
                            if (THU_VIEN_CHUNG.Laygiatrithamsohethong("NOITRU_TUDONGHOANUNG_KHITHANHTOANNOITRU", "0", false) == "1")
                            {
                                SPs.NoitruHoanung(objLuotkham.MaLuotkham, objLuotkham.IdBenhnhan, objThanhtoan.NgayThanhtoan, globalVariables.gv_intIDNhanvien, globalVariables.UserName, (int)objLuotkham.IdKhoanoitru, (long)objLuotkham.IdRavien, (int)objLuotkham.IdBuong, (int)objLuotkham.IdGiuong, (byte)1).Execute();
                            }
                        }
                        else
                        {
                            if (THU_VIEN_CHUNG.Laygiatrithamsohethong("KCB_THANHTOAN_KICHHOAT_TAMUNG_NGOAITRU", "0", false) == "1")
                                if (THU_VIEN_CHUNG.Laygiatrithamsohethong("NGOAITRU_TUDONGHOANUNG_KHITHANHTOANNGOAITRU", "0", false) == "1")
                                {
                                    SPs.NoitruHoanung(objLuotkham.MaLuotkham, objLuotkham.IdBenhnhan, objThanhtoan.NgayThanhtoan, globalVariables.gv_intIDNhanvien, globalVariables.UserName, (int)objLuotkham.IdKhoanoitru, (long)objLuotkham.IdRavien, (int)objLuotkham.IdBuong, (int)objLuotkham.IdGiuong, (byte)0).Execute();
                                }
                        }
                        ///Tính tổng tiền đồng chi trả
                        v_dblTongtienDCT = TongtienKhongTutuc(objArrPaymentDetail);

                        KcbThanhtoanCollection lstKcbThanhtoanCollection =
                              new KcbThanhtoanController()
                              .FetchByQuery(
                                  KcbThanhtoan.CreateQuery()
                                  .AddWhere(KcbThanhtoan.Columns.MaLuotkham, Comparison.Equals, objLuotkham.MaLuotkham)
                                  .AND(KcbThanhtoan.Columns.IdBenhnhan, Comparison.Equals, objLuotkham.IdBenhnhan)
                                  .AND(KcbThanhtoan.Columns.KieuThanhtoan, Comparison.Equals, 0)
                                  );
                        List<long> lstIdThanhtoan = (from q in lstKcbThanhtoanCollection
                                                     select q.IdThanhtoan).Distinct().ToList<long>();
                        //Biến chứa danh sách tất cả các chi tiết dùng để tính lại tổng tiền thanh toán cho thanh toán có bản ghi bị hủy
                        List<KcbThanhtoanChitiet> lstKcbThanhtoanChitiet = new List<KcbThanhtoanChitiet>();
                        if (lstIdThanhtoan.Count > 0)
                            lstKcbThanhtoanChitiet =
                            new Select().From(KcbThanhtoanChitiet.Schema)
                            .Where(KcbThanhtoanChitiet.Columns.IdThanhtoan).In(lstIdThanhtoan)
                            .ExecuteAsCollection<KcbThanhtoanChitietCollection>().ToList<KcbThanhtoanChitiet>();

                        v_TotalPaymentDetail = (from p in lstKcbThanhtoanChitiet
                                                where p.TuTuc == 0
                                                select p).Sum(c => c.SoLuong * c.DonGia);

                        //Tính toán lại phần trăm BHYT chủ yếu liên quan đến phần lương cơ bản.
                        //Phần trăm này có thể bị biến đổi và khác với % trong các bảng dịch vụ
                        LayThongtinPtramBHYT(v_dblTongtienDCT + v_TotalPaymentDetail, objLuotkham, ref PtramBHYT);
                        objThanhtoan.MaThanhtoan = THU_VIEN_CHUNG.TaoMathanhtoan(Convert.ToDateTime(objThanhtoan.NgayThanhtoan));

                        objThanhtoan.PtramBhyt = Utility.Int16Dbnull(PtramBHYT, 0);
                        objThanhtoan.IdLoaidoituongKcb = objLuotkham.IdLoaidoituongKcb;
                        objThanhtoan.IsNew = true;
                        objThanhtoan.Save();
                        //Tính lại Bnhan chi trả và BHYT chi trả theo % BHYT mới
                        THU_VIEN_CHUNG.TinhPhamTramBHYT(objLuotkham, ref objArrPaymentDetail, ref lstKcbThanhtoanChitiet, PtramBHYT);
                        decimal TT_BN = 0m;
                        decimal TT_BNCT = 0m;
                        decimal TT_PT = 0m;
                        decimal TT_TT = 0m;
                        decimal TT_BHYT = 0m;
                        decimal TT_Chietkhau_Chitiet = 0m;

                        if (THU_VIEN_CHUNG.Laygiatrithamsohethong("BHYT_TINHLAI_TOANBODICHVU", "1", false) == "1")
                        {
                            foreach (int IdThanhtoan in lstIdThanhtoan)
                            {
                                TT_BN = 0m;
                                TT_BHYT = 0m;
                                TT_PT = 0m;
                                TT_TT = 0m;
                                TT_BNCT = 0m;
                                TT_Chietkhau_Chitiet = 0m;
                                List<KcbThanhtoanChitiet> _LstChitiet = (from q in lstKcbThanhtoanChitiet
                                                                         where q.IdThanhtoan == IdThanhtoan
                                                                         select q).ToList<KcbThanhtoanChitiet>();

                                if (_LstChitiet.Count > 0)
                                {
                                    foreach (KcbThanhtoanChitiet objChitietThanhtoan in _LstChitiet)
                                    {
                                        if (!Utility.Byte2Bool(objChitietThanhtoan.TuTuc))
                                            TT_BHYT += objChitietThanhtoan.BhytChitra * objChitietThanhtoan.SoLuong;
                                        TT_Chietkhau_Chitiet += Utility.DecimaltoDbnull(objChitietThanhtoan.TienChietkhau, 0);
                                        TT_PT +=  objChitietThanhtoan.PhuThu * objChitietThanhtoan.SoLuong;
                                        if (Utility.Byte2Bool(objChitietThanhtoan.TuTuc))
                                            TT_TT += objChitietThanhtoan.BnhanChitra * objChitietThanhtoan.SoLuong;
                                        else
                                            TT_BNCT += objChitietThanhtoan.BnhanChitra * objChitietThanhtoan.SoLuong;

                                        objChitietThanhtoan.IsNew = false;
                                        objChitietThanhtoan.MarkOld();
                                        objChitietThanhtoan.Save();
                                    }
                                    TT_BN += TT_PT + TT_BNCT + TT_TT;
                                    //Update lại tiền thanh toán
                                    new Update(KcbThanhtoan.Schema)
                      .Set(KcbThanhtoan.Columns.TongTien).EqualTo(TT_BHYT + TT_BN)
                      .Set(KcbThanhtoan.Columns.BnhanChitra).EqualTo(TT_BNCT)
                      .Set(KcbThanhtoan.Columns.BhytChitra).EqualTo(TT_BHYT)
                      .Set(KcbThanhtoan.Columns.PhuThu).EqualTo(TT_PT)
                      .Set(KcbThanhtoan.Columns.TuTuc).EqualTo(TT_TT)
                      .Set(KcbThanhtoan.Columns.MaDoituongKcb).EqualTo(objLuotkham.MaDoituongKcb)
                      .Set(KcbThanhtoan.Columns.IdDoituongKcb).EqualTo(objLuotkham.IdDoituongKcb)
                      .Set(KcbThanhtoan.Columns.PtramBhyt).EqualTo(objLuotkham.PtramBhyt)
                      .Set(KcbThanhtoan.Columns.IdHdonLog).EqualTo(IdHdonLog)
                      .Where(KcbThanhtoan.Columns.IdThanhtoan).IsEqualTo(IdThanhtoan).Execute();
                                    //Update phiếu thu
                                    new Update(KcbPhieuthu.Schema)
                     .Set(KcbPhieuthu.Columns.SoTien).EqualTo(TT_BN - TT_Chietkhau_Chitiet)
                     .Set(KcbPhieuthu.Columns.SotienGoc).EqualTo(TT_BN)
                     .Where(KcbPhieuthu.Columns.IdThanhtoan).IsEqualTo(IdThanhtoan).Execute();
                                }

                            }
                        }
                        //Reset để không bị cộng dồn với các thanh toán cũ
                        TT_BN = 0m;
                        TT_BHYT = 0m;
                        TT_PT = 0m;
                        TT_TT = 0m;
                        TT_BNCT = 0m;
                        TT_Chietkhau_Chitiet = 0m;
                        int reval = -1;
                        foreach (KcbThanhtoanChitiet objChitietThanhtoan in objArrPaymentDetail)
                        {
                            if (!Utility.Byte2Bool(objChitietThanhtoan.TuTuc))
                                TT_BHYT += objChitietThanhtoan.BhytChitra * objChitietThanhtoan.SoLuong;
                            TT_Chietkhau_Chitiet += Utility.DecimaltoDbnull(objChitietThanhtoan.TienChietkhau, 0);
                            TT_PT += objChitietThanhtoan.PhuThu * objChitietThanhtoan.SoLuong;
                            if (Utility.Byte2Bool(objChitietThanhtoan.TuTuc))
                                TT_TT += objChitietThanhtoan.BnhanChitra * objChitietThanhtoan.SoLuong;
                            else
                                TT_BNCT += objChitietThanhtoan.BnhanChitra * objChitietThanhtoan.SoLuong;

                            objChitietThanhtoan.IdThanhtoan = Utility.Int32Dbnull(objThanhtoan.IdThanhtoan, -1);

                            objChitietThanhtoan.IsNew = true;
                            objChitietThanhtoan.Save();
                           reval= UpdatePaymentStatus(objThanhtoan, objChitietThanhtoan);
                           if (reval <= 0)
                           {
                               ErrMsg = string.Format("Dịch vụ {0} đã bị người dùng khác hủy bỏ nên bạn không thể thanh toán. Hãy nhấn nút OK và chọn lại Bệnh nhân để lấy lại các chi phí thanh toán mới nhất", objChitietThanhtoan.TenChitietdichvu);
                               return ActionResult.Cancel;
                           }
                        }
                        TT_BN += TT_PT + TT_BNCT + TT_TT;
                        TongtienBNchitra = TT_BN;
                        objThanhtoan.TongTien = TT_BN + TT_BHYT;
                        #region Hoadondo
                        if (Layhoadondo)
                        {
                            int record = -1;
                            if (IdHdonLog > 0)
                            {
                                record =
                                    new Delete().From(HoadonLog.Schema)
                                        .Where(HoadonLog.Columns.IdHdonLog)
                                        .IsEqualTo(IdHdonLog)
                                        .Execute();
                                if (record <= 0)
                                {
                                    Utility.ShowMsg("Có lỗi trong quá trình xóa thông tin serie hóa đơn đã hủy để cấp lại cho lần thanh toán này.");
                                    return ActionResult.Error;
                                }
                            }
                            var obj = new HoadonLog();
                            obj.IdThanhtoan = objThanhtoan.IdThanhtoan;
                            obj.TongTien = objThanhtoan.TongTien - Utility.DecimaltoDbnull(objThanhtoan.TongtienChietkhau, 0);
                            obj.IdBenhnhan = objThanhtoan.IdBenhnhan;
                            obj.MaLuotkham = objThanhtoan.MaLuotkham;
                            obj.MauHoadon = objThanhtoan.MauHoadon;
                            obj.KiHieu = objThanhtoan.KiHieu;
                            obj.IdCapphat = objThanhtoan.IdCapphat.Value;
                            obj.MaQuyen = objThanhtoan.MaQuyen;
                            obj.Serie = objThanhtoan.Serie;
                            obj.MaNhanvien = globalVariables.UserName;
                            obj.MaLydo = "0";
                            obj.NgayIn = globalVariables.SysDate;
                            obj.TrangThai = 0;
                            obj.IsNew = true;
                            obj.Save();
                            IdHdonLog = obj.IdHdonLog;//Để update lại vào bảng thanh toán
                            new Update(HoadonCapphat.Schema).Set(HoadonCapphat.Columns.SerieHientai)
                                .EqualTo(objThanhtoan.Serie)
                                .Set(HoadonCapphat.Columns.TrangThai).EqualTo(1)
                                .Where(HoadonCapphat.Columns.IdCapphat).IsEqualTo(obj.IdCapphat)
                                .Execute();
                        }
                        #endregion

                        KcbPhieuthu objPhieuthu = new KcbPhieuthu();
                        objPhieuthu.IdBenhnhan = objThanhtoan.IdBenhnhan;
                        objPhieuthu.MaLuotkham = objThanhtoan.MaLuotkham;
                        objPhieuthu.IdThanhtoan = objThanhtoan.IdThanhtoan;
                        objPhieuthu.MaPhieuthu = THU_VIEN_CHUNG.GetMaPhieuThu(globalVariables.SysDate, 0);
                        objPhieuthu.SoluongChungtugoc = 1;
                        objPhieuthu.LoaiPhieuthu = Convert.ToByte(0);
                        objPhieuthu.NgayThuchien = globalVariables.SysDate;
                        objPhieuthu.SoTien = TT_BN - TT_Chietkhau_Chitiet;
                        objPhieuthu.SotienGoc = TT_BN;
                        objPhieuthu.MaLydoChietkhau = objThanhtoan.MaLydoChietkhau;
                        objPhieuthu.TienChietkhauchitiet = TT_Chietkhau_Chitiet;
                        objPhieuthu.TienChietkhau = objThanhtoan.TongtienChietkhau;
                        objPhieuthu.TienChietkhauhoadon = objPhieuthu.TienChietkhau - objPhieuthu.TienChietkhauchitiet;
                        objPhieuthu.NguoiNop = globalVariables.UserName;
                        objPhieuthu.TaikhoanCo = "";
                        objPhieuthu.TaikhoanNo = "";
                        objPhieuthu.NoiTru = (byte)objThanhtoan.NoiTru;
                        objPhieuthu.LydoNop = "Thu tiền bệnh nhân";
                        objPhieuthu.IdKhoaThuchien = globalVariables.idKhoatheoMay;
                        objPhieuthu.IdNhanvien = globalVariables.gv_intIDNhanvien;
                        objPhieuthu.IsNew = true;
                        objPhieuthu.Save();

                        new Update(KcbThanhtoan.Schema)
                         .Set(KcbThanhtoan.Columns.TongTien).EqualTo(TT_BHYT + TT_BN)
                      .Set(KcbThanhtoan.Columns.BnhanChitra).EqualTo(TT_BNCT)
                      .Set(KcbThanhtoan.Columns.BhytChitra).EqualTo(TT_BHYT)
                      .Set(KcbThanhtoan.Columns.PhuThu).EqualTo(TT_PT)
                      .Set(KcbThanhtoan.Columns.TuTuc).EqualTo(TT_TT)
                        .Set(KcbThanhtoan.Columns.MaDoituongKcb).EqualTo(objLuotkham.MaDoituongKcb)
                        .Set(KcbThanhtoan.Columns.IdDoituongKcb).EqualTo(objLuotkham.IdDoituongKcb)
                        .Set(KcbThanhtoan.Columns.PtramBhyt).EqualTo(objLuotkham.PtramBhyt)
                        .Set(KcbThanhtoan.Columns.IdHdonLog).EqualTo(IdHdonLog)
                        .Where(KcbThanhtoan.Columns.IdThanhtoan).IsEqualTo(objThanhtoan.IdThanhtoan).Execute();

                        //Tạo bản ghi trong bảng phân bổ tiền theo phương thức thanh toán
                        new Delete().From(KcbThanhtoanPhanbotheoPTTT.Schema)
                            .Where(KcbThanhtoanPhanbotheoPTTT.Columns.IdThanhtoan)
                            .IsEqualTo(objThanhtoan.IdThanhtoan).Execute();
                        KcbThanhtoanPhanbotheoPTTT objPhanbotienTT = new KcbThanhtoanPhanbotheoPTTT();
                        objPhanbotienTT.IdThanhtoan = objThanhtoan.IdThanhtoan;
                        objPhanbotienTT.IdBenhnhan = objThanhtoan.IdBenhnhan;
                        objPhanbotienTT.MaLuotkham = objThanhtoan.MaLuotkham;
                        objPhanbotienTT.MaPttt = objThanhtoan.MaPttt;
                        objPhanbotienTT.SoTien = TT_BN - TT_Chietkhau_Chitiet;
                        objPhanbotienTT.NoiTru = objThanhtoan.NoiTru;
                        objPhanbotienTT.TongTien = objPhanbotienTT.SoTien;
                        objPhanbotienTT.NguoiTao = objThanhtoan.NguoiTao;
                        objPhanbotienTT.NgayTao = objThanhtoan.NgayTao;
                        objPhanbotienTT.IsNew = true;
                        objPhanbotienTT.Save();

                        if (Utility.Byte2Bool(objThanhtoan.NoiTru) && Utility.ByteDbnull(objLuotkham.TrangthaiNoitru, 0) >= 2)
                            new Update(KcbLuotkham.Schema).Set(KcbLuotkham.Columns.TthaiThanhtoannoitru).EqualTo(1)
                                .Where(KcbLuotkham.Columns.IdBenhnhan).IsEqualTo(objLuotkham.IdBenhnhan)
                                .And(KcbLuotkham.Columns.MaLuotkham).IsEqualTo(objLuotkham.MaLuotkham)
                                .Execute();
                    }
                    scope.Complete();
                    id_thanhtoan = Utility.Int32Dbnull(objThanhtoan.IdThanhtoan, -1);
                    return ActionResult.Success;
                }
            }
            catch (Exception ex)
            {
                log.Error("Loi thuc hien thanh toan:" + ex.ToString());
                return ActionResult.Error;
            }
        }
        public ActionResult UpdateTienphanbotheoPTTT( DataTable dtData,ref string msg)
        {
            try
            {
                using (var scope = new TransactionScope())
                {
                    using (var sh = new SharedDbConnectionScope())
                    {
                        long id_thanhtoan = Utility.Int64Dbnull(dtData.Select("id_thanhtoan>0")[0][KcbThanhtoan.Columns.IdThanhtoan], 0);
                        decimal tong_tien = Utility.Int64Dbnull(dtData.Select("tong_tien>0")[0]["tong_tien"], 0);
                        if (id_thanhtoan > 0)
                        {
                            KcbThanhtoan objThanhtoan = KcbThanhtoan.FetchByID(id_thanhtoan);
                            new Delete().From(KcbThanhtoanPhanbotheoPTTT.Schema).Where(KcbThanhtoanPhanbotheoPTTT.Columns.IdThanhtoan).IsEqualTo(id_thanhtoan).Execute();
                            foreach (DataRow dr in dtData.Rows)
                            {
                                if (Utility.DecimaltoDbnull(dr["so_tien"], 0) > 0)
                                {
                                    KcbThanhtoanPhanbotheoPTTT _newItem = new KcbThanhtoanPhanbotheoPTTT();
                                    _newItem.IdThanhtoan = id_thanhtoan;
                                    _newItem.MaPttt = Utility.sDbnull(dr["ma_pttt"], "");
                                    _newItem.IdBenhnhan = objThanhtoan.IdBenhnhan;
                                    _newItem.MaLuotkham = objThanhtoan.MaLuotkham;
                                    _newItem.TongTien = tong_tien;
                                    _newItem.NoiTru = objThanhtoan.NoiTru;
                                    _newItem.SoTien = Utility.DecimaltoDbnull(dr["so_tien"], 0);
                                    _newItem.NguoiTao = globalVariables.UserName;
                                    _newItem.NgayTao = globalVariables.SysDate;
                                    _newItem.IsNew = true;
                                    _newItem.Save();
                                }
                            }
                        }

                    }
                    scope.Complete();
                    return ActionResult.Success;
                }
            }
            catch (Exception ex)
            {
                msg = ex.Message;
                log.Error("Loi trong qua trinh tra tien lai:{0}", ex.ToString());
                return ActionResult.Error;
            }
        }
        public void Update(long IdThanhtoan,string MaPttt,long IdBenhnhan,string MaLuotkham,byte NoiTru,decimal TongTien,decimal SoTien,string NguoiTao,DateTime NgayTao,string NguoiSua,DateTime? NgaySua)
        {
            KcbThanhtoanPhanbotheoPTTT item = new KcbThanhtoanPhanbotheoPTTT();
            item.MarkOld();
            item.IsLoaded = true;

            item.IdThanhtoan = IdThanhtoan;

            item.MaPttt = MaPttt;

            item.IdBenhnhan = IdBenhnhan;

            item.MaLuotkham = MaLuotkham;

            item.NoiTru = NoiTru;

            item.TongTien = TongTien;

            item.SoTien = SoTien;

            item.NguoiTao = NguoiTao;

            item.NgayTao = NgayTao;

            item.NguoiSua = NguoiSua;

            item.NgaySua = NgaySua;

            item.Save(UserName);
        }