public bool RegistrarNuevaVenta()
{
bool noHayExito = true;
bool puedeContinuar = true;
while (noHayExito && puedeContinuar)
{
MODEL
.Ventas ventaAux
= new MODEL
.Ventas(); GestionEntities cx
= new GestionEntities
(); TransactionOptions opts
= new TransactionOptions
(); opts.IsolationLevel = System.Transactions.IsolationLevel.Serializable;
System.Transactions.TransactionScope scope
= new System.Transactions.TransactionScope(TransactionScopeOption
.Required, opts
); try
{
MODEL
.Ventas venta
= new MODEL
.Ventas(); venta.Activo = true;
CargarDatoGenerales(cx, venta);
CargarInventario(cx, venta, View.FechaVentaView);
CargarServicios(cx, venta);
venta.EstadoInventario = InferirEstadoInventario();
if (View.TipoVentaView == VentasAgregarPresenter.VENTA_RESERVA)
{
CargarReserva(cx, venta);
}
if (View.TipoVentaView == VENTA_CONTADO
|| View.TipoVentaView == VENTA_RESERVA)
{
CargarPago(cx, venta);
venta.EstadoPago = (venta.SaldoBs > 0 ? Cttes.Ventas.Estado.Pago.PENDIENTE : Cttes.Ventas.Estado.Pago.CANCELADO);
}
if (View.TipoVentaView == VENTA_CREDITO_NORMAL)
{
CargarPlanPagos(cx, venta);
venta.EstadoPago = Cttes.Ventas.Estado.Pago.PENDIENTE;
}
if (View.TipoVentaView == VENTA_CREDITO_SIMPLE
|| View.TipoVentaView == VENTA_CREDITO_NORMAL)
{
//Una venta a crédito no registra ningún pago inicial.
venta.SaldoBs = venta.MontoTotalBs;
venta.SaldoSus = venta.MontoTotalSus;
venta.EstadoPago = Cttes.Ventas.Estado.Pago.PENDIENTE;
}
cx.Ventas.AddObject(venta);
[b]cx.SaveChanges(); //Es aqui donde tarda 6 seg[/b]
scope.Complete();
ventaAux = venta;
VentaA = venta;
noHayExito = false;
}
catch (InsuficienteStockException ex1)
{
Mensaje.Instancia.NotificarMensajeProblema(ex1.Message);
puedeContinuar = false;
}
catch (InvalidOperationException ex2)
{
Mensaje.Instancia.NotificarMensajeProblema(ex2.Message);
puedeContinuar = false;
}
catch (AsegurarCuotaFraccionException ex3)
{
Mensaje.Instancia.NotificarMensajeProblema(string.Format("Producto: {0}\tDeposito: {1}\nNo existe suficiente stock", ex3.Producto.Nombre, ex3.Deposito.Nombre));
puedeContinuar = false;
}
catch (Exception ex)
{
if (Utilidad.EsDeadLock(ex))
{
puedeContinuar = true;
}
else
{
Mensaje.Instancia.NotificarExcepcion(ex);
puedeContinuar = false;
}
}
finally
{
cx.Dispose();
scope.Dispose();
}
}