/// <summary>
        /// Muestra la ventada detalle
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        /// <history>
        /// [emoguel] created 23/03/2016
        /// </history>
        private void Cell_DoubleClick(object sender, RoutedEventArgs e)
        {
            FolioInvitationOuthouse          folioInvOut    = (FolioInvitationOuthouse)dgrFoliosInvOut.SelectedItem;
            frmFolioInvitationOuthouseDetail frmFolioDetail = new frmFolioInvitationOuthouseDetail();

            frmFolioDetail.oldFolioInvOut = folioInvOut;
            frmFolioDetail.Owner          = this;
            frmFolioDetail.enumMode       = ((_blnEdit)?EnumMode.Edit:EnumMode.ReadOnly);//Asignamos el modo
            if (frmFolioDetail.ShowDialog() == true)
            {
                int nIndex = 0;
                List <FolioInvitationOuthouse> lstFoliosInvOut = (List <FolioInvitationOuthouse>)dgrFoliosInvOut.ItemsSource;
                if (!ValidateFilter(frmFolioDetail.folioInvOut))                         //Verificamos si cumple con los filtros
                {
                    lstFoliosInvOut.Remove(folioInvOut);                                 //Quitamos el registro
                    StatusBarReg.Content = lstFoliosInvOut.Count + " Folio Invitatios."; //Actualizamos el registro
                }
                else
                {
                    ObjectHelper.CopyProperties(folioInvOut, frmFolioDetail.folioInvOut);//Asignamos los nuevos valores
                    lstFoliosInvOut             = lstFoliosInvOut.OrderBy(fi => fi.fiSerie).ThenBy(fi => fi.fiID).ToList();
                    dgrFoliosInvOut.ItemsSource = lstFoliosInvOut;
                    nIndex = lstFoliosInvOut.IndexOf(folioInvOut); //Buscamos el index del registro
                }
                dgrFoliosInvOut.Items.Refresh();                   //refrescamos el grid
                GridHelper.SelectRow(dgrFoliosInvOut, nIndex);     //Seleccionamos el registro
            }
        }
        /// <summary>
        /// Valida que un registro nuevo cumpla con los filtros del grid
        /// </summary>
        /// <param name="newFolioInvOut">Objeto a evaluar</param>
        /// <returns>True. Cumple con los filtros | False. No cumple con los filtros</returns>
        /// <history>
        /// [emoguel] created 23/03/2016
        /// </history>
        private bool ValidateFilter(FolioInvitationOuthouse newFolioInvOut)
        {
            if (_nStatus != -1)//Filtro por estatus
            {
                if (newFolioInvOut.fiA != Convert.ToBoolean(_nStatus))
                {
                    return(false);
                }
            }

            if (_folioInvOutFilter.fiID > 0)//Filtro por ID
            {
                if (_folioInvOutFilter.fiID != newFolioInvOut.fiID)
                {
                    return(false);
                }
            }

            if (!string.IsNullOrWhiteSpace(_folioInvOutFilter.fiSerie))//Filtro por serie
            {
                if (_folioInvOutFilter.fiSerie != newFolioInvOut.fiSerie)
                {
                    return(false);
                }
            }

            if (_folioInvOutFilter.fiFrom > 0 && _folioInvOutFilter.fiTo > 0)//Filtro por rango de folios
            {
                if (_folioInvOutFilter.fiFrom == _folioInvOutFilter.fiTo)
                {
                    if (!(_folioInvOutFilter.fiFrom >= newFolioInvOut.fiFrom && _folioInvOutFilter.fiTo <= newFolioInvOut.fiTo))
                    {
                        return(false);
                    }
                }
                else
                {
                    if (!(newFolioInvOut.fiFrom >= _folioInvOutFilter.fiFrom && newFolioInvOut.fiTo <= _folioInvOutFilter.fiTo))
                    {
                        return(false);
                    }
                }
            }

            return(true);
        }
        /// <summary>
        /// Abre la ventana de detalle en modo add
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        /// <history>
        /// [emoguel] created 22/03/2016
        /// </history>
        private void btnAdd_Click(object sender, RoutedEventArgs e)
        {
            frmFolioInvitationOuthouseDetail frmFolioDetail = new frmFolioInvitationOuthouseDetail();

            frmFolioDetail.Owner    = this;
            frmFolioDetail.enumMode = EnumMode.Add;
            if (frmFolioDetail.ShowDialog() == true)
            {
                if (ValidateFilter(frmFolioDetail.folioInvOut))//Verficamos que cumpla con los filtros
                {
                    FolioInvitationOuthouse        folioInvOut     = frmFolioDetail.folioInvOut;
                    List <FolioInvitationOuthouse> lstFoliosInvOut = (List <FolioInvitationOuthouse>)dgrFoliosInvOut.ItemsSource;
                    lstFoliosInvOut.Add(folioInvOut);                                                                       //Agregamos el registro a la lista
                    lstFoliosInvOut             = lstFoliosInvOut.OrderBy(fi => fi.fiSerie).ThenBy(fi => fi.fiID).ToList(); //Reordenamos la lista
                    dgrFoliosInvOut.ItemsSource = lstFoliosInvOut;
                    dgrFoliosInvOut.Items.Refresh();                                                                        //Recargamos el grid
                    int nIndex = lstFoliosInvOut.IndexOf(folioInvOut);                                                      //obtenemos el index del nuevo registro
                    GridHelper.SelectRow(dgrFoliosInvOut, nIndex);                                                          //Seleccionamos el nuevo registro
                    StatusBarReg.Content = lstFoliosInvOut.Count + " Folio Invitations.";                                   //Actualizamos el contador
                }
            }
        }
        /// <summary>
        /// Actualiza|Agrega un registro al catalogo FolioInvitationOuthouse
        /// </summary>
        /// <param name="folioInvitationOutside">Entidad a guardar</param>
        /// <param name="blnUpdate">True. Actualiza | False. Agrega</param>
        /// <returns>0. No se guardó | 1. Se guardó correctamente | -2. Verificar el rango</returns>
        /// <history>
        /// [emoguel] created 23/03/2016
        /// </history>
        public static int SaveFolioInvittionsOutside(FolioInvitationOuthouse folioInvitationOutside, bool blnUpdate)
        {
            using (var dbContext = new IMEntities(ConnectionHelper.ConnectionString()))
            {
                bool blnIsValid = false;
                #region Update
                if (blnUpdate)//Si es actualizar
                {
                    blnIsValid = (bool)dbContext.USP_OR_ValidateFolioInvitationsOutside(folioInvitationOutside.fiSerie, folioInvitationOutside.fiFrom, folioInvitationOutside.fiTo, folioInvitationOutside.fiA, 1).FirstOrDefault();

                    if (blnIsValid)//Validamos el rango
                    {
                        dbContext.Entry(folioInvitationOutside).State = System.Data.Entity.EntityState.Modified;
                    }
                    else
                    {
                        return(-2);
                    }
                }
                #endregion
                #region Add
                else//SI es insertar
                {
                    blnIsValid = (bool)dbContext.USP_OR_ValidateFolioInvitationsOutside(folioInvitationOutside.fiSerie, folioInvitationOutside.fiFrom, folioInvitationOutside.fiTo, folioInvitationOutside.fiA, 0).FirstOrDefault();

                    if (blnIsValid)//Validamos el rango
                    {
                        dbContext.FoliosInvitationsOuthouse.Add(folioInvitationOutside);
                    }
                    else
                    {
                        return(-2);
                    }
                }
                #endregion
                return(dbContext.SaveChanges());
            }
        }
        /// <summary>
        /// llena el grid de FolioInvitations
        /// </summary>
        /// <history>
        /// [emoguel] created 23/03/2016
        /// [emoguel] modified 10/06/2016 se volvió async
        /// </history>
        private async void LoadFoliosInvitationOuthouse(FolioInvitationOuthouse folioInvOut = null)
        {
            try
            {
                status.Visibility = Visibility.Visible;
                int nIndex = 0;
                List <FolioInvitationOuthouse> lstFoliosInvOut = await BRFoliosInvitationsOuthouse.GetFoliosInvittionsOutside(_folioInvOutFilter, _nStatus);

                dgrFoliosInvOut.ItemsSource = lstFoliosInvOut;
                if (folioInvOut != null && lstFoliosInvOut.Count > 0)
                {
                    folioInvOut = lstFoliosInvOut.Where(fi => fi.fiID == folioInvOut.fiID).FirstOrDefault();
                    nIndex      = lstFoliosInvOut.IndexOf(folioInvOut);
                }
                GridHelper.SelectRow(dgrFoliosInvOut, nIndex);
                StatusBarReg.Content = lstFoliosInvOut.Count + " Folio Invitations.";
                status.Visibility    = Visibility.Collapsed;
            }
            catch (Exception ex)
            {
                UIHelper.ShowMessage(ex);
            }
        }
        /// <summary>
        /// Actualiza el grid de foliosInvOutside
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        /// <history>
        /// [emoguel] created 22/03/2016
        /// </history>
        private void btnRef_Click(object sender, RoutedEventArgs e)
        {
            FolioInvitationOuthouse folioInvOut = (FolioInvitationOuthouse)dgrFoliosInvOut.SelectedItem;

            LoadFoliosInvitationOuthouse(folioInvOut);
        }
        /// <summary>
        /// Obtiene registros del catalogo FolioInvitationOutside
        /// </summary>
        /// <param name="folioInvitationOutside">Objeto con filtros adicionales</param>
        /// <param name="nStatus">-1. Todos los registros | 0. Registros inactivos | 1.Registros activos</param>
        /// <returns>Lista de tipo FolioInvitationOuthouse </returns>
        /// <history>
        /// [emoguel] created 23/03/2016
        /// [emoguel] modified 10/06/2016
        /// </history>
        public async static Task <List <FolioInvitationOuthouse> > GetFoliosInvittionsOutside(FolioInvitationOuthouse folioInvitationOutside = null, int nStatus = -1)
        {
            List <FolioInvitationOuthouse> lstFolioInvitationsOutside = await Task.Run(() =>
            {
                using (var dbContext = new IMEntities(ConnectionHelper.ConnectionString()))
                {
                    var query = from fi in dbContext.FoliosInvitationsOuthouse
                                select fi;

                    if (nStatus != -1)//FIltro por estatus
                    {
                        bool blnEstatus = Convert.ToBoolean(nStatus);
                        query           = query.Where(fi => fi.fiA == blnEstatus);
                    }

                    if (folioInvitationOutside != null)      //Validamos si tiene objeto
                    {
                        if (folioInvitationOutside.fiID > 0) //Filtro por ID
                        {
                            query = query.Where(fi => fi.fiID == folioInvitationOutside.fiID);
                        }

                        if (!string.IsNullOrWhiteSpace(folioInvitationOutside.fiSerie))//Filtro por serie
                        {
                            query = query.Where(fi => fi.fiSerie == folioInvitationOutside.fiSerie);
                        }

                        if (folioInvitationOutside.fiFrom > 0 && folioInvitationOutside.fiTo > 0)//Filtro por rango
                        {
                            if (folioInvitationOutside.fiFrom == folioInvitationOutside.fiTo)
                            {
                                query = query.Where(fi => folioInvitationOutside.fiFrom >= fi.fiFrom && folioInvitationOutside.fiTo <= fi.fiTo);
                            }
                            else
                            {
                                query = query.Where(fi => fi.fiFrom >= folioInvitationOutside.fiFrom && fi.fiTo <= folioInvitationOutside.fiTo);
                            }
                        }
                    }
                    return(query.OrderBy(fi => fi.fiSerie).ThenBy(fi => fi.fiID).ToList());
                }
            });

            return(lstFolioInvitationsOutside);
        }