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); } }