Exemplo n.º 1
0
        public static Tilgungsplan BerechnePlanFesteAnnuitaet(Darlehen kredit)
        {
            Tilgungsplan plan = new Tilgungsplan();
            plan.Kredit = kredit;

            ////Annuität aus Anfangstilgung berechnen

            bool weiterRechnen = true;

            Annuitaet aktuelleAnnuitaet = null;
            Annuitaet letzteAnnuitaet = null;

            ////Erste Annuitaet besetzen
            var tilgungVorBeginn = kredit.Tilgungen.Where(an => an.Zeitpunkt <= kredit.BeginnTilgung);
            if (aktuelleAnnuitaet == null)
            {
                aktuelleAnnuitaet = new Annuitaet();
            }

            aktuelleAnnuitaet.Zahlungsdatum = kredit.BeginnTilgung;
            aktuelleAnnuitaet.DarlehenssumeVorZahlung = kredit.Summe;
            double effZins = kredit.Zinszeitraeume[0].GetZinssatzProPeriode(kredit.Auszahlungstag, aktuelleAnnuitaet.Zahlungsdatum);
            aktuelleAnnuitaet.Zins = new Zinszahlung(effZins, kredit.Summe, aktuelleAnnuitaet.Zahlungsdatum);

            plan.FesteAnnuitaet = aktuelleAnnuitaet.Zins.Zins + (kredit.Summe * kredit.Anfangstilgung) / 12.0;

            aktuelleAnnuitaet.Tilgungen.Add(new Tilgungszahlung(plan.FesteAnnuitaet - aktuelleAnnuitaet.Zins.Zins, aktuelleAnnuitaet.Zahlungsdatum));
            foreach (Tilgungszahlung tilg in tilgungVorBeginn)
            {
                ////Sondertilgungen werden mit der Annuität gemeinsam verrechnet
                tilg.Zeitpunkt = aktuelleAnnuitaet.Zahlungsdatum;
                aktuelleAnnuitaet.Tilgungen.Add(tilg);
            }

            kredit.Annuitaeten.Add(aktuelleAnnuitaet);

            LocalDateTime zahlungLetzteAnnuitaet = aktuelleAnnuitaet.Zahlungsdatum;

            letzteAnnuitaet = aktuelleAnnuitaet;

            while (weiterRechnen)
            {
                LocalDateTime zahlungsDatumDieseAnnuitaet = zahlungLetzteAnnuitaet + kredit.Zahlungsperiode;

                Zinsfestschreibung aktuelleFestschreibung = kredit.Zinszeitraeume.FirstOrDefault(an =>
                    an.ZeitpunktFestschreibung <= zahlungsDatumDieseAnnuitaet
                    && an.ZeitpunktAuslauf >= zahlungsDatumDieseAnnuitaet);

                if (aktuelleFestschreibung == null)
                {
                    throw new ArgumentOutOfRangeException("Keine Zinsfestschreibung für Annuität vom " + zahlungsDatumDieseAnnuitaet.ToString() + " gefunden!");
                }

                ////Sondertilgungen seit letzter Annuitaet ermitteln
                tilgungVorBeginn = kredit.Tilgungen.Where(an =>
                    an.Zeitpunkt <= zahlungsDatumDieseAnnuitaet
                    && an.Zeitpunkt > zahlungLetzteAnnuitaet);

                aktuelleAnnuitaet = new Annuitaet();
                aktuelleAnnuitaet.Zahlungsdatum = zahlungsDatumDieseAnnuitaet;
                aktuelleAnnuitaet.DarlehenssumeVorZahlung = letzteAnnuitaet.DarlehenssummeNachZahlung;
                aktuelleAnnuitaet.Zins = new Zinszahlung(aktuelleFestschreibung.GetZinssatzProPeriode(zahlungLetzteAnnuitaet, aktuelleAnnuitaet.Zahlungsdatum), aktuelleAnnuitaet.DarlehenssumeVorZahlung, aktuelleAnnuitaet.Zahlungsdatum);

                Tilgungszahlung annuitaetsTilgung = new Tilgungszahlung(plan.FesteAnnuitaet - aktuelleAnnuitaet.Zins.Zins, aktuelleAnnuitaet.Zahlungsdatum);

                aktuelleAnnuitaet.Tilgungen.Add(annuitaetsTilgung);

                double betragSondertilgungen = 0;

                foreach (Tilgungszahlung tilg in tilgungVorBeginn)
                {
                    ////Sondertilgungen werden mit der Annuität gemeinsam verrechnet
                    tilg.Zeitpunkt = aktuelleAnnuitaet.Zahlungsdatum;
                    aktuelleAnnuitaet.Tilgungen.Add(tilg);
                    betragSondertilgungen += tilg.Betrag;
                }

                kredit.Annuitaeten.Add(aktuelleAnnuitaet);
                if (aktuelleAnnuitaet.DarlehenssummeNachZahlung < 0)
                {
                    annuitaetsTilgung.Betrag = letzteAnnuitaet.DarlehenssummeNachZahlung - betragSondertilgungen;
                    weiterRechnen = false;
                }
                else if (aktuelleAnnuitaet.DarlehenssummeNachZahlung == 0)
                {
                    weiterRechnen = false;
                }
                letzteAnnuitaet = aktuelleAnnuitaet;
                zahlungLetzteAnnuitaet = letzteAnnuitaet.Zahlungsdatum;
            }

            return plan;
        }
Exemplo n.º 2
0
 public override object Clone()
 {
     Annuitaet klone = new Annuitaet();
     klone.Initialisiere(this);
     return klone;
 }
Exemplo n.º 3
0
        public static void BerechneTilgungsplanFesteAnnuitaet(Finanzierung finanzierung)
        {
            ////Gesamte Annuität berechnen
            ////Alle Zinszahlungen addieren
            //double gesamtannuitaet = 0;

            //foreach(Darlehen dar in finanzierung.Quellen)
            //{
            //    LocalDateTime startZinszahlung = dar.BeginnZinsZahlung;
            //    LocalDateTime endeZinszahlung = dar.BeginnZinsZahlung + dar.Zahlungsperiode;

            //    Zinsfestschreibung ersteFestschreibung = Zinsfestschreibung.GetZinsfestschreibung(startZinszahlung, dar.Zinszeitraeume);

            //    if (ersteFestschreibung == null)
            //        throw new ArgumentNullException("Keine Zinsfestschreibung gefunden!");

            //    double jahreszins = ersteFestschreibung.Zinssatz;

            //    gesamtannuitaet += Zinsfestschreibung.GetZinssatzFuerPeriode(startZinszahlung, endeZinszahlung, jahreszins);

            //    gesamtannuitaet += dar.Anfangstilgung * dar.Summe / 12.0;
            //}

            double ueberschuessigeRegelmaessigeTilgung = 0;
            double ueberschuessigeErsteTilgung = 0;
            LocalDateTime ldt_DefaultValue = new LocalDateTime(0, 1, 1, 0, 1);
            LocalDateTime beginnUeberschuessigeTilgung = ldt_DefaultValue;

            List<Tilgungszahlung> ueberschuessigeSondertilgungen = null;

            ////Tilgungen aus Vorlagen erstellen
            foreach(Darlehen dar in finanzierung.Quellen)
            {
                List<Tilgungszahlung> tilgungVorlagen = new List<Tilgungszahlung>(dar.Tilgungen.Where(til => til.ArtDerVorlage != TilgungVorlageArt.Einmalig));

                foreach(Tilgungszahlung tilg in tilgungVorlagen)
                {
                    var neueTilgungen = Tilgungszahlung.GetListTilgungen(tilg);
                    foreach(Tilgungszahlung ti in neueTilgungen)
                    {
                        dar.Tilgungen.Add(ti);
                    }

                    dar.Tilgungen.Remove(tilg);
                }
            }

            for(int prioCounter = 0; prioCounter < finanzierung.Quellen.Count; prioCounter++)
            {
                Darlehen dar = finanzierung.Quellen.FirstOrDefault(da => da.Prioritaet == prioCounter);

                if(ueberschuessigeSondertilgungen != null)
                {
                    foreach(Tilgungszahlung tilg in ueberschuessigeSondertilgungen)
                    {
                        dar.Tilgungen.Add(tilg);
                    }
                }

                List<Tilgungszahlung> auszahlungen = new List<Tilgungszahlung>();

                foreach(Tilgungszahlung tilgungsz in dar.Tilgungen)
                {
                    if(tilgungsz.Betrag < 0.0)
                    {
                        auszahlungen.Add(tilgungsz);
                    }
                }

                foreach(Tilgungszahlung ausz in auszahlungen)
                {
                    dar.Tilgungen.Remove(ausz);
                }

                bool weiterrechnen = true;

                Annuitaet aktuelleAnnuitaet = null;
                Annuitaet letzteAnnuitaet = null;

                ////Kontostand vor Beginn der Tilgung
                double kontostandVorTilgung = 0.0;

                ////Erste Annuitaet besetzen

                aktuelleAnnuitaet = new Annuitaet();
                aktuelleAnnuitaet.Zahlungsdatum = dar.BeginnZinsZahlung;

                ////Auszahlungen
                List<Tilgungszahlung> auszahlungenVorBeginn = new List<Tilgungszahlung>(auszahlungen.Where(tilg => (tilg.Zeitpunkt <= aktuelleAnnuitaet.Zahlungsdatum)));

                foreach (Tilgungszahlung ausz in auszahlungenVorBeginn)
                {
                    aktuelleAnnuitaet.Tilgungen.Add(ausz);

                    ////Da Auszahlungen negativ sind, der Kontostand aber für
                    ////einen Kredit positiv, muss hier Subtrahiert werden
                    kontostandVorTilgung -= ausz.Betrag;
                }

                foreach (Tilgungszahlung ausz in aktuelleAnnuitaet.Tilgungen)
                {
                    auszahlungen.Remove(ausz);
                }

                aktuelleAnnuitaet.DarlehenssumeVorZahlung = 0.0;

                Zinsfestschreibung festschr = dar.Zinszeitraeume.FirstOrDefault(zz => zz.ZeitpunktFestschreibung <= aktuelleAnnuitaet.Zahlungsdatum
                                                                    && zz.ZeitpunktAuslauf >= dar.BeginnZinsZahlung);

                if(festschr == null)
                    throw new ArgumentOutOfRangeException("Keine Zinsfestschreibung gefunden!");

                double effZins = festschr.GetZinssatzProPeriode(dar.Auszahlungstag, aktuelleAnnuitaet.Zahlungsdatum);

                aktuelleAnnuitaet.Zins = new Zinszahlung(effZins, kontostandVorTilgung, aktuelleAnnuitaet.Zahlungsdatum);

                ////Der feste Betrag der Annuitaeten
                double annuitaet = aktuelleAnnuitaet.Zins.Zins;
                double ersteTilgung = festschr.Anfangstilgung;

                if (aktuelleAnnuitaet.Zahlungsdatum >= dar.BeginnTilgung)
                {

                    annuitaet = ersteTilgung + aktuelleAnnuitaet.Zins.Zins;

                    dar.Annuitaet = annuitaet;

                    Tilgungszahlung ersteTilgungszahlung = new Tilgungszahlung(ersteTilgung, aktuelleAnnuitaet.Zahlungsdatum);
                    ersteTilgungszahlung.IsRegelm = true;
                    if (ersteTilgungszahlung.Betrag > 0.0)
                    {
                        aktuelleAnnuitaet.Tilgungen.Add(ersteTilgungszahlung);
                    }

                    if (beginnUeberschuessigeTilgung != ldt_DefaultValue && beginnUeberschuessigeTilgung <= aktuelleAnnuitaet.Zahlungsdatum && aktuelleAnnuitaet.DarlehenssummeNachZahlung > 0)
                    {
                        if (ueberschuessigeErsteTilgung > 0)
                        {

                            if(aktuelleAnnuitaet.DarlehenssummeNachZahlung >= ueberschuessigeErsteTilgung)
                            {
                                aktuelleAnnuitaet.Tilgungen.Add(new Tilgungszahlung(ueberschuessigeErsteTilgung, aktuelleAnnuitaet.Zahlungsdatum));
                                ueberschuessigeErsteTilgung = 0;
                            }
                            else
                            {
                                ueberschuessigeErsteTilgung -= aktuelleAnnuitaet.DarlehenssummeNachZahlung;
                                aktuelleAnnuitaet.Tilgungen.Add(new Tilgungszahlung(aktuelleAnnuitaet.DarlehenssummeNachZahlung, aktuelleAnnuitaet.Zahlungsdatum));
                            }
                        }
                        else if (ueberschuessigeRegelmaessigeTilgung > 0)
                        {
                            aktuelleAnnuitaet.Tilgungen.Add(new Tilgungszahlung(ueberschuessigeRegelmaessigeTilgung, aktuelleAnnuitaet.Zahlungsdatum));
                        }
                    }
                    else if(aktuelleAnnuitaet.DarlehenssummeNachZahlung <= 0)
                    {
                        double ueberschuss = aktuelleAnnuitaet.DarlehenssummeNachZahlung;
                        ersteTilgungszahlung.Betrag += ueberschuss;
                        ueberschuessigeErsteTilgung -= ueberschuss;
                    }

                }

                dar.Annuitaeten.Add(aktuelleAnnuitaet);
                festschr.Restsumme = aktuelleAnnuitaet.DarlehenssummeNachZahlung;

                weiterrechnen = aktuelleAnnuitaet.Zahlungsdatum <= dar.BeginnTilgung || aktuelleAnnuitaet.DarlehenssummeNachZahlung > 0;

                LocalDateTime zahlungLetzteAnnuitaet = aktuelleAnnuitaet.Zahlungsdatum;

                bool schalterErsteTilgung = true;

                Zinsfestschreibung alteZinsfestschreibung = null;

                while(weiterrechnen)
                {
                    letzteAnnuitaet = aktuelleAnnuitaet;
                    LocalDateTime zahlungsDatumDieseAnnuitaet = zahlungLetzteAnnuitaet + dar.Zahlungsperiode;

                    Zinsfestschreibung aktuelleFestschreibung = dar.Zinszeitraeume.FirstOrDefault(zf =>
                                                zf.ZeitpunktFestschreibung <= zahlungsDatumDieseAnnuitaet
                                                && zf.ZeitpunktAuslauf >= zahlungsDatumDieseAnnuitaet);

                    if(aktuelleFestschreibung == null)
                    {
                        throw new ArgumentOutOfRangeException("Keine Zinsfestschreibung für Annuität vom " + zahlungsDatumDieseAnnuitaet.ToString() + " gefunden! Restbetrag " + letzteAnnuitaet.DarlehenssummeNachZahlung.ToString("C2"));
                    }

                    bool zinswechsel = aktuelleFestschreibung != alteZinsfestschreibung;

                    aktuelleAnnuitaet = new Annuitaet();
                    aktuelleAnnuitaet.Zahlungsdatum = zahlungsDatumDieseAnnuitaet;
                    aktuelleAnnuitaet.DarlehenssumeVorZahlung = letzteAnnuitaet.DarlehenssummeNachZahlung;
                    aktuelleAnnuitaet.Zins = new Zinszahlung(aktuelleFestschreibung.GetZinssatzProPeriode(zahlungLetzteAnnuitaet, aktuelleAnnuitaet.Zahlungsdatum), aktuelleAnnuitaet.DarlehenssumeVorZahlung, aktuelleAnnuitaet.Zahlungsdatum);

                    auszahlungenVorBeginn = new List<Tilgungszahlung>(auszahlungen.Where(tilg => (tilg.Zeitpunkt <= aktuelleAnnuitaet.Zahlungsdatum)));

                    foreach (Tilgungszahlung ausz in auszahlungenVorBeginn)
                    {
                        aktuelleAnnuitaet.Tilgungen.Add(ausz);
                    }

                    foreach (Tilgungszahlung ausz in aktuelleAnnuitaet.Tilgungen)
                    {
                        auszahlungen.Remove(ausz);
                    }

                    dar.Annuitaeten.Add(aktuelleAnnuitaet);

                    if (aktuelleAnnuitaet.Zahlungsdatum >= dar.BeginnTilgung)
                    {
                        ////Sondertilgungen seit letzter Annuitaet ermitteln
                        var tilgungVorBeginn = dar.Tilgungen.Where(an =>
                            an.Zeitpunkt <= zahlungsDatumDieseAnnuitaet
                            && an.Zeitpunkt > zahlungLetzteAnnuitaet);

                        if(schalterErsteTilgung || zinswechsel)
                        {
                            ersteTilgung = aktuelleFestschreibung.Anfangstilgung;
                            annuitaet = ersteTilgung + aktuelleAnnuitaet.DarlehenssumeVorZahlung * aktuelleFestschreibung.Zinssatz / 12.0;
                            dar.Annuitaet = annuitaet;
                            schalterErsteTilgung = false;
                        }

                        if (annuitaet <= 0.0)
                        {
                            annuitaet = aktuelleAnnuitaet.Zins.Zins + aktuelleFestschreibung.Anfangstilgung;
                        }

                        Tilgungszahlung annuitaetsTilgung = new Tilgungszahlung(annuitaet - aktuelleAnnuitaet.Zins.Zins, aktuelleAnnuitaet.Zahlungsdatum);
                        annuitaetsTilgung.IsRegelm = true;
                        if (annuitaetsTilgung.Betrag > 0.0)
                        {
                            aktuelleAnnuitaet.Tilgungen.Add(annuitaetsTilgung);
                        }

                        double betragSondertilgungen = 0;

                        foreach (Tilgungszahlung tilg in tilgungVorBeginn)
                        {
                            ////Sondertilgungen werden mit der Annuität gemeinsam verrechnet
                            tilg.Zeitpunkt = aktuelleAnnuitaet.Zahlungsdatum;
                            aktuelleAnnuitaet.Tilgungen.Add(tilg);
                            betragSondertilgungen += tilg.Betrag;
                        }

                        if (beginnUeberschuessigeTilgung != ldt_DefaultValue && beginnUeberschuessigeTilgung <= aktuelleAnnuitaet.Zahlungsdatum && aktuelleAnnuitaet.DarlehenssummeNachZahlung > 0)
                        {
                            if (ueberschuessigeErsteTilgung > 0)
                            {

                                if (aktuelleAnnuitaet.DarlehenssummeNachZahlung >= ueberschuessigeErsteTilgung)
                                {
                                    aktuelleAnnuitaet.Tilgungen.Add(new Tilgungszahlung(ueberschuessigeErsteTilgung, aktuelleAnnuitaet.Zahlungsdatum));
                                    ueberschuessigeErsteTilgung = 0;
                                }
                                else
                                {
                                    ueberschuessigeErsteTilgung -= aktuelleAnnuitaet.DarlehenssummeNachZahlung;
                                    aktuelleAnnuitaet.Tilgungen.Add(new Tilgungszahlung(aktuelleAnnuitaet.DarlehenssummeNachZahlung, aktuelleAnnuitaet.Zahlungsdatum));
                                }
                            }
                            else if (ueberschuessigeRegelmaessigeTilgung > 0)
                            {
                                if (ueberschuessigeRegelmaessigeTilgung <= aktuelleAnnuitaet.DarlehenssummeNachZahlung)
                                {
                                    aktuelleAnnuitaet.Tilgungen.Add(new Tilgungszahlung(ueberschuessigeRegelmaessigeTilgung, aktuelleAnnuitaet.Zahlungsdatum));
                                }
                                else
                                {
                                    double differenz = ueberschuessigeRegelmaessigeTilgung - aktuelleAnnuitaet.DarlehenssummeNachZahlung;
                                    aktuelleAnnuitaet.Tilgungen.Add(new Tilgungszahlung(aktuelleAnnuitaet.DarlehenssummeNachZahlung, aktuelleAnnuitaet.Zahlungsdatum));
                                    ueberschuessigeErsteTilgung += differenz;
                                }
                            }
                        }
                        else if (aktuelleAnnuitaet.DarlehenssummeNachZahlung <= 0)
                        {
                            double ueberschuss = aktuelleAnnuitaet.DarlehenssummeNachZahlung;

                            foreach (Tilgungszahlung tilgSonder in aktuelleAnnuitaet.Tilgungen.Where(til => !til.IsRegelm))
                            {
                                ////Überschuss noch vorhanden
                                if (ueberschuss < 0)
                                {
                                    if (Math.Abs(ueberschuss) > tilgSonder.Betrag)
                                    {
                                        ueberschuss += tilgSonder.Betrag;
                                        ueberschuessigeErsteTilgung += tilgSonder.Betrag;
                                        tilgSonder.Betrag = 0.0;
                                    }
                                    else
                                    {
                                        tilgSonder.Betrag += ueberschuss;
                                        ueberschuessigeErsteTilgung -= ueberschuss;
                                        ueberschuss = 0.0;
                                    }
                                }
                                else
                                {
                                    break;
                                }
                            }

                            if (ueberschuss < 0.0)
                            {
                                annuitaetsTilgung.Betrag += ueberschuss;
                                ueberschuessigeErsteTilgung -= ueberschuss;
                            }
                            weiterrechnen = false;
                        }
                    }

                    //if (aktuelleAnnuitaet.DarlehenssummeNachZahlung < 0)
                    //{
                    //    ueberschuessigeErsteTilgung -= aktuelleAnnuitaet.DarlehenssummeNachZahlung;
                    //    annuitaetsTilgung.Betrag -=letzteAnnuitaet.DarlehenssummeNachZahlung;
                    //    weiterrechnen = false;
                    //}
                    //else if (aktuelleAnnuitaet.DarlehenssummeNachZahlung == 0)
                    //{
                    //    weiterrechnen = false;
                    //}
                    aktuelleFestschreibung.Restsumme = aktuelleAnnuitaet.DarlehenssummeNachZahlung;
                    letzteAnnuitaet = aktuelleAnnuitaet;
                    alteZinsfestschreibung = aktuelleFestschreibung;

                    zahlungLetzteAnnuitaet = letzteAnnuitaet.Zahlungsdatum;

                }

                ueberschuessigeRegelmaessigeTilgung += annuitaet;
                beginnUeberschuessigeTilgung = aktuelleAnnuitaet.Zahlungsdatum;
                ueberschuessigeSondertilgungen = new List<Tilgungszahlung>(dar.Tilgungen.Where(tz => tz.Zeitpunkt > aktuelleAnnuitaet.Zahlungsdatum));

                foreach(Tilgungszahlung ueberTilg in ueberschuessigeSondertilgungen)
                {
                    dar.Tilgungen.Remove(ueberTilg);
                }

                dar.IsCalculated = true;
            }

            finanzierung.DatumErledigung = new LocalDateTime();

            foreach(Darlehen dar in finanzierung.Quellen.Where(da => da.IsCalculated))
            {
                finanzierung.Gesamtannuitaet += dar.Annuitaet;
                if(finanzierung.DatumErledigung < dar.Annuitaeten[dar.Annuitaeten.Count -1].Zahlungsdatum)
                {
                    finanzierung.DatumErledigung = dar.Annuitaeten[dar.Annuitaeten.Count - 1].Zahlungsdatum;
                }
            }
        }