File Coverage

lib/Business/Tax/Withholding/JP.pm
Criterion Covered Total %
statement 44 44 100.0
branch 6 6 100.0
condition 3 3 100.0
subroutine 14 14 100.0
pod 6 7 85.7
total 73 74 98.6


line stmt bran cond sub pod time code
1             package Business::Tax::Withholding::JP;
2 5     5   230596 use 5.008001;
  5         44  
3 5     5   22 use strict;
  5         5  
  5         96  
4 5     5   19 use warnings;
  5         6  
  5         253  
5              
6             our $VERSION = "0.04";
7              
8 5     5   27 use constant { border => 1000000 };
  5         6  
  5         563  
9              
10             my %consumption = (
11             rate => 0.08,
12             name => '消費税',
13             );
14              
15             my %withholding = (
16             rate => 0.10,
17             name => '源泉徴収',
18             );
19              
20             my %special = (
21             rate => 0.0021,
22             name => '復興特別所得税',
23             from => '2013-01-01',
24             until => '2037-12-31',
25             );
26              
27 5     5   2189 use Moose;
  5         1906685  
  5         29  
28 5     5   33247 use Time::Piece;
  5         38282  
  5         16  
29             my $t = localtime;
30              
31             has price => ( is => 'rw', isa => 'Int', default => 0 );
32             has amount => ( is => 'rw', isa => 'Int', default => 1 );
33             has date => ( is => 'rw', isa => 'Str', default => $t->ymd() );
34             has no_wh => ( is => 'ro', isa => 'Bool', default => 0 );
35              
36             __PACKAGE__->meta->make_immutable;
37 5     5   575 no Moose;
  5         8  
  5         28  
38              
39             sub net {
40 5     5 1 21 my $self = shift;
41 5         96 return $self->price();
42             }
43              
44             sub subtotal {
45 120     120 1 124 my $self = shift;
46 120         2448 return $self->price() * $self->amount();
47             }
48              
49             sub tax {
50 38     38 1 53 my $self = shift;
51 38         54 return int( $self->subtotal() * $consumption{'rate'} );
52             }
53              
54             sub full {
55 28     28 1 36 my $self = shift;
56 28         53 return int( $self->subtotal() + $self->tax() );
57             }
58              
59             sub withholding {
60 36     36 1 48 my $self = shift;
61 36 100       736 return 0 if $self->no_wh();
62 24         80 my $rate = $self->rate();
63 24 100       160 if( $self->subtotal() <= border ) {
64 18         27 return int( $self->subtotal() * $rate );
65             }else{
66 6         9 my $base = $self->subtotal() - border;
67 6         57 return int( $base * $rate * 2 + border * $rate );
68             }
69             }
70              
71             sub rate {
72 24     24 0 29 my $self = shift;
73 24         32 my $rate = $withholding{'rate'};
74 24         73 my $from = $t->strptime( $special{'from'}, '%Y-%m-%d' );
75 24         2161 my $until = $t->strptime( $special{'until'}, '%Y-%m-%d' );
76 24         2107 my $date = $t->strptime( $self->date(), '%Y-%m-%d' );
77              
78 24 100 100     1683 return $rate if $date < $from or $until < $date;
79 20         714 return $rate + $special{'rate'};
80             }
81              
82             sub total {
83 18     18 1 39 my $self = shift;
84 18         32 return $self->full - $self->withholding;
85             }
86              
87             1;
88             __END__
89              
90             =encoding utf-8
91              
92             =head1 NAME
93              
94             Business::Tax::Withholding::JP - auto calculation for Japanese tax and withholding
95              
96             Business::Tax::Withholding::JP - 日本の消費税と源泉徴収のややこしい計算を自動化します。
97              
98            
99             =head1 SYNOPSIS
100              
101             use Business::Tax::Withholding::JP;
102             my $calc = Business::Tax::Withholding::JP->new( price => 10000 );
103              
104             $calc->net(); # 10000
105             $calc->amount(); # 1
106             $calc->subtotal(); # 10000
107             $calc->tax(); # 800
108             $calc->full(); # 10800
109             $calc->withholding(); # 1021
110             $calc->total(); # 9779
111              
112             # Or you can set the date in period of special tax being expired
113             $calc = Business::Tax::Withholding::JP->new( date => '2038-01-01' );
114             $calc->price(10000);
115             $calc->withholding(); # 1000
116             $calc->total(); # 9800
117              
118             # And you may ignore the withholings
119             $calc = Business::Tax::Withholding::JP->new( no_wh => 1 );
120             $calc->price(10000); # 10000
121             $calc->amount(2); # 2
122             $calc->subtotal(); # 20000
123             $calc->tax(); # 1600
124             $calc->withholding(); # 0
125             $calc->total(); # 21600
126              
127             =head1 DESCRIPTION
128              
129             Business::Tax::Withholding::JP
130             is useful calculator for long term in Japanese Business.
131              
132             You can get correctly taxes and withholdings from price in your context
133             without worrying about the special tax for reconstructing from the Earthquake.
134              
135             the consumption tax B<rate is 8%>
136            
137             You can also ignore the withholings. It means this module can be a tax calculator
138              
139             Business::Tax::Withholding::JP は日本のビジネスで長期的に使えるモジュールです。
140             特別復興所得税の期限を心配することなく、請求価格から正しく税金額と源泉徴収額を計算できます。
141             なお、源泉徴収をしない経理にも対応します。B<消費税率は8ï¼…> です。
142            
143             =head2 Constructor
144              
145             =head3 new( price => I<Int>, amount => I<Int>, date => I<Date>, no_wh => I<Bool> );
146              
147             You can omit these paramators.
148              
149             パラメータは指定しなくて構いません。
150            
151             =over
152            
153             =item price
154            
155             the price of your products will be set. defaults 0.
156            
157             税抜価格を指定してください。指定しなければ0です。
158              
159             =item amount
160            
161             the amount of your products will be set. defaults 1.
162            
163             数量を指定してください。指定しなければ1です。
164              
165             =item date
166              
167             You can set payday. the net of withholding depends on this. default is today.
168            
169             支払日を指定してください。源泉徴収額が変動することがあります。指定しなければ今日として計算します。
170            
171             =item no_wh
172            
173             If you set this flag, the all you can get is only tax and total. defaults 0 and this is read-only.
174              
175             このフラグを立てるとこのモジュールの長所を台無しにできます。初期値はもちろん0で、あとから変えることはできません。
176            
177             =back
178            
179             =head2 Methods and subroutine
180              
181             =over
182              
183             =item price
184              
185             You can reset the price.
186              
187             price に値を代入可能です。
188            
189             =item amount
190            
191             You can reset the amount.
192            
193             amount に値を代入可能です。
194              
195             =item date
196              
197             You can reset the payday like 'YYYY-MM-DD'
198              
199             date にも値を代入可能です。フォーマットは'YYYY-MM-DD'(-区切り)です。
200              
201             =item net
202              
203             You can get the net of your pay. it's equal to the price.
204             So it's the alias of price().
205            
206             net は price と同じ働きをします。
207            
208             =item subtotal
209            
210             it returns price() * amount()
211              
212             subtotal は値と数量の積(小計)を返します。
213            
214             =item tax
215            
216             You can get the net of your tax.
217            
218             税額のみを取得したい場合はこちらを
219              
220             =item full
221            
222             You can get the net of your pay including tax.
223              
224             税込金額を知りたい場合はこちらを
225            
226             =item withholding
227            
228             You can get the net of your withholding from your pay.
229              
230             源泉徴収額を知りたい場合はこちらを
231            
232             =item total
233              
234             You can get the total of your pay including tax without withholding
235            
236             源泉徴収額を差し引いた税込支払額を知りたい場合はこちらをお使いください。
237            
238             =back
239              
240             =head1 LICENSE
241              
242             Copyright (C) worthmine.
243              
244             This library is free software; you can redistribute it and/or modify
245             it under the same terms as Perl itself.
246              
247             =head1 AUTHOR
248              
249             worthmine E<lt>worthmine@cpan.orgE<gt>
250              
251             =cut