public ActionResult Crear()
 {
     var producto = new Producto();
     producto.CodigosProductos = new Collection<CodigoProducto>() { new CodigoProducto() };
     //LlenarControles();
     return PartialView(producto);
 }
        public ActionResult Crear(Producto producto)
        {
            if (producto.CodigosProductos.Count == 0)
            {
                return new HttpStatusCodeResult
                    (HttpStatusCode.InternalServerError, "El producto debe contener al menos un código");
            }

            producto.Identifier = Guid.NewGuid();
            producto.CuentaId = UsuarioActual.CuentaId;
            producto.Desincronizado = true;

            if (!ModelState.IsValid)
            {
                //LlenarControles();
                return PartialView(producto);
            }

            var valido = ControlCodigos(producto);
            if (!valido)
            {
                return Json(new { exito = false, error = "Código de producto duplicado" });
            }

            foreach (var codigo in producto.CodigosProductos)
            {
                codigo.Identifier = Guid.NewGuid();
                codigo.Desincronizado = true;
                Uow.CodigosDeProducto.Agregar(codigo);
            }

            foreach (var proveedorProducto in producto.ProveedorProductos)
            {
                proveedorProducto.Identifier = Guid.NewGuid();
                proveedorProducto.Desincronizado = true;
                Uow.ProveedorProductos.Agregar(proveedorProducto);
            }
            producto.Descripcion = producto.Descripcion.ToUpper();
            Uow.Productos.Agregar(producto);;
            Uow.Commit();

            return Json(new
            {
                exito = true,
                codigo = producto.CodigosProductos.First().Codigo,
                descripcion = producto.Descripcion.ToUpper()
            });
        }
        public ActionResult Crear()
        {
            var promocion = new Producto();
            promocion.CodigosProductos = new Collection<CodigoProducto>() { new CodigoProducto() };
            promocion.MarcaId = 1;
            promocion.PromocionMaxikioscos = Uow.MaxiKioscos.Listado().Select(m => new PromocionMaxikiosco
                                                                                   {
                                                                                       MaxiKioscoId = m.MaxiKioscoId,
                                                                                       MaxiKioscoNombre = m.Nombre,
                                                                                       StockActual = 0,
                                                                                       StockAnterior = 0
                                                                                   }).ToList();

            //LlenarControles();
            return PartialView(promocion);
        }
        public ActionResult CostoProducto(int productoId)
        {
            var producto = Uow.Productos.Obtener(productoId);
            if (producto == null)
            {
                producto = new Producto();
            }

            var costo = new ProveedorProducto()
            {
                Producto = producto,
                ProductoId = productoId,
                Identifier = Guid.NewGuid(),
            };

            return PartialView(costo);
        }
        private void btnAceptar_Click(object sender, EventArgs e)
        {
            errorProvider1.Dispose();

            var valido = Validacion.Validar(errorProvider1, new List<object>
                                                  {
                                                      txtDescripcion,
                                                      ddlMarca,
                                                      ddlRubro,
                                                      txtPrecio,
                                                      txtCodigo
                                                  });
            if (valido)
            {
                var cod = CodigoProductoRepository.Obtener(c => c.Codigo == txtCodigo.Valor
                                                && !c.Eliminado
                                                && c.Producto.CuentaId == UsuarioActual.CuentaId);
                if (cod != null)
                {
                    errorProvider1.SetError(txtCodigo, "Ya existe un producto con el código ingresado");
                    errorProvider1.SetIconPadding(txtCodigo, 2);
                    DialogResult = DialogResult.None;
                }
                else
                {
                    var prod = new Producto()
                           {
                               AceptaCantidadesDecimales = chxAceptaDecimales.Checked,
                               DisponibleEnDeposito = chxDisponibleEnDeposito.Checked,
                               Descripcion = txtDescripcion.Text,
                               MarcaId = Convert.ToInt32(ddlMarca.SelectedValue),
                               PrecioConIVA = txtPrecio.Valor.GetValueOrDefault(),
                               PrecioSinIVA = txtPrecioSinIva.Valor.GetValueOrDefault(),
                               RubroId = Convert.ToInt32(ddlRubro.SelectedValue),
                               StockReposicion = string.IsNullOrEmpty(txtStockReposicion.Valor)
                                                       ? (int?)null
                                                       : int.Parse(txtStockReposicion.Valor),
                               Identifier = Guid.NewGuid(),
                               CuentaId = UsuarioActual.CuentaId,
                               EsPromocion = false
                           };

                    ProductoRepository.Agregar(prod);
                    ProductoRepository.Commit();

                    var codigo = new CodigoProducto()
                                     {
                                         Codigo = txtCodigo.Valor,
                                         ProductoId = prod.ProductoId,
                                         Identifier = Guid.NewGuid()
                                     };
                    CodigoProductoRepository.Agregar(codigo);
                    CodigoProductoRepository.Commit();

                    ProductoId = prod.ProductoId;
                    ActualizacionPantallasHelper.ActualizarPantallaVentas();
                }
            }
            else
            {
                DialogResult = DialogResult.None;
            }
        }
 private bool ControlCodigos(Producto producto)
 {
     foreach (var codigo in producto.CodigosProductos)
     {
         //Controlar si ya existe el codigo que se esta editando.
         var cod = codigo.Codigo;
         var codigos = Uow.CodigosDeProducto.Listado().Where(cp => cp.Codigo == cod && cp.CodigoProductoId != codigo.CodigoProductoId).ToList();
         if (codigos.Count > 0)
         {
             return false;
         }
     }
     return true;
 }
        private void ActualizarStock(Producto producto, string operacion)
        {
            var seActualizo = false;
            foreach (var promo in producto.PromocionMaxikioscos)
            {
                seActualizo = true;
                var diferencia = promo.StockActual - promo.StockAnterior;
                if (diferencia != 0)
                {
                    var stock = Uow.Stocks.Obtener(s => s.ProductoId == producto.ProductoId && s.MaxiKioscoId == promo.MaxiKioscoId);
                    if (stock == null)
                    {
                        stock = new Stock
                        {
                            ProductoId = producto.ProductoId,
                            MaxiKioscoId = promo.MaxiKioscoId,
                            StockActual = promo.StockActual,
                            Identifier = Guid.NewGuid(),
                            Desincronizado = true,
                            OperacionCreacion = operacion + " desde promociones web",
                            FechaCreacion = DateTime.Now,
                            StockTransacciones = new List<StockTransaccion>()
                            {
                                new StockTransaccion()
                                {
                                    Cantidad = diferencia,
                                    Desincronizado = true,
                                    Eliminado = false,
                                    Identifier = Guid.NewGuid(),
                                    StockTransaccionTipoId = 3
                                }
                            }
                        };
                        Uow.Stocks.Agregar(stock);
                    }
                    else
                    {
                        stock.StockActual += diferencia;
                        Uow.Stocks.Modificar(stock);

                        var trans = new StockTransaccion()
                        {
                            Desincronizado = true,
                            Identifier = Guid.NewGuid(),
                            Cantidad = diferencia,
                            StockId = stock.StockId,
                            StockTransaccionTipoId = 3
                        };
                        Uow.StockTransacciones.Agregar(trans);
                    }
                }

            }

            if (seActualizo)
            {
                Uow.Commit();;
            }
        }
        private void ActualizarPromociones(Producto producto)
        {
            var promos = Uow.ProductoPromociones.Listado()
                .Where(pp => pp.PadreId == producto.ProductoId)
                .ToList();

            var promosAEliminar = promos
                .Where(pp => producto.PromocionesHijos.All(x => x.ProductoPromocionId != pp.ProductoPromocionId))
                .ToList();

            var promosAAgregar = producto.PromocionesHijos
                .Where(cp => cp.ProductoPromocionId == 0)
                .ToList();

            var promosAModificar =
               promos
               .Where(cp => !promosAAgregar.Any(x => x.ProductoPromocionId == cp.ProductoPromocionId))
               .Where(cp => !promosAEliminar.Any(x => x.ProductoPromocionId == cp.ProductoPromocionId))
               .ToList();

            //Eliminar codigos de producto
            foreach (var promo in promosAEliminar)
            {
                Uow.ProductoPromociones.Eliminar(promo);
            }

            //Agregar codigos de producto
            foreach (var promo in promosAAgregar)
            {
                promo.Identifier = Guid.NewGuid();
                promo.Desincronizado = true;
                promo.PadreId = producto.ProductoId;
                Uow.ProductoPromociones.Agregar(promo);
            }

            //Modificar codigos de producto actuales
            foreach (var promo in promosAModificar)
            {
                var original = producto.PromocionesHijos.FirstOrDefault(c => c.ProductoPromocionId == promo.ProductoPromocionId);

                if (original != null)
                {
                    promo.Unidades = original.Unidades;
                    promo.HijoId = original.HijoId;
                    promo.Desincronizado = true;

                    Uow.ProductoPromociones.Modificar(promo);
                }
            }

            producto.PromocionesHijos.Clear();
        }
        private void ActualizarCostos(Producto producto)
        {
            var costos = Uow.ProveedorProductos.Listado()
                .Where(pp => pp.ProductoId == producto.ProductoId)
                .ToList();

            var costosAEliminar = costos
                .Where(pp => producto.ProveedorProductos.All(x => x.ProveedorProductoId != pp.ProveedorProductoId))
                .ToList();

            var costosAAgregar = producto.ProveedorProductos
                .Where(cp => cp.ProveedorProductoId == 0)
                .ToList();

            var costosAModificar =
               costos
               .Where(cp => !costosAAgregar.Any(x => x.ProveedorProductoId == cp.ProveedorProductoId))
               .Where(cp => !costosAEliminar.Any(x => x.ProveedorProductoId == cp.ProveedorProductoId))
               .ToList();

            //Eliminar codigos de producto
            foreach (var costo in costosAEliminar)
            {
                Uow.ProveedorProductos.Eliminar(costo);
            }

            //Agregar codigos de producto
            foreach (var costo in costosAAgregar)
            {
                costo.Identifier = Guid.NewGuid();
                costo.Desincronizado = true;
                costo.FechaUltimoCambioCosto = DateTime.Now;
                Uow.ProveedorProductos.Agregar(costo);
            }

            //Modificar codigos de producto actuales
            foreach (var costo in costosAModificar)
            {
                var costoActualizado = producto.ProveedorProductos.FirstOrDefault(c => c.ProveedorProductoId == costo.ProveedorProductoId);

                if (costoActualizado != null)
                {
                    if (costo.CostoConIVA != costoActualizado.CostoConIVA)
                        costo.FechaUltimoCambioCosto = DateTime.Now;

                    costo.CostoConIVA = costoActualizado.CostoConIVA;
                    costo.CostoSinIVA = costoActualizado.CostoSinIVA;
                    costo.ProveedorId = costoActualizado.ProveedorId;
                    costo.ProductoId = costoActualizado.ProductoId;
                    costo.Desincronizado = true;

                    Uow.ProveedorProductos.Modificar(costo);
                }
            }

            ////Removemos los codigos de la entidad productos para evitar
            //// conflictos con los codigos actualizados anterior mente.
            producto.ProveedorProductos.Clear();
        }
        private void ActualizarCodigos(Producto producto)
        {
            //Eliminar los codigos que estan vacios
            foreach (var codigo in producto.CodigosProductos.ToList())
            {
                if (string.IsNullOrEmpty(codigo.Codigo))
                    producto.CodigosProductos.Remove(codigo);
            }

            var codigos = Uow.CodigosDeProducto.Listado()
                .Where(cp => cp.ProductoId == producto.ProductoId)
                .ToList();

            var codigosAEliminar = codigos
                .Where(cp => producto.CodigosProductos.All(x => x.CodigoProductoId != cp.CodigoProductoId))
                .ToList();

            var codigosAAgregar = producto.CodigosProductos
                .Where(cp => cp.CodigoProductoId == 0)
                .ToList();

            var codigosAModificar =
               codigos
               .Where(cp => !codigosAAgregar.Any(x => x.CodigoProductoId == cp.CodigoProductoId))
               .Where(cp => !codigosAEliminar.Any(x => x.CodigoProductoId == cp.CodigoProductoId))
               .ToList();

            //Eliminar codigos de producto
            foreach (var codigoProducto in codigosAEliminar)
            {
                Uow.CodigosDeProducto.Eliminar(codigoProducto);
            }

            //Agregar codigos de producto
            foreach (var codigoProducto in codigosAAgregar)
            {
                codigoProducto.Identifier = Guid.NewGuid();
                Uow.CodigosDeProducto.Agregar(codigoProducto);
            }

            //Modificar codigos de producto actuales
            foreach (var codigoProducto in codigosAModificar)
            {
                var codigoActualizado =
                    producto.CodigosProductos.FirstOrDefault(c => c.CodigoProductoId == codigoProducto.CodigoProductoId);

                if (codigoActualizado != null)
                {
                    codigoProducto.Codigo = codigoActualizado.Codigo;
                    Uow.CodigosDeProducto.Modificar(codigoProducto);
                }
            }

            ////Removemos los codigos de la entidad productos para evitar
            //// conflictos con los codigos actualizados anterior mente.
            producto.CodigosProductos.Clear();
        }
        public ActionResult PromocionProducto(int productoId)
        {
            var producto = Uow.Productos.Obtener(productoId);
            if (producto == null)
            {
                producto = new Producto();
            }

            var promo = new ProductoPromocion()
            {
                Hijo = producto,
                HijoId = productoId,
                Identifier = Guid.NewGuid(),
            };
            return PartialView(promo);
        }
        public ActionResult Editar(Producto producto)
        {
            if (!ModelState.IsValid)
            {
                //LlenarControles();
                return PartialView(producto);
            }

            if (producto.CodigosProductos.Count == 0)
            {
                return new HttpStatusCodeResult(HttpStatusCode.InternalServerError, "El producto debe contener al menos un código");
            }

            var valido = ControlCodigos(producto);
            if (!valido)
            {
                return Json(new { exito = false, error = "Código de producto duplicado" });
            }

            producto.MarcaId = null;
            producto.EsPromocion = true;

            ActualizarCodigos(producto);
            ActualizarCostos(producto);
            ActualizarPromociones(producto);
            producto.Descripcion = producto.Descripcion.ToUpper();
            Uow.Productos.Modificar(producto);

            try
            {
                Uow.Commit();
                ActualizarStock(producto, "Edición");
            }
            catch (Exception ex)
            {

                throw ex;
            }

            return Json(new { exito = true });
        }
        public ActionResult Crear(Producto producto)
        {
            if (producto.CodigosProductos.Count == 0)
            {
                return new HttpStatusCodeResult
                    (HttpStatusCode.InternalServerError, "El producto debe contener al menos un código");
            }
            producto.EsPromocion = true;
            producto.Identifier = Guid.NewGuid();
            producto.CuentaId = UsuarioActual.CuentaId;
            producto.Desincronizado = true;

            //hardcodeo la marca para que no rompa la garcha en la validacion
            producto.MarcaId = 1;
            if (!ModelState.IsValid)
            {
                //LlenarControles();
                return PartialView(producto);
            }

            var valido = ControlCodigos(producto);
            if (!valido)
            {
                return Json(new { exito = false, error = "Código de producto duplicado" });
            }

            producto.MarcaId = null;
            foreach (var codigo in producto.CodigosProductos)
            {
                codigo.Identifier = Guid.NewGuid();
                Uow.CodigosDeProducto.Agregar(codigo);
            }

            foreach (var hijo in producto.PromocionesHijos)
            {
                hijo.Identifier = Guid.NewGuid();
                Uow.ProductoPromociones.Agregar(hijo);
            }

            foreach (var proveedorProducto in producto.ProveedorProductos)
            {
                proveedorProducto.Identifier = Guid.NewGuid();
                Uow.ProveedorProductos.Agregar(proveedorProducto);
            }

            producto.Descripcion = producto.Descripcion.ToUpper();
            Uow.Productos.Agregar(producto);
            Uow.Commit();

            ActualizarStock(producto, "Creación");
            return Json(new { exito = true, codigo = producto.CodigosProductos.First().Codigo });
        }
        public ActionResult Editar(Producto producto)
        {
            if (!ModelState.IsValid)
            {
                //LlenarControles();
                return PartialView(producto);
            }

            if (producto.CodigosProductos.Count == 0)
            {
                return new HttpStatusCodeResult(HttpStatusCode.InternalServerError, "El producto debe contener al menos un código");
            }

            var valido = ControlCodigos(producto);
            if (!valido)
            {
                return Json(new { exito = false, error = "Código de producto duplicado" });
            }

            ActualizarCodigos(producto);
            ActualizarCostos(producto);
            producto.Descripcion = producto.Descripcion.ToUpper();
            Uow.Productos.Modificar(producto);
            Uow.Commit();

            return Json(new { exito = true });
        }