/// <summary>
        /// Calcula los pagos pendientes a partir de la nueva frecuencia
        /// </summary>
        /// <param name="frecuenciaNueva"></param>
        public void CalcularPagosPendientes(EFrecuencia?frecuenciaNueva)
        {
            if (!this.vista.ListaPagosFaltantes.Any())
            {
                this.vista.ListaPagosFaltantes = new List <PagoUnidadContratoRDBO>();
                this.vista.EstablecerPagosPendientes(this.vista.ListaPagosFaltantes);
                this.vista.CantidadPagosFaltantes = 0;
                return;
            }

            if (frecuenciaNueva == null)
            {
                frecuenciaNueva = this.vista.ContratoAntiguo.FrecuenciaFacturacion;
            }

            List <PagoUnidadContratoRDBO> listaPagosPendientes = new List <PagoUnidadContratoRDBO>();
            DateTime?fechaContrato = this.vista.ContratoOriginal.FechaContrato;
            DateTime?fechaPromesa  = this.vista.ContratoOriginal.FechaPromesaDevolucion;
            DateTime fechaHoy      = DateTime.Now;

            if (fechaContrato == fechaPromesa)
            {
                fechaPromesa = (DateTime?)fechaPromesa.Value.AddDays(1);
            }
            if (this.vista.DiasRestantes <= 0)
            {
                this.vista.ListaPagosFaltantes = listaPagosPendientes;
                this.vista.EstablecerPagosPendientes(listaPagosPendientes);
                this.vista.CantidadPagosFaltantes = 0;
                return;
            }

            if (this.vista.ListaPagosFacturados.Any())
            {
                var   ultimoPago    = this.vista.ListaPagosFacturados.Last();
                Int32 diasAAgregar  = 0;
                Int32 diasFaltantes = this.vista.DiasRestantes.Value;
                switch (frecuenciaNueva.Value)
                {
                case EFrecuencia.DIARIA:
                    diasAAgregar = 1;
                    break;

                case EFrecuencia.SEMANAL:
                    diasAAgregar = 7;
                    break;

                case EFrecuencia.QUINCENAL:
                    diasAAgregar = 15;
                    break;

                case EFrecuencia.MENSUAL:
                    diasAAgregar = 30;
                    break;
                }
                DateTime fechaVencimientoSiguiente = ultimoPago.FechaVencimiento.Value.AddDays((Double)ultimoPago.DiasFacturar.Value);
                while (diasFaltantes > 0)
                {
                    var pagoNuevo = new PagoUnidadContratoRDBO()
                    {
                        ReferenciaContrato = new ReferenciaContratoBO(ultimoPago.ReferenciaContrato),
                        NumeroPago         = listaPagosPendientes.Any() ? (short)(listaPagosPendientes.Last().NumeroPago + 1) : (short)(ultimoPago.NumeroPago + 1),
                        Origen             = EOrigenPago.SISTEMA,
                        TipoPago           = ETipoPago.NORMAL,
                        FechaVencimiento   = listaPagosPendientes.Any() ? listaPagosPendientes.Last().FechaVencimiento.Value.AddDays(diasAAgregar) : fechaVencimientoSiguiente,
                        DiasFacturar       = (diasFaltantes - diasAAgregar) > 0 ? diasAAgregar : diasFaltantes
                    };

                    diasFaltantes = (diasFaltantes - diasAAgregar);
                    listaPagosPendientes.Add(pagoNuevo);
                }
            }

            this.vista.ListaPagosFaltantes = listaPagosPendientes;
            this.vista.EstablecerPagosPendientes(listaPagosPendientes);
            this.vista.CantidadPagosFaltantes = listaPagosPendientes.Count;
        }
        /// <summary>
        /// Decide que controlador usar para consultar pagos
        /// </summary>
        private List <PagoUnidadContratoBO> ConsultarPagos(Int32?pagoId, Int32?referenciaContratoId, Int32?unidadId, ETipoContrato?tipoContrato, Boolean esCompleto)
        {
            var listaPagos = new List <PagoUnidadContratoBO>();
            PagoUnidadContratoBR pagoBr = null;
            PagoUnidadContratoBO pago   = new PagoUnidadContratoBOF();

            switch (tipoContrato)
            {
            case ETipoContrato.FSL:
                pagoBr = new PagoUnidadContratoFSLBR();
                pago   = new PagoUnidadContratoFSLBO()
                {
                    Tarifa = new TarifaPagoEquipoBO()
                };
                break;

            case ETipoContrato.RD:
                pagoBr = new PagoUnidadContratoRDBR();
                pago   = new PagoUnidadContratoRDBO()
                {
                    Tarifa = new TarifaPagoEquipoBO()
                };
                break;

            case ETipoContrato.CM:
            case ETipoContrato.SD:
                pagoBr = new PagoUnidadContratoBR();
                pago   = new PagoUnidadContratoManttoBO(tipoContrato.Value)
                {
                    Tarifa = new TarifaPagoEquipoBO()
                };
                break;
            }

            if (pagoId != null)
            {
                pago.PagoID = pagoId;
            }
            if (referenciaContratoId != null)
            {
                pago.ReferenciaContrato = new ReferenciaContratoBO()
                {
                    ReferenciaContratoID = referenciaContratoId
                }
            }
            ;
            if (unidadId != null)
            {
                pago.Unidad = new UnidadBO()
                {
                    UnidadID = unidadId
                }
            }
            ;

            switch (tipoContrato)
            {
            case ETipoContrato.FSL:
                listaPagos.AddRange(esCompleto ? ((PagoUnidadContratoFSLBR)pagoBr).ConsultarCompleto(this.dataContext, (PagoUnidadContratoFSLBO)pago, true) : ((PagoUnidadContratoFSLBR)pagoBr).Consultar(this.dataContext, (PagoUnidadContratoFSLBO)pago));
                break;

            case ETipoContrato.RD:
                listaPagos.AddRange(esCompleto ? ((PagoUnidadContratoRDBR)pagoBr).ConsultarCompleto(this.dataContext, (PagoUnidadContratoRDBO)pago) : ((PagoUnidadContratoRDBR)pagoBr).Consultar(this.dataContext, (PagoUnidadContratoRDBO)pago));
                break;

            case ETipoContrato.CM:
            case ETipoContrato.SD:
                listaPagos.AddRange(esCompleto ? pagoBr.ConsultarCompleto(this.dataContext, pago) : pagoBr.Consultar(this.dataContext, pago));
                break;
            }

            return(listaPagos);
        }