Esempio n. 1
0
        /// <summary>
        /// 创建基本科目(包括本金、利息、管理费)
        /// </summary>
        /// <param name="business">业务对象</param>
        /// <returns>返回款项集合</returns>
        public override List <BillItem> CreateBaseItems(bool isLast = false)
        {
            List <BillItem> billItem = new List <BillItem>();

            // 添加信托方扣款项目
            if (Business.LendingSideID > 0)
            {
                var capital  = SubjectFormula.CalculatCapital(Business.LoanCapital, Business.LoanPeriod);
                var interest = SubjectFormula.CalculatInterest(Business.LoanCapital, Business.InterestRate);

                // 判断当期帐单属于第几期帐单,最后一期普通帐单(本金按余额计)
                if (isLast)
                {
                    capital = SubjectFormula.CalculatCapitalOver(Business.LoanCapital, Business.LoanPeriod);
                }
                billItem.Add(CreateBillItem(EnumCostSubject.Capital, capital));
                billItem.Add(CreateBillItem(EnumCostSubject.Interest, interest));
            }

            // 添加管理方扣款项目
            if (Business.ServiceSideID > 0)
            {
                var mangeFee = SubjectFormula.CalculatServiceFee(Business.LoanCapital, Business.ServiceRate, false);
                billItem.Add(CreateBillItem(EnumCostSubject.ServiceFee, mangeFee));
            }

            return(billItem);
        }
Esempio n. 2
0
        /// <summary>
        /// 获取信用贷款每期应还基本科目
        /// </summary>
        /// <param name="business">业务对象</param>
        /// <returns>返回款项集合</returns>
        public override List <BillItem> GetBaseItemsByMonth()
        {
            List <BillItem> billItem = new List <BillItem>();

            // 添加信托方扣款项目(1、本金 2、利息)
            if (Business.LendingSideID > 0)
            {
                var capital = SubjectFormula.CalculatCapital(Business.LoanCapital, Business.LoanPeriod);
                billItem.Add(CreateBillItem(EnumCostSubject.Capital, capital));
                var interest = SubjectFormula.CalculatInterest(Business.LoanCapital, Business.InterestRate);
                billItem.Add(CreateBillItem(EnumCostSubject.Interest, interest));
            }

            // 添加服务方和担保方扣款项目
            if (Business.ServiceSideID > 0 && Business.GuaranteeSideID > 0)
            {
                var servicehalf = SubjectFormula.CalculatServiceFee(Business.LoanCapital, Business.ServiceRate, true);
                billItem.Add(CreateBillItem(EnumCostSubject.ServiceFee, servicehalf));
                billItem.Add(CreateBillItem(EnumCostSubject.GuaranteeFee, servicehalf));
            }
            else if (Business.ServiceSideID > 0)
            {
                billItem.Add(CreateBillItem(EnumCostSubject.ServiceFee,
                                            SubjectFormula.CalculatServiceFee(Business.LoanCapital, Business.ServiceRate, false)));
            }

            return(billItem);
        }
Esempio n. 3
0
        private List <BillItem> GetBillItem(bool isLast = false)
        {
            List <BillItem> billItem = new List <BillItem>();

            // 添加信托方扣款项目
            if (Business.LendingSideID > 0)
            {
                decimal capital = 0.0M;

                // 判断当期帐单属于第几期帐单,最后一期普通帐单(本金按余额计)
                if (isLast)
                {
                    capital = SubjectFormula.CalcuateCapitalOver(Business.LoanCapital
                                                                 , Business.CapitalRate.HasValue ? Business.CapitalRate.Value : 0, Business.LoanPeriod);
                }
                else
                {
                    capital = SubjectFormula.CalcuLateCapitalByRate(Business.LoanCapital
                                                                    , Business.CapitalRate.HasValue ? Business.CapitalRate.Value : 0);
                }

                var interest = SubjectFormula.CalculatInterest(Business.LoanCapital, Business.InterestRate);

                billItem.Add(CreateBillItem(EnumCostSubject.Capital, capital));
                billItem.Add(CreateBillItem(EnumCostSubject.Interest, interest));
            }

            if (Business.ServiceRate > 0)
            {
                var service = SubjectFormula.CalculatServiceFee(Business.LoanCapital, Business.ServiceRate, false);
                billItem.Add(CreateBillItem(EnumCostSubject.ServiceFee, service));
            }
            return(billItem);
        }
Esempio n. 4
0
        /// <summary>
        /// 创建罚息科目(因逾期而产生的上期帐单罚息)
        /// 费用算法:一次性为上期帐单生成上月20日至今的罚息合计
        /// </summary>
        /// <param name="business">订单对象</param>
        /// <returns>返回罚息款项</returns>
        public override BillItem CreatePunitiveInterest(DateTime limitTime, List <PenaltyInt> penaltyInts)
        {
            // 获取当期帐单,为NULL或已在第三次扣失日前全额付清则继续循环
            var nbills   = BillDAL.GetNormalBills(Business.Bills);
            var prevBill = nbills.FirstOrDefault(p => p.BillMonth == _PrevMonth);
            var curBill  = nbills.FirstOrDefault(p => p.BillMonth == _CurMonth);

            // 判断是否存在原因帐单或当期帐单,不存在则返回NULL
            if (prevBill == null || curBill == null || Business.Bills.Count == 1 ||
                (limitTime >= prevBill.FullPaidTime && prevBill.FullPaidTime != null))
            {
                return(null);
            }

            // 获取本金、利息、管理费等参与科目,计算上期所欠本息或租金
            var subjects = new List <byte> {
                (byte)EnumCostSubject.Capital, (byte)EnumCostSubject.Interest
            };

            // 获取上期帐单的本息欠费
            decimal debtsPrincipal = prevBill.BillItems.Where(p => subjects.Contains(p.Subject))
                                     .Sum(s => s.DueAmt - s.ReceivedAmt);

            // 判断上期帐单是否存在未归还所欠本息或租金,无则不生成罚息
            if (debtsPrincipal <= 0)
            {
                return(null);
            }

            var beginDay = DateTime.Now.AddMonths(-1).SetDay(21);

            // 在罚息表中计算罚息金额
            CalculatPenaltyInt(penaltyInts, debtsPrincipal, prevBill.BillID, curBill.BillID, beginDay);

            // 当所欠本息大于零时,计算从上月21日至今天数的罚息
            var totalDays = DateTime.Now - beginDay;

            debtsPrincipal = SubjectFormula.CalculatPunitiveInterest(debtsPrincipal,
                                                                     Business.PenaltyRate, totalDays.Days);


            // 判断欠费帐单是否存在未归还所欠本息或租金,无则不生成罚息
            if (debtsPrincipal <= 0)
            {
                return(null);
            }

            // 创建罚息科目(科目名称、金额)
            return(CreateBillItem(EnumCostSubject.PunitiveInterest, debtsPrincipal, false, curBill.BillID));
        }
Esempio n. 5
0
        /// <summary>
        /// 获取信用贷款每期应还基本科目
        /// </summary>
        /// <param name="business">业务对象</param>
        /// <returns>返回款项集合</returns>
        public override List <BillItem> GetBaseItemsByMonth()
        {
            List <BillItem> billItem = new List <BillItem>();

            // 添加信托方扣款项目(1、本金 2、利息)
            if (Business.LendingSideID > 0)
            {
                var capital = SubjectFormula.CalculatCapital(Business.LoanCapital, Business.LoanPeriod);
                billItem.Add(CreateBillItem(EnumCostSubject.Capital, capital));
                var interest = SubjectFormula.CalculatInterest(Business.LoanCapital, Business.InterestRate);
                billItem.Add(CreateBillItem(EnumCostSubject.Interest, interest));
            }

            return(billItem);
        }
        /// <summary>
        /// 未出账金款项列表
        /// </summary>
        /// <param name="filter"></param>
        /// <returns></returns>
        private List <BillItem> NoCreateBillItem(BusinessGuaranteeSaveFilter filter)
        {
            List <BillItem> billitems = new List <BillItem>();
            int             num       = filter.LoanPeriod - Singleton <GuarLitigationSaveDAL> .Instance.GetNormalBillsCount(filter.BusinessID);

            //本金
            decimal bj = filter.LoanCapital - Singleton <GuarLitigationSaveDAL> .Instance.GetBillItemsAmount(filter.BusinessID);

            if (bj > 0)
            {
                billitems.Add(CreateBillItem(EnumCostSubject.Capital, bj, filter.UserId));
            }
            //利息
            decimal lx = SubjectFormula.CalculatInterest(filter.LoanCapital, filter.InterestRate) * num;

            if (lx > 0)
            {
                billitems.Add(CreateBillItem(EnumCostSubject.Interest, lx, filter.UserId));
            }
            //服务费\担保费
            decimal dbfwf = SubjectFormula.CalculatServiceFee(filter.LoanCapital, filter.ServiceRate, true) * num;

            if (dbfwf > 0)
            {
                if (string.IsNullOrEmpty(filter.GuaranteeSideKey))
                {
                    billitems.Add(CreateBillItem(EnumCostSubject.ServiceFee, dbfwf * 2, filter.UserId));
                }
                else
                {
                    billitems.Add(CreateBillItem(EnumCostSubject.ServiceFee, dbfwf, filter.UserId));
                    billitems.Add(CreateBillItem(EnumCostSubject.GuaranteeFee, dbfwf, filter.UserId));
                }
            }

            //服务费扣失
            decimal fwfks = SubjectFormula.CalculatBuckleFail(filter.ContractNo) * num;;

            if (fwfks > 0)
            {
                billitems.Add(CreateBillItem(EnumCostSubject.ServiceBuckleFail, fwfks, filter.UserId));//服务费扣失
            }
            return(billitems);
        }
Esempio n. 7
0
        /// <summary>
        /// 计算日罚息区间
        /// </summary>
        protected void CalculatPenaltyInt(List <PenaltyInt> penaltyInts, decimal debtsPrincipal,
                                          long reasonId, long toBillId, DateTime beginDay)
        {
            var interval = DateTime.Now.SetDay(1);

            // 罚息从上月21日开始起算,分隔日为上月月末,计算罚息金额
            var prevDays   = interval - beginDay;
            var prevAmount = SubjectFormula.CalculatPunitiveInterest(debtsPrincipal,
                                                                     Business.PenaltyRate, prevDays.Days);

            // 罚息从当月月头开始起算,分隔日为今天,计算罚息金额
            var curDays   = DateTime.Now - interval;
            var curAmount = SubjectFormula.CalculatPunitiveInterest(debtsPrincipal,
                                                                    Business.PenaltyRate, curDays.Days);

            // 在罚息表中插入上月罚息金额和当月罚息金额
            penaltyInts.Add(NewPenaltyInt(Business.BusinessID, reasonId, toBillId, prevAmount, false, interval.AddDays(-1)));
            penaltyInts.Add(NewPenaltyInt(Business.BusinessID, reasonId, toBillId, curAmount));
        }
        private List <BillItem> GetBillItem(bool isLast = false)
        {
            List <BillItem> billItem = new List <BillItem>();

            // 添加信托方扣款项目
            if (Business.LendingSideID > 0)
            {
                decimal capital = 0.0M;

                // 判断当期帐单属于第几期帐单,最后一期普通帐单(本金按余额计)
                if (isLast)
                {
                    capital = SubjectFormula.CalcuateCapitalOver(Business.LoanCapital, Business.CapitalRate.HasValue ? Business.CapitalRate.Value:0, Business.LoanPeriod);
                }
                else
                {
                    capital = SubjectFormula.CalcuLateCapitalByRate(Business.LoanCapital, Business.CapitalRate.HasValue ? Business.CapitalRate.Value:0);
                }

                var interest = SubjectFormula.CalculatInterest(Business.LoanCapital, Business.InterestRate);
                billItem.Add(CreateBillItem(EnumCostSubject.Capital, capital));

                billItem.Add(CreateBillItem(EnumCostSubject.Interest, interest));
            }

            // 添加服务方和担保方扣款项目
            if (Business.ServiceSideID > 0 && Business.GuaranteeSideID > 0 &&
                Business.GuaranteeSideKey != SysConst.COMPANY_WX_SHWX_SERVICE &&
                Business.ServiceRate > 0)
            {
                var servicehalf = SubjectFormula.CalculatServiceFee(Business.LoanCapital, Business.ServiceRate, true);
                billItem.Add(CreateBillItem(EnumCostSubject.ServiceFee, servicehalf));
                billItem.Add(CreateBillItem(EnumCostSubject.GuaranteeFee, servicehalf));
            }
            else if (Business.ServiceSideID > 0 && Business.ServiceRate > 0)
            {
                billItem.Add(CreateBillItem(EnumCostSubject.ServiceFee,
                                            SubjectFormula.CalculatServiceFee(Business.LoanCapital, Business.ServiceRate, false)));
            }
            return(billItem);
        }
Esempio n. 9
0
        /// <summary>
        /// 获取信用贷款所有基本款项
        /// </summary>
        /// <param name="business">业务对象</param>
        /// <returns>返回款项集合</returns>
        public override List <BillItem> GetBaseItemsByMonth()
        {
            List <BillItem> billItem = new List <BillItem>();

            // 添加信托方扣款项目(本金、利息、管理费)
            if (Business.LendingSideID > 0)
            {
                var capital = SubjectFormula.CalculatCapital(Business.LoanCapital, Business.LoanPeriod);
                billItem.Add(CreateBillItem(EnumCostSubject.Capital, capital));
                var interest = SubjectFormula.CalculatInterest(Business.LoanCapital, Business.InterestRate);
                billItem.Add(CreateBillItem(EnumCostSubject.Interest, interest));
                //月管理费
                if (Business.ManagementRate.HasValue)
                {
                    var managementFee = SubjectFormula.CalculatInterest(Business.LoanCapital, Business.ManagementRate.Value);
                    billItem.Add(CreateBillItem(EnumCostSubject.Manage, managementFee));
                }
                var serviceFee = SubjectFormula.CalculatServiceFee(Business.LoanCapital, Business.ServiceRate, false);
                billItem.Add(CreateBillItem(EnumCostSubject.ServiceFee, serviceFee));
            }

            return(billItem);
        }
Esempio n. 10
0
        /// <summary>
        /// 创建扣失科目(因逾期而产生的本息扣失、管理费扣失)
        /// </summary>
        public override List <BillItem> CreateBuckleFail(DateTime limitTime)
        {
            List <BillItem> items = new List <BillItem>();

            // 获取当期帐单
            var curBill = BillDAL.GetNormalBills(Business.Bills).FirstOrDefault(p => p.BillMonth == _CurMonth);

            // 无当期帐单 或者 有全额支付时间且全额支付时间是在扣失日之前(包括当天)的则不生成扣失
            if (curBill == null || (limitTime >= curBill.FullPaidTime && curBill.FullPaidTime != null))
            {
                return(items);
            }

            // 判断当期帐单是否应生成本息扣失
            List <byte> subjects = new List <byte> {
                (byte)EnumCostSubject.Capital, (byte)EnumCostSubject.Interest
            };

            if (IsCreateBuckleFail(subjects, curBill))
            {
                items.Add(CreateBillItem(EnumCostSubject.InterestBuckleFail,
                                         SubjectFormula.CalculatBuckleFail(Business.ContractNo), true, curBill.BillID));
            }

            // 判断当期帐单是否应生成服务费担保费扣失
            subjects = new List <byte> {
                (byte)EnumCostSubject.ServiceFee, (byte)EnumCostSubject.GuaranteeFee
            };
            if (IsCreateBuckleFail(subjects, curBill))
            {
                items.Add(CreateBillItem(EnumCostSubject.ServiceBuckleFail,
                                         SubjectFormula.CalculatBuckleFail(Business.ContractNo), true, curBill.BillID));
            }

            return(items);
        }
Esempio n. 11
0
        /// <summary>
        /// 创建基本款项(包括本金、利息、服务费、担保费)
        /// </summary>
        /// <param name="business">业务对象</param>
        /// <returns>返回款项集合</returns>
        public override List <BillItem> CreateBaseItems(bool isLast = false)
        {
            List <BillItem> billItem = new List <BillItem>();

            // 添加信托方扣款项目
            if (Business.LendingSideID > 0)
            {
                var capital  = SubjectFormula.CalculatCapital(Business.LoanCapital, Business.LoanPeriod);
                var interest = SubjectFormula.CalculatInterest(Business.LoanCapital, Business.InterestRate);

                // 判断当期帐单属于第几期帐单,最后一期普通帐单(本金按余额计)
                if (isLast)
                {
                    capital = SubjectFormula.CalculatCapitalOver(Business.LoanCapital, Business.LoanPeriod);
                }
                billItem.Add(CreateBillItem(EnumCostSubject.Capital, capital));

                billItem.Add(CreateBillItem(EnumCostSubject.Interest, interest));
            }

            // 添加服务方和担保方扣款项目
            if (Business.ServiceSideID > 0 && Business.GuaranteeSideID > 0 &&
                Business.GuaranteeSideKey != SysConst.COMPANY_WX_SHWX_SERVICE)
            {
                var servicehalf = SubjectFormula.CalculatServiceFee(Business.LoanCapital, Business.ServiceRate, true);
                billItem.Add(CreateBillItem(EnumCostSubject.ServiceFee, servicehalf));
                billItem.Add(CreateBillItem(EnumCostSubject.GuaranteeFee, servicehalf));
            }
            else if (Business.ServiceSideID > 0)
            {
                billItem.Add(CreateBillItem(EnumCostSubject.ServiceFee,
                                            SubjectFormula.CalculatServiceFee(Business.LoanCapital, Business.ServiceRate, false)));
            }

            return(billItem);
        }
Esempio n. 12
0
        /// <summary>
        /// 创建罚息科目
        /// </summary>
        public override BillItem CreatePunitiveInterest(DateTime limitTime, List <PenaltyInt> penaltyInts)
        {
            // 获取当期帐单,为NULL或已在第三次扣失日前全额付清则继续循环
            var nbills   = BillDAL.GetNormalBills(Business.Bills);
            var prevBill = nbills.FirstOrDefault(p => p.BillMonth == _PrevMonth);
            var curBill  = nbills.FirstOrDefault(p => p.BillMonth == _CurMonth);

            // 判断是否存在原因帐单或当期帐单,不存在则返回NULL
            if (prevBill == null || curBill == null || Business.Bills.Count == 1 ||
                (limitTime >= prevBill.FullPaidTime && prevBill.FullPaidTime != null))
            {
                return(null);
            }

            // 获取本金、利息或租金等参与科目,计算上期所欠本息或租金
            var subjects = new List <byte> {
                (byte)EnumCostSubject.Capital,
                (byte)EnumCostSubject.Interest, (byte)EnumCostSubject.Rent
            };

            // 是否为渤海订单, 渤海订单一次性生成一个月的罚息, 其他合同都按日罚息千分之一计算
            bool    isBoHai        = Business.LendingSideKey.EndsWith(EnumCompanyKey.BHXT_LENDING.ToEnumName());
            decimal debtsPrincipal = 0;

            if (isBoHai)
            {
                // 获取普通帐单的所欠本息
                var bills = BillDAL.GetArrearsBills(Business.Bills, true);
                foreach (var bill in bills)
                {
                    debtsPrincipal += bill.BillItems.Where(p => subjects.Contains(p.Subject) && !p.IsCurrent)
                                      .Sum(p => p.DueAmt - p.ReceivedAmt);
                }

                // 判断欠费帐单是否存在未归还所欠本息或租金,无则不生成罚息
                if (debtsPrincipal <= 0)
                {
                    return(null);
                }

                debtsPrincipal = SubjectFormula.CalculatPunitiveInterest(debtsPrincipal, 0.03m);
            }
            else
            {
                // 获取上期帐单的本息欠费
                debtsPrincipal = prevBill.BillItems.Where(p => subjects.Contains(p.Subject))
                                 .Sum(s => s.DueAmt - s.ReceivedAmt);

                // 判断上期帐单是否存在未归还所欠本息或租金,无则不生成罚息
                if (debtsPrincipal <= 0)
                {
                    return(null);
                }

                var beginDay = DateTime.Now.AddMonths(-1).SetDay(21);
                // 在罚息表中计算罚息金额
                CalculatPenaltyInt(penaltyInts, debtsPrincipal, prevBill.BillID, curBill.BillID, beginDay);

                // 当所欠本息大于零时,计算从上月21日至今天数的罚息
                var totalDays = DateTime.Now - beginDay;
                debtsPrincipal = SubjectFormula.CalculatPunitiveInterest(debtsPrincipal,
                                                                         Business.PenaltyRate, totalDays.Days);
            }

            // 创建罚息科目(科目名称、金额)
            return(CreateBillItem(EnumCostSubject.PunitiveInterest, debtsPrincipal, false, curBill.BillID));
        }