public static void Completar9500(Cotizacion9500 o9500, decimal mSobrante, bool bDevolverEfectivo) { // Se cancela la venta del anticipo var oVentaAnt = Datos.GetEntity <Venta>(q => q.VentaID == o9500.AnticipoVentaID && q.VentaEstatusID != Cat.VentasEstatus.Cancelada && q.VentaEstatusID != Cat.VentasEstatus.CanceladaSinPago && q.Estatus); if (oVentaAnt != null) { oVentaAnt.VentaEstatusID = Cat.VentasEstatus.Cancelada; Datos.Guardar <Venta>(oVentaAnt); // Se genera una devolución de efectivo (si se realizó un pago) de la venta cancelada, pues se generará una nueva venta con el importe total if (Datos.Exists <VentaPago>(q => q.VentaID == o9500.AnticipoVentaID && q.Estatus)) { VentasProc.GenerarDevolucionDeEfectivo(o9500.AnticipoVentaID.Valor(), o9500.Anticipo - (mSobrante > 0 ? mSobrante : 0)); } } // Si hubo un sobrante, se genera nota de crédito o se devuelve efectivo if (mSobrante > 0) { if (bDevolverEfectivo) { VentasProc.GenerarDevolucionDeEfectivo(oVentaAnt.VentaID, mSobrante); } else { VentasProc.GenerarNotaDeCredito(o9500.ClienteID, mSobrante, "", Cat.OrigenesNotaDeCredito.Anticipo9500, oVentaAnt.VentaID); } } // Se modifica el Estatus del 9500 o9500.EstatusGenericoID = Cat.EstatusGenericos.Completada; Datos.Guardar <Cotizacion9500>(o9500); }
public static ResAcc Venta(Venta oVenta, List <VentaDetalle> Detalle) { bool bMod = (oVenta.VentaID > 0); if (bMod) { throw new Exception("No se ha programado funcionalidad para cuando la Venta ya exista."); } // Se generan datos predeterminados o globales, en caso de que apliquen oVenta.Fecha = (oVenta.Fecha != DateTime.MinValue ? oVenta.Fecha : DateTime.Now); oVenta.VentaEstatusID = (oVenta.VentaEstatusID > 0 ? oVenta.VentaEstatusID : Cat.VentasEstatus.Realizada); oVenta.RealizoUsuarioID = (oVenta.RealizoUsuarioID > 0 ? oVenta.RealizoUsuarioID : Theos.UsuarioID); oVenta.SucursalID = (oVenta.SucursalID > 0 ? oVenta.SucursalID : Theos.SucursalID); oVenta.ComisionistaClienteID = (oVenta.ComisionistaClienteID > 0 ? oVenta.ComisionistaClienteID : null); oVenta.ClienteVehiculoID = (oVenta.ClienteVehiculoID > 0 ? oVenta.ClienteVehiculoID : null); // Se obtiene el folio correspondiente /* string sFolio = Config.Valor("Ventas.Folio"); * Config.EstablecerValor("Ventas.Folio", (Util.ConvertirEntero(sFolio) + 1).ToString().PadLeft(7, '0')); * oVenta.Folio = sFolio; */ // Se guarda la venta Datos.Guardar <Venta>(oVenta); // Se guarda el detalle foreach (var ParteDetalle in Detalle) { if (ParteDetalle.VentaDetalleID > 0) { continue; // No es una venta nueva, no se ha especificado que hacer en estos casos } ParteDetalle.VentaID = oVenta.VentaID; Datos.Guardar <VentaDetalle>(ParteDetalle); // Se afecta la existencia // AdmonProc.AgregarExistencia(ParteDetalle.ParteID, oVenta.SucursalID, (ParteDetalle.Cantidad * -1), Cat.Tablas.Venta, oVenta.VentaID); // Se meten datos a kardex que se actualizarán posteriormente, al cobrar la venta AdmonProc.AfectarExistenciaYKardex(ParteDetalle.ParteID, oVenta.SucursalID, Cat.OperacionesKardex.Venta, null, oVenta.RealizoUsuarioID, "", "", "" , (ParteDetalle.Cantidad * -1), 0, Cat.Tablas.Venta, oVenta.VentaID); } // Se generar datos relevantes al cliente comisionista, si hubiera if (oVenta.ComisionistaClienteID.Valor() > 0) { // Se calcula el importe de la comisión decimal mComision = UtilDatos.VentaComisionCliente(oVenta.VentaID, oVenta.ComisionistaClienteID.Valor()); // Se genera una nota de crédito, por la comisión if (mComision > 0) { VentasProc.GenerarNotaDeCredito(oVenta.ComisionistaClienteID.Valor(), mComision, "", Cat.OrigenesNotaDeCredito.Comision, oVenta.VentaID); } } return(new ResAcc(true)); }
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 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)); }