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); }