Mercurial > mercurial > hgweb_golang.cgi
annotate src/entai/entai.go @ 4:4c6bfc90d75c
rate fix & not consider last date
| author | pyon@macmini |
|---|---|
| date | Tue, 18 Oct 2016 21:28:25 +0900 |
| parents | ca866a38a6a0 |
| children | e4066309b04f |
| rev | line source |
|---|---|
| 0 | 1 /****************************************************************************/ |
|
3
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
2 /* Entai.go ( ver 0.3 ) */ |
| 4 | 3 /* Last Change: 2016-10-18 Tue 21:26:15. */ |
|
3
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
4 /* By T.Mutoh */ |
| 0 | 5 /****************************************************************************/ |
| 6 | |
| 7 package entai | |
| 8 | |
| 9 import ( | |
| 10 "fmt" | |
|
3
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
11 "strconv" |
| 0 | 12 "time" |
| 13 ) | |
| 14 | |
| 15 var rate0s, rate1s []float64 | |
| 16 var nyds []time.Time | |
| 17 | |
| 18 type Entai struct { | |
| 19 tax int // 税額 | |
| 20 ed int // 経過日数 | |
| 21 yd0 []int // 各年の 1カ月以内の日数 | |
| 22 yd1 []int // 各年の 1カ月超えの日数 | |
| 23 | |
| 24 due time.Time | |
| 25 paid time.Time | |
| 26 am time.Time | |
| 27 } | |
| 28 | |
| 29 func init() { | |
|
3
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
30 } |
|
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
31 |
|
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
32 func ( e *Entai ) DefaultRates() { |
| 0 | 33 // 1カ月まで, 1カ月経過後, 元旦 |
| 34 createRates( 4.3, 14.6, "20120101" ) // H24 | |
| 35 createRates( 4.3, 14.6, "20130101" ) // H25 | |
| 4 | 36 createRates( 2.9, 9.2, "20140101" ) // H26 |
| 37 createRates( 2.8, 9.1, "20150101" ) // H27 | |
| 0 | 38 createRates( 2.8, 9.1, "20160101" ) // H28 |
| 2 | 39 createRates( 2.8, 9.1, "20170101" ) // H29 ***** |
|
3
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
40 |
|
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
41 for range nyds { |
|
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
42 e.yd0 = append( e.yd0, 0 ) |
|
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
43 e.yd1 = append( e.yd1, 0 ) |
|
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
44 } |
| 0 | 45 } |
| 46 | |
| 2 | 47 func createRates( r0, r1 float64, nyd string ) { |
| 48 t, _ := time.Parse( "20060102", nyd ) | |
| 0 | 49 rate0s = append( rate0s, r0 / 100 ) |
| 50 rate1s = append( rate1s, r1 / 100 ) | |
| 51 nyds = append( nyds, t ) | |
| 52 } | |
| 53 | |
|
3
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
54 func ( e *Entai ) AddRates( nyd, r0, r1 string ) error { |
|
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
55 rf0, err := strconv.ParseFloat( r0, 64 ); if err != nil { |
|
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
56 return err |
|
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
57 } |
|
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
58 rf1, err := strconv.ParseFloat( r1, 64 ); if err != nil { |
|
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
59 return err |
|
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
60 } |
|
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
61 createRates( rf0, rf1, nyd ) |
|
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
62 e.yd0 = append( e.yd0, 0 ) |
|
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
63 e.yd1 = append( e.yd1, 0 ) |
|
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
64 return nil |
|
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
65 } |
|
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
66 |
| 0 | 67 func ( e Entai ) String() string { |
| 68 return "Entai....." | |
| 69 } | |
| 70 | |
|
3
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
71 func ( e Entai ) GetRates() string { |
| 0 | 72 var str string |
| 73 for i, n := range nyds { | |
| 74 str += fmt.Sprintf( " (H%d) ", n.Year() - 1988 ) | |
| 75 str += fmt.Sprintf( "%s :%4.1f / %4.1f\n", n.Format("2006.01.02"), rate0s[i] * 100, rate1s[i] * 100 ) | |
| 76 } | |
| 77 return str | |
| 78 } | |
| 79 | |
| 80 func ( e *Entai ) countDays() { | |
| 81 | |
| 2 | 82 for i, _ := range nyds { |
| 83 e.yd0[i] = 0 | |
| 84 e.yd1[i] = 0 | |
| 0 | 85 } |
| 86 | |
| 87 // 1カ月後の算出 | |
| 88 for tmp := e.due; ; { | |
| 89 tmp = tmp.AddDate( 0, 0, 1 ) | |
| 90 for i, nyd := range nyds { | |
| 91 if tmp.Year() == nyd.Year() { | |
| 92 e.yd0[i]++ | |
| 93 } | |
| 94 } | |
| 95 if tmp.Day() == e.due.Day() { | |
| 96 e.am = tmp | |
| 97 break | |
| 98 } | |
| 2 | 99 if tmp == e.due.AddDate( 0, 1, 0 ) { |
| 100 tmp = tmp.AddDate( 0, 0, -1 ) | |
| 101 e.am = tmp | |
| 102 break | |
| 103 } | |
| 0 | 104 } |
| 105 | |
| 106 // 過ぎた日数の算出 | |
| 107 for i := 1; ; i++ { | |
| 108 tmp := e.due.AddDate( 0, 0, i ) | |
| 109 for j, nyd := range nyds { | |
| 110 if tmp.Year() == nyd.Year() { | |
| 111 e.yd1[j]++ | |
| 112 } | |
| 113 } | |
| 114 if e.paid.Sub( tmp ) == 0 { | |
| 115 for j, _ := range nyds { | |
| 116 e.yd1[j] -= e.yd0[j] | |
| 117 } | |
| 4 | 118 e.ed = i |
| 119 //e.yd1[len(e.yd1)-1]-- // コメントアウト:最終日を参入しない | |
| 120 //e.ed-- // 同上 | |
| 0 | 121 break |
| 122 } | |
| 123 } | |
| 124 } | |
| 125 | |
| 126 func ( e *Entai ) Set( d, p time.Time, g int ) { | |
| 127 e.due, e.paid = d, p | |
| 128 e.tax = g | |
| 129 e.countDays() | |
| 130 } | |
| 131 | |
| 132 func ( e *Entai ) Result() ( int, string ) { | |
| 133 | |
| 134 /* 税額の前処理 */ | |
| 135 if e.tax < 2000 { | |
| 136 return 0, "tax < 2000" | |
| 137 } | |
|
3
ca866a38a6a0
Implement intaractive-mode & setting from config-file.
pyon@macmini
parents:
2
diff
changeset
|
138 e.tax = int( e.tax / 1000 ) * 1000 // 端数処理 |
| 0 | 139 |
| 140 /* 本計算 */ | |
| 141 var tmp float64 | |
| 142 for i, _ := range nyds { | |
| 2 | 143 tmp += float64( e.yd0[i] ) * rate0s[i] + float64( e.yd1[i] ) * rate1s[i] |
| 0 | 144 } |
| 2 | 145 tmp *= float64( e.tax ) / 365.0 |
| 0 | 146 |
| 147 /* 利息の後処理&端数処理 */ | |
| 148 var intrst int | |
| 149 if tmp < 1000 { | |
| 150 intrst = 0 | |
| 151 } else { | |
| 152 intrst = int( tmp / 100 ) * 100 | |
| 153 } | |
| 154 | |
| 155 /* 追加情報 */ | |
| 2 | 156 detail := fmt.Sprintf( "%d,%.0f,%d =", e.tax, tmp, e.ed ) |
| 0 | 157 for i, _ := range nyds { |
| 2 | 158 tmp1 := float64( e.yd0[i] ) * rate0s[i] * float64( e.tax ) / 365.0 |
| 159 tmp2 := float64( e.yd1[i] ) * rate1s[i] * float64( e.tax ) / 365.0 | |
| 4 | 160 detail += fmt.Sprintf( ": %d %d (%.1f+%.1f=%.1f)", e.yd0[i], e.yd1[i], tmp1, tmp2, tmp1 + tmp2 ) |
| 0 | 161 } |
| 162 | |
| 2 | 163 return intrst, detail |
| 0 | 164 } |
| 165 |
