0
|
1 /****************************************************************************/
|
|
2 /* Entai.go ( ver 0.1 ) */
|
|
3 /* Last Change: 2016-09-30 Fri 20:15:52. */
|
|
4 /****************************************************************************/
|
|
5
|
|
6 package entai
|
|
7
|
|
8 import (
|
|
9 "fmt"
|
|
10 "time"
|
|
11 )
|
|
12
|
|
13 var rate0s, rate1s []float64
|
|
14 var nyds []time.Time
|
|
15
|
|
16 type Entai struct {
|
|
17 tax int // 税額
|
|
18 ed int // 経過日数
|
|
19 yd0 []int // 各年の 1カ月以内の日数
|
|
20 yd1 []int // 各年の 1カ月超えの日数
|
|
21
|
|
22 due time.Time
|
|
23 paid time.Time
|
|
24 am time.Time
|
|
25 }
|
|
26
|
|
27 func init() {
|
|
28 // 1カ月まで, 1カ月経過後, 元旦
|
|
29 createRates( 4.3, 14.6, "20120101" ) // H24
|
|
30 createRates( 4.3, 14.6, "20130101" ) // H25
|
|
31 createRates( 4.3, 14.6, "20140101" ) // H26
|
|
32 createRates( 2.9, 9.2, "20150101" ) // H27
|
|
33 createRates( 2.8, 9.1, "20160101" ) // H28
|
|
34 }
|
|
35
|
|
36 func createRates( r0, r1 float64, y string ) {
|
|
37 t, _ := time.Parse( "20060102", y )
|
|
38 rate0s = append( rate0s, r0 / 100 )
|
|
39 rate1s = append( rate1s, r1 / 100 )
|
|
40 nyds = append( nyds, t )
|
|
41 }
|
|
42
|
|
43 func ( e Entai ) String() string {
|
|
44 return "Entai....."
|
|
45 }
|
|
46
|
|
47 func ( e Entai ) GetRate() string {
|
|
48 var str string
|
|
49 for i, n := range nyds {
|
|
50 str += fmt.Sprintf( " (H%d) ", n.Year() - 1988 )
|
|
51 str += fmt.Sprintf( "%s :%4.1f / %4.1f\n", n.Format("2006.01.02"), rate0s[i] * 100, rate1s[i] * 100 )
|
|
52 }
|
|
53 return str
|
|
54 }
|
|
55
|
|
56 func ( e *Entai ) countDays() {
|
|
57
|
|
58 for range nyds {
|
|
59 e.yd0 = append( e.yd0, 0 )
|
|
60 e.yd1 = append( e.yd1, 0 )
|
|
61 }
|
|
62
|
|
63 // 1カ月後の算出
|
|
64 for tmp := e.due; ; {
|
|
65 tmp = tmp.AddDate( 0, 0, 1 )
|
|
66 for i, nyd := range nyds {
|
|
67 if tmp.Year() == nyd.Year() {
|
|
68 e.yd0[i]++
|
|
69 }
|
|
70 }
|
|
71 if tmp.Day() == e.due.Day() {
|
|
72 e.am = tmp
|
|
73 break
|
|
74 }
|
|
75 }
|
|
76
|
|
77 // 過ぎた日数の算出
|
|
78 for i := 1; ; i++ {
|
|
79 tmp := e.due.AddDate( 0, 0, i )
|
|
80 for j, nyd := range nyds {
|
|
81 if tmp.Year() == nyd.Year() {
|
|
82 e.yd1[j]++
|
|
83 }
|
|
84 }
|
|
85 if e.paid.Sub( tmp ) == 0 {
|
|
86 for j, _ := range nyds {
|
|
87 e.yd1[j] -= e.yd0[j]
|
|
88 }
|
|
89 e.yd1[len(e.yd1)-1]--
|
|
90 e.ed = i - 1
|
|
91 break
|
|
92 }
|
|
93 }
|
|
94 }
|
|
95
|
|
96 func ( e *Entai ) Set( d, p time.Time, g int ) {
|
|
97 e.due, e.paid = d, p
|
|
98 e.tax = g
|
|
99 e.countDays()
|
|
100 }
|
|
101
|
|
102 func ( e *Entai ) Result() ( int, string ) {
|
|
103
|
|
104 /* 税額の前処理 */
|
|
105 if e.tax < 2000 {
|
|
106 return 0, "tax < 2000"
|
|
107 }
|
|
108 e.tax = int( e.tax / 1000 * 1000 ) // 端数処理
|
|
109
|
|
110 /* 本計算 */
|
|
111 var tmp float64
|
|
112 for i, _ := range nyds {
|
|
113 tmp += float64(e.yd0[i]) * rate0s[i] + float64(e.yd1[i]) * rate1s[i]
|
|
114 }
|
|
115 tmp *= float64(e.tax) / 365.0
|
|
116
|
|
117 /* 利息の後処理&端数処理 */
|
|
118 var intrst int
|
|
119 if tmp < 1000 {
|
|
120 intrst = 0
|
|
121 } else {
|
|
122 intrst = int( tmp / 100 ) * 100
|
|
123 }
|
|
124
|
|
125 /* 追加情報 */
|
|
126 info := fmt.Sprintf( "%.2f,%d =", tmp, e.ed )
|
|
127 for i, _ := range nyds {
|
|
128 info += fmt.Sprintf( ": %d %d ", e.yd0[i], e.yd1[i] )
|
|
129 }
|
|
130
|
|
131 return intrst, info
|
|
132 }
|
|
133
|