public async Task <ActionResult> Create(OrdenCreateOrUpdateDto model) { //Aqui tenemos que validar que sólo el administrador pueda poner diferente idCliente en el model try { await _service.Create(model); return(Ok()); } catch (Exception e) { return(BadRequest(e.Message)); } }
public async Task Create(OrdenCreateOrUpdateDto model) { var cliente = await _context.Cliente.FindAsync(model.IdCliente); var entry = new Model.Orden.Orden { IdCliente = model.IdCliente, Fecha = Convert.ToDateTime(model.Fecha), EstadoPago = (Enums.EstadoPago)Enum.Parse(typeof(Enums.EstadoPago), model.EstadoPago, true), MontoPagado = model.MontoPagado.HasValue ? model.MontoPagado.Value : 0 }; //Creamos todos los detalles de orden: double acumulador = 0.0d; var productosAgregar = new List <Model.Orden.DetalleOrden>(); foreach (var item in model.DetalleOrdenes) { //await _context.DetalleOrden.AddAsync(new Model.Orden.DetalleOrden //{ // IdOrden = entry.IdOrden, // IdProducto = item.IdProducto, // Cantidad = item.Cantidad //}); productosAgregar.Add(new Model.Orden.DetalleOrden { IdOrden = entry.IdOrden, IdProducto = item.IdProducto, Cantidad = item.Cantidad }); //Buscamos el producto para sacar su precio y vamos acumulando lo que nos debe: var producto = await _context.Producto.FindAsync(item.IdProducto); acumulador += (item.Cantidad * producto.Precio); } if (entry.EstadoPago == Enums.EstadoPago.PagoParte || entry.EstadoPago == Enums.EstadoPago.PorPagar) { //Tenemos que verificar que exista el id de la tasa para generar la deuda, caso contrario devolvemos error if (!model.IdTasa.HasValue) { throw new Exception("No se introdujo tasa"); //rompemos la funcion } //Rompemos la funcion si el cliente ya consumió por encima de su linea de credito if (cliente.LineaCredito < (cliente.LineaConsumida + acumulador)) { throw new Exception("El cliente no cuenta con credito"); } } await _context.Orden.AddAsync(entry); await _context.SaveChangesAsync(); foreach (var item in productosAgregar) { item.IdOrden = entry.IdOrden; await _context.DetalleOrden.AddAsync(item); } //Creamos las deudas si es que el estado de pago es PorPagar if (entry.EstadoPago == Enums.EstadoPago.PorPagar) { await _context.Deuda.AddAsync(new Model.Deuda.Deuda { IdOrden = entry.IdOrden, //Que sólo el administrador pueda poner el id de otro cliente se valida en el mismo controller IdCliente = model.IdCliente, IdTasa = model.IdTasa.Value, MontoInicial = acumulador, MontoAcumulado = acumulador, //El mismo dia no acumuló nada MontoInteres = acumulador, //El interes es 0 el mismo dia EstadoDeuda = Enums.EstadoDeuda.Vigente, FechaUltimaActualizacion = Convert.ToDateTime(model.Fecha) }); //Actualizamos el estado de la linea de credito del cliente: cliente.LineaConsumida += acumulador; } else if (entry.EstadoPago == Enums.EstadoPago.PagoParte) { if (model.MontoPagado.HasValue) //Validamos que haya introducido un monto { if (model.MontoPagado.Value != 0.0d) //validamos que el monto introducido sea diferente de 0 { acumulador -= model.MontoPagado.Value; //restamos el monto al total acumulado } } //Generamos la deuda: await _context.Deuda.AddAsync(new Model.Deuda.Deuda { IdOrden = entry.IdOrden, //Que sólo el administrador pueda poner el id de otro cliente se valida en el mismo controller IdCliente = model.IdCliente, IdTasa = model.IdTasa.Value, MontoInicial = acumulador, MontoAcumulado = acumulador, //El mismo dia no acumuló nada MontoInteres = acumulador, //El interes es 0 el mismo dia EstadoDeuda = Enums.EstadoDeuda.Vigente, FechaUltimaActualizacion = Convert.ToDateTime(model.Fecha) }); //Actualizamos el estado de la linea de credito del cliente: cliente.LineaConsumida += acumulador; } //En los otros 2 casos no se genera deuda. await _context.SaveChangesAsync(); }