public JsonResult Buscar_Elementos(string texto, int page = 0)
        {
            texto = texto.ToLower();
            EmpresaDTO empresa = (new EmpresaBL()).getEmpresa(getCurrentUser().IdEmpresa);

            MovimientoBL movimientoBL = new MovimientoBL();
            ComprobanteBL comprobanteBL = new ComprobanteBL();
            MovimientoInvBL movimientoInvBL = new MovimientoInvBL();

            List<MovimientoDTO> lstMovimientos = movimientoBL.getMovimientos_EnEmpresa(empresa.IdEmpresa);
            List<ComprobanteDTO> lstComprobantes = comprobanteBL.getComprobantesEnEmpresa(empresa.IdEmpresa);
            List<MovimientoInvDTO> lstMovimientoInv = movimientoInvBL.getMovimientoInvsEnEmpresa(empresa.IdEmpresa);

            List<sItem> ListaS1, ListaS2, ListaS3;

            ListaS1 = lstMovimientos.Where(x => 
                            (x.NroOperacion.ToLower() ?? "").Contains(texto)||
                            (x.Monto.ToString()).Contains(texto)||
                            (x.NombreCategoria.ToLower() ?? "").Contains(texto)||
                            x.nTipoDocumento.ToLower().Contains(texto)||
                            (x.NumeroDocumento.ToLower() ?? "").Contains(texto)||
                            x.NombreEntidadR.ToLower().Contains(texto)
                            ).Select(x => new sItem {
                                id = x.IdMovimiento,
                                nombre = x.NroOperacion,
                                monto = x.Monto,
                                idElemento = 1,
                                elemento = "Movimiento",
                                tipo = x.IdCuentaBancaria.ToString(), //LibroBancario
                                simboloMoneda = x.SimboloMoneda,
                                s1 = x.NombreCategoria,
                                s2 = x.nTipoDocumento,
                                s3 = x.NumeroDocumento,
                                s4 = x.NombreEntidadR
                            }).ToList();

            ListaS2 = lstComprobantes.Where(x => 
                            (x.NroDocumento).Contains(texto)||
                            (x.Monto.ToString()).Contains(texto)||
                            x.NombreTipoDocumento.ToLower().Contains(texto)||
                            x.NombreEntidad.ToLower().Contains(texto)
                            ).Select(x => new sItem
                            {
                                id = x.IdComprobante,
                                nombre = x.NroDocumento,
                                monto = x.Monto,
                                idElemento = 2,
                                elemento = "Comprobante",
                                tipo = x.IdTipoComprobante.ToString(),
                                simboloMoneda = x.SimboloMoneda,
                                s1 = x.NombreTipoDocumento,
                                s2 = x.NombreEntidad
                            }).ToList();

            ListaS3 = lstMovimientoInv.Where(x => 
                            (x.NroDocumento.ToLower()).Contains(texto)||
                            (x.Cantidad.ToString()).Contains(texto)||
                            x.nItem.ToLower().Contains(texto)||
                            x.UnidadMedida.ToLower().Contains(texto)||
                            x.nForma.ToLower().Contains(texto)||
                            x.SerieLote.ToLower().Contains(texto)
                            ).Select(x => new sItem
                            {
                                id = x.IdMovimientoInv,
                                nombre = x.NroDocumento,
                                monto = x.Cantidad,
                                idElemento = 3,
                                elemento = "Movimiento Inv.",
                                tipo = x.IdTipoMovimientoInv.ToString(),
                                s1 = x.nItem,
                                s2 = x.UnidadMedida,
                                s3 = x.nForma,
                                s4 = x.SerieLote
                            }).ToList();

            ListaS1.AddRange(ListaS2);
            ListaS1.AddRange(ListaS3);

            InfoSItem elem = new InfoSItem();
            elem.total_count = ListaS1.Count();
            //elem.items = ListaS1.Skip(5 * page).Take(5).ToList();
            elem.items = ListaS1;

            return Json(new { elem }, JsonRequestBehavior.AllowGet);
        }
        public JsonResult GetLotes_EnItem(int idItem)
        {
            MovimientoInvBL objBL = new MovimientoInvBL();

            List<Select2DTO_B> lista = objBL.getLotes_PorItem_EnEmpresa(getCurrentUser().IdEmpresa, idItem);
            return Json(new { lista }, JsonRequestBehavior.AllowGet);
        }
        public JsonResult GetUbicaciones_EnLote(string serieLote)
        {
            MovimientoInvBL objBL = new MovimientoInvBL();

            List<UbicacionDTO> lista = objBL.getUbicacionesEnEmpresa(getCurrentUser().IdEmpresa, serieLote);
            return Json(new { lista }, JsonRequestBehavior.AllowGet);
        }
        public ActionResult DeleteMovimientoInv(int id)
        {
            if (!this.currentUser()) { return RedirectToAction("Ingresar"); }
            if (getCurrentUser().IdRol == 4) { return RedirectToAction("MovimientoInvs", "Admin"); }

            MovimientoInvDTO dto;
            try
            {
                MovimientoInvBL objBL = new MovimientoInvBL();
                dto = objBL.getMovimientoInvEnEmpresa(getCurrentUser().IdEmpresa, id);
                if (objBL.delete(id))
                {
                    createResponseMessage(CONSTANTES.SUCCESS, CONSTANTES.SUCCESS_DELETE);
                }
                else
                {
                    createResponseMessage(CONSTANTES.ERROR, CONSTANTES.ERROR_DELETE);
                }
            }
            catch (Exception e)
            {
                createResponseMessage(CONSTANTES.ERROR, CONSTANTES.ERROR_NO_DELETE);
                throw;
            }
            string cadena = "Ingreso";
            if (dto != null) { cadena = dto.IdTipoMovimientoInv == 1 ? "Ingreso" : "Egreso"; }
            return RedirectToAction("Inventarios" + cadena, "Admin");
        }
        public ActionResult AddMovimientoInv(MovimientoInvDTO dto)
        {
            if (!this.currentUser()) { return RedirectToAction("Ingresar"); }
            if (getCurrentUser().IdRol == 4) { return RedirectToAction("MovimientoInvs", "Admin"); }
            try
            {
                string sTipoMovimientoInv = dto.IdTipoMovimientoInv == 1 ? "Ingreso" : "Egreso";

                MovimientoInvBL objBL = new MovimientoInvBL();
                if (dto.IdMovimientoInv == 0)
                {
                    //Verificar que el stock no sea negativo
                    if(dto.IdTipoMovimientoInv == 2)
                    {
                        int sumaLote = objBL.get_Stock_De_Lote_En_Empresa(dto.IdEmpresa, dto.SerieLote) + (dto.Cantidad * -1);
                        if (sumaLote < 0)
                        {
                            createResponseMessage(CONSTANTES.ERROR, CONSTANTES.ERROR_ITEMS_LIMIT);
                            return RedirectToAction("Inventarios" + sTipoMovimientoInv, "Admin");
                        }
                        else if (objBL.add(dto))
                        {
                            createResponseMessage(CONSTANTES.SUCCESS);
                            return RedirectToAction("Inventarios" + sTipoMovimientoInv, "Admin");
                        }
                    } else if (objBL.add(dto))
                    {
                        createResponseMessage(CONSTANTES.SUCCESS);
                        return RedirectToAction("Inventarios" + sTipoMovimientoInv, "Admin");
                    }
                }
                else if (dto.IdMovimientoInv != 0)
                {
                    if (dto.IdTipoMovimientoInv == 2)
                    {
                        int sumaLote = objBL.get_Stock_De_Lote_En_Empresa(dto.IdEmpresa, dto.SerieLote) + (dto.Cantidad * -1);
                        if (sumaLote < 0)
                        {
                            createResponseMessage(CONSTANTES.ERROR, CONSTANTES.ERROR_ITEMS_LIMIT);
                            return RedirectToAction("Inventarios" + sTipoMovimientoInv, "Admin");
                        }
                        else if (objBL.update(dto))
                        {
                            createResponseMessage(CONSTANTES.SUCCESS);
                            return RedirectToAction("Inventarios" + sTipoMovimientoInv, "Admin");
                        }
                    } else if (objBL.update(dto))
                    {
                        createResponseMessage(CONSTANTES.SUCCESS);
                        return RedirectToAction("Inventarios" + sTipoMovimientoInv, "Admin");
                    }
                    else
                    {
                        createResponseMessage(CONSTANTES.ERROR, CONSTANTES.ERROR_UPDATE_MESSAGE);
                    }

                }
                else
                {
                    createResponseMessage(CONSTANTES.ERROR, CONSTANTES.ERROR_INSERT_MESSAGE);
                }
            }
            catch (Exception e)
            {
                if (dto.IdMovimientoInv != 0)
                    createResponseMessage(CONSTANTES.ERROR, CONSTANTES.ERROR_UPDATE_MESSAGE);
                else createResponseMessage(CONSTANTES.ERROR, CONSTANTES.ERROR_INSERT_MESSAGE);
            }
            TempData["MovimientoInv"] = dto;
            return RedirectToAction("MovimientoInv");
        }
        public ActionResult MovimientoInv(int? id = null, int? idTipo = null)
        {
            if (!this.currentUser()) { return RedirectToAction("Ingresar"); }
            ViewBag.Title = "Movimiento de Inventario";

            int tipo = 1;
            if (idTipo != null) { tipo = idTipo.GetValueOrDefault(); }
            MenuNavBarSelected(9, tipo - 1);

            UsuarioDTO user = getCurrentUser();

            MovimientoInvBL objBL = new MovimientoInvBL();

            ViewBag.lstTipoMovimientoInv = objBL.getTipoMovimientoInv();
            ViewBag.lstFormaMovimiento = objBL.getFormaMovimientoInvPorTipo(tipo);
            //ViewBag.lstItems = objBL.getItemsEnEmpresa(user.IdEmpresa);
            ViewBag.lstItems = objBL.getItemsEnEmpresa_PorTipoMov(user.IdEmpresa, (int)idTipo);
            ViewBag.lstProveedores = objBL.getProveedoresEnEmpresa(user.IdEmpresa);
            //Lotes de salida Lista
            ViewBag.lstLotes = objBL.getLotesEnEmpresa(user.IdEmpresa);
            //Ubicaciones
            ViewBag.lstUbicaciones = objBL.getUbicacionesEnEmpresa(user.IdEmpresa);

            var objSent = TempData["MovimientoInv"];
            if (objSent != null) { TempData["MovimientoInv"] = null; return View(objSent); }

            MovimientoInvDTO obj;
            if (id != null && id != 0)
            {
                obj = objBL.getMovimientoInvEnEmpresa((int)user.IdEmpresa, (int)id);
                if (obj == null) return RedirectToAction("MovimientoInvs");
                if (obj.IdEmpresa != user.IdEmpresa) return RedirectToAction("MovimientoInvs");
                obj.UsuarioCreacion = user.IdUsuario;

                //lstLotes.Add(new Select2DTO_B() { text = obj.SerieLote });
                ViewBag.lstLotes = objBL.getLotesEnEmpresa(user.IdEmpresa, obj.IdItem, obj.SerieLote);
                
                if (idTipo.GetValueOrDefault() == 1) { ViewBag.lstUbicaciones = objBL.getUbicacionesEnEmpresa(user.IdEmpresa); }
                else if (idTipo.GetValueOrDefault() == 2) { ViewBag.lstUbicaciones = objBL.getUbicacionesEnEmpresa(user.IdEmpresa, obj.SerieLote); }

                return View(obj);
            }
            obj = new MovimientoInvDTO();
            obj.IdTipoMovimientoInv = tipo;
            obj.IdEmpresa = user.IdEmpresa;
            obj.UsuarioCreacion = user.IdUsuario;
            obj.FechaInicial = DateTime.Now;

            //if (idTipo.GetValueOrDefault() == 1) { ViewBag.lstUbicaciones = objBL.getUbicacionesEnEmpresa(user.IdEmpresa); }
            //else if (idTipo.GetValueOrDefault() == 2) { ViewBag.lstUbicaciones = new List<Select2DTO_B>(); }

            return View(obj);
        }
        public ActionResult InventariosEgreso()
        {
            if (!this.currentUser()) { return RedirectToAction("Ingresar"); }
            ViewBag.Title = "Inventarios de Egreso";

            MenuNavBarSelected(9, 1);

            UsuarioDTO user = getCurrentUser();

            MovimientoInvBL objBL = new MovimientoInvBL();
            int tipo = 2;
            ViewBag.idTipoInventario = tipo;

            if (user.IdEmpresa > 0)
            {
                List<MovimientoInvDTO> lista = objBL.getMovimientoInvsEnEmpresaPorTipo(user.IdEmpresa, tipo);
                return View(lista);
            }
            return View();
        }
        public ActionResult Proforma(int? id)
        {
            if (!this.currentUser()) { return RedirectToAction("Ingresar", "Admin", new { Area = string.Empty }); }
            ViewBag.Title += "Proforma";
            MenuNavBarSelected(12);

            UsuarioDTO user = getCurrentUser();


            EntidadResponsableBL entBL = new EntidadResponsableBL();
            ViewBag.lstClientes = entBL.getEntidadesResponsablesActivasPorTipoEnEmpresa(user.IdEmpresa, 1);
            EmpresaBL empBL = new EmpresaBL();
            ViewBag.lstMonedas = empBL.getListaMonedasAll();
            MovimientoInvBL movItmBL = new MovimientoInvBL();
            ViewBag.lstItems = movItmBL.getItemsEnEmpresa_PorTipoMov(user.IdEmpresa, 1);
            CuentaBancariaBL cbBL = new CuentaBancariaBL();
            ViewBag.lstCuentasBancarias = cbBL.getCuentasBancariasActivasPorTipoEnEmpresa(user.IdEmpresa, 1);
            ViewBag.lstContactos = new List<ContactoDTO>();

            var objSent = TempData["Proforma"];
            if (objSent != null) { TempData["Proforma"] = null; return View(objSent); }

            ProformaDTO obj;
            if(id != null && id > 0)
            {
                obj = new ProformaBL().getProformaId((int)id);
                return View(obj);
            }
            obj = new ProformaDTO();
            obj.IdEmpresa = user.IdEmpresa;
            obj.FechaProforma = DateTime.Now;
            obj.DetalleProforma = new List<DetalleProformaDTO>();

            return View(obj);
        }