商品の売買を取り扱う時、消費税は必ず現れます。消費税の計算は倍率をかけるだけといってもいくつか計算方法が考えられます。いくつか計算方法が考えられますが国が定めている計算方法があるので調べて従う必要があります。この記事では消費税についての資料とその内の計算方法に特に関わる部分を紹介します。
参照資料は財務省が公表している次のwebページ以下のいくつかのページになります。
消費税の総額表示義務と転嫁対策に関する資料 : 財務省
この中の内、決済に関するプログラミングに特に関係がある項目を二つ紹介します。
一つは税込み価格の端数処理に関する定義です。詳しい引用は次です。
総額表示に関する主な質問 : 財務省#9
重要なのは”端数をどのように処理 (切捨て、切上げ、四捨五入など)して「税込価格」を設定するかは、それぞれの事業者のご判断によることとなります”の一文です。大方切り上げでしょうが顧客にどうしたいか聞く必要があります。加えて計算が変わりやすい部分なので独立した単一のメソッドにした方が扱いやすいです。
もう一つは税込み価格の合計の計算の仕方の定義です。
総額表示に関する主な質問 : 財務省#18
(Q18
) 端数処理の特例は、例えば、税込172円(うち税15円)と値札表示した商品を3個販売した場合に、15円×3個なので消費税相当額45円とレシート表示するというように単品毎に端数処理を行っても認められますか。(答
1)
.消費税は、物やサービスの販売価格に織り込まれ、最終的には消費者に転嫁されることが予定された間接税です。このため消費者が支払った金額の中には、間接的に10%(又は8%)の税相当分が含まれていることになりますので、事業者の税込受取総額×10/110(又は8/108)が売上げに対して課される消費税相当額というのが原則です。したがって、ご質問のケースでは、172円×3個×10/110の『46.909…円』が売上げに対して課される消費税相当額となります。2
.また、Q16で説明している端数処理の特例(経過措置)は、一領収単位(レシート)ごとに生ずる端数、すなわち税込172円×3個×10/110=46.909…円の0.909…円という1円未満の端数を処理した後の『46円』を消費税相当額としてレシート等に表示した場合に認められるものであり、単品毎の端数処理は認められていません。
(注
) Q16及びに該当する場合には、これまでの端数処理の特例(旧消費税法施行規則第22条第1項:平成16年3月末で廃止)と同様、税抜157円×3個×10%=47.1円という一領収単位で生ずる1円未満の端数処理の特例が認められます。
3
.したがってご質問のような領収方法においては、この端数処理の特例は適用できませんので、税額計算においては、原則どおり、516円(172円×3個)×10/110の46.909…円が売上げに対する消費税額となることにご注意ください。
4
.なお、消費税額の計算においてご質問のような単品毎の端数処理を認めることは、原則的な考え方による消費税相当額(税込受取総額の10/110(又は8/108)との乖離が大きくなり、また、ユニット価格商品(肉などの量り売り商品)では、例えば、100グラム当たりの表示単価を10グラム当たりで表示することによって、消費税額等が生じないような値付けも可能となるなどの問題があり、認められていません。
重要なのは”単品毎の端数処理は認められていません。”の一文です。処理順と型次第で国の定める法に反する動作になるので特に要注意です。やってはいけない処理は次です。
$total = 0; foreach( $producs as $product ){ $total += ceil($product * 0.1); // 一つ一つ消費税の端数を切り上げて加算 }
対策は次の二通りがよさそうです。どちらも”あるモノの税込み料金”をオブジェクトの中にまとめる作りです。例なのでシンプルにまとめましたが色々込みの計算が複雑になったり、多岐にわたるモノの税込み料金を考える必要がある際は更に計算用クラスを別に作るのがよいです。そのようにすると処理の一元化ができ開発もチェックも簡単になります。
// 商品一つ毎に税込みを計算する必要があるなら class Product(){ // 商品クラスを用意 public function withTaxAmount(){ // ここに切り上げ、切り捨て、四捨五入が入れられていないかだけチェック return $this->amount * config('税率'); } } // 総額の計算はクラスメソッドから得られる値を利用 $total = 0; foreach( $producs as $product ){ $total += $product->withTaxAmount(); } $total = ceil($total);
// 総額だけでいいなら class TotalAmount(){ // 総額クラスを用意 public function withTax(){ return ceil($this->amount * config('税率')); } } // 総額クラス上でのみ計算 foreach( $producs as $product ){ $totalAmount->add($product->amount); } $total = $totalAmount->withTax();