private void CargarDatos()
        {
            var usuarioInfo = ObtenerUsuarioInfo();

            var script = new StringBuilder("");

            grvVenta.DataBind();
            int numeroRegistros = Convert.ToInt16(ddlNumeroRegistros.SelectedValue);
            int numeroPagina    = Convert.ToInt16(ViewState["PageIndex"]);

            int indicePagina = numeroPagina == 0 ? 0 : numeroPagina - 1;

            pageIndex = indicePagina + 1;

            int almacenId      = Convert.ToInt16(ddlAlmacen.SelectedValue);
            var ventaInfoLista = new Negocio.Inventario().ListarPaginado(0, almacenId, usuarioInfo.TipoNegocioId, numeroRegistros, indicePagina);

            grvVenta.DataSource = ventaInfoLista;
            grvVenta.DataBind();

            if (ventaInfoLista.Count > 0)
            {
                grvVenta.HeaderRow.Attributes["style"] = "display: none";
                grvVenta.UseAccessibleHeader           = true;
                grvVenta.HeaderRow.TableSection        = TableRowSection.TableHeader;
            }
            rowCount  = ventaInfoLista.Count > 0 ? ventaInfoLista.First().TotalFilas : 0;
            pageCount = CalcPageCount(rowCount);
            ViewState["PageCount"] = pageCount;

            #region Texto del Pie de Página
            if (ventaInfoLista.Count > 0)
            {
                if (numeroRegistros == 0)
                {
                    lblPaginacion.Text = "Página " + pageIndex.ToString("") + " de 1, con un Total de " + rowCount.ToString("") + " registros";
                    script.Append("document.getElementById('lblPaginacion').innerText = '");
                    script.Append("Página " + pageIndex.ToString("") + " de 1, con un Total de " + rowCount.ToString("") + " registros';");
                }
                else
                {
                    lblPaginacion.Text = "Página " + pageIndex.ToString("") + " de " + pageCount.ToString("") + ", con un Total de " + rowCount.ToString("") + " registros";
                    script.Append("document.getElementById('lblPaginacion').innerText = '");
                    script.Append("Página " + pageIndex.ToString("") + " de " + pageCount.ToString("") + ", con un Total de " + rowCount.ToString("") + " registros';");
                }
            }
            else
            {
                lblPaginacion.Text = "No se obtuvieron resultados";
                script.Append("document.getElementById('lblPaginacion').innerText = 'No se obtuvieron resultados';");
            }
            #endregion

            RefreshPageButtons();
            RegistrarScript(script.ToString(), "Paginacion");
        }
        protected void btnCargarStock_OnClick(object sender, EventArgs e)
        {
            var usuarioInfo = ObtenerUsuarioInfo();

            var codigoProducto = Convert.ToInt32(hdnUsuarioId.Value);

            if (codigoProducto > 0)
            {
                var listaStockProducto = new Negocio.Inventario().Listar(0, codigoProducto, usuarioInfo.TipoNegocioId);

                grvStockProducto.DataSource = listaStockProducto.OrderBy(x => x.Almacen);
                grvStockProducto.DataBind();
            }
        }
        public static string AnularComprobante(int compraId)
        {
            var mensaje = String.Empty;

            try
            {
                var usuarioInfo           = ObtenerUsuarioInfo();
                var compraDetalleOriginal = new Negocio.Compra().ListarComprasDetalle(0, compraId);                //detalle compra original

                var tieneSaldoInventario = true;

                var almacenRevisar = compraDetalleOriginal.Select(p => p.AlmacenId).Distinct();
                foreach (var almacen in almacenRevisar)
                {
                    var productosAlmacen = compraDetalleOriginal.Where(p => p.AlmacenId == almacen).Select(grp => grp.ProductoId).Distinct();
                    foreach (var producto in productosAlmacen)
                    {
                        var inventarioReducir = compraDetalleOriginal.Where(p => p.AlmacenId == almacen && p.ProductoId == producto).Sum(x => x.Cantidad);

                        //Se consulta a BD si hay saldo
                        var saldoActual = new Negocio.Inventario().Listar(almacen, producto, usuarioInfo.TipoNegocioId);
                        if (saldoActual.Count() > 0 && !((saldoActual.First().InventarioActual - inventarioReducir) > 0))
                        {
                            tieneSaldoInventario = false;
                            break;
                        }
                    }
                    if (!tieneSaldoInventario)
                    {
                        break;
                    }
                }

                if (tieneSaldoInventario)
                {
                    var glosa = "Anulación de comprobante";
                    Negocio.Helper.ActualizarColumnasTabla("Compras", new string[] { "EstadoComprobanteId", "Glosa", "UsuarioModificacionId", "FechaModificacion" },
                                                           new string[] { Constantes.EstadoComprobanteCompraAnulado.ToString(), glosa, usuarioInfo.UsuarioId.ToString(), DateTime.Now.ToString("yyyyMMdd HH:mm:ss") },
                                                           new string[] { "CompraId" }, new string[] { compraId.ToString() });

                    //Al anular el comprobante, se reduce del inventario
                    #region Actualizacion Almacen
                    //Reduccion de Inventario
                    var almacenesAsignados = compraDetalleOriginal.Select(p => p.AlmacenId).Distinct();

                    foreach (var almacen in almacenesAsignados)
                    {
                        var productosAlmacen = compraDetalleOriginal.Where(p => p.AlmacenId == almacen).Select(grp => grp.ProductoId).Distinct();
                        foreach (var producto in productosAlmacen)
                        {
                            var inventarioInfo = new InventarioInfo();
                            inventarioInfo.AlmacenId         = almacen;
                            inventarioInfo.ProductoId        = producto;
                            inventarioInfo.InventarioActual  = (-1) * compraDetalleOriginal.Where(p => p.AlmacenId == almacen && p.ProductoId == producto).Sum(x => x.Cantidad);
                            inventarioInfo.UsuarioCreacionId = usuarioInfo.UsuarioId;
                            inventarioInfo.TipoNegocioId     = usuarioInfo.TipoNegocioId;
                            //Se crea el registro en la tabla inventario
                            new Negocio.Inventario().Actualizar(inventarioInfo);
                        }
                    }

                    #endregion

                    mensaje = compraId + "@" + "El Comprobante se anuló correctamente.";
                }
                else
                {
                    mensaje = "-2" + "@" + "No hay saldo disponible en el Inventario.";
                }
            }
            catch (Exception ex)
            {
                bool rethrow = ExceptionPolicy.HandleException(ex, Constantes.ExcepcionPoliticaPresentacion);
                mensaje = "-1";
                mensaje = mensaje + "@" + (rethrow ? ex.Message : Constantes.ExcepcionPoliticaPresentacion);
            }

            return(mensaje);
        }
        public static string GenerarComprobante(int compraId, int proveedorId, string tipoComprobanteId, string serie, string numeroComprobante, string fechaEmision,
                                                int monedaId, decimal montoCompra, decimal montoIgv, decimal montoTotal, string glosa, int motivoIngresoId)
        {
            var mensaje = String.Empty;

            try
            {
                var usuarioInfo = ObtenerUsuarioInfo();

                #region Compra
                var compraInfo = new CompraInfo();

                compraInfo.CompraId            = compraId;
                compraInfo.ProveedorId         = proveedorId;
                compraInfo.UsuarioCreacionId   = usuarioInfo.UsuarioId;
                compraInfo.TipoDocumentoId     = Convert.ToInt32(tipoComprobanteId);
                compraInfo.NumeroComprobante   = numeroComprobante;
                compraInfo.NumeroSerie         = serie;
                compraInfo.Glosa               = glosa;
                compraInfo.FechaEmision        = DateTime.ParseExact(fechaEmision, "dd/MM/yyyy", null);
                compraInfo.EstadoComprobanteId = Constantes.EstadoComprobanteCompraIngresado;
                compraInfo.SubTotal            = montoCompra;
                compraInfo.Igv             = montoIgv;
                compraInfo.Total           = montoTotal;
                compraInfo.MotivoIngresoId = motivoIngresoId;
                compraInfo.TipoNegocioId   = usuarioInfo.TipoNegocioId;
                compraInfo.MonedaId        = monedaId;

                #endregion
                if (compraId > 0)
                {
                    var compraDetalleListaInfo = (List <ComprasDetalleInfo>)HttpContext.Current.Session["CompraDetalle"];  //detalle compra modificado
                    var compraDetalleOriginal  = new Negocio.Compra().ListarComprasDetalle(0, compraId);                   //detalle compra original

                    var listaIncrementaInventario = new List <ComprasDetalleInfo>();
                    var listaReduceInventario     = new List <ComprasDetalleInfo>();
                    var listaEliminados           = new List <ComprasDetalleInfo>();

                    //var ventaDetalleListaInfo = (List<VentaDetalleInfo>)grvItem.DataSource;
                    foreach (var cdModificada in compraDetalleListaInfo)
                    {
                        var detOriginal = (from cdOriginal in compraDetalleOriginal where cdOriginal.ComprasDetalleId == cdModificada.ComprasDetalleId select cdOriginal);
                        if (detOriginal.Count() > 0)
                        {
                            if (cdModificada.AlmacenId == detOriginal.First().AlmacenId)
                            {
                                if (cdModificada.ProductoId == detOriginal.First().ProductoId)
                                {
                                    if (cdModificada.Cantidad > detOriginal.First().Cantidad)                                    //Incremento de inventario
                                    {
                                        var diferencia = cdModificada.Cantidad - detOriginal.First().Cantidad;
                                        detOriginal.First().Cantidad = diferencia;
                                        listaIncrementaInventario.Add(detOriginal.First());
                                    }
                                    else if (cdModificada.Cantidad < detOriginal.First().Cantidad)                                    //reduccion de inventario
                                    {
                                        var diferencia = cdModificada.Cantidad - detOriginal.First().Cantidad;
                                        detOriginal.First().Cantidad = Math.Abs(diferencia);
                                        listaReduceInventario.Add(detOriginal.First());
                                    }
                                }
                                else
                                {
                                    //Al ser un producto distinto, el inventario original debe de reducirse y el modificado debe de agregarse
                                    listaIncrementaInventario.Add(cdModificada);
                                    listaReduceInventario.Add(detOriginal.First());
                                }
                            }
                            else
                            {
                                //Al ser un alamcen distinto, no importa el producto, el inventario original debe de reducirse y el modificado debe de agregarse
                                listaIncrementaInventario.Add(cdModificada);
                                listaReduceInventario.Add(detOriginal.First());
                            }
                        }
                        else
                        {
                            listaIncrementaInventario.Add(cdModificada);
                            //detOriginal.First().Eliminado = 1;
                            //listaReduceInventario.Add(detOriginal.First());
                            //listaEliminados.Add(detOriginal.First());
                        }
                    }

                    //buscamos los items eliminados de la lista original para reducir inventario y eliminar del detalle
                    var codigosDetalleCompra = compraDetalleListaInfo.Where(p => p.ComprasDetalleId > 0).Select(x => x.ComprasDetalleId).ToArray();

                    listaEliminados.AddRange(compraDetalleOriginal.Where(p => !codigosDetalleCompra.Contains(p.ComprasDetalleId)));
                    listaReduceInventario.AddRange(compraDetalleOriginal.Where(p => !codigosDetalleCompra.Contains(p.ComprasDetalleId)));

                    var tieneSaldoInventario = true;

                    var almacenRevisar = listaReduceInventario.Select(p => p.AlmacenId).Distinct();
                    foreach (var almacen in almacenRevisar)
                    {
                        var productosAlmacen = listaReduceInventario.Where(p => p.AlmacenId == almacen).Select(grp => grp.ProductoId).Distinct();
                        foreach (var producto in productosAlmacen)
                        {
                            var inventarioReducir = listaReduceInventario.Where(p => p.AlmacenId == almacen && p.ProductoId == producto).Sum(x => x.Cantidad);

                            //Se consulta a BD si hay saldo
                            var saldoActual = new Negocio.Inventario().Listar(almacen, producto, usuarioInfo.TipoNegocioId);
                            if (saldoActual.Count() > 0 && !((saldoActual.First().InventarioActual - inventarioReducir) > 0))
                            {
                                tieneSaldoInventario = false;
                                break;
                            }
                        }
                        if (!tieneSaldoInventario)
                        {
                            break;
                        }
                    }

                    if (tieneSaldoInventario)
                    {
                        new Negocio.Compra().ActualizarCompra(compraInfo);

                        #region Actualizacion Compra Detalle
                        //Actualizacion de detalle de compra
                        foreach (var compraDetalle in compraDetalleListaInfo)
                        {
                            if (compraDetalle.Eliminado == 0)
                            {
                                var compraDetalleInfo = new ComprasDetalleInfo();
                                compraDetalleInfo.CompraId         = compraId;
                                compraDetalleInfo.ComprasDetalleId = compraDetalle.ComprasDetalleId;
                                compraDetalleInfo.ProductoId       = compraDetalle.ProductoId;
                                compraDetalleInfo.Cantidad         = compraDetalle.Cantidad;
                                compraDetalleInfo.PrecioUnitario   = compraDetalle.PrecioUnitario;
                                compraDetalleInfo.SubTotal         = compraDetalle.SubTotal;
                                compraDetalleInfo.Igv       = compraDetalle.Igv;
                                compraDetalleInfo.Total     = compraDetalle.Total;
                                compraDetalleInfo.AlmacenId = compraDetalle.AlmacenId;

                                if (compraDetalle.ComprasDetalleId > 0)
                                {
                                    compraDetalleInfo.UsuarioModificacionId = usuarioInfo.UsuarioId;
                                    new Negocio.Compra().ActualizarCompraDetalle(compraDetalleInfo);
                                }
                                else
                                {
                                    compraDetalleInfo.UsuarioCreacionId = usuarioInfo.UsuarioId;
                                    new Negocio.Compra().InsertarCompraDetalle(compraDetalleInfo);
                                }
                            }
                        }
                        //Eliminacion de registros de compra detalle
                        foreach (var compraDetalle in listaEliminados)
                        {
                            new Negocio.Compra().EliminarCompraDetalle(compraDetalle.ComprasDetalleId);
                        }

                        #endregion

                        #region Actualizacion Almacen
                        //Incremento de Inventario
                        var almacenesAsignados = listaIncrementaInventario.Select(p => p.AlmacenId).Distinct();
                        foreach (var almacen in almacenesAsignados)
                        {
                            var productosAlmacen = listaIncrementaInventario.Where(p => p.AlmacenId == almacen).Select(grp => grp.ProductoId).Distinct();
                            foreach (var producto in productosAlmacen)
                            {
                                var inventarioInfo = new InventarioInfo();
                                inventarioInfo.AlmacenId         = almacen;
                                inventarioInfo.ProductoId        = producto;
                                inventarioInfo.InventarioActual  = listaIncrementaInventario.Where(p => p.AlmacenId == almacen && p.ProductoId == producto).Sum(x => x.Cantidad);
                                inventarioInfo.UsuarioCreacionId = usuarioInfo.UsuarioId;
                                inventarioInfo.TipoNegocioId     = usuarioInfo.TipoNegocioId;
                                //Se crea el registro en la tabla inventario
                                new Negocio.Inventario().Insertar(inventarioInfo);
                            }
                        }

                        //Reduccion de Inventario
                        almacenesAsignados = listaReduceInventario.Select(p => p.AlmacenId).Distinct();
                        foreach (var almacen in almacenesAsignados)
                        {
                            var productosAlmacen = listaReduceInventario.Where(p => p.AlmacenId == almacen).Select(grp => grp.ProductoId).Distinct();
                            foreach (var producto in productosAlmacen)
                            {
                                var inventarioInfo = new InventarioInfo();
                                inventarioInfo.AlmacenId             = almacen;
                                inventarioInfo.ProductoId            = producto;
                                inventarioInfo.InventarioActual      = (-1) * listaReduceInventario.Where(p => p.AlmacenId == almacen && p.ProductoId == producto).Sum(x => x.Cantidad);
                                inventarioInfo.UsuarioModificacionId = usuarioInfo.UsuarioId;
                                inventarioInfo.TipoNegocioId         = usuarioInfo.TipoNegocioId;
                                //Se crea el registro en la tabla inventario
                                new Negocio.Inventario().Actualizar(inventarioInfo);
                            }
                        }

                        #endregion

                        mensaje = compraId + "@" + "El Comprobante se actualizó correctamente.";
                    }
                    else
                    {
                        mensaje = "-2" + "@" + "No hay saldo disponible en el Inventario.";
                    }
                }
                else
                {
                    compraId = new Negocio.Compra().InsertarCompra(compraInfo);

                    #region Compra Detalle
                    var compraDetalleListaInfo = (List <ComprasDetalleInfo>)HttpContext.Current.Session["CompraDetalle"];
                    //var ventaDetalleListaInfo = (List<VentaDetalleInfo>)grvItem.DataSource;
                    foreach (var vd in compraDetalleListaInfo)
                    {
                        var compraDetalleInfo = new ComprasDetalleInfo();
                        compraDetalleInfo.CompraId       = compraId;
                        compraDetalleInfo.ProductoId     = vd.ProductoId;
                        compraDetalleInfo.Cantidad       = vd.Cantidad;
                        compraDetalleInfo.PrecioUnitario = vd.PrecioUnitario;
                        compraDetalleInfo.SubTotal       = vd.SubTotal;
                        compraDetalleInfo.Igv            = vd.Igv;
                        compraDetalleInfo.Total          = vd.Total;
                        //compraDetalleInfo.AsignacionAlmacen = 1;//por defecto estan asignados
                        compraDetalleInfo.AlmacenId         = vd.AlmacenId;
                        compraDetalleInfo.UsuarioCreacionId = usuarioInfo.UsuarioId;

                        new Negocio.Compra().InsertarCompraDetalle(compraDetalleInfo);
                    }
                    #endregion

                    #region Asignacion Almacen
                    var almacenesAsignados = compraDetalleListaInfo.Select(p => p.AlmacenId).Distinct();
                    foreach (var almacen in almacenesAsignados)
                    {
                        var productosAlmacen = compraDetalleListaInfo.Where(p => p.AlmacenId == almacen).Select(grp => grp.ProductoId).Distinct();
                        foreach (var producto in productosAlmacen)
                        {
                            var inventarioInfo = new InventarioInfo();
                            inventarioInfo.AlmacenId         = almacen;
                            inventarioInfo.ProductoId        = producto;
                            inventarioInfo.InventarioActual  = compraDetalleListaInfo.Where(p => p.AlmacenId == almacen && p.ProductoId == producto).Sum(x => x.Cantidad);
                            inventarioInfo.UsuarioCreacionId = usuarioInfo.UsuarioId;
                            inventarioInfo.TipoNegocioId     = usuarioInfo.TipoNegocioId;
                            //Se crea el registro en la tabla inventario
                            new Negocio.Inventario().Insertar(inventarioInfo);
                        }
                    }

                    #endregion

                    #region Tabla Movimientos

                    var movimientosInfo = new MovimientosInfo();
                    movimientosInfo.OperacionId       = compraId;
                    movimientosInfo.TipoMovimientoId  = Constantes.TipoMovimientoCompra;
                    movimientosInfo.FechaOperacion    = DateTime.Now;
                    movimientosInfo.Glosa             = String.Empty;
                    movimientosInfo.UsuarioCreacionId = usuarioInfo.UsuarioId;

                    new Negocio.Movimientos().InsertarMovimientos(movimientosInfo);

                    #endregion

                    mensaje = compraId + "@" + "El Comprobante se registró correctamente.";
                }
            }
            catch (Exception ex)
            {
                bool rethrow = ExceptionPolicy.HandleException(ex, Constantes.ExcepcionPoliticaPresentacion);
                mensaje = "-1";
                mensaje = mensaje + "@" + (rethrow ? ex.Message : Constantes.ExcepcionPoliticaPresentacion);
            }
            return(mensaje);
        }
        protected void btnGuardarTraslado_OnClick(object sender, EventArgs e)
        {
            var usuarioInfo = ObtenerUsuarioInfo();
            var script      = new StringBuilder(String.Empty);
            var mensaje     = String.Empty;
            var ventaId     = Convert.ToInt32(hdnVentaId.Value);
            var productoId  = Convert.ToInt32(hdnProductoId.Value);

            var trasladoInfo = new TrasladoAlmacenInfo();

            trasladoInfo.AlmacenOrigenId      = Convert.ToInt32(ddlAlmacenOrigen.SelectedValue);
            trasladoInfo.AlmacenDestinoId     = Convert.ToInt32(ddlAlmacenDestino.SelectedValue);
            trasladoInfo.ProductoId           = productoId;
            trasladoInfo.CantidadProducto     = Convert.ToDecimal(txtCantidad.Text);
            trasladoInfo.UsuarioResponsableId = Convert.ToInt32(ddlResponsable.SelectedValue);
            trasladoInfo.UsuarioCreacionId    = usuarioInfo.UsuarioId;
            trasladoInfo.TipoNegocioId        = usuarioInfo.TipoNegocioId;
            trasladoInfo.FechaTraslado        = DateTime.ParseExact(txtFechaTraslado.Text.Trim(), "dd/MM/yyyy", null);

            //se registra el traslado
            var trasladoId = new Negocio.TrasladoAlmacen().Insertar(trasladoInfo);

            //se crea o actualiza el producto en el nuevo almacen destino
            var inventarioInfo = new InventarioInfo();

            inventarioInfo.AlmacenId         = Convert.ToInt32(ddlAlmacenDestino.SelectedValue);
            inventarioInfo.ProductoId        = productoId;
            inventarioInfo.InventarioActual  = Convert.ToDecimal(txtCantidad.Text);
            inventarioInfo.UsuarioCreacionId = usuarioInfo.UsuarioId;
            inventarioInfo.TipoNegocioId     = usuarioInfo.TipoNegocioId;

            var inventarioDestinoId = new Negocio.Inventario().Insertar(inventarioInfo);

            //se crea el movimiento de ingreso de almacen
            var movimientosInfo = new MovimientosInfo();

            movimientosInfo.OperacionId       = trasladoId;
            movimientosInfo.TipoMovimientoId  = Constantes.TipoMovimientoTrasladoIngreso;
            movimientosInfo.FechaOperacion    = DateTime.Now;
            movimientosInfo.Glosa             = "Traslado de Inventario Ingreso";
            movimientosInfo.UsuarioCreacionId = usuarioInfo.UsuarioId;

            new Negocio.Movimientos().InsertarMovimientos(movimientosInfo);

            //Se actualiza el saldo del producto en el almacenOriginal
            var inventarioOrigenInfo = new InventarioInfo();

            inventarioOrigenInfo.AlmacenId             = Convert.ToInt32(ddlAlmacenOrigen.SelectedValue);
            inventarioOrigenInfo.ProductoId            = productoId;
            inventarioOrigenInfo.InventarioActual      = (-1) * Convert.ToDecimal(txtCantidad.Text);       //se reduce el stock
            inventarioOrigenInfo.UsuarioModificacionId = usuarioInfo.UsuarioId;
            inventarioOrigenInfo.TipoNegocioId         = usuarioInfo.TipoNegocioId;
            var inventarioOrigenId = new Negocio.Inventario().Actualizar(inventarioOrigenInfo);

            //se crea el movimiento de salida de almacen
            movimientosInfo                   = new MovimientosInfo();
            movimientosInfo.OperacionId       = trasladoId;
            movimientosInfo.TipoMovimientoId  = Constantes.TipoMovimientoTrasladoEgreso;
            movimientosInfo.FechaOperacion    = DateTime.Now;
            movimientosInfo.Glosa             = "Traslado de Inventario Egreso";
            movimientosInfo.UsuarioCreacionId = usuarioInfo.UsuarioId;

            new Negocio.Movimientos().InsertarMovimientos(movimientosInfo);

            mensaje = "Se realizo el traslado correctamente";

            script.Append("MostrarMensaje('" + mensaje + "');");
            script.Append("LimpiarVenta();");
            script.Append("var modalDialog = $find('mpeTraslado'); modalDialog.hide();");

            CargarDatos();
            RegistrarScript(script.ToString(), "GuardarTraslado");
        }