예제 #1
0
        /*
         * 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));
        }
예제 #2
0
        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());
        }
예제 #3
0
파일: Guardar.cs 프로젝트: moisesiq/aupaga
        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));
        }
예제 #4
0
        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());
        }
예제 #5
0
파일: Guardar.cs 프로젝트: moisesiq/aupaga
        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));
        }