/// <summary>
        /// usa un context general un nuevo control context para hacer la transaction
        /// hace llamdos a metodos del inventBL que a su vez usa el mismo context
        /// </summary>
        /// <returns></returns>
        private int SaveAjusteCurrentContext()
        {
            var continuar   = true;
            var consecutivo = 1;

            /// current context
            /// usamos el de invent porque solo esas tablas se modifican
            /// por el momento no hay un context general para todos nucleos
            /// podria ponerse en una interface padre
            ////var context = inventBL.dbCtx;
            /// inicio la transaction con el context actual
            //using (var dbcxtransaction = context.Database.BeginTransaction())
            commB.BeginTran();
            {
                try
                {
                    foreach (var item in detailAjustes.AjustesLines)
                    {
                        var producto = inventBL.GetProductoById(item.IdProducto);
                        if (producto != null)
                        {
                            /// actualizar costo: get costo
                            producto.PrecioVenta = item.Precio;
                            commB.UpdateEntity <Producto>(producto);
                            /// solo para los q tienen existencia, para los demas no se acualiz su existencia
                            if (producto.VerificaDisponible)
                            {
                                var existencia = inventBL.GetExistenciaByIdProducto(item.IdProducto);
                                var cantidad   = item.Cantidad;
                                if (rdoSalida.Checked)
                                {
                                    cantidad = cantidad * -1;
                                }
                                if (existencia != null)
                                {
                                    if (existencia.Cantidad + cantidad >= 0)
                                    {
                                        inventBL.UpdateExistencia(existencia, cantidad);
                                        commB.Commit();
                                    }
                                    else
                                    {
                                        commB.Rollback();
                                        commB.Reload(producto);
                                        lblMensaje.Text = "El producto " + item.Descripcion +
                                                          " no puede tener existencias negativas.";
                                        continuar = false;
                                        break;
                                    }
                                }
                                else
                                {
                                    var newExist = inventBL.InsertExistencia(item.IdProducto, cantidad);
                                    ///dbcxtransaction.Commit();
                                    commB.Commit();
                                }
                            }
                        }
                        else
                        {
                            ///dbcxtransaction.Rollback();
                            commB.Rollback();
                            lblMensaje.Text = "El producto " + item.Descripcion +
                                              " no existe en el inventario";
                            continuar = false;
                            break;
                        }
                    }
                    if (!continuar)
                    {
                        return(0);
                    }
                    MessageBox.Show("Ajuste aplicado", "Control", MessageBoxButtons.OK, MessageBoxIcon.Information,
                                    MessageBoxDefaultButton.Button1);
                    return(consecutivo);
                }
                catch (Exception ex)
                {
                    ///dbcxtransaction.Rollback();
                    commB.Rollback();
                    ControlBusiness.BusinessHelpers.General.DoError(ex, "Control", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
                    return(0);
                }
            }
        }
        private int SaveVenta()
        {
            var continuar   = true;
            var consecutivo = 0;

            commB.BeginTran();
            try
            {
                var venta = new ControlEntity.Venta();
                venta.Estado      = Enum.GetName(typeof(BaseHelpers.Helpers.Tools.EstatusDocumentosEnum.EstatusDocumentosTypes), 2);
                venta.Consecutivo = Convert.ToInt16(GetConsecutivo(true));
                consecutivo       = venta.Consecutivo;
                venta.Fecha       = DateTime.Now;
                venta.IdCaja      = curCaja;
                venta.IdCliente   = Convert.ToInt32(txtCliente.Text);
                venta.IdUsuario   = curUser;
                // los textos de totales ya tienen el redondeo aplicado
                // por eso esta bien que los guarde desde ahi
                venta.TotalDescuentos = Convert.ToDecimal(string.IsNullOrEmpty(this.txtTotalDescuento.Text) ? "0" : this.txtTotalDescuento.Text);
                venta.TotalImpuestos  = Convert.ToDecimal(string.IsNullOrEmpty(this.txtTotalImpuestos.Text) ? "0" : this.txtTotalImpuestos.Text);
                venta.TotalVenta      = Convert.ToDecimal(this.txtGrandTotal.Text);
                // guarda detalle
                foreach (var item in detailRep.CartLines)
                {
                    var ventaDetalle = new ControlEntity.DetalleVenta();
                    ventaDetalle.Cantidad   = item.Cantidad;
                    ventaDetalle.Descuento  = item.MontoDescuento;
                    ventaDetalle.IdProducto = item.Producto.IdProducto;
                    ventaDetalle.Precio     = item.Producto.PrecioVenta;
                    ventaDetalle.Impuestos  = item.Cantidad *
                                              (item.Producto.PrecioVenta * item.Producto.Descuento / 100);
                    commB.AddEntity <ControlEntity.DetalleVenta>(ventaDetalle);
                    if (item.Producto.VerificaDisponible)
                    {
                        var existencia = inventBL.GetExistenciaByIdProducto(item.Producto.IdProducto);
                        if (existencia != null)
                        {
                            if (existencia.Cantidad >= item.Cantidad)
                            {
                                /// actualizar costo: get costo
                                existencia.Cantidad -= item.Cantidad;
                                //inventBL.UpdateExistenciaVentas(existencia, item.Cantidad); da error de que no ha insertado encabezado de factura
                            }
                            else
                            {
                                commB.Reload(existencia);
                                lblMensaje.Text = "El producto " + item.Producto.Descripcion +
                                                  " no posee suficientes existencias para cumplir con la cantidad solicitada, por favor disminuya la cantidad solicitada";
                                continuar = false;
                                break;
                            }
                        }
                    }
                    /// insertar movimiento de inventario
                }
                commB.CreateEntity <ControlEntity.Venta>(venta);
                if (continuar)
                {
                    /// salvar pagos
                    foreach (var pago in pagosRep.PagosLines)
                    {
                        switch (pago.FormaPago)
                        {
                        case "Efectivo":
                            /// actualiza saldo caja efectivo
                            if (ventasB.UpdateSaldoCaja(curCaja, pago.MontoAplicado, 0) <= 0)
                            {
                                continuar = false;
                                break;
                            }
                            /// actualiza efectivo si recibido > aplicado
                            var cambio = pago.MontoPagado - pago.MontoAplicado;
                            if (pago.MontoPagado > pago.MontoAplicado)
                            {
                                if (ventasB.UpdateSaldoCaja(curCaja, -(cambio), 0) <= 0)
                                {
                                    continuar = false;
                                }
                            }
                            break;

                        case "Tarjeta":
                        case "Cheque":
                            /// actualiza saldo caja documentos
                            if (ventasB.UpdateSaldoCaja(curCaja, 0, pago.MontoAplicado) <= 0)
                            {
                                continuar = false;
                            }
                            /// actualiza efectivo si recibido > aplicado
                            var cambioDocumentos = pago.MontoPagado - pago.MontoAplicado;
                            if (pago.MontoPagado > pago.MontoAplicado)
                            {
                                if (ventasB.UpdateSaldoCaja(curCaja, -(cambioDocumentos), 0) <= 0)
                                {
                                    continuar = false;
                                }
                            }
                            break;

                        case "Credito":
                            if (!ActualizaCxc(pago, consecutivo))
                            {
                                continuar = false;
                            }
                            break;

                        default:
                            break;
                        }
                        /// inserta en pagos documentos: hay que hacer la tabla
                        var newPago = new ControlEntity.Pago();
                        newPago.IdBanco             = pago.Banco;
                        newPago.Estado              = "Normal";
                        newPago.IdCaja              = curCaja;
                        newPago.ConsecutivoVentas   = consecutivo;
                        newPago.FormaPago           = pago.FormaPago;
                        newPago.IdLinea             = pago.Linea;
                        newPago.IdTarjeta           = pago.Tarjeta;
                        newPago.MontoAplicado       = pago.MontoAplicado;
                        newPago.MontoRecibido       = pago.MontoPagado;
                        newPago.NumeroChequeTarjeta = pago.Documento;
                        /// save
                        ventasB.SavePago(newPago);
                    }
                }
                if (!continuar)
                {
                    commB.Rollback();
                    return(0);
                }
                commB.Commit();
                return(venta.Consecutivo);
            }
            catch (Exception ex)
            {
                commB.Rollback();
                ControlBusiness.BusinessHelpers.General.DoError(ex, "Control", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
                return(0);
            }
        }
 private void okButton1_Click(object sender, EventArgs e)
 {
     if (!ValidaAjuste())
     {
         return;
     }
     try
     {
         bool continuar  = true;
         var  producto   = inventBL.GetProductoByCode(txtCodigoProducto.Text.Trim());
         var  existencia = inventBL.GetProductoExistencias(producto.IdProducto);
         if (producto != null)
         {
             var precioUnitario = 0m;
             genB.BeginTran();
             var montoAjuste = Convert.ToDecimal(txtMontoAjuste.Text) * (rdoDebito.Checked ? 1 : -1);
             if (existencia.CantidadTotal > 0)
             {
                 precioUnitario = ((producto.PrecioUnitario * existencia.CantidadTotal) + montoAjuste) / existencia.CantidadTotal;
                 if (precioUnitario < 0)
                 {
                     lblMensaje.Text = "El monto del ajuste es mayor al costo de todos los productos";
                     continuar       = false;
                 }
             }
             else
             {
                 if (montoAjuste > 0)
                 {
                     precioUnitario = montoAjuste;
                 }
                 else
                 {
                     lblMensaje.Text = "No se puede aplicar una nota de crédito a un producto sin existencia.";
                     continuar       = false;
                 }
             }
             if (continuar)
             {
                 producto.PrecioUnitario = precioUnitario;
                 genB.UpdateEntity <Producto>(producto);
                 genB.Commit();
                 SetForm();
                 MessageBox.Show("Proceso aplicado", "Control", MessageBoxButtons.OK, MessageBoxIcon.Information,
                                 MessageBoxDefaultButton.Button1);
             }
             else
             {
                 genB.Rollback();
             }
         }
         else
         {
             lblMensaje.Text = "No se puede aplicar una nota de crédito a un producto sin existencia.";
         }
     }
     catch (Exception ex)
     {
         ControlBusiness.BusinessHelpers.General.DoError(ex, "Control", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
     }
 }