private void ActualizaStock(EPRTA_MOVIMIENTO pmovimiento, string pingreso_egreso) { try { foreach (EPRTA_MOVIMIENTO_DETALLE detalle in pmovimiento.EPRTA_MOVIMIENTO_DETALLE) { //Obtengo el registro del item EPRTA_ITEM item = unitOfWork.ItemRepository.GetById(detalle.ID_ITEM); //Obtengo el registro del stock del item EPRTA_ARTICULO_BODEGA itemStock = unitOfWork.ArticuloBodegaRepository.GetAll().Where(p => p.ID_BODEGA == pmovimiento.ID_BODEGA && p.ID_ITEM == detalle.ID_ITEM).FirstOrDefault(); if (pingreso_egreso == "E") { //Actualizo el stock y el costo unitario itemStock.CANTIDAD_ACTUAL -= detalle.CANTIDAD_MOVIMIENTO; unitOfWork.ArticuloBodegaRepository.Update(itemStock); //Actualizo la fecha del ultimo egreso item.FECHA_ULTIMO_EGRESO = DateTime.Now; unitOfWork.ItemRepository.Update(item); } else if (pingreso_egreso == "I") { //Calcular nuevo costo promedio decimal nuevo_costo_promedio = 0; decimal nuevo_cantidad_stock = 0; if (itemStock == null) { nuevo_costo_promedio = Convert.ToDecimal(detalle.COSTO_MOVIMIENTO); } else { decimal costo_total_actual = Convert.ToDecimal(itemStock.CANTIDAD_ACTUAL) * Convert.ToDecimal(itemStock.COSTO_PROMEDIO); decimal costo_total_movimiento = Convert.ToDecimal(detalle.COSTO_MOVIMIENTO) * Convert.ToDecimal(detalle.CANTIDAD_MOVIMIENTO); nuevo_cantidad_stock = Convert.ToDecimal(itemStock.CANTIDAD_ACTUAL) + Convert.ToDecimal(detalle.CANTIDAD_MOVIMIENTO); nuevo_costo_promedio = Math.Round((costo_total_actual + costo_total_movimiento) / nuevo_cantidad_stock, 3); } //Si no tiene registro de stock if (itemStock == null) { itemStock = new EPRTA_ARTICULO_BODEGA(); itemStock.ID_ITEM = detalle.ID_ITEM; itemStock.ID_BODEGA = pmovimiento.ID_BODEGA; itemStock.CANTIDAD_MAXIMA = 0; itemStock.CANTIDAD_ACTUAL = detalle.CANTIDAD_MOVIMIENTO; itemStock.CANTIDAD_INICIO = detalle.CANTIDAD_MOVIMIENTO; itemStock.CANTIDAD_CRITICA = 0; itemStock.CANTIDAD_MINIMA = 0; itemStock.CANTIDAD_BAJA = 0; itemStock.COSTO_PROMEDIO = nuevo_costo_promedio; unitOfWork.ArticuloBodegaRepository.Insert(itemStock); } else //Si ya tiene registro de stock, se procede a acutalizar valores { itemStock.COSTO_PROMEDIO = nuevo_costo_promedio; itemStock.CANTIDAD_ACTUAL = nuevo_cantidad_stock; //Actualizo la cantidad maxima if (itemStock.CANTIDAD_MAXIMA < itemStock.CANTIDAD_ACTUAL) { itemStock.CANTIDAD_MAXIMA = itemStock.CANTIDAD_ACTUAL; } unitOfWork.ArticuloBodegaRepository.Update(itemStock); } //Actualizo la fecha del ultimo ingreso y el historial del costo item.FECHA_ULTIMO_INGRESO = DateTime.Now; item.COSTO_ANTERIOR = item.COSTO_ACTUAL; item.COSTO_ACTUAL = nuevo_costo_promedio; unitOfWork.ItemRepository.Update(item); } } } catch (Exception ex) { throw ex; } }
public ActionResult Grabar(EPRTA_MOVIMIENTO pmovimiento) { string msgErr = ""; JObject retorno = new JObject(); try { //EPRTA_MOVIMIENTO movimiento = new EPRTA_MOVIMIENTO(); pmovimiento.USUARIO_SOLICITA = Session["usuario"].ToString(); pmovimiento.FECHA_SOLICITUD = DateTime.Now; pmovimiento.USUARIO_APRUEBA = Session["usuario"].ToString(); pmovimiento.FECHA_APROBACION = DateTime.Now; pmovimiento.ESTADO = "D"; pmovimiento.ANIO = (short)DateTime.Now.Year; pmovimiento.ID_BODEGA = Byte.Parse(Session["bodega_id"].ToString()); foreach (EPRTA_MOVIMIENTO_DETALLE detalle in pmovimiento.EPRTA_MOVIMIENTO_DETALLE) { detalle.ESTADO = "A"; EPRTA_ARTICULO_BODEGA itemstock = unitOfWork.ArticuloBodegaRepository.GetAll().Where(p => p.ID_ITEM == detalle.ID_ITEM && p.ID_BODEGA == Byte.Parse(Session["bodega_id"].ToString())).FirstOrDefault(); if (pmovimiento.ID_TIPO_MOVIMIENTO == (int)EnumTipoMovimiento.REQUISICION_BODEGA || pmovimiento.ID_TIPO_MOVIMIENTO == (int)EnumTipoMovimiento.AJUSTE_DE_BODEGA_POR_EGRESO) { if (detalle.CANTIDAD_MOVIMIENTO > itemstock.CANTIDAD_ACTUAL) { throw new ArgumentException("El item " + itemstock.EPRTA_ITEM.DESCRIPCION + " no tiene stock suficiente, y no se puede rebajar"); } } detalle.COSTO_ACTUAL = itemstock == null ? 0 : itemstock.COSTO_PROMEDIO; detalle.STOCK_ACTUAL = itemstock == null ? 0 : itemstock.CANTIDAD_ACTUAL; if (pmovimiento.ID_TIPO_MOVIMIENTO != 4) { detalle.COSTO_MOVIMIENTO = itemstock.COSTO_PROMEDIO; } } msgErr = "Intentado obtener secuencia"; EPRTA_SECUENCIA secuencia = unitOfWork.SecuenciaRepository.GetAll().Where(p => p.ID_TIPO_MOVIMIENTO == pmovimiento.ID_TIPO_MOVIMIENTO && p.ANIO == pmovimiento.ANIO).FirstOrDefault(); pmovimiento.NUMERO_MOVIMIENTO = (int)secuencia.SECUENCIA; secuencia.SECUENCIA++; msgErr = "Intentando grabar en base de datos"; unitOfWork.MovimientoRepository.Insert(pmovimiento); unitOfWork.SecuenciaRepository.Update(secuencia); //EPRTA_MOVIMIENTO x = unitOfWork.MovimientoRepository.GetById(movimiento.ID_MOVIMIENTO); string ingreso_egreso = unitOfWork.TipoMovimientoRepository.GetById(pmovimiento.ID_TIPO_MOVIMIENTO).INGRESO_EGRESO; ActualizaStock(pmovimiento, ingreso_egreso); //Si es egreso se busca la solicitud de requisicion para actualizar el estado EPRTA_MOVIMIENTO movimiento_relacionado = null; if (pmovimiento.ID_MOVIMIENTO_RELACION != null) { movimiento_relacionado = unitOfWork.MovimientoRepository.Where(x => x.ID_MOVIMIENTO == pmovimiento.ID_MOVIMIENTO_RELACION).FirstOrDefault(); movimiento_relacionado.ESTADO = "D"; movimiento_relacionado.FECHA_APROBACION = DateTime.Now; movimiento_relacionado.USUARIO_APRUEBA = Session["usuario"].ToString(); unitOfWork.MovimientoRepository.Update(movimiento_relacionado); } unitOfWork.Save(); pmovimiento = unitOfWork.MovimientoRepository.GetById(pmovimiento.ID_MOVIMIENTO); retorno.Add("resultado", "success"); retorno.Add("data", pmovimiento.ID_MOVIMIENTO); retorno.Add("mensaje", ""); } catch (Exception ex) { retorno.Add("resultado", "error"); retorno.Add("data", null); retorno.Add("mensaje", "[" + msgErr + "] " + ex.ToString()); logger.Error(ex, ex.Message); } return(Content(retorno.ToString(), "application/json")); }