1
0
forked from x/icebergs
icebergs/core/team/loan.go
2023-11-16 00:27:12 +08:00

87 lines
3.1 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package team
import (
"math"
ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/web/html"
kit "shylinux.com/x/toolkits"
)
const LOAN = "loan"
func init() {
const (
YEAR = "year"
RATE = "rate"
MONTH = "month"
PAYMENT = "payment"
PRESENT = "present"
INTEREST = "interest"
INTERESTS = "interests"
PRESENTS = "presents"
)
Index.MergeCommands(ice.Commands{
LOAN: {Name: "loan auto loan1 loan2", Help: "分期贷款", Meta: kit.Dict(
ice.CTX_TRANS, kit.Dict(html.INPUT, kit.Dict(
YEAR, "年数", RATE, "利率", MONTH, "期数", PAYMENT, "月供",
PRESENT, "本金", INTEREST, "利息", INTERESTS, "累积利息", PRESENTS, "还欠本金",
AMOUNT, "累积还款",
)),
), Actions: ice.MergeActions(ice.Actions{
"loan1": {Name: "load present=300 year=30 rate=4.2", Help: "等额本息", Hand: func(m *ice.Message, arg ...string) {
//〔贷款本金×月利率×(1月利率)^还款月数〕÷〔(1月利率)^还款月数 - 1
number, rate := kit.Float(m.Option(YEAR))*12, kit.Float(m.Option(RATE))/100/12
present := kit.Float(m.Option(PRESENT)) * 10000
pow := math.Pow((1 + rate), number)
p := present * rate * pow / (pow - 1)
var interests, presents float64
presents = present
for i := float64(0); i < number; i++ {
_p := presents * rate
interests += _p
presents -= (present / number)
m.Push(MONTH, kit.Int(i+1)).Push(PAYMENT, p)
m.Push(PRESENT, p-_p).Push(INTEREST, _p)
m.Push(INTERESTS, interests)
m.Push(PRESENTS, presents)
m.Push(AMOUNT, p*(i+1))
}
m.Status(kit.Dict(
PAYMENT, kit.Format("%0.2f 元", p),
PRESENT, kit.Format("%0.2f 万", present/10000),
INTEREST, kit.Format("%0.2f 万", p*number/10000-present/10000),
AMOUNT, kit.Format("%0.2f 万", p*number/10000),
MONTH, kit.Format("%v 期", number),
))
}},
"loan2": {Name: "load present=300 year=30 rate=4.2", Help: "等额本金", Hand: func(m *ice.Message, arg ...string) {
// 每月还款金额 =(贷款本金 ÷ 还款月数)+(本金 — 已归还本金累计额)×每月利率
present := kit.Float(m.Option(PRESENT)) * 10000
number, rate := kit.Float(m.Option(YEAR))*12, kit.Float(m.Option(RATE))/100/12
var interests, presents, amount, payment float64
presents = present
for i := float64(0); i < number; i++ {
p := present/number + (present-i*(present/number))*rate
interests += (present - i*(present/number)) * rate
presents -= present / number
amount += p
kit.If(i == 0, func() { payment = p })
m.Push(MONTH, kit.Int(i+1)).Push(PAYMENT, p)
m.Push(PRESENT, present/number).Push(INTEREST, (present-i*(present/number))*rate)
m.Push(INTERESTS, interests)
m.Push(PRESENTS, presents)
m.Push(AMOUNT, amount)
}
m.Status(kit.Dict(
PAYMENT, kit.Format("%0.2f 元", payment),
PRESENT, kit.Format("%0.2f 万", present/10000),
INTEREST, kit.Format("%0.2f 万", amount/10000-present/10000),
AMOUNT, kit.Format("%0.2f 万", amount/10000),
MONTH, kit.Format("%v 期", number),
))
}},
})},
})
}