public static DateTime NastepnyDzien(DateTime changeDate)
 {
     for (int i = 0; i < 14; i++)
     {
         if (DataSplatyRaty.IsDayOff(changeDate))
         {
             changeDate = changeDate.AddDays(1);
         }
         else
         {
             break;
         }
     }
     return(changeDate);
 }
Example #2
0
        //----------RATY-MALEJACE--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

        public static DataTable Malejace(bool kalendarzRat, DateTime dataUruchomieniaKredytu,
                                         DateTime dataOstatniejRaty, double kwotaKredytu, int iloscRatKapitalowych,
                                         double oprocentowanieWStosunkuRocznym)
        {
            DataTable Hm = new DataTable();

            DateTime dataPierwszejRaty = new DateTime(dataUruchomieniaKredytu.Year,
                                                      dataUruchomieniaKredytu.Month, DateTime.DaysInMonth(dataUruchomieniaKredytu.Year,
                                                                                                          dataUruchomieniaKredytu.Month)); // data pierwszej raty to koniec pierwszego miesiąca funkcjonowania kredytu, niezależnie od daty spłaty pierwszej raty kapitałowej

            DateTime dataPierwszejRatyKapitalowej;                                                                                         //arbitralnie przyjąłem, że jeżeli kredyt będzie uruchomiony do 10 dnia miesiaca to rata kapitałowa płatna w bieżacym miesiącu

            if (dataUruchomieniaKredytu.Day <= 10)
            {
                dataPierwszejRatyKapitalowej = new DateTime(dataUruchomieniaKredytu.Year, dataUruchomieniaKredytu.Month, DateTime.DaysInMonth(dataUruchomieniaKredytu.Year, dataUruchomieniaKredytu.Month));
            }
            else
            {
                if (dataUruchomieniaKredytu.Month == 12)
                {
                    dataPierwszejRatyKapitalowej = new DateTime(dataUruchomieniaKredytu.AddYears(1).Year, 1, 31);
                }
                else
                {
                    dataPierwszejRatyKapitalowej = new DateTime(dataUruchomieniaKredytu.Year, dataUruchomieniaKredytu.AddMonths(1).Month, DateTime.DaysInMonth(dataUruchomieniaKredytu.Year, dataUruchomieniaKredytu.Month));
                }
            }

            DateTime dataSplaty = dataPierwszejRaty;

            int iloscRatKapitalowychWHarmonogramie;
            int iloscOkresowNaliczaniaOdsetek;

            if (kalendarzRat == true)
            {
                if (dataUruchomieniaKredytu.Day <= 10)
                {
                    iloscRatKapitalowychWHarmonogramie = iloscRatKapitalowych;
                    iloscOkresowNaliczaniaOdsetek      = iloscRatKapitalowychWHarmonogramie;
                }
                else
                {
                    iloscRatKapitalowychWHarmonogramie = iloscRatKapitalowych - 1;
                    iloscOkresowNaliczaniaOdsetek      = iloscRatKapitalowychWHarmonogramie + 1;
                }
            }
            else
            {
                iloscRatKapitalowychWHarmonogramie = (12 * (dataOstatniejRaty.Year - dataPierwszejRatyKapitalowej.Year) + 1 - dataPierwszejRatyKapitalowej.Month + dataOstatniejRaty.Month);
                iloscOkresowNaliczaniaOdsetek      = (12 * (dataOstatniejRaty.Year - dataUruchomieniaKredytu.Year) + 1 - dataUruchomieniaKredytu.Month + dataOstatniejRaty.Month);
            }

            Hm.Columns.Add("Nr");
            Hm.Columns.Add("Data Platności");
            Hm.Columns.Add("Saldo");
            Hm.Columns.Add("Kapital");
            Hm.Columns.Add("Odsetki");
            Hm.Columns.Add("Rata");

            double saldo = kwotaKredytu;
            double oprocentowanieDzienne   = oprocentowanieWStosunkuRocznym / 365;
            double odsetkiZaDzien          = saldo * oprocentowanieDzienne;
            double rataKapitalowa          = Math.Round(kwotaKredytu / iloscRatKapitalowychWHarmonogramie, 2);
            double pierwszaRataWyrownujaca = kwotaKredytu - Math.Round(rataKapitalowa * (iloscRatKapitalowychWHarmonogramie - 1), 2);

            int iloscDniWMiesiacu = DateTime.DaysInMonth(dataPierwszejRaty.Year, dataPierwszejRaty.Month);
            int dzienRozpoczeciaNaliczaniaOdsetek = dataUruchomieniaKredytu.Day;
            int dzienZakonczeniaNaliczaniaOdsetek = dataPierwszejRaty.Day;
            int iloscDniNaliczaniaOdsetek         = dzienZakonczeniaNaliczaniaOdsetek - dzienRozpoczeciaNaliczaniaOdsetek;

            double sumaOdsetek = 0;

            double schowekRatyKapitalowej = rataKapitalowa; // to pole przechowa kwotę raty na później - poniewaz pierwsza rata jest wyrównująca

            rataKapitalowa = pierwszaRataWyrownujaca;

            double SumaRatKapitalowych = 0;  // do weryfikacji czy kwota sie zgadza

            for (int Nr = 1; Nr <= iloscOkresowNaliczaniaOdsetek; Nr++)
            {
                if (dataSplaty < dataPierwszejRatyKapitalowej) // odsetki platne zawsze na koniec miesiąca
                {
                    rataKapitalowa = 0;
                }
                else if (dataSplaty == dataPierwszejRatyKapitalowej) // pierwsza rata wyrównująca
                {
                    rataKapitalowa = pierwszaRataWyrownujaca;
                }

                dataSplaty = DataSplatyRaty.NastepnyDzien(dataSplaty);

                if (kalendarzRat == false && dataSplaty >= dataOstatniejRaty) // harmonogram nie może wykroczyć poza okres spłaty kredytu
                {
                    dataSplaty     = dataOstatniejRaty;
                    rataKapitalowa = saldo;
                    dataSplaty     = DataSplatyRaty.NastepnyDzien(dataSplaty);
                }

                double OdsetkiZaOkres = Math.Round(iloscDniNaliczaniaOdsetek * oprocentowanieDzienne * saldo, 2);

                double KwotaRaty = rataKapitalowa + OdsetkiZaOkres;

                if (Nr == iloscOkresowNaliczaniaOdsetek)
                {
                    rataKapitalowa = saldo;
                }

                Hm.Rows.Add(new object[]
                {
                    Nr,
                    dataSplaty.ToString("D", CultureInfo.CreateSpecificCulture("pl-PL")),
                    saldo.ToString("0.00") + " zł",
                    rataKapitalowa.ToString("0.00") + " zł",
                    OdsetkiZaOkres.ToString("0.00") + " zł",
                    KwotaRaty.ToString("0.00") + " zł"
                });

                SumaRatKapitalowych = SumaRatKapitalowych + rataKapitalowa;

                saldo          = saldo - rataKapitalowa;
                rataKapitalowa = schowekRatyKapitalowej;

                if (dataSplaty.Day > 10)
                {
                    dataSplaty = new DateTime(dataSplaty.AddMonths(1).Year, dataSplaty.AddMonths(1).Month, DateTime.DaysInMonth(dataSplaty.AddMonths(1).Year, dataSplaty.AddMonths(1).Month));
                }
                else
                {
                    dataSplaty = new DateTime(dataSplaty.Year, dataSplaty.Month, DateTime.DaysInMonth(dataSplaty.Year, dataSplaty.Month));
                }

                iloscDniNaliczaniaOdsetek = DateTime.DaysInMonth(dataSplaty.Year, dataSplaty.Month);

                OdsetkiZaOkres = saldo * iloscDniNaliczaniaOdsetek * oprocentowanieDzienne;

                sumaOdsetek = sumaOdsetek + OdsetkiZaOkres;
            }

            return(Hm);
        }
Example #3
0
        //----------RATY-ROWNE--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

        public static DataTable Rowna(bool kalendarzRat, DateTime dataUruchomieniaKredytu,
                                      DateTime dataOstatniejRaty, double kwotaKredytu, int iloscRatKredytu,
                                      double oprocentowanieWStosunkuRocznym)
        {
            DataTable Hm = new DataTable();

            DateTime dataPierwszejRaty = new DateTime(dataUruchomieniaKredytu.Year,
                                                      dataUruchomieniaKredytu.Month, DateTime.DaysInMonth(dataUruchomieniaKredytu.Year,
                                                                                                          dataUruchomieniaKredytu.Month)); // data pierwszej raty to koniec pierwszego miesiąca funkcjonowania kredytu, niezależnie od daty spłaty pierwszej raty kapitałowej

            DateTime dataPierwszejRatyKapitalowej;                                                                                         //arbitralnie przyjąłem, że jeżeli kredyt będzie uruchomiony do 10 dnia miesiaca to 1 rata kapitałowa płatna w tym samym miesiącu

            if (dataUruchomieniaKredytu.Day <= 10)
            {
                dataPierwszejRatyKapitalowej = new DateTime(dataUruchomieniaKredytu.Year, dataUruchomieniaKredytu.Month, DateTime.DaysInMonth(dataUruchomieniaKredytu.Year, dataUruchomieniaKredytu.Month));
            }
            else
            {
                if (dataUruchomieniaKredytu.Month == 12)
                {
                    dataPierwszejRatyKapitalowej = new DateTime(dataUruchomieniaKredytu.AddYears(1).Year, 1, 31);
                }
                else
                {
                    dataPierwszejRatyKapitalowej = new DateTime(dataUruchomieniaKredytu.Year, dataUruchomieniaKredytu.AddMonths(1).Month, DateTime.DaysInMonth(dataUruchomieniaKredytu.Year, dataUruchomieniaKredytu.Month));
                }
            }

            DateTime dataSplaty = dataPierwszejRaty;

            int iloscRatKapitalowychWHarmonogramie;
            int iloscOkresowNaliczaniaOdsetek;

            if (kalendarzRat == true)
            {
                if (dataUruchomieniaKredytu.Day <= 10)
                {
                    iloscRatKapitalowychWHarmonogramie = iloscRatKredytu;
                    iloscOkresowNaliczaniaOdsetek      = iloscRatKapitalowychWHarmonogramie;
                }
                else
                {
                    iloscRatKapitalowychWHarmonogramie = iloscRatKredytu - 1;
                    iloscOkresowNaliczaniaOdsetek      = iloscRatKapitalowychWHarmonogramie + 1;
                }
            }
            else
            {
                iloscRatKapitalowychWHarmonogramie = (12 * (dataOstatniejRaty.Year - dataPierwszejRatyKapitalowej.Year) + 1 - dataPierwszejRatyKapitalowej.Month + dataOstatniejRaty.Month);
                iloscOkresowNaliczaniaOdsetek      = (12 * (dataOstatniejRaty.Year - dataUruchomieniaKredytu.Year) + 1 - dataUruchomieniaKredytu.Month + dataOstatniejRaty.Month);
            }

            Hm.Columns.Add("Nr");
            Hm.Columns.Add("Data Platności");
            Hm.Columns.Add("Saldo");
            Hm.Columns.Add("Kapital");
            Hm.Columns.Add("Odsetki");
            Hm.Columns.Add("Rata Razem");

            double saldo = kwotaKredytu;
            double oprocentowanieDzienne = oprocentowanieWStosunkuRocznym / 365;

            int iloscDniWMiesiacu = DateTime.DaysInMonth(dataPierwszejRaty.Year, dataPierwszejRaty.Month);
            int dzienRozpoczeciaNaliczaniaOdsetek = dataUruchomieniaKredytu.Day;
            int dzienZakonczeniaNaliczaniaOdsetek = dataPierwszejRaty.Day;
            int iloscDniNaliczaniaOdsetek         = dzienZakonczeniaNaliczaniaOdsetek - dzienRozpoczeciaNaliczaniaOdsetek;

            double SumaRatKapitalowych = 0;  // do weryfikacji czy kwota sie zgadza

            for (int Nr = 1; Nr <= iloscOkresowNaliczaniaOdsetek; Nr++)
            {
                double OdsetkiZaOkres = Math.Round(saldo * (oprocentowanieDzienne * iloscDniNaliczaniaOdsetek), 2);
                double RownaRataCzescKapitalowa;

                RownaRataCzescKapitalowa = Math.Round((kwotaKredytu * oprocentowanieWStosunkuRocznym / 12) / (1 - Math.Pow(1 + (oprocentowanieWStosunkuRocznym / 12), (-iloscRatKapitalowychWHarmonogramie))) - OdsetkiZaOkres, 2);

                if (dataSplaty < dataPierwszejRatyKapitalowej) // odsetki platne zawsze na koniec miesiąca
                {
                    RownaRataCzescKapitalowa = 0;
                }

                dataSplaty = DataSplatyRaty.NastepnyDzien(dataSplaty);

                if (kalendarzRat == false && dataSplaty >= dataOstatniejRaty) // harmonogram nie może wykroczyć poza okres spłaty kredytu
                {
                    dataSplaty = dataOstatniejRaty;
                    RownaRataCzescKapitalowa = saldo;
                    dataSplaty = DataSplatyRaty.NastepnyDzien(dataSplaty);
                }

                double KwotaRaty = RownaRataCzescKapitalowa + OdsetkiZaOkres;

                if (Nr == iloscOkresowNaliczaniaOdsetek)
                {
                    RownaRataCzescKapitalowa = saldo;
                }

                Hm.Rows.Add(new object[]
                {
                    Nr,
                    dataSplaty.ToString("D", CultureInfo.CreateSpecificCulture("pl-PL")),
                    saldo.ToString("0.00") + " zł",
                    RownaRataCzescKapitalowa.ToString("0.00") + " zł",
                    OdsetkiZaOkres.ToString("0.00") + " zł",
                    KwotaRaty.ToString("0.00") + " zł"
                });

                saldo = saldo - KwotaRaty + OdsetkiZaOkres;

                if (dataSplaty.Day > 10)
                {
                    dataSplaty = new DateTime(dataSplaty.AddMonths(1).Year, dataSplaty.AddMonths(1).Month, DateTime.DaysInMonth(dataSplaty.AddMonths(1).Year, dataSplaty.AddMonths(1).Month));
                }
                else
                {
                    dataSplaty = new DateTime(dataSplaty.Year, dataSplaty.Month, DateTime.DaysInMonth(dataSplaty.Year, dataSplaty.Month));
                }

                iloscDniNaliczaniaOdsetek = DateTime.DaysInMonth(dataSplaty.Year, dataSplaty.Month);

                SumaRatKapitalowych = SumaRatKapitalowych + RownaRataCzescKapitalowa;
            }

            return(Hm);
        }