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);
            }
        }
Exemplo n.º 2
0
        public async Task <ActionResult <CreditModel> > Get(int InvoiceId, int Id)
        {
            try
            {
                var result = await _repository.GetCreditAsync(InvoiceId, Id);

                if (result == null)
                {
                    return(NotFound());
                }

                return(_mapper.Map <CreditModel>(result));
            }
            catch (Exception)
            {
                return(this.StatusCode(StatusCodes.Status500InternalServerError, "Database Failure"));
            }
        }
Exemplo n.º 3
0
        public async Task SetCreditAsync(decimal amountOfCredit, decimal annualLendingRate, int lifeOfLoan)
        {
            _newParams = true;
            var credit = await _repository.GetCreditAsync();

            if (credit != null)
            {
                if (credit.AmountOfCredit == amountOfCredit &&
                    credit.AnnualLendingRate == annualLendingRate &&
                    credit.LifeOfLoan == lifeOfLoan)
                {
                    _newParams = false;
                    return;
                }
            }

            await _repository.ClearAsync();

            await _repository.SetCreditAsync(new Credit {
                AmountOfCredit    = amountOfCredit,
                AnnualLendingRate = annualLendingRate,
                LifeOfLoan        = lifeOfLoan
            });
        }