/* * public static ResAcc<int> GenerarNotaDeCredito(int iClienteID, decimal mImporte, string sObservacion) * { * return VentasProc.GenerarNotaDeCredito(iClienteID, mImporte, sObservacion, null); * } * * public static ResAcc<int> GenerarNotaDeCredito(int iClienteID, decimal mImporte, string sObservacion, int? iOrigenVentaID) * { * DateTime dAhora = DateTime.Now; * * // Se revisa si existen otras notas de crédito que se puedan usar para afectar ésta * bool bNegativa = (mImporte < 0); * var oNotas = General.GetListOf<NotaDeCredito>(q => q.ClienteID == iClienteID && q.Valida && q.Estatus).OrderByDescending(q => q.FechaDeEmision); * foreach (var oNota in oNotas) * { * if ((bNegativa && oNota.Importe < 0) || (!bNegativa && oNota.Importe > 0)) * continue; * * mImporte += oNota.Importe; * * if ((bNegativa && mImporte <= 0) || (!bNegativa && mImporte >= 0)) * // * { * oNota.Valida = false; * oNota.FechaDeUso = dAhora; * oNota.Observacion += ("\n\n" + DateTime.Now.ToString() + "Nota cancelada por ser descontada al agregar otra nota con un importe mayor."); * Datos.Guardar<NotaDeCredito>(oNota); * // Se debe imprimir algo aquí ? * * // Si ya se emparejó la cantidad, se sale * if (mImporte == 0) * return new ResAcc<int>(true, ""); * } * else * // * { * oNota.Importe += (mImporte * -1); * Datos.Guardar<NotaDeCredito>(oNota); * // Se debe imprimir algo aquí ? * * // Se sale, pues ya no hay importe para afectar * return new ResAcc<int>(true, ""); * } * } * * // Se crea la nota * var oNotaNueva = new NotaDeCredito() * { * FechaDeEmision = DateTime.Now, * Importe = mImporte, * ClienteID = iClienteID, * Valida = true, * Observacion = sObservacion, * OrigenVentaID = iOrigenVentaID * }; * Datos.Guardar<NotaDeCredito>(oNotaNueva); * * // Se imprime el ticket correspondiente * * * return new ResAcc<int>(true, oNotaNueva.NotaDeCreditoID); * } */ #region [ Vales ] public static ResAcc <int> GenerarNotaDeCredito(int iClienteID, decimal mImporte, string sObservacion, int iOrigenID, int iRelacionID) { DateTime dAhora = DateTime.Now; // Se revisa si existen otras notas de crédito que se puedan usar para afectar ésta bool bNegativa = (mImporte < 0); var oNotas = Datos.GetListOf <NotaDeCredito>(q => q.ClienteID == iClienteID && q.Valida && q.Estatus).OrderByDescending(q => q.FechaDeEmision); foreach (var oNota in oNotas) { if ((bNegativa && oNota.Importe < 0) || (!bNegativa && oNota.Importe > 0)) { continue; } mImporte += oNota.Importe; if ((bNegativa && mImporte <= 0) || (!bNegativa && mImporte >= 0)) // { oNota.Valida = false; oNota.FechaDeUso = dAhora; oNota.Observacion += ("\n\n" + DateTime.Now.ToString() + "Nota cancelada por ser descontada al agregar otra nota con un importe mayor."); Datos.Guardar <NotaDeCredito>(oNota); // Se debe imprimir algo aquí ? // Si ya se emparejó la cantidad, se sale if (mImporte == 0) { return(new ResAcc <int>(true, "")); } } else // { oNota.Importe += (mImporte * -1); Datos.Guardar <NotaDeCredito>(oNota); // Se debe imprimir algo aquí ? // Se sale, pues ya no hay importe para afectar return(new ResAcc <int>(true, "")); } } // Se crea la nota var oNotaNueva = new NotaDeCredito() { FechaDeEmision = DateTime.Now, SucursalID = Theos.SucursalID, Importe = mImporte, ClienteID = iClienteID, Valida = true, Observacion = sObservacion, OrigenID = iOrigenID, RelacionID = iRelacionID }; Datos.Guardar <NotaDeCredito>(oNotaNueva); // Se imprime el ticket correspondiente return(new ResAcc <int>(true, oNotaNueva.NotaDeCreditoID)); }
public static ResAcc RecibirConteoInventario(int iUsuarioID, List <modConteoInventario> oConteo) { // Se obtiene la sucursal correspondiente a los conteos, pues debe ser la misma para todos if (oConteo.Count <= 0) { return(new ResAcc()); } int iPrimerInvID = oConteo[0].InventarioLineaID; var oPrimerInv = Datos.GetEntity <InventarioLinea>(c => c.InventarioLineaID == iPrimerInvID); int iSucursalID = oPrimerInv.SucursalID; // Se registra lo del conteo oConteo = oConteo.OrderBy(c => c.InventarioLineaID).ToList(); int iInventarioLineaID = 0; List <InventarioLinea> oInvConteos = new List <InventarioLinea>(); InventarioLinea oInventarioLinea = null; List <InventarioConteo> oDiferencias1 = new List <InventarioConteo>(); List <InventarioConteo> oDiferencias2 = new List <InventarioConteo>(); List <InventarioConteo> oDiferencias3 = new List <InventarioConteo>(); foreach (var oReg in oConteo) { if (oReg.InventarioLineaID != iInventarioLineaID) { oInventarioLinea = Datos.GetEntity <InventarioLinea>(c => c.InventarioLineaID == oReg.InventarioLineaID); oInvConteos.Add(oInventarioLinea); iInventarioLineaID = oReg.InventarioLineaID; } // Se obtiene el conteo y la existencia, para saber si hay diferencia var oParteConteo = Datos.GetEntity <InventarioConteo>(c => c.InventarioConteoID == oReg.InventarioConteoID); var oExistencia = Datos.GetEntity <ParteExistencia>(c => c.ParteID == oParteConteo.ParteID && c.SucursalID == oInventarioLinea.SucursalID && c.Estatus); decimal mDiferencia = (oReg.Conteo - oExistencia.Existencia.Valor()); // Se evalua la diferencia oParteConteo.Valido = true; switch (oParteConteo.Revision) { case null: case Cat.InventarioConteosRevisiones.SinRevision: if (mDiferencia != 0) { if (oInventarioLinea.LineaID.HasValue) { oDiferencias1.Add(oParteConteo); } else { // Es por devolución o cancelación del día anterior oDiferencias2.Add(oParteConteo); } oParteConteo.Valido = false; } break; case Cat.InventarioConteosRevisiones.Confirmacion: var oParteConteoAnt = Datos.GetEntity <InventarioConteo>(c => c.InventarioLineaID == oParteConteo.InventarioLineaID && !c.Revision.HasValue); if (oParteConteoAnt.Diferencia == mDiferencia) { oDiferencias3.Add(oParteConteo); } else { oDiferencias2.Add(oParteConteo); oParteConteo.Valido = false; } break; case Cat.InventarioConteosRevisiones.ConfirmacionGerente: if (oInventarioLinea.LineaID.HasValue) { if (mDiferencia != 0) { oDiferencias3.Add(oParteConteo); } } break; } // Se guarda la diferencia oParteConteo.RealizoUsuarioID = iUsuarioID; oParteConteo.Diferencia = mDiferencia; Datos.Guardar <InventarioConteo>(oParteConteo); } // Se obtienen los usuarios para inventario de todas las sucursales var oUsuariosInv = Datos.GetListOf <InventarioUsuario>(); // Se obtienen los usuarios para inventario de la sucursal var oUsuariosSuc = oUsuariosInv.Where(c => c.SucursalID == iSucursalID).ToList(); int iCantidadPorUsuario = (oDiferencias1.Count / oUsuariosSuc.Count); // Se agregan los conteos para revisión 1 (de confirmación) int iUsuario = 0, iCantidad = 0; foreach (var oReg in oDiferencias1) { var oNuevoConteo = new InventarioConteo() { InventarioLineaID = oReg.InventarioLineaID, Dia = DateTime.Now.AddDays(1), ConteoUsuarioID = oUsuariosSuc[iUsuario].InvUsuarioID, ParteID = oReg.ParteID, Revision = Cat.InventarioConteosRevisiones.Confirmacion }; Datos.Guardar <InventarioConteo>(oNuevoConteo); if (++iCantidad >= iCantidadPorUsuario) { if (++iUsuario >= oUsuariosSuc.Count) { iUsuario = 0; } } } // Se agregan los conteos para revisión 2 (confirmación del gerente) var oSucursal = Datos.GetEntity <Sucursal>(c => c.SucursalID == iSucursalID && c.Estatus); int iGerenteID = oSucursal.GerenteID; foreach (var oReg in oDiferencias2) { var oNuevoConteo = new InventarioConteo() { InventarioLineaID = oReg.InventarioLineaID, Dia = DateTime.Now, ConteoUsuarioID = iGerenteID, ParteID = oReg.ParteID, Revision = Cat.InventarioConteosRevisiones.ConfirmacionGerente }; Datos.Guardar <InventarioConteo>(oNuevoConteo); } // Se agregan los conteos para revisión 3 (otras sucursales si la existencia es 0) var oIndiceUsuarioSucursal = new Dictionary <int, int>(); var oInvAbiertos = new List <int>(); // Para marcar como incompletos los inventarios que se "abran" por meter un nuevo conteo tipo 3 foreach (var oReg in oDiferencias3) { // Se valida si la existencia en otras sucursales es cero var oExistencias = Datos.GetListOf <ParteExistencia>(c => c.ParteID == oReg.ParteID && c.SucursalID != iSucursalID); foreach (var oExist in oExistencias) { if (oExist.Existencia == 0) { // Para determinar el usuario al cual asignar oUsuariosSuc = oUsuariosInv.Where(c => c.SucursalID == oExist.SucursalID).ToList(); if (!oIndiceUsuarioSucursal.ContainsKey(oExist.SucursalID)) { oIndiceUsuarioSucursal.Add(oExist.SucursalID, 0); } var oNuevoConteo = new InventarioConteo() { InventarioLineaID = oReg.InventarioLineaID, Dia = DateTime.Now.AddDays(1), ConteoUsuarioID = oUsuariosSuc[oIndiceUsuarioSucursal[oExist.SucursalID]].InvUsuarioID, ParteID = oReg.ParteID, Revision = Cat.InventarioConteosRevisiones.OtraSucursal }; Datos.Guardar <InventarioConteo>(oNuevoConteo); // if (!oInvAbiertos.Contains(oReg.InventarioLineaID)) { oInvAbiertos.Add(oReg.InventarioLineaID); } // if (++oIndiceUsuarioSucursal[oExist.SucursalID] >= oUsuariosSuc.Count) { oIndiceUsuarioSucursal[oExist.SucursalID] = 0; } } } } // Se marcan como incompletos los inventarios abiertos por este proceso foreach (int iInvID in oInvAbiertos) { var oInv = Datos.GetEntity <InventarioLinea>(c => c.InventarioLineaID == iInvID); oInv.EstatusGenericoID = Cat.EstatusGenericos.EnRevision; oInv.FechaCompletado = null; Datos.Guardar <InventarioLinea>(oInv); } // Se marcan como completado los inventarios ya concluidos, si hubiera foreach (var oReg in oInvConteos) { var oInvConteoV = Datos.GetEntity <InventarioLineasConteosView>(c => c.InventarioLineaID == oReg.InventarioLineaID); // Se valida si ya se completó el conteo if (oInvConteoV.PartesLinea > oInvConteoV.Conteo) { continue; } else { oReg.EstatusGenericoID = Cat.EstatusGenericos.Completada; oReg.FechaCompletado = DateTime.Now; } Datos.Guardar <InventarioLinea>(oReg); } return(new ResAcc()); }
public static ResAcc VentaDevolucion(VentaDevolucion oDevolucion, List <VentaDevolucionDetalle> oDetalle) { // Se generan datos predeterminados o globales, en caso de que apliquen oDevolucion.Fecha = (oDevolucion.Fecha != DateTime.MinValue ? oDevolucion.Fecha : DateTime.Now); oDevolucion.SucursalID = (oDevolucion.SucursalID > 0 ? oDevolucion.SucursalID : Theos.SucursalID); // Se guarda la devolución Datos.Guardar <VentaDevolucion>(oDevolucion); // Se guarda el detalle VentaDetalle oParteVenta; foreach (var ParteDetalle in oDetalle) { ParteDetalle.VentaDevolucionID = oDevolucion.VentaDevolucionID; Datos.Guardar <VentaDevolucionDetalle>(ParteDetalle); // Se quita el producto de la venta oParteVenta = Datos.GetEntity <VentaDetalle>(q => q.Estatus && q.VentaID == oDevolucion.VentaID && q.ParteID == ParteDetalle.ParteID && q.Cantidad == ParteDetalle.Cantidad && q.PrecioUnitario == ParteDetalle.PrecioUnitario && q.Iva == ParteDetalle.Iva); oParteVenta.Estatus = false; Datos.Guardar <VentaDetalle>(oParteVenta, false); // Se afecta la existencia // AdmonProc.AgregarExistencia(ParteDetalle.ParteID, GlobalClass.SucursalID, ParteDetalle.Cantidad, Cat.Tablas.VentaDevolucion, oDevolucion.VentaDevolucionID); var oDevV = Datos.GetEntity <VentasDevolucionesView>(c => c.VentaDevolucionID == oDevolucion.VentaDevolucionID); AdmonProc.AfectarExistenciaYKardex(ParteDetalle.ParteID, Theos.SucursalID, Cat.OperacionesKardex.VentaCancelada, oDevV.FolioDeVenta , oDevV.RealizoUsuarioID, oDevV.Cliente, oDevV.ClienteID.ToString(), oDevV.Sucursal, ParteDetalle.Cantidad , (ParteDetalle.PrecioUnitario + ParteDetalle.Iva), Cat.Tablas.VentaDevolucion, oDevolucion.VentaDevolucionID); } // Si es cancelación, se cambia el estatus de la venta var oVenta = Datos.GetEntity <Venta>(c => c.VentaID == oDevolucion.VentaID && c.Estatus); if (oDevolucion.EsCancelacion) { // Se verifica si la venta ha tenido pagos var oVentaV = Datos.GetEntity <VentasView>(c => c.VentaID == oDevolucion.VentaID); oVenta.VentaEstatusID = (oVentaV.Pagado > 0 ? Cat.VentasEstatus.Cancelada : Cat.VentasEstatus.CanceladaSinPago); Datos.Guardar <Venta>(oVenta); } // Se verifican notas de crédito que pudieran cancelarse, por cliente comisionista if (oVenta.ComisionistaClienteID > 0) { // Se calcula el importe de la comisión que se debe quitar var oComisionista = Datos.GetEntity <Cliente>(q => q.ClienteID == oVenta.ComisionistaClienteID && q.Estatus); decimal mComision = 0; PreciosParte oPrecios; foreach (var ParteD in oDetalle) { oPrecios = new PreciosParte(ParteD.ParteID); mComision += (((ParteD.PrecioUnitario + ParteD.Iva) - oPrecios.ObtenerPrecio(oComisionista.ListaDePrecios)) * ParteD.Cantidad); } // Se genera una nota de crédito negativa if (mComision > 0) { VentasProc.GenerarNotaDeCredito(oComisionista.ClienteID, (mComision * -1), "", Cat.OrigenesNotaDeCredito.Devolucion, oVenta.VentaID); } } return(new ResAcc(true)); }
public static ResAcc RecibirTraspaso(int iUsuarioID, string sMotivo, List <modDetalleTraspaso> oDetalle, bool bValidarContingencia) { if (oDetalle.Count <= 0) { return(new ResAcc("No hay nada que recibir.")); } // Validar que lo recibido sea menor o igual que lo enviado foreach (var oReg in oDetalle) { if (oReg.Recibido > oReg.Cantidad) { return(new ResAcc("Existen uno o más artículos que tienen una cantidad recibida mayor a lo enviado.")); } } // Se verifica si existe alguna contingencia bool bExisteContingencia = false; foreach (var oReg in oDetalle) { if (oReg.Recibido < oReg.Cantidad) { bExisteContingencia = true; break; } } if (bExisteContingencia && bValidarContingencia) { return(new ResAcc("El traspaso tiene uno o más conflictos.", Cat.CodigosRes.ConflictoEnTraspasos)); } // Se valida el motivo, en caso de que haya habido contingencia if (bExisteContingencia && string.IsNullOrEmpty(sMotivo)) { return(new ResAcc("Debes especificar un motivo.")); } // Se obtiene el MovimientoInventario correspondiente al traspaso int iRecibirUnoID = oDetalle[0].MovimientoInventarioDetalleID; var oRecibirUno = Datos.GetEntity <MovimientoInventarioDetalle>(c => c.MovimientoInventarioDetalleID == iRecibirUnoID && c.Estatus); int iMovID = oRecibirUno.MovimientoInventarioID; var oTraspasoV = Datos.GetEntity <MovimientoInventarioView>(c => c.MovimientoInventarioID == iMovID); int iSucursalID = oTraspasoV.SucursalDestinoID.Valor(); // decimal mCostoTotal = 0; foreach (var oReg in oDetalle) { // Si la cantidad recibida es menor a lo enviado, almacenar la contingencia if (oReg.Recibido < oReg.Cantidad) { var contingencia = new MovimientoInventarioTraspasoContingencia() { MovimientoInventarioID = iMovID, MovimientoInventarioDetalleID = oReg.MovimientoInventarioDetalleID, ParteID = oReg.ParteID, CantidadEnviada = oReg.Cantidad, CantidadRecibida = oReg.Recibido, CantidadDiferencia = (oReg.Cantidad - oReg.Recibido), Comentario = sMotivo, UsuarioID = iUsuarioID, MovimientoInventarioEstatusContingenciaID = Cat.TraspasosContingenciasEstatus.NoSolucionado }; Datos.Guardar <MovimientoInventarioTraspasoContingencia>(contingencia); } //Aumentar la existencia actual de la sucursal destino var oParte = Datos.GetEntity <Parte>(c => c.ParteID == oReg.ParteID && c.Estatus); if (!oParte.EsServicio.Valor()) { var existencia = Datos.GetEntity <ParteExistencia>(p => p.ParteID == oReg.ParteID && p.SucursalID == iSucursalID); if (existencia != null) { var inicial = existencia.Existencia; existencia.Existencia += oReg.Recibido; existencia.UsuarioID = iUsuarioID; existencia.FechaModificacion = DateTime.Now; Datos.Guardar <ParteExistencia>(existencia); var historial = new MovimientoInventarioHistorial() { MovmientoInventarioID = iMovID, ParteID = oReg.ParteID, ExistenciaInicial = Util.Decimal(inicial), ExistenciaFinal = Util.Decimal(existencia.Existencia), SucursalID = iSucursalID, UsuarioID = iUsuarioID }; Datos.Guardar <MovimientoInventarioHistorial>(historial); } } // Se agrega al Kardex var oPartePrecio = Datos.GetEntity <PartePrecio>(c => c.ParteID == oReg.ParteID && c.Estatus); AdmonProc.RegistrarKardex(new ParteKardex() { ParteID = oReg.ParteID, OperacionID = Cat.OperacionesKardex.EntradaTraspaso, SucursalID = iSucursalID, Folio = iMovID.ToString(), Fecha = DateTime.Now, RealizoUsuarioID = iUsuarioID, Entidad = Util.Cadena(oTraspasoV.NombreProveedor), Origen = oTraspasoV.SucursalOrigen, Destino = oTraspasoV.SucursalDestino, Cantidad = oReg.Recibido, Importe = oPartePrecio.Costo.Valor() }); // Se suma el importe de cada parte, para crear la póliza mCostoTotal += oPartePrecio.Costo.Valor(); } // Se genera la póliza especial correspondiente (AfeConta) var oUsuario = Datos.GetEntity <Usuario>(c => c.UsuarioID == iUsuarioID && c.Estatus); var oPoliza = ContaProc.CrearPoliza(Cat.ContaTiposDePoliza.Diario, string.Format("TRASPASO ORIGEN {0:00} DESTINO {1:00}" , oTraspasoV.SucursalOrigenID, oTraspasoV.SucursalDestinoID), Cat.ContaCuentasAuxiliares.Inventario, 0, mCostoTotal , oUsuario.NombreUsuario, Cat.Tablas.MovimientoInventario, iMovID, iSucursalID); //Actualizar el movimiento con los datos (fecha y usuario que recibio) var movimiento = Datos.GetEntity <MovimientoInventario>(m => m.MovimientoInventarioID == iMovID); if (null != movimiento) { movimiento.ExisteContingencia = bExisteContingencia; movimiento.UsuarioRecibioTraspasoID = iUsuarioID; movimiento.FechaRecepcion = DateTime.Now; movimiento.FechaModificacion = DateTime.Now; Datos.Guardar <MovimientoInventario>(movimiento); } return(new ResAcc()); }
public static ResAcc VentaPago(VentaPago oPago, List <VentaPagoDetalle> Detalle) { // Se generan datos predeterminados o globales, en caso de que apliquen oPago.Fecha = (oPago.Fecha != DateTime.MinValue ? oPago.Fecha : DateTime.Now); oPago.SucursalID = (oPago.SucursalID > 0 ? oPago.SucursalID : Theos.SucursalID); // Se guarda el pago Datos.Guardar <VentaPago>(oPago); // Se guarda el detalle var oVentaV = Datos.GetEntity <VentasView>(q => q.VentaID == oPago.VentaID); foreach (var PartePago in Detalle) { PartePago.VentaPagoID = oPago.VentaPagoID; Datos.Guardar <VentaPagoDetalle>(PartePago); // Se afectan las notas de crédito, si hay alguna if (PartePago.TipoFormaPagoID == Cat.FormasDePago.Vale && PartePago.Importe > 0) { int iNotaID = PartePago.NotaDeCreditoID.Valor(); var oNota = Datos.GetEntity <NotaDeCredito>(q => q.NotaDeCreditoID == iNotaID && q.Estatus); if (oNota != null) { // Se verifica si se usó el importe total o sólo una parte if (PartePago.Importe < oNota.Importe) { // Se crea una nueva nota, con el importe restante // 25/11/2015 - Se busca el vale original para usarlo como origen de todas las notas derivadas, en vez de el OrigenVentaID que se mandaba antes int iOrigenValeID = (oNota.OrigenID == Cat.OrigenesNotaDeCredito.ImporteRestante ? oNota.RelacionID.Valor() : oNota.NotaDeCreditoID); VentasProc.GenerarNotaDeCredito(oNota.ClienteID, (oNota.Importe - PartePago.Importe), "", Cat.OrigenesNotaDeCredito.ImporteRestante , iOrigenValeID); // oNota.Importe = PartePago.Importe; } // oNota.Valida = false; oNota.FechaDeUso = DateTime.Now; oNota.UsoVentaID = oPago.VentaID; Datos.Guardar <NotaDeCredito>(oNota); } } // Si es un pago bancario, se genera el movimiento correspondiente if (PartePago.TipoFormaPagoID == Cat.FormasDePago.Tarjeta || PartePago.TipoFormaPagoID == Cat.FormasDePago.TarjetaDeDebito || PartePago.TipoFormaPagoID == Cat.FormasDePago.Transferencia || PartePago.TipoFormaPagoID == Cat.FormasDePago.Cheque) { var oBanco = Datos.GetEntity <Banco>(c => c.BancoID == PartePago.BancoID && c.Estatus); var oMovBanc = new BancoCuentaMovimiento() { // BancoCuentaID = (PartePago.TipoFormaPagoID == Cat.FormasDePago.Tarjeta ? (int?)Cat.CuentasBancarias.Banamex : null), EsIngreso = true, Fecha = oPago.Fecha, FechaAsignado = ((PartePago.TipoFormaPagoID == Cat.FormasDePago.Tarjeta || PartePago.TipoFormaPagoID == Cat.FormasDePago.TarjetaDeDebito) ? (DateTime?)oPago.Fecha : null), SucursalID = oPago.SucursalID, Importe = PartePago.Importe, Concepto = oVentaV.Cliente, Referencia = oVentaV.Folio, TipoFormaPagoID = PartePago.TipoFormaPagoID, DatosDePago = string.Format("{0}-{1}-{2}", oBanco.NombreBanco, PartePago.Folio, PartePago.Cuenta), RelacionTabla = Cat.Tablas.VentaPagoDetalle, RelacionID = PartePago.VentaPagoDetalleID, }; ContaProc.RegistrarMovimientoBancario(oMovBanc); } } // Se verifica el estatus de la venta, por si debe cambiar según el pago if (oVentaV.VentaEstatusID == Cat.VentasEstatus.Cobrada) { // Se obtiene el total de los pagos decimal mPagado = Datos.GetListOf <VentasPagosView>(q => q.VentaID == oVentaV.VentaID).Sum(q => q.Importe); if (mPagado >= oVentaV.Total) { var oVenta = Datos.GetEntity <Venta>(q => q.Estatus && q.VentaID == oPago.VentaID); oVenta.VentaEstatusID = Cat.VentasEstatus.Completada; // Se guarda con el nuevo estatus Datos.Guardar <Venta>(oVenta); } } return(new ResAcc(true)); }