diff src/entai/entai.go @ 0:de451fa0c9cd

golang repository.
author pyon@macmini
date Sat, 01 Oct 2016 11:16:31 +0900
parents
children 451c99c1d9de
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/entai/entai.go	Sat Oct 01 11:16:31 2016 +0900
@@ -0,0 +1,133 @@
+/****************************************************************************/
+/* Entai.go ( ver 0.1 )                                                     */
+/*                                    Last Change: 2016-09-30 Fri 20:15:52. */
+/****************************************************************************/
+
+package entai
+
+import (
+    "fmt"
+    "time"
+)
+
+var rate0s, rate1s []float64
+var nyds           []time.Time
+
+type Entai struct {
+    tax    int	 // 税額
+	ed     int   // 経過日数
+	yd0    []int // 各年の 1カ月以内の日数
+	yd1    []int // 各年の 1カ月超えの日数
+
+    due     time.Time
+    paid    time.Time
+    am      time.Time
+}
+
+func init() {
+    // 1カ月まで, 1カ月経過後, 元旦
+	createRates( 4.3, 14.6, "20120101" )	// H24
+	createRates( 4.3, 14.6, "20130101" )	// H25
+	createRates( 4.3, 14.6, "20140101" )	// H26
+	createRates( 2.9,  9.2, "20150101" )	// H27
+	createRates( 2.8,  9.1, "20160101" )	// H28
+}
+
+func createRates( r0, r1 float64, y string ) {
+	t, _ := time.Parse( "20060102", y )
+	rate0s = append( rate0s, r0 / 100 )
+	rate1s = append( rate1s, r1 / 100 )
+	nyds   = append( nyds, t )
+}
+
+func ( e Entai ) String() string {
+    return "Entai....."
+}
+
+func ( e Entai ) GetRate() string {
+	var str string
+	for i, n := range nyds {
+		str += fmt.Sprintf( " (H%d) ", n.Year() - 1988 )
+		str += fmt.Sprintf( "%s :%4.1f / %4.1f\n", n.Format("2006.01.02"), rate0s[i] * 100, rate1s[i] * 100 )
+	}
+	return str
+}
+
+func ( e *Entai ) countDays() {
+
+	for range nyds {
+		e.yd0 = append( e.yd0, 0 )
+		e.yd1 = append( e.yd1, 0 )
+	}
+
+	// 1カ月後の算出
+    for tmp := e.due; ; {
+        tmp = tmp.AddDate( 0, 0, 1 )
+		for i, nyd := range nyds {
+			if tmp.Year() == nyd.Year() {
+				e.yd0[i]++
+			}
+		}
+        if tmp.Day() == e.due.Day() {
+			e.am = tmp
+            break
+        }
+    }
+
+	// 過ぎた日数の算出
+	for i := 1; ; i++ {
+		tmp := e.due.AddDate( 0, 0, i )
+		for j, nyd := range nyds {
+			if tmp.Year() == nyd.Year() {
+				e.yd1[j]++
+			}
+		}
+		if e.paid.Sub( tmp ) == 0 {
+			for j, _ := range nyds {
+				e.yd1[j] -= e.yd0[j]
+			}
+			e.yd1[len(e.yd1)-1]--
+			e.ed = i - 1
+            break
+		}
+    }
+}
+
+func ( e *Entai ) Set( d, p time.Time, g int ) {
+    e.due, e.paid = d, p
+    e.tax = g
+    e.countDays()
+}
+
+func ( e *Entai ) Result() ( int, string ) {
+
+	/* 税額の前処理 */
+	if e.tax < 2000 {
+		return 0, "tax < 2000"
+	}
+	e.tax = int( e.tax / 1000 * 1000 ) // 端数処理
+
+	/* 本計算 */
+	var tmp float64
+	for i, _ := range nyds {
+		tmp += float64(e.yd0[i]) * rate0s[i] + float64(e.yd1[i]) * rate1s[i]
+	}
+	tmp *= float64(e.tax) / 365.0
+
+	/* 利息の後処理&端数処理 */
+	var intrst int
+	if tmp < 1000 {
+		intrst = 0
+	} else {
+		intrst = int( tmp / 100 ) * 100
+	}
+
+	/* 追加情報 */
+	info := fmt.Sprintf( "%.2f,%d =", tmp, e.ed )
+	for i, _ := range nyds {
+		info += fmt.Sprintf( ": %d %d ", e.yd0[i], e.yd1[i] )
+	}
+
+    return intrst, info
+}
+