예제 #1
0
        public async Task <int> CrearAsync(ProveedorDetalle proveedor, int usuarioId)
        {
            var nombre         = proveedor.Nombre.Trim().ToLowerInvariant();
            var nombreContacto = proveedor.NombreDeContacto?.Trim()?.ToLowerInvariant();
            var direccion      = proveedor.Direccion?.Trim()?.ToLowerInvariant();

            if (await ExisteProveedor(nombre))
            {
                throw new InvalidOperationException($"El proveedor {nombre} ya existe.");
            }

            var nuevoProveedor = new Proveedor
            {
                Nombre            = nombre,
                NombreDeContacto  = nombreContacto,
                Direccion         = direccion,
                UsuarioCreacionId = usuarioId,
                UsuarioModificaId = usuarioId
            };

            db.Proveedores.Add(nuevoProveedor);

            var filasAfectadas = await db.SaveChangesAsync();

            if (filasAfectadas > 0)
            {
                return(nuevoProveedor.Id);
            }
            else
            {
                return(-1);
            }
        }
예제 #2
0
        public async Task <int> CrearAsync(MarcaResumen marca)
        {
            var nombre = marca.Nombre.ToLowerInvariant();

            if (await ExisteMarca(nombre))
            {
                throw new InvalidOperationException($"La marca '{nombre}' ya existe.");
            }

            var nuevaMarca = new Marca
            {
                Nombre = nombre
            };

            db.Marcas.Add(nuevaMarca);
            var filasAfectadas = await db.SaveChangesAsync();

            if (filasAfectadas > 0)
            {
                return(nuevaMarca.Id);
            }
            else
            {
                return(-1);
            }
        }
예제 #3
0
        public async Task <int> CrearAsync(BodegaResumen bodega, int usuarioId)
        {
            var nombre    = bodega.Nombre.ToLowerInvariant();
            var direccion = bodega.Direccion.ToLowerInvariant();

            if (await ExisteBodega(nombre))
            {
                throw new InvalidOperationException($"La bodega '{nombre}' ya existe.");
            }

            var nuevaBodega = new Bodega
            {
                Nombre            = nombre,
                Direccion         = direccion,
                UsuarioCreacionId = usuarioId,
                UsuarioModificaId = usuarioId
            };

            db.Bodegas.Add(nuevaBodega);
            var filasAfectadas = await db.SaveChangesAsync();

            if (filasAfectadas > 0)
            {
                return(nuevaBodega.Id);
            }
            else
            {
                return(-1);
            }
        }
예제 #4
0
        public async Task <int> CrearAsync(UnidadDeMedidaResumen unidadMedida)
        {
            var nombre = unidadMedida.Nombre.ToLowerInvariant();

            if (await ExisteUnidadDeMedida(nombre))
            {
                throw new InvalidOperationException($"La unidad de medida '{nombre}' ya existe.");
            }

            var nuevaUnidad = new UnidadDeMedida
            {
                Nombre = nombre
            };

            db.UnidadesDeMedida.Add(nuevaUnidad);
            var filasAfectadas = await db.SaveChangesAsync();

            if (filasAfectadas > 0)
            {
                return(nuevaUnidad.Id);
            }
            else
            {
                return(-1);
            }
        }
예제 #5
0
        public async Task <int> CrearAsync(ListaDetalle lista)
        {
            var nombre = lista.Nombre.Trim();

            if (await ExisteNombre(nombre))
            {
                throw new InvalidOperationException($"Ya existe una lista con el nombre '{nombre}'.");
            }

            var nuevaLista = new Lista
            {
                Nombre = nombre
            };

            db.Listas.Add(nuevaLista);

            var filasAfectadas = await db.SaveChangesAsync();

            if (filasAfectadas > 0)
            {
                return(nuevaLista.Id);
            }
            else
            {
                return(-1);
            }
        }
예제 #6
0
        public async Task <int> CrearAsync(ProductoDetalle producto)
        {
            var nombre      = producto.Nombre.Trim();
            var descripcion = producto.Descripcion.Trim();

            if (await ExisteNombre(nombre))
            {
                throw new InvalidOperationException($"Ya existe un producto con el nombre '{nombre}'.");
            }

            var nuevoProducto = new Producto {
                Nombre      = nombre,
                Descripcion = descripcion
            };

            if (producto.Marcas != null && producto.Marcas.Length > 0)
            {
                nuevoProducto.Marcas = producto.Marcas.Select(marcaId => new ProductoMarca {
                    Producto = nuevoProducto,
                    MarcaId  = marcaId
                }).ToList();
            }

            if (producto.Unidades != null && producto.Unidades.Length > 0)
            {
                nuevoProducto.UnidadesDeMedida = producto.Unidades.Select(unidadId => new ProductoUnidadDeMedida {
                    Producto         = nuevoProducto,
                    UnidadDeMedidaId = unidadId
                }).ToList();
            }

            if (producto.Caracteristicas != null && producto.Caracteristicas.Length > 0)
            {
                nuevoProducto.Caracteristicas = producto.Caracteristicas.Select(c => new ProductoCaracteristica {
                    Producto              = nuevoProducto,
                    TipoCaracteristica    = (ProductoTipoCaracteristica)c.Tipo,
                    Nombre                = c.Nombre,
                    ListaId               = c.ListaId,
                    Minimo                = c.Minimo,
                    Maximo                = c.Maximo,
                    Requerido             = c.Requerido,
                    ExpresionDeValidacion = null
                }).ToList();
            }

            db.Productos.Add(nuevoProducto);

            var filasAfectadas = await db.SaveChangesAsync();

            if (filasAfectadas > 0)
            {
                return(nuevoProducto.Id);
            }
            else
            {
                return(-1);
            }
        }
예제 #7
0
        public async Task <int> CrearAsync(UsuarioDetalle usuario)
        {
            var login  = usuario.Login.Trim().ToLowerInvariant();
            var correo = usuario.Correo.Trim().ToLowerInvariant();

            if (string.IsNullOrWhiteSpace(usuario.Clave))
            {
                throw new InvalidOperationException("La clave no puede estar en blanco");
            }

            if (await ExisteLoginInterno(login))
            {
                throw new InvalidOperationException($"El login '{login}' ya está asignado a otro usuario.");
            }

            if (await ExisteCorreoInterno(correo))
            {
                throw new InvalidOperationException($"El correo '{correo}' ya está asignado a otro usuario.");
            }

            var nuevoUsuario = new Usuario {
                Login            = login,
                Nombres          = usuario.Nombres.Trim(),
                Apellidos        = usuario.Apellidos.Trim(),
                NombreCompleto   = usuario.NombreCompleto.Trim(),
                Correo           = correo,
                SitioWeb         = usuario.SitioWeb?.Trim().ToLowerInvariant(),
                Activo           = true,
                CorreoVerificado = false,
                Clave            = usuario.Clave.Encriptar()
            };

            if (usuario.Roles != null && usuario.Roles.Count > 0)
            {
                var rolesIds = usuario.Roles.Keys;
                var roles    = db.Roles.Where(x => rolesIds.Contains(x.Id)).Distinct().ToList();
                if (rolesIds.Count != roles.Count)
                {
                    throw new InvalidOperationException("Al menos uno de los roles especificados no es válido.");
                }

                nuevoUsuario.Roles = roles.Select(x => new UsuarioRol
                {
                    Usuario = nuevoUsuario,
                    Rol     = x
                }).ToList();
            }

            if (usuario.Atributos != null && usuario.Atributos.Count > 0)
            {
                nuevoUsuario.Atributos = new List <UsuarioAtributo>();

                foreach (var atributo in usuario.Atributos)
                {
                    if (string.IsNullOrWhiteSpace(atributo.Key))
                    {
                        continue;
                    }

                    foreach (var valor in atributo.Value)
                    {
                        if (string.IsNullOrEmpty(valor))
                        {
                            continue;
                        }

                        nuevoUsuario.Atributos.Add(new UsuarioAtributo
                        {
                            Nombre  = atributo.Key.Trim().ToLowerInvariant(),
                            Valor   = valor.Trim(),
                            Usuario = nuevoUsuario
                        });
                    }
                }
            }

            db.Usuarios.Add(nuevoUsuario);
            var filasAfectadas = await db.SaveChangesAsync();

            if (filasAfectadas > 0)
            {
                return(nuevoUsuario.Id);
            }
            else
            {
                return(-1);
            }
        }
예제 #8
0
        public async Task <int> CrearAsync(int usuarioId, IngresoDetalle ingreso)
        {
            if (ingreso == null)
            {
                throw new ArgumentNullException(nameof(ingreso));
            }

            if (ingreso.Productos == null || ingreso.Productos.Length == 0)
            {
                throw new InvalidOperationException("No puede crear un ingreso sin productos.");
            }

            var tieneProductosRepetidos = ingreso.Productos.GroupBy(x => new { x.ProductoId, x.MarcaId, x.UnidadId }).Where(x => x.Count() > 1).Any();

            if (tieneProductosRepetidos)
            {
                throw new InvalidOperationException("Un ingreso no puede tener un producto repetido con la misma marca y unidad de medida (debe crear dos ingresos distintos)");
            }

            var hayProductosSinCantidad = ingreso.Productos.Any(x => x.Cantidad <= 0);

            if (hayProductosSinCantidad)
            {
                throw new InvalidOperationException("Un ingreso no puede contener productos con valores menores o iguales a cero");
            }

            var hayProductosConPrecioNegativo = ingreso.Productos.Any(x => x.Precio < 0);

            if (hayProductosConPrecioNegativo)
            {
                throw new InvalidOperationException("Un ingreso no puede contener productos con precio negativo");
            }

            var existeProveedor = await db.Proveedores.AnyAsync(x => x.Id == ingreso.ProveedorId);

            if (!existeProveedor)
            {
                throw new InvalidOperationException($"No existe el proveedor con id {ingreso.ProveedorId}");
            }

            var existeBodega = await db.Bodegas.AnyAsync(x => x.Id == ingreso.BodegaId);

            if (!existeBodega)
            {
                throw new InvalidOperationException($"No existe una bodega con id {ingreso.BodegaId}");
            }

            var productosIds        = ingreso.Productos.Select(x => x.ProductoId).Distinct().ToArray();
            var cantidadDeProductos = await db.Productos.CountAsync(x => productosIds.Contains(x.Id));

            var existenTodosLosProductos = cantidadDeProductos == productosIds.Length;

            if (!existenTodosLosProductos)
            {
                throw new InvalidOperationException("Al menos uno de los productos indicados no existe");
            }

            var marcasParaLosProductos = await db.ProductoMarcas.Where(x => productosIds.Contains(x.ProductoId)).ToArrayAsync();

            var unidadesParaLosProductos = await db.ProductoUnidadesDeMedida.Where(x => productosIds.Contains(x.ProductoId)).ToArrayAsync();

            //var caracteristicasParaLosProductos = await db.ProductoCaracteristicas.Where(x => productosIds.Contains(x.ProductoId)).ToArrayAsync();

            foreach (var item in ingreso.Productos)
            {
                if (!marcasParaLosProductos.Any(x => x.MarcaId == item.MarcaId && x.ProductoId == item.ProductoId))
                {
                    throw new InvalidOperationException($"No existe una marca con id {item.MarcaId} o no está asignada al producto con id {item.ProductoId}");
                }
                if (!unidadesParaLosProductos.Any(x => x.UnidadDeMedidaId == item.UnidadId && x.ProductoId == item.ProductoId))
                {
                    throw new InvalidOperationException($"No existe una unidad de medida con id {item.UnidadId} o no está asignada al producto con id {item.ProductoId}");
                }

                // TODO: Validar caracteristicas (requeridas, existentes, etc.)
            }


            // NOTA: muchas de las validaciones anteriores podrían implementarse como DataAnnotations
            //       para que puedan ser utilizadas por otros controllers y delegar esas tareas de
            //       validación al motor de MVC por medio de atributos en los modelos.

            if (ingreso.Fecha == default(DateTime))
            {
                ingreso.Fecha = DateTime.UtcNow;
            }

            var nuevoIngreso = new Ingreso {
                Fecha       = ingreso.Fecha.ToUniversalTime(),
                UsuarioId   = usuarioId,
                BodegaId    = ingreso.BodegaId,
                ProveedorId = ingreso.ProveedorId,
                Productos   = ingreso.Productos.Select(producto => new IngresoProducto {
                    ProductoId       = producto.ProductoId,
                    MarcaId          = producto.MarcaId,
                    UnidadDeMedidaId = producto.UnidadId,
                    Cantidad         = producto.Cantidad,
                    Precio           = producto.Precio,
                    NumeroDeSerie    = producto.Serie,
                    Caracteristicas  = producto.Caracteristicas?.Select(caracteristica => new IngresoProductoCaracteristica {
                        CaracteristicaId = caracteristica.Id,
                        ListaValorId     = caracteristica.ListaValorId,
                        Valor            = caracteristica.Valor
                    }).ToArray()
                }).ToArray()
            };

            db.Ingresos.Add(nuevoIngreso);

            var existencias = await db.Existencias.Include(x => x.Cantidades).Where(x => productosIds.Contains(x.ProductoId)).ToListAsync();

            foreach (var item in ingreso.Productos)
            {
                var productoId    = item.ProductoId;
                var nuevaCantidad = item.Cantidad;
                var marcaId       = item.MarcaId;
                var unidadId      = item.UnidadId;
                var existencia    = existencias.FirstOrDefault(x => x.ProductoId == productoId);
                if (existencia == null)
                {
                    existencia = new Existencia
                    {
                        ProductoId = productoId,
                        Cantidades = new List <ExistenciaCantidad> {
                            new ExistenciaCantidad {
                                Cantidad          = nuevaCantidad,
                                FechaModificacion = DateTime.UtcNow,
                                MarcaId           = marcaId,
                                UnidadDeMedidaId  = unidadId
                            }
                        }
                    };

                    db.Existencias.Add(existencia);
                    existencias.Add(existencia);
                }
                else
                {
                    var cantidad = existencia.Cantidades.FirstOrDefault(x => x.UnidadDeMedidaId == unidadId && x.MarcaId == marcaId);
                    if (cantidad == null)
                    {
                        cantidad = new ExistenciaCantidad {
                            Cantidad          = nuevaCantidad,
                            FechaModificacion = DateTime.UtcNow,
                            MarcaId           = marcaId,
                            UnidadDeMedidaId  = unidadId
                        };
                        existencia.Cantidades.Add(cantidad);
                    }
                    else
                    {
                        cantidad.Cantidad += nuevaCantidad;
                    }
                }
            }

            await db.SaveChangesAsync();

            return(nuevoIngreso.Id);
        }
예제 #9
0
        public async Task <int> CrearAsync(int usuarioId, EgresoDetalle egreso)
        {
            if (egreso == null)
            {
                throw new ArgumentNullException(nameof(egreso));
            }

            if (egreso.Productos == null || egreso.Productos.Count() == 0)
            {
                throw new InvalidOperationException("No puede crear un egreso sin productos.");
            }
            var tieneProductosRepetidos = egreso.Productos.GroupBy(x => new { x.ProductoId, x.MarcaId, x.UnidadId }).Where(x => x.Count() > 1).Any();

            if (tieneProductosRepetidos)
            {
                throw new InvalidOperationException("Un egreso no puede tener un producto repetido con la misma marca y unidad de medida (debe crear dos egresos distintos)");
            }

            var hayProductosSinCantidad = egreso.Productos.Any(x => x.Cantidad <= 0);

            if (hayProductosSinCantidad)
            {
                throw new InvalidOperationException("Un egreso no puede contener productos con valores menores o iguales a cero");
            }

            var existeBodega = await db.Bodegas.AnyAsync(x => x.Id == egreso.BodegaId);

            if (!existeBodega)
            {
                throw new InvalidOperationException($"No existe una bodega con id {egreso.BodegaId}");
            }

            var productosIds        = egreso.Productos.Select(x => x.ProductoId).Distinct().ToArray();
            var cantidadDeProductos = await db.Productos.CountAsync(x => productosIds.Contains(x.Id));

            var existenTodosLosProductos = cantidadDeProductos == productosIds.Length;

            if (!existenTodosLosProductos)
            {
                throw new InvalidOperationException("Al menos uno de los productos indicados no existe");
            }

            var marcasParaLosProductos = await db.ProductoMarcas.Where(x => productosIds.Contains(x.ProductoId)).ToArrayAsync();

            var unidadesParaLosProductos = await db.ProductoUnidadesDeMedida.Where(x => productosIds.Contains(x.ProductoId)).ToArrayAsync();

            foreach (var item in egreso.Productos)
            {
                if (!marcasParaLosProductos.Any(x => x.MarcaId == item.MarcaId && x.ProductoId == item.ProductoId))
                {
                    throw new InvalidOperationException($"No existe una marca con id {item.MarcaId} o no está asignada al producto con id {item.ProductoId}");
                }
                if (!unidadesParaLosProductos.Any(x => x.UnidadDeMedidaId == item.UnidadId && x.ProductoId == item.ProductoId))
                {
                    throw new InvalidOperationException($"No existe una unidad de medida con id {item.UnidadId} o no está asignada al producto con id {item.ProductoId}");
                }
            }

            if (egreso.Fecha == default(DateTime))
            {
                egreso.Fecha = DateTime.UtcNow;
            }

            var nuevoEgreso = new Egreso
            {
                Fecha     = egreso.Fecha.ToUniversalTime(),
                UsuarioId = usuarioId,
                BodegaId  = egreso.BodegaId
            };

            if (egreso.Productos != null && egreso.Productos.Count() > 0)
            {
                nuevoEgreso.Productos = egreso.Productos.Select(producto => new EgresoProducto {
                    Egreso           = nuevoEgreso,
                    ProductoId       = producto.ProductoId,
                    UnidadDeMedidaId = producto.UnidadId,
                    Cantidad         = producto.Cantidad,
                    MarcaId          = producto.MarcaId
                }).ToList();
            }

            db.Egresos.Add(nuevoEgreso);

            var existencias = await db.Existencias.Include(x => x.Cantidades).Where(x => productosIds.Contains(x.ProductoId)).ToListAsync();

            foreach (var item in egreso.Productos)
            {
                var productoId    = item.ProductoId;
                var nuevaCantidad = item.Cantidad;
                var marcaId       = item.MarcaId;
                var unidadId      = item.UnidadId;
                var existencia    = existencias.FirstOrDefault(x => x.ProductoId == productoId);
                if (existencia == null)
                {
                    throw new InvalidOperationException($"No hay existencias suficientes para el producto {item.ProductoId}");
                }
                else
                {
                    var cantidad = existencia.Cantidades.FirstOrDefault(x => x.UnidadDeMedidaId == unidadId && x.MarcaId == marcaId);
                    if (cantidad == null)
                    {
                        throw new InvalidOperationException($"No hay existencias suficientes para el producto {item.ProductoId}");
                    }
                    else
                    {
                        if (cantidad.Cantidad < nuevaCantidad)
                        {
                            throw new InvalidOperationException($"La cantidad que se desea sacar del producto {item.ProductoId} es mayor a la cantidad disponible");
                        }
                        else
                        {
                            cantidad.Cantidad -= nuevaCantidad;
                        }
                    }
                }
            }

            await db.SaveChangesAsync();

            return(nuevoEgreso.Id);
        }