//public virtual Factura Factura { get; set; } //Relacion con la cuenta de crédito /* * Esta funcion cancela la venta, regresando los productos al inventario */ public int CancelarVenta(int IdSucursal) { foreach(ProductoVenta item in ProductosVenta) { try{ /* * Buscamos el elemento en ProductoVenta para eliminarlo */ var PV = db.ProductosVenta.Single( p => p.VentaId == ID && p.ProductoId == item.ID); //Lo eliminamos db.ProductosVenta.Remove(PV); /* * Buscamos el ProductoSucursal de item para poder reestablecer su producto */ var PS = db.ProductosSucursal.Single(ps => ps.IdProducto == item.ID && ps.IdSucursal == IdSucursal); PS.cantidad += item.Count; /* * Aqui generamos un movimiento de regreso */ MovimientoAlmacen movimiento = new MovimientoAlmacen { DescripcionMovimiento = "Regreso a inventario por cancelacion de la Venta " + ID + "Con folio y serie " + ClaveCFD, Count = item.Count, FechaMovimiento = System.DateTime.Now, OrdenDeCompra = null, IdOrednCompra = 0, IdProducto = item.ProductoId, Producto = db.Productos.Find(item.ProductoId), IdSucursal = IdSucursal, Sucursal = db.Sucursales.Find(IdSucursal), TipoMovimiento = "Regreso a Inventario", IdVenta = 0 }; db.MovimientosAlmacen.Add(movimiento); db.SaveChanges(); } catch { return 0; } } //ahora eliminamos por completo nuesta venta try { var vent = db.Ventas.Find(ID); db.Ventas.Remove(vent); db.SaveChanges(); return 1; } catch { return 0; } }
public int CrearVenta(CarritoDeCompras carrito, Venta venta, int idCliente, int credito, int IdSucursal) { decimal IVA = 0.16M; /* * Proceso de la venta: * 1.- Setear los precios y cantidades finales de cada producto - Se hace en el controlador * 2.- Calcular el total de la venta, así como los impuestos y el Subtotal * 3.- Crear las relaciones de la venta con los productos * 4.- Mandar a crédito si asi se requiere * 5.- Mandar Datos a la FEL para la factura electrónica * 6.- Recibir la factura electrónica y guardarla */ decimal totalVenta = 0; var cartItems = carrito.GetElementos(); foreach (var item in cartItems) { var productoVenta = new ProductoVenta { ProductoId = item.ProductoId, VentaId = venta.ID, PrecioVenta = item.PrecioVenta, Count = item.Count, Producto = db.Productos.Find(item.ProductoId), Venta = db.Ventas.Find(venta.ID) }; db.ProductosVenta.Add(productoVenta); db.SaveChanges(); /*Aqui quitaremos los productos del inventario y generaremos un moviemiento en el*/ //Buscamos el elemento que representa en ProductoSucursal var PS = db.ProductosSucursal.Single(p => p.IdProducto == item.ProductoId && p.IdSucursal == IdSucursal); //Quitamos del inventario la cantidad PS.cantidad -= item.Count; //Aqui generamos un movimiento de Almacen MovimientoAlmacen movimiento = new MovimientoAlmacen { DescripcionMovimiento = "Venta de " + item.Count + " del producto " + item.Producto.Nombre, Count = item.Count, FechaMovimiento = System.DateTime.Now, OrdenDeCompra = null, IdOrednCompra = 0, IdProducto = item.ProductoId, Producto = db.Productos.Find(item.ProductoId), IdSucursal = IdSucursal, Sucursal = db.Sucursales.Find(IdSucursal), TipoMovimiento = "Venta", IdVenta = venta.ID, username = HttpContext.User.Identity.Name }; db.MovimientosAlmacen.Add(movimiento); //Establecer el Subtotal de la venta - Modificar para el cambio de precios totalVenta += (item.Count * productoVenta.PrecioVenta); } venta.Moneda = "MXN Moneda Nacional (Peso Mexicano)"; venta.usuario = HttpContext.User.Identity.Name; venta.Subtotal = totalVenta; venta.TotalImpuestosRetenidos = 0; venta.TotalImpuestosTrasladados = totalVenta * IVA; venta.IdCliente = idCliente; venta.IdSucursal = IdSucursal; decimal total = venta.Subtotal + venta.TotalImpuestosTrasladados; venta.Total = total; decimal centavos = (total - (int)total) * 100; venta.ImporteLetra = toText(venta.Total) + ", " + (int)centavos + "/100 MXN"; venta.Liquidado = true; venta.FormaDePago = "Pago en una sola exhibición"; venta.IdSucursal = IdSucursal; decimal totalN = (totalVenta) + (totalVenta * IVA); decimal centavosN = 100*(totalN - (int)total); int cn = (int)centavosN; venta.ImporteLetra = toText(totalN) + " " + cn + "/100 M.N."; venta.Total = total; //Generamos un movimiento de Almacen /* * Averiguamos la cuenta de crédito a la que se va a cargar esta venta */ if (credito == 1) { var cCredito = db.CuentasCredito.Single(c => c.IdCliente == idCliente); venta.Liquidado = false; if (cCredito.Ventas.Count == 0) { cCredito.Ventas = new List<Venta>(); cCredito.Ventas.Add(venta); } else cCredito.Ventas.Add(venta); } db.SaveChanges(); carrito.VaciarCarrito(); return venta.ID; }
public ActionResult Details(int id, int x = 1) { var orden = db.OrdenesDeCompra.Find(id); if (permisoSucursal(orden.IdSucursal) == 0) { return RedirectToAction("Error", new { Error = "No puede aceptar el traslado ya que no cuenta con los permisos necesarios" }); } //Actualizamos la orden de compra de acuerdo a la información dada foreach (var item in orden.Productos) { string label = "cantidad" + item.IdProducto; try { decimal cantidad = decimal.Parse(Request.Form[label]); item.cantidad = cantidad; } catch { ViewBag.Sucursal = db.Sucursales.Find(orden.IdSucursal); ViewBag.Proveedor = db.Proveedores.Find(orden.IdProveedor); return View(orden); } } orden.Activa = false; orden.usuario = HttpContext.User.Identity.Name; OrdenDeCompra Orden = orden; /* Relacionamos al proveedor con el producto */ foreach (ProductoOrden prod in Orden.Productos) { /*Buscamos si el producto ya había sido vendido por el proveedor*/ List<Proveedor> Prove = db.Proveedores.Where(p => p.ID == Orden.ID && p.Productos.Any(pp => pp.ID == prod.ID)).ToList(); if (Prove.Count == 0) { //Creamos insertamos un proveedor a la lista de productos var provedor = db.Proveedores.Find(Orden.IdProveedor); var prodI = db.Productos.Find(prod.IdProducto); if (provedor.Productos == null) provedor.Productos = new List<Producto>(); if (prodI.Proveedores == null) prodI.Proveedores = new List<Proveedor>(); provedor.Productos.Add(prodI); prodI.Proveedores.Add(provedor); } } db.SaveChanges(); //Ahora damos de alta los productos en el inventario foreach (var item in Orden.Productos) { try { var Prod = db.ProductosSucursal.Single(p => p.IdProducto == item.IdProducto && p.IdSucursal == Orden.IdSucursal); Prod.cantidad += item.cantidad; //Generamos el movimiento var Movimiento = new MovimientoAlmacen { Count = item.cantidad, DescripcionMovimiento = "Alta por Orden de compra número " + Orden.ID, FechaMovimiento = DateTime.Now, IdOrednCompra = Orden.ID, IdProducto = item.IdProducto, IdSucursal = Orden.IdSucursal, IdVenta = 0, OrdenDeCompra = Orden, Producto = item.Producto, TipoMovimiento = "Ingreso" }; db.MovimientosAlmacen.Add(Movimiento); db.SaveChanges(); } catch { var Prod = new ProductoSucursal { cantidad = item.cantidad, IdProducto = item.IdProducto, IdSucursal = Orden.IdSucursal, Producto = item.Producto }; db.ProductosSucursal.Add(Prod); //Generamos el movimiento var Movimiento = new MovimientoAlmacen { Count = item.cantidad, DescripcionMovimiento = "Alta por Orden de compra número " + Orden.ID, FechaMovimiento = DateTime.Now, IdOrednCompra = Orden.ID, IdProducto = item.IdProducto, IdSucursal = Orden.IdSucursal, IdVenta = 0, OrdenDeCompra = Orden, Producto = item.Producto, TipoMovimiento = "Ingreso", username = HttpContext.User.Identity.Name }; db.MovimientosAlmacen.Add(Movimiento); db.SaveChanges(); } } return RedirectToAction("Index"); }
public ActionResult Create(OrdenTraslado orden) { int IdSucursalOrigen = int.Parse(Request.Form["IdSucursalOrigen"]); int IdSucursalDestino = int.Parse(Request.Form["IdSucursalDestino"]); int noProductos = int.Parse(Request.Form["noProductos"]); if (IdSucursalOrigen == 0 || IdSucursalDestino == 0) { return RedirectToAction("Error", new { Error = "Debes indicar las sucursales involucradas en el traslado" }); } orden.IdSucursalDestino = IdSucursalDestino; orden.IdSucursalOrigen = IdSucursalOrigen; orden.FechaGenerada = DateTime.Now; orden.Activa = true; if (ModelState.IsValid) { //Guardamos la orden db.Traslados.Add(orden); db.SaveChanges(); int IdOrden = orden.ID; orden = db.Traslados.Find(IdOrden); int i = 0; /* * Guardamos cada uno de los productos */ orden.Productos = new List<ProductoTraslado>(); for (i = 1; i <= noProductos; i++) { string labelId = "IdProducto" + i; string labelCantidad = "CantidadProducto" + i; int idProd = int.Parse(Request.Form[labelId]); decimal cantidad = decimal.Parse(Request.Form[labelCantidad]); /*Checamos que haya en existencia para la sucursal origen el producto a trasladar*/ try { var ProdSuc = db.ProductosSucursal.Single(p => p.IdProducto == idProd && p.IdSucursal == IdSucursalOrigen); if (ProdSuc.cantidad < cantidad) { db.Traslados.Remove(orden); return RedirectToAction("Error", new { Error = "No existe la suficiente cantidad de productos para ser trasladada" }); } } catch { db.Traslados.Remove(orden); return RedirectToAction("Error", new { Error = "No hay existencia de el producto " + idProd + " - No se guardará el traslado" }); } /**/ var PO = new ProductoTraslado { cantidad = cantidad, IdProducto = idProd, Producto = db.Productos.Find(idProd), IdTraslado = IdOrden }; orden.Productos.Add(PO); db.ProductosTraslado.Add(PO); db.SaveChanges(); } return RedirectToAction("Index"); } return View(orden); } public ActionResult Details(int id) { var orden = db.Traslados.Find(id); ViewBag.SucursalOrigen = db.Sucursales.Find(orden.IdSucursalOrigen); Sucursal s = db.Sucursales.Find(orden.IdSucursalDestino); ViewBag.SucursalDestino = s ; ViewBag.Permiso = permisoSucursal(s.ID); return View(orden); } [HttpPost] public ActionResult Details(int id, int x = 1) { var orden = db.Traslados.Find(id); if (permisoSucursal(orden.IdSucursalDestino) == 0) { return RedirectToAction("Error", new { Error = "No puede aceptar el traslado ya que no cuenta con los permisos necesarios" }); } //Actualizamos la orden de traslado de acuerdo a la información dada foreach (var item in orden.Productos) { string label = "cantidad" + item.IdProducto; try { decimal cantidad = decimal.Parse(Request.Form[label]); item.cantidad = cantidad; } catch { ViewBag.SucursalOrigen = db.Sucursales.Find(orden.IdSucursalOrigen); ViewBag.SucursalOrigen = db.Sucursales.Find(orden.IdSucursalDestino); ViewBag.Proveedor = db.Proveedores.Find(orden.IdProveedor); return View(orden); } } /*Registramos como procesada la orden*/ orden.Activa = false; orden.usuario = HttpContext.User.Identity.Name; OrdenTraslado Orden = orden; db.SaveChanges(); //Ahora damos de alta los productos en el inventario de sucursal destino y de baja en la sucursal origen foreach (var item in Orden.Productos) { /*Verificamos la existencia en el origen*/ try { //Averiguamos la existencia en la sucursal de origen var existencia = db.ProductosSucursal.Single(p => p.IdProducto == item.IdProducto && p.IdSucursal == Orden.IdSucursalOrigen); if (existencia.cantidad < item.cantidad) { orden.Activa = true; db.SaveChanges(); return RedirectToAction("Error", new { Error = "No existe la suficiente cantidad de productos para ser trasladada" }); } } catch { orden.Activa = true; db.SaveChanges(); return RedirectToAction("Error", new { Error = "No existe la suficiente cantidad de productos para ser trasladada" }); } /****************************************/ try { //Esta parte de ty se ejecutara si solo hay que actualizar cantidad var ProdD = db.ProductosSucursal.Single(p => p.IdProducto == item.IdProducto && p.IdSucursal == Orden.IdSucursalDestino); ProdD.cantidad += item.cantidad; //Generamos el movimiento var Movimiento = new MovimientoAlmacen { Count = item.cantidad, DescripcionMovimiento = "Alta por Traslado desde sucursal " + Orden.IdSucursalOrigen, FechaMovimiento = DateTime.Now, IdOrednCompra = 0, IdProducto = item.IdProducto, IdSucursal = Orden.IdSucursalDestino, IdVenta = 0, Producto = item.Producto, TipoMovimiento = "Ingreso" }; db.MovimientosAlmacen.Add(Movimiento); var ProdO = db.ProductosSucursal.Single(p => p.IdProducto == item.IdProducto && p.IdSucursal == Orden.IdSucursalOrigen); ProdO.cantidad -= item.cantidad; //Generamos el movimiento Movimiento = new MovimientoAlmacen { Count = item.cantidad, DescripcionMovimiento = "Baja por Traslado hacia sucursal " + Orden.IdSucursalDestino, FechaMovimiento = DateTime.Now, IdOrednCompra = 0, IdProducto = item.IdProducto, IdSucursal = Orden.IdSucursalOrigen, IdVenta = 0, Producto = item.Producto, TipoMovimiento = "Salida" }; db.SaveChanges(); } catch { //Creamos un nuevo producto Sucursal, para darlo de alta en el inventario de la sucursal var ProdD = new ProductoSucursal { cantidad = item.cantidad, IdProducto = item.IdProducto, IdSucursal = Orden.IdSucursalDestino, Producto = db.Productos.Find(item.IdProducto), Sucursal = db.Sucursales.Find(Orden.IdSucursalDestino) }; db.ProductosSucursal.Add(ProdD); //Generamos el movimiento var Movimiento = new MovimientoAlmacen { Count = item.cantidad, DescripcionMovimiento = "Alta por Traslado desde sucursal " + Orden.IdSucursalOrigen, FechaMovimiento = DateTime.Now, IdOrednCompra = 0, IdProducto = item.IdProducto, IdSucursal = Orden.IdSucursalDestino, IdVenta = 0, Producto = item.Producto, TipoMovimiento = "Ingreso" }; db.MovimientosAlmacen.Add(Movimiento); //Damos de baja en el Origen var ProdO = db.ProductosSucursal.Single(p => p.IdProducto == item.IdProducto && p.IdSucursal == Orden.IdSucursalOrigen); ProdO.cantidad -= item.cantidad; //Generamos el movimiento Movimiento = new MovimientoAlmacen { Count = item.cantidad, DescripcionMovimiento = "Baja por Traslado hacia sucursal " + Orden.IdSucursalDestino, FechaMovimiento = DateTime.Now, IdOrednCompra = 0, IdProducto = item.IdProducto, IdSucursal = Orden.IdSucursalOrigen, IdVenta = 0, Producto = item.Producto, TipoMovimiento = "Salida" }; db.MovimientosAlmacen.Add(Movimiento); db.SaveChanges(); } } return RedirectToAction("Index"); }