luca-jp 0.1.2 → 0.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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', 期末未納市民税) %>