Exemplo n.º 1
0
        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;
            }
        }
Exemplo n.º 2
0
        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"));
        }