protected List <KeyValuePair <string, decimal> > GetDates4RemiteeOverDateRange(DataRequest request)
        {
            PreprocessedDataRequest handledRequest = HandleRequest(request);

            try
            {
                var res =
                    from r in CsvToXmlSSKA.DataSource.DescendantsAndSelf(Config.TransactionField)
                    where DateTime.Parse(r.Element(Config.WertDatumField).Value) >= handledRequest.BeginDate &&
                    DateTime.Parse(r.Element(Config.WertDatumField).Value) <= handledRequest.FinishDate &&
                    handledRequest.SelectedRemittee.Equals(r.Element(Config.BeguenstigterField).Value) &&
                    !handledRequest.Accounts.Contains(r.Attribute(Config.AuftragsKontoField).Value) &&
                    ConvertStringToDecimal(r.Element(Config.BetragField).Value) <= -handledRequest.ExpencesHighestValue &&
                    ConvertStringToDecimal(r.Element(Config.BetragField).Value) >= -handledRequest.ExpencesLowestValue
                    &&
                    (
                        r.Element(Config.BeguenstigterField).Value.Contains(String.IsNullOrEmpty(handledRequest.ToFind) ? r.Element(Config.BeguenstigterField).Value : handledRequest.ToFind) ||
                        r.Element(Config.VerwendZweckField).Value.Contains(String.IsNullOrEmpty(handledRequest.ToFind) ? r.Element(Config.VerwendZweckField).Value : handledRequest.ToFind)
                    ) &&
                    !handledRequest.Buchungstexts.Contains(r.Element(Config.BuchungsTextField).Value)
                    orderby DateTime.Parse(r.Element(Config.WertDatumField).Value)

                    select new KeyValuePair <string, decimal>(r.Element(Config.WertDatumField).Value,
                                                              (-ConvertStringToDecimal(r.Element(Config.BetragField).Value)));


                return(res.ToList <KeyValuePair <string, decimal> >());
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message + "**BuisenessLogicSSKA-GetDates4RemiteeOverDateRange**",
                                Config.AppName + ": Unable to get Data", MessageBoxButton.OK, MessageBoxImage.Error);
            }
            return(null);
        }
        protected List <KeyValuePair <string, decimal> > GetIncomesOverDatesRange(DataRequest request)
        {
            PreprocessedDataRequest handledRequest = HandleRequest(request);

            try
            {
                var res =
                    from r in CsvToXmlSSKA.DataSource.DescendantsAndSelf(Config.TransactionField)
                    where DateTime.Parse(r.Element(Config.WertDatumField).Value) >= handledRequest.BeginDate &&
                    DateTime.Parse(r.Element(Config.WertDatumField).Value) <= handledRequest.FinishDate &&
                    !handledRequest.Accounts.Contains(r.Attribute(Config.AuftragsKontoField).Value) &&
                    ConvertStringToDecimal(r.Element(Config.BetragField).Value) >= handledRequest.IncomsLowestValue &&
                    ConvertStringToDecimal(r.Element(Config.BetragField).Value) <= handledRequest.IncomsHighestValue &&
                    !handledRequest.Buchungstexts.Contains(r.Element(Config.BuchungsTextField).Value)
                    group r.Element(Config.BetragField).Value by r.Element(Config.WertDatumField).Value into g
                    orderby DateTime.Parse(g.Key)
                    select new KeyValuePair <string, decimal>(g.Key.Substring(5), g.Sum <string>(
                                                                  n => ConvertStringToDecimal(n)
                                                                  // g.TakeWhile<XElement>(
                                                                  //m => ConvertStringToDecimal(m.Value) <= incomsHighestValue && ConvertStringToDecimal(m.Value) >= incomsLowestValue).Sum<XElement>(
                                                                  //n => ConvertStringToDecimal(n.Value)
                                                                  )
                                                              );

                //chartsModel.IncomesOverDatesRange = res.ToList<KeyValuePair<string, decimal>>();
                return(res.ToList <KeyValuePair <string, decimal> >());
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message + "**BuisenessLogicSSKA-GetExpensesOverDateRange**",
                                Config.AppName + ": Unable to get Data", MessageBoxButton.OK, MessageBoxImage.Error);
            }
            return(null);
        }
        protected List <KeyValuePair <string, decimal> > GetExpensesAtDate(DataRequest request)
        {
            PreprocessedDataRequest handledRequest = HandleRequest(request);

            try
            {
                var res =
                    from r in CsvToXmlSSKA.DataSource.DescendantsAndSelf(Config.TransactionField)
                    where DateTime.Parse(r.Element(Config.WertDatumField).Value) == handledRequest.AtDate &&
                    !handledRequest.Accounts.Contains(r.Attribute(Config.AuftragsKontoField).Value) &&
                    ConvertStringToDecimal(r.Element(Config.BetragField).Value) < 0 &&
                    !handledRequest.Buchungstexts.Contains(r.Element(Config.BuchungsTextField).Value)
                    group r.Element(Config.BetragField).Value by r.Element(Config.BeguenstigterField).Value into g

                    select new KeyValuePair <string, decimal>(g.Key /*.Substring(5)*/, g.TakeWhile <string>(
                                                                  m => ConvertStringToDecimal(m) <= -handledRequest.ExpencesHighestValue && ConvertStringToDecimal(m) >= -handledRequest.ExpencesLowestValue).Sum <string>(
                                                                  n => - ConvertStringToDecimal(n)
                                                                  )
                                                              );

                return(res.ToList <KeyValuePair <string, decimal> >());
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message + "**BuisenessLogicSSKA-GetExpensesAtDate**",
                                Config.AppName + ": Unable to get Data.", MessageBoxButton.OK, MessageBoxImage.Error);
            }
            return(null);
        }
        protected string GetSummary(DataRequest request)
        {
            PreprocessedDataRequest handledRequest = HandleRequest(request);
            string result = String.Format("Total: {0:d} - {1:d} : ", handledRequest.BeginDate, handledRequest.FinishDate);

            try
            {
                var resIncomes =
                    from r in CsvToXmlSSKA.DataSource.DescendantsAndSelf(Config.TransactionField)
                    where DateTime.Parse(r.Element(Config.WertDatumField).Value) >= handledRequest.BeginDate &&
                    DateTime.Parse(r.Element(Config.WertDatumField).Value) <= handledRequest.FinishDate &&
                    !handledRequest.Accounts.Contains(r.Attribute(Config.AuftragsKontoField).Value) &&
                    ConvertStringToDecimal(r.Element(Config.BetragField).Value) > 0 &&
                    !handledRequest.Buchungstexts.Contains(r.Element(Config.BuchungsTextField).Value)
                    group r.Elements(Config.BetragField).Single() by r.Parent.Element(Config.TransactionField).Name.LocalName into g
                    select new KeyValuePair <string, decimal>(g.Key, g.Sum <XElement>(
                                                                  n => ConvertStringToDecimal(n.Value)
                                                                  ));

                var resExpences =
                    from r in CsvToXmlSSKA.DataSource.DescendantsAndSelf(Config.TransactionField)
                    where DateTime.Parse(r.Element(Config.WertDatumField).Value) >= handledRequest.BeginDate &&
                    DateTime.Parse(r.Element(Config.WertDatumField).Value) <= handledRequest.FinishDate &&
                    !handledRequest.Accounts.Contains(r.Attribute(Config.AuftragsKontoField).Value) &&
                    ConvertStringToDecimal(r.Element(Config.BetragField).Value) < 0 &&
                    !handledRequest.Buchungstexts.Contains(r.Element(Config.BuchungsTextField).Value)
                    group r.Elements(Config.BetragField).Single() by r.Parent.Element(Config.TransactionField).Name.LocalName into g
                    select new KeyValuePair <string, decimal>(g.Key, g.Sum <XElement>(
                                                                  n => ConvertStringToDecimal(n.Value)
                                                                  ));

                var resBalances =
                    from r in CsvToXmlSSKA.DataSource.DescendantsAndSelf(Config.TransactionField)
                    where DateTime.Parse(r.Element(Config.WertDatumField).Value) >= handledRequest.BeginDate &&
                    DateTime.Parse(r.Element(Config.WertDatumField).Value) <= handledRequest.FinishDate &&
                    !handledRequest.Accounts.Contains(r.Attribute(Config.AuftragsKontoField).Value) &&
                    !handledRequest.Buchungstexts.Contains(r.Element(Config.BuchungsTextField).Value)
                    group r.Elements(Config.BetragField).Single() by r.Parent.Element(Config.TransactionField).Name.LocalName into g
                    select new KeyValuePair <string, decimal>(g.Key, g.Sum <XElement>(
                                                                  n => ConvertStringToDecimal(n.Value)
                                                                  ));

                result += resIncomes.FirstOrDefault <KeyValuePair <string, decimal> >().Value +
                          " " + resExpences.FirstOrDefault <KeyValuePair <string, decimal> >().Value +
                          " = " + resBalances.FirstOrDefault <KeyValuePair <string, decimal> >().Value;
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message + "**BuisenessLogicSSKA-GetSummary**",
                                Config.AppName + ": Unable to get Data", MessageBoxButton.OK, MessageBoxImage.Error);
            }
            return(result);
        }
        protected List <KeyValuePair <string, decimal> > GetExpensesOverRemiteeInDateRange(DataRequest request)
        {
            PreprocessedDataRequest handledRequest = HandleRequest(request);

            try
            {
                var res =
                    from r in CsvToXmlSSKA.DataSource.DescendantsAndSelf(Config.TransactionField)
                    where DateTime.Parse(r.Element(Config.WertDatumField).Value) >= handledRequest.BeginDate &&
                    DateTime.Parse(r.Element(Config.WertDatumField).Value) <= handledRequest.FinishDate &&
                    !handledRequest.Accounts.Contains(r.Attribute(Config.AuftragsKontoField).Value) &&
                    ConvertStringToDecimal(r.Element(Config.BetragField).Value) < 0
                    //&& ConvertStringToDecimal(r.Element(Config.BetragField).Value) <= -handledRequest.ExpencesHighestValue
                    //&& ConvertStringToDecimal(r.Element(Config.BetragField).Value) >= -handledRequest.ExpencesLowestValue
                    && !handledRequest.Buchungstexts.Contains(r.Element(Config.BuchungsTextField).Value)
                    group r.Element(Config.BetragField).Value by r.Element(Config.BeguenstigterField).Value into g
                    orderby g.Key
                    select new KeyValuePair <string, decimal>(g.Key, g.TakeWhile <string>
                                                              (
                                                                  m => ConvertStringToDecimal(m) <= -handledRequest.ExpencesHighestValue &&
                                                                  ConvertStringToDecimal(m) >= -handledRequest.ExpencesLowestValue
                                                              ).Sum <string>(n => - ConvertStringToDecimal(n))
                                                              );

                //    select new
                //    {
                //        Betrag = g.Key,
                //        Gr = g.TakeWhile<string>
                //            (
                //               m => ConvertStringToDecimal(m) <= -handledRequest.ExpencesHighestValue
                //                   && ConvertStringToDecimal(m) >= -handledRequest.ExpencesLowestValue
                //             ).Sum<string>(n => -ConvertStringToDecimal(n)),
                //        Values = from p in g select p

                //    };
                //List<KeyValuePair<string, decimal>> temp = new List<KeyValuePair<string, decimal>>();
                //foreach (var group in res)
                //{
                //    //MessageBox.Show(group.Betrag);
                //    temp.Add(new KeyValuePair<string, decimal>(group.Betrag, group.Gr));
                //    //foreach (string t in group.Values)
                //    //    MessageBox.Show(t);
                //}
                // return temp;
                return(res.ToList <KeyValuePair <string, decimal> >( ));
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message + "**BuisenessLogicSSKA-GetExpencesOverRemiteeInDateRange**",
                                Config.AppName + ": Unable to get Data", MessageBoxButton.OK, MessageBoxImage.Error);
            }
            return(null);
        }
        protected List <KeyValuePair <DateTime, decimal> > GetBalanceOverDateRange(DataRequest request)
        {
            List <KeyValuePair <DateTime, decimal> > resultedList = new List <KeyValuePair <DateTime, decimal> >();
            PreprocessedDataRequest handledRequest = HandleRequest(request);

            try
            {
                var res =
                    from r in CsvToXmlSSKA.DataSource.DescendantsAndSelf(Config.TransactionField)
                    where DateTime.Parse(r.Element(Config.WertDatumField).Value) >= handledRequest.BeginDate &&
                    DateTime.Parse(r.Element(Config.WertDatumField).Value) <= handledRequest.FinishDate &&
                    !handledRequest.Accounts.Contains(r.Attribute(Config.AuftragsKontoField).Value) &&
                    !handledRequest.Buchungstexts.Contains(r.Element(Config.BuchungsTextField).Value)                        // ??
                    group r.Element(Config.BetragField).Value by r.Element(Config.WertDatumField).Value into g
                    orderby DateTime.Parse(g.Key)
                    select new KeyValuePair <DateTime, decimal>(DateTime.Parse(g.Key).Date, g.Sum <string>(
                                                                    n => ConvertStringToDecimal(n)
                                                                    )
                                                                );

                List <KeyValuePair <DateTime, decimal> > inputList = res.ToList <KeyValuePair <DateTime, decimal> >();

                IEnumerator <KeyValuePair <DateTime, decimal> > inputEnumerator = inputList.GetEnumerator();
                decimal akku = 0m;

                if (inputEnumerator.MoveNext())
                {
                    for (DateTime currDate = handledRequest.BeginDate /*.Date.AddDays(1)*/; !handledRequest.FinishDate.Date.Equals(currDate.Date.AddDays(-1)); currDate = currDate.Date.AddDays(1))
                    {
                        if (inputEnumerator.Current.Key.Equals(currDate))
                        {
                            akku += inputEnumerator.Current.Value;
                            resultedList.Add(new KeyValuePair <DateTime, decimal>(inputEnumerator.Current.Key, akku));
                            inputEnumerator.MoveNext();
                        }
                        else
                        {
                            resultedList.Add(new KeyValuePair <DateTime, decimal>(currDate, akku));
                        }
                    }
                }
                return(resultedList);
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message + "**BuisenessLogicSSKA-GetBalanceOverDateRange**",
                                Config.AppName + ": Unable to get Data.", MessageBoxButton.OK, MessageBoxImage.Error);
            }
            return(null);
        }
        private PreprocessedDataRequest HandleRequest(DataRequest request)
        {
            PreprocessedDataRequest result = new PreprocessedDataRequest();

            List <string> buchungstexts      = new List <string>();
            List <string> accounts           = new List <string>();
            Decimal       incomsLowestValue  = Decimal.Zero;
            Decimal       incomsHighestValue = Decimal.MaxValue;
            Decimal       expLowestValue     = Decimal.MaxValue;
            Decimal       expHighestValue    = Decimal.Zero;

            result.AtDate           = request.AtDate;
            result.SelectedRemittee = request.SelectedRemittee;

            result.BeginDate = request.BeginDate;
            if (request.EndDate < request.BeginDate)
            {
                result.FinishDate = request.BeginDate;
            }
            else
            {
                result.FinishDate = request.EndDate;
            }

            if (request.Filters != null)
            {
                if (!decimal.TryParse(request.Filters.ExpenciesLessThan, out expLowestValue))
                {
                    expLowestValue = Decimal.MaxValue;
                }
                decimal.TryParse(request.Filters.ExpenciesMoreThan, out expHighestValue);
                if (!decimal.TryParse(request.Filters.IncomesLessThan, out incomsHighestValue))
                {
                    incomsHighestValue = Decimal.MaxValue;
                }
                decimal.TryParse(request.Filters.IncomesMoreThan, out incomsLowestValue);
                buchungstexts.AddRange(ConvertObsCollBoolTextCoupleToList(request.Filters.BuchungstextValues));
                accounts.AddRange(ConvertObsCollBoolTextCoupleToList(request.Filters.Accounts));
                result.ToFind = request.Filters.ToFind;
            }
            result.ExpencesLowestValue  = expLowestValue;
            result.ExpencesHighestValue = expHighestValue;
            result.IncomsLowestValue    = incomsLowestValue;
            result.IncomsHighestValue   = incomsHighestValue;
            result.Buchungstexts        = buchungstexts;
            result.Accounts             = accounts;
            return(result);
        }
        protected ObservableCollection <BoolTextCouple> GetBuchungstextOverDateRange(DataRequest request)
        {
            PreprocessedDataRequest handledRequest = HandleRequest(request);

            if (handledRequest.Buchungstexts.Count > 0)
            {
                try
                {
                    var res =
                        from r in CsvToXmlSSKA.DataSource.DescendantsAndSelf(Config.TransactionField)
                        where DateTime.Parse(r.Element(Config.WertDatumField).Value) >= handledRequest.BeginDate &&
                        DateTime.Parse(r.Element(Config.WertDatumField).Value) <= handledRequest.FinishDate &&
                        !handledRequest.Accounts.Contains(r.Attribute(Config.AuftragsKontoField).Value)
                        group r.Element(Config.WertDatumField).Value by r.Element(Config.BuchungsTextField).Value into g

                        select new BoolTextCouple(!handledRequest.Buchungstexts.Contains(g.Key), g.Key);

                    return(new ObservableCollection <BoolTextCouple>(res));
                }
                catch (Exception e)
                {
                    MessageBox.Show(e.Message + "**BuisenessLogicSSKA-GetBuchungstextOverDateRange**",
                                    Config.AppName + ": Unable to get Data", MessageBoxButton.OK, MessageBoxImage.Error);
                }
            }
            else
            {
                try
                {
                    var res =
                        from r in CsvToXmlSSKA.DataSource.DescendantsAndSelf(Config.TransactionField)
                        where DateTime.Parse(r.Element(Config.WertDatumField).Value) >= handledRequest.BeginDate &&
                        DateTime.Parse(r.Element(Config.WertDatumField).Value) <= handledRequest.FinishDate &&
                        !handledRequest.Accounts.Contains(r.Attribute(Config.AuftragsKontoField).Value)
                        group r.Element(Config.WertDatumField).Value by r.Element(Config.BuchungsTextField).Value into g

                        select new BoolTextCouple(true, g.Key);

                    return(new ObservableCollection <BoolTextCouple>(res));
                }
                catch (Exception e)
                {
                    MessageBox.Show(e.Message + "**BuisenessLogicSSKA-GetBuchungstextOverDateRange**",
                                    Config.AppName + ": Unable to get Data", MessageBoxButton.OK, MessageBoxImage.Error);
                }
            }
            return(null);
        }
        protected List <string> GetTransactionsAccounts(DataRequest request)
        {
            PreprocessedDataRequest handledRequest = HandleRequest(request);

            try
            {
                var accs =
                    from r in CsvToXmlSSKA.DataSource.DescendantsAndSelf(Config.TransactionField)
                    where DateTime.Parse(r.Element(Config.WertDatumField).Value) >= handledRequest.BeginDate &&
                    DateTime.Parse(r.Element(Config.WertDatumField).Value) <= handledRequest.FinishDate &&
                    !handledRequest.Accounts.Contains(r.Attribute(Config.AuftragsKontoField).Value)
                    select r.Attribute(Config.AuftragsKontoField).Value;

                return(accs.Distinct <string>().ToList <string>());
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message + "**BuisenessLogicSSKA-GetTransactionsAccounts**",
                                Config.AppName + ": Unable to get Accounts", MessageBoxButton.OK, MessageBoxImage.Error);
            }
            return(null);
        }