/// <summary>
        /// Updates user preferences
        /// </summary>
        /// <param name="userPreference"></param>
        private void UpdatePreferences(EUserPreferences userPreference)
        {
            switch (userPreference)
            {
            case EUserPreferences.TV:
                UserPreferences.SaveTVValue(TVvalue);
                SystemSounds.Beep.Play();
                MessageBox.Show(Messages.SuccesfulOperation.PreferenceWasUpdatedSuccesfully, Messages.Titles.Success, MessageBoxButton.OK, MessageBoxImage.Information);
                return;

            case EUserPreferences.Megas3:
                UserPreferences.Save3MegasValue(Megas3Value);
                SystemSounds.Beep.Play();
                MessageBox.Show(Messages.SuccesfulOperation.PreferenceWasUpdatedSuccesfully, Messages.Titles.Success, MessageBoxButton.OK, MessageBoxImage.Information);
                return;

            case EUserPreferences.Megas5:
                UserPreferences.Save5MegasValue(Megas5Value);
                SystemSounds.Beep.Play();
                MessageBox.Show(Messages.SuccesfulOperation.PreferenceWasUpdatedSuccesfully, Messages.Titles.Success, MessageBoxButton.OK, MessageBoxImage.Information);
                return;

            case EUserPreferences.Megas7:
                UserPreferences.Save7MegasValue(Megas7Value);
                SystemSounds.Beep.Play();
                MessageBox.Show(Messages.SuccesfulOperation.PreferenceWasUpdatedSuccesfully, Messages.Titles.Success, MessageBoxButton.OK, MessageBoxImage.Information);
                return;

            case EUserPreferences.Megas10:
                UserPreferences.Save10MegasValue(Megas10Value);
                SystemSounds.Beep.Play();
                MessageBox.Show(Messages.SuccesfulOperation.PreferenceWasUpdatedSuccesfully, Messages.Titles.Success, MessageBoxButton.OK, MessageBoxImage.Information);
                return;

            case EUserPreferences.Combo3TV:
                UserPreferences.SaveCombo3TV(ComboTV3Value);
                SystemSounds.Beep.Play();
                MessageBox.Show(Messages.SuccesfulOperation.PreferenceWasUpdatedSuccesfully, Messages.Titles.Success, MessageBoxButton.OK, MessageBoxImage.Information);
                return;

            case EUserPreferences.Combo3Internet:
                UserPreferences.SaveCombo3Internet(ComboInternet3Value);
                SystemSounds.Beep.Play();
                MessageBox.Show(Messages.SuccesfulOperation.PreferenceWasUpdatedSuccesfully, Messages.Titles.Success, MessageBoxButton.OK, MessageBoxImage.Information);
                return;

            case EUserPreferences.Combo5TV:
                UserPreferences.SaveCombo5TV(ComboTV5Value);
                SystemSounds.Beep.Play();
                MessageBox.Show(Messages.SuccesfulOperation.PreferenceWasUpdatedSuccesfully, Messages.Titles.Success, MessageBoxButton.OK, MessageBoxImage.Information);
                return;

            case EUserPreferences.Combo5Internet:
                UserPreferences.SaveCombo5Internet(ComboInternet5Value);
                SystemSounds.Beep.Play();
                MessageBox.Show(Messages.SuccesfulOperation.PreferenceWasUpdatedSuccesfully, Messages.Titles.Success, MessageBoxButton.OK, MessageBoxImage.Information);
                return;

            case EUserPreferences.Combo7TV:
                UserPreferences.SaveCombo7TV(ComboTV7Value);
                SystemSounds.Beep.Play();
                MessageBox.Show(Messages.SuccesfulOperation.PreferenceWasUpdatedSuccesfully, Messages.Titles.Success, MessageBoxButton.OK, MessageBoxImage.Information);
                return;

            case EUserPreferences.Combo7Internet:
                UserPreferences.SaveCombo7Internet(ComboInternet7Value);
                SystemSounds.Beep.Play();
                MessageBox.Show(Messages.SuccesfulOperation.PreferenceWasUpdatedSuccesfully, Messages.Titles.Success, MessageBoxButton.OK, MessageBoxImage.Information);
                return;

            case EUserPreferences.Combo10TV:
                UserPreferences.SaveCombo10TV(ComboTV10Value);
                SystemSounds.Beep.Play();
                MessageBox.Show(Messages.SuccesfulOperation.PreferenceWasUpdatedSuccesfully, Messages.Titles.Success, MessageBoxButton.OK, MessageBoxImage.Information);
                return;

            case EUserPreferences.Combo10Internet:
                UserPreferences.SaveCombo10Internet(ComboInternet10Value);
                SystemSounds.Beep.Play();
                MessageBox.Show(Messages.SuccesfulOperation.PreferenceWasUpdatedSuccesfully, Messages.Titles.Success, MessageBoxButton.OK, MessageBoxImage.Information);
                return;

            case EUserPreferences.Reconexion:
                UserPreferences.SaveReconexionValue(ReconexionValue);
                SystemSounds.Beep.Play();
                MessageBox.Show(Messages.SuccesfulOperation.PreferenceWasUpdatedSuccesfully, Messages.Titles.Success, MessageBoxButton.OK, MessageBoxImage.Information);
                return;

            case EUserPreferences.Afiliacion:
                UserPreferences.SaveAfiliacionValue(AfiliacionValue);
                SystemSounds.Beep.Play();
                MessageBox.Show(Messages.SuccesfulOperation.PreferenceWasUpdatedSuccesfully, Messages.Titles.Success, MessageBoxButton.OK, MessageBoxImage.Information);
                return;

            case EUserPreferences.Derivacion:
                UserPreferences.SaveDerivacionValue(DerivacionValue);
                SystemSounds.Beep.Play();
                MessageBox.Show(Messages.SuccesfulOperation.PreferenceWasUpdatedSuccesfully, Messages.Titles.Success, MessageBoxButton.OK, MessageBoxImage.Information);
                return;

            case EUserPreferences.Traslado:
                UserPreferences.SaveTrasladoValue(TrasladoValue);
                SystemSounds.Beep.Play();
                MessageBox.Show(Messages.SuccesfulOperation.PreferenceWasUpdatedSuccesfully, Messages.Titles.Success, MessageBoxButton.OK, MessageBoxImage.Information);
                return;

            case EUserPreferences.Descuento:
                UserPreferences.SaveDescuento(DescuentoValue);
                SystemSounds.Beep.Play();
                MessageBox.Show(Messages.SuccesfulOperation.PreferenceWasUpdatedSuccesfully, Messages.Titles.Success, MessageBoxButton.OK, MessageBoxImage.Information);
                return;

            case EUserPreferences.Recibos:
                UserPreferences.SaveRecibosLocation(RecibosValue);
                SystemSounds.Beep.Play();
                MessageBox.Show(Messages.SuccesfulOperation.PreferenceWasUpdatedSuccesfully, Messages.Titles.Success, MessageBoxButton.OK, MessageBoxImage.Information);
                return;

            case EUserPreferences.Facturas:
                UserPreferences.SaveFacturasLocation(FacturasValue);
                SystemSounds.Beep.Play();
                MessageBox.Show(Messages.SuccesfulOperation.PreferenceWasUpdatedSuccesfully, Messages.Titles.Success, MessageBoxButton.OK, MessageBoxImage.Information);
                return;

            case EUserPreferences.Archivos:
                UserPreferences.SavePreferredLocation(UbicacionValue);
                SystemSounds.Beep.Play();
                MessageBox.Show(Messages.SuccesfulOperation.PreferenceWasUpdatedSuccesfully, Messages.Titles.Success, MessageBoxButton.OK, MessageBoxImage.Information);
                return;

            case EUserPreferences.NumeroRecibo:
                if (IsNumeroReciboValid())
                {
                    UserPreferences.SaveNumeroRecibo(NumeroReciboValue);
                    SystemSounds.Beep.Play();
                    MessageBox.Show(Messages.SuccesfulOperation.PreferenceWasUpdatedSuccesfully, Messages.Titles.Success, MessageBoxButton.OK, MessageBoxImage.Information);
                }
                else
                {
                    SystemSounds.Beep.Play();
                    MessageBox.Show("Valor invalido!", Messages.Titles.Success, MessageBoxButton.OK, MessageBoxImage.Warning);
                }
                return;

            default:
                Debugger.Break();
                return;
            }
        }
        /// <summary>
        /// Generates Recibos de caja.
        /// </summary>
        /// <param name="items">It is a pair of values</param>
        /// <param name="type">The type of recibo de caja</param>
        /// <returns>True if files were generated succesfully</returns>
        public override bool GenerateFiles(List <Tuple <Factura, Customer> > items, string type, object sender, System.Windows.Controls.TextBlock text)
        {
            for (int i = 0; i < items.Count; ++i)
            {
                //Change current operation description
                base.UpdateCurrentOperationDescription("Proceso iniciado  " + (i + 1) + "/" + items.Count);
                text.Dispatcher.Invoke(delegate
                {
                    text.Text = CurrentOperationDescription;
                });
                string concepto = String.Empty;
                int    ct       = 0;
                foreach (Cargo cargo in items.ElementAt(i).Item1.cargos)
                {
                    concepto += cargo.Concepto.ToString().ToUpper();
                    concepto += new StringBuilder(" ").Append(cargo.MesCargado.ToString().ToUpper());

                    if (!(items.ElementAt(i).Item1.cargos.Count - 1 == ct++))
                    {
                        concepto += "-";
                    }
                }


                using (ExcelPackage xlPackage = new ExcelPackage(new System.IO.FileInfo(@UserPreferences.GetRecibosLocation())))
                {
                    //Change current operation description
                    base.UpdateCurrentOperationDescription("Obteniendo directorio");
                    text.Dispatcher.Invoke(delegate
                    {
                        text.Text = CurrentOperationDescription;
                    });

                    StringBuilder DirectoryLocation = new StringBuilder(UserPreferences.GetPreferredLocation()).Append(@"\").Append(type);
                    var           directoryInfo     = System.IO.Directory.CreateDirectory(@DirectoryLocation.ToString());

                    //Change Current Operation Description
                    base.UpdateCurrentOperationDescription("Generando nombres de archivo");
                    text.Dispatcher.Invoke(delegate
                    {
                        text.Text = CurrentOperationDescription;
                    });

                    StringBuilder FileLocationXlsx = new StringBuilder(directoryInfo.FullName).Append(@"\").Append(items.ElementAt(i).Item1.NumeroFactura).Append(FileExtensions.ExcelFormat);
                    StringBuilder FileLocationPDF  = new StringBuilder(directoryInfo.FullName).Append(@"\").Append(items.ElementAt(i).Item1.NumeroFactura).Append(FileExtensions.PDFFormat);

                    try
                    {
                        var worksheet    = xlPackage.Workbook.Worksheets.First();
                        var totalRows    = worksheet.Dimension.End.Row;
                        var totalColumns = worksheet.Dimension.End.Column;

                        //Change Current Operation Description
                        base.UpdateCurrentOperationDescription("Escaneando plantilla");
                        text.Dispatcher.Invoke(delegate
                        {
                            text.Text = CurrentOperationDescription;
                        });

                        int count = 0;
                        for (int rowNum = 1; rowNum <= totalRows; ++rowNum)
                        {
                            for (int colNum = 1; colNum <= totalColumns; ++colNum)
                            {
                                var    row       = worksheet.Cells[rowNum, colNum].Select(c => c.Value == null ? String.Empty : c.Value.ToString());
                                string cellValue = String.Join(",", row);

                                if (cellValue == RecibosKeyWords.NUMERORECIBO)
                                {
                                    int numero_recibo = UserPreferences.GetNumeroRecibo();
                                    worksheet.Cells[rowNum, colNum].Value = new StringBuilder("#").Append(numero_recibo).ToString();
                                    UserPreferences.SaveNumeroRecibo(++numero_recibo);
                                }
                                if (cellValue == RecibosKeyWords.NOMBRES)
                                {
                                    worksheet.Cells[rowNum, colNum].Value = new StringBuilder(items.ElementAt(i).Item2.Nombre).Append(" ").Append(items.ElementAt(i).Item2.Apellido).ToString();
                                }
                                if (cellValue == RecibosKeyWords.FECHA)
                                {
                                    worksheet.Cells[rowNum, colNum].Value = DateManager.GetDateInSpanish();
                                }
                                if (cellValue == RecibosKeyWords.CEDULA)
                                {
                                    worksheet.Cells[rowNum, colNum].Value = items.ElementAt(i).Item2.Cedula;
                                }
                                if (cellValue == RecibosKeyWords.DIRECCION)
                                {
                                    worksheet.Cells[rowNum, colNum].Value = items.ElementAt(i).Item2.Direccion;
                                }
                                if (cellValue == RecibosKeyWords.BARRIO)
                                {
                                    worksheet.Cells[rowNum, colNum].Value = items.ElementAt(i).Item2.Barrio;
                                }
                                if (cellValue == RecibosKeyWords.CONCEPTO)
                                {
                                    worksheet.Cells[rowNum, colNum].Value = concepto;
                                }
                                if (cellValue == RecibosKeyWords.NODO)
                                {
                                    worksheet.Cells[rowNum, colNum].Value = items.ElementAt(i).Item2.Nodo;
                                }
                                if (cellValue == RecibosKeyWords.TELEFONO)
                                {
                                    worksheet.Cells[rowNum, colNum].Value = items.ElementAt(i).Item2.Telefono;
                                }
                                if (cellValue == RecibosKeyWords.MES)
                                {
                                    worksheet.Cells[rowNum, colNum].Value = DateManager.GetMonthInSpanish();
                                }
                                if (cellValue == RecibosKeyWords.VALOR)
                                {
                                    string valorToDisplay = String.Format(System.Globalization.CultureInfo.CurrentCulture, "{0:C}", Valor);
                                    worksheet.Cells[rowNum, colNum].Value = valorToDisplay;
                                }

                                //Change progress value
                                int newProgress = (int)((((float)(++count) / (float)(totalRows * totalColumns)) * (1.0f / (float)items.Count)) * 100);
                                base.UpdateProgreso(newProgress);
                                (sender as BackgroundWorker).ReportProgress(Progress);
                            }
                        }

                        //Change Current Operation Description
                        base.UpdateCurrentOperationDescription("Generando archivo PDF");
                        text.Dispatcher.Invoke(delegate
                        {
                            text.Text = CurrentOperationDescription;
                        });

                        xlPackage.SaveAs(new System.IO.FileInfo(@FileLocationXlsx.ToString()));
                        Workbook workbook = new Application().Workbooks.Open(@FileLocationXlsx.ToString());
                        workbook.ExportAsFixedFormat(XlFixedFormatType.xlTypePDF, @FileLocationPDF.ToString());
                        workbook.Close();
                    }
                    catch (Exception)
                    {
                        RollBack(FileLocationXlsx.ToString(), FileLocationPDF.ToString());
                        throw;
                    }
                    finally
                    {
                        File.Delete(@FileLocationXlsx.ToString());
                    }
                }
            }
            base.UpdateProgreso(100);

            (sender as BackgroundWorker).ReportProgress(Progress);
            return(true);
        }
        /// <summary>
        /// Processes the payment
        /// </summary>
        private void Pay()
        {
            if (CedulaCliente is null)
            {
                SystemSounds.Beep.Play();
                MessageBox.Show("Cedula invalida", Messages.Titles.Warninig, MessageBoxButton.OK, MessageBoxImage.Warning);
                return;
            }


            List <Cargo> cargosActualizados = new List <Cargo>();

            foreach (Compra _compra in this.ListViewCompras.Items)
            {
                Cargo cargo = (Cargo)_compra.CargoView;
                cargosActualizados.Add(cargo);
            }
            int pagoTotal = int.Parse(this.TotalText.Content.ToString(), NumberStyles.Currency);

            try
            {
                Factura factura = new Factura();
                //In this case NumeroFactura is used for the name of the file, so its safe not to provide the object with more values
                //Must add number of file to the name of the file to avoid file from being removed if two or more payments happen the same day
                factura.NumeroFactura = new StringBuilder(CedulaCliente).Append("-").Append(DateManager.GetMonthInSpanish()).Append("-").Append(UserPreferences.GetNumeroRecibo()).ToString();
                factura.cargos        = cargosActualizados;
                Customer customer = BDManager.GetCustomer(CedulaCliente);

                if (customer is null)
                {
                    SystemSounds.Beep.Play();
                    MessageBox.Show("Error inesperado", Messages.Titles.Alert, MessageBoxButton.OK, MessageBoxImage.Error);
                    return;
                }

                RecibosManager                    recibosManager = new RecibosManager();
                Tuple <Factura, Customer>         pair           = new Tuple <Factura, Customer>(factura, customer);
                List <Tuple <Factura, Customer> > info           = new List <Tuple <Factura, Customer> >();
                info.Add(pair);

                try
                {
                    recibosManager.Valor = pagoTotal;
                    LoadingWindow loadingWindow = new LoadingWindow();
                    loadingWindow.Show();
                    loadingWindow.StartWorking((object sender, DoWorkEventArgs e) => {
                        recibosManager.GenerateFiles(info, TypeOfRecibos.PAGO, sender, loadingWindow.Status);

                        this.Dispatcher.Invoke(delegate {
                            loadingWindow.Hide();
                            SystemSounds.Beep.Play();
                            MessageBox.Show("Archivo creado exitosamente", Messages.Titles.Success, MessageBoxButton.OK, MessageBoxImage.Information);
                        });
                    }
                                               );
                }
                catch (Exception)
                {
                    this.Dispatcher.Invoke(delegate
                    {
                        SystemSounds.Beep.Play();
                        MessageBox.Show(Messages.Errors.CouldntReadFile, Messages.Titles.Warninig, MessageBoxButton.OK, MessageBoxImage.Warning);
                    });
                    return;
                }

                try
                {
                    if (descuento == 0)
                    {
                        if (BDManager.Pay(cargosActualizados, CedulaCliente, pagoTotal))
                        {
                            SystemSounds.Beep.Play();
                            MessageBox.Show("Pago exitoso!", Messages.Titles.Success, MessageBoxButton.OK, MessageBoxImage.Information);
                            Clean();
                        }
                    }
                    else
                    {
                        if (BDManager.Pay(cargosActualizados, CedulaCliente, pagoTotal, descuento, descuentoCargo))
                        {
                            SystemSounds.Beep.Play();
                            MessageBox.Show("Pago exitoso!", Messages.Titles.Success, MessageBoxButton.OK, MessageBoxImage.Information);
                            Clean();
                        }
                    }
                } catch (Exception)
                {
                    SystemSounds.Beep.Play();
                    MessageBox.Show("No se pudo efectuar el pago", Messages.Titles.Warninig, MessageBoxButton.OK, MessageBoxImage.Warning);
                    int resetNumeber = UserPreferences.GetNumeroRecibo();
                    UserPreferences.SaveNumeroRecibo(--resetNumeber);
                }
            } catch (Exception e)
            {
                SystemSounds.Beep.Play();
                MessageBox.Show("Error inesperado. Elimine el archivo generado!" + "\n" + e.Message, Messages.Titles.Alert, MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }