public bool Insertar(Transaccion transaccion) { using (var conection = Database.CreateConnection()) { conection.Open(); using (var transaction = conection.BeginTransaction()) { try { #region Transaccion transaccion.IdTransaccion = transaccionRepository.InsertTransaccion(transaccion, transaction); #endregion #region Movimiento Producto if (transaccion.IdTransaccionReferencia == null) { foreach (var movimientoProducto in transaccion.MovimientoProducto) { movimientoProducto.IdTransaccion = transaccion.IdTransaccion; var productos = productoStockRepository.GetByAlmacenPresentacion(movimientoProducto.IdAlmacen.Value, movimientoProducto.IdPresentacion, transaction); var stockTotal = productos.Sum(p => p.StockFisico); if (stockTotal < movimientoProducto.Cantidad) { throw new Exception(string.Format("No existe Stock suficiente para el producto {0}.", movimientoProducto.CodigoProducto)); } var costo = productoPrecioRepository.GetCostoByPresentacion(transaccion.IdEmpresa, transaccion.IdSucursal, movimientoProducto.IdPresentacion); movimientoProducto.Costo = costo; var cantidad = movimientoProducto.Cantidad; var secuencia = 0; foreach (var productoStock in productos) { cantidad -= productoStock.StockLogico; var movimientoProductoStock = new MovimientoProductoStock { Secuencia = ++secuencia, LoteSerie = productoStock.Lote, Cantidad = productoStock.StockLogico, IdAlmacen = movimientoProducto.IdAlmacen.Value, FechaVencimiento = productoStock.FechaVencimiento }; if (cantidad > 0) { movimientoProducto.MovimientoProductoStock.Add(movimientoProductoStock); } else if (cantidad == 0) { movimientoProducto.MovimientoProductoStock.Add(movimientoProductoStock); break; } else { cantidad = cantidad + productoStock.StockLogico; movimientoProductoStock.Cantidad = cantidad; movimientoProducto.MovimientoProductoStock.Add(movimientoProductoStock); break; } } } movimientoProductoRepository.InsertMovimientos(transaccion.MovimientoProducto, transaction); } else { foreach (var movimientoProducto in transaccion.MovimientoProducto) { movimientoProducto.IdTransaccion = transaccion.IdTransaccion; foreach (var movimientoProductoStock in movimientoProducto.MovimientoProductoStock) { var productoStock = productoStockRepository.GetByPresentacionAlmacenLote( movimientoProducto.IdPresentacion, movimientoProductoStock.IdAlmacen, movimientoProductoStock.LoteSerie); if (productoStock.StockFisico < movimientoProductoStock.Cantidad) { throw new Exception(string.Format("No existe Stock suficiente para el lote {0} del producto {1}.", movimientoProductoStock.LoteSerie, movimientoProducto.CodigoProducto)); } } } movimientoProductoRepository.InsertMovimientosFisico(transaccion.MovimientoProducto, transaction); } #endregion #region Impuestos foreach (var transaccionImpuesto in transaccion.TransaccionImpuesto) { transaccionImpuesto.IdTransaccion = transaccion.IdTransaccion; } transaccionImpuestoRepository.InsertImpuestos(transaccion.TransaccionImpuesto, transaction); #endregion #region Actualizar Serie Documento serieDocumentoRepository.UpdateSerieDocumento(transaccion.IdSerieDocumento, transaccion.IdSucursal, transaccion.UsuarioModificacion, transaction); #endregion #region Actualizar Orden de Pedido if (transaccion.IdTransaccionReferencia != null) { transaccion.Estado = (int)TipoEstadoDocumento.Aprobado; transaccionRepository.UpdateReferenciaTransaccion(transaccion, transaction); } #endregion transaction.Commit(); } catch (Exception ex) { transaction.Rollback(); throw new Exception(ex.Message, ex); } } } return(true); }
public JsonResult CrearDetalle(int idMovimientoProducto, string lote, int idAlmacen, int cantidad) { var jsonResponse = new JsonResponse(); try { foreach (var movimientoProducto in CompraSeleccionada.MovimientoProducto) { if (movimientoProducto.IdMovimientoProducto == idMovimientoProducto) { var movimientoProductoStock = movimientoProducto.MovimientoProductoStock.FirstOrDefault(p => p.LoteSerie == lote); if (movimientoProductoStock != null) { movimientoProductoStock.Cantidad -= cantidad; movimientoProducto.Cantidad -= cantidad; var detalle = DetalleTransferencia.FirstOrDefault(p => p.IdMovimientoProducto == idMovimientoProducto); if (detalle == null) { detalle = new MovimientoProducto { IdMovimientoProducto = movimientoProducto.IdMovimientoProducto, Secuencia = DetalleTransferencia.Count + 1, IdProducto = movimientoProducto.IdProducto, IdPresentacion = movimientoProducto.IdPresentacion, TipoClasificacion = movimientoProducto.TipoClasificacion, TipoProducto = movimientoProducto.TipoProducto, SignoStock = -1 * movimientoProducto.SignoStock, CodigoProducto = movimientoProducto.CodigoProducto, NombreProducto = movimientoProducto.NombreProducto, MovimientoProductoStock = new List <MovimientoProductoStock>(), IdAlmacen = idAlmacen }; DetalleTransferencia.Add(detalle); } detalle.Cantidad += cantidad; var detalleLote = detalle.MovimientoProductoStock.FirstOrDefault(p => p.LoteSerie == lote); if (detalleLote == null) { var almacen = AlmacenBL.Instancia.Single(idAlmacen); detalleLote = new MovimientoProductoStock { LoteSerie = lote, Cantidad = cantidad, IdAlmacen = idAlmacen, NombreAlmacen = almacen.Nombre, FechaVencimiento = movimientoProductoStock.FechaVencimiento, FechaVencimientoFormato = movimientoProductoStock.FechaVencimientoFormato }; detalle.MovimientoProductoStock.Add(detalleLote); } else { if (detalleLote.IdAlmacen == idAlmacen) { detalleLote.Cantidad += cantidad; } else { var almacen = AlmacenBL.Instancia.Single(idAlmacen); detalleLote = new MovimientoProductoStock { LoteSerie = lote, Cantidad = cantidad, IdAlmacen = idAlmacen, NombreAlmacen = almacen.Nombre, FechaVencimiento = movimientoProductoStock.FechaVencimiento, FechaVencimientoFormato = movimientoProductoStock.FechaVencimientoFormato }; detalle.MovimientoProductoStock.Add(detalleLote); } } } break; } } jsonResponse.Data = DetalleTransferencia; jsonResponse.Success = true; jsonResponse.Message = "Se Proceso con exito."; } catch (Exception ex) { jsonResponse.Message = ex.Message; } return(Json(jsonResponse, JsonRequestBehavior.AllowGet)); }
public bool Actualizar(Transaccion transaccion) { using (var conection = Database.CreateConnection()) { conection.Open(); using (var transaction = conection.BeginTransaction()) { try { #region Obtener Movimiento de Productos var movimientosModificados = movimientoProductoRepository.GetByTransaccion(transaccion.IdTransaccion, transaction); #endregion #region Revertir ProductoStock foreach (var movimientoProducto in movimientosModificados) { foreach (var movimientoProductoStock in movimientoProducto.MovimientoProductoStock) { movimientoProductoStock.SignoStock = -1 * movimientoProducto.SignoStock; movimientoProductoStock.IdPresentacion = movimientoProducto.IdPresentacion; movimientoProductoStock.UsuarioCreacion = movimientoProducto.UsuarioCreacion; movimientoProductoStock.TipoClasificacion = movimientoProducto.TipoClasificacion; } } if (transaccion.IdTransaccionReferencia.HasValue) { productoStockRepository.UpdateProductoStockFisico(movimientosModificados, transaction); } else { productoStockRepository.UpdateProductoStock(movimientosModificados, transaction); } #endregion #region Eliminar MovimientoProducto movimientoProductoRepository.DeleteByTransaccion(transaccion.IdTransaccion, transaction); #endregion #region Eliminar Impuesto transaccionImpuestoRepository.DeleteByTransaccion(transaccion.IdTransaccion, transaction); #endregion #region Actualizar Transaccion transaccionRepository.UpdateTransaccion(transaccion, transaction); #endregion #region Movimiento Producto if (transaccion.IdTransaccionReferencia == null) { foreach (var movimientoProducto in transaccion.MovimientoProducto) { movimientoProducto.IdTransaccion = transaccion.IdTransaccion; var productos = productoStockRepository.GetByAlmacenPresentacion(movimientoProducto.IdAlmacen.Value, movimientoProducto.IdPresentacion, transaction); var cantidad = movimientoProducto.Cantidad; var secuencia = 0; foreach (var productoStock in productos) { cantidad -= productoStock.StockLogico; var movimientoProductoStock = new MovimientoProductoStock { Secuencia = ++secuencia, LoteSerie = productoStock.Lote, Cantidad = productoStock.StockLogico, IdAlmacen = movimientoProducto.IdAlmacen.Value, FechaVencimiento = productoStock.FechaVencimiento }; if (cantidad > 0) { movimientoProducto.MovimientoProductoStock.Add(movimientoProductoStock); } else if (cantidad == 0) { movimientoProducto.MovimientoProductoStock.Add(movimientoProductoStock); break; } else { movimientoProductoStock.Cantidad = cantidad + productoStock.StockLogico; movimientoProducto.MovimientoProductoStock.Add(movimientoProductoStock); break; } } } movimientoProductoRepository.InsertMovimientos(transaccion.MovimientoProducto, transaction); } else { foreach (var movimientoProducto in transaccion.MovimientoProducto) { movimientoProducto.IdTransaccion = transaccion.IdTransaccion; foreach (var movimientoProductoStock in movimientoProducto.MovimientoProductoStock) { var productoStock = productoStockRepository.GetByPresentacionAlmacenLote( movimientoProducto.IdPresentacion, movimientoProductoStock.IdAlmacen, movimientoProductoStock.LoteSerie); if (productoStock.StockFisico < movimientoProductoStock.Cantidad) { throw new Exception(string.Format("No existe Stock suficiente para el lote {0} del producto {1}.", movimientoProductoStock.LoteSerie, movimientoProducto.CodigoProducto)); } } } movimientoProductoRepository.InsertMovimientosFisico(transaccion.MovimientoProducto, transaction); } #endregion #region Impuestos foreach (var transaccionImpuesto in transaccion.TransaccionImpuesto) { transaccionImpuesto.IdTransaccion = transaccion.IdTransaccion; } transaccionImpuestoRepository.InsertImpuestos(transaccion.TransaccionImpuesto, transaction); #endregion #region Actualizar Orden de Pedido if (transaccion.IdTransaccionReferencia != null) { transaccion.Estado = (int)TipoEstadoDocumento.Aprobado; transaccionRepository.UpdateReferenciaTransaccion(transaccion, transaction); } #endregion transaction.Commit(); } catch (Exception ex) { transaction.Rollback(); throw new Exception(ex.Message, ex); } } } return(true); }