public static void ReturnClassicSchedule(decimal SumaKredytu, int StrokKredytu, List <ProcStawka> ListStawok, DateTime DataRozrahunku, DateTime DataPo4atkuProc, DateTime DataPershogoPlatezhu, DateTime DataOplatyKredytu, out List <Schedule> ResultList) { ResultList = new List <Schedule>(); SchedulesClass Schedules = new SchedulesClass(); int i = 0; decimal Tilo = 0; bool ChyTiloZero = false; if (Schedules.IfBodyIsZero(DataPo4atkuProc, DataPershogoPlatezhu)) { ChyTiloZero = true; Tilo = (SumaKredytu / StrokKredytu); } else if (Schedules.IfIncreaseStrokKredytu(DataRozrahunku, DataPershogoPlatezhu)) { Tilo = (SumaKredytu / (StrokKredytu + 1)); } else { Tilo = (SumaKredytu / StrokKredytu); } Tilo = MyMath.Round(Tilo, 2); if (Schedules.IfIncreaseStrokKredytu(DataRozrahunku, DataPershogoPlatezhu)) { StrokKredytu = StrokKredytu + 1; } ResultList.Clear(); DateTime DataStart = DataPo4atkuProc; DateTime DataEnd = DataPershogoPlatezhu; DateTime DataEndTilo = DateTime.MinValue; decimal OstatokKredytu = SumaKredytu; decimal TiloFull = 0; decimal ProcentFull = 0; decimal WnesokFull = 0; i = 0; int s = 0; DateTime DataZminy = DateTime.MinValue; while (true) { if (DataEnd.Day == 1) { DataEndTilo = DataEnd.AddDays(-1); } else { DataEndTilo = DataEnd; } Schedule Schedule = new Schedule(); DataZminy = DataRozrahunku.AddMonths(ListStawok[s].Period); bool ChyZminaStawky = DataStart <DataZminy && DataEnd> DataZminy && ListStawok.Count > s + 1; if (DataEndTilo != DataEnd) { if (ChyZminaStawky && DataEndTilo > DataZminy) { Schedule.Proc = Schedules.SumaProcWPeriodi(OstatokKredytu, ListStawok[s].Stawka, DataStart, DataZminy) + Schedules.SumaProcWPeriodi(OstatokKredytu, ListStawok[s + 1].Stawka, DataZminy, DataEndTilo) + Schedules.SumaProcWPeriodi(Math.Max(OstatokKredytu - Tilo, 0), ListStawok[s + 1].Stawka, DataEndTilo, DataEnd); s++; } else if (ChyZminaStawky) { Schedule.Proc = Schedules.SumaProcWPeriodi(OstatokKredytu, ListStawok[s].Stawka, DataStart, DataZminy) + Schedules.SumaProcWPeriodi(Math.Max(OstatokKredytu - Tilo, 0), ListStawok[s + 1].Stawka, DataZminy, DataEnd); s++; } else if (ChyTiloZero) { Schedule.Proc = Schedules.SumaProcWPeriodi(OstatokKredytu, ListStawok[s].Stawka, DataStart, DataEnd); } else { Schedule.Proc = Schedules.SumaProcWPeriodi(OstatokKredytu, ListStawok[s].Stawka, DataStart, DataEndTilo) + Schedules.SumaProcWPeriodi(Math.Max(OstatokKredytu - Tilo, 0), ListStawok[s].Stawka, DataEndTilo, DataEnd); } } else { if (ChyZminaStawky) { Schedule.Proc = Schedules.SumaProcWPeriodi(OstatokKredytu, ListStawok[s].Stawka, DataStart, DataZminy) + Schedules.SumaProcWPeriodi(OstatokKredytu, ListStawok[s + 1].Stawka, DataZminy, DataEnd); s++; } else { Schedule.Proc = Schedules.SumaProcWPeriodi(OstatokKredytu, ListStawok[s].Stawka, DataStart, DataEnd); } } Schedule.Proc = MyMath.Round(Schedule.Proc, 2); if (ChyTiloZero) { Schedule.Tilo = 0; ChyTiloZero = false; } else if (Tilo < OstatokKredytu - Tilo / 2) { Schedule.Tilo = Tilo; } else { Schedule.Tilo = OstatokKredytu; } Schedule.Ostatok = OstatokKredytu - Schedule.Tilo; Schedule.OplataDateTime = DataEnd; Schedule.Oplata = DataEnd.ToString("dd.MM.yyyy"); DataStart = DataEnd; if (DataPershogoPlatezhu.AddMonths(i + 1) > DataOplatyKredytu) { DataEnd = DataOplatyKredytu; } else { DataEnd = DataPershogoPlatezhu.AddMonths(i + 1); } OstatokKredytu = OstatokKredytu - Schedule.Tilo; Schedule.Platizh = Schedule.Proc + Schedule.Tilo; TiloFull = TiloFull + Schedule.Tilo; ProcentFull = ProcentFull + Schedule.Proc; WnesokFull = WnesokFull + Schedule.Platizh; ResultList.Add(Schedule); i++; if (OstatokKredytu <= 0 || i > StrokKredytu) { break; } } }
public static void ReturnAnnuitySchedule(decimal SumaKredytu, int StrokKredytu, List <ProcStawka> ListStawok, decimal Komisiya, DateTime DataRozrahunku, DateTime DataPo4atkuProc, DateTime DataPershogoPlatezhu, DateTime DataOplatyKredytu, out List <Schedule> ResultList) { ResultList = new List <Schedule>(); SchedulesClass Schedules = new SchedulesClass(); int i = 0; decimal StawkaMax = 0; decimal SumaAnuiteta = 0; decimal SumaKomisiyi = MyMath.Round((SumaKredytu * Komisiya / 100), 2); foreach (ProcStawka s in ListStawok) { StawkaMax = Math.Max(StawkaMax, s.Stawka); } decimal MinSumaAnuiteta = 0; if (Schedules.IfIncreaseStrokKredytu(DataRozrahunku, DataPershogoPlatezhu)) { StrokKredytu = StrokKredytu + 1; } MinSumaAnuiteta = (SumaKredytu / StrokKredytu) + SumaKomisiyi; decimal MaxSumaProcZaMisyac = SumaKredytu * 31 * StawkaMax / 36000; decimal MaxSumaAnuiteta = SumaAnuiteta; if (SumaAnuiteta == 0) { MaxSumaAnuiteta = MinSumaAnuiteta + MaxSumaProcZaMisyac; } bool KinecObrahunku = false; bool ChyTiloZero = false; while (true) { ResultList.Clear(); ChyTiloZero = Schedules.IfBodyIsZero(DataPo4atkuProc, DataPershogoPlatezhu); DateTime DataStart = DataPo4atkuProc; DateTime DataEnd = DataPershogoPlatezhu; decimal OstatokKredytu = SumaKredytu; SumaAnuiteta = (MinSumaAnuiteta + MaxSumaAnuiteta) / 2; i = 0; int s = 0; DateTime DataZminy = DateTime.MinValue; while (true) { Schedule Schedule = new Schedule(); Schedule.SumaKomisiyi = SumaKomisiyi; DataZminy = DataRozrahunku.AddMonths(ListStawok[s].Period); bool ChyZminaStawky = DataStart <= DataZminy && DataEnd > DataZminy && ListStawok.Count > s + 1; if (ChyZminaStawky) { Schedule.Proc = Schedules.SumaProcWPeriodi(OstatokKredytu, ListStawok[s].Stawka, DataStart, DataZminy) + Schedules.SumaProcWPeriodi(OstatokKredytu, ListStawok[s + 1].Stawka, DataZminy, DataEnd); s++; } else { Schedule.Proc = Schedules.SumaProcWPeriodi(OstatokKredytu, ListStawok[s].Stawka, DataStart, DataEnd); } if (KinecObrahunku) { Schedule.Proc = MyMath.Round(Schedule.Proc, 2); } if (SumaAnuiteta - SumaKomisiyi >= OstatokKredytu - (SumaAnuiteta - SumaKomisiyi) / 2 && (i + 1) == StrokKredytu) { Schedule.Tilo = OstatokKredytu; } else if (ChyTiloZero) { Schedule.Tilo = 0; } else { Schedule.Tilo = Math.Min(OstatokKredytu, Math.Max(SumaAnuiteta - Schedule.Proc - SumaKomisiyi, 0)); } Schedule.Ostatok = OstatokKredytu - Schedule.Tilo; Schedule.OplataDateTime = DataEnd; Schedule.Oplata = DataEnd.ToString("dd.MM.yyyy"); DataStart = DataEnd; if (DataPershogoPlatezhu.AddMonths(i + 1) > DataOplatyKredytu) { DataEnd = DataOplatyKredytu; } else { DataEnd = DataPershogoPlatezhu.AddMonths(i + 1); } OstatokKredytu = OstatokKredytu - Schedule.Tilo; if (OstatokKredytu == 0) { Schedule.Platizh = Schedule.Proc + Schedule.Tilo + SumaKomisiyi; } else if (ChyTiloZero) { Schedule.Platizh = MyMath.Round(Schedule.Proc, 2); ChyTiloZero = false; } else { Schedule.Platizh = SumaAnuiteta; } ResultList.Add(Schedule); i++; if (OstatokKredytu <= 0 || i > StrokKredytu) { break; } } if (KinecObrahunku) { break; } else if ((MaxSumaAnuiteta - MinSumaAnuiteta) <= 0.001m) { MinSumaAnuiteta = MyMath.Round(SumaAnuiteta, 0); MaxSumaAnuiteta = MyMath.Round(SumaAnuiteta, 0); KinecObrahunku = true; } else if (i > StrokKredytu) { MinSumaAnuiteta = SumaAnuiteta; } else if (i < StrokKredytu) { MaxSumaAnuiteta = SumaAnuiteta; } else if (ResultList[i - 1].Platizh < SumaAnuiteta) { MaxSumaAnuiteta = SumaAnuiteta; } else { MinSumaAnuiteta = SumaAnuiteta; } } }