public async Task MoverProductoBodegasTest()
        {
            Console.WriteLine(_testContext.TestName);

            var client = _factory.CreateClient();
            MovimientoBodegasRequest movimiento = new MovimientoBodegasRequest
            {
                BodegaOrigenId  = "51ed6452-d6b5-4fa6-a1e4-1e1fbd16d72d",
                BodegaDestinoId = "74a353ec-7b55-4a64-b919-bf6069e6308d",
                ProductoId      = "ea9acaa9-adaf-45bd-980d-a1bb8ab7abc3",
                Cantidad        = 5,
                Valor           = 50000
            };
            StringContent cuerpo   = new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(movimiento), Encoding.UTF8, "application/json");
            var           response = await client.PostAsync("api/Inventario/MoverProductoBodegas", cuerpo);

            Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);
            Assert.AreEqual("application/json; charset=utf-8", response.Content.Headers.ContentType?.ToString());

            var result = await response.Content.ReadAsStringAsync();

            Resultado <MovimientoDto> resultado = Newtonsoft.Json.JsonConvert.DeserializeObject <Resultado <MovimientoDto> >(result);

            Assert.IsNotNull(resultado);
            Assert.AreEqual(resultado.Correcto, true);
            Assert.IsNotNull(resultado.Datos);
            Assert.AreEqual(Guid.Parse("74a353ec-7b55-4a64-b919-bf6069e6308d"), resultado.Datos.Bodega.Id);
            Assert.AreEqual(Guid.Parse("ea9acaa9-adaf-45bd-980d-a1bb8ab7abc3"), resultado.Datos.Producto.Id);
            Assert.AreEqual(5, resultado.Datos.Cantidad);
            Assert.AreEqual(50000, resultado.Datos.Valor);
            Assert.AreEqual(TipoMovimiento.Ingreso, resultado.Datos.Tipo);
        }
        public async Task MoverProductoBodegasSupererMaximoDestinoTest()
        {
            Console.WriteLine(_testContext.TestName);

            var client = _factory.CreateClient();
            MovimientoBodegasRequest movimiento = new MovimientoBodegasRequest
            {
                BodegaOrigenId  = "51ed6452-d6b5-4fa6-a1e4-1e1fbd16d72d",
                BodegaDestinoId = "74a353ec-7b55-4a64-b919-bf6069e6308d",
                ProductoId      = "ea9acaa9-adaf-45bd-980d-a1bb8ab7abc3",
                Cantidad        = 15,
                Valor           = 100000
            };
            StringContent cuerpo   = new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(movimiento), Encoding.UTF8, "application/json");
            var           response = await client.PostAsync("api/Inventario/MoverProductoBodegas", cuerpo);

            Assert.AreEqual(HttpStatusCode.BadRequest, response.StatusCode);
            Assert.AreEqual("application/json; charset=utf-8", response.Content.Headers.ContentType?.ToString());

            var result = await response.Content.ReadAsStringAsync();

            Resultado <MovimientoDto> resultado = Newtonsoft.Json.JsonConvert.DeserializeObject <Resultado <MovimientoDto> >(result);

            Assert.IsNotNull(resultado);
            Assert.AreEqual(false, resultado.Correcto);
            Assert.IsNull(resultado.Datos);
            Assert.AreEqual(1, resultado.Errores.Length);
            Assert.AreEqual("La cantidad de producto a sacar supera la cantidad disponible en la bodega de origen", resultado.Errores[0]);
        }
Example #3
0
        public async Task <ActionResult <Resultado <MovimientoDto> > > MoverProductoBodegas([FromBody] MovimientoBodegasRequest movimiento)
        {
            if (movimiento == null)
            {
                return(BadRequest(Resultado <MovimientoDto> .Failure("No se encontraron datos para procesar")));
            }
            var resutlado = await _servicio.MoverProductoBodegas(movimiento);

            if (resutlado.Correcto)
            {
                return(Ok(resutlado));
            }
            else
            {
                return(BadRequest(resutlado));
            }
        }
        public async Task <Resultado <MovimientoDto> > MoverProductoBodegas(MovimientoBodegasRequest movimiento)
        {
            List <string> errores = new List <string>();
            Guid          bodegaOrigenId;
            Guid          bodegaDestinoId;
            Guid          productoId;
            BodegaDto     bodegaOrigen  = null;
            BodegaDto     bodegaDestino = null;
            ProductoDto   producto      = null;

            if (Guid.TryParse(movimiento.BodegaOrigenId, out bodegaOrigenId))
            {
                bodegaOrigen = await _repositorioBodega.BuscarBodega(bodegaOrigenId);

                if (bodegaOrigen == null)
                {
                    errores.Add($"La bodega origen con Id {movimiento.BodegaOrigenId} no esta en el sistema");
                }
            }
            else
            {
                errores.Add("La Id de la bodega origen no tiene el formato correcto");
            }

            if (Guid.TryParse(movimiento.BodegaDestinoId, out bodegaDestinoId))
            {
                bodegaDestino = await _repositorioBodega.BuscarBodega(bodegaDestinoId);

                if (bodegaDestino == null)
                {
                    errores.Add($"La bodega destino con Id {movimiento.BodegaDestinoId} no esta en el sistema");
                }
            }
            else
            {
                errores.Add("La Id de la bodega destino no tiene el formato correcto");
            }

            if (Guid.TryParse(movimiento.ProductoId, out productoId))
            {
                producto = await _repositorioProducto.BuscarProducto(productoId);

                if (producto == null)
                {
                    errores.Add($"El producto con Id {movimiento.ProductoId} no esta en el sistema");
                }
            }
            else
            {
                errores.Add("La Id del producto no tiene el formato correcto");
            }

            if (movimiento.Cantidad <= 0)
            {
                errores.Add("La cantidad debe ser mayor a 0");
            }

            if (movimiento.Valor <= 0)
            {
                errores.Add("El valor debe ser mayor a 0");
            }

            if (errores.Count > 0)
            {
                return(Resultado <MovimientoDto> .Failure(errores));
            }

            InventarioDto inventarioOrigen = await _repositorioInventario.ObtenerInventario(bodegaOrigen.Id, producto.Id);

            InventarioDto inventarioDestino = await _repositorioInventario.ObtenerInventario(bodegaDestino.Id, producto.Id);

            int cantidadDisponibleOrigen = 0;

            if (inventarioOrigen != null)
            {
                cantidadDisponibleOrigen = inventarioOrigen.Cantidad;
            }
            else
            {
                cantidadDisponibleOrigen = 0;
            }

            if (movimiento.Cantidad > cantidadDisponibleOrigen)
            {
                errores.Add("La cantidad de producto a sacar supera la cantidad disponible en la bodega de origen");
            }
            if (movimiento.Valor > inventarioOrigen.ValorAcumulado)
            {
                errores.Add("El valor del movimiento a sacar supera el valor acumulado para ese producto en la bodega de origen");
            }
            int capacidadDisponibleDestino = 0;

            if (inventarioDestino != null)
            {
                capacidadDisponibleDestino = bodegaDestino.CapacidadMaxima - inventarioDestino.Cantidad;
            }
            else
            {
                capacidadDisponibleDestino = bodegaDestino.CapacidadMaxima;
            }
            if (movimiento.Cantidad > capacidadDisponibleDestino)
            {
                errores.Add("La cantidad de producto a ingresar supera el maximo de productos totales permitido en la bodega de destino");
            }
            if (errores.Count > 0)
            {
                return(Resultado <MovimientoDto> .Failure(errores));
            }

            MovimientoDto movimientoSacar = new MovimientoDto
            {
                Id = Guid.NewGuid(),
                FechaMovimiento = DateTime.Now,
                Bodega          = bodegaOrigen,
                Producto        = producto,
                Cantidad        = movimiento.Cantidad,
                Valor           = movimiento.Valor,
                Tipo            = TipoMovimiento.Salida
            };

            MovimientoDto movimientoCargar = new MovimientoDto
            {
                Id = Guid.NewGuid(),
                FechaMovimiento = DateTime.Now,
                Bodega          = bodegaDestino,
                Producto        = producto,
                Cantidad        = movimiento.Cantidad,
                Valor           = movimiento.Valor,
                Tipo            = TipoMovimiento.Ingreso
            };
            MovimientoDto movimientoSacarCreado = await _repositorioInventario.GuardarMovimiento(movimientoSacar);

            if (movimientoSacarCreado != null)
            {
                await _repositorioInventario.ActualizarInvetario(movimientoSacarCreado);

                MovimientoDto movimientoCargarCreado = await _repositorioInventario.GuardarMovimiento(movimientoCargar);

                if (movimientoCargarCreado != null)
                {
                    await _repositorioInventario.ActualizarInvetario(movimientoCargarCreado);

                    return(Resultado <MovimientoDto> .Success(movimientoCargarCreado));
                }
                else
                {
                    errores.Add("Se ha presnetado un problema al guardar el movimiento");
                }
            }
            else
            {
                errores.Add("Se ha presnetado un problema al guardar el movimiento");
            }
            return(Resultado <MovimientoDto> .Failure(errores));
        }