/// <summary>
        /// Metodo que genera el pago adicional
        /// </summary>
        public void GenerarPagoAdicional()
        {
            try
            {
                string validacion = this.ValidarPagoAdicional();
                if (!String.IsNullOrEmpty(validacion))
                {
                    this.vista.MostrarMensaje("No se puede generar el pago Adicional: " + validacion, ETipoMensajeIU.INFORMACION);
                    return;
                }

                ContratoBO        contratoBo     = null;
                IGeneradorPagosBR generadorPagos = null;
                SeguridadBO       seguridadBo    = this.CrearObjetoSeguridad();
                List <ContratoBO> contratos      = new List <ContratoBO>();
                switch (vista.TipoContrato)
                {
                case ETipoContrato.RD:
                    contratoBo = new ContratoRDBO {
                        ContratoID = this.vista.ContratoID
                    };
                    var contratosRd = new ContratoRDBR().ConsultarCompleto(this.dctx, (ContratoRDBO)contratoBo, false);
                    contratos.AddRange(contratosRd);
                    generadorPagos = new GeneradorPagoRDBR();
                    break;

                case ETipoContrato.FSL:
                    contratoBo = new ContratoFSLBO {
                        ContratoID = this.vista.ContratoID
                    };
                    var contratosFsl = new ContratoFSLBR().ConsultarCompleto(this.dctx, (ContratoFSLBO)contratoBo);
                    contratos.AddRange(contratosFsl);
                    generadorPagos = new GeneradorPagosFSLBR();
                    break;

                case ETipoContrato.CM:
                case ETipoContrato.SD:
                    contratoBo = new ContratoManttoBO {
                        ContratoID = this.vista.ContratoID
                    };
                    var contratosMantto = new ContratoManttoBR().ConsultarCompleto(this.dctx, (ContratoManttoBO)contratoBo, true, false);
                    contratos.AddRange(contratosMantto);
                    generadorPagos = new GeneradorPagosManttoBR();
                    break;
                }
                if (generadorPagos == null)
                {
                    throw new Exception("No se pudo determinar el Tipo del Pago a Generar.");
                }

                generadorPagos.GenerarPagoAdicional(this.dctx, contratos.First(), (ultimoPagoContrato.NumeroPago.Value + 1), seguridadBo, false, true);
                PagoUnidadContratoBO pagoBo = new PagoUnidadContratoBOF {
                    ReferenciaContrato = new ReferenciaContratoBO()
                    {
                        ReferenciaContratoID = this.vista.ContratoID
                    }
                };
                PagoUnidadContratoBR pagoBr = new PagoUnidadContratoBR();
                var pagos = pagoBr.Consultar(this.dctx, (PagoUnidadContratoBO)pagoBo);

                this.Inicializar();

                this.vista.MostrarMensaje("El pago " + pagos.Last().NumeroPago.ToString() + " con Fecha " + pagos.Last().FechaVencimiento.Value.ToShortDateString() + " se ha Creado con Éxito.", ETipoMensajeIU.EXITO);
            }
            catch (Exception ex)
            {
                this.vista.MostrarMensaje("Error al generar el pago Adicional", ETipoMensajeIU.ERROR, NombreClase + ".GenerarPagoAdicional: " + ex.GetBaseException().Message);
            }
        }
        /// <summary>
        /// Realiza el Cierre del Contrato
        /// </summary>
        public void CerrarContrato()
        {
            int    numeroPago;
            string s;

            if ((s = ValidarCampos()) != null)
            {
                vista.MostrarMensaje(s, ETipoMensajeIU.ADVERTENCIA);
                return;
            }
            Guid firma = Guid.NewGuid();

            try
            {
                #region Transaccion

                dctx.SetCurrentProvider("Outsourcing");
                dctx.OpenConnection(firma);
                dctx.BeginTransaction(firma);

                #endregion

                //Se obtiene la información a partir de la Interfaz de Usuario
                var bo = (ContratoManttoBO)InterfazUsuarioADato();

                //Se crea el objeto de seguridad
                var usuario = new UsuarioBO {
                    Id = vista.UsuarioID
                };
                var adscripcion = new AdscripcionBO
                {
                    UnidadOperativa = new UnidadOperativaBO {
                        Id = vista.UnidadOperativaID
                    }
                };
                var  seguridadBO      = new SeguridadBO(Guid.Empty, usuario, adscripcion);
                bool cierreAnticipado = DateTime.Compare((DateTime)bo.CierreContrato.Fecha, (DateTime)bo.CalcularFechaTerminacionContrato()) < 0;

                #region SC0010

                var pagos = ObtenerPagosContrato(bo.ContratoID);
                numeroPago = (int)ObtenerUltimoNumeroPago(pagos);
                numeroPago = numeroPago + 1;
                if (cierreAnticipado)
                {
                    CancelarPagosPosteriores(pagos, bo.CierreContrato.Fecha, seguridadBO);
                }
                if (bo.Tipo == ETipoContrato.CM)
                {
                    generadorPagos.GenerarPagoAdicional(dctx, bo, numeroPago, seguridadBO, true, true);
                }

                #endregion

                //Se actualiza en la base de datos
                controlador.Terminar(dctx, bo, (ContratoManttoBO)vista.UltimoObjeto, seguridadBO,
                                     cierreAnticipado);

                //Se despliega la información en la Interfaz de Usuario
                DatoAInterfazUsuario(bo);
                vista.UltimoObjeto = bo;

                LimpiarSesion();
                vista.LimpiarPaqueteNavegacion("ContratoManttoBO");
                vista.EstablecerPaqueteNavegacion("ContratoManttoBO", new ContratoManttoBO {
                    ContratoID = vista.ContratoID
                });

                dctx.CommitTransaction(firma);

                vista.RedirigirADetalles();
            }
            catch (Exception ex)
            {
                dctx.RollbackTransaction(firma);
                throw new Exception(nombreClase + ".CerrarContrato:" + ex.Message);
            }
            finally
            {
                if (dctx.ConnectionState == ConnectionState.Open)
                {
                    dctx.CloseConnection(firma);
                }
            }
        }