public async Task Calculate(ICreditRepository repository)
        {
            var credit = await repository.GetCreditAsync();

            bool    isFirst = true;
            decimal priorInterestToRepay = 0;
            var     debt    = credit.AmountOfCredit;
            var     k       = credit.AnnualLendingRate / 1200;
            var     q       = 1 + k;
            var     qPowLol = q.Pow(credit.LifeOfLoan);
            int     month   = 1;

            var installment = debt * qPowLol * (q - 1) / (qPowLol - 1); // rata
            var results     = new List <FinancialResult>();

            while (debt > 1)
            {
                var result = new FinancialResult();
                result.MonthNumber = month.ToString();
                result.InterestPartOfInstallment = (debt * k).Stringify();               // odsetki będące częścią raty
                result.CapitalPartOfInstallment  = (installment - debt * k).Stringify(); // kapitał do spłacenia będący częścią raty
                result.CapitalToRepay            = (debt - installment + debt * k).Stringify();
                priorInterestToRepay             = isFirst
                    ? installment * credit.LifeOfLoan - debt - debt * k
                    : priorInterestToRepay - debt * k;
                result.InterestToRepay = priorInterestToRepay.Stringify();
                // result.Installment = (debt*k).RoundTo2() + (installment - debt*k).RoundTo2() > installment.RoundTo2()
                //     ? (installment.RoundTo2() + 0.01m).Stringify()
                //     : installment.RoundTo2().Stringify();
                debt    = debt - installment + debt * k;
                isFirst = false;
                month++;
                await repository.AddFinancialResultAsync(result);
            }
        }