コロナ対策の３０万円の給付金を受け取れるか、JavaScriptで簡易チェッカーを作る

# はじめに
コロナ対策の給付金に関する概略が出てきました。このご時世、３０万円の給付金を受け取れるかどうかは大きいですよね。

ですが、住民税や年収や均等割など、普段生活している人にとっては聞き慣れない言葉が多数出てきます。
実際、私達はコロナ対策の給付金を受け取れるのでしょうか。受給のための条件をチェックします。

また、前置きは良いからすぐに自分をチェックしたいという人のため、CodePenのリンクをここにも載せます。
https://codepen.io/gurujowa/full/JjYPWax

# 受給条件についておさらい
こちらの東京新聞の記事に、わかりやすい条件のまとめが出ていました。
https://www.tokyo-np.co.jp/article/economics/economic_confe/list/CK2020040802000149.html
![Screenshot 2020-04-08 at 14.54.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246333/0a9707d6-f06d-7a0a-d841-012041e69e06.png)



ざっくりいうと、

- 二～六月のうち、いずれか一カ月でも世帯主の収入が、住民税の「均等割」といわれる部分が非課税になる水準まで減っている
- 収入が半分以下になり、かつ月収が年収換算で住民税非課税水準の二倍以下となる

この２つのパターンですね。これら２つはor条件なので、それぞれにおいて、条件を計算するプログラムを作っていき、それをor条件で接続したいと思います。

# 世帯主の定義
まずは世帯主の定義ですね。ニュースにもなっていますが、この給付金がもらえるかどうかは世帯主の月収にかかっています。
一番勘違いしやすいのが、夫婦でそれぞれ収入がある場合ですね。例えば妻が失業して収入がゼロになっても、夫がそのままなら給付金の対象外です。
※「誰が世帯主なのか分からない」という場合は、現在住所を置いている市区町村で発行された、「住民票」で確認しましょう。

今回、世帯主の収入が計算のもとになるんだよということをわかりやすくするため、入力フォームには世帯主の情報を記載し、
記載内容にのって後の質問文を変更するようにします。

```index.html
<div>
あなたの家庭の世帯主は誰ですか？
<br />
<select name="head" onChange="onChangeHead(this)">
<option value="" selected></option>
<option value="あなた">自分</option>
<option value="妻">妻</option>
<option value="夫">夫</option>
<option value="世帯主">その他</option>
</select>
</div>
```

``` index.js

function onChangeHead(object) {
  const before = document.getElementById("headBefore");
  before.innerHTML = object.value;
  const after = document.getElementById("headAfter");
  after.innerHTML = object.value;
}

```

# 住民税が非課税になる３つのケース
住民税が非課税のケースですが、柏市のサイトにわかりやすいまとめが載っていました。
http://www.city.kashiwa.lg.jp/soshiki/040400/p004372.html

これによると、住民税が非課税になるケースは下記の３つです。

1. 生活保護を受けている人
2. 障がい者、未成年者、寡婦または寡夫で前年の合計所得が125万円以下（給与収入のみの場合204万4000円未満）であった人
3. 前年の合計所得金額が条例で定める金額以下の人

１番の生活保護に関しては受給しているかどうかは本人にとっては明白なのでわかりやすいですね。
２番の合計所得が１２５万円も、条件は明確でわかりやすいですね。

問題は３番のそれ以外の方です。これが一番該当者が多いのですが、なんと、市区町村によって違う模様。。。。
また、検索したけれど全国市区町村のデータはなかなかありません。級地制度というものによって変わるようですが、どこのサイトをみても、お住いの市区町村に聞いてくださいとしか書いていません。
今後、この給付金の問い合わせで日本全国の市役所が大変なことになると思うのですが・・・・・
さしあたって全国市区町村のデータについては後回しし、東京２３区のデータを出してみます。

## 非課税所得金額の計算（東京２３区）

非課税所得金額は、世帯の人数によって代わります。ですので、世帯人数がわかれば大体の非課税所得金額がわかります。

ここらへんも、詳しく調べると所得控除などでかなりややこしいのですが、詳しい算出方法は制度の詳細を待たないとどうしようもないので、
さしあたって今回はニュースで出ていたデータをもとにして計算できるようにします。

```index.js
const exemptIncome = {
  1: 1000000,
  2: 1560000,
  3: 2057000,
  4: 2557000
};
```

# 受給条件のチェック
さて、条件１ですが、住民税の非課税要件です。
住民税の非課税要件を計算するためには、扶養人数が大事なので、まずこれを入力するテキストボックスをつくります。
また、非課税かどうかをチェックするのは一番収入が落ち込んだ月の月収で見るようです。
なので、一番収入が落ち込んだ月の月収を記入してもらい、それを年収ベースに直したうえで、扶養人数ごとの非課税年収と照らし合わせてチェックします。

``` index.js
const exemptIncome = {
  1: 1000000,
  2: 1560000,
  3: 2057000,
  4: 2557000
};

function getExempt(member) {
  return exemptIncome[member];
}

function checkExemptIncome(monthlyIncome, member) {
  const annualIncome = monthlyIncome * 12;
  const exemptIncome = getExempt(member);
  console.log("exemptIncome", annualIncome, exemptIncome);

  return annualIncome <= exemptIncome ? true : false;
}
```

そして、条件２は月収がコロナ蔓延前の半分以下になったかどうかです。
これを調べるためには、コロナ前の収入も入力してもらわなければいけないので、入力してもらいます。
もし今後、源泉徴収票などをチェックするようになれば単純な月収ではダメになるかもしれませんが、さしあたっては同じ月収で比較してみます。

```index.js
function checkIncomeDownHalf(monthlyIncomeBefore, monthlyIncomeAfter, member) {
  const annualIncomeBefore = monthlyIncomeBefore * 12;
  const annualIncomeAfter = monthlyIncomeAfter * 12;
  const exemptIncomeDouble = getExempt(member) * 2;

  console.log("downhalf", annualIncomeBefore,annualIncomeAfter, exemptIncomeDouble);
  if (annualIncomeBefore < annualIncomeAfter * 2) {
    return false;
  } else if (exemptIncomeDouble < annualIncomeAfter) {
    return false;
  } else {
    return true;
  }
}
```

月収を単純に１２倍し、それを住民税の非課税要件の２倍と比較しているだけです。
ここらへんも、そのうち政府から詳細な計算式が出るかと思いますので、もし政府から計算式が出たら修正します。

そして、この２つの受給条件はor条件なので、その処理もしたうえで、結果を表示するようにします。

```index.js
  const checkGetMoney =
  checkIncomeDownHalf(beforeIncome, afterIncome, member) ||
  checkExemptIncome(afterIncome, member);
```

# フォームの入力と表示

さて、簡易的なロジックは作りましたので、これをフォーム入力し、表示する表示側の画面もつくりましょう。
さしあたってかんたんにhtmlとJavaScriptだけで作っています。

```index.html
<h1> 東京２３区 コロナ対策給付金支給チェッカー </h1>

<form name="checkCorona" id="coronaForm" onSubmit="return submitCoronaForm();">
<div>
あなたの家庭の世帯主は誰ですか？
<br />
<select name="head" onChange="onChangeHead(this)">
<option value="" selected></option>
<option value="あなた">自分</option>
<option value="妻">妻</option>
<option value="夫">夫</option>
<option value="世帯主">その他</option>
</select>
</div>
<br />
<div>
  <span id="headBefore" >世帯主</span>のコロナ感染拡大前の月収を入力してください。<br />
  ※2020年1月以前<br />
  <input type="text" id="inputBeforeIncome" />
</div>
<br />
<div>
  <span id="headAfter" >世帯主</span>のコロナ感染拡大前の月収を入力してください。<br />
  ※2020年2月以降で最も低い月収です<br />
  <input type="text" id="inputAfterIncome" />
</div>
<br />
<div>
  世帯（家族）の人数を入力してください。<br />
<select id="member" name="member">
<option value="" selected></option>
<option value="1">単身</option>
<option value="2">扶養１人</option>
<option value="3">扶養２人</option>
<option value="4">扶養３人</option>
</select>
</div>
<br />
  
<input type="submit" value="チェックする" />
</form>
<br />
<div id="result">
</div>
<hr />
このチェッカーは簡易版です。正確な判定は政府からの詳細をお待ち下さい。
```

```index.js
const exemptIncome = {
  1: 1000000,
  2: 1560000,
  3: 2057000,
  4: 2557000
};

function onChangeHead(object) {
  const before = document.getElementById("headBefore");
  before.innerHTML = object.value;
  const after = document.getElementById("headAfter");
  after.innerHTML = object.value;
}

function getExempt(member) {
  return exemptIncome[member];
}

function checkExemptIncome(monthlyIncome, member) {
  const annualIncome = monthlyIncome * 12;
  const exemptIncome = getExempt(member);
  console.log("exemptIncome", annualIncome, exemptIncome);

  return annualIncome <= exemptIncome ? true : false;
}

function checkIncomeDownHalf(monthlyIncomeBefore, monthlyIncomeAfter, member) {
  const annualIncomeBefore = monthlyIncomeBefore * 12;
  const annualIncomeAfter = monthlyIncomeAfter * 12;
  const exemptIncomeDouble = getExempt(member) * 2;

  console.log("downhalf", annualIncomeBefore,annualIncomeAfter, exemptIncomeDouble);
  if (annualIncomeBefore < annualIncomeAfter * 2) {
    return false;
  } else if (exemptIncomeDouble < annualIncomeAfter) {
    return false;
  } else {
    return true;
  }
}

function submitCoronaForm() {
  const beforeIncome = document.getElementById("inputBeforeIncome").value;
  const afterIncome = document.getElementById("inputAfterIncome").value;
  const member = document.getElementById("member").value;
  
  if (!beforeIncome || !afterIncome || !member ) {
    document.getElementById("result").innerHTML = "値を入力してください";
    return false;
  }

  const checkGetMoney =
    checkIncomeDownHalf(beforeIncome, afterIncome, member) ||
    checkExemptIncome(afterIncome, member);
  
  if (checkGetMoney) {
    document.getElementById("result").innerHTML = "あなたは給付金をもらうことができます！";
  } else {
    document.getElementById("result").innerHTML = "給付金をもらうことができません。残念！"; 
  }

  return false;
}

```

# プログラムの実行
さて、実際にこのプログラムを表示してみます。
![Screenshot 2020-04-08 at 17.19.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246333/45584272-671e-a8e4-5fa3-685b2046a362.png)


うまく表示されていますね。 実際に動くプログラムはCodePenで公開していますので、興味のある方は触ってみてください。
https://codepen.io/gurujowa/pen/JjYPWax

もし、指摘・修正事項あればコメントしていただけますと幸いです。
また、何度も言いますが、あくまで超簡易版なので、実際のチェッカーは政府から詳細が発表されたあとに作り込む必要があります。
また、東京以外の人や、未成年などの処理についても後ほど加える必要があります。

ですが、色々触ってみると面白いので、皆さん触ってみてください。