/*
教育ローンシュミレータ
*/
/* 本ロジックには浮動小数点誤差が考慮されていないため */
/**
* 与えられた値の小数点以下の桁数を返す
* multiply, subtractで使用
*
* 例)
* 10.12 => 2
* 99.999 => 3
* 33.100 => 1
*/
function _getDecimalLength(value) {
var list = (value + '').split('.'), result = 0;
if (list[1] !== undefined && list[1].length > 0) {
result = list[1].length;
}
return result;
};
/**
* 乗算処理
*
* value1, value2から小数点を取り除き、整数値のみで乗算を行う。
* その後、小数点の桁数Nの数だけ10^Nで除算する
*/
function multiply(value1, value2) {
var intValue1 = +(value1 + '').replace('.', ''),
intValue2 = +(value2 + '').replace('.', ''),
decimalLength = _getDecimalLength(value1) + _getDecimalLength(value2),
result;
result = (intValue1 * intValue2) / Math.pow(10, decimalLength);
return result;
};
/**
* 減算処理
*
* value1,value2を整数値に変換して減算
* その後、小数点の桁数分だけ小数点位置を戻す
*/
function subtract(value1, value2) {
var max = Math.max(_getDecimalLength(value1), _getDecimalLength(value2)),
k = Math.pow(10, max);
return (multiply(value1, k) - multiply(value2, k)) / k;
};
/* 本ロジックには浮動小数点誤差が考慮されていないため ここまで追加 */
var riritu;
var hosyo_data;
$('#rito').change(function(){
if ($(this).is(':checked')) {
$('#shingaku').prop('checked', false);
$('#shingaku').prop('disabled', true);
$('#shingaku_box').addClass('color_hide');
$('#shingaku_p').addClass("tokurei_disable");
} else {
if (!$('#boshi').is(':checked')) {
$('#shingaku').prop('disabled', false);
$('#shingaku_box').removeClass("color_hide");
$('#shingaku_p').removeClass("tokurei_disable");
}
}
});
$('#boshi').change(function(){
if ($(this).is(':checked')) {
$('#shingaku').prop('checked', false);
$('#shingaku').prop('disabled', true);
$('#shingaku_box').addClass('color_hide');
$('#shingaku_p').addClass("tokurei_disable");
} else {
if (!$('#rito').is(':checked')) {
$('#shingaku').prop('disabled', false);
$('#shingaku_box').removeClass("color_hide");
$('#shingaku_p').removeClass("tokurei_disable");
}
}
});
$('#shingaku').change(function(){
if ($(this).is(':checked')) {
$('#rito').prop('checked', false);
$('#boshi').prop('checked', false);
$('#rito').prop('disabled', true);
$('#boshi').prop('disabled', true);
$('#rito_box, #boshi_box').addClass('color_hide');
$('#rito_p').addClass("tokurei_disable");
$('#boshi_p').addClass("tokurei_disable");
} else {
$('#rito').prop('disabled', false);
$('#boshi').prop('disabled', false);
$('#rito_box, #boshi_box').removeClass("color_hide");
$('#rito_p').removeClass("tokurei_disable");
$('#boshi_p').removeClass("tokurei_disable");
}
});
$(function(){
$.get("/js/data/kinri.dat", function(data){
riritu = data;
});
$.get("/js/data/hosyo.dat", function(data){
hosyo_data = data.split(/\r\n|\r|\n/);
console.log(hosyo_data);
});
$("#btn_calc").click(function(){
calc_simulation();
});
});
function calc_simulation(){
var err_txt = "";
var msg = "";
var kingaku = $("#kingaku").val();
$("#sec_error").hide();
if(kingaku == ""){
msg = "お借入れ希望金額を入力してください。";
err_txt += "
" + msg + "";
$("#kingaku_err").text(msg).show();
}else if(kingaku < 1 || 450 < kingaku){
/* 最低金額を変更@2020.05.01 */
msg = "1万円以上450万円以下の金額をご入力ください。";
// msg = "10万円以上450万円以下の金額をご入力ください。";
err_txt += "" + msg + "";
$("#kingaku_err").text(msg).show();
}else{
$("#kingaku_err").hide();
}
var kikan_y = $("#select1").val();
var kikan_m = $("#select2").val();
if(kikan_y == 0 && kikan_m == 0){
msg = "返済期間を入力してください。";
err_txt += "" + msg + "";
$("#kikan_err").text(msg).show();
}else if(kikan_y == 0 && kikan_m < 6){
msg = "6ヵ月以上の期間となるよう入力してください。";
err_txt += "" + msg + "";
$("#kikan_err").text(msg).show();
}else{
$("#kikan_err").hide();
}
var hensai_kaisu = (kikan_y * 12) + Number(kikan_m); // 月数
var sueoki_kaisu = 0;
var sueoki_y = 0;
var sueoki_m = 0;
var hensai_y = 0;
var hensai_m = 0;
// 母子家庭、交通遺児家庭、または世帯年収200万円以内(所得122万円以内)の方は18年以内。
// 進学利率特例追加 2016/03/04 by santiago.
if (
$('#boshi').is(':checked') ||
$('input[name=hosyo]:checked').val() == "two_thirds" ||
$('#shingaku').is(':checked') ||
$('#rito').is(':checked')
) {
if((kikan_y == 20 && 0 < kikan_m) || (20 < kikan_y)){
msg = "20年0ヵ月以内の期間を入力してください。";
err_txt += "" + msg + "";
$("#kikan_err").text(msg).show();
}
}else{
if((kikan_y == 20 && 0 < kikan_m) || (20 < kikan_y)){
msg = "20年0ヵ月以内の期間を入力してください。";
err_txt += "" + msg + "";
$("#kikan_err").text(msg).show();
}
}
sueoki_y = $("#select4").val();
sueoki_m = $("#select5").val();
sueoki_kaisu = (sueoki_y * 12) + Number(sueoki_m); // 月数
if (sueoki_kaisu != 0){
if(hensai_kaisu <= sueoki_kaisu){
msg = "返済期間より短い期間を入力してください。";
err_txt += "" + msg + "";
$("#pay_err").text(msg).show();
/***
}else if(sueoki_kaisu < 1){
msg = "1ヵ月以上の期間を入力してください。";
err_txt += "" + msg + "";
$("#pay_err").text(msg).show();
***/
}else{
$("#pay_err").text(msg).hide();
}
}
if(err_txt != ""){
$("#sec_error").show();
$("#error_mes").html("");
$("html,body").animate({scrollTop:0}, 100);
return false;
}
var riritu_y = get_nenri();
var riritu_m = riritu_y / 1200; // 月利 百分率の数値化
var sueoki_gaku = 0; // 元金据置中のご返済額
var hensai_gaku = 0; // 毎月のご返済額
var year_gaku = 0; // 1年間の返済額
var total_gaku = 0; // ご返済総額
var bonus_gaku = 0; // ボーナス月加算
var bonus_kaisu = 0; // ボーナス回数
var bonus_kasan = 0; // ボーナス回加算額
var kingaku_b = 0; // 借入金額 - ボーナス月支払額
var bonus_kingaku = 0; // ボーナス加算分
// 離島利率特例は、2契約に按分するので、そのための処理。
var kingaku_a = [];
var riritu_y_a = [];
var riritu_m_a = [];
var hensai_kaisu_a = [0, 0];
var sueoki_gaku_a = [0, 0];
var hensai_gaku_a = [0, 0];
var year_gaku_a = [0, 0];
var total_gaku_a = [0, 0];
var bonus_gaku_a = [0, 0];
var bonus_kaisu_a = [0, 0];
var bonus_kasan_a = [0, 0];
var kingaku_b_a = [0, 0];
var bonus_kingaku_a = [0, 0];
var keiyaku_su = 1;
// 離島利率特例は、150万円を超えると、2契約に按分する
// 進学利率特例追加 2016/03/04 by santiago.
var tokureiGaku = 150;
if (
$('#rito').is(':checked') ||
$('#shingaku').is(':checked')
) {
if (kingaku > tokureiGaku) {
keiyaku_su = 2;
kingaku_a[0] = tokureiGaku;
kingaku_a[1] = kingaku - tokureiGaku;
riritu_y_a[0] = Math.round((Number(riritu_y) - 0.9) * 100) / 100; // 特例利率 丸め
riritu_y_a[1] = riritu_y;
riritu_m_a[0] = riritu_y_a[0] / 1200; // 月利 百分率の数値化
riritu_m_a[1] = riritu_y_a[1] / 1200;
hensai_kaisu_a[0] = hensai_kaisu;
hensai_kaisu_a[1] = hensai_kaisu;
// 2 契約に按分
if($("#bonus_ritsu").val() != ""){ // ボーナス月返済増額あり
// bonus_kingaku_a[0] = Math.round(Number($("#bonus_zougaku").val()) * (kingaku_a[0] / kingaku));
// bonus_kingaku_a[1] = Number($("#bonus_zougaku").val()) - bonus_kingaku_a[0];
bonus_kingaku_a[0] = kingaku_a[0] * $("#bonus_ritsu").val() / 100; // 百分率の数値化
bonus_kingaku_a[1] = kingaku_a[1] * $("#bonus_ritsu").val() / 100;
// alert("ぼ増" + Number($("#bonus_zougaku").val()) + "を" + bonus_kingaku_a[0] + "と" + bonus_kingaku_a[1]);
}
} else {
// 1 契約
keiyaku_su = 1;
kingaku_a[0] = kingaku;
riritu_y_a[0] = Math.round((Number(riritu_y) - 0.9) * 100) / 100; // 特例利率 丸め
riritu_m_a[0] = riritu_y_a[0] / 1200; // 月利 百分率の数値化
hensai_kaisu_a[0] = hensai_kaisu;
if($("#bonus_ritsu").val() != ""){ // ボーナス月返済増額あり
// bonus_kingaku_a[0] = Number($("#bonus_zougaku").val());
bonus_kingaku_a[0] = kingaku_a[0] * $("#bonus_ritsu").val() / 100; // 百分率の数値化
}
}
} else {
// 通常計算
keiyaku_su = 1;
kingaku_a[0] = kingaku;
riritu_y_a[0] = riritu_y;
riritu_m_a[0] = riritu_y_a[0] / 1200; // 月利 百分率の数値化
hensai_kaisu_a[0] = hensai_kaisu;
if($("#bonus_ritsu").val() != ""){ // ボーナス月返済増額あり
// bonus_kingaku_a[0] = Number($("#bonus_zougaku").val());
bonus_kingaku_a[0] = kingaku_a[0] * $("#bonus_ritsu").val() / 100; // 百分率の数値化
}
}
for (var i = 0; i < keiyaku_su; i++){
// 元金据置中のご返済額
if (sueoki_kaisu != 0){ // 利息のみお支払期間
sueoki_gaku_a[i] = Math.floor(kingaku_a[i] * riritu_m_a[i] * 10000); // 10000 は、万円の数値化
hensai_kaisu_a[i] -= sueoki_kaisu;
}
hensai_y = Math.floor(hensai_kaisu_a[i] / 12); // 年数
hensai_m = hensai_kaisu_a[i] % 12; // 月数
bonus_kaisu_a[i] = Math.floor(((hensai_kaisu_a[i] - 3) / 6) + Number(1));
if($("#bonus_ritsu").val() != ""){ // ボーナス月返済増額あり
// bonus_kingaku_a[i] = kingaku_a[i] * $("#select3").val() / 100; // 百分率の数値化
bonus_kasan_a[i] = bonus_kingaku_a[i] * 10000 * ((Math.pow(Number(riritu_m_a[i]) + Number(1), (bonus_kaisu_a[i] * 6) + Number(3)) - Math.pow(Number(riritu_m_a[i]) + Number(1), (bonus_kaisu_a[i] * 6) - Number(3))) / (Math.pow(Number(riritu_m_a[i]) + Number(1), (6 * bonus_kaisu_a[i])) - Number(1))); // 10000 は、万円の数値化
bonus_kasan_a[i] = Math.floor(bonus_kasan_a[i]);
}
kingaku_b_a[i] = kingaku_a[i] - bonus_kingaku_a[i];
// 2015/12/03 顧客要望にて日本公庫の修正点反映 by santiago.
// 1年間のご返済額 据置措置なしの場合返済回数 - 1
if (sueoki_kaisu != 0){
hensai_gaku_a[i] = kingaku_b_a[i] * 10000 * (riritu_m_a[i] / (Number(1) - Number(Math.pow(Number(riritu_m_a[i]) + Number(1), 0 - Number(hensai_kaisu_a[i]))))); // 10000 は、万円の数値化
} else {
hensai_gaku_a[i] = kingaku_b_a[i] * 10000 * (riritu_m_a[i] / (Number(1) - Number(Math.pow(Number(riritu_m_a[i]) + Number(1), 0 - (Number(hensai_kaisu_a[i]) - Number(1)))))); // 10000 は、万円の数値化
}
hensai_gaku_a[i] = Math.floor(hensai_gaku_a[i]);
if(0 < bonus_kasan_a[i]){
bonus_gaku_a[i] = Number(hensai_gaku_a[i]) + Number(bonus_kasan_a[i]);
bonus_gaku_a[i] = Math.floor(bonus_gaku_a[i]);
year_gaku_a[i] = (hensai_gaku_a[i] * 12) + Number(bonus_kasan_a[i] * 2); // 1年分
}else{
year_gaku_a[i] = hensai_gaku_a[i] * 12; // 1年分
}
// 2015/12/03 顧客要望にて日本公庫の修正点反映 by santiago.
// 1年間のご返済額 据置措置なしの場合返済回数 - 1
if (sueoki_kaisu != 0){
total_gaku_a[i] = Number(hensai_gaku_a[i] * hensai_kaisu_a[i]) + Number(sueoki_gaku_a[i] * sueoki_kaisu) + Number(bonus_kasan_a[i] * bonus_kaisu_a[i]);
} else {
total_gaku_a[i] = Number(hensai_gaku_a[i] * (hensai_kaisu_a[i] - Number(1))) + Number(sueoki_gaku_a[i] * sueoki_kaisu) + Number(bonus_kasan_a[i] * bonus_kaisu_a[i]);
}
}
// 2契約分を合算する。
var sueoki_gaku = sueoki_gaku_a[0] + sueoki_gaku_a[1];
var hensai_gaku = hensai_gaku_a[0] + hensai_gaku_a[1];
var year_gaku = year_gaku_a[0] + year_gaku_a[1];
var total_gaku = total_gaku_a[0] + total_gaku_a[1];
var bonus_gaku = bonus_gaku_a[0] + bonus_gaku_a[1];
// ボーナス回数は、それぞれの契約での回数なので、合算しない。
var bonus_kaisu = bonus_kaisu_a[0];
var bonus_kasan = bonus_kasan_a[0] + bonus_kasan_a[1];
var kingaku_b = kingaku_b_a[0] + kingaku_b_a[1];
var bonus_kingaku = bonus_kingaku_a[0] + bonus_kingaku_a[1];
/***
alert(
"元金据置中のご返済額 " + sueoki_gaku + " を " + sueoki_gaku_a[0] + " と " + sueoki_gaku_a[1] + " に " + "\n" +
"毎月のご返済額 " + hensai_gaku + " を " + hensai_gaku_a[0] + " と " + hensai_gaku_a[1] + " に " + "\n" +
"1年間の返済額 " + year_gaku + " を " + year_gaku_a[0] + " と " + year_gaku_a[1] + " に " + "\n" +
"ご返済総額 " + total_gaku + " を " + total_gaku_a[0] + " と " + total_gaku_a[1] + " に " + "\n" +
"ボーナス月加算 " + bonus_gaku + " を " + bonus_gaku_a[0] + " と " + bonus_gaku_a[1] + " に " + "\n" +
"ボーナス回数 " + bonus_kaisu + "\n" +
"ボーナス回加算額 " + bonus_kasan + " を " + bonus_kasan_a[0] + " と " + bonus_kasan_a[1] + " に " + "\n" +
"借入金額 - ボーナス月支払額 " + kingaku_b + " を " + kingaku_b_a[0] + " と " + kingaku_b_a[1] + " に " + "\n" +
"ボーナス加算分 " + bonus_kingaku + " を " + bonus_kingaku_a[0] + " と " + bonus_kingaku_a[1] + " に ");
***/
// 保証料総額
// var hosyo_gaku = Math.floor(kingaku * 10000 * get_hosyo()); // 10000 は、万円の数値化
var hosyo_gaku = 0;
if ($('input[name=hosyo]:checked').val() != "no") {
// hosyo_gaku = Math.floor(kingaku * 10000 * get_hosyo()); // 10000 は、万円の数値化
// 小数点以下は切り捨て
hosyo_gaku = Math.floor(multiply(kingaku + "0000", get_hosyo())); // 浮動小数点誤差対応版
}
if (sueoki_kaisu != 0){ // 利息のみお支払期間
var hosyo_kikan = (sueoki_y * 12) + Number(sueoki_m); // 月数
if(23 < hosyo_kikan && hosyo_kikan <= 35){
hosyo_gaku = Math.floor(hosyo_gaku * 1.2);
}else if(35 < hosyo_kikan && hosyo_kikan <= 47){
hosyo_gaku = Math.floor(hosyo_gaku * 1.3);
}else if(47 < hosyo_kikan && hosyo_kikan <= 59){
hosyo_gaku = Math.floor(hosyo_gaku * 1.4);
}else if(59 < hosyo_kikan && hosyo_kikan <= 71){
hosyo_gaku = Math.floor(hosyo_gaku * 1.5);
}else if(71 < hosyo_kikan && hosyo_kikan <= 216){
hosyo_gaku = Math.floor(hosyo_gaku * 1.6);
}
}
if ($('input[name=hosyo]:checked').val() == "two_thirds") {
hosyo_gaku = Math.floor(hosyo_gaku * 2 / 3);
}
// $("#nen_kinri").text(riritu_y_a[0]);
// $("#sueoki_y").text(sueoki_y);
// $("#sueoki_m").text(sueoki_m);
$("#sueoki_kaisu").text(sueoki_kaisu);
$("#sueoki_gaku").text(add_comma(hasu_keisan(sueoki_gaku)));
// $("#hensai_y").text(hensai_y);
// $("#hensai_m").text(hensai_m);
if (bonus_gaku > 0) {
if (sueoki_kaisu == 0){ // 据え置き回数が 0 の場合は、返済回数を -1 する、顧客要望 by santiago.
$("#hensai_kaisu").text(hensai_kaisu_a[0] - bonus_kaisu - 1); //毎月の返済回数 - ボーナス回数
} else {
$("#hensai_kaisu").text(hensai_kaisu_a[0] - bonus_kaisu); //毎月の返済回数 - ボーナス回数
}
} else {
if (sueoki_kaisu == 0){ // 据え置き回数が 0 の場合は、返済回数を -1 する、顧客要望 by santiago.
$("#hensai_kaisu").text(hensai_kaisu_a[0] - 1); //毎月の返済回数
} else {
$("#hensai_kaisu").text(hensai_kaisu_a[0]); //毎月の返済回数
}
}
$("#hensai_gaku").text(add_comma(hasu_keisan(hensai_gaku)));
if (bonus_gaku > 0) {
$("#bonus_kaisu").text(bonus_kaisu);
$("#bonus_gaku").text(add_comma(hasu_keisan(bonus_gaku)));
} else {
$("#bonus_kaisu").text("0");
$("#bonus_gaku").text(add_comma(hasu_keisan(bonus_gaku)));
}
if(hensai_y < 1){
$("#year_gaku").closest("tr").hide();
}else{
$("#year_gaku").closest("tr").show();
$("#year_gaku").text(add_comma(hasu_keisan(year_gaku)));
}
$("#total_gaku").text(add_comma(hasu_keisan(total_gaku)));
$("#hosyo_gaku").text(add_comma(hosyo_gaku));
$("#sec_error").hide();
return false;
}
function add_comma(val){
var num = new String(val).replace(/,/g, "");
while(num != (num = num.replace(/^(-?\d+)(\d{3})/, "$1,$2")));
return num;
}
function hasu_keisan(val){
return Math.ceil(Math.floor(val) / 100) * 100; // 丸め
}
// 百分率
// 進学利率特例追加 2016/03/04 by santiago.
function get_nenri(){
if (
$('#boshi').is(':checked') ||
$('#shingaku').is(':checked')
) { // 母子家庭 OR 世帯年収(所得)200万円(122万円)以内
return Math.round((Number(riritu) - 0.4) * 100) / 100; // 丸め
}else{
return riritu;
}
}
function get_hosyo(){
var rate = 0;
var kaisu = ($("#select1").val() * 12) + Number($("#select2").val());
for(var i = 0; i < hosyo_data.length; i++){
var hosyo = hosyo_data[i].split(',');
if(hosyo[0] == kaisu){
rate = hosyo[1];
break;
}
}
return rate;
}