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