internal Factuur Genereer()
        {
            Boolean found          = false;
            Factuur Factuur        = null;
            Decimal EreloonBedrag  = 0;
            Decimal ProvisieBedrag = 0;

            if (0 != EreloonNotas.Count())
            {
                EreloonBedrag = EreloonNotas.Sum(p => p.Totaal);
                if (EreloonNotas.Any(p => p.Facturen.Any()))
                {
                    EreloonBedrag -= EreloonNotas.Sum(p => p.Facturen.Sum(f => f.Totaal));
                }
                ;
            }

            if (0 != Provisies.Count())
            {
                ProvisieBedrag = Provisies.Sum(p => p.Totaal);
                if (Provisies.Any(p => p.Facturen.Any()))
                {
                    ProvisieBedrag -= Provisies.Sum(p => p.Facturen.Sum(f => f.Totaal));
                }
            }

            if (Bedrag == EreloonBedrag)
            {
                // Bedrag = som van openstaande bedragen voor ereloonnota's
                Factuur = new EreloonNotaFactuur(EreloonNotas, Bedrag);
                // Sluit Ereloonnotas af
                foreach (var EreloonNota in EreloonNotas)
                {
                    EreloonNota.Close(Factuur);
                }
                found = true;
            }
            else if (Bedrag < EreloonBedrag)
            {
                // Kijk of Bedrag het bedrag van 1 ereloonnota is.
                foreach (var EreloonNota in EreloonNotas)
                {
                    if (Bedrag == EreloonNota.Totaal)
                    {
                        // EreloonNota gevonden
                        Factuur = new EreloonNotaFactuur(EreloonNota.ToQueryable(), Bedrag);
                        EreloonNota.Close(Factuur);
                        found = true;
                        // Spring uit lus
                        break;
                    }
                }
            }

            if (Bedrag == ProvisieBedrag && !found)
            {
                // Bedrag = som van openstaande bedragen voor provisies's
                Factuur = new ProvisieFactuur(Provisies, Bedrag);
                // Sluit provisies af
                foreach (var Provisie in Provisies)
                {
                    Provisie.Close(Factuur);
                }
                found = true;
            }
            else if (Bedrag < ProvisieBedrag && !found)
            {
                // Kijk of Bedrag het bedrag van 1 provisie is
                foreach (var Provisie in Provisies)
                {
                    if (Bedrag == Provisie.Totaal)
                    {
                        // Provisie gevonden
                        Factuur = new ProvisieFactuur(Provisie.ToQueryable(), Bedrag);
                        Provisie.Close(Factuur);
                        found = true;
                        //spring uit lus
                        break;
                    }
                }
            }

            if (found && Factuur != null)
            {
                Factuur.PrintText(Globals.CoCoCo_Facturatie_Plugin.Application.Selection);
            }
            else
            {
                throw new NotImplementedException();
            }

            return(Factuur);
        }