/// <summary>
 /// Cancela los pagos restantes de un contrato
 /// </summary>
 /// <param name="pagosList">Listado de Pagos</param>
 /// <param name="fechaCierre">Fecha de Cierre del Contrato</param>
 /// <param name="seguridadBo">Seguridad del Usuario Actual</param>
 private void CancelarPagosPosteriores(List <PagoUnidadContratoManttoBO> pagosList, DateTime?fechaCierre, SeguridadBO seguridadBo)
 {
     foreach (var pago in pagosList)
     {
         if (pago.FechaVencimiento >= fechaCierre && pago.EnviadoFacturacion == false)
         {
             var anterior = new PagoUnidadContratoManttoBO(pago);
             pago.Activo        = false;
             anterior.Auditoria = new AuditoriaBO
             {
                 FC  = pago.Auditoria.FC,
                 UC  = pago.Auditoria.UC,
                 FUA = pago.Auditoria.FUA,
                 UUA = pago.Auditoria.UUA
             };
             pagoCtrl.Actualizar(dctx, pago, anterior, seguridadBo);
         }
     }
 }
        /// <summary>
        /// Actualiza el cierre de un contrato Full Service Leasing
        /// </summary>
        public void CerrarContrato()
        {
            Guid firma = Guid.NewGuid();

            try
            {
                string resultado = finalizacionPRE.ValidarDatosCierre();
                if (!string.IsNullOrEmpty(resultado))
                {
                    vista.MostrarMensaje(resultado, ETipoMensajeIU.INFORMACION);
                    return;
                }
            }
            catch (Exception ex)
            {
                throw new Exception(nombreClase + ".CerrarContrato:" + ex.Message);
            }
            try
            {
                #region Transaccion

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

                #endregion

                ContratoFSLBO anterior = vista.UltimoObjeto;
                ContratoFSLBO actual   = InterfazUsuarioADatos();
                actual.FC      = anterior.FC;
                actual.UC      = anterior.UC;
                actual.Estatus = EEstatusContrato.EnCurso;
                var contratoBR = new ContratoFSLBR();

                var seguridadBO = new SeguridadBO(Guid.Empty, new UsuarioBO {
                    Id = vista.UsuarioID
                }, new AdscripcionBO
                {
                    Departamento    = new DepartamentoBO(),
                    Sucursal        = new SucursalBO(),
                    UnidadOperativa = new UnidadOperativaBO {
                        Id = vista.UnidadAdscripcionID
                    }
                });

                // Determinar si es Cierre anticipado
                bool cierreAnticipado = actual.CierreAnticipado();

                // Terminar el Contrato
                contratoBR.Terminar(dataContext, actual, anterior, seguridadBO, cierreAnticipado);


                if (cierreAnticipado)
                {
                    // Cancelar los pagos restantes
                    var pagosFaltantes = ObtenerPagos(anterior, (DateTime)actual.CierreContrato.Fecha);
                    var pagoBR         = new PagoUnidadContratoBR();
                    foreach (var faltante in pagosFaltantes)
                    {
                        //SC0026, Generación de clase concreta segun el tipo de contrato
                        var cancelado = new PagoUnidadContratoFSLBO(faltante)
                        {
                            Activo = false
                        };
                        cancelado.Auditoria.FUA = vista.FUA;
                        cancelado.Auditoria.UUA = vista.UUA;
                        pagoBR.Actualizar(dataContext, cancelado, faltante, seguridadBO);
                    }
                }


                var generadorPagoBR = new GeneradorPagosFSLBR();

                // Calcular Ultimo Pago
                var pago      = UltimoPago(anterior.ContratoID);
                var nuevoPago = ++pago;

                // Generar los pagos adicionales
                generadorPagoBR.GenerarPagoAdicional(dataContext, actual, nuevoPago, seguridadBO, true, true);

                dataContext.CommitTransaction(firma);

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