Exemplo n.º 1
0
        public async Task <IActionResult> Edit(int id, [Bind("ID,UnitID,Date,Principal,Interest,Total,Balance,LoanAmount,NoOfDays")] Amortization amortization)
        {
            if (id != amortization.ID)
            {
                return(NotFound());
            }

            if (ModelState.IsValid)
            {
                try
                {
                    _context.Update(amortization);
                    await _context.SaveChangesAsync();
                }
                catch (DbUpdateConcurrencyException)
                {
                    if (!AmortizationExists(amortization.ID))
                    {
                        return(NotFound());
                    }
                    else
                    {
                        throw;
                    }
                }
                return(RedirectToAction(nameof(Index)));
            }
            return(View(amortization));
        }
        /// <summary>
        ///     调整摊销计算表
        /// </summary>
        /// <param name="amort">摊销</param>
        public static void InternalRegular(Amortization amort)
        {
            if (amort.Remark == Amortization.IgnoranceMark)
            {
                return;
            }
            if (!amort.Date.HasValue ||
                !amort.Value.HasValue)
            {
                return;
            }

            var lst = amort.Schedule?.ToList() ?? new List <AmortItem>();

            lst.Sort((item1, item2) => DateHelper.CompareDate(item1.Date, item2.Date));

            var resiValue = amort.Value.Value;

            foreach (var item in lst)
            {
                item.Value = resiValue -= item.Amount;
            }

            amort.Schedule = lst;
        }
Exemplo n.º 3
0
        public void Amortization(string serialNumber, int year)
        {
            Hardware tmpHardware = db.Hardwares.FirstOrDefault(hardware => hardware.SerialNumber == serialNumber);

            if (tmpHardware == null)
            {
                MessageBox.Show("BŁĘDNY NUMER SERYJNY");
                return;
            }

            if (tmpHardware.Amortization != null)
            {
                MessageBox.Show("SPRZĘT MA JUŻ PRZYPISANĄ AMORTYZACJĘ");
                return;
            }

            Purchase     purchase        = tmpHardware.Purchase;
            double       price           = purchase.Price;
            double       amortization    = price * 0.2 / (12.0 * year);
            string       type            = tmpHardware.Type;
            DateTime     endDate         = DateTime.Now.Date.AddYears(year);
            Amortization tmpAmortization = new Amortization()
            {
                Type = type, AmortizationAmount = amortization, StartDate = DateTime.Now.Date, EndDate = endDate
            };

            db.Amortizations.Add(tmpAmortization);
            tmpHardware.Amortization = tmpAmortization;

            db.SaveChanges();
        }
Exemplo n.º 4
0
        /// <summary>
        ///     显示摊销及其计算表
        /// </summary>
        /// <param name="amort">摊销</param>
        /// <param name="serializer">表示器</param>
        /// <param name="dt">计算账面价值的时间</param>
        /// <param name="showSchedule">是否显示计算表</param>
        /// <returns>格式化的信息</returns>
        private string ListAmort(Amortization amort, IEntitySerializer serializer, DateTime?dt = null,
                                 bool showSchedule = true)
        {
            var sb = new StringBuilder();

            var bookValue = Accountant.GetBookValueOn(amort, dt);

            if (dt.HasValue &&
                !bookValue?.IsZero() != true)
            {
                return(null);
            }

            sb.AppendLine(
                $"{amort.StringID} {amort.Name.CPadRight(35)}{amort.Date:yyyyMMdd}" +
                $"U{amort.User.AsUser().CPadRight(5)} " +
                $"{amort.Value.AsCurrency().CPadLeft(13)}{(dt.HasValue ? bookValue.AsCurrency().CPadLeft(13) : "-".CPadLeft(13))}" +
                $"{(amort.TotalDays?.ToString(CultureInfo.InvariantCulture) ?? "-").CPadLeft(4)}{amort.Interval.ToString().CPadLeft(20)}");
            if (showSchedule && amort.Schedule != null)
            {
                foreach (var amortItem in amort.Schedule)
                {
                    sb.AppendLine(ListAmortItem(amortItem));
                    if (amortItem.VoucherID != null)
                    {
                        sb.AppendLine(serializer.PresentVoucher(Accountant.SelectVoucher(amortItem.VoucherID)).Wrap());
                    }
                }
            }

            return(sb.ToString());
        }
Exemplo n.º 5
0
 public void AddAmortization(Amortization amortization)
 {
     if (amortization != null)
     {
         _context.Amortization.Add(amortization);
         _context.SaveChanges();
     }
 }
 public RegisteringQuery(Amortization amort)
 {
     VoucherFilter = amort.Template;
     DetailFilter  = amort.Template.Details.Aggregate(
         (IQueryCompunded <IDetailQueryAtom>)DetailQueryUnconstrained.Instance,
         (query, filter) => new IntersectQueries <IDetailQueryAtom>(
             query,
             new RegisteringDetailQuery(filter)));
 }
Exemplo n.º 7
0
        public List <Amortization> ListAmortization(int id, UnitViewModel unitViewModel)
        {
            List <Amortization>        lstAmortizations = new List <Amortization>();
            Dictionary <int, DateTime> dict             = new Dictionary <int, DateTime>();
            DateTime dtLoadDate = unitViewModel.LoanDate;
            DateTime startdate  = unitViewModel.PaymentStart;

            for (int i = 0; i < unitViewModel.Terms; i++)
            {
                if (i == 0)
                {
                    dict.Add(i, startdate);
                }
                else
                {
                    dict.Add(i, new DateTime(startdate.AddMonths(i).Year, startdate.AddMonths(i).Month, startdate.Day));
                }
            }

            for (int i = 0; i < dict.Count; i++)
            {
                Amortization am = new Amortization();
                //int dID = dict.ElementAt(i).Key;
                am.UnitID     = unitViewModel.ID;
                am.LoanAmount = unitViewModel.LoanAmount;
                am.Date       = dict.ElementAt(i).Value;

                TimeSpan difference = new TimeSpan();
                if (i == 0)
                {
                    difference   = (dict.ElementAt(i).Value - dtLoadDate);
                    am.NoOfDays  = difference.Days;
                    am.Principal = decimal.Round((unitViewModel.LoanAmount / unitViewModel.Terms), 2);
                    am.Interest  = decimal.Round(((unitViewModel.LoanAmount * am.NoOfDays * unitViewModel.InterestRate / 365) / 100), 2);
                    am.Total     = decimal.Round((am.Principal + am.Interest), 2);
                    am.Balance   = decimal.Round((unitViewModel.LoanAmount - am.Principal), 2);
                }
                else
                {
                    difference = (dict.ElementAt(i).Value - dict.ElementAt((i - 1)).Value);
                    Amortization m = lstAmortizations.Find(x => x.UnitID == unitViewModel.ID && x.Date == dict.ElementAt((i - 1)).Value);
                    am.NoOfDays = difference.Days;

                    am.Principal = decimal.Round((unitViewModel.LoanAmount / unitViewModel.Terms), 2);
                    am.Interest  = decimal.Round(((m.Balance * am.NoOfDays * unitViewModel.InterestRate / 365) / 100), 2);
                    am.Total     = decimal.Round((am.Principal + am.Interest), 2);
                    am.Balance   = decimal.Round((m.Balance - am.Principal), 2);
                }
                AddAmortization(am);
                lstAmortizations.Add(am);
            }

            return(lstAmortizations);
        }
        /// <summary>
        /// This method selects value from Amortization fields. Returns nothing.
        /// </summary>
        /// <param name="amortizationEnum">use Amortization type</param>
        public void SelectAmortization(Amortization amortizationEnum)
        {
            string amortizationPath = "//div[@class='col-med-1-2 col-lg-1-3']//ul//*[";

            amortizationBtn.Click();
            amortizationEnum++;
            int         item = (int)amortizationEnum;
            IWebElement amortizationSelect = driver.FindElement(By.XPath(amortizationPath + item + "]"));

            amortizationSelect.Click();
        }
Exemplo n.º 9
0
        public async Task <IActionResult> Create([Bind("ID,UnitID,Date,Principal,Interest,Total,Balance,LoanAmount,NoOfDays")] Amortization amortization)
        {
            if (ModelState.IsValid)
            {
                _context.Add(amortization);
                await _context.SaveChangesAsync();

                return(RedirectToAction(nameof(Index)));
            }
            return(View(amortization));
        }
Exemplo n.º 10
0
        /// <inheritdoc />
        public bool Upsert(Amortization entity)
        {
            var res = m_Amortizations.ReplaceOne(
                Builders <Amortization> .Filter.Eq("_id", entity.ID),
                entity,
                new UpdateOptions {
                IsUpsert = true
            });

            return(res.ModifiedCount <= 1);
        }
 private static JObject PresentJson(Amortization amort)
 => new JObject
 {
     { "id", amort.StringID },
     { "name", amort.Name },
     { "date", amort.Date?.ToString("yyyy-MM-dd") },
     { "value", amort.Value },
     { "totalDays", amort.TotalDays },
     { "interval", amort.Interval?.ToString() },
     { "template", PresentJson(amort.Template) },
     { "remark", amort.Remark },
     { "schedule", new JArray(amort.Schedule.Select(PresentJson)) }
 };
Exemplo n.º 12
0
        public double TaxPerPeriod(DateTime date)
        {
            double result = 0;

            foreach (Hardware hardware in db.Hardwares)
            {
                Amortization amortization = hardware.Amortization;
                if (amortization != null)
                {
                    double   amortizationValue = amortization.AmortizationAmount;
                    Purchase purchase          = hardware.Purchase;
                    if ((amortization.StartDate.Year <= date.Year) && (amortization.EndDate.Year >= date.Year))
                    {
                        double price     = purchase.Price;
                        double realPrice = price - amortizationValue;
                        result += realPrice;
                    }
                }
                else
                {
                    Purchase purchase = hardware.Purchase;
                    if (purchase.PurchaseDate.Year <= date.Year)
                    {
                        double price = purchase.Price;
                        result += price;
                    }
                }
            }

            foreach (Software software in db.Softwares)
            {
                if (software.Subscription != null)
                {
                    Subscription subscription = software.Subscription;
                    if ((subscription.StartDate.Year <= date.Year) && (subscription.EndDate.Year >= date.Year))
                    {
                        result += subscription.Price;
                    }
                }
                else
                {
                    License license = software.License;
                    if (license.PurchaseDate.Year <= date.Year)
                    {
                        result += license.Price;
                    }
                }
            }
            return(result * 0.2);
        }
Exemplo n.º 13
0
        /// <summary>
        ///     摊销
        /// </summary>
        public static void Amortize(Amortization amort)
        {
            if (!amort.Date.HasValue ||
                !amort.Value.HasValue ||
                !amort.TotalDays.HasValue ||
                amort.Interval == null)
            {
                return;
            }

            var lst = new List <AmortItem>();

            var a       = amort.Value.Value / amort.TotalDays.Value;
            var residue = amort.Value.Value;

            var dtCur = amort.Date.Value;
            var dtEnd = amort.Date.Value.AddDays(amort.TotalDays.Value - 1);
            var flag  = true;

            while (true)
            {
                var dtNxt = flag
                    ? ThisAmortizationDate(amort.Interval.Value, amort.Date.Value)
                    : NextAmortizationDate(amort.Interval.Value, dtCur);

                if (dtNxt >= dtEnd)
                {
                    lst.Add(new AmortItem {
                        Date = dtNxt, Amount = residue
                    });
                    break;
                }

                var n = dtNxt.Subtract(dtCur).TotalDays + (flag ? 1 : 0);

                flag = false;

                var amount = a * n;
                residue -= amount;
                if (!amount.IsZero())
                {
                    lst.Add(new AmortItem {
                        Date = dtNxt, Amount = amount
                    });
                }
                dtCur = dtNxt;
            }

            amort.Schedule = lst;
        }
Exemplo n.º 14
0
        /// <summary>
        ///     根据摊销计算表更新账面
        /// </summary>
        /// <param name="amort">摊销</param>
        /// <param name="rng">日期过滤器</param>
        /// <param name="isCollapsed">是否压缩</param>
        /// <param name="editOnly">是否只允许更新</param>
        /// <returns>无法更新的条目</returns>
        public IEnumerable <AmortItem> Update(Amortization amort, DateFilter rng,
                                              bool isCollapsed = false, bool editOnly = false)
        {
            if (amort.Schedule == null)
            {
                yield break;
            }

            foreach (
                var item in
                amort.Schedule.Where(item => item.Date.Within(rng))
                .Where(item => !UpdateVoucher(item, isCollapsed, editOnly, amort.Template)))
            {
                yield return(item);
            }
        }
Exemplo n.º 15
0
        /// <summary>
        ///     找出未在摊销计算表中注册的记账凭证,并尝试建立引用
        /// </summary>
        /// <param name="amort">摊销</param>
        /// <param name="rng">日期过滤器</param>
        /// <param name="query">检索式</param>
        /// <returns>未注册的记账凭证</returns>
        public IEnumerable <Voucher> RegisterVouchers(Amortization amort, DateFilter rng,
                                                      IQueryCompunded <IVoucherQueryAtom> query)
        {
            if (amort.Remark == Amortization.IgnoranceMark)
            {
                yield break;
            }

            var queryT = new RegisteringQuery(amort);

            foreach (var voucher in Db.SelectVouchers(new IntersectQueries <IVoucherQueryAtom>(query, queryT)))
            {
                if (voucher.Remark == Amortization.IgnoranceMark)
                {
                    continue;
                }

                if (amort.Schedule.Any(item => item.VoucherID == voucher.ID))
                {
                    continue;
                }

                if (voucher.Details.Zip(amort.Template.Details, (d1, d2) => d1.IsMatch(d2)).Contains(false))
                {
                    yield return(voucher);
                }
                else
                {
                    var lst = amort.Schedule
                              .Where(item => item.Date.Within(rng))
                              .Where(item => item.Date == voucher.Date)
                              .ToList();

                    if (lst.Count == 1)
                    {
                        lst[0].VoucherID = voucher.ID;
                    }
                    else
                    {
                        yield return(voucher);
                    }
                }
            }
        }
        public IActionResult Results(int ID)
        {
            DebtModel debtModel = new DebtModel();

            // Save code goes here
            Data data = new Data();
            Debt debt = data.connection.FirstOrDefault <Debt>("WHERE ID = @0", ID);

            if (debt != null)
            {
                Amortization amortization = new Amortization(debt);

                debtModel.Name    = debt.Name;
                debtModel.Amount  = debt.Amount;
                debtModel.APR     = debt.Interest;
                debtModel.Payment = debt.MinPayment;
                debtModel.AmortizationSchedule = amortization;
            }


            return(View(debtModel));
        }
Exemplo n.º 17
0
 public IEnumerable <Voucher> RegisterVouchers(Amortization amort, DateFilter rng,
                                               IQueryCompounded <IVoucherQueryAtom> query)
 => m_AmortAccountant.RegisterVouchers(amort, rng, query);
Exemplo n.º 18
0
 public bool Upsert(Amortization entity)
 => m_Db.Upsert(entity);
 public RegisteringQuery(Amortization amort)
 {
     VoucherFilter = amort.Template;
     DetailFilter  = amort.Template.Details.Aggregate(
         (IQueryCompounded <IDetailQueryAtom>)DetailQueryUnconstrained.Instance, static (query, filter)
Exemplo n.º 20
0
        /// <inheritdoc />
        public string PresentAmort(Amortization amort)
        {
            if (amort == null)
            {
                return("null");
            }

            var sb = new StringBuilder();

            sb.Append("new Amortization {");
            sb.AppendLine($"  StringID = {ProcessString(amort.StringID)},");
            sb.AppendLine($"  User = {ProcessString(amort.User)}, ");
            sb.AppendLine($"    Name = {ProcessString(amort.Name)},");
            if (amort.Date.HasValue)
            {
                sb.Append($"    Date = D(\"{amort.Date:yyyy-MM-dd}\"),");
                sb.AppendLine();
            }
            else
            {
                sb.AppendLine("    Date = null,");
            }

            sb.AppendLine($"    Value = {amort.Value}, ");
            sb.AppendLine($"    TotalDays = {amort.TotalDays}, Interval = AmortizeInterval.{amort.Interval},");
            sb.Append("Template = ");
            sb.Append(PresentVoucher(amort.Template));
            sb.AppendLine(",");
            if (amort.Remark != null)
            {
                sb.AppendLine($"    Remark = {ProcessString(amort.Remark)},");
            }

            if (amort.Schedule != null)
            {
                sb.AppendLine("    Schedule = new List<AmortItem> {");
                foreach (var item in amort.Schedule)
                {
                    sb.Append("        new AmortItem { ");
                    sb.Append(item.Date.HasValue ? $"Date = D(\"{item.Date:yyyy-MM-dd}\"), " : "Date = null, ");
                    sb.Append($"VoucherID = {(ProcessString(item.VoucherID) + ",").CPadRight(28)}");
                    sb.Append($"Amount = {(item.Amount.ToString(CultureInfo.InvariantCulture) + ",").CPadRight(19)}");
                    sb.Append($"Value = {item.Value.ToString(CultureInfo.InvariantCulture).CPadRight(16)} ");
                    if (item.Remark != null)
                    {
                        sb.Append("".CPadLeft(30));
                        sb.Append($", Remark = {ProcessString(item.Remark)} ");
                    }

                    sb.AppendLine("},");
                }

                sb.Append("} }");
            }
            else
            {
                sb.AppendLine("    Schedule = null");
                sb.Append("}");
            }

            return(sb.ToString());
        }
Exemplo n.º 21
0
 /// <inheritdoc />
 public string PresentAmort(Amortization amort)
 => amort == null ? "null" : AmortToken + PresentJson(amort).ToString(Formatting.Indented);
Exemplo n.º 22
0
        private Cashflow[] GetBondCashflows(IMarketCondition market, bool netted = true, bool calcAi = false)
        {
            var accruals             = Accruals.ToArray();
            var schedulePaymentDates = calcAi ? Accruals.Skip(1).ToArray() : PaymentSchedule.ToArray();

            if (schedulePaymentDates.Length == 0)
            {
                throw  new PricingLibraryException("Number of payments is 0");
            }

            List <CfCalculationDetail[]> cfCalcDetails;

            var cashflows  = new List <Cashflow>();
            var prevCfDate = accruals[0];

            var coupons = Coupon.GetCoupon(
                Accruals,
                market.FixingCurve.HasValue ? market.FixingCurve.Value : null,
                market.HistoricalIndexRates.HasValue ? market.HistoricalIndexRates.Value : null,
                out cfCalcDetails,
                IssueRate,
                _compensationRate);
            var refStartDates = new List <Date>();
            var refEndDates   = new List <Date>();

            for (var i = 0; i < coupons.Length; ++i)
            {
                var refStartDate = accruals[i];
                var refEndDate   = accruals[i + 1];
                if (i == 0 && !_isRegualDate[i])
                {
                    if (PaymentFreq != Frequency.None)
                    {
                        if (Stub == Stub.LongStart || Stub == Stub.ShortStart)
                        {
                            refStartDate = PaymentFreq.GetTerm().Prev(refEndDate);
                        }
                        else
                        {
                            refEndDate = PaymentFreq.GetTerm().Next(refStartDate);
                        }
                    }
                }
                refStartDates.Add(refStartDate);
                refEndDates.Add(refEndDate);
            }

            IAmortization amortization;

            if (AmortizationType == AmortizationType.EqualPrincipal || AmortizationType == AmortizationType.EqualPrincipalAndInterest)
            {
                //for these two types, amortization is calculated in cash flow calculation
                var      tArr = coupons.Select((x, i) => AccrualDayCount.CalcDayCountFraction(accruals[i], accruals[i + 1], refStartDates[i], refEndDates[i])).ToArray();
                double[] begPrincipal;
                double[] interest;
                double[] principalPay;
                double[] prepayment;
                double[] defaultPrincipal;
                _mortgageCalculator.GetPaymentDetails(tArr, Notional, coupons, PaymentFreq, AmortizationType, out begPrincipal, out interest, out principalPay, out prepayment, out defaultPrincipal, 0);
                amortization = new Amortization(ToAmortizationSchedule(schedulePaymentDates, principalPay.Select((x, i) => Tuple.Create(i + 1, x)).ToDictionary(x => x.Item1, x => x.Item2)), false);
            }
            else
            {
                amortization = Amoritzation.Adjust(new Schedule(schedulePaymentDates), Calendar, calcAi ? AccrualBizDayRule : PaymentBizDayRule, PaymentFreq);
                amortization = amortization.ResetAmortization(market.ValuationDate);
            }

            for (var i = 0; i < coupons.Length; ++i)
            {
                var amortizationRedemption = 0.0;
                var remainPrincipal        = 100.0;
                var couponPay = 0.0;
                var prevDate  = prevCfDate;
                if (amortization.AmortizationSchedule != null && amortization.AmortizationSchedule.Any(x => x.Key > prevCfDate && x.Key < schedulePaymentDates[i]))
                {
                    var intermediatePrePayDate = amortization.AmortizationSchedule.Where(x => x.Key > prevCfDate && x.Key < schedulePaymentDates[i]).Select(x => x.Key).OrderBy(x => x).ToArray();
                    CfCalculationDetail[] tmpCfCalculationDetails;
                    foreach (var date in intermediatePrePayDate)
                    {
                        amortizationRedemption = amortization.GetRemainingPrincipal(prevDate);
                        remainPrincipal        = Notional * amortizationRedemption;
                        var periodCoupon = Coupon.GetCoupon(prevDate, date, market.FixingCurve.Value, market.HistoricalIndexRates, out tmpCfCalculationDetails, _compensationRate[i]);
                        couponPay = remainPrincipal * periodCoupon * AccrualDayCount.CalcDayCountFraction(prevDate, date, refStartDates[i], refEndDates[i]);
                        cashflows.Add(new Cashflow(prevDate, date, date, couponPay, Currency, CashflowType.Coupon, tmpCfCalculationDetails.Aggregate(true, (current, v) => current & v.IsFixed), market.GetDf(date), cfCalcDetails[i], refStartDates[i], refEndDates[i], remainPrincipal, periodCoupon));
                        prevDate = date;
                    }
                    coupons[i]       = Coupon.GetCoupon(prevDate, accruals[i + 1], market.FixingCurve.Value, market.HistoricalIndexRates, out tmpCfCalculationDetails, _compensationRate[i]);
                    cfCalcDetails[i] = tmpCfCalculationDetails;
                }

                amortizationRedemption = amortization.GetRemainingPrincipal(prevDate);
                remainPrincipal        = Notional * amortizationRedemption;
                couponPay = remainPrincipal * coupons[i] * AccrualDayCount.CalcDayCountFraction(prevDate, accruals[i + 1], refStartDates[i], refEndDates[i]);

                if (i == coupons.Length - 1)
                {
                    amortizationRedemption = amortization.GetRemainingPrincipal(prevCfDate);
                    remainPrincipal        = Notional * amortizationRedemption;

                    //final settlement might be adjusted, coupon [MaturityDate, settlementDate) is added
                    if (SettlmentGap != null)
                    {
                        var settlementDate = SettlmentGap.Get(Calendar, UnderlyingMaturityDate);
                        if (settlementDate > accruals[i + 1])
                        {
                            var tmpCoupon        = double.IsNaN(_settlementCoupon) ? coupons[i] : _settlementCoupon;
                            var additionalCoupon = remainPrincipal * tmpCoupon * AccrualDayCount.CalcDayCountFraction(UnderlyingMaturityDate, settlementDate, refStartDates[i], refEndDates[i]);
                            couponPay += additionalCoupon;
                        }
                    }

                    couponPay = Redemption.GetRedemptionPayment(couponPay, remainPrincipal) - remainPrincipal;
                }

                cashflows.Add(new Cashflow(prevDate, accruals[i + 1], schedulePaymentDates[i], couponPay, Currency, CashflowType.Coupon, cfCalcDetails[i] == null ? true : cfCalcDetails[i].Aggregate(true, (current, v) => current & v.IsFixed), market.GetDf(schedulePaymentDates[i]), cfCalcDetails[i], refStartDates[i], refEndDates[i], remainPrincipal, coupons[i]));
                prevCfDate = accruals[i + 1];
            }

            cashflows.AddRange(amortization.AmortizationSchedule.Keys.Select(key => new Cashflow(key, key, key, amortization.AmortizationSchedule[key] * Notional, Currency, CashflowType.Principal, true, market.GetDf(key), null)));

            if (netted)
            {
                return(cashflows
                       .GroupBy(cf => cf.PaymentDate)
                       .Select(item => new Cashflow(item.Min(x => x.AccrualStartDate), item.Max(x => x.AccrualEndDate), item.Key, item.Sum(entry => entry.PaymentAmount), Currency, CashflowType.Coupon, item.Aggregate(true, (current, v) => current && v.IsFixed), market.GetDf(item.Key), item.Min(x => x.CalculationDetails), item.Min(x => x.RefStartDate), item.Max(x => x.RefEndDate), item.Max(entry => entry.StartPrincipal), item.Sum(entry => entry.CouponRate)))
                       .OrderBy(cf => cf.PaymentDate)
                       .ToArray());
            }
            else
            {
                return(cashflows.ToArray());
            }
        }
Exemplo n.º 23
0
 public static void Amortize(Amortization amort) => AmortAccountant.Amortize(amort);
Exemplo n.º 24
0
 public IEnumerable <AmortItem> Update(Amortization amort, DateFilter rng,
                                       bool isCollapsed = false, bool editOnly = false)
 => m_AmortAccountant.Update(amort, rng, isCollapsed, editOnly);
 public string PresentAmort(Amortization amort) => throw new NotImplementedException();
Exemplo n.º 26
0
 public string PresentAmort(Amortization amort) => Run(s => s.PresentAmort(amort));
Exemplo n.º 27
0
        public Bond(
            string id,
            Date startDate,
            Date maturityDate,
            double notional,
            CurrencyCode currency,
            ICoupon coupon,
            ICalendar calendar,
            Frequency paymentFreq,
            Stub stub,
            IDayCount accrualDayCount,
            IDayCount paymentDayCount,
            BusinessDayConvention accrualBizDayRule,
            BusinessDayConvention paymentBizDayRule,
            DayGap settlementGap,
            TradingMarket bondTradingMarket,
            bool stickToEom               = false,
            IRedemption redemption        = null,
            Date firstPaymentDate         = null,
            bool isZeroCouponBond         = false,
            double issuePrice             = double.NaN,
            double issueRate              = double.NaN,
            AmortizationType amortionType = AmortizationType.None,
            Dictionary <Date, double> amortizationInDates     = null,
            Dictionary <int, double> amortizationInIndex      = null,
            bool renormalizeAfterAmoritzation                 = false,
            Dictionary <int, double> stepWiseCompensationRate = null,
            Dictionary <string, double> optionToCall          = null,
            Dictionary <string, double> optionToPut           = null,
            Dictionary <string, double> optionToAssPut        = null,
            double settlementCoupon = double.NaN,
            bool roundCleanPrice    = false
            )
        {
            Id        = id;
            StartDate = startDate;
            UnderlyingMaturityDate = maturityDate;
            Notional                 = notional;
            Currency                 = currency;
            Coupon                   = coupon;
            Calendar                 = calendar;
            PaymentFreq              = paymentFreq;
            Stub                     = stub;
            AccrualDayCount          = accrualDayCount;
            PaymentDayCount          = paymentDayCount;
            AccrualBizDayRule        = accrualBizDayRule;
            PaymentBizDayRule        = paymentBizDayRule;
            SettlmentGap             = settlementGap;
            _settlementCoupon        = settlementCoupon;
            BondTradeingMarket       = bondTradingMarket;
            FirstPaymentDate         = firstPaymentDate;
            IsZeroCouponBond         = isZeroCouponBond;
            IssuePrice               = issuePrice;
            IssueRate                = issueRate;
            StickToEom               = stickToEom;
            StepWiseCompensationRate = stepWiseCompensationRate;
            RoundCleanPrice          = roundCleanPrice;

            OptionToCall   = optionToCall;
            OptionToPut    = optionToPut;
            OptionToAssPut = optionToAssPut;

            Tenor = string.Format("{0},{1}", (int)(UnderlyingMaturityDate - StartDate), "D");

            IrregularPayment = false;
            if (Coupon is CustomizedCoupon)
            {
            }
            else
            {
                List <Date> tmpDate;
                if (FirstPaymentDate == null)
                {
                    var schedule = new Schedule(StartDate, UnderlyingMaturityDate, PaymentFreq.GetTerm(), Stub, Calendar,
                                                AccrualBizDayRule);
                    tmpDate       = schedule.ToList();
                    _isRegualDate = schedule.IsRegular;
                }
                else
                {
                    var schedule    = new Schedule(FirstPaymentDate, UnderlyingMaturityDate, PaymentFreq.GetTerm(), Stub, Calendar, AccrualBizDayRule);
                    var regAccruals = schedule.ToList();
                    tmpDate = new List <Date> {
                        StartDate
                    };
                    tmpDate.AddRange(regAccruals);
                    IrregularPayment = false;
                    _isRegualDate    = new List <bool> {
                        IrregularPayment
                    };
                    _isRegualDate.AddRange(schedule.IsRegular);
                }

                if (tmpDate.Count > 2)
                {
                    if (PaymentBizDayRule.Adjust(calendar, tmpDate[tmpDate.Count - 2]).Equals(tmpDate.Last()))
                    {
                        tmpDate.RemoveAt(tmpDate.Count - 2);
                        _isRegualDate.RemoveAt(_isRegualDate.Count - 2);
                    }
                }

                Accruals = new Schedule(tmpDate);

                if (FirstPaymentDate == null)
                {
                    PaymentSchedule =
                        new Schedule(
                            new Schedule(StartDate, UnderlyingMaturityDate, PaymentFreq.GetTerm(), Stub, Calendar, PaymentBizDayRule).Skip(1));
                }
                else
                {
                    PaymentSchedule =
                        new Schedule(
                            new Schedule(FirstPaymentDate, UnderlyingMaturityDate, PaymentFreq.GetTerm(), Stub, Calendar, PaymentBizDayRule));
                }
            }

            if (Accruals.Count() != PaymentSchedule.Count() + 1)
            {
                throw new PricingLibraryException("Bond's number of accrual periods do not match number of payments");
            }

            AmortizationType             = amortionType;
            AmortizationInDates          = amortizationInDates;
            AmortizationInIndex          = amortizationInIndex;
            RenormalizeAfterAmoritzation = renormalizeAfterAmoritzation;
            IAmortization amortization;

            if (AmortizationInDates != null)
            {
                amortization = new Amortization(amortizationInDates, RenormalizeAfterAmoritzation);
            }
            else if (AmortizationInIndex != null)
            {
                amortization = new Amortization(ToAmortizationSchedule(PaymentSchedule.ToArray(), AmortizationInIndex), RenormalizeAfterAmoritzation);
            }
            else
            {
                //EqualPrincipal or EqualPrincipalAndInterest will be calculated later
                amortization = new Amortization();
            }
            Amoritzation        = amortization;
            _mortgageCalculator = new MortgageCalculator(new Psa(0.0), new Sda(0.0));

            Redemption = redemption ?? new Redemption(1.0, RedemptionType.None);
            //Redemption = redemption ?? new Redemption(1.0, PriceQuoteType.Clean);

            if (PaymentFreq == Frequency.None)
            {
                IrregularPayment = true;
            }
            else
            {
                for (var i = 0; i < Accruals.Count() - 1; ++i)
                {
                    if (PaymentFreq.GetTerm().Next(Accruals.ToArray()[i]) != Accruals.ToArray()[i + 1])
                    {
                        IrregularPayment = false;
                        break;
                    }
                }
            }

            _compensationRate = Accruals.Skip(1).Select(x => 0.0).ToArray();

            if (stepWiseCompensationRate != null)
            {
                var compensationCoupons = new List <double>();
                var arr = StepWiseCompensationRate.OrderBy(x => x.Key).Select(x => Tuple.Create(x.Key, x.Value)).ToArray();
                for (var i = 0; i < Accruals.Count() - 1; ++i)
                {
                    compensationCoupons.Add(i > 0 ? compensationCoupons[i - 1] : 0.0);
                    var updateCoupon       = arr.FirstOrDefault(x => x.Item1 == (i + 1));
                    var compensationCoupon = updateCoupon != null ? updateCoupon.Item2 : 0.0;
                    compensationCoupons[i] += compensationCoupon;
                }
                _compensationRate = compensationCoupons.ToArray();
            }
        }