luca-jp 0.15.0 → 0.16.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9ccff8e0a1ac15b855e0c104254c44817ec12f552b97af39e9f5c7179165f4c9
4
- data.tar.gz: c20d1a533a7dd27377fb0850673f8b4e1fb449225cfab44abf498262e4577c52
3
+ metadata.gz: 4a6dbb648afd83fd8f7240fcda13d1ab94f7cbff8d3499edfd3dba0641a94ab6
4
+ data.tar.gz: '087559b7426943953b6ece1cfc8e25b3dfed1da12a0047fbc6367884751e1bb9'
5
5
  SHA512:
6
- metadata.gz: 5ce5fae3188a5b42b5829e5fc8cfe2e2c6c5fe4db8899c4835ea0a6bb830364e84096bc231884469d1ac6caff309123af11fc89ac8dc73c98df917a68bbc13a9
7
- data.tar.gz: 3ba9fc25ce665f4375343125211c19cfb4666436d7ff0398dea916747ba75012e59a54a2a10465f6be010f1cd90d18afdedd3583caf1cecd863c30771e0a9f3c
6
+ metadata.gz: 290000091d4b1fcbff40cbd11ed97d477d4a3c6144bc668cc93ad4d40568869ad1ad69bf0bdad3df1301dcc76c3c4322eff30bb4f602ede1d120f579801af8da
7
+ data.tar.gz: 1fc13e4658ed8735f80abdb087cfae9f3abbc18dfed81709d9174b0e70a10ceb0bb11ec535e690ca4c1ea414b4c6d183c6ef5dae25dd71b49cb1af4a1cee63e4
data/exe/luca-jp CHANGED
@@ -4,6 +4,8 @@
4
4
  require 'optparse'
5
5
  require 'luca/jp'
6
6
  require 'luca_salary/jp_payreport'
7
+ require 'luca_cmd'
8
+ require 'luca_support/const'
7
9
 
8
10
  class LucaCmd
9
11
  def self.syouhizei(args, params)
@@ -54,6 +56,26 @@ class LucaCmd
54
56
  [r[0].year, r[0].month, r[1].year, r[1].month]
55
57
  end
56
58
  end
59
+
60
+ def self.check_dir_jp(target)
61
+ check_dir(target) do
62
+ begin
63
+ ex_conf = YAML.safe_load(
64
+ File.read(Pathname(LucaSupport::CONST.pjdir) / 'config-lucajp.yml'),
65
+ permitted_classes: [Date]
66
+ )
67
+ if ex_conf
68
+ LucaSupport::CONST.set_config(
69
+ LucaSupport::CONST.config.merge(ex_conf)
70
+ )
71
+ end
72
+ rescue Errno::ENOENT
73
+ nil
74
+ end
75
+
76
+ yield
77
+ end
78
+ end
57
79
  end
58
80
 
59
81
  module LucaSalaryCmd
@@ -64,7 +86,7 @@ module LucaSalaryCmd
64
86
  end
65
87
  end
66
88
 
67
- LucaRecord::Base.valid_project?
89
+ #LucaRecord::Base.valid_project?
68
90
  cmd = ARGV.shift
69
91
  params = {}
70
92
 
@@ -75,7 +97,9 @@ when 'h', /hou?jinzei/
75
97
  opt.on('--export', 'export json') { |_v| params[:export] = true }
76
98
  opt.on('--lastyear', 'report on last Financial year') { |_v| params[:lastyear] = true }
77
99
  args = opt.parse!(ARGV)
78
- LucaCmd.houjinzei(args, params)
100
+ LucaCmd.check_dir_jp('journals') do
101
+ LucaCmd.houjinzei(args, params)
102
+ end
79
103
  end
80
104
  when 's', /s[yh]ou?hizei/
81
105
  OptionParser.new do |opt|
@@ -83,7 +107,9 @@ when 's', /s[yh]ou?hizei/
83
107
  opt.on('--export', 'export json') { |_v| params[:export] = true }
84
108
  opt.on('--lastyear', 'report on last Financial year') { |_v| params[:lastyear] = true }
85
109
  args = opt.parse!(ARGV)
86
- LucaCmd.syouhizei(args, params)
110
+ LucaCmd.check_dir_jp('journals') do
111
+ LucaCmd.syouhizei(args, params)
112
+ end
87
113
  end
88
114
  when 'c', /chihou?zei/
89
115
  OptionParser.new do |opt|
@@ -91,7 +117,9 @@ when 'c', /chihou?zei/
91
117
  opt.on('--export', 'export json') { |_v| params[:export] = true }
92
118
  opt.on('--lastyear', 'report on last Financial year') { |_v| params[:lastyear] = true }
93
119
  args = opt.parse!(ARGV)
94
- LucaCmd.chihouzei(args, params)
120
+ LucaCmd.check_dir_jp('journals') do
121
+ LucaCmd.chihouzei(args, params)
122
+ end
95
123
  end
96
124
  when /urikake/
97
125
  OptionParser.new do |opt|
@@ -99,14 +127,21 @@ when /urikake/
99
127
  opt.on('--total VAL', '売掛金総額') { |v| params[:total] = v&.to_i }
100
128
  opt.on('--utf8', 'UTF-8でファイル生成') { |_v| params[:encode] = 'UTF-8' }
101
129
  args = opt.parse!(ARGV)
102
- LucaCmd.urikake(args, params)
130
+ LucaCmd.check_dir_jp('invoices') do
131
+ LucaCmd.urikake(args, params)
132
+ end
103
133
  end
104
134
  when 'k', 'kyuyo', 'salary'
105
135
  OptionParser.new do |opt|
106
136
  opt.banner = 'Usage: luca-jp kyuyo [--export] year'
107
137
  args = opt.parse(ARGV)
108
- LucaSalaryCmd::Export.payreport(args)
138
+ LucaCmd.check_dir_jp('profiles') do
139
+ LucaSalaryCmd::Export.payreport(args)
140
+ end
109
141
  end
142
+ when 'version'
143
+ puts "luca-jp: version #{Luca::Jp::VERSION}"
144
+ exit 0
110
145
  else
111
146
  puts 'Proper subcommand needed.'
112
147
  puts
data/lib/luca/jp/aoiro.rb CHANGED
@@ -5,7 +5,6 @@ require 'cgi/escape'
5
5
  require 'luca_book'
6
6
  require 'luca_support'
7
7
  require 'luca_record/dict'
8
- require 'luca_support/config'
9
8
  require 'luca/jp'
10
9
 
11
10
  module Luca
@@ -5,7 +5,6 @@ require 'cgi/escape'
5
5
  require 'luca_book'
6
6
  require 'luca_support'
7
7
  require 'luca_record/dict'
8
- require 'luca_support/config'
9
8
  require 'luca/jp'
10
9
 
11
10
  module Luca
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'luca_support'
4
- require 'luca_support/config'
5
4
 
6
5
  module Luca
7
6
  module Jp
@@ -4,7 +4,7 @@ require 'date'
4
4
  require 'pathname'
5
5
  require 'yaml'
6
6
  require 'luca_book'
7
- require 'luca_support/config'
7
+ require 'luca_support/const'
8
8
 
9
9
  module Luca
10
10
  module Jp
@@ -95,7 +95,7 @@ module Luca
95
95
  end
96
96
 
97
97
  def self.record_file
98
- Pathname(LucaSupport::PJDIR) / 'data' / 'balance' / 'sonshitsu.yml'
98
+ Pathname(LucaSupport::CONST.pjdir) / 'data' / 'balance' / 'sonshitsu.yml'
99
99
  end
100
100
  end
101
101
  end
@@ -5,7 +5,6 @@ require 'cgi/escape'
5
5
  require 'luca_book'
6
6
  require 'luca_support'
7
7
  require 'luca_record/dict'
8
- require 'luca_support/config'
9
8
  require 'luca/jp/util'
10
9
 
11
10
  module Luca
@@ -4,7 +4,6 @@ require 'json'
4
4
  require 'cgi/escape'
5
5
  require 'luca_deal'
6
6
  require 'luca_support'
7
- require 'luca_support/config'
8
7
  require 'luca/jp'
9
8
 
10
9
  module Luca
data/lib/luca/jp/util.rb CHANGED
@@ -64,7 +64,7 @@ module Luca
64
64
  end
65
65
 
66
66
  def config
67
- EX_CONF.nil? ? LucaSupport::CONFIG : LucaSupport::CONFIG.merge(EX_CONF)
67
+ LucaSupport::CONST.config
68
68
  end
69
69
 
70
70
  def it_part_config(key)
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Luca
4
4
  module Jp
5
- VERSION = '0.15.0'
5
+ VERSION = '0.16.1'
6
6
  end
7
7
  end
data/lib/luca/jp.rb CHANGED
@@ -2,7 +2,8 @@
2
2
 
3
3
  require 'date'
4
4
  require 'luca/jp/version'
5
- require 'luca_support/config'
5
+ require 'luca_support/const'
6
+ require 'yaml'
6
7
 
7
8
  module Luca
8
9
  module Jp
@@ -17,10 +18,4 @@ module Luca
17
18
  autoload :Uchiwake, 'luca/jp/uchiwake'
18
19
  autoload :Util, 'luca/jp/util'
19
20
  end
20
-
21
- EX_CONF = begin
22
- YAML.safe_load(File.read(Pathname(LucaSupport::PJDIR) / 'config-lucajp.yml'), permitted_classes: [Date])
23
- rescue Errno::ENOENT
24
- nil
25
- end
26
21
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module LucaSalaryJp
4
- VERSION = '0.1.4'
4
+ VERSION = '0.1.5'
5
5
  end
@@ -16,13 +16,15 @@ class LucaSalary::Jp < LucaSalary::Base
16
16
  __dir__
17
17
  end
18
18
 
19
- def calc_payment(profile)
19
+ def calc_payment(profile, date)
20
+ 配偶者控除 = profile.include?('spouse')
21
+ 扶養控除 = self.class.扶養控除対象者の数(profile['family'], Date.new(date.year, 12, 31))
20
22
  {}.tap do |h|
21
23
  select_code(profile, '1').each { |k, v| h[k] = v }
22
24
  h['201'] = @insurance.health_insurance_salary(insurance_rank(profile))
23
25
  h['202'] = @insurance.pension_salary(pension_rank(profile))
24
26
  tax_base = self.class.sum_code(h, '1', income_tax_exception) - h['201'] - h['202']
25
- h['203'] = JpNationalTax::IncomeTax.calc_kouran(tax_base, Date.today, true)
27
+ h['203'] = JpNationalTax::IncomeTax.calc_kouran(tax_base, Date.today, 配偶者控除, 扶養控除)
26
28
  h['211'] = resident_tax(profile)
27
29
  select_code(profile, '3').each { |k, v| h[k] = v }
28
30
  select_code(profile, '4').each { |k, v| h[k] = v }
@@ -31,13 +33,17 @@ class LucaSalary::Jp < LucaSalary::Base
31
33
  end
32
34
  end
33
35
 
34
- def self.year_total(payment, date)
36
+ def self.year_total(profile, payment, date)
37
+ raise '年末調整の対象となりません' if payment['1'] == 0
38
+
35
39
  payment.tap do |p|
36
40
  p['911'] = JpNationalTax::IncomeTax.basic_deduction(p['1'], date)
37
- p['916'] = partner_deduction(p['1'])
41
+ p['916'] = 配偶者控除の金額(p['1'], profile['spouse'], date)
42
+ p['917'] = 配偶者特別控除の金額(p['1'], profile['spouse'], date)
43
+ p['918'] = 扶養控除の金額(profile['family'], date)
38
44
  p['912'] = ['201', '202', '204', '205'].map{ |cd| p[cd] }.compact.sum
39
45
  p['901'] = JpNationalTax::IncomeTax.year_salary_taxable(p['1'], date)
40
- p['941'] = p['901'] - p['911'] - p['912'] - p['916']
46
+ p['941'] = p['901'] - ['911', '912', '916', '917', '918'].map{ |cd| p[cd] }.compact.sum
41
47
  p['961'] = JpNationalTax::IncomeTax.year_tax(p['941'], date)
42
48
  diff = p['961'] - p['203']
43
49
  if diff.positive?
@@ -54,18 +60,95 @@ class LucaSalary::Jp < LucaSalary::Base
54
60
  end
55
61
  end
56
62
 
57
- def self.partner_deduction(income)
58
- if income <= 9_000_000
59
- 380_000
60
- elsif income <= 9_500_000
61
- 260_000
62
- elsif income <= 10_000_000
63
- 130_000
63
+ def self.配偶者控除の金額(income, spouse, date)
64
+ puts spouse
65
+ return nil if spouse.nil?
66
+
67
+ puts spouse
68
+ spouse_salary = JpNationalTax::IncomeTax.year_salary_taxable(spouse['income'][date.year.to_s] || 0, date)
69
+ return 0 if spouse_salary > 480_000
70
+
71
+ salary = JpNationalTax::IncomeTax.year_salary_taxable(income || 0, date)
72
+ birth_date = spouse['birth_date'] || date
73
+ if salary <= 9_000_000
74
+ birth_date <= date.prev_year(70) ? 480_000 : 380_000
75
+ elsif salary <= 9_500_000
76
+ birth_date <= date.prev_year(70) ? 320_000 : 260_000
77
+ elsif salary <= 10_000_000
78
+ birth_date <= date.prev_year(70) ? 160_000 : 130_000
64
79
  else
65
80
  0
66
81
  end
67
82
  end
68
83
 
84
+ def self.配偶者特別控除の金額(income, spouse, date)
85
+ return nil if spouse.nil?
86
+
87
+ salary = JpNationalTax::IncomeTax.year_salary_taxable(income || 0, date)
88
+ return 0 if salary > 10_000_000
89
+
90
+ spouse_salary = JpNationalTax::IncomeTax.year_salary_taxable(spouse['income'][date.year.to_s] || 0, date)
91
+ return 0 if spouse_salary <= 480_000
92
+ return 0 if spouse_salary > 1_330_000
93
+
94
+ if salary <= 9_000_000
95
+ return 380_000 if spouse_salary <= 950_000
96
+ return 360_000 if spouse_salary <= 1_000_000
97
+ return 310_000 if spouse_salary <= 1_050_000
98
+ return 260_000 if spouse_salary <= 1_100_000
99
+ return 210_000 if spouse_salary <= 1_150_000
100
+ return 160_000 if spouse_salary <= 1_200_000
101
+ return 110_000 if spouse_salary <= 1_250_000
102
+ return 60_000 if spouse_salary <= 1_300_000
103
+ return 30_000
104
+ elsif salary <= 9_500_000
105
+ return 260_000 if spouse_salary <= 950_000
106
+ return 240_000 if spouse_salary <= 1_000_000
107
+ return 210_000 if spouse_salary <= 1_050_000
108
+ return 180_000 if spouse_salary <= 1_100_000
109
+ return 140_000 if spouse_salary <= 1_150_000
110
+ return 110_000 if spouse_salary <= 1_200_000
111
+ return 80_000 if spouse_salary <= 1_250_000
112
+ return 40_000 if spouse_salary <= 1_300_000
113
+ return 20_000
114
+ else
115
+ return 130_000 if spouse_salary <= 950_000
116
+ return 120_000 if spouse_salary <= 1_000_000
117
+ return 110_000 if spouse_salary <= 1_050_000
118
+ return 90_000 if spouse_salary <= 1_100_000
119
+ return 70_000 if spouse_salary <= 1_150_000
120
+ return 60_000 if spouse_salary <= 1_200_000
121
+ return 40_000 if spouse_salary <= 1_250_000
122
+ return 20_000 if spouse_salary <= 1_300_000
123
+ return 10_000
124
+ end
125
+ end
126
+
127
+ def self.扶養控除の金額(family, date)
128
+ return if family.nil?
129
+
130
+ family.map { |person| 各家族の扶養控除の額(person, date) }.sum
131
+ end
132
+
133
+ def self.各家族の扶養控除の額(person, date)
134
+ birth_date = person['birth_date']
135
+ return 0 if birth_date.nil?
136
+
137
+ if birth_date > date.prev_year(16)
138
+ 0
139
+ elsif birth_date <= date.prev_year(70)
140
+ person['live_with'] ? 580_000 : 480_000 # 老人扶養親族
141
+ elsif birth_date <= date.prev_year(19) and birth_date > date.prev_year(23)
142
+ 630_000 # 特定扶養親族
143
+ else
144
+ 380_000
145
+ end
146
+ end
147
+
148
+ def self.扶養控除対象者の数(family, date)
149
+ family.map { |person| 各家族の扶養控除の額(person, date) > 0 ? 1 : 0 }.sum
150
+ end
151
+
69
152
  def income_tax_exception
70
153
  %w[116 118 119 11A 11B]
71
154
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
  require 'luca_salary'
3
- require 'luca_support/config'
3
+ require 'luca_support/const'
4
4
  require 'csv'
5
5
  require 'open3'
6
6
 
@@ -24,11 +24,11 @@ module LucaSalary
24
24
  # TODO: extract effective field
25
25
  def self.set_company(year)
26
26
  {}.tap do |h|
27
- h['name'] = CONFIG.dig('company', 'name')
28
- h['address'] = CONFIG.dig('company', 'address')
29
- h['address2'] = CONFIG.dig('company', 'address2')
30
- h['tel'] = CONFIG.dig('company', 'tel')
31
- h['tax_id'] = CONFIG.dig('company', 'tax_id')
27
+ h['name'] = LucaSupport::CONST.config.dig('company', 'name')
28
+ h['address'] = LucaSupport::CONST.config.dig('company', 'address')
29
+ h['address2'] = LucaSupport::CONST.config.dig('company', 'address2')
30
+ h['tel'] = LucaSupport::CONST.config.dig('company', 'tel')
31
+ h['tax_id'] = LucaSupport::CONST.config.dig('company', 'tax_id')
32
32
 
33
33
  raise "会社名、住所の設定は必須" if h['name'].nil? or h['address'].nil?
34
34
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: luca-jp
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.15.0
4
+ version: 0.16.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chuma Takahiro
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-04-19 00:00:00.000000000 Z
11
+ date: 2024-01-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: lucabook
@@ -44,14 +44,14 @@ dependencies:
44
44
  requirements:
45
45
  - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: 0.5.5
47
+ version: 0.7.0
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: 0.5.5
54
+ version: 0.7.0
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: jp-national-tax
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -174,7 +174,7 @@ metadata:
174
174
  homepage_uri: https://github.com/chumaltd/luca-jp
175
175
  source_code_uri: https://github.com/chumaltd/luca-jp
176
176
  changelog_uri: https://github.com/chumaltd/luca-jp/CHANGELOG.md
177
- post_install_message:
177
+ post_install_message:
178
178
  rdoc_options: []
179
179
  require_paths:
180
180
  - lib
@@ -189,8 +189,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
189
189
  - !ruby/object:Gem::Version
190
190
  version: '0'
191
191
  requirements: []
192
- rubygems_version: 3.3.5
193
- signing_key:
192
+ rubygems_version: 3.4.10
193
+ signing_key:
194
194
  specification_version: 4
195
195
  summary: JP tax extension for Luca
196
196
  test_files: []