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; }
public override object Clone() { Annuitaet klone = new Annuitaet(); klone.Initialisiere(this); return klone; }
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; } } }