luca-jp 0.1.2 → 0.1.7

Sign up to get free protection for your applications and to get access to all the features.
@@ -31,6 +31,8 @@ module Luca
31
31
 
32
32
  def 中小企業の軽減税率対象所得(所得 = nil)
33
33
  所得 ||= 所得金額
34
+ return 0 if 所得 <= 0
35
+
34
36
  if 所得 >= 8_000_000
35
37
  8_000_000
36
38
  elsif 所得 < 0
@@ -41,11 +43,13 @@ module Luca
41
43
  end
42
44
 
43
45
  def 中小企業の軽減税額(所得 = nil)
44
- 中小企業の軽減税率対象所得(所得) * 15 / 100
46
+ 中小企業の軽減税率対象所得(所得) * 15 / 100
45
47
  end
46
48
 
47
49
  def 中小企業の軽減税率対象を超える所得(所得 = nil)
48
50
  所得 ||= 所得金額
51
+ return 0 if 所得 <= 0
52
+
49
53
  if 所得 <= 8_000_000
50
54
  0
51
55
  else
@@ -61,21 +65,54 @@ module Luca
61
65
  (地方法人税課税標準 * 10.3 / 100).to_i
62
66
  end
63
67
 
68
+ # 繰越損失適用後の所得金額
69
+ #
70
+ def 所得金額
71
+ @繰越損失管理 = Sonshitsu.load(@end_date).update(当期所得金額).save if @繰越損失管理.nil?
72
+ @繰越損失管理.profit
73
+ end
74
+
64
75
  # 税引前当期利益をもとに計算
65
76
  # 消費税を租税公課に計上している場合、控除済みの金額
66
- # 未払/未収事業税は精算時に認識
77
+ # 未払事業税は精算時に認識
67
78
  #
68
- def 所得金額
79
+ def 当期所得金額
69
80
  _, 納付事業税 = 未納事業税期中増減
70
- LucaSupport::Code.readable(@pl_data.dig('GA') - 納付事業税 + 還付事業税)
81
+ LucaSupport::Code.readable(@pl_data.dig('GA') - 納付事業税)
82
+ end
83
+
84
+ # -----------------------------------------------------
85
+ # :section: 繰越損失の計算
86
+ # -----------------------------------------------------
87
+
88
+ def 期首繰越損失
89
+ @繰越損失管理.records
90
+ .filter { |record| record['start_date'] > @end_date.prev_year(10) && record['end_date'] < @start_date }
91
+ .inject(0) { |sum, record| sum + (record['amount'] || 0) }
92
+ end
93
+
94
+ def 当期控除計
95
+ @繰越損失管理.deduction
96
+ end
97
+
98
+ def 翌期繰越損失
99
+ @繰越損失管理.records
100
+ .filter { |record| record['start_date'] > @end_date.prev_year(10) && record['end_date'] < @start_date }
101
+ .inject(0) { |sum, record| sum + (record['amount'] || 0) }
102
+ end
103
+
104
+ def 当期繰越損失
105
+ @繰越損失管理.records
106
+ .filter { |record| record['start_date'] == @start_date }.dig(0, 'increase') || 0
71
107
  end
72
108
 
109
+
73
110
  # -----------------------------------------------------
74
111
  # :section: 地方税額の計算
75
112
  # -----------------------------------------------------
76
113
 
77
114
  def 均等割
78
- if LucaSupport::CONFIG.dig('jp', 'eltax', 'office_23ku')
115
+ if config.dig('jp', 'eltax', 'office_23ku')
79
116
  [70_000, 0]
80
117
  else
81
118
  [20_000, 50_000]
@@ -88,7 +125,7 @@ module Luca
88
125
  else
89
126
  @法人税割課税標準
90
127
  end
91
- if LucaSupport::CONFIG.dig('jp', 'eltax', 'office_23ku')
128
+ if config.dig('jp', 'eltax', 'office_23ku')
92
129
  [(課税標準 * 7 / 100).floor, 0]
93
130
  else
94
131
  [(課税標準 * 1 / 100).floor, (課税標準 * 6 / 100).floor]
@@ -97,6 +134,8 @@ module Luca
97
134
 
98
135
  def 所得400万以下(所得 = nil)
99
136
  所得 ||= 所得金額
137
+ return 0 if 所得 < 0
138
+
100
139
  if 所得 >= 4_000_000
101
140
  4_000_000
102
141
  else
@@ -110,6 +149,8 @@ module Luca
110
149
 
111
150
  def 所得800万以下(所得 = nil)
112
151
  所得 ||= 所得金額
152
+ return 0 if 所得 < 0
153
+
113
154
  if 所得 <= 4_000_000
114
155
  0
115
156
  elsif 所得 >= 8_000_000
@@ -125,6 +166,8 @@ module Luca
125
166
 
126
167
  def 所得800万超(所得 = nil)
127
168
  所得 ||= 所得金額
169
+ return 0 if 所得 < 0
170
+
128
171
  if 所得 <= 8_000_000
129
172
  0
130
173
  else
@@ -161,12 +204,25 @@ module Luca
161
204
  end
162
205
 
163
206
  def 還付事業税
164
- LucaBook::State.gross(@start_date.year, @start_date.month, @end_date.year, @end_date.month, code: '1504')[:credit]
207
+ refund_tax('1504')
165
208
  end
166
209
 
167
210
  def 未納事業税期中増減
168
211
  r = LucaBook::State.gross(@start_date.year, @start_date.month, @end_date.year, @end_date.month, code: '5152')
169
- [LucaSupport::Code.readable(r[:credit] || 0), LucaSupport::Code.readable(r[:debit] || 0)]
212
+ [LucaSupport::Code.readable(r[:credit]['5152'] || 0), LucaSupport::Code.readable(r[:debit]['5152'] || 0)]
213
+ end
214
+
215
+
216
+ # -----------------------------------------------------
217
+ # :section: 消費税の計算
218
+ # -----------------------------------------------------
219
+
220
+ def 消費税中間納付額
221
+ prepaid_tax('185B')
222
+ end
223
+
224
+ def 地方消費税中間納付額
225
+ prepaid_tax('185C')
170
226
  end
171
227
  end
172
228
  end
@@ -6,6 +6,8 @@ require 'luca_support/config'
6
6
  module Luca
7
7
  module Jp
8
8
  module ItPart
9
+ # タグの出現順序は順不同ではない。eTaxの定義に準拠
10
+ #
9
11
  def it_part
10
12
  entries = ['<IT VR="1.4" id="IT">']
11
13
  entries.concat(['zeimusho']
@@ -23,12 +25,13 @@ module Luca
23
25
  entries.concat([jigyo_nendo_from, jigyo_nendo_to, kazei_kikan_from, kazei_kikan_to])
24
26
  entries << render_it_tag('keiri_sekininsha')
25
27
  entries << '<SHINKOKU_KBN ID="SHINKOKU_KBN"><kubun_CD>1</kubun_CD></SHINKOKU_KBN>'
28
+ entries.concat(['eltax_id'].map{ |key| render_it_tag(key) })
26
29
  entries << '</IT>'
27
30
  entries.compact.join("\n")
28
31
  end
29
32
 
30
33
  def render_it_tag(key)
31
- content = LucaSupport::CONFIG.dig('jp', 'it_part', key)
34
+ content = config.dig('jp', 'it_part', key)
32
35
  return nil if content.nil?
33
36
 
34
37
  case key
@@ -0,0 +1,102 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'date'
4
+ require 'pathname'
5
+ require 'yaml'
6
+ require 'luca_book'
7
+ require 'luca_support/config'
8
+
9
+ module Luca
10
+ module Jp
11
+ # 青色申告に基く繰越損失の計算
12
+ #
13
+ class Sonshitsu
14
+ # 当期控除額
15
+ attr_reader :deduction
16
+ # 控除後所得
17
+ attr_reader :profit
18
+ # 各期繰越損失
19
+ attr_reader :records
20
+
21
+ def initialize(records, date)
22
+ @records = records
23
+ @report_date = date
24
+ net_amount
25
+ @deduction = 0
26
+ @profit = 0
27
+ end
28
+
29
+ # sonshitsu format is as bellows:
30
+ #
31
+ # - start_date: 2020-01-01
32
+ # end_date: 2020-12-31
33
+ # increase: 1000000
34
+ # - start_date: 2021-01-01
35
+ # end_date: 2021-12-31
36
+ # decrease: 800000
37
+ #
38
+ def self.load(this_year)
39
+ records = if File.exist?(record_file)
40
+ YAML.load_file(record_file)
41
+ .filter { |record| record['start_date'] > this_year.prev_year(11) && record['end_date'] < this_year }
42
+ .sort { |a, b| a['start_date'] <=> b['start_date'] }
43
+ else
44
+ []
45
+ end
46
+ new(records, this_year)
47
+ end
48
+
49
+ def save
50
+ File.open(self.class.record_file, 'w') { |f| f.puts YAML.dump(@records)}
51
+ self
52
+ end
53
+
54
+ def update(profit_or_loss)
55
+ return self if profit_or_loss == 0
56
+
57
+ if profit_or_loss < 0
58
+ start_date, end_date = LucaBook::Util.current_fy(@report_date)
59
+ @records << {
60
+ 'start_date' => start_date,
61
+ 'end_date' => end_date,
62
+ 'increase' => profit_or_loss.abs
63
+ }
64
+ @profit = profit_or_loss
65
+ return self
66
+ end
67
+
68
+ @records.each do |record|
69
+ next if profit_or_loss <= 0
70
+ next if record['amount'] <= 0
71
+
72
+ decrease_amount = [record['amount'], profit_or_loss].min
73
+ record['decrease'] ||= []
74
+ record['decrease'] << { 'date' => @report_date, 'val' => decrease_amount }
75
+ record['amount'] -= decrease_amount
76
+ profit_or_loss -= decrease_amount
77
+ @deduction += decrease_amount
78
+ end
79
+ @profit = profit_or_loss
80
+ self
81
+ end
82
+
83
+ def net_amount
84
+ @records.each do |record|
85
+ record['amount'] = record['increase'] - past_decreased(record['decrease'])
86
+ record['decrease'] = record['decrease']&.reject { |decrease_record| decrease_record['date'] > @report_date.prev_year }
87
+ end
88
+ end
89
+
90
+ def past_decreased(decrease_records)
91
+ return 0 if decrease_records.nil?
92
+
93
+ decrease_records.filter { |record| record['date'] <= @report_date.prev_year }
94
+ .map { |record| record['val'] }.sum || 0
95
+ end
96
+
97
+ def self.record_file
98
+ Pathname(LucaSupport::PJDIR) / 'data' / 'balance' / 'sonshitsu.yml'
99
+ end
100
+ end
101
+ end
102
+ end
@@ -12,6 +12,7 @@ module Luca
12
12
  module Jp
13
13
  class Syouhizei < LucaBook::State
14
14
  include LucaSupport::View
15
+ include Luca::Jp::ItPart
15
16
  include Luca::Jp::Util
16
17
 
17
18
  @dirname = 'journals'
@@ -23,18 +24,18 @@ module Luca
23
24
  set_pl(4)
24
25
  set_bs(4)
25
26
  @issue_date = Date.today
26
- @company = CGI.escapeHTML(LucaSupport::CONFIG.dig('company', 'name'))
27
+ @company = CGI.escapeHTML(config.dig('company', 'name'))
27
28
  @software = 'LucaJp'
28
29
  税率 = BigDecimal('7.8') # percent
29
30
  地方税率 = BigDecimal('2.2')
30
31
 
31
32
  @sales = @pl_data.dig('A0') * 100 / (100 + 税率 + 地方税率).floor
32
33
  @tax_amount = (課税標準額(@sales) * 税率 / 100).floor
33
- @みなし仕入税額 = (@tax_amount * みなし仕入率(LucaSupport::CONFIG.dig('jp', 'syouhizei_kubun')) / 100).floor
34
+ @みなし仕入税額 = (@tax_amount * みなし仕入率(config.dig('jp', 'syouhizei_kubun')) / 100).floor
34
35
  @税額 = LucaSupport::Code.readable(((@tax_amount - @みなし仕入税額) / 100).floor * 100)
35
36
  @譲渡割額 = (@税額 * 地方税率 / (税率*100)).floor * 100
36
- @中間納付額 = prepaid_tax('185B')
37
- @地方税中間納付額 = prepaid_tax('185C')
37
+ @中間納付額 = 消費税中間納付額
38
+ @地方税中間納付額 = 地方消費税中間納付額
38
39
 
39
40
  if export
40
41
  {
@@ -119,7 +120,7 @@ module Luca
119
120
  end
120
121
 
121
122
  def 事業区分
122
- tags = case LucaSupport::CONFIG.dig('jp', 'syouhizei_kubun')
123
+ tags = case config.dig('jp', 'syouhizei_kubun')
123
124
  when 1
124
125
  ['ABL00030', 'ABL00040', 'ABL00050']
125
126
  when 2
@@ -44,11 +44,13 @@
44
44
  <%= render_attr('BGB00200', @法人税中間納付) %>
45
45
  <%= render_attr('BGB00210', 納付税額(@確定法人税額, @法人税中間納付)) %>
46
46
  <BGB00320>
47
- <%= render_attr('BGB00340', 中間還付税額(@確定法人税額, @法人税中間納付)) %>
47
+ <%= render_attr('BGB00340', 中間還付税額(@確定法人税額, @法人税中間納付)) %>
48
48
  <BGB00380>
49
49
  <%= render_attr('BGB00400', 中間還付税額(@確定法人税額, @法人税中間納付)) %>
50
50
  </BGB00380>
51
51
  </BGB00320>
52
+ <%= render_attr('BGB00460', 当期控除計) %>
53
+ <%= render_attr('BGB00470', 翌期繰越損失 + 当期繰越損失) %>
52
54
  </BGB00000>
53
55
  <BGC00000>
54
56
  <BGC00010>
@@ -12,21 +12,28 @@
12
12
  </ARB00000>
13
13
  <ARC00000>
14
14
  <ARC00010>
15
- <%= render_attr('ARC00020', 法人税損金納付額) %>
16
- <%= render_attr('ARC00030', 法人税損金納付額) %>
15
+ <%= render_attr('ARC00020', 法人税損金納付額 + 法人税仮払納付額) %>
16
+ <%= render_attr('ARC00030', 法人税損金納付額 + 法人税仮払納付額) %>
17
17
  </ARC00010>
18
18
  <ARC00040>
19
- <%= render_attr('ARC00050', (都道府県民税損金納付 + 市民税損金納付)) %>
20
- <%= render_attr('ARC00060', (都道府県民税損金納付 + 市民税損金納付)) %>
19
+ <%= render_attr('ARC00050', (都道府県民税損金納付 + 市民税損金納付 + 都道府県民税仮払納付 + 市民税仮払納付)) %>
20
+ <%= render_attr('ARC00060', (都道府県民税損金納付 + 市民税損金納付 + 都道府県民税仮払納付 + 市民税仮払納付)) %>
21
21
  </ARC00040>
22
22
  <ARC00100>
23
- <%= render_attr('ARC00110', (@法人税等 - 法人税損金納付額 - 都道府県民税損金納付 - 市民税損金納付)) %>
24
- <%= render_attr('ARC00120', (@法人税等 - 法人税損金納付額 - 都道府県民税損金納付 - 市民税損金納付)) %>
23
+ <%= render_attr('ARC00110', (@法人税等 - 法人税損金納付額 - 都道府県民税損金納付 - 市民税損金納付 - 事業税損金納付)) %>
24
+ <%= render_attr('ARC00120', (@法人税等 - 法人税損金納付額 - 都道府県民税損金納付 - 市民税損金納付 - 事業税損金納付)) %>
25
25
  </ARC00100>
26
26
  <%= 別表四還付事業税 %>
27
+ <% if (@当期還付法人税 + @当期還付都道府県住民税 + @当期還付市民税) > 0 %>
28
+ <ARC00220>
29
+ <%= render_attr('ARC00230', '前期仮払税金否認') %>
30
+ <%= render_attr('ARC00240', (@当期還付法人税 + @当期還付都道府県住民税 + @当期還付市民税)) %>
31
+ <%= render_attr('ARC00250', (@当期還付法人税 + @当期還付都道府県住民税 + @当期還付市民税)) %>
32
+ </ARC00220>
33
+ <% end %>
27
34
  <ARC00325>
28
- <%= render_attr('ARC00330', @法人税等 + @還付事業税) %>
29
- <%= render_attr('ARC00340', @法人税等 + @還付事業税) %>
35
+ <%= render_attr('ARC00330', @法人税等 + @当期還付事業税 + 法人税仮払納付額 + 都道府県民税仮払納付 + 市民税仮払納付) %>
36
+ <%= render_attr('ARC00340', @法人税等 + @当期還付事業税 + 法人税仮払納付額 + 都道府県民税仮払納付 + 市民税仮払納付) %>
30
37
  </ARC00325>
31
38
  </ARC00000>
32
39
  <ARD00000>
@@ -34,9 +41,20 @@
34
41
  <%= render_attr('ARD00050', @納付事業税) %>
35
42
  <%= render_attr('ARD00060', @納付事業税) %>
36
43
  </ARD00040>
44
+ <ARD00100>
45
+ <%= render_attr('ARD00110', @当期還付法人税 + @当期還付都道府県住民税 + @当期還付市民税) %>
46
+ <%= render_attr('ARD00120', @当期還付法人税 + @当期還付都道府県住民税 + @当期還付市民税) %>
47
+ </ARD00100>
48
+ <% if (法人税仮払納付額 + 都道府県民税仮払納付 + 市民税仮払納付) > 0 %>
49
+ <ARD00215>
50
+ <%= render_attr('ARD00220', '仮払税金認定損') %>
51
+ <%= render_attr('ARD00230', (法人税仮払納付額 + 都道府県民税仮払納付 + 市民税仮払納付)) %>
52
+ <%= render_attr('ARD00240', (法人税仮払納付額 + 都道府県民税仮払納付 + 市民税仮払納付)) %>
53
+ </ARD00215>
54
+ <% end %>
37
55
  <ARD00280>
38
- <%= render_attr('ARD00290', @納付事業税) %>
39
- <%= render_attr('ARD00300', @納付事業税) %>
56
+ <%= render_attr('ARD00290', (@納付事業税 + 法人税仮払納付額 + 都道府県民税仮払納付 + 市民税仮払納付)) %>
57
+ <%= render_attr('ARD00300', (@納付事業税 + 法人税仮払納付額 + 都道府県民税仮払納付 + 市民税仮払納付)) %>
40
58
  </ARD00280>
41
59
  </ARD00000>
42
60
  <ARE00000>
@@ -55,8 +73,12 @@
55
73
  <%= render_attr('ARS00010', @別表四調整所得) %>
56
74
  <%= render_attr('ARS00020', @別表四調整所得) %>
57
75
  </ARS00000>
76
+ <ART00000>
77
+ <%= render_attr('ART00010', @繰越損失管理.deduction) %>
78
+ <%= render_attr('ART00020', @繰越損失管理.deduction) %>
79
+ </ART00000>
58
80
  <ARV00000>
59
- <%= render_attr('ARV00010', @別表四調整所得) %>
60
- <%= render_attr('ARV00020', @別表四調整所得) %>
81
+ <%= render_attr('ARV00010', @別表四調整所得 - @繰越損失管理.deduction) %>
82
+ <%= render_attr('ARV00020', @別表四調整所得 - @繰越損失管理.deduction) %>
61
83
  </ARV00000>
62
84
  </HOA420>
@@ -7,6 +7,10 @@
7
7
  <ICA00040 IDREF="NOZEISHA_NM"/>
8
8
  </ICA00000>
9
9
  <ICB00000>
10
+ <%= 別表五一仮払税金 %>
11
+ <%= 別表五一還付法人税 %>
12
+ <%= 別表五一還付都道府県住民税 %>
13
+ <%= 別表五一還付市民税 %>
10
14
  <ICB00400>
11
15
  <%= render_attr('ICB00410', 期首繰越損益) %>
12
16
  <ICB00420>
@@ -21,15 +25,16 @@
21
25
  <%= render_attr('ICB00490', @納税充当金期中減) %>
22
26
  <%= render_attr('ICB00500', @納税充当金期中増) %>
23
27
  </ICB00480>
24
- <%= render_attr('ICB00510', 期末納税充当金) %>
28
+ <%= render_attr('ICB00510', @納税充当金期中増) %>
25
29
  </ICB00460>
26
30
  <ICB00520>
27
31
  <ICB00530>
28
32
  <%= render_attr('ICB00540', 期首未納法人税) %>
29
33
  <ICB00550>
30
- <%= render_attr('ICB00560', @法人税期中減) %>
34
+ <%= render_attr('ICB00560', @法人税期中減 + @翌期還付法人税) %>
31
35
  <ICB00570>
32
- <%= render_attr('ICB00590', @法人税期中増) %>
36
+ <%= render_attr('ICB00580', @法人税中間納付 + @地方法人税中間納付) %>
37
+ <%= render_attr('ICB00590', 期末未納法人税) %>
33
38
  </ICB00570>
34
39
  </ICB00550>
35
40
  <%= render_attr('ICB00610', 期末未納法人税) %>
@@ -37,9 +42,10 @@
37
42
  <ICB00620>
38
43
  <%= render_attr('ICB00630', 期首未納都道府県民税) %>
39
44
  <ICB00640>
40
- <%= render_attr('ICB00650', @都道府県民税期中減) %>
45
+ <%= render_attr('ICB00650', @都道府県民税期中減 + @翌期還付都道府県住民税) %>
41
46
  <ICB00660>
42
- <%= render_attr('ICB00680', @都道府県民税期中増) %>
47
+ <%= render_attr('ICB00670', @都道府県民税中間納付) %>
48
+ <%= render_attr('ICB00680', 期末未納都道府県民税) %>
43
49
  </ICB00660>
44
50
  </ICB00640>
45
51
  <%= render_attr('ICB00700', 期末未納都道府県民税) %>
@@ -47,9 +53,10 @@
47
53
  <ICB00710>
48
54
  <%= render_attr('ICB00720', 期首未納市民税) %>
49
55
  <ICB00730>
50
- <%= render_attr('ICB00740', @市民税期中減) %>
56
+ <%= render_attr('ICB00740', @市民税期中減 + @翌期還付市民税) %>
51
57
  <ICB00750>
52
- <%= render_attr('ICB00770', @市民税期中増) %>
58
+ <%= render_attr('ICB00760', @市民税中間納付) %>
59
+ <%= render_attr('ICB00770', 期末未納市民税) %>
53
60
  </ICB00750>
54
61
  </ICB00730>
55
62
  <%= render_attr('ICB00790', 期末未納市民税) %>