github.com/spi-ca/misc@v1.0.1/monetary/installment_test.go (about)

     1  package monetary
     2  
     3  import (
     4  	"github.com/ericlagergren/decimal"
     5  	"math/big"
     6  	"testing"
     7  )
     8  
     9  func TestInstallment(t *testing.T) {
    10  	var (
    11  		charge                       decimal.Big
    12  		annualInterest               decimal.Big
    13  		annualInterestFrac           big.Rat
    14  		annualInterestFracPercentage big.Rat
    15  		modDigit                     = 2
    16  		division                     = 36
    17  	)
    18  	charge.SetUint64(10_000_000)
    19  	annualInterest.SetMantScale(125, 3)
    20  	annualInterest.Rat(&annualInterestFrac)
    21  	annualInterestFracPercentage.Mul(&annualInterestFrac, big.NewRat(100, 1))
    22  	chargeInt, _ := charge.Int64()
    23  
    24  	func() {
    25  		interestFee := MonthlyInstallmentInterestAmount(&charge, &annualInterestFrac)
    26  		interestFeeInt, _ := interestFee.Int64()
    27  		t.Logf("할부원금 %d 년이율 %s%% 납부 이자 %d",
    28  			chargeInt,
    29  			annualInterestFracPercentage.FloatString(2),
    30  			interestFeeInt,
    31  		)
    32  	}()
    33  
    34  	func() {
    35  		installment, installmentFractional, installmentWithFractional := MonthlyInstallmentInfo(&charge, modDigit, division)
    36  		installmentInt, _ := installment.Int64()
    37  		installmentFractionalInt, _ := installmentFractional.Int64()
    38  		installmentWithFractionalInt, _ := installmentWithFractional.Int64()
    39  		t.Logf("할부총원금 %d 월 할부 절사자리수 %d, %d 개월동안, 월납입액 %d, 우수리 %d 우수리 포함 월납입액 %d",
    40  			chargeInt,
    41  			modDigit,
    42  			division,
    43  			installmentInt,
    44  			installmentFractionalInt,
    45  			installmentWithFractionalInt,
    46  		)
    47  	}()
    48  	func() {
    49  		payExtraAmountEarlier := true
    50  		_, _, totalInterests,
    51  			principleBalanceBeforePayments,
    52  			principleBalanceAfterPayments,
    53  			installments,
    54  			interests,
    55  			schedules := MonthlyInstallmentSchedule(&charge, nil, modDigit, division, payExtraAmountEarlier)
    56  		totalInterestsInt, _ := totalInterests.Int64()
    57  
    58  		t.Logf("할부총원금 %d 년이율 %s%%, 월 할부 절사자리수 %d, %d 개월동안, 우수리 선납 %v 총 납부 이자 %d",
    59  			chargeInt,
    60  			"0",
    61  			modDigit,
    62  			division,
    63  			payExtraAmountEarlier,
    64  			totalInterestsInt,
    65  		)
    66  		for i := 0; i < division; i++ {
    67  			principleBalanceBeforePayments, principleBalanceAfterPayments, installment, interest, schedule := principleBalanceBeforePayments[i], principleBalanceAfterPayments[i], installments[i], interests[i], schedules[i]
    68  			principleBalanceBeforePaymentsInt, _ := principleBalanceBeforePayments.Int64()
    69  			installmentInt, _ := installment.Int64()
    70  			interestInt, _ := interest.Int64()
    71  			scheduleInt, _ := schedule.Int64()
    72  			principleBalanceAfterPaymentsInt, _ := principleBalanceAfterPayments.Int64()
    73  
    74  			t.Logf("%d번쨰 할부 납부 도래시, 납부전 할부원금 %d -> 월총금액 (월납입액 %d + 할부수수료 %d)=%d -> 납부 할부원금 %d",
    75  				i+1,
    76  				principleBalanceBeforePaymentsInt,
    77  				installmentInt,
    78  				interestInt,
    79  				scheduleInt,
    80  				principleBalanceAfterPaymentsInt,
    81  			)
    82  		}
    83  	}()
    84  
    85  	func() {
    86  		payExtraAmountEarlier := false
    87  		_, _, totalInterests,
    88  			principleBalanceBeforePayments,
    89  			principleBalanceAfterPayments,
    90  			installments,
    91  			interests,
    92  			schedules := MonthlyInstallmentSchedule(&charge, nil, modDigit, division, payExtraAmountEarlier)
    93  		totalInterestsInt, _ := totalInterests.Int64()
    94  
    95  		t.Logf("할부총원금 %d 년이율 %s%%, 월 할부 절사자리수 %d, %d 개월동안, 우수리 선납 %v 총 납부 이자 %d",
    96  			chargeInt,
    97  			"0",
    98  			modDigit,
    99  			division,
   100  			payExtraAmountEarlier,
   101  			totalInterestsInt,
   102  		)
   103  		for i := 0; i < division; i++ {
   104  			principleBalanceBeforePayments, principleBalanceAfterPayments, installment, interest, schedule := principleBalanceBeforePayments[i], principleBalanceAfterPayments[i], installments[i], interests[i], schedules[i]
   105  			principleBalanceBeforePaymentsInt, _ := principleBalanceBeforePayments.Int64()
   106  			installmentInt, _ := installment.Int64()
   107  			interestInt, _ := interest.Int64()
   108  			scheduleInt, _ := schedule.Int64()
   109  			principleBalanceAfterPaymentsInt, _ := principleBalanceAfterPayments.Int64()
   110  
   111  			t.Logf("%d번쨰 할부 납부 도래시, 납부전 할부원금 %d -> 월총금액 (월납입액 %d + 할부수수료 %d)=%d -> 납부 할부원금 %d",
   112  				i+1,
   113  				principleBalanceBeforePaymentsInt,
   114  				installmentInt,
   115  				interestInt,
   116  				scheduleInt,
   117  				principleBalanceAfterPaymentsInt,
   118  			)
   119  		}
   120  	}()
   121  
   122  	func() {
   123  		payExtraAmountEarlier := true
   124  		_, _, totalInterests,
   125  			principleBalanceBeforePayments,
   126  			principleBalanceAfterPayments,
   127  			installments,
   128  			interests,
   129  			schedules := MonthlyInstallmentSchedule(&charge, &annualInterest, modDigit, division, payExtraAmountEarlier)
   130  		totalInterestsInt, _ := totalInterests.Int64()
   131  
   132  		t.Logf("할부총원금 %d 년이율 %s%%, 월 할부 절사자리수 %d, %d 개월동안, 우수리 선납 %v 총 납부 이자 %d",
   133  			chargeInt,
   134  			annualInterestFracPercentage.FloatString(2),
   135  			modDigit,
   136  			division,
   137  			payExtraAmountEarlier,
   138  			totalInterestsInt,
   139  		)
   140  		for i := 0; i < division; i++ {
   141  			principleBalanceBeforePayments, principleBalanceAfterPayments, installment, interest, schedule := principleBalanceBeforePayments[i], principleBalanceAfterPayments[i], installments[i], interests[i], schedules[i]
   142  			principleBalanceBeforePaymentsInt, _ := principleBalanceBeforePayments.Int64()
   143  			installmentInt, _ := installment.Int64()
   144  			interestInt, _ := interest.Int64()
   145  			scheduleInt, _ := schedule.Int64()
   146  			principleBalanceAfterPaymentsInt, _ := principleBalanceAfterPayments.Int64()
   147  
   148  			t.Logf("%d번쨰 할부 납부 도래시, 납부전 할부원금 %d -> 월총금액 (월납입액 %d + 할부수수료 %d)=%d -> 납부 할부원금 %d",
   149  				i+1,
   150  				principleBalanceBeforePaymentsInt,
   151  				installmentInt,
   152  				interestInt,
   153  				scheduleInt,
   154  				principleBalanceAfterPaymentsInt,
   155  			)
   156  		}
   157  	}()
   158  
   159  	func() {
   160  		payExtraAmountEarlier := false
   161  		_, _, totalInterests,
   162  			principleBalanceBeforePayments,
   163  			principleBalanceAfterPayments,
   164  			installments,
   165  			interests,
   166  			schedules := MonthlyInstallmentSchedule(&charge, &annualInterest, modDigit, division, payExtraAmountEarlier)
   167  		totalInterestsInt, _ := totalInterests.Int64()
   168  
   169  		t.Logf("할부총원금 %d 년이율 %s%%, 월 할부 절사자리수 %d, %d 개월동안, 우수리 선납 %v 총 납부 이자 %d",
   170  			chargeInt,
   171  			annualInterestFracPercentage.FloatString(2),
   172  			modDigit,
   173  			division,
   174  			payExtraAmountEarlier,
   175  			totalInterestsInt,
   176  		)
   177  		for i := 0; i < division; i++ {
   178  			principleBalanceBeforePayments, principleBalanceAfterPayments, installment, interest, schedule := principleBalanceBeforePayments[i], principleBalanceAfterPayments[i], installments[i], interests[i], schedules[i]
   179  			principleBalanceBeforePaymentsInt, _ := principleBalanceBeforePayments.Int64()
   180  			installmentInt, _ := installment.Int64()
   181  			interestInt, _ := interest.Int64()
   182  			scheduleInt, _ := schedule.Int64()
   183  			principleBalanceAfterPaymentsInt, _ := principleBalanceAfterPayments.Int64()
   184  
   185  			t.Logf("%d번쨰 할부 납부 도래시, 납부전 할부원금 %d -> 월총금액 (월납입액 %d + 할부수수료 %d)=%d -> 납부 할부원금 %d",
   186  				i+1,
   187  				principleBalanceBeforePaymentsInt,
   188  				installmentInt,
   189  				interestInt,
   190  				scheduleInt,
   191  				principleBalanceAfterPaymentsInt,
   192  			)
   193  		}
   194  	}()
   195  
   196  }