void Session_Start(object sender, EventArgs e)
 {
     //--Tạo session object chứa chi tiết công thức pha chế
     Session["congThuc"] = new cartCongThuc();
     //--Tạo session object chứa thông tin chi tiết phiếu nhập kho
     Session["ctNhapKho"] = new cartNhapKho();
     //--Tạo session object chứa thông tin chi tiết của hóa đơn tạm
     Session["hoaDonTam"] = new cartHoaDonTam();
     //--Tạo session lưu đường dẫn và request
     Session["urlAction"] = "";
     //--Tạo session object chứa thông tin chi tiết phiếu xuất kho
     Session["ctXuatKho"] = new cartXuatKho();
     //--Tạo session object chứa thông tin nguyên liệu cần kiểm kho
     Session["truocKiemKho"] = new cartKiemKho();
     //--Tạo session object chứa thông tin nguyên liệu đã kiểm
     Session["sauKiemKho"] = new cartKiemKho();
     //--Tạo session chứa danh sách các trang được phép truy cập
     Session["quyenHan"] = new cartQuyenHan();
     //--Tạo session chứa thông tin chi tiết điều phối
     Session["dieuPhoi"] = new cartDieuPhoi();
     //--Tạo session chứa object các mục tiêu chưa đánh giá
     Session["chuaDanhGia"] = new cartMucTieu();
     //--Tạo session chứa object các mục tiêu đã đánh giá
     Session["daDanhGia"] = new cartDanhGia();
     //--Tạo session object chứa thông tin người dùng đăng nhập hệ thống
     Session["login"] = new taiKhoan();
     //--Tạo session object chứa các bàn đã đặt
     Session["datBan"] = new cartDatBan();
 }
        /// <summary>
        /// Hàm thực hiện cập nhật lại nguyên liệu sang trạng thái chưa kiểm kê
        /// Xảy ra khi người dùng click vào nút "Kiểm lại" trên danh sách
        /// </summary>
        /// <param name="param">Tham số chứa mã nguyên liệu cần kiểm lại</param>
        /// <returns>Chuỗi html tạo dữ liệu cho bảng nguyên liệu đã kiểm</returns>
        public string AjaxSuKienKiemLai(int param)
        {
            try
            {
                cartKiemKho cartTruoc = (cartKiemKho)Session["truocKiemKho"];
                cartKiemKho cartSau = (cartKiemKho)Session["sauKiemKho"];
                //-------Lấy thông tin nguyên liệu cần kiểm lại
                ctTonKho itemDaKiem = cartSau.getInfo(param);
                if (itemDaKiem != null)
                {
                    //-------Khỡi tạo object chưa kiểm kê và chuyển dữ liệu từ đã kiểm sang chưa kiểm
                    ctTonKho itemChuaKiem = new ctTonKho();
                    itemChuaKiem.soLuongThucTe = 0;
                    itemChuaKiem.nguyenNhanHaoHut = "";
                    this.ganDuLieuTuItemCuSangItemMoi(itemDaKiem, itemChuaKiem);

                    //-------Thêm nguyên liệu vào giỏ chưa kiểm
                    cartTruoc.addCart(itemChuaKiem);
                    Session["truocKiemKho"] = cartTruoc;

                    //------Xóa nguyên liệu từ cart đã kiểm
                    cartSau.removeItem(param);
                    Session["sauKiemKho"] = cartSau;
                }
            }
            catch (Exception ex)
            {
                xulyFile.ghiLoi("Class: TonKhoController - Function: AjaxSuKienKiemLai", ex.Message);
            }
            return AjaxDoiChieuSoLuong();
        }
 /// <summary>
 /// Hàm thực hiện lấy danh sách các nguyên liệu đã kiểm kê và hiện lên giao diện
 /// Xảy ra khi người dùng click vào tab Đối chiếu
 /// </summary>
 /// <returns>Chuỗi html các hàng cho bảng</returns>
 public string AjaxDoiChieuSoLuong()
 {
     string kq = "";
     try
     {
         cartKiemKho cartSau = (cartKiemKho)Session["sauKiemKho"];
         foreach (ctTonKho item in cartSau.Info.Values)
         {
             string donViTinh = xulyDuLieu.traVeKyTuGoc(item.nguyenLieu.donViPhaChe);
             kq += "<tr role=\"row\" class=\"odd\">";
             kq += "    <td><b>" + xulyDuLieu.traVeKyTuGoc(item.nguyenLieu.tenNguyenLieu) + "</b></td>";
             kq += "    <td>" + xulyDuLieu.doiVND(item.donGia) + "</td>";
             kq += "    <td>" + item.soLuongDauKy.ToString() + " (" + donViTinh + ")</td>";
             kq += "    <td>" + item.soLuongCuoiKyLyThuyet.ToString() + " (" + donViTinh + ")</td>";
             kq += "    <td><b>" + item.soLuongThucTe.ToString() + " (" + donViTinh + ")</b></td>";
             kq += "    <td class=\"col-red\">" + item.tyLeHaoHut.ToString() + " (" + donViTinh + " )</td>";
             kq += "    <td><i>" + xulyDuLieu.traVeKyTuGoc(item.nguyenNhanHaoHut) + "</i></td>";
             kq += "    <td><button type=\"button\" manl=\"" + item.maNguyenLieu.ToString() + "\" class=\"btnKiemLai btn btn-warning  waves-effect\">Kiểm lại</button>";
             kq += "    </td>";
             kq += "</tr>";
         }
     }
     catch (Exception ex)
     {
         xulyFile.ghiLoi("Class: TonKhoController - Function: AjaxDoiChieuSoLuong", ex.Message);
     }
     return kq;
 }
 /// <summary>
 /// Hàm tạo giao diện cho chức năng kiểm kê kho hàng
 /// </summary>
 /// <returns></returns>
 public ActionResult tkho_KiemKho()
 {
     if (xulyChung.duocTruyCap(idOfPage))
     {
         try
         {
             //-----Khởi tạo lại dữ liệu cho các giỏ nguyên liệu
             this.xoaSession();
             cartKiemKho cartTruoc = (cartKiemKho)Session["truocKiemKho"];
             List<ctTonKho> listTon = new bTonKho().layDanhSachTon();
             //------Lặp qua danh sách tồn kho theo tháng
             foreach (ctTonKho item in listTon.Where(s=>s.soLuongCuoiKyLyThuyet>0))
             {
                 cartTruoc.addCart(item);
                 Session["kiemKho"] = cartTruoc;
             }
             xulyChung.ghiNhatKyDtb(1, "Kiểm kho");
         }
         catch (Exception ex)
         {
             xulyFile.ghiLoi("Class: TonKhoController - Function: tkho_KiemKho", ex.Message);
         }
     }
     return View();
 }
 /// <summary>
 /// Hàm thực hiện thêm các nguyên liệu đã kiểm kê vào bảng chi tiết tồn kho
 /// </summary>
 /// <param name="maSoKy">Mã số kỳ kiểm kê</param>
 /// <param name="cart">Object chứa giỏ nguyên liệu đã kiểm kê</param>
 /// <param name="db"></param>
 private void themChiTietTonKho(int maSoKy, cartKiemKho cart, qlCaPheEntities db)
 {
     foreach (ctTonKho item in cart.Info.Values)
     {
         ctTonKho ctAdd = new ctTonKho();
         ctAdd.maSoKy = maSoKy;
         ctAdd.maNguyenLieu = item.maNguyenLieu;
         ctAdd.donGia = item.donGia;
         ctAdd.soLuongDauKy = item.soLuongDauKy;
         ctAdd.soLuongCuoiKyLyThuyet = item.soLuongCuoiKyLyThuyet;
         ctAdd.soLuongThucTe = item.soLuongThucTe;
         ctAdd.tyLeHaoHut = item.tyLeHaoHut;
         ctAdd.nguyenNhanHaoHut = item.nguyenNhanHaoHut;
         db.ctTonKhoes.Add(ctAdd);
         db.SaveChanges();
         new bKiemKho().capNhatTongTienTonKho(ctAdd, db);
     }
 }
        public ActionResult tkho_KiemKho(FormCollection f)
        {
            if (xulyChung.duocCapNhat(idOfPage, "7"))
            {
                string ndThongBao = ""; int kqLuu = 0;
                try
                {
                    cartKiemKho cartTruoc = (cartKiemKho)Session["truocKiemKho"];
                    if (cartTruoc.Info.Values.Count > 0)
                        throw new Exception("<i class=\"col-red\">*Còn nguyên liệu chưa được kiểm kê, vui lòng kiểm kê lại nguyên liệu</i>");

                    cartKiemKho cartSau = (cartKiemKho)Session["sauKiemKho"];
                    qlCaPheEntities db = new qlCaPheEntities();
                    TonKho tonKho = new TonKho();
                    tonKho.ngayKiem = DateTime.Now;
                    tonKho.tongTien = cartSau.getTotalPrice();
                    tonKho.nguoiKiem = ((taiKhoan)Session["login"]).tenDangNhap;
                    tonKho.ghiChu = xulyDuLieu.xulyKyTuHTML(f["txtGhiChu"]);
                    //-----Thêm mới tồn kho vào CSDL
                    db.TonKhoes.Add(tonKho);
                    kqLuu = db.SaveChanges();
                    if (kqLuu > 0)
                    {
                        themChiTietTonKho(tonKho.maSoKy, cartSau, db);
                        ndThongBao = createHTML.taoNoiDungThongBao("Kiểm kê kho", tonKho.maSoKy.ToString(), "tkho_TableTonKho");
                        this.xoaSession();
                        xulyChung.ghiNhatKyDtb(2, "Kiểm kê kho \" " + tonKho.maSoKy.ToString() + " \"");
                    }
                }
                catch (Exception ex)
                {
                    ndThongBao = ex.Message;
                    ViewBag.txtGhiChu = f["txtGhiChu"];
                    xulyFile.ghiLoi("Class: TonKhoController - Function: tkho_KiemKho_Post", ex.Message);
                }
                ViewBag.ThongBao = createHTML.taoThongBaoLuu(ndThongBao);
            }
            return View();
        }
        /// <summary>
        /// Hàm xử lý sự kiện click vào nút "Nhập" để ghi nhận số lượng tồn kho thực tế
        /// </summary>
        /// <param name="param">Tham số của nguyên liệu đang kiểm kê <para/> param có dạng: maNguyenLieu|soLuongThucTe|nguyenNhanHaoHut</param>
        /// <returns>Chuổi html danh sách các nguyên liệu chưa kiểm kho</returns>
        public string AjaxSuKienKiemHang(string param)
        {
            string kq = "";
            try
            {
                cartKiemKho cartTruoc = (cartKiemKho)Session["truocKiemKho"];
                cartKiemKho cartSau = (cartKiemKho)Session["sauKiemKho"];
                if (param.Split('|').Count() == 3) //---Nếu tham số đúng định dạng
                {
                    //----Xử lý tham số
                    int maNguyenLieu = xulyDuLieu.doiChuoiSangInteger(param.Split('|')[0]);
                    int soLuongThucTe = xulyDuLieu.doiChuoiSangInteger(param.Split('|')[1]);
                    string nguyenNhanHaoHut = xulyDuLieu.xulyKyTuHTML(param.Split('|')[2]);
                    //-------Lấy thông tin nguyên liệu đang kiểm kê
                    ctTonKho itemDangKiem = cartTruoc.getInfo(maNguyenLieu);
                    //----------Gán dữ liệu của nguyên liệu đang kiểm vào đã kiểm
                    ctTonKho itemDaKiem = new ctTonKho();

                    //---Gán dữ liệu cho object mới
                    itemDaKiem.soLuongThucTe = soLuongThucTe;
                    itemDaKiem.nguyenNhanHaoHut = nguyenNhanHaoHut;
                    this.ganDuLieuTuItemCuSangItemMoi(itemDangKiem, itemDaKiem);

                    //-----Thêm nguyên liệu vào cart đã kiểm
                    cartSau.addCart(itemDaKiem);
                    Session["sauKiemKho"] = cartSau;
                    //----------Xóa nguyên liệu trong cartTruocKiemKho
                    cartTruoc.removeItem(maNguyenLieu);
                    Session["truocKiemKho"] = cartTruoc;
                }
                kq = this.AjaxLayNguyenLieuKiemKho();
            }
            catch (Exception ex)
            {
                xulyFile.ghiLoi("Class: TonKhoController - Function: AjaxSuKienKiemHang", ex.Message);
            }
            return kq;
        }
 /// <summary>
 /// Hàm tạo dữ liệu cho bảng danh sách nguyên liệu cần kiểm kho
 /// Sự kiện xảy ra khi người dùng click vào tab "Nhập số liệu"
 /// </summary>
 /// <returns>Trả về chuỗi html danh sách các hàng dữ liệu nguyên liệu cho bảng</returns>
 public string AjaxLayNguyenLieuKiemKho()
 {
     string kq = "";
     try
     {
         cartKiemKho cartTruoc = (cartKiemKho)Session["truocKiemKho"];
         foreach (ctTonKho item in cartTruoc.Info.Values)
         {
             kq += "<tr role=\"row\" class=\"odd\">";
             kq += "    <td><b>" + xulyDuLieu.traVeKyTuGoc(item.nguyenLieu.tenNguyenLieu) + "</b></td>";
             kq += "    <td>" + xulyDuLieu.doiVND(item.donGia)+ "</td>";
             kq += "    <td>   <input type=\"number\" min=\"0\" class=\"form-control\" id=\"txtSoLuongThucTe" + item.maNguyenLieu.ToString() + "\" style=\"width:100%\"></td>";
             kq += "    <td>" + xulyDuLieu.traVeKyTuGoc(item.nguyenLieu.donViPhaChe) + "</td>";
             kq += "    <td>   <input type=\"text\" min=\"0\" class=\"form-control\" id=\"txtNguyenNhan" + item.maNguyenLieu.ToString() + "\" placeholder=\"Nguyên nhân hao hụt\" style=\"width:100%\"></td>";
             kq += "    <td>      <button type=\"button\" manl=\"" + item.nguyenLieu.maNguyenLieu.ToString() + "\" class=\"btnKiemHang btn btn-info  waves-effect\">Nhập </button>  </td>";
             kq += "</tr>";
         }
     }
     catch (Exception ex)
     {
         xulyFile.ghiLoi("Class: TonKhoController - Function: AjaxLayNguyenLieuKiemKho", ex.Message);
     }
     return kq;
 }